commit c3e2e6509b1996ceea1e53862e95836f267aee26 Author: Timo Schneider Date: Wed Aug 13 21:46:48 2025 +0200 init diff --git a/Kvantum/catppuccin-macchiato-lavender/catppuccin-macchiato-lavender.kvconfig b/Kvantum/catppuccin-macchiato-lavender/catppuccin-macchiato-lavender.kvconfig new file mode 100644 index 0000000..6903657 --- /dev/null +++ b/Kvantum/catppuccin-macchiato-lavender/catppuccin-macchiato-lavender.kvconfig @@ -0,0 +1,466 @@ +[%General] +author=elkrien based on Arc Dark style +comment=Catppuccin-Macchiato-Lavender +spread_menuitems=true +left_tabs=true +mirror_doc_tabs=true +scroll_width=8 +attach_active_tab=true +composite=true +menu_shadow_depth=7 +tooltip_shadow_depth=0 +splitter_width=7 +check_size=16 +slider_width=4 +slider_handle_width=18 +slider_handle_length=18 +textless_progressbar=false +menubar_mouse_tracking=true +slim_toolbars=false +toolbutton_style=1 +x11drag=menubar_and_primary_toolbar +double_click=false +translucent_windows=true +blurring=false +popup_blurring=true +opaque=kaffeine,kmplayer,subtitlecomposer,kdenlive,vlc,smplayer,smplayer2,avidemux,avidemux2_qt4,avidemux3_qt4,avidemux3_qt5,kamoso,QtCreator,VirtualBox,trojita,dragon,digikam,qmplay2 +group_toolbar_buttons=false +vertical_spin_indicators=false +fill_rubberband=false +spread_progressbar=true +merge_menubar_with_toolbar=true +small_icon_size=16 +large_icon_size=32 +button_icon_size=16 +scroll_arrows=false +iconless_pushbutton=true +toolbar_icon_size=16 +combo_as_lineedit=true +button_contents_shift=false +groupbox_top_label=true +inline_spin_indicators=true +joined_inactive_tabs=false +layout_spacing=2 +submenu_overlap=0 +tooltip_delay=-1 +animate_states=false +transient_scrollbar=true +alt_mnemonic=true +combo_menu=true +layout_margin=4 +no_window_pattern=false +respect_DE=true +scroll_min_extent=36 +scrollable_menu=false +scrollbar_in_view=false +spin_button_width=16 +submenu_delay=250 +tree_branch_line=true +progressbar_thickness=8 +click_behavior=0 +contrast=1.00 +dialog_button_layout=0 +drag_from_buttons=false +hide_combo_checkboxes=false +intensity=1.00 +no_inactiveness=false +reduce_menu_opacity=0 +reduce_window_opacity=10 +saturation=1.00 +shadowless_popup=false +transient_groove=false +menu_blur_radius=0 +tooltip_blur_radius=0 + +[GeneralColors] +window.color=#24273A +base.color=#1E2030 +alt.base.color=#1E2030 +button.color=#363A4F +light.color=#494D64 +mid.light.color=#494D64 +dark.color=#1E2030 +mid.color=#1E2030 +highlight.color=#B7BDF8 +inactive.highlight.color=#B7BDF8 +text.color=#CAD3F5 +window.text.color=#CAD3F5 +button.text.color=#CAD3F5 +disabled.text.color=#5B6078 +tooltip.text.color=#CAD3F5 +highlight.text.color=#1E2030 +link.color=#F4DBD6 +link.visited.color=#8AADF4 + +[ItemView] +inherits=PanelButtonCommand +frame.element=itemview +interior.element=itemview +frame=true +interior=true +text.iconspacing=3 +text.toggle.color=#1E2030 + +[RadioButton] +inherits=PanelButtonCommand +frame=false +interior.element=radio + +[CheckBox] +inherits=PanelButtonCommand +frame=false +interior.element=checkbox + +[TreeExpander] +indicator.element=tree +indicator.size=8 + +[ToolTip] +frame.top=4 +frame.right=4 +frame.bottom=4 +frame.left=4 +frame=true + +[PanelButtonCommand] +inherits=PanelButtonCommand +interior.element=button +frame.element=button +text.normal.color=#CAD3F5 +text.focus.color=#CAD3F5 +text.press.color=#1E2030 +text.toggle.color=#1E2030 + +[PanelButtonTool] +inherits=PanelButtonCommand + +[DockTitle] +inherits=PanelButtonCommand +interior=false +frame=false +text.margin.top=5 +text.margin.bottom=5 +text.margin.left=5 +text.margin.right=5 +indicator.size=0 + +[Dock] +interior.element=toolbar +frame.element=toolbar +frame=true +interior=true + +[GroupBox] +inherits=PanelButtonCommand +interior.element=tabframe +interior=true +frame=false + +[Focus] +inherits=PanelButtonCommand +frame=true +frame.element=focus +frame.top=1 +frame.bottom=1 +frame.left=1 +frame.right=1 +frame.patternsize=20 + +[GenericFrame] +inherits=PanelButtonCommand +frame.element=common +frame.top=1 +frame.bottom=1 +frame.left=1 +frame.right=1 + +[Slider] +inherits=PanelButtonCommand +interior=true +frame.element=slider +interior.element=slider +frame.top=3 +frame.bottom=3 +frame.left=3 +frame.right=3 +focusFrame=true + +[SliderCursor] +inherits=PanelButtonCommand +interior=true +interior.element=slidercursor +frame=false + +[LineEdit] +inherits=PanelButtonCommand +frame.element=lineedit +interior.element=lineedit + +[IndicatorSpinBox] +inherits=LineEdit +frame.element=lineedit +interior.element=lineedit +frame.top=0 +frame.bottom=2 +frame.left=2 +frame.right=2 +indicator.size=8 + +[DropDownButton] +inherits=PanelButtonCommand +frame.top=2 +frame.bottom=2 +frame.left=0 +frame.right=1 +indicator.size=8 + +[ToolboxTab] +inherits=PanelButtonCommand +frame.element=tabframe +frame.top=1 +frame.bottom=1 +frame.left=1 +frame.right=1 + +[Tab] +inherits=PanelButtonCommand +interior.element=tab +frame.element=tab +frame.top=2 +frame.bottom=3 +frame.left=3 +frame.right=3 +indicator.size=10 +text.normal.color=#5B6078 +text.focus.color=#CAD3F5 +text.press.color=#CAD3F5 +text.toggle.color=#CAD3F5 +focusFrame=true + +[TabBarFrame] +inherits=GenericFrame +frame=true +frame.element=tabBarFrame +interior=false +frame.top=4 +frame.bottom=4 +frame.left=4 +frame.right=4 + +[TabFrame] +inherits=PanelButtonCommand +frame.element=tabframe +interior.element=tabframe + +[Dialog] +inherits=TabBarFrame +frame.element=tabframe +interior=false +frame=false +frame.top=1 +frame.bottom=1 +frame.left=1 +frame.right=1 + +[HeaderSection] +inherits=PanelButtonCommand +interior.element=header +frame.element=header +frame.top=0 +frame.bottom=1 +frame.left=1 +frame.right=1 +frame.expansion=0 +text.normal.color=#CAD3F5 +text.focus.color=#B7BDF8 +text.press.color=#CAD3F5 +text.toggle.color=#CAD3F5 +indicator.element=harrow + +[SizeGrip] +inherits=PanelButtonCommand +frame=false +interior=false +indicator.element=resize-grip +indicator.size=0 + +[Toolbar] +inherits=PanelButtonCommand +interior.element=menubar +frame.element=menubar +frame=true +frame.bottom=4 +frame.left=4 +frame.right=4 +text.normal.color=#CAD3F5 +text.focus.color=#CAD3F5 +text.press.color=#B7BDF8 +text.toggle.color=#B7BDF8 +text.bold=false + +[MenuBar] +inherits=PanelButtonCommand +frame.element=menubar +interior.element=menubar +frame.bottom=0 +text.normal.color=#CAD3F5 +frame.expansion=0 +text.bold=false + +[ToolbarButton] +frame.element=tbutton +interior.element=tbutton +indicator.element=arrow +text.normal.color=#CAD3F5 +text.focus.color=#CAD3F5 +text.press.color=#1E2030 +text.toggle.color=#1E2030 +text.bold=false + +[Scrollbar] +inherits=PanelButtonCommand +indicator.size=0 +interior=false +frame=false + +[ScrollbarGroove] +inherits=PanelButtonCommand +interior=false +frame=false + +[ScrollbarSlider] +inherits=PanelButtonCommand +interior=false +frame.element=scrollbarslider +frame.top=4 +frame.bottom=4 +frame.left=4 +frame.right=4 + +[ProgressbarContents] +inherits=PanelButtonCommand +frame=true +frame.element=progress-pattern +interior.element=progress-pattern +frame.top=2 +frame.bottom=2 +frame.left=2 +frame.right=2 + +[Progressbar] +inherits=PanelButtonCommand +frame.element=progress +interior.element=progress +frame.top=2 +frame.bottom=2 +frame.left=2 +frame.right=2 +text.margin=0 +text.normal.color=#CAD3F5 +text.focus.color=#CAD3F5 +text.press.color=#1E2030 +text.toggle.color=#1E2030 +text.bold=false +frame.expansion=18 + +[RadioButton] +inherits=PanelButtonCommand + +[Menu] +frame.element=menu +interior.element=menu +inherits=PanelButtonCommand +text.press.color=#1E2030 +text.toggle.color=#1E2030 +text.bold=false +frame.top=3 +frame.bottom=3 +frame.left=3 +frame.right=3 + +[MenuItem] +inherits=PanelButtonCommand +interior.element=menuitem +indicator.size=8 +text.focus.color=#CAD3F5 +text.press.color=#CAD3F5 + +[MenuBarItem] +inherits=PanelButtonCommand +interior.element=menubaritem +frame=false +text.margin.top=3 +text.margin.bottom=3 +text.margin.left=5 +text.margin.right=5 + +[StatusBar] +inherits=Toolbar +frame.element=toolbar +font.bold=true +text.normal.color=#CAD3F5 +frame=true +frame.top=0 +frame.bottom=0 + +[TitleBar] +inherits=PanelButtonCommand +frame=false +interior=false +text.margin.top=2 +text.margin.bottom=2 +text.margin.left=3 +text.margin.right=3 + +[ComboBox] +inherits=PanelButtonCommand +indicator.size=8 +frame.top=3 +frame.bottom=3 +frame.left=3 +frame.right=3 +text.margin.top=1 +text.margin.bottom=1 +text.margin.left=3 +text.margin.right=3 +text.toggle.color=#CAD3F5 + +[ToolboxTab] +inherits=PanelButtonCommand +text.normal.color=#CAD3F5 +text.press.color=#CAD3F5 +text.focus.color=#CAD3F5 + +[Hacks] +transparent_dolphin_view=true +blur_konsole=true +transparent_ktitle_label=true +transparent_menutitle=true +respect_darkness=true +kcapacitybar_as_progressbar=true +force_size_grip=false +iconless_pushbutton=true +iconless_menu=false +disabled_icon_opacity=100 +lxqtmainmenu_iconsize=0 +normal_default_pushbutton=true +single_top_toolbar=false +tint_on_mouseover=0 +transparent_pcmanfm_sidepane=true +transparent_pcmanfm_view=false +blur_translucent=true +centered_forms=false +kinetic_scrolling=false +middle_click_scroll=false +no_selection_tint=false +noninteger_translucency=false +style_vertical_toolbars=false +blur_only_active_window=false + +[Window] +interior=true +interior.element=window +frame.top=0 +frame.bottom=0 +frame.left=0 +frame.right=0 diff --git a/Kvantum/catppuccin-macchiato-lavender/catppuccin-macchiato-lavender.svg b/Kvantum/catppuccin-macchiato-lavender/catppuccin-macchiato-lavender.svg new file mode 100644 index 0000000..e2a62be --- /dev/null +++ b/Kvantum/catppuccin-macchiato-lavender/catppuccin-macchiato-lavender.svg @@ -0,0 +1,1958 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Kvantum/kvantum.kvconfig b/Kvantum/kvantum.kvconfig new file mode 100644 index 0000000..a4d9579 --- /dev/null +++ b/Kvantum/kvantum.kvconfig @@ -0,0 +1,5 @@ +[General] +theme=catppuccin-macchiato-lavender + +[Applications] +KvArcDark=virtualbox,VirtualBoxVM diff --git a/bat/config b/bat/config new file mode 100644 index 0000000..c484861 --- /dev/null +++ b/bat/config @@ -0,0 +1,27 @@ +# This is `bat`s configuration file. Each line either contains a comment or +# a command-line option that you want to pass to `bat` by default. You can +# run `bat --help` to get a list of all possible configuration options. + +# Specify desired highlighting theme (e.g. "TwoDark"). Run `bat --list-themes` +# for a list of all available themes +--theme="Catppuccin Macchiato" + +# Enable this to use italic text on the terminal. This is not supported on all +# terminal emulators (like tmux, by default): +--italic-text=always +--style=full +--color=always +--decorations=always + +# Uncomment the following line to disable automatic paging: +--paging=never + +# Uncomment the following line if you are using less version >= 551 and want to +# enable mouse scrolling support in `bat` when running inside tmux. This might +# disable text selection, unless you press shift. +#--pager="less --RAW-CONTROL-CHARS --quit-if-one-screen --mouse" + +# Syntax mappings: map a certain filename pattern to a language. +# Example 1: use the C++ syntax for Arduino .ino files +# Example 2: Use ".gitignore"-style highlighting for ".ignore" files +--map-syntax ".ignore:Git Ignore" diff --git a/bat/themes/Catppuccin Macchiato.tmTheme b/bat/themes/Catppuccin Macchiato.tmTheme new file mode 100644 index 0000000..b1f7056 --- /dev/null +++ b/bat/themes/Catppuccin Macchiato.tmTheme @@ -0,0 +1,2048 @@ + + + + + name + Catppuccin Macchiato + semanticClass + theme.dark.catppuccin-macchiato + uuid + 02b2bdf3-9eb7-4396-bf04-f17f1468f99f + author + Catppuccin Org + colorSpaceName + sRGB + settings + + + settings + + background + #24273a + foreground + #cad3f5 + caret + #f4dbd6 + lineHighlight + #363a4f + misspelling + #ed8796 + accent + #c6a0f6 + selection + #939ab740 + activeGuide + #494d64 + findHighlight + #455c6d + gutterForeground + #8087a2 + + + + name + Basic text & variable names (incl. leading punctuation) + scope + text, source, variable.other.readwrite, punctuation.definition.variable + settings + + foreground + #cad3f5 + + + + name + Parentheses, Brackets, Braces + scope + punctuation + settings + + foreground + #939ab7 + fontStyle + + + + + name + Comments + scope + comment, punctuation.definition.comment + settings + + foreground + #6e738d + fontStyle + italic + + + + scope + string, punctuation.definition.string + settings + + foreground + #a6da95 + + + + scope + constant.character.escape + settings + + foreground + #f5bde6 + + + + name + Booleans, constants, numbers + scope + constant.numeric, variable.other.constant, entity.name.constant, constant.language.boolean, constant.language.false, constant.language.true, keyword.other.unit.user-defined, keyword.other.unit.suffix.floating-point + settings + + foreground + #f5a97f + + + + scope + keyword, keyword.operator.word, keyword.operator.new, variable.language.super, support.type.primitive, storage.type, storage.modifier, punctuation.definition.keyword + settings + + foreground + #c6a0f6 + fontStyle + + + + + scope + entity.name.tag.documentation + settings + + foreground + #c6a0f6 + + + + name + Punctuation + scope + keyword.operator, punctuation.accessor, punctuation.definition.generic, meta.function.closure punctuation.section.parameters, punctuation.definition.tag, punctuation.separator.key-value + settings + + foreground + #8bd5ca + + + + scope + entity.name.function, meta.function-call.method, support.function, support.function.misc, variable.function + settings + + foreground + #8aadf4 + fontStyle + italic + + + + name + Classes + scope + entity.name.class, entity.other.inherited-class, support.class, meta.function-call.constructor, entity.name.struct + settings + + foreground + #eed49f + fontStyle + italic + + + + name + Enum + scope + entity.name.enum + settings + + foreground + #eed49f + fontStyle + italic + + + + name + Enum member + scope + meta.enum variable.other.readwrite, variable.other.enummember + settings + + foreground + #8bd5ca + + + + name + Object properties + scope + meta.property.object + settings + + foreground + #8bd5ca + + + + name + Types + scope + meta.type, meta.type-alias, support.type, entity.name.type + settings + + foreground + #eed49f + fontStyle + italic + + + + name + Decorators + scope + meta.annotation variable.function, meta.annotation variable.annotation.function, meta.annotation punctuation.definition.annotation, meta.decorator, punctuation.decorator + settings + + foreground + #f5a97f + + + + scope + variable.parameter, meta.function.parameters + settings + + foreground + #ee99a0 + fontStyle + italic + + + + name + Built-ins + scope + constant.language, support.function.builtin + settings + + foreground + #ed8796 + + + + scope + entity.other.attribute-name.documentation + settings + + foreground + #ed8796 + + + + name + Preprocessor directives + scope + keyword.control.directive, punctuation.definition.directive + settings + + foreground + #eed49f + + + + name + Type parameters + scope + punctuation.definition.typeparameters + settings + + foreground + #91d7e3 + + + + name + Namespaces + scope + entity.name.namespace + settings + + foreground + #eed49f + + + + name + Property names (left hand assignments in json/yaml/css) + scope + support.type.property-name.css + settings + + foreground + #8aadf4 + fontStyle + + + + + name + This/Self keyword + scope + variable.language.this, variable.language.this punctuation.definition.variable + settings + + foreground + #ed8796 + + + + name + Object properties + scope + variable.object.property + settings + + foreground + #cad3f5 + + + + name + String template interpolation + scope + string.template variable, string variable + settings + + foreground + #cad3f5 + + + + name + `new` as bold + scope + keyword.operator.new + settings + + fontStyle + bold + + + + name + C++ extern keyword + scope + storage.modifier.specifier.extern.cpp + settings + + foreground + #c6a0f6 + + + + name + C++ scope resolution + scope + entity.name.scope-resolution.template.call.cpp, entity.name.scope-resolution.parameter.cpp, entity.name.scope-resolution.cpp, entity.name.scope-resolution.function.definition.cpp + settings + + foreground + #eed49f + + + + name + C++ doc keywords + scope + storage.type.class.doxygen + settings + + fontStyle + + + + + name + C++ operators + scope + storage.modifier.reference.cpp + settings + + foreground + #8bd5ca + + + + name + C# Interpolated Strings + scope + meta.interpolation.cs + settings + + foreground + #cad3f5 + + + + name + C# xml-style docs + scope + comment.block.documentation.cs + settings + + foreground + #cad3f5 + + + + name + Classes, reflecting the className color in JSX + scope + source.css entity.other.attribute-name.class.css, entity.other.attribute-name.parent-selector.css punctuation.definition.entity.css + settings + + foreground + #eed49f + + + + name + Operators + scope + punctuation.separator.operator.css + settings + + foreground + #8bd5ca + + + + name + Pseudo classes + scope + source.css entity.other.attribute-name.pseudo-class + settings + + foreground + #8bd5ca + + + + scope + source.css constant.other.unicode-range + settings + + foreground + #f5a97f + + + + scope + source.css variable.parameter.url + settings + + foreground + #a6da95 + fontStyle + + + + + name + CSS vendored property names + scope + support.type.vendored.property-name + settings + + foreground + #91d7e3 + + + + name + Less/SCSS right-hand variables (@/$-prefixed) + scope + source.css meta.property-value variable, source.css meta.property-value variable.other.less, source.css meta.property-value variable.other.less punctuation.definition.variable.less, meta.definition.variable.scss + settings + + foreground + #ee99a0 + + + + name + CSS variables (--prefixed) + scope + source.css meta.property-list variable, meta.property-list variable.other.less, meta.property-list variable.other.less punctuation.definition.variable.less + settings + + foreground + #8aadf4 + + + + name + CSS Percentage values, styled the same as numbers + scope + keyword.other.unit.percentage.css + settings + + foreground + #f5a97f + + + + name + CSS Attribute selectors, styled the same as strings + scope + source.css meta.attribute-selector + settings + + foreground + #a6da95 + + + + name + JSON/YAML keys, other left-hand assignments + scope + keyword.other.definition.ini, punctuation.support.type.property-name.json, support.type.property-name.json, punctuation.support.type.property-name.toml, support.type.property-name.toml, entity.name.tag.yaml, punctuation.support.type.property-name.yaml, support.type.property-name.yaml + settings + + foreground + #8aadf4 + fontStyle + + + + + name + JSON/YAML constants + scope + constant.language.json, constant.language.yaml + settings + + foreground + #f5a97f + + + + name + YAML anchors + scope + entity.name.type.anchor.yaml, variable.other.alias.yaml + settings + + foreground + #eed49f + fontStyle + + + + + name + TOML tables / ini groups + scope + support.type.property-name.table, entity.name.section.group-title.ini + settings + + foreground + #eed49f + + + + name + TOML dates + scope + constant.other.time.datetime.offset.toml + settings + + foreground + #f5bde6 + + + + name + YAML anchor puctuation + scope + punctuation.definition.anchor.yaml, punctuation.definition.alias.yaml + settings + + foreground + #f5bde6 + + + + name + YAML triple dashes + scope + entity.other.document.begin.yaml + settings + + foreground + #f5bde6 + + + + name + Markup Diff + scope + markup.changed.diff + settings + + foreground + #f5a97f + + + + name + Diff + scope + meta.diff.header.from-file, meta.diff.header.to-file, punctuation.definition.from-file.diff, punctuation.definition.to-file.diff + settings + + foreground + #8aadf4 + + + + name + Diff Inserted + scope + markup.inserted.diff + settings + + foreground + #a6da95 + + + + name + Diff Deleted + scope + markup.deleted.diff + settings + + foreground + #ed8796 + + + + name + dotenv left-hand side assignments + scope + variable.other.env + settings + + foreground + #8aadf4 + + + + name + dotenv reference to existing env variable + scope + string.quoted variable.other.env + settings + + foreground + #cad3f5 + + + + name + GDScript functions + scope + support.function.builtin.gdscript + settings + + foreground + #8aadf4 + + + + name + GDScript constants + scope + constant.language.gdscript + settings + + foreground + #f5a97f + + + + name + Comment keywords + scope + comment meta.annotation.go + settings + + foreground + #ee99a0 + + + + name + go:embed, go:build, etc. + scope + comment meta.annotation.parameters.go + settings + + foreground + #f5a97f + + + + name + Go constants (nil, true, false) + scope + constant.language.go + settings + + foreground + #f5a97f + + + + name + GraphQL variables + scope + variable.graphql + settings + + foreground + #cad3f5 + + + + name + GraphQL aliases + scope + string.unquoted.alias.graphql + settings + + foreground + #f0c6c6 + + + + name + GraphQL enum members + scope + constant.character.enum.graphql + settings + + foreground + #8bd5ca + + + + name + GraphQL field in types + scope + meta.objectvalues.graphql constant.object.key.graphql string.unquoted.graphql + settings + + foreground + #f0c6c6 + + + + name + HTML/XML DOCTYPE as keyword + scope + keyword.other.doctype, meta.tag.sgml.doctype punctuation.definition.tag, meta.tag.metadata.doctype entity.name.tag, meta.tag.metadata.doctype punctuation.definition.tag + settings + + foreground + #c6a0f6 + + + + name + HTML/XML-like <tags/> + scope + entity.name.tag + settings + + foreground + #8aadf4 + fontStyle + + + + + name + Special characters like &amp; + scope + text.html constant.character.entity, text.html constant.character.entity punctuation, constant.character.entity.xml, constant.character.entity.xml punctuation, constant.character.entity.js.jsx, constant.charactger.entity.js.jsx punctuation, constant.character.entity.tsx, constant.character.entity.tsx punctuation + settings + + foreground + #ed8796 + + + + name + HTML/XML tag attribute values + scope + entity.other.attribute-name + settings + + foreground + #eed49f + + + + name + Components + scope + support.class.component, support.class.component.jsx, support.class.component.tsx, support.class.component.vue + settings + + foreground + #f5bde6 + fontStyle + + + + + name + Annotations + scope + punctuation.definition.annotation, storage.type.annotation + settings + + foreground + #f5a97f + + + + name + Java enums + scope + constant.other.enum.java + settings + + foreground + #8bd5ca + + + + name + Java imports + scope + storage.modifier.import.java + settings + + foreground + #cad3f5 + + + + name + Javadoc + scope + comment.block.javadoc.java keyword.other.documentation.javadoc.java + settings + + fontStyle + + + + + name + Exported Variable + scope + meta.export variable.other.readwrite.js + settings + + foreground + #ee99a0 + + + + name + JS/TS constants & properties + scope + variable.other.constant.js, variable.other.constant.ts, variable.other.property.js, variable.other.property.ts + settings + + foreground + #cad3f5 + + + + name + JSDoc; these are mainly params, so styled as such + scope + variable.other.jsdoc, comment.block.documentation variable.other + settings + + foreground + #ee99a0 + fontStyle + + + + + name + JSDoc keywords + scope + storage.type.class.jsdoc + settings + + fontStyle + + + + + scope + support.type.object.console.js + settings + + foreground + #cad3f5 + + + + name + Node constants as keywords (module, etc.) + scope + support.constant.node, support.type.object.module.js + settings + + foreground + #c6a0f6 + + + + name + implements as keyword + scope + storage.modifier.implements + settings + + foreground + #c6a0f6 + + + + name + Builtin types + scope + constant.language.null.js, constant.language.null.ts, constant.language.undefined.js, constant.language.undefined.ts, support.type.builtin.ts + settings + + foreground + #c6a0f6 + + + + scope + variable.parameter.generic + settings + + foreground + #eed49f + + + + name + Arrow functions + scope + keyword.declaration.function.arrow.js, storage.type.function.arrow.ts + settings + + foreground + #8bd5ca + + + + name + Decorator punctuations (decorators inherit from blue functions, instead of styleguide peach) + scope + punctuation.decorator.ts + settings + + foreground + #8aadf4 + fontStyle + italic + + + + name + Extra JS/TS keywords + scope + keyword.operator.expression.in.js, keyword.operator.expression.in.ts, keyword.operator.expression.infer.ts, keyword.operator.expression.instanceof.js, keyword.operator.expression.instanceof.ts, keyword.operator.expression.is, keyword.operator.expression.keyof.ts, keyword.operator.expression.of.js, keyword.operator.expression.of.ts, keyword.operator.expression.typeof.ts + settings + + foreground + #c6a0f6 + + + + name + Julia macros + scope + support.function.macro.julia + settings + + foreground + #8bd5ca + fontStyle + italic + + + + name + Julia language constants (true, false) + scope + constant.language.julia + settings + + foreground + #f5a97f + + + + name + Julia other constants (these seem to be arguments inside arrays) + scope + constant.other.symbol.julia + settings + + foreground + #ee99a0 + + + + name + LaTeX preamble + scope + text.tex keyword.control.preamble + settings + + foreground + #8bd5ca + + + + name + LaTeX be functions + scope + text.tex support.function.be + settings + + foreground + #91d7e3 + + + + name + LaTeX math + scope + constant.other.general.math.tex + settings + + foreground + #f0c6c6 + + + + name + Lua docstring keywords + scope + comment.line.double-dash.documentation.lua storage.type.annotation.lua + settings + + foreground + #c6a0f6 + fontStyle + + + + + name + Lua docstring variables + scope + comment.line.double-dash.documentation.lua entity.name.variable.lua, comment.line.double-dash.documentation.lua variable.lua + settings + + foreground + #cad3f5 + + + + scope + heading.1.markdown punctuation.definition.heading.markdown, heading.1.markdown, markup.heading.atx.1.mdx, markup.heading.atx.1.mdx punctuation.definition.heading.mdx, markup.heading.setext.1.markdown, markup.heading.heading-0.asciidoc + settings + + foreground + #ed8796 + + + + scope + heading.2.markdown punctuation.definition.heading.markdown, heading.2.markdown, markup.heading.atx.2.mdx, markup.heading.atx.2.mdx punctuation.definition.heading.mdx, markup.heading.setext.2.markdown, markup.heading.heading-1.asciidoc + settings + + foreground + #f5a97f + + + + scope + heading.3.markdown punctuation.definition.heading.markdown, heading.3.markdown, markup.heading.atx.3.mdx, markup.heading.atx.3.mdx punctuation.definition.heading.mdx, markup.heading.heading-2.asciidoc + settings + + foreground + #eed49f + + + + scope + heading.4.markdown punctuation.definition.heading.markdown, heading.4.markdown, markup.heading.atx.4.mdx, markup.heading.atx.4.mdx punctuation.definition.heading.mdx, markup.heading.heading-3.asciidoc + settings + + foreground + #a6da95 + + + + scope + heading.5.markdown punctuation.definition.heading.markdown, heading.5.markdown, markup.heading.atx.5.mdx, markup.heading.atx.5.mdx punctuation.definition.heading.mdx, markup.heading.heading-4.asciidoc + settings + + foreground + #8aadf4 + + + + scope + heading.6.markdown punctuation.definition.heading.markdown, heading.6.markdown, markup.heading.atx.6.mdx, markup.heading.atx.6.mdx punctuation.definition.heading.mdx, markup.heading.heading-5.asciidoc + settings + + foreground + #c6a0f6 + + + + scope + markup.bold + settings + + foreground + #ed8796 + fontStyle + bold + + + + scope + markup.italic + settings + + foreground + #ed8796 + fontStyle + italic + + + + scope + markup.strikethrough + settings + + foreground + #a5adcb + fontStyle + strikethrough + + + + name + Markdown auto links + scope + punctuation.definition.link, markup.underline.link + settings + + foreground + #8aadf4 + + + + name + Markdown links + scope + text.html.markdown punctuation.definition.link.title, string.other.link.title.markdown, markup.link, punctuation.definition.constant.markdown, constant.other.reference.link.markdown, markup.substitution.attribute-reference + settings + + foreground + #b7bdf8 + + + + name + Markdown code spans + scope + punctuation.definition.raw.markdown, markup.inline.raw.string.markdown, markup.raw.block.markdown + settings + + foreground + #a6da95 + + + + name + Markdown triple backtick language identifier + scope + fenced_code.block.language + settings + + foreground + #91d7e3 + + + + name + Markdown triple backticks + scope + markup.fenced_code.block punctuation.definition, markup.raw support.asciidoc + settings + + foreground + #939ab7 + + + + name + Markdown quotes + scope + markup.quote, punctuation.definition.quote.begin + settings + + foreground + #f5bde6 + + + + name + Markdown separators + scope + meta.separator.markdown + settings + + foreground + #8bd5ca + + + + name + Markdown list bullets + scope + punctuation.definition.list.begin.markdown, markup.list.bullet + settings + + foreground + #8bd5ca + + + + name + Nix attribute names + scope + entity.other.attribute-name.multipart.nix, entity.other.attribute-name.single.nix + settings + + foreground + #8aadf4 + + + + name + Nix parameter names + scope + variable.parameter.name.nix + settings + + foreground + #cad3f5 + fontStyle + + + + + name + Nix interpolated parameter names + scope + meta.embedded variable.parameter.name.nix + settings + + foreground + #b7bdf8 + fontStyle + + + + + name + Nix paths + scope + string.unquoted.path.nix + settings + + foreground + #f5bde6 + fontStyle + + + + + name + PHP Attributes + scope + support.attribute.builtin, meta.attribute.php + settings + + foreground + #eed49f + + + + name + PHP Parameters (needed for the leading dollar sign) + scope + meta.function.parameters.php punctuation.definition.variable.php + settings + + foreground + #ee99a0 + + + + name + PHP Constants (null, __FILE__, etc.) + scope + constant.language.php + settings + + foreground + #c6a0f6 + + + + name + PHP functions + scope + text.html.php support.function + settings + + foreground + #91d7e3 + + + + name + PHPdoc keywords + scope + keyword.other.phpdoc.php + settings + + fontStyle + + + + + name + Python argument functions reset to text, otherwise they inherit blue from function-call + scope + support.variable.magic.python, meta.function-call.arguments.python + settings + + foreground + #cad3f5 + + + + name + Python double underscore functions + scope + support.function.magic.python + settings + + foreground + #91d7e3 + fontStyle + italic + + + + name + Python `self` keyword + scope + variable.parameter.function.language.special.self.python, variable.language.special.self.python + settings + + foreground + #ed8796 + fontStyle + italic + + + + name + python keyword flow/logical (for ... in) + scope + keyword.control.flow.python, keyword.operator.logical.python + settings + + foreground + #c6a0f6 + + + + name + python storage type + scope + storage.type.function.python + settings + + foreground + #c6a0f6 + + + + name + python function support + scope + support.token.decorator.python, meta.function.decorator.identifier.python + settings + + foreground + #91d7e3 + + + + name + python function calls + scope + meta.function-call.python + settings + + foreground + #8aadf4 + + + + name + python function decorators + scope + entity.name.function.decorator.python, punctuation.definition.decorator.python + settings + + foreground + #f5a97f + fontStyle + italic + + + + name + python placeholder reset to normal string + scope + constant.character.format.placeholder.other.python + settings + + foreground + #f5bde6 + + + + name + Python exception & builtins such as exit() + scope + support.type.exception.python, support.function.builtin.python + settings + + foreground + #f5a97f + + + + name + entity.name.type + scope + support.type.python + settings + + foreground + #f5a97f + + + + name + python constants (True/False) + scope + constant.language.python + settings + + foreground + #c6a0f6 + + + + name + Arguments accessed later in the function body + scope + meta.indexed-name.python, meta.item-access.python + settings + + foreground + #ee99a0 + fontStyle + italic + + + + name + Python f-strings/binary/unicode storage types + scope + storage.type.string.python + settings + + foreground + #a6da95 + fontStyle + italic + + + + name + Python type hints + scope + meta.function.parameters.python + settings + + fontStyle + + + + + name + Regex string begin/end in JS/TS + scope + string.regexp punctuation.definition.string.begin, string.regexp punctuation.definition.string.end + settings + + foreground + #f5bde6 + + + + name + Regex anchors (^, $) + scope + keyword.control.anchor.regexp + settings + + foreground + #c6a0f6 + + + + name + Regex regular string match + scope + string.regexp.ts + settings + + foreground + #cad3f5 + + + + name + Regex group parenthesis & backreference (\1, \2, \3, ...) + scope + punctuation.definition.group.regexp, keyword.other.back-reference.regexp + settings + + foreground + #a6da95 + + + + name + Regex character class [] + scope + punctuation.definition.character-class.regexp + settings + + foreground + #eed49f + + + + name + Regex character classes (\d, \w, \s) + scope + constant.other.character-class.regexp + settings + + foreground + #f5bde6 + + + + name + Regex range + scope + constant.other.character-class.range.regexp + settings + + foreground + #f4dbd6 + + + + name + Regex quantifier + scope + keyword.operator.quantifier.regexp + settings + + foreground + #8bd5ca + + + + name + Regex constant/numeric + scope + constant.character.numeric.regexp + settings + + foreground + #f5a97f + + + + name + Regex lookaheads, negative lookaheads, lookbehinds, negative lookbehinds + scope + punctuation.definition.group.no-capture.regexp, meta.assertion.look-ahead.regexp, meta.assertion.negative-look-ahead.regexp + settings + + foreground + #8aadf4 + + + + name + Rust attribute + scope + meta.annotation.rust, meta.annotation.rust punctuation, meta.attribute.rust, punctuation.definition.attribute.rust + settings + + foreground + #eed49f + fontStyle + italic + + + + name + Rust attribute strings + scope + meta.attribute.rust string.quoted.double.rust, meta.attribute.rust string.quoted.single.char.rust + settings + + fontStyle + + + + + name + Rust keyword + scope + entity.name.function.macro.rules.rust, storage.type.module.rust, storage.modifier.rust, storage.type.struct.rust, storage.type.enum.rust, storage.type.trait.rust, storage.type.union.rust, storage.type.impl.rust, storage.type.rust, storage.type.function.rust, storage.type.type.rust + settings + + foreground + #c6a0f6 + fontStyle + + + + + name + Rust u/i32, u/i64, etc. + scope + entity.name.type.numeric.rust + settings + + foreground + #c6a0f6 + fontStyle + + + + + name + Rust generic + scope + meta.generic.rust + settings + + foreground + #f5a97f + + + + name + Rust impl + scope + entity.name.impl.rust + settings + + foreground + #eed49f + fontStyle + italic + + + + name + Rust module + scope + entity.name.module.rust + settings + + foreground + #f5a97f + + + + name + Rust trait + scope + entity.name.trait.rust + settings + + foreground + #eed49f + fontStyle + italic + + + + name + Rust struct + scope + storage.type.source.rust + settings + + foreground + #eed49f + + + + name + Rust union + scope + entity.name.union.rust + settings + + foreground + #eed49f + + + + name + Rust enum member + scope + meta.enum.rust storage.type.source.rust + settings + + foreground + #8bd5ca + + + + name + Rust macro + scope + support.macro.rust, meta.macro.rust support.function.rust, entity.name.function.macro.rust + settings + + foreground + #8aadf4 + fontStyle + italic + + + + name + Rust lifetime + scope + storage.modifier.lifetime.rust, entity.name.type.lifetime + settings + + foreground + #8aadf4 + fontStyle + italic + + + + name + Rust string formatting + scope + string.quoted.double.rust constant.other.placeholder.rust + settings + + foreground + #f5bde6 + + + + name + Rust return type generic + scope + meta.function.return-type.rust meta.generic.rust storage.type.rust + settings + + foreground + #cad3f5 + + + + name + Rust functions + scope + meta.function.call.rust + settings + + foreground + #8aadf4 + + + + name + Rust angle brackets + scope + punctuation.brackets.angle.rust + settings + + foreground + #91d7e3 + + + + name + Rust constants + scope + constant.other.caps.rust + settings + + foreground + #f5a97f + + + + name + Rust function parameters + scope + meta.function.definition.rust variable.other.rust + settings + + foreground + #ee99a0 + + + + name + Rust closure variables + scope + meta.function.call.rust variable.other.rust + settings + + foreground + #cad3f5 + + + + name + Rust self + scope + variable.language.self.rust + settings + + foreground + #ed8796 + + + + name + Rust metavariable names + scope + variable.other.metavariable.name.rust, meta.macro.metavariable.rust keyword.operator.macro.dollar.rust + settings + + foreground + #f5bde6 + + + + name + Shell shebang + scope + comment.line.shebang, comment.line.shebang punctuation.definition.comment, comment.line.shebang, punctuation.definition.comment.shebang.shell, meta.shebang.shell + settings + + foreground + #f5bde6 + fontStyle + italic + + + + name + Shell shebang command + scope + comment.line.shebang constant.language + settings + + foreground + #8bd5ca + fontStyle + italic + + + + name + Shell interpolated command + scope + meta.function-call.arguments.shell punctuation.definition.variable.shell, meta.function-call.arguments.shell punctuation.section.interpolation, meta.function-call.arguments.shell punctuation.definition.variable.shell, meta.function-call.arguments.shell punctuation.section.interpolation + settings + + foreground + #ed8796 + + + + name + Shell interpolated command variable + scope + meta.string meta.interpolation.parameter.shell variable.other.readwrite + settings + + foreground + #f5a97f + fontStyle + italic + + + + scope + source.shell punctuation.section.interpolation, punctuation.definition.evaluation.backticks.shell + settings + + foreground + #8bd5ca + + + + name + Shell EOF + scope + entity.name.tag.heredoc.shell + settings + + foreground + #c6a0f6 + + + + name + Shell quoted variable + scope + string.quoted.double.shell variable.other.normal.shell + settings + + foreground + #cad3f5 + + + + scope + markup.heading.synopsis.man, markup.heading.title.man, markup.heading.other.man, markup.heading.env.man + settings + + foreground + #c6a0f6 + + + + scope + markup.heading.commands.man + settings + + foreground + #8aadf4 + + + + scope + markup.heading.env.man + settings + + foreground + #f5bde6 + + + + scope + markup.heading.1.markdown + settings + + foreground + #ed8796 + + + + scope + markup.heading.2.markdown + settings + + foreground + #f5a97f + + + + scope + markup.heading.markdown + settings + + foreground + #eed49f + + + + + \ No newline at end of file diff --git a/btop/btop.conf b/btop/btop.conf new file mode 100644 index 0000000..97da461 --- /dev/null +++ b/btop/btop.conf @@ -0,0 +1,254 @@ +#? Config file for btop v. 1.4.4 + +#* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes. +#* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes" +color_theme = "catppuccin_macchiato" + +#* If the theme set background should be shown, set to False if you want terminal background transparency. +theme_background = False + +#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false. +truecolor = True + +#* Set to true to force tty mode regardless if a real tty has been detected or not. +#* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols. +force_tty = False + +#* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets. +#* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box. +#* Use whitespace " " as separator between different presets. +#* Example: "cpu:0:default,mem:0:tty,proc:1:default cpu:0:braille,proc:0:tty" +presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty" + +#* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists. +#* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift. +vim_keys = True + +#* Rounded corners on boxes, is ignored if TTY mode is ON. +rounded_corners = True + +#* Default symbols to use for graph creation, "braille", "block" or "tty". +#* "braille" offers the highest resolution but might not be included in all fonts. +#* "block" has half the resolution of braille but uses more common characters. +#* "tty" uses only 3 different symbols but will work with most fonts and should work in a real TTY. +#* Note that "tty" only has half the horizontal resolution of the other two, so will show a shorter historical view. +graph_symbol = "braille" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_cpu = "default" + +# Graph symbol to use for graphs in gpu box, "default", "braille", "block" or "tty". +graph_symbol_gpu = "default" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_mem = "default" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_net = "default" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_proc = "default" + +#* Manually set which boxes to show. Available values are "cpu mem net proc" and "gpu0" through "gpu5", separate values with whitespace. +shown_boxes = "cpu mem net proc" + +#* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs. +update_ms = 1000 + +#* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct", +#* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly. +proc_sorting = "memory" + +#* Reverse sorting order, True or False. +proc_reversed = False + +#* Show processes as a tree. +proc_tree = False + +#* Use the cpu graph colors in the process list. +proc_colors = True + +#* Use a darkening gradient in the process list. +proc_gradient = True + +#* If process cpu usage should be of the core it's running on or usage of the total available cpu power. +proc_per_core = False + +#* Show process memory as bytes instead of percent. +proc_mem_bytes = True + +#* Show cpu graph for each process. +proc_cpu_graphs = True + +#* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate) +proc_info_smaps = False + +#* Show proc box on left side of screen instead of right. +proc_left = False + +#* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop). +proc_filter_kernel = False + +#* In tree-view, always accumulate child process resources in the parent process. +proc_aggregate = False + +#* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available. +#* Select from a list of detected attributes from the options menu. +cpu_graph_upper = "total" + +#* Sets the CPU stat shown in lower half of the CPU graph, "total" is always available. +#* Select from a list of detected attributes from the options menu. +cpu_graph_lower = "total" + +#* If gpu info should be shown in the cpu box. Available values = "Auto", "On" and "Off". +show_gpu_info = "Auto" + +#* Toggles if the lower CPU graph should be inverted. +cpu_invert_lower = True + +#* Set to True to completely disable the lower CPU graph. +cpu_single_graph = False + +#* Show cpu box at bottom of screen instead of top. +cpu_bottom = False + +#* Shows the system uptime in the CPU box. +show_uptime = True + +#* Show cpu temperature. +check_temp = True + +#* Which sensor to use for cpu temperature, use options menu to select from list of available sensors. +cpu_sensor = "Auto" + +#* Show temperatures for cpu cores also if check_temp is True and sensors has been found. +show_coretemp = True + +#* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core. +#* Use lm-sensors or similar to see which cores are reporting temperatures on your machine. +#* Format "x:y" x=core with wrong temp, y=core with correct temp, use space as separator between multiple entries. +#* Example: "4:0 5:1 6:3" +cpu_core_map = "" + +#* Which temperature scale to use, available values: "celsius", "fahrenheit", "kelvin" and "rankine". +temp_scale = "celsius" + +#* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024. +base_10_sizes = False + +#* Show CPU frequency. +show_cpu_freq = True + +#* Draw a clock at top of screen, formatting according to strftime, empty string to disable. +#* Special formatting: /host = hostname | /user = username | /uptime = system uptime +clock_format = "%X" + +#* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort. +background_update = True + +#* Custom cpu model name, empty string to disable. +custom_cpu_name = "" + +#* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with whitespace " ". +#* Only disks matching the filter will be shown. Prepend exclude= to only show disks not matching the filter. Examples: disk_filter="/boot /home/user", disks_filter="exclude=/boot /home/user" +disks_filter = "" + +#* Show graphs instead of meters for memory values. +mem_graphs = True + +#* Show mem box below net box instead of above. +mem_below_net = False + +#* Count ZFS ARC in cached and available memory. +zfs_arc_cached = True + +#* If swap memory should be shown in memory box. +show_swap = False + +#* Show swap as a disk, ignores show_swap value above, inserts itself after first disk. +swap_disk = False + +#* If mem box should be split to also show disks info. +show_disks = True + +#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar. +only_physical = True + +#* Read disks list from /etc/fstab. This also disables only_physical. +use_fstab = True + +#* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool) +zfs_hide_datasets = False + +#* Set to true to show available disk space for privileged users. +disk_free_priv = False + +#* Toggles if io activity % (disk busy time) should be shown in regular disk usage view. +show_io_stat = True + +#* Toggles io mode for disks, showing big graphs for disk read/write speeds. +io_mode = False + +#* Set to True to show combined read/write io graphs in io mode. +io_graph_combined = False + +#* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ". +#* Example: "/mnt/media:100 /:20 /boot:1". +io_graph_speeds = "" + +#* Set fixed values for network graphs in Mebibits. Is only used if net_auto is also set to False. +net_download = 100 + +net_upload = 100 + +#* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest. +net_auto = True + +#* Sync the auto scaling for download and upload to whichever currently has the highest scale. +net_sync = True + +#* Starts with the Network Interface specified here. +net_iface = "" + +#* "True" shows bitrates in base 10 (Kbps, Mbps). "False" shows bitrates in binary sizes (Kibps, Mibps, etc.). "Auto" uses base_10_sizes. +base_10_bitrate = "Auto" + +#* Show battery stats in top right if battery is present. +show_battery = True + +#* Which battery to use if multiple are present. "Auto" for auto detection. +selected_battery = "Auto" + +#* Show power stats of battery next to charge indicator. +show_battery_watts = True + +#* Set loglevel for "~/.config/btop/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG". +#* The level set includes all lower levels, i.e. "DEBUG" will show all logging info. +log_level = "WARNING" + +#* Measure PCIe throughput on NVIDIA cards, may impact performance on certain cards. +nvml_measure_pcie_speeds = True + +#* Measure PCIe throughput on AMD cards, may impact performance on certain cards. +rsmi_measure_pcie_speeds = True + +#* Horizontally mirror the GPU graph. +gpu_mirror_graph = True + +#* Custom gpu0 model name, empty string to disable. +custom_gpu_name0 = "" + +#* Custom gpu1 model name, empty string to disable. +custom_gpu_name1 = "" + +#* Custom gpu2 model name, empty string to disable. +custom_gpu_name2 = "" + +#* Custom gpu3 model name, empty string to disable. +custom_gpu_name3 = "" + +#* Custom gpu4 model name, empty string to disable. +custom_gpu_name4 = "" + +#* Custom gpu5 model name, empty string to disable. +custom_gpu_name5 = "" diff --git a/btop/themes/catppuccin_macchiato.theme b/btop/themes/catppuccin_macchiato.theme new file mode 100644 index 0000000..7abd0bf --- /dev/null +++ b/btop/themes/catppuccin_macchiato.theme @@ -0,0 +1,42 @@ +theme[main_bg]="#24273A" +theme[main_fg]="#CAD3F5" +theme[title]="#CAD3F5" +theme[hi_fg]="#8AADF4" +theme[selected_bg]="#494D64" +theme[selected_fg]="#8AADF4" +theme[inactive_fg]="#8087A2" +theme[graph_text]="#F4DBD6" +theme[meter_bg]="#494D64" +theme[proc_misc]="#F4DBD6" +theme[cpu_box]="#7DC4E4" +theme[mem_box]="#A6DA95" +theme[net_box]="#C6A0F6" +theme[proc_box]="#F0C6C6" +theme[div_line]="#6E738D" +theme[temp_start]="#EED49F" +theme[temp_mid]="#F5A97F" +theme[temp_end]="#ED8796" +theme[cpu_start]="#7DC4E4" +theme[cpu_mid]="#91D7E3" +theme[cpu_end]="#8BD5CA" +theme[free_start]="#8BD5CA" +theme[free_mid]="#8BD5CA" +theme[free_end]="#A6DA95" +theme[cached_start]="#F5BDE6" +theme[cached_mid]="#F5BDE6" +theme[cached_end]="#C6A0F6" +theme[available_start]="#F4DBD6" +theme[available_mid]="#F0C6C6" +theme[available_end]="#F0C6C6" +theme[used_start]="#F5A97F" +theme[used_mid]="#F5A97F" +theme[used_end]="#ED8796" +theme[download_start]="#B7BDF8" +theme[download_mid]="#B7BDF8" +theme[download_end]="#C6A0F6" +theme[upload_start]="#B7BDF8" +theme[upload_mid]="#B7BDF8" +theme[upload_end]="#C6A0F6" +theme[process_start]="#7DC4E4" +theme[process_mid]="#91D7E3" +theme[process_end]="#8BD5CA" diff --git a/fastfetch/config.jsonc b/fastfetch/config.jsonc new file mode 100644 index 0000000..24549ab --- /dev/null +++ b/fastfetch/config.jsonc @@ -0,0 +1,94 @@ +{ + "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json", + "logo": { + "source": "$XDG_CONFIG_HOME/fastfetch/logo.png", + "height": 18, + }, + "display": { + "separator": " ➜ ", + "color": "white", + }, + "modules": [ + { + "type": "custom", + "format": "┌──────────── Hardware Information ────────────┐", + }, + { + "type": "cpu", + "key": "  CPU", + "keyColor": "blue", + }, + { + "type": "board", + "key": "  Board", + "keyColor": "magenta", + }, + { + "type": "gpu", + "format": "{2} {3}", + "key": " 󰛇 GPU", + "keyColor": "yellow", + }, + { + "type": "memory", + "key": "  Memory", + "keyColor": "green", + }, + { + "type": "display", + "key": " 󰍹 Display", + "keyColor": "cyan", + "compactType": "original", + }, + "break", + { + "type": "custom", + "format": "├──────────── Software Information ────────────┤", + }, + { + "type": "os", + "key": "  OS", + "keyColor": "blue", + }, + { + "type": "kernel", + "key": "  Kernel", + "keyColor": "red", + }, + { + "type": "shell", + "key": "  Shell", + "keyColor": "magenta", + }, + { + "type": "wm", + "key": "  WM", + "keyColor": "cyan", + }, + { + "type": "terminal", + "key": "  Terminal", + "keyColor": "yellow", + }, + { + "type": "packages", + "key": "  Packages", + "keyColor": "green", + }, + { + "type": "uptime", + "key": " 󱫐 Uptime", + "keyColor": "white", + }, + { + "type": "custom", + "format": "└──────────────────────────────────────────────┘", + }, + "break", + { + "type": "colors", + "symbol": "block", + "paddingLeft": 12, + }, + ], +} diff --git a/fastfetch/logo.png b/fastfetch/logo.png new file mode 100755 index 0000000..630c9bd Binary files /dev/null and b/fastfetch/logo.png differ diff --git a/fd/ignore b/fd/ignore new file mode 100644 index 0000000..18fa74a --- /dev/null +++ b/fd/ignore @@ -0,0 +1,41 @@ +# vim: filetype=gitignore +#─────────────────────────────────────────────────────────────────────────────── +**/*.app/* +**/*.pxd/* +Juegos/** + +# git +.gitignore +.git + +# INFO files +*INFO* + +# general +LICENSE +.editorconfig + +# node +package.json +.prettierrc +.eslintrc +.eslintrc.json +package-lock.json +versions.json +manifest.json +tsconfig.json +jsconfig.json +esbuild.config.mjs +biome.json +node_modules/* + +# python +__init__.py +pyproject.toml +requirements.txt + +# nvim-plugins +stylua.toml + +# vscode +.vscode diff --git a/git/config b/git/config new file mode 100644 index 0000000..bd43074 --- /dev/null +++ b/git/config @@ -0,0 +1,264 @@ +[include] + path = ~/.config/git/themes/catppuccin.gitconfig + +[includeIf "gitdir:~/dev/work/"] + path = ~/.config/git/config-work + +[includeIf "gitdir:~/dev/class/"] + path = ~/.config/git/config-class + +[safe] + directory = ~/dev + +[filter "lfs"] + clean = git-lfs clean -- %f + smudge = git-lfs smudge -- %f + process = git-lfs filter-process + required = true + +[init] + defaultBranch = main + +[protocol "file"] + allow = always + +[credential] + helper = libsecret + +[core] + editor = nvim + pager = delta + excludesfile = ~/.config/git/ignore + +[interactive] + diffFilter = delta --color-only + +[delta] + features = catppuccin-macchiato + side-by-side = false + true-color = always + hyperlinks = true + line-numbers = true + +[merge] + tool = nvimdiff + conflictstyle = diff3 + +[diff] + colorMoved = default + +[pull] + rebase = false + +[commit] + gpgsign = false + +[gpg] + program = /sbin/gpg + +[alias] + aliases = config --get-regexp alias + + a = add --all + ai = add -i + + ap = apply + as = apply --stat + ac = apply --check + + ama = am --abort + amr = am --resolved + ams = am --skip + + b = branch + ba = branch -a + bd = branch -d + bdd = branch -D + br = branch -r + bc = rev-parse --abbrev-ref HEAD + bu = !git rev-parse --abbrev-ref --symbolic-full-name "@{u}" + bs = !git-branch-status + + c = commit + ca = commit -a + cm = commit -m + cam = commit -am + cem = commit --allow-empty -m + cd = commit --amend + cad = commit -a --amend + ced = commit --allow-empty --amend + + cl = clone + cld = clone --depth 1 + clg = !sh -c 'git clone https://github.com/$1 $(basename $1)' - + clgp = !sh -c 'git clone git@github.com:$1 $(basename $1)' - + clgu = !sh -c 'git clone git@github.com:$(git config --get user.username)/$1 $1' - + + cp = cherry-pick + cpa = cherry-pick --abort + cpc = cherry-pick --continue + + d = diff + dp = diff --patience + dc = diff --cached + dk = diff --check + dck = diff --cached --check + dt = difftool + dct = difftool --cached + + f = fetch + fo = fetch origin + fu = fetch upstream + + fp = format-patch + + fk = fsck + + g = grep -p + + l = log --oneline --graph --decorate + lg = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(auto)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' + + ls = ls-files + lsf = !git ls-files | grep -i + + m = merge + mm = merge --no-ff -m "🔀 merge: Merge branch '$(git symbolic-ref --short HEAD)' into '$(git branch --show-current)'" + ma = merge --abort + mc = merge --continue + ms = merge --skip + + o = checkout + om = checkout master + ob = checkout -b + opr = !sh -c 'git fo pull/$1/head:pr-$1 && git o pr-$1' + + pr = prune -v + + ps = push + psf = push -f + psu = push -u + pst = push --tags + + pso = push origin + psao = push --all origin + psfo = push -f origin + psuo = push -u origin + + psom = push origin master + psaom = push --all origin master + psfom = push -f origin master + psuom = push -u origin master + psoc = !git push origin $(git bc) + psaoc = !git push --all origin $(git bc) + psfoc = !git push -f origin $(git bc) + psuoc = !git push -u origin $(git bc) + psdc = !git push origin :$(git bc) + + pl = pull + pb = pull --rebase + + plo = pull origin + pbo = pull --rebase origin + plom = pull origin master + ploc = !git pull origin $(git bc) + pbom = pull --rebase origin master + pboc = !git pull --rebase origin $(git bc) + + plu = pull upstream + plum = pull upstream master + pluc = !git pull upstream $(git bc) + pbum = pull --rebase upstream master + pbuc = !git pull --rebase upstream $(git bc) + + rb = rebase + rba = rebase --abort + rbc = rebase --continue + rbi = rebase --interactive + rbs = rebase --skip + + re = reset + rh = reset HEAD + reh = reset --hard + rem = reset --mixed + res = reset --soft + rehh = reset --hard HEAD + remh = reset --mixed HEAD + resh = reset --soft HEAD + rehom = reset --hard origin/master + + r = remote + ra = remote add + rr = remote rm + rv = remote -v + rn = remote rename + rp = remote prune + rs = remote show + rao = remote add origin + rau = remote add upstream + rro = remote remove origin + rru = remote remove upstream + rso = remote show origin + rsu = remote show upstream + rpo = remote prune origin + rpu = remote prune upstream + + rmf = rm -f + rmrf = rm -r -f + + s = status + sb = status -s -b + + sa = stash apply + sc = stash clear + sd = stash drop + sl = stash list + sp = stash pop + ss = stash save + ssk = stash save -k + sw = stash show + st = !git stash list | wc -l 2>/dev/null | grep -oEi '[0-9][0-9]*' + + t = tag + td = tag -d + + w = show + wp = show -p + wr = show -p --no-color + + svnr = svn rebase + svnd = svn dcommit + svnl = svn log --oneline --show-commit + + subadd = !sh -c 'git submodule add git://github.com/$1 $2/$(basename $1)' - + subrm = !sh -c 'git submodule deinit -f -- $1 && rm -rf .git/modules/$1 && git rm -f $1' - + subup = submodule update --init --recursive + subpull = submodule foreach 'git pull --tags -f origin master || git pull --tags -f origin main' + + assume = update-index --assume-unchanged + unassume = update-index --no-assume-unchanged + assumed = !git ls -v | grep ^h | cut -c 3- + unassumeall = !git assumed | xargs git unassume + assumeall = !git status -s | awk {'print $2'} | xargs git assume + + bump = !sh -c 'git commit -am \"Version bump v$1\" && git psuoc && git release $1' - + release = !sh -c 'git tag v$1 && git pst' - + unrelease = !sh -c 'git tag -d v$1 && git pso :v$1' - + merged = !sh -c 'git o master && git plom && git bd $1 && git rpo' - + aliases = !git config -l | grep alias | cut -c 7- + snap = !git stash save 'snapshot: $(date)' && git stash apply 'stash@{0}' + bare = !sh -c 'git symbolic-ref HEAD refs/heads/$1 && git rm --cached -r . && git clean -xfd' - + whois = !sh -c 'git log -i -1 --author=\"$1\" --pretty=\"format:%an <%ae>\"' - + serve = daemon --reuseaddr --verbose --base-path=. --export-all ./.git + + behind = !git rev-list --left-only --count $(git bu)...HEAD + ahead = !git rev-list --right-only --count $(git bu)...HEAD + + ours = "!f() { git checkout --ours $@ && git add $@; }; f" + theirs = "!f() { git checkout --theirs $@ && git add $@; }; f" + subrepo = !sh -c 'git filter-branch --prune-empty --subdirectory-filter $1 master' - + human = name-rev --name-only --refs=refs/heads/* + ig = "!f() { gitignore \"$@\"; }; f" +[user] + email = timoschneider04@gmail.com + name = Timo Schneider diff --git a/git/ignore b/git/ignore new file mode 100644 index 0000000..a979dde --- /dev/null +++ b/git/ignore @@ -0,0 +1,80 @@ +# OS files +.DS_Store +.AppleDouble +.LSOverride +Thumbs.db +ehthumbs.db +Desktop.ini + +# Editor Files +*.swp +*.swo +*.swn +*.swm +*.swl +*.swk +*.bak +*.backup +*.orig +*.ref +*~ +.vscode +.idea +.iml +*.sublime-workspace + +# Logs +*.log +*.sqlite +log.txt + +# Generated files +build/ +target/ +dist/ + +# Sensitive files +*.env +*.key +*.pem +*.credentials +*.password +*.secret + +# Scratch files +.scratch/ + +# PhpStorm HTTP Requests +.http/ + +# Temp files +tmp/ + +# Web files +node_modules/ +npm-debug.log* +yarn-error.log* +package-lock.json +vendor/ + +# Compressed files +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip +*.msi + +# Compiled Python files +__pycache__/ +*.pyc + +# Python +*.pyc + +# Rust +**/*.rs.bk +**/*.rl.bk diff --git a/git/themes/catppuccin.gitconfig b/git/themes/catppuccin.gitconfig new file mode 100644 index 0000000..d0fb32e --- /dev/null +++ b/git/themes/catppuccin.gitconfig @@ -0,0 +1,123 @@ +[delta "catppuccin-latte"] + blame-palette = "#eff1f5 #e6e9ef #dce0e8 #ccd0da #bcc0cc" + commit-decoration-style = box ul + light = true + file-decoration-style = "#4c4f69" + file-style = "#4c4f69" + hunk-header-decoration-style = box ul + hunk-header-file-style = bold + hunk-header-line-number-style = bold "#6c6f85" + hunk-header-style = file line-number syntax + line-numbers-left-style = "#9ca0b0" + line-numbers-minus-style = bold "#d20f39" + line-numbers-plus-style = bold "#40a02b" + line-numbers-right-style = "#9ca0b0" + line-numbers-zero-style = "#9ca0b0" + # 25% red 75% base + minus-emph-style = bold syntax "#e8b9c6" + # 10% red 90% base + minus-style = syntax "#ecdae2" + # 25% green 75% base + plus-emph-style = bold syntax "#c3ddc3" + # 10% green 90% base + plus-style = syntax "#dee8e0" + map-styles = \ + bold purple => syntax "#d5c3f4", \ + bold blue => syntax "#bbcff5", \ + bold cyan => syntax "#b4def1", \ + bold yellow => syntax "#ebd9bf" + # Should match the name of the bat theme + syntax-theme = Catppuccin Latte + +[delta "catppuccin-frappe"] + blame-palette = "#303446 #292c3c #232634 #414559 #51576d" + commit-decoration-style = box ul + dark = true + file-decoration-style = "#c6d0f5" + file-style = "#c6d0f5" + hunk-header-decoration-style = box ul + hunk-header-file-style = bold + hunk-header-line-number-style = bold "#a5adce" + hunk-header-style = file line-number syntax + line-numbers-left-style = "#737994" + line-numbers-minus-style = bold "#e78284" + line-numbers-plus-style = bold "#a6d189" + line-numbers-right-style = "#737994" + line-numbers-zero-style = "#737994" + # 25% red 75% base + minus-emph-style = bold syntax "#5e4855" + # 10% red 90% base + minus-style = syntax "#433c4c" + # 25% green 75% base + plus-emph-style = bold syntax "#4e5b56" + # 10% green 90% base + plus-style = syntax "#3c444d" + map-styles = \ + bold purple => syntax "#574f6e", \ + bold blue => syntax "#475270", \ + bold cyan => syntax "#4a5b6b", \ + bold yellow => syntax "#5d5958" + # Should match the name of the bat theme + syntax-theme = Catppuccin Frappe + +[delta "catppuccin-macchiato"] + blame-palette = "#24273a #1e2030 #181926 #363a4f #494d64" + commit-decoration-style = box ul + dark = true + file-decoration-style = "#cad3f5" + file-style = "#cad3f5" + hunk-header-decoration-style = box ul + hunk-header-file-style = bold + hunk-header-line-number-style = bold "#a5adcb" + hunk-header-style = file line-number syntax + line-numbers-left-style = "#6e738d" + line-numbers-minus-style = bold "#ed8796" + line-numbers-plus-style = bold "#a6da95" + line-numbers-right-style = "#6e738d" + line-numbers-zero-style = "#6e738d" + # 25% red 75% base + minus-emph-style = bold syntax "#563f51" + # 10% red 90% base + minus-style = syntax "#383143" + # 25% green 75% base + plus-emph-style = bold syntax "#455450" + # 10% green 90% base + plus-style = syntax "#313943" + map-styles = \ + bold purple => syntax "#4d4569", \ + bold blue => syntax "#3e4868", \ + bold cyan => syntax "#3f5364", \ + bold yellow => syntax "#575253" + # Should match the name of the bat theme + syntax-theme = Catppuccin Macchiato + +[delta "catppuccin-mocha"] + blame-palette = "#1e1e2e #181825 #11111b #313244 #45475a" + commit-decoration-style = box ul + dark = true + file-decoration-style = "#cdd6f4" + file-style = "#cdd6f4" + hunk-header-decoration-style = box ul + hunk-header-file-style = bold + hunk-header-line-number-style = bold "#a6adc8" + hunk-header-style = file line-number syntax + line-numbers-left-style = "#6c7086" + line-numbers-minus-style = bold "#f38ba8" + line-numbers-plus-style = bold "#a6e3a1" + line-numbers-right-style = "#6c7086" + line-numbers-zero-style = "#6c7086" + # 25% red 75% base + minus-emph-style = bold syntax "#53394c" + # 10% red 90% base + minus-style = syntax "#34293a" + # 25% green 75% base + plus-emph-style = bold syntax "#404f4a" + # 10% green 90% base + plus-style = syntax "#2c3239" + map-styles = \ + bold purple => syntax "#494060", \ + bold blue => syntax "#384361", \ + bold cyan => syntax "#384d5d", \ + bold yellow => syntax "#544f4e" + # Should match the name of the bat theme + syntax-theme = Catppuccin Mocha diff --git a/gtk-2.0/gtkrc b/gtk-2.0/gtkrc new file mode 100644 index 0000000..ca506b6 --- /dev/null +++ b/gtk-2.0/gtkrc @@ -0,0 +1,19 @@ +# DO NOT EDIT! This file will be overwritten by nwg-look. +# Any customization should be done in ~/.gtkrc-2.0.mine instead. + +include "~/.gtkrc-2.0.mine" +gtk-theme-name="Catppuccin-Macchiato-Standard-Lavender-Dark" +gtk-icon-theme-name="Catppuccin-SE" +gtk-font-name="JetBrainsMono Nerd Font 10" +gtk-cursor-theme-name="Catppuccin-Macchiato-Dark-Cursors" +gtk-cursor-theme-size=24 +gtk-toolbar-style=GTK_TOOLBAR_BOTH +gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR +gtk-button-images=1 +gtk-menu-images=1 +gtk-enable-event-sounds=1 +gtk-enable-input-feedback-sounds=1 +gtk-xft-antialias=1 +gtk-xft-hinting=1 +gtk-xft-hintstyle="hintfull" +gtk-xft-rgba="rgb" diff --git a/gtk-3.0/settings.ini b/gtk-3.0/settings.ini new file mode 100644 index 0000000..3153290 --- /dev/null +++ b/gtk-3.0/settings.ini @@ -0,0 +1,17 @@ +[Settings] +gtk-theme-name=catppuccin-macchiato-lavender-standard+default +gtk-icon-theme-name=Catppuccin-SE +gtk-font-name=JetBrainsMono Nerd Font 10 +gtk-cursor-theme-name=catppuccin-macchiato-dark-cursors +gtk-cursor-theme-size=24 +gtk-toolbar-style=GTK_TOOLBAR_BOTH +gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR +gtk-button-images=1 +gtk-menu-images=1 +gtk-enable-event-sounds=1 +gtk-enable-input-feedback-sounds=0 +gtk-xft-antialias=1 +gtk-xft-hinting=1 +gtk-xft-hintstyle=hintfull +gtk-xft-rgba=rgb +gtk-application-prefer-dark-theme=1 diff --git a/gtk-4.0/assets/scalable/checkbox-checked-symbolic.svg b/gtk-4.0/assets/scalable/checkbox-checked-symbolic.svg new file mode 100644 index 0000000..7b89e88 --- /dev/null +++ b/gtk-4.0/assets/scalable/checkbox-checked-symbolic.svg @@ -0,0 +1,43 @@ + + + + + + + + diff --git a/gtk-4.0/assets/scalable/checkbox-checked-symbolic@2.svg b/gtk-4.0/assets/scalable/checkbox-checked-symbolic@2.svg new file mode 100644 index 0000000..17e3c4a --- /dev/null +++ b/gtk-4.0/assets/scalable/checkbox-checked-symbolic@2.svg @@ -0,0 +1,44 @@ + + + + + + + + diff --git a/gtk-4.0/assets/scalable/checkbox-mixed-symbolic.svg b/gtk-4.0/assets/scalable/checkbox-mixed-symbolic.svg new file mode 100644 index 0000000..b4808a6 --- /dev/null +++ b/gtk-4.0/assets/scalable/checkbox-mixed-symbolic.svg @@ -0,0 +1,43 @@ + + + + + + + + diff --git a/gtk-4.0/assets/scalable/checkbox-mixed-symbolic@2.svg b/gtk-4.0/assets/scalable/checkbox-mixed-symbolic@2.svg new file mode 100644 index 0000000..3ea0541 --- /dev/null +++ b/gtk-4.0/assets/scalable/checkbox-mixed-symbolic@2.svg @@ -0,0 +1,44 @@ + + + + + + + + diff --git a/gtk-4.0/assets/scalable/close-symbolic.svg b/gtk-4.0/assets/scalable/close-symbolic.svg new file mode 100644 index 0000000..06201c3 --- /dev/null +++ b/gtk-4.0/assets/scalable/close-symbolic.svg @@ -0,0 +1,38 @@ + + + + + + diff --git a/gtk-4.0/assets/scalable/close-symbolic@2.svg b/gtk-4.0/assets/scalable/close-symbolic@2.svg new file mode 100644 index 0000000..a26e6ff --- /dev/null +++ b/gtk-4.0/assets/scalable/close-symbolic@2.svg @@ -0,0 +1,3 @@ + + + diff --git a/gtk-4.0/assets/scalable/cursor-handle-symbolic.svg b/gtk-4.0/assets/scalable/cursor-handle-symbolic.svg new file mode 100644 index 0000000..e2a252b --- /dev/null +++ b/gtk-4.0/assets/scalable/cursor-handle-symbolic.svg @@ -0,0 +1,3 @@ + + + diff --git a/gtk-4.0/assets/scalable/maximize-symbolic.svg b/gtk-4.0/assets/scalable/maximize-symbolic.svg new file mode 100644 index 0000000..39316eb --- /dev/null +++ b/gtk-4.0/assets/scalable/maximize-symbolic.svg @@ -0,0 +1,38 @@ + + + + + + diff --git a/gtk-4.0/assets/scalable/maximize-symbolic@2.svg b/gtk-4.0/assets/scalable/maximize-symbolic@2.svg new file mode 100644 index 0000000..8095f75 --- /dev/null +++ b/gtk-4.0/assets/scalable/maximize-symbolic@2.svg @@ -0,0 +1,3 @@ + + + diff --git a/gtk-4.0/assets/scalable/minimize-symbolic.svg b/gtk-4.0/assets/scalable/minimize-symbolic.svg new file mode 100644 index 0000000..f3683b9 --- /dev/null +++ b/gtk-4.0/assets/scalable/minimize-symbolic.svg @@ -0,0 +1,43 @@ + + + + + + diff --git a/gtk-4.0/assets/scalable/minimize-symbolic@2.svg b/gtk-4.0/assets/scalable/minimize-symbolic@2.svg new file mode 100644 index 0000000..741534b --- /dev/null +++ b/gtk-4.0/assets/scalable/minimize-symbolic@2.svg @@ -0,0 +1,3 @@ + + + diff --git a/gtk-4.0/assets/scalable/radio-checked-symbolic.svg b/gtk-4.0/assets/scalable/radio-checked-symbolic.svg new file mode 100644 index 0000000..67beb46 --- /dev/null +++ b/gtk-4.0/assets/scalable/radio-checked-symbolic.svg @@ -0,0 +1,42 @@ + + + + + + + + diff --git a/gtk-4.0/assets/scalable/radio-checked-symbolic@2.svg b/gtk-4.0/assets/scalable/radio-checked-symbolic@2.svg new file mode 100644 index 0000000..bf51d9e --- /dev/null +++ b/gtk-4.0/assets/scalable/radio-checked-symbolic@2.svg @@ -0,0 +1,43 @@ + + + + + + + + diff --git a/gtk-4.0/assets/scalable/radio-mixed-symbolic.svg b/gtk-4.0/assets/scalable/radio-mixed-symbolic.svg new file mode 100644 index 0000000..b4808a6 --- /dev/null +++ b/gtk-4.0/assets/scalable/radio-mixed-symbolic.svg @@ -0,0 +1,43 @@ + + + + + + + + diff --git a/gtk-4.0/assets/scalable/radio-mixed-symbolic@2.svg b/gtk-4.0/assets/scalable/radio-mixed-symbolic@2.svg new file mode 100644 index 0000000..3ea0541 --- /dev/null +++ b/gtk-4.0/assets/scalable/radio-mixed-symbolic@2.svg @@ -0,0 +1,44 @@ + + + + + + + + diff --git a/gtk-4.0/assets/scalable/scale-horz-marks-after-slider-symbolic.svg b/gtk-4.0/assets/scalable/scale-horz-marks-after-slider-symbolic.svg new file mode 100644 index 0000000..de0d789 --- /dev/null +++ b/gtk-4.0/assets/scalable/scale-horz-marks-after-slider-symbolic.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + diff --git a/gtk-4.0/assets/scalable/scale-horz-marks-before-slider-symbolic.svg b/gtk-4.0/assets/scalable/scale-horz-marks-before-slider-symbolic.svg new file mode 100644 index 0000000..7f0235f --- /dev/null +++ b/gtk-4.0/assets/scalable/scale-horz-marks-before-slider-symbolic.svg @@ -0,0 +1,47 @@ + + + + + + + + + + diff --git a/gtk-4.0/assets/scalable/scale-slider-symbolic.svg b/gtk-4.0/assets/scalable/scale-slider-symbolic.svg new file mode 100644 index 0000000..4b00bc1 --- /dev/null +++ b/gtk-4.0/assets/scalable/scale-slider-symbolic.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/gtk-4.0/assets/scalable/scale-vert-marks-after-slider-symbolic.svg b/gtk-4.0/assets/scalable/scale-vert-marks-after-slider-symbolic.svg new file mode 100644 index 0000000..37d9c04 --- /dev/null +++ b/gtk-4.0/assets/scalable/scale-vert-marks-after-slider-symbolic.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + diff --git a/gtk-4.0/assets/scalable/scale-vert-marks-before-slider-symbolic.svg b/gtk-4.0/assets/scalable/scale-vert-marks-before-slider-symbolic.svg new file mode 100644 index 0000000..1bc5cb6 --- /dev/null +++ b/gtk-4.0/assets/scalable/scale-vert-marks-before-slider-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + diff --git a/gtk-4.0/assets/scalable/small-checkbox-checked-symbolic.svg b/gtk-4.0/assets/scalable/small-checkbox-checked-symbolic.svg new file mode 100644 index 0000000..4759e32 --- /dev/null +++ b/gtk-4.0/assets/scalable/small-checkbox-checked-symbolic.svg @@ -0,0 +1,43 @@ + + + + + + + + diff --git a/gtk-4.0/assets/scalable/small-checkbox-checked-symbolic@2.svg b/gtk-4.0/assets/scalable/small-checkbox-checked-symbolic@2.svg new file mode 100644 index 0000000..a44f5c9 --- /dev/null +++ b/gtk-4.0/assets/scalable/small-checkbox-checked-symbolic@2.svg @@ -0,0 +1,44 @@ + + + + + + + + diff --git a/gtk-4.0/assets/scalable/small-checkbox-mixed-symbolic.svg b/gtk-4.0/assets/scalable/small-checkbox-mixed-symbolic.svg new file mode 100644 index 0000000..d621934 --- /dev/null +++ b/gtk-4.0/assets/scalable/small-checkbox-mixed-symbolic.svg @@ -0,0 +1,42 @@ + + + + + + + + diff --git a/gtk-4.0/assets/scalable/small-checkbox-mixed-symbolic@2.svg b/gtk-4.0/assets/scalable/small-checkbox-mixed-symbolic@2.svg new file mode 100644 index 0000000..91c7006 --- /dev/null +++ b/gtk-4.0/assets/scalable/small-checkbox-mixed-symbolic@2.svg @@ -0,0 +1,43 @@ + + + + + + + + diff --git a/gtk-4.0/assets/scalable/small-radio-checked-symbolic.svg b/gtk-4.0/assets/scalable/small-radio-checked-symbolic.svg new file mode 100644 index 0000000..f2c9cf9 --- /dev/null +++ b/gtk-4.0/assets/scalable/small-radio-checked-symbolic.svg @@ -0,0 +1,38 @@ + + + + + + diff --git a/gtk-4.0/assets/scalable/small-radio-checked-symbolic@2.svg b/gtk-4.0/assets/scalable/small-radio-checked-symbolic@2.svg new file mode 100644 index 0000000..a06db4c --- /dev/null +++ b/gtk-4.0/assets/scalable/small-radio-checked-symbolic@2.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/gtk-4.0/assets/scalable/small-radio-mixed-symbolic.svg b/gtk-4.0/assets/scalable/small-radio-mixed-symbolic.svg new file mode 100644 index 0000000..d621934 --- /dev/null +++ b/gtk-4.0/assets/scalable/small-radio-mixed-symbolic.svg @@ -0,0 +1,42 @@ + + + + + + + + diff --git a/gtk-4.0/assets/scalable/small-radio-mixed-symbolic@2.svg b/gtk-4.0/assets/scalable/small-radio-mixed-symbolic@2.svg new file mode 100644 index 0000000..91c7006 --- /dev/null +++ b/gtk-4.0/assets/scalable/small-radio-mixed-symbolic@2.svg @@ -0,0 +1,43 @@ + + + + + + + + diff --git a/gtk-4.0/assets/scalable/unmaximize-symbolic.svg b/gtk-4.0/assets/scalable/unmaximize-symbolic.svg new file mode 100644 index 0000000..492d47a --- /dev/null +++ b/gtk-4.0/assets/scalable/unmaximize-symbolic.svg @@ -0,0 +1,46 @@ + + + + + + + diff --git a/gtk-4.0/assets/scalable/unmaximize-symbolic@2.svg b/gtk-4.0/assets/scalable/unmaximize-symbolic@2.svg new file mode 100644 index 0000000..85f4f3a --- /dev/null +++ b/gtk-4.0/assets/scalable/unmaximize-symbolic@2.svg @@ -0,0 +1,4 @@ + + + + diff --git a/gtk-4.0/assets/scale-horz-marks-after-slider-dark.png b/gtk-4.0/assets/scale-horz-marks-after-slider-dark.png new file mode 100644 index 0000000..00d08bd Binary files /dev/null and b/gtk-4.0/assets/scale-horz-marks-after-slider-dark.png differ diff --git a/gtk-4.0/assets/scale-horz-marks-after-slider-dark@2.png b/gtk-4.0/assets/scale-horz-marks-after-slider-dark@2.png new file mode 100644 index 0000000..25abeb6 Binary files /dev/null and b/gtk-4.0/assets/scale-horz-marks-after-slider-dark@2.png differ diff --git a/gtk-4.0/assets/scale-horz-marks-after-slider-disabled-dark.png b/gtk-4.0/assets/scale-horz-marks-after-slider-disabled-dark.png new file mode 100644 index 0000000..bb5607f Binary files /dev/null and b/gtk-4.0/assets/scale-horz-marks-after-slider-disabled-dark.png differ diff --git a/gtk-4.0/assets/scale-horz-marks-after-slider-disabled-dark@2.png b/gtk-4.0/assets/scale-horz-marks-after-slider-disabled-dark@2.png new file mode 100644 index 0000000..d6065db Binary files /dev/null and b/gtk-4.0/assets/scale-horz-marks-after-slider-disabled-dark@2.png differ diff --git a/gtk-4.0/assets/scale-horz-marks-after-slider-disabled.png b/gtk-4.0/assets/scale-horz-marks-after-slider-disabled.png new file mode 100644 index 0000000..5861d66 Binary files /dev/null and b/gtk-4.0/assets/scale-horz-marks-after-slider-disabled.png differ diff --git a/gtk-4.0/assets/scale-horz-marks-after-slider-disabled@2.png b/gtk-4.0/assets/scale-horz-marks-after-slider-disabled@2.png new file mode 100644 index 0000000..52907bf Binary files /dev/null and b/gtk-4.0/assets/scale-horz-marks-after-slider-disabled@2.png differ diff --git a/gtk-4.0/assets/scale-horz-marks-after-slider.png b/gtk-4.0/assets/scale-horz-marks-after-slider.png new file mode 100644 index 0000000..29f1fca Binary files /dev/null and b/gtk-4.0/assets/scale-horz-marks-after-slider.png differ diff --git a/gtk-4.0/assets/scale-horz-marks-after-slider@2.png b/gtk-4.0/assets/scale-horz-marks-after-slider@2.png new file mode 100644 index 0000000..47b16ec Binary files /dev/null and b/gtk-4.0/assets/scale-horz-marks-after-slider@2.png differ diff --git a/gtk-4.0/assets/scale-horz-marks-before-slider-dark.png b/gtk-4.0/assets/scale-horz-marks-before-slider-dark.png new file mode 100644 index 0000000..22b3bc9 Binary files /dev/null and b/gtk-4.0/assets/scale-horz-marks-before-slider-dark.png differ diff --git a/gtk-4.0/assets/scale-horz-marks-before-slider-dark@2.png b/gtk-4.0/assets/scale-horz-marks-before-slider-dark@2.png new file mode 100644 index 0000000..818c7ed Binary files /dev/null and b/gtk-4.0/assets/scale-horz-marks-before-slider-dark@2.png differ diff --git a/gtk-4.0/assets/scale-horz-marks-before-slider-disabled-dark.png b/gtk-4.0/assets/scale-horz-marks-before-slider-disabled-dark.png new file mode 100644 index 0000000..e5f083e Binary files /dev/null and b/gtk-4.0/assets/scale-horz-marks-before-slider-disabled-dark.png differ diff --git a/gtk-4.0/assets/scale-horz-marks-before-slider-disabled-dark@2.png b/gtk-4.0/assets/scale-horz-marks-before-slider-disabled-dark@2.png new file mode 100644 index 0000000..2e8b6c7 Binary files /dev/null and b/gtk-4.0/assets/scale-horz-marks-before-slider-disabled-dark@2.png differ diff --git a/gtk-4.0/assets/scale-horz-marks-before-slider-disabled.png b/gtk-4.0/assets/scale-horz-marks-before-slider-disabled.png new file mode 100644 index 0000000..239ca9a Binary files /dev/null and b/gtk-4.0/assets/scale-horz-marks-before-slider-disabled.png differ diff --git a/gtk-4.0/assets/scale-horz-marks-before-slider-disabled@2.png b/gtk-4.0/assets/scale-horz-marks-before-slider-disabled@2.png new file mode 100644 index 0000000..adc1af7 Binary files /dev/null and b/gtk-4.0/assets/scale-horz-marks-before-slider-disabled@2.png differ diff --git a/gtk-4.0/assets/scale-horz-marks-before-slider.png b/gtk-4.0/assets/scale-horz-marks-before-slider.png new file mode 100644 index 0000000..3a4aa7f Binary files /dev/null and b/gtk-4.0/assets/scale-horz-marks-before-slider.png differ diff --git a/gtk-4.0/assets/scale-horz-marks-before-slider@2.png b/gtk-4.0/assets/scale-horz-marks-before-slider@2.png new file mode 100644 index 0000000..9dd390f Binary files /dev/null and b/gtk-4.0/assets/scale-horz-marks-before-slider@2.png differ diff --git a/gtk-4.0/assets/scale-vert-marks-after-slider-dark.png b/gtk-4.0/assets/scale-vert-marks-after-slider-dark.png new file mode 100644 index 0000000..3231d1b Binary files /dev/null and b/gtk-4.0/assets/scale-vert-marks-after-slider-dark.png differ diff --git a/gtk-4.0/assets/scale-vert-marks-after-slider-dark@2.png b/gtk-4.0/assets/scale-vert-marks-after-slider-dark@2.png new file mode 100644 index 0000000..78cff7e Binary files /dev/null and b/gtk-4.0/assets/scale-vert-marks-after-slider-dark@2.png differ diff --git a/gtk-4.0/assets/scale-vert-marks-after-slider-disabled-dark.png b/gtk-4.0/assets/scale-vert-marks-after-slider-disabled-dark.png new file mode 100644 index 0000000..1bd736e Binary files /dev/null and b/gtk-4.0/assets/scale-vert-marks-after-slider-disabled-dark.png differ diff --git a/gtk-4.0/assets/scale-vert-marks-after-slider-disabled-dark@2.png b/gtk-4.0/assets/scale-vert-marks-after-slider-disabled-dark@2.png new file mode 100644 index 0000000..25f37ab Binary files /dev/null and b/gtk-4.0/assets/scale-vert-marks-after-slider-disabled-dark@2.png differ diff --git a/gtk-4.0/assets/scale-vert-marks-after-slider-disabled.png b/gtk-4.0/assets/scale-vert-marks-after-slider-disabled.png new file mode 100644 index 0000000..8e9a3e2 Binary files /dev/null and b/gtk-4.0/assets/scale-vert-marks-after-slider-disabled.png differ diff --git a/gtk-4.0/assets/scale-vert-marks-after-slider-disabled@2.png b/gtk-4.0/assets/scale-vert-marks-after-slider-disabled@2.png new file mode 100644 index 0000000..47f06af Binary files /dev/null and b/gtk-4.0/assets/scale-vert-marks-after-slider-disabled@2.png differ diff --git a/gtk-4.0/assets/scale-vert-marks-after-slider.png b/gtk-4.0/assets/scale-vert-marks-after-slider.png new file mode 100644 index 0000000..fedff3d Binary files /dev/null and b/gtk-4.0/assets/scale-vert-marks-after-slider.png differ diff --git a/gtk-4.0/assets/scale-vert-marks-after-slider@2.png b/gtk-4.0/assets/scale-vert-marks-after-slider@2.png new file mode 100644 index 0000000..6215f7c Binary files /dev/null and b/gtk-4.0/assets/scale-vert-marks-after-slider@2.png differ diff --git a/gtk-4.0/assets/scale-vert-marks-before-slider-dark.png b/gtk-4.0/assets/scale-vert-marks-before-slider-dark.png new file mode 100644 index 0000000..5679039 Binary files /dev/null and b/gtk-4.0/assets/scale-vert-marks-before-slider-dark.png differ diff --git a/gtk-4.0/assets/scale-vert-marks-before-slider-dark@2.png b/gtk-4.0/assets/scale-vert-marks-before-slider-dark@2.png new file mode 100644 index 0000000..03926a9 Binary files /dev/null and b/gtk-4.0/assets/scale-vert-marks-before-slider-dark@2.png differ diff --git a/gtk-4.0/assets/scale-vert-marks-before-slider-disabled-dark.png b/gtk-4.0/assets/scale-vert-marks-before-slider-disabled-dark.png new file mode 100644 index 0000000..61283d7 Binary files /dev/null and b/gtk-4.0/assets/scale-vert-marks-before-slider-disabled-dark.png differ diff --git a/gtk-4.0/assets/scale-vert-marks-before-slider-disabled-dark@2.png b/gtk-4.0/assets/scale-vert-marks-before-slider-disabled-dark@2.png new file mode 100644 index 0000000..690689c Binary files /dev/null and b/gtk-4.0/assets/scale-vert-marks-before-slider-disabled-dark@2.png differ diff --git a/gtk-4.0/assets/scale-vert-marks-before-slider-disabled.png b/gtk-4.0/assets/scale-vert-marks-before-slider-disabled.png new file mode 100644 index 0000000..040f9f6 Binary files /dev/null and b/gtk-4.0/assets/scale-vert-marks-before-slider-disabled.png differ diff --git a/gtk-4.0/assets/scale-vert-marks-before-slider-disabled@2.png b/gtk-4.0/assets/scale-vert-marks-before-slider-disabled@2.png new file mode 100644 index 0000000..593ef55 Binary files /dev/null and b/gtk-4.0/assets/scale-vert-marks-before-slider-disabled@2.png differ diff --git a/gtk-4.0/assets/scale-vert-marks-before-slider.png b/gtk-4.0/assets/scale-vert-marks-before-slider.png new file mode 100644 index 0000000..57825fd Binary files /dev/null and b/gtk-4.0/assets/scale-vert-marks-before-slider.png differ diff --git a/gtk-4.0/assets/scale-vert-marks-before-slider@2.png b/gtk-4.0/assets/scale-vert-marks-before-slider@2.png new file mode 100644 index 0000000..b828dae Binary files /dev/null and b/gtk-4.0/assets/scale-vert-marks-before-slider@2.png differ diff --git a/gtk-4.0/assets/selectionmode-checkbox-checked-dark.png b/gtk-4.0/assets/selectionmode-checkbox-checked-dark.png new file mode 100644 index 0000000..8dbedf6 Binary files /dev/null and b/gtk-4.0/assets/selectionmode-checkbox-checked-dark.png differ diff --git a/gtk-4.0/assets/selectionmode-checkbox-checked-dark@2.png b/gtk-4.0/assets/selectionmode-checkbox-checked-dark@2.png new file mode 100644 index 0000000..d4b23d5 Binary files /dev/null and b/gtk-4.0/assets/selectionmode-checkbox-checked-dark@2.png differ diff --git a/gtk-4.0/assets/selectionmode-checkbox-checked.png b/gtk-4.0/assets/selectionmode-checkbox-checked.png new file mode 100644 index 0000000..a223d1f Binary files /dev/null and b/gtk-4.0/assets/selectionmode-checkbox-checked.png differ diff --git a/gtk-4.0/assets/selectionmode-checkbox-checked@2.png b/gtk-4.0/assets/selectionmode-checkbox-checked@2.png new file mode 100644 index 0000000..a7723f1 Binary files /dev/null and b/gtk-4.0/assets/selectionmode-checkbox-checked@2.png differ diff --git a/gtk-4.0/assets/selectionmode-checkbox-unchecked-dark.png b/gtk-4.0/assets/selectionmode-checkbox-unchecked-dark.png new file mode 100644 index 0000000..f6b914e Binary files /dev/null and b/gtk-4.0/assets/selectionmode-checkbox-unchecked-dark.png differ diff --git a/gtk-4.0/assets/selectionmode-checkbox-unchecked-dark@2.png b/gtk-4.0/assets/selectionmode-checkbox-unchecked-dark@2.png new file mode 100644 index 0000000..29ecf2b Binary files /dev/null and b/gtk-4.0/assets/selectionmode-checkbox-unchecked-dark@2.png differ diff --git a/gtk-4.0/assets/selectionmode-checkbox-unchecked.png b/gtk-4.0/assets/selectionmode-checkbox-unchecked.png new file mode 100644 index 0000000..40ff92e Binary files /dev/null and b/gtk-4.0/assets/selectionmode-checkbox-unchecked.png differ diff --git a/gtk-4.0/assets/selectionmode-checkbox-unchecked@2.png b/gtk-4.0/assets/selectionmode-checkbox-unchecked@2.png new file mode 100644 index 0000000..8e87ea7 Binary files /dev/null and b/gtk-4.0/assets/selectionmode-checkbox-unchecked@2.png differ diff --git a/gtk-4.0/gtk-dark.css b/gtk-4.0/gtk-dark.css new file mode 100644 index 0000000..97feec5 --- /dev/null +++ b/gtk-4.0/gtk-dark.css @@ -0,0 +1,8461 @@ +@keyframes ripple { + to { + background-size: 1000% 1000%; + } +} + +@keyframes ripple-on-slider { + to { + background-size: auto, 1000% 1000%; + } +} + +@keyframes ripple-on-headerbar { + from { + background-image: radial-gradient(circle, #b7bdf8 0%, transparent 0%); + } + to { + background-image: radial-gradient(circle, #b7bdf8 100%, transparent 100%); + } +} + +/*************** + * Base States * + ***************/ +.background { + background-color: #24273a; + color: #FFFFFF; +} + +#desktopwindow.background { + background-color: transparent; +} + +dnd { + color: #FFFFFF; +} + +.normal-icons { + -gtk-icon-size: 16px; +} + +.large-icons { + -gtk-icon-size: 32px; +} + +.aboutdialog .large-icons { + -gtk-icon-size: 128px; +} + +spinner:disabled, +arrow:disabled, +scrollbar:disabled, +check:disabled, +radio:disabled, +treeview.expander:disabled { + -gtk-icon-filter: opacity(0.5); +} + +iconview, .view { + background-color: #24273a; + color: #FFFFFF; +} + +iconview:disabled, .view:disabled { + color: rgba(255, 255, 255, 0.5); +} + +iconview:selected, .view:selected { + color: #FFFFFF; +} + +textview text { + background-color: #24273a; +} + +textview border { + background-color: #181926; + color: rgba(255, 255, 255, 0.7); +} + +iconview:hover, iconview:selected { + border-radius: 3px; +} + +rubberband, .content-view rubberband, .content-view columnview.view > rubberband, +.content-view treeview.view > rubberband, .content-view .rubberband, columnview.view > rubberband, .content-view columnview.view > .rubberband, +treeview.view > rubberband, +.content-view treeview.view > .rubberband, gridview > rubberband, flowbox > rubberband { + border: 1px solid #b7bdf8; + background-color: rgba(183, 189, 248, 0.3); +} + +flowbox > flowboxchild { + padding: 4px; + border-radius: 6px; +} + +.content-view .tile:selected { + background-color: transparent; +} + +gridview > child { + padding: 3px; +} + +gridview > child:selected { + outline-color: alpha(currentColor, 0.06); +} + +gridview > child box { + border-spacing: 8px; + margin: 12px; +} + +coverflow cover { + color: #FFFFFF; + background-color: #24273a; + border: 1px solid black; +} + +label.separator { + color: rgba(255, 255, 255, 0.7); +} + +label:disabled { + opacity: 1; + color: rgba(255, 255, 255, 0.5); +} + +headerbar label:disabled, tab label:disabled, button label:disabled { + color: inherit; + opacity: 1; +} + +label.osd { + border-radius: 6px; + background-color: rgba(18, 19, 29, 0.9); + color: #FFFFFF; +} + +.dim-label, row.expander image.expander-row-arrow, row label.subtitle { + color: rgba(255, 255, 255, 0.7); + opacity: 1; +} + +.accent { + color: #b7bdf8; +} + +.success { + color: #66BB6A; +} + +.warning { + color: #FBC02D; +} + +.error { + color: #F44336; +} + +.large-title { + font-weight: 300; + font-size: 24pt; +} + +.title-1 { + font-weight: 800; + font-size: 20pt; +} + +.title-2 { + font-weight: 800; + font-size: 15pt; +} + +.title-3 { + font-weight: 700; + font-size: 15pt; +} + +.title-4 { + font-weight: 700; + font-size: 13pt; +} + +.heading { + font-weight: 700; + font-size: 11pt; +} + +.body { + font-weight: 400; + font-size: 11pt; +} + +.caption { + font-weight: 400; + font-size: 9pt; +} + +.caption-heading { + font-weight: 700; + font-size: 9pt; +} + +window.assistant .sidebar { + padding: 4px 0; +} + +window.assistant .sidebar label { + min-height: 36px; + padding: 0 12px; + color: rgba(255, 255, 255, 0.5); + font-weight: 500; +} + +window.assistant .sidebar label.highlight { + color: #FFFFFF; +} + +.osd .scale-popup > arrow, +.osd .scale-popup > contents, .osd popover > arrow, +.osd popover > contents, popover.touch-selection > arrow, +popover.touch-selection > contents, popover.magnifier > arrow, +popover.magnifier > contents, .osd { + color: #FFFFFF; + background-color: #24273a; + background-clip: padding-box; + border-radius: 6px; + border: none; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15), 0 3px 3px 0 rgba(0, 0, 0, 0.18), 0 3px 6px 0 rgba(0, 0, 0, 0.12), inset 0 1px rgba(255, 255, 255, 0.1); +} + +.osd { + padding: 6px; + margin: 6px; +} + +.osd.circular { + border-radius: 9999px; +} + +/********************* + * Spinner Animation * + *********************/ +@keyframes spin { + to { + transform: rotate(1turn); + } +} + +spinner { + background: none; + opacity: 0; + -gtk-icon-source: -gtk-icontheme("process-working-symbolic"); +} + +spinner:checked { + opacity: 1; + animation: spin 1s linear infinite; +} + +spinner:checked:disabled { + opacity: 0.5; +} + +/**************** + * Text Entries * + ****************/ + +entry headerbar popover.background entry, +headerbar popover.background entry entry, +entry { + min-height: 36px; + padding: 0 8px; + border-spacing: 6px; + border-radius: 6px; + caret-color: currentColor; + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(255, 255, 255, 0.08); + color: rgba(255, 255, 255, 0.7); + outline: 0 solid transparent; + outline-offset: 2px; +} + + +entry headerbar popover.background entry:focus-within, +headerbar popover.background entry entry:focus-within, +entry:focus-within { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + background-color: rgba(255, 255, 255, 0.08); + box-shadow: inset 0 0 0 2px transparent; + color: #FFFFFF; + outline: 2px solid #b7bdf8; + outline-offset: -2px; +} + + +entry headerbar popover.background entry:drop(active), +headerbar popover.background entry entry:drop(active), +entry headerbar popover.background entry:hover:not(:focus-within), +headerbar popover.background entry entry:hover:not(:focus-within), +entry:drop(active), +entry:hover:not(:focus-within) { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + background-color: alpha(currentColor, 0.08); + box-shadow: inset 0 0 0 2px alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; + outline-offset: 2px; +} + + +entry headerbar popover.background entry:disabled, +headerbar popover.background entry entry:disabled, +entry:disabled { + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(255, 255, 255, 0.08); + color: rgba(255, 255, 255, 0.5); + outline: none; +} + + +entry headerbar popover.background entry > text > placeholder, +headerbar popover.background entry entry > text > placeholder, +entry > text > placeholder { + color: rgba(255, 255, 255, 0.5); +} + + +entry headerbar popover.background entry > text > block-cursor, +headerbar popover.background entry entry > text > block-cursor, +entry > text > block-cursor { + color: rgba(255, 255, 255, 0.04); + background-color: #FFFFFF; +} + + +entry headerbar popover.background entry.flat:focus-within, +headerbar popover.background entry entry.flat:focus-within, +entry headerbar popover.background entry.flat:disabled, +headerbar popover.background entry entry.flat:disabled, +entry headerbar popover.background entry.flat:hover, +headerbar popover.background entry entry.flat:hover, +entry headerbar popover.background entry.flat, +headerbar popover.background entry entry.flat, +entry.flat:focus-within, +entry.flat:disabled, +entry.flat:hover, +entry.flat { + min-height: 0; + padding: 2px; + background-color: transparent; + box-shadow: none; + border-radius: 0; + outline: none; +} + + +entry headerbar popover.background entry > image, +headerbar popover.background entry entry > image, +entry > image { + color: rgba(255, 255, 255, 0.7); +} + + +entry headerbar popover.background entry > image:hover, +headerbar popover.background entry entry > image:hover, +entry headerbar popover.background entry > image:active, +headerbar popover.background entry entry > image:active, +entry > image:hover, +entry > image:active { + color: #FFFFFF; +} + + +entry headerbar popover.background entry > image:disabled, +headerbar popover.background entry entry > image:disabled, +entry > image:disabled { + color: rgba(255, 255, 255, 0.5); +} + + +entry headerbar popover.background entry > image.left, +headerbar popover.background entry entry > image.left, +entry > image.left { + margin: 0 6px 0 2px; +} + + +entry headerbar popover.background entry > image.right, +headerbar popover.background entry entry > image.right, +entry > image.right { + margin: 0 2px 0 6px; +} + + +entry headerbar popover.background entry.password image.caps-lock-indicator, +headerbar popover.background entry entry.password image.caps-lock-indicator, +entry.password image.caps-lock-indicator { + opacity: 0.35; +} + + +entry headerbar popover.background entry.error, +headerbar popover.background entry entry.error, +entry.error { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(244, 67, 54, 0.1); + color: rgba(244, 67, 54, 0.75); + outline: 0 solid transparent; + outline-offset: 2px; + outline: none; +} + + +entry headerbar popover.background entry.error:focus-within, +headerbar popover.background entry entry.error:focus-within, +entry.error:focus-within { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + background-color: rgba(244, 67, 54, 0.1); + box-shadow: inset 0 0 0 2px transparent; + color: #F44336; + outline: 2px solid #F44336; + outline-offset: -2px; + outline: none; +} + + +entry headerbar popover.background entry.error:drop(active), +headerbar popover.background entry entry.error:drop(active), +entry headerbar popover.background entry.error:hover:not(:focus-within), +headerbar popover.background entry entry.error:hover:not(:focus-within), +entry.error:drop(active), +entry.error:hover:not(:focus-within) { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + background-color: alpha(currentColor, 0.08); + box-shadow: inset 0 0 0 2px alpha(currentColor, 0.08); + color: #F44336; + outline: 0 solid transparent; + outline-offset: 2px; + outline: none; +} + + +entry headerbar popover.background entry.error:disabled, +headerbar popover.background entry entry.error:disabled, +entry.error:disabled { + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(244, 67, 54, 0.1); + color: rgba(244, 67, 54, 0.35); + outline: none; + outline: none; +} + + +entry headerbar popover.background entry.error > text > selection, +headerbar popover.background entry entry.error > text > selection, +entry.error > text > selection { + background-color: rgba(244, 67, 54, 0.25); + color: #F44336; +} + + +entry headerbar popover.background entry.error > text > cursor-handle > contents, +headerbar popover.background entry entry.error > text > cursor-handle > contents, +entry.error > text > cursor-handle > contents { + background-color: currentColor; +} + + +entry headerbar popover.background entry.error > image, +headerbar popover.background entry entry.error > image, +entry.error > image { + color: rgba(244, 67, 54, 0.75); +} + + +entry headerbar popover.background entry.error > image:hover, +headerbar popover.background entry entry.error > image:hover, +entry headerbar popover.background entry.error > image:active, +headerbar popover.background entry entry.error > image:active, +entry.error > image:hover, +entry.error > image:active { + color: #F44336; +} + + +entry headerbar popover.background entry.error > image:disabled, +headerbar popover.background entry entry.error > image:disabled, +entry.error > image:disabled { + color: rgba(244, 67, 54, 0.35); +} + + +entry headerbar popover.background entry.warning, +headerbar popover.background entry entry.warning, +entry.warning { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(251, 192, 45, 0.1); + color: rgba(251, 192, 45, 0.75); + outline: 0 solid transparent; + outline-offset: 2px; + outline: none; +} + + +entry headerbar popover.background entry.warning:focus-within, +headerbar popover.background entry entry.warning:focus-within, +entry.warning:focus-within { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + background-color: rgba(251, 192, 45, 0.1); + box-shadow: inset 0 0 0 2px transparent; + color: #FBC02D; + outline: 2px solid #FBC02D; + outline-offset: -2px; + outline: none; +} + + +entry headerbar popover.background entry.warning:drop(active), +headerbar popover.background entry entry.warning:drop(active), +entry headerbar popover.background entry.warning:hover:not(:focus-within), +headerbar popover.background entry entry.warning:hover:not(:focus-within), +entry.warning:drop(active), +entry.warning:hover:not(:focus-within) { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + background-color: alpha(currentColor, 0.08); + box-shadow: inset 0 0 0 2px alpha(currentColor, 0.08); + color: #FBC02D; + outline: 0 solid transparent; + outline-offset: 2px; + outline: none; +} + + +entry headerbar popover.background entry.warning:disabled, +headerbar popover.background entry entry.warning:disabled, +entry.warning:disabled { + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(251, 192, 45, 0.1); + color: rgba(251, 192, 45, 0.35); + outline: none; + outline: none; +} + + +entry headerbar popover.background entry.warning > text > selection, +headerbar popover.background entry entry.warning > text > selection, +entry.warning > text > selection { + background-color: rgba(251, 192, 45, 0.25); + color: #FBC02D; +} + + +entry headerbar popover.background entry.warning > text > cursor-handle > contents, +headerbar popover.background entry entry.warning > text > cursor-handle > contents, +entry.warning > text > cursor-handle > contents { + background-color: currentColor; +} + + +entry headerbar popover.background entry.warning > image, +headerbar popover.background entry entry.warning > image, +entry.warning > image { + color: rgba(251, 192, 45, 0.75); +} + + +entry headerbar popover.background entry.warning > image:hover, +headerbar popover.background entry entry.warning > image:hover, +entry headerbar popover.background entry.warning > image:active, +headerbar popover.background entry entry.warning > image:active, +entry.warning > image:hover, +entry.warning > image:active { + color: #FBC02D; +} + + +entry headerbar popover.background entry.warning > image:disabled, +headerbar popover.background entry entry.warning > image:disabled, +entry.warning > image:disabled { + color: rgba(251, 192, 45, 0.35); +} + + +entry headerbar popover.background entry.success, +headerbar popover.background entry entry.success, +entry.success { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(102, 187, 106, 0.1); + color: rgba(102, 187, 106, 0.75); + outline: 0 solid transparent; + outline-offset: 2px; + outline: none; +} + + +entry headerbar popover.background entry.success:focus-within, +headerbar popover.background entry entry.success:focus-within, +entry.success:focus-within { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + background-color: rgba(102, 187, 106, 0.1); + box-shadow: inset 0 0 0 2px transparent; + color: #66BB6A; + outline: 2px solid #66BB6A; + outline-offset: -2px; + outline: none; +} + + +entry headerbar popover.background entry.success:drop(active), +headerbar popover.background entry entry.success:drop(active), +entry headerbar popover.background entry.success:hover:not(:focus-within), +headerbar popover.background entry entry.success:hover:not(:focus-within), +entry.success:drop(active), +entry.success:hover:not(:focus-within) { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + background-color: alpha(currentColor, 0.08); + box-shadow: inset 0 0 0 2px alpha(currentColor, 0.08); + color: #66BB6A; + outline: 0 solid transparent; + outline-offset: 2px; + outline: none; +} + + +entry headerbar popover.background entry.success:disabled, +headerbar popover.background entry entry.success:disabled, +entry.success:disabled { + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(102, 187, 106, 0.1); + color: rgba(102, 187, 106, 0.35); + outline: none; + outline: none; +} + + +entry headerbar popover.background entry.success > text > selection, +headerbar popover.background entry entry.success > text > selection, +entry.success > text > selection { + background-color: rgba(102, 187, 106, 0.25); + color: #66BB6A; +} + + +entry headerbar popover.background entry.success > text > cursor-handle > contents, +headerbar popover.background entry entry.success > text > cursor-handle > contents, +entry.success > text > cursor-handle > contents { + background-color: currentColor; +} + + +entry headerbar popover.background entry.success > image, +headerbar popover.background entry entry.success > image, +entry.success > image { + color: rgba(102, 187, 106, 0.75); +} + + +entry headerbar popover.background entry.success > image:hover, +headerbar popover.background entry entry.success > image:hover, +entry headerbar popover.background entry.success > image:active, +headerbar popover.background entry entry.success > image:active, +entry.success > image:hover, +entry.success > image:active { + color: #66BB6A; +} + + +entry headerbar popover.background entry.success > image:disabled, +headerbar popover.background entry entry.success > image:disabled, +entry.success > image:disabled { + color: rgba(102, 187, 106, 0.35); +} + + +entry > progress, +entry progress > trough > progress { + margin: 0 -4px; + border-bottom: 2px solid #b7bdf8; + background-color: transparent; +} + +.osd entry > progress > trough > progress { + border-color: rgba(255, 255, 255, 0.04); +} + + +entry button.image-button { + min-height: 24px; + min-width: 24px; + padding: 0; +} + +treeview entry.flat, treeview entry { + background-color: #24273a; +} + +treeview entry.flat, treeview entry.flat:focus-within, treeview entry, treeview entry:focus-within { + border-image: none; + box-shadow: none; +} + +.entry-tag { + margin: 2px; + border-radius: 9999px; + box-shadow: none; + background-color: rgba(255, 255, 255, 0.12); + color: #FFFFFF; +} + +.entry-tag:hover { + background-image: image(alpha(currentColor, 0.08)); +} + +:dir(ltr) .entry-tag { + margin-left: 4px; + margin-right: 0; + padding-left: 12px; + padding-right: 8px; +} + +:dir(rtl) .entry-tag { + margin-left: 0; + margin-right: 4px; + padding-left: 8px; + padding-right: 12px; +} + +.entry-tag.button { + box-shadow: none; + background-color: transparent; +} + +.entry-tag.button:not(:hover):not(:active) { + color: rgba(255, 255, 255, 0.7); +} + +editablelabel > stack > text { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(255, 255, 255, 0.08); + color: rgba(255, 255, 255, 0.7); + outline: 0 solid transparent; + outline-offset: 2px; +} + +/*********** + * Buttons * + ***********/ +@keyframes needs-attention { + from { + background-image: radial-gradient(farthest-side, #b7bdf8 0%, rgba(183, 189, 248, 0) 0%); + } + to { + background-image: radial-gradient(farthest-side, #b7bdf8 95%, rgba(183, 189, 248, 0)); + } +} + +infobar.warning > revealer > box button, infobar.warning:backdrop > revealer > box button, popover.touch-selection button, popover.magnifier button, headerbar.selection-mode button:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.7); +} + +infobar.warning > revealer > box button:focus, popover.touch-selection button:focus, popover.magnifier button:focus, headerbar.selection-mode button:focus:not(.suggested-action):not(.destructive-action), infobar.warning > revealer > box button:hover, popover.touch-selection button:hover, popover.magnifier button:hover, headerbar.selection-mode button:hover:not(.suggested-action):not(.destructive-action), infobar.warning > revealer > box button:active, popover.touch-selection button:active, popover.magnifier button:active, headerbar.selection-mode button:active:not(.suggested-action):not(.destructive-action), infobar.warning > revealer > box button:checked, popover.touch-selection button:checked, popover.magnifier button:checked, headerbar.selection-mode button:checked:not(.suggested-action):not(.destructive-action) { + color: #FFFFFF; +} + +infobar.warning > revealer > box button:disabled, popover.touch-selection button:disabled, popover.magnifier button:disabled, headerbar.selection-mode button:disabled:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.32); +} + +infobar.warning > revealer > box button:checked:disabled, popover.touch-selection button:checked:disabled, popover.magnifier button:checked:disabled, headerbar.selection-mode button:checked:disabled:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.5); +} + +row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr):last-child, row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child, +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child, headerbar popover.background button:not(.suggested-action):not(.destructive-action):not(.flat), button { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), background-size 300ms cubic-bezier(0, 0, 0.2, 1), background-image 1200ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1); + background-color: rgba(255, 255, 255, 0.08); + background-image: radial-gradient(circle, transparent 10%, transparent 0%); + background-repeat: no-repeat; + background-position: center; + background-size: 1000% 1000%; + outline: 0 solid transparent; + outline-offset: 2px; + color: #FFFFFF; +} + +row.spin spinbutton > button.image-button.up:focus:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, row.spin spinbutton > button.image-button.up:focus:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr), row.spin spinbutton > button.image-button.up:focus:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child, +row.spin spinbutton > button.image-button.down:focus:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.image-button.down:focus:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.image-button.down:focus:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child, headerbar popover.background button:focus:not(.suggested-action):not(.destructive-action):not(.flat), button:focus { + outline: 2px solid rgba(183, 189, 248, 0.35); + outline-offset: 0; +} + +row.spin spinbutton > button.image-button.up:hover:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, row.spin spinbutton > button.image-button.up:hover:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr), row.spin spinbutton > button.image-button.up:hover:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child, +row.spin spinbutton > button.image-button.down:hover:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.image-button.down:hover:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.image-button.down:hover:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child, headerbar popover.background button:hover:not(.suggested-action):not(.destructive-action):not(.flat), button:hover { + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; + -gtk-icon-filter: brightness(1.2); +} + +row.spin spinbutton > button.keyboard-activating.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, row.spin spinbutton > button.keyboard-activating.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr), row.spin spinbutton > button.keyboard-activating.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child, +row.spin spinbutton > button.keyboard-activating.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.keyboard-activating.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.keyboard-activating.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child, headerbar popover.background button.keyboard-activating:not(.suggested-action):not(.destructive-action):not(.flat), button.keyboard-activating, row.spin spinbutton > button.image-button.up:active:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, row.spin spinbutton > button.image-button.up:active:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr), row.spin spinbutton > button.image-button.up:active:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child, +row.spin spinbutton > button.image-button.down:active:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.image-button.down:active:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.image-button.down:active:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child, headerbar popover.background button:active:not(.suggested-action):not(.destructive-action):not(.flat), button:active { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms, border 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.08) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; +} + +row.spin spinbutton > button.image-button.up:disabled:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, row.spin spinbutton > button.image-button.up:disabled:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr), row.spin spinbutton > button.image-button.up:disabled:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child, +row.spin spinbutton > button.image-button.down:disabled:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.image-button.down:disabled:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.image-button.down:disabled:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child, headerbar popover.background button:disabled:not(.suggested-action):not(.destructive-action):not(.flat), button:disabled { + background-color: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.5); + outline-color: transparent; +} + +row.spin spinbutton > button.image-button.up:checked:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, row.spin spinbutton > button.image-button.up:checked:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr), row.spin spinbutton > button.image-button.up:checked:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child, +row.spin spinbutton > button.image-button.down:checked:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.image-button.down:checked:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.image-button.down:checked:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child, headerbar popover.background button:checked:not(.suggested-action):not(.destructive-action):not(.flat), button:checked { + background-color: #b7bdf8; + color: rgba(0, 0, 0, 0.87); +} + +row.spin spinbutton > button.image-button.up:checked:hover:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, +row.spin spinbutton > button.image-button.down:checked:hover:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.image-button.down:checked:hover:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.image-button.down:checked:hover:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child, headerbar popover.background button:checked:hover:not(.suggested-action):not(.destructive-action):not(.flat), button:checked:hover { + outline-color: transparent; + background-color: #ced2fa; + color: rgba(0, 0, 0, 0.87); +} + +row.spin spinbutton > button.image-button.up:checked:disabled:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, +row.spin spinbutton > button.image-button.down:checked:disabled:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.image-button.down:checked:disabled:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.image-button.down:checked:disabled:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child, headerbar popover.background button:checked:disabled:not(.suggested-action):not(.destructive-action):not(.flat), button:checked:disabled { + outline-color: transparent; + background-color: rgba(183, 189, 248, 0.35); + color: rgba(0, 0, 0, 0.38); +} + +placessidebar row button.sidebar-button, calendar > header > button, scrollbar button, notebook > header > tabs > arrow, popover modelbutton, spinbutton > button, splitbutton.flat > button, +splitbutton.flat > menubutton > button { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 300ms cubic-bezier(0, 0, 0.2, 1), background-image 1200ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1); + background-image: radial-gradient(circle, transparent 10%, transparent 0%); + background-repeat: no-repeat; + background-position: center; + background-size: 1000% 1000%; + background-color: transparent; + outline: 0 solid transparent; + outline-offset: 2px; + color: rgba(255, 255, 255, 0.7); +} + +placessidebar row button.sidebar-button:focus:not(:hover):not(:active), calendar > header > button:focus:not(:hover):not(:active), scrollbar button:focus:not(:hover):not(:active), notebook > header > tabs > arrow:focus:not(:hover):not(:active), popover modelbutton:focus:not(:hover):not(:active), spinbutton > button:focus:not(:hover):not(:active), splitbutton.flat > button:focus:not(:hover):not(:active), +splitbutton.flat > menubutton > button:focus:not(:hover):not(:active) { + color: #FFFFFF; + outline: 2px solid rgba(255, 255, 255, 0.04); + outline-offset: -2px; +} + +placessidebar row button.sidebar-button:hover, calendar > header > button:hover, scrollbar button:hover, notebook > header > tabs > arrow:hover, popover modelbutton:hover, spinbutton > button:hover, splitbutton.flat > button:hover, +splitbutton.flat > menubutton > button:hover { + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; +} + +placessidebar row button.sidebar-button:active, calendar > header > button:active, scrollbar button:active, notebook > header > tabs > arrow:active, popover modelbutton:active, spinbutton > button:active, splitbutton.flat > button:active, +splitbutton.flat > menubutton > button:active { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.08) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; +} + +placessidebar row button.sidebar-button:disabled, calendar > header > button:disabled, scrollbar button:disabled, notebook > header > tabs > arrow:disabled, popover modelbutton:disabled, spinbutton > button:disabled, splitbutton.flat > button:disabled, +splitbutton.flat > menubutton > button:disabled { + color: rgba(255, 255, 255, 0.32); + background-color: transparent; +} + +filechooser #pathbarbox > stack > box > button, window.messagedialog .response-area button, window.dialog.message .dialog-action-area > button, .app-notification button, headerbar button:not(.suggested-action):not(.destructive-action), .toolbar button, dropdown > .linked:not(.vertical) > button:not(:only-child), +combobox > .linked:not(.vertical) > button:not(:only-child), splitbutton.suggested-action > button, splitbutton.suggested-action > menubutton > button, splitbutton.destructive-action > button, splitbutton.destructive-action > menubutton > button, splitbutton.opaque > button, splitbutton.opaque > menubutton > button, menubutton.suggested-action > button, menubutton.destructive-action > button, menubutton.opaque > button, menubutton.flat > button, button.flat { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 300ms cubic-bezier(0, 0, 0.2, 1), background-image 1200ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1); + background-image: radial-gradient(circle, transparent 10%, transparent 0%); + background-repeat: no-repeat; + background-position: center; + background-size: 1000% 1000%; + background-color: transparent; + outline: 0 solid transparent; + outline-offset: 2px; + color: rgba(255, 255, 255, 0.7); +} + +filechooser #pathbarbox > stack > box > button:focus:not(:hover):not(:active), window.messagedialog .response-area button:focus:not(:hover):not(:active), window.dialog.message .dialog-action-area > button:focus:not(:hover):not(:active), .app-notification button:focus:not(:hover):not(:active), headerbar button:focus:not(:hover):not(:active):not(.suggested-action):not(.destructive-action), .toolbar button:focus:not(:hover):not(:active), dropdown > .linked:not(.vertical) > button:focus:not(:hover):not(:active):not(:only-child), +combobox > .linked:not(.vertical) > button:focus:not(:hover):not(:active):not(:only-child), splitbutton.suggested-action > button:focus:not(:hover):not(:active), splitbutton.suggested-action > menubutton > button:focus:not(:hover):not(:active), splitbutton.destructive-action > button:focus:not(:hover):not(:active), splitbutton.destructive-action > menubutton > button:focus:not(:hover):not(:active), splitbutton.opaque > button:focus:not(:hover):not(:active), splitbutton.opaque > menubutton > button:focus:not(:hover):not(:active), menubutton.suggested-action > button:focus:not(:hover):not(:active), menubutton.destructive-action > button:focus:not(:hover):not(:active), menubutton.opaque > button:focus:not(:hover):not(:active), menubutton.flat > button:focus:not(:hover):not(:active), button.flat:focus:not(:hover):not(:active) { + color: #FFFFFF; + outline: 2px solid rgba(255, 255, 255, 0.04); + outline-offset: -2px; +} + +filechooser #pathbarbox > stack > box > button:hover, window.messagedialog .response-area button:hover, window.dialog.message .dialog-action-area > button:hover, .app-notification button:hover, headerbar button:hover:not(.suggested-action):not(.destructive-action), .toolbar button:hover, dropdown > .linked:not(.vertical) > button:hover:not(:only-child), +combobox > .linked:not(.vertical) > button:hover:not(:only-child), splitbutton.suggested-action > button:hover, splitbutton.suggested-action > menubutton > button:hover, splitbutton.destructive-action > button:hover, splitbutton.destructive-action > menubutton > button:hover, splitbutton.opaque > button:hover, splitbutton.opaque > menubutton > button:hover, menubutton.suggested-action > button:hover, menubutton.destructive-action > button:hover, menubutton.opaque > button:hover, menubutton.flat > button:hover, button.flat:hover { + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; +} + +filechooser #pathbarbox > stack > box > button:active, window.messagedialog .response-area button:active, window.dialog.message .dialog-action-area > button:active, .app-notification button:active, headerbar button:active:not(.suggested-action):not(.destructive-action), .toolbar button:active, dropdown > .linked:not(.vertical) > button:active:not(:only-child), +combobox > .linked:not(.vertical) > button:active:not(:only-child), splitbutton.suggested-action > button:active, splitbutton.suggested-action > menubutton > button:active, splitbutton.destructive-action > button:active, splitbutton.destructive-action > menubutton > button:active, splitbutton.opaque > button:active, splitbutton.opaque > menubutton > button:active, menubutton.suggested-action > button:active, menubutton.destructive-action > button:active, menubutton.opaque > button:active, menubutton.flat > button:active, button.flat:active { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.08) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; +} + +filechooser #pathbarbox > stack > box > button:disabled, window.messagedialog .response-area button:disabled, window.dialog.message .dialog-action-area > button:disabled, .app-notification button:disabled, headerbar button:disabled:not(.suggested-action):not(.destructive-action), .toolbar button:disabled, dropdown > .linked:not(.vertical) > button:disabled:not(:only-child), +combobox > .linked:not(.vertical) > button:disabled:not(:only-child), splitbutton.suggested-action > button:disabled, splitbutton.suggested-action > menubutton > button:disabled, splitbutton.destructive-action > button:disabled, splitbutton.destructive-action > menubutton > button:disabled, splitbutton.opaque > button:disabled, splitbutton.opaque > menubutton > button:disabled, menubutton.suggested-action > button:disabled, menubutton.destructive-action > button:disabled, menubutton.opaque > button:disabled, menubutton.flat > button:disabled, button.flat:disabled { + color: rgba(255, 255, 255, 0.32); + background-color: transparent; +} + +filechooser #pathbarbox > stack > box > button:checked, window.messagedialog .response-area button:checked, window.dialog.message .dialog-action-area > button:checked, .app-notification button:checked, headerbar button:checked:not(.suggested-action):not(.destructive-action), .toolbar button:checked, dropdown > .linked:not(.vertical) > button:checked:not(:only-child), +combobox > .linked:not(.vertical) > button:checked:not(:only-child), splitbutton.suggested-action > button:checked, splitbutton.suggested-action > menubutton > button:checked, splitbutton.destructive-action > button:checked, splitbutton.destructive-action > menubutton > button:checked, splitbutton.opaque > button:checked, splitbutton.opaque > menubutton > button:checked, menubutton.suggested-action > button:checked, menubutton.destructive-action > button:checked, menubutton.opaque > button:checked, menubutton.flat > button:checked, button.flat:checked { + background-color: alpha(currentColor, 0.1); + color: #FFFFFF; +} + +filechooser #pathbarbox > stack > box > button:checked:disabled, window.messagedialog .response-area button:checked:disabled, window.dialog.message .dialog-action-area > button:checked:disabled, .app-notification button:checked:disabled, headerbar button:checked:disabled:not(.suggested-action):not(.destructive-action), .toolbar button:checked:disabled, dropdown > .linked:not(.vertical) > button:checked:disabled:not(:only-child), +combobox > .linked:not(.vertical) > button:checked:disabled:not(:only-child), splitbutton.suggested-action > button:checked:disabled, splitbutton.suggested-action > menubutton > button:checked:disabled, splitbutton.destructive-action > button:checked:disabled, splitbutton.destructive-action > menubutton > button:checked:disabled, splitbutton.opaque > button:checked:disabled, splitbutton.opaque > menubutton > button:checked:disabled, menubutton.suggested-action > button:checked:disabled, menubutton.destructive-action > button:checked:disabled, menubutton.opaque > button:checked:disabled, menubutton.flat > button:checked:disabled, button.flat:checked:disabled { + background-color: alpha(currentColor, 0.1); + color: rgba(255, 255, 255, 0.5); +} + +button.opaque { + box-shadow: none; +} + +.osd button.opaque:focus:focus-visible { + outline-color: rgba(255, 255, 255, 0.15); +} + +button.opaque:hover { + background-image: image(alpha(currentColor, 0.1)); +} + +button.keyboard-activating.opaque, button.opaque:active { + background-image: image(rgba(0, 0, 0, 0.2)); +} + +button.opaque:checked { + background-image: image(rgba(0, 0, 0, 0.15)); +} + +button.opaque:checked:hover { + background-image: image(rgba(0, 0, 0, 0.05)); +} + +button.opaque:checked.keyboard-activating, button.opaque:checked:active { + background-image: image(rgba(0, 0, 0, 0.3)); +} + +.nautilus-window .floating-bar button, placessidebar row button.sidebar-button, notebook > header > tabs > tab button.flat, popover.menu box.circular-buttons button.circular.image-button.model, spinbutton > button { + min-height: 24px; + min-width: 24px; + padding: 0; + border-radius: 9999px; +} + +button { + min-height: 24px; + min-width: 16px; + padding: 6px 10px; + border-radius: 6px; + font-weight: 500; +} + +button:drop(active) { + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; +} + +button separator { + margin: 4px 1px; +} + +button.opaque { + background-color: #505261; + color: #FFFFFF; +} + +button.text-button { + min-width: 32px; + padding-left: 16px; + padding-right: 16px; +} + +button.image-button { + min-width: 24px; + padding: 6px; +} + +button.text-button.image-button, button.image-text-button { + min-width: 24px; + padding: 6px; + border-radius: 6px; +} + +button.text-button.image-button > box, +button.text-button.image-button > box > box, button.image-text-button > box, +button.image-text-button > box > box { + border-spacing: 4px; +} + +button.text-button.image-button > box > label, +button.text-button.image-button > box > box > label, button.image-text-button > box > label, +button.image-text-button > box > box > label { + padding-left: 2px; + padding-right: 2px; +} + +button.text-button.image-button label:first-child, button.image-text-button label:first-child { + margin-left: 10px; +} + +button.text-button.image-button label:last-child, button.image-text-button label:last-child { + margin-right: 10px; +} + +button.text-button.image-button.flat label:first-child, button.image-text-button.flat label:first-child { + margin-left: 6px; +} + +button.text-button.image-button.flat label:last-child, button.image-text-button.flat label:last-child { + margin-right: 6px; +} + +button.text-button.image-button image:not(:only-child), button.image-text-button image:not(:only-child) { + margin: 0 4px; +} + +button.arrow-button { + padding-left: 9px; + padding-right: 9px; +} + +button.arrow-button > box { + border-spacing: 4px; +} + +button.arrow-button.text-button { + padding-left: 16px; + padding-right: 16px; +} + +button.arrow-button.text-button > box { + border-spacing: 6px; +} + +menubutton.pill > button, button.pill { + padding: 9px 30px; + border-radius: 9999px; +} + +button.card { + background-color: rgba(255, 255, 255, 0.04); + background-clip: padding-box; + font-weight: inherit; + border: 1px solid rgba(255, 255, 255, 0.12); + background-clip: border-box; +} + +button.card:hover { + background-image: none; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; +} + +button.card.keyboard-activating, button.card:active { + background-image: none; + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms, border 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.08) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; +} + +button.card:checked { + background-image: none; + background-color: #b7bdf8; + color: rgba(0, 0, 0, 0.87); + border-color: #b7bdf8; +} + +button.card:checked:hover { + background-image: none; + outline-color: transparent; + background-color: #ced2fa; + color: rgba(0, 0, 0, 0.87); +} + +button.card:checked:disabled { + outline-color: transparent; + background-color: rgba(183, 189, 248, 0.35); + color: rgba(0, 0, 0, 0.38); +} + +button.card:checked.keyboard-activating, button.card:checked:active { + background-image: none; +} + +button.card:checked.has-open-popup { + background-image: none; +} + +button.card:drop(active) { + color: #FF7043; + box-shadow: inset 0 0 0 1px #FF7043; +} + +.linked:not(.vertical) > button:focus, .linked.vertical > button:focus { + box-shadow: none; + outline: none; +} + +.linked:not(.vertical) > button.flat:not(:only-child), .linked.vertical > button.flat:not(:only-child) { + background-color: alpha(currentColor, 0.05); +} + +.linked:not(.vertical) > button.flat:focus, .linked.vertical > button.flat:focus { + box-shadow: none; + outline: none; +} + +.linked:not(.vertical) > menubutton > button { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +button.osd { + min-height: 24px; + min-width: 24px; + padding: 6px; + box-shadow: none; + background-color: rgba(0, 0, 0, 0.35); + color: white; + margin: 0; +} + +button.osd > image { + padding: 0; +} + +button.osd.remove-button { + padding: 0; +} + +button.osd:focus { + outline-color: transparent; +} + +button.osd:hover { + background-color: rgba(0, 0, 0, 0.45); + color: white; +} + +button.osd:active { + background-color: rgba(0, 0, 0, 0.65); + color: white; +} + +button.osd:disabled { + background-color: rgba(0, 0, 0, 0.15); + color: rgba(255, 255, 255, 0.35); +} + +button.suggested-action { + background-color: #b7bdf8; + color: rgba(0, 0, 0, 0.87); + box-shadow: none; +} + +button.suggested-action:disabled { + background-color: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.5); + outline-color: transparent; +} + +button.suggested-action:hover { + box-shadow: inset 0 0 0 9999px transparent, 0 2px 2.4px -1px rgba(183, 189, 248, 0.2), 0 4px 3px 0 rgba(183, 189, 248, 0.14), 0 1px 6px 0 rgba(183, 189, 248, 0.12); +} + +button.suggested-action:checked { + background-color: rgba(138, 142, 186, 0.961); +} + +button.suggested-action:checked:hover { + box-shadow: inset 0 0 0 9999px transparent, 0 3px 3px -3px rgba(183, 189, 248, 0.3), 0 2px 3px -1px rgba(183, 189, 248, 0.24), 0 2px 5px 0 rgba(183, 189, 248, 0.12); +} + +button.suggested-action:focus { + box-shadow: 0 0 0 2px rgba(183, 189, 248, 0.35); +} + +button.suggested-action.flat { + background-color: transparent; + color: #b7bdf8; +} + +button.suggested-action.flat:disabled { + color: rgba(255, 255, 255, 0.32); + background-color: transparent; +} + +button.suggested-action.flat:checked { + background-color: rgba(183, 189, 248, 0.3); +} + +button.destructive-action { + background-color: #F44336; + color: #FFFFFF; + box-shadow: none; +} + +button.destructive-action:disabled { + background-color: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.5); + outline-color: transparent; +} + +button.destructive-action:hover { + box-shadow: inset 0 0 0 9999px transparent, 0 2px 2.4px -1px rgba(244, 67, 54, 0.2), 0 4px 3px 0 rgba(244, 67, 54, 0.14), 0 1px 6px 0 rgba(244, 67, 54, 0.12); +} + +button.destructive-action:checked { + background-color: #f77b72; +} + +button.destructive-action:checked:hover { + box-shadow: inset 0 0 0 9999px transparent, 0 3px 3px -3px rgba(244, 67, 54, 0.3), 0 2px 3px -1px rgba(244, 67, 54, 0.24), 0 2px 5px 0 rgba(244, 67, 54, 0.12); +} + +button.destructive-action:focus { + box-shadow: 0 0 0 2px rgba(244, 67, 54, 0.35); +} + +button.destructive-action.flat { + background-color: transparent; + color: #F44336; +} + +button.destructive-action.flat:disabled { + color: rgba(255, 255, 255, 0.32); + background-color: transparent; +} + +button.destructive-action.flat:checked { + background-color: rgba(244, 67, 54, 0.3); +} + +stackswitcher > button > label { + margin: 0 -6px; + padding: 0 6px; +} + +stackswitcher > button > image { + margin: -3px -6px; + padding: 3px 6px; +} + +stackswitcher > button.needs-attention:checked > label, +stackswitcher > button.needs-attention:checked > image { + animation: none; + background-image: none; +} + +button.font > box, button.file > box { + border-spacing: 6px; +} + +button.font > box > box > label, button.file > box > box > label { + font-weight: bold; +} + +windowcontrols > button:not(.suggested-action):not(.destructive-action), filechooser #pathbarbox > stack > box > button, row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr):last-child, row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child, +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child, headerbar button.star, menubutton.circular > button, button.close, button.circular { + border-radius: 9999px; +} + +windowcontrols > button:not(.suggested-action):not(.destructive-action) label, filechooser #pathbarbox > stack > box > button label, row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child label, row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr):last-child label, row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child label, +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque) label, +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child label, +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child label, headerbar button.star label, menubutton.circular > button label, button.close label, button.circular label { + padding: 0; +} + +menubutton.osd { + background: none; + color: inherit; +} + +menubutton.suggested-action { + background-color: #b7bdf8; + color: white; +} + +menubutton.destructive-action { + background-color: #F44336; + color: white; +} + +menubutton.opaque { + background-color: #505261; + color: #FFFFFF; +} + +menubutton.suggested-action, menubutton.destructive-action, menubutton.opaque { + border-radius: 6px; +} + +menubutton.suggested-action.circular, menubutton.suggested-action.pill, menubutton.destructive-action.circular, menubutton.destructive-action.pill, menubutton.opaque.circular, menubutton.opaque.pill { + border-radius: 9999px; +} + +menubutton.suggested-action > button, menubutton.suggested-action > button:checked, menubutton.destructive-action > button, menubutton.destructive-action > button:checked, menubutton.opaque > button, menubutton.opaque > button:checked { + background-color: transparent; + color: inherit; +} + +menubutton.image-button > button { + min-width: 24px; + padding-left: 6px; + padding-right: 6px; +} + +menubutton arrow { + min-height: 16px; + min-width: 16px; +} + +menubutton arrow.none { + -gtk-icon-source: -gtk-icontheme("open-menu-symbolic"); +} + +menubutton arrow.down { + -gtk-icon-source: -gtk-icontheme("pan-down-symbolic"); +} + +menubutton arrow.up { + -gtk-icon-source: -gtk-icontheme("pan-up-symbolic"); +} + +menubutton arrow.left { + -gtk-icon-source: -gtk-icontheme("pan-start-symbolic"); +} + +menubutton arrow.right { + -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); +} + +splitbutton { + border-radius: 6px; +} + +splitbutton, splitbutton > separator { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); + transition-property: background; +} + +splitbutton > separator { + margin-top: 6px; + margin-bottom: 6px; + background: none; +} + +splitbutton > menubutton > button { + padding: 6px 10px; +} + +splitbutton.image-button > button { + min-width: 24px; + padding-left: 6px; + padding-right: 6px; +} + +splitbutton.text-button.image-button > button, splitbutton.image-text-button > button { + padding-left: 9px; + padding-right: 9px; +} + +splitbutton.text-button.image-button > button > box, splitbutton.image-text-button > button > box { + border-spacing: 6px; +} + +splitbutton > button:dir(ltr), +splitbutton > menubutton > button:dir(rtl) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + margin-right: -1px; +} + +splitbutton > button:dir(rtl), +splitbutton > menubutton > button:dir(ltr) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin-left: -1px; +} + +splitbutton.flat > separator { + background: rgba(255, 255, 255, 0.12); +} + +splitbutton.flat:hover, splitbutton.flat:active, splitbutton.flat:checked { + background: alpha(currentColor, 0.07); +} + +splitbutton.flat:hover > separator, splitbutton.flat:active > separator, splitbutton.flat:checked > separator { + background: none; +} + +splitbutton.flat:focus-within:focus-visible > separator { + background: none; +} + +splitbutton.flat > button, +splitbutton.flat > menubutton > button { + border-radius: 6px; +} + +splitbutton.suggested-action { + background-color: #b7bdf8; + color: white; +} + +splitbutton.destructive-action { + background-color: #F44336; + color: white; +} + +splitbutton.opaque { + background-color: #505261; + color: #FFFFFF; +} + +splitbutton.suggested-action > button, splitbutton.suggested-action > button:checked, splitbutton.suggested-action > menubutton > button, splitbutton.suggested-action > menubutton > button:checked, splitbutton.destructive-action > button, splitbutton.destructive-action > button:checked, splitbutton.destructive-action > menubutton > button, splitbutton.destructive-action > menubutton > button:checked, splitbutton.opaque > button, splitbutton.opaque > button:checked, splitbutton.opaque > menubutton > button, splitbutton.opaque > menubutton > button:checked { + color: inherit; + background-color: transparent; +} + +splitbutton.suggested-action > menubutton > button:dir(ltr), splitbutton.destructive-action > menubutton > button:dir(ltr), splitbutton.opaque > menubutton > button:dir(ltr) { + box-shadow: inset 1px 0 rgba(255, 255, 255, 0.12); +} + +splitbutton.suggested-action > menubutton > button:dir(rtl), splitbutton.destructive-action > menubutton > button:dir(rtl), splitbutton.opaque > menubutton > button:dir(rtl) { + box-shadow: inset -1px 0 rgba(255, 255, 255, 0.12); +} + +splitbutton > menubutton > button > arrow.none { + -gtk-icon-source: -gtk-icontheme("pan-down-symbolic"); +} + +buttoncontent { + border-spacing: 6px; +} + +buttoncontent > label { + font-weight: bold; +} + +buttoncontent > label:dir(ltr) { + padding-right: 2px; +} + +buttoncontent > label:dir(rtl) { + padding-left: 2px; +} + +.arrow-button > box > buttoncontent > label:dir(ltr), splitbutton > button > buttoncontent > label:dir(ltr) { + padding-right: 0; +} + +.arrow-button > box > buttoncontent > label:dir(rtl), splitbutton > button > buttoncontent > label:dir(rtl) { + padding-left: 0; +} + +stacksidebar row.needs-attention > label, stackswitcher > button.needs-attention > label, +stackswitcher > button.needs-attention > image { + animation: needs-attention 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-repeat: no-repeat; + background-position: right 3px; + background-size: 6px 6px; +} + +stacksidebar row.needs-attention > label:dir(rtl), stackswitcher > button.needs-attention > label:dir(rtl), +stackswitcher > button.needs-attention > image:dir(rtl) { + background-position: left 3px; +} + +.linked:not(.vertical) > entry, .linked:not(.vertical) > button, .linked:not(.vertical) > button.image-button { + border-radius: 0; +} + +.linked:not(.vertical) > entry:first-child, .linked:not(.vertical) > button:first-child { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} + +.linked:not(.vertical) > entry:last-child, .linked:not(.vertical) > button:last-child { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} + +.linked:not(.vertical) > entry:only-child, .linked:not(.vertical) > button:only-child { + border-radius: 6px; +} + +.linked.vertical > entry, .linked.vertical > button, .linked.vertical > button.image-button { + border-radius: 0; +} + +.linked.vertical > entry:first-child, .linked.vertical > button:first-child { + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +.linked.vertical > entry:last-child, .linked.vertical > button:last-child { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} + +.linked.vertical > entry:only-child, .linked.vertical > button:only-child { + border-radius: 6px; +} + +button.color { + min-height: 24px; + min-width: 24px; + padding: 6px; +} + + +list > row button.image-button:not(.flat) { + background-color: transparent; + box-shadow: none; + border: none; +} + + +list > row button.image-button:not(.flat):hover { + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; +} + + +list > row button.image-button:not(.flat):active, +list > row button.image-button:not(.flat):checked { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms, border 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.08) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; +} + + +list > row button.image-button:not(.flat).suggested-action { + background-color: #b7bdf8; + color: rgba(0, 0, 0, 0.87); +} + + +list > row button.image-button:not(.flat).destructive-action { + background-color: #F44336; + color: #FFFFFF; +} + +/********* + * Links * + *********/ +link { + color: #5bd3f8; +} + +link:visited { + color: #BA68C8; +} + +button.link:link, button.link:link:focus, button.link:link:hover, button.link:link:active { + color: #5bd3f8; +} + +button.link:visited, button.link:visited:focus, button.link:visited:hover, button.link:visited:active { + color: #BA68C8; +} + +button.link > label { + text-decoration-line: underline; +} + +/***************** + * GtkSpinButton * + *****************/ +spinbutton { + border-radius: 6px; + padding: 0; + border-spacing: 0; + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(255, 255, 255, 0.08); + color: rgba(255, 255, 255, 0.7); + outline: 0 solid transparent; + outline-offset: 2px; +} + +spinbutton:focus-within { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + background-color: rgba(255, 255, 255, 0.08); + box-shadow: inset 0 0 0 2px transparent; + color: #FFFFFF; + outline: 2px solid #b7bdf8; + outline-offset: -2px; +} + +spinbutton:disabled { + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(255, 255, 255, 0.08); + color: rgba(255, 255, 255, 0.5); + outline: none; +} + +spinbutton > text { + border-image: none; + border-radius: 0; + box-shadow: none; + background-color: transparent; + margin: 0; +} + +spinbutton > button { + border: none; +} + +spinbutton > button:focus:not(:hover):not(:active):not(:disabled) { + box-shadow: none; +} + +spinbutton:not(.vertical) > text { + min-width: 32px; + padding-left: 12px; +} + +spinbutton:not(.vertical) > button { + padding: 0; + margin: 6px; +} + +spinbutton:not(.vertical) > button.up:dir(ltr), spinbutton:not(.vertical) > button.down:dir(rtl) { + margin-left: 3px; +} + +spinbutton:not(.vertical) > button.up:dir(rtl), spinbutton:not(.vertical) > button.down:dir(ltr) { + margin-right: 3px; +} + +cell.activatable spinbutton:not(.vertical) { + margin: 3px 0; +} + +cell.activatable spinbutton:not(.vertical) > button { + margin: 0; + padding: 0; + min-height: 24px; + border-radius: 0; +} + +cell.activatable spinbutton:not(.vertical) > button:last-child { + border-radius: 0 6px 6px 0; +} + +cell.activatable spinbutton:not(.vertical) > button.up:dir(ltr), cell.activatable spinbutton:not(.vertical) > button.down:dir(rtl) { + margin-left: 0; +} + +cell.activatable spinbutton:not(.vertical) > button.up:dir(rtl), cell.activatable spinbutton:not(.vertical) > button.down:dir(ltr) { + margin-right: 0; +} + +spinbutton.vertical > text { + min-height: 36px; + min-width: 42px; + padding: 0; +} + +spinbutton.vertical > button { + padding: 0; + margin: 6px 9px; +} + +/************** + * ComboBoxes * + **************/ +dropdown > button > box { + border-spacing: 6px; +} + +dropdown arrow, +combobox arrow { + -gtk-icon-source: -gtk-icontheme("pan-down-symbolic"); + min-height: 16px; + min-width: 16px; +} + +dropdown > popover.menu > contents modelbutton, +combobox > popover.menu > contents modelbutton { + padding-left: 9px; + padding-right: 9px; +} + +dropdown button.combo cellview:dir(ltr), +combobox button.combo cellview:dir(ltr) { + margin-left: -2px; +} + +dropdown button.combo cellview:dir(rtl), +combobox button.combo cellview:dir(rtl) { + margin-right: -2px; +} + +dropdown popover, +combobox popover { + margin-top: 4px; + padding: 0; +} + +dropdown popover listview, +combobox popover listview { + margin: 0; +} + +dropdown popover listview > row, +combobox popover listview > row { + padding: 6px; +} + +dropdown popover listview > row:selected, +combobox popover listview > row:selected { + color: #FFFFFF; + background-color: alpha(currentColor, 0.06); +} + +dropdown popover .dropdown-searchbar, +combobox popover .dropdown-searchbar { + padding: 6px; +} + +dropdown.linked button:nth-child(2):dir(ltr), +combobox.linked button:nth-child(2):dir(ltr) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +dropdown.linked button:nth-child(2):dir(rtl), +combobox.linked button:nth-child(2):dir(rtl) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +dropdown > .linked:not(.vertical) > entry:not(:only-child), +combobox > .linked:not(.vertical) > entry:not(:only-child) { + border-radius: 6px; +} + +dropdown > .linked:not(.vertical) > entry:not(:only-child):first-child, +combobox > .linked:not(.vertical) > entry:not(:only-child):first-child { + margin-right: -36px; + padding-right: 36px; +} + +dropdown > .linked:not(.vertical) > entry:not(:only-child):last-child, +combobox > .linked:not(.vertical) > entry:not(:only-child):last-child { + margin-left: -36px; + padding-left: 36px; +} + +dropdown > .linked:not(.vertical) > button:not(:only-child), +combobox > .linked:not(.vertical) > button:not(:only-child) { + min-height: 16px; + min-width: 16px; + margin: 6px; + padding: 4px; + border-radius: 6px; +} + +.linked:not(.vertical) > combobox:not(:first-child) > box > button.combo { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.linked:not(.vertical) > combobox:not(:last-child) > box > button.combo { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.linked.vertical > combobox:not(:first-child) > box > button.combo { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.linked.vertical > combobox:not(:last-child) > box > button.combo { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +button.combo:only-child { + border-radius: 6px; + font-weight: normal; + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(255, 255, 255, 0.08); + color: rgba(255, 255, 255, 0.7); + outline: 0 solid transparent; + outline-offset: 2px; +} + +button.combo:only-child:focus { + color: #FFFFFF; + outline: 2px solid rgba(255, 255, 255, 0.04); + outline-offset: -2px; +} + +button.combo:only-child:hover { + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; +} + +button.combo:only-child:active { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.08) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; +} + +button.combo:only-child:checked { + background-color: alpha(currentColor, 0.1); + color: #FFFFFF; +} + +button.combo:only-child:disabled { + background-color: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.5); + outline-color: transparent; +} + +/************ + * Toolbars * + ************/ +.toolbar { + padding: 6px; + background-color: #24273a; + border-spacing: 6px; +} + +.osd .toolbar { + background-color: transparent; +} + +.app-notification, .toolbar.osd { + transition: box-shadow 200ms ease-out; + padding: 6px; + border-radius: 12px; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15), 0 3px 3px 0 rgba(0, 0, 0, 0.18), 0 3px 6px 0 rgba(0, 0, 0, 0.12), inset 0 1px rgba(255, 255, 255, 0.1); + background-color: #363a4f; + color: #FFFFFF; +} + +.app-notification:backdrop, .toolbar.osd:backdrop { + box-shadow: 0 4px 3px -3px rgba(0, 0, 0, 0.2), 0 2px 2px -1px rgba(0, 0, 0, 0.24), 0 1px 3px 0 rgba(0, 0, 0, 0.12), inset 0 1px rgba(255, 255, 255, 0.1); +} + +.left.app-notification, .right.app-notification, .top.app-notification, .bottom.app-notification, .toolbar.osd.left, .toolbar.osd.right, .toolbar.osd.top, .toolbar.osd.bottom { + border-radius: 0; +} + +.bottom.app-notification, .toolbar.osd.bottom { + box-shadow: none; + background-color: transparent; + background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1) 30%, rgba(0, 0, 0, 0.2) 50%, rgba(0, 0, 0, 0.4)); +} + +.toolbar.horizontal > separator { + margin: 2px; +} + +.toolbar.vertical > separator { + margin: 2px; +} + +.toolbar entry, +.toolbar spinbutton, +.toolbar splitbutton, +.toolbar separator:not(.sidebar), +.toolbar button, +.toolbar menubutton, +.toolbar scalebutton { + margin-top: 0; + margin-bottom: 0; +} + +.toolbar menubutton > button, +.toolbar splitbutton > button, +.toolbar splitbutton > menubutton, +.toolbar scalebutton > button { + margin-top: 0; + margin-bottom: 0; +} + +.toolbar switch { + margin-top: 4px; + margin-bottom: 4px; +} + +.toolbar spinbutton entry, +.toolbar spinbutton button { + margin: 0; +} + +.toolbar popover.menu separator:not(.sidebar) { + margin-top: 6px; + margin-bottom: 6px; +} + +searchbar > revealer > box { + padding: 6px; + border-spacing: 0; + border-style: solid; + border-width: 0 0 1px; + border-color: rgba(255, 255, 255, 0.12); + background-color: #24273a; + background-clip: border-box; + box-shadow: none; +} + +searchbar > revealer > box entry, searchbar > revealer > box button, searchbar > revealer > box menubutton { + margin: 0; +} + +/*************** + * Header bars * + ***************/ +headerbar button:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.7); + border: none; +} + +headerbar button:hover:not(.suggested-action):not(.destructive-action), headerbar button:focus:not(:hover):not(:active):not(.suggested-action):not(.destructive-action), headerbar button:active:not(.suggested-action):not(.destructive-action), headerbar button:checked:not(.suggested-action):not(.destructive-action) { + color: #FFFFFF; +} + +headerbar button:disabled:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.32); +} + +headerbar button:checked:disabled:not(.suggested-action):not(.destructive-action) { + background-color: transparent; + color: rgba(255, 255, 255, 0.5); +} + +headerbar button:backdrop:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.5); +} + +headerbar button:backdrop:focus:not(.suggested-action):not(.destructive-action), headerbar button:backdrop:hover:not(.suggested-action):not(.destructive-action), headerbar button:backdrop:active:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.7); +} + +headerbar button:backdrop:disabled:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.32); +} + +headerbar button:backdrop:checked:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.7); +} + +headerbar button:backdrop:checked:disabled:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.32); +} + +headerbar entry { + background-color: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.7); +} + +headerbar entry:hover, headerbar entry:focus-within { + color: #FFFFFF; +} + +headerbar entry:disabled { + background-color: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.5); +} + +headerbar entry > text > placeholder { + color: rgba(255, 255, 255, 0.5); +} + +headerbar entry > text > block-cursor { + color: rgba(255, 255, 255, 0.04); + background-color: #FFFFFF; +} + +headerbar entry > image { + color: rgba(255, 255, 255, 0.7); +} + +headerbar entry > image:hover, headerbar entry > image:active { + color: #FFFFFF; +} + +headerbar entry > image:disabled { + color: rgba(255, 255, 255, 0.5); +} + +headerbar { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1), color 75ms cubic-bezier(0, 0, 0.2, 1); + box-shadow: inset 0 -1px rgba(255, 255, 255, 0.12); + background-color: #181926; + color: #FFFFFF; + min-height: 48px; + padding: 0; + margin: 0; +} + +headerbar:disabled { + color: rgba(255, 255, 255, 0.5); +} + +headerbar:backdrop { + background-color: #24273a; + color: rgba(255, 255, 255, 0.7); + box-shadow: inset 0 -1px rgba(255, 255, 255, 0.12); +} + +headerbar:backdrop:disabled { + color: rgba(255, 255, 255, 0.32); +} + +headerbar.flat, headerbar.flat:backdrop { + background: none; + box-shadow: none; + transition: none; +} + +headerbar .title { + padding: 0 12px; + font-weight: bold; +} + +headerbar .subtitle { + padding: 0 12px; + font-size: smaller; +} + +headerbar .subtitle, +headerbar .dim-label, +headerbar row.expander image.expander-row-arrow, +row.expander headerbar image.expander-row-arrow, +headerbar row label.subtitle, +row headerbar label.subtitle { + transition: color 75ms cubic-bezier(0, 0, 0.2, 1); + color: rgba(255, 255, 255, 0.7); +} + +headerbar .subtitle:backdrop, +headerbar .dim-label:backdrop, +headerbar row.expander image.expander-row-arrow:backdrop, +row.expander headerbar image.expander-row-arrow:backdrop, +headerbar row label.subtitle:backdrop, +row headerbar label.subtitle:backdrop { + color: rgba(255, 255, 255, 0.5); +} + +headerbar .titlebar { + background-color: transparent; + box-shadow: none; +} + +headerbar headerbar + separator { + background-color: rgba(255, 255, 255, 0.12); +} + +headerbar > windowhandle > box { + padding: 0 6px; +} + +headerbar > windowhandle > box, +headerbar > windowhandle > box > box.start, +headerbar > windowhandle > box > box.end { + border-spacing: 6px; +} + +headerbar entry, +headerbar spinbutton, +headerbar splitbutton, +headerbar button, +headerbar menubutton, +headerbar stackswitcher, +headerbar separator:not(.sidebar) { + margin-top: 6px; + margin-bottom: 6px; +} + +headerbar menubutton > button, +headerbar spinbutton > button, +headerbar splitbutton > button, +headerbar splitbutton > menubutton, +headerbar .linked > menubutton, +headerbar entry > menubutton { + margin-top: 0; + margin-bottom: 0; +} + +headerbar button.suggested-action:disabled, +headerbar button.destructive-action:disabled { + background-color: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.5); + opacity: 1; +} + +headerbar button.star { + min-height: 24px; + min-width: 24px; + padding: 6px; +} + +headerbar .linked:not(.vertical) > entry:not(:only-child) { + border-radius: 6px; +} + +headerbar .entry-tag { + margin-top: 5px; + margin-bottom: 5px; +} + +headerbar popover.background button.suggested-action:disabled, +headerbar popover.background button.destructive-action:disabled { + background-color: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.5); +} + +headerbar popover.background entry, +headerbar popover.background spinbutton, +headerbar popover.background button, +headerbar popover.background menubutton, +headerbar popover.background stackswitcher { + margin-top: 0; + margin-bottom: 0; +} + +headerbar separator:not(.sidebar) { + background-color: rgba(255, 255, 255, 0.12); +} + +headerbar switch { + margin-top: 12px; + margin-bottom: 12px; +} + +headerbar.selection-mode { + transition: background-color 0.1ms 225ms, color 75ms cubic-bezier(0, 0, 0.2, 1); + background-color: #b7bdf8; + color: rgba(0, 0, 0, 0.87); +} + +headerbar.selection-mode:backdrop { + color: rgba(0, 0, 0, 0.6); +} + +headerbar.selection-mode .subtitle:link { + color: rgba(0, 0, 0, 0.87); +} + +headerbar.selection-mode .selection-menu { + padding-left: 16px; + padding-right: 16px; +} + +headerbar.selection-mode .selection-menu .arrow { + -gtk-icon-source: -gtk-icontheme("pan-down-symbolic"); +} + +headerbar.default-decoration { + min-height: 36px; + padding: 0; + margin: 0; + box-shadow: none; + border: none; + outline: none; + background-image: image(#181926); +} + +headerbar.default-decoration:backdrop { + background-image: image(#24273a); +} + +headerbar.default-decoration windowcontrols button, +headerbar.default-decoration windowcontrols menubutton { + min-width: 16px; + min-height: 16px; + margin: 0; + padding: 0; +} + +headerbar.default-decoration windowcontrols menubutton button { + min-height: 20px; + min-width: 20px; + margin: 0; + padding: 4px; +} + +.solid-csd headerbar:dir(rtl), .solid-csd headerbar:dir(ltr) { + border-radius: 0; + box-shadow: none; +} + +window.devel headerbar { + background: #181926 cross-fade(10% -gtk-icontheme("system-run-symbolic"), image(transparent)) 90% 0/256px 256px no-repeat, linear-gradient(to right, transparent 65%, rgba(183, 189, 248, 0.1)), linear-gradient(to top, #1e1f2f 3px, #222336); +} + +window.devel headerbar:backdrop { + background: #181926 cross-fade(10% -gtk-icontheme("system-run-symbolic"), image(transparent)) 90% 0/256px 256px no-repeat, image(#181926); + /* background-color would flash */ +} + +/************ + * Pathbars * + ************/ + +pathbar > button { + padding-left: 6px; + padding-right: 6px; + border-radius: 6px; + background-color: alpha(currentColor, 0.08); + border: none; + box-shadow: none; +} + + +pathbar > button:disabled { + background-color: alpha(currentColor, 0.05); +} + + +pathbar > button:checked { + background-color: alpha(currentColor, 0.1); + color: #FFFFFF; +} + + +pathbar > button:checked:hover { + background-color: alpha(currentColor, 0.16); + color: #FFFFFF; +} + + +pathbar > button label, +pathbar > button image { + margin-left: 3px; + margin-right: 3px; +} + + +pathbar > button.slider-button { + padding-left: 4px; + padding-right: 4px; +} + +.pathbar { + background-color: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.7); + border: none; + border-radius: 6px; + padding: 2px; +} + +headerbar .pathbar { + margin-top: 6px; + margin-bottom: 6px; + background-color: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.7); +} + +.pathbar > button { + margin-top: 0; + margin-bottom: 0; + min-height: 20px; + border-radius: 4px; + border: none; + box-shadow: none; +} + +.pathbar > button:last-child { + background-color: alpha(currentColor, 0.1); + color: #FFFFFF; +} + +/************** + * Tree Views * + **************/ +columnview.view, +treeview.view { + border-left-color: #3e4152; + border-top-color: #3e4152; +} + +columnview.view:hover, columnview.view:selected, +treeview.view:hover, +treeview.view:selected { + border-radius: 0; +} + +columnview.view:focus, +treeview.view:focus { + box-shadow: none; + outline: none; +} + +columnview.view.separator, +treeview.view.separator { + min-height: 5px; + color: rgba(255, 255, 255, 0.12); +} + +columnview.view:drop(active), +treeview.view:drop(active) { + box-shadow: none; +} + +columnview.view:drop(active).after, +treeview.view:drop(active).after { + border-top-style: none; +} + +columnview.view:drop(active).before, +treeview.view:drop(active).before { + border-bottom-style: none; +} + +columnview.view > dndtarget:drop(active), +treeview.view > dndtarget:drop(active) { + border-style: solid none; + border-width: 1px; + border-color: alpha(currentColor, 0.06); +} + +columnview.view > dndtarget:drop(active).after, +treeview.view > dndtarget:drop(active).after { + border-top-style: none; +} + +columnview.view > dndtarget:drop(active).before, +treeview.view > dndtarget:drop(active).before { + border-bottom-style: none; +} + +columnview.view.expander, +treeview.view.expander { + min-width: 16px; + min-height: 16px; + -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); + color: rgba(255, 255, 255, 0.7); +} + +columnview.view.expander:dir(rtl), +treeview.view.expander:dir(rtl) { + -gtk-icon-source: -gtk-icontheme("pan-end-symbolic-rtl"); +} + +columnview.view.expander:hover, +treeview.view.expander:hover { + color: #FFFFFF; +} + +columnview.view.expander:selected, +treeview.view.expander:selected { + color: #FFFFFF; +} + +columnview.view.expander:selected:hover, +treeview.view.expander:selected:hover { + color: #FFFFFF; +} + +columnview.view.expander:checked, +treeview.view.expander:checked { + -gtk-icon-source: -gtk-icontheme("pan-down-symbolic"); +} + +columnview.view.expander:disabled, +treeview.view.expander:disabled { + color: rgba(255, 255, 255, 0.32); +} + +columnview.view.progressbar, +treeview.view.progressbar { + border-bottom: 6px solid #b7bdf8; + box-shadow: none; + background-color: transparent; + background-image: none; +} + +columnview.view.progressbar:selected:hover, +treeview.view.progressbar:selected:hover { + box-shadow: none; +} + +columnview.view.trough, +treeview.view.trough { + border-bottom: 6px solid rgba(255, 255, 255, 0.12); + box-shadow: none; + background-color: transparent; + background-image: none; +} + +columnview.view.trough:selected:hover, +treeview.view.trough:selected:hover { + box-shadow: none; +} + +columnview.view > header > button, +treeview.view > header > button { + padding: 2px 6px; + border-style: none solid solid none; + border-width: 1px; + border-color: rgba(255, 255, 255, 0.12); + border-radius: 0; + background-clip: border-box; +} + +columnview.view > header > button:not(:focus):not(:hover):not(:active), +treeview.view > header > button:not(:focus):not(:hover):not(:active) { + color: rgba(255, 255, 255, 0.7); +} + +columnview.view > header > button, columnview.view > header > button:disabled, +treeview.view > header > button, +treeview.view > header > button:disabled { + background-color: #24273a; +} + +columnview.view > header > button:last-child, +treeview.view > header > button:last-child { + border-right-style: none; +} + +columnview.view button.dnd, +columnview.view header.button.dnd, +treeview.view button.dnd, +treeview.view header.button.dnd { + padding: 2px 6px; + border-style: none solid solid; + border-width: 1px; + border-color: rgba(255, 255, 255, 0.12); + border-radius: 0; + box-shadow: none; + background-color: #24273a; + background-clip: border-box; + color: #b7bdf8; +} + +columnview.view acceleditor > label, +treeview.view acceleditor > label { + background-color: #b7bdf8; +} + +stack.view treeview.view { + min-height: 36px; +} + +/********* + * Menus * + *********/ +menubar { + padding: 0; + background-color: #181926; + color: #FFFFFF; +} + +menubar:backdrop { + background-color: #24273a; + color: rgba(255, 255, 255, 0.7); +} + +.csd menubar { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); +} + +menubar > item { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); + min-height: 20px; + padding: 4px 8px; + color: rgba(255, 255, 255, 0.7); +} + +menubar > item:selected { + transition: none; + background-color: alpha(currentColor, 0.1); + color: #FFFFFF; +} + +menubar > item:disabled { + color: rgba(255, 255, 255, 0.32); +} + +menubar > item label:disabled { + color: inherit; +} + +menubar > item popover.menu popover.menu { + margin-left: 9px; +} + +menubar > item popover.menu.background popover.menu.background > contents { + margin: 0; + border-radius: 12px; +} + +/********************** + * Popover Base Menus * + **********************/ +popover.menu box.inline-buttons { + color: #FFFFFF; + padding: 0 6px; +} + +popover.menu box.inline-buttons button.image-button.model { + min-height: 28px; + min-width: 28px; + padding: 0; + border: none; + outline: none; + transition: none; +} + +popover.menu box.inline-buttons button.image-button.model:selected { + background: image(alpha(currentColor, 0.06)); +} + +popover.menu box.circular-buttons { + padding: 6px; +} + +popover.menu box.circular-buttons button.circular.image-button.model { + padding: 6px; +} + +popover.menu box.circular-buttons button.circular.image-button.model:focus { + background-color: alpha(currentColor, 0.06); +} + +popover.menu arrow.left, +popover.menu radio.left, +popover.menu check.left { + margin-left: 0; + margin-right: 0; +} + +popover.menu arrow.right, +popover.menu radio.right, +popover.menu check.right { + margin-left: 0; + margin-right: 0; +} + +popover.menu label.title { + font-weight: bold; + padding: 4px 26px; +} + +/************ + * Popovers * + ************/ +popover.background { + font: initial; +} + +popover.background, popover.background:backdrop { + background-color: transparent; +} + +popover > arrow, +popover > contents { + transition: box-shadow 200ms ease-out; + padding: 6px; + background-color: #363a4f; + border-radius: 12px; + color: #FFFFFF; + border: 1px solid rgba(255, 255, 255, 0.1); + background-clip: border-box; + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.75), 0 2px 3px -1px rgba(0, 0, 0, 0.05), 0 4px 6px 0 rgba(0, 0, 0, 0.06), 0 1px 10px 0 rgba(0, 0, 0, 0.05); +} + +popover > contents > list, +popover > contents > .view, +popover > contents > toolbar { + border-style: none; + box-shadow: none; + background-color: transparent; +} + +popover > contents separator { + background-color: rgba(255, 255, 255, 0.12); + margin: 3px 0; +} + +popover > contents list separator { + margin: 0; +} + +popover > contents list > row { + border-radius: 6px; +} + +popover > contents stack > box { + padding: 0; +} + +popover > contents > box > button { + margin: 0; +} + +popover .view:not(:selected), +popover toolbar { + background-color: #363a4f; +} + +popover.menu button, +popover button.model { + min-height: 32px; + padding: 0 8px; +} + +popover modelbutton { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1); + min-height: 22px; + min-width: 56px; + padding: 3px 9px; + color: #FFFFFF; + font: initial; + border-radius: 6px; +} + +popover modelbutton:focus:not(:hover) { + transition: none; + box-shadow: none; + outline: none; +} + +popover modelbutton:disabled { + color: rgba(255, 255, 255, 0.5); +} + +popover modelbutton accelerator { + color: rgba(255, 255, 255, 0.5); + margin-left: 30px; +} + +popover modelbutton accelerator:disabled { + color: rgba(255, 255, 255, 0.12); +} + +popover modelbutton arrow.left { + -gtk-icon-source: -gtk-icontheme("go-previous-symbolic"); +} + +popover modelbutton arrow.right { + -gtk-icon-source: -gtk-icontheme("go-next-symbolic"); +} + +.osd popover, popover.touch-selection, popover.magnifier { + background-color: transparent; +} + +magnifier { + background-color: #24273a; +} + +/************* + * Notebooks * + *************/ +notebook > header > tabs > tab { + min-height: 24px; + min-width: 24px; + padding: 3px 6px; + border: none; + background-clip: padding-box; + font-weight: 500; + border-radius: 6px; + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 300ms cubic-bezier(0, 0, 0.2, 1), background-image 1200ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1); + background-image: radial-gradient(circle, transparent 10%, transparent 0%); + background-repeat: no-repeat; + background-position: center; + background-size: 1000% 1000%; + background-color: transparent; + outline: 0 solid transparent; + outline-offset: 2px; + color: rgba(255, 255, 255, 0.7); +} + +notebook > header > tabs > tab:hover:not(:checked):not(:selected) { + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + box-shadow: none; +} + +notebook > header > tabs > tab:disabled { + color: rgba(255, 255, 255, 0.32); + background-color: transparent; +} + +notebook > header > tabs > tab:active { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.08) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + box-shadow: none; +} + +notebook > header > tabs > tab:selected:not(:active) { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms, background-color 0ms; + background-color: rgba(255, 255, 255, 0.15); + color: #FFFFFF; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +notebook > header > tabs > tab:selected:not(:active):disabled { + color: rgba(255, 255, 255, 0.5); +} + +frame > paned > notebook > header, notebook.frame > header { + background-color: rgba(255, 255, 255, 0.04); +} + +notebook, notebook.frame { + background-color: #24273a; + border-radius: 12px; +} + +notebook.frame frame > border { + border: none; + border-radius: 6px; +} + +notebook.frame frame > list row.activatable { + border-radius: 6px; +} + +notebook > header { + border: none; + background-color: rgba(255, 255, 255, 0.04); + margin: 3px; + border-radius: 9px; +} + +notebook > header.top > tabs > arrow { + border-top-style: none; +} + +notebook > header.bottom > tabs > arrow { + border-bottom-style: none; +} + +notebook > header.top > tabs > arrow, notebook > header.bottom > tabs > arrow { + padding-left: 4px; + padding-right: 4px; +} + +notebook > header.top > tabs > arrow.down, notebook > header.bottom > tabs > arrow.down { + margin-left: 0; + -gtk-icon-source: -gtk-icontheme("pan-start-symbolic"); +} + +notebook > header.top > tabs > arrow.up, notebook > header.bottom > tabs > arrow.up { + margin-right: 0; + -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); +} + +notebook > header.left > tabs > arrow { + border-left-style: none; +} + +notebook > header.right > tabs > arrow { + border-right-style: none; +} + +notebook > header.left > tabs > arrow, notebook > header.right > tabs > arrow { + padding-top: 4px; + padding-bottom: 4px; +} + +notebook > header.left > tabs > arrow.down, notebook > header.right > tabs > arrow.down { + margin-top: 0; + -gtk-icon-source: -gtk-icontheme("pan-up-symbolic"); +} + +notebook > header.left > tabs > arrow.up, notebook > header.right > tabs > arrow.up { + margin-bottom: 0; + -gtk-icon-source: -gtk-icontheme("pan-down-symbolic"); +} + +notebook > header > tabs > arrow { + min-height: 16px; + min-width: 16px; + border-radius: 6px; +} + +notebook > header > tabs > tab { + margin: 3px; +} + +notebook > header > tabs > tab > box { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1); + margin: -6px -12px; + padding: 6px 12px; +} + +notebook > header > tabs > tab > box:drop(active) { + background-color: rgba(255, 255, 255, 0.12); + color: #FFFFFF; +} + +notebook > header > tabs > tab button.flat:last-child { + margin-left: 6px; + margin-right: -3px; +} + +notebook > header > tabs > tab button.flat:first-child { + margin-left: -3px; + margin-right: 6px; +} + +notebook > header > tabs > tab button.close-button { + min-width: 24px; + min-height: 24px; +} + +notebook > header.top > tabs, notebook > header.bottom > tabs { + padding-left: 0; + padding-right: 0; +} + +notebook > header.top > tabs:not(:only-child):first-child, notebook > header.bottom > tabs:not(:only-child):first-child { + margin-left: 0; +} + +notebook > header.top > tabs:not(:only-child):last-child, notebook > header.bottom > tabs:not(:only-child):last-child { + margin-right: 0; +} + +notebook > header.top > tabs > tab:not(:last-child), notebook > header.bottom > tabs > tab:not(:last-child) { + margin-right: 0; +} + +notebook > header.top > tabs tab.reorderable-page, notebook > header.bottom > tabs tab.reorderable-page { + border-style: solid; +} + +notebook > header.left > tabs, notebook > header.right > tabs { + padding-top: 0; + padding-bottom: 0; +} + +notebook > header.left > tabs:not(:only-child):first-child, notebook > header.right > tabs:not(:only-child):first-child { + margin-top: 0; +} + +notebook > header.left > tabs:not(:only-child):last-child, notebook > header.right > tabs:not(:only-child):last-child { + margin-bottom: 0; +} + +notebook > header.left > tabs > tab:not(:last-child), notebook > header.right > tabs > tab:not(:last-child) { + margin-bottom: 0; +} + +notebook > header.left > tabs tab.reorderable-page, notebook > header.right > tabs tab.reorderable-page { + border-style: solid; +} + +notebook > header > menubutton > button.image-button { + padding: 3px; + min-width: 24px; + min-height: 24px; + margin: 0 3px; +} + +notebook > stack:not(:only-child) { + background-color: transparent; + border-radius: 6px; +} + +tabbar tab { + min-height: 24px; + min-width: 24px; + padding: 3px 6px; + border: none; + background-clip: padding-box; + font-weight: 500; + border-radius: 6px; + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 300ms cubic-bezier(0, 0, 0.2, 1), background-image 1200ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1); + background-image: radial-gradient(circle, transparent 10%, transparent 0%); + background-repeat: no-repeat; + background-position: center; + background-size: 1000% 1000%; + background-color: transparent; + outline: 0 solid transparent; + outline-offset: 2px; + color: rgba(255, 255, 255, 0.7); + color: rgba(255, 255, 255, 0.7); +} + +tabbar tab:hover:not(:selected) { + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + box-shadow: none; + color: #FFFFFF; +} + +tabbar tab:disabled { + color: rgba(255, 255, 255, 0.32); + background-color: transparent; + color: rgba(255, 255, 255, 0.32); +} + +tabbar tab:active { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.08) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + box-shadow: none; + color: #FFFFFF; +} + +tabbar tab:selected:not(:active) { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms, background-color 0ms; + background-color: rgba(255, 255, 255, 0.15); + color: #FFFFFF; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +tabbar tab:selected:not(:active):disabled { + color: rgba(255, 255, 255, 0.5); +} + +tabbar > revealer > box { + box-shadow: none; +} + +tabbar .box { + background-color: #181926; + background-image: none; + padding: 0; + margin: 0; + border-radius: 0; + min-height: 36px; + border: none; + box-shadow: none; +} + +tabbar .box:backdrop { + background-color: #24273a; + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1); +} + +tabbar .box:backdrop > scrolledwindow, +tabbar .box:backdrop > .start-action, +tabbar .box:backdrop > .end-action { + filter: none; + transition: none; +} + +tabbar tabbox { + padding: 0; + margin: 0; + min-height: 36px; +} + +tabbar tabbox > background { + background: none; +} + +tabbar tabbox > separator { + margin: 9px 0; + transition: opacity 150ms ease-in-out; +} + +tabbar tabbox > separator.hidden { + opacity: 0; +} + +tabbar tabbox > tabboxchild { + padding: 0; + margin: 0; +} + +tabbar tab { + padding: 6px; + margin: 6px 2px; +} + +tabbar tab.needs-attention { + background-image: radial-gradient(ellipse at bottom, rgba(255, 255, 255, 0.8), alpha(#b7bdf8, 0.4) 10%, alpha(#b7bdf8, 0) 30%); +} + +tabbar tab.needs-attention:hover { + background-image: image(alpha(currentColor, 0.03)), radial-gradient(ellipse at bottom, rgba(255, 255, 255, 0.8), alpha(#b7bdf8, 0.4) 10%, alpha(#b7bdf8, 0) 30%); +} + +tabbar tabbox.single-tab tab, tabbar tabbox.single-tab tab:hover, tabbar tabbox.single-tab tab:active { + background: none; +} + +tabbar undershoot { + transition: background 150ms ease-in-out; +} + +tabbar undershoot.left { + background: linear-gradient(to right, #24273a, rgba(0, 0, 0, 0) 20px); +} + +tabbar undershoot.right { + background: linear-gradient(to left, #24273a, rgba(0, 0, 0, 0) 20px); +} + +tabbar .needs-attention-left undershoot.left { + background: linear-gradient(to right, alpha(#b7bdf8, 0.5), alpha(#b7bdf8, 0.3) 1px, alpha(#b7bdf8, 0) 20px); +} + +tabbar .needs-attention-right undershoot.right { + background: linear-gradient(to left, alpha(#b7bdf8, 0.5), alpha(#b7bdf8, 0.3) 1px, alpha(#b7bdf8, 0) 20px); +} + +tabbar .start-action, +tabbar .end-action { + padding: 6px 5px; +} + +tabbar .start-action:dir(ltr), +tabbar .end-action:dir(rtl) { + padding-right: 0; +} + +tabbar .start-action:dir(rtl), +tabbar .end-action:dir(ltr) { + padding-left: 0; +} + +tabbar.inline .box { + background-color: transparent; + color: inherit; + box-shadow: none; + padding-bottom: 0; +} + +tabbar.inline .box:backdrop { + background-color: transparent; + transition: none; +} + +tabbar.inline .box:backdrop > scrolledwindow, +tabbar.inline .box:backdrop > .start-action, +tabbar.inline .box:backdrop > .end-action { + filter: none; + transition: none; +} + +dnd tab { + min-height: 24px; + background-color: #181926; + color: #FFFFFF; + box-shadow: 0 1px 5px 1px rgba(0, 0, 0, 0.09), 0 2px 14px 3px rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.05); + outline: 1px solid rgba(0, 0, 0, 0.75); + outline-offset: -1px; + margin: 24px; +} + +dnd tab.needs-attention { + background-image: radial-gradient(ellipse at bottom, rgba(255, 255, 255, 0.8), alpha(#b7bdf8, 0.4) 10%, alpha(#b7bdf8, 0) 30%); +} + +tabbar tab, +dnd tab { + padding: 6px; +} + +tabbar tab button.image-button, +dnd tab button.image-button { + padding: 0; + margin: 0; + min-width: 24px; + min-height: 24px; + border-radius: 9999px; + color: rgba(255, 255, 255, 0.7); +} + +tabbar tab button.image-button:hover, tabbar tab button.image-button:active, +dnd tab button.image-button:hover, +dnd tab button.image-button:active { + color: #FFFFFF; +} + +tabbar tab button.image-button:disabled, +dnd tab button.image-button:disabled { + color: rgba(255, 255, 255, 0.32); +} + +tabbar tab indicator, +dnd tab indicator { + min-height: 2px; + border-radius: 2px; + background: alpha(#b7bdf8, 0.5); + transform: translateY(4px); +} + +tabthumbnail { + border-radius: 6px; + transition: box-shadow 200ms ease-out; +} + +tabthumbnail > box { + margin: 6px; +} + +tabthumbnail:drop(active) { + box-shadow: inset 0 0 0 2px alpha(#FF7043, 0.4); + background-color: alpha(#FF7043, 0.1); +} + +tabthumbnail .needs-attention:dir(ltr) { + transform: translate(8px, -8px); +} + +tabthumbnail .needs-attention:dir(rtl) { + transform: translate(-8px, -8px); +} + +tabthumbnail .needs-attention > widget { + background: #b7bdf8; + min-width: 12px; + min-height: 12px; + border-radius: 6px; + margin: 3px; + box-shadow: 0 1px 2px alpha(#b7bdf8, 0.4); +} + +tabthumbnail .card { + background: none; + border: none; + box-shadow: none; + color: inherit; +} + +tabthumbnail .card picture { + outline: 1px solid rgba(255, 255, 255, 0.12); + outline-offset: -1px; + border-radius: 6px; +} + +tabthumbnail.pinned .card { + background-color: rgba(255, 255, 255, 0.04); + color: #FFFFFF; +} + +tabthumbnail .icon-title-box { + border-spacing: 6px; +} + +tabthumbnail .tab-unpin-icon { + margin: 6px; + min-width: 24px; + min-height: 24px; +} + +tabthumbnail button.circular { + margin: 6px; + background-color: rgba(255, 255, 255, 0.04); + min-width: 24px; + min-height: 24px; +} + +tabthumbnail button.circular:hover { + background-color: alpha(currentColor, 0.08); +} + +tabthumbnail button.circular:active { + background-color: alpha(currentColor, 0.12); +} + +taboverview > .overview .new-tab-button { + margin: 18px; +} + +tabview:drop(active), +tabbox:drop(active), +tabgrid:drop(active) { + box-shadow: none; +} + +/************** + * Scrollbars * + **************/ +scrollbar { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); + background-color: #24273a; + box-shadow: none; + outline: none; +} + +scrollbar.top { + border-bottom: 1px solid rgba(255, 255, 255, 0.12); +} + +scrollbar.bottom { + border-top: 1px solid rgba(255, 255, 255, 0.12); +} + +scrollbar.left { + border-right: 1px solid rgba(255, 255, 255, 0.12); +} + +scrollbar.right { + border-left: 1px solid rgba(255, 255, 255, 0.12); +} + +scrollbar > range > trough { + border: none; + background: none; + padding: 0; + outline: none; +} + +scrollbar > range > trough > slider { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1); + min-width: 8px; + min-height: 8px; + border: 4px solid transparent; + border-radius: 9999px; + background-clip: padding-box; + background-color: rgba(255, 255, 255, 0.5); + box-shadow: none; + outline: none; +} + +scrollbar > range > trough > slider:hover { + background-color: rgba(255, 255, 255, 0.7); +} + +scrollbar > range > trough > slider:active { + background-color: #FFFFFF; +} + +scrollbar > range > trough > slider:disabled { + background-color: rgba(255, 255, 255, 0.32); +} + +scrollbar > range.fine-tune > trough > slider { + min-width: 4px; + min-height: 4px; +} + +scrollbar > range.fine-tune.horizontal > trough > slider { + margin: 2px 0; +} + +scrollbar > range.fine-tune.vertical > trough > slider { + margin: 0 2px; +} + +scrollbar.overlay-indicator:not(.fine-tune) > range > trough > slider { + transition-property: background-color, min-height, min-width; +} + +scrollbar.overlay-indicator:not(.dragging):not(.hovering) { + border-color: transparent; + background-color: transparent; +} + +scrollbar.overlay-indicator:not(.dragging):not(.hovering) > range > trough > slider { + min-width: 4px; + min-height: 4px; + margin: 0; + border: 1px solid rgba(36, 39, 58, 0.3); +} + +scrollbar.overlay-indicator:not(.dragging):not(.hovering) button { + min-width: 4px; + min-height: 4px; + margin: 0; + border: 1px solid rgba(36, 39, 58, 0.3); + border-radius: 9999px; + background-color: rgba(255, 255, 255, 0.5); + background-clip: padding-box; + -gtk-icon-source: none; +} + +scrollbar.overlay-indicator:not(.dragging):not(.hovering) button:disabled { + background-color: rgba(255, 255, 255, 0.32); +} + +scrollbar.overlay-indicator:not(.dragging):not(.hovering).horizontal > range > trough > slider { + min-width: 24px; +} + +scrollbar.overlay-indicator:not(.dragging):not(.hovering).horizontal button { + min-width: 8px; +} + +scrollbar.overlay-indicator:not(.dragging):not(.hovering).vertical > range > trough > slider { + min-height: 24px; +} + +scrollbar.overlay-indicator:not(.dragging):not(.hovering).vertical button { + min-height: 8px; +} + +scrollbar.overlay-indicator.dragging, scrollbar.overlay-indicator.hovering { + background-color: rgba(255, 255, 255, 0.04); +} + +scrollbar.horizontal > range > trough > slider { + min-width: 24px; +} + +scrollbar.vertical > range > trough > slider { + min-height: 24px; +} + +scrollbar button { + min-width: 16px; + min-height: 16px; + padding: 0; + border-radius: 0; +} + +scrollbar.vertical button.down { + -gtk-icon-source: -gtk-icontheme("pan-down-symbolic"); +} + +scrollbar.vertical button.up { + -gtk-icon-source: -gtk-icontheme("pan-up-symbolic"); +} + +scrollbar.horizontal button.down { + -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); +} + +scrollbar.horizontal button.up { + -gtk-icon-source: -gtk-icontheme("pan-start-symbolic"); +} + +/********** + * Switch * + **********/ +switch { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); + margin: 6px 0; + padding: 0; + border: none; + border-radius: 9999px; + background-color: rgba(255, 255, 255, 0.5); + background-clip: border-box; + font-size: 0; + color: transparent; +} + +switch:checked { + background-color: #b7bdf8; +} + +switch:disabled { + opacity: 0.5; +} + +switch image { + margin: -8px; +} + +switch > slider { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); + min-width: 18px; + min-height: 18px; + margin: 3px; + border-radius: 9999px; + outline: none; + box-shadow: 0 3px 3px -2px rgba(0, 0, 0, 0.05), 0 2px 3px -1px rgba(0, 0, 0, 0.06), 0 1px 4px 0 rgba(0, 0, 0, 0.05); + background-color: white; + border: none; +} + +switch:focus slider, switch:hover slider, switch:focus:hover slider { + box-shadow: 0 0 0 6px rgba(255, 255, 255, 0.12); +} + +/************************* + * Check and Radio items * + *************************/ +.view.content-view.check:not(list), +.content-view .tile check:not(list) { + min-height: 40px; + min-width: 40px; + margin: 0; + padding: 0; + box-shadow: none; + background-color: transparent; + background-image: none; +} + +.view.content-view.check:not(list):hover, .view.content-view.check:not(list):active, +.content-view .tile check:not(list):hover, +.content-view .tile check:not(list):active { + box-shadow: 0 0 0 10px rgba(255, 255, 255, 0.12); +} + +.view.content-view.check:not(list), +.content-view .tile check:not(list) { + -gtk-icon-source: -gtk-scaled(url("assets/selectionmode-checkbox-unchecked-dark.png"), url("assets/selectionmode-checkbox-unchecked-dark@2.png")); +} + +.view.content-view.check:not(list):checked, +.content-view .tile check:not(list):checked { + -gtk-icon-source: -gtk-scaled(url("assets/selectionmode-checkbox-checked-dark.png"), url("assets/selectionmode-checkbox-checked-dark@2.png")); +} + +checkbutton, +radiobutton { + outline: none; + border-spacing: 3px; +} + +check, +radio { + min-height: 20px; + min-width: 20px; + margin: 3px; + padding: 0; + border-radius: 9999px; + border: none; + color: transparent; + background-color: rgba(255, 255, 255, 0.12); + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), box-shadow 150ms cubic-bezier(0, 0, 0.2, 1); +} + +check:hover, +radio:hover { + box-shadow: 0 0 0 6px rgba(255, 255, 255, 0.04); + background-color: rgba(255, 255, 255, 0.15); +} + +check:active, +radio:active { + box-shadow: 0 0 0 6px rgba(255, 255, 255, 0.12); + background-color: rgba(255, 255, 255, 0.2); +} + +check:disabled, +radio:disabled { + background-color: rgba(255, 255, 255, 0.04); +} + +check:checked, check:indeterminate, +radio:checked, +radio:indeterminate { + color: rgba(0, 0, 0, 0.87); + background-color: #b7bdf8; +} + +check:checked:hover, check:indeterminate:hover, +radio:checked:hover, +radio:indeterminate:hover { + box-shadow: 0 0 0 6px rgba(183, 189, 248, 0.15); + background-color: #e5e8fd; +} + +check:checked:active, check:indeterminate:active, +radio:checked:active, +radio:indeterminate:active { + box-shadow: 0 0 0 6px rgba(183, 189, 248, 0.2); + background-color: #b7bdf8; +} + +check:checked:disabled, check:indeterminate:disabled, +radio:checked:disabled, +radio:indeterminate:disabled { + color: rgba(0, 0, 0, 0.6); + background-color: rgba(183, 189, 248, 0.35); +} + +popover modelbutton.flat check, popover modelbutton.flat check:focus, popover modelbutton.flat check:hover, popover modelbutton.flat check:focus:hover, popover modelbutton.flat check:active, popover modelbutton.flat check:disabled, popover modelbutton.flat radio, popover modelbutton.flat radio:focus, popover modelbutton.flat radio:hover, popover modelbutton.flat radio:focus:hover, popover modelbutton.flat radio:active, popover modelbutton.flat radio:disabled { + transition: none; + box-shadow: none; + background-image: none; +} + +popover modelbutton.flat check.left:dir(rtl), popover modelbutton.flat radio.left:dir(rtl) { + margin-left: -3px; + margin-right: 6px; +} + +popover modelbutton.flat check.right:dir(ltr), popover modelbutton.flat radio.right:dir(ltr) { + margin-left: 6px; + margin-right: -3px; +} + +popover.menu check, popover.menu radio { + transition: none; + margin: 0; + padding: 0; +} + +popover.menu check:dir(ltr), popover.menu radio:dir(ltr) { + margin-right: 6px; + margin-left: -3px; +} + +popover.menu check:dir(rtl), popover.menu radio:dir(rtl) { + margin-left: 6px; + margin-right: -3px; +} + +popover.menu check, popover.menu check:hover, popover.menu check:disabled, popover.menu check:checked:hover, popover.menu check:indeterminate:hover, popover.menu radio, popover.menu radio:hover, popover.menu radio:disabled, popover.menu radio:checked:hover, popover.menu radio:indeterminate:hover { + box-shadow: none; +} + + +check { + -gtk-icon-size: 20px; +} + + +check:checked { + -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/scalable/checkbox-checked-symbolic.svg")), -gtk-recolor(url("assets/scalable/checkbox-checked-symbolic@2.svg"))); +} + + +check:indeterminate { + -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/scalable/checkbox-mixed-symbolic.svg")), -gtk-recolor(url("assets/scalable/checkbox-mixed-symbolic@2.svg"))); +} + + +radio { + -gtk-icon-size: 20px; +} + + +radio:checked { + -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/scalable/radio-checked-symbolic.svg")), -gtk-recolor(url("assets/scalable/radio-checked-symbolic@2.svg"))); +} + + +radio:indeterminate { + -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/scalable/radio-mixed-symbolic.svg")), -gtk-recolor(url("assets/scalable/radio-mixed-symbolic@2.svg"))); +} + + +popover.menu check { + min-height: 16px; + min-width: 16px; + -gtk-icon-size: 16px; +} + + +popover.menu check:checked { + -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/scalable/small-checkbox-checked-symbolic.svg")), -gtk-recolor(url("assets/scalable/small-checkbox-checked-symbolic@2.svg"))); +} + + +popover.menu check:indeterminate { + -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/scalable/small-checkbox-mixed-symbolic.svg")), -gtk-recolor(url("assets/scalable/small-checkbox-mixed-symbolic@2.svg"))); +} + + +popover.menu radio { + min-height: 16px; + min-width: 16px; + -gtk-icon-size: 16px; +} + + +popover.menu radio:checked { + -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/scalable/small-radio-checked-symbolic.svg")), -gtk-recolor(url("assets/scalable/small-radio-checked-symbolic@2.svg"))); +} + + +popover.menu radio:indeterminate { + -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/scalable/small-radio-mixed-symbolic.svg")), -gtk-recolor(url("assets/scalable/small-radio-mixed-symbolic@2.svg"))); +} + +check:not(:checked):active { + -gtk-icon-transform: rotate(90deg); +} + +treeview.view radio, treeview.view check, +columnview.view radio, +columnview.view check { + padding: 0; + margin: 0; + transition: none; +} + +treeview.view radio, treeview.view radio:hover, treeview.view radio:disabled, treeview.view radio:checked:hover, treeview.view radio:indeterminate:hover, treeview.view check, treeview.view check:hover, treeview.view check:disabled, treeview.view check:checked:hover, treeview.view check:indeterminate:hover, +columnview.view radio, +columnview.view radio:hover, +columnview.view radio:disabled, +columnview.view radio:checked:hover, +columnview.view radio:indeterminate:hover, +columnview.view check, +columnview.view check:hover, +columnview.view check:disabled, +columnview.view check:checked:hover, +columnview.view check:indeterminate:hover { + box-shadow: none; +} + +treeview.view:hover check, treeview.view:hover radio, treeview.view:selected check, treeview.view:selected radio, treeview.view:focus check, treeview.view:focus radio, +columnview.view:hover check, +columnview.view:hover radio, +columnview.view:selected check, +columnview.view:selected radio, +columnview.view:focus check, +columnview.view:focus radio { + box-shadow: none; +} + +treeview.view:hover check:checked, treeview.view:hover radio:checked, treeview.view:selected check:checked, treeview.view:selected radio:checked, treeview.view:focus check:checked, treeview.view:focus radio:checked, +columnview.view:hover check:checked, +columnview.view:hover radio:checked, +columnview.view:selected check:checked, +columnview.view:selected radio:checked, +columnview.view:focus check:checked, +columnview.view:focus radio:checked { + color: rgba(0, 0, 0, 0.87); + background-color: #b7bdf8; +} + +/************ + * GtkScale * + ************/ +scale { + min-height: 2px; + min-width: 2px; +} + +scale.horizontal { + padding: 17px 12px; +} + +scale.vertical { + padding: 12px 17px; +} + +scale > trough { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1); + outline: none; + background-color: rgba(255, 255, 255, 0.3); +} + +scale > trough:disabled { + background-color: rgba(255, 255, 255, 0.12); +} + +scale > trough > highlight { + transition: background-image 75ms cubic-bezier(0, 0, 0.2, 1); + background-image: image(#b7bdf8); +} + +scale > trough > highlight:disabled { + background-color: #24273a; + background-image: image(rgba(255, 255, 255, 0.32)); +} + +scale > trough > fill { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1); + background-color: rgba(255, 255, 255, 0.3); +} + +scale > trough > fill:disabled { + background-color: transparent; +} + +scale > trough > slider { + min-height: 18px; + min-width: 18px; + margin: -8px; + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); + border-radius: 9999px; + color: #b7bdf8; + background-color: #24273a; + box-shadow: inset 0 0 0 2px #b7bdf8; +} + +scale > trough > slider:hover { + box-shadow: inset 0 0 0 2px #b7bdf8, 0 0 0 8px rgba(255, 255, 255, 0.12); +} + +scale > trough > slider:active { + box-shadow: inset 0 0 0 4px #b7bdf8, 0 0 0 8px rgba(255, 255, 255, 0.12); +} + +scale > trough > slider:disabled { + box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.32); +} + +scale.fine-tune.horizontal { + min-height: 4px; + padding-top: 16px; + padding-bottom: 16px; +} + +scale.fine-tune.vertical { + min-width: 4px; + padding-left: 16px; + padding-right: 16px; +} + +scale.fine-tune > trough > slider { + margin: -7px; +} + +scale > marks, +scale > value { + color: rgba(255, 255, 255, 0.7); +} + +scale indicator { + background-color: rgba(255, 255, 255, 0.3); + color: transparent; +} + +scale.marks-before:not(.marks-after) > trough > slider, scale.marks-after:not(.marks-before) > trough > slider { + transform: rotate(0); +} + +scale.horizontal > marks.top { + margin-bottom: 7px; + margin-top: -15px; +} + +scale.horizontal.fine-tune > marks.top { + margin-bottom: 6px; + margin-top: -14px; +} + +scale.horizontal > marks.bottom { + margin-top: 7px; + margin-bottom: -15px; +} + +scale.horizontal.fine-tune > marks.bottom { + margin-top: 6px; + margin-bottom: -14px; +} + +scale.vertical > marks.top { + margin-right: 7px; + margin-left: -15px; +} + +scale.vertical.fine-tune > marks.top { + margin-right: 6px; + margin-left: -14px; +} + +scale.vertical > marks.bottom { + margin-left: 7px; + margin-right: -15px; +} + +scale.vertical.fine-tune > marks.bottom { + margin-left: 6px; + margin-right: -14px; +} + +scale.horizontal indicator { + min-height: 8px; + min-width: 1px; +} + +scale.vertical indicator { + min-height: 1px; + min-width: 8px; +} + +scale.horizontal.marks-before:not(.marks-after) > trough > slider { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1), background-size 300ms cubic-bezier(0, 0, 0.2, 1), background-image 1200ms cubic-bezier(0, 0, 0.2, 1); + min-height: 32px; + min-width: 32px; + margin: -15px; + border-radius: 50%; + background-size: auto, 1000% 1000%; + background-repeat: no-repeat; + background-position: center center; + background-color: transparent; +} + +scale.horizontal.marks-before:not(.marks-after) > trough > slider, scale.horizontal.marks-before:not(.marks-after) > trough > slider:hover, scale.horizontal.marks-before:not(.marks-after) > trough > slider:active, scale.horizontal.marks-before:not(.marks-after) > trough > slider:disabled { + box-shadow: none; +} + +scale.horizontal.marks-before:not(.marks-after) > trough > slider:focus { + background-color: alpha(currentColor, 0.08); +} + +scale.horizontal.marks-before:not(.marks-after) > trough > slider:hover { + background-color: alpha(currentColor, 0.08); +} + +scale.horizontal.marks-before:not(.marks-after) > trough > slider:focus:hover { + background-color: alpha(currentColor, 0.16); +} + +scale.horizontal.marks-before:not(.marks-after) > trough > slider:active { + background-size: auto, 0% 0%; + background-color: alpha(currentColor, 0.08); +} + +scale.horizontal.marks-before:not(.marks-after) > trough > slider { + background-image: -gtk-scaled(url("assets/scale-horz-marks-before-slider-dark.png"), url("assets/scale-horz-marks-before-slider-dark@2.png")); +} + +scale.horizontal.marks-before:not(.marks-after) > trough > slider:disabled { + background-image: -gtk-scaled(url("assets/scale-horz-marks-before-slider-disabled-dark.png"), url("assets/scale-horz-marks-before-slider-disabled-dark@2.png")); +} + +scale.horizontal.marks-before:not(.marks-after) > trough > slider:active { + background-image: -gtk-scaled(url("assets/scale-horz-marks-before-slider-dark.png"), url("assets/scale-horz-marks-before-slider-dark@2.png")); +} + +scale.horizontal.marks-after:not(.marks-before) > trough > slider { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1), background-size 300ms cubic-bezier(0, 0, 0.2, 1), background-image 1200ms cubic-bezier(0, 0, 0.2, 1); + min-height: 32px; + min-width: 32px; + margin: -15px; + border-radius: 50%; + background-size: auto, 1000% 1000%; + background-repeat: no-repeat; + background-position: center center; + background-color: transparent; +} + +scale.horizontal.marks-after:not(.marks-before) > trough > slider, scale.horizontal.marks-after:not(.marks-before) > trough > slider:hover, scale.horizontal.marks-after:not(.marks-before) > trough > slider:active, scale.horizontal.marks-after:not(.marks-before) > trough > slider:disabled { + box-shadow: none; +} + +scale.horizontal.marks-after:not(.marks-before) > trough > slider:focus { + background-color: alpha(currentColor, 0.08); +} + +scale.horizontal.marks-after:not(.marks-before) > trough > slider:hover { + background-color: alpha(currentColor, 0.08); +} + +scale.horizontal.marks-after:not(.marks-before) > trough > slider:focus:hover { + background-color: alpha(currentColor, 0.16); +} + +scale.horizontal.marks-after:not(.marks-before) > trough > slider:active { + background-size: auto, 0% 0%; + background-color: alpha(currentColor, 0.08); +} + +scale.horizontal.marks-after:not(.marks-before) > trough > slider { + background-image: -gtk-scaled(url("assets/scale-horz-marks-after-slider-dark.png"), url("assets/scale-horz-marks-after-slider-dark@2.png")); +} + +scale.horizontal.marks-after:not(.marks-before) > trough > slider:disabled { + background-image: -gtk-scaled(url("assets/scale-horz-marks-after-slider-disabled-dark.png"), url("assets/scale-horz-marks-after-slider-disabled-dark@2.png")); +} + +scale.horizontal.marks-after:not(.marks-before) > trough > slider:active { + background-image: -gtk-scaled(url("assets/scale-horz-marks-after-slider-dark.png"), url("assets/scale-horz-marks-after-slider-dark@2.png")); +} + +scale.vertical.marks-before:not(.marks-after) > trough > slider { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1), background-size 300ms cubic-bezier(0, 0, 0.2, 1), background-image 1200ms cubic-bezier(0, 0, 0.2, 1); + min-height: 32px; + min-width: 32px; + margin: -15px; + border-radius: 50%; + background-size: auto, 1000% 1000%; + background-repeat: no-repeat; + background-position: center center; + background-color: transparent; +} + +scale.vertical.marks-before:not(.marks-after) > trough > slider, scale.vertical.marks-before:not(.marks-after) > trough > slider:hover, scale.vertical.marks-before:not(.marks-after) > trough > slider:active, scale.vertical.marks-before:not(.marks-after) > trough > slider:disabled { + box-shadow: none; +} + +scale.vertical.marks-before:not(.marks-after) > trough > slider:focus { + background-color: alpha(currentColor, 0.08); +} + +scale.vertical.marks-before:not(.marks-after) > trough > slider:hover { + background-color: alpha(currentColor, 0.08); +} + +scale.vertical.marks-before:not(.marks-after) > trough > slider:focus:hover { + background-color: alpha(currentColor, 0.16); +} + +scale.vertical.marks-before:not(.marks-after) > trough > slider:active { + background-size: auto, 0% 0%; + background-color: alpha(currentColor, 0.08); +} + +scale.vertical.marks-before:not(.marks-after) > trough > slider { + background-image: -gtk-scaled(url("assets/scale-vert-marks-before-slider-dark.png"), url("assets/scale-vert-marks-before-slider-dark@2.png")); +} + +scale.vertical.marks-before:not(.marks-after) > trough > slider:disabled { + background-image: -gtk-scaled(url("assets/scale-vert-marks-before-slider-disabled-dark.png"), url("assets/scale-vert-marks-before-slider-disabled-dark@2.png")); +} + +scale.vertical.marks-before:not(.marks-after) > trough > slider:active { + background-image: -gtk-scaled(url("assets/scale-vert-marks-before-slider-dark.png"), url("assets/scale-vert-marks-before-slider-dark@2.png")); +} + +scale.vertical.marks-after:not(.marks-before) > trough > slider { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1), background-size 300ms cubic-bezier(0, 0, 0.2, 1), background-image 1200ms cubic-bezier(0, 0, 0.2, 1); + min-height: 32px; + min-width: 32px; + margin: -15px; + border-radius: 50%; + background-size: auto, 1000% 1000%; + background-repeat: no-repeat; + background-position: center center; + background-color: transparent; +} + +scale.vertical.marks-after:not(.marks-before) > trough > slider, scale.vertical.marks-after:not(.marks-before) > trough > slider:hover, scale.vertical.marks-after:not(.marks-before) > trough > slider:active, scale.vertical.marks-after:not(.marks-before) > trough > slider:disabled { + box-shadow: none; +} + +scale.vertical.marks-after:not(.marks-before) > trough > slider:focus { + background-color: alpha(currentColor, 0.08); +} + +scale.vertical.marks-after:not(.marks-before) > trough > slider:hover { + background-color: alpha(currentColor, 0.08); +} + +scale.vertical.marks-after:not(.marks-before) > trough > slider:focus:hover { + background-color: alpha(currentColor, 0.16); +} + +scale.vertical.marks-after:not(.marks-before) > trough > slider:active { + background-size: auto, 0% 0%; + background-color: alpha(currentColor, 0.08); +} + +scale.vertical.marks-after:not(.marks-before) > trough > slider { + background-image: -gtk-scaled(url("assets/scale-vert-marks-after-slider-dark.png"), url("assets/scale-vert-marks-after-slider-dark@2.png")); +} + +scale.vertical.marks-after:not(.marks-before) > trough > slider:disabled { + background-image: -gtk-scaled(url("assets/scale-vert-marks-after-slider-disabled-dark.png"), url("assets/scale-vert-marks-after-slider-disabled-dark@2.png")); +} + +scale.vertical.marks-after:not(.marks-before) > trough > slider:active { + background-image: -gtk-scaled(url("assets/scale-vert-marks-after-slider-dark.png"), url("assets/scale-vert-marks-after-slider-dark@2.png")); +} + +scale.color { + min-height: 0; + min-width: 0; +} + +scale.color.horizontal { + padding: 0 0 12px 0; +} + +scale.color.horizontal > trough > slider:dir(ltr), scale.color.horizontal > trough > slider:dir(rtl) { + margin-bottom: -13.5px; + margin-top: 11.5px; +} + +scale.color.vertical:dir(ltr) { + padding: 0 0 0 12px; +} + +scale.color.vertical:dir(ltr) slider { + margin-left: -13.5px; + margin-right: 11.5px; +} + +scale.color.vertical:dir(rtl) { + padding: 0 12px 0 0; +} + +scale.color.vertical:dir(rtl) > trough > slider { + margin-right: -13.5px; + margin-left: 11.5px; +} + +/***************** + * Progress bars * + *****************/ +progressbar { + color: rgba(255, 255, 255, 0.7); + font-size: smaller; +} + +progressbar.horizontal trough, +progressbar.horizontal progress { + min-height: 6px; +} + +progressbar.vertical trough, +progressbar.vertical progress { + min-width: 6px; +} + +progressbar trough { + border-radius: 6px; + background-color: rgba(255, 255, 255, 0.12); +} + +progressbar progress { + border-radius: 6px; + background-color: #b7bdf8; +} + +progressbar.osd { + min-width: 6px; + min-height: 6px; + background-color: transparent; + box-shadow: none; + margin: 0; + padding: 0; +} + +progressbar.osd trough { + background-color: transparent; +} + +progressbar.osd progress { + background-color: #b7bdf8; +} + +progressbar trough.empty progress { + all: unset; +} + +/************* + * Level Bar * + *************/ +levelbar.horizontal block { + min-height: 6px; +} + +levelbar.horizontal.discrete block { + min-width: 36px; +} + +levelbar.horizontal.discrete block:not(:last-child) { + margin-right: 2px; +} + +levelbar.vertical block { + min-width: 6px; +} + +levelbar.vertical.discrete block { + min-height: 36px; +} + +levelbar.vertical.discrete block:not(:last-child) { + margin-bottom: 2px; +} + +levelbar trough { + border-radius: 6px; +} + +levelbar block.low { + background-color: #FBC02D; +} + +levelbar block.high, levelbar block:not(.empty) { + background-color: #b7bdf8; +} + +levelbar block.full { + background-color: #66BB6A; +} + +levelbar block.empty { + background-color: rgba(255, 255, 255, 0.12); +} + +/**************** + * Print dialog * +*****************/ +window.dialog.print drawing { + color: #FFFFFF; + background: none; + border: none; + padding: 0; +} + +window.dialog.print drawing paper { + padding: 0; + border: 1px solid rgba(255, 255, 255, 0.12); + background-color: #24273a; + color: #FFFFFF; +} + +window.dialog.print .dialog-action-box { + margin: 12px; +} + +/********** + * Frames * + **********/ +frame, +.frame { + border: 1px solid rgba(255, 255, 255, 0.12); +} + +frame > list, +.frame > list { + border: none; +} + +frame.view, +.frame.view { + border-radius: 6px; +} + +frame.flat, +.frame.flat { + border-style: none; +} + +frame { + border-radius: 6px; +} + +frame > label { + margin: 4px; +} + +frame.flat > border, statusbar frame > border { + border: none; +} + +actionbar > revealer > box { + padding: 6px; + border-spacing: 0; + box-shadow: inset 0 1px rgba(255, 255, 255, 0.12); + background-color: #24273a; + background-clip: border-box; + border: none; +} + +actionbar > revealer > box button, actionbar > revealer > box entry, +actionbar > revealer > box menubutton, actionbar > revealer > box menubutton > button, +actionbar > revealer > box splitbutton, actionbar > revealer > box splitbutton > button, +actionbar > revealer > box spinbutton { + margin: 0; +} + +statusbar { + padding: 6px 18px; +} + +scrolledwindow viewport.frame { + border: none; +} + +stack scrolledwindow.frame viewport.frame list { + border: none; +} + +scrolledwindow > overshoot.top { + background-image: radial-gradient(farthest-side at top, alpha(currentColor, 0.12) 85%, alpha(currentColor, 0)), radial-gradient(farthest-side at top, alpha(currentColor, 0.05), alpha(currentColor, 0)); + background-size: 100% 3%, 100% 50%; + background-repeat: no-repeat; + background-position: top; + background-color: transparent; + border: none; + box-shadow: none; +} + +scrolledwindow > overshoot.bottom { + background-image: radial-gradient(farthest-side at bottom, alpha(currentColor, 0.12) 85%, alpha(currentColor, 0)), radial-gradient(farthest-side at bottom, alpha(currentColor, 0.05), alpha(currentColor, 0)); + background-size: 100% 3%, 100% 50%; + background-repeat: no-repeat; + background-position: bottom; + background-color: transparent; + border: none; + box-shadow: none; +} + +scrolledwindow > overshoot.left { + background-image: radial-gradient(farthest-side at left, alpha(currentColor, 0.12) 85%, alpha(currentColor, 0)), radial-gradient(farthest-side at left, alpha(currentColor, 0.05), alpha(currentColor, 0)); + background-size: 3% 100%, 50% 100%; + background-repeat: no-repeat; + background-position: left; + background-color: transparent; + border: none; + box-shadow: none; +} + +scrolledwindow > overshoot.right { + background-image: radial-gradient(farthest-side at right, alpha(currentColor, 0.12) 85%, alpha(currentColor, 0)), radial-gradient(farthest-side at right, alpha(currentColor, 0.05), alpha(currentColor, 0)); + background-size: 3% 100%, 50% 100%; + background-repeat: no-repeat; + background-position: right; + background-color: transparent; + border: none; + box-shadow: none; +} + +scrolledwindow.undershoot-top > undershoot.top { + box-shadow: none; + background: linear-gradient(to bottom, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +scrolledwindow.undershoot-bottom > undershoot.bottom { + box-shadow: none; + background: linear-gradient(to top, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +scrolledwindow.undershoot-start:dir(ltr) > undershoot.left { + box-shadow: none; + background: linear-gradient(to right, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +scrolledwindow.undershoot-start:dir(rtl) > undershoot.right { + box-shadow: none; + background: linear-gradient(to left, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +scrolledwindow.undershoot-end:dir(ltr) > undershoot.right { + box-shadow: none; + background: linear-gradient(to left, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +scrolledwindow.undershoot-end:dir(rtl) > undershoot.left { + box-shadow: none; + background: linear-gradient(to right, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +scrolledwindow > undershoot { + background-image: none; + box-shadow: none; + border: none; +} + +separator { + min-width: 1px; + min-height: 1px; + background-color: rgba(255, 255, 255, 0.12); +} + +stacksidebar + separator.vertical, +stacksidebar separator.horizontal, button.font separator, button.file separator, separator.spacer { + min-width: 0; + min-height: 0; + background-color: transparent; + background-image: none; +} + +/********* + * Lists * + *********/ +list.content, +list.boxed-list { + border-radius: 7px; + box-shadow: none; + border: 1px solid rgba(255, 255, 255, 0.12); +} + +listview, +list { + border-color: rgba(255, 255, 255, 0.12); + background-color: #24273a; + background-clip: padding-box; +} + +listview > row, +list > row { + padding: 6px; + background-clip: padding-box; +} + +listview > row.expander, +list > row.expander { + padding: 0px; +} + +listview > row.expander .row-header, +list > row.expander .row-header { + padding: 2px; +} + +listview.horizontal row.separator:not(:last-child), listview.separators.horizontal > row:not(.separator):not(:last-child), +list.horizontal row.separator:not(:last-child), +list.separators.horizontal > row:not(.separator):not(:last-child) { + border-left: 1px solid rgba(255, 255, 255, 0.12); +} + +listview:not(.horizontal) row.separator:not(:last-child), listview.separators:not(.horizontal) > row:not(.separator):not(:last-child), +list:not(.horizontal) row.separator:not(:last-child), +list.separators:not(.horizontal) > row:not(.separator):not(:last-child) { + border-bottom: 1px solid rgba(255, 255, 255, 0.12); +} + +list.frame { + border-radius: 6px; +} + +listview.view { + color: #FFFFFF; + background-color: transparent; +} + +popover.menu listview.view { + padding: 0; + border-radius: 6px; +} + +popover.menu listview.view > row { + margin-left: 0; + margin-right: 0; + border-radius: 6px; +} + +row { + color: rgba(255, 255, 255, 0.7); + background-clip: padding-box; +} + +row label.subtitle { + font-size: smaller; +} + +row > box.header { + margin-left: 12px; + margin-right: 12px; + min-height: 48px; +} + +row > box.header > .icon:disabled { + filter: opacity(0.35); +} + +row > box.header > box.title { + margin-top: 6px; + margin-bottom: 6px; + border-spacing: 3px; +} + +.nautilus-window .nautilus-grid-view child.activatable, columnview.view > header > button, +treeview.view > header > button, row.activatable { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), background-size 300ms cubic-bezier(0, 0, 0.2, 1), background-image 1200ms cubic-bezier(0, 0, 0.2, 1), font-weight 0; + outline: none; + box-shadow: none; + background-color: transparent; + background-image: radial-gradient(circle, transparent 10%, transparent 0%); + background-repeat: no-repeat; + background-position: center; + background-size: 1000% 1000%; + outline: none; +} + +.nautilus-window .nautilus-grid-view child.activatable:focus, columnview.view > header > button:focus, +treeview.view > header > button:focus, row.activatable:focus { + color: #FFFFFF; + background-color: transparent; + box-shadow: none; + outline: none; +} + +.nautilus-window .nautilus-grid-view child.activatable:hover, columnview.view > header > button:hover, +treeview.view > header > button:hover, .nautilus-window .nautilus-grid-view child.has-open-popup.activatable, columnview.view > header > button.has-open-popup, +treeview.view > header > button.has-open-popup, row.activatable:hover, row.activatable.has-open-popup { + color: #FFFFFF; + background-color: alpha(currentColor, 0.05); + box-shadow: none; +} + +.nautilus-window .nautilus-grid-view child.activatable:active, columnview.view > header > button:active, +treeview.view > header > button:active, row.activatable:active { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms, font-weight 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.05) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.05); + color: #FFFFFF; + box-shadow: none; +} + +.nautilus-window .nautilus-grid-view child.activatable:selected, columnview.view > header > button:selected, +treeview.view > header > button:selected, row.activatable:selected { + background-color: alpha(currentColor, 0.06); +} + +.nautilus-window .nautilus-grid-view child.activatable:selected:hover, columnview.view > header > button:selected:hover, +treeview.view > header > button:selected:hover, row.activatable:selected:hover { + background-color: alpha(currentColor, 0.08); +} + +button row.activatable:focus, button row.activatable:hover, button row.activatable:active { + box-shadow: none; + background: none; +} + +button:checked row.activatable { + color: rgba(0, 0, 0, 0.87); +} + +row:selected { + background-color: alpha(currentColor, 0.06); + color: #FFFFFF; + box-shadow: none; +} + +row:selected:hover { + background-color: alpha(currentColor, 0.08); +} + +row:selected:focus, row:selected:focus-visible:focus-within { + outline: none; + background-color: alpha(currentColor, 0.08); +} + +row:selected:focus:hover, row:selected:focus-visible:focus-within:hover { + background-color: alpha(currentColor, 0.16); +} + +row:selected button image, +row:selected button label { + color: inherit; +} + +row:selected:disabled { + color: rgba(255, 255, 255, 0.5); +} + +.rich-list { + /* rich lists usually containing other widgets than just labels/text */ +} + +.rich-list > row { + padding: 9px 12px; + min-height: 32px; + /* should be tall even when only containing a label */ +} + +.rich-list > row:last-child { + border-bottom: none; +} + +.rich-list > row > box { + border-spacing: 12px; +} + +row label.subtitle { + font-size: smaller; +} + +row > box.header { + margin-left: 12px; + margin-right: 12px; + border-spacing: 6px; + min-height: 50px; +} + +row > box.header > .icon:disabled { + filter: opacity(0.45); +} + +row > box.header > box.title { + margin-top: 6px; + margin-bottom: 6px; + border-spacing: 3px; + padding: 0; +} + +row > box.header > box.title, +row > box.header > box.title > .title, +row > box.header > box.title > .subtitle { + padding: 0; + font-weight: inherit; +} + +row > box.header > .prefixes, +row > box.header > .suffixes { + border-spacing: 6px; +} + +row > box.header > .icon:dir(ltr), +row > box.header > .prefixes:dir(ltr) { + margin-right: 6px; +} + +row > box.header > .icon:dir(rtl), +row > box.header > .prefixes:dir(rtl) { + margin-left: 6px; +} + +row.entry .edit-icon, row.entry .indicator { + min-width: 24px; + min-height: 24px; + padding: 5px; +} + +row.entry .edit-icon:disabled { + opacity: 0.5; +} + +row.entry .indicator { + opacity: 0.65; +} + +row.entry.monospace { + font-family: inherit; +} + +row.entry.monospace text { + font-family: monospace; +} + +row.spin spinbutton { + background: none; + border-spacing: 6px; + box-shadow: none; +} + +row.spin spinbutton, row.spin spinbutton:focus { + outline: none; +} + +row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr):last-child, row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child, +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child { + min-width: 30px; + min-height: 30px; + margin: 10px 2px; + border: none; +} + +row.spin:disabled spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:disabled, row.spin:disabled spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr):last-child:disabled, row.spin:disabled spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child:disabled, +row.spin:disabled spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):disabled, +row.spin:disabled spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child:disabled, +row.spin:disabled spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child:disabled { + filter: none; +} + +row.entry:not(:selected).activatable.focused:hover, row.entry:not(:selected).activatable.focused:active, +row.spin:not(:selected).activatable.focused:hover, +row.spin:not(:selected).activatable.focused:active { + background-color: transparent; +} + +row.entry.error text > selection:focus-within, +row.spin.error text > selection:focus-within { + background-color: alpha(#F44336, 0.2); +} + +row.entry.error text > cursor-handle > contents, +row.spin.error text > cursor-handle > contents { + background-color: currentColor; +} + +row.entry.error .dim-label, row.entry.error row.expander image.expander-row-arrow, row.expander row.entry.error image.expander-row-arrow, row.entry.error .subtitle, +row.spin.error .dim-label, +row.spin.error row.expander image.expander-row-arrow, +row.expander row.spin.error image.expander-row-arrow, +row.spin.error .subtitle { + opacity: 1; +} + +row.entry.error .suggested-action, +row.spin.error .suggested-action { + background-color: #F44336; + color: #FFFFFF; +} + +row.entry.warning text > selection:focus-within, +row.spin.warning text > selection:focus-within { + background-color: alpha(#FBC02D, 0.2); +} + +row.entry.warning text > cursor-handle > contents, +row.spin.warning text > cursor-handle > contents { + background-color: currentColor; +} + +row.entry.warning .dim-label, row.entry.warning row.expander image.expander-row-arrow, row.expander row.entry.warning image.expander-row-arrow, row.entry.warning .subtitle, +row.spin.warning .dim-label, +row.spin.warning row.expander image.expander-row-arrow, +row.expander row.spin.warning image.expander-row-arrow, +row.spin.warning .subtitle { + opacity: 1; +} + +row.entry.warning .suggested-action, +row.spin.warning .suggested-action { + background-color: #FBC02D; + color: rgba(0, 0, 0, 0.87); +} + +row.entry.success text > selection:focus-within, +row.spin.success text > selection:focus-within { + background-color: alpha(#66BB6A, 0.2); +} + +row.entry.success text > cursor-handle > contents, +row.spin.success text > cursor-handle > contents { + background-color: currentColor; +} + +row.entry.success .dim-label, row.entry.success row.expander image.expander-row-arrow, row.expander row.entry.success image.expander-row-arrow, row.entry.success .subtitle, +row.spin.success .dim-label, +row.spin.success row.expander image.expander-row-arrow, +row.expander row.spin.success image.expander-row-arrow, +row.spin.success .subtitle { + opacity: 1; +} + +row.entry.success .suggested-action, +row.spin.success .suggested-action { + background-color: #66BB6A; + color: #FFFFFF; +} + +row.combo image.dropdown-arrow:disabled { + filter: opacity(0.45); +} + +row.combo listview.inline { + background: none; + border: none; + box-shadow: none; + color: inherit; +} + +row.combo listview.inline, row.combo listview.inline:disabled { + background: none; + color: inherit; +} + +row.combo popover > contents { + min-width: 120px; +} + +list.content > row, list.content > row.expander row.header, +list.boxed-list > row, +list.boxed-list > row.expander row.header, row.expander list.nested > row { + border-bottom: 1px solid rgba(255, 255, 255, 0.12); +} + +list.content > row:not(:selected).activatable:hover, list.content > row.expander row.header:not(:selected).activatable:hover, +list.boxed-list > row:not(:selected).activatable:hover, +list.boxed-list > row.expander row.header:not(:selected).activatable:hover, row.expander list.nested > row:not(:selected).activatable:hover { + background-color: alpha(currentColor, 0.08); +} + +list.content > row:not(:selected).activatable:active, list.content > row.expander row.header:not(:selected).activatable:active, +list.boxed-list > row:not(:selected).activatable:active, +list.boxed-list > row.expander row.header:not(:selected).activatable:active, row.expander list.nested > row:not(:selected).activatable:active { + background-color: alpha(currentColor, 0.12); +} + +list.content > row:not(:selected).activatable.has-open-popup, list.content > row.expander row.header:not(:selected).activatable.has-open-popup, +list.boxed-list > row:not(:selected).activatable.has-open-popup, +list.boxed-list > row.expander row.header:not(:selected).activatable.has-open-popup, row.expander list.nested > row:not(:selected).activatable.has-open-popup { + background-color: alpha(currentColor, 0.03); +} + +row.expander { + background: none; + padding: 0px; +} + +row.expander > box > list { + background: none; + color: inherit; +} + +row.expander list.nested { + color: inherit; +} + +row.expander image.expander-row-arrow { + transition: -gtk-icon-transform 200ms cubic-bezier(0, 0, 0.2, 1); +} + +row.expander image.expander-row-arrow:dir(ltr) { + margin-left: 6px; +} + +row.expander image.expander-row-arrow:dir(rtl) { + margin-right: 6px; +} + +row.expander image.expander-row-arrow:dir(ltr) { + -gtk-icon-transform: rotate(0.5turn); +} + +row.expander image.expander-row-arrow:dir(rtl) { + -gtk-icon-transform: rotate(-0.5turn); +} + +row.expander image.expander-row-arrow:disabled { + filter: opacity(0.45); +} + +row.expander:checked image.expander-row-arrow { + -gtk-icon-transform: rotate(0turn); + opacity: 1; +} + +row.expander:checked image.expander-row-arrow:not(:disabled) { + color: #b7bdf8; +} + +.osd row.expander:checked image.expander-row-arrow:not(:disabled) { + color: inherit; +} + +list.content > row.expander, +list.boxed-list > row.expander { + border: none; +} + +list.content > row:first-child, list.content > row:first-child.expander row.header, +list.boxed-list > row:first-child, +list.boxed-list > row:first-child.expander row.header { + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +list.content > row:last-child, list.content > row:last-child.expander:not(:checked), list.content > row:last-child.expander:not(:checked) row.header, list.content > row:last-child.expander:checked list.nested, list.content > row:last-child.expander:checked list.nested > row:last-child, +list.boxed-list > row:last-child, +list.boxed-list > row:last-child.expander:not(:checked), +list.boxed-list > row:last-child.expander:not(:checked) row.header, +list.boxed-list > row:last-child.expander:checked list.nested, +list.boxed-list > row:last-child.expander:checked list.nested > row:last-child { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + border-bottom-width: 0; +} + +columnview > listview > row { + padding: 0; +} + +columnview > listview > row > cell { + padding: 8px 6px; +} + +columnview > listview > row > cell:not(:first-child) { + border-left: 1px solid transparent; +} + +columnview.column-separators > listview > row > cell { + border-left-color: rgba(255, 255, 255, 0.12); +} + +columnview.data-table > listview > row > cell { + padding-top: 2px; + padding-bottom: 2px; +} + +treeexpander { + border-spacing: 6px; +} + +columnview row:not(:selected) cell editablelabel:not(.editing):focus-within { + outline: 2px solid alpha(currentColor, 0.06); +} + +columnview row:not(:selected) cell editablelabel.editing:focus-within { + outline: 2px solid #b7bdf8; +} + +columnview row:not(:selected) cell editablelabel.editing text selection { + color: rgba(0, 0, 0, 0.87); + background-color: #b7bdf8; +} + +/********************* + * App Notifications * + *********************/ +.app-notification { + margin: 6px; + border-spacing: 0; + padding: 0; + border: none; + background-image: none; +} + +.app-notification button.text-button:not(:disabled) { + color: #b7bdf8; +} + +.app-notification > box > label { + margin-left: 9px; +} + +.app-notification.frame, +.app-notification border { + border: none; +} + +/************* + * Expanders * + *************/ +expander { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); + min-width: 16px; + min-height: 16px; + color: rgba(255, 255, 255, 0.7); + -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); +} + +expander:dir(rtl) { + -gtk-icon-source: -gtk-icontheme("pan-end-symbolic-rtl"); +} + +expander:hover, expander:active { + color: #FFFFFF; +} + +expander:checked { + -gtk-icon-source: -gtk-icontheme("pan-down-symbolic"); +} + +expander:disabled { + color: rgba(255, 255, 255, 0.32); +} + +expander-widget > box > title { + border-radius: 6px; +} + +expander-widget > box > title:hover > expander { + color: rgba(255, 255, 255, 0.7); +} + +.navigation-sidebar:not(decoration):not(window):drop(active):focus, .navigation-sidebar:not(decoration):not(window):drop(active), +placessidebar:not(decoration):not(window):drop(active):focus, +placessidebar:not(decoration):not(window):drop(active), +stackswitcher:not(decoration):not(window):drop(active):focus, +stackswitcher:not(decoration):not(window):drop(active), +expander-widget:not(decoration):not(window):drop(active):focus, +expander-widget:not(decoration):not(window):drop(active) { + box-shadow: none; +} + +/************ + * Calendar * + ************/ +calendar { + padding: 0; + border: 1px solid rgba(255, 255, 255, 0.12); + border-radius: 6px; + color: #FFFFFF; +} + +calendar:disabled { + color: rgba(255, 255, 255, 0.5); +} + +calendar:selected { + border-radius: 6px; +} + +calendar > header { + padding: 3px; + border-bottom: 1px solid rgba(255, 255, 255, 0.12); +} + +calendar > header > button { + min-height: 24px; +} + +calendar > grid { + margin: 3px; +} + +calendar > grid > label { + border-radius: 6px; + margin: 0; +} + +calendar > grid > label.today:selected { + box-shadow: none; +} + +calendar > grid > label:focus { + outline-style: none; +} + +calendar > grid > label.day-number { + padding: 6px; +} + +calendar > grid > label.day-number.other-month { + color: alpha(currentColor, 0.3); +} + +/*********** + * Dialogs * + ***********/ +window.messagedialog .response-area button, window.dialog.message .dialog-action-area > button { + border-radius: 0; + min-height: 28px; + padding: 6px 12px; + margin: 0; + border: none; +} + +window.messagedialog .response-area button:first-child, window.dialog.message .dialog-action-area > button:first-child { + border-radius: 0 0 0 12px; +} + +window.messagedialog .response-area button:last-child, window.dialog.message .dialog-action-area > button:last-child { + border-radius: 0 0 12px 0; +} + +window.messagedialog .response-area button:only-child, window.dialog.message .dialog-action-area > button:only-child { + border-radius: 0 0 12px 12px; +} + +window.dialog.message.background { + background-color: #363a4f; +} + +window.dialog.message box.dialog-vbox.vertical { + margin-top: 6px; + border-spacing: 24px; +} + +window.dialog.message box.dialog-vbox.vertical > box.vertical { + margin-bottom: 6px; +} + +window.dialog.message box.dialog-vbox.vertical > box > box > box > label.title { + font-weight: 800; + font-size: 15pt; +} + +window.dialog.message .titlebar { + min-height: 24px; + border-style: none; + box-shadow: inset 0 1px rgba(255, 255, 255, 0.1); + background-color: #363a4f; + color: #FFFFFF; +} + +window.dialog.message .titlebar:backdrop { + background-color: #363a4f; + color: rgba(255, 255, 255, 0.7); +} + +window.dialog.message .dialog-action-area { + border-top: 1px solid rgba(255, 255, 255, 0.12); + margin: 0; + border-spacing: 0; +} + +window.dialog.message .dialog-action-area > button { + border: none; +} + +window.dialog.message .dialog-action-area > button:not(:last-child) { + border-right: 1px solid rgba(255, 255, 255, 0.12); +} + +window.dialog.message .dialog-action-area > button.suggested-action:not(:disabled) { + color: #b7bdf8; +} + +window.dialog.message .dialog-action-area > button.destructive-action:not(:disabled) { + color: #F44336; +} + +window.aboutdialog.background.csd scrolledwindow.frame, window.aboutdialog.background.csd scrolledwindow.frame > viewport.view, window.aboutdialog.background.csd scrolledwindow.frame > textview.view, window.aboutdialog.background.csd scrolledwindow.frame > textview.view > text { + border-radius: 6px; +} + +/******************** + * AdwMessageDialog * + ********************/ +window.messagedialog { + background-color: #363a4f; + color: #FFFFFF; +} + +window.messagedialog .message-area { + padding: 24px 30px; + border-spacing: 10px; +} + +window.messagedialog .response-area button { + margin: 0; +} + +window.messagedialog .response-area button:first-child { + margin-left: 0; +} + +window.messagedialog .response-area button:last-child { + margin-right: 0; +} + +window.messagedialog .response-area button.suggested { + color: #b7bdf8; +} + +window.messagedialog .response-area button.destructive { + color: #F44336; +} + +filechooser .dialog-action-box { + border-top: 1px solid rgba(255, 255, 255, 0.12); +} + +filechooser #pathbarbox { + border-bottom: 1px solid rgba(255, 255, 255, 0.12); + background-color: #24273a; +} + +filechooser stack.view frame > border { + border: none; +} + +filechooserbutton > button > box { + border-spacing: 6px; +} + +filechooserbutton:drop(active) { + box-shadow: none; + border-color: transparent; +} + +/*********** + * Sidebar * + ***********/ +.sidebar { + border-style: none; + background-color: #181926; +} + +.sidebar listview.view, +.sidebar list { + background-color: transparent; + color: inherit; +} + +stacksidebar.sidebar:dir(ltr), stacksidebar.sidebar.left, stacksidebar.sidebar.left:dir(rtl) { + box-shadow: inset -1px 0 rgba(255, 255, 255, 0.12); +} + +stacksidebar.sidebar:dir(rtl), stacksidebar.sidebar.right, stacksidebar.sidebar.right:dir(ltr) { + box-shadow: inset 1px 0 rgba(255, 255, 255, 0.12); +} + +.sidebar-pane stacksidebar.sidebar, leaflet.unfolded > box > stacksidebar.sidebar { + box-shadow: none; +} + +stacksidebar list { + padding: 6px; + background-color: #181926; +} + +stacksidebar row { + min-height: 24px; + padding: 6px; + border-radius: 6px; +} + +stacksidebar row:selected { + font-weight: 500; +} + +stacksidebar row + row { + margin-top: 4px; +} + +stacksidebar row > label { + padding-left: 6px; + padding-right: 6px; + color: inherit; +} + +separator.sidebar { + background-color: rgba(255, 255, 255, 0.12); + border-right: none; +} + +separator.sidebar.selection-mode, .selection-mode separator.sidebar { + background-color: rgba(255, 255, 255, 0.12); +} + +/********************** + * Navigation Sidebar * + **********************/ +.navigation-sidebar { + padding: 4.5px 0; + border-right: none; +} + +.navigation-sidebar, .navigation-sidebar.view, .navigation-sidebar.view:disabled { + background-color: transparent; + color: inherit; +} + +.navigation-sidebar.background, .navigation-sidebar.background:disabled { + background-color: #181926; + color: rgba(255, 255, 255, 0.7); +} + +.navigation-sidebar > separator { + margin: 4.5px 0; +} + +.navigation-sidebar > row { + min-height: 24px; + padding: 6px; + border-radius: 6px; + margin: 1.5px 6px; +} + +/**************** + * File chooser * + ****************/ +row image.sidebar-icon { + transition: color 75ms cubic-bezier(0, 0, 0.2, 1); + color: rgba(255, 255, 255, 0.7); +} + +row image.sidebar-icon:disabled { + color: rgba(255, 255, 255, 0.32); +} + +placessidebar > viewport.frame { + border-style: none; +} + +placessidebar list > separator { + margin: 3px 0; +} + +placessidebar row:selected { + font-weight: 500; +} + +placessidebar row image.sidebar-icon { + color: inherit; + opacity: 0.75; +} + +placessidebar row image.sidebar-icon:dir(ltr) { + padding-right: 8px; +} + +placessidebar row image.sidebar-icon:dir(rtl) { + padding-left: 8px; +} + +placessidebar row label.sidebar-label { + color: inherit; +} + +placessidebar row label.sidebar-label:dir(ltr) { + padding-right: 2px; +} + +placessidebar row label.sidebar-label:dir(rtl) { + padding-left: 2px; +} + +placessidebar row.sidebar-placeholder-row { + background-color: alpha(currentColor, 0.08); +} + +placessidebar row.sidebar-new-bookmark-row { + color: #b7bdf8; +} + +placessidebar row.sidebar-new-bookmark-row image.sidebar-icon { + color: #b7bdf8; +} + +placessidebar row:drop(active) { + background-color: alpha(currentColor, 0.08); +} + +placesview .server-list-button > image { + transition: 200ms cubic-bezier(0, 0, 0.2, 1); + -gtk-icon-transform: rotate(0turn); +} + +placesview .server-list-button:checked > image { + transition: 200ms cubic-bezier(0, 0, 0.2, 1); + -gtk-icon-transform: rotate(-0.5turn); +} + +placesview > actionbar > revealer > box > label { + border-spacing: 6px; +} + +/********* + * Paned * + *********/ +paned > separator { + min-width: 1px; + min-height: 1px; + -gtk-icon-source: none; + border-style: none; + background-color: transparent; + background-image: image(#3e4152); + background-size: 1px 1px; + background-clip: content-box; + box-shadow: none; +} + +paned > separator.wide { + min-width: 6px; + min-height: 6px; + background-color: #24273a; + background-image: image(#3e4152), image(#3e4152); + background-size: 1px 1px, 1px 1px; +} + +paned.horizontal > separator { + background-repeat: repeat-y; +} + +paned.horizontal > separator:dir(ltr) { + margin: 0 -8px 0 0; + padding: 0 8px 0 0; + background-position: left; +} + +paned.horizontal > separator:dir(rtl) { + margin: 0 0 0 -8px; + padding: 0 0 0 8px; + background-position: right; +} + +paned.horizontal > separator.wide { + margin: 0; + padding: 0; + background-repeat: repeat-y, repeat-y; + background-position: left, right; +} + +paned.vertical > separator { + margin: 0 0 -8px 0; + padding: 0 0 8px 0; + background-repeat: repeat-x; + background-position: top; +} + +paned.vertical > separator.wide { + margin: 0; + padding: 0; + background-repeat: repeat-x, repeat-x; + background-position: bottom, top; +} + +/************ + * GtkVideo * + ************/ +video { + background: black; + border-radius: 6px; +} + +video image.osd { + min-width: 64px; + min-height: 64px; + border-radius: 9999px; + border: none; +} + +/************** + * GtkInfoBar * + **************/ +infobar > revealer > box { + padding: 6px; + border-spacing: 12px; + border-bottom: 1px solid rgba(255, 255, 255, 0.12); + box-shadow: none; +} + +infobar.info > revealer > box, infobar.info:hover > revealer > box, infobar.info:backdrop > revealer > box { + background-color: #24273a; + color: #FFFFFF; +} + +infobar.info > revealer > box button.text-button:not(:disabled):not(.suggested-action):not(.destructive-action), infobar.info:hover > revealer > box button.text-button:not(:disabled):not(.suggested-action):not(.destructive-action), infobar.info:backdrop > revealer > box button.text-button:not(:disabled):not(.suggested-action):not(.destructive-action) { + color: #b7bdf8; +} + +infobar.action > revealer > box, infobar.action:backdrop > revealer > box, infobar.question > revealer > box, infobar.question:backdrop > revealer > box { + background-color: #b7bdf8; + color: rgba(0, 0, 0, 0.87); +} + +infobar.action > revealer > box button, infobar.action > revealer > box button:hover, infobar.action > revealer > box button:focus, infobar.action > revealer > box button:active, infobar.action > revealer > box button:checked, infobar.action > revealer > box button.text-button:not(:disabled), infobar.action:backdrop > revealer > box button, infobar.action:backdrop > revealer > box button:hover, infobar.action:backdrop > revealer > box button:focus, infobar.action:backdrop > revealer > box button:active, infobar.action:backdrop > revealer > box button:checked, infobar.action:backdrop > revealer > box button.text-button:not(:disabled), infobar.question > revealer > box button, infobar.question > revealer > box button:hover, infobar.question > revealer > box button:focus, infobar.question > revealer > box button:active, infobar.question > revealer > box button:checked, infobar.question > revealer > box button.text-button:not(:disabled), infobar.question:backdrop > revealer > box button, infobar.question:backdrop > revealer > box button:hover, infobar.question:backdrop > revealer > box button:focus, infobar.question:backdrop > revealer > box button:active, infobar.question:backdrop > revealer > box button:checked, infobar.question:backdrop > revealer > box button.text-button:not(:disabled) { + color: rgba(0, 0, 0, 0.87); +} + +infobar.action > revealer > box *:link, infobar.action:backdrop > revealer > box *:link, infobar.question > revealer > box *:link, infobar.question:backdrop > revealer > box *:link { + color: rgba(0, 0, 0, 0.87); +} + +infobar.action:hover > revealer > box, infobar.question:hover > revealer > box { + background-color: #a0a8f6; +} + +infobar.warning > revealer > box, infobar.warning:backdrop > revealer > box { + background-color: #FBC02D; + color: rgba(0, 0, 0, 0.87); +} + +infobar.warning > revealer > box button, infobar.warning > revealer > box button:hover, infobar.warning > revealer > box button:focus, infobar.warning > revealer > box button:active, infobar.warning > revealer > box button:checked, infobar.warning > revealer > box button.text-button:not(:disabled), infobar.warning:backdrop > revealer > box button, infobar.warning:backdrop > revealer > box button:hover, infobar.warning:backdrop > revealer > box button:focus, infobar.warning:backdrop > revealer > box button:active, infobar.warning:backdrop > revealer > box button:checked, infobar.warning:backdrop > revealer > box button.text-button:not(:disabled) { + color: rgba(0, 0, 0, 0.87); +} + +infobar.warning > revealer > box *:link, infobar.warning:backdrop > revealer > box *:link { + color: rgba(0, 0, 0, 0.87); +} + +infobar.warning:hover > revealer > box { + background-color: #fbb814; +} + +infobar.error > revealer > box, infobar.error:backdrop > revealer > box { + background-color: #F44336; + color: #FFFFFF; +} + +infobar.error > revealer > box button, infobar.error > revealer > box button:hover, infobar.error > revealer > box button:focus, infobar.error > revealer > box button:active, infobar.error > revealer > box button:checked, infobar.error > revealer > box button.text-button:not(:disabled), infobar.error:backdrop > revealer > box button, infobar.error:backdrop > revealer > box button:hover, infobar.error:backdrop > revealer > box button:focus, infobar.error:backdrop > revealer > box button:active, infobar.error:backdrop > revealer > box button:checked, infobar.error:backdrop > revealer > box button.text-button:not(:disabled) { + color: #FFFFFF; +} + +infobar.error > revealer > box *:link, infobar.error:backdrop > revealer > box *:link { + color: #FFFFFF; +} + +infobar.error:hover > revealer > box { + background-color: #f32c1e; +} + +/************ + * Tooltips * + ************/ +tooltip { + padding: 6px 12px; + box-shadow: none; + border: none; +} + +tooltip.background { + background-color: rgba(18, 19, 29, 0.9); + color: #FFFFFF; + box-shadow: 0 2px 3px -1px rgba(0, 0, 0, 0.05), 0 4px 6px 0 rgba(0, 0, 0, 0.06), 0 1px 10px 0 rgba(0, 0, 0, 0.05); + border-radius: 6px; + margin: 2px 6px 8px 6px; +} + +tooltip > box { + border-spacing: 6px; +} + +/***************** + * Color Chooser * + *****************/ +colorswatch.top { + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +colorswatch.top overlay { + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +colorswatch.bottom { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} + +colorswatch.bottom overlay { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} + +colorswatch.left, colorswatch:first-child:not(.top) { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} + +colorswatch.left overlay, colorswatch:first-child:not(.top) overlay { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} + +colorswatch.right, colorswatch:last-child:not(.bottom) { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} + +colorswatch.right overlay, colorswatch:last-child:not(.bottom) overlay { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} + +colorswatch.dark { + color: #FFFFFF; +} + +colorswatch.light { + color: rgba(0, 0, 0, 0.87); +} + +colorchooser colorswatch:hover { + transition: box-shadow 200ms ease-out; + box-shadow: 0 0 0 2px #b7bdf8; +} + +colorswatch#add-color-button { + border-radius: 6px 0 0 6px; + color: #FFFFFF; +} + +colorswatch#add-color-button:only-child { + border-radius: 6px; +} + +colorswatch#add-color-button overlay { + background-color: rgba(255, 255, 255, 0.04); +} + +colorswatch#add-color-button overlay:hover { + background-color: rgba(255, 255, 255, 0.12); + box-shadow: none; +} + +colorswatch#add-color-button overlay:active { + background-color: rgba(255, 255, 255, 0.3); +} + +colorswatch:disabled { + opacity: 0.5; +} + +colorswatch:disabled overlay { + box-shadow: none; +} + +colorswatch#editor-color-sample { + border-radius: 6px; +} + +colorswatch#editor-color-sample overlay { + border-radius: 6px; +} + +colorswatch#editor-color-sample overlay:hover { + box-shadow: 0 2px 3px -2px rgba(0, 0, 0, 0.3), 0 1px 2px -1px rgba(0, 0, 0, 0.24), 0 1px 2px -1px rgba(0, 0, 0, 0.17); +} + +colorchooser .popover.osd { + transition: box-shadow 200ms ease-out; + border-radius: 6px; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15), 0 3px 3px 0 rgba(0, 0, 0, 0.18), 0 3px 6px 0 rgba(0, 0, 0, 0.12), inset 0 1px rgba(255, 255, 255, 0.1); + background-color: #363a4f; +} + +colorchooser .popover.osd:backdrop { + box-shadow: 0 4px 3px -3px rgba(0, 0, 0, 0.2), 0 2px 2px -1px rgba(0, 0, 0, 0.24), 0 1px 3px 0 rgba(0, 0, 0, 0.12), inset 0 1px rgba(255, 255, 255, 0.1); +} + +/******** + * Misc * + ********/ +.content-view { + background-color: #24273a; +} + +/********************** + * Window Decorations * + **********************/ +window { + border: none; +} + +window.csd { + border-radius: 12px; + outline-offset: -1px; + outline: 1px solid rgba(255, 255, 255, 0.1); + margin: 0; + transition: none; + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 15px 16px 2px rgba(0, 0, 0, 0.14), 0 6px 18px 5px rgba(0, 0, 0, 0.12), 0 0 36px transparent, 0 0 0 1px rgba(0, 0, 0, 0.75); +} + +window.csd:backdrop { + transition: box-shadow 200ms ease-out; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15), 0 3px 3px 0 rgba(0, 0, 0, 0.18), 0 3px 6px 0 rgba(0, 0, 0, 0.12), 0 0 36px transparent, 0 0 0 1px rgba(0, 0, 0, 0.75); +} + +window.csd.maximized, window.csd.fullscreen, window.csd.tiled, window.csd.tiled-top, window.csd.tiled-right, window.csd.tiled-bottom, window.csd.tiled-left { + border-radius: 0; + transition: none; +} + +window.csd.maximized, window.csd.fullscreen { + box-shadow: none; + outline: none; +} + +window.solid-csd { + margin: 0; + padding: 2px; + border-radius: 0; + background-color: #181926; + border: 1px solid #3e4152; +} + +window.solid-csd:backdrop { + background-color: #24273a; +} + +window.ssd { + box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.12); +} + +windowcontrols > button:not(.suggested-action):not(.destructive-action) { + min-height: 16px; + min-width: 16px; + padding: 10px 0; + margin-left: 4px; + margin-right: 4px; +} + +windowcontrols > button.minimize:not(.suggested-action):not(.destructive-action), windowcontrols > button.maximize:not(.suggested-action):not(.destructive-action), windowcontrols > button.close:not(.suggested-action):not(.destructive-action) { + color: transparent; + background: none; +} + +windowcontrols > button.minimize:hover:not(.suggested-action):not(.destructive-action), windowcontrols > button.minimize:active:not(.suggested-action):not(.destructive-action), windowcontrols > button.maximize:hover:not(.suggested-action):not(.destructive-action), windowcontrols > button.maximize:active:not(.suggested-action):not(.destructive-action), windowcontrols > button.close:hover:not(.suggested-action):not(.destructive-action), windowcontrols > button.close:active:not(.suggested-action):not(.destructive-action) { + box-shadow: none; +} + +windowcontrols > button.minimize:active:not(.suggested-action):not(.destructive-action) > image, windowcontrols > button.maximize:active:not(.suggested-action):not(.destructive-action) > image, windowcontrols > button.close:active:not(.suggested-action):not(.destructive-action) > image { + box-shadow: inset 0 0 0 9999px rgba(0, 0, 0, 0.25); +} + +windowcontrols > button.minimize:hover:not(.suggested-action):not(.destructive-action), windowcontrols > button.minimize:active:not(.suggested-action):not(.destructive-action), windowcontrols > button.maximize:hover:not(.suggested-action):not(.destructive-action), windowcontrols > button.maximize:active:not(.suggested-action):not(.destructive-action), windowcontrols > button.close:hover:not(.suggested-action):not(.destructive-action), windowcontrols > button.close:active:not(.suggested-action):not(.destructive-action) { + color: rgba(0, 0, 0, 0.5); +} + +windowcontrols > button.minimize:backdrop:not(.suggested-action):not(.destructive-action) > image, windowcontrols > button.maximize:backdrop:not(.suggested-action):not(.destructive-action) > image, windowcontrols > button.close:backdrop:not(.suggested-action):not(.destructive-action) > image { + background-color: rgba(255, 255, 255, 0.3); +} + +windowcontrols > button.minimize:backdrop:hover:not(.suggested-action):not(.destructive-action), windowcontrols > button.minimize:backdrop:active:not(.suggested-action):not(.destructive-action), windowcontrols > button.maximize:backdrop:hover:not(.suggested-action):not(.destructive-action), windowcontrols > button.maximize:backdrop:active:not(.suggested-action):not(.destructive-action), windowcontrols > button.close:backdrop:hover:not(.suggested-action):not(.destructive-action), windowcontrols > button.close:backdrop:active:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.5); +} + +windowcontrols > button.minimize:not(.suggested-action):not(.destructive-action) > image { + background-color: #eed49f; +} + +windowcontrols > button.minimize:active:not(.suggested-action):not(.destructive-action) > image { + background-color: #f2dfb7; +} + +windowcontrols > button.maximize:not(.suggested-action):not(.destructive-action) > image { + background-color: #a6da95; +} + +windowcontrols > button.maximize:active:not(.suggested-action):not(.destructive-action) > image { + background-color: #bce3b0; +} + +windowcontrols > button.close:not(.suggested-action):not(.destructive-action) > image { + background-color: #ed8796; +} + +windowcontrols > button.close:active:not(.suggested-action):not(.destructive-action) > image { + background-color: #f2a5b0; +} + +windowcontrols { + border-spacing: 6px; +} + +windowcontrols:not(.empty).start:dir(ltr), windowcontrols:not(.empty).end:dir(rtl) { + margin-right: 6px; + margin-left: 6px; +} + +windowcontrols:not(.empty).start:dir(rtl), windowcontrols:not(.empty).end:dir(ltr) { + margin-left: 6px; + margin-right: 6px; +} + +windowcontrols > button:not(.suggested-action):not(.destructive-action) > image { + border-radius: 100%; + padding: 0; +} + +.view:selected, iconview:selected, gridview > child:selected, columnview.view:selected, +treeview.view:selected, calendar:selected, calendar > grid > label.day-number:selected { + background-color: alpha(currentColor, 0.06); +} + +flowbox > flowboxchild:selected, calendar > grid > label.today { + color: #b7bdf8; + background-color: rgba(183, 189, 248, 0.2); +} + +textview text selection:focus, textview text selection, label > selection, +entry > text > selection, spinbutton > text > selection, +entry headerbar popover.background entry > text > selection, +headerbar popover.background entry entry > text > selection, calendar > grid > label.today:selected { + color: rgba(0, 0, 0, 0.87); + background-color: #b7bdf8; +} + +/********************** + * Touch Copy & Paste * + **********************/ +cursor-handle { + color: #b7bdf8; + -gtk-icon-source: -gtk-recolor(url("assets/scalable/cursor-handle-symbolic.svg")); +} + +cursor-handle.insertion-cursor:dir(ltr), cursor-handle.insertion-cursor:dir(rtl) { + padding-top: 6px; +} + +shortcuts-section { + margin: 20px; +} + +.shortcuts-search-results { + margin: 20px; + border-spacing: 24px; +} + +shortcut { + border-spacing: 6px; +} + +shortcut > .keycap { + min-width: 12px; + min-height: 26px; + margin-top: 2px; + padding-bottom: 2px; + padding-left: 8px; + padding-right: 8px; + border: solid 1px rgba(255, 255, 255, 0.12); + border-radius: 7px; + box-shadow: inset 0 -2px rgba(255, 255, 255, 0.12); + background-color: #363a4f; + color: #FFFFFF; + font-size: smaller; +} + +:not(decoration):not(window):drop(active) { + caret-color: #b7bdf8; +} + +stackswitcher { + min-height: 0; + padding: 3px; + border-radius: 9px; + background-color: rgba(255, 255, 255, 0.04); + border: none; +} + +stackswitcher.linked:not(.vertical) > button:not(.suggested-action):not(.destructive-action) { + margin: 0 0; + background-color: transparent; + border-radius: 6px; + padding: 3px 10px; +} + +stackswitcher.linked:not(.vertical) > button:not(.suggested-action):not(.destructive-action).text-button { + min-width: 100px; +} + +stackswitcher.linked:not(.vertical) > button:not(.suggested-action):not(.destructive-action):focus:not(:hover):not(:checked) { + box-shadow: none; +} + +stackswitcher.linked:not(.vertical) > button:not(.suggested-action):not(.destructive-action):hover { + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; +} + +stackswitcher.linked:not(.vertical) > button:not(.suggested-action):not(.destructive-action):active { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms, border 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.08) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; +} + +stackswitcher.linked:not(.vertical) > button:not(.suggested-action):not(.destructive-action):checked { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms, background-color 0ms; + background-color: rgba(255, 255, 255, 0.15); + color: #FFFFFF; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +stackswitcher button.text-button { + min-width: 100px; +} + +stackswitcher button.circular, +stackswitcher button.text-button.circular { + min-width: 36px; + min-height: 36px; + padding: 0; +} + +/************* + * App Icons * + *************/ +.lowres-icon { + -gtk-icon-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.icon-dropshadow { + -gtk-icon-shadow: 0 1px 12px rgba(0, 0, 0, 0.05), 0 1px 6px rgba(0, 0, 0, 0.1); +} + +/********* + * Emoji * + *********/ +popover.emoji-picker { + padding: 0; +} + +popover.emoji-picker > contents { + padding: 0; +} + +.emoji-searchbar { + padding: 6px; + border-spacing: 6px; + border-bottom: 1px solid rgba(255, 255, 255, 0.12); + background: none; +} + +.emoji-searchbar entry text { + background: none; + box-shadow: none; +} + +.emoji-toolbar { + padding: 0; + border-spacing: 3px; + border-top: 1px solid rgba(255, 255, 255, 0.12); + background: none; +} + +button.emoji-section { + margin: 0; + padding: 6px; + border-radius: 6px; +} + +button.emoji-section:checked { + color: #b7bdf8; +} + +popover.emoji-picker emoji { + font-size: x-large; + padding: 6px; + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); + border-radius: 6px; +} + +popover.emoji-picker emoji:focus, popover.emoji-picker emoji:hover { + background: alpha(currentColor, 0.08); +} + +emoji-completion-row { + min-height: 28px; + padding: 0 12px; +} + +emoji-completion-row > box { + border-spacing: 6px; + padding: 2px 6px; +} + +emoji-completion-row:focus, emoji-completion-row:hover, +emoji-completion-row emoji:hover, emoji-completion-row emoji:focus { + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; +} + +popover.entry-completion > contents { + padding: 0; +} + +.nautilus-window placesview label { + color: rgba(255, 255, 255, 0.7); +} + +.nautilus-window .floating-bar { + min-height: 32px; + padding: 0; + margin: 6px; + border-style: none; + border-radius: 6px; + background-color: #b7bdf8; + color: rgba(0, 0, 0, 0.87); + box-shadow: 0 3px 3px -2px rgba(0, 0, 0, 0.05), 0 2px 3px -1px rgba(0, 0, 0, 0.06), 0 1px 4px 0 rgba(0, 0, 0, 0.05); +} + +.nautilus-window .floating-bar button { + margin: 4px; + color: rgba(0, 0, 0, 0.87); +} + +#NautilusQueryEditor > menubutton > button.image-button { + min-width: 24px; + min-height: 24px; +} + +#NautilusQueryEditor > text, #NautilusQueryEditor > box, #NautilusQueryEditor > menubutton > button.image-button { + margin: 6px 0; +} + +#NautilusQueryEditorTag { + background-color: rgba(255, 255, 255, 0.12); +} + +#NautilusQueryEditorTag > button.image-button { + margin: 0; + padding: 0; +} + +#NautilusPathBar { + background-color: rgba(255, 255, 255, 0.04); + border-radius: 6px; + margin: 6px 0; +} + +.content-pane #NautilusPathBar { + background-color: rgba(255, 255, 255, 0.04); +} + +#NautilusPathButton { + margin: 0 3px; + border-radius: 6px; +} + +#NautilusPathButton.current-dir { + color: #FFFFFF; +} + +#NautilusPathButton.current-dir:hover, #NautilusPathButton.current-dir:active { + background: none; + box-shadow: none; +} + +.content-pane #NautilusPathButton.current-dir { + color: #FFFFFF; +} + +#NautilusPathButton:first-child { + margin-left: 0; +} + +#NautilusViewCell clamp box { + margin: 0; + border-spacing: 0; +} + +window.dialog > box > stack > box > box > notebook.frame { + border-width: 0 0 0 1px; + border-radius: 0; +} + +.display-container.card { + border-radius: 0; + box-shadow: none; + border-width: 0 0 1px 0; +} + +.display-container .history-view { + background-color: #24273a; +} + +.display-container #displayitem { + padding: 0 12px 8px 0; + font-size: 1.4em; + border-top: 1px solid rgba(255, 255, 255, 0.12); +} + +.math-buttons button { + font-size: 1.1em; + padding: 2px 6px; +} + +.math-buttons button.text-button { + padding-left: 16px; + padding-right: 16px; +} + +leaflet button.number-button { + background-color: rgba(255, 255, 255, 0.1); +} + +leaflet button.number-button:hover { + background-color: rgba(255, 255, 255, 0.2); +} + +leaflet button.number-button:active { + background-color: rgba(255, 255, 255, 0.3); +} + +label.primary-label, label.month-name, label.secondary-label { + font-size: 16pt; + font-weight: bold; + padding: 12px; +} + +label.primary-label, label.month-name { + color: #b7bdf8; +} + +label.secondary-label { + color: rgba(255, 255, 255, 0.5); +} + +calendar-view { + font-size: 10pt; +} + +calendar-view:selected { + color: #b7bdf8; + font-weight: bold; +} + +calendar-view.header, +label.header { + font-size: 10pt; + font-weight: bold; + color: rgba(255, 255, 255, 0.5); +} + +calendar-view.current, +weekgrid.current { + background-color: alpha(#b7bdf8, 0.3); +} + +popover.events { + background-color: #24273a; + padding: 0; +} + +popover.events box { + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +popover.events list { + background-color: #24273a; + border-radius: 6px; +} + +popover.events scrolledwindow { + border-width: 0; +} + +popover.events button { + border-radius: 6px; + border-top-left-radius: 0; + border-top-right-radius: 0; + border-style: solid none none; + box-shadow: none; +} + +event { + margin: 1px; + font-size: 0.9rem; +} + +event widget.content { + margin: 4px; +} + +event.timed, event:not(.slanted):not(.slanted-start):not(.slanted-end) { + border-radius: 6px; +} + +event.timed widget.edge { + border-radius: 3px; + min-width: 5px; +} + +event.slanted-start, event.slanted-end:dir(rtl) { + padding-left: 16px; + border-radius: 0 3px 3px 0; +} + +event.slanted-end, event.slanted-start:dir(rtl) { + padding-right: 16px; + border-radius: 3px 0 0 3px; +} + +event:not(.timed).color-dark { + color: white; + outline-color: rgba(0, 0, 0, 0.3); +} + +event.timed, event:not(.timed).color-light { + color: alpha(black, 0.75); + outline-color: rgba(255, 255, 255, 0.5); +} + +popover.event-popover, +popover.event-popover > contents { + padding: 0; +} + +.search-viewport { + background-color: #24273a; +} + +.calendar-list { + background-color: transparent; +} + +.calendar-list > list { + border-radius: 4px; +} + +.calendar-color-image { + -gtk-icon-filter: none; +} + +image.calendar-color-image, +button:active:not(:backdrop) .calendar-color-image, +button:checked:not(:backdrop) .calendar-color-image, +.calendars-list .calendar-color-image:not(:backdrop):not(:disabled), +.calendar-list .calendar-color-image:not(:backdrop):not(:disabled), +.sources-button:not(:backdrop):not(:disabled) .calendar-color-image { + -gtk-icon-shadow: 0 1px alpha(black, 0.1); +} + +datechooser navigator { + margin-right: 6px; + margin-left: 6px; + margin-bottom: 6px; +} + +datechooser navigator label { + font-weight: bold; +} + +datechooser navigator button.flat, +datechooser navigator button.toggle, +datechooser navigator button.image-button { + min-height: 36px; + min-width: 36px; + padding: 0; +} + +datechooser .weeknum, datechooser .weekday { + color: rgba(255, 255, 255, 0.5); + font-size: smaller; +} + +datechooser button.day { + font-size: 10pt; + font-weight: normal; + margin: 3px; + padding: 0; + min-height: 36px; + min-width: 36px; + transition: none; +} + +datechooser button.day dot { + background-color: #FFFFFF; + border-radius: 50%; + min-height: 3px; + min-width: 3px; +} + +datechooser button.day:selected, datechooser button.day.today:selected { + background-color: #b7bdf8; + color: rgba(0, 0, 0, 0.87); + font-weight: bold; +} + +datechooser button.day:selected dot, datechooser button.day.today:selected dot { + background-color: rgba(0, 0, 0, 0.87); +} + +datechooser button.day.today { + color: #b7bdf8; +} + +datechooser button.day.today dot { + background-color: #b7bdf8; +} + +datechooser button.day.other-month:not(:hover), datechooser button.day.other-month:backdrop { + color: alpha(currentColor, 0.1); +} + +datechooser button.day.other-month:not(:hover) dot, datechooser button.day.other-month:backdrop dot { + background-color: alpha(currentColor, 0.1); +} + +datechooser button.day.other-month:hover:not(:backdrop) { + color: rgba(255, 255, 255, 0.5); +} + +datechooser button.day.other-month:hover:not(:backdrop) dot { + background-color: rgba(255, 255, 255, 0.5); +} + +.week-header { + padding: 0; +} + +.week-header > box:first-child { + border-bottom: 1px solid rgba(255, 255, 255, 0.12); +} + +.week-header .week-number { + font-size: 16pt; + font-weight: bold; + padding: 12px 12px 18px 12px; + color: rgba(255, 255, 255, 0.3); +} + +.week-header.week-temperature { + font-size: 10pt; + font-weight: bold; + color: rgba(255, 255, 255, 0.5); +} + +.week-header.lines { + color: rgba(255, 255, 255, 0.12); +} + +weekhourbar > label { + font-size: 10pt; + padding: 4px 6px; +} + +.week-view .lines { + color: rgba(255, 255, 255, 0.12); +} + +weekgrid > widget.now-strip { + background-color: alpha(#b7bdf8, 0.8); + margin: 0 0 0 1px; + min-height: 3px; +} + +weekgrid:selected, weekgrid.dnd, +.week-header:selected, +.week-header.dnd { + background-color: alpha(#b7bdf8, 0.25); +} + +monthcell { + border: solid 1px rgba(255, 255, 255, 0.12); + border-width: 1px 0 0 1px; + background-color: transparent; + transition: background-color 200ms; +} + +monthcell:hover:not(.out-of-month):not(.today) { + background-color: #181926; + transition: background-color 200ms; + color: #FFFFFF; +} + +monthcell:selected { + background-color: alpha(#b7bdf8, 0.1); +} + +monthcell:selected:hover { + background-color: alpha(#b7bdf8, 0.2); +} + +monthcell:selected label.day-label { + font-weight: bold; +} + +monthcell:nth-child(7n + 1) { + border-left-width: 0; +} + +monthcell.today { + background-color: alpha(#b7bdf8, 0.2); +} + +monthcell.today:hover { + background-color: alpha(#b7bdf8, 0.3); + color: #b7bdf8; +} + +monthcell.today:selected { + background-color: alpha(#b7bdf8, 0.25); +} + +monthcell.today:selected:hover { + background-color: alpha(#b7bdf8, 0.35); +} + +monthcell label { + color: #FFFFFF; + font-size: 0.9rem; +} + +monthcell label.day-label { + font-size: 1rem; +} + +monthcell.out-of-month { + background-color: rgba(255, 255, 255, 0.04); +} + +monthcell.out-of-month label { + color: rgba(255, 255, 255, 0.7); +} + +monthcell button { + padding: 0 6px; + border-radius: 0; + border-bottom: none; + border-right: none; +} + +monthpopover > box { + margin: 0; + padding: 0; + background-color: transparent; +} + +.notes-section box > textview { + border-radius: 6px; + padding: 6px; +} + +.notes-section box > textview > text { + background: none; +} + +agenda-view list > row { + padding: 2px 12px; +} + +agenda-view list > label { + padding: 6px 12px; +} + +agenda-view > scrolledwindow > viewport > list.background { + background-color: transparent; +} + +label.no-events { + font-style: italic; +} + +searchbutton > popover > arrow { + background: none; + border: none; +} + +datechooser { + padding: 6px; +} + +datechooser .current-week { + background: alpha(#181926, 0.7); + color: #FFFFFF; + border-radius: 6px; +} + +menubutton.sources-button { + margin-top: 0; + margin-bottom: 0; + border-radius: 0; + border-top-style: none; + border-bottom-style: none; +} + +menubutton.sources-button:hover:not(:backdrop) { + background-image: none; + text-shadow: none; +} + +menubutton.sources-button > button { + border-radius: 0; +} + +menubutton.sources-button > button .title { + font-size: 10pt; + font-weight: normal; + padding: 0 6px; +} + +menubutton.sources-button > button .subtitle { + font-size: 8pt; + padding: 0 6px; +} + +menubutton.sources-button > button .calendar-color-image { + -gtk-icon-size: 12px; +} + +menubutton stack > box { + border-spacing: 6px; +} + +.topbar headerbar menubutton.sources-button > button { + border-radius: 0 0 6px 6px; +} + +.contacts-contact-list list.navigation-sidebar { + background: none; +} + +.details-page { + margin: 24px 0px; +} + +.installed-overlay-box { + font-size: smaller; + background-color: #b7bdf8; + border-radius: 0; + color: rgba(0, 0, 0, 0.87); + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.2); +} + +screenshot-carousel box.frame { + border-width: 1px 0; + border-radius: 0; +} + +screenshot-carousel button, +.featured-carousel button { + margin: 12px; +} + +.screenshot-image-main .image1, +.screenshot-image-main .image2 { + margin-top: 6px; + margin-bottom: 12px; + margin-left: 6px; + margin-right: 6px; +} + +.app-tile-label { + font-size: 105%; +} + +.review-textbox { + padding: 6px; +} + +.origin-rounded-box { + background-color: rgba(255, 255, 255, 0.12); + border-radius: 9999px; + padding: 4px; +} + +.origin-beta { + color: #FBC02D; +} + +.origin-button > button { + padding: 3px 9px; +} + +.card flowboxchild.card { + border: none; + box-shadow: none; + padding: 0; + background: none; +} + +.category-tile.card { + padding: 21px; + border: none; + border-radius: 6px; + min-width: 140px; + font-weight: 900; + font-size: larger; + box-shadow: 0 3px 3px -2px rgba(0, 0, 0, 0.05), 0 2px 3px -1px rgba(0, 0, 0, 0.06), 0 1px 4px 0 rgba(0, 0, 0, 0.05); +} + +.category-tile.card.category-tile-iconless { + padding: 9px 15px; + min-width: 130px; + font-size: 105%; + font-weight: normal; + box-shadow: none; + background-color: rgba(255, 255, 255, 0.04); +} + +.category-tile.card.category-create { + background: linear-gradient(180deg, #ce8cd7 0%, #2861c6 100%); + color: white; +} + +.category-tile.card.category-create:hover { + background: linear-gradient(180deg, shade(#ce8cd7, 1.07) 0%, shade(#2861c6, 1.1) 100%); + color: white; +} + +.category-tile.card.category-create:active { + background: linear-gradient(180deg, shade(#ce8cd7, 0.95) 0%, shade(#2861c6, 0.95) 100%); + color: white; +} + +.category-tile.card.category-develop { + background: #5e5c64; + color: white; +} + +.category-tile.card.category-develop:hover { + background: shade(#5e5c64, 1.2); + color: white; +} + +.category-tile.card.category-develop:active { + background-color: shade(#5e5c64, 0.95); + color: white; +} + +.category-tile.card.category-learn { + background: linear-gradient(180deg, #2ec27e 30%, #27a66c 100%); + color: white; +} + +.category-tile.card.category-learn:hover { + background: linear-gradient(180deg, shade(#2ec27e, 1.06) 30%, shade(#27a66c, 1.06) 100%); + color: white; +} + +.category-tile.card.category-learn:active { + background: linear-gradient(180deg, shade(#2ec27e, 0.95) 30%, shade(#27a66c, 0.95) 100%); + color: white; +} + +.category-tile.card.category-play { + background: linear-gradient(75deg, #f9e2a7 0%, #eb5ec3 50%, #6d53e0 100%); + color: #393484; +} + +.category-tile.card.category-play:hover { + background: linear-gradient(75deg, shade(#f9e2a7, 1.07) 0%, shade(#eb5ec3, 1.07) 50%, shade(#6d53e0, 1.07) 100%); + color: #393484; +} + +.category-tile.card.category-play:active { + background: linear-gradient(75deg, shade(#f9e2a7, 0.97) 0%, shade(#eb5ec3, 0.95) 50%, shade(#6d53e0, 1.07) 100%); + color: #393484; +} + +.category-tile.card.category-socialize { + background: linear-gradient(90deg, #ef4e9b 0%, #f77466 100%); + color: rgba(255, 255, 255, 0.7); +} + +.category-tile.card.category-socialize:hover { + background: linear-gradient(90deg, shade(#ef4e9b, 1.08) 0%, shade(#f77466, 1.08) 100%); +} + +.category-tile.card.category-socialize:active { + background: linear-gradient(90deg, shade(#ef4e9b, 0.95) 0%, shade(#f77466, 0.95) 100%); +} + +.category-tile.card.category-work { + padding: 1px; + /* FIXME: work around https://gitlab.gnome.org/GNOME/gtk/-/issues/4324 */ + color: #1c71d8; + background-color: #fdf8d7; + background-image: linear-gradient(rgba(255, 255, 255, 0.12) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 255, 255, 0.12) 1px, transparent 1px); + background-size: 10px 10px, 10px 10px; + background-position: -1px -4px, center -1px; +} + +.category-tile.card.category-work:hover { + color: #1c71d8; + background-color: #fefcef; + background-image: linear-gradient(rgba(255, 255, 255, 0.12) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 255, 255, 0.12) 1px, transparent 1px); +} + +.category-tile.card.category-work:active { + color: #1c71d8; + background-color: #fcf4bf; + background-image: linear-gradient(rgba(255, 255, 255, 0.12) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 255, 255, 0.12) 1px, transparent 1px); +} + +clamp.medium .category-tile:not(.category-tile-iconless), +clamp.large .category-tile:not(.category-tile-iconless) { + font-size: larger; +} + +.featured-tile { + padding: 0; + box-shadow: none; + color: #FFFFFF; +} + +.featured-tile label.title-1 { + margin-top: 6px; + margin-bottom: 6px; +} + +.featured-tile.narrow label.title-1 { + font-size: 16pt; +} + +.application-details-infobar, .application-details-infobar.info { + background-color: rgba(255, 255, 255, 0.04); + color: #FFFFFF; + border: 1px solid rgba(255, 255, 255, 0.12); +} + +.application-details-infobar.warning { + background-color: #FBC02D; + color: rgba(0, 0, 0, 0.87); + border: 1px solid rgba(0, 0, 0, 0.12); +} + +@keyframes install-progress-unknown-move { + 0% { + background-position: 0%; + } + 50% { + background-position: 100%; + } + 100% { + background-position: 0%; + } +} + +.application-details-description .button { + padding-left: 24px; + padding-right: 24px; +} + +.install-progress { + background-image: linear-gradient(to top, #b7bdf8 2px, alpha(#b7bdf8, 0) 2px); + background-repeat: no-repeat; + background-position: 0 bottom; + background-size: 0; + transition: none; +} + +.install-progress:dir(rtl) { + background-position: 100% bottom; +} + +.review-row > * { + margin: 12px; +} + +.review-row button { + font-size: smaller; +} + +.review-row .vote-buttons button { + margin-right: -1px; +} + +.review-row .vote-buttons button:not(:first-child) { + border-image: linear-gradient(to top, rgba(255, 255, 255, 0.12), rgba(255, 255, 255, 0.12)) 0 0 0 1/5px 0 5px 1px; +} + +.review-row .vote-buttons button:hover, +.review-row .vote-buttons button:active, +.review-row .vote-buttons button:hover + button, +.review-row .vote-buttons button:active + button { + border-image: none; +} + +review-bar { + color: rgba(255, 255, 255, 0.5); + background-image: none; + background-color: rgba(255, 255, 255, 0.3); +} + +.review-histogram star-image { + color: rgba(255, 255, 255, 0.5); +} + +.version-arrow-label { + font-size: x-small; +} + +.overview-more-button { + font-size: smaller; + padding: 0 16px; +} + +.app-row-origin-text { + font-size: smaller; +} + +.app-listbox-header { + padding: 6px; + border-bottom: 1px solid rgba(255, 255, 255, 0.12); +} + +.image-list { + background-color: transparent; +} + +box.star { + background-color: transparent; + background-image: none; +} + +button.star { + outline-offset: 0; + background-color: transparent; + background-image: none; + border-image: none; + border-radius: 0; + border-width: 0; + padding: 0; + box-shadow: none; + outline-offset: -1px; +} + +star-image { + color: #FFD600; +} + +.dimmer-label { + opacity: 0.25; +} + +.update-failed-details { + font-family: Monospace; + font-size: smaller; + padding: 16px; +} + +.upgrade-banner { + padding: 0px; + border-radius: 6px; + border: none; +} + +.upgrade-banner-background { + background: linear-gradient(to bottom, #66BB6A, #b7bdf8); + color: white; +} + +.upgrade-buttons #button_upgrades_install { + padding-left: 16px; + padding-right: 16px; +} + +scrolledwindow.list-page > viewport > clamp > box { + margin: 24px 12px; + border-spacing: 24px; +} + +.update-preferences preferencesgroup > box > box { + margin-top: 18px; +} + +.section > label:not(:first-child) { + margin-top: 6px; +} + +.section > box:not(:first-child) { + margin-top: 12px; +} + +clamp.status-page { + margin: 36px 12px; +} + +clamp.status-page .iconbox { + min-height: 128px; + min-width: 128px; +} + +clamp.status-page .icon { + color: rgba(255, 255, 255, 0.5); + min-height: 32px; + min-width: 32px; +} + +clamp.status-page .icon:not(:last-child) { + margin-bottom: 36px; +} + +clamp.status-page .title:not(:last-child) { + margin-bottom: 12px; +} + +app-context-bar .context-tile { + border: 1px solid rgba(255, 255, 255, 0.12); + background-color: transparent; + border-radius: 0; + padding: 24px 12px 21px 12px; + outline-offset: 5px; + transition-property: outline, outline-offset, background-image; + border-bottom: none; + border-right: none; +} + +app-context-bar .context-tile:hover { + background-image: none; + background-color: alpha(currentColor, 0.08); +} + +app-context-bar .context-tile.keyboard-activating, app-context-bar .context-tile:active { + background-color: alpha(currentColor, 0.12); +} + +app-context-bar .context-tile:focus:focus-visible { + outline-offset: -1px; +} + +app-context-bar.horizontal box:first-child .context-tile:first-child, app-context-bar.vertical .context-tile:first-child { + border-left: none; +} + +app-context-bar.horizontal .context-tile, app-context-bar.vertical box:first-child .context-tile { + border-top: none; +} + +app-context-bar > box:not(:first-child) > button.flat { + border-radius: 0; +} + +app-context-bar > box:not(:first-child) > button.flat:last-child { + border-radius: 0 6px 6px 0; +} + +app-context-bar > box:first-child > button.flat { + border-radius: 0; +} + +app-context-bar > box:first-child > button.flat:first-child { + border-radius: 6px 0 0 6px; +} + +app-context-bar > box > button.flat { + border-left-color: rgba(255, 255, 255, 0.12); +} + +carousel.card { + border: none; + background-color: rgba(255, 255, 255, 0.04); +} + +.context-tile-lozenge { + min-height: 28px; + min-width: 28px; + padding: 6px; + font-size: 18px; + font-weight: bold; + border-radius: 9999px; +} + +.context-tile-lozenge.large { + font-size: 24px; + padding: 16px; + min-width: 24px; + /* 60px minus the left and right padding */ + min-height: 24px; + /* 60px minus the top and bottom padding */ +} + +.context-tile-lozenge.wide-image image { + margin-top: -28px; + margin-bottom: -28px; +} + +.context-tile-lozenge image { + -gtk-icon-style: symbolic; +} + +.context-tile-lozenge.grey { + color: #FFFFFF; + background-color: rgba(255, 255, 255, 0.12); +} + +.context-tile-lozenge.green, .context-tile-lozenge.details-rating-0 { + color: #419345; + background-color: rgba(102, 187, 106, 0.15); +} + +.context-tile-lozenge.blue, .context-tile-lozenge.details-rating-5 { + color: #b7bdf8; + background-color: rgba(183, 189, 248, 0.15); +} + +.context-tile-lozenge.yellow, .context-tile-lozenge.details-rating-12 { + color: #d79b04; + background-color: rgba(251, 192, 45, 0.15); +} + +.context-tile-lozenge.details-rating-15 { + color: #FF8A65; + background-color: rgba(255, 138, 101, 0.15); +} + +.context-tile-lozenge.red, .context-tile-lozenge.details-rating-18 { + color: #d2190b; + background-color: rgba(244, 67, 54, 0.15); +} + +.eol-red { + font-weight: bold; + color: #F44336; +} + +window.narrow .app-title { + font-size: 16pt; +} + +window.narrow .app-developer { + font-size: small; +} + +.install-progress-label { + font-size: smaller; + font-feature-settings: "tnum"; +} + +scrolledwindow.fake-adw-status-page > viewport > box { + margin: 36px 12px; +} + +scrolledwindow.fake-adw-status-page > viewport > box > clamp:not(:last-child) > box { + margin-bottom: 36px; +} + +scrolledwindow.fake-adw-status-page > viewport > box > clamp > box > .icon:not(:last-child) { + margin-bottom: 36px; +} + +scrolledwindow.fake-adw-status-page > viewport > box > clamp > box > .title:not(:last-child) { + margin-bottom: 12px; +} + +statuspage.icon-dropshadow image.icon { + -gtk-icon-shadow: 0 1px 12px rgba(0, 0, 0, 0.05), 0 -1px rgba(0, 0, 0, 0.05), 1px 0 rgba(0, 0, 0, 0.1), 0 1px rgba(0, 0, 0, 0.3), -1px 0 rgba(0, 0, 0, 0.1); +} + +window.info scrollbar.vertical { + margin-top: 48px; + background: none; + box-shadow: none; +} + +window.info scrollbar.vertical trough { + margin-top: 0; +} + +row.app > box.header { + margin-left: 12px; + margin-right: 12px; +} + +row.app > box.header { + border-spacing: 12px; +} + +row.app > box.header > image { + margin-top: 12px; + margin-bottom: 12px; +} + +row.app label.warning { + color: #F44336; +} + +@keyframes pre-delay { + from { + opacity: 0; + } + to { + opacity: 0; + } +} + +@keyframes fade-in { + from { + filter: opacity(0%); + } +} + +/* Give a fade-in animation to spinners. */ +spinner.fade-in:checked { + animation: pre-delay 0.5s linear 1, fade-in 1s linear 1, spin 1s linear infinite; + animation-delay: 0s, 0.5s, 0.5s; +} + +window > contents > leaflet > box > stack.background { + background-color: transparent; + background-image: linear-gradient(to bottom, transparent, transparent 48px, #24273a 48px, #24273a); +} + +@define-color weather_temp_chart_fill_color rgba(251, 192, 45, 0.5); +@define-color weather_temp_chart_stroke_color #f0ad05; +@define-color weather_thermometer_warm_color #FBC02D; +@define-color weather_thermometer_cold_color #b7bdf8; +#places-label { + font-weight: bold; +} + +#temperature-label { + font-size: 32pt; + font-weight: 900; + margin-left: 9px; +} + +#conditions-grid *:backdrop { + color: rgba(255, 255, 255, 0.7); +} + +.content-view.cell { + font-weight: bold; +} + +#locationEntry { + margin: 6px; +} + +.weather-popover { + margin-top: 6px; +} + +.forecast-card { + transition: border-radius 100ms ease-out; + border-radius: 6px; +} + +.forecast-card separator { + background-color: rgba(255, 255, 255, 0.12); +} + +#daily-forecast-box > separator:last-child { + background-color: transparent; + min-width: 0; +} + +#conditions-grid, +#attributionGrid { + margin-left: 18px; + margin-right: 18px; +} + +#weather-page .small .forecast-card { + margin-left: 0; + margin-right: 0; + border-radius: 0; + border-width: 1px 0; +} + +.forecast-temperature-label { + font-weight: bold; + color: #ae7b03; +} + +WeatherThermometer { + margin-bottom: 12px; +} + +WeatherThermometer > label.high { + font-weight: bold; + color: #FBC02D; +} + +WeatherThermometer > label.low { + font-weight: bold; + color: #b7bdf8; +} + +.forecast-button { + margin: 0 12px; +} + +.forecast-graphic { + margin: 18px; +} + +button.osd.circular { + border-radius: 9999px; + min-width: 24px; + min-height: 24px; +} + +button.osd.circular > image { + padding: 0; +} + +scrolledwindow.inline list, +scrolledwindow.inline listview { + background: none; + color: inherit; +} + +scrolledwindow.inline undershoot.top { + box-shadow: inset 0 1px rgba(255, 255, 255, 0.12); +} + +.search-view { + background-color: #7287fd; + color: #FFFFFF; +} + +.search-view menubutton button:focus:focus-visible { + outline-color: rgba(255, 255, 255, 0.3); +} + +image.circular { + min-width: 36px; + min-height: 36px; + padding: 0; + border-radius: 9999px; +} + +.large-button { + padding: 6px; +} + +.alarm-time { + font-size: 2.5em; + font-weight: 300; +} + +.clocks-ampm-toggle-button, +.clocks-secondary-standalone-label { + font-size: 18pt; +} + +.clocks-standalone-label, +.clocks-ringing-label { + font-size: 6em; + font-weight: 300; +} + +.clocks-ringing-title { + font-size: 1.5em; + font-weight: bold; +} + +.clocks-alarm-setup-time { + font-size: 32pt; +} + +.clocks-timer-label, +.clocks-spinbutton { + font-size: 48pt; +} + +.timer-panel .timer-header { + font-size: 20pt; + font-weight: 300; +} + +.timer-countdown { + font-size: 40pt; + font-weight: 300; +} + +/* Stopwatch Panel */ +.lap-time { + font-weight: bold; +} + +.stopped-stopwatch label, +.running-stopwatch label, +.paused-stopwatch label { + font-size: 70px; + font-weight: lighter; +} + +.stopped-stopwatch .seconds-label { + font-weight: 300; +} + +.running-stopwatch .seconds-label, +.running-stopwatch .miliseconds-label { + color: #b7bdf8; +} + +.stopped-stopwatch .miliseconds-label, +.running-stopwatch .miliseconds-label, +.paused-stopwatch .miliseconds-label { + font-size: 50px; +} + +.running-stopwatch .seconds-label, +.paused-stopwatch .seconds-label { + font-weight: 300; +} + +.clock-location { + font-weight: bolder; +} + +.hidden { + opacity: 0; +} + +.clock-time { + font-size: 2em; + padding: 0.2em 0.5em; + border-radius: 1em; +} + +.none .clock-time { + background: alpha(currentColor, 0.2); +} + +.night .clock-time { + color: #7287fd; + background-color: alpha(#b7bdf8, 0.25); +} + +.naut .clock-time, +.astro .clock-time { + color: #FF7043; + background-color: alpha(#FF8A65, 0.25); +} + +.civil .clock-time, +.day .clock-time { + color: #FFD600; + background: alpha(#FBC02D, 0.25); +} + +headerbar splitbutton notification button { + margin: 0; + min-height: 24px; + min-width: 24px; + padding: 0; +} + +popover.background.global-search > arrow, popover.background.global-search > contents { + padding: 0; +} + +panelframeswitcher { + padding: 6px; + min-height: 36px; +} + +.frameheader.header { + background-color: #181926; +} + +.frameheader.header:backdrop { + background-color: #24273a; +} + +.frameheader.header > button { + border: none; + margin: 0; + padding: 3px; +} + +.frameheader.header tabbar.inline > revealer > box { + min-height: 24px; +} + +.frameheader.header tabbar.inline > revealer > box .start-action { + padding: 0; + border: none; +} + +.frameheader.header tabbar.inline > revealer > box .end-action { + padding: 0; + border-left: 1px solid rgba(255, 255, 255, 0.12); +} + +.frameheader.header tabbar.inline > revealer > box .end-action button { + margin: 6px; +} + +.frameheader.header tabbar.inline > revealer > box tabbox { + border: none; + background: none; +} + +panelstatusbar > menubutton > button, +panelstatusbar > paneltogglebutton button { + border-radius: 0; +} + +.style-variant { + padding: 0 12px; +} + +.style-variant button.toggle { + padding: 0; +} + +.style-variant button.toggle, .style-variant button.toggle:hover, .style-variant button.toggle:focus, .style-variant button.toggle:active, .style-variant button.toggle:checked { + background: none; + outline: none; + border: none; + box-shadow: none; +} + +.style-variant button.toggle > stylevariantpreview > .wallpaper { + border-radius: 6px; + outline-color: transparent; + outline-width: 3px; + outline-offset: 3px; + outline-style: solid; + box-shadow: none; +} + +.style-variant button.toggle:hover > stylevariantpreview > .wallpaper { + outline-color: rgba(255, 255, 255, 0.04); +} + +.style-variant button.toggle:active > stylevariantpreview > .wallpaper { + outline-color: rgba(255, 255, 255, 0.3); +} + +.style-variant button.toggle:checked > stylevariantpreview > .wallpaper { + outline-color: #b7bdf8; +} + +playlistview scrollbar.overlay-indicator.dragging, playlistview scrollbar.overlay-indicator.hovering { + background-color: transparent; +} + +playlistview queuerow picture.cover, +playlistview queuerow image.card { + border: none; +} + +.exit-info { + padding: 6px; + border-top: 2px solid #b7bdf8; + background: rgba(183, 189, 248, 0.9); + color: rgba(0, 0, 0, 0.87); +} + +.error .exit-info { + border-top: 2px solid #F44336; + background: rgba(244, 67, 54, 0.9); + color: #FFFFFF; +} + +window.dialog > .dialog-vbox > box > scrolledwindow > viewport > widget > list.boxed-list { + border: none; + border-radius: 0; +} + +window.dialog > .dialog-vbox > box > scrolledwindow > viewport > widget > list.boxed-list > row:first-child, window.dialog > .dialog-vbox > box > scrolledwindow > viewport > widget > list.boxed-list > row:last-child { + border-radius: 0; +} + +avatar { + border-radius: 9999px; + font-weight: bold; +} + +avatar.color1 { + background-image: linear-gradient(#83b6ec, #337fdc); + color: #cfe1f5; +} + +avatar.color2 { + background-image: linear-gradient(#7ad9f1, #0f9ac8); + color: #caeaf2; +} + +avatar.color3 { + background-image: linear-gradient(#8de6b1, #29ae74); + color: #cef8d8; +} + +avatar.color4 { + background-image: linear-gradient(#b5e98a, #6ab85b); + color: #e6f9d7; +} + +avatar.color5 { + background-image: linear-gradient(#f8e359, #d29d09); + color: #f9f4e1; +} + +avatar.color6 { + background-image: linear-gradient(#ffcb62, #d68400); + color: #ffead1; +} + +avatar.color7 { + background-image: linear-gradient(#ffa95a, #ed5b00); + color: #ffe5c5; +} + +avatar.color8 { + background-image: linear-gradient(#f78773, #e62d42); + color: #f8d2ce; +} + +avatar.color9 { + background-image: linear-gradient(#e973ab, #e33b6a); + color: #fac7de; +} + +avatar.color10 { + background-image: linear-gradient(#cb78d4, #9945b5); + color: #e7c2e8; +} + +avatar.color11 { + background-image: linear-gradient(#9e91e8, #7a59ca); + color: #d5d2f5; +} + +avatar.color12 { + background-image: linear-gradient(#e3cf9c, #b08952); + color: #f2eade; +} + +avatar.color13 { + background-image: linear-gradient(#be916d, #785336); + color: #e5d6ca; +} + +avatar.color14 { + background-image: linear-gradient(#c0bfbc, #6e6d71); + color: #d8d7d3; +} + +avatar.contrasted { + color: white; +} + +avatar.image { + background: none; +} + +.card { + border-radius: 6px; + border: 1px solid rgba(255, 255, 255, 0.12); + background-clip: border-box; + color: rgba(255, 255, 255, 0.7); + box-shadow: none; + outline: none; + background-color: #24273a; + color: #FFFFFF; +} + +.card.activatable { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); +} + +.card.activatable:hover { + background-image: none; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; +} + +.card.activatable:active { + background-image: none; + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms, border 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.08) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; +} + +toast { + margin: 12px; + margin-bottom: 24px; + border-radius: 9999px; + border-spacing: 6px; + padding: 6px; + box-shadow: 0 2px 3px -1px rgba(0, 0, 0, 0.1), 0 4px 6px 0 rgba(0, 0, 0, 0.12), 0 1px 10px 0 rgba(0, 0, 0, 0.1), inset 0 1px rgba(255, 255, 255, 0.1); + background-color: #24273a; + color: #FFFFFF; + border: none; +} + +toast:dir(ltr) { + padding-left: 12px; +} + +toast:dir(rtl) { + padding-right: 12px; +} + +toast > label { + margin: 0 6px; +} + +viewswitcher { + margin: 0; + border-spacing: 3px; +} + +viewswitcher.wide { + margin-top: 6px; + margin-bottom: 6px; +} + +viewswitcher.wide button.toggle { + margin: 0; +} + +viewswitcher.narrow button.toggle { + border-radius: 0; + margin: 0; +} + +viewswitcher.narrow button.toggle:focus-within, viewswitcher.narrow button.toggle:focus { + box-shadow: none; +} + +viewswitcher button.toggle { + font-weight: bold; + padding: 0; +} + +viewswitcher button.toggle > stack > box.narrow { + font-size: 0.75rem; + padding-top: 6px; + padding-bottom: 4px; + border-spacing: 4px; +} + +viewswitcher button.toggle > stack > box.narrow > stack > label { + padding-left: 6px; + padding-right: 6px; +} + +viewswitcher button.toggle > stack > box.wide { + padding: 2px 12px; + border-spacing: 6px; +} + +viewswitcherbar actionbar > revealer > box { + padding: 0; +} + +viewswitchertitle { + margin-top: 0; + margin-bottom: 0; +} + +viewswitchertitle viewswitcher { + margin-left: 12px; + margin-right: 12px; +} + +viewswitchertitle viewswitcher.narrow { + margin-top: 0; + margin-bottom: 0; +} + +viewswitchertitle viewswitcher.narrow button.toggle > stack > box.narrow { + padding-top: 0; + padding-bottom: 0; + border-spacing: 0; +} + +viewswitchertitle viewswitcher.wide { + margin-top: 6px; + margin-bottom: 6px; +} + +viewswitchertitle windowtitle { + margin-top: 0; + margin-bottom: 0; +} + +.top-bar headerbar viewswitchertitle viewswitcher.narrow button.toggle { + border-radius: 0 0 6px 6px; +} + +indicatorbin > indicator, indicatorbin > mask { + min-width: 6px; + min-height: 6px; + border-radius: 9999px; +} + +indicatorbin > indicator { + margin: 1px; + background-color: alpha(currentColor, 0.4); +} + +indicatorbin > indicator > label { + font-size: 0.6rem; + font-weight: bold; + padding: 1px 4px; + color: white; +} + +indicatorbin > mask { + padding: 1px; + background: black; +} + +indicatorbin.needs-attention > indicator { + background-color: #b7bdf8; +} + +indicatorbin.needs-attention > indicator > label { + color: rgba(0, 0, 0, 0.87); +} + +preferencespage > scrolledwindow > viewport > clamp > box { + margin: 24px 12px; + border-spacing: 24px; +} + +preferencesgroup > box, preferencesgroup > box .labels { + border-spacing: 6px; +} + +preferencesgroup > box > box.header:not(.single-line) { + margin-bottom: 6px; +} + +preferencesgroup > box > box.single-line { + min-height: 34px; +} + +preferencesgroup > box button.background-preview-button.toggle { + padding: 0; + background: none; + box-shadow: none; + outline-color: transparent; + outline-width: 3px; + outline-offset: 3px; + outline-style: solid; +} + +preferencesgroup > box button.background-preview-button.toggle, preferencesgroup > box button.background-preview-button.toggle > background-preview { + border-radius: 6px; +} + +preferencesgroup > box button.background-preview-button.toggle:hover { + outline-color: rgba(255, 255, 255, 0.04); +} + +preferencesgroup > box button.background-preview-button.toggle:active { + outline-color: rgba(255, 255, 255, 0.3); +} + +preferencesgroup > box button.background-preview-button.toggle:checked { + outline-color: #b7bdf8; +} + +preferencesgroup > box .cutout-button { + background-color: #181926; +} + +window.about .main-page > viewport > clamp > box { + margin: 12px; + border-spacing: 6px; +} + +window.about .main-page > viewport > clamp > box > box { + margin-top: 18px; + border-spacing: 18px; + margin-bottom: 6px; +} + +window.about .main-page .app-version { + padding: 3px 18px; + color: #b7bdf8; + border-radius: 6px; + margin-top: 3px; +} + +window.about .subpage > viewport > clamp > box { + margin: 18px 12px; + border-spacing: 18px; +} + +window.about .subpage > clamp > textview { + background: none; + color: inherit; +} + +statuspage > scrolledwindow > viewport > box { + margin: 36px 12px; + border-spacing: 36px; +} + +statuspage > scrolledwindow > viewport > box > clamp > box { + border-spacing: 12px; +} + +statuspage > scrolledwindow > viewport > box > clamp > box > .icon { + -gtk-icon-size: 128px; + color: alpha(currentColor, 0.55); +} + +statuspage > scrolledwindow > viewport > box > clamp > box > .icon:disabled { + opacity: 0.35; +} + +statuspage > scrolledwindow > viewport > box > clamp > box > .icon:not(:last-child) { + margin-bottom: 24px; +} + +statuspage.compact > scrolledwindow > viewport > box { + margin: 24px 12px; + border-spacing: 24px; +} + +statuspage.compact > scrolledwindow > viewport > box > clamp > box > .icon { + -gtk-icon-size: 96px; +} + +statuspage.compact > scrolledwindow > viewport > box > clamp > box > .icon:not(:last-child) { + margin-bottom: 12px; +} + +statuspage.compact > scrolledwindow > viewport > box > clamp > box > .title { + font-size: 18pt; +} + +flap > dimming, +leaflet > dimming, +navigation-view > dimming, +overlay-split-view > dimming { + background: rgba(0, 0, 0, 0.25); +} + +flap > border, +leaflet > border, +navigation-view > border, +overlay-split-view > border { + background: none; +} + +flap > shadow, +leaflet > shadow, +navigation-view > shadow, +overlay-split-view > shadow { + min-width: 56px; + min-height: 56px; +} + +flap > shadow.left, +leaflet > shadow.left, +navigation-view > shadow.left, +overlay-split-view > shadow.left { + background-image: linear-gradient(to right, alpha(rgba(0, 0, 0, 0.25), 0.7), alpha(rgba(0, 0, 0, 0.25), 0.14) 40px, alpha(rgba(0, 0, 0, 0.25), 0) 56px), linear-gradient(to right, alpha(rgba(0, 0, 0, 0.25), 0.4), alpha(rgba(0, 0, 0, 0.25), 0.14) 7px, alpha(rgba(0, 0, 0, 0.25), 0) 24px); +} + +flap > shadow.right, +leaflet > shadow.right, +navigation-view > shadow.right, +overlay-split-view > shadow.right { + background-image: linear-gradient(to left, alpha(rgba(0, 0, 0, 0.25), 0.7), alpha(rgba(0, 0, 0, 0.25), 0.14) 40px, alpha(rgba(0, 0, 0, 0.25), 0) 56px), linear-gradient(to left, alpha(rgba(0, 0, 0, 0.25), 0.4), alpha(rgba(0, 0, 0, 0.25), 0.14) 7px, alpha(rgba(0, 0, 0, 0.25), 0) 24px); +} + +flap > shadow.up, +leaflet > shadow.up, +navigation-view > shadow.up, +overlay-split-view > shadow.up { + background-image: linear-gradient(to bottom, alpha(rgba(0, 0, 0, 0.25), 0.7), alpha(rgba(0, 0, 0, 0.25), 0.14) 40px, alpha(rgba(0, 0, 0, 0.25), 0) 56px), linear-gradient(to bottom, alpha(rgba(0, 0, 0, 0.25), 0.4), alpha(rgba(0, 0, 0, 0.25), 0.14) 7px, alpha(rgba(0, 0, 0, 0.25), 0) 24px); +} + +flap > shadow.down, +leaflet > shadow.down, +navigation-view > shadow.down, +overlay-split-view > shadow.down { + background-image: linear-gradient(to top, alpha(rgba(0, 0, 0, 0.25), 0.7), alpha(rgba(0, 0, 0, 0.25), 0.14) 40px, alpha(rgba(0, 0, 0, 0.25), 0) 56px), linear-gradient(to top, alpha(rgba(0, 0, 0, 0.25), 0.4), alpha(rgba(0, 0, 0, 0.25), 0.14) 7px, alpha(rgba(0, 0, 0, 0.25), 0) 24px); +} + +toolbarview.undershoot-top scrolledwindow > undershoot.top { + box-shadow: none; + background: linear-gradient(to bottom, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +toolbarview.undershoot-bottom scrolledwindow > undershoot.bottom { + box-shadow: none; + background: linear-gradient(to top, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +.unfolded stacksidebar.sidebar { + border: none; +} + +.sidebar-pane { + background-color: #181926; + color: #FFFFFF; +} + +.sidebar-pane:backdrop { + color: rgba(255, 255, 255, 0.5); + background-color: #24273a; + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1); +} + +.sidebar-pane .sidebar-pane { + background-color: transparent; + color: inherit; +} + +.sidebar-pane .toolbar, +.sidebar-pane .sidebar, +.sidebar-pane .navigation-sidebar, +.sidebar-pane searchbar > revealer > box { + background-color: transparent; + box-shadow: none; + border: none; +} + +.sidebar-pane banner > revealer > widget { + background-color: gtkmix(#b7bdf8, #181926, 30%); + color: #FFFFFF; +} + +.sidebar-pane banner > revealer > widget:backdrop { + background-color: gtkmix(#b7bdf8, #181926, 30%); +} + +/* Middle pane in three-pane setups */ +.content-pane .sidebar-pane, +.sidebar-pane .content-pane { + background-color: #24273a; + color: #FFFFFF; +} + +.content-pane .sidebar-pane:backdrop, +.sidebar-pane .content-pane:backdrop { + background-color: #24273a; + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1); +} + +.content-pane .sidebar-pane banner > revealer > widget, +.sidebar-pane .content-pane banner > revealer > widget { + background-color: gtkmix(#b7bdf8, #24273a, 30%); + color: #FFFFFF; +} + +.content-pane .sidebar-pane banner > revealer > widget:backdrop, +.sidebar-pane .content-pane banner > revealer > widget:backdrop { + background-color: gtkmix(#b7bdf8, #24273a, 30%); +} + +.sidebar-pane:dir(ltr), .sidebar-pane:dir(ltr) banner > revealer > widget, .sidebar-pane.end:dir(rtl), .sidebar-pane.end:dir(rtl) banner > revealer > widget, +.content-pane .sidebar-pane:dir(ltr), +.content-pane .sidebar-pane:dir(ltr) banner > revealer > widget, +.content-pane .sidebar-pane.end:dir(rtl), +.content-pane .sidebar-pane.end:dir(rtl) banner > revealer > widget, +.sidebar-pane .content-pane:dir(ltr), +.sidebar-pane .content-pane:dir(ltr) banner > revealer > widget, +.sidebar-pane .content-pane.end:dir(rtl), +.sidebar-pane .content-pane.end:dir(rtl) banner > revealer > widget { + box-shadow: none; + border-right: 1px solid rgba(255, 255, 255, 0.12); +} + +.sidebar-pane:dir(rtl), .sidebar-pane:dir(rtl) banner > revealer > widget, .sidebar-pane.end:dir(ltr), .sidebar-pane.end:dir(ltr) banner > revealer > widget, +.content-pane .sidebar-pane:dir(rtl), +.content-pane .sidebar-pane:dir(rtl) banner > revealer > widget, +.content-pane .sidebar-pane.end:dir(ltr), +.content-pane .sidebar-pane.end:dir(ltr) banner > revealer > widget, +.sidebar-pane .content-pane:dir(rtl), +.sidebar-pane .content-pane:dir(rtl) banner > revealer > widget, +.sidebar-pane .content-pane.end:dir(ltr), +.sidebar-pane .content-pane.end:dir(ltr) banner > revealer > widget { + box-shadow: none; + border-left: 1px solid rgba(255, 255, 255, 0.12); +} + +.sidebar-pane toolbarview.undershoot-top scrolledwindow > undershoot.top, +.content-pane toolbarview.undershoot-top scrolledwindow > undershoot.top, +.content-pane .sidebar-pane toolbarview.undershoot-top scrolledwindow > undershoot.top, +.sidebar-pane .content-pane toolbarview.undershoot-top scrolledwindow > undershoot.top { + box-shadow: inset 0 1px rgba(255, 255, 255, 0.08); + background: linear-gradient(to bottom, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +.sidebar-pane toolbarview.undershoot-bottom scrolledwindow > undershoot.bottom, +.content-pane toolbarview.undershoot-bottom scrolledwindow > undershoot.bottom, +.content-pane .sidebar-pane toolbarview.undershoot-bottom scrolledwindow > undershoot.bottom, +.sidebar-pane .content-pane toolbarview.undershoot-bottom scrolledwindow > undershoot.bottom { + box-shadow: inset 0 -1px rgba(255, 255, 255, 0.08); + background: linear-gradient(to top, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +.sidebar-pane scrolledwindow.undershoot-top > undershoot.top, +.content-pane scrolledwindow.undershoot-top > undershoot.top, +.content-pane .sidebar-pane scrolledwindow.undershoot-top > undershoot.top, +.sidebar-pane .content-pane scrolledwindow.undershoot-top > undershoot.top { + box-shadow: inset 0 1px rgba(255, 255, 255, 0.08); + background: linear-gradient(to bottom, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +.sidebar-pane scrolledwindow.undershoot-bottom > undershoot.bottom, +.content-pane scrolledwindow.undershoot-bottom > undershoot.bottom, +.content-pane .sidebar-pane scrolledwindow.undershoot-bottom > undershoot.bottom, +.sidebar-pane .content-pane scrolledwindow.undershoot-bottom > undershoot.bottom { + box-shadow: inset 0 -1px rgba(255, 255, 255, 0.08); + background: linear-gradient(to top, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +.sidebar-pane scrolledwindow.undershoot-start:dir(ltr) > undershoot.left, +.content-pane scrolledwindow.undershoot-start:dir(ltr) > undershoot.left, +.content-pane .sidebar-pane scrolledwindow.undershoot-start:dir(ltr) > undershoot.left, +.sidebar-pane .content-pane scrolledwindow.undershoot-start:dir(ltr) > undershoot.left { + box-shadow: inset 1px 0 rgba(255, 255, 255, 0.08); + background: linear-gradient(to right, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +.sidebar-pane scrolledwindow.undershoot-start:dir(rtl) > undershoot.right, +.content-pane scrolledwindow.undershoot-start:dir(rtl) > undershoot.right, +.content-pane .sidebar-pane scrolledwindow.undershoot-start:dir(rtl) > undershoot.right, +.sidebar-pane .content-pane scrolledwindow.undershoot-start:dir(rtl) > undershoot.right { + box-shadow: inset -1px 0 rgba(255, 255, 255, 0.08); + background: linear-gradient(to left, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +.sidebar-pane scrolledwindow.undershoot-end:dir(ltr) > undershoot.right, +.content-pane scrolledwindow.undershoot-end:dir(ltr) > undershoot.right, +.content-pane .sidebar-pane scrolledwindow.undershoot-end:dir(ltr) > undershoot.right, +.sidebar-pane .content-pane scrolledwindow.undershoot-end:dir(ltr) > undershoot.right { + box-shadow: inset -1px 0 rgba(255, 255, 255, 0.08); + background: linear-gradient(to left, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +.sidebar-pane scrolledwindow.undershoot-end:dir(rtl) > undershoot.left, +.content-pane scrolledwindow.undershoot-end:dir(rtl) > undershoot.left, +.content-pane .sidebar-pane scrolledwindow.undershoot-end:dir(rtl) > undershoot.left, +.sidebar-pane .content-pane scrolledwindow.undershoot-end:dir(rtl) > undershoot.left { + box-shadow: inset 1px 0 rgba(255, 255, 255, 0.08); + background: linear-gradient(to right, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +.sidebar-pane flap > dimming, +.sidebar-pane leaflet > dimming, +.sidebar-pane navigation-view > dimming, +.sidebar-pane overlay-split-view > dimming, +.content-pane flap > dimming, +.content-pane leaflet > dimming, +.content-pane navigation-view > dimming, +.content-pane overlay-split-view > dimming, +.content-pane .sidebar-pane flap > dimming, +.content-pane .sidebar-pane leaflet > dimming, +.content-pane .sidebar-pane navigation-view > dimming, +.content-pane .sidebar-pane overlay-split-view > dimming, +.sidebar-pane .content-pane flap > dimming, +.sidebar-pane .content-pane leaflet > dimming, +.sidebar-pane .content-pane navigation-view > dimming, +.sidebar-pane .content-pane overlay-split-view > dimming { + background: rgba(0, 0, 0, 0.25); +} + +.sidebar-pane flap > border, +.sidebar-pane leaflet > border, +.sidebar-pane navigation-view > border, +.sidebar-pane overlay-split-view > border, +.content-pane flap > border, +.content-pane leaflet > border, +.content-pane navigation-view > border, +.content-pane overlay-split-view > border, +.content-pane .sidebar-pane flap > border, +.content-pane .sidebar-pane leaflet > border, +.content-pane .sidebar-pane navigation-view > border, +.content-pane .sidebar-pane overlay-split-view > border, +.sidebar-pane .content-pane flap > border, +.sidebar-pane .content-pane leaflet > border, +.sidebar-pane .content-pane navigation-view > border, +.sidebar-pane .content-pane overlay-split-view > border { + background: none; +} + +.sidebar-pane flap > shadow, +.sidebar-pane leaflet > shadow, +.sidebar-pane navigation-view > shadow, +.sidebar-pane overlay-split-view > shadow, +.content-pane flap > shadow, +.content-pane leaflet > shadow, +.content-pane navigation-view > shadow, +.content-pane overlay-split-view > shadow, +.content-pane .sidebar-pane flap > shadow, +.content-pane .sidebar-pane leaflet > shadow, +.content-pane .sidebar-pane navigation-view > shadow, +.content-pane .sidebar-pane overlay-split-view > shadow, +.sidebar-pane .content-pane flap > shadow, +.sidebar-pane .content-pane leaflet > shadow, +.sidebar-pane .content-pane navigation-view > shadow, +.sidebar-pane .content-pane overlay-split-view > shadow { + min-width: 56px; + min-height: 56px; +} + +.sidebar-pane flap > shadow.left, +.sidebar-pane leaflet > shadow.left, +.sidebar-pane navigation-view > shadow.left, +.sidebar-pane overlay-split-view > shadow.left, +.content-pane flap > shadow.left, +.content-pane leaflet > shadow.left, +.content-pane navigation-view > shadow.left, +.content-pane overlay-split-view > shadow.left, +.content-pane .sidebar-pane flap > shadow.left, +.content-pane .sidebar-pane leaflet > shadow.left, +.content-pane .sidebar-pane navigation-view > shadow.left, +.content-pane .sidebar-pane overlay-split-view > shadow.left, +.sidebar-pane .content-pane flap > shadow.left, +.sidebar-pane .content-pane leaflet > shadow.left, +.sidebar-pane .content-pane navigation-view > shadow.left, +.sidebar-pane .content-pane overlay-split-view > shadow.left { + background-image: linear-gradient(to right, alpha(rgba(0, 0, 0, 0.25), 0.7), alpha(rgba(0, 0, 0, 0.25), 0.14) 40px, alpha(rgba(0, 0, 0, 0.25), 0) 56px), linear-gradient(to right, alpha(rgba(0, 0, 0, 0.25), 0.4), alpha(rgba(0, 0, 0, 0.25), 0.14) 7px, alpha(rgba(0, 0, 0, 0.25), 0) 24px); +} + +.sidebar-pane flap > shadow.right, +.sidebar-pane leaflet > shadow.right, +.sidebar-pane navigation-view > shadow.right, +.sidebar-pane overlay-split-view > shadow.right, +.content-pane flap > shadow.right, +.content-pane leaflet > shadow.right, +.content-pane navigation-view > shadow.right, +.content-pane overlay-split-view > shadow.right, +.content-pane .sidebar-pane flap > shadow.right, +.content-pane .sidebar-pane leaflet > shadow.right, +.content-pane .sidebar-pane navigation-view > shadow.right, +.content-pane .sidebar-pane overlay-split-view > shadow.right, +.sidebar-pane .content-pane flap > shadow.right, +.sidebar-pane .content-pane leaflet > shadow.right, +.sidebar-pane .content-pane navigation-view > shadow.right, +.sidebar-pane .content-pane overlay-split-view > shadow.right { + background-image: linear-gradient(to left, alpha(rgba(0, 0, 0, 0.25), 0.7), alpha(rgba(0, 0, 0, 0.25), 0.14) 40px, alpha(rgba(0, 0, 0, 0.25), 0) 56px), linear-gradient(to left, alpha(rgba(0, 0, 0, 0.25), 0.4), alpha(rgba(0, 0, 0, 0.25), 0.14) 7px, alpha(rgba(0, 0, 0, 0.25), 0) 24px); +} + +.sidebar-pane flap > shadow.up, +.sidebar-pane leaflet > shadow.up, +.sidebar-pane navigation-view > shadow.up, +.sidebar-pane overlay-split-view > shadow.up, +.content-pane flap > shadow.up, +.content-pane leaflet > shadow.up, +.content-pane navigation-view > shadow.up, +.content-pane overlay-split-view > shadow.up, +.content-pane .sidebar-pane flap > shadow.up, +.content-pane .sidebar-pane leaflet > shadow.up, +.content-pane .sidebar-pane navigation-view > shadow.up, +.content-pane .sidebar-pane overlay-split-view > shadow.up, +.sidebar-pane .content-pane flap > shadow.up, +.sidebar-pane .content-pane leaflet > shadow.up, +.sidebar-pane .content-pane navigation-view > shadow.up, +.sidebar-pane .content-pane overlay-split-view > shadow.up { + background-image: linear-gradient(to bottom, alpha(rgba(0, 0, 0, 0.25), 0.7), alpha(rgba(0, 0, 0, 0.25), 0.14) 40px, alpha(rgba(0, 0, 0, 0.25), 0) 56px), linear-gradient(to bottom, alpha(rgba(0, 0, 0, 0.25), 0.4), alpha(rgba(0, 0, 0, 0.25), 0.14) 7px, alpha(rgba(0, 0, 0, 0.25), 0) 24px); +} + +.sidebar-pane flap > shadow.down, +.sidebar-pane leaflet > shadow.down, +.sidebar-pane navigation-view > shadow.down, +.sidebar-pane overlay-split-view > shadow.down, +.content-pane flap > shadow.down, +.content-pane leaflet > shadow.down, +.content-pane navigation-view > shadow.down, +.content-pane overlay-split-view > shadow.down, +.content-pane .sidebar-pane flap > shadow.down, +.content-pane .sidebar-pane leaflet > shadow.down, +.content-pane .sidebar-pane navigation-view > shadow.down, +.content-pane .sidebar-pane overlay-split-view > shadow.down, +.sidebar-pane .content-pane flap > shadow.down, +.sidebar-pane .content-pane leaflet > shadow.down, +.sidebar-pane .content-pane navigation-view > shadow.down, +.sidebar-pane .content-pane overlay-split-view > shadow.down { + background-image: linear-gradient(to top, alpha(rgba(0, 0, 0, 0.25), 0.7), alpha(rgba(0, 0, 0, 0.25), 0.14) 40px, alpha(rgba(0, 0, 0, 0.25), 0) 56px), linear-gradient(to top, alpha(rgba(0, 0, 0, 0.25), 0.4), alpha(rgba(0, 0, 0, 0.25), 0.14) 7px, alpha(rgba(0, 0, 0, 0.25), 0) 24px); +} + +.sidebar-pane headerbar, .sidebar-pane headerbar:backdrop, .sidebar-pane .top-bar, .sidebar-pane .top-bar:backdrop, +.content-pane headerbar, +.content-pane headerbar:backdrop, +.content-pane .top-bar, +.content-pane .top-bar:backdrop { + background-color: transparent; + box-shadow: none; +} + +.sidebar-pane tabbar .box, .sidebar-pane tabbar .box:backdrop, +.content-pane tabbar .box, +.content-pane tabbar .box:backdrop { + background-color: transparent; + box-shadow: none; +} + +.sidebar-pane tabbar tab, +.content-pane tabbar tab { + color: rgba(255, 255, 255, 0.7); +} + +.sidebar-pane tabbar tab:hover:not(:selected), .sidebar-pane tabbar tab:active, +.content-pane tabbar tab:hover:not(:selected), +.content-pane tabbar tab:active { + color: #FFFFFF; +} + +.sidebar-pane tabbar tab:selected:not(:active), +.content-pane tabbar tab:selected:not(:active) { + background-color: alpha(currentColor, 0.06); + color: #FFFFFF; + box-shadow: none; +} + +.sidebar-pane tabbar tab:disabled, +.content-pane tabbar tab:disabled { + color: rgba(255, 255, 255, 0.32); +} + +.sidebar-pane tabbar button.image-button, +.content-pane tabbar button.image-button { + color: rgba(255, 255, 255, 0.7); +} + +.sidebar-pane tabbar button.image-button:hover, .sidebar-pane tabbar button.image-button:active, +.content-pane tabbar button.image-button:hover, +.content-pane tabbar button.image-button:active { + color: #FFFFFF; +} + +.sidebar-pane tabbar button.image-button:disabled, +.content-pane tabbar button.image-button:disabled { + color: rgba(255, 255, 255, 0.32); +} + +.top-bar { + box-shadow: inset 0 -1px rgba(255, 255, 255, 0.12); + background-color: #181926; +} + +.top-bar:backdrop { + background-color: #24273a; +} + +.top-bar .collapse-spacing { + padding: 0; +} + +themeselector, +panelthemeselector { + margin: 9px; +} + +themeselector checkbutton, +panelthemeselector checkbutton { + padding: 0; + min-height: 44px; + min-width: 44px; + padding: 1px; + background-clip: content-box; + border-radius: 9999px; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.12); +} + +themeselector checkbutton.follow:checked, themeselector checkbutton.light:checked, themeselector checkbutton.dark:checked, +panelthemeselector checkbutton.follow:checked, +panelthemeselector checkbutton.light:checked, +panelthemeselector checkbutton.dark:checked { + box-shadow: inset 0 0 0 2px #b7bdf8; +} + +themeselector checkbutton.follow, +panelthemeselector checkbutton.follow { + background-image: linear-gradient(to bottom right, #ffffff 50%, #202020 50%); +} + +themeselector checkbutton.light, +panelthemeselector checkbutton.light { + background-color: #ffffff; +} + +themeselector checkbutton.dark, +panelthemeselector checkbutton.dark { + background-color: #202020; +} + +themeselector checkbutton.theme-selector radio, +panelthemeselector checkbutton.theme-selector radio { + -gtk-icon-source: none; + border: none; + background: none; + box-shadow: none; + min-height: 20px; + min-width: 20px; + padding: 0; +} + +themeselector checkbutton.theme-selector radio:hover, themeselector checkbutton.theme-selector radio:active, themeselector checkbutton.theme-selector radio:checked, +panelthemeselector checkbutton.theme-selector radio:hover, +panelthemeselector checkbutton.theme-selector radio:active, +panelthemeselector checkbutton.theme-selector radio:checked { + background-color: transparent; +} + +themeselector checkbutton.theme-selector radio:checked, +panelthemeselector checkbutton.theme-selector radio:checked { + -gtk-icon-size: 20px; + -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/scalable/checkbox-checked-symbolic.svg")), -gtk-recolor(url("assets/scalable/checkbox-checked-symbolic@2.svg"))); + color: rgba(0, 0, 0, 0.87); + background-color: #b7bdf8; +} + +themeselector checkbutton.theme-selector radio:checked, themeselector checkbutton.theme-selector radio:checked:hover, themeselector checkbutton.theme-selector radio:checked:active, +panelthemeselector checkbutton.theme-selector radio:checked, +panelthemeselector checkbutton.theme-selector radio:checked:hover, +panelthemeselector checkbutton.theme-selector radio:checked:active { + box-shadow: 0 2px 3px -1px rgba(0, 0, 0, 0.08), 0 1px 2px 0 rgba(0, 0, 0, 0.1); +} + +themeswitcher { + padding: 6px; +} + +themeswitcher .check { + min-height: 20px; + min-width: 20px; + background: none; + padding: 0; + margin: 0; + border-radius: 9999px; + color: rgba(0, 0, 0, 0.87); + background-color: #b7bdf8; +} + +themeswitcher .check, themeswitcher .check:hover, themeswitcher .check:active { + box-shadow: 0 2px 3px -1px rgba(0, 0, 0, 0.08), 0 1px 2px 0 rgba(0, 0, 0, 0.1); +} + +themeswitcher checkbutton { + padding: 0; + min-height: 44px; + min-width: 44px; + padding: 1px; + background-clip: content-box; + border-radius: 9999px; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.12); +} + +themeswitcher checkbutton:checked { + box-shadow: inset 0 0 0 2px #b7bdf8; +} + +themeswitcher checkbutton radio, themeswitcher checkbutton radio:hover, themeswitcher checkbutton radio:active, themeswitcher checkbutton radio:checked, themeswitcher checkbutton radio:checked:hover, themeswitcher checkbutton radio:checked:active { + background-color: transparent; + border: none; + background: none; + box-shadow: none; + color: transparent; + -gtk-icon-source: none; + -gtk-icon-size: 0; +} + +themeswitcher checkbutton.system { + background: linear-gradient(-45deg, #1e1e1e 50%, white 50%); +} + +themeswitcher checkbutton.light { + color: alpha(black, 0.8); + background-color: white; +} + +themeswitcher checkbutton.dark { + color: white; + background-color: #1e1e1e; +} + +/* GTK NAMED COLORS + ---------------- + use responsibly! */ +/* +widget text/foreground color */ +@define-color theme_fg_color #FFFFFF; +/* +text color for entries, views and content in general */ +@define-color theme_text_color #FFFFFF; +/* +widget base background color */ +@define-color theme_bg_color #24273a; +/* +text widgets and the like base background color */ +@define-color theme_base_color #24273a; +/* +base background color of selections */ +@define-color theme_selected_bg_color #b7bdf8; +/* +text/foreground color of selections */ +@define-color theme_selected_fg_color rgba(0, 0, 0, 0.87); +/* +base background color of insensitive widgets */ +@define-color insensitive_bg_color #24273a; +/* +text foreground color of insensitive widgets */ +@define-color insensitive_fg_color rgba(255, 255, 255, 0.5); +/* +insensitive text widgets and the like base background color */ +@define-color insensitive_base_color #181926; +/* +widget text/foreground color on backdrop windows */ +@define-color theme_unfocused_fg_color #FFFFFF; +/* +text color for entries, views and content in general on backdrop windows */ +@define-color theme_unfocused_text_color #FFFFFF; +/* +widget base background color on backdrop windows */ +@define-color theme_unfocused_bg_color #24273a; +/* +text widgets and the like base background color on backdrop windows */ +@define-color theme_unfocused_base_color #24273a; +/* +base background color of selections on backdrop windows */ +@define-color theme_unfocused_selected_bg_color #b7bdf8; +/* +text/foreground color of selections on backdrop windows */ +@define-color theme_unfocused_selected_fg_color rgba(0, 0, 0, 0.87); +/* +insensitive color on backdrop windows */ +@define-color unfocused_insensitive_color rgba(255, 255, 255, 0.5); +/* +widgets main borders color */ +@define-color borders rgba(255, 255, 255, 0.12); +/* +widgets main borders color on backdrop windows */ +@define-color unfocused_borders rgba(255, 255, 255, 0.12); +/* +these are pretty self explicative */ +@define-color warning_color #FBC02D; +@define-color error_color #F44336; +@define-color success_color #66BB6A; +/* +these colors are exported for the window manager and shouldn't be used in applications, +read if you used those and something break with a version upgrade you're on your own... */ +@define-color wm_title #FFFFFF; +@define-color wm_unfocused_title rgba(255, 255, 255, 0.7); +@define-color wm_highlight rgba(255, 255, 255, 0.1); +@define-color wm_border #07080c; +@define-color wm_bg #181926; +@define-color wm_unfocused_bg #24273a; +@define-color wm_button_icon white; +@define-color wm_button_close_hover_bg #ed8796; +@define-color wm_button_close_active_bg #e55267; +@define-color wm_button_max_hover_bg #a6da95; +@define-color wm_button_max_active_bg #80ca68; +@define-color wm_button_min_hover_bg #eed49f; +@define-color wm_button_min_active_bg #e5bd6b; +/* +FIXME this is really an API */ +@define-color content_view_bg #24273a; +@define-color placeholder_text_color #bdbec4; +/* Very contrasty background for text views (@theme_text_color foreground) */ +@define-color text_view_bg #24273a; +@define-color budgie_tasklist_indicator_color rgba(255, 255, 255, 0.3); +@define-color budgie_tasklist_indicator_color_active #b7bdf8; +@define-color budgie_tasklist_indicator_color_active_window #6e7297; +@define-color budgie_tasklist_indicator_color_attention #FBC02D; +@define-color STRAWBERRY_100 #FF9262; +@define-color STRAWBERRY_300 #FF793E; +@define-color STRAWBERRY_500 #F15D22; +@define-color STRAWBERRY_700 #CF3B00; +@define-color STRAWBERRY_900 #AC1800; +@define-color ORANGE_100 #FFDB91; +@define-color ORANGE_300 #FFCA40; +@define-color ORANGE_500 #FAA41A; +@define-color ORANGE_700 #DE8800; +@define-color ORANGE_900 #C26C00; +@define-color BANANA_100 #FFFFA8; +@define-color BANANA_300 #FFFA7D; +@define-color BANANA_500 #FFCE51; +@define-color BANANA_700 #D1A023; +@define-color BANANA_900 #A27100; +@define-color LIME_100 #A2F3BE; +@define-color LIME_300 #8ADBA6; +@define-color LIME_500 #73C48F; +@define-color LIME_700 #479863; +@define-color LIME_900 #1C6D38; +@define-color BLUEBERRY_100 #94A6FF; +@define-color BLUEBERRY_300 #6A7CE0; +@define-color BLUEBERRY_500 #3F51B5; +@define-color BLUEBERRY_700 #213397; +@define-color BLUEBERRY_900 #031579; +@define-color GRAPE_100 #D25DE6; +@define-color GRAPE_300 #B84ACB; +@define-color GRAPE_500 #9C27B0; +@define-color GRAPE_700 #830E97; +@define-color GRAPE_900 #6A007E; +@define-color COCOA_100 #9F9792; +@define-color COCOA_300 #7B736E; +@define-color COCOA_500 #574F4A; +@define-color COCOA_700 #463E39; +@define-color COCOA_900 #342C27; +@define-color SILVER_100 #EEE; +@define-color SILVER_300 #CCC; +@define-color SILVER_500 #AAA; +@define-color SILVER_700 #888; +@define-color SILVER_900 #666; +@define-color SLATE_100 #888; +@define-color SLATE_300 #666; +@define-color SLATE_500 #444; +@define-color SLATE_700 #222; +@define-color SLATE_900 #111; +@define-color BLACK_100 #474341; +@define-color BLACK_300 #403C3A; +@define-color BLACK_500 #393634; +@define-color BLACK_700 #33302F; +@define-color BLACK_900 #2B2928; +@define-color blue_1 #99c1f1; +@define-color blue_2 #62a0ea; +@define-color blue_3 #3584e4; +@define-color blue_4 #1c71d8; +@define-color blue_5 #1a5fb4; +@define-color green_1 #8ff0a4; +@define-color green_2 #57e389; +@define-color green_3 #33d17a; +@define-color green_4 #2ec27e; +@define-color green_5 #26a269; +@define-color yellow_1 #f9f06b; +@define-color yellow_2 #f8e45c; +@define-color yellow_3 #f6d32d; +@define-color yellow_4 #f5c211; +@define-color yellow_5 #e5a50a; +@define-color orange_1 #ffbe6f; +@define-color orange_2 #ffa348; +@define-color orange_3 #ff7800; +@define-color orange_4 #e66100; +@define-color orange_5 #c64600; +@define-color red_1 #f66151; +@define-color red_2 #ed333b; +@define-color red_3 #e01b24; +@define-color red_4 #c01c28; +@define-color red_5 #a51d2d; +@define-color purple_1 #dc8add; +@define-color purple_2 #c061cb; +@define-color purple_3 #9141ac; +@define-color purple_4 #813d9c; +@define-color purple_5 #613583; +@define-color brown_1 #cdab8f; +@define-color brown_2 #b5835a; +@define-color brown_3 #986a44; +@define-color brown_4 #865e3c; +@define-color brown_5 #63452c; +@define-color light_1 #ffffff; +@define-color light_2 #f6f5f4; +@define-color light_3 #deddda; +@define-color light_4 #c0bfbc; +@define-color light_5 #9a9996; +@define-color dark_1 #77767b; +@define-color dark_2 #5e5c64; +@define-color dark_3 #3d3846; +@define-color dark_4 #241f31; +@define-color dark_5 #000000; +/* GTK NAMED COLORS + ---------------- + use responsibly! */ +@define-color accent_bg_color #b7bdf8; +@define-color accent_fg_color rgba(0, 0, 0, 0.87); +@define-color accent_color #b7bdf8; +@define-color destructive_bg_color #F44336; +@define-color destructive_fg_color #FFFFFF; +@define-color destructive_color #F44336; +@define-color success_bg_color #66BB6A; +@define-color success_fg_color #FFFFFF; +@define-color success_color #66BB6A; +@define-color warning_bg_color #FBC02D; +@define-color warning_fg_color rgba(0, 0, 0, 0.87); +@define-color warning_color #FBC02D; +@define-color error_bg_color #F44336; +@define-color error_fg_color #FFFFFF; +@define-color error_color #F44336; +@define-color window_bg_color #24273a; +@define-color window_fg_color #FFFFFF; +@define-color view_bg_color #24273a; +@define-color view_fg_color #FFFFFF; +@define-color headerbar_bg_color #181926; +@define-color headerbar_fg_color #FFFFFF; +@define-color headerbar_border_color rgba(255, 255, 255, 0.12); +@define-color headerbar_backdrop_color #24273a; +@define-color headerbar_shade_color rgba(255, 255, 255, 0.12); +@define-color card_bg_color #24273a; +@define-color card_fg_color #FFFFFF; +@define-color card_shade_color rgba(255, 255, 255, 0.12); +@define-color dialog_bg_color #181926; +@define-color dialog_fg_color #FFFFFF; +@define-color popover_bg_color #24273a; +@define-color popover_fg_color #FFFFFF; +@define-color shade_color rgba(255, 255, 255, 0.12); +@define-color scrollbar_outline_color rgba(255, 255, 255, 0.12); diff --git a/gtk-4.0/gtk.css b/gtk-4.0/gtk.css new file mode 100644 index 0000000..97feec5 --- /dev/null +++ b/gtk-4.0/gtk.css @@ -0,0 +1,8461 @@ +@keyframes ripple { + to { + background-size: 1000% 1000%; + } +} + +@keyframes ripple-on-slider { + to { + background-size: auto, 1000% 1000%; + } +} + +@keyframes ripple-on-headerbar { + from { + background-image: radial-gradient(circle, #b7bdf8 0%, transparent 0%); + } + to { + background-image: radial-gradient(circle, #b7bdf8 100%, transparent 100%); + } +} + +/*************** + * Base States * + ***************/ +.background { + background-color: #24273a; + color: #FFFFFF; +} + +#desktopwindow.background { + background-color: transparent; +} + +dnd { + color: #FFFFFF; +} + +.normal-icons { + -gtk-icon-size: 16px; +} + +.large-icons { + -gtk-icon-size: 32px; +} + +.aboutdialog .large-icons { + -gtk-icon-size: 128px; +} + +spinner:disabled, +arrow:disabled, +scrollbar:disabled, +check:disabled, +radio:disabled, +treeview.expander:disabled { + -gtk-icon-filter: opacity(0.5); +} + +iconview, .view { + background-color: #24273a; + color: #FFFFFF; +} + +iconview:disabled, .view:disabled { + color: rgba(255, 255, 255, 0.5); +} + +iconview:selected, .view:selected { + color: #FFFFFF; +} + +textview text { + background-color: #24273a; +} + +textview border { + background-color: #181926; + color: rgba(255, 255, 255, 0.7); +} + +iconview:hover, iconview:selected { + border-radius: 3px; +} + +rubberband, .content-view rubberband, .content-view columnview.view > rubberband, +.content-view treeview.view > rubberband, .content-view .rubberband, columnview.view > rubberband, .content-view columnview.view > .rubberband, +treeview.view > rubberband, +.content-view treeview.view > .rubberband, gridview > rubberband, flowbox > rubberband { + border: 1px solid #b7bdf8; + background-color: rgba(183, 189, 248, 0.3); +} + +flowbox > flowboxchild { + padding: 4px; + border-radius: 6px; +} + +.content-view .tile:selected { + background-color: transparent; +} + +gridview > child { + padding: 3px; +} + +gridview > child:selected { + outline-color: alpha(currentColor, 0.06); +} + +gridview > child box { + border-spacing: 8px; + margin: 12px; +} + +coverflow cover { + color: #FFFFFF; + background-color: #24273a; + border: 1px solid black; +} + +label.separator { + color: rgba(255, 255, 255, 0.7); +} + +label:disabled { + opacity: 1; + color: rgba(255, 255, 255, 0.5); +} + +headerbar label:disabled, tab label:disabled, button label:disabled { + color: inherit; + opacity: 1; +} + +label.osd { + border-radius: 6px; + background-color: rgba(18, 19, 29, 0.9); + color: #FFFFFF; +} + +.dim-label, row.expander image.expander-row-arrow, row label.subtitle { + color: rgba(255, 255, 255, 0.7); + opacity: 1; +} + +.accent { + color: #b7bdf8; +} + +.success { + color: #66BB6A; +} + +.warning { + color: #FBC02D; +} + +.error { + color: #F44336; +} + +.large-title { + font-weight: 300; + font-size: 24pt; +} + +.title-1 { + font-weight: 800; + font-size: 20pt; +} + +.title-2 { + font-weight: 800; + font-size: 15pt; +} + +.title-3 { + font-weight: 700; + font-size: 15pt; +} + +.title-4 { + font-weight: 700; + font-size: 13pt; +} + +.heading { + font-weight: 700; + font-size: 11pt; +} + +.body { + font-weight: 400; + font-size: 11pt; +} + +.caption { + font-weight: 400; + font-size: 9pt; +} + +.caption-heading { + font-weight: 700; + font-size: 9pt; +} + +window.assistant .sidebar { + padding: 4px 0; +} + +window.assistant .sidebar label { + min-height: 36px; + padding: 0 12px; + color: rgba(255, 255, 255, 0.5); + font-weight: 500; +} + +window.assistant .sidebar label.highlight { + color: #FFFFFF; +} + +.osd .scale-popup > arrow, +.osd .scale-popup > contents, .osd popover > arrow, +.osd popover > contents, popover.touch-selection > arrow, +popover.touch-selection > contents, popover.magnifier > arrow, +popover.magnifier > contents, .osd { + color: #FFFFFF; + background-color: #24273a; + background-clip: padding-box; + border-radius: 6px; + border: none; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15), 0 3px 3px 0 rgba(0, 0, 0, 0.18), 0 3px 6px 0 rgba(0, 0, 0, 0.12), inset 0 1px rgba(255, 255, 255, 0.1); +} + +.osd { + padding: 6px; + margin: 6px; +} + +.osd.circular { + border-radius: 9999px; +} + +/********************* + * Spinner Animation * + *********************/ +@keyframes spin { + to { + transform: rotate(1turn); + } +} + +spinner { + background: none; + opacity: 0; + -gtk-icon-source: -gtk-icontheme("process-working-symbolic"); +} + +spinner:checked { + opacity: 1; + animation: spin 1s linear infinite; +} + +spinner:checked:disabled { + opacity: 0.5; +} + +/**************** + * Text Entries * + ****************/ + +entry headerbar popover.background entry, +headerbar popover.background entry entry, +entry { + min-height: 36px; + padding: 0 8px; + border-spacing: 6px; + border-radius: 6px; + caret-color: currentColor; + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(255, 255, 255, 0.08); + color: rgba(255, 255, 255, 0.7); + outline: 0 solid transparent; + outline-offset: 2px; +} + + +entry headerbar popover.background entry:focus-within, +headerbar popover.background entry entry:focus-within, +entry:focus-within { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + background-color: rgba(255, 255, 255, 0.08); + box-shadow: inset 0 0 0 2px transparent; + color: #FFFFFF; + outline: 2px solid #b7bdf8; + outline-offset: -2px; +} + + +entry headerbar popover.background entry:drop(active), +headerbar popover.background entry entry:drop(active), +entry headerbar popover.background entry:hover:not(:focus-within), +headerbar popover.background entry entry:hover:not(:focus-within), +entry:drop(active), +entry:hover:not(:focus-within) { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + background-color: alpha(currentColor, 0.08); + box-shadow: inset 0 0 0 2px alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; + outline-offset: 2px; +} + + +entry headerbar popover.background entry:disabled, +headerbar popover.background entry entry:disabled, +entry:disabled { + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(255, 255, 255, 0.08); + color: rgba(255, 255, 255, 0.5); + outline: none; +} + + +entry headerbar popover.background entry > text > placeholder, +headerbar popover.background entry entry > text > placeholder, +entry > text > placeholder { + color: rgba(255, 255, 255, 0.5); +} + + +entry headerbar popover.background entry > text > block-cursor, +headerbar popover.background entry entry > text > block-cursor, +entry > text > block-cursor { + color: rgba(255, 255, 255, 0.04); + background-color: #FFFFFF; +} + + +entry headerbar popover.background entry.flat:focus-within, +headerbar popover.background entry entry.flat:focus-within, +entry headerbar popover.background entry.flat:disabled, +headerbar popover.background entry entry.flat:disabled, +entry headerbar popover.background entry.flat:hover, +headerbar popover.background entry entry.flat:hover, +entry headerbar popover.background entry.flat, +headerbar popover.background entry entry.flat, +entry.flat:focus-within, +entry.flat:disabled, +entry.flat:hover, +entry.flat { + min-height: 0; + padding: 2px; + background-color: transparent; + box-shadow: none; + border-radius: 0; + outline: none; +} + + +entry headerbar popover.background entry > image, +headerbar popover.background entry entry > image, +entry > image { + color: rgba(255, 255, 255, 0.7); +} + + +entry headerbar popover.background entry > image:hover, +headerbar popover.background entry entry > image:hover, +entry headerbar popover.background entry > image:active, +headerbar popover.background entry entry > image:active, +entry > image:hover, +entry > image:active { + color: #FFFFFF; +} + + +entry headerbar popover.background entry > image:disabled, +headerbar popover.background entry entry > image:disabled, +entry > image:disabled { + color: rgba(255, 255, 255, 0.5); +} + + +entry headerbar popover.background entry > image.left, +headerbar popover.background entry entry > image.left, +entry > image.left { + margin: 0 6px 0 2px; +} + + +entry headerbar popover.background entry > image.right, +headerbar popover.background entry entry > image.right, +entry > image.right { + margin: 0 2px 0 6px; +} + + +entry headerbar popover.background entry.password image.caps-lock-indicator, +headerbar popover.background entry entry.password image.caps-lock-indicator, +entry.password image.caps-lock-indicator { + opacity: 0.35; +} + + +entry headerbar popover.background entry.error, +headerbar popover.background entry entry.error, +entry.error { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(244, 67, 54, 0.1); + color: rgba(244, 67, 54, 0.75); + outline: 0 solid transparent; + outline-offset: 2px; + outline: none; +} + + +entry headerbar popover.background entry.error:focus-within, +headerbar popover.background entry entry.error:focus-within, +entry.error:focus-within { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + background-color: rgba(244, 67, 54, 0.1); + box-shadow: inset 0 0 0 2px transparent; + color: #F44336; + outline: 2px solid #F44336; + outline-offset: -2px; + outline: none; +} + + +entry headerbar popover.background entry.error:drop(active), +headerbar popover.background entry entry.error:drop(active), +entry headerbar popover.background entry.error:hover:not(:focus-within), +headerbar popover.background entry entry.error:hover:not(:focus-within), +entry.error:drop(active), +entry.error:hover:not(:focus-within) { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + background-color: alpha(currentColor, 0.08); + box-shadow: inset 0 0 0 2px alpha(currentColor, 0.08); + color: #F44336; + outline: 0 solid transparent; + outline-offset: 2px; + outline: none; +} + + +entry headerbar popover.background entry.error:disabled, +headerbar popover.background entry entry.error:disabled, +entry.error:disabled { + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(244, 67, 54, 0.1); + color: rgba(244, 67, 54, 0.35); + outline: none; + outline: none; +} + + +entry headerbar popover.background entry.error > text > selection, +headerbar popover.background entry entry.error > text > selection, +entry.error > text > selection { + background-color: rgba(244, 67, 54, 0.25); + color: #F44336; +} + + +entry headerbar popover.background entry.error > text > cursor-handle > contents, +headerbar popover.background entry entry.error > text > cursor-handle > contents, +entry.error > text > cursor-handle > contents { + background-color: currentColor; +} + + +entry headerbar popover.background entry.error > image, +headerbar popover.background entry entry.error > image, +entry.error > image { + color: rgba(244, 67, 54, 0.75); +} + + +entry headerbar popover.background entry.error > image:hover, +headerbar popover.background entry entry.error > image:hover, +entry headerbar popover.background entry.error > image:active, +headerbar popover.background entry entry.error > image:active, +entry.error > image:hover, +entry.error > image:active { + color: #F44336; +} + + +entry headerbar popover.background entry.error > image:disabled, +headerbar popover.background entry entry.error > image:disabled, +entry.error > image:disabled { + color: rgba(244, 67, 54, 0.35); +} + + +entry headerbar popover.background entry.warning, +headerbar popover.background entry entry.warning, +entry.warning { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(251, 192, 45, 0.1); + color: rgba(251, 192, 45, 0.75); + outline: 0 solid transparent; + outline-offset: 2px; + outline: none; +} + + +entry headerbar popover.background entry.warning:focus-within, +headerbar popover.background entry entry.warning:focus-within, +entry.warning:focus-within { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + background-color: rgba(251, 192, 45, 0.1); + box-shadow: inset 0 0 0 2px transparent; + color: #FBC02D; + outline: 2px solid #FBC02D; + outline-offset: -2px; + outline: none; +} + + +entry headerbar popover.background entry.warning:drop(active), +headerbar popover.background entry entry.warning:drop(active), +entry headerbar popover.background entry.warning:hover:not(:focus-within), +headerbar popover.background entry entry.warning:hover:not(:focus-within), +entry.warning:drop(active), +entry.warning:hover:not(:focus-within) { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + background-color: alpha(currentColor, 0.08); + box-shadow: inset 0 0 0 2px alpha(currentColor, 0.08); + color: #FBC02D; + outline: 0 solid transparent; + outline-offset: 2px; + outline: none; +} + + +entry headerbar popover.background entry.warning:disabled, +headerbar popover.background entry entry.warning:disabled, +entry.warning:disabled { + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(251, 192, 45, 0.1); + color: rgba(251, 192, 45, 0.35); + outline: none; + outline: none; +} + + +entry headerbar popover.background entry.warning > text > selection, +headerbar popover.background entry entry.warning > text > selection, +entry.warning > text > selection { + background-color: rgba(251, 192, 45, 0.25); + color: #FBC02D; +} + + +entry headerbar popover.background entry.warning > text > cursor-handle > contents, +headerbar popover.background entry entry.warning > text > cursor-handle > contents, +entry.warning > text > cursor-handle > contents { + background-color: currentColor; +} + + +entry headerbar popover.background entry.warning > image, +headerbar popover.background entry entry.warning > image, +entry.warning > image { + color: rgba(251, 192, 45, 0.75); +} + + +entry headerbar popover.background entry.warning > image:hover, +headerbar popover.background entry entry.warning > image:hover, +entry headerbar popover.background entry.warning > image:active, +headerbar popover.background entry entry.warning > image:active, +entry.warning > image:hover, +entry.warning > image:active { + color: #FBC02D; +} + + +entry headerbar popover.background entry.warning > image:disabled, +headerbar popover.background entry entry.warning > image:disabled, +entry.warning > image:disabled { + color: rgba(251, 192, 45, 0.35); +} + + +entry headerbar popover.background entry.success, +headerbar popover.background entry entry.success, +entry.success { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(102, 187, 106, 0.1); + color: rgba(102, 187, 106, 0.75); + outline: 0 solid transparent; + outline-offset: 2px; + outline: none; +} + + +entry headerbar popover.background entry.success:focus-within, +headerbar popover.background entry entry.success:focus-within, +entry.success:focus-within { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + background-color: rgba(102, 187, 106, 0.1); + box-shadow: inset 0 0 0 2px transparent; + color: #66BB6A; + outline: 2px solid #66BB6A; + outline-offset: -2px; + outline: none; +} + + +entry headerbar popover.background entry.success:drop(active), +headerbar popover.background entry entry.success:drop(active), +entry headerbar popover.background entry.success:hover:not(:focus-within), +headerbar popover.background entry entry.success:hover:not(:focus-within), +entry.success:drop(active), +entry.success:hover:not(:focus-within) { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + background-color: alpha(currentColor, 0.08); + box-shadow: inset 0 0 0 2px alpha(currentColor, 0.08); + color: #66BB6A; + outline: 0 solid transparent; + outline-offset: 2px; + outline: none; +} + + +entry headerbar popover.background entry.success:disabled, +headerbar popover.background entry entry.success:disabled, +entry.success:disabled { + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(102, 187, 106, 0.1); + color: rgba(102, 187, 106, 0.35); + outline: none; + outline: none; +} + + +entry headerbar popover.background entry.success > text > selection, +headerbar popover.background entry entry.success > text > selection, +entry.success > text > selection { + background-color: rgba(102, 187, 106, 0.25); + color: #66BB6A; +} + + +entry headerbar popover.background entry.success > text > cursor-handle > contents, +headerbar popover.background entry entry.success > text > cursor-handle > contents, +entry.success > text > cursor-handle > contents { + background-color: currentColor; +} + + +entry headerbar popover.background entry.success > image, +headerbar popover.background entry entry.success > image, +entry.success > image { + color: rgba(102, 187, 106, 0.75); +} + + +entry headerbar popover.background entry.success > image:hover, +headerbar popover.background entry entry.success > image:hover, +entry headerbar popover.background entry.success > image:active, +headerbar popover.background entry entry.success > image:active, +entry.success > image:hover, +entry.success > image:active { + color: #66BB6A; +} + + +entry headerbar popover.background entry.success > image:disabled, +headerbar popover.background entry entry.success > image:disabled, +entry.success > image:disabled { + color: rgba(102, 187, 106, 0.35); +} + + +entry > progress, +entry progress > trough > progress { + margin: 0 -4px; + border-bottom: 2px solid #b7bdf8; + background-color: transparent; +} + +.osd entry > progress > trough > progress { + border-color: rgba(255, 255, 255, 0.04); +} + + +entry button.image-button { + min-height: 24px; + min-width: 24px; + padding: 0; +} + +treeview entry.flat, treeview entry { + background-color: #24273a; +} + +treeview entry.flat, treeview entry.flat:focus-within, treeview entry, treeview entry:focus-within { + border-image: none; + box-shadow: none; +} + +.entry-tag { + margin: 2px; + border-radius: 9999px; + box-shadow: none; + background-color: rgba(255, 255, 255, 0.12); + color: #FFFFFF; +} + +.entry-tag:hover { + background-image: image(alpha(currentColor, 0.08)); +} + +:dir(ltr) .entry-tag { + margin-left: 4px; + margin-right: 0; + padding-left: 12px; + padding-right: 8px; +} + +:dir(rtl) .entry-tag { + margin-left: 0; + margin-right: 4px; + padding-left: 8px; + padding-right: 12px; +} + +.entry-tag.button { + box-shadow: none; + background-color: transparent; +} + +.entry-tag.button:not(:hover):not(:active) { + color: rgba(255, 255, 255, 0.7); +} + +editablelabel > stack > text { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(255, 255, 255, 0.08); + color: rgba(255, 255, 255, 0.7); + outline: 0 solid transparent; + outline-offset: 2px; +} + +/*********** + * Buttons * + ***********/ +@keyframes needs-attention { + from { + background-image: radial-gradient(farthest-side, #b7bdf8 0%, rgba(183, 189, 248, 0) 0%); + } + to { + background-image: radial-gradient(farthest-side, #b7bdf8 95%, rgba(183, 189, 248, 0)); + } +} + +infobar.warning > revealer > box button, infobar.warning:backdrop > revealer > box button, popover.touch-selection button, popover.magnifier button, headerbar.selection-mode button:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.7); +} + +infobar.warning > revealer > box button:focus, popover.touch-selection button:focus, popover.magnifier button:focus, headerbar.selection-mode button:focus:not(.suggested-action):not(.destructive-action), infobar.warning > revealer > box button:hover, popover.touch-selection button:hover, popover.magnifier button:hover, headerbar.selection-mode button:hover:not(.suggested-action):not(.destructive-action), infobar.warning > revealer > box button:active, popover.touch-selection button:active, popover.magnifier button:active, headerbar.selection-mode button:active:not(.suggested-action):not(.destructive-action), infobar.warning > revealer > box button:checked, popover.touch-selection button:checked, popover.magnifier button:checked, headerbar.selection-mode button:checked:not(.suggested-action):not(.destructive-action) { + color: #FFFFFF; +} + +infobar.warning > revealer > box button:disabled, popover.touch-selection button:disabled, popover.magnifier button:disabled, headerbar.selection-mode button:disabled:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.32); +} + +infobar.warning > revealer > box button:checked:disabled, popover.touch-selection button:checked:disabled, popover.magnifier button:checked:disabled, headerbar.selection-mode button:checked:disabled:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.5); +} + +row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr):last-child, row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child, +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child, headerbar popover.background button:not(.suggested-action):not(.destructive-action):not(.flat), button { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), background-size 300ms cubic-bezier(0, 0, 0.2, 1), background-image 1200ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1); + background-color: rgba(255, 255, 255, 0.08); + background-image: radial-gradient(circle, transparent 10%, transparent 0%); + background-repeat: no-repeat; + background-position: center; + background-size: 1000% 1000%; + outline: 0 solid transparent; + outline-offset: 2px; + color: #FFFFFF; +} + +row.spin spinbutton > button.image-button.up:focus:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, row.spin spinbutton > button.image-button.up:focus:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr), row.spin spinbutton > button.image-button.up:focus:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child, +row.spin spinbutton > button.image-button.down:focus:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.image-button.down:focus:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.image-button.down:focus:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child, headerbar popover.background button:focus:not(.suggested-action):not(.destructive-action):not(.flat), button:focus { + outline: 2px solid rgba(183, 189, 248, 0.35); + outline-offset: 0; +} + +row.spin spinbutton > button.image-button.up:hover:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, row.spin spinbutton > button.image-button.up:hover:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr), row.spin spinbutton > button.image-button.up:hover:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child, +row.spin spinbutton > button.image-button.down:hover:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.image-button.down:hover:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.image-button.down:hover:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child, headerbar popover.background button:hover:not(.suggested-action):not(.destructive-action):not(.flat), button:hover { + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; + -gtk-icon-filter: brightness(1.2); +} + +row.spin spinbutton > button.keyboard-activating.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, row.spin spinbutton > button.keyboard-activating.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr), row.spin spinbutton > button.keyboard-activating.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child, +row.spin spinbutton > button.keyboard-activating.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.keyboard-activating.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.keyboard-activating.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child, headerbar popover.background button.keyboard-activating:not(.suggested-action):not(.destructive-action):not(.flat), button.keyboard-activating, row.spin spinbutton > button.image-button.up:active:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, row.spin spinbutton > button.image-button.up:active:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr), row.spin spinbutton > button.image-button.up:active:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child, +row.spin spinbutton > button.image-button.down:active:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.image-button.down:active:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.image-button.down:active:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child, headerbar popover.background button:active:not(.suggested-action):not(.destructive-action):not(.flat), button:active { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms, border 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.08) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; +} + +row.spin spinbutton > button.image-button.up:disabled:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, row.spin spinbutton > button.image-button.up:disabled:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr), row.spin spinbutton > button.image-button.up:disabled:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child, +row.spin spinbutton > button.image-button.down:disabled:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.image-button.down:disabled:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.image-button.down:disabled:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child, headerbar popover.background button:disabled:not(.suggested-action):not(.destructive-action):not(.flat), button:disabled { + background-color: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.5); + outline-color: transparent; +} + +row.spin spinbutton > button.image-button.up:checked:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, row.spin spinbutton > button.image-button.up:checked:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr), row.spin spinbutton > button.image-button.up:checked:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child, +row.spin spinbutton > button.image-button.down:checked:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.image-button.down:checked:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.image-button.down:checked:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child, headerbar popover.background button:checked:not(.suggested-action):not(.destructive-action):not(.flat), button:checked { + background-color: #b7bdf8; + color: rgba(0, 0, 0, 0.87); +} + +row.spin spinbutton > button.image-button.up:checked:hover:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, +row.spin spinbutton > button.image-button.down:checked:hover:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.image-button.down:checked:hover:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.image-button.down:checked:hover:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child, headerbar popover.background button:checked:hover:not(.suggested-action):not(.destructive-action):not(.flat), button:checked:hover { + outline-color: transparent; + background-color: #ced2fa; + color: rgba(0, 0, 0, 0.87); +} + +row.spin spinbutton > button.image-button.up:checked:disabled:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, +row.spin spinbutton > button.image-button.down:checked:disabled:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.image-button.down:checked:disabled:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.image-button.down:checked:disabled:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child, headerbar popover.background button:checked:disabled:not(.suggested-action):not(.destructive-action):not(.flat), button:checked:disabled { + outline-color: transparent; + background-color: rgba(183, 189, 248, 0.35); + color: rgba(0, 0, 0, 0.38); +} + +placessidebar row button.sidebar-button, calendar > header > button, scrollbar button, notebook > header > tabs > arrow, popover modelbutton, spinbutton > button, splitbutton.flat > button, +splitbutton.flat > menubutton > button { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 300ms cubic-bezier(0, 0, 0.2, 1), background-image 1200ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1); + background-image: radial-gradient(circle, transparent 10%, transparent 0%); + background-repeat: no-repeat; + background-position: center; + background-size: 1000% 1000%; + background-color: transparent; + outline: 0 solid transparent; + outline-offset: 2px; + color: rgba(255, 255, 255, 0.7); +} + +placessidebar row button.sidebar-button:focus:not(:hover):not(:active), calendar > header > button:focus:not(:hover):not(:active), scrollbar button:focus:not(:hover):not(:active), notebook > header > tabs > arrow:focus:not(:hover):not(:active), popover modelbutton:focus:not(:hover):not(:active), spinbutton > button:focus:not(:hover):not(:active), splitbutton.flat > button:focus:not(:hover):not(:active), +splitbutton.flat > menubutton > button:focus:not(:hover):not(:active) { + color: #FFFFFF; + outline: 2px solid rgba(255, 255, 255, 0.04); + outline-offset: -2px; +} + +placessidebar row button.sidebar-button:hover, calendar > header > button:hover, scrollbar button:hover, notebook > header > tabs > arrow:hover, popover modelbutton:hover, spinbutton > button:hover, splitbutton.flat > button:hover, +splitbutton.flat > menubutton > button:hover { + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; +} + +placessidebar row button.sidebar-button:active, calendar > header > button:active, scrollbar button:active, notebook > header > tabs > arrow:active, popover modelbutton:active, spinbutton > button:active, splitbutton.flat > button:active, +splitbutton.flat > menubutton > button:active { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.08) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; +} + +placessidebar row button.sidebar-button:disabled, calendar > header > button:disabled, scrollbar button:disabled, notebook > header > tabs > arrow:disabled, popover modelbutton:disabled, spinbutton > button:disabled, splitbutton.flat > button:disabled, +splitbutton.flat > menubutton > button:disabled { + color: rgba(255, 255, 255, 0.32); + background-color: transparent; +} + +filechooser #pathbarbox > stack > box > button, window.messagedialog .response-area button, window.dialog.message .dialog-action-area > button, .app-notification button, headerbar button:not(.suggested-action):not(.destructive-action), .toolbar button, dropdown > .linked:not(.vertical) > button:not(:only-child), +combobox > .linked:not(.vertical) > button:not(:only-child), splitbutton.suggested-action > button, splitbutton.suggested-action > menubutton > button, splitbutton.destructive-action > button, splitbutton.destructive-action > menubutton > button, splitbutton.opaque > button, splitbutton.opaque > menubutton > button, menubutton.suggested-action > button, menubutton.destructive-action > button, menubutton.opaque > button, menubutton.flat > button, button.flat { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 300ms cubic-bezier(0, 0, 0.2, 1), background-image 1200ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1); + background-image: radial-gradient(circle, transparent 10%, transparent 0%); + background-repeat: no-repeat; + background-position: center; + background-size: 1000% 1000%; + background-color: transparent; + outline: 0 solid transparent; + outline-offset: 2px; + color: rgba(255, 255, 255, 0.7); +} + +filechooser #pathbarbox > stack > box > button:focus:not(:hover):not(:active), window.messagedialog .response-area button:focus:not(:hover):not(:active), window.dialog.message .dialog-action-area > button:focus:not(:hover):not(:active), .app-notification button:focus:not(:hover):not(:active), headerbar button:focus:not(:hover):not(:active):not(.suggested-action):not(.destructive-action), .toolbar button:focus:not(:hover):not(:active), dropdown > .linked:not(.vertical) > button:focus:not(:hover):not(:active):not(:only-child), +combobox > .linked:not(.vertical) > button:focus:not(:hover):not(:active):not(:only-child), splitbutton.suggested-action > button:focus:not(:hover):not(:active), splitbutton.suggested-action > menubutton > button:focus:not(:hover):not(:active), splitbutton.destructive-action > button:focus:not(:hover):not(:active), splitbutton.destructive-action > menubutton > button:focus:not(:hover):not(:active), splitbutton.opaque > button:focus:not(:hover):not(:active), splitbutton.opaque > menubutton > button:focus:not(:hover):not(:active), menubutton.suggested-action > button:focus:not(:hover):not(:active), menubutton.destructive-action > button:focus:not(:hover):not(:active), menubutton.opaque > button:focus:not(:hover):not(:active), menubutton.flat > button:focus:not(:hover):not(:active), button.flat:focus:not(:hover):not(:active) { + color: #FFFFFF; + outline: 2px solid rgba(255, 255, 255, 0.04); + outline-offset: -2px; +} + +filechooser #pathbarbox > stack > box > button:hover, window.messagedialog .response-area button:hover, window.dialog.message .dialog-action-area > button:hover, .app-notification button:hover, headerbar button:hover:not(.suggested-action):not(.destructive-action), .toolbar button:hover, dropdown > .linked:not(.vertical) > button:hover:not(:only-child), +combobox > .linked:not(.vertical) > button:hover:not(:only-child), splitbutton.suggested-action > button:hover, splitbutton.suggested-action > menubutton > button:hover, splitbutton.destructive-action > button:hover, splitbutton.destructive-action > menubutton > button:hover, splitbutton.opaque > button:hover, splitbutton.opaque > menubutton > button:hover, menubutton.suggested-action > button:hover, menubutton.destructive-action > button:hover, menubutton.opaque > button:hover, menubutton.flat > button:hover, button.flat:hover { + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; +} + +filechooser #pathbarbox > stack > box > button:active, window.messagedialog .response-area button:active, window.dialog.message .dialog-action-area > button:active, .app-notification button:active, headerbar button:active:not(.suggested-action):not(.destructive-action), .toolbar button:active, dropdown > .linked:not(.vertical) > button:active:not(:only-child), +combobox > .linked:not(.vertical) > button:active:not(:only-child), splitbutton.suggested-action > button:active, splitbutton.suggested-action > menubutton > button:active, splitbutton.destructive-action > button:active, splitbutton.destructive-action > menubutton > button:active, splitbutton.opaque > button:active, splitbutton.opaque > menubutton > button:active, menubutton.suggested-action > button:active, menubutton.destructive-action > button:active, menubutton.opaque > button:active, menubutton.flat > button:active, button.flat:active { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.08) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; +} + +filechooser #pathbarbox > stack > box > button:disabled, window.messagedialog .response-area button:disabled, window.dialog.message .dialog-action-area > button:disabled, .app-notification button:disabled, headerbar button:disabled:not(.suggested-action):not(.destructive-action), .toolbar button:disabled, dropdown > .linked:not(.vertical) > button:disabled:not(:only-child), +combobox > .linked:not(.vertical) > button:disabled:not(:only-child), splitbutton.suggested-action > button:disabled, splitbutton.suggested-action > menubutton > button:disabled, splitbutton.destructive-action > button:disabled, splitbutton.destructive-action > menubutton > button:disabled, splitbutton.opaque > button:disabled, splitbutton.opaque > menubutton > button:disabled, menubutton.suggested-action > button:disabled, menubutton.destructive-action > button:disabled, menubutton.opaque > button:disabled, menubutton.flat > button:disabled, button.flat:disabled { + color: rgba(255, 255, 255, 0.32); + background-color: transparent; +} + +filechooser #pathbarbox > stack > box > button:checked, window.messagedialog .response-area button:checked, window.dialog.message .dialog-action-area > button:checked, .app-notification button:checked, headerbar button:checked:not(.suggested-action):not(.destructive-action), .toolbar button:checked, dropdown > .linked:not(.vertical) > button:checked:not(:only-child), +combobox > .linked:not(.vertical) > button:checked:not(:only-child), splitbutton.suggested-action > button:checked, splitbutton.suggested-action > menubutton > button:checked, splitbutton.destructive-action > button:checked, splitbutton.destructive-action > menubutton > button:checked, splitbutton.opaque > button:checked, splitbutton.opaque > menubutton > button:checked, menubutton.suggested-action > button:checked, menubutton.destructive-action > button:checked, menubutton.opaque > button:checked, menubutton.flat > button:checked, button.flat:checked { + background-color: alpha(currentColor, 0.1); + color: #FFFFFF; +} + +filechooser #pathbarbox > stack > box > button:checked:disabled, window.messagedialog .response-area button:checked:disabled, window.dialog.message .dialog-action-area > button:checked:disabled, .app-notification button:checked:disabled, headerbar button:checked:disabled:not(.suggested-action):not(.destructive-action), .toolbar button:checked:disabled, dropdown > .linked:not(.vertical) > button:checked:disabled:not(:only-child), +combobox > .linked:not(.vertical) > button:checked:disabled:not(:only-child), splitbutton.suggested-action > button:checked:disabled, splitbutton.suggested-action > menubutton > button:checked:disabled, splitbutton.destructive-action > button:checked:disabled, splitbutton.destructive-action > menubutton > button:checked:disabled, splitbutton.opaque > button:checked:disabled, splitbutton.opaque > menubutton > button:checked:disabled, menubutton.suggested-action > button:checked:disabled, menubutton.destructive-action > button:checked:disabled, menubutton.opaque > button:checked:disabled, menubutton.flat > button:checked:disabled, button.flat:checked:disabled { + background-color: alpha(currentColor, 0.1); + color: rgba(255, 255, 255, 0.5); +} + +button.opaque { + box-shadow: none; +} + +.osd button.opaque:focus:focus-visible { + outline-color: rgba(255, 255, 255, 0.15); +} + +button.opaque:hover { + background-image: image(alpha(currentColor, 0.1)); +} + +button.keyboard-activating.opaque, button.opaque:active { + background-image: image(rgba(0, 0, 0, 0.2)); +} + +button.opaque:checked { + background-image: image(rgba(0, 0, 0, 0.15)); +} + +button.opaque:checked:hover { + background-image: image(rgba(0, 0, 0, 0.05)); +} + +button.opaque:checked.keyboard-activating, button.opaque:checked:active { + background-image: image(rgba(0, 0, 0, 0.3)); +} + +.nautilus-window .floating-bar button, placessidebar row button.sidebar-button, notebook > header > tabs > tab button.flat, popover.menu box.circular-buttons button.circular.image-button.model, spinbutton > button { + min-height: 24px; + min-width: 24px; + padding: 0; + border-radius: 9999px; +} + +button { + min-height: 24px; + min-width: 16px; + padding: 6px 10px; + border-radius: 6px; + font-weight: 500; +} + +button:drop(active) { + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; +} + +button separator { + margin: 4px 1px; +} + +button.opaque { + background-color: #505261; + color: #FFFFFF; +} + +button.text-button { + min-width: 32px; + padding-left: 16px; + padding-right: 16px; +} + +button.image-button { + min-width: 24px; + padding: 6px; +} + +button.text-button.image-button, button.image-text-button { + min-width: 24px; + padding: 6px; + border-radius: 6px; +} + +button.text-button.image-button > box, +button.text-button.image-button > box > box, button.image-text-button > box, +button.image-text-button > box > box { + border-spacing: 4px; +} + +button.text-button.image-button > box > label, +button.text-button.image-button > box > box > label, button.image-text-button > box > label, +button.image-text-button > box > box > label { + padding-left: 2px; + padding-right: 2px; +} + +button.text-button.image-button label:first-child, button.image-text-button label:first-child { + margin-left: 10px; +} + +button.text-button.image-button label:last-child, button.image-text-button label:last-child { + margin-right: 10px; +} + +button.text-button.image-button.flat label:first-child, button.image-text-button.flat label:first-child { + margin-left: 6px; +} + +button.text-button.image-button.flat label:last-child, button.image-text-button.flat label:last-child { + margin-right: 6px; +} + +button.text-button.image-button image:not(:only-child), button.image-text-button image:not(:only-child) { + margin: 0 4px; +} + +button.arrow-button { + padding-left: 9px; + padding-right: 9px; +} + +button.arrow-button > box { + border-spacing: 4px; +} + +button.arrow-button.text-button { + padding-left: 16px; + padding-right: 16px; +} + +button.arrow-button.text-button > box { + border-spacing: 6px; +} + +menubutton.pill > button, button.pill { + padding: 9px 30px; + border-radius: 9999px; +} + +button.card { + background-color: rgba(255, 255, 255, 0.04); + background-clip: padding-box; + font-weight: inherit; + border: 1px solid rgba(255, 255, 255, 0.12); + background-clip: border-box; +} + +button.card:hover { + background-image: none; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; +} + +button.card.keyboard-activating, button.card:active { + background-image: none; + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms, border 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.08) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; +} + +button.card:checked { + background-image: none; + background-color: #b7bdf8; + color: rgba(0, 0, 0, 0.87); + border-color: #b7bdf8; +} + +button.card:checked:hover { + background-image: none; + outline-color: transparent; + background-color: #ced2fa; + color: rgba(0, 0, 0, 0.87); +} + +button.card:checked:disabled { + outline-color: transparent; + background-color: rgba(183, 189, 248, 0.35); + color: rgba(0, 0, 0, 0.38); +} + +button.card:checked.keyboard-activating, button.card:checked:active { + background-image: none; +} + +button.card:checked.has-open-popup { + background-image: none; +} + +button.card:drop(active) { + color: #FF7043; + box-shadow: inset 0 0 0 1px #FF7043; +} + +.linked:not(.vertical) > button:focus, .linked.vertical > button:focus { + box-shadow: none; + outline: none; +} + +.linked:not(.vertical) > button.flat:not(:only-child), .linked.vertical > button.flat:not(:only-child) { + background-color: alpha(currentColor, 0.05); +} + +.linked:not(.vertical) > button.flat:focus, .linked.vertical > button.flat:focus { + box-shadow: none; + outline: none; +} + +.linked:not(.vertical) > menubutton > button { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +button.osd { + min-height: 24px; + min-width: 24px; + padding: 6px; + box-shadow: none; + background-color: rgba(0, 0, 0, 0.35); + color: white; + margin: 0; +} + +button.osd > image { + padding: 0; +} + +button.osd.remove-button { + padding: 0; +} + +button.osd:focus { + outline-color: transparent; +} + +button.osd:hover { + background-color: rgba(0, 0, 0, 0.45); + color: white; +} + +button.osd:active { + background-color: rgba(0, 0, 0, 0.65); + color: white; +} + +button.osd:disabled { + background-color: rgba(0, 0, 0, 0.15); + color: rgba(255, 255, 255, 0.35); +} + +button.suggested-action { + background-color: #b7bdf8; + color: rgba(0, 0, 0, 0.87); + box-shadow: none; +} + +button.suggested-action:disabled { + background-color: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.5); + outline-color: transparent; +} + +button.suggested-action:hover { + box-shadow: inset 0 0 0 9999px transparent, 0 2px 2.4px -1px rgba(183, 189, 248, 0.2), 0 4px 3px 0 rgba(183, 189, 248, 0.14), 0 1px 6px 0 rgba(183, 189, 248, 0.12); +} + +button.suggested-action:checked { + background-color: rgba(138, 142, 186, 0.961); +} + +button.suggested-action:checked:hover { + box-shadow: inset 0 0 0 9999px transparent, 0 3px 3px -3px rgba(183, 189, 248, 0.3), 0 2px 3px -1px rgba(183, 189, 248, 0.24), 0 2px 5px 0 rgba(183, 189, 248, 0.12); +} + +button.suggested-action:focus { + box-shadow: 0 0 0 2px rgba(183, 189, 248, 0.35); +} + +button.suggested-action.flat { + background-color: transparent; + color: #b7bdf8; +} + +button.suggested-action.flat:disabled { + color: rgba(255, 255, 255, 0.32); + background-color: transparent; +} + +button.suggested-action.flat:checked { + background-color: rgba(183, 189, 248, 0.3); +} + +button.destructive-action { + background-color: #F44336; + color: #FFFFFF; + box-shadow: none; +} + +button.destructive-action:disabled { + background-color: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.5); + outline-color: transparent; +} + +button.destructive-action:hover { + box-shadow: inset 0 0 0 9999px transparent, 0 2px 2.4px -1px rgba(244, 67, 54, 0.2), 0 4px 3px 0 rgba(244, 67, 54, 0.14), 0 1px 6px 0 rgba(244, 67, 54, 0.12); +} + +button.destructive-action:checked { + background-color: #f77b72; +} + +button.destructive-action:checked:hover { + box-shadow: inset 0 0 0 9999px transparent, 0 3px 3px -3px rgba(244, 67, 54, 0.3), 0 2px 3px -1px rgba(244, 67, 54, 0.24), 0 2px 5px 0 rgba(244, 67, 54, 0.12); +} + +button.destructive-action:focus { + box-shadow: 0 0 0 2px rgba(244, 67, 54, 0.35); +} + +button.destructive-action.flat { + background-color: transparent; + color: #F44336; +} + +button.destructive-action.flat:disabled { + color: rgba(255, 255, 255, 0.32); + background-color: transparent; +} + +button.destructive-action.flat:checked { + background-color: rgba(244, 67, 54, 0.3); +} + +stackswitcher > button > label { + margin: 0 -6px; + padding: 0 6px; +} + +stackswitcher > button > image { + margin: -3px -6px; + padding: 3px 6px; +} + +stackswitcher > button.needs-attention:checked > label, +stackswitcher > button.needs-attention:checked > image { + animation: none; + background-image: none; +} + +button.font > box, button.file > box { + border-spacing: 6px; +} + +button.font > box > box > label, button.file > box > box > label { + font-weight: bold; +} + +windowcontrols > button:not(.suggested-action):not(.destructive-action), filechooser #pathbarbox > stack > box > button, row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr):last-child, row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child, +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child, headerbar button.star, menubutton.circular > button, button.close, button.circular { + border-radius: 9999px; +} + +windowcontrols > button:not(.suggested-action):not(.destructive-action) label, filechooser #pathbarbox > stack > box > button label, row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child label, row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr):last-child label, row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child label, +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque) label, +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child label, +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child label, headerbar button.star label, menubutton.circular > button label, button.close label, button.circular label { + padding: 0; +} + +menubutton.osd { + background: none; + color: inherit; +} + +menubutton.suggested-action { + background-color: #b7bdf8; + color: white; +} + +menubutton.destructive-action { + background-color: #F44336; + color: white; +} + +menubutton.opaque { + background-color: #505261; + color: #FFFFFF; +} + +menubutton.suggested-action, menubutton.destructive-action, menubutton.opaque { + border-radius: 6px; +} + +menubutton.suggested-action.circular, menubutton.suggested-action.pill, menubutton.destructive-action.circular, menubutton.destructive-action.pill, menubutton.opaque.circular, menubutton.opaque.pill { + border-radius: 9999px; +} + +menubutton.suggested-action > button, menubutton.suggested-action > button:checked, menubutton.destructive-action > button, menubutton.destructive-action > button:checked, menubutton.opaque > button, menubutton.opaque > button:checked { + background-color: transparent; + color: inherit; +} + +menubutton.image-button > button { + min-width: 24px; + padding-left: 6px; + padding-right: 6px; +} + +menubutton arrow { + min-height: 16px; + min-width: 16px; +} + +menubutton arrow.none { + -gtk-icon-source: -gtk-icontheme("open-menu-symbolic"); +} + +menubutton arrow.down { + -gtk-icon-source: -gtk-icontheme("pan-down-symbolic"); +} + +menubutton arrow.up { + -gtk-icon-source: -gtk-icontheme("pan-up-symbolic"); +} + +menubutton arrow.left { + -gtk-icon-source: -gtk-icontheme("pan-start-symbolic"); +} + +menubutton arrow.right { + -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); +} + +splitbutton { + border-radius: 6px; +} + +splitbutton, splitbutton > separator { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); + transition-property: background; +} + +splitbutton > separator { + margin-top: 6px; + margin-bottom: 6px; + background: none; +} + +splitbutton > menubutton > button { + padding: 6px 10px; +} + +splitbutton.image-button > button { + min-width: 24px; + padding-left: 6px; + padding-right: 6px; +} + +splitbutton.text-button.image-button > button, splitbutton.image-text-button > button { + padding-left: 9px; + padding-right: 9px; +} + +splitbutton.text-button.image-button > button > box, splitbutton.image-text-button > button > box { + border-spacing: 6px; +} + +splitbutton > button:dir(ltr), +splitbutton > menubutton > button:dir(rtl) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + margin-right: -1px; +} + +splitbutton > button:dir(rtl), +splitbutton > menubutton > button:dir(ltr) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin-left: -1px; +} + +splitbutton.flat > separator { + background: rgba(255, 255, 255, 0.12); +} + +splitbutton.flat:hover, splitbutton.flat:active, splitbutton.flat:checked { + background: alpha(currentColor, 0.07); +} + +splitbutton.flat:hover > separator, splitbutton.flat:active > separator, splitbutton.flat:checked > separator { + background: none; +} + +splitbutton.flat:focus-within:focus-visible > separator { + background: none; +} + +splitbutton.flat > button, +splitbutton.flat > menubutton > button { + border-radius: 6px; +} + +splitbutton.suggested-action { + background-color: #b7bdf8; + color: white; +} + +splitbutton.destructive-action { + background-color: #F44336; + color: white; +} + +splitbutton.opaque { + background-color: #505261; + color: #FFFFFF; +} + +splitbutton.suggested-action > button, splitbutton.suggested-action > button:checked, splitbutton.suggested-action > menubutton > button, splitbutton.suggested-action > menubutton > button:checked, splitbutton.destructive-action > button, splitbutton.destructive-action > button:checked, splitbutton.destructive-action > menubutton > button, splitbutton.destructive-action > menubutton > button:checked, splitbutton.opaque > button, splitbutton.opaque > button:checked, splitbutton.opaque > menubutton > button, splitbutton.opaque > menubutton > button:checked { + color: inherit; + background-color: transparent; +} + +splitbutton.suggested-action > menubutton > button:dir(ltr), splitbutton.destructive-action > menubutton > button:dir(ltr), splitbutton.opaque > menubutton > button:dir(ltr) { + box-shadow: inset 1px 0 rgba(255, 255, 255, 0.12); +} + +splitbutton.suggested-action > menubutton > button:dir(rtl), splitbutton.destructive-action > menubutton > button:dir(rtl), splitbutton.opaque > menubutton > button:dir(rtl) { + box-shadow: inset -1px 0 rgba(255, 255, 255, 0.12); +} + +splitbutton > menubutton > button > arrow.none { + -gtk-icon-source: -gtk-icontheme("pan-down-symbolic"); +} + +buttoncontent { + border-spacing: 6px; +} + +buttoncontent > label { + font-weight: bold; +} + +buttoncontent > label:dir(ltr) { + padding-right: 2px; +} + +buttoncontent > label:dir(rtl) { + padding-left: 2px; +} + +.arrow-button > box > buttoncontent > label:dir(ltr), splitbutton > button > buttoncontent > label:dir(ltr) { + padding-right: 0; +} + +.arrow-button > box > buttoncontent > label:dir(rtl), splitbutton > button > buttoncontent > label:dir(rtl) { + padding-left: 0; +} + +stacksidebar row.needs-attention > label, stackswitcher > button.needs-attention > label, +stackswitcher > button.needs-attention > image { + animation: needs-attention 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-repeat: no-repeat; + background-position: right 3px; + background-size: 6px 6px; +} + +stacksidebar row.needs-attention > label:dir(rtl), stackswitcher > button.needs-attention > label:dir(rtl), +stackswitcher > button.needs-attention > image:dir(rtl) { + background-position: left 3px; +} + +.linked:not(.vertical) > entry, .linked:not(.vertical) > button, .linked:not(.vertical) > button.image-button { + border-radius: 0; +} + +.linked:not(.vertical) > entry:first-child, .linked:not(.vertical) > button:first-child { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} + +.linked:not(.vertical) > entry:last-child, .linked:not(.vertical) > button:last-child { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} + +.linked:not(.vertical) > entry:only-child, .linked:not(.vertical) > button:only-child { + border-radius: 6px; +} + +.linked.vertical > entry, .linked.vertical > button, .linked.vertical > button.image-button { + border-radius: 0; +} + +.linked.vertical > entry:first-child, .linked.vertical > button:first-child { + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +.linked.vertical > entry:last-child, .linked.vertical > button:last-child { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} + +.linked.vertical > entry:only-child, .linked.vertical > button:only-child { + border-radius: 6px; +} + +button.color { + min-height: 24px; + min-width: 24px; + padding: 6px; +} + + +list > row button.image-button:not(.flat) { + background-color: transparent; + box-shadow: none; + border: none; +} + + +list > row button.image-button:not(.flat):hover { + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; +} + + +list > row button.image-button:not(.flat):active, +list > row button.image-button:not(.flat):checked { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms, border 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.08) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; +} + + +list > row button.image-button:not(.flat).suggested-action { + background-color: #b7bdf8; + color: rgba(0, 0, 0, 0.87); +} + + +list > row button.image-button:not(.flat).destructive-action { + background-color: #F44336; + color: #FFFFFF; +} + +/********* + * Links * + *********/ +link { + color: #5bd3f8; +} + +link:visited { + color: #BA68C8; +} + +button.link:link, button.link:link:focus, button.link:link:hover, button.link:link:active { + color: #5bd3f8; +} + +button.link:visited, button.link:visited:focus, button.link:visited:hover, button.link:visited:active { + color: #BA68C8; +} + +button.link > label { + text-decoration-line: underline; +} + +/***************** + * GtkSpinButton * + *****************/ +spinbutton { + border-radius: 6px; + padding: 0; + border-spacing: 0; + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(255, 255, 255, 0.08); + color: rgba(255, 255, 255, 0.7); + outline: 0 solid transparent; + outline-offset: 2px; +} + +spinbutton:focus-within { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + background-color: rgba(255, 255, 255, 0.08); + box-shadow: inset 0 0 0 2px transparent; + color: #FFFFFF; + outline: 2px solid #b7bdf8; + outline-offset: -2px; +} + +spinbutton:disabled { + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(255, 255, 255, 0.08); + color: rgba(255, 255, 255, 0.5); + outline: none; +} + +spinbutton > text { + border-image: none; + border-radius: 0; + box-shadow: none; + background-color: transparent; + margin: 0; +} + +spinbutton > button { + border: none; +} + +spinbutton > button:focus:not(:hover):not(:active):not(:disabled) { + box-shadow: none; +} + +spinbutton:not(.vertical) > text { + min-width: 32px; + padding-left: 12px; +} + +spinbutton:not(.vertical) > button { + padding: 0; + margin: 6px; +} + +spinbutton:not(.vertical) > button.up:dir(ltr), spinbutton:not(.vertical) > button.down:dir(rtl) { + margin-left: 3px; +} + +spinbutton:not(.vertical) > button.up:dir(rtl), spinbutton:not(.vertical) > button.down:dir(ltr) { + margin-right: 3px; +} + +cell.activatable spinbutton:not(.vertical) { + margin: 3px 0; +} + +cell.activatable spinbutton:not(.vertical) > button { + margin: 0; + padding: 0; + min-height: 24px; + border-radius: 0; +} + +cell.activatable spinbutton:not(.vertical) > button:last-child { + border-radius: 0 6px 6px 0; +} + +cell.activatable spinbutton:not(.vertical) > button.up:dir(ltr), cell.activatable spinbutton:not(.vertical) > button.down:dir(rtl) { + margin-left: 0; +} + +cell.activatable spinbutton:not(.vertical) > button.up:dir(rtl), cell.activatable spinbutton:not(.vertical) > button.down:dir(ltr) { + margin-right: 0; +} + +spinbutton.vertical > text { + min-height: 36px; + min-width: 42px; + padding: 0; +} + +spinbutton.vertical > button { + padding: 0; + margin: 6px 9px; +} + +/************** + * ComboBoxes * + **************/ +dropdown > button > box { + border-spacing: 6px; +} + +dropdown arrow, +combobox arrow { + -gtk-icon-source: -gtk-icontheme("pan-down-symbolic"); + min-height: 16px; + min-width: 16px; +} + +dropdown > popover.menu > contents modelbutton, +combobox > popover.menu > contents modelbutton { + padding-left: 9px; + padding-right: 9px; +} + +dropdown button.combo cellview:dir(ltr), +combobox button.combo cellview:dir(ltr) { + margin-left: -2px; +} + +dropdown button.combo cellview:dir(rtl), +combobox button.combo cellview:dir(rtl) { + margin-right: -2px; +} + +dropdown popover, +combobox popover { + margin-top: 4px; + padding: 0; +} + +dropdown popover listview, +combobox popover listview { + margin: 0; +} + +dropdown popover listview > row, +combobox popover listview > row { + padding: 6px; +} + +dropdown popover listview > row:selected, +combobox popover listview > row:selected { + color: #FFFFFF; + background-color: alpha(currentColor, 0.06); +} + +dropdown popover .dropdown-searchbar, +combobox popover .dropdown-searchbar { + padding: 6px; +} + +dropdown.linked button:nth-child(2):dir(ltr), +combobox.linked button:nth-child(2):dir(ltr) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +dropdown.linked button:nth-child(2):dir(rtl), +combobox.linked button:nth-child(2):dir(rtl) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +dropdown > .linked:not(.vertical) > entry:not(:only-child), +combobox > .linked:not(.vertical) > entry:not(:only-child) { + border-radius: 6px; +} + +dropdown > .linked:not(.vertical) > entry:not(:only-child):first-child, +combobox > .linked:not(.vertical) > entry:not(:only-child):first-child { + margin-right: -36px; + padding-right: 36px; +} + +dropdown > .linked:not(.vertical) > entry:not(:only-child):last-child, +combobox > .linked:not(.vertical) > entry:not(:only-child):last-child { + margin-left: -36px; + padding-left: 36px; +} + +dropdown > .linked:not(.vertical) > button:not(:only-child), +combobox > .linked:not(.vertical) > button:not(:only-child) { + min-height: 16px; + min-width: 16px; + margin: 6px; + padding: 4px; + border-radius: 6px; +} + +.linked:not(.vertical) > combobox:not(:first-child) > box > button.combo { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.linked:not(.vertical) > combobox:not(:last-child) > box > button.combo { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.linked.vertical > combobox:not(:first-child) > box > button.combo { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.linked.vertical > combobox:not(:last-child) > box > button.combo { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +button.combo:only-child { + border-radius: 6px; + font-weight: normal; + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0, 0, 0.2, 1); + box-shadow: inset 0 0 0 2px transparent; + background-color: rgba(255, 255, 255, 0.08); + color: rgba(255, 255, 255, 0.7); + outline: 0 solid transparent; + outline-offset: 2px; +} + +button.combo:only-child:focus { + color: #FFFFFF; + outline: 2px solid rgba(255, 255, 255, 0.04); + outline-offset: -2px; +} + +button.combo:only-child:hover { + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; +} + +button.combo:only-child:active { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.08) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; +} + +button.combo:only-child:checked { + background-color: alpha(currentColor, 0.1); + color: #FFFFFF; +} + +button.combo:only-child:disabled { + background-color: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.5); + outline-color: transparent; +} + +/************ + * Toolbars * + ************/ +.toolbar { + padding: 6px; + background-color: #24273a; + border-spacing: 6px; +} + +.osd .toolbar { + background-color: transparent; +} + +.app-notification, .toolbar.osd { + transition: box-shadow 200ms ease-out; + padding: 6px; + border-radius: 12px; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15), 0 3px 3px 0 rgba(0, 0, 0, 0.18), 0 3px 6px 0 rgba(0, 0, 0, 0.12), inset 0 1px rgba(255, 255, 255, 0.1); + background-color: #363a4f; + color: #FFFFFF; +} + +.app-notification:backdrop, .toolbar.osd:backdrop { + box-shadow: 0 4px 3px -3px rgba(0, 0, 0, 0.2), 0 2px 2px -1px rgba(0, 0, 0, 0.24), 0 1px 3px 0 rgba(0, 0, 0, 0.12), inset 0 1px rgba(255, 255, 255, 0.1); +} + +.left.app-notification, .right.app-notification, .top.app-notification, .bottom.app-notification, .toolbar.osd.left, .toolbar.osd.right, .toolbar.osd.top, .toolbar.osd.bottom { + border-radius: 0; +} + +.bottom.app-notification, .toolbar.osd.bottom { + box-shadow: none; + background-color: transparent; + background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1) 30%, rgba(0, 0, 0, 0.2) 50%, rgba(0, 0, 0, 0.4)); +} + +.toolbar.horizontal > separator { + margin: 2px; +} + +.toolbar.vertical > separator { + margin: 2px; +} + +.toolbar entry, +.toolbar spinbutton, +.toolbar splitbutton, +.toolbar separator:not(.sidebar), +.toolbar button, +.toolbar menubutton, +.toolbar scalebutton { + margin-top: 0; + margin-bottom: 0; +} + +.toolbar menubutton > button, +.toolbar splitbutton > button, +.toolbar splitbutton > menubutton, +.toolbar scalebutton > button { + margin-top: 0; + margin-bottom: 0; +} + +.toolbar switch { + margin-top: 4px; + margin-bottom: 4px; +} + +.toolbar spinbutton entry, +.toolbar spinbutton button { + margin: 0; +} + +.toolbar popover.menu separator:not(.sidebar) { + margin-top: 6px; + margin-bottom: 6px; +} + +searchbar > revealer > box { + padding: 6px; + border-spacing: 0; + border-style: solid; + border-width: 0 0 1px; + border-color: rgba(255, 255, 255, 0.12); + background-color: #24273a; + background-clip: border-box; + box-shadow: none; +} + +searchbar > revealer > box entry, searchbar > revealer > box button, searchbar > revealer > box menubutton { + margin: 0; +} + +/*************** + * Header bars * + ***************/ +headerbar button:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.7); + border: none; +} + +headerbar button:hover:not(.suggested-action):not(.destructive-action), headerbar button:focus:not(:hover):not(:active):not(.suggested-action):not(.destructive-action), headerbar button:active:not(.suggested-action):not(.destructive-action), headerbar button:checked:not(.suggested-action):not(.destructive-action) { + color: #FFFFFF; +} + +headerbar button:disabled:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.32); +} + +headerbar button:checked:disabled:not(.suggested-action):not(.destructive-action) { + background-color: transparent; + color: rgba(255, 255, 255, 0.5); +} + +headerbar button:backdrop:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.5); +} + +headerbar button:backdrop:focus:not(.suggested-action):not(.destructive-action), headerbar button:backdrop:hover:not(.suggested-action):not(.destructive-action), headerbar button:backdrop:active:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.7); +} + +headerbar button:backdrop:disabled:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.32); +} + +headerbar button:backdrop:checked:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.7); +} + +headerbar button:backdrop:checked:disabled:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.32); +} + +headerbar entry { + background-color: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.7); +} + +headerbar entry:hover, headerbar entry:focus-within { + color: #FFFFFF; +} + +headerbar entry:disabled { + background-color: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.5); +} + +headerbar entry > text > placeholder { + color: rgba(255, 255, 255, 0.5); +} + +headerbar entry > text > block-cursor { + color: rgba(255, 255, 255, 0.04); + background-color: #FFFFFF; +} + +headerbar entry > image { + color: rgba(255, 255, 255, 0.7); +} + +headerbar entry > image:hover, headerbar entry > image:active { + color: #FFFFFF; +} + +headerbar entry > image:disabled { + color: rgba(255, 255, 255, 0.5); +} + +headerbar { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1), color 75ms cubic-bezier(0, 0, 0.2, 1); + box-shadow: inset 0 -1px rgba(255, 255, 255, 0.12); + background-color: #181926; + color: #FFFFFF; + min-height: 48px; + padding: 0; + margin: 0; +} + +headerbar:disabled { + color: rgba(255, 255, 255, 0.5); +} + +headerbar:backdrop { + background-color: #24273a; + color: rgba(255, 255, 255, 0.7); + box-shadow: inset 0 -1px rgba(255, 255, 255, 0.12); +} + +headerbar:backdrop:disabled { + color: rgba(255, 255, 255, 0.32); +} + +headerbar.flat, headerbar.flat:backdrop { + background: none; + box-shadow: none; + transition: none; +} + +headerbar .title { + padding: 0 12px; + font-weight: bold; +} + +headerbar .subtitle { + padding: 0 12px; + font-size: smaller; +} + +headerbar .subtitle, +headerbar .dim-label, +headerbar row.expander image.expander-row-arrow, +row.expander headerbar image.expander-row-arrow, +headerbar row label.subtitle, +row headerbar label.subtitle { + transition: color 75ms cubic-bezier(0, 0, 0.2, 1); + color: rgba(255, 255, 255, 0.7); +} + +headerbar .subtitle:backdrop, +headerbar .dim-label:backdrop, +headerbar row.expander image.expander-row-arrow:backdrop, +row.expander headerbar image.expander-row-arrow:backdrop, +headerbar row label.subtitle:backdrop, +row headerbar label.subtitle:backdrop { + color: rgba(255, 255, 255, 0.5); +} + +headerbar .titlebar { + background-color: transparent; + box-shadow: none; +} + +headerbar headerbar + separator { + background-color: rgba(255, 255, 255, 0.12); +} + +headerbar > windowhandle > box { + padding: 0 6px; +} + +headerbar > windowhandle > box, +headerbar > windowhandle > box > box.start, +headerbar > windowhandle > box > box.end { + border-spacing: 6px; +} + +headerbar entry, +headerbar spinbutton, +headerbar splitbutton, +headerbar button, +headerbar menubutton, +headerbar stackswitcher, +headerbar separator:not(.sidebar) { + margin-top: 6px; + margin-bottom: 6px; +} + +headerbar menubutton > button, +headerbar spinbutton > button, +headerbar splitbutton > button, +headerbar splitbutton > menubutton, +headerbar .linked > menubutton, +headerbar entry > menubutton { + margin-top: 0; + margin-bottom: 0; +} + +headerbar button.suggested-action:disabled, +headerbar button.destructive-action:disabled { + background-color: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.5); + opacity: 1; +} + +headerbar button.star { + min-height: 24px; + min-width: 24px; + padding: 6px; +} + +headerbar .linked:not(.vertical) > entry:not(:only-child) { + border-radius: 6px; +} + +headerbar .entry-tag { + margin-top: 5px; + margin-bottom: 5px; +} + +headerbar popover.background button.suggested-action:disabled, +headerbar popover.background button.destructive-action:disabled { + background-color: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.5); +} + +headerbar popover.background entry, +headerbar popover.background spinbutton, +headerbar popover.background button, +headerbar popover.background menubutton, +headerbar popover.background stackswitcher { + margin-top: 0; + margin-bottom: 0; +} + +headerbar separator:not(.sidebar) { + background-color: rgba(255, 255, 255, 0.12); +} + +headerbar switch { + margin-top: 12px; + margin-bottom: 12px; +} + +headerbar.selection-mode { + transition: background-color 0.1ms 225ms, color 75ms cubic-bezier(0, 0, 0.2, 1); + background-color: #b7bdf8; + color: rgba(0, 0, 0, 0.87); +} + +headerbar.selection-mode:backdrop { + color: rgba(0, 0, 0, 0.6); +} + +headerbar.selection-mode .subtitle:link { + color: rgba(0, 0, 0, 0.87); +} + +headerbar.selection-mode .selection-menu { + padding-left: 16px; + padding-right: 16px; +} + +headerbar.selection-mode .selection-menu .arrow { + -gtk-icon-source: -gtk-icontheme("pan-down-symbolic"); +} + +headerbar.default-decoration { + min-height: 36px; + padding: 0; + margin: 0; + box-shadow: none; + border: none; + outline: none; + background-image: image(#181926); +} + +headerbar.default-decoration:backdrop { + background-image: image(#24273a); +} + +headerbar.default-decoration windowcontrols button, +headerbar.default-decoration windowcontrols menubutton { + min-width: 16px; + min-height: 16px; + margin: 0; + padding: 0; +} + +headerbar.default-decoration windowcontrols menubutton button { + min-height: 20px; + min-width: 20px; + margin: 0; + padding: 4px; +} + +.solid-csd headerbar:dir(rtl), .solid-csd headerbar:dir(ltr) { + border-radius: 0; + box-shadow: none; +} + +window.devel headerbar { + background: #181926 cross-fade(10% -gtk-icontheme("system-run-symbolic"), image(transparent)) 90% 0/256px 256px no-repeat, linear-gradient(to right, transparent 65%, rgba(183, 189, 248, 0.1)), linear-gradient(to top, #1e1f2f 3px, #222336); +} + +window.devel headerbar:backdrop { + background: #181926 cross-fade(10% -gtk-icontheme("system-run-symbolic"), image(transparent)) 90% 0/256px 256px no-repeat, image(#181926); + /* background-color would flash */ +} + +/************ + * Pathbars * + ************/ + +pathbar > button { + padding-left: 6px; + padding-right: 6px; + border-radius: 6px; + background-color: alpha(currentColor, 0.08); + border: none; + box-shadow: none; +} + + +pathbar > button:disabled { + background-color: alpha(currentColor, 0.05); +} + + +pathbar > button:checked { + background-color: alpha(currentColor, 0.1); + color: #FFFFFF; +} + + +pathbar > button:checked:hover { + background-color: alpha(currentColor, 0.16); + color: #FFFFFF; +} + + +pathbar > button label, +pathbar > button image { + margin-left: 3px; + margin-right: 3px; +} + + +pathbar > button.slider-button { + padding-left: 4px; + padding-right: 4px; +} + +.pathbar { + background-color: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.7); + border: none; + border-radius: 6px; + padding: 2px; +} + +headerbar .pathbar { + margin-top: 6px; + margin-bottom: 6px; + background-color: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.7); +} + +.pathbar > button { + margin-top: 0; + margin-bottom: 0; + min-height: 20px; + border-radius: 4px; + border: none; + box-shadow: none; +} + +.pathbar > button:last-child { + background-color: alpha(currentColor, 0.1); + color: #FFFFFF; +} + +/************** + * Tree Views * + **************/ +columnview.view, +treeview.view { + border-left-color: #3e4152; + border-top-color: #3e4152; +} + +columnview.view:hover, columnview.view:selected, +treeview.view:hover, +treeview.view:selected { + border-radius: 0; +} + +columnview.view:focus, +treeview.view:focus { + box-shadow: none; + outline: none; +} + +columnview.view.separator, +treeview.view.separator { + min-height: 5px; + color: rgba(255, 255, 255, 0.12); +} + +columnview.view:drop(active), +treeview.view:drop(active) { + box-shadow: none; +} + +columnview.view:drop(active).after, +treeview.view:drop(active).after { + border-top-style: none; +} + +columnview.view:drop(active).before, +treeview.view:drop(active).before { + border-bottom-style: none; +} + +columnview.view > dndtarget:drop(active), +treeview.view > dndtarget:drop(active) { + border-style: solid none; + border-width: 1px; + border-color: alpha(currentColor, 0.06); +} + +columnview.view > dndtarget:drop(active).after, +treeview.view > dndtarget:drop(active).after { + border-top-style: none; +} + +columnview.view > dndtarget:drop(active).before, +treeview.view > dndtarget:drop(active).before { + border-bottom-style: none; +} + +columnview.view.expander, +treeview.view.expander { + min-width: 16px; + min-height: 16px; + -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); + color: rgba(255, 255, 255, 0.7); +} + +columnview.view.expander:dir(rtl), +treeview.view.expander:dir(rtl) { + -gtk-icon-source: -gtk-icontheme("pan-end-symbolic-rtl"); +} + +columnview.view.expander:hover, +treeview.view.expander:hover { + color: #FFFFFF; +} + +columnview.view.expander:selected, +treeview.view.expander:selected { + color: #FFFFFF; +} + +columnview.view.expander:selected:hover, +treeview.view.expander:selected:hover { + color: #FFFFFF; +} + +columnview.view.expander:checked, +treeview.view.expander:checked { + -gtk-icon-source: -gtk-icontheme("pan-down-symbolic"); +} + +columnview.view.expander:disabled, +treeview.view.expander:disabled { + color: rgba(255, 255, 255, 0.32); +} + +columnview.view.progressbar, +treeview.view.progressbar { + border-bottom: 6px solid #b7bdf8; + box-shadow: none; + background-color: transparent; + background-image: none; +} + +columnview.view.progressbar:selected:hover, +treeview.view.progressbar:selected:hover { + box-shadow: none; +} + +columnview.view.trough, +treeview.view.trough { + border-bottom: 6px solid rgba(255, 255, 255, 0.12); + box-shadow: none; + background-color: transparent; + background-image: none; +} + +columnview.view.trough:selected:hover, +treeview.view.trough:selected:hover { + box-shadow: none; +} + +columnview.view > header > button, +treeview.view > header > button { + padding: 2px 6px; + border-style: none solid solid none; + border-width: 1px; + border-color: rgba(255, 255, 255, 0.12); + border-radius: 0; + background-clip: border-box; +} + +columnview.view > header > button:not(:focus):not(:hover):not(:active), +treeview.view > header > button:not(:focus):not(:hover):not(:active) { + color: rgba(255, 255, 255, 0.7); +} + +columnview.view > header > button, columnview.view > header > button:disabled, +treeview.view > header > button, +treeview.view > header > button:disabled { + background-color: #24273a; +} + +columnview.view > header > button:last-child, +treeview.view > header > button:last-child { + border-right-style: none; +} + +columnview.view button.dnd, +columnview.view header.button.dnd, +treeview.view button.dnd, +treeview.view header.button.dnd { + padding: 2px 6px; + border-style: none solid solid; + border-width: 1px; + border-color: rgba(255, 255, 255, 0.12); + border-radius: 0; + box-shadow: none; + background-color: #24273a; + background-clip: border-box; + color: #b7bdf8; +} + +columnview.view acceleditor > label, +treeview.view acceleditor > label { + background-color: #b7bdf8; +} + +stack.view treeview.view { + min-height: 36px; +} + +/********* + * Menus * + *********/ +menubar { + padding: 0; + background-color: #181926; + color: #FFFFFF; +} + +menubar:backdrop { + background-color: #24273a; + color: rgba(255, 255, 255, 0.7); +} + +.csd menubar { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); +} + +menubar > item { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); + min-height: 20px; + padding: 4px 8px; + color: rgba(255, 255, 255, 0.7); +} + +menubar > item:selected { + transition: none; + background-color: alpha(currentColor, 0.1); + color: #FFFFFF; +} + +menubar > item:disabled { + color: rgba(255, 255, 255, 0.32); +} + +menubar > item label:disabled { + color: inherit; +} + +menubar > item popover.menu popover.menu { + margin-left: 9px; +} + +menubar > item popover.menu.background popover.menu.background > contents { + margin: 0; + border-radius: 12px; +} + +/********************** + * Popover Base Menus * + **********************/ +popover.menu box.inline-buttons { + color: #FFFFFF; + padding: 0 6px; +} + +popover.menu box.inline-buttons button.image-button.model { + min-height: 28px; + min-width: 28px; + padding: 0; + border: none; + outline: none; + transition: none; +} + +popover.menu box.inline-buttons button.image-button.model:selected { + background: image(alpha(currentColor, 0.06)); +} + +popover.menu box.circular-buttons { + padding: 6px; +} + +popover.menu box.circular-buttons button.circular.image-button.model { + padding: 6px; +} + +popover.menu box.circular-buttons button.circular.image-button.model:focus { + background-color: alpha(currentColor, 0.06); +} + +popover.menu arrow.left, +popover.menu radio.left, +popover.menu check.left { + margin-left: 0; + margin-right: 0; +} + +popover.menu arrow.right, +popover.menu radio.right, +popover.menu check.right { + margin-left: 0; + margin-right: 0; +} + +popover.menu label.title { + font-weight: bold; + padding: 4px 26px; +} + +/************ + * Popovers * + ************/ +popover.background { + font: initial; +} + +popover.background, popover.background:backdrop { + background-color: transparent; +} + +popover > arrow, +popover > contents { + transition: box-shadow 200ms ease-out; + padding: 6px; + background-color: #363a4f; + border-radius: 12px; + color: #FFFFFF; + border: 1px solid rgba(255, 255, 255, 0.1); + background-clip: border-box; + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.75), 0 2px 3px -1px rgba(0, 0, 0, 0.05), 0 4px 6px 0 rgba(0, 0, 0, 0.06), 0 1px 10px 0 rgba(0, 0, 0, 0.05); +} + +popover > contents > list, +popover > contents > .view, +popover > contents > toolbar { + border-style: none; + box-shadow: none; + background-color: transparent; +} + +popover > contents separator { + background-color: rgba(255, 255, 255, 0.12); + margin: 3px 0; +} + +popover > contents list separator { + margin: 0; +} + +popover > contents list > row { + border-radius: 6px; +} + +popover > contents stack > box { + padding: 0; +} + +popover > contents > box > button { + margin: 0; +} + +popover .view:not(:selected), +popover toolbar { + background-color: #363a4f; +} + +popover.menu button, +popover button.model { + min-height: 32px; + padding: 0 8px; +} + +popover modelbutton { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1); + min-height: 22px; + min-width: 56px; + padding: 3px 9px; + color: #FFFFFF; + font: initial; + border-radius: 6px; +} + +popover modelbutton:focus:not(:hover) { + transition: none; + box-shadow: none; + outline: none; +} + +popover modelbutton:disabled { + color: rgba(255, 255, 255, 0.5); +} + +popover modelbutton accelerator { + color: rgba(255, 255, 255, 0.5); + margin-left: 30px; +} + +popover modelbutton accelerator:disabled { + color: rgba(255, 255, 255, 0.12); +} + +popover modelbutton arrow.left { + -gtk-icon-source: -gtk-icontheme("go-previous-symbolic"); +} + +popover modelbutton arrow.right { + -gtk-icon-source: -gtk-icontheme("go-next-symbolic"); +} + +.osd popover, popover.touch-selection, popover.magnifier { + background-color: transparent; +} + +magnifier { + background-color: #24273a; +} + +/************* + * Notebooks * + *************/ +notebook > header > tabs > tab { + min-height: 24px; + min-width: 24px; + padding: 3px 6px; + border: none; + background-clip: padding-box; + font-weight: 500; + border-radius: 6px; + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 300ms cubic-bezier(0, 0, 0.2, 1), background-image 1200ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1); + background-image: radial-gradient(circle, transparent 10%, transparent 0%); + background-repeat: no-repeat; + background-position: center; + background-size: 1000% 1000%; + background-color: transparent; + outline: 0 solid transparent; + outline-offset: 2px; + color: rgba(255, 255, 255, 0.7); +} + +notebook > header > tabs > tab:hover:not(:checked):not(:selected) { + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + box-shadow: none; +} + +notebook > header > tabs > tab:disabled { + color: rgba(255, 255, 255, 0.32); + background-color: transparent; +} + +notebook > header > tabs > tab:active { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.08) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + box-shadow: none; +} + +notebook > header > tabs > tab:selected:not(:active) { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms, background-color 0ms; + background-color: rgba(255, 255, 255, 0.15); + color: #FFFFFF; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +notebook > header > tabs > tab:selected:not(:active):disabled { + color: rgba(255, 255, 255, 0.5); +} + +frame > paned > notebook > header, notebook.frame > header { + background-color: rgba(255, 255, 255, 0.04); +} + +notebook, notebook.frame { + background-color: #24273a; + border-radius: 12px; +} + +notebook.frame frame > border { + border: none; + border-radius: 6px; +} + +notebook.frame frame > list row.activatable { + border-radius: 6px; +} + +notebook > header { + border: none; + background-color: rgba(255, 255, 255, 0.04); + margin: 3px; + border-radius: 9px; +} + +notebook > header.top > tabs > arrow { + border-top-style: none; +} + +notebook > header.bottom > tabs > arrow { + border-bottom-style: none; +} + +notebook > header.top > tabs > arrow, notebook > header.bottom > tabs > arrow { + padding-left: 4px; + padding-right: 4px; +} + +notebook > header.top > tabs > arrow.down, notebook > header.bottom > tabs > arrow.down { + margin-left: 0; + -gtk-icon-source: -gtk-icontheme("pan-start-symbolic"); +} + +notebook > header.top > tabs > arrow.up, notebook > header.bottom > tabs > arrow.up { + margin-right: 0; + -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); +} + +notebook > header.left > tabs > arrow { + border-left-style: none; +} + +notebook > header.right > tabs > arrow { + border-right-style: none; +} + +notebook > header.left > tabs > arrow, notebook > header.right > tabs > arrow { + padding-top: 4px; + padding-bottom: 4px; +} + +notebook > header.left > tabs > arrow.down, notebook > header.right > tabs > arrow.down { + margin-top: 0; + -gtk-icon-source: -gtk-icontheme("pan-up-symbolic"); +} + +notebook > header.left > tabs > arrow.up, notebook > header.right > tabs > arrow.up { + margin-bottom: 0; + -gtk-icon-source: -gtk-icontheme("pan-down-symbolic"); +} + +notebook > header > tabs > arrow { + min-height: 16px; + min-width: 16px; + border-radius: 6px; +} + +notebook > header > tabs > tab { + margin: 3px; +} + +notebook > header > tabs > tab > box { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1); + margin: -6px -12px; + padding: 6px 12px; +} + +notebook > header > tabs > tab > box:drop(active) { + background-color: rgba(255, 255, 255, 0.12); + color: #FFFFFF; +} + +notebook > header > tabs > tab button.flat:last-child { + margin-left: 6px; + margin-right: -3px; +} + +notebook > header > tabs > tab button.flat:first-child { + margin-left: -3px; + margin-right: 6px; +} + +notebook > header > tabs > tab button.close-button { + min-width: 24px; + min-height: 24px; +} + +notebook > header.top > tabs, notebook > header.bottom > tabs { + padding-left: 0; + padding-right: 0; +} + +notebook > header.top > tabs:not(:only-child):first-child, notebook > header.bottom > tabs:not(:only-child):first-child { + margin-left: 0; +} + +notebook > header.top > tabs:not(:only-child):last-child, notebook > header.bottom > tabs:not(:only-child):last-child { + margin-right: 0; +} + +notebook > header.top > tabs > tab:not(:last-child), notebook > header.bottom > tabs > tab:not(:last-child) { + margin-right: 0; +} + +notebook > header.top > tabs tab.reorderable-page, notebook > header.bottom > tabs tab.reorderable-page { + border-style: solid; +} + +notebook > header.left > tabs, notebook > header.right > tabs { + padding-top: 0; + padding-bottom: 0; +} + +notebook > header.left > tabs:not(:only-child):first-child, notebook > header.right > tabs:not(:only-child):first-child { + margin-top: 0; +} + +notebook > header.left > tabs:not(:only-child):last-child, notebook > header.right > tabs:not(:only-child):last-child { + margin-bottom: 0; +} + +notebook > header.left > tabs > tab:not(:last-child), notebook > header.right > tabs > tab:not(:last-child) { + margin-bottom: 0; +} + +notebook > header.left > tabs tab.reorderable-page, notebook > header.right > tabs tab.reorderable-page { + border-style: solid; +} + +notebook > header > menubutton > button.image-button { + padding: 3px; + min-width: 24px; + min-height: 24px; + margin: 0 3px; +} + +notebook > stack:not(:only-child) { + background-color: transparent; + border-radius: 6px; +} + +tabbar tab { + min-height: 24px; + min-width: 24px; + padding: 3px 6px; + border: none; + background-clip: padding-box; + font-weight: 500; + border-radius: 6px; + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 300ms cubic-bezier(0, 0, 0.2, 1), background-image 1200ms cubic-bezier(0, 0, 0.2, 1), outline 300ms cubic-bezier(0, 0, 0.2, 1); + background-image: radial-gradient(circle, transparent 10%, transparent 0%); + background-repeat: no-repeat; + background-position: center; + background-size: 1000% 1000%; + background-color: transparent; + outline: 0 solid transparent; + outline-offset: 2px; + color: rgba(255, 255, 255, 0.7); + color: rgba(255, 255, 255, 0.7); +} + +tabbar tab:hover:not(:selected) { + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + box-shadow: none; + color: #FFFFFF; +} + +tabbar tab:disabled { + color: rgba(255, 255, 255, 0.32); + background-color: transparent; + color: rgba(255, 255, 255, 0.32); +} + +tabbar tab:active { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.08) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + box-shadow: none; + color: #FFFFFF; +} + +tabbar tab:selected:not(:active) { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms, background-color 0ms; + background-color: rgba(255, 255, 255, 0.15); + color: #FFFFFF; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +tabbar tab:selected:not(:active):disabled { + color: rgba(255, 255, 255, 0.5); +} + +tabbar > revealer > box { + box-shadow: none; +} + +tabbar .box { + background-color: #181926; + background-image: none; + padding: 0; + margin: 0; + border-radius: 0; + min-height: 36px; + border: none; + box-shadow: none; +} + +tabbar .box:backdrop { + background-color: #24273a; + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1); +} + +tabbar .box:backdrop > scrolledwindow, +tabbar .box:backdrop > .start-action, +tabbar .box:backdrop > .end-action { + filter: none; + transition: none; +} + +tabbar tabbox { + padding: 0; + margin: 0; + min-height: 36px; +} + +tabbar tabbox > background { + background: none; +} + +tabbar tabbox > separator { + margin: 9px 0; + transition: opacity 150ms ease-in-out; +} + +tabbar tabbox > separator.hidden { + opacity: 0; +} + +tabbar tabbox > tabboxchild { + padding: 0; + margin: 0; +} + +tabbar tab { + padding: 6px; + margin: 6px 2px; +} + +tabbar tab.needs-attention { + background-image: radial-gradient(ellipse at bottom, rgba(255, 255, 255, 0.8), alpha(#b7bdf8, 0.4) 10%, alpha(#b7bdf8, 0) 30%); +} + +tabbar tab.needs-attention:hover { + background-image: image(alpha(currentColor, 0.03)), radial-gradient(ellipse at bottom, rgba(255, 255, 255, 0.8), alpha(#b7bdf8, 0.4) 10%, alpha(#b7bdf8, 0) 30%); +} + +tabbar tabbox.single-tab tab, tabbar tabbox.single-tab tab:hover, tabbar tabbox.single-tab tab:active { + background: none; +} + +tabbar undershoot { + transition: background 150ms ease-in-out; +} + +tabbar undershoot.left { + background: linear-gradient(to right, #24273a, rgba(0, 0, 0, 0) 20px); +} + +tabbar undershoot.right { + background: linear-gradient(to left, #24273a, rgba(0, 0, 0, 0) 20px); +} + +tabbar .needs-attention-left undershoot.left { + background: linear-gradient(to right, alpha(#b7bdf8, 0.5), alpha(#b7bdf8, 0.3) 1px, alpha(#b7bdf8, 0) 20px); +} + +tabbar .needs-attention-right undershoot.right { + background: linear-gradient(to left, alpha(#b7bdf8, 0.5), alpha(#b7bdf8, 0.3) 1px, alpha(#b7bdf8, 0) 20px); +} + +tabbar .start-action, +tabbar .end-action { + padding: 6px 5px; +} + +tabbar .start-action:dir(ltr), +tabbar .end-action:dir(rtl) { + padding-right: 0; +} + +tabbar .start-action:dir(rtl), +tabbar .end-action:dir(ltr) { + padding-left: 0; +} + +tabbar.inline .box { + background-color: transparent; + color: inherit; + box-shadow: none; + padding-bottom: 0; +} + +tabbar.inline .box:backdrop { + background-color: transparent; + transition: none; +} + +tabbar.inline .box:backdrop > scrolledwindow, +tabbar.inline .box:backdrop > .start-action, +tabbar.inline .box:backdrop > .end-action { + filter: none; + transition: none; +} + +dnd tab { + min-height: 24px; + background-color: #181926; + color: #FFFFFF; + box-shadow: 0 1px 5px 1px rgba(0, 0, 0, 0.09), 0 2px 14px 3px rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.05); + outline: 1px solid rgba(0, 0, 0, 0.75); + outline-offset: -1px; + margin: 24px; +} + +dnd tab.needs-attention { + background-image: radial-gradient(ellipse at bottom, rgba(255, 255, 255, 0.8), alpha(#b7bdf8, 0.4) 10%, alpha(#b7bdf8, 0) 30%); +} + +tabbar tab, +dnd tab { + padding: 6px; +} + +tabbar tab button.image-button, +dnd tab button.image-button { + padding: 0; + margin: 0; + min-width: 24px; + min-height: 24px; + border-radius: 9999px; + color: rgba(255, 255, 255, 0.7); +} + +tabbar tab button.image-button:hover, tabbar tab button.image-button:active, +dnd tab button.image-button:hover, +dnd tab button.image-button:active { + color: #FFFFFF; +} + +tabbar tab button.image-button:disabled, +dnd tab button.image-button:disabled { + color: rgba(255, 255, 255, 0.32); +} + +tabbar tab indicator, +dnd tab indicator { + min-height: 2px; + border-radius: 2px; + background: alpha(#b7bdf8, 0.5); + transform: translateY(4px); +} + +tabthumbnail { + border-radius: 6px; + transition: box-shadow 200ms ease-out; +} + +tabthumbnail > box { + margin: 6px; +} + +tabthumbnail:drop(active) { + box-shadow: inset 0 0 0 2px alpha(#FF7043, 0.4); + background-color: alpha(#FF7043, 0.1); +} + +tabthumbnail .needs-attention:dir(ltr) { + transform: translate(8px, -8px); +} + +tabthumbnail .needs-attention:dir(rtl) { + transform: translate(-8px, -8px); +} + +tabthumbnail .needs-attention > widget { + background: #b7bdf8; + min-width: 12px; + min-height: 12px; + border-radius: 6px; + margin: 3px; + box-shadow: 0 1px 2px alpha(#b7bdf8, 0.4); +} + +tabthumbnail .card { + background: none; + border: none; + box-shadow: none; + color: inherit; +} + +tabthumbnail .card picture { + outline: 1px solid rgba(255, 255, 255, 0.12); + outline-offset: -1px; + border-radius: 6px; +} + +tabthumbnail.pinned .card { + background-color: rgba(255, 255, 255, 0.04); + color: #FFFFFF; +} + +tabthumbnail .icon-title-box { + border-spacing: 6px; +} + +tabthumbnail .tab-unpin-icon { + margin: 6px; + min-width: 24px; + min-height: 24px; +} + +tabthumbnail button.circular { + margin: 6px; + background-color: rgba(255, 255, 255, 0.04); + min-width: 24px; + min-height: 24px; +} + +tabthumbnail button.circular:hover { + background-color: alpha(currentColor, 0.08); +} + +tabthumbnail button.circular:active { + background-color: alpha(currentColor, 0.12); +} + +taboverview > .overview .new-tab-button { + margin: 18px; +} + +tabview:drop(active), +tabbox:drop(active), +tabgrid:drop(active) { + box-shadow: none; +} + +/************** + * Scrollbars * + **************/ +scrollbar { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); + background-color: #24273a; + box-shadow: none; + outline: none; +} + +scrollbar.top { + border-bottom: 1px solid rgba(255, 255, 255, 0.12); +} + +scrollbar.bottom { + border-top: 1px solid rgba(255, 255, 255, 0.12); +} + +scrollbar.left { + border-right: 1px solid rgba(255, 255, 255, 0.12); +} + +scrollbar.right { + border-left: 1px solid rgba(255, 255, 255, 0.12); +} + +scrollbar > range > trough { + border: none; + background: none; + padding: 0; + outline: none; +} + +scrollbar > range > trough > slider { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1); + min-width: 8px; + min-height: 8px; + border: 4px solid transparent; + border-radius: 9999px; + background-clip: padding-box; + background-color: rgba(255, 255, 255, 0.5); + box-shadow: none; + outline: none; +} + +scrollbar > range > trough > slider:hover { + background-color: rgba(255, 255, 255, 0.7); +} + +scrollbar > range > trough > slider:active { + background-color: #FFFFFF; +} + +scrollbar > range > trough > slider:disabled { + background-color: rgba(255, 255, 255, 0.32); +} + +scrollbar > range.fine-tune > trough > slider { + min-width: 4px; + min-height: 4px; +} + +scrollbar > range.fine-tune.horizontal > trough > slider { + margin: 2px 0; +} + +scrollbar > range.fine-tune.vertical > trough > slider { + margin: 0 2px; +} + +scrollbar.overlay-indicator:not(.fine-tune) > range > trough > slider { + transition-property: background-color, min-height, min-width; +} + +scrollbar.overlay-indicator:not(.dragging):not(.hovering) { + border-color: transparent; + background-color: transparent; +} + +scrollbar.overlay-indicator:not(.dragging):not(.hovering) > range > trough > slider { + min-width: 4px; + min-height: 4px; + margin: 0; + border: 1px solid rgba(36, 39, 58, 0.3); +} + +scrollbar.overlay-indicator:not(.dragging):not(.hovering) button { + min-width: 4px; + min-height: 4px; + margin: 0; + border: 1px solid rgba(36, 39, 58, 0.3); + border-radius: 9999px; + background-color: rgba(255, 255, 255, 0.5); + background-clip: padding-box; + -gtk-icon-source: none; +} + +scrollbar.overlay-indicator:not(.dragging):not(.hovering) button:disabled { + background-color: rgba(255, 255, 255, 0.32); +} + +scrollbar.overlay-indicator:not(.dragging):not(.hovering).horizontal > range > trough > slider { + min-width: 24px; +} + +scrollbar.overlay-indicator:not(.dragging):not(.hovering).horizontal button { + min-width: 8px; +} + +scrollbar.overlay-indicator:not(.dragging):not(.hovering).vertical > range > trough > slider { + min-height: 24px; +} + +scrollbar.overlay-indicator:not(.dragging):not(.hovering).vertical button { + min-height: 8px; +} + +scrollbar.overlay-indicator.dragging, scrollbar.overlay-indicator.hovering { + background-color: rgba(255, 255, 255, 0.04); +} + +scrollbar.horizontal > range > trough > slider { + min-width: 24px; +} + +scrollbar.vertical > range > trough > slider { + min-height: 24px; +} + +scrollbar button { + min-width: 16px; + min-height: 16px; + padding: 0; + border-radius: 0; +} + +scrollbar.vertical button.down { + -gtk-icon-source: -gtk-icontheme("pan-down-symbolic"); +} + +scrollbar.vertical button.up { + -gtk-icon-source: -gtk-icontheme("pan-up-symbolic"); +} + +scrollbar.horizontal button.down { + -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); +} + +scrollbar.horizontal button.up { + -gtk-icon-source: -gtk-icontheme("pan-start-symbolic"); +} + +/********** + * Switch * + **********/ +switch { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); + margin: 6px 0; + padding: 0; + border: none; + border-radius: 9999px; + background-color: rgba(255, 255, 255, 0.5); + background-clip: border-box; + font-size: 0; + color: transparent; +} + +switch:checked { + background-color: #b7bdf8; +} + +switch:disabled { + opacity: 0.5; +} + +switch image { + margin: -8px; +} + +switch > slider { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); + min-width: 18px; + min-height: 18px; + margin: 3px; + border-radius: 9999px; + outline: none; + box-shadow: 0 3px 3px -2px rgba(0, 0, 0, 0.05), 0 2px 3px -1px rgba(0, 0, 0, 0.06), 0 1px 4px 0 rgba(0, 0, 0, 0.05); + background-color: white; + border: none; +} + +switch:focus slider, switch:hover slider, switch:focus:hover slider { + box-shadow: 0 0 0 6px rgba(255, 255, 255, 0.12); +} + +/************************* + * Check and Radio items * + *************************/ +.view.content-view.check:not(list), +.content-view .tile check:not(list) { + min-height: 40px; + min-width: 40px; + margin: 0; + padding: 0; + box-shadow: none; + background-color: transparent; + background-image: none; +} + +.view.content-view.check:not(list):hover, .view.content-view.check:not(list):active, +.content-view .tile check:not(list):hover, +.content-view .tile check:not(list):active { + box-shadow: 0 0 0 10px rgba(255, 255, 255, 0.12); +} + +.view.content-view.check:not(list), +.content-view .tile check:not(list) { + -gtk-icon-source: -gtk-scaled(url("assets/selectionmode-checkbox-unchecked-dark.png"), url("assets/selectionmode-checkbox-unchecked-dark@2.png")); +} + +.view.content-view.check:not(list):checked, +.content-view .tile check:not(list):checked { + -gtk-icon-source: -gtk-scaled(url("assets/selectionmode-checkbox-checked-dark.png"), url("assets/selectionmode-checkbox-checked-dark@2.png")); +} + +checkbutton, +radiobutton { + outline: none; + border-spacing: 3px; +} + +check, +radio { + min-height: 20px; + min-width: 20px; + margin: 3px; + padding: 0; + border-radius: 9999px; + border: none; + color: transparent; + background-color: rgba(255, 255, 255, 0.12); + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), box-shadow 150ms cubic-bezier(0, 0, 0.2, 1); +} + +check:hover, +radio:hover { + box-shadow: 0 0 0 6px rgba(255, 255, 255, 0.04); + background-color: rgba(255, 255, 255, 0.15); +} + +check:active, +radio:active { + box-shadow: 0 0 0 6px rgba(255, 255, 255, 0.12); + background-color: rgba(255, 255, 255, 0.2); +} + +check:disabled, +radio:disabled { + background-color: rgba(255, 255, 255, 0.04); +} + +check:checked, check:indeterminate, +radio:checked, +radio:indeterminate { + color: rgba(0, 0, 0, 0.87); + background-color: #b7bdf8; +} + +check:checked:hover, check:indeterminate:hover, +radio:checked:hover, +radio:indeterminate:hover { + box-shadow: 0 0 0 6px rgba(183, 189, 248, 0.15); + background-color: #e5e8fd; +} + +check:checked:active, check:indeterminate:active, +radio:checked:active, +radio:indeterminate:active { + box-shadow: 0 0 0 6px rgba(183, 189, 248, 0.2); + background-color: #b7bdf8; +} + +check:checked:disabled, check:indeterminate:disabled, +radio:checked:disabled, +radio:indeterminate:disabled { + color: rgba(0, 0, 0, 0.6); + background-color: rgba(183, 189, 248, 0.35); +} + +popover modelbutton.flat check, popover modelbutton.flat check:focus, popover modelbutton.flat check:hover, popover modelbutton.flat check:focus:hover, popover modelbutton.flat check:active, popover modelbutton.flat check:disabled, popover modelbutton.flat radio, popover modelbutton.flat radio:focus, popover modelbutton.flat radio:hover, popover modelbutton.flat radio:focus:hover, popover modelbutton.flat radio:active, popover modelbutton.flat radio:disabled { + transition: none; + box-shadow: none; + background-image: none; +} + +popover modelbutton.flat check.left:dir(rtl), popover modelbutton.flat radio.left:dir(rtl) { + margin-left: -3px; + margin-right: 6px; +} + +popover modelbutton.flat check.right:dir(ltr), popover modelbutton.flat radio.right:dir(ltr) { + margin-left: 6px; + margin-right: -3px; +} + +popover.menu check, popover.menu radio { + transition: none; + margin: 0; + padding: 0; +} + +popover.menu check:dir(ltr), popover.menu radio:dir(ltr) { + margin-right: 6px; + margin-left: -3px; +} + +popover.menu check:dir(rtl), popover.menu radio:dir(rtl) { + margin-left: 6px; + margin-right: -3px; +} + +popover.menu check, popover.menu check:hover, popover.menu check:disabled, popover.menu check:checked:hover, popover.menu check:indeterminate:hover, popover.menu radio, popover.menu radio:hover, popover.menu radio:disabled, popover.menu radio:checked:hover, popover.menu radio:indeterminate:hover { + box-shadow: none; +} + + +check { + -gtk-icon-size: 20px; +} + + +check:checked { + -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/scalable/checkbox-checked-symbolic.svg")), -gtk-recolor(url("assets/scalable/checkbox-checked-symbolic@2.svg"))); +} + + +check:indeterminate { + -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/scalable/checkbox-mixed-symbolic.svg")), -gtk-recolor(url("assets/scalable/checkbox-mixed-symbolic@2.svg"))); +} + + +radio { + -gtk-icon-size: 20px; +} + + +radio:checked { + -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/scalable/radio-checked-symbolic.svg")), -gtk-recolor(url("assets/scalable/radio-checked-symbolic@2.svg"))); +} + + +radio:indeterminate { + -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/scalable/radio-mixed-symbolic.svg")), -gtk-recolor(url("assets/scalable/radio-mixed-symbolic@2.svg"))); +} + + +popover.menu check { + min-height: 16px; + min-width: 16px; + -gtk-icon-size: 16px; +} + + +popover.menu check:checked { + -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/scalable/small-checkbox-checked-symbolic.svg")), -gtk-recolor(url("assets/scalable/small-checkbox-checked-symbolic@2.svg"))); +} + + +popover.menu check:indeterminate { + -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/scalable/small-checkbox-mixed-symbolic.svg")), -gtk-recolor(url("assets/scalable/small-checkbox-mixed-symbolic@2.svg"))); +} + + +popover.menu radio { + min-height: 16px; + min-width: 16px; + -gtk-icon-size: 16px; +} + + +popover.menu radio:checked { + -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/scalable/small-radio-checked-symbolic.svg")), -gtk-recolor(url("assets/scalable/small-radio-checked-symbolic@2.svg"))); +} + + +popover.menu radio:indeterminate { + -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/scalable/small-radio-mixed-symbolic.svg")), -gtk-recolor(url("assets/scalable/small-radio-mixed-symbolic@2.svg"))); +} + +check:not(:checked):active { + -gtk-icon-transform: rotate(90deg); +} + +treeview.view radio, treeview.view check, +columnview.view radio, +columnview.view check { + padding: 0; + margin: 0; + transition: none; +} + +treeview.view radio, treeview.view radio:hover, treeview.view radio:disabled, treeview.view radio:checked:hover, treeview.view radio:indeterminate:hover, treeview.view check, treeview.view check:hover, treeview.view check:disabled, treeview.view check:checked:hover, treeview.view check:indeterminate:hover, +columnview.view radio, +columnview.view radio:hover, +columnview.view radio:disabled, +columnview.view radio:checked:hover, +columnview.view radio:indeterminate:hover, +columnview.view check, +columnview.view check:hover, +columnview.view check:disabled, +columnview.view check:checked:hover, +columnview.view check:indeterminate:hover { + box-shadow: none; +} + +treeview.view:hover check, treeview.view:hover radio, treeview.view:selected check, treeview.view:selected radio, treeview.view:focus check, treeview.view:focus radio, +columnview.view:hover check, +columnview.view:hover radio, +columnview.view:selected check, +columnview.view:selected radio, +columnview.view:focus check, +columnview.view:focus radio { + box-shadow: none; +} + +treeview.view:hover check:checked, treeview.view:hover radio:checked, treeview.view:selected check:checked, treeview.view:selected radio:checked, treeview.view:focus check:checked, treeview.view:focus radio:checked, +columnview.view:hover check:checked, +columnview.view:hover radio:checked, +columnview.view:selected check:checked, +columnview.view:selected radio:checked, +columnview.view:focus check:checked, +columnview.view:focus radio:checked { + color: rgba(0, 0, 0, 0.87); + background-color: #b7bdf8; +} + +/************ + * GtkScale * + ************/ +scale { + min-height: 2px; + min-width: 2px; +} + +scale.horizontal { + padding: 17px 12px; +} + +scale.vertical { + padding: 12px 17px; +} + +scale > trough { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1); + outline: none; + background-color: rgba(255, 255, 255, 0.3); +} + +scale > trough:disabled { + background-color: rgba(255, 255, 255, 0.12); +} + +scale > trough > highlight { + transition: background-image 75ms cubic-bezier(0, 0, 0.2, 1); + background-image: image(#b7bdf8); +} + +scale > trough > highlight:disabled { + background-color: #24273a; + background-image: image(rgba(255, 255, 255, 0.32)); +} + +scale > trough > fill { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1); + background-color: rgba(255, 255, 255, 0.3); +} + +scale > trough > fill:disabled { + background-color: transparent; +} + +scale > trough > slider { + min-height: 18px; + min-width: 18px; + margin: -8px; + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); + border-radius: 9999px; + color: #b7bdf8; + background-color: #24273a; + box-shadow: inset 0 0 0 2px #b7bdf8; +} + +scale > trough > slider:hover { + box-shadow: inset 0 0 0 2px #b7bdf8, 0 0 0 8px rgba(255, 255, 255, 0.12); +} + +scale > trough > slider:active { + box-shadow: inset 0 0 0 4px #b7bdf8, 0 0 0 8px rgba(255, 255, 255, 0.12); +} + +scale > trough > slider:disabled { + box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.32); +} + +scale.fine-tune.horizontal { + min-height: 4px; + padding-top: 16px; + padding-bottom: 16px; +} + +scale.fine-tune.vertical { + min-width: 4px; + padding-left: 16px; + padding-right: 16px; +} + +scale.fine-tune > trough > slider { + margin: -7px; +} + +scale > marks, +scale > value { + color: rgba(255, 255, 255, 0.7); +} + +scale indicator { + background-color: rgba(255, 255, 255, 0.3); + color: transparent; +} + +scale.marks-before:not(.marks-after) > trough > slider, scale.marks-after:not(.marks-before) > trough > slider { + transform: rotate(0); +} + +scale.horizontal > marks.top { + margin-bottom: 7px; + margin-top: -15px; +} + +scale.horizontal.fine-tune > marks.top { + margin-bottom: 6px; + margin-top: -14px; +} + +scale.horizontal > marks.bottom { + margin-top: 7px; + margin-bottom: -15px; +} + +scale.horizontal.fine-tune > marks.bottom { + margin-top: 6px; + margin-bottom: -14px; +} + +scale.vertical > marks.top { + margin-right: 7px; + margin-left: -15px; +} + +scale.vertical.fine-tune > marks.top { + margin-right: 6px; + margin-left: -14px; +} + +scale.vertical > marks.bottom { + margin-left: 7px; + margin-right: -15px; +} + +scale.vertical.fine-tune > marks.bottom { + margin-left: 6px; + margin-right: -14px; +} + +scale.horizontal indicator { + min-height: 8px; + min-width: 1px; +} + +scale.vertical indicator { + min-height: 1px; + min-width: 8px; +} + +scale.horizontal.marks-before:not(.marks-after) > trough > slider { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1), background-size 300ms cubic-bezier(0, 0, 0.2, 1), background-image 1200ms cubic-bezier(0, 0, 0.2, 1); + min-height: 32px; + min-width: 32px; + margin: -15px; + border-radius: 50%; + background-size: auto, 1000% 1000%; + background-repeat: no-repeat; + background-position: center center; + background-color: transparent; +} + +scale.horizontal.marks-before:not(.marks-after) > trough > slider, scale.horizontal.marks-before:not(.marks-after) > trough > slider:hover, scale.horizontal.marks-before:not(.marks-after) > trough > slider:active, scale.horizontal.marks-before:not(.marks-after) > trough > slider:disabled { + box-shadow: none; +} + +scale.horizontal.marks-before:not(.marks-after) > trough > slider:focus { + background-color: alpha(currentColor, 0.08); +} + +scale.horizontal.marks-before:not(.marks-after) > trough > slider:hover { + background-color: alpha(currentColor, 0.08); +} + +scale.horizontal.marks-before:not(.marks-after) > trough > slider:focus:hover { + background-color: alpha(currentColor, 0.16); +} + +scale.horizontal.marks-before:not(.marks-after) > trough > slider:active { + background-size: auto, 0% 0%; + background-color: alpha(currentColor, 0.08); +} + +scale.horizontal.marks-before:not(.marks-after) > trough > slider { + background-image: -gtk-scaled(url("assets/scale-horz-marks-before-slider-dark.png"), url("assets/scale-horz-marks-before-slider-dark@2.png")); +} + +scale.horizontal.marks-before:not(.marks-after) > trough > slider:disabled { + background-image: -gtk-scaled(url("assets/scale-horz-marks-before-slider-disabled-dark.png"), url("assets/scale-horz-marks-before-slider-disabled-dark@2.png")); +} + +scale.horizontal.marks-before:not(.marks-after) > trough > slider:active { + background-image: -gtk-scaled(url("assets/scale-horz-marks-before-slider-dark.png"), url("assets/scale-horz-marks-before-slider-dark@2.png")); +} + +scale.horizontal.marks-after:not(.marks-before) > trough > slider { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1), background-size 300ms cubic-bezier(0, 0, 0.2, 1), background-image 1200ms cubic-bezier(0, 0, 0.2, 1); + min-height: 32px; + min-width: 32px; + margin: -15px; + border-radius: 50%; + background-size: auto, 1000% 1000%; + background-repeat: no-repeat; + background-position: center center; + background-color: transparent; +} + +scale.horizontal.marks-after:not(.marks-before) > trough > slider, scale.horizontal.marks-after:not(.marks-before) > trough > slider:hover, scale.horizontal.marks-after:not(.marks-before) > trough > slider:active, scale.horizontal.marks-after:not(.marks-before) > trough > slider:disabled { + box-shadow: none; +} + +scale.horizontal.marks-after:not(.marks-before) > trough > slider:focus { + background-color: alpha(currentColor, 0.08); +} + +scale.horizontal.marks-after:not(.marks-before) > trough > slider:hover { + background-color: alpha(currentColor, 0.08); +} + +scale.horizontal.marks-after:not(.marks-before) > trough > slider:focus:hover { + background-color: alpha(currentColor, 0.16); +} + +scale.horizontal.marks-after:not(.marks-before) > trough > slider:active { + background-size: auto, 0% 0%; + background-color: alpha(currentColor, 0.08); +} + +scale.horizontal.marks-after:not(.marks-before) > trough > slider { + background-image: -gtk-scaled(url("assets/scale-horz-marks-after-slider-dark.png"), url("assets/scale-horz-marks-after-slider-dark@2.png")); +} + +scale.horizontal.marks-after:not(.marks-before) > trough > slider:disabled { + background-image: -gtk-scaled(url("assets/scale-horz-marks-after-slider-disabled-dark.png"), url("assets/scale-horz-marks-after-slider-disabled-dark@2.png")); +} + +scale.horizontal.marks-after:not(.marks-before) > trough > slider:active { + background-image: -gtk-scaled(url("assets/scale-horz-marks-after-slider-dark.png"), url("assets/scale-horz-marks-after-slider-dark@2.png")); +} + +scale.vertical.marks-before:not(.marks-after) > trough > slider { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1), background-size 300ms cubic-bezier(0, 0, 0.2, 1), background-image 1200ms cubic-bezier(0, 0, 0.2, 1); + min-height: 32px; + min-width: 32px; + margin: -15px; + border-radius: 50%; + background-size: auto, 1000% 1000%; + background-repeat: no-repeat; + background-position: center center; + background-color: transparent; +} + +scale.vertical.marks-before:not(.marks-after) > trough > slider, scale.vertical.marks-before:not(.marks-after) > trough > slider:hover, scale.vertical.marks-before:not(.marks-after) > trough > slider:active, scale.vertical.marks-before:not(.marks-after) > trough > slider:disabled { + box-shadow: none; +} + +scale.vertical.marks-before:not(.marks-after) > trough > slider:focus { + background-color: alpha(currentColor, 0.08); +} + +scale.vertical.marks-before:not(.marks-after) > trough > slider:hover { + background-color: alpha(currentColor, 0.08); +} + +scale.vertical.marks-before:not(.marks-after) > trough > slider:focus:hover { + background-color: alpha(currentColor, 0.16); +} + +scale.vertical.marks-before:not(.marks-after) > trough > slider:active { + background-size: auto, 0% 0%; + background-color: alpha(currentColor, 0.08); +} + +scale.vertical.marks-before:not(.marks-after) > trough > slider { + background-image: -gtk-scaled(url("assets/scale-vert-marks-before-slider-dark.png"), url("assets/scale-vert-marks-before-slider-dark@2.png")); +} + +scale.vertical.marks-before:not(.marks-after) > trough > slider:disabled { + background-image: -gtk-scaled(url("assets/scale-vert-marks-before-slider-disabled-dark.png"), url("assets/scale-vert-marks-before-slider-disabled-dark@2.png")); +} + +scale.vertical.marks-before:not(.marks-after) > trough > slider:active { + background-image: -gtk-scaled(url("assets/scale-vert-marks-before-slider-dark.png"), url("assets/scale-vert-marks-before-slider-dark@2.png")); +} + +scale.vertical.marks-after:not(.marks-before) > trough > slider { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1), background-size 300ms cubic-bezier(0, 0, 0.2, 1), background-image 1200ms cubic-bezier(0, 0, 0.2, 1); + min-height: 32px; + min-width: 32px; + margin: -15px; + border-radius: 50%; + background-size: auto, 1000% 1000%; + background-repeat: no-repeat; + background-position: center center; + background-color: transparent; +} + +scale.vertical.marks-after:not(.marks-before) > trough > slider, scale.vertical.marks-after:not(.marks-before) > trough > slider:hover, scale.vertical.marks-after:not(.marks-before) > trough > slider:active, scale.vertical.marks-after:not(.marks-before) > trough > slider:disabled { + box-shadow: none; +} + +scale.vertical.marks-after:not(.marks-before) > trough > slider:focus { + background-color: alpha(currentColor, 0.08); +} + +scale.vertical.marks-after:not(.marks-before) > trough > slider:hover { + background-color: alpha(currentColor, 0.08); +} + +scale.vertical.marks-after:not(.marks-before) > trough > slider:focus:hover { + background-color: alpha(currentColor, 0.16); +} + +scale.vertical.marks-after:not(.marks-before) > trough > slider:active { + background-size: auto, 0% 0%; + background-color: alpha(currentColor, 0.08); +} + +scale.vertical.marks-after:not(.marks-before) > trough > slider { + background-image: -gtk-scaled(url("assets/scale-vert-marks-after-slider-dark.png"), url("assets/scale-vert-marks-after-slider-dark@2.png")); +} + +scale.vertical.marks-after:not(.marks-before) > trough > slider:disabled { + background-image: -gtk-scaled(url("assets/scale-vert-marks-after-slider-disabled-dark.png"), url("assets/scale-vert-marks-after-slider-disabled-dark@2.png")); +} + +scale.vertical.marks-after:not(.marks-before) > trough > slider:active { + background-image: -gtk-scaled(url("assets/scale-vert-marks-after-slider-dark.png"), url("assets/scale-vert-marks-after-slider-dark@2.png")); +} + +scale.color { + min-height: 0; + min-width: 0; +} + +scale.color.horizontal { + padding: 0 0 12px 0; +} + +scale.color.horizontal > trough > slider:dir(ltr), scale.color.horizontal > trough > slider:dir(rtl) { + margin-bottom: -13.5px; + margin-top: 11.5px; +} + +scale.color.vertical:dir(ltr) { + padding: 0 0 0 12px; +} + +scale.color.vertical:dir(ltr) slider { + margin-left: -13.5px; + margin-right: 11.5px; +} + +scale.color.vertical:dir(rtl) { + padding: 0 12px 0 0; +} + +scale.color.vertical:dir(rtl) > trough > slider { + margin-right: -13.5px; + margin-left: 11.5px; +} + +/***************** + * Progress bars * + *****************/ +progressbar { + color: rgba(255, 255, 255, 0.7); + font-size: smaller; +} + +progressbar.horizontal trough, +progressbar.horizontal progress { + min-height: 6px; +} + +progressbar.vertical trough, +progressbar.vertical progress { + min-width: 6px; +} + +progressbar trough { + border-radius: 6px; + background-color: rgba(255, 255, 255, 0.12); +} + +progressbar progress { + border-radius: 6px; + background-color: #b7bdf8; +} + +progressbar.osd { + min-width: 6px; + min-height: 6px; + background-color: transparent; + box-shadow: none; + margin: 0; + padding: 0; +} + +progressbar.osd trough { + background-color: transparent; +} + +progressbar.osd progress { + background-color: #b7bdf8; +} + +progressbar trough.empty progress { + all: unset; +} + +/************* + * Level Bar * + *************/ +levelbar.horizontal block { + min-height: 6px; +} + +levelbar.horizontal.discrete block { + min-width: 36px; +} + +levelbar.horizontal.discrete block:not(:last-child) { + margin-right: 2px; +} + +levelbar.vertical block { + min-width: 6px; +} + +levelbar.vertical.discrete block { + min-height: 36px; +} + +levelbar.vertical.discrete block:not(:last-child) { + margin-bottom: 2px; +} + +levelbar trough { + border-radius: 6px; +} + +levelbar block.low { + background-color: #FBC02D; +} + +levelbar block.high, levelbar block:not(.empty) { + background-color: #b7bdf8; +} + +levelbar block.full { + background-color: #66BB6A; +} + +levelbar block.empty { + background-color: rgba(255, 255, 255, 0.12); +} + +/**************** + * Print dialog * +*****************/ +window.dialog.print drawing { + color: #FFFFFF; + background: none; + border: none; + padding: 0; +} + +window.dialog.print drawing paper { + padding: 0; + border: 1px solid rgba(255, 255, 255, 0.12); + background-color: #24273a; + color: #FFFFFF; +} + +window.dialog.print .dialog-action-box { + margin: 12px; +} + +/********** + * Frames * + **********/ +frame, +.frame { + border: 1px solid rgba(255, 255, 255, 0.12); +} + +frame > list, +.frame > list { + border: none; +} + +frame.view, +.frame.view { + border-radius: 6px; +} + +frame.flat, +.frame.flat { + border-style: none; +} + +frame { + border-radius: 6px; +} + +frame > label { + margin: 4px; +} + +frame.flat > border, statusbar frame > border { + border: none; +} + +actionbar > revealer > box { + padding: 6px; + border-spacing: 0; + box-shadow: inset 0 1px rgba(255, 255, 255, 0.12); + background-color: #24273a; + background-clip: border-box; + border: none; +} + +actionbar > revealer > box button, actionbar > revealer > box entry, +actionbar > revealer > box menubutton, actionbar > revealer > box menubutton > button, +actionbar > revealer > box splitbutton, actionbar > revealer > box splitbutton > button, +actionbar > revealer > box spinbutton { + margin: 0; +} + +statusbar { + padding: 6px 18px; +} + +scrolledwindow viewport.frame { + border: none; +} + +stack scrolledwindow.frame viewport.frame list { + border: none; +} + +scrolledwindow > overshoot.top { + background-image: radial-gradient(farthest-side at top, alpha(currentColor, 0.12) 85%, alpha(currentColor, 0)), radial-gradient(farthest-side at top, alpha(currentColor, 0.05), alpha(currentColor, 0)); + background-size: 100% 3%, 100% 50%; + background-repeat: no-repeat; + background-position: top; + background-color: transparent; + border: none; + box-shadow: none; +} + +scrolledwindow > overshoot.bottom { + background-image: radial-gradient(farthest-side at bottom, alpha(currentColor, 0.12) 85%, alpha(currentColor, 0)), radial-gradient(farthest-side at bottom, alpha(currentColor, 0.05), alpha(currentColor, 0)); + background-size: 100% 3%, 100% 50%; + background-repeat: no-repeat; + background-position: bottom; + background-color: transparent; + border: none; + box-shadow: none; +} + +scrolledwindow > overshoot.left { + background-image: radial-gradient(farthest-side at left, alpha(currentColor, 0.12) 85%, alpha(currentColor, 0)), radial-gradient(farthest-side at left, alpha(currentColor, 0.05), alpha(currentColor, 0)); + background-size: 3% 100%, 50% 100%; + background-repeat: no-repeat; + background-position: left; + background-color: transparent; + border: none; + box-shadow: none; +} + +scrolledwindow > overshoot.right { + background-image: radial-gradient(farthest-side at right, alpha(currentColor, 0.12) 85%, alpha(currentColor, 0)), radial-gradient(farthest-side at right, alpha(currentColor, 0.05), alpha(currentColor, 0)); + background-size: 3% 100%, 50% 100%; + background-repeat: no-repeat; + background-position: right; + background-color: transparent; + border: none; + box-shadow: none; +} + +scrolledwindow.undershoot-top > undershoot.top { + box-shadow: none; + background: linear-gradient(to bottom, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +scrolledwindow.undershoot-bottom > undershoot.bottom { + box-shadow: none; + background: linear-gradient(to top, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +scrolledwindow.undershoot-start:dir(ltr) > undershoot.left { + box-shadow: none; + background: linear-gradient(to right, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +scrolledwindow.undershoot-start:dir(rtl) > undershoot.right { + box-shadow: none; + background: linear-gradient(to left, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +scrolledwindow.undershoot-end:dir(ltr) > undershoot.right { + box-shadow: none; + background: linear-gradient(to left, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +scrolledwindow.undershoot-end:dir(rtl) > undershoot.left { + box-shadow: none; + background: linear-gradient(to right, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +scrolledwindow > undershoot { + background-image: none; + box-shadow: none; + border: none; +} + +separator { + min-width: 1px; + min-height: 1px; + background-color: rgba(255, 255, 255, 0.12); +} + +stacksidebar + separator.vertical, +stacksidebar separator.horizontal, button.font separator, button.file separator, separator.spacer { + min-width: 0; + min-height: 0; + background-color: transparent; + background-image: none; +} + +/********* + * Lists * + *********/ +list.content, +list.boxed-list { + border-radius: 7px; + box-shadow: none; + border: 1px solid rgba(255, 255, 255, 0.12); +} + +listview, +list { + border-color: rgba(255, 255, 255, 0.12); + background-color: #24273a; + background-clip: padding-box; +} + +listview > row, +list > row { + padding: 6px; + background-clip: padding-box; +} + +listview > row.expander, +list > row.expander { + padding: 0px; +} + +listview > row.expander .row-header, +list > row.expander .row-header { + padding: 2px; +} + +listview.horizontal row.separator:not(:last-child), listview.separators.horizontal > row:not(.separator):not(:last-child), +list.horizontal row.separator:not(:last-child), +list.separators.horizontal > row:not(.separator):not(:last-child) { + border-left: 1px solid rgba(255, 255, 255, 0.12); +} + +listview:not(.horizontal) row.separator:not(:last-child), listview.separators:not(.horizontal) > row:not(.separator):not(:last-child), +list:not(.horizontal) row.separator:not(:last-child), +list.separators:not(.horizontal) > row:not(.separator):not(:last-child) { + border-bottom: 1px solid rgba(255, 255, 255, 0.12); +} + +list.frame { + border-radius: 6px; +} + +listview.view { + color: #FFFFFF; + background-color: transparent; +} + +popover.menu listview.view { + padding: 0; + border-radius: 6px; +} + +popover.menu listview.view > row { + margin-left: 0; + margin-right: 0; + border-radius: 6px; +} + +row { + color: rgba(255, 255, 255, 0.7); + background-clip: padding-box; +} + +row label.subtitle { + font-size: smaller; +} + +row > box.header { + margin-left: 12px; + margin-right: 12px; + min-height: 48px; +} + +row > box.header > .icon:disabled { + filter: opacity(0.35); +} + +row > box.header > box.title { + margin-top: 6px; + margin-bottom: 6px; + border-spacing: 3px; +} + +.nautilus-window .nautilus-grid-view child.activatable, columnview.view > header > button, +treeview.view > header > button, row.activatable { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), background-size 300ms cubic-bezier(0, 0, 0.2, 1), background-image 1200ms cubic-bezier(0, 0, 0.2, 1), font-weight 0; + outline: none; + box-shadow: none; + background-color: transparent; + background-image: radial-gradient(circle, transparent 10%, transparent 0%); + background-repeat: no-repeat; + background-position: center; + background-size: 1000% 1000%; + outline: none; +} + +.nautilus-window .nautilus-grid-view child.activatable:focus, columnview.view > header > button:focus, +treeview.view > header > button:focus, row.activatable:focus { + color: #FFFFFF; + background-color: transparent; + box-shadow: none; + outline: none; +} + +.nautilus-window .nautilus-grid-view child.activatable:hover, columnview.view > header > button:hover, +treeview.view > header > button:hover, .nautilus-window .nautilus-grid-view child.has-open-popup.activatable, columnview.view > header > button.has-open-popup, +treeview.view > header > button.has-open-popup, row.activatable:hover, row.activatable.has-open-popup { + color: #FFFFFF; + background-color: alpha(currentColor, 0.05); + box-shadow: none; +} + +.nautilus-window .nautilus-grid-view child.activatable:active, columnview.view > header > button:active, +treeview.view > header > button:active, row.activatable:active { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms, font-weight 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.05) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.05); + color: #FFFFFF; + box-shadow: none; +} + +.nautilus-window .nautilus-grid-view child.activatable:selected, columnview.view > header > button:selected, +treeview.view > header > button:selected, row.activatable:selected { + background-color: alpha(currentColor, 0.06); +} + +.nautilus-window .nautilus-grid-view child.activatable:selected:hover, columnview.view > header > button:selected:hover, +treeview.view > header > button:selected:hover, row.activatable:selected:hover { + background-color: alpha(currentColor, 0.08); +} + +button row.activatable:focus, button row.activatable:hover, button row.activatable:active { + box-shadow: none; + background: none; +} + +button:checked row.activatable { + color: rgba(0, 0, 0, 0.87); +} + +row:selected { + background-color: alpha(currentColor, 0.06); + color: #FFFFFF; + box-shadow: none; +} + +row:selected:hover { + background-color: alpha(currentColor, 0.08); +} + +row:selected:focus, row:selected:focus-visible:focus-within { + outline: none; + background-color: alpha(currentColor, 0.08); +} + +row:selected:focus:hover, row:selected:focus-visible:focus-within:hover { + background-color: alpha(currentColor, 0.16); +} + +row:selected button image, +row:selected button label { + color: inherit; +} + +row:selected:disabled { + color: rgba(255, 255, 255, 0.5); +} + +.rich-list { + /* rich lists usually containing other widgets than just labels/text */ +} + +.rich-list > row { + padding: 9px 12px; + min-height: 32px; + /* should be tall even when only containing a label */ +} + +.rich-list > row:last-child { + border-bottom: none; +} + +.rich-list > row > box { + border-spacing: 12px; +} + +row label.subtitle { + font-size: smaller; +} + +row > box.header { + margin-left: 12px; + margin-right: 12px; + border-spacing: 6px; + min-height: 50px; +} + +row > box.header > .icon:disabled { + filter: opacity(0.45); +} + +row > box.header > box.title { + margin-top: 6px; + margin-bottom: 6px; + border-spacing: 3px; + padding: 0; +} + +row > box.header > box.title, +row > box.header > box.title > .title, +row > box.header > box.title > .subtitle { + padding: 0; + font-weight: inherit; +} + +row > box.header > .prefixes, +row > box.header > .suffixes { + border-spacing: 6px; +} + +row > box.header > .icon:dir(ltr), +row > box.header > .prefixes:dir(ltr) { + margin-right: 6px; +} + +row > box.header > .icon:dir(rtl), +row > box.header > .prefixes:dir(rtl) { + margin-left: 6px; +} + +row.entry .edit-icon, row.entry .indicator { + min-width: 24px; + min-height: 24px; + padding: 5px; +} + +row.entry .edit-icon:disabled { + opacity: 0.5; +} + +row.entry .indicator { + opacity: 0.65; +} + +row.entry.monospace { + font-family: inherit; +} + +row.entry.monospace text { + font-family: monospace; +} + +row.spin spinbutton { + background: none; + border-spacing: 6px; + box-shadow: none; +} + +row.spin spinbutton, row.spin spinbutton:focus { + outline: none; +} + +row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr):last-child, row.spin spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child, +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child, +row.spin spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child { + min-width: 30px; + min-height: 30px; + margin: 10px 2px; + border: none; +} + +row.spin:disabled spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:disabled, row.spin:disabled spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(ltr):last-child:disabled, row.spin:disabled spinbutton > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child:dir(rtl):first-child:disabled, +row.spin:disabled spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):disabled, +row.spin:disabled spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(ltr):last-child:disabled, +row.spin:disabled spinbutton > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):dir(rtl):first-child:disabled { + filter: none; +} + +row.entry:not(:selected).activatable.focused:hover, row.entry:not(:selected).activatable.focused:active, +row.spin:not(:selected).activatable.focused:hover, +row.spin:not(:selected).activatable.focused:active { + background-color: transparent; +} + +row.entry.error text > selection:focus-within, +row.spin.error text > selection:focus-within { + background-color: alpha(#F44336, 0.2); +} + +row.entry.error text > cursor-handle > contents, +row.spin.error text > cursor-handle > contents { + background-color: currentColor; +} + +row.entry.error .dim-label, row.entry.error row.expander image.expander-row-arrow, row.expander row.entry.error image.expander-row-arrow, row.entry.error .subtitle, +row.spin.error .dim-label, +row.spin.error row.expander image.expander-row-arrow, +row.expander row.spin.error image.expander-row-arrow, +row.spin.error .subtitle { + opacity: 1; +} + +row.entry.error .suggested-action, +row.spin.error .suggested-action { + background-color: #F44336; + color: #FFFFFF; +} + +row.entry.warning text > selection:focus-within, +row.spin.warning text > selection:focus-within { + background-color: alpha(#FBC02D, 0.2); +} + +row.entry.warning text > cursor-handle > contents, +row.spin.warning text > cursor-handle > contents { + background-color: currentColor; +} + +row.entry.warning .dim-label, row.entry.warning row.expander image.expander-row-arrow, row.expander row.entry.warning image.expander-row-arrow, row.entry.warning .subtitle, +row.spin.warning .dim-label, +row.spin.warning row.expander image.expander-row-arrow, +row.expander row.spin.warning image.expander-row-arrow, +row.spin.warning .subtitle { + opacity: 1; +} + +row.entry.warning .suggested-action, +row.spin.warning .suggested-action { + background-color: #FBC02D; + color: rgba(0, 0, 0, 0.87); +} + +row.entry.success text > selection:focus-within, +row.spin.success text > selection:focus-within { + background-color: alpha(#66BB6A, 0.2); +} + +row.entry.success text > cursor-handle > contents, +row.spin.success text > cursor-handle > contents { + background-color: currentColor; +} + +row.entry.success .dim-label, row.entry.success row.expander image.expander-row-arrow, row.expander row.entry.success image.expander-row-arrow, row.entry.success .subtitle, +row.spin.success .dim-label, +row.spin.success row.expander image.expander-row-arrow, +row.expander row.spin.success image.expander-row-arrow, +row.spin.success .subtitle { + opacity: 1; +} + +row.entry.success .suggested-action, +row.spin.success .suggested-action { + background-color: #66BB6A; + color: #FFFFFF; +} + +row.combo image.dropdown-arrow:disabled { + filter: opacity(0.45); +} + +row.combo listview.inline { + background: none; + border: none; + box-shadow: none; + color: inherit; +} + +row.combo listview.inline, row.combo listview.inline:disabled { + background: none; + color: inherit; +} + +row.combo popover > contents { + min-width: 120px; +} + +list.content > row, list.content > row.expander row.header, +list.boxed-list > row, +list.boxed-list > row.expander row.header, row.expander list.nested > row { + border-bottom: 1px solid rgba(255, 255, 255, 0.12); +} + +list.content > row:not(:selected).activatable:hover, list.content > row.expander row.header:not(:selected).activatable:hover, +list.boxed-list > row:not(:selected).activatable:hover, +list.boxed-list > row.expander row.header:not(:selected).activatable:hover, row.expander list.nested > row:not(:selected).activatable:hover { + background-color: alpha(currentColor, 0.08); +} + +list.content > row:not(:selected).activatable:active, list.content > row.expander row.header:not(:selected).activatable:active, +list.boxed-list > row:not(:selected).activatable:active, +list.boxed-list > row.expander row.header:not(:selected).activatable:active, row.expander list.nested > row:not(:selected).activatable:active { + background-color: alpha(currentColor, 0.12); +} + +list.content > row:not(:selected).activatable.has-open-popup, list.content > row.expander row.header:not(:selected).activatable.has-open-popup, +list.boxed-list > row:not(:selected).activatable.has-open-popup, +list.boxed-list > row.expander row.header:not(:selected).activatable.has-open-popup, row.expander list.nested > row:not(:selected).activatable.has-open-popup { + background-color: alpha(currentColor, 0.03); +} + +row.expander { + background: none; + padding: 0px; +} + +row.expander > box > list { + background: none; + color: inherit; +} + +row.expander list.nested { + color: inherit; +} + +row.expander image.expander-row-arrow { + transition: -gtk-icon-transform 200ms cubic-bezier(0, 0, 0.2, 1); +} + +row.expander image.expander-row-arrow:dir(ltr) { + margin-left: 6px; +} + +row.expander image.expander-row-arrow:dir(rtl) { + margin-right: 6px; +} + +row.expander image.expander-row-arrow:dir(ltr) { + -gtk-icon-transform: rotate(0.5turn); +} + +row.expander image.expander-row-arrow:dir(rtl) { + -gtk-icon-transform: rotate(-0.5turn); +} + +row.expander image.expander-row-arrow:disabled { + filter: opacity(0.45); +} + +row.expander:checked image.expander-row-arrow { + -gtk-icon-transform: rotate(0turn); + opacity: 1; +} + +row.expander:checked image.expander-row-arrow:not(:disabled) { + color: #b7bdf8; +} + +.osd row.expander:checked image.expander-row-arrow:not(:disabled) { + color: inherit; +} + +list.content > row.expander, +list.boxed-list > row.expander { + border: none; +} + +list.content > row:first-child, list.content > row:first-child.expander row.header, +list.boxed-list > row:first-child, +list.boxed-list > row:first-child.expander row.header { + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +list.content > row:last-child, list.content > row:last-child.expander:not(:checked), list.content > row:last-child.expander:not(:checked) row.header, list.content > row:last-child.expander:checked list.nested, list.content > row:last-child.expander:checked list.nested > row:last-child, +list.boxed-list > row:last-child, +list.boxed-list > row:last-child.expander:not(:checked), +list.boxed-list > row:last-child.expander:not(:checked) row.header, +list.boxed-list > row:last-child.expander:checked list.nested, +list.boxed-list > row:last-child.expander:checked list.nested > row:last-child { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + border-bottom-width: 0; +} + +columnview > listview > row { + padding: 0; +} + +columnview > listview > row > cell { + padding: 8px 6px; +} + +columnview > listview > row > cell:not(:first-child) { + border-left: 1px solid transparent; +} + +columnview.column-separators > listview > row > cell { + border-left-color: rgba(255, 255, 255, 0.12); +} + +columnview.data-table > listview > row > cell { + padding-top: 2px; + padding-bottom: 2px; +} + +treeexpander { + border-spacing: 6px; +} + +columnview row:not(:selected) cell editablelabel:not(.editing):focus-within { + outline: 2px solid alpha(currentColor, 0.06); +} + +columnview row:not(:selected) cell editablelabel.editing:focus-within { + outline: 2px solid #b7bdf8; +} + +columnview row:not(:selected) cell editablelabel.editing text selection { + color: rgba(0, 0, 0, 0.87); + background-color: #b7bdf8; +} + +/********************* + * App Notifications * + *********************/ +.app-notification { + margin: 6px; + border-spacing: 0; + padding: 0; + border: none; + background-image: none; +} + +.app-notification button.text-button:not(:disabled) { + color: #b7bdf8; +} + +.app-notification > box > label { + margin-left: 9px; +} + +.app-notification.frame, +.app-notification border { + border: none; +} + +/************* + * Expanders * + *************/ +expander { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); + min-width: 16px; + min-height: 16px; + color: rgba(255, 255, 255, 0.7); + -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); +} + +expander:dir(rtl) { + -gtk-icon-source: -gtk-icontheme("pan-end-symbolic-rtl"); +} + +expander:hover, expander:active { + color: #FFFFFF; +} + +expander:checked { + -gtk-icon-source: -gtk-icontheme("pan-down-symbolic"); +} + +expander:disabled { + color: rgba(255, 255, 255, 0.32); +} + +expander-widget > box > title { + border-radius: 6px; +} + +expander-widget > box > title:hover > expander { + color: rgba(255, 255, 255, 0.7); +} + +.navigation-sidebar:not(decoration):not(window):drop(active):focus, .navigation-sidebar:not(decoration):not(window):drop(active), +placessidebar:not(decoration):not(window):drop(active):focus, +placessidebar:not(decoration):not(window):drop(active), +stackswitcher:not(decoration):not(window):drop(active):focus, +stackswitcher:not(decoration):not(window):drop(active), +expander-widget:not(decoration):not(window):drop(active):focus, +expander-widget:not(decoration):not(window):drop(active) { + box-shadow: none; +} + +/************ + * Calendar * + ************/ +calendar { + padding: 0; + border: 1px solid rgba(255, 255, 255, 0.12); + border-radius: 6px; + color: #FFFFFF; +} + +calendar:disabled { + color: rgba(255, 255, 255, 0.5); +} + +calendar:selected { + border-radius: 6px; +} + +calendar > header { + padding: 3px; + border-bottom: 1px solid rgba(255, 255, 255, 0.12); +} + +calendar > header > button { + min-height: 24px; +} + +calendar > grid { + margin: 3px; +} + +calendar > grid > label { + border-radius: 6px; + margin: 0; +} + +calendar > grid > label.today:selected { + box-shadow: none; +} + +calendar > grid > label:focus { + outline-style: none; +} + +calendar > grid > label.day-number { + padding: 6px; +} + +calendar > grid > label.day-number.other-month { + color: alpha(currentColor, 0.3); +} + +/*********** + * Dialogs * + ***********/ +window.messagedialog .response-area button, window.dialog.message .dialog-action-area > button { + border-radius: 0; + min-height: 28px; + padding: 6px 12px; + margin: 0; + border: none; +} + +window.messagedialog .response-area button:first-child, window.dialog.message .dialog-action-area > button:first-child { + border-radius: 0 0 0 12px; +} + +window.messagedialog .response-area button:last-child, window.dialog.message .dialog-action-area > button:last-child { + border-radius: 0 0 12px 0; +} + +window.messagedialog .response-area button:only-child, window.dialog.message .dialog-action-area > button:only-child { + border-radius: 0 0 12px 12px; +} + +window.dialog.message.background { + background-color: #363a4f; +} + +window.dialog.message box.dialog-vbox.vertical { + margin-top: 6px; + border-spacing: 24px; +} + +window.dialog.message box.dialog-vbox.vertical > box.vertical { + margin-bottom: 6px; +} + +window.dialog.message box.dialog-vbox.vertical > box > box > box > label.title { + font-weight: 800; + font-size: 15pt; +} + +window.dialog.message .titlebar { + min-height: 24px; + border-style: none; + box-shadow: inset 0 1px rgba(255, 255, 255, 0.1); + background-color: #363a4f; + color: #FFFFFF; +} + +window.dialog.message .titlebar:backdrop { + background-color: #363a4f; + color: rgba(255, 255, 255, 0.7); +} + +window.dialog.message .dialog-action-area { + border-top: 1px solid rgba(255, 255, 255, 0.12); + margin: 0; + border-spacing: 0; +} + +window.dialog.message .dialog-action-area > button { + border: none; +} + +window.dialog.message .dialog-action-area > button:not(:last-child) { + border-right: 1px solid rgba(255, 255, 255, 0.12); +} + +window.dialog.message .dialog-action-area > button.suggested-action:not(:disabled) { + color: #b7bdf8; +} + +window.dialog.message .dialog-action-area > button.destructive-action:not(:disabled) { + color: #F44336; +} + +window.aboutdialog.background.csd scrolledwindow.frame, window.aboutdialog.background.csd scrolledwindow.frame > viewport.view, window.aboutdialog.background.csd scrolledwindow.frame > textview.view, window.aboutdialog.background.csd scrolledwindow.frame > textview.view > text { + border-radius: 6px; +} + +/******************** + * AdwMessageDialog * + ********************/ +window.messagedialog { + background-color: #363a4f; + color: #FFFFFF; +} + +window.messagedialog .message-area { + padding: 24px 30px; + border-spacing: 10px; +} + +window.messagedialog .response-area button { + margin: 0; +} + +window.messagedialog .response-area button:first-child { + margin-left: 0; +} + +window.messagedialog .response-area button:last-child { + margin-right: 0; +} + +window.messagedialog .response-area button.suggested { + color: #b7bdf8; +} + +window.messagedialog .response-area button.destructive { + color: #F44336; +} + +filechooser .dialog-action-box { + border-top: 1px solid rgba(255, 255, 255, 0.12); +} + +filechooser #pathbarbox { + border-bottom: 1px solid rgba(255, 255, 255, 0.12); + background-color: #24273a; +} + +filechooser stack.view frame > border { + border: none; +} + +filechooserbutton > button > box { + border-spacing: 6px; +} + +filechooserbutton:drop(active) { + box-shadow: none; + border-color: transparent; +} + +/*********** + * Sidebar * + ***********/ +.sidebar { + border-style: none; + background-color: #181926; +} + +.sidebar listview.view, +.sidebar list { + background-color: transparent; + color: inherit; +} + +stacksidebar.sidebar:dir(ltr), stacksidebar.sidebar.left, stacksidebar.sidebar.left:dir(rtl) { + box-shadow: inset -1px 0 rgba(255, 255, 255, 0.12); +} + +stacksidebar.sidebar:dir(rtl), stacksidebar.sidebar.right, stacksidebar.sidebar.right:dir(ltr) { + box-shadow: inset 1px 0 rgba(255, 255, 255, 0.12); +} + +.sidebar-pane stacksidebar.sidebar, leaflet.unfolded > box > stacksidebar.sidebar { + box-shadow: none; +} + +stacksidebar list { + padding: 6px; + background-color: #181926; +} + +stacksidebar row { + min-height: 24px; + padding: 6px; + border-radius: 6px; +} + +stacksidebar row:selected { + font-weight: 500; +} + +stacksidebar row + row { + margin-top: 4px; +} + +stacksidebar row > label { + padding-left: 6px; + padding-right: 6px; + color: inherit; +} + +separator.sidebar { + background-color: rgba(255, 255, 255, 0.12); + border-right: none; +} + +separator.sidebar.selection-mode, .selection-mode separator.sidebar { + background-color: rgba(255, 255, 255, 0.12); +} + +/********************** + * Navigation Sidebar * + **********************/ +.navigation-sidebar { + padding: 4.5px 0; + border-right: none; +} + +.navigation-sidebar, .navigation-sidebar.view, .navigation-sidebar.view:disabled { + background-color: transparent; + color: inherit; +} + +.navigation-sidebar.background, .navigation-sidebar.background:disabled { + background-color: #181926; + color: rgba(255, 255, 255, 0.7); +} + +.navigation-sidebar > separator { + margin: 4.5px 0; +} + +.navigation-sidebar > row { + min-height: 24px; + padding: 6px; + border-radius: 6px; + margin: 1.5px 6px; +} + +/**************** + * File chooser * + ****************/ +row image.sidebar-icon { + transition: color 75ms cubic-bezier(0, 0, 0.2, 1); + color: rgba(255, 255, 255, 0.7); +} + +row image.sidebar-icon:disabled { + color: rgba(255, 255, 255, 0.32); +} + +placessidebar > viewport.frame { + border-style: none; +} + +placessidebar list > separator { + margin: 3px 0; +} + +placessidebar row:selected { + font-weight: 500; +} + +placessidebar row image.sidebar-icon { + color: inherit; + opacity: 0.75; +} + +placessidebar row image.sidebar-icon:dir(ltr) { + padding-right: 8px; +} + +placessidebar row image.sidebar-icon:dir(rtl) { + padding-left: 8px; +} + +placessidebar row label.sidebar-label { + color: inherit; +} + +placessidebar row label.sidebar-label:dir(ltr) { + padding-right: 2px; +} + +placessidebar row label.sidebar-label:dir(rtl) { + padding-left: 2px; +} + +placessidebar row.sidebar-placeholder-row { + background-color: alpha(currentColor, 0.08); +} + +placessidebar row.sidebar-new-bookmark-row { + color: #b7bdf8; +} + +placessidebar row.sidebar-new-bookmark-row image.sidebar-icon { + color: #b7bdf8; +} + +placessidebar row:drop(active) { + background-color: alpha(currentColor, 0.08); +} + +placesview .server-list-button > image { + transition: 200ms cubic-bezier(0, 0, 0.2, 1); + -gtk-icon-transform: rotate(0turn); +} + +placesview .server-list-button:checked > image { + transition: 200ms cubic-bezier(0, 0, 0.2, 1); + -gtk-icon-transform: rotate(-0.5turn); +} + +placesview > actionbar > revealer > box > label { + border-spacing: 6px; +} + +/********* + * Paned * + *********/ +paned > separator { + min-width: 1px; + min-height: 1px; + -gtk-icon-source: none; + border-style: none; + background-color: transparent; + background-image: image(#3e4152); + background-size: 1px 1px; + background-clip: content-box; + box-shadow: none; +} + +paned > separator.wide { + min-width: 6px; + min-height: 6px; + background-color: #24273a; + background-image: image(#3e4152), image(#3e4152); + background-size: 1px 1px, 1px 1px; +} + +paned.horizontal > separator { + background-repeat: repeat-y; +} + +paned.horizontal > separator:dir(ltr) { + margin: 0 -8px 0 0; + padding: 0 8px 0 0; + background-position: left; +} + +paned.horizontal > separator:dir(rtl) { + margin: 0 0 0 -8px; + padding: 0 0 0 8px; + background-position: right; +} + +paned.horizontal > separator.wide { + margin: 0; + padding: 0; + background-repeat: repeat-y, repeat-y; + background-position: left, right; +} + +paned.vertical > separator { + margin: 0 0 -8px 0; + padding: 0 0 8px 0; + background-repeat: repeat-x; + background-position: top; +} + +paned.vertical > separator.wide { + margin: 0; + padding: 0; + background-repeat: repeat-x, repeat-x; + background-position: bottom, top; +} + +/************ + * GtkVideo * + ************/ +video { + background: black; + border-radius: 6px; +} + +video image.osd { + min-width: 64px; + min-height: 64px; + border-radius: 9999px; + border: none; +} + +/************** + * GtkInfoBar * + **************/ +infobar > revealer > box { + padding: 6px; + border-spacing: 12px; + border-bottom: 1px solid rgba(255, 255, 255, 0.12); + box-shadow: none; +} + +infobar.info > revealer > box, infobar.info:hover > revealer > box, infobar.info:backdrop > revealer > box { + background-color: #24273a; + color: #FFFFFF; +} + +infobar.info > revealer > box button.text-button:not(:disabled):not(.suggested-action):not(.destructive-action), infobar.info:hover > revealer > box button.text-button:not(:disabled):not(.suggested-action):not(.destructive-action), infobar.info:backdrop > revealer > box button.text-button:not(:disabled):not(.suggested-action):not(.destructive-action) { + color: #b7bdf8; +} + +infobar.action > revealer > box, infobar.action:backdrop > revealer > box, infobar.question > revealer > box, infobar.question:backdrop > revealer > box { + background-color: #b7bdf8; + color: rgba(0, 0, 0, 0.87); +} + +infobar.action > revealer > box button, infobar.action > revealer > box button:hover, infobar.action > revealer > box button:focus, infobar.action > revealer > box button:active, infobar.action > revealer > box button:checked, infobar.action > revealer > box button.text-button:not(:disabled), infobar.action:backdrop > revealer > box button, infobar.action:backdrop > revealer > box button:hover, infobar.action:backdrop > revealer > box button:focus, infobar.action:backdrop > revealer > box button:active, infobar.action:backdrop > revealer > box button:checked, infobar.action:backdrop > revealer > box button.text-button:not(:disabled), infobar.question > revealer > box button, infobar.question > revealer > box button:hover, infobar.question > revealer > box button:focus, infobar.question > revealer > box button:active, infobar.question > revealer > box button:checked, infobar.question > revealer > box button.text-button:not(:disabled), infobar.question:backdrop > revealer > box button, infobar.question:backdrop > revealer > box button:hover, infobar.question:backdrop > revealer > box button:focus, infobar.question:backdrop > revealer > box button:active, infobar.question:backdrop > revealer > box button:checked, infobar.question:backdrop > revealer > box button.text-button:not(:disabled) { + color: rgba(0, 0, 0, 0.87); +} + +infobar.action > revealer > box *:link, infobar.action:backdrop > revealer > box *:link, infobar.question > revealer > box *:link, infobar.question:backdrop > revealer > box *:link { + color: rgba(0, 0, 0, 0.87); +} + +infobar.action:hover > revealer > box, infobar.question:hover > revealer > box { + background-color: #a0a8f6; +} + +infobar.warning > revealer > box, infobar.warning:backdrop > revealer > box { + background-color: #FBC02D; + color: rgba(0, 0, 0, 0.87); +} + +infobar.warning > revealer > box button, infobar.warning > revealer > box button:hover, infobar.warning > revealer > box button:focus, infobar.warning > revealer > box button:active, infobar.warning > revealer > box button:checked, infobar.warning > revealer > box button.text-button:not(:disabled), infobar.warning:backdrop > revealer > box button, infobar.warning:backdrop > revealer > box button:hover, infobar.warning:backdrop > revealer > box button:focus, infobar.warning:backdrop > revealer > box button:active, infobar.warning:backdrop > revealer > box button:checked, infobar.warning:backdrop > revealer > box button.text-button:not(:disabled) { + color: rgba(0, 0, 0, 0.87); +} + +infobar.warning > revealer > box *:link, infobar.warning:backdrop > revealer > box *:link { + color: rgba(0, 0, 0, 0.87); +} + +infobar.warning:hover > revealer > box { + background-color: #fbb814; +} + +infobar.error > revealer > box, infobar.error:backdrop > revealer > box { + background-color: #F44336; + color: #FFFFFF; +} + +infobar.error > revealer > box button, infobar.error > revealer > box button:hover, infobar.error > revealer > box button:focus, infobar.error > revealer > box button:active, infobar.error > revealer > box button:checked, infobar.error > revealer > box button.text-button:not(:disabled), infobar.error:backdrop > revealer > box button, infobar.error:backdrop > revealer > box button:hover, infobar.error:backdrop > revealer > box button:focus, infobar.error:backdrop > revealer > box button:active, infobar.error:backdrop > revealer > box button:checked, infobar.error:backdrop > revealer > box button.text-button:not(:disabled) { + color: #FFFFFF; +} + +infobar.error > revealer > box *:link, infobar.error:backdrop > revealer > box *:link { + color: #FFFFFF; +} + +infobar.error:hover > revealer > box { + background-color: #f32c1e; +} + +/************ + * Tooltips * + ************/ +tooltip { + padding: 6px 12px; + box-shadow: none; + border: none; +} + +tooltip.background { + background-color: rgba(18, 19, 29, 0.9); + color: #FFFFFF; + box-shadow: 0 2px 3px -1px rgba(0, 0, 0, 0.05), 0 4px 6px 0 rgba(0, 0, 0, 0.06), 0 1px 10px 0 rgba(0, 0, 0, 0.05); + border-radius: 6px; + margin: 2px 6px 8px 6px; +} + +tooltip > box { + border-spacing: 6px; +} + +/***************** + * Color Chooser * + *****************/ +colorswatch.top { + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +colorswatch.top overlay { + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +colorswatch.bottom { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} + +colorswatch.bottom overlay { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} + +colorswatch.left, colorswatch:first-child:not(.top) { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} + +colorswatch.left overlay, colorswatch:first-child:not(.top) overlay { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} + +colorswatch.right, colorswatch:last-child:not(.bottom) { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} + +colorswatch.right overlay, colorswatch:last-child:not(.bottom) overlay { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} + +colorswatch.dark { + color: #FFFFFF; +} + +colorswatch.light { + color: rgba(0, 0, 0, 0.87); +} + +colorchooser colorswatch:hover { + transition: box-shadow 200ms ease-out; + box-shadow: 0 0 0 2px #b7bdf8; +} + +colorswatch#add-color-button { + border-radius: 6px 0 0 6px; + color: #FFFFFF; +} + +colorswatch#add-color-button:only-child { + border-radius: 6px; +} + +colorswatch#add-color-button overlay { + background-color: rgba(255, 255, 255, 0.04); +} + +colorswatch#add-color-button overlay:hover { + background-color: rgba(255, 255, 255, 0.12); + box-shadow: none; +} + +colorswatch#add-color-button overlay:active { + background-color: rgba(255, 255, 255, 0.3); +} + +colorswatch:disabled { + opacity: 0.5; +} + +colorswatch:disabled overlay { + box-shadow: none; +} + +colorswatch#editor-color-sample { + border-radius: 6px; +} + +colorswatch#editor-color-sample overlay { + border-radius: 6px; +} + +colorswatch#editor-color-sample overlay:hover { + box-shadow: 0 2px 3px -2px rgba(0, 0, 0, 0.3), 0 1px 2px -1px rgba(0, 0, 0, 0.24), 0 1px 2px -1px rgba(0, 0, 0, 0.17); +} + +colorchooser .popover.osd { + transition: box-shadow 200ms ease-out; + border-radius: 6px; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15), 0 3px 3px 0 rgba(0, 0, 0, 0.18), 0 3px 6px 0 rgba(0, 0, 0, 0.12), inset 0 1px rgba(255, 255, 255, 0.1); + background-color: #363a4f; +} + +colorchooser .popover.osd:backdrop { + box-shadow: 0 4px 3px -3px rgba(0, 0, 0, 0.2), 0 2px 2px -1px rgba(0, 0, 0, 0.24), 0 1px 3px 0 rgba(0, 0, 0, 0.12), inset 0 1px rgba(255, 255, 255, 0.1); +} + +/******** + * Misc * + ********/ +.content-view { + background-color: #24273a; +} + +/********************** + * Window Decorations * + **********************/ +window { + border: none; +} + +window.csd { + border-radius: 12px; + outline-offset: -1px; + outline: 1px solid rgba(255, 255, 255, 0.1); + margin: 0; + transition: none; + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 15px 16px 2px rgba(0, 0, 0, 0.14), 0 6px 18px 5px rgba(0, 0, 0, 0.12), 0 0 36px transparent, 0 0 0 1px rgba(0, 0, 0, 0.75); +} + +window.csd:backdrop { + transition: box-shadow 200ms ease-out; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15), 0 3px 3px 0 rgba(0, 0, 0, 0.18), 0 3px 6px 0 rgba(0, 0, 0, 0.12), 0 0 36px transparent, 0 0 0 1px rgba(0, 0, 0, 0.75); +} + +window.csd.maximized, window.csd.fullscreen, window.csd.tiled, window.csd.tiled-top, window.csd.tiled-right, window.csd.tiled-bottom, window.csd.tiled-left { + border-radius: 0; + transition: none; +} + +window.csd.maximized, window.csd.fullscreen { + box-shadow: none; + outline: none; +} + +window.solid-csd { + margin: 0; + padding: 2px; + border-radius: 0; + background-color: #181926; + border: 1px solid #3e4152; +} + +window.solid-csd:backdrop { + background-color: #24273a; +} + +window.ssd { + box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.12); +} + +windowcontrols > button:not(.suggested-action):not(.destructive-action) { + min-height: 16px; + min-width: 16px; + padding: 10px 0; + margin-left: 4px; + margin-right: 4px; +} + +windowcontrols > button.minimize:not(.suggested-action):not(.destructive-action), windowcontrols > button.maximize:not(.suggested-action):not(.destructive-action), windowcontrols > button.close:not(.suggested-action):not(.destructive-action) { + color: transparent; + background: none; +} + +windowcontrols > button.minimize:hover:not(.suggested-action):not(.destructive-action), windowcontrols > button.minimize:active:not(.suggested-action):not(.destructive-action), windowcontrols > button.maximize:hover:not(.suggested-action):not(.destructive-action), windowcontrols > button.maximize:active:not(.suggested-action):not(.destructive-action), windowcontrols > button.close:hover:not(.suggested-action):not(.destructive-action), windowcontrols > button.close:active:not(.suggested-action):not(.destructive-action) { + box-shadow: none; +} + +windowcontrols > button.minimize:active:not(.suggested-action):not(.destructive-action) > image, windowcontrols > button.maximize:active:not(.suggested-action):not(.destructive-action) > image, windowcontrols > button.close:active:not(.suggested-action):not(.destructive-action) > image { + box-shadow: inset 0 0 0 9999px rgba(0, 0, 0, 0.25); +} + +windowcontrols > button.minimize:hover:not(.suggested-action):not(.destructive-action), windowcontrols > button.minimize:active:not(.suggested-action):not(.destructive-action), windowcontrols > button.maximize:hover:not(.suggested-action):not(.destructive-action), windowcontrols > button.maximize:active:not(.suggested-action):not(.destructive-action), windowcontrols > button.close:hover:not(.suggested-action):not(.destructive-action), windowcontrols > button.close:active:not(.suggested-action):not(.destructive-action) { + color: rgba(0, 0, 0, 0.5); +} + +windowcontrols > button.minimize:backdrop:not(.suggested-action):not(.destructive-action) > image, windowcontrols > button.maximize:backdrop:not(.suggested-action):not(.destructive-action) > image, windowcontrols > button.close:backdrop:not(.suggested-action):not(.destructive-action) > image { + background-color: rgba(255, 255, 255, 0.3); +} + +windowcontrols > button.minimize:backdrop:hover:not(.suggested-action):not(.destructive-action), windowcontrols > button.minimize:backdrop:active:not(.suggested-action):not(.destructive-action), windowcontrols > button.maximize:backdrop:hover:not(.suggested-action):not(.destructive-action), windowcontrols > button.maximize:backdrop:active:not(.suggested-action):not(.destructive-action), windowcontrols > button.close:backdrop:hover:not(.suggested-action):not(.destructive-action), windowcontrols > button.close:backdrop:active:not(.suggested-action):not(.destructive-action) { + color: rgba(255, 255, 255, 0.5); +} + +windowcontrols > button.minimize:not(.suggested-action):not(.destructive-action) > image { + background-color: #eed49f; +} + +windowcontrols > button.minimize:active:not(.suggested-action):not(.destructive-action) > image { + background-color: #f2dfb7; +} + +windowcontrols > button.maximize:not(.suggested-action):not(.destructive-action) > image { + background-color: #a6da95; +} + +windowcontrols > button.maximize:active:not(.suggested-action):not(.destructive-action) > image { + background-color: #bce3b0; +} + +windowcontrols > button.close:not(.suggested-action):not(.destructive-action) > image { + background-color: #ed8796; +} + +windowcontrols > button.close:active:not(.suggested-action):not(.destructive-action) > image { + background-color: #f2a5b0; +} + +windowcontrols { + border-spacing: 6px; +} + +windowcontrols:not(.empty).start:dir(ltr), windowcontrols:not(.empty).end:dir(rtl) { + margin-right: 6px; + margin-left: 6px; +} + +windowcontrols:not(.empty).start:dir(rtl), windowcontrols:not(.empty).end:dir(ltr) { + margin-left: 6px; + margin-right: 6px; +} + +windowcontrols > button:not(.suggested-action):not(.destructive-action) > image { + border-radius: 100%; + padding: 0; +} + +.view:selected, iconview:selected, gridview > child:selected, columnview.view:selected, +treeview.view:selected, calendar:selected, calendar > grid > label.day-number:selected { + background-color: alpha(currentColor, 0.06); +} + +flowbox > flowboxchild:selected, calendar > grid > label.today { + color: #b7bdf8; + background-color: rgba(183, 189, 248, 0.2); +} + +textview text selection:focus, textview text selection, label > selection, +entry > text > selection, spinbutton > text > selection, +entry headerbar popover.background entry > text > selection, +headerbar popover.background entry entry > text > selection, calendar > grid > label.today:selected { + color: rgba(0, 0, 0, 0.87); + background-color: #b7bdf8; +} + +/********************** + * Touch Copy & Paste * + **********************/ +cursor-handle { + color: #b7bdf8; + -gtk-icon-source: -gtk-recolor(url("assets/scalable/cursor-handle-symbolic.svg")); +} + +cursor-handle.insertion-cursor:dir(ltr), cursor-handle.insertion-cursor:dir(rtl) { + padding-top: 6px; +} + +shortcuts-section { + margin: 20px; +} + +.shortcuts-search-results { + margin: 20px; + border-spacing: 24px; +} + +shortcut { + border-spacing: 6px; +} + +shortcut > .keycap { + min-width: 12px; + min-height: 26px; + margin-top: 2px; + padding-bottom: 2px; + padding-left: 8px; + padding-right: 8px; + border: solid 1px rgba(255, 255, 255, 0.12); + border-radius: 7px; + box-shadow: inset 0 -2px rgba(255, 255, 255, 0.12); + background-color: #363a4f; + color: #FFFFFF; + font-size: smaller; +} + +:not(decoration):not(window):drop(active) { + caret-color: #b7bdf8; +} + +stackswitcher { + min-height: 0; + padding: 3px; + border-radius: 9px; + background-color: rgba(255, 255, 255, 0.04); + border: none; +} + +stackswitcher.linked:not(.vertical) > button:not(.suggested-action):not(.destructive-action) { + margin: 0 0; + background-color: transparent; + border-radius: 6px; + padding: 3px 10px; +} + +stackswitcher.linked:not(.vertical) > button:not(.suggested-action):not(.destructive-action).text-button { + min-width: 100px; +} + +stackswitcher.linked:not(.vertical) > button:not(.suggested-action):not(.destructive-action):focus:not(:hover):not(:checked) { + box-shadow: none; +} + +stackswitcher.linked:not(.vertical) > button:not(.suggested-action):not(.destructive-action):hover { + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; +} + +stackswitcher.linked:not(.vertical) > button:not(.suggested-action):not(.destructive-action):active { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms, border 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.08) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; +} + +stackswitcher.linked:not(.vertical) > button:not(.suggested-action):not(.destructive-action):checked { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), border-image 225ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms, background-color 0ms; + background-color: rgba(255, 255, 255, 0.15); + color: #FFFFFF; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +stackswitcher button.text-button { + min-width: 100px; +} + +stackswitcher button.circular, +stackswitcher button.text-button.circular { + min-width: 36px; + min-height: 36px; + padding: 0; +} + +/************* + * App Icons * + *************/ +.lowres-icon { + -gtk-icon-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.icon-dropshadow { + -gtk-icon-shadow: 0 1px 12px rgba(0, 0, 0, 0.05), 0 1px 6px rgba(0, 0, 0, 0.1); +} + +/********* + * Emoji * + *********/ +popover.emoji-picker { + padding: 0; +} + +popover.emoji-picker > contents { + padding: 0; +} + +.emoji-searchbar { + padding: 6px; + border-spacing: 6px; + border-bottom: 1px solid rgba(255, 255, 255, 0.12); + background: none; +} + +.emoji-searchbar entry text { + background: none; + box-shadow: none; +} + +.emoji-toolbar { + padding: 0; + border-spacing: 3px; + border-top: 1px solid rgba(255, 255, 255, 0.12); + background: none; +} + +button.emoji-section { + margin: 0; + padding: 6px; + border-radius: 6px; +} + +button.emoji-section:checked { + color: #b7bdf8; +} + +popover.emoji-picker emoji { + font-size: x-large; + padding: 6px; + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); + border-radius: 6px; +} + +popover.emoji-picker emoji:focus, popover.emoji-picker emoji:hover { + background: alpha(currentColor, 0.08); +} + +emoji-completion-row { + min-height: 28px; + padding: 0 12px; +} + +emoji-completion-row > box { + border-spacing: 6px; + padding: 2px 6px; +} + +emoji-completion-row:focus, emoji-completion-row:hover, +emoji-completion-row emoji:hover, emoji-completion-row emoji:focus { + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; +} + +popover.entry-completion > contents { + padding: 0; +} + +.nautilus-window placesview label { + color: rgba(255, 255, 255, 0.7); +} + +.nautilus-window .floating-bar { + min-height: 32px; + padding: 0; + margin: 6px; + border-style: none; + border-radius: 6px; + background-color: #b7bdf8; + color: rgba(0, 0, 0, 0.87); + box-shadow: 0 3px 3px -2px rgba(0, 0, 0, 0.05), 0 2px 3px -1px rgba(0, 0, 0, 0.06), 0 1px 4px 0 rgba(0, 0, 0, 0.05); +} + +.nautilus-window .floating-bar button { + margin: 4px; + color: rgba(0, 0, 0, 0.87); +} + +#NautilusQueryEditor > menubutton > button.image-button { + min-width: 24px; + min-height: 24px; +} + +#NautilusQueryEditor > text, #NautilusQueryEditor > box, #NautilusQueryEditor > menubutton > button.image-button { + margin: 6px 0; +} + +#NautilusQueryEditorTag { + background-color: rgba(255, 255, 255, 0.12); +} + +#NautilusQueryEditorTag > button.image-button { + margin: 0; + padding: 0; +} + +#NautilusPathBar { + background-color: rgba(255, 255, 255, 0.04); + border-radius: 6px; + margin: 6px 0; +} + +.content-pane #NautilusPathBar { + background-color: rgba(255, 255, 255, 0.04); +} + +#NautilusPathButton { + margin: 0 3px; + border-radius: 6px; +} + +#NautilusPathButton.current-dir { + color: #FFFFFF; +} + +#NautilusPathButton.current-dir:hover, #NautilusPathButton.current-dir:active { + background: none; + box-shadow: none; +} + +.content-pane #NautilusPathButton.current-dir { + color: #FFFFFF; +} + +#NautilusPathButton:first-child { + margin-left: 0; +} + +#NautilusViewCell clamp box { + margin: 0; + border-spacing: 0; +} + +window.dialog > box > stack > box > box > notebook.frame { + border-width: 0 0 0 1px; + border-radius: 0; +} + +.display-container.card { + border-radius: 0; + box-shadow: none; + border-width: 0 0 1px 0; +} + +.display-container .history-view { + background-color: #24273a; +} + +.display-container #displayitem { + padding: 0 12px 8px 0; + font-size: 1.4em; + border-top: 1px solid rgba(255, 255, 255, 0.12); +} + +.math-buttons button { + font-size: 1.1em; + padding: 2px 6px; +} + +.math-buttons button.text-button { + padding-left: 16px; + padding-right: 16px; +} + +leaflet button.number-button { + background-color: rgba(255, 255, 255, 0.1); +} + +leaflet button.number-button:hover { + background-color: rgba(255, 255, 255, 0.2); +} + +leaflet button.number-button:active { + background-color: rgba(255, 255, 255, 0.3); +} + +label.primary-label, label.month-name, label.secondary-label { + font-size: 16pt; + font-weight: bold; + padding: 12px; +} + +label.primary-label, label.month-name { + color: #b7bdf8; +} + +label.secondary-label { + color: rgba(255, 255, 255, 0.5); +} + +calendar-view { + font-size: 10pt; +} + +calendar-view:selected { + color: #b7bdf8; + font-weight: bold; +} + +calendar-view.header, +label.header { + font-size: 10pt; + font-weight: bold; + color: rgba(255, 255, 255, 0.5); +} + +calendar-view.current, +weekgrid.current { + background-color: alpha(#b7bdf8, 0.3); +} + +popover.events { + background-color: #24273a; + padding: 0; +} + +popover.events box { + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +popover.events list { + background-color: #24273a; + border-radius: 6px; +} + +popover.events scrolledwindow { + border-width: 0; +} + +popover.events button { + border-radius: 6px; + border-top-left-radius: 0; + border-top-right-radius: 0; + border-style: solid none none; + box-shadow: none; +} + +event { + margin: 1px; + font-size: 0.9rem; +} + +event widget.content { + margin: 4px; +} + +event.timed, event:not(.slanted):not(.slanted-start):not(.slanted-end) { + border-radius: 6px; +} + +event.timed widget.edge { + border-radius: 3px; + min-width: 5px; +} + +event.slanted-start, event.slanted-end:dir(rtl) { + padding-left: 16px; + border-radius: 0 3px 3px 0; +} + +event.slanted-end, event.slanted-start:dir(rtl) { + padding-right: 16px; + border-radius: 3px 0 0 3px; +} + +event:not(.timed).color-dark { + color: white; + outline-color: rgba(0, 0, 0, 0.3); +} + +event.timed, event:not(.timed).color-light { + color: alpha(black, 0.75); + outline-color: rgba(255, 255, 255, 0.5); +} + +popover.event-popover, +popover.event-popover > contents { + padding: 0; +} + +.search-viewport { + background-color: #24273a; +} + +.calendar-list { + background-color: transparent; +} + +.calendar-list > list { + border-radius: 4px; +} + +.calendar-color-image { + -gtk-icon-filter: none; +} + +image.calendar-color-image, +button:active:not(:backdrop) .calendar-color-image, +button:checked:not(:backdrop) .calendar-color-image, +.calendars-list .calendar-color-image:not(:backdrop):not(:disabled), +.calendar-list .calendar-color-image:not(:backdrop):not(:disabled), +.sources-button:not(:backdrop):not(:disabled) .calendar-color-image { + -gtk-icon-shadow: 0 1px alpha(black, 0.1); +} + +datechooser navigator { + margin-right: 6px; + margin-left: 6px; + margin-bottom: 6px; +} + +datechooser navigator label { + font-weight: bold; +} + +datechooser navigator button.flat, +datechooser navigator button.toggle, +datechooser navigator button.image-button { + min-height: 36px; + min-width: 36px; + padding: 0; +} + +datechooser .weeknum, datechooser .weekday { + color: rgba(255, 255, 255, 0.5); + font-size: smaller; +} + +datechooser button.day { + font-size: 10pt; + font-weight: normal; + margin: 3px; + padding: 0; + min-height: 36px; + min-width: 36px; + transition: none; +} + +datechooser button.day dot { + background-color: #FFFFFF; + border-radius: 50%; + min-height: 3px; + min-width: 3px; +} + +datechooser button.day:selected, datechooser button.day.today:selected { + background-color: #b7bdf8; + color: rgba(0, 0, 0, 0.87); + font-weight: bold; +} + +datechooser button.day:selected dot, datechooser button.day.today:selected dot { + background-color: rgba(0, 0, 0, 0.87); +} + +datechooser button.day.today { + color: #b7bdf8; +} + +datechooser button.day.today dot { + background-color: #b7bdf8; +} + +datechooser button.day.other-month:not(:hover), datechooser button.day.other-month:backdrop { + color: alpha(currentColor, 0.1); +} + +datechooser button.day.other-month:not(:hover) dot, datechooser button.day.other-month:backdrop dot { + background-color: alpha(currentColor, 0.1); +} + +datechooser button.day.other-month:hover:not(:backdrop) { + color: rgba(255, 255, 255, 0.5); +} + +datechooser button.day.other-month:hover:not(:backdrop) dot { + background-color: rgba(255, 255, 255, 0.5); +} + +.week-header { + padding: 0; +} + +.week-header > box:first-child { + border-bottom: 1px solid rgba(255, 255, 255, 0.12); +} + +.week-header .week-number { + font-size: 16pt; + font-weight: bold; + padding: 12px 12px 18px 12px; + color: rgba(255, 255, 255, 0.3); +} + +.week-header.week-temperature { + font-size: 10pt; + font-weight: bold; + color: rgba(255, 255, 255, 0.5); +} + +.week-header.lines { + color: rgba(255, 255, 255, 0.12); +} + +weekhourbar > label { + font-size: 10pt; + padding: 4px 6px; +} + +.week-view .lines { + color: rgba(255, 255, 255, 0.12); +} + +weekgrid > widget.now-strip { + background-color: alpha(#b7bdf8, 0.8); + margin: 0 0 0 1px; + min-height: 3px; +} + +weekgrid:selected, weekgrid.dnd, +.week-header:selected, +.week-header.dnd { + background-color: alpha(#b7bdf8, 0.25); +} + +monthcell { + border: solid 1px rgba(255, 255, 255, 0.12); + border-width: 1px 0 0 1px; + background-color: transparent; + transition: background-color 200ms; +} + +monthcell:hover:not(.out-of-month):not(.today) { + background-color: #181926; + transition: background-color 200ms; + color: #FFFFFF; +} + +monthcell:selected { + background-color: alpha(#b7bdf8, 0.1); +} + +monthcell:selected:hover { + background-color: alpha(#b7bdf8, 0.2); +} + +monthcell:selected label.day-label { + font-weight: bold; +} + +monthcell:nth-child(7n + 1) { + border-left-width: 0; +} + +monthcell.today { + background-color: alpha(#b7bdf8, 0.2); +} + +monthcell.today:hover { + background-color: alpha(#b7bdf8, 0.3); + color: #b7bdf8; +} + +monthcell.today:selected { + background-color: alpha(#b7bdf8, 0.25); +} + +monthcell.today:selected:hover { + background-color: alpha(#b7bdf8, 0.35); +} + +monthcell label { + color: #FFFFFF; + font-size: 0.9rem; +} + +monthcell label.day-label { + font-size: 1rem; +} + +monthcell.out-of-month { + background-color: rgba(255, 255, 255, 0.04); +} + +monthcell.out-of-month label { + color: rgba(255, 255, 255, 0.7); +} + +monthcell button { + padding: 0 6px; + border-radius: 0; + border-bottom: none; + border-right: none; +} + +monthpopover > box { + margin: 0; + padding: 0; + background-color: transparent; +} + +.notes-section box > textview { + border-radius: 6px; + padding: 6px; +} + +.notes-section box > textview > text { + background: none; +} + +agenda-view list > row { + padding: 2px 12px; +} + +agenda-view list > label { + padding: 6px 12px; +} + +agenda-view > scrolledwindow > viewport > list.background { + background-color: transparent; +} + +label.no-events { + font-style: italic; +} + +searchbutton > popover > arrow { + background: none; + border: none; +} + +datechooser { + padding: 6px; +} + +datechooser .current-week { + background: alpha(#181926, 0.7); + color: #FFFFFF; + border-radius: 6px; +} + +menubutton.sources-button { + margin-top: 0; + margin-bottom: 0; + border-radius: 0; + border-top-style: none; + border-bottom-style: none; +} + +menubutton.sources-button:hover:not(:backdrop) { + background-image: none; + text-shadow: none; +} + +menubutton.sources-button > button { + border-radius: 0; +} + +menubutton.sources-button > button .title { + font-size: 10pt; + font-weight: normal; + padding: 0 6px; +} + +menubutton.sources-button > button .subtitle { + font-size: 8pt; + padding: 0 6px; +} + +menubutton.sources-button > button .calendar-color-image { + -gtk-icon-size: 12px; +} + +menubutton stack > box { + border-spacing: 6px; +} + +.topbar headerbar menubutton.sources-button > button { + border-radius: 0 0 6px 6px; +} + +.contacts-contact-list list.navigation-sidebar { + background: none; +} + +.details-page { + margin: 24px 0px; +} + +.installed-overlay-box { + font-size: smaller; + background-color: #b7bdf8; + border-radius: 0; + color: rgba(0, 0, 0, 0.87); + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.2); +} + +screenshot-carousel box.frame { + border-width: 1px 0; + border-radius: 0; +} + +screenshot-carousel button, +.featured-carousel button { + margin: 12px; +} + +.screenshot-image-main .image1, +.screenshot-image-main .image2 { + margin-top: 6px; + margin-bottom: 12px; + margin-left: 6px; + margin-right: 6px; +} + +.app-tile-label { + font-size: 105%; +} + +.review-textbox { + padding: 6px; +} + +.origin-rounded-box { + background-color: rgba(255, 255, 255, 0.12); + border-radius: 9999px; + padding: 4px; +} + +.origin-beta { + color: #FBC02D; +} + +.origin-button > button { + padding: 3px 9px; +} + +.card flowboxchild.card { + border: none; + box-shadow: none; + padding: 0; + background: none; +} + +.category-tile.card { + padding: 21px; + border: none; + border-radius: 6px; + min-width: 140px; + font-weight: 900; + font-size: larger; + box-shadow: 0 3px 3px -2px rgba(0, 0, 0, 0.05), 0 2px 3px -1px rgba(0, 0, 0, 0.06), 0 1px 4px 0 rgba(0, 0, 0, 0.05); +} + +.category-tile.card.category-tile-iconless { + padding: 9px 15px; + min-width: 130px; + font-size: 105%; + font-weight: normal; + box-shadow: none; + background-color: rgba(255, 255, 255, 0.04); +} + +.category-tile.card.category-create { + background: linear-gradient(180deg, #ce8cd7 0%, #2861c6 100%); + color: white; +} + +.category-tile.card.category-create:hover { + background: linear-gradient(180deg, shade(#ce8cd7, 1.07) 0%, shade(#2861c6, 1.1) 100%); + color: white; +} + +.category-tile.card.category-create:active { + background: linear-gradient(180deg, shade(#ce8cd7, 0.95) 0%, shade(#2861c6, 0.95) 100%); + color: white; +} + +.category-tile.card.category-develop { + background: #5e5c64; + color: white; +} + +.category-tile.card.category-develop:hover { + background: shade(#5e5c64, 1.2); + color: white; +} + +.category-tile.card.category-develop:active { + background-color: shade(#5e5c64, 0.95); + color: white; +} + +.category-tile.card.category-learn { + background: linear-gradient(180deg, #2ec27e 30%, #27a66c 100%); + color: white; +} + +.category-tile.card.category-learn:hover { + background: linear-gradient(180deg, shade(#2ec27e, 1.06) 30%, shade(#27a66c, 1.06) 100%); + color: white; +} + +.category-tile.card.category-learn:active { + background: linear-gradient(180deg, shade(#2ec27e, 0.95) 30%, shade(#27a66c, 0.95) 100%); + color: white; +} + +.category-tile.card.category-play { + background: linear-gradient(75deg, #f9e2a7 0%, #eb5ec3 50%, #6d53e0 100%); + color: #393484; +} + +.category-tile.card.category-play:hover { + background: linear-gradient(75deg, shade(#f9e2a7, 1.07) 0%, shade(#eb5ec3, 1.07) 50%, shade(#6d53e0, 1.07) 100%); + color: #393484; +} + +.category-tile.card.category-play:active { + background: linear-gradient(75deg, shade(#f9e2a7, 0.97) 0%, shade(#eb5ec3, 0.95) 50%, shade(#6d53e0, 1.07) 100%); + color: #393484; +} + +.category-tile.card.category-socialize { + background: linear-gradient(90deg, #ef4e9b 0%, #f77466 100%); + color: rgba(255, 255, 255, 0.7); +} + +.category-tile.card.category-socialize:hover { + background: linear-gradient(90deg, shade(#ef4e9b, 1.08) 0%, shade(#f77466, 1.08) 100%); +} + +.category-tile.card.category-socialize:active { + background: linear-gradient(90deg, shade(#ef4e9b, 0.95) 0%, shade(#f77466, 0.95) 100%); +} + +.category-tile.card.category-work { + padding: 1px; + /* FIXME: work around https://gitlab.gnome.org/GNOME/gtk/-/issues/4324 */ + color: #1c71d8; + background-color: #fdf8d7; + background-image: linear-gradient(rgba(255, 255, 255, 0.12) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 255, 255, 0.12) 1px, transparent 1px); + background-size: 10px 10px, 10px 10px; + background-position: -1px -4px, center -1px; +} + +.category-tile.card.category-work:hover { + color: #1c71d8; + background-color: #fefcef; + background-image: linear-gradient(rgba(255, 255, 255, 0.12) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 255, 255, 0.12) 1px, transparent 1px); +} + +.category-tile.card.category-work:active { + color: #1c71d8; + background-color: #fcf4bf; + background-image: linear-gradient(rgba(255, 255, 255, 0.12) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 255, 255, 0.12) 1px, transparent 1px); +} + +clamp.medium .category-tile:not(.category-tile-iconless), +clamp.large .category-tile:not(.category-tile-iconless) { + font-size: larger; +} + +.featured-tile { + padding: 0; + box-shadow: none; + color: #FFFFFF; +} + +.featured-tile label.title-1 { + margin-top: 6px; + margin-bottom: 6px; +} + +.featured-tile.narrow label.title-1 { + font-size: 16pt; +} + +.application-details-infobar, .application-details-infobar.info { + background-color: rgba(255, 255, 255, 0.04); + color: #FFFFFF; + border: 1px solid rgba(255, 255, 255, 0.12); +} + +.application-details-infobar.warning { + background-color: #FBC02D; + color: rgba(0, 0, 0, 0.87); + border: 1px solid rgba(0, 0, 0, 0.12); +} + +@keyframes install-progress-unknown-move { + 0% { + background-position: 0%; + } + 50% { + background-position: 100%; + } + 100% { + background-position: 0%; + } +} + +.application-details-description .button { + padding-left: 24px; + padding-right: 24px; +} + +.install-progress { + background-image: linear-gradient(to top, #b7bdf8 2px, alpha(#b7bdf8, 0) 2px); + background-repeat: no-repeat; + background-position: 0 bottom; + background-size: 0; + transition: none; +} + +.install-progress:dir(rtl) { + background-position: 100% bottom; +} + +.review-row > * { + margin: 12px; +} + +.review-row button { + font-size: smaller; +} + +.review-row .vote-buttons button { + margin-right: -1px; +} + +.review-row .vote-buttons button:not(:first-child) { + border-image: linear-gradient(to top, rgba(255, 255, 255, 0.12), rgba(255, 255, 255, 0.12)) 0 0 0 1/5px 0 5px 1px; +} + +.review-row .vote-buttons button:hover, +.review-row .vote-buttons button:active, +.review-row .vote-buttons button:hover + button, +.review-row .vote-buttons button:active + button { + border-image: none; +} + +review-bar { + color: rgba(255, 255, 255, 0.5); + background-image: none; + background-color: rgba(255, 255, 255, 0.3); +} + +.review-histogram star-image { + color: rgba(255, 255, 255, 0.5); +} + +.version-arrow-label { + font-size: x-small; +} + +.overview-more-button { + font-size: smaller; + padding: 0 16px; +} + +.app-row-origin-text { + font-size: smaller; +} + +.app-listbox-header { + padding: 6px; + border-bottom: 1px solid rgba(255, 255, 255, 0.12); +} + +.image-list { + background-color: transparent; +} + +box.star { + background-color: transparent; + background-image: none; +} + +button.star { + outline-offset: 0; + background-color: transparent; + background-image: none; + border-image: none; + border-radius: 0; + border-width: 0; + padding: 0; + box-shadow: none; + outline-offset: -1px; +} + +star-image { + color: #FFD600; +} + +.dimmer-label { + opacity: 0.25; +} + +.update-failed-details { + font-family: Monospace; + font-size: smaller; + padding: 16px; +} + +.upgrade-banner { + padding: 0px; + border-radius: 6px; + border: none; +} + +.upgrade-banner-background { + background: linear-gradient(to bottom, #66BB6A, #b7bdf8); + color: white; +} + +.upgrade-buttons #button_upgrades_install { + padding-left: 16px; + padding-right: 16px; +} + +scrolledwindow.list-page > viewport > clamp > box { + margin: 24px 12px; + border-spacing: 24px; +} + +.update-preferences preferencesgroup > box > box { + margin-top: 18px; +} + +.section > label:not(:first-child) { + margin-top: 6px; +} + +.section > box:not(:first-child) { + margin-top: 12px; +} + +clamp.status-page { + margin: 36px 12px; +} + +clamp.status-page .iconbox { + min-height: 128px; + min-width: 128px; +} + +clamp.status-page .icon { + color: rgba(255, 255, 255, 0.5); + min-height: 32px; + min-width: 32px; +} + +clamp.status-page .icon:not(:last-child) { + margin-bottom: 36px; +} + +clamp.status-page .title:not(:last-child) { + margin-bottom: 12px; +} + +app-context-bar .context-tile { + border: 1px solid rgba(255, 255, 255, 0.12); + background-color: transparent; + border-radius: 0; + padding: 24px 12px 21px 12px; + outline-offset: 5px; + transition-property: outline, outline-offset, background-image; + border-bottom: none; + border-right: none; +} + +app-context-bar .context-tile:hover { + background-image: none; + background-color: alpha(currentColor, 0.08); +} + +app-context-bar .context-tile.keyboard-activating, app-context-bar .context-tile:active { + background-color: alpha(currentColor, 0.12); +} + +app-context-bar .context-tile:focus:focus-visible { + outline-offset: -1px; +} + +app-context-bar.horizontal box:first-child .context-tile:first-child, app-context-bar.vertical .context-tile:first-child { + border-left: none; +} + +app-context-bar.horizontal .context-tile, app-context-bar.vertical box:first-child .context-tile { + border-top: none; +} + +app-context-bar > box:not(:first-child) > button.flat { + border-radius: 0; +} + +app-context-bar > box:not(:first-child) > button.flat:last-child { + border-radius: 0 6px 6px 0; +} + +app-context-bar > box:first-child > button.flat { + border-radius: 0; +} + +app-context-bar > box:first-child > button.flat:first-child { + border-radius: 6px 0 0 6px; +} + +app-context-bar > box > button.flat { + border-left-color: rgba(255, 255, 255, 0.12); +} + +carousel.card { + border: none; + background-color: rgba(255, 255, 255, 0.04); +} + +.context-tile-lozenge { + min-height: 28px; + min-width: 28px; + padding: 6px; + font-size: 18px; + font-weight: bold; + border-radius: 9999px; +} + +.context-tile-lozenge.large { + font-size: 24px; + padding: 16px; + min-width: 24px; + /* 60px minus the left and right padding */ + min-height: 24px; + /* 60px minus the top and bottom padding */ +} + +.context-tile-lozenge.wide-image image { + margin-top: -28px; + margin-bottom: -28px; +} + +.context-tile-lozenge image { + -gtk-icon-style: symbolic; +} + +.context-tile-lozenge.grey { + color: #FFFFFF; + background-color: rgba(255, 255, 255, 0.12); +} + +.context-tile-lozenge.green, .context-tile-lozenge.details-rating-0 { + color: #419345; + background-color: rgba(102, 187, 106, 0.15); +} + +.context-tile-lozenge.blue, .context-tile-lozenge.details-rating-5 { + color: #b7bdf8; + background-color: rgba(183, 189, 248, 0.15); +} + +.context-tile-lozenge.yellow, .context-tile-lozenge.details-rating-12 { + color: #d79b04; + background-color: rgba(251, 192, 45, 0.15); +} + +.context-tile-lozenge.details-rating-15 { + color: #FF8A65; + background-color: rgba(255, 138, 101, 0.15); +} + +.context-tile-lozenge.red, .context-tile-lozenge.details-rating-18 { + color: #d2190b; + background-color: rgba(244, 67, 54, 0.15); +} + +.eol-red { + font-weight: bold; + color: #F44336; +} + +window.narrow .app-title { + font-size: 16pt; +} + +window.narrow .app-developer { + font-size: small; +} + +.install-progress-label { + font-size: smaller; + font-feature-settings: "tnum"; +} + +scrolledwindow.fake-adw-status-page > viewport > box { + margin: 36px 12px; +} + +scrolledwindow.fake-adw-status-page > viewport > box > clamp:not(:last-child) > box { + margin-bottom: 36px; +} + +scrolledwindow.fake-adw-status-page > viewport > box > clamp > box > .icon:not(:last-child) { + margin-bottom: 36px; +} + +scrolledwindow.fake-adw-status-page > viewport > box > clamp > box > .title:not(:last-child) { + margin-bottom: 12px; +} + +statuspage.icon-dropshadow image.icon { + -gtk-icon-shadow: 0 1px 12px rgba(0, 0, 0, 0.05), 0 -1px rgba(0, 0, 0, 0.05), 1px 0 rgba(0, 0, 0, 0.1), 0 1px rgba(0, 0, 0, 0.3), -1px 0 rgba(0, 0, 0, 0.1); +} + +window.info scrollbar.vertical { + margin-top: 48px; + background: none; + box-shadow: none; +} + +window.info scrollbar.vertical trough { + margin-top: 0; +} + +row.app > box.header { + margin-left: 12px; + margin-right: 12px; +} + +row.app > box.header { + border-spacing: 12px; +} + +row.app > box.header > image { + margin-top: 12px; + margin-bottom: 12px; +} + +row.app label.warning { + color: #F44336; +} + +@keyframes pre-delay { + from { + opacity: 0; + } + to { + opacity: 0; + } +} + +@keyframes fade-in { + from { + filter: opacity(0%); + } +} + +/* Give a fade-in animation to spinners. */ +spinner.fade-in:checked { + animation: pre-delay 0.5s linear 1, fade-in 1s linear 1, spin 1s linear infinite; + animation-delay: 0s, 0.5s, 0.5s; +} + +window > contents > leaflet > box > stack.background { + background-color: transparent; + background-image: linear-gradient(to bottom, transparent, transparent 48px, #24273a 48px, #24273a); +} + +@define-color weather_temp_chart_fill_color rgba(251, 192, 45, 0.5); +@define-color weather_temp_chart_stroke_color #f0ad05; +@define-color weather_thermometer_warm_color #FBC02D; +@define-color weather_thermometer_cold_color #b7bdf8; +#places-label { + font-weight: bold; +} + +#temperature-label { + font-size: 32pt; + font-weight: 900; + margin-left: 9px; +} + +#conditions-grid *:backdrop { + color: rgba(255, 255, 255, 0.7); +} + +.content-view.cell { + font-weight: bold; +} + +#locationEntry { + margin: 6px; +} + +.weather-popover { + margin-top: 6px; +} + +.forecast-card { + transition: border-radius 100ms ease-out; + border-radius: 6px; +} + +.forecast-card separator { + background-color: rgba(255, 255, 255, 0.12); +} + +#daily-forecast-box > separator:last-child { + background-color: transparent; + min-width: 0; +} + +#conditions-grid, +#attributionGrid { + margin-left: 18px; + margin-right: 18px; +} + +#weather-page .small .forecast-card { + margin-left: 0; + margin-right: 0; + border-radius: 0; + border-width: 1px 0; +} + +.forecast-temperature-label { + font-weight: bold; + color: #ae7b03; +} + +WeatherThermometer { + margin-bottom: 12px; +} + +WeatherThermometer > label.high { + font-weight: bold; + color: #FBC02D; +} + +WeatherThermometer > label.low { + font-weight: bold; + color: #b7bdf8; +} + +.forecast-button { + margin: 0 12px; +} + +.forecast-graphic { + margin: 18px; +} + +button.osd.circular { + border-radius: 9999px; + min-width: 24px; + min-height: 24px; +} + +button.osd.circular > image { + padding: 0; +} + +scrolledwindow.inline list, +scrolledwindow.inline listview { + background: none; + color: inherit; +} + +scrolledwindow.inline undershoot.top { + box-shadow: inset 0 1px rgba(255, 255, 255, 0.12); +} + +.search-view { + background-color: #7287fd; + color: #FFFFFF; +} + +.search-view menubutton button:focus:focus-visible { + outline-color: rgba(255, 255, 255, 0.3); +} + +image.circular { + min-width: 36px; + min-height: 36px; + padding: 0; + border-radius: 9999px; +} + +.large-button { + padding: 6px; +} + +.alarm-time { + font-size: 2.5em; + font-weight: 300; +} + +.clocks-ampm-toggle-button, +.clocks-secondary-standalone-label { + font-size: 18pt; +} + +.clocks-standalone-label, +.clocks-ringing-label { + font-size: 6em; + font-weight: 300; +} + +.clocks-ringing-title { + font-size: 1.5em; + font-weight: bold; +} + +.clocks-alarm-setup-time { + font-size: 32pt; +} + +.clocks-timer-label, +.clocks-spinbutton { + font-size: 48pt; +} + +.timer-panel .timer-header { + font-size: 20pt; + font-weight: 300; +} + +.timer-countdown { + font-size: 40pt; + font-weight: 300; +} + +/* Stopwatch Panel */ +.lap-time { + font-weight: bold; +} + +.stopped-stopwatch label, +.running-stopwatch label, +.paused-stopwatch label { + font-size: 70px; + font-weight: lighter; +} + +.stopped-stopwatch .seconds-label { + font-weight: 300; +} + +.running-stopwatch .seconds-label, +.running-stopwatch .miliseconds-label { + color: #b7bdf8; +} + +.stopped-stopwatch .miliseconds-label, +.running-stopwatch .miliseconds-label, +.paused-stopwatch .miliseconds-label { + font-size: 50px; +} + +.running-stopwatch .seconds-label, +.paused-stopwatch .seconds-label { + font-weight: 300; +} + +.clock-location { + font-weight: bolder; +} + +.hidden { + opacity: 0; +} + +.clock-time { + font-size: 2em; + padding: 0.2em 0.5em; + border-radius: 1em; +} + +.none .clock-time { + background: alpha(currentColor, 0.2); +} + +.night .clock-time { + color: #7287fd; + background-color: alpha(#b7bdf8, 0.25); +} + +.naut .clock-time, +.astro .clock-time { + color: #FF7043; + background-color: alpha(#FF8A65, 0.25); +} + +.civil .clock-time, +.day .clock-time { + color: #FFD600; + background: alpha(#FBC02D, 0.25); +} + +headerbar splitbutton notification button { + margin: 0; + min-height: 24px; + min-width: 24px; + padding: 0; +} + +popover.background.global-search > arrow, popover.background.global-search > contents { + padding: 0; +} + +panelframeswitcher { + padding: 6px; + min-height: 36px; +} + +.frameheader.header { + background-color: #181926; +} + +.frameheader.header:backdrop { + background-color: #24273a; +} + +.frameheader.header > button { + border: none; + margin: 0; + padding: 3px; +} + +.frameheader.header tabbar.inline > revealer > box { + min-height: 24px; +} + +.frameheader.header tabbar.inline > revealer > box .start-action { + padding: 0; + border: none; +} + +.frameheader.header tabbar.inline > revealer > box .end-action { + padding: 0; + border-left: 1px solid rgba(255, 255, 255, 0.12); +} + +.frameheader.header tabbar.inline > revealer > box .end-action button { + margin: 6px; +} + +.frameheader.header tabbar.inline > revealer > box tabbox { + border: none; + background: none; +} + +panelstatusbar > menubutton > button, +panelstatusbar > paneltogglebutton button { + border-radius: 0; +} + +.style-variant { + padding: 0 12px; +} + +.style-variant button.toggle { + padding: 0; +} + +.style-variant button.toggle, .style-variant button.toggle:hover, .style-variant button.toggle:focus, .style-variant button.toggle:active, .style-variant button.toggle:checked { + background: none; + outline: none; + border: none; + box-shadow: none; +} + +.style-variant button.toggle > stylevariantpreview > .wallpaper { + border-radius: 6px; + outline-color: transparent; + outline-width: 3px; + outline-offset: 3px; + outline-style: solid; + box-shadow: none; +} + +.style-variant button.toggle:hover > stylevariantpreview > .wallpaper { + outline-color: rgba(255, 255, 255, 0.04); +} + +.style-variant button.toggle:active > stylevariantpreview > .wallpaper { + outline-color: rgba(255, 255, 255, 0.3); +} + +.style-variant button.toggle:checked > stylevariantpreview > .wallpaper { + outline-color: #b7bdf8; +} + +playlistview scrollbar.overlay-indicator.dragging, playlistview scrollbar.overlay-indicator.hovering { + background-color: transparent; +} + +playlistview queuerow picture.cover, +playlistview queuerow image.card { + border: none; +} + +.exit-info { + padding: 6px; + border-top: 2px solid #b7bdf8; + background: rgba(183, 189, 248, 0.9); + color: rgba(0, 0, 0, 0.87); +} + +.error .exit-info { + border-top: 2px solid #F44336; + background: rgba(244, 67, 54, 0.9); + color: #FFFFFF; +} + +window.dialog > .dialog-vbox > box > scrolledwindow > viewport > widget > list.boxed-list { + border: none; + border-radius: 0; +} + +window.dialog > .dialog-vbox > box > scrolledwindow > viewport > widget > list.boxed-list > row:first-child, window.dialog > .dialog-vbox > box > scrolledwindow > viewport > widget > list.boxed-list > row:last-child { + border-radius: 0; +} + +avatar { + border-radius: 9999px; + font-weight: bold; +} + +avatar.color1 { + background-image: linear-gradient(#83b6ec, #337fdc); + color: #cfe1f5; +} + +avatar.color2 { + background-image: linear-gradient(#7ad9f1, #0f9ac8); + color: #caeaf2; +} + +avatar.color3 { + background-image: linear-gradient(#8de6b1, #29ae74); + color: #cef8d8; +} + +avatar.color4 { + background-image: linear-gradient(#b5e98a, #6ab85b); + color: #e6f9d7; +} + +avatar.color5 { + background-image: linear-gradient(#f8e359, #d29d09); + color: #f9f4e1; +} + +avatar.color6 { + background-image: linear-gradient(#ffcb62, #d68400); + color: #ffead1; +} + +avatar.color7 { + background-image: linear-gradient(#ffa95a, #ed5b00); + color: #ffe5c5; +} + +avatar.color8 { + background-image: linear-gradient(#f78773, #e62d42); + color: #f8d2ce; +} + +avatar.color9 { + background-image: linear-gradient(#e973ab, #e33b6a); + color: #fac7de; +} + +avatar.color10 { + background-image: linear-gradient(#cb78d4, #9945b5); + color: #e7c2e8; +} + +avatar.color11 { + background-image: linear-gradient(#9e91e8, #7a59ca); + color: #d5d2f5; +} + +avatar.color12 { + background-image: linear-gradient(#e3cf9c, #b08952); + color: #f2eade; +} + +avatar.color13 { + background-image: linear-gradient(#be916d, #785336); + color: #e5d6ca; +} + +avatar.color14 { + background-image: linear-gradient(#c0bfbc, #6e6d71); + color: #d8d7d3; +} + +avatar.contrasted { + color: white; +} + +avatar.image { + background: none; +} + +.card { + border-radius: 6px; + border: 1px solid rgba(255, 255, 255, 0.12); + background-clip: border-box; + color: rgba(255, 255, 255, 0.7); + box-shadow: none; + outline: none; + background-color: #24273a; + color: #FFFFFF; +} + +.card.activatable { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); +} + +.card.activatable:hover { + background-image: none; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; +} + +.card.activatable:active { + background-image: none; + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), background-size 0ms, background-image 0ms, border 0ms; + animation: ripple 225ms cubic-bezier(0, 0, 0.2, 1) forwards; + background-image: radial-gradient(circle, alpha(currentColor, 0.08) 10%, transparent 0%); + background-size: 0% 0%; + background-color: alpha(currentColor, 0.08); + color: #FFFFFF; + outline: 0 solid transparent; +} + +toast { + margin: 12px; + margin-bottom: 24px; + border-radius: 9999px; + border-spacing: 6px; + padding: 6px; + box-shadow: 0 2px 3px -1px rgba(0, 0, 0, 0.1), 0 4px 6px 0 rgba(0, 0, 0, 0.12), 0 1px 10px 0 rgba(0, 0, 0, 0.1), inset 0 1px rgba(255, 255, 255, 0.1); + background-color: #24273a; + color: #FFFFFF; + border: none; +} + +toast:dir(ltr) { + padding-left: 12px; +} + +toast:dir(rtl) { + padding-right: 12px; +} + +toast > label { + margin: 0 6px; +} + +viewswitcher { + margin: 0; + border-spacing: 3px; +} + +viewswitcher.wide { + margin-top: 6px; + margin-bottom: 6px; +} + +viewswitcher.wide button.toggle { + margin: 0; +} + +viewswitcher.narrow button.toggle { + border-radius: 0; + margin: 0; +} + +viewswitcher.narrow button.toggle:focus-within, viewswitcher.narrow button.toggle:focus { + box-shadow: none; +} + +viewswitcher button.toggle { + font-weight: bold; + padding: 0; +} + +viewswitcher button.toggle > stack > box.narrow { + font-size: 0.75rem; + padding-top: 6px; + padding-bottom: 4px; + border-spacing: 4px; +} + +viewswitcher button.toggle > stack > box.narrow > stack > label { + padding-left: 6px; + padding-right: 6px; +} + +viewswitcher button.toggle > stack > box.wide { + padding: 2px 12px; + border-spacing: 6px; +} + +viewswitcherbar actionbar > revealer > box { + padding: 0; +} + +viewswitchertitle { + margin-top: 0; + margin-bottom: 0; +} + +viewswitchertitle viewswitcher { + margin-left: 12px; + margin-right: 12px; +} + +viewswitchertitle viewswitcher.narrow { + margin-top: 0; + margin-bottom: 0; +} + +viewswitchertitle viewswitcher.narrow button.toggle > stack > box.narrow { + padding-top: 0; + padding-bottom: 0; + border-spacing: 0; +} + +viewswitchertitle viewswitcher.wide { + margin-top: 6px; + margin-bottom: 6px; +} + +viewswitchertitle windowtitle { + margin-top: 0; + margin-bottom: 0; +} + +.top-bar headerbar viewswitchertitle viewswitcher.narrow button.toggle { + border-radius: 0 0 6px 6px; +} + +indicatorbin > indicator, indicatorbin > mask { + min-width: 6px; + min-height: 6px; + border-radius: 9999px; +} + +indicatorbin > indicator { + margin: 1px; + background-color: alpha(currentColor, 0.4); +} + +indicatorbin > indicator > label { + font-size: 0.6rem; + font-weight: bold; + padding: 1px 4px; + color: white; +} + +indicatorbin > mask { + padding: 1px; + background: black; +} + +indicatorbin.needs-attention > indicator { + background-color: #b7bdf8; +} + +indicatorbin.needs-attention > indicator > label { + color: rgba(0, 0, 0, 0.87); +} + +preferencespage > scrolledwindow > viewport > clamp > box { + margin: 24px 12px; + border-spacing: 24px; +} + +preferencesgroup > box, preferencesgroup > box .labels { + border-spacing: 6px; +} + +preferencesgroup > box > box.header:not(.single-line) { + margin-bottom: 6px; +} + +preferencesgroup > box > box.single-line { + min-height: 34px; +} + +preferencesgroup > box button.background-preview-button.toggle { + padding: 0; + background: none; + box-shadow: none; + outline-color: transparent; + outline-width: 3px; + outline-offset: 3px; + outline-style: solid; +} + +preferencesgroup > box button.background-preview-button.toggle, preferencesgroup > box button.background-preview-button.toggle > background-preview { + border-radius: 6px; +} + +preferencesgroup > box button.background-preview-button.toggle:hover { + outline-color: rgba(255, 255, 255, 0.04); +} + +preferencesgroup > box button.background-preview-button.toggle:active { + outline-color: rgba(255, 255, 255, 0.3); +} + +preferencesgroup > box button.background-preview-button.toggle:checked { + outline-color: #b7bdf8; +} + +preferencesgroup > box .cutout-button { + background-color: #181926; +} + +window.about .main-page > viewport > clamp > box { + margin: 12px; + border-spacing: 6px; +} + +window.about .main-page > viewport > clamp > box > box { + margin-top: 18px; + border-spacing: 18px; + margin-bottom: 6px; +} + +window.about .main-page .app-version { + padding: 3px 18px; + color: #b7bdf8; + border-radius: 6px; + margin-top: 3px; +} + +window.about .subpage > viewport > clamp > box { + margin: 18px 12px; + border-spacing: 18px; +} + +window.about .subpage > clamp > textview { + background: none; + color: inherit; +} + +statuspage > scrolledwindow > viewport > box { + margin: 36px 12px; + border-spacing: 36px; +} + +statuspage > scrolledwindow > viewport > box > clamp > box { + border-spacing: 12px; +} + +statuspage > scrolledwindow > viewport > box > clamp > box > .icon { + -gtk-icon-size: 128px; + color: alpha(currentColor, 0.55); +} + +statuspage > scrolledwindow > viewport > box > clamp > box > .icon:disabled { + opacity: 0.35; +} + +statuspage > scrolledwindow > viewport > box > clamp > box > .icon:not(:last-child) { + margin-bottom: 24px; +} + +statuspage.compact > scrolledwindow > viewport > box { + margin: 24px 12px; + border-spacing: 24px; +} + +statuspage.compact > scrolledwindow > viewport > box > clamp > box > .icon { + -gtk-icon-size: 96px; +} + +statuspage.compact > scrolledwindow > viewport > box > clamp > box > .icon:not(:last-child) { + margin-bottom: 12px; +} + +statuspage.compact > scrolledwindow > viewport > box > clamp > box > .title { + font-size: 18pt; +} + +flap > dimming, +leaflet > dimming, +navigation-view > dimming, +overlay-split-view > dimming { + background: rgba(0, 0, 0, 0.25); +} + +flap > border, +leaflet > border, +navigation-view > border, +overlay-split-view > border { + background: none; +} + +flap > shadow, +leaflet > shadow, +navigation-view > shadow, +overlay-split-view > shadow { + min-width: 56px; + min-height: 56px; +} + +flap > shadow.left, +leaflet > shadow.left, +navigation-view > shadow.left, +overlay-split-view > shadow.left { + background-image: linear-gradient(to right, alpha(rgba(0, 0, 0, 0.25), 0.7), alpha(rgba(0, 0, 0, 0.25), 0.14) 40px, alpha(rgba(0, 0, 0, 0.25), 0) 56px), linear-gradient(to right, alpha(rgba(0, 0, 0, 0.25), 0.4), alpha(rgba(0, 0, 0, 0.25), 0.14) 7px, alpha(rgba(0, 0, 0, 0.25), 0) 24px); +} + +flap > shadow.right, +leaflet > shadow.right, +navigation-view > shadow.right, +overlay-split-view > shadow.right { + background-image: linear-gradient(to left, alpha(rgba(0, 0, 0, 0.25), 0.7), alpha(rgba(0, 0, 0, 0.25), 0.14) 40px, alpha(rgba(0, 0, 0, 0.25), 0) 56px), linear-gradient(to left, alpha(rgba(0, 0, 0, 0.25), 0.4), alpha(rgba(0, 0, 0, 0.25), 0.14) 7px, alpha(rgba(0, 0, 0, 0.25), 0) 24px); +} + +flap > shadow.up, +leaflet > shadow.up, +navigation-view > shadow.up, +overlay-split-view > shadow.up { + background-image: linear-gradient(to bottom, alpha(rgba(0, 0, 0, 0.25), 0.7), alpha(rgba(0, 0, 0, 0.25), 0.14) 40px, alpha(rgba(0, 0, 0, 0.25), 0) 56px), linear-gradient(to bottom, alpha(rgba(0, 0, 0, 0.25), 0.4), alpha(rgba(0, 0, 0, 0.25), 0.14) 7px, alpha(rgba(0, 0, 0, 0.25), 0) 24px); +} + +flap > shadow.down, +leaflet > shadow.down, +navigation-view > shadow.down, +overlay-split-view > shadow.down { + background-image: linear-gradient(to top, alpha(rgba(0, 0, 0, 0.25), 0.7), alpha(rgba(0, 0, 0, 0.25), 0.14) 40px, alpha(rgba(0, 0, 0, 0.25), 0) 56px), linear-gradient(to top, alpha(rgba(0, 0, 0, 0.25), 0.4), alpha(rgba(0, 0, 0, 0.25), 0.14) 7px, alpha(rgba(0, 0, 0, 0.25), 0) 24px); +} + +toolbarview.undershoot-top scrolledwindow > undershoot.top { + box-shadow: none; + background: linear-gradient(to bottom, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +toolbarview.undershoot-bottom scrolledwindow > undershoot.bottom { + box-shadow: none; + background: linear-gradient(to top, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +.unfolded stacksidebar.sidebar { + border: none; +} + +.sidebar-pane { + background-color: #181926; + color: #FFFFFF; +} + +.sidebar-pane:backdrop { + color: rgba(255, 255, 255, 0.5); + background-color: #24273a; + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1); +} + +.sidebar-pane .sidebar-pane { + background-color: transparent; + color: inherit; +} + +.sidebar-pane .toolbar, +.sidebar-pane .sidebar, +.sidebar-pane .navigation-sidebar, +.sidebar-pane searchbar > revealer > box { + background-color: transparent; + box-shadow: none; + border: none; +} + +.sidebar-pane banner > revealer > widget { + background-color: gtkmix(#b7bdf8, #181926, 30%); + color: #FFFFFF; +} + +.sidebar-pane banner > revealer > widget:backdrop { + background-color: gtkmix(#b7bdf8, #181926, 30%); +} + +/* Middle pane in three-pane setups */ +.content-pane .sidebar-pane, +.sidebar-pane .content-pane { + background-color: #24273a; + color: #FFFFFF; +} + +.content-pane .sidebar-pane:backdrop, +.sidebar-pane .content-pane:backdrop { + background-color: #24273a; + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1); +} + +.content-pane .sidebar-pane banner > revealer > widget, +.sidebar-pane .content-pane banner > revealer > widget { + background-color: gtkmix(#b7bdf8, #24273a, 30%); + color: #FFFFFF; +} + +.content-pane .sidebar-pane banner > revealer > widget:backdrop, +.sidebar-pane .content-pane banner > revealer > widget:backdrop { + background-color: gtkmix(#b7bdf8, #24273a, 30%); +} + +.sidebar-pane:dir(ltr), .sidebar-pane:dir(ltr) banner > revealer > widget, .sidebar-pane.end:dir(rtl), .sidebar-pane.end:dir(rtl) banner > revealer > widget, +.content-pane .sidebar-pane:dir(ltr), +.content-pane .sidebar-pane:dir(ltr) banner > revealer > widget, +.content-pane .sidebar-pane.end:dir(rtl), +.content-pane .sidebar-pane.end:dir(rtl) banner > revealer > widget, +.sidebar-pane .content-pane:dir(ltr), +.sidebar-pane .content-pane:dir(ltr) banner > revealer > widget, +.sidebar-pane .content-pane.end:dir(rtl), +.sidebar-pane .content-pane.end:dir(rtl) banner > revealer > widget { + box-shadow: none; + border-right: 1px solid rgba(255, 255, 255, 0.12); +} + +.sidebar-pane:dir(rtl), .sidebar-pane:dir(rtl) banner > revealer > widget, .sidebar-pane.end:dir(ltr), .sidebar-pane.end:dir(ltr) banner > revealer > widget, +.content-pane .sidebar-pane:dir(rtl), +.content-pane .sidebar-pane:dir(rtl) banner > revealer > widget, +.content-pane .sidebar-pane.end:dir(ltr), +.content-pane .sidebar-pane.end:dir(ltr) banner > revealer > widget, +.sidebar-pane .content-pane:dir(rtl), +.sidebar-pane .content-pane:dir(rtl) banner > revealer > widget, +.sidebar-pane .content-pane.end:dir(ltr), +.sidebar-pane .content-pane.end:dir(ltr) banner > revealer > widget { + box-shadow: none; + border-left: 1px solid rgba(255, 255, 255, 0.12); +} + +.sidebar-pane toolbarview.undershoot-top scrolledwindow > undershoot.top, +.content-pane toolbarview.undershoot-top scrolledwindow > undershoot.top, +.content-pane .sidebar-pane toolbarview.undershoot-top scrolledwindow > undershoot.top, +.sidebar-pane .content-pane toolbarview.undershoot-top scrolledwindow > undershoot.top { + box-shadow: inset 0 1px rgba(255, 255, 255, 0.08); + background: linear-gradient(to bottom, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +.sidebar-pane toolbarview.undershoot-bottom scrolledwindow > undershoot.bottom, +.content-pane toolbarview.undershoot-bottom scrolledwindow > undershoot.bottom, +.content-pane .sidebar-pane toolbarview.undershoot-bottom scrolledwindow > undershoot.bottom, +.sidebar-pane .content-pane toolbarview.undershoot-bottom scrolledwindow > undershoot.bottom { + box-shadow: inset 0 -1px rgba(255, 255, 255, 0.08); + background: linear-gradient(to top, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +.sidebar-pane scrolledwindow.undershoot-top > undershoot.top, +.content-pane scrolledwindow.undershoot-top > undershoot.top, +.content-pane .sidebar-pane scrolledwindow.undershoot-top > undershoot.top, +.sidebar-pane .content-pane scrolledwindow.undershoot-top > undershoot.top { + box-shadow: inset 0 1px rgba(255, 255, 255, 0.08); + background: linear-gradient(to bottom, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +.sidebar-pane scrolledwindow.undershoot-bottom > undershoot.bottom, +.content-pane scrolledwindow.undershoot-bottom > undershoot.bottom, +.content-pane .sidebar-pane scrolledwindow.undershoot-bottom > undershoot.bottom, +.sidebar-pane .content-pane scrolledwindow.undershoot-bottom > undershoot.bottom { + box-shadow: inset 0 -1px rgba(255, 255, 255, 0.08); + background: linear-gradient(to top, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +.sidebar-pane scrolledwindow.undershoot-start:dir(ltr) > undershoot.left, +.content-pane scrolledwindow.undershoot-start:dir(ltr) > undershoot.left, +.content-pane .sidebar-pane scrolledwindow.undershoot-start:dir(ltr) > undershoot.left, +.sidebar-pane .content-pane scrolledwindow.undershoot-start:dir(ltr) > undershoot.left { + box-shadow: inset 1px 0 rgba(255, 255, 255, 0.08); + background: linear-gradient(to right, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +.sidebar-pane scrolledwindow.undershoot-start:dir(rtl) > undershoot.right, +.content-pane scrolledwindow.undershoot-start:dir(rtl) > undershoot.right, +.content-pane .sidebar-pane scrolledwindow.undershoot-start:dir(rtl) > undershoot.right, +.sidebar-pane .content-pane scrolledwindow.undershoot-start:dir(rtl) > undershoot.right { + box-shadow: inset -1px 0 rgba(255, 255, 255, 0.08); + background: linear-gradient(to left, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +.sidebar-pane scrolledwindow.undershoot-end:dir(ltr) > undershoot.right, +.content-pane scrolledwindow.undershoot-end:dir(ltr) > undershoot.right, +.content-pane .sidebar-pane scrolledwindow.undershoot-end:dir(ltr) > undershoot.right, +.sidebar-pane .content-pane scrolledwindow.undershoot-end:dir(ltr) > undershoot.right { + box-shadow: inset -1px 0 rgba(255, 255, 255, 0.08); + background: linear-gradient(to left, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +.sidebar-pane scrolledwindow.undershoot-end:dir(rtl) > undershoot.left, +.content-pane scrolledwindow.undershoot-end:dir(rtl) > undershoot.left, +.content-pane .sidebar-pane scrolledwindow.undershoot-end:dir(rtl) > undershoot.left, +.sidebar-pane .content-pane scrolledwindow.undershoot-end:dir(rtl) > undershoot.left { + box-shadow: inset 1px 0 rgba(255, 255, 255, 0.08); + background: linear-gradient(to right, alpha(rgba(0, 0, 0, 0.25), 0.75), transparent 6px); +} + +.sidebar-pane flap > dimming, +.sidebar-pane leaflet > dimming, +.sidebar-pane navigation-view > dimming, +.sidebar-pane overlay-split-view > dimming, +.content-pane flap > dimming, +.content-pane leaflet > dimming, +.content-pane navigation-view > dimming, +.content-pane overlay-split-view > dimming, +.content-pane .sidebar-pane flap > dimming, +.content-pane .sidebar-pane leaflet > dimming, +.content-pane .sidebar-pane navigation-view > dimming, +.content-pane .sidebar-pane overlay-split-view > dimming, +.sidebar-pane .content-pane flap > dimming, +.sidebar-pane .content-pane leaflet > dimming, +.sidebar-pane .content-pane navigation-view > dimming, +.sidebar-pane .content-pane overlay-split-view > dimming { + background: rgba(0, 0, 0, 0.25); +} + +.sidebar-pane flap > border, +.sidebar-pane leaflet > border, +.sidebar-pane navigation-view > border, +.sidebar-pane overlay-split-view > border, +.content-pane flap > border, +.content-pane leaflet > border, +.content-pane navigation-view > border, +.content-pane overlay-split-view > border, +.content-pane .sidebar-pane flap > border, +.content-pane .sidebar-pane leaflet > border, +.content-pane .sidebar-pane navigation-view > border, +.content-pane .sidebar-pane overlay-split-view > border, +.sidebar-pane .content-pane flap > border, +.sidebar-pane .content-pane leaflet > border, +.sidebar-pane .content-pane navigation-view > border, +.sidebar-pane .content-pane overlay-split-view > border { + background: none; +} + +.sidebar-pane flap > shadow, +.sidebar-pane leaflet > shadow, +.sidebar-pane navigation-view > shadow, +.sidebar-pane overlay-split-view > shadow, +.content-pane flap > shadow, +.content-pane leaflet > shadow, +.content-pane navigation-view > shadow, +.content-pane overlay-split-view > shadow, +.content-pane .sidebar-pane flap > shadow, +.content-pane .sidebar-pane leaflet > shadow, +.content-pane .sidebar-pane navigation-view > shadow, +.content-pane .sidebar-pane overlay-split-view > shadow, +.sidebar-pane .content-pane flap > shadow, +.sidebar-pane .content-pane leaflet > shadow, +.sidebar-pane .content-pane navigation-view > shadow, +.sidebar-pane .content-pane overlay-split-view > shadow { + min-width: 56px; + min-height: 56px; +} + +.sidebar-pane flap > shadow.left, +.sidebar-pane leaflet > shadow.left, +.sidebar-pane navigation-view > shadow.left, +.sidebar-pane overlay-split-view > shadow.left, +.content-pane flap > shadow.left, +.content-pane leaflet > shadow.left, +.content-pane navigation-view > shadow.left, +.content-pane overlay-split-view > shadow.left, +.content-pane .sidebar-pane flap > shadow.left, +.content-pane .sidebar-pane leaflet > shadow.left, +.content-pane .sidebar-pane navigation-view > shadow.left, +.content-pane .sidebar-pane overlay-split-view > shadow.left, +.sidebar-pane .content-pane flap > shadow.left, +.sidebar-pane .content-pane leaflet > shadow.left, +.sidebar-pane .content-pane navigation-view > shadow.left, +.sidebar-pane .content-pane overlay-split-view > shadow.left { + background-image: linear-gradient(to right, alpha(rgba(0, 0, 0, 0.25), 0.7), alpha(rgba(0, 0, 0, 0.25), 0.14) 40px, alpha(rgba(0, 0, 0, 0.25), 0) 56px), linear-gradient(to right, alpha(rgba(0, 0, 0, 0.25), 0.4), alpha(rgba(0, 0, 0, 0.25), 0.14) 7px, alpha(rgba(0, 0, 0, 0.25), 0) 24px); +} + +.sidebar-pane flap > shadow.right, +.sidebar-pane leaflet > shadow.right, +.sidebar-pane navigation-view > shadow.right, +.sidebar-pane overlay-split-view > shadow.right, +.content-pane flap > shadow.right, +.content-pane leaflet > shadow.right, +.content-pane navigation-view > shadow.right, +.content-pane overlay-split-view > shadow.right, +.content-pane .sidebar-pane flap > shadow.right, +.content-pane .sidebar-pane leaflet > shadow.right, +.content-pane .sidebar-pane navigation-view > shadow.right, +.content-pane .sidebar-pane overlay-split-view > shadow.right, +.sidebar-pane .content-pane flap > shadow.right, +.sidebar-pane .content-pane leaflet > shadow.right, +.sidebar-pane .content-pane navigation-view > shadow.right, +.sidebar-pane .content-pane overlay-split-view > shadow.right { + background-image: linear-gradient(to left, alpha(rgba(0, 0, 0, 0.25), 0.7), alpha(rgba(0, 0, 0, 0.25), 0.14) 40px, alpha(rgba(0, 0, 0, 0.25), 0) 56px), linear-gradient(to left, alpha(rgba(0, 0, 0, 0.25), 0.4), alpha(rgba(0, 0, 0, 0.25), 0.14) 7px, alpha(rgba(0, 0, 0, 0.25), 0) 24px); +} + +.sidebar-pane flap > shadow.up, +.sidebar-pane leaflet > shadow.up, +.sidebar-pane navigation-view > shadow.up, +.sidebar-pane overlay-split-view > shadow.up, +.content-pane flap > shadow.up, +.content-pane leaflet > shadow.up, +.content-pane navigation-view > shadow.up, +.content-pane overlay-split-view > shadow.up, +.content-pane .sidebar-pane flap > shadow.up, +.content-pane .sidebar-pane leaflet > shadow.up, +.content-pane .sidebar-pane navigation-view > shadow.up, +.content-pane .sidebar-pane overlay-split-view > shadow.up, +.sidebar-pane .content-pane flap > shadow.up, +.sidebar-pane .content-pane leaflet > shadow.up, +.sidebar-pane .content-pane navigation-view > shadow.up, +.sidebar-pane .content-pane overlay-split-view > shadow.up { + background-image: linear-gradient(to bottom, alpha(rgba(0, 0, 0, 0.25), 0.7), alpha(rgba(0, 0, 0, 0.25), 0.14) 40px, alpha(rgba(0, 0, 0, 0.25), 0) 56px), linear-gradient(to bottom, alpha(rgba(0, 0, 0, 0.25), 0.4), alpha(rgba(0, 0, 0, 0.25), 0.14) 7px, alpha(rgba(0, 0, 0, 0.25), 0) 24px); +} + +.sidebar-pane flap > shadow.down, +.sidebar-pane leaflet > shadow.down, +.sidebar-pane navigation-view > shadow.down, +.sidebar-pane overlay-split-view > shadow.down, +.content-pane flap > shadow.down, +.content-pane leaflet > shadow.down, +.content-pane navigation-view > shadow.down, +.content-pane overlay-split-view > shadow.down, +.content-pane .sidebar-pane flap > shadow.down, +.content-pane .sidebar-pane leaflet > shadow.down, +.content-pane .sidebar-pane navigation-view > shadow.down, +.content-pane .sidebar-pane overlay-split-view > shadow.down, +.sidebar-pane .content-pane flap > shadow.down, +.sidebar-pane .content-pane leaflet > shadow.down, +.sidebar-pane .content-pane navigation-view > shadow.down, +.sidebar-pane .content-pane overlay-split-view > shadow.down { + background-image: linear-gradient(to top, alpha(rgba(0, 0, 0, 0.25), 0.7), alpha(rgba(0, 0, 0, 0.25), 0.14) 40px, alpha(rgba(0, 0, 0, 0.25), 0) 56px), linear-gradient(to top, alpha(rgba(0, 0, 0, 0.25), 0.4), alpha(rgba(0, 0, 0, 0.25), 0.14) 7px, alpha(rgba(0, 0, 0, 0.25), 0) 24px); +} + +.sidebar-pane headerbar, .sidebar-pane headerbar:backdrop, .sidebar-pane .top-bar, .sidebar-pane .top-bar:backdrop, +.content-pane headerbar, +.content-pane headerbar:backdrop, +.content-pane .top-bar, +.content-pane .top-bar:backdrop { + background-color: transparent; + box-shadow: none; +} + +.sidebar-pane tabbar .box, .sidebar-pane tabbar .box:backdrop, +.content-pane tabbar .box, +.content-pane tabbar .box:backdrop { + background-color: transparent; + box-shadow: none; +} + +.sidebar-pane tabbar tab, +.content-pane tabbar tab { + color: rgba(255, 255, 255, 0.7); +} + +.sidebar-pane tabbar tab:hover:not(:selected), .sidebar-pane tabbar tab:active, +.content-pane tabbar tab:hover:not(:selected), +.content-pane tabbar tab:active { + color: #FFFFFF; +} + +.sidebar-pane tabbar tab:selected:not(:active), +.content-pane tabbar tab:selected:not(:active) { + background-color: alpha(currentColor, 0.06); + color: #FFFFFF; + box-shadow: none; +} + +.sidebar-pane tabbar tab:disabled, +.content-pane tabbar tab:disabled { + color: rgba(255, 255, 255, 0.32); +} + +.sidebar-pane tabbar button.image-button, +.content-pane tabbar button.image-button { + color: rgba(255, 255, 255, 0.7); +} + +.sidebar-pane tabbar button.image-button:hover, .sidebar-pane tabbar button.image-button:active, +.content-pane tabbar button.image-button:hover, +.content-pane tabbar button.image-button:active { + color: #FFFFFF; +} + +.sidebar-pane tabbar button.image-button:disabled, +.content-pane tabbar button.image-button:disabled { + color: rgba(255, 255, 255, 0.32); +} + +.top-bar { + box-shadow: inset 0 -1px rgba(255, 255, 255, 0.12); + background-color: #181926; +} + +.top-bar:backdrop { + background-color: #24273a; +} + +.top-bar .collapse-spacing { + padding: 0; +} + +themeselector, +panelthemeselector { + margin: 9px; +} + +themeselector checkbutton, +panelthemeselector checkbutton { + padding: 0; + min-height: 44px; + min-width: 44px; + padding: 1px; + background-clip: content-box; + border-radius: 9999px; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.12); +} + +themeselector checkbutton.follow:checked, themeselector checkbutton.light:checked, themeselector checkbutton.dark:checked, +panelthemeselector checkbutton.follow:checked, +panelthemeselector checkbutton.light:checked, +panelthemeselector checkbutton.dark:checked { + box-shadow: inset 0 0 0 2px #b7bdf8; +} + +themeselector checkbutton.follow, +panelthemeselector checkbutton.follow { + background-image: linear-gradient(to bottom right, #ffffff 50%, #202020 50%); +} + +themeselector checkbutton.light, +panelthemeselector checkbutton.light { + background-color: #ffffff; +} + +themeselector checkbutton.dark, +panelthemeselector checkbutton.dark { + background-color: #202020; +} + +themeselector checkbutton.theme-selector radio, +panelthemeselector checkbutton.theme-selector radio { + -gtk-icon-source: none; + border: none; + background: none; + box-shadow: none; + min-height: 20px; + min-width: 20px; + padding: 0; +} + +themeselector checkbutton.theme-selector radio:hover, themeselector checkbutton.theme-selector radio:active, themeselector checkbutton.theme-selector radio:checked, +panelthemeselector checkbutton.theme-selector radio:hover, +panelthemeselector checkbutton.theme-selector radio:active, +panelthemeselector checkbutton.theme-selector radio:checked { + background-color: transparent; +} + +themeselector checkbutton.theme-selector radio:checked, +panelthemeselector checkbutton.theme-selector radio:checked { + -gtk-icon-size: 20px; + -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/scalable/checkbox-checked-symbolic.svg")), -gtk-recolor(url("assets/scalable/checkbox-checked-symbolic@2.svg"))); + color: rgba(0, 0, 0, 0.87); + background-color: #b7bdf8; +} + +themeselector checkbutton.theme-selector radio:checked, themeselector checkbutton.theme-selector radio:checked:hover, themeselector checkbutton.theme-selector radio:checked:active, +panelthemeselector checkbutton.theme-selector radio:checked, +panelthemeselector checkbutton.theme-selector radio:checked:hover, +panelthemeselector checkbutton.theme-selector radio:checked:active { + box-shadow: 0 2px 3px -1px rgba(0, 0, 0, 0.08), 0 1px 2px 0 rgba(0, 0, 0, 0.1); +} + +themeswitcher { + padding: 6px; +} + +themeswitcher .check { + min-height: 20px; + min-width: 20px; + background: none; + padding: 0; + margin: 0; + border-radius: 9999px; + color: rgba(0, 0, 0, 0.87); + background-color: #b7bdf8; +} + +themeswitcher .check, themeswitcher .check:hover, themeswitcher .check:active { + box-shadow: 0 2px 3px -1px rgba(0, 0, 0, 0.08), 0 1px 2px 0 rgba(0, 0, 0, 0.1); +} + +themeswitcher checkbutton { + padding: 0; + min-height: 44px; + min-width: 44px; + padding: 1px; + background-clip: content-box; + border-radius: 9999px; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.12); +} + +themeswitcher checkbutton:checked { + box-shadow: inset 0 0 0 2px #b7bdf8; +} + +themeswitcher checkbutton radio, themeswitcher checkbutton radio:hover, themeswitcher checkbutton radio:active, themeswitcher checkbutton radio:checked, themeswitcher checkbutton radio:checked:hover, themeswitcher checkbutton radio:checked:active { + background-color: transparent; + border: none; + background: none; + box-shadow: none; + color: transparent; + -gtk-icon-source: none; + -gtk-icon-size: 0; +} + +themeswitcher checkbutton.system { + background: linear-gradient(-45deg, #1e1e1e 50%, white 50%); +} + +themeswitcher checkbutton.light { + color: alpha(black, 0.8); + background-color: white; +} + +themeswitcher checkbutton.dark { + color: white; + background-color: #1e1e1e; +} + +/* GTK NAMED COLORS + ---------------- + use responsibly! */ +/* +widget text/foreground color */ +@define-color theme_fg_color #FFFFFF; +/* +text color for entries, views and content in general */ +@define-color theme_text_color #FFFFFF; +/* +widget base background color */ +@define-color theme_bg_color #24273a; +/* +text widgets and the like base background color */ +@define-color theme_base_color #24273a; +/* +base background color of selections */ +@define-color theme_selected_bg_color #b7bdf8; +/* +text/foreground color of selections */ +@define-color theme_selected_fg_color rgba(0, 0, 0, 0.87); +/* +base background color of insensitive widgets */ +@define-color insensitive_bg_color #24273a; +/* +text foreground color of insensitive widgets */ +@define-color insensitive_fg_color rgba(255, 255, 255, 0.5); +/* +insensitive text widgets and the like base background color */ +@define-color insensitive_base_color #181926; +/* +widget text/foreground color on backdrop windows */ +@define-color theme_unfocused_fg_color #FFFFFF; +/* +text color for entries, views and content in general on backdrop windows */ +@define-color theme_unfocused_text_color #FFFFFF; +/* +widget base background color on backdrop windows */ +@define-color theme_unfocused_bg_color #24273a; +/* +text widgets and the like base background color on backdrop windows */ +@define-color theme_unfocused_base_color #24273a; +/* +base background color of selections on backdrop windows */ +@define-color theme_unfocused_selected_bg_color #b7bdf8; +/* +text/foreground color of selections on backdrop windows */ +@define-color theme_unfocused_selected_fg_color rgba(0, 0, 0, 0.87); +/* +insensitive color on backdrop windows */ +@define-color unfocused_insensitive_color rgba(255, 255, 255, 0.5); +/* +widgets main borders color */ +@define-color borders rgba(255, 255, 255, 0.12); +/* +widgets main borders color on backdrop windows */ +@define-color unfocused_borders rgba(255, 255, 255, 0.12); +/* +these are pretty self explicative */ +@define-color warning_color #FBC02D; +@define-color error_color #F44336; +@define-color success_color #66BB6A; +/* +these colors are exported for the window manager and shouldn't be used in applications, +read if you used those and something break with a version upgrade you're on your own... */ +@define-color wm_title #FFFFFF; +@define-color wm_unfocused_title rgba(255, 255, 255, 0.7); +@define-color wm_highlight rgba(255, 255, 255, 0.1); +@define-color wm_border #07080c; +@define-color wm_bg #181926; +@define-color wm_unfocused_bg #24273a; +@define-color wm_button_icon white; +@define-color wm_button_close_hover_bg #ed8796; +@define-color wm_button_close_active_bg #e55267; +@define-color wm_button_max_hover_bg #a6da95; +@define-color wm_button_max_active_bg #80ca68; +@define-color wm_button_min_hover_bg #eed49f; +@define-color wm_button_min_active_bg #e5bd6b; +/* +FIXME this is really an API */ +@define-color content_view_bg #24273a; +@define-color placeholder_text_color #bdbec4; +/* Very contrasty background for text views (@theme_text_color foreground) */ +@define-color text_view_bg #24273a; +@define-color budgie_tasklist_indicator_color rgba(255, 255, 255, 0.3); +@define-color budgie_tasklist_indicator_color_active #b7bdf8; +@define-color budgie_tasklist_indicator_color_active_window #6e7297; +@define-color budgie_tasklist_indicator_color_attention #FBC02D; +@define-color STRAWBERRY_100 #FF9262; +@define-color STRAWBERRY_300 #FF793E; +@define-color STRAWBERRY_500 #F15D22; +@define-color STRAWBERRY_700 #CF3B00; +@define-color STRAWBERRY_900 #AC1800; +@define-color ORANGE_100 #FFDB91; +@define-color ORANGE_300 #FFCA40; +@define-color ORANGE_500 #FAA41A; +@define-color ORANGE_700 #DE8800; +@define-color ORANGE_900 #C26C00; +@define-color BANANA_100 #FFFFA8; +@define-color BANANA_300 #FFFA7D; +@define-color BANANA_500 #FFCE51; +@define-color BANANA_700 #D1A023; +@define-color BANANA_900 #A27100; +@define-color LIME_100 #A2F3BE; +@define-color LIME_300 #8ADBA6; +@define-color LIME_500 #73C48F; +@define-color LIME_700 #479863; +@define-color LIME_900 #1C6D38; +@define-color BLUEBERRY_100 #94A6FF; +@define-color BLUEBERRY_300 #6A7CE0; +@define-color BLUEBERRY_500 #3F51B5; +@define-color BLUEBERRY_700 #213397; +@define-color BLUEBERRY_900 #031579; +@define-color GRAPE_100 #D25DE6; +@define-color GRAPE_300 #B84ACB; +@define-color GRAPE_500 #9C27B0; +@define-color GRAPE_700 #830E97; +@define-color GRAPE_900 #6A007E; +@define-color COCOA_100 #9F9792; +@define-color COCOA_300 #7B736E; +@define-color COCOA_500 #574F4A; +@define-color COCOA_700 #463E39; +@define-color COCOA_900 #342C27; +@define-color SILVER_100 #EEE; +@define-color SILVER_300 #CCC; +@define-color SILVER_500 #AAA; +@define-color SILVER_700 #888; +@define-color SILVER_900 #666; +@define-color SLATE_100 #888; +@define-color SLATE_300 #666; +@define-color SLATE_500 #444; +@define-color SLATE_700 #222; +@define-color SLATE_900 #111; +@define-color BLACK_100 #474341; +@define-color BLACK_300 #403C3A; +@define-color BLACK_500 #393634; +@define-color BLACK_700 #33302F; +@define-color BLACK_900 #2B2928; +@define-color blue_1 #99c1f1; +@define-color blue_2 #62a0ea; +@define-color blue_3 #3584e4; +@define-color blue_4 #1c71d8; +@define-color blue_5 #1a5fb4; +@define-color green_1 #8ff0a4; +@define-color green_2 #57e389; +@define-color green_3 #33d17a; +@define-color green_4 #2ec27e; +@define-color green_5 #26a269; +@define-color yellow_1 #f9f06b; +@define-color yellow_2 #f8e45c; +@define-color yellow_3 #f6d32d; +@define-color yellow_4 #f5c211; +@define-color yellow_5 #e5a50a; +@define-color orange_1 #ffbe6f; +@define-color orange_2 #ffa348; +@define-color orange_3 #ff7800; +@define-color orange_4 #e66100; +@define-color orange_5 #c64600; +@define-color red_1 #f66151; +@define-color red_2 #ed333b; +@define-color red_3 #e01b24; +@define-color red_4 #c01c28; +@define-color red_5 #a51d2d; +@define-color purple_1 #dc8add; +@define-color purple_2 #c061cb; +@define-color purple_3 #9141ac; +@define-color purple_4 #813d9c; +@define-color purple_5 #613583; +@define-color brown_1 #cdab8f; +@define-color brown_2 #b5835a; +@define-color brown_3 #986a44; +@define-color brown_4 #865e3c; +@define-color brown_5 #63452c; +@define-color light_1 #ffffff; +@define-color light_2 #f6f5f4; +@define-color light_3 #deddda; +@define-color light_4 #c0bfbc; +@define-color light_5 #9a9996; +@define-color dark_1 #77767b; +@define-color dark_2 #5e5c64; +@define-color dark_3 #3d3846; +@define-color dark_4 #241f31; +@define-color dark_5 #000000; +/* GTK NAMED COLORS + ---------------- + use responsibly! */ +@define-color accent_bg_color #b7bdf8; +@define-color accent_fg_color rgba(0, 0, 0, 0.87); +@define-color accent_color #b7bdf8; +@define-color destructive_bg_color #F44336; +@define-color destructive_fg_color #FFFFFF; +@define-color destructive_color #F44336; +@define-color success_bg_color #66BB6A; +@define-color success_fg_color #FFFFFF; +@define-color success_color #66BB6A; +@define-color warning_bg_color #FBC02D; +@define-color warning_fg_color rgba(0, 0, 0, 0.87); +@define-color warning_color #FBC02D; +@define-color error_bg_color #F44336; +@define-color error_fg_color #FFFFFF; +@define-color error_color #F44336; +@define-color window_bg_color #24273a; +@define-color window_fg_color #FFFFFF; +@define-color view_bg_color #24273a; +@define-color view_fg_color #FFFFFF; +@define-color headerbar_bg_color #181926; +@define-color headerbar_fg_color #FFFFFF; +@define-color headerbar_border_color rgba(255, 255, 255, 0.12); +@define-color headerbar_backdrop_color #24273a; +@define-color headerbar_shade_color rgba(255, 255, 255, 0.12); +@define-color card_bg_color #24273a; +@define-color card_fg_color #FFFFFF; +@define-color card_shade_color rgba(255, 255, 255, 0.12); +@define-color dialog_bg_color #181926; +@define-color dialog_fg_color #FFFFFF; +@define-color popover_bg_color #24273a; +@define-color popover_fg_color #FFFFFF; +@define-color shade_color rgba(255, 255, 255, 0.12); +@define-color scrollbar_outline_color rgba(255, 255, 255, 0.12); diff --git a/gtk-4.0/thumbnail.png b/gtk-4.0/thumbnail.png new file mode 100644 index 0000000..60d32ee Binary files /dev/null and b/gtk-4.0/thumbnail.png differ diff --git a/hypr/.github/README.md b/hypr/.github/README.md new file mode 100644 index 0000000..f23a3ef --- /dev/null +++ b/hypr/.github/README.md @@ -0,0 +1,22 @@ +
+ +
+ +
+ +
+ +
+ +
+ + + + + +
+ +
+ +> [!NOTE] +> All the information about the Hyprland setup is on the documentation website: https://dotfiles-docs.vercel.app/app-confs/hyprland.html diff --git a/hypr/.github/overview-1.png b/hypr/.github/overview-1.png new file mode 100644 index 0000000..0bf2113 Binary files /dev/null and b/hypr/.github/overview-1.png differ diff --git a/hypr/.github/overview-2.png b/hypr/.github/overview-2.png new file mode 100644 index 0000000..5ee1e43 Binary files /dev/null and b/hypr/.github/overview-2.png differ diff --git a/hypr/.github/overview-3.png b/hypr/.github/overview-3.png new file mode 100644 index 0000000..4dec3b1 Binary files /dev/null and b/hypr/.github/overview-3.png differ diff --git a/hypr/.github/title.png b/hypr/.github/title.png new file mode 100644 index 0000000..099c3d0 Binary files /dev/null and b/hypr/.github/title.png differ diff --git a/hypr/configs/binds.conf b/hypr/configs/binds.conf new file mode 100644 index 0000000..7122c16 --- /dev/null +++ b/hypr/configs/binds.conf @@ -0,0 +1,246 @@ +source = ~/.config/hypr/configs/default_apps.conf + +# Variables +$mainMod = SUPER +$altMod = ALT +$altrMod = SUPER MOD5 +$scripts = ~/.config/hypr/scripts +$launcher-scripts = ~/.config/rofi/scripts + +# Applications +bind = $mainMod, S, exec, $scripts/launch_app $browser +bind = $mainMod, V, exec, $scripts/launch_app $ide +bind = $mainMod, O, exec, $scripts/launch_app $office-suite +bind = $mainMod, E, exec, $scripts/launch_app $file-manager +bind = $mainMod, C, exec, $scripts/launch_app $terminal +bind = $mainMod SHIFT, C, exec, $scripts/launch_app $terminal docker exec -it ros2 zsh +bind = $altMod, C, exec, $scripts/launch_app $terminal ssh Hetzner +bind = $altMod SHIFT, C, exec, $scripts/launch_app $terminal ssh Zima00 +bind = $mainMod, T, exec, $scripts/launch_app Telegram +bind = $mainMod, M, exec, $scripts/launch_app thunderbird + +## Notifications Menu +bind = $mainMod, N, exec, $notifications-menu-toggle +bind = $mainMod SHIFT, R, exec, $notifications-menu-reload +bind = $mainMod SHIFT, N, exec, $notifications-menu-read + +## Bar +bind = $mainMod SHIFT, R, exec, $bar-reload +bind = $mainMod SHIFT, T, exec, $bar-toggle + +# Pickers/Launchers +bind = $mainMod, R, exec, $launcher +bind = $mainMod SHIFT, P, exec, $launcher-scripts/wallpaper/wallpaper +bind = $altMod, P, exec, $launcher-scripts/wireguard/wireguard_selection menu +bind = $mainMod, ESCAPE, exec, $launcher-scripts/powermenu/powermenu +bind = $mainMod, Y, exec, $launcher-scripts/clipboard/clipboard + +## Screenshots +bind = CTRL, ESCAPE, exec, $launcher-scripts/screenshot/screenshot +bind = SHIFT, ESCAPE, exec, $launcher-scripts/screenshot/screenshot --freeze + +# Pyprland +## Scratchpad Module +bind = $mainMod, B, exec, pypr toggle btop +#bind = $mainMod, ENTER, exec, pypr toggle kitty + +## Other Modules +bind = $mainMod, P, exec, pypr wall next + +# Windows +## Basic Operations +bind = $mainMod, Q, killactive, +bind = $altMod, Q, killactive, +bind = $mainMod, W, exec, $scripts/toggle_floating +#bind = $mainMod, P, pseudo +bind = $mainMod, F, fullscreen, 0 + +## Mouse +bindm = $mainMod, mouse:272, movewindow +bindm = $mainMod, mouse:273, resizewindow + +## Focusing +bind = $mainMod, LEFT, movefocus, l +bind = $mainMod, RIGHT, movefocus, r +bind = $mainMod, UP, movefocus, u +bind = $mainMod, DOWN, movefocus, d + +## Moving +bind = $altMod, LEFT, movewindow, l +bind = $altMod, RIGHT, movewindow, r +bind = $altMod, UP, movewindow, u +bind = $altMod, DOWN, movewindow, d + +## Center and Split +#bind = $mainMod, S, togglesplit +#bind = $mainMod, D, exec, hyprctl dispatch centerwindow 1 + +## Group Control +bind = $mainMod, G, togglegroup +bind = $mainMod CTRL, G, lockactivegroup, toggle +bind = ALT, TAB, changegroupactive + +## Resizing Windows +bind = $mainMod, 23, submap, resize # TAB +submap = resize + +binde = , RIGHT, resizeactive, 40 0 +binde = , LEFT, resizeactive, -40 0 +binde = , UP, resizeactive, 0 -40 +binde = , DOWN, resizeactive, 0 40 + +bind = , ESCAPE, submap, reset + +submap = reset + +# Workspaces +## Focusing other Workspaces +bind = $mainMod, 1, workspace, 1 +bind = $mainMod, 2, workspace, 2 +bind = $mainMod, 3, workspace, 3 +bind = $mainMod, 4, workspace, 4 +bind = $mainMod, 5, workspace, 5 +bind = $mainMod, 6, workspace, 6 +bind = $mainMod, 7, workspace, 7 +bind = $mainMod, 8, workspace, 8 +bind = $mainMod, 9, workspace, 9 +bind = $mainMod, 0, workspace, 10 +bind = $altMod, 1, workspace, 11 +bind = $altMod, 2, workspace, 12 +bind = $altMod, 3, workspace, 13 +bind = $altMod, 4, workspace, 14 +bind = $altMod, 5, workspace, 15 +bind = $altMod, 6, workspace, 16 +bind = $altMod, 7, workspace, 17 +bind = $altMod, 8, workspace, 18 +bind = $altMod, 9, workspace, 19 +bind = $altMod, 0, workspace, 20 +bind = $altrMod, 1, workspace, 21 +bind = $altrMod, 2, workspace, 22 +bind = $altrMod, 3, workspace, 23 +bind = $altrMod, 4, workspace, 24 +bind = $altrMod, 5, workspace, 25 +bind = $altrMod, 6, workspace, 26 +bind = $altrMod, 7, workspace, 27 +bind = $altrMod, 8, workspace, 28 +bind = $altrMod, 9, workspace, 29 +bind = $altrMod, 0, workspace, 30 + +## Moving Windows to other Workspaces +bind = $mainMod SHIFT, 1, movetoworkspace, 1 +bind = $mainMod SHIFT, 2, movetoworkspace, 2 +bind = $mainMod SHIFT, 3, movetoworkspace, 3 +bind = $mainMod SHIFT, 4, movetoworkspace, 4 +bind = $mainMod SHIFT, 5, movetoworkspace, 5 +bind = $mainMod SHIFT, 6, movetoworkspace, 6 +bind = $mainMod SHIFT, 7, movetoworkspace, 7 +bind = $mainMod SHIFT, 8, movetoworkspace, 8 +bind = $mainMod SHIFT, 9, movetoworkspace, 9 +bind = $mainMod SHIFT, 0, movetoworkspace, 10 +bind = $altMod SHIFT, 1, movetoworkspace, 11 +bind = $altMod SHIFT, 2, movetoworkspace, 12 +bind = $altMod SHIFT, 3, movetoworkspace, 13 +bind = $altMod SHIFT, 4, movetoworkspace, 14 +bind = $altMod SHIFT, 5, movetoworkspace, 15 +bind = $altMod SHIFT, 6, movetoworkspace, 16 +bind = $altMod SHIFT, 7, movetoworkspace, 17 +bind = $altMod SHIFT, 8, movetoworkspace, 18 +bind = $altMod SHIFT, 9, movetoworkspace, 19 +bind = $altMod SHIFT, 0, movetoworkspace, 20 +bind = $altrMod SHIFT, 1, movetoworkspace, 21 +bind = $altrMod SHIFT, 2, movetoworkspace, 22 +bind = $altrMod SHIFT, 3, movetoworkspace, 23 +bind = $altrMod SHIFT, 4, movetoworkspace, 24 +bind = $altrMod SHIFT, 5, movetoworkspace, 25 +bind = $altrMod SHIFT, 6, movetoworkspace, 26 +bind = $altrMod SHIFT, 7, movetoworkspace, 27 +bind = $altrMod SHIFT, 8, movetoworkspace, 28 +bind = $altrMod SHIFT, 9, movetoworkspace, 29 +bind = $altrMod SHIFT, 0, movetoworkspace, 30 + +## Moving Windows to other Workspaces (Silent) +bind = $mainMod CTRL, 1, movetoworkspacesilent, 1 +bind = $mainMod CTRL, 2, movetoworkspacesilent, 2 +bind = $mainMod CTRL, 3, movetoworkspacesilent, 3 +bind = $mainMod CTRL, 4, movetoworkspacesilent, 4 +bind = $mainMod CTRL, 5, movetoworkspacesilent, 5 +bind = $mainMod CTRL, 6, movetoworkspacesilent, 6 +bind = $mainMod CTRL, 7, movetoworkspacesilent, 7 +bind = $mainMod CTRL, 8, movetoworkspacesilent, 8 +bind = $mainMod CTRL, 9, movetoworkspacesilent, 9 +bind = $mainMod CTRL, 0, movetoworkspacesilent, 10 +bind = $altMod CTRL, 1, movetoworkspacesilent, 11 +bind = $altMod CTRL, 2, movetoworkspacesilent, 12 +bind = $altMod CTRL, 3, movetoworkspacesilent, 13 +bind = $altMod CTRL, 4, movetoworkspacesilent, 14 +bind = $altMod CTRL, 5, movetoworkspacesilent, 15 +bind = $altMod CTRL, 6, movetoworkspacesilent, 16 +bind = $altMod CTRL, 7, movetoworkspacesilent, 17 +bind = $altMod CTRL, 8, movetoworkspacesilent, 18 +bind = $altMod CTRL, 9, movetoworkspacesilent, 19 +bind = $altMod CTRL, 0, movetoworkspacesilent, 20 +bind = $altrMod CTRL, 1, movetoworkspacesilent, 21 +bind = $altrMod CTRL, 2, movetoworkspacesilent, 22 +bind = $altrMod CTRL, 3, movetoworkspacesilent, 23 +bind = $altrMod CTRL, 4, movetoworkspacesilent, 24 +bind = $altrMod CTRL, 5, movetoworkspacesilent, 25 +bind = $altrMod CTRL, 6, movetoworkspacesilent, 26 +bind = $altrMod CTRL, 7, movetoworkspacesilent, 27 +bind = $altrMod CTRL, 8, movetoworkspacesilent, 28 +bind = $altrMod CTRL, 9, movetoworkspacesilent, 29 +bind = $altrMod CTRL, 0, movetoworkspacesilent, 30 + +## Moving to other Workspace with Mouse Control +bind = $mainMod, mouse_down, workspace, m-1 +bind = $mainMod, mouse_up, workspace, m+1 + +# Media +bindl = $mainMod CTRL, mouse:280, exec, swayosd-client --output-volume mute-toggle # Extra Up Button +bindl = , XF86AudioMute, exec, swayosd-client --output-volume mute-toggle +bindl = $mainMod CTRL, mouse:281, exec, swayosd-client --input-volume mute-toggle # Extra Down Button +bindl = , XF86AudioMicMute, exec, exec swayosd-client --input-volume mute-toggle + +bindl = , XF86AudioPlay, exec, playerctl play-pause +bindl = , XF86AudioPause, exec, playerctl play-pause +bindl = $mainMod CTRL, mouse:282, exec, playerctl play-pause # Extra Center Button +bindl = $mainMod CTRL, RETURN, exec, playerctl play-pause +bindl = , XF86AudioPrev, exec, playerctl previous +bindl = $mainMod CTRL, mouse:275, exec, playerctl previous # Extra Back Button +bindl = $mainMod CTRL, 20, exec, playerctl previous # Minus Key +bindl = , XF86AudioNext, exec, playerctl next +bindl = $mainMod CTRL, mouse:276, exec, playerctl next # Extra Forward Button +bindl = $mainMod CTRL, 21, exec, playerctl next # Plus Key + +bindle = , XF86AudioRaiseVolume, exec, swayosd-client --output-volume +10 +bindle = $mainMod ALT, 21, exec, swayosd-client --output-volume raise # Minus key +bindle = , XF86AudioLowerVolume, exec, swayosd-client --output-volume -10 +bindle = $mainMod ALT, 20, exec, swayosd-client --output-volume lower # Plus key + +bindle = , XF86InputRaiseVolume, exec, swayosd-client --input-volume raise +bindle = $mainMod SHIFT, 21, exec, swayosd-client --input-volume raise # Minus key +bindle = , XF86InputLowerVolume, exec, swayosd-client --input-volume lower +bindle = $mainMod SHIFT, 20, exec, swayosd-client --input-volume lower # Plus key + +## Brightness +bindle = , XF86MonBrightnessUp, exec, swayosd-client --brightness +10 +bindle = , XF86MonBrightnessDown, exec, swayosd-client --brightness -10 + +# Other +# Color picker +bind = $mainMod, INSERT, exec, $scripts/color_picker + +## Disable anim, blur, etc +bind = $mainMod, F12, exec, $scripts/performance + +## Freeze active window +bind = $mainMod, H, exec, $scripts/hyprfreeze -a + +## Open Wikis +#bind = $mainMod, F1, exec, xdg-open https://wiki.hyprland.org/ + +## Zoom +#bind = $mainMod SHIFT, mouse:276, exec, hyprctl -q keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor | awk '/^float.*/ {print $2 + 0.5}') +#bind = $mainMod SHIFT, mouse:275, exec, hyprctl -q keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor | awk '/^float.*/ {print $2 - 0.5}') + +# lock +bind = $mainMod, L, exec, swaylock diff --git a/hypr/configs/default_apps.conf b/hypr/configs/default_apps.conf new file mode 100644 index 0000000..6c2ba4e --- /dev/null +++ b/hypr/configs/default_apps.conf @@ -0,0 +1,19 @@ +# Define your programs +$launcher = rofi -show drun + +$bar = waybar +$bar-toggle = killall -SIGUSR1 $bar +$bar-reload = killall $bar; $bar + +$notifications-menu = swaync-client +$notifications-menu-read = $notifications-menu -C +$notifications-menu-toggle = $notifications-menu -t +$notifications-menu-reload = $notifications-menu -R && $notifications-menu -rs + +$browser = firefox +$notetaking-app = notesh +$terminal = kitty +$office-suite = libreoffice +$editor = $terminal vim +$ide = code +$file-manager = nemo diff --git a/hypr/configs/env.conf b/hypr/configs/env.conf new file mode 100644 index 0000000..fd0245e --- /dev/null +++ b/hypr/configs/env.conf @@ -0,0 +1,23 @@ +# XDG +envd = XDG_CURRENT_DESKTOP, Hyprland +envd = XDG_SESSION_TYPE, wayland +envd = XDG_SESSION_DESKTOP, Hyprland + +# QT +env = QT_QPA_PLATFORM, wayland +env = QT_QPA_PLATFORMTHEME, qt5ct +env = QT_WAYLAND_DISABLE_WINDOWDECORATION, 1 +env = QT_AUTO_SCREEN_SCALE_FACTOR, 1 +env = QT_STYLE_OVERRIDE, kvantum + +# Tearing +env = WLR_DRM_NO_ATOMIC, 0 + +# Themes +env = GTK_THEME, catppuccin-macchiato-lavender-standard+default +env = XCURSOR_THEME, catppuccin-macchiato-dark-cursors +#env = XCURSOR_THEME, Wii-Pointer-P1 +env = XCURSOR_SIZE, 24 +env = HYPRCURSOR_THEME, catppuccin-macchiato-dark-cursors +#env = HYPRCURSOR_THEME, Wii-Pointer-P1 +env = HYPRCURSOR_SIZE, 24 diff --git a/hypr/configs/input.conf b/hypr/configs/input.conf new file mode 100644 index 0000000..dd7db70 --- /dev/null +++ b/hypr/configs/input.conf @@ -0,0 +1,13 @@ +input { + kb_layout = de + kb_options = compose:rctrl, level3:ralt_switch, grp:win_space_toggle + + follow_mouse = 1 + numlock_by_default = true + + touchpad { + natural_scroll = yes + disable_while_typing = true + scroll_factor = 0.5 + } +} diff --git a/hypr/configs/misc.conf b/hypr/configs/misc.conf new file mode 100644 index 0000000..fcc17f3 --- /dev/null +++ b/hypr/configs/misc.conf @@ -0,0 +1,35 @@ +general { + allow_tearing = false +} + +misc { + always_follow_on_dnd = true + disable_hyprland_logo = true + vrr = 0 + animate_manual_resizes = true + animate_mouse_windowdragging = false + enable_swallow = true + font_family = JetBrainsMono Nerd Font + enable_anr_dialog = false +} + +binds { + movefocus_cycles_fullscreen = false +} + +xwayland { + force_zero_scaling = true +} + +dwindle { + pseudotile = yes # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below + preserve_split = yes # You probably want this + pseudotile = true # Enable pseudotiling on dwindle + force_split = 0 + preserve_split = true +} + +gestures { + workspace_swipe = yes + workspace_swipe_fingers = 4 +} diff --git a/hypr/configs/monitors.conf b/hypr/configs/monitors.conf new file mode 100644 index 0000000..b9b12d3 --- /dev/null +++ b/hypr/configs/monitors.conf @@ -0,0 +1,13 @@ +$MONITOR1=eDP-1 +$MONITOR2=DP-1 +$MONITOR3=DP-3 + +# Main Monitor +monitor=$MONITOR1, 3072x1920@120.00, 0x0, 2.0, vrr, 1 + +# Second Monitor +monitor=$MONITOR2, 1920x1080@60.00, -1920x-800, 1.0 #, mirror, $MONITOR3 +# FSIT Arbeitsplatz: -1920x-800 + +# Third Monitor +monitor=$MONITOR3, 1920x1080@60.00, 0x1920, 1.0 #, mirror, $MONITOR2 diff --git a/hypr/configs/plugins.conf b/hypr/configs/plugins.conf new file mode 100644 index 0000000..e5a16e7 --- /dev/null +++ b/hypr/configs/plugins.conf @@ -0,0 +1,25 @@ +# Hyprtrails +# exec-once = hyprpm enable hyprtrails +# source = ~/.config/hypr/plugins/hyprtrails.conf + +# Hyprexpo +# exec-once = hyprpm enable hyprexpo +# source = ~/.config/hypr/plugins/hyprexpo.conf + +# Hyprsplit +# exec-once = hyprpm enable hyprsplit +# source = ~/.config/hypr/plugins/hyprsplit.conf + +# Hyprtasking +# exec-once = hyprpm enable hyprtasking +# source = ~/.config/hypr/plugins/hyprtasking.conf + +# Hyprspace +# exec-once = hyprpm enable hyprspace +# source = ~/.config/hypr/plugins/hyprspace.conf + +# Dynamic-cursors +# exec-once = hyprpm enable dynamic-cursors +# source = ~/.config/hypr/plugins/dynamic-cursors.conf + +exec-once = hyprpm reload -n diff --git a/hypr/configs/workspaces.conf b/hypr/configs/workspaces.conf new file mode 100644 index 0000000..b7fbc88 --- /dev/null +++ b/hypr/configs/workspaces.conf @@ -0,0 +1,36 @@ +# Main Monitor +workspace = 1, monitor:$MONITOR1, default:true +workspace = 2, monitor:$MONITOR1 +workspace = 3, monitor:$MONITOR1 +workspace = 4, monitor:$MONITOR1 +workspace = 5, monitor:$MONITOR1 +workspace = 6, monitor:$MONITOR1 +workspace = 7, monitor:$MONITOR1 +workspace = 8, monitor:$MONITOR1 +workspace = 9, monitor:$MONITOR1 +workspace = 10, monitor:$MONITOR1 #, rounding:false, decorate:false, gapsin:-1, gapsout:0, border:false, decorate:false # Gaming Workspace + +# Second Monitor +workspace = 11, monitor:$MONITOR2, default:true +workspace = 12, monitor:$MONITOR2 +workspace = 13, monitor:$MONITOR2 +workspace = 14, monitor:$MONITOR2 +workspace = 15, monitor:$MONITOR2 +workspace = 16, monitor:$MONITOR2 +workspace = 17, monitor:$MONITOR2 +workspace = 18, monitor:$MONITOR2 +workspace = 19, monitor:$MONITOR2 +workspace = 20, monitor:$MONITOR2 #, rounding:false, decorate:false, gapsin:-1, gapsout:0, border:false, decorate:false # Gaming Workspace + +# Third Monitor +workspace = 21, monitor:$MONITOR3, default:true +workspace = 22, monitor:$MONITOR3 +workspace = 23, monitor:$MONITOR3 +workspace = 24, monitor:$MONITOR3 +workspace = 25, monitor:$MONITOR3 +workspace = 26, monitor:$MONITOR3 +workspace = 27, monitor:$MONITOR3 +workspace = 28, monitor:$MONITOR3 +workspace = 29, monitor:$MONITOR3 +workspace = 30, monitor:$MONITOR3 #, rounding:false, decorate:false, gapsin:-1, gapsout:0, border:false, decorate:false # Gaming Workspace + diff --git a/hypr/hypridle.conf b/hypr/hypridle.conf new file mode 100644 index 0000000..8bf8ff3 --- /dev/null +++ b/hypr/hypridle.conf @@ -0,0 +1,24 @@ +$lock_cmd = pidof hyprlock || hyprlock +$suspend_cmd = systemctl suspend || loginctl suspend + +general { + lock_cmd = $lock_cmd + before_sleep_cmd = $lock_cmd + after_sleep_cmd = hyprctl dispatch dpms on +} + +listener { + timeout = 600 # 10 min + on-timeout = loginctl lock-session +} + +# listener { +# timeout = 900 # 15 min +# on-timeout = hyprctl dispatch dpms off +# on-resume = hyprctl dispatch dpms on +# } + +# listener { +# timeout = 1800 # 30 min +# on-timeout = $suspend_cmd +# } diff --git a/hypr/hyprland.conf b/hypr/hyprland.conf new file mode 100644 index 0000000..9bcc4a8 --- /dev/null +++ b/hypr/hyprland.conf @@ -0,0 +1,13 @@ +# Configs +source = ~/.config/hypr/configs/env.conf +source = ~/.config/hypr/configs/monitors.conf +source = ~/.config/hypr/configs/workspaces.conf +source = ~/.config/hypr/configs/binds.conf +source = ~/.config/hypr/configs/input.conf +source = ~/.config/hypr/configs/misc.conf +source = ~/.config/hypr/configs/plugins.conf +source = ~/.config/hypr/theme/theme.conf + +# Autostart +exec-once = $HOME/.config/hypr/scripts/autostart/services +exec-once = $HOME/.config/hypr/scripts/autostart/apps diff --git a/hypr/hyprlock.conf b/hypr/hyprlock.conf new file mode 100644 index 0000000..35da9a6 --- /dev/null +++ b/hypr/hyprlock.conf @@ -0,0 +1,82 @@ +source = ./theme/colors.conf + +$font = JetBrains Mono Nerd Font 10 + +general { + hide_cursor = true +} + +background { + monitor = + path = $HOME/.config/hypr/theme/walls/flowers.png + color = $lavender + + blur_size = 4 + blur_passes = 3 + noise = 0.0117 + contrast = 1.3000 + brightness = 0.8000 + vibrancy = 0.2100 + vibrancy_darkness = 0.0 +} + +# Password Field +input-field { + monitor = DP-1 + rounding = 20 + shadow_passes = 2 + size = 300, 50 + outline_thickness = 2 + dots_size = 0.2 + dots_spacing = 0.64 + dots_center = true + inner_color = $surface0 + font_color = $subtext0 + check_color = $yellow + fail_color = $red + fail_text = $FAIL ($ATTEMPTS) + fail_transition = 300 + fade_on_empty = true + placeholder_text = Password... + hide_input = false + position = 0, 50 + halign = center + valign = bottom +} + +# Current Time +label { + monitor = DP-1 + shadow_passes = 1 + text = cmd[update:1000] echo " $(date +"%H:%M:%S") " + color = $text + font_size = 64 + font_family = $font + position = 0, -35 + halign = center + valign = center +} + +# Current Song +label { + monitor = DP-1 + text = cmd[update:1000] echo "$(~/.config/hypr/scripts/current_song)" + shadow_passes = 1 + color = $subtext0 + font_size = 17 + font_family = $font + position = 0, -107 + halign = center + valign = center +} + +# User Image +image { + monitor = DP-1 + path = $HOME/.face.icon + shadow_passes = 2 + rounding = -1 # negative values mean circle + position = 0, 100 + halign = center + valign = center +} diff --git a/hypr/plugins/dynamic-cursors.conf b/hypr/plugins/dynamic-cursors.conf new file mode 100644 index 0000000..02dc9c0 --- /dev/null +++ b/hypr/plugins/dynamic-cursors.conf @@ -0,0 +1,25 @@ +# Conf +plugin { + enabled = true + + mode = rotate + threshold = 10 + + rotate { + length = 10 + } + + tilt { + limit = 5000 + function = negative_quadratic + } + + shake = true + + shake { + threshold = 3.0 + factor = 3.5 + effects = rotate + nearest = true + } +} diff --git a/hypr/plugins/hycov.conf b/hypr/plugins/hycov.conf new file mode 100644 index 0000000..fdeb7ab --- /dev/null +++ b/hypr/plugins/hycov.conf @@ -0,0 +1,33 @@ +# Conf +plugin { + hycov { + overview_gappo = 60 + overview_gappi = 24 + hotarea_size = 10 + enable_hotarea = 0 + swipe_fingers = 4 + move_focus_distance = 100 + enable_gesture = 1 + disable_workspace_change = 0 + disable_spawn = 0 + auto_exit = 1 + auto_fullscreen = 0 + only_active_workspace = 0 + only_active_monitor = 1 + enable_alt_release_exit = 0 + alt_toggle_auto_next = 0 + click_in_cursor = 1 + } +} + +# Keybinds +bind = SUPER, ;, hycov:toggleoverview +bind = SUPERALT, BACKSPACE, hycov:toggleoverview, forceall +bind = SUPERALT, LEFT, hycov:movefocus, l +bind = SUPERALT, RIGHT, hycov:movefocus, r +bind = SUPERALT, UP, hycov:movefocus, u +bind = SUPERALT, DOWN, hycov:movefocus, d +bind = SUPERALT, H, hycov:movefocus, l +bind = SUPERALT, L, hycov:movefocus, r +bind = SUPERALT, K, hycov:movefocus, u +bind = SUPERALT, J, hycov:movefocus, d diff --git a/hypr/plugins/hyprbars.conf b/hypr/plugins/hyprbars.conf new file mode 100644 index 0000000..5dbaccb --- /dev/null +++ b/hypr/plugins/hyprbars.conf @@ -0,0 +1,15 @@ +source = ../theme/colors.conf + +# Conf +plugin { + hyprbars { + bar_height = 20 + bar_color = $mantle + bar_text_font = "JetBrainsMono Nerd Font" + bar_part_of_window = true + bar_precedence_over_border = false + + hyprbars-button = rgb(ff4040), 10,  , hyprctl dispatch killactive + hyprbars-button = rgb(eeee11), 10,  , hyprctl dispatch fullscreen 1 + } +} diff --git a/hypr/plugins/hyprexpo.conf b/hypr/plugins/hyprexpo.conf new file mode 100644 index 0000000..c17276e --- /dev/null +++ b/hypr/plugins/hyprexpo.conf @@ -0,0 +1,18 @@ +source = ../theme/colors.conf + +# Conf +plugin { + hyprexpo { + columns = 3 + gap_size = 6 + bg_col = $surface0 + workspace_method = first r~1 + + enable_gesture = true + gesture_distance = 300 + gesture_positive = true + } +} + +# Keybinds +bind = ALT, ESCAPE, hyprexpo:expo, toggle diff --git a/hypr/plugins/hyprspace.conf b/hypr/plugins/hyprspace.conf new file mode 100644 index 0000000..11983fd --- /dev/null +++ b/hypr/plugins/hyprspace.conf @@ -0,0 +1,30 @@ +source = ../theme/colors.conf + +# Conf +plugin { + overview { + # Colors + panelColor = $surface0 + panelBorderColor = $surface0 + workspaceActiveBorder = $lavender + workspaceInactiveBorder = $surface1 + dragAlpha = 1 + + # Layout + onBottom = true + centerAligned = true + hideTopLayers = true + hideOverlayLayers = true + hideRealLayers = true + affectStrut = false + workspaceBorderSize = 3 + + # Behaviors + exitOnClick = false + showNewWorkspace = false + showEmptyWorkspace = true + } +} + +# Keybinds +bind = ALT, BACKSPACE, overview:toggle diff --git a/hypr/plugins/hyprsplit.conf b/hypr/plugins/hyprsplit.conf new file mode 100644 index 0000000..f9a0f32 --- /dev/null +++ b/hypr/plugins/hyprsplit.conf @@ -0,0 +1,39 @@ +# Conf +plugin { + hyprsplit { + num_workspaces = 9 + } +} + +# Keybinds +bind = SUPER, 1, split:workspace, 1 +bind = SUPER, 2, split:workspace, 2 +bind = SUPER, 3, split:workspace, 3 +bind = SUPER, 4, split:workspace, 4 +bind = SUPER, 5, split:workspace, 5 +bind = SUPER, 6, split:workspace, 6 +bind = SUPER, 7, split:workspace, 7 +bind = SUPER, 8, split:workspace, 8 +bind = SUPER, 9, split:workspace, 9 + +# Moving windows to other workspaces +bind = SUPERSHIFT, 1, split:movetoworkspace, 1 +bind = SUPERSHIFT, 2, split:movetoworkspace, 2 +bind = SUPERSHIFT, 3, split:movetoworkspace, 3 +bind = SUPERSHIFT, 4, split:movetoworkspace, 4 +bind = SUPERSHIFT, 5, split:movetoworkspace, 5 +bind = SUPERSHIFT, 6, split:movetoworkspace, 6 +bind = SUPERSHIFT, 7, split:movetoworkspace, 7 +bind = SUPERSHIFT, 8, split:movetoworkspace, 8 +bind = SUPERSHIFT, 9, split:movetoworkspace, 9 + +# Moving windows to other workspaces (silent) +bind = SUPERALT, 1, split:movetoworkspacesilent, 1 +bind = SUPERALT, 2, split:movetoworkspacesilent, 2 +bind = SUPERALT, 3, split:movetoworkspacesilent, 3 +bind = SUPERALT, 4, split:movetoworkspacesilent, 4 +bind = SUPERALT, 5, split:movetoworkspacesilent, 5 +bind = SUPERALT, 6, split:movetoworkspacesilent, 6 +bind = SUPERALT, 7, split:movetoworkspacesilent, 7 +bind = SUPERALT, 8, split:movetoworkspacesilent, 8 +bind = SUPERALT, 9, split:movetoworkspacesilent, 9 diff --git a/hypr/plugins/hyprtasking.conf b/hypr/plugins/hyprtasking.conf new file mode 100644 index 0000000..b728c14 --- /dev/null +++ b/hypr/plugins/hyprtasking.conf @@ -0,0 +1,26 @@ +source = ../theme/colors.conf + +# Conf +plugin { + hyprtasking { + layout = grid + + gap_size = 15 + bg_color = $base + border_size = 3 + exit_behavior = active + + gaps { + rows = 3 + cols = 3 + } + + linear { + height = 300 + scroll_speed = 1.1; + } + } +} + +# Keybinds +bind = ALT, ESCAPE, hyprtasking:toggle, cursor diff --git a/hypr/plugins/hyprtrails.conf b/hypr/plugins/hyprtrails.conf new file mode 100644 index 0000000..8715a2d --- /dev/null +++ b/hypr/plugins/hyprtrails.conf @@ -0,0 +1,8 @@ +source = ../theme/colors.conf + +# Conf +plugin { + hyprtrails { + color = $lavender + } +} diff --git a/hypr/pyprland.toml b/hypr/pyprland.toml new file mode 100644 index 0000000..40ed4d8 --- /dev/null +++ b/hypr/pyprland.toml @@ -0,0 +1,68 @@ +[pyprland] +plugins = ["scratchpads", "magnify", "wallpapers"] + +[scratchpads.volume] +command = "pavucontrol" +unfocus = "hide" +position = "1% 8%" +lazy = true +force_monitor = "DP-1" + +[scratchpads.terminal] +command = "kitty --class scratchpad-large" +lazy = true + +[scratchpads.yazi] +command = "kitty --class scratchpad-large fish -c yazi" +unfocus = "hide" +hysteresis = 0.1 +lazy = true + +[scratchpads.gpt] +command = "kitty --class scratchpad-large tgpt -m" +lazy = true + +[scratchpads.dots] +command = "kitty --class scratchpad-large yadm enter lazygit" +lazy = true + +[scratchpads.btop] +command = "kitty --class scratchpad-large btop" +lazy = true + +[scratchpads.nvtop] +command = "kitty --class scratchpad-large nvtop" +lazy = true + +[scratchpads.topgrade-system] +command = "kitty --class scratchpad-large fish -c 'up'" +lazy = true + +[scratchpads.topgrade-all] +command = "kitty --class scratchpad-large fish -c 'upall'" +lazy = true + +[scratchpads.bluetooth] +command = "overskride" +animation = "fromRight" +margin = 20 +lazy = true + +[scratchpads.wifi] +command = "iwgtk" +animation = "fromRight" +margin = 20 +lazy = true + +[scratchpads.network] +command = "nm-connection-editor" +animation = "fromRight" +margin = 20 +lazy = true + +[wallpapers] +path = "~/.config/hypr/theme/walls/" +interval = 60 # change every hour +command = "swww img --transition-bezier 0.5,1.19,.8,.4 --transition-type wipe --transition-duration 2 --transition-fps 75 \"[file]\" && notify-send 'Wallpaper Changed' -i \"[file]\" --app-name=Wallpaper" +clear_command = "swww clear" +extensions = ["jpg", "png", "gif", "jpeg"] diff --git a/hypr/scripts/autostart/apps b/hypr/scripts/autostart/apps new file mode 100755 index 0000000..ef12543 --- /dev/null +++ b/hypr/scripts/autostart/apps @@ -0,0 +1,11 @@ +#!/bin/bash + +# Apps +#spotify & +#vesktop & +#thunderbird & +#obsidian & + +# Terminal Apps +#kitty --class btop btop & +#kitty --class nvtop nvtop & diff --git a/hypr/scripts/autostart/services b/hypr/scripts/autostart/services new file mode 100755 index 0000000..9c11bde --- /dev/null +++ b/hypr/scripts/autostart/services @@ -0,0 +1,38 @@ +#!/bin/bash + +# Automounter for removable media +udiskie & + +# Wallpaper Backend +swww-daemon --format xrgb & + +# Pyprland Daemon +pypr --debug /tmp/pypr.log & + +# Bar +waybar & + +# Notification Daemon +swaync & + +# OSD Window +swayosd-server & + +# Notify about devices connecting and disconnecting +devify & + +# Idle daemon to screen lock +hypridle & + +# Clipboard +wl-paste --watch cliphist store & + +# Polkit authentication +/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 & + +# Screen sharing and portals +"$HOME"/.config/hypr/portal & +# xwaylandvideobridge & # Off when using Vesktop instead of Discord + +# Audio +easyeffects --gapplication-service & diff --git a/hypr/scripts/color_picker b/hypr/scripts/color_picker new file mode 100755 index 0000000..c970ccf --- /dev/null +++ b/hypr/scripts/color_picker @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +# Simple Script To Pick Color Quickly. + +# pick, autocopy and get the value +color=$(hyprpicker -a) + +echo "$color" + +if [[ "$color" ]]; then + image=/tmp/${color}.png + # generate preview + convert -size 48x48 xc:"$color" "$image" + # notify the color + notify-send -i "$image" "$color" "Copied to clipboard" +fi diff --git a/hypr/scripts/current_song b/hypr/scripts/current_song new file mode 100755 index 0000000..23429c3 --- /dev/null +++ b/hypr/scripts/current_song @@ -0,0 +1,5 @@ +#!/bin/bash + +song_info=$(playerctl metadata --format '󰎈 {{artist}} - {{title}} 󰎈') + +echo "$song_info" diff --git a/hypr/scripts/hyprfreeze b/hypr/scripts/hyprfreeze new file mode 100755 index 0000000..85ad5bd --- /dev/null +++ b/hypr/scripts/hyprfreeze @@ -0,0 +1,223 @@ +#!/bin/bash + +function printHelp() { + cat < | -n | -r) [options] + +Utility to suspend a game process (and other programs) in Hyprland. + +Options: + -h, --help show help message + + -a, --active toggle suspend by active window + -p, --pid toggle suspend by process id + -n, --name toggle suspend by process name/command + -r, --prop toggle suspend by clicking on window (hyprprop must be installed) + + -s, --silent don't send notification + -t, --notif-timeout notification timeout in milliseconds (default 5000) + --info show information about the process + --dry-run doesn't actually suspend/resume a process, useful with --info + --debug enable debug mode +EOF +} + +function debugPrint() { + if [ "$DEBUG" -eq 1 ]; then + echo "[DEBUG] $1" + fi +} + +function toggleFreeze() { + # Skip this function if --dry-run flag was provided + if [[ $DRYRUN == "1" ]]; then return 0; fi + + # Get pids of process tree + PIDS=$(pstree -p "$PID" | grep -oP '\(\K[^\)]+') + + debugPrint "PIDs: $PIDS" + + # Prevent suspending itself + local pid_of_script=$$ + if echo "$PIDS" | grep -q "$pid_of_script"; then + echo "You are trying to suspend the hyprfreeze process." + exit 1 + fi + + # Suspend or resume processes + if [[ "$(ps -o state= "$PID")" == T ]]; then + debugPrint "Resuming processes..." + kill -CONT $PIDS 2>/dev/null && echo "Resumed $(ps -p "$PID" -o comm= 2>/dev/null) (PID $PID)" || exit 1 + else + debugPrint "Suspending processes..." + kill -STOP $PIDS 2>/dev/null && echo "Suspended $(ps -p "$PID" -o comm= 2>/dev/null) (PID $PID)" || exit 1 + fi +} + +function getPidByActive() { + debugPrint "Getting PID by active window..." + PID=$(hyprctl activewindow -j | jq '.pid') + debugPrint "PID by active window: $PID" +} + +function getPidByPid() { + debugPrint "Getting PID by PID: $1" + # Check if process pid exists + if ! ps -p "$1" &>/dev/null; then + echo "Process ID $1 not found" + exit 1 + fi + + PID=$1 +} + +function getPidByName() { + debugPrint "Getting PID by name: $1" + # Check if process name exists + if ! pidof -x "$1" >/dev/null; then + echo "Process name $1 not found" + exit 1 + fi + + # Get last process if there are multiple + PID=$(pidof "$1" | awk '{print $NF}') + debugPrint "PID by name: $PID" +} + +function getPidByProp() { + debugPrint "Getting PID by prop..." + if ! command -v hyprprop; then + echo "You need to install 'hyprprop' to use this feature. (https://github.com/vilari-mickopf/hyprprop)" + exit 1 + fi + + PID=$(hyprprop | jq '.pid') + debugPrint "PID by prop: $PID" +} + +function printInfo() { + debugPrint "Printing process info...\n" + echo -e "$(tput bold)Process tree:$(tput sgr0)" + ps -p "$PID" 2>/dev/null && pstree -p "$PID" + + echo -e "\n$(tput bold)Process threads:$(tput sgr0)" + ps -eLo pid,tid,comm | grep "$PID" 2>/dev/null + + echo -e "\n$(tput bold)Process ID$(tput sgr0) = $PID \ + \n$(tput bold)Process name$(tput sgr0) = $(ps -p "$PID" -o comm= 2>/dev/null) \ + \n$(tput bold)Process state$(tput sgr0) = $(ps -o state= -p "$PID" 2>/dev/null)\n" +} + +function sendNotification() { + debugPrint "Sending notification..." + local title + title=$([[ "$(ps -p "$PID" -o state=)" == T ]] && + echo "Suspended $(ps -p "$PID" -o comm= 2>/dev/null)" || + echo "Resumed $(ps -p "$PID" -o comm= 2>/dev/null)") + + local message="PID $PID" + + notify-send "${title}" "${message}" -t "$NOTIF_TIMEOUT" -a Hyprfreeze +} + +function args() { + # Track required flags + local required_flag_count=0 + + # Parse options + local options="hap:n:rst:" + local long_options="help,active,pid:,name:,prop,silent,notif-timeout:,info,dry-run,debug" + local parsed_args + parsed_args=$(getopt -o "$options" --long "$long_options" -n "$(basename "$0")" -- "$@") + + eval set -- "$parsed_args" + while true; do + case $1 in + -h | --help) + printHelp + exit 0 + ;; + -a | --active) + ((required_flag_count++)) + FLAG_ACTIVE=true + ;; + -p | --pid) + ((required_flag_count++)) + shift + FLAG_PID="$1" + ;; + -n | --name) + ((required_flag_count++)) + shift + NAME_FLAG="$1" + ;; + -r | --prop) + ((required_flag_count++)) + FLAG_PROP=true + ;; + -s | --silent) + SILENT=1 + ;; + -t | --notif-timeout) + shift + NOTIF_TIMEOUT="$1" + ;; + --info) + INFO=1 + ;; + --dry-run) + DRYRUN=1 + ;; + --debug) + DEBUG=1 + ;; + --) + shift # Skip -- argument + break + ;; + *) + exit 1 + ;; + esac + shift + done + + # Check if more than one required flag is provided, or if none was provided + if [ $required_flag_count -ne 1 ]; then + printHelp + exit 1 + fi +} + +function main() { + debugPrint "Starting main function..." + # Get pid by a required flag + if [ "$FLAG_ACTIVE" = true ]; then + getPidByActive + elif [ -n "$FLAG_PID" ]; then + getPidByPid "$FLAG_PID" + elif [ -n "$NAME_FLAG" ]; then + getPidByName "$NAME_FLAG" + elif [ "$FLAG_PROP" = true ]; then + getPidByProp + fi + + # Suspend or resume process + toggleFreeze + + # Run these functions after PID is obtained + if [ $INFO -eq 1 ]; then printInfo; fi + if [ $SILENT -ne 1 ]; then sendNotification; fi + + debugPrint "End of main function." +} + +SILENT=0 +NOTIF_TIMEOUT=5000 +INFO=0 +DRYRUN=0 +DEBUG=0 + +args "$@" + +main diff --git a/hypr/scripts/hyprshot b/hypr/scripts/hyprshot new file mode 100755 index 0000000..09b4639 --- /dev/null +++ b/hypr/scripts/hyprshot @@ -0,0 +1,354 @@ +#!/bin/bash + +set -e + +function Help() { + cat <&2 printf "$@" +} + +function send_notification() { + if [ $SILENT -eq 1 ]; then + return 0 + fi + + local message=$([ $CLIPBOARD -eq 1 ] && + echo "Image copied to the clipboard" || + echo "Image saved in ${1} and copied to the clipboard.") + action=$(notify-send -i "$1" --action="view=View" --action="edit=Edit" --action="folder=Open on Folder" "Screenshot saved" \ + "${message}" \ + -t "$NOTIF_TIMEOUT" -i "${1}" -a Hyprshot) + + case $action in + "view") + xdg-open "$1" + ;; + "edit") + if command -v satty &>/dev/null; then + satty -f "$1" + else + notify-send -u critical "Cannot Edit Image" "Install Satty" + fi + ;; + "folder") + nemo "$1" + ;; + esac +} + +function trim() { + Print "Geometry: %s\n" "${1}" + local geometry="${1}" + local xy_str=$(echo "${geometry}" | cut -d' ' -f1) + local wh_str=$(echo "${geometry}" | cut -d' ' -f2) + local x=$(echo "${xy_str}" | cut -d',' -f1) + local y=$(echo "${xy_str}" | cut -d',' -f2) + local width=$(echo "${wh_str}" | cut -dx -f1) + local height=$(echo "${wh_str}" | cut -dx -f2) + + local max_width=$(hyprctl monitors -j | jq -r '[.[] | if (.transform % 2 == 0) then (.x + .width) else (.x + .height) end] | max') + local max_height=$(hyprctl monitors -j | jq -r '[.[] | if (.transform % 2 == 0) then (.y + .height) else (.y + .width) end] | max') + + local min_x=$(hyprctl monitors -j | jq -r '[.[] | (.x)] | min') + local min_y=$(hyprctl monitors -j | jq -r '[.[] | (.y)] | min') + + local cropped_x=$x + local cropped_y=$y + local cropped_width=$width + local cropped_height=$height + + if ((x + width > max_width)); then + cropped_width=$((max_width - x)) + fi + if ((y + height > max_height)); then + cropped_height=$((max_height - y)) + fi + + if ((x < min_x)); then + cropped_x="$min_x" + cropped_width=$((cropped_width + x - min_x)) + fi + if ((y < min_y)); then + cropped_y="$min_y" + cropped_height=$((cropped_height + y - min_y)) + fi + + local cropped=$(printf "%s,%s %sx%s\n" \ + "${cropped_x}" "${cropped_y}" \ + "${cropped_width}" "${cropped_height}") + Print "Crop: %s\n" "${cropped}" + echo ${cropped} +} + +function save_geometry() { + local geometry="${1}" + local output="" + + if [ $RAW -eq 1 ]; then + grim -g "${geometry}" - + return 0 + fi + + if [ $CLIPBOARD -eq 0 ]; then + mkdir -p "$SAVEDIR" + grim -g "${geometry}" "$SAVE_FULLPATH" + output="$SAVE_FULLPATH" + wl-copy --type image/png <"$output" + [ -z "$COMMAND" ] || { + "$COMMAND" "$output" + } + else + wl-copy --type image/png < <(grim -g "${geometry}" -) + fi + + send_notification $output +} + +function checkRunning() { + sleep 1 + while [[ 1 == 1 ]]; do + if [[ $(pgrep slurp | wc -m) == 0 ]]; then + pkill hyprpicker + exit + fi + done +} + +function begin_grab() { + if [ $FREEZE -eq 1 ] && [ "$(command -v "hyprpicker")" ] >/dev/null 2>&1; then + sleep 0.2 + hyprpicker -r -z & + sleep 0.2 + HYPRPICKER_PID=$! + fi + local option=$1 + case $option in + output) + if [ $CURRENT -eq 1 ]; then + local geometry=$(grab_active_output) + elif [ -z $SELECTED_MONITOR ]; then + local geometry=$(grab_output) + else + local geometry=$(grab_selected_output $SELECTED_MONITOR) + fi + ;; + region) + local geometry=$(grab_region) + ;; + window) + if [ $CURRENT -eq 1 ]; then + local geometry=$(grab_active_window) + else + local geometry=$(grab_window) + fi + geometry=$(trim "${geometry}") + ;; + esac + if [ ${DELAY} -gt 0 ] 2>/dev/null; then + sleep ${DELAY} + fi + save_geometry "${geometry}" +} + +function grab_output() { + slurp -or +} + +function grab_active_output() { + local active_workspace=$(hyprctl -j activeworkspace) + local monitors=$(hyprctl -j monitors) + Print "Monitors: %s\n" "$monitors" + Print "Active workspace: %s\n" "$active_workspace" + local current_monitor="$(echo $monitors | jq -r 'first(.[] | select(.activeWorkspace.id == '$(echo $active_workspace | jq -r '.id')'))')" + Print "Current output: %s\n" "$current_monitor" + echo $current_monitor | jq -r '"\(.x),\(.y) \(.width/.scale|round)x\(.height/.scale|round)"' +} + +function grab_selected_output() { + local monitor=$(hyprctl -j monitors | jq -r '.[] | select(.name == "'$(echo $1)'")') + Print "Capturing: %s\n" "${1}" + echo $monitor | jq -r '"\(.x),\(.y) \(.width/.scale|round)x\(.height/.scale|round)"' +} + +function grab_region() { + slurp -d -b $BACKGROUND_COLOR -c $BORDER_COLOR -w $BORDER_WIDTH +} + +function grab_window() { + local monitors=$(hyprctl -j monitors) + local clients=$(hyprctl -j clients | jq -r '[.[] | select(.workspace.id | contains('$(echo $monitors | jq -r 'map(.activeWorkspace.id) | join(",")')'))]') + Print "Monitors: %s\n" "$monitors" + Print "Clients: %s\n" "$clients" + # Generate boxes for each visible window and send that to slurp + # through stdin + local boxes="$(echo $clients | jq -r '.[] | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1]) \(.title)"' | cut -f1,2 -d' ')" + Print "Boxes:\n%s\n" "$boxes" + slurp -r -b $BACKGROUND_COLOR -c $BORDER_COLOR -w $BORDER_WIDTH <<<"$boxes" +} + +function grab_active_window() { + local active_window=$(hyprctl -j activewindow) + local box=$(echo $active_window | jq -r '"\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"' | cut -f1,2 -d' ') + Print "Box:\n%s\n" "$box" + echo "$box" +} + +function parse_mode() { + local mode="${1}" + + case $mode in + window | region | output) + OPTION=$mode + ;; + active) + CURRENT=1 + ;; + *) + hyprctl monitors -j | jq -re '.[] | select(.name == "'$(echo $mode)'")' &>/dev/null + SELECTED_MONITOR=$mode + ;; + esac +} + +function args() { + local options=$(getopt -o hf:o:m:D:dszr:t: --long help,filename:,output-folder:,mode:,delay:,clipboard-only,debug,silent,freeze,raw,notif-timeout:,border-color:,background-color:,border-width: -- "$@") + eval set -- "$options" + + while true; do + case "$1" in + -h | --help) + Help + exit + ;; + -o | --output-folder) + shift + SAVEDIR=$1 + ;; + -f | --filename) + shift + FILENAME=$1 + ;; + -D | --delay) + shift + DELAY=$1 + ;; + -m | --mode) + shift + parse_mode $1 + ;; + --clipboard-only) + CLIPBOARD=1 + ;; + -d | --debug) + DEBUG=1 + ;; + -z | --freeze) + FREEZE=1 + ;; + -s | --silent) + SILENT=1 + ;; + -r | --raw) + RAW=1 + ;; + -t | --notif-timeout) + shift + NOTIF_TIMEOUT=$1 + ;; + --border-color) + shift + BORDER_COLOR=$1 + ;; + --background-color) + shift + BACKGROUND_COLOR=$1 + ;; + --border-width) + shift + BORDER_WIDTH=$1 + ;; + --) + shift # Skip -- argument + COMMAND=${@:2} + break + ;; + esac + shift + done + + if [ -z $OPTION ]; then + Print "A mode is required\n\nAvailable modes are:\n\toutput\n\tregion\n\twindow\n" + exit 2 + fi +} + +if [ -z $1 ]; then + Help + exit +fi + +CLIPBOARD=0 +DEBUG=0 +SILENT=0 +RAW=0 +NOTIF_TIMEOUT=5000 +CURRENT=0 +FREEZE=0 +BORDER_COLOR=\#181926 +BACKGROUND_COLOR=\#8087a25a +BORDER_WIDTH=0 +[ -z "$XDG_PICTURES_DIR" ] && type xdg-user-dir &>/dev/null && XDG_PICTURES_DIR=$(xdg-user-dir PICTURES) +FILENAME="$(date +'%Y-%m-%d-%H%M%S_hyprshot.png')" +[ -z "$HYPRSHOT_DIR" ] && SAVEDIR=${XDG_PICTURES_DIR:=~} || SAVEDIR=${HYPRSHOT_DIR} + +args $0 "$@" + +SAVE_FULLPATH="$SAVEDIR/$FILENAME" +[ $CLIPBOARD -eq 0 ] && Print "Saving in: %s\n" "$SAVE_FULLPATH" +begin_grab $OPTION & +checkRunning diff --git a/hypr/scripts/launch_app b/hypr/scripts/launch_app new file mode 100755 index 0000000..231c717 --- /dev/null +++ b/hypr/scripts/launch_app @@ -0,0 +1,14 @@ +#!/bin/bash + +if [ -z "$1" ]; then + exit 1 +fi + +program="$1" + +if ! command -v "$program" >/dev/null 2>&1; then + notify-send "Program not found" "Make sure you have installed $program" + exit 1 +else + exec $@ +fi diff --git a/hypr/scripts/lock b/hypr/scripts/lock new file mode 100755 index 0000000..6e440c9 --- /dev/null +++ b/hypr/scripts/lock @@ -0,0 +1,19 @@ +#!/usr/bin/bash +swaylock --screenshots --indicator --clock \ + --inside-wrong-color $(~/.config/hypr/scripts/color 1 -n) \ + --ring-wrong-color $(~/.config/hypr/scripts/color background -n) \ + --inside-clear-color $(~/.config/hypr/scripts/color 2 -n) \ + --ring-clear-color $(~/.config/hypr/scripts/color background -n) \ + --inside-ver-color $(~/.config/hypr/scripts/color 4 -n) \ + --ring-ver-color $(~/.config/hypr/scripts/color background -n) \ + --text-color $(~/.config/hypr/scripts/color 5 -un) \ + --key-hl-color $(~/.config/hypr/scripts/color 4 -un) \ + --indicator-radius 80 \ + --indicator-thickness 5 \ + --effect-blur 10x7 \ + --effect-vignette 0.2:0.2 \ + --ring-color 11111b \ + --line-color 313244 \ + --inside-color 0011111b \ + --separator-color 00000000 \ + --fade-in 0.1 & diff --git a/hypr/scripts/move_by_rules b/hypr/scripts/move_by_rules new file mode 100755 index 0000000..637fbb9 --- /dev/null +++ b/hypr/scripts/move_by_rules @@ -0,0 +1,23 @@ +#!/bin/bash + +# Script created by: https://github.com/moguay + +# Retrieve the active class of the window +active_class=$(hyprctl -j activewindow | jq '.class') +active_class=$(echo "$active_class" | tr -d \") + +# Read the file and store lines containing 'workspace' in an array +grep 'workspace' ~/.config/hypr/themes/luna/rules.conf | while IFS= read -r line; do + workspace_value=$(echo "$line" | sed -n -e 's/^.*workspace \([0-9]*\)[ ,].*$/\1/p') + class_value=$(echo "$line" | sed -n -e 's/^.*class:\s*\(.*\)$/\1/p') + regex=$class_value + + if [ -n "$workspace_value" ] && [ -n "$class_value" ]; then + # Compare the retrieved value with the active class of the window + if echo "$active_class" | grep -E "$regex"; then + #echo "The class matches the active class of the window. Workspace value to apply: $workspace_value" + hyprctl dispatch movetoworkspace "$workspace_value" + fi + fi +done +exit 1 diff --git a/hypr/scripts/performance b/hypr/scripts/performance new file mode 100755 index 0000000..9d90908 --- /dev/null +++ b/hypr/scripts/performance @@ -0,0 +1,29 @@ +#!/usr/bin/env sh + +HYPRGAMEMODE=$(hyprctl getoption animations:enabled | awk 'NR==2{print $2}') + +# Waybar performance +FILE="$HOME/.config/waybar/style.css" + +sed -i 's/\/\* \(.*animation:.*\) \*\//\1/g' $FILE +if [ "$HYPRGAMEMODE" = 1 ]; then + sed -i 's/^\(.*animation:.*\)$/\/\* \1 \*\//g' $FILE +fi + +killall waybar +waybar > /dev/null 2>&1 & + +# Hyprland performance +if [ "$HYPRGAMEMODE" = 1 ]; then + hyprctl --batch "\ + keyword animations:enabled 0;\ + keyword decoration:drop_shadow 0;\ + keyword decoration:blur:enabled 0;\ + keyword general:gaps_in 0;\ + keyword general:gaps_out 0;\ + keyword general:border_size 1;\ + keyword decoration:rounding 0" + exit +fi + +hyprctl reload > /dev/null 2>&1 & diff --git a/hypr/scripts/portal b/hypr/scripts/portal new file mode 100755 index 0000000..f56374b --- /dev/null +++ b/hypr/scripts/portal @@ -0,0 +1,9 @@ +#!/bin/bash + +sleep 1 +killall -e xdg-desktop-portal-hyprland +killall -e xdg-desktop-portal-wlr +killall xdg-desktop-portal +/usr/lib/xdg-desktop-portal-hyprland & +sleep 2 +/usr/lib/xdg-desktop-portal & diff --git a/hypr/scripts/random_wallpaper b/hypr/scripts/random_wallpaper new file mode 100755 index 0000000..3c06ac0 --- /dev/null +++ b/hypr/scripts/random_wallpaper @@ -0,0 +1,11 @@ +#!/usr/bin/bash + +random=$(fd --base-directory "$HOME/.config/hypr/theme/walls/" --type f . | shuf -n 1) + +wallpaper="$HOME/.config/hypr/theme/walls/$random" + +swww img "$wallpaper" \ + --transition-bezier 0.5,1.19,.8,.4 \ + --transition-type wipe \ + --transition-duration 2 \ + --transition-fps 75 && notify-send "Wallpaper Changed" -i "$wallpaper" --app-name=Wallpaper diff --git a/hypr/scripts/toggle_floating b/hypr/scripts/toggle_floating new file mode 100755 index 0000000..3aefbf7 --- /dev/null +++ b/hypr/scripts/toggle_floating @@ -0,0 +1,31 @@ +#!/bin/bash + +floating=$(hyprctl activewindow -j | jq '.floating') +window=$(hyprctl activewindow -j | jq '.initialClass' | tr -d "\"") + +function toggle() { + width=$1 + height=$2 + + hyprctl --batch "dispatch togglefloating; dispatch resizeactive exact ${width} ${height}; dispatch centerwindow" +} + +function untoggle() { + hyprctl dispatch togglefloating +} + +function handle() { + width=$1 + height=$2 + + if [ "$floating" == "false" ]; then + toggle "$width" "$height" + else + untoggle + fi +} + +case $window in +kitty) handle "50%" "55%" ;; +*) handle "70%" "70%" ;; +esac diff --git a/hypr/theme/animations.conf b/hypr/theme/animations.conf new file mode 100644 index 0000000..46c2298 --- /dev/null +++ b/hypr/theme/animations.conf @@ -0,0 +1,41 @@ +animations { + enabled = 1 + + bezier = default, 0.05, 0.9, 0.1, 1.02 + bezier = wind, 0.05, 0.9, 0.1, 1.02 + bezier = overshot, 0.13, 0.99, 0.29, 1.02 + bezier = liner, 1, 1, 1, 1 + bezier = easeOutQuint, 0.23, 1, 0.32, 1.03 + + # Slow Animations + # animation = windows, 1, 7, wind, popin + # animation = windowsIn, 1, 6, overshot, popin + # animation = windowsOut, 1, 5, overshot, popin + # animation = windowsMove, 1, 6, overshot, slide + # animation = layers, 1, 4, default, popin + # animation = fadeIn, 1, 10, default + # animation = fadeOut, 1, 10, default + # animation = fadeSwitch, 1, 10, default + # animation = fadeShadow, 1, 10, default + # animation = fadeDim, 1, 10, default + # animation = fadeLayers, 1, 10, default + # animation = workspaces, 1, 6, overshot, slide + # animation = border, 1, 1, liner + # animation = borderangle, 1, 30, liner, loop + + # Fast Animations + animation = windows, 1, 3.5, easeOutQuint, popin + animation = windowsIn, 1, 3.5, easeOutQuint, popin + animation = windowsOut, 1, 3.5, overshot, popin + animation = windowsMove, 1, 3.5, overshot, slide + animation = layers, 1, 3, default, popin + animation = fadeIn, 1, 4, default + animation = fadeOut, 1, 4, default + animation = fadeSwitch, 1, 4, default + animation = fadeShadow, 1, 4, default + animation = fadeDim, 1, 4, default + animation = fadeLayers, 1, 4, default + animation = workspaces, 1, 3.25, easeOutQuint, slide + #animation = border, 1, 1, liner + #animation = borderangle, 1, 30, liner, loop +} diff --git a/hypr/theme/colors.conf b/hypr/theme/colors.conf new file mode 100644 index 0000000..a179511 --- /dev/null +++ b/hypr/theme/colors.conf @@ -0,0 +1,77 @@ +$rosewater = rgb(f4dbd6) +$rosewaterAlpha = f4dbd6 + +$flamingo = rgb(f0c6c6) +$flamingoAlpha = f0c6c6 + +$pink = rgb(f5bde6) +$pinkAlpha = f5bde6 + +$mauve = rgb(c6a0f6) +$mauveAlpha = c6a0f6 + +$red = rgb(ed8796) +$redAlpha = ed8796 + +$maroon = rgb(ee99a0) +$maroonAlpha = ee99a0 + +$peach = rgb(f5a97f) +$peachAlpha = f5a97f + +$yellow = rgb(eed49f) +$yellowAlpha = eed49f + +$green = rgb(a6da95) +$greenAlpha = a6da95 + +$teal = rgb(8bd5ca) +$tealAlpha = 8bd5ca + +$sky = rgb(91d7e3) +$skyAlpha = 91d7e3 + +$sapphire = rgb(7dc4e4) +$sapphireAlpha = 7dc4e4 + +$blue = rgb(8aadf4) +$blueAlpha = 8aadf4 + +$lavender = rgb(b7bdf8) +$lavenderAlpha = b7bdf8 + +$text = rgb(cad3f5) +$textAlpha = cad3f5 + +$subtext1 = rgb(b8c0e0) +$subtext1Alpha = b8c0e0 + +$subtext0 = rgb(a5adcb) +$subtext0Alpha = a5adcb + +$overlay2 = rgb(939ab7) +$overlay2Alpha = 939ab7 + +$overlay1 = rgb(8087a2) +$overlay1Alpha = 8087a2 + +$overlay0 = rgb(6e738d) +$overlay0Alpha = 6e738d + +$surface2 = rgb(5b6078) +$surface2Alpha = 5b6078 + +$surface1 = rgb(494d64) +$surface1Alpha = 494d64 + +$surface0 = rgb(363a4f) +$surface0Alpha = 363a4f + +$base = rgb(24273a) +$baseAlpha = 24273a + +$mantle = rgb(1e2030) +$mantleAlpha = 1e2030 + +$crust = rgb(181926) +$crustAlpha = 181926 diff --git a/hypr/theme/decoration.conf b/hypr/theme/decoration.conf new file mode 100644 index 0000000..05ceba5 --- /dev/null +++ b/hypr/theme/decoration.conf @@ -0,0 +1,59 @@ +source = ./colors.conf + +general { + border_size = 2 + col.inactive_border = rgba($lavenderAlpha69) + col.active_border = rgba($textAlphaee) rgba($lavenderAlpha69) rgba($lavenderAlpha69) rgba($textAlphaee) 45deg + + gaps_in = 3 + gaps_out = 5 +} + +decoration { + rounding = 7 + + active_opacity = 0.92 + inactive_opacity = 0.90 + + blur { + enabled = yes + size = 5 + passes = 4 + ignore_opacity = true + new_optimizations = true + xray = false + noise = 0.0 + popups = true + } + + shadow { + enabled = yes + range = 30 + scale = 2 + render_power = 5 + color = $crust + color_inactive = $surface0 + } + + dim_inactive = false + dim_strength = 0.05 +} + +group { + col.border_inactive = rgba($lavenderAlpha69) + col.border_active = rgba($textAlphaee) rgba($lavenderAlpha69) rgba($lavenderAlpha69) rgba($textAlphaee) 45deg + + col.border_locked_inactive = rgba($lavenderAlpha69) + col.border_locked_active = rgba($textAlphaee) rgba($lavenderAlpha69) rgba($lavenderAlpha69) rgba($textAlphaee) 45deg + + groupbar { + col.active = rgba($lavenderAlphaCC) + col.inactive = rgba($subtext1Alpha99) + col.locked_active = rgba($maroonAlphaCC) + col.locked_inactive = rgba($subtext1Alpha99) + font_family = JetBrainsMono Nerd Font + font_size = 14 + text_color = $crust + height = 16 + } +} diff --git a/hypr/theme/gif-walls/nord-car.gif b/hypr/theme/gif-walls/nord-car.gif new file mode 100644 index 0000000..b38c698 Binary files /dev/null and b/hypr/theme/gif-walls/nord-car.gif differ diff --git a/hypr/theme/rules.conf b/hypr/theme/rules.conf new file mode 100644 index 0000000..83f1c87 --- /dev/null +++ b/hypr/theme/rules.conf @@ -0,0 +1,128 @@ +# Base Rules +$center-float-large = class:^(center-float-large)$|^(.*qimgv.*)$|^(.*mpv.*)$ +windowrulev2 = float, $center-float-large +windowrulev2 = size 70% 70%, $center-float-large +windowrulev2 = center 1, $center-float-large + +$center-float = class:^(center-float)$ +$center-float-title = title:^(.*Open Folder.*)$|^(.*Open File.*)$|^(.*Save File.*)$|^(.*Save Folder.*)$|^(.*Save Image.*)$|^(.*Save As.*)$|^(.*Open As.*)$ +windowrulev2 = float, $center-float +windowrulev2 = float, $center-float-title +windowrulev2 = size 50% 50%, $center-float +windowrulev2 = size 50% 50%, $center-float-title +windowrulev2 = center 1, $center-float +windowrulev2 = center 1, $center-float-title + +$center-float-mini = class:^(center-float-mini)$|^(.*galculator.*)$|^(.*ytdlp-gui.*)$|^(.*udiskie.*)$|^(.*Calculator.*)$ +windowrulev2 = float, $center-float-mini +windowrulev2 = size 30% 40%, $center-float-mini +windowrulev2 = center 1, $center-float-mini + + +# Float Rules +windowrule = float, xfce-polkit|wleave|title:branchdialog|nwg-look|nm-connection-editor|org.twosheds.iwgtk|overskride + + +# Workspace Rules +## System +#windowrulev2 = workspace 8, class:^(.*virt-manager.*)$|(.*PikaBackup.*)$|(.*VirtualBox Manager.*)$|(.*Vmware*)$ +#windowrulev2 = workspace 17, class:^(.*GParted.*)$|(.*clamtk.*)$|(.*gnome.Logs.*)$ + +## Gaming +#windowrulev2 = workspace 7, class:^(.*steam_app.*)$|(.*gamescope.*)$|(.*atlauncher.*)$|(.*Minecraft.*)$ +#windowrulev2 = workspace 16 silent, class:^([Ss]team)$|(.*heroic.*)$ +#windowrulev2 = workspace 7, class:^(.*Ryujinx.*)$|(.*cemu.*)$|(.*dolphin.*)$|(.*RetroArch.*)$|(.*xemu.*)$|(.*duckstation.*)$|(.*rpcs3.*)$ + +## Media +#windowrulev2 = workspace 6, class:^(.*kdenlive.*)$ +#windowrulev2 = workspace 21 silent, class:^(.*thunderbird.*)$ +#windowrulev2 = workspace 22 silent, class:^(.*btop.*)$ +#windowrulev2 = workspace 22 silent, class:^(.*nvtop.*)$ +#windowrulev2 = workspace 19 silent, class:^(.*[Ss]potify.*)$|(.*tidal-hifi.*)$|(.*You[Tt]ube Music.*)$ +#windowrulev2 = workspace 20 silent, class:^(.*discord.*)$|(.*vesktop.*)$|(.*WebCord.*)$ +#windowrulev2 = workspace 15, class:^(.*obsproject.*)$ +#windowrulev2 = workspace 14, class:^(.*easyeffects.*)$|^(.*qpwgraph.*)$|(.*Helvum.*)$ +#windowrulev2 = workspace 5, class:^(.*vital.*)$|(.*fl64.*)$|(.*nicotine_plus.*)$ +#windowrulev2 = workspace 5, title:^(.*FL Studio.*)$ +#windowrulev2 = workspace 4, class:^(.*pinta.*)$|(.*krita.*)$|(.*blender.*)$|(.*Upscayl.*)$ + +## Productivity/Dev +#windowrulev2 = workspace 9 silent, class:^(.*obsidian.*)$|(.*Zotero.*)$ +#windowrulev2 = workspace 2, class:^(.*Code.*)$|(.*codium.*)$|(.*VSCodium.*)$|(.*neovide.*)$ + + +# Animation Rules +windowrulev2 = animation slide, title:^(.*cava.*)$ +windowrulev2 = animation popin, class:^(.*wleave.*)$ + + +# Scratchpads +$scratchpad-large = class:^(scratchpad-large)$ +windowrulev2 = float, $scratchpad-large +windowrulev2 = center 1, $scratchpad-large +windowrulev2 = size 70% 70%, $scratchpad-large +windowrulev2 = animation slide, $scratchpad-large +windowrulev2 = workspace special: scratchpad-large silent, $scratchpad-large + +$scratchpad = class:^(scratchpad)$ +windowrulev2 = float, $scratchpad0 +windowrulev2 = center 1, $scratchpad +windowrulev2 = size 50% 50%, $scratchpad +windowrulev2 = animation slide, $scratchpad +windowrulev2 = workspace special: scratchpad silent, $scratchpad + +$scratchpad-mini = class:^(scratchpad-mini)$ +windowrulev2 = float, $scratchpad-mini +windowrulev2 = center 1, $scratchpad-mini +windowrulev2 = size 30% 40%, $scratchpad-mini +windowrulev2 = animation slide, $scratchpad-mini +windowrulev2 = workspace special: scratchpad-mini silent, $scratchpad-mini + +$sideScratchpad = class:^(.*pavucontrol.*)$|(.*blueman-manager.*)$ +windowrulev2 = workspace special:scratchpad silent, $sideScratchpad +windowrulev2 = size 30% 90%, $sideScratchpad +windowrulev2 = float, $sideScratchpad +windowrulev2 = center 1, $sideScratchpad + + +# Specific App Rules +$videobridge = class:^(.*xwaylandvideobridge.*)$ +windowrulev2 = opacity 0.0 override 0.0 override, $videobridge +windowrulev2 = noanim, $videobridge +windowrulev2 = noblur, $videobridge +windowrulev2 = noinitialfocus, $videobridge +windowrulev2 = maxsize 1 1, $videobridge + +$zathura = class:^(.*zathura.*)$ +windowrulev2 = float, $zathura +windowrulev2 = size 35% 90%, $zathura +windowrulev2 = center 1, $zathura + +$scrcpy = class:^(.*wgpsscli.*)$ +windowrulev2 = center 1, $scrcpy +windowrulev2 = float, $scrcpy + +$agpss = class:^(-*agpss.*)$ +windowrulev2 = tile, $agpss + +$affinity = class:^(designer|publisher|photo).exe$ +windowrule = tile, xwayland, $affinity + +# Layer Rules +layerrule = animation popin, rofi +layerrule = blur, rofi +layerrule = ignorezero, rofi + +layerrule = blur, waybar +layerrule = ignorezero, waybar + +layerrule = ignorezero, swaync-notification-window +layerrule = animation slide, swaync-notification-window +layerrule = animation slide, swaync-control-center + +layerrule = animation fade, swayosd + +layerrule = animation fade, selection +layerrule = animation fade, hyprlock + +layerrule = noanim, hyprpicker diff --git a/hypr/theme/theme.conf b/hypr/theme/theme.conf new file mode 100644 index 0000000..ac9b9cb --- /dev/null +++ b/hypr/theme/theme.conf @@ -0,0 +1,3 @@ +source = ./animations.conf +source = ./rules.conf +source = ./decoration.conf diff --git a/hypr/theme/walls/.github/README.md b/hypr/theme/walls/.github/README.md new file mode 100644 index 0000000..f62ff06 --- /dev/null +++ b/hypr/theme/walls/.github/README.md @@ -0,0 +1,430 @@ +
+

📷 Wallpapers ✨

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ abstract + + abstract-swirls + + anime-skull +
+ arch-chan + + arch-distros + + arch-logo +
+ asteroid-miner + + asteroids + + astronaut-2 +
+ astronaut + + aztec-mysteries + + baby-star +
+ black-hole + + blue-kaiju + + bridge +
+ buildings + + bunnies-road + + cabin-2 +
+ cabin + + cafe + + car-2 +
+ car-wreck + + car + + city +
+ colorful-planets + + cool + + cottages-river +
+ crystals + + cyberpunk-2 + + cyberpunk-3 +
+ cyberpunk + + dark-forest + + dark-waves +
+ darknet + + delorean + + dominik-mayer +
+ doom-slayer + + fireskull + + flower-camp +
+ flowers-2 + + flowers + + flying-comets-clouds +
+ fox-clearing + + fuji-2 + + fuji +
+ galaxies + + galaxy-2 + + galaxy-3 +
+ galaxy-waves + + galaxy + + girl +
+ glass-room + + glitch + + haunted-house +
+ hollow-knight-2 + + hollow-knight-3 + + hollow-knight +
+ hyprland-logo + + japan-city + + keyboards +
+ kurz + + lake + + lifeform +
+ lofi-girl-2 + + lofi-girl + + marine-tunnel +
+ maze + + megumin + + montains +
+ nature + + nebula + + neon-dim +
+ neon-man + + neon + + night-city +
+ night-forest-path + + night-lake + + night-landscape +
+ night-street + + nord-car + + old-computer +
+ puffy-stars + + purpled-night + + quasar +
+ reaper + + relax + + retro-mario +
+ s4vitar + + sakura-gate + + sakura +
+ samurai-geralt + + saturn + + scenery +
+ ship + + shore + + sky +
+ solar-system + + souls + + space-2 +
+ space + + sparkles + + spill +
+ stars + + street + + switch-2 +
+ switch + + sword + + tokyo +
+ trigonometry + + underwater + + voxel-houses-monochrome +
+ waterfall + + window-room + + windows-error +
+ yohoho +
+ +
diff --git a/hypr/theme/walls/abstract-swirls.jpg b/hypr/theme/walls/abstract-swirls.jpg new file mode 100644 index 0000000..e43f29e Binary files /dev/null and b/hypr/theme/walls/abstract-swirls.jpg differ diff --git a/hypr/theme/walls/abstract.png b/hypr/theme/walls/abstract.png new file mode 100644 index 0000000..1906901 Binary files /dev/null and b/hypr/theme/walls/abstract.png differ diff --git a/hypr/theme/walls/anime-skull.png b/hypr/theme/walls/anime-skull.png new file mode 100644 index 0000000..8645fed Binary files /dev/null and b/hypr/theme/walls/anime-skull.png differ diff --git a/hypr/theme/walls/arch-chan.png b/hypr/theme/walls/arch-chan.png new file mode 100644 index 0000000..f701f77 Binary files /dev/null and b/hypr/theme/walls/arch-chan.png differ diff --git a/hypr/theme/walls/arch-distros.png b/hypr/theme/walls/arch-distros.png new file mode 100644 index 0000000..151aded Binary files /dev/null and b/hypr/theme/walls/arch-distros.png differ diff --git a/hypr/theme/walls/arch-logo.png b/hypr/theme/walls/arch-logo.png new file mode 100644 index 0000000..00b4774 Binary files /dev/null and b/hypr/theme/walls/arch-logo.png differ diff --git a/hypr/theme/walls/asteroid-miner.png b/hypr/theme/walls/asteroid-miner.png new file mode 100644 index 0000000..08bd447 Binary files /dev/null and b/hypr/theme/walls/asteroid-miner.png differ diff --git a/hypr/theme/walls/asteroids.png b/hypr/theme/walls/asteroids.png new file mode 100644 index 0000000..3b4cd7d Binary files /dev/null and b/hypr/theme/walls/asteroids.png differ diff --git a/hypr/theme/walls/astronaut-2.png b/hypr/theme/walls/astronaut-2.png new file mode 100644 index 0000000..7ececd1 Binary files /dev/null and b/hypr/theme/walls/astronaut-2.png differ diff --git a/hypr/theme/walls/astronaut.png b/hypr/theme/walls/astronaut.png new file mode 100644 index 0000000..6101718 Binary files /dev/null and b/hypr/theme/walls/astronaut.png differ diff --git a/hypr/theme/walls/aztec-mysteries.png b/hypr/theme/walls/aztec-mysteries.png new file mode 100644 index 0000000..22dc5a7 Binary files /dev/null and b/hypr/theme/walls/aztec-mysteries.png differ diff --git a/hypr/theme/walls/baby-star.png b/hypr/theme/walls/baby-star.png new file mode 100644 index 0000000..63c3556 Binary files /dev/null and b/hypr/theme/walls/baby-star.png differ diff --git a/hypr/theme/walls/black-hole.png b/hypr/theme/walls/black-hole.png new file mode 100644 index 0000000..19d6521 Binary files /dev/null and b/hypr/theme/walls/black-hole.png differ diff --git a/hypr/theme/walls/blue-kaiju.png b/hypr/theme/walls/blue-kaiju.png new file mode 100644 index 0000000..ebe8b4a Binary files /dev/null and b/hypr/theme/walls/blue-kaiju.png differ diff --git a/hypr/theme/walls/bridge.png b/hypr/theme/walls/bridge.png new file mode 100644 index 0000000..21af519 Binary files /dev/null and b/hypr/theme/walls/bridge.png differ diff --git a/hypr/theme/walls/buildings.png b/hypr/theme/walls/buildings.png new file mode 100644 index 0000000..5de7f08 Binary files /dev/null and b/hypr/theme/walls/buildings.png differ diff --git a/hypr/theme/walls/bunnies-road.png b/hypr/theme/walls/bunnies-road.png new file mode 100644 index 0000000..0aae3f1 Binary files /dev/null and b/hypr/theme/walls/bunnies-road.png differ diff --git a/hypr/theme/walls/cabin-2.png b/hypr/theme/walls/cabin-2.png new file mode 100644 index 0000000..de0c284 Binary files /dev/null and b/hypr/theme/walls/cabin-2.png differ diff --git a/hypr/theme/walls/cabin.png b/hypr/theme/walls/cabin.png new file mode 100644 index 0000000..bdc1ab8 Binary files /dev/null and b/hypr/theme/walls/cabin.png differ diff --git a/hypr/theme/walls/cafe.jpg b/hypr/theme/walls/cafe.jpg new file mode 100644 index 0000000..7d06287 Binary files /dev/null and b/hypr/theme/walls/cafe.jpg differ diff --git a/hypr/theme/walls/car-2.png b/hypr/theme/walls/car-2.png new file mode 100644 index 0000000..ae86850 Binary files /dev/null and b/hypr/theme/walls/car-2.png differ diff --git a/hypr/theme/walls/car-wreck.png b/hypr/theme/walls/car-wreck.png new file mode 100644 index 0000000..2af1b0b Binary files /dev/null and b/hypr/theme/walls/car-wreck.png differ diff --git a/hypr/theme/walls/car.jpg b/hypr/theme/walls/car.jpg new file mode 100644 index 0000000..e127fe0 Binary files /dev/null and b/hypr/theme/walls/car.jpg differ diff --git a/hypr/theme/walls/city.png b/hypr/theme/walls/city.png new file mode 100644 index 0000000..10ddc6e Binary files /dev/null and b/hypr/theme/walls/city.png differ diff --git a/hypr/theme/walls/colorful-planets.jpg b/hypr/theme/walls/colorful-planets.jpg new file mode 100644 index 0000000..3881e56 Binary files /dev/null and b/hypr/theme/walls/colorful-planets.jpg differ diff --git a/hypr/theme/walls/cool.jpg b/hypr/theme/walls/cool.jpg new file mode 100644 index 0000000..630e6b5 Binary files /dev/null and b/hypr/theme/walls/cool.jpg differ diff --git a/hypr/theme/walls/cottages-river.png b/hypr/theme/walls/cottages-river.png new file mode 100644 index 0000000..b36a74d Binary files /dev/null and b/hypr/theme/walls/cottages-river.png differ diff --git a/hypr/theme/walls/crystals.png b/hypr/theme/walls/crystals.png new file mode 100644 index 0000000..bc7f3d9 Binary files /dev/null and b/hypr/theme/walls/crystals.png differ diff --git a/hypr/theme/walls/cyberpunk-2.png b/hypr/theme/walls/cyberpunk-2.png new file mode 100755 index 0000000..9e14cec Binary files /dev/null and b/hypr/theme/walls/cyberpunk-2.png differ diff --git a/hypr/theme/walls/cyberpunk-3.png b/hypr/theme/walls/cyberpunk-3.png new file mode 100644 index 0000000..22fc6d2 Binary files /dev/null and b/hypr/theme/walls/cyberpunk-3.png differ diff --git a/hypr/theme/walls/cyberpunk.png b/hypr/theme/walls/cyberpunk.png new file mode 100755 index 0000000..ee78b4c Binary files /dev/null and b/hypr/theme/walls/cyberpunk.png differ diff --git a/hypr/theme/walls/dark-forest.jpg b/hypr/theme/walls/dark-forest.jpg new file mode 100644 index 0000000..d9ff92e Binary files /dev/null and b/hypr/theme/walls/dark-forest.jpg differ diff --git a/hypr/theme/walls/dark-waves.jpg b/hypr/theme/walls/dark-waves.jpg new file mode 100644 index 0000000..3cb975a Binary files /dev/null and b/hypr/theme/walls/dark-waves.jpg differ diff --git a/hypr/theme/walls/darknet.png b/hypr/theme/walls/darknet.png new file mode 100644 index 0000000..4cbd053 Binary files /dev/null and b/hypr/theme/walls/darknet.png differ diff --git a/hypr/theme/walls/delorean.png b/hypr/theme/walls/delorean.png new file mode 100644 index 0000000..7112d0b Binary files /dev/null and b/hypr/theme/walls/delorean.png differ diff --git a/hypr/theme/walls/dominik-mayer.jpg b/hypr/theme/walls/dominik-mayer.jpg new file mode 100644 index 0000000..ad182c5 Binary files /dev/null and b/hypr/theme/walls/dominik-mayer.jpg differ diff --git a/hypr/theme/walls/doom-slayer.png b/hypr/theme/walls/doom-slayer.png new file mode 100644 index 0000000..12bf0da Binary files /dev/null and b/hypr/theme/walls/doom-slayer.png differ diff --git a/hypr/theme/walls/fireskull.png b/hypr/theme/walls/fireskull.png new file mode 100644 index 0000000..269abc9 Binary files /dev/null and b/hypr/theme/walls/fireskull.png differ diff --git a/hypr/theme/walls/flower-camp.jpg b/hypr/theme/walls/flower-camp.jpg new file mode 100644 index 0000000..21148f8 Binary files /dev/null and b/hypr/theme/walls/flower-camp.jpg differ diff --git a/hypr/theme/walls/flowers-2.png b/hypr/theme/walls/flowers-2.png new file mode 100644 index 0000000..c5186cb Binary files /dev/null and b/hypr/theme/walls/flowers-2.png differ diff --git a/hypr/theme/walls/flowers.png b/hypr/theme/walls/flowers.png new file mode 100644 index 0000000..53d707f Binary files /dev/null and b/hypr/theme/walls/flowers.png differ diff --git a/hypr/theme/walls/flying-comets-clouds.jpg b/hypr/theme/walls/flying-comets-clouds.jpg new file mode 100644 index 0000000..016a8a6 Binary files /dev/null and b/hypr/theme/walls/flying-comets-clouds.jpg differ diff --git a/hypr/theme/walls/fox-clearing.png b/hypr/theme/walls/fox-clearing.png new file mode 100644 index 0000000..05132c2 Binary files /dev/null and b/hypr/theme/walls/fox-clearing.png differ diff --git a/hypr/theme/walls/fuji-2.png b/hypr/theme/walls/fuji-2.png new file mode 100644 index 0000000..b26f65a Binary files /dev/null and b/hypr/theme/walls/fuji-2.png differ diff --git a/hypr/theme/walls/fuji.png b/hypr/theme/walls/fuji.png new file mode 100644 index 0000000..ab80292 Binary files /dev/null and b/hypr/theme/walls/fuji.png differ diff --git a/hypr/theme/walls/galaxies.png b/hypr/theme/walls/galaxies.png new file mode 100644 index 0000000..a47c791 Binary files /dev/null and b/hypr/theme/walls/galaxies.png differ diff --git a/hypr/theme/walls/galaxy-2.png b/hypr/theme/walls/galaxy-2.png new file mode 100644 index 0000000..f4febf1 Binary files /dev/null and b/hypr/theme/walls/galaxy-2.png differ diff --git a/hypr/theme/walls/galaxy-3.png b/hypr/theme/walls/galaxy-3.png new file mode 100644 index 0000000..b39f11e Binary files /dev/null and b/hypr/theme/walls/galaxy-3.png differ diff --git a/hypr/theme/walls/galaxy-waves.jpg b/hypr/theme/walls/galaxy-waves.jpg new file mode 100644 index 0000000..4f52c59 Binary files /dev/null and b/hypr/theme/walls/galaxy-waves.jpg differ diff --git a/hypr/theme/walls/galaxy.png b/hypr/theme/walls/galaxy.png new file mode 100644 index 0000000..3b4da6d Binary files /dev/null and b/hypr/theme/walls/galaxy.png differ diff --git a/hypr/theme/walls/girl.png b/hypr/theme/walls/girl.png new file mode 100644 index 0000000..b226969 Binary files /dev/null and b/hypr/theme/walls/girl.png differ diff --git a/hypr/theme/walls/glass-room.png b/hypr/theme/walls/glass-room.png new file mode 100644 index 0000000..358b156 Binary files /dev/null and b/hypr/theme/walls/glass-room.png differ diff --git a/hypr/theme/walls/glitch.png b/hypr/theme/walls/glitch.png new file mode 100644 index 0000000..d6fb169 Binary files /dev/null and b/hypr/theme/walls/glitch.png differ diff --git a/hypr/theme/walls/haunted-house.jpg b/hypr/theme/walls/haunted-house.jpg new file mode 100644 index 0000000..47dc6ec Binary files /dev/null and b/hypr/theme/walls/haunted-house.jpg differ diff --git a/hypr/theme/walls/hollow-knight-2.jpg b/hypr/theme/walls/hollow-knight-2.jpg new file mode 100644 index 0000000..000d06a Binary files /dev/null and b/hypr/theme/walls/hollow-knight-2.jpg differ diff --git a/hypr/theme/walls/hollow-knight-3.png b/hypr/theme/walls/hollow-knight-3.png new file mode 100644 index 0000000..225f5db Binary files /dev/null and b/hypr/theme/walls/hollow-knight-3.png differ diff --git a/hypr/theme/walls/hollow-knight.jpg b/hypr/theme/walls/hollow-knight.jpg new file mode 100644 index 0000000..0c28daf Binary files /dev/null and b/hypr/theme/walls/hollow-knight.jpg differ diff --git a/hypr/theme/walls/hyprland-logo.png b/hypr/theme/walls/hyprland-logo.png new file mode 100644 index 0000000..b648a60 Binary files /dev/null and b/hypr/theme/walls/hyprland-logo.png differ diff --git a/hypr/theme/walls/japan-city.png b/hypr/theme/walls/japan-city.png new file mode 100644 index 0000000..34a513c Binary files /dev/null and b/hypr/theme/walls/japan-city.png differ diff --git a/hypr/theme/walls/keyboards.png b/hypr/theme/walls/keyboards.png new file mode 100644 index 0000000..35f4eea Binary files /dev/null and b/hypr/theme/walls/keyboards.png differ diff --git a/hypr/theme/walls/kurz.png b/hypr/theme/walls/kurz.png new file mode 100755 index 0000000..994f65a Binary files /dev/null and b/hypr/theme/walls/kurz.png differ diff --git a/hypr/theme/walls/lake.png b/hypr/theme/walls/lake.png new file mode 100644 index 0000000..6774c36 Binary files /dev/null and b/hypr/theme/walls/lake.png differ diff --git a/hypr/theme/walls/lifeform.png b/hypr/theme/walls/lifeform.png new file mode 100644 index 0000000..ca96742 Binary files /dev/null and b/hypr/theme/walls/lifeform.png differ diff --git a/hypr/theme/walls/lofi-girl-2.jpg b/hypr/theme/walls/lofi-girl-2.jpg new file mode 100644 index 0000000..8c64810 Binary files /dev/null and b/hypr/theme/walls/lofi-girl-2.jpg differ diff --git a/hypr/theme/walls/lofi-girl.jpg b/hypr/theme/walls/lofi-girl.jpg new file mode 100644 index 0000000..07cc85f Binary files /dev/null and b/hypr/theme/walls/lofi-girl.jpg differ diff --git a/hypr/theme/walls/marine-tunnel.jpg b/hypr/theme/walls/marine-tunnel.jpg new file mode 100644 index 0000000..742cbd6 Binary files /dev/null and b/hypr/theme/walls/marine-tunnel.jpg differ diff --git a/hypr/theme/walls/maze.png b/hypr/theme/walls/maze.png new file mode 100644 index 0000000..56beccc Binary files /dev/null and b/hypr/theme/walls/maze.png differ diff --git a/hypr/theme/walls/megumin.png b/hypr/theme/walls/megumin.png new file mode 100644 index 0000000..60f80d1 Binary files /dev/null and b/hypr/theme/walls/megumin.png differ diff --git a/hypr/theme/walls/montains.png b/hypr/theme/walls/montains.png new file mode 100644 index 0000000..b24666f Binary files /dev/null and b/hypr/theme/walls/montains.png differ diff --git a/hypr/theme/walls/nature.png b/hypr/theme/walls/nature.png new file mode 100644 index 0000000..17ae397 Binary files /dev/null and b/hypr/theme/walls/nature.png differ diff --git a/hypr/theme/walls/nebula.png b/hypr/theme/walls/nebula.png new file mode 100644 index 0000000..161decc Binary files /dev/null and b/hypr/theme/walls/nebula.png differ diff --git a/hypr/theme/walls/neon-dim.png b/hypr/theme/walls/neon-dim.png new file mode 100644 index 0000000..f2402b1 Binary files /dev/null and b/hypr/theme/walls/neon-dim.png differ diff --git a/hypr/theme/walls/neon-man.png b/hypr/theme/walls/neon-man.png new file mode 100644 index 0000000..143a06d Binary files /dev/null and b/hypr/theme/walls/neon-man.png differ diff --git a/hypr/theme/walls/neon.png b/hypr/theme/walls/neon.png new file mode 100644 index 0000000..8ba82f2 Binary files /dev/null and b/hypr/theme/walls/neon.png differ diff --git a/hypr/theme/walls/night-city.png b/hypr/theme/walls/night-city.png new file mode 100644 index 0000000..5ab8201 Binary files /dev/null and b/hypr/theme/walls/night-city.png differ diff --git a/hypr/theme/walls/night-forest-path.png b/hypr/theme/walls/night-forest-path.png new file mode 100644 index 0000000..3595400 Binary files /dev/null and b/hypr/theme/walls/night-forest-path.png differ diff --git a/hypr/theme/walls/night-lake.jpg b/hypr/theme/walls/night-lake.jpg new file mode 100644 index 0000000..71c5120 Binary files /dev/null and b/hypr/theme/walls/night-lake.jpg differ diff --git a/hypr/theme/walls/night-landscape.png b/hypr/theme/walls/night-landscape.png new file mode 100644 index 0000000..5bf1a86 Binary files /dev/null and b/hypr/theme/walls/night-landscape.png differ diff --git a/hypr/theme/walls/night-street.jpg b/hypr/theme/walls/night-street.jpg new file mode 100644 index 0000000..02958ee Binary files /dev/null and b/hypr/theme/walls/night-street.jpg differ diff --git a/hypr/theme/walls/old-computer.png b/hypr/theme/walls/old-computer.png new file mode 100644 index 0000000..4bdd821 Binary files /dev/null and b/hypr/theme/walls/old-computer.png differ diff --git a/hypr/theme/walls/puffy-stars.jpg b/hypr/theme/walls/puffy-stars.jpg new file mode 100644 index 0000000..f06e260 Binary files /dev/null and b/hypr/theme/walls/puffy-stars.jpg differ diff --git a/hypr/theme/walls/purpled-night.jpg b/hypr/theme/walls/purpled-night.jpg new file mode 100644 index 0000000..0b5f0d5 Binary files /dev/null and b/hypr/theme/walls/purpled-night.jpg differ diff --git a/hypr/theme/walls/quasar.png b/hypr/theme/walls/quasar.png new file mode 100644 index 0000000..dbf590b Binary files /dev/null and b/hypr/theme/walls/quasar.png differ diff --git a/hypr/theme/walls/reaper.png b/hypr/theme/walls/reaper.png new file mode 100644 index 0000000..5ff717e Binary files /dev/null and b/hypr/theme/walls/reaper.png differ diff --git a/hypr/theme/walls/relax.jpg b/hypr/theme/walls/relax.jpg new file mode 100644 index 0000000..8609177 Binary files /dev/null and b/hypr/theme/walls/relax.jpg differ diff --git a/hypr/theme/walls/retro-mario.png b/hypr/theme/walls/retro-mario.png new file mode 100644 index 0000000..d964596 Binary files /dev/null and b/hypr/theme/walls/retro-mario.png differ diff --git a/hypr/theme/walls/s4vitar.png b/hypr/theme/walls/s4vitar.png new file mode 100644 index 0000000..e3719cf Binary files /dev/null and b/hypr/theme/walls/s4vitar.png differ diff --git a/hypr/theme/walls/sakura-gate.jpg b/hypr/theme/walls/sakura-gate.jpg new file mode 100644 index 0000000..88492bc Binary files /dev/null and b/hypr/theme/walls/sakura-gate.jpg differ diff --git a/hypr/theme/walls/sakura.png b/hypr/theme/walls/sakura.png new file mode 100644 index 0000000..e11b932 Binary files /dev/null and b/hypr/theme/walls/sakura.png differ diff --git a/hypr/theme/walls/samurai-geralt.png b/hypr/theme/walls/samurai-geralt.png new file mode 100644 index 0000000..9125b04 Binary files /dev/null and b/hypr/theme/walls/samurai-geralt.png differ diff --git a/hypr/theme/walls/saturn.jpg b/hypr/theme/walls/saturn.jpg new file mode 100644 index 0000000..6293cfe Binary files /dev/null and b/hypr/theme/walls/saturn.jpg differ diff --git a/hypr/theme/walls/scenery.png b/hypr/theme/walls/scenery.png new file mode 100644 index 0000000..ca5e2e5 Binary files /dev/null and b/hypr/theme/walls/scenery.png differ diff --git a/hypr/theme/walls/ship.png b/hypr/theme/walls/ship.png new file mode 100644 index 0000000..16b548d Binary files /dev/null and b/hypr/theme/walls/ship.png differ diff --git a/hypr/theme/walls/shore.png b/hypr/theme/walls/shore.png new file mode 100644 index 0000000..8a60693 Binary files /dev/null and b/hypr/theme/walls/shore.png differ diff --git a/hypr/theme/walls/sky.png b/hypr/theme/walls/sky.png new file mode 100644 index 0000000..36ecb9d Binary files /dev/null and b/hypr/theme/walls/sky.png differ diff --git a/hypr/theme/walls/solar-system.png b/hypr/theme/walls/solar-system.png new file mode 100644 index 0000000..2c16844 Binary files /dev/null and b/hypr/theme/walls/solar-system.png differ diff --git a/hypr/theme/walls/souls.png b/hypr/theme/walls/souls.png new file mode 100644 index 0000000..db7414d Binary files /dev/null and b/hypr/theme/walls/souls.png differ diff --git a/hypr/theme/walls/space-2.jpg b/hypr/theme/walls/space-2.jpg new file mode 100644 index 0000000..5189e48 Binary files /dev/null and b/hypr/theme/walls/space-2.jpg differ diff --git a/hypr/theme/walls/space.jpg b/hypr/theme/walls/space.jpg new file mode 100644 index 0000000..82b89e0 Binary files /dev/null and b/hypr/theme/walls/space.jpg differ diff --git a/hypr/theme/walls/sparkles.png b/hypr/theme/walls/sparkles.png new file mode 100644 index 0000000..6bd1c86 Binary files /dev/null and b/hypr/theme/walls/sparkles.png differ diff --git a/hypr/theme/walls/spill.jpg b/hypr/theme/walls/spill.jpg new file mode 100644 index 0000000..795af81 Binary files /dev/null and b/hypr/theme/walls/spill.jpg differ diff --git a/hypr/theme/walls/stars.png b/hypr/theme/walls/stars.png new file mode 100644 index 0000000..397e532 Binary files /dev/null and b/hypr/theme/walls/stars.png differ diff --git a/hypr/theme/walls/street.jpg b/hypr/theme/walls/street.jpg new file mode 100755 index 0000000..e32ba97 Binary files /dev/null and b/hypr/theme/walls/street.jpg differ diff --git a/hypr/theme/walls/swirls-2.jpg b/hypr/theme/walls/swirls-2.jpg new file mode 100644 index 0000000..54f800a Binary files /dev/null and b/hypr/theme/walls/swirls-2.jpg differ diff --git a/hypr/theme/walls/swirls-3.jpg b/hypr/theme/walls/swirls-3.jpg new file mode 100644 index 0000000..0ba275e Binary files /dev/null and b/hypr/theme/walls/swirls-3.jpg differ diff --git a/hypr/theme/walls/swirls.png b/hypr/theme/walls/swirls.png new file mode 100644 index 0000000..5c18f47 Binary files /dev/null and b/hypr/theme/walls/swirls.png differ diff --git a/hypr/theme/walls/switch-2.jpg b/hypr/theme/walls/switch-2.jpg new file mode 100644 index 0000000..70277da Binary files /dev/null and b/hypr/theme/walls/switch-2.jpg differ diff --git a/hypr/theme/walls/switch.png b/hypr/theme/walls/switch.png new file mode 100644 index 0000000..b98ddcf Binary files /dev/null and b/hypr/theme/walls/switch.png differ diff --git a/hypr/theme/walls/sword.jpg b/hypr/theme/walls/sword.jpg new file mode 100644 index 0000000..693f5a0 Binary files /dev/null and b/hypr/theme/walls/sword.jpg differ diff --git a/hypr/theme/walls/tokyo.png b/hypr/theme/walls/tokyo.png new file mode 100644 index 0000000..ca71ed5 Binary files /dev/null and b/hypr/theme/walls/tokyo.png differ diff --git a/hypr/theme/walls/trigonometry.png b/hypr/theme/walls/trigonometry.png new file mode 100644 index 0000000..63302a1 Binary files /dev/null and b/hypr/theme/walls/trigonometry.png differ diff --git a/hypr/theme/walls/underwater.png b/hypr/theme/walls/underwater.png new file mode 100644 index 0000000..9bf2b67 Binary files /dev/null and b/hypr/theme/walls/underwater.png differ diff --git a/hypr/theme/walls/voxel-houses-monochrome.png b/hypr/theme/walls/voxel-houses-monochrome.png new file mode 100644 index 0000000..02f99ae Binary files /dev/null and b/hypr/theme/walls/voxel-houses-monochrome.png differ diff --git a/hypr/theme/walls/waterfall.png b/hypr/theme/walls/waterfall.png new file mode 100644 index 0000000..219c87c Binary files /dev/null and b/hypr/theme/walls/waterfall.png differ diff --git a/hypr/theme/walls/window-room.png b/hypr/theme/walls/window-room.png new file mode 100644 index 0000000..36183bc Binary files /dev/null and b/hypr/theme/walls/window-room.png differ diff --git a/hypr/theme/walls/windows-error.jpg b/hypr/theme/walls/windows-error.jpg new file mode 100644 index 0000000..ce509a2 Binary files /dev/null and b/hypr/theme/walls/windows-error.jpg differ diff --git a/hypr/theme/walls/yohoho.jpg b/hypr/theme/walls/yohoho.jpg new file mode 100644 index 0000000..39af67e Binary files /dev/null and b/hypr/theme/walls/yohoho.jpg differ diff --git a/kitty/.github/README.md b/kitty/.github/README.md new file mode 100644 index 0000000..affa9d5 --- /dev/null +++ b/kitty/.github/README.md @@ -0,0 +1,3 @@ +
+ +
diff --git a/kitty/.github/title.png b/kitty/.github/title.png new file mode 100644 index 0000000..48198f4 Binary files /dev/null and b/kitty/.github/title.png differ diff --git a/kitty/kitty-open-helper.sh b/kitty/kitty-open-helper.sh new file mode 100644 index 0000000..ecfeaa3 --- /dev/null +++ b/kitty/kitty-open-helper.sh @@ -0,0 +1,3 @@ +#!/bin/sh +[ "$1" = @selection ] && set -- . +xdg-open "$1" diff --git a/kitty/kitty.conf b/kitty/kitty.conf new file mode 100644 index 0000000..2bfc610 --- /dev/null +++ b/kitty/kitty.conf @@ -0,0 +1,142 @@ +# Font + +font_family MesloLGS NF Regular +bold_font MesloLGS NF Bold +italic_font MesloLGS NF Italic +bold_italic_font MesloLGS NF Medium Italic +font_size 10.5 +modify_font cell_height 122% + +# Theme +include themes/catppuccin-macchiato.conf + +# Window layout +enabled_layouts * +window_resize_step_cells 2 +window_resize_step_lines 2 +window_border_width 1pt +window_margin_width 0 +single_window_margin_width -1 +window_padding_width 12 + +# Tab bar +tab_bar_edge bottom +tab_bar_margin_width 0.0 +tab_bar_margin_height 0.0 0.0 +tab_bar_style powerline +tab_bar_align left +tab_bar_min_tabs 2 +tab_switch_strategy previous +tab_fade 0.25 0.5 0.75 1 +tab_separator " ┇" +tab_powerline_style slanted +tab_activity_symbol none +tab_title_template "{f'{title[:30]}…' if title.rindex(title[-1]) + 1 > 30 else (title.center(6) if (title.rindex(title[-1]) + 1) % 2 == 0 else title.center(5))}" +active_tab_title_template none +active_tab_font_style bold-italic +inactive_tab_font_style normal + +# Background +# background_opacity 0.95 + +# Other +shell zsh +editor vim +allow_remote_control yes +listen_on unix:@mykitty +allow_hyperlinks yes +shell_integration enabled +confirm_os_window_close 0 +cursor_trail 0 +cursor_trail_decay 0.1 0.2 +cursor_trail_start_threshold 4 + + +# Keybindings +kitty_mod ctrl+shift + +# Scrolling +map kitty_mod+up scroll_line_up +map opt+cmd+page_up scroll_line_up +map cmd+up scroll_line_up + +map kitty_mod+down scroll_line_down +map opt+cmd+page_down scroll_line_down +map cmd+down scroll_line_down + +map kitty_mod+k scroll_page_up +map cmd+page_up scroll_page_up + +map kitty_mod+j scroll_page_down +map cmd+page_down scroll_page_down + +map kitty_mod+home scroll_home +map cmd+home scroll_home + +map kitty_mod+end scroll_end +map cmd+end scroll_end + +map kitty_mod+z scroll_to_prompt -1 + +# Window management +map kitty_mod+enter new_window +map cmd+enter new_window + +map ctrl+alt+enter launch --cwd=current + +map kitty_mod+] next_window +map kitty_mod+[ previous_window + +map kitty_mod+f move_window_forward +map kitty_mod+b move_window_backward + +# Tab management +map kitty_mod+right next_tab +map shift+cmd+] next_tab +map ctrl+tab next_tab + +map kitty_mod+left previous_tab +map shift+cmd+[ previous_tab +map ctrl+shift+tab previous_tab + +map kitty_mod+t new_tab +map cmd+t new_tab + +map kitty_mod+q close_tab +map cmd+w close_tab + +map kitty_mod+. move_tab_forward +map kitty_mod+, move_tab_backward + +map kitty_mod+n set_tab_title + +# Layout management +map kitty_mod+l next_layout + +# Font sizes +map kitty_mod+equal change_font_size all +1.0 +map kitty_mod+plus change_font_size all +1.0 +map kitty_mod+kp_add change_font_size all +1.0 +map cmd+plus change_font_size all +1.0 +map cmd+equal change_font_size all +1.0 +map shift+cmd+equal change_font_size all +1.0 + +map kitty_mod+minus change_font_size all -1.0 +map kitty_mod+kp_subtract change_font_size all -1.0 +map cmd+minus change_font_size all -1.0 +map shift+cmd+minus change_font_size all -1.0 + +map kitty_mod+backspace change_font_size all 0 +map cmd+0 change_font_size all 0 + + +# Others +map kitty_mod+e launch --type=background --cwd=current sh -c 'hyprctl dispatch exec "[float; size 60% 60%; center 1] xdg-open" $(pwd)' +map kitty_mod+u launch --type=background --cwd=current sh -c 'vscodium $(pwd)' +map kitty_mod+y launch --type=overlay-main --cwd=current yazi + +map kitty_mod+f5 load_config_file +action_alias kitty_scrollback_nvim kitten ~/.local/share/nvim/lazy/kitty-scrollback.nvim/python/kitty_scrollback_nvim.py +# action_alias kitty_scrollback_nvim kitten ~/.local/share/nvim/lazy/kitty-scrollback.nvim/python/kitty_scrollback_nvim.py --nvim-args --clean +map kitty_mod+h kitty_scrollback_nvim +map kitty_mod+g kitty_scrollback_nvim --config ksb_builtin_last_cmd_output diff --git a/kitty/neighboring_window.py b/kitty/neighboring_window.py new file mode 100644 index 0000000..91db694 --- /dev/null +++ b/kitty/neighboring_window.py @@ -0,0 +1,35 @@ +from kitty.key_encoding import KeyEvent, parse_shortcut +from kittens.tui.handler import result_handler + + +def main(): + pass + + +def encode_key_mapping(window, key_mapping): + mods, key = parse_shortcut(key_mapping) + event = KeyEvent( + mods=mods, + key=key, + shift=bool(mods & 1), + alt=bool(mods & 2), + ctrl=bool(mods & 4), + super=bool(mods & 8), + hyper=bool(mods & 16), + meta=bool(mods & 32), + ).as_window_system_event() + + return window.encoded_key(event) + + +@result_handler(no_ui=True) +def handle_result(args, result, target_window_id, boss): + window = boss.window_id_map.get(target_window_id) + + cmd = window.child.foreground_cmdline[0] + if cmd == 'tmux': + keymap = args[2] + encoded = encode_key_mapping(window, keymap) + window.write_to_child(encoded) + else: + boss.active_tab.neighboring_window(args[1]) diff --git a/kitty/open-actions.conf b/kitty/open-actions.conf new file mode 100644 index 0000000..4fddffe --- /dev/null +++ b/kitty/open-actions.conf @@ -0,0 +1,31 @@ +# Directories +protocol file +mime inode/directory +xdg-open --type=os-window --cwd $FILE_PATH + +# Files +protocol file +mime text/* +action launch --type=overlay $EDITOR $FILE_PATH + +# Images +protocol file +mime image/* +xdg-open $FILE_PATH + +# SSH Urls +protocol ssh +action launch --type=os-window ssh $URL + +# Executables +action launch --hold --type=os-window $FILE_PATH + +# Shell files +protocol file +ext fish,bash,zsh +action launch --hold --type=os-window kitty +shebang $FILE_PATH __ext__ + +# Scripts +protocol file +ext sh,command,tool +action launch --hold --type=os-window kitty +shebang $FILE_PATH $SHELL diff --git a/kitty/pass_keys.py b/kitty/pass_keys.py new file mode 100644 index 0000000..2d09f4c --- /dev/null +++ b/kitty/pass_keys.py @@ -0,0 +1,106 @@ +import re + +from kittens.tui.handler import result_handler +from kitty.key_encoding import KeyEvent, parse_shortcut + + +def is_window_vim(window, vim_id): + from kittens.tui.loop import debug + debug(vim_id) + fp = window.child.foreground_processes + return any(re.search(vim_id, p['cmdline'][0] if len(p['cmdline']) else '', re.I) for p in fp) + + +def encode_key_mapping(window, key_mapping): + mods, key = parse_shortcut(key_mapping) + event = KeyEvent( + mods=mods, + key=key, + shift=bool(mods & 1), + alt=bool(mods & 2), + ctrl=bool(mods & 4), + super=bool(mods & 8), + hyper=bool(mods & 16), + meta=bool(mods & 32), + ).as_window_system_event() + + return window.encoded_key(event) + +def relative_resize_window(direction, amount, target_window_id, boss): + window = boss.window_id_map.get(target_window_id) + if window is None: + return + + neighbors = boss.active_tab.current_layout.neighbors_for_window(window, boss.active_tab.windows) + current_window_id = boss.active_tab.active_window + + left_neighbors = neighbors.get('left') + right_neighbors = neighbors.get('right') + top_neighbors = neighbors.get('top') + bottom_neighbors = neighbors.get('bottom') + + # has a neighbor on both sides + if direction == 'left' and (left_neighbors and right_neighbors): + boss.active_tab.resize_window('narrower', amount) + # only has left neighbor + elif direction == 'left' and left_neighbors: + boss.active_tab.resize_window('wider', amount) + # only has right neighbor + elif direction == 'left' and right_neighbors: + boss.active_tab.resize_window('narrower', amount) + + # has a neighbor on both sides + elif direction == 'right' and (left_neighbors and right_neighbors): + boss.active_tab.resize_window('wider', amount) + # only has left neighbor + elif direction == 'right' and left_neighbors: + boss.active_tab.resize_window('narrower', amount) + # only has right neighbor + elif direction == 'right' and right_neighbors: + boss.active_tab.resize_window('wider', amount) + + # has a neighbor above and below + elif direction == 'up' and (top_neighbors and bottom_neighbors): + boss.active_tab.resize_window('shorter', amount) + # only has top neighbor + elif direction == 'up' and top_neighbors: + boss.active_tab.resize_window('taller', amount) + # only has bottom neighbor + elif direction == 'up' and bottom_neighbors: + boss.active_tab.resize_window('shorter', amount) + + # has a neighbor above and below + elif direction == 'down' and (top_neighbors and bottom_neighbors): + boss.active_tab.resize_window('taller', amount) + # only has top neighbor + elif direction == 'down' and top_neighbors: + boss.active_tab.resize_window('shorter', amount) + # only has bottom neighbor + elif direction == 'down' and bottom_neighbors: + boss.active_tab.resize_window('taller', amount) + + +def main(): + pass + + +@result_handler(no_ui=True) +def handle_result(args, result, target_window_id, boss): + window = boss.window_id_map.get(target_window_id) + action = args[1] + direction = args[2] + key_mapping = args[3] if action == 'neighboring_window' else args[4] + amount = int(args[3]) if action == 'relative_resize' else None + vim_id_idx = 4 if action == 'neighboring_window' else 5 + vim_id = args[vim_id_idx] if len(args) > vim_id_idx else "n?vim" + + if window is None: + return + if is_window_vim(window, vim_id): + for keymap in key_mapping.split(">"): + encoded = encode_key_mapping(window, keymap) + window.write_to_child(encoded) + elif action == 'neighboring_window': + boss.active_tab.neighboring_window(direction) + elif action == 'relative_resize': + relative_resize_window(direction, amount, target_window_id, boss) diff --git a/kitty/relative_resize.py b/kitty/relative_resize.py new file mode 100644 index 0000000..75dfd8b --- /dev/null +++ b/kitty/relative_resize.py @@ -0,0 +1,94 @@ +# Based on MIT licensed code at https://github.com/chancez/dotfiles/blob/badc69d3895a6a942285amount26b8c372a55d77533eamount/kitty/.config/kitty/relative_resize.py +from kittens.tui.handler import result_handler +from kitty.key_encoding import KeyEvent, parse_shortcut + + +def encode_key_mapping(window, key_mapping): + mods, key = parse_shortcut(key_mapping) + event = KeyEvent( + mods=mods, + key=key, + shift=bool(mods & 1), + alt=bool(mods & 2), + ctrl=bool(mods & 4), + super=bool(mods & 8), + hyper=bool(mods & 16), + meta=bool(mods & 32), + ).as_window_system_event() + + return window.encoded_key(event) + + +def main(args): + pass + + +def relative_resize_window(direction, amount, target_window_id, boss): + window = boss.window_id_map.get(target_window_id) + if window is None: + return + + neighbors = boss.active_tab.current_layout.neighbors_for_window( + window, boss.active_tab.windows + ) + current_window_id = boss.active_tab.active_window + + left_neighbors = neighbors.get('left') + right_neighbors = neighbors.get('right') + top_neighbors = neighbors.get('top') + bottom_neighbors = neighbors.get('bottom') + + # has a neighbor on both sides + if direction == 'left' and (left_neighbors and right_neighbors): + boss.active_tab.resize_window('narrower', amount) + # only has left neighbor + elif direction == 'left' and left_neighbors: + boss.active_tab.resize_window('wider', amount) + # only has right neighbor + elif direction == 'left' and right_neighbors: + boss.active_tab.resize_window('narrower', amount) + + # has a neighbor on both sides + elif direction == 'right' and (left_neighbors and right_neighbors): + boss.active_tab.resize_window('wider', amount) + # only has left neighbor + elif direction == 'right' and left_neighbors: + boss.active_tab.resize_window('narrower', amount) + # only has right neighbor + elif direction == 'right' and right_neighbors: + boss.active_tab.resize_window('wider', amount) + + # has a neighbor above and below + elif direction == 'up' and (top_neighbors and bottom_neighbors): + boss.active_tab.resize_window('shorter', amount) + # only has top neighbor + elif direction == 'up' and top_neighbors: + boss.active_tab.resize_window('taller', amount) + # only has bottom neighbor + elif direction == 'up' and bottom_neighbors: + boss.active_tab.resize_window('shorter', amount) + + # has a neighbor above and below + elif direction == 'down' and (top_neighbors and bottom_neighbors): + boss.active_tab.resize_window('taller', amount) + # only has top neighbor + elif direction == 'down' and top_neighbors: + boss.active_tab.resize_window('shorter', amount) + # only has bottom neighbor + elif direction == 'down' and bottom_neighbors: + boss.active_tab.resize_window('taller', amount) + + +@result_handler(no_ui=True) +def handle_result(args, result, target_window_id, boss): + direction = args[1] + amount = int(args[2]) + window = boss.window_id_map.get(target_window_id) + + cmd = window.child.foreground_cmdline[0] + if cmd == 'tmux': + keymap = args[3] + encoded = encode_key_mapping(window, keymap) + window.write_to_child(encoded) + else: + relative_resize_window(direction, amount, target_window_id, boss) diff --git a/kitty/scroll_mark.py b/kitty/scroll_mark.py new file mode 100644 index 0000000..0193b20 --- /dev/null +++ b/kitty/scroll_mark.py @@ -0,0 +1,18 @@ +from kittens.tui.handler import result_handler +from kitty.boss import Boss + + +def main(args: list[str]) -> None: + pass + + +@result_handler(no_ui=True) +def handle_result( + args: list[str], answer: str, target_window_id: int, boss: Boss +) -> None: + w = boss.window_id_map.get(target_window_id) + if w is not None: + if len(args) > 1 and args[1] != "prev": + w.scroll_to_mark(prev=False) + else: + w.scroll_to_mark() diff --git a/kitty/split_window.py b/kitty/split_window.py new file mode 100644 index 0000000..24d6cd6 --- /dev/null +++ b/kitty/split_window.py @@ -0,0 +1,49 @@ +from kittens.tui.handler import result_handler +from kitty.key_encoding import KeyEvent, parse_shortcut + + +def main(args): + pass + + +def encode_key_mapping(window, key_mapping): + mods, key = parse_shortcut(key_mapping) + event = KeyEvent( + mods=mods, + key=key, + shift=bool(mods & 1), + alt=bool(mods & 2), + ctrl=bool(mods & 4), + super=bool(mods & 8), + hyper=bool(mods & 16), + meta=bool(mods & 32), + ).as_window_system_event() + + return window.encoded_key(event) + + +def split_window(boss, direction): + if direction == 'up' or direction == 'down': + boss.launch('--cwd=current', '--location=hsplit') + else: + boss.launch('--cwd=current', '--location=vsplit') + + if direction == 'up' or direction == 'left': + boss.active_tab.move_window(direction) + + +@result_handler(no_ui=True) +def handle_result(args, result, target_window_id, boss): + window = boss.window_id_map.get(target_window_id) + + if window is None: + return + + direction = args[1] + cmd = window.child.foreground_cmdline[0] + if cmd == 'tmux': + keymap = args[2] + encoded = encode_key_mapping(window, keymap) + window.write_to_child(encoded) + else: + split_window(boss, direction) \ No newline at end of file diff --git a/kitty/themes/catppuccin-macchiato.conf b/kitty/themes/catppuccin-macchiato.conf new file mode 100644 index 0000000..f52401d --- /dev/null +++ b/kitty/themes/catppuccin-macchiato.conf @@ -0,0 +1,80 @@ +# vim:ft=kitty + +## name: Catppuccin-Macchiato +## author: Pocco81 (https://github.com/Pocco81) +## license: MIT +## upstream: https://github.com/catppuccin/kitty/blob/main/macchiato.conf +## blurb: Soothing pastel theme for the high-spirited! + + + +# The basic colors +foreground #CAD3F5 +background #24273A +selection_foreground #24273A +selection_background #F4DBD6 + +# Cursor colors +cursor #F4DBD6 +cursor_text_color #24273A + +# URL underline color when hovering with mouse +url_color #F4DBD6 + +# Kitty window border colors +active_border_color #B7BDF8 +inactive_border_color #6E738D +bell_border_color #EED49F + +# OS Window titlebar colors +wayland_titlebar_color system +macos_titlebar_color system + +# Tab bar colors +active_tab_foreground #181926 +active_tab_background #B7BDF8 +inactive_tab_foreground #CAD3F5 +inactive_tab_background #1E2030 +tab_bar_background #181926 + +# Colors for marks (marked text in the terminal) +mark1_foreground #24273A +mark1_background #B7BDF8 +mark2_foreground #24273A +mark2_background #C6A0F6 +mark3_foreground #24273A +mark3_background #7DC4E4 + +# The 16 terminal colors + +# black +color0 #494D64 +color8 #5B6078 + +# red +color1 #ED8796 +color9 #ED8796 + +# green +color2 #A6DA95 +color10 #A6DA95 + +# yellow +color3 #EED49F +color11 #EED49F + +# blue +color4 #8AADF4 +color12 #8AADF4 + +# magenta +color5 #F5BDE6 +color13 #F5BDE6 + +# cyan +color6 #8BD5CA +color14 #8BD5CA + +# white +color7 #B8C0E0 +color15 #A5ADCB diff --git a/local_bin/asciiquarium b/local_bin/asciiquarium new file mode 100755 index 0000000..ef7730b --- /dev/null +++ b/local_bin/asciiquarium @@ -0,0 +1,2457 @@ +#!/usr/bin/env perl +# +############################################################################# +# +# Asciiquarium - An aquarium/sea animation in ASCII art +# +# Enjoy the mysteries of the sea from the safety of your own terminal! +# +############################################################################# +# Original Author: +# Kirk Baucom +# +# Contributors: +# Joan Stark: https://web.archive.org/web/20140722110449/http://www.geocities.com/SoHo/7373/ +# most of the ASCII art +# +# Claudio Matsuoka +# improved marine biodiversity (backported from the Asciiquarium Live +# Wallpaper for Android) +# https://market.android.com/details?id=org.helllabs.android.asciiquarium +# +# driechers: https://github.com/driechers +# contributed the yellow submarine and re-introduction of elements by +# Kirk Baucom that apparently were lost +# (https://github.com/cmatsuoka/asciiquarium/pull/6, +# https://github.com/cmatsuoka/asciiquarium/pull/5) +# +# Carl Pilcher: +# ASCII art for the submarine https://ascii.co.uk/art/submarine +# +# robert1003: https://github.com/robert1003 +# contributed the swordfish implementation +# (https://github.com/cmatsuoka/asciiquarium/pull/12) +# +# ctr: (?) +# ASCII art for the swordfish https://ascii.co.uk/art/fish +# +# polettix: https://github.com/polettix +# assembling contributions +# (https://github.com/polettix/asciiquarium) +# +# UndeadLeech: (?) +# background color and transparency patch +# (https://github.com/rwxrob/dot/blob/2c4b63f77dcb235be4e218cd8febc5533420ee54/scripts/fishies#L110) +# +# kronos-chenchang: https://github.com/kronos-chenchang +# castle door can now open, swordfish fix +# (https://github.com/kronos-chenchang/asciiquarium) +# +# Phani Rithvij: https://gist.github.com/phanirithvij +# screensaver mode +# (https://gist.github.com/nothub/91ff81bd945eb8f1e6af08492a13ff75?permalink_comment_id=4476043#gistcomment-4476043) +# +############################################################################# +# License: +# +# Copyright (C) 2013 Kirk Baucom (kbaucom@schizoid.com) +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +############################################################################# + +use Term::Animation 2.0; +use Term::Animation::Entity; +use Data::Dumper; +use Curses; +use Getopt::Long qw(GetOptions); +use strict; +use warnings; + +my $version = "1.2"; +my $help_message = 'Asciiquarium is an aquarium/sea animation in ASCII art. +Enjoy the mysteries of the sea from the safety of your own terminal! + +Options: + -c --classic Only show species from Asciiquarium 1.0 + -t --transparent Transparent background + -s --screensaver Exit on any keypress + -h --help Print help and exit + -v --version Print version and exit + +Hotkeys: + q quit + r redraw + p pause +'; + +my $new_fish = 1; +my $new_monster = 1; + +my $classic = 0; +my $transparent = 0; +my $screensaver = 0; +my $print_help = 0; +my $print_version = 0; + +GetOptions( + 'classic' => \$classic, + 'transparent' => \$transparent, + 'screensaver' => \$screensaver, + 'help' => \$print_help, + 'version' => \$print_version, +) or die "$help_message"; + +if ($print_help) { + print $help_message; + exit; +} + +if ($print_version) { + print "Asciiquarium $version\n"; + exit; +} + +if ($classic) { + $new_fish = 0; + $new_monster = 0; +} + +my @random_objects = init_random_objects(); + +# the Z depth at which certain items occur +my %depth = ( + # no gui yet + guiText => 0, + gui => 1, + + # under water + shark => 2, + fish_start => 3, + fish_end => 20, + seaweed => 21, + castle => 22, + + # waterline + water_line3 => 2, + water_gap3 => 3, + water_line2 => 4, + water_gap2 => 5, + water_line1 => 6, + water_gap1 => 7, + water_line0 => 8, + water_gap0 => 9, +); + +main(); + +####################### MAIN ####################### + +sub main { + + my $anim = Term::Animation->new(); + + # set the wait time for getch + halfdelay(1); + #nodelay(1); + + $anim->color(1); + if ($transparent) { + use_default_colors(); + my $cid = 1; + for my $f ('WHITE', 'RED', 'GREEN', 'BLUE', 'CYAN', 'MAGENTA', 'YELLOW', 'BLACK') { + init_pair($cid, eval "Curses::COLOR_$f", -1); + $cid++; + } + } + + my $start_time = time; + my $paused = 0; + while (1) { + + add_environment($anim); + add_castle($anim); + add_all_seaweed($anim); + add_all_fish($anim); + random_object(undef, $anim); + + $anim->redraw_screen(); + + my $nexttime = 0; + + while (1) { + my $in = lc(getch()); + + if ($in eq 'q') {quit();} # Exit + elsif ($in eq 'r' || $in eq KEY_RESIZE()) {last;} # Redraw (will recreate all objects) + elsif ($in eq 'p') {$paused = !$paused;} + elsif ($screensaver && $in ne '-1') {quit();} # Exit for any key (screensaver mode) + + $anim->animate() unless ($paused); + } + $anim->update_term_size(); + $anim->remove_all_entities(); + + } + +} + +sub add_environment { + my ($anim) = @_; + + my @water_line_segment = ( + q{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}, + q{^^^^ ^^^ ^^^ ^^^ ^^^^ }, + q{^^^^ ^^^^ ^^^ ^^ }, + q{^^ ^^^^ ^^^ ^^^^^^ } + ); + + # tile the segments so they stretch across the screen + my $segment_size = length($water_line_segment[0]); + my $segment_repeat = int($anim->width() / $segment_size) + 1; + foreach my $i (0 .. $#water_line_segment) { + $water_line_segment[$i] = $water_line_segment[$i] x $segment_repeat; + } + + foreach my $i (0 .. $#water_line_segment) { + $anim->new_entity( + name => "water_seg_$i", + type => "waterline", + shape => $water_line_segment[$i], + position => [ 0, $i + 5, $depth{'water_line' . $i} ], + default_color => 'cyan', + depth => 22, + physical => 1, + ); + } +} + +sub add_castle { + my ($anim) = @_; + my @castle_image = ( +q{ + T~~ + | + /^\ + / \ + _ _ _ / \ _ _ _ +[ ]_[ ]_[ ]/ _ _ \[ ]_[ ]_[ ] +|_=__-_ =_|_[ ]_[ ]_|_=-___-__| + | _- = | =_ = _ |= _= | + |= -[] |- = _ = |_-=_[] | + | =_ |= - ___ | =_ = | + |= []- |- /| |\ |=_ =[] | + |- =_ | =| | | | |- = - | + |_______|__|_|_|_|__|_______| +},q{ + T~~ + | + /^\ + / \ + _ _ _ / \ _ _ _ +[ ]_[ ]_[ ]/ _ _ \[ ]_[ ]_[ ] +|_=__-_ =_|_[ ]_[ ]_|_=-___-__| + | _- = | =_ = _ |= _= | + |= -[] |- = _ = |_-=_[] | + | =_ |= - ___ | =_ = | + |= []- |- /| |\ |=_ =[] | + |- =_ | =|_|_|_| |- = - | + |_______|__| |__|_______| +},q{ + T~~ + | + /^\ + / \ + _ _ _ / \ _ _ _ +[ ]_[ ]_[ ]/ _ _ \[ ]_[ ]_[ ] +|_=__-_ =_|_[ ]_[ ]_|_=-___-__| + | _- = | =_ = _ |= _= | + |= -[] |- = _ = |_-=_[] | + | =_ |= - ___ | =_ = | + |= []- |- /|_|\ |=_ =[] | + |- =_ | =| | |- = - | + |_______|__| |__|_______| +},q{ + T~~ + | + /^\ + / \ + _ _ _ / \ _ _ _ +[ ]_[ ]_[ ]/ _ _ \[ ]_[ ]_[ ] +|_=__-_ =_|_[ ]_[ ]_|_=-___-__| + | _- = | =_ = _ |= _= | + |= -[] |- = _ = |_-=_[] | + | =_ |= - ___ | =_ = | + |= []- |- / \ |=_ =[] | + |- =_ | =| | |- = - | + |_______|__| |__|_______| +},q{ + T~~ + | + /^\ + / \ + _ _ _ / \ _ _ _ +[ ]_[ ]_[ ]/ _ _ \[ ]_[ ]_[ ] +|_=__-_ =_|_[ ]_[ ]_|_=-___-__| + | _- = | =_ = _ |= _= | + |= -[] |- = _ = |_-=_[] | + | =_ |= - ___ | =_ = | + |= []- |- /|_|\ |=_ =[] | + |- =_ | =| | |- = - | + |_______|__| |__|_______| +},q{ + T~~ + | + /^\ + / \ + _ _ _ / \ _ _ _ +[ ]_[ ]_[ ]/ _ _ \[ ]_[ ]_[ ] +|_=__-_ =_|_[ ]_[ ]_|_=-___-__| + | _- = | =_ = _ |= _= | + |= -[] |- = _ = |_-=_[] | + | =_ |= - ___ | =_ = | + |= []- |- /| |\ |=_ =[] | + |- =_ | =|_|_|_| |- = - | + |_______|__| |__|_______| +} + ); + + my @castle_mask = ( + q{ + GG + + rrr + r r + r r + r r + + + + yyy + yy yy + y y y y + yyyyyyy +},q{ + GG + + rrr + r r + r r + r r + + + + yyy + yy yy + yyyyyyy + y y +},q{ + GG + + rrr + r r + r r + r r + + + + yyy + yyyyy + y y + y y +},q{ + GG + + rrr + r r + r r + r r + + + + yyy + y y + y y + y y +},q{ + GG + + rrr + r r + r r + r r + + + + yyy + yyyyy + y y + y y +},q{ + GG + + rrr + r r + r r + r r + + + + yyy + yy yy + yyyyyyy + y y +}); + + $anim->new_entity( + name => "castle", + shape => \@castle_image, + auto_trans => 1, + color => \@castle_mask, + position => [ $anim->width() - 32, $anim->height() - 13, $depth{'castle'} ], + callback_args => [ 0, 0, 0, 0.1], + default_color => 'white', + ); +} + +sub add_all_seaweed { + my ($anim) = @_; + # figure out how many seaweed to add by the width of the screen + my $seaweed_count = int($anim->width() / 15); + for (1 .. $seaweed_count) { + add_seaweed(undef, $anim); + } +} + +sub add_seaweed { + my ($old_seaweed, $anim) = @_; + my @seaweed_image = ('', ''); + my $height = int(rand(4)) + 3; + for my $i (1 .. $height) { + my $left_side = $i % 2; + my $right_side = !$left_side; + $seaweed_image[$left_side] .= "(\n"; + $seaweed_image[$right_side] .= " )\n"; + } + my $x = int(rand($anim->width() - 2)) + 1; + my $y = $anim->height() - $height; + my $anim_speed = rand(.05) + .25; + $anim->new_entity( + name => 'seaweed' . rand(1), + shape => \@seaweed_image, + position => [ $x, $y, $depth{'seaweed'} ], + callback_args => [ 0, 0, 0, $anim_speed ], + die_time => time() + int(rand(4 * 60)) + (8 * 60), # seaweed lives for 8 to 12 minutes + death_cb => \&add_seaweed, + default_color => 'green', + ); +} + +# add an air bubble to a fish +sub add_bubble { + my ($fish, $anim) = @_; + + my $cb_args = $fish->callback_args(); + my @fish_size = $fish->size(); + my @fish_pos = $fish->position(); + my @bubble_pos = @fish_pos; + + # moving right + if ($cb_args->[0] > 0) { + $bubble_pos[0] += $fish_size[0]; + } + $bubble_pos[1] += int($fish_size[1] / 2); + # bubble always goes on top of the fish + $bubble_pos[2]--; + + $anim->new_entity( + shape => [ '.', 'o', 'O', 'O', 'O' ], + type => 'bubble', + position => \@bubble_pos, + callback_args => [ 0, -1, 0, .1 ], + die_offscreen => 1, + physical => 1, + coll_handler => \&bubble_collision, + default_color => 'CYAN', + ); +} + +sub bubble_collision { + my ($bubble, $anim) = @_; + my $collisions = $bubble->collisions(); + foreach my $col_obj (@{$collisions}) { + if ($col_obj->type eq 'waterline') { + $bubble->kill(); + last; + } + } + +} + +sub add_all_fish { + my ($anim) = @_; + # figure out how many fish to add by the size of the screen, + # minus the stuff above the water + my $screen_size = ($anim->height() - 9) * $anim->width(); + my $fish_count = int($screen_size / 350); + for (1 .. $fish_count) { + add_fish(undef, $anim); + } +} + +sub add_fish { + my @parm = @_; + + if ($new_fish) { + if (int(rand(12)) > 8) { + add_new_fish(@parm); + } + else { + add_old_fish(@parm); + } + } + else { + add_old_fish(@parm); + } +} + +sub add_new_fish { + my ($old_fish, $anim) = @_; + my @fish_image = ( + + q{ + \\ + / \\ +>=_('> + \\_/ + / +}, + q{ + 1 + 1 1 +663745 + 111 + 3 +}, + q{ + / + / \\ +<')_=< + \\_/ + \\ +}, + q{ + 2 + 111 +547366 + 111 + 3 +}, + q{ + , + \}\\ +\\ .' `\\ +\}\}< ( 6> +/ `, .' + \}/ + ' +}, + q{ + 2 + 22 +6 11 11 +661 7 45 +6 11 11 + 33 + 3 +}, + q{ + , + /\{ + /' `. / +<6 ) >\{\{ + `. ,' \\ + \\\{ + ` +}, + q{ + 2 + 22 + 11 11 6 +54 7 166 + 11 11 6 + 33 + 3 +}, + q{ + \\'`. + ) \\ +(`.??????_.-`' ' '`-. + \\ `.??.` (o) \\_ + > >< ((( ( + / .`??`._ /_| /' +(.`???????`-. _ _.-` + /__/' + +}, + q{ + 1111 + 1 1 +111 11111 1 1111 + 1 11 11 141 11 + 1 11 777 5 + 1 11 111 333 11 +111 111 1 1111 + 11111 + +}, + q{ + .'`/ + / ( + .-'` ` `'-._??????.') +_/ (o) '.??.' / +) ))) >< < +`\\ |_\\ _.'??'. \\ + '-._ _ .-'???????'.) + `\\__\\ +}, + q{ + 1111 + 1 1 + 1111 1 11111 111 +11 141 11 11 1 +5 777 11 1 +11 333 111 11 1 + 1111 1 111 111 + 11111 +}, + q{ + ,--,_ +__ _\\.---'-. +\\ '.-" // o\\ +/_.'-._ \\\\ / + `"--(/"` +}, + q{ + 22222 +66 121111211 +6 6111 77 41 +6661111 77 1 + 11113311 +}, + q{ + _,--, + .-'---./_ __ +/o \\\\ "-.' / +\\ // _.-'._\\ + `"\\)--"` +}, + q{ + 22222 + 112111121 66 +14 77 1116 6 +1 77 1111666 + 11331111 +}, + ); + + add_fish_entity($anim, @fish_image); +} + +sub add_old_fish { + my ($old_fish, $anim) = @_; + my @fish_image = ( + + q{ + \ + ...\.., +\ /' \ + >= ( ' > +/ \ / / + `"'"'/'' +}, + q{ + 2 + 1112111 +6 11 1 + 66 7 4 5 +6 1 3 1 + 11111311 +}, + q{ + / + ,../... + / '\ / +< ' ) =< + \ \ / \ + `'\'"'"' +}, + q{ + 2 + 1112111 + 1 11 6 +5 4 7 66 + 1 3 1 6 + 11311111 +}, + q{ + \ +\ /--\ +>= (o> +/ \__/ + / +}, + q{ + 2 +6 1111 +66 745 +6 1111 + 3 +}, + q{ + / + /--\ / +::::::::;;\\\\\ + ''\\\\\\\\\'' ';\ +}, + q{ + 222 + 1122211 666 + 4111111111666 +51111111111666 + 113333311 666 +}, + q{ + __ +><_'> + ' +}, + q{ + 11 +61145 + 3 +}, + q{ + __ +<'_>< + ` +}, + q{ + 11 +54116 + 3 +}, + q{ + ..\, +>=' ('> + '''/'' +}, + q{ + 1121 +661 745 + 111311 +}, + q{ + ,/.. +<') `=< + ``\``` +}, + q{ + 1211 +547 166 + 113111 +}, + q{ + \ + / \ +>=_('> + \_/ + / +}, + q{ + 2 + 1 1 +661745 + 111 + 3 +}, + q{ + / + / \ +<')_=< + \_/ + \ +}, + q{ + 2 + 1 1 +547166 + 111 + 3 +}, + q{ + ,\ +>=('> + '/ +}, + q{ + 12 +66745 + 13 +}, + q{ + /, +<')=< + \` +}, + q{ + 21 +54766 + 31 +}, + q{ + __ +\/ o\ +/\__/ +}, + q{ + 11 +61 41 +61111 +}, + q{ + __ +/o \/ +\__/\ +}, + q{ + 11 +14 16 +11116 +}, + ); + + add_fish_entity($anim, @fish_image); +} + +sub add_fish_entity { + my $anim = shift; + my @fish_image = @_; + + # 1: body + # 2: dorsal fin + # 3: flippers + # 4: eye + # 5: mouth + # 6: tailfin + # 7: gills + + my @colors = ('c', 'C', 'r', 'R', 'y', 'Y', 'b', 'B', 'g', 'G', 'm', 'M'); + my $fish_num = int(rand($#fish_image / 2)); + my $fish_index = $fish_num * 2; + my $speed = rand(2) + .25; + my $depth = int(rand($depth{'fish_end'} - $depth{'fish_start'})) + $depth{'fish_start'}; + my $color_mask = $fish_image[$fish_index + 1]; + $color_mask =~ s/4/W/gm; + $color_mask = rand_color($color_mask); + + if ($fish_num % 2) { + $speed *= -1; + } + my $fish_object = Term::Animation::Entity->new( + type => 'fish', + shape => $fish_image[$fish_index], + auto_trans => 1, + color => $color_mask, + position => [ 0, 0, $depth ], + callback => \&fish_callback, + callback_args => [ $speed, 0, 0 ], + die_offscreen => 1, + death_cb => \&add_fish, + physical => 1, + coll_handler => \&fish_collision, + ); + + my $max_height = 9; + my $min_height = $anim->height() - $fish_object->{'HEIGHT'}; + $fish_object->{'Y'} = int(rand($min_height - $max_height)) + $max_height; + if ($fish_num % 2) { + $fish_object->{'X'} = $anim->width() - 2; + } + else { + $fish_object->{'X'} = 1 - $fish_object->{'WIDTH'}; + } + $anim->add_entity($fish_object); +} + +sub fish_callback { + my ($fish, $anim) = @_; + if (int(rand(100)) > 97) { + add_bubble($fish, $anim); + } + return $fish->move_entity($anim); +} + +sub fish_collision { + my ($fish, $anim) = @_; + my $collisions = $fish->collisions(); + foreach my $col_obj (@{$collisions}) { + if ($col_obj->type eq 'teeth') { + add_splat($anim, $col_obj->position()); + $fish->kill(); + last; + } + elsif ($col_obj->type eq 'hook_point') { + retract($col_obj); + retract($fish); + # get the hook and line + my $hook = $anim->get_entities_of_type('fishhook')->[0]; + my $line = $anim->get_entities_of_type('fishline')->[0]; + retract($anim->entity($hook)); + retract($anim->entity($line)); + last; + } + } +} + +sub add_splat { + my ($anim, $x, $y, $z) = @_; + my @splat_image = ( + q# + + . + *** + ' + +#, + q# + + ",*;` + "*,** + *"'~' + +#, + q# + , , + " ","' + *" *'" + " ; . + +#, + q# +* ' , ' ` +' ` * . ' + ' `' ",' +* ' " * . +" * ', ' +#, + ); + + $anim->new_entity( + shape => \@splat_image, + position => [ $x - 4, $y - 2, $z - 2 ], + default_color => 'RED', + callback_args => [ 0, 0, 0, .25 ], + transparent => ' ', + die_frame => 15, + ); +} + +sub add_shark { + my ($old_ent, $anim) = @_; + my @shark_image = ( + q# + __ + ( `\ + ,??????????????????????????) `\ +;' `.????????????????????????( `\__ + ; `.?????????????__..---'' `~~~~-._ + `. `.____...--'' (b `--._ + > _.-' .(( ._ ) + .`.-`--...__ .-' -.___.....-(|/|/|/|/' + ;.'?????????`. ...----`.___.',,,_______......---' + '???????????'-' +#, + q# + __ + /' ) + /' (??????????????????????????, + __/' )????????????????????????.' `; + _.-~~~~' ``---..__?????????????.' ; + _.--' b) ``--...____.' .' +( _. )). `-._ < + `\|\|\|\|)-.....___.- `-. __...--'-.'. + `---......_______,,,`.___.'----... .'?????????`.; + `-`???????????` +#, + ); + + my @shark_mask = ( + q# + + + + + + cR + + cWWWWWWWW + + +#, + q# + + + + + + Rc + + WWWWWWWWc + + +#, + ); + + my $dir = int(rand(2)); + my $x = -53; + my $y = int(rand($anim->height() - (10 + 9))) + 9; + my $teeth_x = -9; + my $teeth_y = $y + 7; + my $speed = 2; + if ($dir) { + $speed *= -1; + $x = $anim->width() - 2; + $teeth_x = $x + 9; + } + + $anim->new_entity( + type => 'teeth', + shape => "*", + position => [ $teeth_x, $teeth_y, $depth{'shark'} + 1 ], + depth => $depth{'fish_end'} - $depth{'fish_start'}, + callback_args => [ $speed, 0, 0 ], + physical => 1, + ); + + $anim->new_entity( + type => "shark", + color => $shark_mask[$dir], + shape => $shark_image[$dir], + auto_trans => 1, + position => [ $x, $y, $depth{'shark'} ], + default_color => 'WHITE', + callback_args => [ $speed, 0, 0 ], + die_offscreen => 1, + death_cb => sub {group_death(@_, 'teeth')}, + default_color => 'CYAN', + ); + +} + +# when a shark dies, kill the "teeth" too, the associated +# entity that does the actual collision +sub group_death { + my ($entity, $anim, @bound_types) = @_; + foreach my $type (@bound_types) { + my $bound_entities = $anim->get_entities_of_type($type); + foreach my $obj (@{$bound_entities}) { + $anim->del_entity($obj); + } + } + random_object($entity, $anim); +} + +# pull the fishhook, line and whatever got caught back +# to the surface +sub retract { + my ($entity) = @_; + $entity->physical(0); + if ($entity->type eq 'fish') { + my @pos = $entity->position(); + $pos[2] = $depth{'water_gap2'}; + $entity->position(@pos); + $entity->callback(\&fishhook_cb); + } + else { + $entity->callback_args('hooked'); + } +} + +# move the fishhook +sub fishhook_cb { + my ($entity, $anim) = @_; + + my @pos = $entity->position; + + # this means we hooked something, reel it in + if (defined($entity->callback_args())) { + $pos[1]--; + + # otherwise, just lower until we reach 1/4 from the bottom + } + else { + if (($pos[1] + $entity->height) < $anim->height * .75) { + $pos[1]++; + } + } + + return @pos; +} + +sub add_fishhook { + my ($old_ent, $anim) = @_; + + my $hook_image = + q{ + o + || + || +/ \ || + \__// + `--' +}; + + my $point_image = + q{ +. + +\ +? +}; + my $line_image = "|\n" x 50 . " \n" x 6; + + my $x = 10 + (int(rand($anim->width() - 20))); + my $y = -4; + my $point_x = $x + 1; + my $point_y = $y + 2; + + $anim->new_entity( + type => 'fishline', + shape => $line_image, + position => [ $x + 7, $y - 50, $depth{'water_line1'} ], + auto_trans => 1, + callback_args => undef, + callback => \&fishhook_cb, + ); + + $anim->new_entity( + type => 'fishhook', + shape => $hook_image, + trans_char => ' ', + position => [ $x, $y, $depth{'water_line1'} ], + auto_trans => 1, + die_offscreen => 1, + death_cb => sub {group_death(@_, 'teeth', 'fishline')}, + default_color => 'GREEN', + callback_args => undef, + callback => \&fishhook_cb, + ); + + $anim->new_entity( + type => 'hook_point', + shape => $point_image, + position => [ $point_x, $point_y, $depth{'shark'} + 1 ], + depth => $depth{'fish_end'} - $depth{'fish_start'}, + callback_args => undef, + physical => 1, + default_color => 'GREEN', + callback => \&fishhook_cb, + + ); +} + +sub add_ship { + my ($old_ent, $anim) = @_; + + my @ship_image = ( + q{ + | | | + )_) )_) )_) + )___))___))___)\ + )____)____)_____)\\\ +_____|____|____|____\\\\\__ +\ / +}, + q{ + | | | + (_( (_( (_( + /(___((___((___( + //(_____(____(____( +__///____|____|____|_____ + \ / +}); + + my @ship_mask = ( + q{ + y y y + + w + ww +yyyyyyyyyyyyyyyyyyyywwwyy +y y +}, + q{ + y y y + + w + ww +yywwwyyyyyyyyyyyyyyyyyyyy + y y +}); + + my $dir = int(rand(2)); + my $x = -24; + my $speed = 1; + if ($dir) { + $speed *= -1; + $x = $anim->width() - 2; + } + + $anim->new_entity( + color => $ship_mask[$dir], + shape => $ship_image[$dir], + auto_trans => 1, + position => [ $x, 0, $depth{'water_gap1'} ], + default_color => 'WHITE', + callback_args => [ $speed, 0, 0 ], + die_offscreen => 1, + death_cb => \&random_object, + ); +} + +sub add_whale { + my ($old_ent, $anim) = @_; + my @whale_image = ( + q{ + .-----: + .' `. +,????/ (o) \ +\`._/ ,__) +}, + q{ + :-----. + .' `. + / (o) \????, +(__, \_.'/ +}); + my @whale_mask = ( + q{ + C C + CCCCCCC + C C C + BBBBBBB + BB BB +B B BWB B +BBBBB BBBB +}, + q{ + C C + CCCCCCC + C C C + BBBBBBB + BB BB + B BWB B B +BBBB BBBBB +} + ); + + my @water_spout = ( + q{ + + + : +}, q{ + + : + : +}, q{ + . . + -:- + : +}, q{ + . . + .-:-. + : +}, q{ + . . +'.-:-.` +' : ' +}, q{ + + .- -. +; : ; +}, q{ + + +; ; +}); + + my $dir = int(rand(2)); + my $x; + my $speed = 1; + my $spout_align; + my @whale_anim; + my @whale_anim_mask; + + if ($dir) { + $spout_align = 1; + $speed *= -1; + $x = $anim->width() - 2; + } + else { + $spout_align = 11; + $x = -18; + } + + # no water spout + for (1 .. 5) { + push(@whale_anim, "\n\n\n" . $whale_image[$dir]); + push(@whale_anim_mask, $whale_mask[$dir]); + } + + # animate water spout + foreach my $spout_frame (@water_spout) { + my $whale_frame = $whale_image[$dir]; + my $aligned_spout_frame; + $aligned_spout_frame = join("\n" . ' ' x $spout_align, split("\n", $spout_frame)); + $whale_frame = $aligned_spout_frame . $whale_image[$dir]; + push(@whale_anim, $whale_frame); + push(@whale_anim_mask, $whale_mask[$dir]); + } + + $anim->new_entity( + color => \@whale_anim_mask, + shape => \@whale_anim, + auto_trans => 1, + position => [ $x, 0, $depth{'water_gap2'} ], + default_color => 'WHITE', + callback_args => [ $speed, 0, 0, 1 ], + die_offscreen => 1, + death_cb => \&random_object, + ); + +} + +sub add_monster { + my @parm = @_; + + if ($new_monster) { + add_new_monster(@parm); + } + else { + add_old_monster(@parm); + } +} + +sub add_new_monster { + my ($old_ent, $anim) = @_; + my @monster_image = ( + [ + " + _???_?????????????????????_???_???????_a_a + _{.`=`.}_??????_???_??????_{.`=`.}_????{/ ''\\_ + _????{.' _ '.}????{.`'`.}????{.' _ '.}??{| ._oo) +{ \\??{/ .'?'. \\}??{/ .-. \\}??{/ .'?'. \\}?{/ | +", + " + _???_????????????????????_a_a + _??????_???_??????_{.`=`.}_??????_???_??????{/ ''\\_ + { \\????{.`'`.}????{.' _ '.}????{.`'`.}????{| ._oo) + \\ \\??{/ .-. \\}??{/ .'?'. \\}??{/ .-. \\}???{/ | +" + ], [ + " + a_a_???????_???_?????????????????????_???_ + _/'' \\}????_{.`=`.}_??????_???_??????_{.`=`.}_ +(oo_. |}??{.' _ '.}????{.`'`.}????{.' _ '.}????_ + | \\}?{/ .'?'. \\}??{/ .-. \\}??{/ .'?'. \\}??/ } +", + " + a_a_????????????????????_ _ + _/'' \\}??????_???_??????_{.`=`.}_??????_???_??????_ +(oo_. |}????{.`'`.}????{.' _ '.}????{.`'`.}????/ } + | \\}???{/ .-. \\}??{/ .'?'. \\}??{/ .-. \\}??/ / +" + ]); + + my @monster_mask = ( + q{ W W + + + +}, q{ + W W + + + +}); + my $dir = int(rand(2)); + my $x; + my $speed = 2; + if ($dir) { + $speed *= -1; + $x = $anim->width() - 2; + } + else { + $x = -54 + } + my @monster_anim_mask; + for (1 .. 2) {push(@monster_anim_mask, $monster_mask[$dir]);} + + $anim->new_entity( + shape => $monster_image[$dir], + auto_trans => 1, + color => \@monster_anim_mask, + position => [ $x, 2, $depth{'water_gap2'} ], + callback_args => [ $speed, 0, 0, .25 ], + death_cb => \&random_object, + die_offscreen => 1, + default_color => 'GREEN', + ); +} + +sub add_old_monster { + my ($old_ent, $anim) = @_; + my @monster_image = ( + [ + q{ + ____ + __??????????????????????????????????????????/ o \ + / \????????_?????????????????????_???????/ ____ > + _??????| __ |?????/ \????????_????????/ \????| | + | \?????| || |????| |?????/ \?????| |???| | +}, q{ + ____ + __?????????/ o \ + _?????????????????????_???????/ \?????/ ____ > + _???????/ \????????_????????/ \????| __ |???| | + | \?????| |?????/ \?????| |???| || |???| | +}, q{ + ____ + __????????????????????/ o \ + _??????????????????????_???????/ \????????_???????/ ____ > +| \??????????_????????/ \????| __ |?????/ \????| | + \ \???????/ \?????| |???| || |????| |???| | +}, q{ + ____ + __???????????????????????????????/ o \ + _??????????_???????/ \????????_??????????????????/ ____ > + | \???????/ \????| __ |?????/ \????????_??????| | + \ \?????| |???| || |????| |?????/ \????| | +} + ], [ + q{ + ____ + / o \??????????????????????????????????????????__ +< ____ \???????_?????????????????????_????????/ \ + | |????/ \????????_????????/ \?????| __ |??????_ + | |???| |?????/ \?????| |????| || |?????/ | +}, q{ + ____ + / o \?????????__ +< ____ \?????/ \???????_?????????????????????_ + | |???| __ |????/ \????????_????????/ \???????_ + | |???| || |???| |?????/ \?????| |?????/ | +}, q{ + ____ + / o \????????????????????__ +< ____ \???????_????????/ \???????_??????????????????????_ + | |????/ \?????| __ |????/ \????????_??????????/ | + | |???| |????| || |???| |?????/ \???????/ / +}, q{ + ____ + / o \???????????????????????????????__ +< ____ \??????????????????_????????/ \???????_??????????_ + | |??????_????????/ \?????| __ |????/ \???????/ | + | |????/ \?????| |????| || |???| |?????/ / +} + ]); + + my @monster_mask = ( + q{ + + W + + + +}, q{ + + W + + + +}); + my $dir = int(rand(2)); + my $x; + my $speed = 2; + if ($dir) { + $speed *= -1; + $x = $anim->width() - 2; + } + else { + $x = -64 + } + my @monster_anim_mask; + for (1 .. 4) {push(@monster_anim_mask, $monster_mask[$dir]);} + + $anim->new_entity( + shape => $monster_image[$dir], + auto_trans => 1, + color => \@monster_anim_mask, + position => [ $x, 2, $depth{'water_gap2'} ], + callback_args => [ $speed, 0, 0, .25 ], + death_cb => \&random_object, + die_offscreen => 1, + default_color => 'GREEN', + ); +} + +sub add_big_fish { + my @parm = @_; + + if ($new_fish) { + if (int(rand(3)) > 1) { + add_big_fish_2(@parm); + } + else { + add_big_fish_1(@parm); + } + } + else { + add_big_fish_1(@parm); + } +} + +sub add_big_fish_1 { + my ($old_ent, $anim) = @_; + + my @big_fish_image = ( + q{ + ______ +`""-. `````-----.....__ + `. . . `-. + : . . `. + ,?????: . . _ : +: `.???: (@) `._ + `. `..' . =`-. .__) + ; . = ~ : .-" + .' .'`. . . =.-' `._ .' +: .'???: . .' + '???.' . . . .-' + .'____....----''.'=.' + ""?????????????.'.' + ''"'` +}, q{ + ______ + __.....-----''''' .-""' + .-' . . .' + .' . . : + : _ . . :?????, + _.' (@) :???.' : +(__. .-'= . `..' .' + "-. : ~ = . ; + `. _.' `-.= . . .'`. `. + `. . :???`. : + `-. . . . `.???` + `.=`.``----....____`. + `.`.?????????????"" + '`"`` +}); + + my @big_fish_mask = ( + q{ + 111111 +11111 11111111111111111 + 11 2 2 111 + 1 2 2 11 + 1 1 2 2 1 1 +1 11 1 1W1 111 + 11 1111 2 1111 1111 + 1 2 1 1 1 111 + 11 1111 2 2 1111 111 11 +1 11 1 2 11 + 1 11 2 2 2 111 + 111111111111111111111 + 11 1111 + 11111 +}, q{ + 111111 + 11111111111111111 11111 + 111 2 2 11 + 11 2 2 1 + 1 1 2 2 1 1 + 111 1W1 1 11 1 +1111 1111 2 1111 11 + 111 1 1 1 2 1 + 11 111 1111 2 2 1111 11 + 11 2 1 11 1 + 111 2 2 2 11 1 + 111111111111111111111 + 1111 11 + 11111 +}); + + my $dir = int(rand(2)); + my $x; + my $speed = 3; + if ($dir) { + $x = $anim->width() - 1; + $speed *= -1; + } + else { + $x = -34; + } + my $max_height = 9; + my $min_height = $anim->height() - 15; + my $y = int(rand($min_height - $max_height)) + $max_height; + my $color_mask = rand_color($big_fish_mask[$dir]); + $anim->new_entity( + shape => $big_fish_image[$dir], + auto_trans => 1, + color => $color_mask, + position => [ $x, $y, $depth{'shark'} ], + callback_args => [ $speed, 0, 0 ], + death_cb => \&random_object, + die_offscreen => 1, + default_color => 'YELLOW', + ); + +} + +sub add_big_fish_2 { + my ($old_ent, $anim) = @_; + + my @big_fish_image = ( + q{ + _ _ _ + .='\\ \\ \\`"=, + .'\\ \\ \\ \\ \\ \\ \\ +\\'=._?????/ \\ \\ \\_\\_\\_\\_\\_\\ +\\'=._'.??/\\ \\,-"`- _ - _ - '-. + \\`=._\\|'.\\/- _ - _ - _ - _- \\ + ;"= ._\\=./_ -_ -_ \{`"=_ @ \\ + ;="_-_=- _ - _ - \{"=_"- \\ + ;_=_--_., \{_.=' .-/ + ;.="` / ';\\ _. _.-` + /_.='/ \\/ /;._ _ _\{.-;`/"` +/._=_.'???'/ / / / /\{.= / +/.=' ??????`'./_/_.=`\{_/ +}, q{ + _ _ _ + ,="`/ / /'=. + / / / / / / /'. + /_/_/_/_/_/ / / \\?????_.='/ + .-' - _ - _ -`"-,/ /\\??.'_.='/ + / -_ - _ - _ - _ -\\/.'|/_.=`/ + / @ _="`\} _- _- _\\.=/_. ="; +/ -"_="\} - _ - _ -=_-_"=; +\\-. '=._\} ,._--_=_; + `-._ ._ /;' \\ `"=.; + `"\\`;-.\}_ _ _.;\\ \\/ \\'=._\\ + \\ =.\}\\ \\ \\ \\ \\'???'._=_.\\ + \\_\}`=._\\_\\.'`???????'=.\\ +}); + + my @big_fish_mask = ( + q{ + 1 1 1 + 1111 1 11111 + 111 1 1 1 1 1 1 +11111 1 1 1 11111111111 +1111111 11 111112 2 2 2 2 111 + 111111111112 2 2 2 2 2 2 22 1 + 111 1111 12 22 22 11111 W 1 + 11111112 2 2 2 2 111111 1 + 111111111 11111 111 + 11111 11111 11 1111 + 111111 11 1111 1 111111111 +1111111 11 1 1 1 1111 1 +1111 1111111111111 +}, q{ + 1 1 1 + 11111 1 1111 + 1 1 1 1 1 1 111 + 11111111111 1 1 1 11111 + 111 2 2 2 2 211111 11 1111111 + 1 22 2 2 2 2 2 2 211111111111 + 1 W 11111 22 22 2111111 111 +1 111111 2 2 2 2 21111111 +111 11111 111111111 + 1111 11 111 1 11111 + 111111111 1 1111 11 111111 + 1 1111 1 1 1 11 1111111 + 1111111111111 1111 +}); + + my $dir = int(rand(2)); + my $x; + my $speed = 2.5; + if ($dir) { + $x = $anim->width() - 1; + $speed *= -1; + } + else { + $x = -33; + } + my $max_height = 9; + my $min_height = $anim->height() - 14; + my $y = int(rand($min_height - $max_height)) + $max_height; + my $color_mask = rand_color($big_fish_mask[$dir]); + $anim->new_entity( + shape => $big_fish_image[$dir], + auto_trans => 1, + color => $color_mask, + position => [ $x, $y, $depth{'shark'} ], + callback_args => [ $speed, 0, 0 ], + death_cb => \&random_object, + die_offscreen => 1, + default_color => 'YELLOW', + ); +} + +sub add_ducks { + my ($old_ent, $anim) = @_; + my @duck_image = ( + [ + q{ + _??????????_??????????_ +,____(')=??,____(')=??,____(')< + \~~= ')????\~~= ')????\~~= ') +}, q{ + _??????????_??????????_ +,____(')=??,____(')(')____,??=(')____,??=(')____, + (` =~~/????(` =~~/????(` =~~/ +}, q{ + _??????????_??????????_ +=(')____,??>(')____,??=(')____, + (` =~~/????(` =~~/????(` =~~/ +}, q{ + _??????????_??????????_ +=(')____,??=(')____,??>(')____, + (` =~~/????(` =~~/????(` =~~/ +} + ] + ); + + my @duck_mask = ( + q{ + g g g +wwwwwgcgy wwwwwgcgy wwwwwgcgy + wwww Ww wwww Ww wwww Ww +}, q{ + g g g +ygcgwwwww ygcgwwwww ygcgwwwww + wW wwww wW wwww wW wwww +}); + + my $dir = int(rand(2)); + my $x; + my $speed = 1; + if ($dir) { + $speed *= -1; + $x = $anim->width() - 2; + } + else { + $x = -30 + } + + $anim->new_entity( + shape => $duck_image[$dir], + auto_trans => 1, + color => $duck_mask[$dir], + position => [ $x, 5, $depth{'water_gap3'} ], + callback_args => [ $speed, 0, 0, .25 ], + death_cb => \&random_object, + die_offscreen => 1, + default_color => 'WHITE', + ); +} + +sub add_dolphins { + my ($old_ent, $anim) = @_; + my @dolphin_image = ( + [ + q{ + , + __)\_ +(\_.-' a`-. +(/~~````(/~^^` +}, q{ + , +(\__ __)\_ +(/~.'' a`-. + ````\)~^^` +} + ], [ + q{ + , + _/(__ +.-'a `-._/) +'^^~\)''''~~\) +}, q{ + , + _/(__ __/) +.-'a ``.~\) +'^^~(/'''' +} + ] + ); + + my @dolphin_mask = ( + q{ + + + W +}, q{ + + + W +}); + + my $dir = int(rand(2)); + + my $x; + my $speed = 1; + my $distance = 15; # how far apart the dolphins are + + # right to left + if ($dir) { + $speed *= -1; + $distance *= -1; + $x = $anim->width() - 2; + + # left to right + } + else { + $x = -13 + } + + my $up = [ $speed, -.5, 0, .5 ]; + my $down = [ $speed, .5, 0, .5 ]; + my $glide = [ $speed, 0, 0, .5 ]; + + my @path; + + for (1 .. 14) {push(@path, $up);} + for (1 .. 2) {push(@path, $glide);} + for (1 .. 14) {push(@path, $down);} + for (1 .. 6) {push(@path, $glide);} + + my $dolphin3 = $anim->new_entity( + shape => $dolphin_image[$dir], + auto_trans => 1, + color => $dolphin_mask[$dir], + position => [ $x - ($distance * 2), 8, $depth{'water_gap3'} ], + callback_args => [ 0, [ @path ] ], + death_cb => \&random_object, + die_offscreen => 0, + default_color => 'blue', + ); + + my $dolphin2 = $anim->new_entity( + shape => $dolphin_image[$dir], + auto_trans => 1, + color => $dolphin_mask[$dir], + position => [ $x - $distance, 2, $depth{'water_gap3'} ], + callback_args => [ 12, [ @path ] ], + die_offscreen => 0, + default_color => 'BLUE', + ); + + my $dolphin1 = $anim->new_entity( + shape => $dolphin_image[$dir], + auto_trans => 1, + color => $dolphin_mask[$dir], + position => [ $x, 5, $depth{'water_gap3'} ], + callback_args => [ 24, [ @path ] ], + # have the lead dolphin tell the others to die offscreen, since they start offscreen + death_cb => sub { + $dolphin2->die_offscreen(1); + $dolphin3->die_offscreen(1) + }, + die_offscreen => 1, + default_color => 'CYAN', + ); + +} + +sub add_swan { + my ($old_ent, $anim) = @_; + my @swan_image = ( + [ + q{ + ___ +,_ / _,\ +| \ \( \| +| \_ \\\ +(_ \_) \ +(\_ ` \ + \ -=~ / +} + ], [ + q{ + ___ +/,_ \ _, +|/ )/ / | + // _/ | + / ( / _) +/ ` _/) +\ ~=- / +} + ] + ); + + my @swan_mask = ( + q{ + + g + yy +}, q{ + + g +yy +}); + + my $dir = int(rand(2)); + my $x; + my $speed = 1; + if ($dir) { + $speed *= -1; + $x = $anim->width() - 2; + } + else { + $x = -10 + } + + $anim->new_entity( + shape => $swan_image[$dir], + auto_trans => 1, + color => $swan_mask[$dir], + position => [ $x, 1, $depth{'water_gap3'} ], + callback_args => [ $speed, 0, 0, .25 ], + death_cb => \&random_object, + die_offscreen => 1, + default_color => 'WHITE', + ); +} + +sub submarine_callback { + my ($entity, $anim) = @_; + + my @delta = $entity->callback_args(); + my @pos = $entity->position(); + + my $x = $pos[0]; + my $y = $pos[1]; + my $z = $pos[2]; + my $frame = $delta[0][3]; + my $delay = $delta[0][4]; + my @frame_delay = @{[ 1, 4, 4, 9, 9, 9, 4, 4, 1 ]}; + + my $maxFrame = scalar(@frame_delay); + + # Move if not in center or skipping over the center + if (not (($x < $anim->width() / 2 - 20 and $x + $delta[0][0] > $anim->width() / 2 - 20) or + ($x > $anim->width() / 2 - 20 and $x + $delta[0][0] < $anim->width() / 2 - 20)) + and $x != $anim->width() / 2 - 20) { + $x += $delta[0][0]; + } + else { + if ($frame < $maxFrame - 1) { + if ($delay < $frame_delay[$frame]) { + $delay += 1; + } + else { + $delay = 0; + $frame += 1; + } + } + else { + $x += $delta[0][0]; + } + } + + my @args = [ $delta[0][0], $delta[0][1], $delta[0][2], $frame, $delay ]; + $entity->callback_args(@args); + return ($x, $y, $z, $frame); +} + +sub add_submarine { + my ($old_ent, $anim) = @_; + my @submarine_image = ( + [ + q{ + + + + __ + _|_ + / | + _ ? _______________/____|_______________ +( )?/ / + (=< O O O / +(_)?\_________________________________/ +} + , q{ + + + __ + | + _|_ + / | + _ ? _______________/____|_______________ +( )?/ / + (=< O O O / +(_)?\_________________________________/ +} + , q{ + + __ + | + | + _|_ + / | + _ ? _______________/____|_______________ +( )?/ / + (=< O O O / +(_)?\_________________________________/ +} + , q{ + __ + | + | + | + _|_ + / | + _ ? _______________/____|_______________ +( )?/ / + (=< O O O / +(_)?\_________________________________/ +} + , q{ + __ + | + | + | + _|_ + / | + _ ? _______________/____|_______________ +( )?/ / + (=< O O O / +(_)?\_________________________________/ +} + , q{ + __ + | + | + | + _|_ + / | + _ ? _______________/____|_______________ +( )?/ / + (=< O O O / +(_)?\_________________________________/ +} + , q{ + + __ + | + | + _|_ + / | + _ ? _______________/____|_______________ +( )?/ / + (=< O O O / +(_)?\_________________________________/ +} + , q{ + + + __ + | + _|_ + / | + _ ? _______________/____|_______________ +( )?/ / + (=< O O O / +(_)?\_________________________________/ +} + , q{ + + + + __ + _|_ + / | + _ ? _______________/____|_______________ +( )?/ / + (=< O O O / +(_)?\_________________________________/ +} + ], [ + q{ + + + + __ + _|_ + | \ +______________|____\_______________ ? _ +\ \?( ) + \ O O O >=) + \________________________________/?(_) +} + , q{ + + + __ + | + _|_ + | \ +______________|____\_______________ ? _ +\ \?( ) + \ O O O >=) + \________________________________/?(_) +} + , q{ + + __ + | + | + _|_ + | \ +______________|____\_______________ ? _ +\ \?( ) + \ O O O >=) + \________________________________/?(_) +} + , q{ + __ + | + | + | + _|_ + | \ +______________|____\_______________ ? _ +\ \?( ) + \ O O O >=) + \________________________________/?(_) +} + , q{ + __ + | + | + | + _|_ + | \ +______________|____\_______________ ? _ +\ \?( ) + \ O O O >=) + \________________________________/?(_) +} + , q{ + __ + | + | + | + _|_ + | \ +______________|____\_______________ ? _ +\ \?( ) + \ O O O >=) + \________________________________/?(_) +} + , q{ + + __ + | + | + _|_ + | \ +______________|____\_______________ ? _ +\ \?( ) + \ O O O >=) + \________________________________/?(_) +} + , q{ + + + __ + | + _|_ + | \ +______________|____\_______________ ? _ +\ \?( ) + \ O O O >=) + \________________________________/?(_) +} + , q{ + + + + __ + _|_ + | \ +______________|____\_______________ ? _ +\ \?( ) + \ O O O >=) + \________________________________/?(_) +} + ] + ); + + my @submarine_mask = ( + q{ + www + ww + ww + ww + w + + w +w w + www w w w +www +}, q{ + www + ww + ww + ww + w + + w + w w + w w w www + www +}); + + my $dir = int(rand(2)); + my $x; + my $speed = 1; + if ($dir) { + $speed *= -1; + $x = $anim->width() - 2; + } + else { + $x = -40 + } + + $anim->new_entity( + shape => $submarine_image[$dir], + auto_trans => 1, + color => $submarine_mask[$dir], + position => [ $x, 6, $depth{'water_gap3'} ], + callback_args => [ $speed, 0, 0, 0, 0 ], + callback => \&submarine_callback, + death_cb => \&random_object, + die_offscreen => 1, + default_color => 'YELLOW', + ); +} + +sub add_sword_fish { + my ($old_end, $anim) = @_; + + my @sword_fish_image = ( +q{ + )", +_ /\\\\\\\\ + ",????????????_____,,,,,--\\\\\\\\\\\\) + \\\\????????,,;_______\\\\\\\\\\----""";_ + )\\_.-'`"""""......-------------,o";__________ + ==.-.,____ """;;;;,__._.=='"" + )/????"???"\\""---;...,______:.-" + //???????????")_.-` _.-' +_.'????????????????????_.-' +}, +q{ + ,"( + ////\ _ + (//////--,,,,,_____????????????," + _;"""----/////_______;,,????????// +__________;"o,-------------......"""""`'-._/( + ""'==._.__,;;;;""" ____,.-.== + "-.:______,...;---""/"???"????\\( + '-._ `-._("???????????\\\ + '-._?????????????????????'._ +}); + + my @sword_fish_mask = ( + q{ + 222 +6 22222 + 66 2222222222222222222 + 66 111111111111111111111111 + 666111111111111111111111111111144455555555555 + 6661111111 111777711111155555 + 66 1 11111111111111111111111 + 66 3333333 3333 +666 3333 +}, + q{ + 222 + 22222 6 + 2222222222222222222 66 + 111111111111111111111111 66 +555555555554441111111111111111111111111111666 + 555551111117777111 1111111666 + 11111111111111111111111 1 66 + 3333 3333333 66 + 3333 666 +}); + + my $dir = int(rand(2)); + my $x; + my $speed = 3.5; + if ($dir) { + $x = $anim->width() - 1; + $speed *= -1; + } + else { + $x = -33; + } + my $max_height = 9; + my $min_height = $anim->height() - 14; + my $y = int(rand($min_height - $max_height)) + $max_height; + my $color_mask = rand_color($sword_fish_mask[$dir]); + $anim->new_entity( + shape => $sword_fish_image[$dir], + auto_trans => 1, + color => $color_mask, + position => [ $x, $y, $depth{'shark'} ], + callback_args => [ $speed, 0, 0 ], + death_cb => \&random_object, + die_offscreen => 1, + default_color => 'YELLOW', + ); +} + +sub init_random_objects { + return ( + \&add_ship, + \&add_whale, + \&add_monster, + \&add_big_fish, + \&add_shark, + \&add_fishhook, + \&add_swan, + \&add_ducks, + \&add_dolphins, + \&add_submarine, + \&add_sword_fish, + ); +} + +# add one of the random objects to the screen +sub random_object { + my ($dead_object, $anim) = @_; + my $sub = int(rand(scalar(@random_objects))); + $random_objects[$sub]->($dead_object, $anim); +} + +sub dprint { + open(D, ">>", "debug"); + print D @_, "\n"; + close(D); +} + +sub sighandler { + my ($sig) = @_; + if ($sig eq 'INT') {quit();} + elsif ($sig eq 'WINCH') { + # ignore SIGWINCH, only redraw when requested + } + else {quit("Exiting with SIG$sig");} +} + +sub quit { + my ($mesg) = @_; + print STDERR $mesg, "\n" if (defined($mesg)); + exit; +} + + +sub initialize { + # this may be paranoid, but i don't want to leave + # the user's terminal in a state that they might not + # know how to fix if we die badly + foreach my $sig (keys %SIG) { + $SIG{$sig} = 'sighandler' unless (defined($SIG{$sig})); + } +} + + +sub center { + my ($width, $mesg) = @_; + my $l = length($mesg); + if ($l < $width) { + return ' ' x (int(($width - length($mesg)) / 2)) . $mesg; + } + elsif ($l > $width) { + return (substr($mesg, 0, ($width - ($l + 3))) . "..."); + } + else { + return $mesg; + } +} + +sub rand_color { + my ($color_mask) = @_; + my @colors = ('c', 'C', 'r', 'R', 'y', 'Y', 'b', 'B', 'g', 'G', 'm', 'M'); + foreach my $i (1 .. 9) { + my $color = $colors[int(rand($#colors))]; + $color_mask =~ s/$i/$color/gm; + } + return $color_mask; +} diff --git a/local_bin/backupGamesaves b/local_bin/backupGamesaves new file mode 100755 index 0000000..7f83019 --- /dev/null +++ b/local_bin/backupGamesaves @@ -0,0 +1,16 @@ +#!/bin/bash + +notify() { + notify-send "$1" -i ~/.local/share/icons/Catppuccin-SE/64x64@2x/apps/org.gnome.games.svg --app-name=Ludusavi +} + +if ! command -v ludusavi &>/dev/null; then + notify "Error: ludusavi is not installed" + exit 1 +fi + +notify "Started Backup..." + +ludusavi backup --force --full-limit 3 + +notify "Backup Complete" diff --git a/local_bin/bonsai b/local_bin/bonsai new file mode 100755 index 0000000..177c329 Binary files /dev/null and b/local_bin/bonsai differ diff --git a/local_bin/color-scripts/alpha b/local_bin/color-scripts/alpha new file mode 100755 index 0000000..94dd2c1 --- /dev/null +++ b/local_bin/color-scripts/alpha @@ -0,0 +1,46 @@ +#!/bin/sh + +# ANSI Color -- use these variables to easily have different color +# and format output. Make sure to output the reset sequence after +# colors (f = foreground, b = background), and use the 'off' +# feature for anything you turn on. +# Author: Ivo +# Source: http://crunchbang.org/forums/viewtopic.php?pid=134749#p134749 + +initializeANSI() +{ + esc="" + + blackf="${esc}[30m"; redf="${esc}[31m"; greenf="${esc}[32m" + yellowf="${esc}[33m" bluef="${esc}[34m"; purplef="${esc}[35m" + cyanf="${esc}[36m"; whitef="${esc}[37m" whitef="${esc}[37m" + + blackfbright="${esc}[90m"; redfbright="${esc}[91m"; greenfbright="${esc}[92m" + yellowfbright="${esc}[93m" bluefbright="${esc}[94m"; purplefbright="${esc}[95m" + cyanfbright="${esc}[96m"; whitefbright="${esc}[97m" whitefbright="${esc}[97m" + + blackb="${esc}[40m"; redb="${esc}[41m"; greenb="${esc}[42m" + yellowb="${esc}[43m" blueb="${esc}[44m"; purpleb="${esc}[45m" + cyanb="${esc}[46m"; whiteb="${esc}[47m" + + boldon="${esc}[1m"; boldoff="${esc}[22m" + italicson="${esc}[3m"; italicsoff="${esc}[23m" + ulon="${esc}[4m"; uloff="${esc}[24m" + invon="${esc}[7m"; invoff="${esc}[27m" + + reset="${esc}[0m" +} + +# note in this first use that switching colors doesn't require a reset +# first - the new color overrides the old one. + +initializeANSI + +cat << EOF + +${boldon}${redfbright} ██████ ${reset} ${boldon}${greenfbright}██████ ${reset}${boldon}${yellowfbright} ██████${reset} ${boldon}${bluefbright}██████ ${reset} ${boldon}${purplefbright} ██████${reset} ${boldon}${cyanfbright} ███████${reset} +${boldon}${redfbright} ████████${reset} ${boldon}${greenfbright}██ ██ ${reset}${boldon}${yellowfbright}██ ${reset} ${boldon}${bluefbright}██ ██${reset} ${boldon}${purplefbright}██████ ${reset} ${boldon}${cyanfbright}█████████${reset} +${redf} ██ ████${reset} ${greenf}██ ████ ${reset}${yellowf}████ ${reset} ${bluef}████ ██${reset} ${purplef}████ ${reset} ${cyanf}█████ ${reset} +${redf} ██ ██${reset} ${greenf}██████ ${reset}${yellowf}████████${reset} ${bluef}██████ ${reset} ${purplef}████████${reset} ${cyanf}██ ${reset} + +EOF diff --git a/local_bin/color-scripts/arch b/local_bin/color-scripts/arch new file mode 100755 index 0000000..2650934 --- /dev/null +++ b/local_bin/color-scripts/arch @@ -0,0 +1,40 @@ +#!/bin/sh + +# Author: Ivo +# Source: http://crunchbang.org/forums/viewtopic.php?pid=237794#p237794 +# ANSI Color -- use these variables to easily have different color +# and format output. Make sure to output the reset sequence after +# colors (f = foreground, b = background), and use the 'off' +# feature for anything you turn on. + +initializeANSI() +{ + esc="" + + redf="${esc}[31m"; greenf="${esc}[32m" + yellowf="${esc}[33m" bluef="${esc}[34m"; + cyanf="${esc}[36m"; purplef="${esc}[35m" + + redfbright="${esc}[91m"; greenfbright="${esc}[92m" + yellowfbright="${esc}[93m" bluefbright="${esc}[94m"; + cyanfbright="${esc}[96m"; purplefbright="${esc}[95m" + + boldon="${esc}[1m"; + reset="${esc}[0m" +} + +# note in this first use that switching colors doesn't require a reset +# first - the new color overrides the old one. + +initializeANSI + +cat << EOF + +${boldon}${redfbright} ■ ${boldon}${greenfbright} ■ ${boldon}${yellowfbright} ■ ${boldon}${bluefbright} ■ ${boldon}${purplefbright} ■ ${boldon}${cyanfbright} ■ ${reset} +${boldon}${redfbright} ■■■ ${boldon}${greenfbright} ■■■ ${boldon}${yellowfbright} ■■■ ${boldon}${bluefbright} ■■■ ${boldon}${purplefbright} ■■■ ${boldon}${cyanfbright} ■■■ ${reset} +${boldon}${redfbright} ■■■■■ ${boldon}${greenfbright} ■■■■■ ${boldon}${yellowfbright} ■■■■■ ${boldon}${bluefbright} ■■■■■ ${boldon}${purplefbright} ■■■■■ ${boldon}${cyanfbright} ■■■■■ ${reset} +${redf} ■( )■ ${greenf} ■( )■ ${yellowf} ■( )■ ${bluef} ■( )■ ${purplef} ■( )■ ${cyanf} ■( )■ ${reset} +${redf} ■■■■ ■■■■ ${greenf} ■■■■ ■■■■ ${yellowf} ■■■■ ■■■■ ${bluef} ■■■■ ■■■■ ${purplef} ■■■■ ■■■■ ${cyanf} ■■■■ ■■■■ ${reset} +${redf} ■■ ■■ ${greenf} ■■ ■■ ${yellowf} ■■ ■■ ${bluef} ■■ ■■ ${purplef} ■■ ■■ ${cyanf} ■■ ■■ ${reset} + +EOF diff --git a/local_bin/color-scripts/bars b/local_bin/color-scripts/bars new file mode 100755 index 0000000..499cd02 --- /dev/null +++ b/local_bin/color-scripts/bars @@ -0,0 +1,26 @@ +#!/bin/bash + +# ANSI color scheme script by pfh +# Source: http://crunchbang.org/forums/viewtopic.php?pid=139126#p139126 +# Initializing mod by lolilolicon from Archlinux +# + +f=3 b=4 +for j in f b; do + for i in {0..7}; do + printf -v $j$i %b "\e[${!j}${i}m" + done +done +for i in {0..7}; do + printf -v fbright$i %b "\e[9${i}m" +done +bld=$'\e[1m' +rst=$'\e[0m' +inv=$'\e[7m' + +cat << EOF + + $f1▬▬▬▬▬ $f2▬▬▬▬▬ $f3▬▬▬▬▬ $f4▬▬▬▬▬ $f5▬▬▬▬▬ $f6▬▬▬▬▬ + $bld$fbright1▬▬▬▬▬ $fbright2▬▬▬▬▬ $fbright3▬▬▬▬▬ $fbright4▬▬▬▬▬ $fbright5▬▬▬▬▬ $fbright6▬▬▬▬▬ + $rst +EOF diff --git a/local_bin/color-scripts/blacklisted/awk-rgb-test b/local_bin/color-scripts/blacklisted/awk-rgb-test new file mode 100755 index 0000000..3fabe21 --- /dev/null +++ b/local_bin/color-scripts/blacklisted/awk-rgb-test @@ -0,0 +1,16 @@ +#!/bin/bash +echo "This should be a smooth gradient" +echo "" +awk 'BEGIN{ + s="/\\/\\/\\/\\/\\"; s=s s s s s s s s; + for (colnum = 0; colnum<77; colnum++) { + r = 255-(colnum*255/76); + g = (colnum*510/76); + b = (colnum*255/76); + if (g>255) g = 510-g; + printf "\033[48;2;%d;%d;%dm", r,g,b; + printf "\033[38;2;%d;%d;%dm", 255-r,255-g,255-b; + printf "%s\033[0m", substr(s,colnum+1,1); + } + printf "\n"; +}' diff --git a/local_bin/color-scripts/blacklisted/hex b/local_bin/color-scripts/blacklisted/hex new file mode 100755 index 0000000..411196a --- /dev/null +++ b/local_bin/color-scripts/blacklisted/hex @@ -0,0 +1,15 @@ +#!/bin/bash + +# Author: SuNjACk +# Source: http://crunchbang.org/forums/viewtopic.php?pid=135226#p135226 + +xdef="${XRESOURCES:-$HOME/.Xresources}" +colors=( $( sed -re '/^!/d; /^$/d; /^#/d; s/(\*color)([0-9]):/\10\2:/g;' $xdef | grep -E 'color[0-9]+:' | sort | sed 's/^.*: *//g' ) ) + +echo -e "\e[1;97m + Black Red Green Yellow Blue Magenta Cyan White + ──────────────────────────────────────────────────────────────────────\e[0m" +for i in {0..7}; do echo -en "\e[$((30+$i))m ${colors[i]} \e[0m"; done +echo +for i in {8..15}; do echo -en "\e[1;$((82+$i))m ${colors[i]} \e[0m"; done +echo -e "\n" diff --git a/local_bin/color-scripts/blacklisted/print256 b/local_bin/color-scripts/blacklisted/print256 new file mode 100755 index 0000000..c33e448 --- /dev/null +++ b/local_bin/color-scripts/blacklisted/print256 @@ -0,0 +1,97 @@ +#!/bin/bash + +# Tom Hale, 2016. MIT Licence. +# Print out 256 colours, with each number printed in its corresponding colour +# See http://askubuntu.com/questions/821157/print-a-256-color-test-pattern-in-the-terminal/821163#821163 + +set -eu # Fail on errors or undeclared variables + +printable_colours=256 + +# Return a colour that contrasts with the given colour +# Bash only does integer division, so keep it integral +function contrast_colour { + local r g b luminance + colour="$1" + + if (( colour < 16 )); then # Initial 16 ANSI colours + (( colour == 0 )) && printf "15" || printf "0" + return + fi + + # Greyscale # rgb_R = rgb_G = rgb_B = (number - 232) * 10 + 8 + if (( colour > 231 )); then # Greyscale ramp + (( colour < 244 )) && printf "15" || printf "0" + return + fi + + # All other colours: + # 6x6x6 colour cube = 16 + 36*R + 6*G + B # Where RGB are [0..5] + # See http://stackoverflow.com/a/27165165/5353461 + + # r=$(( (colour-16) / 36 )) + g=$(( ((colour-16) % 36) / 6 )) + # b=$(( (colour-16) % 6 )) + + # If luminance is bright, print number in black, white otherwise. + # Green contributes 587/1000 to human perceived luminance - ITU R-REC-BT.601 + (( g > 2)) && printf "0" || printf "15" + return + + # Uncomment the below for more precise luminance calculations + + # # Calculate percieved brightness + # # See https://www.w3.org/TR/AERT#color-contrast + # # and http://www.itu.int/rec/R-REC-BT.601 + # # Luminance is in range 0..5000 as each value is 0..5 + # luminance=$(( (r * 299) + (g * 587) + (b * 114) )) + # (( $luminance > 2500 )) && printf "0" || printf "15" +} + +# Print a coloured block with the number of that colour +function print_colour { + local colour="$1" contrast + contrast=$(contrast_colour "$1") + printf "\e[48;5;%sm" "$colour" # Start block of colour + printf "\e[38;5;%sm%3d" "$contrast" "$colour" # In contrast, print number + printf "\e[0m " # Reset colour +} + +# Starting at $1, print a run of $2 colours +function print_run { + local i + for (( i = "$1"; i < "$1" + "$2" && i < printable_colours; i++ )) do + print_colour "$i" + done + printf " " +} + +# Print blocks of colours +function print_blocks { + local start="$1" i + local end="$2" # inclusive + local block_cols="$3" + local block_rows="$4" + local blocks_per_line="$5" + local block_length=$((block_cols * block_rows)) + + # Print sets of blocks + for (( i = start; i <= end; i += (blocks_per_line-1) * block_length )) do + printf "\n" # Space before each set of blocks + # For each block row + for (( row = 0; row < block_rows; row++ )) do + # Print block columns for all blocks on the line + for (( block = 0; block < blocks_per_line; block++ )) do + print_run $(( i + (block * block_length) )) "$block_cols" + done + (( i += block_cols )) # Prepare to print the next row + printf "\n" + done + done +} + +print_run 0 16 # The first 16 colours are spread over the whole spectrum +printf "\n" +print_blocks 16 231 6 6 3 # 6x6x6 colour cube between 16 and 231 inclusive +print_blocks 232 255 12 2 1 # Not 50, but 24 Shades of Grey + diff --git a/local_bin/color-scripts/blacklisted/pukeskull b/local_bin/color-scripts/blacklisted/pukeskull new file mode 100755 index 0000000..3877b83 --- /dev/null +++ b/local_bin/color-scripts/blacklisted/pukeskull @@ -0,0 +1,74 @@ +#!/bin/sh +# +# ┳━┓┳━┓0┏┓┓┳━┓┏━┓┓ ┳ +# ┃┳┛┃━┫┃┃┃┃┃━┃┃ ┃┃┃┃ +# ┃┗┛┛ ┃┃┃┗┛┻━┛┛━┛┗┻┛ +# ┳━┓┳ ┓┳┏ ┳━┓ +# ┃━┛┃ ┃┣┻┓┣━ +# ┇ ┗━┛┃ ┛┻━┛ +# ┓━┓┳┏ ┳ ┓┳ ┳ +# ┗━┓┣┻┓┃ ┃┃ ┃ +# ━━┛┇ ┛┗━┛┗━┛┗━┛ +# +# the worst color script +# by xero + +cat << 'EOF' + ................. + .syhhso++++++++/++osyyhys+. + -oddyo+o+++++++++++++++o+oo+osdms: + :dmyo++oosssssssssssssssooooooo+/+ymm+` + hmyo++ossyyhhddddddddddddhyyyssss+//+ymd- + -mho+oosyhhhddmmmmmmmmmmmmmmddhhyyyso+//+hN+ + my+++syhhhhdmmNNNNNNNNNNNNmmmmmdhhyyyyo//+sd: + hs//+oyhhhhdmNNNNNNNNNNNNNNNNNNmmdhyhhhyo//++y + s+++shddhhdmmNNNNNNNNNNNNNNNNNNNNmdhhhdhyo/++/ + 'hs+shmmmddmNNNNNNNNNNNNNNNNNNNNNmddddddhs+oh/ + shsshdmmmmmNNMMMMMMMMMMMNNNNNNNNmmmmmmdhssdh- + +ssohdmmmmNNNNNMMMMMMMMNNNNNNmmmmmNNmdhhhs:` + -+oo++////++sydmNNNNNNNNNNNNNNNNNNNdyyys/--://+//: + d/+hmNNNmmdddhhhdmNNNNNNNNNNNNNNNmdhyyyhhhddmmNmdyd- + ++--+ymNMMNNNNNNmmmmNNNNNNNNNNNmdhddmNNMMMMMMNmhyss + /d+` -+ydmNMMMMMMNNmNMMMMMMMmmmmNNMMMMMNNmh- :sdo + sNo ` /ohdmNNMMMMNNMMMMMNNNMMMMMNmdyo/ ` hNh + M+' ``-/oyhmNNMNhNMNhNMMMMNmho/ ` 'MN/ + d+' `-+osydh0w.nzmNNmho: 'mN: + +o/ ` :oo+:s :+o/-` -dds + :hdo x `-/ooss:':+ooo: ` 0 :sdm+ + +dNNNh+ :ydmNNm' `sddmyo +hmNmds + dhNMMNNNNmddhsyhdmmNNNM: NNmNmhyo+oyyyhmNMMNmysd + ydNNNNNh+/++ohmMMMMNMNh oNNNNNNNmho++++yddhyssy + `:sNMMMMN' `mNMNNNd/` + XXXXXXXXX y/hMMNm/ .dXb. -hdmdy: ` XXXXXXXXXXX + XXXXXXXX `o+hNNds. -ymNNy- .yhys+/`` XXXXXXXXXX + XXXXXXXX +-+//o/+odMNMMMNdmh++////-/s XXXXXXXXXX + XXXXXXX mhNd -+d/+myo++ysy/hs -mNsdh/ XXXXXXXXXX + XXXXXXXX mhMN+ dMm-/-smy-::dMN/sMMmdo XXXXXXXXXX + XXXXXXXXXX NMy+NMMh oMMMs yMMMyNMMs+ XXXXXXXXXXX + XXXXXXXXXXX dy-hMMm+dMMMdoNMMh ydo XXXXXXXXXXXXX + XXXXXXXXXXXXX  smm 'NMMy dms sm XXXXXXXXXXXXXX + XXXXXXXXXXXXXX XXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +EOF + diff --git a/local_bin/color-scripts/blacklisted/suckless b/local_bin/color-scripts/blacklisted/suckless new file mode 100755 index 0000000..72ffccd --- /dev/null +++ b/local_bin/color-scripts/blacklisted/suckless @@ -0,0 +1,27 @@ +#!/bin/bash + +# Author: HostGrady +# Font used: https://patorjk.com/software/taag/#p=display&f=Cricket&t=suckless + + +if [ -x "$(command -v tput)" ]; then + bold="$(tput bold)" + blue="$(tput setaf 4)" + cyan="$(tput setaf 6)" + reset="$(tput sgr0)" +fi + +art="${bold}${blue} __ __ +.-----.--.--.----| |--| .-----.-----.-----. +|__ --| | | __| <| | -__|__ --|__ --| +|_____|_____|____|__|__|__|_____|_____|_____| +${reset}${cyan} software that sucks less${reset} " + +# use this as a base if you want to redo this one +#art=" __ __ +#.-----.--.--.----| |--| .-----.-----.-----. +#|__ --| | | __| <| | -__|__ --|__ --| +#|_____|_____|____|__|__|__|_____|_____|_____| +# software that sucks less " + +echo "$art" diff --git a/local_bin/color-scripts/blacklisted/tux b/local_bin/color-scripts/blacklisted/tux new file mode 100755 index 0000000..df027ac --- /dev/null +++ b/local_bin/color-scripts/blacklisted/tux @@ -0,0 +1,103 @@ +#!/bin/sh + +# ANSI Color -- use these variables to easily have different color +# and format output. Make sure to output the reset sequence after +# colors (f = foreground, b = background), and use the 'off' +# feature for anything you turn on. + +initializeANSI() +{ + esc="" + + blackf="${esc}[30m"; redf="${esc}[31m"; greenf="${esc}[32m" + yellowf="${esc}[33m" bluef="${esc}[34m"; purplef="${esc}[35m" + cyanf="${esc}[36m"; whitef="${esc}[37m" + + blackb="${esc}[40m"; redb="${esc}[41m"; greenb="${esc}[42m" + yellowb="${esc}[43m" blueb="${esc}[44m"; purpleb="${esc}[45m" + cyanb="${esc}[46m"; whiteb="${esc}[47m" + + boldon="${esc}[1m"; boldoff="${esc}[22m" + italicson="${esc}[3m"; italicsoff="${esc}[23m" + ulon="${esc}[4m"; uloff="${esc}[24m" + invon="${esc}[7m"; invoff="${esc}[27m" + + reset="${esc}[0m" +} + +# note in this first use that switching colors doesn't require a reset +# first - the new color overrides the old one. + +initializeANSI + +# ▄█████▄ +# █████████ +# ████████▀██ +# ██████████▄██ +# ██▀▀███▀▀████ +# ████ █ ██ ███ +# █ ████ +# █ ▄ ████ +# ███▀▀▀▀▀▄▀████ +# ██▀▀▀▀▀▀ ███▄ +# ▄█▀ █████ +# ███ ██████ +# ███ ██████ +# █▀██ ██████ +# █ █ █ ████ +# █ █ ██ ███ +# ██ ▀ █▀ ████ +# ███ ████ +# █████ ███ ███ +# █▀▀███ █████████ +# ▄█ ███ █▀ ████ ▀█ +# ▄█▀ ████ █ ▀ █ +# █ ████ █ █ ██ +# █ ██ █ █ ▀█ +# █ █ █ █ █ +# █ ███████████ ▄▀ +# █▄ █ ▀▀▀▀▀▀▀ █ ▄▀ +# ▀▀▀▀▀▄▄▄█▀ ▀▄ █ +# ▀▀▀▀ + +# play with these to change: +tuxbg=${cyanb} # color behind tux +tuxfg=${blackf} # tux line color + +# tip: auto update your drawings to see changes real-time +# while true; do (sleep 3s && clear && sh script); done + +cat << EOF +${tuxfg}${tuxbg} + + ▄█████▄ + █████████ + ${whiteb}████████▀██${tuxbg} + ${whiteb}██████████▄██${tuxbg} + ${whiteb}██▀▀███▀▀████${tuxbg} + ${whiteb}████ █ ██ ███${tuxbg} + ${yellowb}█ ████${tuxbg} + ${yellowb}█ ▄ ████${tuxbg} + ${yellowb}███▀▀▀▀▀▄${whiteb}▀████${tuxbg} + ${whiteb}██▀▀▀▀▀▀ ███${tuxbg}▄ + ▄█${whiteb}▀ █████${tuxbg} + ${whiteb}███ ██████${tuxbg} + ${whiteb}███ ██████${tuxbg} + ${whiteb}█▀██ ██████${tuxbg} + ${whiteb}█ █ █ ████${tuxbg} + ${whiteb}█ █ ██ ███${tuxbg} + ${whiteb}██ ▀ █▀ ████${tuxbg} + ${whiteb}███ ████${tuxbg} + ${whiteb}█████ ███ ███${tuxbg} + ${yellowb}█▀▀███${whiteb} █████████${tuxbg} + ▄${yellowb}█ ███${whiteb} █${yellowb}▀ ████ ▀█${tuxbg} + ▄█${yellowb}▀ ████${whiteb} █${yellowb} ▀ █${tuxbg} + █${yellowb} ████${whiteb} █ █${yellowb} ██${tuxbg} + █${yellowb} ██${whiteb} █ █${yellowb} ▀█${tuxbg} + █${yellowb} █${whiteb} █ █${yellowb} █${tuxbg} + █${yellowb} ███████████${yellowb} ▄${tuxbg}▀ + █${yellowb}▄ █${tuxbg} ▀▀▀▀▀▀▀ █${yellowb} ▄${tuxbg}▀ + ▀▀▀▀▀${yellowb}▄▄▄█${tuxbg}▀ ▀${yellowb}▄ █${tuxbg} + ▀▀▀▀${tuxbg} +${reset} +EOF \ No newline at end of file diff --git a/local_bin/color-scripts/blacklisted/xmonad b/local_bin/color-scripts/blacklisted/xmonad new file mode 100755 index 0000000..7949268 --- /dev/null +++ b/local_bin/color-scripts/blacklisted/xmonad @@ -0,0 +1,64 @@ +#!/bin/sh + +# Author: Ivo +# Source: http://crunchbang.org/forums/viewtopic.php?pid=237794#p237794 +# ANSI Color -- use these variables to easily have different color +# and format output. Make sure to output the reset sequence after +# colors (f = foreground, b = background), and use the 'off' +# feature for anything you turn on. + +initializeANSI() +{ + esc="" + + redf="${esc}[31m"; greenf="${esc}[32m" + yellowf="${esc}[33m" bluef="${esc}[34m"; + cyanf="${esc}[36m"; purplef="${esc}[35m" + + redfbright="${esc}[91m"; greenfbright="${esc}[92m" + yellowfbright="${esc}[93m" bluefbright="${esc}[94m"; + cyanfbright="${esc}[96m"; purplefbright="${esc}[95m" + + boldon="${esc}[1m"; + reset="${esc}[0m" +} + +# note in this first use that switching colors doesn't require a reset +# first - the new color overrides the old one. + +initializeANSI + +cat << EOF + +▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▒▓▓▓▓▓▓▓▓▓▓▓ + ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▒▓▓▓▓▓▓▓▓▓▓▓ + ░▓▓▓▓▓▓▓▓▓▓▓ ▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░ + ░▓▓▓▓▓▓▓▓▓▓▓ ▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░ + ░▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒ + ░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + ▓▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓░░░▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ + ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒ ▓▓▓▓▓▓▓▓▓▓▓▓▓ ░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + ▓▓▓▓▓▓▓▓▓▓▓▓▒ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + ▓▓▓▓▓▓▓▓▓▓▓▓▒ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + ▓▓▓▓▓▓▓▓▓▓▓▓░▓▓▓▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ + ▓▓▓▓▓▓▓▓▓▓▓▓▒ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + ░░░░▓▓▓▓▓▓▓▓▓▓▓▓▒ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + ░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ░▓▓▓▓▓▓▓▓▓▓▓░ + ░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ░▓▓▓▓▓▓▓▓▓▓▓░ + ░▓▓▓▓▓▓▓▓▓▓▓ ▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░ ░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + ░▓▓▓▓▓▓▓▓▓▓▓ ▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░ ░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + ▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▒▓▓▓▓▓▓▓▓▓▓▓░░░░ ░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒ + ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▒▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒ +▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒ +▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▒ +▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▓ + +EOF + diff --git a/local_bin/color-scripts/blocks1 b/local_bin/color-scripts/blocks1 new file mode 100755 index 0000000..3e1ad5b --- /dev/null +++ b/local_bin/color-scripts/blocks1 @@ -0,0 +1,5 @@ +#!/bin/bash +pcs() { for i in {0..7}; do echo -en "\e[${1}$((30+$i))m \u2588\u2588 \e[0m"; done; } +pcsbright() { for i in {0..7}; do echo -en "\e[${1}$((90+$i))m \u2588\u2588 \e[0m"; done; } +printf "\n%s\n%s\n\n" "$(pcs)" "$(pcsbright '1;')" + diff --git a/local_bin/color-scripts/blocks2 b/local_bin/color-scripts/blocks2 new file mode 100755 index 0000000..8a48f65 --- /dev/null +++ b/local_bin/color-scripts/blocks2 @@ -0,0 +1,54 @@ +#!/bin/sh + +# ANSI Color -- use these variables to easily have different color +# and format output. Make sure to output the reset sequence after +# colors (f = foreground, b = background), and use the 'off' +# feature for anything you turn on. +# Author: ed209 +# Source: http://crunchbang.org/forums/viewtopic.php?pid=295676#p295676 +initializeANSI() +{ + esc="" + + blackf="${esc}[30m"; redf="${esc}[31m"; greenf="${esc}[32m" + yellowf="${esc}[33m" bluef="${esc}[34m"; purplef="${esc}[35m" + cyanf="${esc}[36m"; whitef="${esc}[37m" + + blackfbright="${esc}[90m"; redfbright="${esc}[91m"; greenfbright="${esc}[92m" + yellowfbright="${esc}[93m" bluefbright="${esc}[94m"; purplefbright="${esc}[95m" + cyanfbright="${esc}[96m"; whitefbright="${esc}[97m" + + blackb="${esc}[40m"; redb="${esc}[41m"; greenb="${esc}[42m" + yellowb="${esc}[43m" blueb="${esc}[44m"; purpleb="${esc}[45m" + cyanb="${esc}[46m"; whiteb="${esc}[47m" + + boldon="${esc}[1m"; boldoff="${esc}[22m" + italicson="${esc}[3m"; italicsoff="${esc}[23m" + ulon="${esc}[4m"; uloff="${esc}[24m" + invon="${esc}[7m"; invoff="${esc}[27m" + + reset="${esc}[0m" +} + +# note in this first use that switching colors doesn't require a reset +# first - the new color overrides the old one. ■ ■ ▓ ■ ■ ■ ■ ■ + + +initializeANSI + +cat << EOF + + ${redf}■■■■${reset}${boldon}${redfbright}■■${reset} ${greenf}■■■■${reset}${boldon}${greenfbright}■■${reset} ${yellowf}■■■■${reset}${boldon}${yellowfbright}■■${reset} ${bluef}■■■■${reset}${boldon}${purplefbright}■■${reset} ${purplef}■■■■${reset}${boldon}${bluefbright}■■${reset} ${cyanf}■■■■${reset}${boldon}${cyanfbright}■■${reset} + ${redf}■■${reset}${boldon}${greenfbright}■■${reset}${boldon}${redfbright}■■${reset} ${greenf}■■${reset}${boldon}${yellowfbright}■■${reset}${boldon}${greenfbright}■■${reset} ${yellowf}■■${reset}${boldon}${bluefbright}■■${reset}${boldon}${yellowfbright}■■${reset} ${bluef}■■${reset}${purplef}■■${reset}${boldon}${purplefbright}■■${reset} ${purplef}■■${reset}${boldon}${cyanfbright}■■${reset}${boldon}${bluefbright}■■${reset} ${cyanf}■■${reset}${boldon}${purplefbright}■■${reset}${boldon}${cyanfbright}■■${reset} + ${greenf}■■${reset}${boldon}${greenfbright}■■${reset}${boldon}${redfbright}■■${reset} ${yellowf}■■${reset}${boldon}${yellowfbright}■■${reset}${boldon}${greenfbright}■■${reset} ${bluef}■■${reset}${boldon}${bluefbright}■■${reset}${boldon}${yellowfbright}■■${reset} ${boldon}${cyanfbright}■■${reset}${purplef}■■${reset}${boldon}${purplefbright}■■${reset} ${boldon}${purplefbright}■■${reset}${boldon}${cyanfbright}■■${reset}${boldon}${bluefbright}■■${reset} ${bluef}■■${reset}${boldon}${purplefbright}■■${reset}${boldon}${cyanfbright}■■${reset} + ${greenf}■■${reset}${boldon}${greenfbright}■■${reset}${boldon}${redfbright}■■${reset} ${yellowf}■■${reset}${boldon}${yellowfbright}■■${reset}${boldon}${greenfbright}■■${reset} ${bluef}■■${reset}${boldon}${bluefbright}■■${reset}${boldon}${yellowfbright}■■${reset} ${boldon}${cyanfbright}■■${reset}${purplef}■■${reset}${boldon}${purplefbright}■■${reset} ${boldon}${purplefbright}■■${reset}${boldon}${cyanfbright}■■${reset}${boldon}${bluefbright}■■${reset} ${bluef}■■${reset}${boldon}${purplefbright}■■${reset}${boldon}${cyanfbright}■■${reset} + ${redf}■■■■${reset}${boldon}${redfbright}■■${reset} ${greenf}■■■■${reset}${boldon}${greenfbright}■■${reset} ${yellowf}■■■■${reset}${boldon}${yellowfbright}■■${reset} ${bluef}■■■■${reset}${boldon}${purplefbright}■■${reset} ${purplef}■■■■${reset}${boldon}${bluefbright}■■${reset} ${cyanf}■■■■${reset}${boldon}${cyanfbright}■■${reset} + ${redf}■■${reset}${boldon}${greenfbright}■■${reset}${boldon}${redfbright}■■${reset} ${greenf}■■${reset}${boldon}${yellowfbright}■■${reset}${boldon}${greenfbright}■■${reset} ${yellowf}■■${reset}${boldon}${bluefbright}■■${reset}${boldon}${yellowfbright}■■${reset} ${bluef}■■${reset}${purplef}■■${reset}${boldon}${purplefbright}■■${reset} ${purplef}■■${reset}${boldon}${cyanfbright}■■${reset}${boldon}${bluefbright}■■${reset} ${cyanf}■■${reset}${boldon}${purplefbright}■■${reset}${boldon}${cyanfbright}■■${reset} + ${greenf}■■${reset}${boldon}${greenfbright}■■${reset}${boldon}${redfbright}■■${reset} ${yellowf}■■${reset}${boldon}${yellowfbright}■■${reset}${boldon}${greenf}■■${reset} ${bluef}■■${reset}${boldon}${bluef}■■${reset}${boldon}${yellowf}■■${reset} ${boldon}${cyanf}■■${reset}${purplef}■■${reset}${boldon}${purplef}■■${reset} ${boldon}${purplef}■■${reset}${boldon}${cyanf}■■${reset}${boldon}${bluef}■■${reset} ${bluef}■■${reset}${boldon}${purplef}■■${reset}${boldon}${cyanf}■■${reset} + ${greenf}■■${reset}${boldon}${greenfbright}■■${reset}${boldon}${redfbright}■■${reset} ${yellowf}■■${reset}${boldon}${yellowfbright}■■${reset}${boldon}${greenfbright}■■${reset} ${bluef}■■${reset}${boldon}${bluefbright}■■${reset}${boldon}${yellowfbright}■■${reset} ${boldon}${cyanfbright}■■${reset}${purplef}■■${reset}${boldon}${purplefbright}■■${reset} ${boldon}${purplefbright}■■${reset}${boldon}${cyanfbright}■■${reset}${boldon}${bluefbright}■■${reset} ${bluef}■■${reset}${boldon}${purplefbright}■■${reset}${boldon}${cyanfbright}■■${reset} + ${redf}■■■■${reset}${boldon}${redfbright}■■${reset} ${greenf}■■■■${reset}${boldon}${greenfbright}■■${reset} ${yellowf}■■■■${reset}${boldon}${yellowfbright}■■${reset} ${bluef}■■■■${reset}${boldon}${purplefbright}■■${reset} ${purplef}■■■■${reset}${boldon}${bluefbright}■■${reset} ${cyanf}■■■■${reset}${boldon}${cyanfbright}■■${reset} + ${redf}■■${reset}${boldon}${greenfbright}■■${reset}${boldon}${redfbright}■■${reset} ${greenf}■■${reset}${boldon}${yellowfbright}■■${reset}${boldon}${greenfbright}■■${reset} ${yellowf}■■${reset}${boldon}${bluefbright}■■${reset}${boldon}${yellowfbright}■■${reset} ${bluef}■■${reset}${purplef}■■${reset}${boldon}${purplefbright}■■${reset} ${purplef}■■${reset}${boldon}${cyanfbright}■■${reset}${boldon}${bluefbright}■■${reset} ${cyanf}■■${reset}${boldon}${purplefbright}■■${reset}${boldon}${cyanfbright}■■${reset} + ${greenf}■■${reset}${boldon}${greenfbright}■■${reset}${boldon}${redfbright}■■${reset} ${yellowf}■■${reset}${boldon}${yellowfbright}■■${reset}${boldon}${greenfbright}■■${reset} ${bluef}■■${reset}${boldon}${bluefbright}■■${reset}${boldon}${yellowfbright}■■${reset} ${boldon}${cyanfbright}■■${reset}${purplef}■■${reset}${boldon}${purplefbright}■■${reset} ${boldon}${purplefbright}■■${reset}${boldon}${cyanfbright}■■${reset}${boldon}${bluefbright}■■${reset} ${bluef}■■${reset}${boldon}${purplefbright}■■${reset}${boldon}${cyanfbright}■■${reset} + ${greenf}■■${reset}${boldon}${greenf}■■${reset}${boldon}${redf}■■${reset} ${yellowf}■■${reset}${boldon}${yellowf}■■${reset}${boldon}${greenf}■■${reset} ${bluef}■■${reset}${boldon}${bluef}■■${reset}${boldon}${yellowf}■■${reset} ${boldon}${cyanf}■■${reset}${purplef}■■${reset}${boldon}${purplef}■■${reset} ${boldon}${purplef}■■${reset}${boldon}${cyanf}■■${reset}${boldon}${bluef}■■${reset} ${bluef}■■${reset}${boldon}${purplef}■■${reset}${boldon}${cyanf}■■${reset} + +EOF diff --git a/local_bin/color-scripts/bloks b/local_bin/color-scripts/bloks new file mode 100755 index 0000000..13accfa --- /dev/null +++ b/local_bin/color-scripts/bloks @@ -0,0 +1,63 @@ +#!/bin/bash + +# ANSI Color -- use these variables to easily have different color +# and format output. Make sure to output the reset sequence after +# colors (f = foreground, b = background), and use the 'off' +# feature for anything you turn on. + +initializeANSI() +{ + esc="" + + blackf="${esc}[30m"; redf="${esc}[31m"; greenf="${esc}[32m" + yellowf="${esc}[33m" bluef="${esc}[34m"; purplef="${esc}[35m" + cyanf="${esc}[36m"; whitef="${esc}[37m" + + blackb="${esc}[1;90m"; redb="${esc}[1;91m"; greenb="${esc}[1;92m" + yellowb="${esc}[1;93m" blueb="${esc}[1;94m"; purpleb="${esc}[1;95m" + cyanb="${esc}[1;96m"; whiteb="${esc}[1;97m" + + boldon="${esc}[1m"; boldoff="${esc}[22m" + italicson="${esc}[3m"; italicsoff="${esc}[23m" + ulon="${esc}[4m"; uloff="${esc}[24m" + invon="${esc}[7m"; invoff="${esc}[27m" + + reset="${esc}[0m" +} + +# note in this first use that switching colors doesn't require a reset +# first - the new color overrides the old one. + +numbers (){ + +initializeANSI + +cat << EOF + +${blackf}11111111${reset} ${redf}22222222${reset} ${greenf}33333333${reset} ${yellowf}44444444${reset} ${bluef}55555555${reset} ${purplef}66666666${reset} ${cyanf}77777777${reset} ${whitef}88888888${reset} +${blackb}11111111${reset} ${redb}22222222${reset} ${greenb}33333333${reset} ${yellowb}44444444${reset} ${blueb}55555555${reset} ${purpleb}66666666${reset} ${cyanb}77777777${reset} ${whiteb}88888888${reset} + +EOF + +} + +blocks (){ + +initializeANSI + +cat << EOF + +${blackf}████${reset}${blackb}████${reset} ${redf}████${reset}${redb}████${reset} ${greenf}████${reset}${greenb}████${reset} ${yellowf}████${reset}${yellowb}████${reset} ${bluef}████${reset}${blueb}████${reset} ${purplef}████${reset}${purpleb}████${reset} ${cyanf}████${reset}${cyanb}████${reset} ${whitef}████${reset}${whiteb}████${reset} +${blackf}████${reset}${blackb}████${reset} ${redf}████${reset}${redb}████${reset} ${greenf}████${reset}${greenb}████${reset} ${yellowf}████${reset}${yellowb}████${reset} ${bluef}████${reset}${blueb}████${reset} ${purplef}████${reset}${purpleb}████${reset} ${cyanf}████${reset}${cyanb}████${reset} ${whitef}████${reset}${whiteb}████${reset} +${blackf}████${reset}${blackb}████${reset} ${redf}████${reset}${redb}████${reset} ${greenf}████${reset}${greenb}████${reset} ${yellowf}████${reset}${yellowb}████${reset} ${bluef}████${reset}${blueb}████${reset} ${purplef}████${reset}${purpleb}████${reset} ${cyanf}████${reset}${cyanb}████${reset} ${whitef}████${reset}${whiteb}████${reset} + +EOF + +} + +case $1 in + b) blocks;; + n) numbers;; + a) blocks && numbers;; + *) blocks && numbers;; +esac diff --git a/local_bin/color-scripts/colorbars b/local_bin/color-scripts/colorbars new file mode 100755 index 0000000..0ca9aaf --- /dev/null +++ b/local_bin/color-scripts/colorbars @@ -0,0 +1,38 @@ +#!/bin/sh +# +# colorbars - smpte color bars in sh +# http://git.io/colorbars + +echo + +for y in $(seq 0 13); do + printf %s ' ' + for color in 7 3 6 2 5 1 4; do + tput setab ${color} + printf %s ' ' + done + tput sgr0 + echo +done + +for y in 0 1; do + printf %s ' ' + for color in 4 0 5 0 6 0 7; do + tput setab ${color} + printf %s ' ' + done + tput sgr0 + echo +done + +for y in $(seq 0 4); do + printf %s ' ' + for color in 4 4 4 4 4 7 7 7 7 7 5 5 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0; do + tput setab ${color} + printf %s ' ' + done + tput sgr0 + echo +done + +echo \ No newline at end of file diff --git a/local_bin/color-scripts/colortest b/local_bin/color-scripts/colortest new file mode 100755 index 0000000..dc83a92 --- /dev/null +++ b/local_bin/color-scripts/colortest @@ -0,0 +1,30 @@ +#!/bin/bash + +# Daniel Crisman's ANSI color chart script from +# The Bash Prompt HOWTO: 6.1. Colours +# http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html +# +# This function echoes a bunch of color codes to the +# terminal to demonstrate what's available. Each +# line is the color code of one forground color, +# out of 17 (default + 16 escapes), followed by a +# test use of that color on all nine background +# colors (default + 8 escapes). + + T='•••' # The text for the color test + + echo -e "\n def 40m 41m 42m 43m 44m 45m 46m 47m"; + + for FGs in ' m' ' 1m' ' 30m' '1;90m' ' 31m' '1;91m' ' 32m' \ + '1;92m' ' 33m' '1;93m' ' 34m' '1;94m' ' 35m' '1;95m' \ + ' 36m' '1;96m' ' 37m' '1;97m'; + + do FG=${FGs// /} + echo -en " $FGs \033[$FG $T " + + for BG in 40m 41m 42m 43m 44m 45m 46m 47m; + do echo -en "$EINS \033[$FG\033[$BG $T \033[0m"; + done + echo; + done + echo diff --git a/local_bin/color-scripts/colortest-slim b/local_bin/color-scripts/colortest-slim new file mode 100755 index 0000000..7dc74e7 --- /dev/null +++ b/local_bin/color-scripts/colortest-slim @@ -0,0 +1,21 @@ +#!/bin/bash + +# Author: machinebacon +# Source: http://linuxbbq.org/bbs/viewtopic.php?f=4&t=1656#p33237 + +T='*' # The test text + +echo -e "\n 40m 41m 42m 43m\ + 44m 45m 46m 47m"; + +for FGs in ' m' ' 1m' ' 30m' '1;90m' ' 31m' '1;91m' ' 32m' \ + '1;92m' ' 33m' '1;93m' ' 34m' '1;94m' ' 35m' '1;95m' \ + ' 36m' '1;96m' ' 37m' '1;97m'; + do FG=${FGs// /} + echo -en " $FGs \033[$FG $T " + for BG in 40m 41m 42m 43m 44m 45m 46m 47m; + do echo -en "$EINS \033[$FG\033[$BG $T \033[0m"; + done + echo; +done +echo diff --git a/local_bin/color-scripts/colorview b/local_bin/color-scripts/colorview new file mode 100755 index 0000000..e1778a2 --- /dev/null +++ b/local_bin/color-scripts/colorview @@ -0,0 +1,34 @@ +#!/bin/bash + +# Original: http://frexx.de/xterm-256-notes/ +# http://frexx.de/xterm-256-notes/data/colortable16.sh +# Modified by Aaron Griffin +# and further by Kazuo Teramoto + +FGNAMES=(' black ' ' red ' ' green ' ' yellow' ' blue ' 'magenta' ' cyan ' ' white ') +BGNAMES=('DFT' 'BLK' 'RED' 'GRN' 'YEL' 'BLU' 'MAG' 'CYN' 'WHT') + +echo " ┌──────────────────────────────────────────────────────────────────────────┐" +for b in {0..8}; do + ((b>0)) && bg=$((b+39)) + + echo -en "\033[0m ${BGNAMES[b]} │ " + + for f in {0..7}; do + echo -en "\033[${bg}m\033[$((f+30))m ${FGNAMES[f]} " + done + + echo -en "\033[0m │" + echo -en "\033[0m\n\033[0m │ " + + for f in {0..7}; do + echo -en "\033[${bg}m\033[1;$((f+90))m ${FGNAMES[f]} " + done + + echo -en "\033[0m │" + echo -e "\033[0m" + + ((b<8)) && + echo " ├──────────────────────────────────────────────────────────────────────────┤" +done +echo " └──────────────────────────────────────────────────────────────────────────┘" diff --git a/local_bin/color-scripts/colorwheel b/local_bin/color-scripts/colorwheel new file mode 100755 index 0000000..80caaad --- /dev/null +++ b/local_bin/color-scripts/colorwheel @@ -0,0 +1,13 @@ +#!/bin/sh + +# Author: baskerville +# Source: http://crunchbang.org/forums/viewtopic.php?pid=288344#p288344 + +printf "\033[0m + \033[49;35m|\033[49;31m|\033[101;31m|\033[41;97m|\033[49;91m|\033[49;93m|\033[0m + \033[105;35m|\033[45;97m|\033[49;97m||\033[100;97m||\033[49;37m||\033[103;33m|\033[43;97m|\033[0m + \033[49;95m|\033[49;94m|\033[100;37m||\033[40;97m||\033[40;37m||\033[49;33m|\033[49;32m|\033[0m + \033[104;34m|\033[44;97m|\033[49;90m||\033[40;39m||\033[49;39m||\033[102;32m|\033[42;97m|\033[0m + \033[49;34m|\033[49;36m|\033[106;36m|\033[46;97m|\033[49;96m|\033[49;92m|\033[0m + +" \ No newline at end of file diff --git a/local_bin/color-scripts/crowns b/local_bin/color-scripts/crowns new file mode 100755 index 0000000..cfdad28 --- /dev/null +++ b/local_bin/color-scripts/crowns @@ -0,0 +1,19 @@ +#!/bin/bash + +# Author: venam + +cat </dev/null; then + LS_CMD="$(command -v find) ${DIR_COLORSCRIPTS} -maxdepth 1 -type f" + LS_CMD_B="$(command -v find) ${DIR_COLORSCRIPTS}/blacklisted -maxdepth 1 -type f" +else + LS_CMD="$(command -v ls) ${DIR_COLORSCRIPTS}" + LS_CMD_B="$(command -v ls) ${DIR_COLORSCRIPTS}/blacklisted" +fi + +list_colorscripts="$($LS_CMD | xargs -I $ basename $ | cut -d ' ' -f 1 | nl)" +length_colorscripts="$($LS_CMD | wc -l)" +list_blacklist="$($LS_CMD_B 2>/dev/null | xargs -I $ basename $ | cut -d ' ' -f 1 | nl || "")" +length_blacklist="$($LS_CMD_B 2>/dev/null | wc -l || 0)" + +fmt_help=" %-20s\t%-54s\n" +function _help() { + echo "Description: A collection of terminal color scripts." + echo "" + echo "Usage: colorscript [OPTION] [SCRIPT NAME/INDEX]" + printf "${fmt_help}" \ + "-h, --help, help" "Print this help." \ + "-l, --list, list" "List all installed color scripts." \ + "-r, --random, random" "Run a random color script." \ + "-e, --exec, exec" "Run a specified color script by SCRIPT NAME or INDEX." \ + "-b, --blacklist, blacklist" "Blacklist a color script by SCRIPT NAME or INDEX." \ + "-u, --unblacklist, unblacklist" "Unblacklist a color script by SCRIPT NAME or INDEX." \ + "-a, --all, all" "List the outputs of all colorscripts with their SCRIPT NAME" +} + +function _list() { + echo "There are "$($LS_CMD | wc -l)" installed color scripts:" + echo "${list_colorscripts}" +} + +function _list_blacklist() { + echo "There are $length_blacklist blacklisted color scripts:" + echo "${list_blacklist}" +} + +function _random() { + declare -i random_index=$RANDOM%$length_colorscripts + [[ $random_index -eq 0 ]] && random_index=1 + + random_colorscript="$(echo "${list_colorscripts}" | sed -n ${random_index}p | + tr -d ' ' | tr '\t' ' ' | cut -d ' ' -f 2)" + # echo "${random_colorscript}" + exec "${DIR_COLORSCRIPTS}/${random_colorscript}" +} + +function ifhascolorscipt() { + [[ -e "${DIR_COLORSCRIPTS}/$1" ]] && echo "Has this color script." +} + +function _run_by_name() { + if [[ "$1" == "random" ]]; then + _random + elif [[ -n "$(ifhascolorscipt "$1")" ]]; then + exec "${DIR_COLORSCRIPTS}/$1" + else + echo "Input error, Don't have color script named $1." + exit 1 + fi +} + +function _run_by_index() { + if [[ "$1" -gt 0 && "$1" -le "${length_colorscripts}" ]]; then + + colorscript="$(echo "${list_colorscripts}" | sed -n ${1}p | + tr -d ' ' | tr '\t' ' ' | cut -d ' ' -f 2)" + exec "${DIR_COLORSCRIPTS}/${colorscript}" + else + echo "Input error, Don't have color script indexed $1." + exit 1 + fi +} + +function _run_colorscript() { + if [[ "$1" =~ ^[0-9]+$ ]]; then + _run_by_index "$1" + else + _run_by_name "$1" + fi +} + +function _run_all() { + for s in $DIR_COLORSCRIPTS/*; do + echo "$(echo $s | awk -F '/' '{print $NF}'):" + echo "$($s)" + echo + done +} + +function _blacklist_colorscript() { # by name only + if [ ! -d "${DIR_COLORSCRIPTS}/blacklisted" ]; then + sudo mkdir "${DIR_COLORSCRIPTS}/blacklisted" + fi + sudo mv "${DIR_COLORSCRIPTS}/$1" "${DIR_COLORSCRIPTS}/blacklisted" +} + +function _unblacklist_colorscript() { # by name only + if [ -f "${DIR_COLORSCRIPTS}/blacklisted/$1" ]; then + sudo mv "${DIR_COLORSCRIPTS}/blacklisted/$1" "${DIR_COLORSCRIPTS}" + else + echo "Input error. Script $1 is not blacklisted!" + fi +} + +case "$#" in +0) + _help + ;; +1) + case "$1" in + -h | --help | help) + _help + ;; + -l | --list | list) + _list + ;; + -b | --blacklist | blacklist) + _list_blacklist + ;; + -r | --random | random) + _random + ;; + -a | --all | all) + _run_all + ;; + *) + echo "Input error." + exit 1 + ;; + esac + ;; +2) + if [[ "$1" == "-e" || "$1" == "--exec" || "$1" == "exec" ]]; then + _run_colorscript "$2" + elif [[ "$1" == "-b" || "$1" == "--blacklist" || "$1" == "blacklist" ]]; then + _blacklist_colorscript "$2" + elif [[ "$1" == "-u" || "$1" == "--unblacklist" || "$1" == "unblacklist" ]]; then + _unblacklist_colorscript "$2" + else + echo "Input error." + exit 1 + fi + ;; +*) + echo "Input error, too many arguments." + exit 1 + ;; +esac diff --git a/local_bin/deleteOrphans b/local_bin/deleteOrphans new file mode 100755 index 0000000..c86ca08 --- /dev/null +++ b/local_bin/deleteOrphans @@ -0,0 +1,2 @@ +#!/bin/bash +sudo pacman -Qtdq | sudo pacman -Rns - diff --git a/local_bin/dev b/local_bin/dev new file mode 100755 index 0000000..5fe445e --- /dev/null +++ b/local_bin/dev @@ -0,0 +1,105 @@ +#!/bin/bash + +# Constants +gfetch="gfetch -d churn contributors --no-color-palette --no-title" +ls="eza --header --icons --all --color=always --group-directories-first --hyperlink" +projects_dir="$HOME/dev" +projects_command="find $projects_dir -mindepth 2 -maxdepth 2 -type d" +fzf_command="fzf --height=100%" + +yaml_config() { + local yaml_file="$1" + local dest_dir="$2" + local dest_yaml_file="$dest_dir/.tmuxp.yaml" + + cp "$yaml_file" "$dest_yaml_file" + sed -i "1i start_directory: $dest_dir\nsession_name: $tab_title" "$dest_yaml_file" +} + +tmuxp_load() { + if [[ -n "$TMUX" ]]; then + tmuxp load -d "$selected_dir" + zoxide_score + else + tmuxp load "$selected_dir" + zoxide_score + fi + tmux switch-client -t "$tab_title" +} + +handle_tmuxp() { + if [[ -f "$selected_dir/.tmuxp.yaml" ]]; then + tmuxp_load + else + if [[ -d "$XDG_CONFIG_HOME/tmuxp" ]]; then + local yaml_file=$(find "$XDG_CONFIG_HOME/tmuxp" -name "*.yaml" -print0 | + xargs -0 -n 1 basename | sed 's/\.yaml$//' | + fzf --preview "bat --style=numbers --color=always $XDG_CONFIG_HOME/tmuxp/{}.yaml" \ + --prompt="Select a session file: ") + if [[ -n "$yaml_file" ]]; then + yaml_config "$XDG_CONFIG_HOME/tmuxp/$yaml_file.yaml" "$selected_dir" + tmuxp_load + else + handle_tmux + fi + fi + fi +} + +handle_tmux() { + if [[ -n "$TMUX" ]]; then + tmux new-session -ds "$tab_title" -c "$selected_dir" + tmux switch-client -t "$tab_title" + else + tmux new-session -s "$tab_title" -c "$selected_dir" + fi + zoxide_score +} + +handle_kitty() { + kitty @ set-tab-title "$tab_title" + cd "$selected_dir" + zoxide_score + $gfetch + $ls +} + +handle_editor() { + if [[ "$EDITOR" == "nvim" || "$EDITOR" == "vim" ]]; then + echo "terminal" + elif [[ "$EDITOR" == "code" || "$EDITOR" == "codium" ]]; then + echo "gui" + fi +} + +zoxide_score() { + if command -v zoxide &>/dev/null; then + zoxide add "$selected_dir" + fi +} + +selected_dir=$($projects_command | $fzf_command --prompt='Select a directory: ' \ + --header='CTRL-P: Projects / CTRL-Z: Zoxide' \ + --bind "ctrl-p:reload($projects_command)" \ + --bind "ctrl-z:reload(zoxide query -l)" \ + --preview "$gfetch {} 2>&1 | grep -v 'Error: Could not find a git repository in' || true && $ls {} || $ls {}") + +tab_title=$(basename "$selected_dir") + +if [[ -n "$selected_dir" ]]; then + editor_type=$(handle_editor) + if [[ $editor_type == "terminal" ]]; then + if command -v tmux &>/dev/null; then + if command -v tmuxp &>/dev/null; then + handle_tmuxp + else + handle_tmux + fi + elif [[ "$TERM" == "xterm-kitty" ]]; then + handle_kitty + fi + else + $EDITOR -r "$selected_dir" + zoxide_score + fi +fi diff --git a/local_bin/downloadMedia b/local_bin/downloadMedia new file mode 100755 index 0000000..cbd062b --- /dev/null +++ b/local_bin/downloadMedia @@ -0,0 +1,87 @@ +#!/bin/bash + +image_folder="$HOME/pictures/" +video_folder="$HOME/videos/" + +# Utils +notify() { + notify-send "Media Download" "$1" -i ~/.local/share/icons/Catppuccin-SE/64x64/mimetypes/application-x-partial-download.svg --app-name=gallery-dl +} + +notify_error() { + notify-send "Media Download" "$1" -u critical -i ~/.local/share/icons/Catppuccin-SE/64x64/mimetypes/application-x-partial-download.svg --app-name=gallery-dl +} + +download_images() { + gallery-dl -d "$image_folder" --download-archive "$image_folder/{$1}/archive.sqlite3" "$2" --filter "$3" +} + +download_videos() { + gallery-dl -d "$video_folder" --download-archive "$video_folder/{$1}/archive.sqlite3" "$2" --filter "$3" +} + +# Download Sites +download_pinterest() { + download_images "pinterest" "$1" "extension not in ('mp4', 'gif')" + download_videos "pinterest" "$1" "extension in ('mp4', 'gif')" + notify "Pinterest ($1) Complete" +} + +download_pixiv() { + download_images "pixiv" "$1" "extension not in ('mp4', 'gif')" + notify "Pixiv ($1) Complete" +} + +download_twitter() { + download_images "twitter" "$1" "extension not in ('mp4', 'gif')" + download_videos "twitter" "$1" "extension in ('mp4', 'gif')" + notify "Twitter ($1) Complete" +} + +download_reddit() { + download_images "reddit" "$1" "extension not in ('mp4')" + download_videos "reddit" "$1" "extension in ('mp4')" + notify "Reddit ($1) Complete" +} + +download_unknown_site() { + download_images "$1" "extension not in ('mp4', 'gif')" + download_videos "$1" "extension in ('mp4', 'gif')" + notify "$1 Complete" +} + +if ! command -v gallery-dl &>/dev/null; then + notify_error "gallery-dl is not installed" + exit 1 +fi + +url_file="$HOME/.gallery-dl/urls.txt" + +if [ ! -f "$url_file" ]; then + notify_error "URl file does not exist" + exit 1 +fi + +notify "Started Download..." + +while IFS= read -r url; do + case "$url" in + *pinterest.com*) + download_pinterest "$url" + ;; + *pixiv.net*) + download_pixiv "$url" + ;; + *x.com*) + download_twitter "$url" + ;; + *reddit.com*) + download_reddit "$url" + ;; + *) + download_unknown_site "$url" + ;; + esac +done <"$url_file" + +notify "Media Download Complete" diff --git a/local_bin/downloadSpotify b/local_bin/downloadSpotify new file mode 100755 index 0000000..a2b8a96 --- /dev/null +++ b/local_bin/downloadSpotify @@ -0,0 +1,25 @@ +#!/bin/bash + +notify() { + notify-send "Spotdl Sync" "$1" --icon=spotify --app-name=Spotify +} + +if ! command -v spotdl &>/dev/null; then + notify "Error: spotdl is not installed" + exit 1 +fi + +MUSIC_FOLDER="$HOME/music/listen-to" + +notify "Started syncing..." + +while IFS= read -r -d '' SPOTDL_FILE; do + if [[ -f "$SPOTDL_FILE" && "$SPOTDL_FILE" == *.spotdl ]]; then + FOLDER_NAME=$(basename "$(dirname "$SPOTDL_FILE")") + cd "$(dirname "$SPOTDL_FILE")" || continue + spotdl sync --user-auth "$(basename "$SPOTDL_FILE")" + notify "Synced $FOLDER_NAME" + fi +done < <(find "$MUSIC_FOLDER" -mindepth 1 -maxdepth 3 -type f -name '*.spotdl' -print0) + +notify "Spotdl Sync Complete" diff --git a/local_bin/genact b/local_bin/genact new file mode 100755 index 0000000..d33b939 Binary files /dev/null and b/local_bin/genact differ diff --git a/local_bin/gitignore b/local_bin/gitignore new file mode 100755 index 0000000..6fd361c --- /dev/null +++ b/local_bin/gitignore @@ -0,0 +1,13 @@ +#!/bin/bash + +function __gi() { + curl -L -s https://www.gitignore.io/api/"$@" +} + + +IFS="," +selected_profiles=$(for item in $(__gi list); do echo $item; done | fzf --multi --ansi | paste -s -d "," -) +if [ -n "$selected_profiles" ]; then + echo "$selected_profiles" | { read result && __gi "$result" > .gitignore; echo "Created .gitignore"; } +fi + diff --git a/local_bin/ignore b/local_bin/ignore new file mode 100755 index 0000000..849e86f --- /dev/null +++ b/local_bin/ignore @@ -0,0 +1,20 @@ +#!/bin/sh + +function __gi() { + curl -L -s https://www.gitignore.io/api/"$@" +} + +if [ "$#" -eq 0 ]; then + IFS+="," + result=$(for item in $(__gi list); do + echo $item + done | fzf --multi --ansi | paste -s -d "," -) + + if [ -n "$result" ]; then + __gi "$result" > .gitignore + echo ".gitignore created: $result" + fi +else + __gi "$@" > .gitignore + echo ".gitignore created: $@" +fi diff --git a/local_bin/installCodiumExtensions b/local_bin/installCodiumExtensions new file mode 100755 index 0000000..022138a --- /dev/null +++ b/local_bin/installCodiumExtensions @@ -0,0 +1,9 @@ +#!/bin/bash + +if [ -z "$1" ]; then + exit 1 +fi + +cat "$1" | while read extension || [[ -n $extension ]]; do + vscodium --install-extension "$extension" --force +done diff --git a/local_bin/installYay b/local_bin/installYay new file mode 100755 index 0000000..61a95c4 --- /dev/null +++ b/local_bin/installYay @@ -0,0 +1,12 @@ +#!/bin/bash + +sudo pacman -Syu +mkdir /tmp/yay +cd /tmp/yay + +curl -OJ 'https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=yay' +makepkg -si + +cd +rm -rf /tmp/yay +yay --version diff --git a/local_bin/pipes b/local_bin/pipes new file mode 100755 index 0000000..c7bf81c --- /dev/null +++ b/local_bin/pipes @@ -0,0 +1,385 @@ +#!/bin/bash +# pipes.sh: Animated pipes terminal screensaver. +# https://github.com/pipeseroni/pipes.sh +# +# Copyright (c) 2015-2018 Pipeseroni/pipes.sh contributors +# Copyright (c) 2013-2015 Yu-Jie Lin +# Copyright (c) 2010 Matthew Simpson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +VERSION=1.3.0 + +M=32768 # Bash RANDOM maximum + 1 +p=1 # number of pipes +f=75 # frame rate +s=13 # probability of straight fitting +r=2000 # characters limit +t=0 # iteration counter for -r character limit +w=80 # terminal size +h=24 + +# ab -> sets[][idx] = a*4 + b +# 0: up, 1: right, 2: down, 3: left +# 00 means going up , then going up -> ┃ +# 12 means going right, then going down -> ┓ +sets=( + "┃┏ ┓┛━┓ ┗┃┛┗ ┏━" + "│╭ ╮╯─╮ ╰│╯╰ ╭─" + "│┌ ┐┘─┐ └│┘└ ┌─" + "║╔ ╗╝═╗ ╚║╝╚ ╔═" + "|+ ++-+ +|++ +-" + "|/ \/-\ \|/\ /-" + ".. .... .... .." + ".o oo.o o.oo o." + "-\ /\|/ /-\/ \|" # railway + "╿┍ ┑┚╼┒ ┕╽┙┖ ┎╾" # knobby pipe +) +SETS=() # rearranged all pipe chars into individul elements for easier access + +# pipes' +x=() # current position +y=() +l=() # current directions + # 0: up, 1: right, 2: down, 3: left +n=() # new directions +v=() # current types +c=() # current escape codes + +# selected pipes' +V=() # types (indexes to sets[]) +C=() # color indices for tput setaf +VN=0 # number of selected types +CN=0 # number of selected colors +E=() # pre-generated escape codes from BOLD, NOCOLOR, and C + +# switches +RNDSTART=0 # randomize starting position and direction +BOLD=1 +NOCOLOR=0 +KEEPCT=0 # keep pipe color and type + + +# print help message in 72-char width +print_help() { + local cgap + printf -v cgap '%*s' $((15 - ${#COLORS})) '' + cat <= 0 + is_N() { + [[ -n $1 && -z ${1//[0-9]} ]] + } + + + # test if $1 is a hexadecimal string + is_hex() { + [[ -n $1 && -z ${1//[0-9A-Fa-f]} ]] + } + + + # print error message for invalid argument to standard error, this + # - mimics getopts error message + # - use all positional parameters as error message + # - has a newline appended + # $arg and $OPTARG are the option name and argument set by getopts. + pearg() { + printf "%s: -$arg invalid argument -- $OPTARG; %s\n" "$0" "$*" >&2 + } + + + OPTIND=1 + while getopts "p:t:c:f:s:r:RBCKhv" arg; do + case $arg in + p) + if is_N "$OPTARG" && ((OPTARG > 0)); then + p=$OPTARG + else + pearg 'must be an integer and greater than 0' + return 1 + fi + ;; + t) + if [[ "$OPTARG" = c???????????????? ]]; then + V+=(${#sets[@]}) + sets+=("${OPTARG:1}") + elif is_N "$OPTARG" && ((OPTARG < ${#sets[@]})); then + V+=($OPTARG) + else + pearg 'must be an integer and from 0 to' \ + "$((${#sets[@]} - 1)); or a custom type" + return 1 + fi + ;; + c) + if [[ $OPTARG == '#'* ]]; then + if ! is_hex "${OPTARG:1}"; then + pearg 'unrecognized hexadecimal string' + return 1 + fi + if ((16$OPTARG >= COLORS)); then + pearg 'hexadecimal must be from #0 to' \ + "#$(printf '%X' $((COLORS - 1)))" + return 1 + fi + C+=($((16$OPTARG))) + elif is_N "$OPTARG" && ((OPTARG < COLORS)); then + C+=($OPTARG) + else + pearg "must be an integer and from 0 to $((COLORS - 1));" \ + 'or a hexadecimal string with # prefix' + return 1 + fi + ;; + f) + if is_N "$OPTARG" && ((OPTARG >= 20 && OPTARG <= 100)); then + f=$OPTARG + else + pearg 'must be an integer and from 20 to 100' + return 1 + fi + ;; + s) + if is_N "$OPTARG" && ((OPTARG >= 5 && OPTARG <= 15)); then + s=$OPTARG + else + pearg 'must be an integer and from 5 to 15' + return 1 + fi + ;; + r) + if is_N "$OPTARG"; then + r=$OPTARG + else + pearg 'must be a non-negative integer' + return 1 + fi + ;; + R) RNDSTART=1;; + B) BOLD=0;; + C) NOCOLOR=1;; + K) KEEPCT=1;; + h) + print_help + exit 0 + ;; + v) echo "$(basename -- "$0") $VERSION" + exit 0 + ;; + *) + return 1 + esac + done + + shift $((OPTIND - 1)) + if (($#)); then + printf "$0: illegal arguments -- $*; no arguments allowed\n" >&2 + return 1 + fi +} + + +cleanup() { + # clear out standard input + read -t 0.001 && cat /dev/null + + tput reset # fix for konsole, see pipeseroni/pipes.sh#43 + tput rmcup + tput cnorm + stty echo + printf "$SGR0" + exit 0 +} + + +resize() { + w=$(tput cols) h=$(tput lines) +} + + +init_pipes() { + # +_CP_init_pipes + local i + + ci=$((KEEPCT ? 0 : CN * RANDOM / M)) + vi=$((KEEPCT ? 0 : VN * RANDOM / M)) + for ((i = 0; i < p; i++)); do + (( + n[i] = 0, + l[i] = RNDSTART ? RANDOM % 4 : 0, + x[i] = RNDSTART ? w * RANDOM / M : w / 2, + y[i] = RNDSTART ? h * RANDOM / M : h / 2, + v[i] = V[vi] + )) + c[i]=${E[ci]} + ((ci = (ci + 1) % CN, vi = (vi + 1) % VN)) + done + # -_CP_init_pipes +} + + +init_screen() { + stty -echo + tput smcup + tput civis + tput clear + trap cleanup HUP TERM + + resize + trap resize SIGWINCH +} + + +main() { + # simple pre-check of TERM, tput's error message should be enough + tput -T "$TERM" sgr0 >/dev/null || return $? + + # +_CP_init_termcap_vars + COLORS=$(tput colors) # COLORS - 1 == maximum color index for -c argument + SGR0=$(tput sgr0) + SGR_BOLD=$(tput bold) + # -_CP_init_termcap_vars + + parse "$@" || return $? + + # +_CP_init_VC + # set default values if not by options + ((${#V[@]})) || V=(0) + VN=${#V[@]} + ((${#C[@]})) || C=(1 2 3 4 5 6 7 0) + CN=${#C[@]} + # -_CP_init_VC + + # +_CP_init_E + # generate E[] based on BOLD (SGR_BOLD), NOCOLOR, and C for each element in + # C, a corresponding element in E[] = + # SGR0 + # + SGR_BOLD, if BOLD + # + tput setaf C, if !NOCOLOR + local i + for ((i = 0; i < CN; i++)) { + E[i]=$SGR0 + ((BOLD)) && E[i]+=$SGR_BOLD + ((NOCOLOR)) || E[i]+=$(tput setaf ${C[i]}) + } + # -_CP_init_E + + # +_CP_init_SETS + local i j + for ((i = 0; i < ${#sets[@]}; i++)) { + for ((j = 0; j < 16; j++)) { + SETS+=("${sets[i]:j:1}") + } + } + unset i j + # -_CP_init_SETS + + init_screen + init_pipes + + # any key press exits the loop and this script + trap 'break 2' INT + + local i + while REPLY=; do + read -t 0.0$((1000 / f)) -n 1 2>/dev/null + case "$REPLY" in + P) ((s = s < 15 ? s + 1 : s));; + O) ((s = s > 3 ? s - 1 : s));; + F) ((f = f < 100 ? f + 1 : f));; + D) ((f = f > 20 ? f - 1 : f));; + B) ((BOLD = (BOLD + 1) % 2));; + C) ((NOCOLOR = (NOCOLOR + 1) % 2));; + K) ((KEEPCT = (KEEPCT + 1) % 2));; + ?) break;; + esac + for ((i = 0; i < p; i++)); do + # New position: + # l[] direction = 0: up, 1: right, 2: down, 3: left + # +_CP_newpos + ((l[i] % 2)) && ((x[i] += -l[i] + 2, 1)) || ((y[i] += l[i] - 1)) + # -_CP_newpos + + # Loop on edges (change color on loop): + # +_CP_warp + ((!KEEPCT && (x[i] >= w || x[i] < 0 || y[i] >= h || y[i] < 0))) \ + && { c[i]=${E[CN * RANDOM / M]}; ((v[i] = V[VN * RANDOM / M])); } + ((x[i] = (x[i] + w) % w, + y[i] = (y[i] + h) % h)) + # -_CP_warp + + # new turning direction: + # $((s - 1)) in $s, going straight, therefore n[i] == l[i]; + # and 1 in $s that pipe makes a right or left turn + # + # s * RANDOM / M - 1 == 0 + # n[i] == -1 + # => n[i] == l[i] + 1 or l[i] - 1 + # +_CP_newdir + (( + n[i] = s * RANDOM / M - 1, + n[i] = n[i] >= 0 ? l[i] : l[i] + (2 * (RANDOM % 2) - 1), + n[i] = (n[i] + 4) % 4 + )) + # -_CP_newdir + + # Print: + # +_CP_print + printf '\e[%d;%dH%s%s' \ + $((y[i] + 1)) $((x[i] + 1)) ${c[i]} \ + "${SETS[v[i] * 16 + l[i] * 4 + n[i]]}" + # -_CP_print + l[i]=${n[i]} + done + ((r > 0 && t * p >= r)) && tput reset && tput civis && t=0 || ((t++)) + done + + cleanup +} + + +# when being sourced, $0 == bash, only invoke main when they are the same +[[ "$0" != "$BASH_SOURCE" ]] || main "$@" diff --git a/local_bin/restartAudio b/local_bin/restartAudio new file mode 100755 index 0000000..fb0a1c3 --- /dev/null +++ b/local_bin/restartAudio @@ -0,0 +1,10 @@ +#!/bin/bash +pkill easyeffects + +wait + +systemctl --user restart wireplumber pipewire pipewire-pulse + +notify-send "Audio restarted" "Audio services have been restarted" -i ~/.local/share/icons/Catppuccin-SE/64x64/mimetypes/audio-x-generic.svg --app-name=Audio + +easyeffects --gapplication-service & diff --git a/local_bin/speedtest b/local_bin/speedtest new file mode 100755 index 0000000..44c03da Binary files /dev/null and b/local_bin/speedtest differ diff --git a/local_bin/tty-clock b/local_bin/tty-clock new file mode 100755 index 0000000..135b6a6 Binary files /dev/null and b/local_bin/tty-clock differ diff --git a/local_bin/unimatrix b/local_bin/unimatrix new file mode 100755 index 0000000..098f928 --- /dev/null +++ b/local_bin/unimatrix @@ -0,0 +1,766 @@ +#!/usr/bin/env python3 +# +# unimatrix.py +# +# +# Python script to simulate the display from "The Matrix" in terminal. Uses +# half-width katakana unicode characters by default, but can use custom +# character sets. Accepts keyboard controls while running. +# +# Based on CMatrix by Chris Allegretta and Abishek V. Ashok. The following +# option should produce virtually the same output as CMatrix: +# $ unimatrix -n -s 96 -l o +# +# Unimatrix is free software: you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation, either version 3 of the License, or (at your option) any later +# version. +# +# Unimatrix is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License at +# for more details. +# +# Created by William Mannard +# 2018/01/19 + +import argparse +import curses +import time +from random import choice, randint + +help_msg = ''' +USAGE + unimatrix [-a] [-b] [-c COLOR] [-f] [-g COLOR] [-h] [-l CHARACTER_LIST] [-n] + [-o] [-s SPEED] [-u CUSTOM_CHARACTERS] + +OPTIONAL ARGUMENTS + -a Asynchronous scroll. Lines will move at varied speeds. + + -b Use only bold characters + + -c COLOR One of: green (default), red, blue, white, yellow, cyan, + magenta, black + + -f Enable "flashers," characters that continuously change. + + -g COLOR Background color (See -c). Defaults to keeping + terminal's current background. + + -h Show this help message and exit + + -i Ignore keyboard + + -l CHARACTER_LIST Select character set(s) using a string over letter + codes (see CHARACTER SETS below.) + + -n Do not use bold characters (overrides -b) + + -o Disable on-screen status + + -s SPEED Integer up to 100. 0 uses a one-second delay before + refreshing, 100 uses none. Use negative numbers for + even lower speeds. Default=85 + + -t TIME Exit the process after TIME seconds + + -u CUSTOM_CHARACTERS Your own string of characters to display. Enclose in + single quotes ('') to escape special characters. For + example: -u '#$(' + + -w Single-wave mode: Does a single burst of green rain, + exits. You can put in a .bashrc file to run when your + terminal launches. Works well with speed at 95. + +LONG ARGUMENTS + -a --asynchronous + -b --all-bold + -c --color=COLOR + -f --flashers + -g --bg-color=COLOR + -h --help + -i --ignore-keyboard + -l --character-list=CHARACTER_LIST + -s --speed=SPEED + -n --no-bold + -o --status-off + -t --time + -u --custom-characters=CUSTOM_CHARACTERS + -w --single-wave + +CHARACTER SETS + When using '-l' or '--character-list=' option, follow it with one or more of + the following letters: + + a Lowercase alphabet + A Uppercase alphabet + c Lowercase Russian Cyrillic alphabet + C Uppercase Russian Cyrillic alphabet + e A few common emoji ( ☺☻✌♡♥❤⚘❀❃❁✼☀✌♫♪☃❄❅❆☕☂★ ) + g Lowercase Greek alphabet + G Uppercase Greek alphabet + k Japanese katakana (half-width) + m Default 'Matrix' set, equal to 'knnssss' + n Numbers 0-9 + o 'Old' style non-unicode set, like cmatrix. Equal to 'AaSn' + p Klingon pIqaD (requires 'Horta' family font)* + P Klingon pIqaD (requires 'Klingon-pIqaD' or 'Code2000' family font)* + r Lowercase Roman numerals ( mcclllxxxxvvvvviiiiii ) + R Uppercase Roman numerals ( MCCLLLXXXXVVVVVIIIIII ) + s A subset of symbols actually used in the Matrix films ( -=*_+|:<>" ) + S All common keyboard symbols ( `-=~!z#$%^&*()_+[]{}|\;':",./<>?" ) + u Custom characters selected using -u switch + + For example: '-l naAS' or '--character-list=naAS' will give something similar + to the output of the original cmatrix program in its default mode. + '-l ACG' will use all the upper-case character sets. Use the same + letter multiple times to increase the frequency of the character set. For + example, the default setting is equal to '-l knnssss'. + + * With most modern Linux terminals (gnome-terminal, konsole, lxterminal, + xfce4-terminal, mate-terminal) simply having the font installed system-wide + is enough. The terminal will fall back to it for the Klingon, meaning that + you don't have to select the font in your terminal settings. 'Horta' seems + not to work in Konsole. Fonts may need to be set manually as fallbacks in + .Xresources for older terminals, such as urxvt and xterm. + +KEYBOARD CONTROL + SPACE, CTRL-c or q exit + - or LEFT decrease speed by 1 + + or RIGHT increase speed by 1 + [ or DOWN decrease speed by 10 + ] or UP increase speed by 10 + a toggle asynchronous scrolling + b cycle through bold character options + (bold off-->bold on-->all bold) + f toggle flashing characters + o toggle on-screen status + 1 to 9 set color: (1) Green (2) Red (3) Blue (4) White + (5) Yellow (6) Cyan (7) Magenta (8) Black + (9) Terminal default + ! to ( set background color (same colors as above, but pressing + shift + number) + +EXAMPLES + Mimic default output of cmatrix (no unicode characters, works in TTY): + $ unimatrix -n -s 96 -l o + + Use the letters from the name of your favorite operating system in bold blue: + $ unimatrix -B -u Linux -c blue + + Use default character set, plus dollar symbol (note single quotes around + special character): + $ unimatrix -l knnssssu -u '$' + + No bold characters, slowly, using emojis, numbers and a few symbols: + $ unimatrix -n -l ens -s 50 +''' + +### Set up parser and apply arguments settings + +parser = argparse.ArgumentParser(add_help=False) + +parser.add_argument('-a', '--asynchronous', + action='store_true', + help='use asynchronous scrolling') +parser.add_argument('-b', '--all-bold', + action='store_true', + help='use all bold characters') +parser.add_argument('-c', '--color', + default='green', + help='one of: green (default), red, blue, white, yellow, \ + cyan, magenta, black', + type=str) +parser.add_argument('-f', '--flashers', + action='store_true', + help='some characters will continuously change in place') +parser.add_argument('-g', '--bg-color', + default='default', + help='background color (see -c)', + type=str) +parser.add_argument('-h', '--help', + help='display extended usage information and exit.', + action='store_true') +parser.add_argument('-i', '--ignore-keyboard', + help='ignore all keyboard input.', + action='store_true') +parser.add_argument('-l', '--character-list', + help='character set. See details below', + type=str) +parser.add_argument('-n', '--no-bold', + action='store_true', + help='do not use bold characters') +parser.add_argument('-o', '--status-off', + action='store_true', + help='Disable on-screen status') +parser.add_argument('-s', '--speed', + help='speed, integer up to 100. Default=85', + default=85, + type=int) +parser.add_argument('-t', '--time', + help='time. See details below', + type=int) +parser.add_argument('-u', '--custom-characters', + help='your own string of characters to display', + default='', + type=str) +parser.add_argument('-w', '--single-wave', + help='runs a single "wave" of green rain then exits', + action='store_true') + +args = parser.parse_args() + +if args.help: + print(help_msg) + exit() + +char_set = { + + 'a': 'qwertyuiopasdfghjklzxcvbnm', + 'A': 'QWERTYUIOPASDFGHJKLZXCVBNM', + 'c': 'абвгдежзиклмнопрстуфхцчшщъыьэюя', + 'C': 'АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ', + 'e': '☺☻✌♡♥❤⚘❀❃❁✼☀✌♫♪☃❄❅❆☕☂★', + 'g': 'αβγδεζηθικλμνξοπρστυφχψως', + 'G': 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ', + 'k': 'ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン', + 'm': 'ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン1234567890' + '1234567890-=*_+|:<>"-=*_+|:<>"-=*_+|:<>"-=*_+|:<>"', + 'n': '1234567890', + 'o': 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890' + '`-=~!@#$%^&*()_+[]{}|\;\':",./<>?"', + 'p': '', + 'P': '', + 'r': 'mcclllxxxxvvvvviiiiii', + 'R': 'MCCLLLXXXXVVVVVIIIIII', + 's': '-=*_+|:<>"', + 'S': '`-=~!@#$%^&*()_+[]{}|\;\':",./<>?"', + 'u': args.custom_characters} + +colors_str = { + 'green': curses.COLOR_GREEN, + 'red': curses.COLOR_RED, + 'blue': curses.COLOR_BLUE, + 'white': curses.COLOR_WHITE, + 'yellow': curses.COLOR_YELLOW, + 'cyan': curses.COLOR_CYAN, + 'magenta': curses.COLOR_MAGENTA, + 'black': curses.COLOR_BLACK, + 'default': -1} + +start_color = colors_str[args.color] +start_bg = colors_str[args.bg_color] + +speed = args.speed +start_delay = (100 - speed) * 10 + +runtime = None + +if args.time: + runtime = args.time + +# "-l" option has been used +if args.character_list: + chars = '' + for letter in args.character_list: + try: + chars += char_set[letter] + except KeyError: + print("Letter '%s' does not represent a valid character list." + % letter) + exit() + +# "-l" not used, but "-u" is set +elif args.custom_characters: + chars = args.custom_characters + +# Neither "-l" nor "-u" has been set, use default characters +else: + chars = char_set['m'] + +if args.no_bold: + args.all_bold = False + +chars_len = len(chars) - 1 + + +### Classes + +class Canvas: + """ + Represents the whole screen and stores its height and width. Gets + overwritten whenever the screen resizes. Serves as a container for columns. + """ + + def __init__(self, screen): + screen.clear() + rows, cols = screen.getmaxyx() + self.col_count = cols + self.row_count = rows + self.size_changed = False + self.columns = [] + for col in range(0, cols, 2): + self.columns.append(Column(col, self.row_count)) + self.nodes = [] + self.flashers = set() + + # Draw a background + for x in range(self.row_count): + try: + screen.addstr(x, 0, ' ' * self.col_count, curses.color_pair(1)) + except curses.error: + pass + + +class Status: + """ + Displays a status message at top left when a setting is changed. + """ + + def __init__(self, screen): + curses.init_pair(3, curses.COLOR_BLACK, curses.COLOR_WHITE) + self.screen = screen + self.countdown = 0 + self.last_message = '' + + def update(self, message, delay): + """ + Writes new message to the status area + """ + if not args.status_off: + message_str = message.ljust(11) + self.screen.addstr(0, 0, message_str, curses.color_pair(3)) + self.last_message = message_str + # More frames for faster speeds: + self.countdown = (100 // (delay // 10 + 1)) + 2 + + def refresh(self): + """ + Used to keep refreshing status message until countdown runs out + """ + message_str = self.last_message + self.screen.addstr(0, 0, message_str, curses.color_pair(3)) + + def clear(self): + """ + Erases message with spaces when the countdown runs out + """ + self.screen.addstr(0, 0, ' ' * 11, curses.color_pair(1)) + + +class Column: + """ + Creates nodes (points that move down the screen) that are then stored in + canvas.nodes. Countdown timer determines time to spawn new node. + """ + + def __init__(self, x_coord, row_count): + self.drawing = None # None means not yet. Later will be True or False + self.x_coord = x_coord + self.timer = randint(1, row_count) + self.async_speed = randint(1, 3) + if args.single_wave: + # Speeds it up a bit + self.timer = int(0.6 * self.timer) + + def spawn_node(self, canvas): + """ + Creates nodes: points that move down the screen either writing or + erasing characters as they go down + """ + if args.single_wave and self.drawing is False: + return + + self.drawing = not self.drawing + + # Multiplier (mult) is for spawning slow-moving asynchronous nodes + # less frequently in order to maintain their length + if args.asynchronous: + mult = self.async_speed + else: + mult = 1 + + if self.drawing: + # "max_range" prevents crash with very small terminal height + max_range = max((3 * mult), ((canvas.row_count - 3) * mult)) + self.timer = randint(3 * mult, max_range) + if args.single_wave: + # A bit faster for single wave mode + self.timer = int(0.8 * self.timer) + else: + self.timer = randint(1 * mult, canvas.row_count * mult) + + x = self.x_coord + n_type = 'eraser' + async_speed = self.async_speed + white = False + if self.drawing: + n_type = 'writer' + if randint(0, 2) == 0: + white = True + + canvas.nodes.append(Node(x, n_type, async_speed, white)) + + +class Node: + """ + A point that runs down the screen drawing or erasing characters. + n_type -> 'writer' or 'eraser' + white -> Bool. If True, a white char is written before the green one. + last_char -> Stores last character, since white characters have to be + overwritten with the same one in green one. + expired -> Bool. If True, node is marked for deletion + """ + + def __init__(self, x_coord, n_type, async_speed, white=False): + self.x_coord = x_coord + self.y_coord = 0 + self.n_type = n_type + self.white = white + self.last_char = None + self.expired = False + self.async_speed = async_speed + + +class KeyHandler: + """ + Handles keyboard input. + """ + + def __init__(self, screen, stat): + self.screen = screen + self.stat = stat + self.screen.nodelay(True) + self.delay = start_delay + self.fg = start_color + self.bg = start_bg + + def cycle_bold(self): + """ + Called on 'b' press. Cycles though Bold options: + off -> on -> all bold + """ + if args.all_bold: + args.no_bold = True + args.all_bold = False + self.stat.update('Bold: off', self.delay) + elif args.no_bold: + args.no_bold = False + args.all_bold = False + self.stat.update('Bold: on', self.delay) + else: + args.no_bold = False + args.all_bold = True + self.stat.update('Bold: all', self.delay) + + def get(self): + """ + Handles key presses. Returns True if a key was found, False otherwise. + """ + if args.ignore_keyboard: + return False; + + kp = self.screen.getch() + + if kp == -1: + return False + elif kp == ord(" ") or kp == ord("q") or kp == 27: # 27 = ESC + exit() + elif kp == ord('a'): + args.asynchronous = not args.asynchronous + on_off = 'on' if args.asynchronous else 'off' + self.stat.update('Async: %s' % on_off, self.delay) + elif kp == ord('b'): + self.cycle_bold() + elif kp == ord('f'): + args.flashers = not args.flashers + on_off = 'on' if args.flashers else 'off' + self.stat.update('Flash: %s' % on_off, self.delay) + elif kp == ord('o'): + self.toggle_status() + + # Speed control + elif kp == ord('-') or kp == ord('_') or kp == curses.KEY_LEFT: + self.delay = min(self.delay + 10, 10990) + self.show_speed() + elif kp == ord('=') or kp == ord('+') or kp == curses.KEY_RIGHT: + self.delay = max(self.delay - 10, 0) + self.show_speed() + elif kp == ord('[') or kp == curses.KEY_DOWN: + self.delay = min(self.delay + 100, 10990) + self.show_speed() + elif kp == ord(']') or kp == curses.KEY_UP: + self.delay = max(self.delay - 100, 0) + self.show_speed() + + # Foreground color control + elif kp == ord('1'): + self.set_fg_color('Green') + elif kp == ord('2'): + self.set_fg_color('Red') + elif kp == ord('3'): + self.set_fg_color('Blue') + elif kp == ord('4'): + self.set_fg_color('White') + elif kp == ord('5'): + self.set_fg_color('Yellow') + elif kp == ord('6'): + self.set_fg_color('Cyan') + elif kp == ord('7'): + self.set_fg_color('Magenta') + elif kp == ord('8'): + self.set_fg_color('Black') + elif kp == ord('9'): + self.set_fg_color('default') + + # Background color control + elif kp == ord('!'): + self.set_bg_color('Green') + elif kp == ord('@'): + self.set_bg_color('Red') + elif kp == ord('#'): + self.set_bg_color('Blue') + elif kp == ord('$'): + self.set_bg_color('White') + elif kp == ord('%'): + self.set_bg_color('Yellow') + elif kp == ord('^'): + self.set_bg_color('Cyan') + elif kp == ord('&'): + self.set_bg_color('Magenta') + elif kp == ord('*'): + self.set_bg_color('Black') + elif kp == ord('('): + self.set_bg_color('default') + + return True + + def set_fg_color(self, name): + """ + Set foreground color + """ + self.fg = colors_str[name.lower()] + curses.init_pair(1, self.fg, self.bg) + if name == 'default': + name = "Def't color" + self.stat.update(name, self.delay) + + def set_bg_color(self, name): + """ + Set background color + """ + self.bg = colors_str[name.lower()] + curses.init_pair(1, self.fg, self.bg) + curses.init_pair(2, curses.COLOR_WHITE, self.bg) + self.stat.update('BG: %s' % name, self.delay) + + def show_speed(self): + """ + Display current speed (-999 to 100) when it is changed by keypress + """ + self.stat.update('Speed: %d' % (100 - self.delay // 10), self.delay) + + def toggle_status(self): + """ + On 'o' keypress, turn status display on or off + """ + args.status_off = not args.status_off + on_off = 'off' if args.status_off else 'on' + self.stat.update('Status: %s' % on_off, self.delay) + + +class Writer: + """ + Initializes character writing options and contains methods for writing and + erasing characters from the screen. + """ + + def __init__(self, screen): + self.screen = screen + self.screen.scrollok(0) + curses.curs_set(0) + curses.use_default_colors() + curses.init_pair(1, start_color, start_bg) + curses.init_pair(2, curses.COLOR_WHITE, start_bg) + curses.init_pair(3, curses.COLOR_BLACK, curses.COLOR_WHITE) + self.white = curses.color_pair(2) + + @staticmethod + def get_char(): + """ + Returns a random character from the active character set + """ + return chars[randint(0, chars_len)] + + @staticmethod + def get_attr(node, above=False): + """ + Returns either A_BOLD attribute or A_NORMAL based on Bold setting + "above=True" means it an extra green character used to overwrite the + while head character. + """ + if args.no_bold: + return curses.A_NORMAL + elif args.all_bold: + return curses.A_BOLD + else: + if node.white and not above: + return curses.A_BOLD + else: + return choice([curses.A_BOLD, curses.A_NORMAL]) + + def draw(self, node): + """ + Draws characters, included spaces to overwrite/erase characters. + """ + y = node.y_coord + x = node.x_coord + character = ' ' + attr = self.get_attr(node) + color = curses.color_pair(1) + if node.n_type == 'writer': + if not node.white and node.last_char: + # Special green character for overwriting last white one + # at bottom of column that was not being overwritten. + character = node.last_char + else: + character = self.get_char() + if node.white: + color = curses.color_pair(2) + + try: + # Draw the character + self.screen.addstr(y, x, character, color | attr) + if node.white: + if node.last_char: + # If it's a white node, also write a green character above + # to overwrite last white character + attr = self.get_attr(node, above=True) + self.screen.addstr(y - 1, x, node.last_char, + curses.color_pair(1) | attr) + node.last_char = character + except curses.error: + # Override scrolling error if characters pushed off the screen. + pass + + def draw_flasher(self, flasher): + """ + Draws characters, included spaces to overwrite/erase characters. + """ + color = curses.color_pair(1) + attr = choice([curses.A_BOLD, curses.A_NORMAL]) + y = flasher[0] + x = flasher[1] + try: + self.screen.addstr(y, x, self.get_char(), color | attr) + except curses.error: + pass + + +### Main loop + +def _main(screen): + writer = Writer(screen) + stat = Status(screen) + key = KeyHandler(screen, stat) + # Prevent single_wave mode from shutting down too early: + if args.single_wave: + wave_delay = 10 + else: + wave_delay = 0 + + starttime = time.time() + + # Keep restarting however many times the screen resizes + while True: + canvas = Canvas(screen) + # Set a rhythm for asynchronous movement + async_clock = 5 + # Loop to draw the green rain + while not canvas.size_changed: + if runtime and time.time() - starttime > runtime: + exit() + # Catch keypress + if key.get(): + continue + # Spawn new nodes + for col in canvas.columns: + if col.timer == 0: + col.spawn_node(canvas) + col.timer -= 1 + + for node in canvas.nodes: + + if args.flashers: + if node.n_type == 'writer' and not randint(0, 9): + canvas.flashers.add((node.y_coord, node.x_coord)) + elif node.n_type == 'eraser': + try: + canvas.flashers.remove((node.y_coord, node.x_coord)) + except KeyError: + pass + + if args.asynchronous: + if async_clock % node.async_speed == 0: + writer.draw(node) + node.y_coord += 1 + else: + writer.draw(node) + node.y_coord += 1 + + # Mark old nodes for deletion + if node.y_coord >= canvas.row_count: + if node.white: + # Stop white nodes from staying 'stuck' on last row. + # Creates a special green node with a last_char + # attribute to overwrite last white node. + node.white = False + node.y_coord -= 1 + else: + node.expired = True + + if args.flashers and (not async_clock % 3): + for f in canvas.flashers: + writer.draw_flasher(f) + + # Rewrite nodes list without expired nodes + canvas.nodes = [node for node in canvas.nodes if not node.expired] + + if args.single_wave: + if len(canvas.nodes) == 0 and wave_delay < 0: + exit() + wave_delay -= 1 + + # End of loop, refresh screen + if stat.countdown > 0: + if stat.countdown == 1: + stat.clear() + else: + stat.refresh() + stat.countdown -= 1 + screen.refresh() + + # Check for screen resize + if screen.getmaxyx() != (canvas.row_count, canvas.col_count): + canvas.size_changed = True + + # Add delay before next loop + curses.napms(key.delay) + + # update async clock + if async_clock: + async_clock -= 1 + else: + async_clock = 5 + + +def main(): + # Wrapper to allow CTRL-C to exit smoothly: + try: + curses.wrapper(_main) + except KeyboardInterrupt: + pass + + +if __name__ == '__main__': + main() diff --git a/local_bin/wttr b/local_bin/wttr new file mode 100755 index 0000000..430bfc7 --- /dev/null +++ b/local_bin/wttr @@ -0,0 +1,235 @@ +#!/bin/bash +# +#Author : Amirreza Firoozi +#Author : Carsten Brueggenolte +#name : wttr +#Update 1.30: change config dir to $HOME/.config/wttr to go in line with other configuration files +#Update 1.30: changed default city filename to 'default-city.txt' +#Update 1.40: add v2.wttr.in feature and did some clean up +#Update 1.41: add spaces in between city and url +#Update 1.42: reverse changes with the space between url and city +#Update 1.50: add v3.wttr.in - thanks to dok-ock for the inspiration and the fixes +#Update 1.51: update about section and add it to the help screen +#Update 1.52: move help and about into their own variables for better maintanance +#Update 1.53: add a parameters '-t' current forecast and '-n' current weather +#Update 1.54: spell check and added some optional parameters for -help, -today, -now + +wttr_ver="1.54_2021-09-03" #define script version + +GITHUB_REPO_URL="https://github.com/cblte/bash-script-wttr" +URL="https://wttr.in/" +URLv2="https://v2.wttr.in/" +URLv3="https://v3.wttr.in/" + +About() +{ +echo -e =" +About the + +██╗ ██╗████████╗████████╗██████╗ ██╗███╗ ██╗ +██║ ██║╚══██╔══╝╚══██╔══╝██╔══██╗ ██║████╗ ██║ +██║ █╗ ██║ ██║ ██║ ██████╔╝ ██║██╔██╗ ██║ +██║███╗██║ ██║ ██║ ██╔══██╗ ██║██║╚██╗██║ +╚███╔███╔╝ ██║ ██║ ██║ ██║██╗██║██║ ╚████║ + ╚══╝╚══╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝╚═╝╚═╝ ╚═══╝ + script by Carsten Brueggenolte + + +This is a simple bash script to check weather condition +with the help of wttr.in. The script 'wttr' is under GPL3 License. + +Source is available on Github: $GITHUB_REPO_URL + +Big THANK YOU goes to + - 'Amirreza Firoozi' (https://github.com/AmirrezaFiroozi/wttr) + for creating the initial script + - 'doc-ock' (https://github.com/doc-ock/) for the idea to add + version 3 of wttr.in and some other useful parameters. +" +} + +Help() +{ +echo -e " +Write 'wttr {your+city+name}' to check the weather condition of your city. +Surround city name with single- or double-quotes if city name contains more than one word. +You can also put a '+' (plus-sign) in beetween words when you do not want to surround with quotes. + +Examples: + wttr cologne + wttr \"Den Haag, Netherland\" + wttr Den+Haag + wttr \"Den Haag Street, South Africa\" + wttr New+York + +You can type 'wttr' only if you have defined a standard city. + +Parameters: + -a show some information about this script + -h for some help (this page) + -hh for the official wttr.in/:help page + -i to install curl which is necessary for script to run correctly + -m for photo of moon + -n show current weather only + -rm to remove the script :( + -sdef to define a city as your default city + -t show today's forecast + -v show script version + -v2 to fetch different weather report view for the standard city + -v2 {your city name} to fetch different weather report view for city mentioned + -v3 {your city name} to fetch an in-terminal graphic for the given region. + +Hint: + When using '-v3' you do not need to add the '.sxl' to the + end of the region/city name. The script will add it automatically. + +Any bugs? Any suggestions? Contact information at https://cbrueggenolte.de/impressum +" +} + +# ------------------------ +# ----- Script starts here +# ------------------------ + +# Check if a standard city has been set +if [ -f "$HOME/.config/wttr/default-city.txt" ];then #check if user set default city or not . if user did load it to variable def + cd $HOME/.config/wttr + def=$(cat default-city.txt) +elif [ ! -d $HOME/.config/wttr ];then #if he/she didn`t make a blank file + mkdir "$HOME/.config/wttr" 2>/dev/null + cd $HOME/.config/wttr + echo "" > default-city.txt + def="" +fi + +# Print out some help if no arguments provided and no standard city been set +if [ "$#" == "0" ] && [ "$def" == "" ];then + echo -e "You have not entered any parameters and no standard city set yet.\nNeed help? try 'wttr -h'" +elif [ "$#" -gt "2" ];then + echo -e "too many parameters. \nNeed help? try 'wttr -h'" +else + case $1 in + # currently doesn't work: upgrade. There is some permissions problem + # "-u" | "-upgrade") + # echo -e "Checking for upgrades..." + # git clone $GITHUB_REPO_URL /tmp/wttr + # bash /tmp/wttr/installer.sh + # ;; + "-a") # about + About + ;; + "-h" | "-help") #showing help + Help + ;; + "-hh") + curl https://wttr.in/:help + ;; + "-i") + sudo apt install curl + ;; + "-m") + curl http://wttr.in/moon + ;; + "-n" | "-now") + echo -e "Fetching current weather" + if [ "$#" == "2" ];then + city="$2" + city=${city// /+} + city=${city//[^a-zA-Z0-9+]} + curl $URL"$city?0n" + else + curl $URL"$def?0n" + fi + cd $HOME + ;; + "-rm") + read -p "Do you really want to remove wttr? (y/n)" response + if [ "$response" == "y" ];then + cd /usr/bin + sudo rm -R "wttr" 2>/dev/null + if [ -d "$HOME/.config/wttr" ];then + sudo rm -d "$HOME/.config/wttr" 2>/dev/null + fi + echo -e "Script has deleted :(" + else + echo -e "Opration canceled" + fi + ;; + "-sdef") # set the default city + if [ ! -d $HOME/.config/wttr ];then + cd $HOME + mkdir -p ".config/wttr" 2>/dev/null + fi + if [ "$#" == "2" ];then + cd $HOME/.config/wttr + echo "$2" > default-city.txt + echo -e "" + echo -e "Done. Set '$2' as your default city. You can check its weather condition by typing only 'wttr' now :)" + else + read -p "Enter your city name to set as the default city (example : cologne) : " def + # replacing spaces with + signes and removing non wanted chars + def=${def// /+} + def=${def//[^a-zA-Z0-9+]} + if [ "$def" == "" ] && [ "$#" -ne "2" ];then + echo "you did NOT enter anything ..." + else + cd $HOME/.config/wttr + echo $def > default-city.txt + echo -e "" + echo -e "Done. Set '$def' as your default city. You can check its weather condition by typing only 'wttr' now :)" + fi + fi #end of the second if + ;; + "-t" | "-today") + echo -e "Fetching today's forecast" + if [ "$#" == "2" ];then + city="$2" + city=${city// /+} + city=${city//[^a-zA-Z0-9+]} + curl $URL"$city?1n" + else + curl $URL"$def?1n" + fi + cd $HOME + ;; + "-v") + echo -e "wttr_VERSION is: "$wttr_ver" " + ;; + "-v2") + echo -e "Fetching v2 of wttr.in" + if [ "$#" == "2" ];then + city="$2" + city=${city// /+} + city=${city//[^a-zA-Z0-9+]} + curl $URLv2"$city" + else + curl $URLv2"$def" + fi + cd $HOME + ;; + "-v3") + echo -e "Fetching v3 of wttr.in" + if [ "$#" == "2" ];then + city="$2" + city=${city// /+} + city=${city//[^a-zA-Z0-9+]} + curl $URLv3"$city".sxl + else + curl $URLv3"$def".sxl + fi + cd $HOME + ;; + "") + cd $HOME + curl $URL"$def" + ;; + *) + + city=$1 + city=${city// /+} + city=${city//[^a-zA-Z0-9+]} + curl $URL"$city" + + ;; + esac +fi diff --git a/mpv/.github/README.md b/mpv/.github/README.md new file mode 100644 index 0000000..affa9d5 --- /dev/null +++ b/mpv/.github/README.md @@ -0,0 +1,3 @@ +
+ +
diff --git a/mpv/.github/title.png b/mpv/.github/title.png new file mode 100644 index 0000000..baca4b3 Binary files /dev/null and b/mpv/.github/title.png differ diff --git a/mpv/input.conf b/mpv/input.conf new file mode 100644 index 0000000..064f76e --- /dev/null +++ b/mpv/input.conf @@ -0,0 +1,66 @@ +# Progress +# 60 seconds +CTRL+SHIFT+l seek 60 +CTRL+SHIFT+l seek -60 +CTRL+SHIFT+RIGHT seek 60 +CTRL+SHIFT+LEFT seek -60 + +# 30 seconds +SHIFT+l seek 30 +SHIFT+h seek -30 +SHIFT+RIGHT seek 30 +SHIFT+LEFT seek -30 + +# 10 seconds +CTRL+l seek 10 +CTRL+h seek -10 +CTRL+RIGHT seek 10 +CTRL+LEFT seek -10 + +# 5 seconds +l seek 5 +h seek -5 +RIGHT seek 5 +LEFT seek -5 + +# 2 seconds +ALT+l seek 2 +ALT+h seek -2 +ALT+RIGHT seek 2 +ALT+LEFT seek -2 + +# Disables all normal mouse scrolls +WHEEL_LEFT ignore +WHEEL_RIGHT ignore + + +# Audio +# 100% +CTRL+SHIFT+k add volume 100 +CTRL+SHIFT+j add volume -100 +CTRL+SHIFT+UP add volume 100 +CTRL+SHIFT+DOWN add volume -100 + +# 50% +SHIFT+k add volume 50 +SHIFT+j add volume -50 +SHIFT+UP add volume 50 +SHIFT+DOWN add volume -50 + +# 25% +CTRL+k add volume 25 +CTRL+j add volume -25 +CTRL+UP add volume 25 +CTRL+DOWN add volume -25 + +# 10% +k add volume 10 +j add volume -10 +UP add volume 10 +DOWN add volume -10 + +# 5% +ALT+k add volume 5 +ALT+j add volume -5 +ALT+UP add volume 5 +ALT+DOWN add volume -5 diff --git a/mpv/mpv.conf b/mpv/mpv.conf new file mode 100644 index 0000000..d22e48b --- /dev/null +++ b/mpv/mpv.conf @@ -0,0 +1,290 @@ + +# Uses GPU-accelerated video output by default. +#vo=gpu +# Can cause performance problems with some GPU drivers and GPUs. +#profile=gpu-hq + +# ===== REMOVE THE ABOVE FOUR LINES AND RESAVE IF YOU ENCOUNTER PLAYBACK ISSUES AFTER ===== + +# Source: https://github.com/hl2guide/better-mpv-config + +# External Sources: +# * https://raw.githubusercontent.com/classicjazz/mpv-config/master/mpv.conf + +# Theme +background-color='#24273a' +osd-back-color='#6e738d' +osd-border-color='#181926' +osd-color='#cad3f5' +osd-shadow-color='#24273a' + +# Screenshots +screenshot-directory='~/Imagenes/Capturas/PC' +screenshot-template='mpv-%f-%p' + +# Enables best HW decoder; turn off for software decoding +hwdec=auto + +# Keeps open the window after a video is finished +keep-open + +border=no # hides the window title bar +msg-color=yes # color log messages on terminal +term-osd-bar=yes # displays a progress bar on the terminal +cursor-autohide=1000 # autohides the cursor after 1s + +# Sets a custom font +osd-font='JetBrainsMono Nerd Font Light' +osd-font-size=35 +# osd-scale=0.5 + +# Saves the seekbar position on exit +save-position-on-quit=yes + +# Uses a large seekable RAM cache even for local input. +cache=yes +# cache-secs=300 +# Uses extra large RAM cache (needs cache=yes to make it useful). +demuxer-max-bytes=1800M +demuxer-max-back-bytes=1200M + +# Sets the profile restore method to "copy if equal" +profile-restore=copy-equal + +# ===== Audio ===== + +# Sets volume to 100%. +volume=100 + +# Normalizes audio +# af-add='dynaudnorm=g=5:f=250:r=0.9:p=0.5' + +# ===== Color Space ===== +target-trc=auto +gamma-auto +vf=format=colorlevels=full:colormatrix=auto +video-output-levels=full + +# ===== Dithering ===== +dither-depth=auto +temporal-dither=yes +dither=fruit + +# ===== Debanding ===== +deband=yes # enabled by default +deband-iterations=4 # deband steps +deband-threshold=48 # deband strength +deband-range=16 # deband range +deband-grain=48 # dynamic grain: set to "0" if using the static grain shader + +# ===== Subtitles ===== +blend-subtitles=yes + +# ===== Motion Interpolation ===== +override-display-fps=75 +video-sync=display-resample +interpolation=yes +tscale=oversample # smoothmotion + +# ===== Anti-Ringing ===== +scale-antiring=0.7 # luma upscale deringing +dscale-antiring=0.7 # luma downscale deringing +cscale-antiring=0.7 # chroma upscale deringing + +# ===== Upscaling & Processing ===== +glsl-shaders-clr +# luma upscaling +# note: any FSRCNNX above FSRCNNX_x2_8-0-4-1 is not worth the additional computional overhead +glsl-shaders="~/.config/mpv/shaders/FSRCNNX_x2_8-0-4-1.glsl" +scale=ewa_lanczos +# luma downscaling +# note: ssimdownscaler is tuned for mitchell and downscaling=no +glsl-shaders-append="~/.config/mpv/shaders/SSimDownscaler.glsl" +dscale=mitchell +linear-downscaling=no +# chroma upscaling and downscaling +glsl-shaders-append="~/.config/mpv/shaders/KrigBilateral.glsl" +cscale=mitchell +sigmoid-upscaling=yes + +# ===== Custom Profiles ===== +# Uses specific naming convensions for shorter easier typing. +# Naming Convensions: +# V = Very Low, L = Low, M = Medium, H = High, U = Ultra, S = Supreme +# Very Low = 480p, Low = 720p, Medium = 1080p, High = 1440p, Ultra = 2160p (4K), Supreme = 4320p (8K) +# 30 = 30 frames per second, 60 = 60 frames per second +# Use the switch e.g: --profile=H60 +# 4320p (8K) 60 FPS +[S60] +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc="Supereme - 4320p (8K) - 60 FPS" +ytdl-format=bestvideo[height<=?4320][fps<=?60][vcodec!=?vp9]+bestaudio/best +# 4320p (8K) 30 FPS +[S30] +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc="Supereme - 4320p (8K) - 30 FPS" +ytdl-format=bestvideo[height<=?4320][fps<=?30][vcodec!=?vp9]+bestaudio/best +# 2160p (4K) 60 FPS +[U60] +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc="Ultra - 2160p (4K) - 60 FPS" +ytdl-format=bestvideo[height<=?2160][fps<=?60][vcodec!=?vp9]+bestaudio/best +# 2160p (4K) 30 FPS +[U30] +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc="Ultra - 2160p (4K) - 30 FPS" +ytdl-format=bestvideo[height<=?2160][fps<=?30][vcodec!=?vp9]+bestaudio/best +# 1440p 60 FPS +[H60] +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc="High - 1440p - 60 FPS" +ytdl-format=bestvideo[height<=?1440][fps<=?60][vcodec!=?vp9]+bestaudio/best +# 1440p 30 FPS +[H30] +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc="High - 1440p - 30 FPS" +ytdl-format=bestvideo[height<=?1440][fps<=?30][vcodec!=?vp9]+bestaudio/best +# 1080p 60 FPS +[M60] +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc="Medium - 1080p - 60 FPS" +ytdl-format=bestvideo[height<=?1080][fps<=?60][vcodec!=?vp9]+bestaudio/best +# 1080p 30 FPS +[M30] +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc="Medium - 1080p - 30 FPS" +ytdl-format=bestvideo[height<=?1080][fps<=?30][vcodec!=?vp9]+bestaudio/best +# 720p 60 FPS +[L60] +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc="Low - 720p - 60 FPS" +ytdl-format=bestvideo[height<=?720][fps<=?60][vcodec!=?vp9]+bestaudio/best +# 720p 30 FPS +[L30] +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc="Low - 720p - 30 FPS" +ytdl-format=bestvideo[height<=?720][fps<=?30][vcodec!=?vp9]+bestaudio/best +# 480p 60 FPS +[V60] +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc="Very Low - 480p - 60 FPS" +ytdl-format=bestvideo[height<=?480][fps<=?60][vcodec!=?vp9]+bestaudio/best +# 480p 30 FPS +[V30] +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc="Very Low - 480p - 30 FPS" +ytdl-format=bestvideo[height<=?480][fps<=?30][vcodec!=?vp9]+bestaudio/best + +# Other Profiles + +[4k60] # 2160p @ 60fps (3840x2160 UHDTV) +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc=4k60 +profile-cond=((width ==3840 and height ==2160) and p["estimated-vf-fps"]>=31) +# deband=yes # necessary to avoid blue screen with KrigBilateral.glsl +deband=no # turn off debanding because presume wide color gamut +interpolation=no # turn off interpolation because presume 60fps +# UHD videos are already 4K so no luma upscaling is needed +# UHD videos are YUV420 so chroma upscaling is still needed +glsl-shaders-clr +# glsl-shaders="~/.config/mpv/shaders/KrigBilateral.glsl" # enable if your hardware can support it +interpolation=no # no motion interpolation required because 60fps is hardware ceiling +# no deinterlacer required because progressive + +[4k30] # 2160p @ 24-30fps (3840x2160 UHDTV) +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc=4k30 +profile-cond=((width ==3840 and height ==2160) and p["estimated-vf-fps"]<31) +# deband=yes # necessary to avoid blue screen with KrigBilateral.glsl +deband=no # turn off debanding because presume wide color gamut +# UHD videos are already 4K so no luma upscaling is needed +# UHD videos are YUV420 so chroma upscaling is still needed +glsl-shaders-clr +# glsl-shaders="~/.config/mpv/shaders/KrigBilateral.glsl" # enable if your hardware can support it +# apply motion interpolation +# no deinterlacer required because progressive + +[full-hd60] # 1080p @ 60fps (progressive ATSC) +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc=full-hd60 +profile-cond=((width ==1920 and height ==1080) and not p["video-frame-info/interlaced"] and p["estimated-vf-fps"]>=31) +# apply all luma and chroma upscaling and downscaling settings +interpolation=no # no motion interpolation required because 60fps is hardware ceiling +# no deinterlacer required because progressive + +[full-hd30] # 1080p @ 24-30fps (NextGen TV/ATSC 3.0, progressive Blu-ray) +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc=full-hd30 +profile-cond=((width ==1920 and height ==1080) and not p["video-frame-info/interlaced"] and p["estimated-vf-fps"]<31) +# apply all luma and chroma upscaling and downscaling settings +# apply motion interpolation +# no deinterlacer required because progressive + +[full-hd-interlaced] # 1080i @ 24-30fps (HDTV, interlaced Blu-rays) +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc=full-hd-interlaced +profile-cond=((width ==1920 and height ==1080) and p["video-frame-info/interlaced"] and p["estimated-vf-fps"]<31) +# apply all luma and chroma upscaling and downscaling settings +# apply motion interpolation +vf=bwdif # apply FFMPEG's bwdif deinterlacer + +[hd] # 720p @ 60 fps (HDTV, Blu-ray - progressive) +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc=hd +profile-cond=(width ==1280 and height ==720) +# apply all luma and chroma upscaling and downscaling settings +interpolation=no # no motion interpolation required because 60fps is hardware ceiling +# no deinterlacer required because progressive + +[sdtv-ntsc] # 640x480, 704x480, 720x480 @ 30fps (NTSC DVD - interlaced) +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc=sdtv-ntsc +profile-cond=((width ==640 and height ==480) or (width ==704 and height ==480) or (width ==720 and height ==480)) +# apply all luma and chroma upscaling and downscaling settings +# apply motion interpolation +vf=bwdif # apply FFMPEG's bwdif deinterlacer + +[sdtv-pal] # 352x576, 480x576, 544x576, 720x576 @ 30fps (PAL broadcast or DVD - interlaced) +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc=sdtv-pal +profile-cond=((width ==352 and height ==576) or (width ==480 and height ==576) or (width ==544 and height ==576) or (width ==720 and height ==576)) +# apply all luma and chroma upscaling and downscaling settings +# apply motion interpolation +vf=bwdif # apply FFMPEG's bwdif deinterlacer + +[default] +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" + +# ===== File Type Profiles ===== +# GIF Files +[extension.gif] +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc=gif +cache=no +no-pause +loop-file=yes +# WebM Files +[extension.webm] +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc=webm +no-pause +loop-file=yes + +# ===== Protocol Specific Configuration ===== + +[protocol.http] +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc=http +hls-bitrate=max # use max quality for HLS streams +cache=yes +no-cache-pause # don't pause when the cache runs low + +[protocol.https] +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc=https +profile=protocol.http + +[protocol.ytdl] +profile-restore=copy-equal # Sets the profile restore method to "copy if equal" +profile-desc=ytdl +profile=protocol.http diff --git a/mpv/scripts-opts/stats.conf b/mpv/scripts-opts/stats.conf new file mode 100644 index 0000000..4846af3 --- /dev/null +++ b/mpv/scripts-opts/stats.conf @@ -0,0 +1,6 @@ +# Colors are in #BBGGRR format +border_color=30201e +font_color=f5d3ca +plot_bg_border_color=f8bdb7 +plot_bg_color=30201e +plot_color=f8bdb7 diff --git a/mpv/shaders/FSRCNNX_x2_8-0-4-1.glsl b/mpv/shaders/FSRCNNX_x2_8-0-4-1.glsl new file mode 100644 index 0000000..8aee750 --- /dev/null +++ b/mpv/shaders/FSRCNNX_x2_8-0-4-1.glsl @@ -0,0 +1,413 @@ +// Source: https://github.com/xzpyth/mpv-config/blob/main/shaders/FSRCNNX_x2_8-0-4-1.glsl + +//!HOOK LUMA +//!WHEN OUTPUT.w LUMA.w / 1.300 > OUTPUT.h LUMA.h / 1.300 > * +//!DESC feature map 1 +//!BIND LUMA +//!SAVE FEATURE1 +//!COMPONENTS 4 +vec4 hook() +{ +vec4 res = vec4(-0.1572492271661758,-0.0120896836742759,0.0061487639322877,-0.2852848768234253); +res += vec4(-0.0047900392673910,0.0537447109818459,-0.0000247144635068,0.0066653941757977) * float(LUMA_texOff(vec2(-2,-2))); +res += vec4(0.0073144687339664,-0.0309004038572311,-0.0109181385487318,-0.0092840325087309) * float(LUMA_texOff(vec2(-2,-1))); +res += vec4(0.0591700896620750,0.1974907070398331,-0.0197357516735792,-0.0546554848551750) * float(LUMA_texOff(vec2(-2,0))); +res += vec4(-0.0011764382943511,-0.0299451071768999,0.0229587312787771,0.0021908886265010) * float(LUMA_texOff(vec2(-2,1))); +res += vec4(0.0098101310431957,0.0080995410680771,-0.0030452020000666,-0.0132035519927740) * float(LUMA_texOff(vec2(-2,2))); +res += vec4(-0.0168330334126949,-0.0743711441755295,-0.0259261634200811,0.0234480481594801) * float(LUMA_texOff(vec2(-1,-2))); +res += vec4(0.0239933785051107,0.1896541714668274,0.0207756329327822,-0.0370332375168800) * float(LUMA_texOff(vec2(-1,-1))); +res += vec4(0.0094799501821399,-0.0652511194348335,-0.0004292793164495,-0.0726212188601494) * float(LUMA_texOff(vec2(-1,0))); +res += vec4(0.0297284796833992,-0.1210186630487442,-0.0202929321676493,-0.0574462898075581) * float(LUMA_texOff(vec2(-1,1))); +res += vec4(-0.0318185277283192,0.0840775370597839,0.0110451309010386,0.0415569432079792) * float(LUMA_texOff(vec2(-1,2))); +res += vec4(-0.0253141783177853,0.1168256178498268,0.1159729585051537,0.0963164269924164) * float(LUMA_texOff(vec2(0,-2))); +res += vec4(-0.1103615835309029,-0.0276833958923817,-0.4999594092369080,0.1053867191076279) * float(LUMA_texOff(vec2(0,-1))); +res += vec4(1.1100435256958008,0.0646764487028122,0.0154005717486143,0.8891586661338806) * float(LUMA_texOff(vec2(0,0))); +res += vec4(0.1229330673813820,0.1719468832015991,0.5730338096618652,-0.1645544171333313) * float(LUMA_texOff(vec2(0,1))); +res += vec4(-0.0090442728251219,-0.3023961782455444,-0.1589493155479431,0.0418574027717113) * float(LUMA_texOff(vec2(0,2))); +res += vec4(0.0031942036002874,-0.1310926079750061,0.0075543406419456,-0.0016449346439913) * float(LUMA_texOff(vec2(1,-2))); +res += vec4(-0.0995150282979012,-0.0701921209692955,-0.0130895879119635,0.1344170123338699) * float(LUMA_texOff(vec2(1,-1))); +res += vec4(0.0060519003309309,-0.1533465683460236,0.0114194005727768,0.0264683905988932) * float(LUMA_texOff(vec2(1,0))); +res += vec4(0.0244008023291826,0.1881769001483917,-0.0206351149827242,-0.0628309547901154) * float(LUMA_texOff(vec2(1,1))); +res += vec4(0.0075713125988841,0.0508594363927841,0.0430423170328140,-0.0124188791960478) * float(LUMA_texOff(vec2(1,2))); +res += vec4(-0.0166875869035721,-0.0047865519300103,0.0006719123339280,0.0316803231835365) * float(LUMA_texOff(vec2(2,-2))); +res += vec4(-0.0058461269363761,0.0990798473358154,-0.0177743826061487,-0.0066122291609645) * float(LUMA_texOff(vec2(2,-1))); +res += vec4(-0.0972401946783066,-0.0225446373224258,-0.0037693574558944,0.1953062713146210) * float(LUMA_texOff(vec2(2,0))); +res += vec4(-0.0216837190091610,-0.1824268400669098,0.0069816261529922,0.0283037684857845) * float(LUMA_texOff(vec2(2,1))); +res += vec4(-0.0025767991319299,0.0459827110171318,-0.0080216089263558,0.0084134787321091) * float(LUMA_texOff(vec2(2,2))); +return res; +} + +//!HOOK LUMA +//!WHEN OUTPUT.w LUMA.w / 1.300 > OUTPUT.h LUMA.h / 1.300 > * +//!DESC feature map 2 +//!BIND LUMA +//!SAVE FEATURE2 +//!COMPONENTS 4 +vec4 hook() +{ +vec4 res = vec4(0.0541447550058365,0.0088306749239564,-0.0112389577552676,-0.0127860950306058); +res += vec4(0.0142660010606050,0.0137931071221828,0.0061188107356429,-0.0104134222492576) * float(LUMA_texOff(vec2(-2,-2))); +res += vec4(0.0147292809560895,-0.0289912857115269,0.0266769435256720,0.0933856964111328) * float(LUMA_texOff(vec2(-2,-1))); +res += vec4(-0.1734338253736496,0.1116316691040993,-0.1973157376050949,-0.0581855811178684) * float(LUMA_texOff(vec2(-2,0))); +res += vec4(0.0347507223486900,-0.0341566652059555,0.0061667622067034,0.0075258882716298) * float(LUMA_texOff(vec2(-2,1))); +res += vec4(0.0069884369149804,-0.0194250214844942,0.0080830128863454,-0.0036874092184007) * float(LUMA_texOff(vec2(-2,2))); +res += vec4(0.0233764201402664,0.0344744995236397,0.0162145942449570,0.0979529991745949) * float(LUMA_texOff(vec2(-1,-2))); +res += vec4(0.1280796974897385,-0.1018339172005653,-0.0132977198809385,-0.0019474622095004) * float(LUMA_texOff(vec2(-1,-1))); +res += vec4(0.4286882579326630,0.1222677752375603,0.7046694159507751,0.0945475697517395) * float(LUMA_texOff(vec2(-1,0))); +res += vec4(0.1107441782951355,-0.0134433070197701,-0.0174900908023119,-0.1686445474624634) * float(LUMA_texOff(vec2(-1,1))); +res += vec4(0.0321478620171547,0.0065357843413949,0.0300805997103453,0.0420113280415535) * float(LUMA_texOff(vec2(-1,2))); +res += vec4(-0.1240341588854790,0.0950303301215172,-0.0129648456349969,-0.2681856453418732) * float(LUMA_texOff(vec2(0,-2))); +res += vec4(0.4846960902214050,0.0351924635469913,0.0223043337464333,-0.1273630708456039) * float(LUMA_texOff(vec2(0,-1))); +res += vec4(-1.9379507303237915,-0.2444442063570023,0.0291962660849094,-0.3835578560829163) * float(LUMA_texOff(vec2(0,0))); +res += vec4(0.6396278142929077,-0.0765938311815262,-0.0552659817039967,0.4393545985221863) * float(LUMA_texOff(vec2(0,1))); +res += vec4(-0.1969728022813797,-0.0607173256576061,0.0131113547831774,0.0542017817497253) * float(LUMA_texOff(vec2(0,2))); +res += vec4(0.0091696009039879,-0.0031533432193100,-0.0368777588009834,-0.0459998287260532) * float(LUMA_texOff(vec2(1,-2))); +res += vec4(0.1096992492675781,0.2597902715206146,0.0304869692772627,-0.0195200722664595) * float(LUMA_texOff(vec2(1,-1))); +res += vec4(0.2889648377895355,-0.4275591969490051,-0.7414156794548035,0.2695442438125610) * float(LUMA_texOff(vec2(1,0))); +res += vec4(0.0892018377780914,-0.0229137558490038,0.0244414471089840,-0.1926898956298828) * float(LUMA_texOff(vec2(1,1))); +res += vec4(0.0576358586549759,0.0027846973389387,-0.0036861505359411,-0.0253547113388777) * float(LUMA_texOff(vec2(1,2))); +res += vec4(0.0159624069929123,0.0319602824747562,0.0019470085389912,0.0089780492708087) * float(LUMA_texOff(vec2(2,-2))); +res += vec4(0.0552792511880398,0.0543054342269897,0.0134062822908163,0.0545728243887424) * float(LUMA_texOff(vec2(2,-1))); +res += vec4(-0.1170092225074768,0.1963327825069427,0.1503890156745911,0.1891828328371048) * float(LUMA_texOff(vec2(2,0))); +res += vec4(-0.0084421783685684,0.1297017931938171,-0.0330600887537003,-0.0942063704133034) * float(LUMA_texOff(vec2(2,1))); +res += vec4(0.0118440408259630,-0.0337875857949257,0.0055063469335437,0.0254479162395000) * float(LUMA_texOff(vec2(2,2))); +return res; +} + +//!HOOK LUMA +//!WHEN OUTPUT.w LUMA.w / 1.300 > OUTPUT.h LUMA.h / 1.300 > * +//!DESC mapping 1_1 +//!BIND FEATURE1 +//!BIND FEATURE2 +//!SAVE MODEL21 +//!COMPONENTS 4 +vec4 hook() +{ +vec4 res = vec4(-0.0445119962096214,-0.7632357478141785,0.0156328510493040,-0.2424548566341400); +res += mat4(0.1279004216194153,-0.0275541823357344,0.2275633513927460,0.2241709381341934,0.0197204202413559,-0.0456816256046295,-0.1296672523021698,0.0564568229019642,-0.0241488646715879,-0.0237508192658424,-0.1899632662534714,0.4177669584751129,-0.1814560592174530,-0.0526473335921764,0.1154382973909378,-0.0715614855289459) * FEATURE1_texOff(vec2(-1,-1)); +res += mat4(-0.0660311505198479,0.0416736751794815,0.3146112561225891,0.1472041457891464,-0.3456672728061676,-0.0055983816273510,0.0022350433282554,0.0819796621799469,0.0057485047727823,0.1532524228096008,0.0204557459801435,-0.2500547170639038,-0.0524359568953514,-0.1911625266075134,-0.1078366711735725,-0.1296254843473434) * FEATURE2_texOff(vec2(-1,-1)); +res += mat4(0.0904538556933403,-0.0150672039017081,0.3322310745716095,0.0638923197984695,0.5975797176361084,-0.2452044337987900,-0.4947478473186493,-0.0783191770315170,0.5771877169609070,-0.0870653912425041,-0.8966570496559143,-0.2140965163707733,-0.0493861362338066,-0.0380848757922649,-0.1345319598913193,-0.0186063013970852) * FEATURE1_texOff(vec2(-1,0)); +res += mat4(-0.2523841261863708,0.1387074738740921,0.7878478765487671,-0.2251627445220947,0.2277439534664154,0.5417668819427490,0.0866540968418121,-0.1707777529954910,-0.0598246827721596,-0.4717158675193787,-1.2242834568023682,0.0454643070697784,-0.3503442704677582,0.0573085807263851,0.2530198395252228,-0.0207283068448305) * FEATURE2_texOff(vec2(-1,0)); +res += mat4(0.0168380383402109,-0.2142438590526581,-0.0207892972975969,0.3628533780574799,0.2431225180625916,0.3098322153091431,0.4073205888271332,-0.2762102782726288,-0.0197229012846947,0.1305596232414246,-0.5697882771492004,-0.2976251542568207,-0.0551432967185974,0.2614036500453949,-0.1410341411828995,-0.2906406223773956) * FEATURE1_texOff(vec2(-1,1)); +res += mat4(-0.0498303361237049,0.0224859956651926,0.1952174901962280,-0.0311204437166452,0.2501715123653412,-0.5893352627754211,-1.0793941020965576,0.0160885509103537,0.5081620812416077,0.0482814386487007,0.0546359121799469,-0.0501569248735905,0.1400523334741592,-0.0106841633096337,-0.0940591320395470,-0.1791856139898300) * FEATURE2_texOff(vec2(-1,1)); +res += mat4(0.0393299944698811,0.2232691347599030,-0.1055066883563995,-0.1607919186353683,-0.1567825973033905,-0.0042221010662615,-0.0548228211700916,0.2352052628993988,0.1483389288187027,0.7503526806831360,0.0797731876373291,-0.0049001369625330,-0.0242983382195234,-0.0308702979236841,0.0828925222158432,0.0561857633292675) * FEATURE1_texOff(vec2(0,-1)); +res += mat4(0.0926392748951912,-0.0418718457221985,-0.3060409128665924,-0.1883587390184402,0.0284292586147785,-0.3584854304790497,-0.7909982800483704,-0.0187337957322598,-0.2496993243694305,-0.7520986795425415,0.3771523833274841,-0.0259053874760866,0.0337998159229755,0.2209153026342392,0.0708771497011185,-0.2814430892467499) * FEATURE2_texOff(vec2(0,-1)); +res += mat4(-0.5287809371948242,0.5777525901794434,0.0880500450730324,-0.8452472090721130,-0.3393408954143524,-0.2273543328046799,-0.1298527419567108,0.4990308582782745,1.2613251209259033,-0.7636719942092896,1.5694186687469482,-0.4087363779544830,0.0874531939625740,0.7067158818244934,-0.3419588804244995,-0.3265531957149506) * FEATURE1_texOff(vec2(0,0)); +res += mat4(0.8229957222938538,-0.1236215904355049,-0.1859253048896790,1.6684840917587280,0.2000777721405029,-0.1239093989133835,1.5623438358306885,0.1779983490705490,0.1017884835600853,-0.3707404434680939,1.0626678466796875,-0.3124029338359833,0.0659058541059494,-0.3585464656352997,-0.1866402775049210,0.6733445525169373) * FEATURE2_texOff(vec2(0,0)); +res += mat4(-0.5544115900993347,-0.1892931908369064,0.2460739761590958,-0.1056193932890892,-0.4318082630634308,0.1257930994033813,-0.2672747671604156,-0.1690235435962677,0.0018221997888759,-0.4397548139095306,-0.3007801771163940,0.1068472340703011,0.3506655991077423,0.1143834441900253,0.1363849341869354,-0.1417382210493088) * FEATURE1_texOff(vec2(0,1)); +res += mat4(-0.0505668744444847,0.1831464916467667,0.3957343697547913,-0.2295413911342621,-0.3892803490161896,0.5436951518058777,0.1217770799994469,0.0223295800387859,-0.4462866187095642,-0.4055982232093811,-0.3771279454231262,0.0807068347930908,0.2116729617118835,0.0281026475131512,-0.0229265503585339,0.2868605256080627) * FEATURE2_texOff(vec2(0,1)); +res += mat4(0.1962712109088898,-0.2373334914445877,-2.5208437442779541,-0.1988540291786194,0.2224564403295517,-0.1783192902803421,-0.3962321281433105,-0.1685980409383774,0.1910390257835388,0.2554391324520111,0.4586416482925415,0.2779130041599274,-0.2002453953027725,-0.0061091855168343,1.3808131217956543,0.0434907525777817) * FEATURE1_texOff(vec2(1,-1)); +res += mat4(-0.0307611189782619,-0.0524470545351505,-0.5897512435913086,-0.0816674903035164,0.4052906930446625,0.2542210817337036,-1.9041002988815308,0.0835462361574173,-0.2484460622072220,-0.0184739269316196,0.4510098397731781,0.2587619423866272,0.1537084281444550,0.1503131389617920,-0.0742949545383453,0.0613216012716293) * FEATURE2_texOff(vec2(1,-1)); +res += mat4(0.1772638261318207,0.0948876664042473,0.0083848545327783,-0.2919732332229614,0.2566950321197510,0.0288751143962145,-0.4624863862991333,-0.0608786940574646,0.3310996592044830,-0.0104284398257732,0.6334818005561829,-0.0027201652992517,-0.0342350602149963,0.1938806027173996,-0.2464301586151123,0.0125883584842086) * FEATURE1_texOff(vec2(1,0)); +res += mat4(0.4839433431625366,-0.0502159744501114,-1.1114163398742676,-0.3965759575366974,0.2117286175489426,0.0414481423795223,-0.1332397013902664,-0.0549883767962456,-0.1275007277727127,0.7844302654266357,-0.0095163453370333,0.0961041301488876,-0.4759134948253632,-0.4284025132656097,-0.2072399407625198,-0.3953579664230347) * FEATURE2_texOff(vec2(1,0)); +res += mat4(0.1605869531631470,-0.1715892106294632,0.0865620598196983,-0.0464400537312031,-0.2688548862934113,0.1722514480352402,0.0167612321674824,-0.0032994034700096,-0.3451044559478760,-0.2280300110578537,-0.0029796555172652,-0.1597652435302734,0.0500137843191624,0.1023071259260178,-0.0407028235495090,0.2228624969720840) * FEATURE1_texOff(vec2(1,1)); +res += mat4(0.6999920010566711,0.0839441940188408,0.0815469548106194,-0.1509176045656204,-0.0690853074193001,-0.3200871348381042,0.0780162736773491,-0.1449639797210693,0.2868815064430237,0.3962450027465820,-0.3439113497734070,0.2657423913478851,0.0988137871026993,0.3471299111843109,-0.2186402678489685,-0.0648017078638077) * FEATURE2_texOff(vec2(1,1)); +res = max(res, vec4(0.0)) + vec4(1.0311057567596436,0.1051208898425102,0.1158760935068130,0.0466635078191757) * min(res, vec4(0.0)); +return res; +} + +//!HOOK LUMA +//!WHEN OUTPUT.w LUMA.w / 1.300 > OUTPUT.h LUMA.h / 1.300 > * +//!DESC mapping 1_2 +//!BIND FEATURE1 +//!BIND FEATURE2 +//!SAVE MODEL22 +//!COMPONENTS 4 +vec4 hook() +{ +vec4 res = vec4(0.0713458731770515,-0.1403961777687073,-0.0019562745001167,0.0153338573873043); +res += mat4(-0.0950641855597496,-0.1496641039848328,-0.0653550028800964,0.0655386000871658,-0.0118882004171610,0.2012491524219513,-0.2844599783420563,-0.4794720113277435,0.1128025799989700,-0.0173030979931355,-0.0558849945664406,-0.2957552075386047,0.0128202112391591,0.0199047476053238,-0.0091027505695820,-0.0789640173316002) * FEATURE1_texOff(vec2(-1,-1)); +res += mat4(0.1597457975149155,-0.0476507246494293,0.1466529071331024,0.0859163030982018,0.0797316282987595,-0.3380981683731079,0.2370245009660721,-0.1145931258797646,-0.0352988094091415,-0.0444888733327389,-0.2100716233253479,0.1305520236492157,-0.1359029710292816,0.1097442805767059,0.0449938289821148,-0.1155664771795273) * FEATURE2_texOff(vec2(-1,-1)); +res += mat4(-0.0333916284143925,0.2415594160556793,0.0520512908697128,0.1228107511997223,-0.0491011217236519,0.4408806562423706,0.4631956815719604,0.2014560103416443,-0.3688595592975616,0.0367180295288563,0.2484581321477890,-0.1113442853093147,0.1283355057239532,0.0418004281818867,-0.0171243026852608,-0.1231943219900131) * FEATURE1_texOff(vec2(-1,0)); +res += mat4(0.3493446409702301,0.4550022482872009,0.0368724688887596,0.0748724937438965,0.5001406073570251,0.0145555436611176,0.1236629858613014,0.3143120706081390,-0.1951988488435745,-0.0157914645969868,0.0937998965382576,-0.2233840376138687,0.5033411383628845,-0.3183194100856781,-0.2259195148944855,0.3639536798000336) * FEATURE2_texOff(vec2(-1,0)); +res += mat4(-0.0742707476019859,-0.1287801116704941,-0.2533137500286102,0.0666435658931732,-0.0185621567070484,0.1427449285984039,-0.0724751204252243,-0.0781485065817833,-0.2270648330450058,-0.2314778864383698,0.3814929425716400,-0.1655400246381760,0.0408568829298019,-0.1139645278453827,0.1797397136688232,-0.0245632305741310) * FEATURE1_texOff(vec2(-1,1)); +res += mat4(0.1184135973453522,0.0439366139471531,0.0225226897746325,-0.0038526873104274,0.1292685419321060,0.0629177838563919,0.3455114960670471,-0.1857204884290695,-0.4921502172946930,-0.1171003505587578,0.0188624169677496,-0.1101682260632515,0.0676844567060471,0.5154085755348206,-0.0898379907011986,0.3413280248641968) * FEATURE2_texOff(vec2(-1,1)); +res += mat4(-0.2631838321685791,0.0215514600276947,0.3092688918113708,-0.0200904365628958,0.0678770467638969,0.1769931465387344,-0.3653681278228760,-0.3274513185024261,0.4608019888401031,-0.1544784456491470,0.1189439669251442,0.7015876173973083,0.2732816934585571,-0.0545057803392410,-0.3474545478820801,-0.0253226496279240) * FEATURE1_texOff(vec2(0,-1)); +res += mat4(0.0994316861033440,0.0642566010355949,0.2031503319740295,0.2276959568262100,-0.1094077304005623,0.4463521838188171,0.0921792611479759,-0.3033096492290497,-0.0953373983502388,-0.1331395804882050,0.2615413069725037,-0.2874414622783661,-0.0389687754213810,0.0338272154331207,0.2804331183433533,-0.3443813025951385) * FEATURE2_texOff(vec2(0,-1)); +res += mat4(-0.1806042939424515,-0.4840798676013947,0.4222546219825745,0.1238701492547989,0.0117481639608741,-0.5986865758895874,0.3057619929313660,0.1934896260499954,-0.7086342573165894,-0.8567376136779785,0.6944998502731323,-1.4599204063415527,0.0886754393577576,-0.4293498098850250,-0.1524195969104767,0.2418079674243927) * FEATURE1_texOff(vec2(0,0)); +res += mat4(2.1706113815307617,0.3525652289390564,-0.7008359432220459,-0.4825965166091919,-0.3203429281711578,0.8500943183898926,-0.7993509769439697,0.4329842329025269,0.2106771767139435,1.1103280782699585,1.2092385292053223,1.4814503192901611,-0.4147390127182007,-0.7046836614608765,-0.1443170011043549,-0.6811133027076721) * FEATURE2_texOff(vec2(0,0)); +res += mat4(-0.1489356607198715,0.1400019824504852,0.2425604313611984,-0.2098473459482193,-0.1580564379692078,0.1463224738836288,-0.2187854647636414,0.5174596905708313,-0.0143817225471139,-0.0362622961401939,-0.0068237944506109,0.4749472737312317,0.2914732992649078,-0.3306328952312469,-0.2444777786731720,-0.1171946674585342) * FEATURE1_texOff(vec2(0,1)); +res += mat4(0.0455239675939083,0.3496046066284180,0.1297491937875748,-0.2541095912456512,0.3605501055717468,0.2339573651552200,-0.0188565086573362,-0.0526181310415268,0.1471424549818039,0.8212822079658508,0.0819099843502045,-0.0851665437221527,0.3739568293094635,0.1304695755243301,0.1481167376041412,-0.2134698331356049) * FEATURE2_texOff(vec2(0,1)); +res += mat4(-0.2076720446348190,-0.0932599306106567,0.0648527294397354,-0.2374770641326904,-0.0927826911211014,0.1848200261592865,0.4131188094615936,0.3280069231987000,-0.2099185734987259,0.2130926996469498,-0.0362745784223080,0.0191331822425127,0.1590368449687958,0.0303016249090433,0.1207325309514999,0.2451425045728683) * FEATURE1_texOff(vec2(1,-1)); +res += mat4(-0.0135009605437517,-0.0101303057745099,0.0752487555146217,0.0533373840153217,-0.0253537259995937,0.1318614929914474,-0.1263181120157242,0.0249524712562561,-0.1477261483669281,0.3236559033393860,0.0773291289806366,-0.1439673304557800,-0.2005890905857086,0.0892757251858711,0.0398719944059849,0.3675192892551422) * FEATURE2_texOff(vec2(1,-1)); +res += mat4(-0.0193535499274731,-0.2256918102502823,0.0341436080634594,0.0795947611331940,0.1496857404708862,-0.2784725725650787,-0.0582313314080238,-0.2786065340042114,-0.1666128039360046,-0.6534121036529541,0.2695854306221008,-0.0179719906300306,0.0015976354479790,0.0139929885044694,-0.1706486046314240,-0.3274765610694885) * FEATURE1_texOff(vec2(1,0)); +res += mat4(-0.7170836329460144,0.0868831276893616,0.1829078495502472,-0.0076045366004109,0.1525912433862686,-0.2558896839618683,0.0893209800124168,-0.3426039516925812,-0.2871107757091522,-0.2445062994956970,0.1676304638385773,0.2116415053606033,0.0883995518088341,-0.3880331516265869,0.2636835277080536,-0.2514505982398987) * FEATURE2_texOff(vec2(1,0)); +res += mat4(-0.1861270815134048,0.2000686377286911,-0.1501186788082123,0.1525203883647919,0.1969228833913803,0.1174068301916122,-0.1281060427427292,-0.0854888409376144,0.0290613435208797,-0.0538076497614384,-0.0251582786440849,0.0692845508456230,0.0384319014847279,0.2888138592243195,0.1151804402470589,0.0990421250462532) * FEATURE1_texOff(vec2(1,1)); +res += mat4(-0.0344385802745819,0.1270371377468109,0.0922426953911781,-0.0426749102771282,-0.1656492203474045,-0.3273328542709351,-0.0282224025577307,0.1099396124482155,-0.1113230437040329,0.2943290174007416,-0.2181112915277481,-0.3177657723426819,-0.1096536740660667,-0.0508293099701405,-0.0256164856255054,-0.0388228967785835) * FEATURE2_texOff(vec2(1,1)); +res = max(res, vec4(0.0)) + vec4(0.7142407894134521,0.0686190053820610,0.3999933302402496,-1.0247212648391724) * min(res, vec4(0.0)); +return res; +} + +//!HOOK LUMA +//!WHEN OUTPUT.w LUMA.w / 1.300 > OUTPUT.h LUMA.h / 1.300 > * +//!DESC mapping 2_1 +//!BIND MODEL21 +//!BIND MODEL22 +//!SAVE MODEL1 +//!COMPONENTS 4 +vec4 hook() +{ +vec4 res = vec4(0.0203563515096903,0.1902436912059784,-0.0757935121655464,0.0393617525696754); +res += mat4(-0.1080558672547340,-0.0400269515812397,0.1042881682515144,-0.1994346678256989,0.0172465778887272,-0.0829331055283546,-0.1278677284717560,-0.0762506872415543,-0.0593080408871174,-0.0305212251842022,0.1326192617416382,-0.3380933105945587,-0.0722763314843178,-0.1975518912076950,-0.0223602931946516,0.2251029163599014) * MODEL21_texOff(vec2(-1,-1)); +res += mat4(0.1747678220272064,0.0297168865799904,0.1054855734109879,0.0803295820951462,-0.0338115766644478,-0.3885377943515778,-0.3540246784687042,-0.0719623491168022,-0.0656022280454636,-0.0469004511833191,0.1379419565200806,0.0319863893091679,0.0799935683608055,-0.0099127553403378,0.1698455959558487,-0.0108015276491642) * MODEL22_texOff(vec2(-1,-1)); +res += mat4(0.1587898135185242,0.3995443880558014,-0.0333226583898067,0.2373267263174057,-0.1616930961608887,0.0659186244010925,0.0141129801049829,-0.0541022196412086,-0.5743742585182190,0.1121487766504288,0.4259817600250244,0.0280795227736235,-0.3721714317798615,-0.3496374189853668,0.0997273251414299,-0.0079920450225472) * MODEL21_texOff(vec2(-1,0)); +res += mat4(0.0928084030747414,0.3107658624649048,0.1375299990177155,0.1550617516040802,-0.0780353918671608,-0.0102957757189870,-0.2056752145290375,-0.3927979469299316,-1.2112152576446533,0.0213295854628086,0.1396545022726059,0.0492016039788723,-0.0569122135639191,-0.1691886335611343,-0.1535325646400452,0.2800904810428619) * MODEL22_texOff(vec2(-1,0)); +res += mat4(0.2494744062423706,-0.0363066755235195,0.0959179550409317,-0.0048101749271154,-0.0195793900638819,0.0451166369020939,0.1470773071050644,-0.0050059854984283,0.2886958122253418,-0.3221147954463959,-0.7062104344367981,0.1646659970283508,-0.0092520527541637,-0.1254461258649826,0.0217506736516953,-0.0678806379437447) * MODEL21_texOff(vec2(-1,1)); +res += mat4(-0.0686557441949844,-0.0414490625262260,-0.1855954080820084,0.0264346338808537,-0.0296857114881277,-0.0431593284010887,0.0669397041201591,-0.0946076661348343,-0.2036914378404617,-0.1336101740598679,-0.2099903970956802,-0.1327936947345734,-0.1002155169844627,-0.0368575826287270,-0.1660962998867035,0.0728288888931274) * MODEL22_texOff(vec2(-1,1)); +res += mat4(0.5504320859909058,0.2939232587814331,0.4704743027687073,0.2129514217376709,0.0843106731772423,-0.1978624463081360,-0.3298224806785583,0.1919094175100327,0.1980742365121841,-0.0644423812627792,0.0091170109808445,-0.2124856859445572,0.0804558470845222,-0.1130188927054405,-0.6276652812957764,0.1861163526773453) * MODEL21_texOff(vec2(0,-1)); +res += mat4(-0.3357668519020081,0.2093413323163986,0.4355416595935822,0.1550502777099609,-0.6510964035987854,-0.1751857399940491,-0.2060168534517288,-0.1710205078125000,-0.1202360317111015,-0.2500316798686981,0.1074745431542397,-0.2418434321880341,0.0133954072371125,-0.0555886104702950,0.1514673978090286,0.2739115655422211) * MODEL22_texOff(vec2(0,-1)); +res += mat4(-0.3006273508071899,-0.2699472010135651,-0.1982013583183289,-0.0032952548936009,0.0307833012193441,0.3671586215496063,-0.0966020002961159,-0.2836556434631348,0.4297264218330383,0.6171903610229492,0.6723483800888062,0.2705117464065552,-0.1438141316175461,-0.0873940736055374,-0.7001031041145325,-0.2052250355482101) * MODEL21_texOff(vec2(0,0)); +res += mat4(-0.2875024676322937,-1.6230558156967163,-0.6733398437500000,-0.9642448425292969,-0.1964960694313049,0.2485812455415726,0.1236900389194489,-1.1423941850662231,-0.0412602946162224,0.3412002623081207,0.3962794244289398,-0.2490761876106262,-0.0058065578341484,-0.4578708708286285,-0.2418260127305984,0.5357795953750610) * MODEL22_texOff(vec2(0,0)); +res += mat4(0.0062361713498831,0.1925230026245117,0.0824977159500122,0.0561275146901608,0.0929671525955200,0.0698546022176743,0.3816939592361450,0.0395248420536518,-0.0719512030482292,0.0564917400479317,-0.1297784000635147,0.1245511695742607,0.0012355837970972,-0.0990515723824501,0.4213519692420959,-0.1645816713571548) * MODEL21_texOff(vec2(0,1)); +res += mat4(-0.0611936338245869,-0.0220258161425591,-0.0040935277938843,-0.1060328409075737,-0.0583154149353504,-0.0171997752040625,0.1058546081185341,0.2793170809745789,-0.2339317053556442,-0.1972009539604187,-0.0600687190890312,-0.0684379041194916,0.0243016034364700,-0.2111079394817352,-0.2042971849441528,0.0724857896566391) * MODEL22_texOff(vec2(0,1)); +res += mat4(-0.0833447948098183,-0.0533220991492271,0.0767802372574806,0.1182348504662514,-0.0223299078643322,-0.0479344800114632,-0.0119727496057749,0.0524821877479553,-0.0334780365228653,0.0719002187252045,0.0439689308404922,0.0475181229412556,0.0764308497309685,0.0086713796481490,-0.1700707823038101,0.0657354295253754) * MODEL21_texOff(vec2(1,-1)); +res += mat4(0.1391696482896805,0.0739523395895958,0.0565792545676231,-0.0430364646017551,0.0943084582686424,0.0102064209058881,0.0120795257389545,-0.0841303989291191,0.1573246121406555,0.0164279472082853,0.0988841354846954,-0.1430613398551941,-0.0572808869183064,-0.0844292491674423,0.0621565617620945,0.0923799052834511) * MODEL22_texOff(vec2(1,-1)); +res += mat4(-0.1223107874393463,-0.2441930323839188,-0.2410650849342346,-0.0162935722619295,0.0695567727088928,-0.0028583710081875,-0.0059417244046926,0.0715164169669151,-0.0668491795659065,-0.1499572396278381,0.0869924053549767,0.0553652904927731,0.2729566097259521,0.1370039582252502,-0.1282183527946472,-0.1451860070228577) * MODEL21_texOff(vec2(1,0)); +res += mat4(0.1331952214241028,0.0021079662255943,-0.1116734445095062,-0.4168601930141449,0.0534659475088120,0.0037860786542296,-0.0366065911948681,0.1047701835632324,0.1491260826587677,0.0782341659069061,0.0949895009398460,-0.1160908639431000,-0.1057133302092552,-0.2699718773365021,-0.1193305626511574,0.2142304331064224) * MODEL22_texOff(vec2(1,0)); +res += mat4(0.0041565205901861,-0.1065499857068062,-0.0629659667611122,-0.1144768893718719,0.0318886637687683,-0.0562519319355488,0.0043422472663224,0.0226082988083363,-0.1456198990345001,-0.2398656159639359,-0.2625046670436859,-0.0710547044873238,0.0067904205061495,0.0018544088816270,0.1019348874688148,-0.0186133962124586) * MODEL21_texOff(vec2(1,1)); +res += mat4(0.0732532218098640,0.1516859829425812,0.0580205544829369,0.1968977004289627,-0.0066619524732232,-0.1597842127084732,-0.0990600511431694,-0.1059188917279243,0.0718481168150902,-0.2222738713026047,-0.1675696671009064,-0.1500017195940018,-0.0568779110908508,-0.0582777932286263,-0.0844587534666061,-0.0263266414403915) * MODEL22_texOff(vec2(1,1)); +res = max(res, vec4(0.0)) + vec4(-0.2459529191255569,0.7563464641571045,-0.0705636814236641,-0.0094820559024811) * min(res, vec4(0.0)); +return res; +} + +//!HOOK LUMA +//!WHEN OUTPUT.w LUMA.w / 1.300 > OUTPUT.h LUMA.h / 1.300 > * +//!DESC mapping 2_2 +//!BIND MODEL21 +//!BIND MODEL22 +//!SAVE MODEL2 +//!COMPONENTS 4 +vec4 hook() +{ +vec4 res = vec4(-0.0448397286236286,-0.1649267971515656,-0.1192543581128120,-0.0061073559336364); +res += mat4(0.0724840760231018,-0.0480341166257858,-0.1082391515374184,-0.1447021961212158,0.0723197236657143,0.0481830574572086,0.0009448126656935,0.0353565886616707,-0.0653375908732414,0.0029647622723132,-0.0016588598955423,-0.2075651884078979,0.0403469167649746,0.3929971158504486,0.0342363268136978,0.1427230089902878) * MODEL21_texOff(vec2(-1,-1)); +res += mat4(-0.0743464827537537,0.1844420731067657,0.0256296340376139,-0.2808582782745361,0.0351609662175179,0.3277008235454559,-0.0205841138958931,-0.5355809330940247,0.0681906566023827,0.2058052271604538,-0.0479847639799118,-0.3735262751579285,-0.0261550359427929,-0.1148884072899818,-0.2329017966985703,0.0728458985686302) * MODEL22_texOff(vec2(-1,-1)); +res += mat4(-0.1236097738146782,0.1251334398984909,-0.1339431256055832,0.0198749266564846,-0.1325920224189758,-2.2431972026824951,-0.0680834427475929,-0.5671764612197876,-0.3431925177574158,-0.0983135104179382,-0.2207138091325760,-0.2374879121780396,0.0127309206873178,1.3076044321060181,0.0848151743412018,-0.1928595900535583) * MODEL21_texOff(vec2(-1,0)); +res += mat4(-0.0471093133091927,-0.1513628512620926,-0.0134263765066862,-0.1519252359867096,-0.5260242223739624,0.2291621714830399,0.4088975787162781,-0.4315340518951416,0.0933236032724380,-1.0386694669723511,0.0015958193689585,-0.2737887501716614,-0.0246253963559866,-0.2722961604595184,-0.1770633459091187,-0.2291279733181000) * MODEL22_texOff(vec2(-1,0)); +res += mat4(-0.0017552347853780,0.1903935521841049,-0.0740704238414764,-0.0917679518461227,0.0323882810771465,-0.3029108047485352,0.0532565414905548,-0.0651542618870735,0.4868686199188232,0.8539272546768188,0.4151960313320160,0.2619662582874298,-0.0413270294666290,0.1404227763414383,0.1027320474386215,0.3274228572845459) * MODEL21_texOff(vec2(-1,1)); +res += mat4(0.1828346252441406,0.0274682324379683,-0.1169882863759995,0.0327291004359722,0.1786244213581085,-0.6569546461105347,-0.0609031207859516,-0.1676601022481918,-0.1481092721223831,0.2889067530632019,0.1246089115738869,0.2203597426414490,-0.0366856977343559,0.1539470851421356,0.0069492300972342,-0.1544002443552017) * MODEL22_texOff(vec2(-1,1)); +res += mat4(0.2073992937803268,-0.0717074573040009,-0.0196173377335072,-0.0956910699605942,0.0728898122906685,0.0484567955136299,0.3063069283962250,-0.3200540542602539,0.0291527546942234,-0.0265460256487131,0.1168476045131683,-0.2479970753192902,0.1224220171570778,0.0745823010802269,0.1868897676467896,-0.1958049237728119) * MODEL21_texOff(vec2(0,-1)); +res += mat4(0.0019954447634518,-0.0225235987454653,0.0812198966741562,0.0295672398060560,-0.2016931176185608,-0.2239151000976562,-0.2481262385845184,-0.2381946444511414,-0.0520484372973442,-0.1200495883822441,0.2121954560279846,-0.1573531329631805,-0.0198472067713737,0.1001087054610252,-0.1084884032607079,-0.3126969039440155) * MODEL22_texOff(vec2(0,-1)); +res += mat4(0.3838330209255219,0.1678779572248459,0.6496244072914124,0.3783606290817261,-0.2198582738637924,-0.2351343184709549,-0.2852248847484589,0.6310021877288818,0.8083020448684692,0.0039323624223471,-0.0901831910014153,0.0797894075512886,-0.2271467447280884,0.7082978487014771,0.1513756662607193,0.2188975960016251) * MODEL21_texOff(vec2(0,0)); +res += mat4(-0.2871031761169434,0.2316448241472244,0.4947948157787323,0.3308620452880859,-0.0623455122113228,-0.1314185708761215,-0.2664661705493927,0.8725078701972961,0.4541083276271820,0.1433589160442352,-1.1269453763961792,0.6427971124649048,-0.1016561388969421,0.3418317139148712,-0.0991155728697777,-1.0508837699890137) * MODEL22_texOff(vec2(0,0)); +res += mat4(-0.2179604172706604,0.1258949041366577,-0.1155700981616974,-0.0536149404942989,-0.0140614463016391,-0.0091438721865416,-0.0501774959266186,-0.3570724725723267,-0.5832386016845703,0.2004123181104660,0.2986239194869995,-0.8139168024063110,0.0142666567116976,0.0681498944759369,0.1293468028306961,-0.1001938357949257) * MODEL21_texOff(vec2(0,1)); +res += mat4(0.1952836811542511,-0.3092494010925293,0.3063779771327972,0.1934849917888641,0.0746696740388870,-0.3533902466297150,-0.1269576102495193,-0.2237875163555145,0.2470717132091522,-0.2640363574028015,-0.2862776815891266,0.1740108281373978,-0.0963631942868233,0.2631850540637970,0.0400718413293362,-0.3590607047080994) * MODEL22_texOff(vec2(0,1)); +res += mat4(-0.5299927592277527,0.0979989692568779,0.1666737496852875,-0.1547524333000183,-0.0043443185277283,0.1540203243494034,0.0594348423182964,-0.0167275425046682,-0.1043610796332359,0.0504250898957253,0.0456700921058655,0.2525034546852112,0.2241353541612625,-0.1678503304719925,0.1532667279243469,0.2901742458343506) * MODEL21_texOff(vec2(1,-1)); +res += mat4(0.0998796448111534,0.0385462641716003,-0.0762400180101395,-0.1255892217159271,0.0281430184841156,-0.0304958485066891,-0.1440480053424835,-0.1001605167984962,-0.2257689833641052,0.2056092917919159,0.0248535349965096,-0.1383949518203735,-0.0951708629727364,0.0997417271137238,0.0275330394506454,-0.5728432536125183) * MODEL22_texOff(vec2(1,-1)); +res += mat4(0.4256163835525513,0.1745115518569946,-0.2409395426511765,0.3139856457710266,-0.0036795330233872,0.1819283962249756,-0.0864531323313713,0.0102691333740950,-0.3397279977798462,0.1107075437903404,-0.0035228815395385,-0.2207705229520798,-0.1779139339923859,-0.2106117755174637,0.0352664291858673,0.3615589439868927) * MODEL21_texOff(vec2(1,0)); +res += mat4(-0.0345224253833294,-0.0669926702976227,0.0907212942838669,-0.3758732676506042,-0.0452554710209370,-0.1134464666247368,-0.0358871109783649,-0.1858227252960205,-0.0233245138078928,-0.0495684742927551,0.1976234614849091,-0.1165761798620224,-0.0340447537600994,0.1095624342560768,0.0110175255686045,-0.8269239664077759) * MODEL22_texOff(vec2(1,0)); +res += mat4(-0.1379280686378479,0.1004267781972885,0.0723998174071312,-0.1510958224534988,0.0610648579895496,0.0451720170676708,-0.0231927260756493,-0.0251553766429424,0.2306085377931595,0.1033207178115845,-0.1316205114126205,0.1130664870142937,-0.0458516106009483,-0.1152514070272446,-0.0088650323450565,-0.0214479379355907) * MODEL21_texOff(vec2(1,1)); +res += mat4(-0.0545783303678036,-0.0620098188519478,0.0347074456512928,0.1096799224615097,0.0036664425861090,-0.0413107499480247,0.1443250179290771,-0.1161036714911461,-0.0061624986119568,-0.0252977479249239,0.3230019211769104,-0.2536626160144806,-0.0565439648926258,0.0827583819627762,-0.0071726376190782,-0.1983329951763153) * MODEL22_texOff(vec2(1,1)); +res = max(res, vec4(0.0)) + vec4(-0.6312188506126404,-0.1215368881821632,0.2487443536520004,0.4051703512668610) * min(res, vec4(0.0)); +return res; +} + +//!HOOK LUMA +//!WHEN OUTPUT.w LUMA.w / 1.300 > OUTPUT.h LUMA.h / 1.300 > * +//!DESC mapping 3_1 +//!BIND MODEL1 +//!BIND MODEL2 +//!SAVE MODEL21 +//!COMPONENTS 4 +vec4 hook() +{ +vec4 res = vec4(-0.0410279631614685,-0.1111723631620407,-0.0406232848763466,-0.0939496159553528); +res += mat4(0.1221675798296928,0.0083215842023492,-0.0162804014980793,0.0316714197397232,-0.2205813378095627,0.1500435769557953,0.2109555304050446,0.2741867899894714,0.0956874340772629,-0.0896854698657990,-0.1657065600156784,-0.1349759399890900,0.0601499564945698,-0.1523845940828323,-0.1828087568283081,-0.2727653682231903) * MODEL1_texOff(vec2(-1,-1)); +res += mat4(-0.0918163508176804,0.1564485579729080,0.1133174449205399,0.2215953171253204,-0.0623677000403404,-0.0497728772461414,-0.0372809022665024,-0.0258478187024593,-0.1364922970533371,0.1053884625434875,0.3292874991893768,0.2693256139755249,-0.0347631797194481,-0.1470523178577423,0.0096792401745915,-0.0542853325605392) * MODEL2_texOff(vec2(-1,-1)); +res += mat4(0.1331177949905396,-0.0964357852935791,-0.0706946700811386,0.1593225002288818,-0.4815943241119385,0.1224092170596123,-0.0870430991053581,0.0005010276800022,-0.0242684502154589,-0.2256436049938202,0.1367238312959671,0.0474774017930031,0.6886650323867798,-0.0065326127223670,0.1841574758291245,-0.1354993879795074) * MODEL1_texOff(vec2(-1,0)); +res += mat4(-0.1049591675400734,0.0515934228897095,0.1128631457686424,0.1688040047883987,-0.0084041170775890,-0.0006375144002959,-0.0598374009132385,0.1424416452646255,-0.0048398924991488,0.1832167655229568,0.0231959503144026,0.0816788375377655,-0.1321710795164108,0.0397678017616272,-0.0058345394209027,0.5784573554992676) * MODEL2_texOff(vec2(-1,0)); +res += mat4(0.1438693851232529,-0.0694608166813850,-0.0428275354206562,0.1599996536970139,-0.1651254445314407,0.1388883888721466,-0.0895452573895454,0.2569831907749176,0.3150432109832764,-0.0910519883036613,0.0367441214621067,0.1903669685125351,0.2805841267108917,-0.0444608181715012,0.0059385276399553,-0.2585869431495667) * MODEL1_texOff(vec2(-1,1)); +res += mat4(-0.1217494234442711,0.0191769022494555,-0.0065453462302685,0.1391217857599258,0.0998920649290085,-0.0162798929959536,0.0502282194793224,0.0370145924389362,0.0290782172232866,-0.0099554909393191,0.0142515478655696,0.1248661577701569,-0.0076912571676075,0.0251651499420404,0.2190572917461395,0.0020069130696356) * MODEL2_texOff(vec2(-1,1)); +res += mat4(0.2666685581207275,-0.1625511497259140,-0.3938800692558289,-0.0253848694264889,0.0987015441060066,0.2033616453409195,0.3128099143505096,0.4608893990516663,0.0620003379881382,-0.1389972567558289,-0.3095863461494446,-0.4023511111736298,-0.1105777546763420,0.1115406602621078,0.3639950752258301,0.0645622834563255) * MODEL1_texOff(vec2(0,-1)); +res += mat4(-0.2135885655879974,-0.1035343706607819,0.1795026361942291,0.1828210204839706,0.0780984908342361,0.0656728670001030,0.0033678691834211,0.1361345648765564,0.1712654232978821,-0.0172833092510700,-0.0502183400094509,0.2910411655902863,0.0691247656941414,0.1935720741748810,0.0652214139699936,0.1608240753412247) * MODEL2_texOff(vec2(0,-1)); +res += mat4(0.8243460655212402,-0.0979344248771667,-0.0366373993456364,0.1692261099815369,0.5517869591712952,0.3282494544982910,-0.7905511856079102,-0.4462923705577850,-0.0803156569600105,0.1172509342432022,0.1864327639341354,0.1471016854047775,0.1296005547046661,-0.1004103720188141,0.3174172043800354,-0.1181766316294670) * MODEL1_texOff(vec2(0,0)); +res += mat4(0.0259374529123306,-0.0934808850288391,0.3008874654769897,0.3957927823066711,-0.4048821926116943,0.1461934000253677,-0.1819096356630325,-0.1908810287714005,0.3193186521530151,-0.7438099980354309,0.1919509470462799,-0.2065188735723495,0.1752236187458038,-0.6840037107467651,0.1588519066572189,-0.3956064879894257) * MODEL2_texOff(vec2(0,0)); +res += mat4(0.1574442386627197,-0.0114925103262067,-0.1208277940750122,0.2058266401290894,0.2879209220409393,-0.0419875606894493,-0.1902059614658356,-0.2723863720893860,-0.1086223348975182,-0.0870924964547157,0.8605937957763672,0.2656622231006622,-0.1653763055801392,0.0816384851932526,-0.0137870563194156,0.1433854848146439) * MODEL1_texOff(vec2(0,1)); +res += mat4(-0.1565909236669540,-0.0307490080595016,-0.1055604666471481,0.2573592662811279,-0.1186821162700653,0.1141471788287163,-0.0272745657712221,-0.1049114838242531,0.2445316016674042,-0.0027864547446370,-0.1759569346904755,-0.1556979566812515,0.0550616309046745,0.1704383641481400,0.0853662937879562,0.3280856907367706) * MODEL2_texOff(vec2(0,1)); +res += mat4(0.1460669338703156,0.4202052652835846,-0.3638312816619873,-0.0958623066544533,-0.0492525361478329,-0.3664234280586243,0.0794373303651810,0.0399017669260502,0.0629198029637337,0.1662959158420563,-0.1001493930816650,-0.0587460733950138,-0.0396478697657585,0.0017320754704997,0.0314909480512142,-0.0202700830996037) * MODEL1_texOff(vec2(1,-1)); +res += mat4(-0.0964399129152298,0.0380319654941559,0.0396055467426777,0.0265473183244467,-0.0161637403070927,-0.1872924566268921,0.1670000404119492,0.0029466480482370,-0.1093841269612312,-0.3629201948642731,-0.0562992505729198,0.1792684197425842,-0.0203859098255634,0.0983991250395775,0.0058611719869077,0.1627455651760101) * MODEL2_texOff(vec2(1,-1)); +res += mat4(-0.1117974221706390,0.7562329173088074,-0.2046248912811279,0.1677842289209366,-0.2063486129045486,-0.6023545265197754,-0.5739209651947021,0.5110496878623962,-0.0715268924832344,-0.1373793482780457,0.1251420378684998,-0.0477442294359207,0.4961377978324890,0.2688887119293213,0.3146316707134247,-0.5197153687477112) * MODEL1_texOff(vec2(1,0)); +res += mat4(-0.1314805448055267,0.0746279135346413,0.3457699418067932,0.2564856410026550,0.0839370116591454,-0.6136511564254761,-0.4646295011043549,0.0612256154417992,-0.1910563558340073,-0.0935136750340462,-0.2426030039787292,0.2102959007024765,0.1575350016355515,0.6145061254501343,0.3368154168128967,-0.0974092856049538) * MODEL2_texOff(vec2(1,0)); +res += mat4(0.0565315335988998,0.2393359094858170,-0.0932938233017921,0.1555283814668655,0.0123879108577967,-0.1247719228267670,-0.0564610138535500,-0.1125799044966698,-0.0104600470513105,0.0482629500329494,0.2316472232341766,0.1083717569708824,-0.0525921434164047,0.0643989592790604,-0.0525734610855579,-0.0503251366317272) * MODEL1_texOff(vec2(1,1)); +res += mat4(-0.1835366338491440,0.0978360474109650,-0.1111819595098495,0.2109299153089523,0.0509372949600220,-0.1992686837911606,0.0677929744124413,-0.0870024710893631,-0.0412262082099915,-0.0697719156742096,-0.0967373847961426,0.0137308547273278,0.0195730421692133,0.0410240143537521,0.1157210171222687,0.2283479571342468) * MODEL2_texOff(vec2(1,1)); +res = max(res, vec4(0.0)) + vec4(0.1991519331932068,-0.1275756657123566,-0.0622864030301571,0.1586369574069977) * min(res, vec4(0.0)); +return res; +} + +//!HOOK LUMA +//!WHEN OUTPUT.w LUMA.w / 1.300 > OUTPUT.h LUMA.h / 1.300 > * +//!DESC mapping 3_2 +//!BIND MODEL1 +//!BIND MODEL2 +//!SAVE MODEL22 +//!COMPONENTS 4 +vec4 hook() +{ +vec4 res = vec4(-0.0089084329083562,-0.0336172059178352,0.0177190825343132,0.0529975406825542); +res += mat4(-0.0275970958173275,0.0141968233510852,0.1181544512510300,-0.0572245270013809,0.1161347925662994,-0.1156444773077965,-0.2549640238285065,0.0882879272103310,-0.0715355500578880,0.0151285668835044,0.1079384386539459,0.0650847703218460,-0.1597152203321457,0.0669793561100960,0.2084401696920395,-0.0951152443885803) * MODEL1_texOff(vec2(-1,-1)); +res += mat4(0.0404323227703571,-0.0206144321709871,-0.1080420613288879,-0.2038477361202240,0.0248847268521786,-0.0064681121148169,0.0389525443315506,0.0011026862775907,0.0885242074728012,0.0295896343886852,-0.3323790132999420,0.1935138553380966,-0.0466548874974251,0.1023886054754257,0.1257870644330978,-0.1541756242513657) * MODEL2_texOff(vec2(-1,-1)); +res += mat4(-0.0076520540751517,0.0361139886081219,0.1749804913997650,-0.2051989138126373,0.0022692133206874,-0.0282937753945589,-0.2039019316434860,-0.2343468815088272,-0.0357327871024609,-0.0570764988660812,0.2925858795642853,-0.1988349705934525,-0.0584560707211494,-0.0341510921716690,0.1300961822271347,0.5184492468833923) * MODEL1_texOff(vec2(-1,0)); +res += mat4(0.0884973928332329,0.0333527140319347,0.0180535931140184,-0.2655122876167297,0.0433661043643951,0.0104369185864925,0.0010909073753282,-0.0705273598432541,-0.0602585524320602,0.2420269846916199,-0.4731841087341309,-0.8040290474891663,0.3066828548908234,-0.2466925680637360,0.0938910692930222,-0.2002603262662888) * MODEL2_texOff(vec2(-1,0)); +res += mat4(0.0549152903258801,0.0291299298405647,0.0946277007460594,-0.0581608228385448,0.0669180899858475,-0.0635575056076050,-0.2427970170974731,-0.2677550315856934,0.2226776182651520,0.1301570236682892,-0.1519709974527359,0.0671724304556847,-0.0526433289051056,0.1898351758718491,0.2383745312690735,0.2191711813211441) * MODEL1_texOff(vec2(-1,1)); +res += mat4(-0.0234222635626793,0.0238620284944773,0.0427630320191383,-0.1080563366413116,0.0332126952707767,-0.0039051575586200,0.0293126031756401,0.0161924213171005,0.0453971028327942,0.0131999952718616,-0.0689036697149277,0.2349009960889816,0.1013344153761864,0.2706570029258728,0.1191426888108253,-0.2830821871757507) * MODEL2_texOff(vec2(-1,1)); +res += mat4(0.0181465242058039,-0.0571886636316776,0.4875229001045227,-0.4244020283222198,0.4331104159355164,0.1066712513566017,-0.5277034044265747,0.1110567077994347,-0.1179447323083878,-0.0273578558117151,0.1798476576805115,-0.2829602360725403,0.1012385115027428,-0.2528488039970398,0.1697608679533005,0.1121710017323494) * MODEL1_texOff(vec2(0,-1)); +res += mat4(-0.1404130905866623,-0.0984055623412132,-0.0279541295021772,-0.1321212500333786,-0.0841855704784393,0.1336171030998230,-0.1458790600299835,-0.0044095455668867,0.2203754037618637,0.1455714553594589,-0.2362042963504791,-0.0329121425747871,-0.1683547794818878,0.0289597529917955,0.3424547612667084,0.0143845872953534) * MODEL2_texOff(vec2(0,-1)); +res += mat4(0.0287246014922857,0.1948280781507492,0.5998955368995667,0.1192114129662514,-0.6269109249114990,0.8724324703216553,-0.6399638652801514,-0.4201497733592987,-0.3355066180229187,-0.1566904038190842,-0.4396412074565887,0.1525828838348389,0.5573399066925049,0.2324324846267700,0.2762884795665741,0.0406046211719513) * MODEL1_texOff(vec2(0,0)); +res += mat4(0.3890096545219421,-0.0574061162769794,-0.1468243300914764,-0.5953360199928284,-0.1363215148448944,-0.2224670499563217,-0.2237723320722580,0.2738097012042999,-0.4868114292621613,-0.5029351711273193,-0.3570256233215332,-0.1776263266801834,-0.0176672954112291,-0.4318660795688629,1.0395888090133667,0.1728395074605942) * MODEL2_texOff(vec2(0,0)); +res += mat4(0.1337304115295410,-0.0809440389275551,0.1600498855113983,-0.1108811497688293,-0.2376178801059723,-0.1532768607139587,-0.0447455830872059,0.2515332102775574,0.4848278462886810,-0.0915748402476311,-0.0336527302861214,-0.2141884714365005,0.2125129699707031,0.3237875998020172,0.0022272330243140,-0.0167857185006142) * MODEL1_texOff(vec2(0,1)); +res += mat4(0.0457934997975826,0.0510537698864937,-0.0519523508846760,-0.4506326615810394,-0.1029204949736595,0.0116113182157278,-0.1750748157501221,-0.0048758201301098,0.1506977379322052,0.0633068457245827,-0.1628549993038177,-0.0144928665831685,0.1408756822347641,0.2896180152893066,0.0803691521286964,-0.4930096566677094) * MODEL2_texOff(vec2(0,1)); +res += mat4(-0.0484248884022236,0.1371297985315323,-0.1235475391149521,-0.2618594765663147,-0.0280395895242691,0.0248795989900827,0.1204105168581009,0.3246576189994812,0.0426272377371788,-0.0520061068236828,0.0575957447290421,-0.2613646090030670,0.1165295541286469,-0.0390013493597507,-0.0470846109092236,-0.0014663023175672) * MODEL1_texOff(vec2(1,-1)); +res += mat4(-0.1066762879490852,-0.0869804695248604,-0.0099332248792052,-0.1355892717838287,-0.0760413780808449,0.1377770304679871,-0.0263407956808805,0.0880135521292686,0.1496269851922989,-0.0487459264695644,0.1286851912736893,0.2218491584062576,0.1723349541425705,-0.0165541302412748,-0.0690477639436722,-0.2388458102941513) * MODEL2_texOff(vec2(1,-1)); +res += mat4(-0.4236431121826172,0.0465179122984409,-0.1526456624269485,0.1426440477371216,0.5913932919502258,-0.1082349196076393,0.2731275856494904,-0.2687640488147736,-0.4628683030605316,-0.0537119321525097,-0.1597615629434586,0.0528527684509754,-0.3485085070133209,0.1395110934972763,0.0642972290515900,0.0323829315602779) * MODEL1_texOff(vec2(1,0)); +res += mat4(0.0066713397391140,-0.0482029877603054,-0.1707276403903961,-0.1001396998763084,0.0539822019636631,-0.1624453216791153,0.4913550019264221,0.3687861263751984,0.0491421781480312,0.1311376541852951,0.0992425829172134,-0.4636098444461823,-0.3415873646736145,-0.0153833786025643,-0.0270162131637335,-0.0935514941811562) * MODEL2_texOff(vec2(1,0)); +res += mat4(-0.1738258153200150,0.0458541549742222,-0.0653749182820320,-0.0156540926545858,-0.0357586294412613,-0.1486178338527679,0.1798035055398941,-0.1310307979583740,0.0783249065279961,-0.0261360015720129,-0.1047066971659660,0.3385537564754486,-0.0339452810585499,0.2299628853797913,-0.1408322304487228,-0.0352708548307419) * MODEL1_texOff(vec2(1,1)); +res += mat4(0.0463018082082272,0.0565674640238285,-0.0538956597447395,-0.2354862987995148,0.0297824125736952,0.0307939313352108,0.1271791011095047,-0.1025698855519295,0.1060482114553452,-0.0703211054205894,-0.0083062350749969,0.0474255047738552,0.0442508421838284,0.1569559425115585,-0.0442709513008595,-0.1188704669475555) * MODEL2_texOff(vec2(1,1)); +res = max(res, vec4(0.0)) + vec4(0.7366524934768677,1.0013850927352905,-0.0276311747729778,0.0734841898083687) * min(res, vec4(0.0)); +return res; +} + +//!HOOK LUMA +//!WHEN OUTPUT.w LUMA.w / 1.300 > OUTPUT.h LUMA.h / 1.300 > * +//!DESC mapping 4_1 +//!BIND MODEL21 +//!BIND MODEL22 +//!SAVE MODEL1 +//!COMPONENTS 4 +vec4 hook() +{ +vec4 res = vec4(-0.1306160986423492,-0.0808217376470566,-0.2880123555660248,0.0099629526957870); +res += mat4(-0.1033539846539497,0.0541300140321255,-0.0804840475320816,-0.0334571413695812,-0.0264753755182028,0.1118840202689171,0.1186013221740723,-0.0127575425431132,0.2236593365669250,0.0025286162272096,0.0985530614852905,0.0685181617736816,-0.1884875595569611,0.0530862808227539,-0.0482063069939613,0.0375233069062233) * MODEL21_texOff(vec2(-1,-1)); +res += mat4(0.1837068796157837,-0.0632847175002098,0.0016613919287920,0.0392861217260361,0.2923883199691772,-0.1713902205228806,0.1907587945461273,0.0550456829369068,0.0644215345382690,-0.1046456992626190,0.0187383033335209,0.0770180150866508,0.1933846622705460,-0.0455715768039227,0.0375007353723049,-0.1053109914064407) * MODEL22_texOff(vec2(-1,-1)); +res += mat4(-0.0972480997443199,0.2820451855659485,0.0114549007266760,-0.0954328626394272,0.0706252008676529,0.4829064607620239,-0.6371517181396484,0.0005180989392102,0.3280143439769745,0.0665246024727821,-0.0503116399049759,-0.1261110603809357,0.1114177703857422,-0.2053108513355255,0.1428771317005157,0.3926100134849548) * MODEL21_texOff(vec2(-1,0)); +res += mat4(-0.2571723163127899,0.1627264618873596,-0.4940335154533386,-0.1361546218395233,0.0804422944784164,-0.4231885373592377,0.0650202706456184,0.0518481098115444,-0.0502478554844856,-0.1305799931287766,0.1814480125904083,0.0090866927057505,-0.0510044656693935,-0.1691461503505707,0.0922467112541199,-0.0314207412302494) * MODEL22_texOff(vec2(-1,0)); +res += mat4(0.1270498335361481,0.0563284493982792,-0.0435525141656399,0.1569847911596298,0.0576847903430462,0.3461692929267883,-0.0325655154883862,-0.2688976824283600,-0.1341977864503860,-0.1382253766059875,0.2293784171342850,-0.1111817285418510,-0.1402447521686554,-0.3257531225681305,0.0598510466516018,0.1008039116859436) * MODEL21_texOff(vec2(-1,1)); +res += mat4(0.1698816716670990,0.3491003513336182,-0.1367681026458740,-0.1165873408317566,-0.2091718912124634,-0.1487034261226654,-0.0569749698042870,-0.2100717276334763,0.0404917001724243,-0.1372035890817642,0.0689046755433083,-0.0367818064987659,-0.0325474888086319,-0.0114965448155999,-0.0137249026447535,-0.0279692262411118) * MODEL22_texOff(vec2(-1,1)); +res += mat4(-0.0563433989882469,0.0132494345307350,-0.2434540390968323,0.0796563774347305,-0.2109155058860779,0.0387088693678379,-0.0591037571430206,0.0955820381641388,0.4660535752773285,-0.1204202473163605,0.1332369595766068,-0.0285425651818514,-0.3886952698230743,-0.0434980578720570,-0.0849134400486946,0.0802380964159966) * MODEL21_texOff(vec2(0,-1)); +res += mat4(0.0412235632538795,0.1571959257125854,0.2050069272518158,-0.1138664111495018,0.1962715685367584,0.0594439841806889,0.0351715497672558,-0.0129811102524400,0.2055217623710632,-0.0647534057497978,0.0373471938073635,0.0877277255058289,-0.5734645724296570,0.1188675239682198,-0.1145943328738213,-0.1182733029127121) * MODEL22_texOff(vec2(0,-1)); +res += mat4(-0.2004909217357635,-0.4817073047161102,0.5596802830696106,-0.0327854752540588,0.0989314392209053,0.4127818942070007,0.7265836596488953,-0.2692042589187622,0.5195841789245605,-0.2357539832592010,-0.3819393217563629,0.1755530238151550,0.6578183770179749,0.1075539961457253,-0.2688144743442535,0.3242723941802979) * MODEL21_texOff(vec2(0,0)); +res += mat4(-0.3221310675144196,0.2978510260581970,0.2269985526800156,-0.3184116482734680,0.4845580160617828,0.4407236874103546,0.0099756307899952,-0.3121858239173889,-0.3810067176818848,-0.0553649961948395,0.0202834140509367,0.0409953594207764,0.2532750964164734,0.2731618583202362,0.1237529441714287,0.0134243080392480) * MODEL22_texOff(vec2(0,0)); +res += mat4(0.1835541725158691,0.0549701862037182,-0.1749316602945328,-0.2030028849840164,0.0263462308794260,0.2781440317630768,0.0372458845376968,0.3643021881580353,-0.4047883749008179,0.0660117194056511,0.4863115549087524,-0.2024163603782654,-0.6403482556343079,0.2765505611896515,0.1417075097560883,0.5064445734024048) * MODEL21_texOff(vec2(0,1)); +res += mat4(0.6106975078582764,-0.1570862233638763,-0.3223383128643036,-0.2497926801443100,-0.4854303300380707,0.0132978223264217,-0.0609334111213684,0.1285556703805923,-0.1412864029407501,-0.1379042416810989,-0.0258826259523630,0.1357705891132355,-0.1285902857780457,-0.0577826797962189,0.0550044551491737,0.1717510819435120) * MODEL22_texOff(vec2(0,1)); +res += mat4(0.1389609426259995,0.0835867226123810,0.0309768319129944,-0.0278116948902607,-0.0390677824616432,-0.0111810686066747,-0.0025318188127130,0.0069569633342326,0.0347319357097149,0.0191543344408274,0.0314339138567448,-0.0228427499532700,0.0416300334036350,0.0249234102666378,0.1210031509399414,0.1142473593354225) * MODEL21_texOff(vec2(1,-1)); +res += mat4(0.0607251487672329,0.0386395826935768,-0.0219341218471527,-0.1102298423647881,0.1487188935279846,0.0602982006967068,-0.0280748903751373,-0.0211924221366644,0.0042894422076643,-0.0269144997000694,0.0814756453037262,-0.0314031280577183,-0.0213186051696539,-0.1362965404987335,0.0382767543196678,-0.0669511556625366) * MODEL22_texOff(vec2(1,-1)); +res += mat4(-0.2397561967372894,0.3023172020912170,-0.2398054003715515,0.0041919997893274,-0.1016605198383331,-0.1521034836769104,-0.1526568531990051,0.0272433310747147,0.0741761848330498,0.1116370111703873,0.1149727106094360,-0.0809784531593323,-0.1448147594928741,-0.0943927690386772,-0.0086280042305589,0.1243222951889038) * MODEL21_texOff(vec2(1,0)); +res += mat4(-0.0469366572797298,-0.1655988991260529,-0.1029584184288979,-0.1347874104976654,0.2064601778984070,0.0521226711571217,-0.1366733759641647,-0.0041872998699546,0.1077186539769173,0.0184442866593599,-0.2309073060750961,-0.1637075096368790,-0.0417953692376614,-0.3190860450267792,-0.1593534499406815,0.0136412177234888) * MODEL22_texOff(vec2(1,0)); +res += mat4(0.1698798984289169,0.0232755411416292,-0.0876034423708916,-0.3008348643779755,0.0789884999394417,0.0034748215693980,-0.0064704762771726,0.0057828431017697,-0.0190630126744509,-0.0334153175354004,-0.0195646341890097,0.0105131156742573,0.0995147302746773,-0.3130289018154144,-0.0724022984504700,0.0113303456455469) * MODEL21_texOff(vec2(1,1)); +res += mat4(-0.0027791252359748,-0.0193455871194601,-0.0415000133216381,0.0568981170654297,-0.2745247483253479,0.1222846284508705,0.1899162530899048,0.1067754998803139,-0.0561975166201591,-0.1500336527824402,0.0526139959692955,-0.3491798937320709,-0.0692384615540504,-0.0307095069438219,0.0498757846653461,0.0019003645284101) * MODEL22_texOff(vec2(1,1)); +res = max(res, vec4(0.0)) + vec4(0.1552927196025848,0.0782765746116638,0.7966942191123962,-1.1619627475738525) * min(res, vec4(0.0)); +return res; +} + +//!HOOK LUMA +//!WHEN OUTPUT.w LUMA.w / 1.300 > OUTPUT.h LUMA.h / 1.300 > * +//!DESC mapping 4_2 +//!BIND MODEL21 +//!BIND MODEL22 +//!SAVE MODEL2 +//!COMPONENTS 4 +vec4 hook() +{ +vec4 res = vec4(-0.1443098634481430,-0.1343899369239807,-0.0624338127672672,-0.1094277128577232); +res += mat4(-0.0689977407455444,-0.1693786680698395,0.0109281269833446,0.0609922930598259,0.0296908002346754,0.1195700988173485,-0.0694077461957932,0.0971287414431572,0.0253518298268318,0.1213042959570885,0.0703809782862663,0.0055739870294929,-0.1595942378044128,-0.1336689442396164,-0.0622441768646240,-0.0428023114800453) * MODEL21_texOff(vec2(-1,-1)); +res += mat4(0.0860001668334007,-0.0226618759334087,0.1602241247892380,0.0431661494076252,0.1526461094617844,0.2752982378005981,0.0960300788283348,-0.0536719262599945,-0.0171773489564657,0.0457364916801453,-0.0360932648181915,-0.0397153608500957,-0.0277090407907963,0.0729821547865868,-0.0145150292664766,0.0252893269062042) * MODEL22_texOff(vec2(-1,-1)); +res += mat4(-0.1407091915607452,-0.4007499516010284,-0.0302001200616360,-0.0606933943927288,-0.2960600554943085,-0.2263117432594299,0.0721478462219238,-0.4578711986541748,0.0960150733590126,-0.1606502830982208,0.2444226741790771,0.0000882153908606,0.1472496986389160,0.3256779909133911,-0.2132861614227295,0.0339313484728336) * MODEL21_texOff(vec2(-1,0)); +res += mat4(-0.1477648764848709,-0.1487885862588882,-0.1973863691091537,0.0717295333743095,0.0843430235981941,0.6259996294975281,-0.1214931011199951,-0.1274987608194351,0.2359549105167389,0.3002171218395233,-0.0825233608484268,-0.0157950688153505,0.0706149637699127,0.1762917637825012,-0.0611497573554516,-0.0859689489006996) * MODEL22_texOff(vec2(-1,0)); +res += mat4(0.0174895934760571,-0.0567042417824268,0.0409146919846535,0.0258173532783985,0.1421577036380768,0.1234543323516846,-0.1721662431955338,0.1492216140031815,0.1100751459598541,0.0501539446413517,0.1100447699427605,-0.1086079254746437,-0.0608497932553291,0.0087817469611764,0.0714464113116264,-0.1285197436809540) * MODEL21_texOff(vec2(-1,1)); +res += mat4(-0.0017177806003019,-0.1463395059108734,-0.1085453778505325,0.1650195866823196,0.0813829153776169,0.1102061793208122,-0.0578421875834465,-0.0232036896049976,-0.1239888817071915,0.0155465165153146,0.1079114526510239,-0.0420837886631489,-0.0775837749242783,0.0148941157385707,-0.0502299368381500,-0.0654754191637039) * MODEL22_texOff(vec2(-1,1)); +res += mat4(0.0918162539601326,0.0440697595477104,-0.0515748932957649,0.0417411290109158,0.0353216230869293,0.1535954177379608,0.0439723692834377,-0.1288845241069794,0.1076577678322792,-0.1306740194559097,0.0715952813625336,-0.0681907683610916,-0.3798767924308777,0.1023928597569466,-0.0970670804381371,0.0077168666757643) * MODEL21_texOff(vec2(0,-1)); +res += mat4(0.0634560957551003,-0.0550306066870689,0.2073986232280731,0.0520241297781467,0.1162287592887878,-0.2218665480613708,0.3199682831764221,0.0606246069073677,-0.0058511858806014,-0.0667045339941978,-0.0449917949736118,0.0707788690924644,-0.3323366343975067,-0.0763893201947212,-0.0997853428125381,-0.1181001588702202) * MODEL22_texOff(vec2(0,-1)); +res += mat4(-0.3101258873939514,0.2616009712219238,0.0584651045501232,0.1656491309404373,-0.0069236233830452,0.2573371529579163,-0.1793291717767715,-0.2718756198883057,0.0953581258654594,0.0524105131626129,0.1183085516095161,0.0583294369280338,0.5036848187446594,-0.5763167142868042,-0.2119628041982651,-0.3140562772750854) * MODEL21_texOff(vec2(0,0)); +res += mat4(-0.2497755438089371,-0.0146329319104552,-0.2741575539112091,0.2459975033998489,0.3562706708908081,-0.6528629064559937,-0.4287456274032593,0.2055913358926773,0.1739019453525543,-0.3855968713760376,-0.0958273336291313,-0.7066691517829895,0.2365748286247253,-0.3046728968620300,-0.2590373754501343,-0.0496727414429188) * MODEL22_texOff(vec2(0,0)); +res += mat4(-0.0844531357288361,-0.0321611948311329,-0.0951840654015541,0.0577518045902252,-0.1606003493070602,0.2776086628437042,-0.1355003118515015,-0.0880064144730568,-0.1277643740177155,-0.0514567233622074,0.1522682905197144,-0.1040910631418228,-0.2767944037914276,-0.1452194601297379,0.0089118303731084,0.0231996178627014) * MODEL21_texOff(vec2(0,1)); +res += mat4(0.2603267133235931,0.0167464651167393,-0.2064073234796524,0.1782064288854599,0.4890212416648865,0.0559245310723782,0.1221160590648651,-0.0202587731182575,-0.4056585729122162,-0.1839511841535568,0.2775998413562775,0.0024275144096464,-0.2624500989913940,-0.0619418807327747,0.0153478365391493,0.0123427547514439) * MODEL22_texOff(vec2(0,1)); +res += mat4(0.0816635638475418,-0.0134946266189218,0.0594766475260258,-0.0551253929734230,0.0134431896731257,-0.0652195811271667,-0.0563635528087616,-0.0066532371565700,-0.0004114551993553,0.0105680683627725,0.1324467360973358,0.0467248968780041,0.0301312971860170,-0.1073397025465965,-0.0363437235355377,-0.0474153012037277) * MODEL21_texOff(vec2(1,-1)); +res += mat4(0.0199097190052271,0.0901319086551666,0.0448978282511234,0.0505443066358566,0.0438878424465656,-0.0494784042239189,0.0724927335977554,-0.0070675504393876,-0.0012125011999160,0.0295279901474714,0.0705125033855438,0.0555334389209747,-0.0403393507003784,-0.1271172016859055,0.0017914215568453,0.1462216079235077) * MODEL22_texOff(vec2(1,-1)); +res += mat4(-0.2827299833297729,0.2052399665117264,0.0042732120491564,-0.3969024717807770,-0.0782120972871780,0.1960176974534988,-0.0675340741872787,0.0027962317690253,0.0516129024326801,-0.0352642722427845,0.0546326488256454,0.0065340655855834,-0.1062376946210861,0.1364430636167526,-0.0536947809159756,0.2098117172718048) * MODEL21_texOff(vec2(1,0)); +res += mat4(0.0045875865034759,0.2162927240133286,-0.2158576399087906,-0.0047327815555036,0.1251590698957443,0.1279677897691727,-0.1188964918255806,0.0328494384884834,0.0076038073748350,-0.0561547242105007,0.0335608273744583,0.4332321286201477,0.0021786799188703,0.0844521671533585,-0.2102309316396713,-0.0189208015799522) * MODEL22_texOff(vec2(1,0)); +res += mat4(0.0933093801140785,0.1548244059085846,-0.0598701611161232,0.0357220247387886,-0.1141726672649384,0.0536412484943867,-0.0159156844019890,-0.0445508137345314,0.1883231997489929,-0.1547038406133652,0.0530619807541370,0.0059371814131737,0.0602529086172581,-0.0435577929019928,0.0083390390500426,0.0191930737346411) * MODEL21_texOff(vec2(1,1)); +res += mat4(-0.0351041629910469,0.2119503468275070,-0.0841927304863930,0.0079463515430689,0.0683520361781120,-0.1657009869813919,0.0611055232584476,-0.0063667562790215,0.0330024957656860,-0.1810818463563919,0.0872574150562286,0.1485669612884521,-0.1305806934833527,0.0041402997449040,0.0223289318382740,-0.0141495745629072) * MODEL22_texOff(vec2(1,1)); +res = max(res, vec4(0.0)) + vec4(0.5769761204719543,0.1716064810752869,-0.0821026712656021,0.2092144042253494) * min(res, vec4(0.0)); +return res; +} + +//!HOOK LUMA +//!WHEN OUTPUT.w LUMA.w / 1.300 > OUTPUT.h LUMA.h / 1.300 > * +//!DESC sub-band residuals 1 +//!BIND MODEL1 +//!BIND MODEL2 +//!BIND FEATURE1 +//!SAVE RES1 +//!COMPONENTS 4 +vec4 hook() +{ +vec4 res = vec4(0.0245648548007011,-0.4467784762382507,0.0197526942938566,-0.0110000418499112); +res += mat4(0.0302665308117867,-0.9262221455574036,-0.1161134764552116,-0.0506900474429131,0.2716045379638672,-0.0485871583223343,0.0044713355600834,-0.4274623394012451,0.0749531090259552,-0.3700785338878632,0.0350039415061474,-0.0540786534547806,-0.0607390031218529,-0.8019900321960449,0.0923245251178741,0.1258827745914459) * MODEL1_texOff(0); +res += mat4(-0.0649135261774063,0.0815236791968346,0.0067334296181798,0.1277425885200500,-0.0051357815973461,-0.1485908329486847,0.0074226572178304,0.0050623500719666,0.0588018335402012,-0.0692552924156189,0.1288725286722183,-0.0989386290311813,0.0427936837077141,0.0967708528041840,-0.0455632135272026,-0.0711275041103363) * MODEL2_texOff(0); +res += FEATURE1_texOff(0); +res = max(res, vec4(0.0)) + vec4(0.9927186965942383,0.0570580027997494,1.3226752281188965,1.0069466829299927) * min(res, vec4(0.0)); +return res; +} + +//!HOOK LUMA +//!WHEN OUTPUT.w LUMA.w / 1.300 > OUTPUT.h LUMA.h / 1.300 > * +//!DESC sub-band residuals 2 +//!BIND MODEL1 +//!BIND MODEL2 +//!BIND FEATURE2 +//!SAVE RES2 +//!COMPONENTS 4 +vec4 hook() +{ +vec4 res = vec4(-0.0425243787467480,-0.3715015351772308,-0.0256227850914001,-0.2774516046047211); +res += mat4(0.0238118842244148,0.0295480657368898,-0.0066418983042240,0.1021223962306976,-0.0568209178745747,-0.4355100393295288,-0.2700522541999817,-0.2060186564922333,-0.0689613372087479,-0.1689691990613937,-0.0306748505681753,-0.2461252212524414,-0.0057375836186111,-0.1892303228378296,-0.0285871494561434,-0.5032613277435303) * MODEL1_texOff(0); +res += mat4(0.5463213324546814,0.0972800329327583,0.0307560767978430,0.0678058937191963,-0.0356063023209572,-0.7013865113258362,0.1890443563461304,-0.1036657467484474,-0.1745826154947281,-0.2942218780517578,-0.0485423319041729,-0.2983124554157257,-0.0524431839585304,-0.3261034786701202,0.3217246532440186,0.1958018541336060) * MODEL2_texOff(0); +res += FEATURE2_texOff(0); +res = max(res, vec4(0.0)) + vec4(0.1391339898109436,0.0960328355431557,0.6235341429710388,0.1177272796630859) * min(res, vec4(0.0)); +return res; +} + +//!HOOK LUMA +//!WHEN OUTPUT.w LUMA.w / 1.300 > OUTPUT.h LUMA.h / 1.300 > * +//!DESC sub-pixel convolution 1 +//!BIND RES1 +//!BIND RES2 +//!SAVE SUBCONV1 +//!COMPONENTS 4 +vec4 hook() +{ +vec4 res = vec4(0.2010385394096375,0.2058132737874985,0.1918809115886688,0.1961363703012466); +res += mat4x4(-0.0005980331334285,-0.0095877395942807,-0.0149448839947581,-0.0026380482595414,0.0320665836334229,-0.0706205591559410,-0.0054677254520357,0.0215112231671810,-0.0025710910558701,-0.0000433265340689,0.0044494951143861,-0.0034823501482606,-0.0050858515314758,0.0109513988718390,0.0208286065608263,-0.0032168829347938) * RES1_texOff(vec2(-1,-1)); +res += mat4x4(-0.0145305208861828,0.0246876608580351,-0.0038286084309220,-0.0033089490607381,-0.0920709222555161,-0.0767898634076118,0.0012083095498383,-0.0751532614231110,0.0001302754972130,-0.0107085108757019,-0.0010383903281763,-0.0059571005403996,0.0809685289859772,0.0414833538234234,0.0227938480675220,-0.0211347509175539) * RES2_texOff(vec2(-1,-1)); +res += mat4x4(0.0160999298095703,0.0364215746521950,-0.0377063788473606,-0.0449111759662628,-0.0476365163922310,0.1522845029830933,-0.0131391752511263,-0.0476671792566776,-0.0378389135003090,0.0235454943031073,0.0224007442593575,-0.0010372076649219,-0.0089435689151287,-0.0293026417493820,0.0274190884083509,0.0469092652201653) * RES1_texOff(vec2(-1,0)); +res += mat4x4(0.0297575183212757,-0.0132508194074035,-0.0044682323932648,-0.0096222748979926,0.2525918781757355,0.1873829364776611,-0.5599535703659058,-0.2372044622898102,0.0033207221422344,0.0256173480302095,0.0294605866074562,0.0323960892856121,-0.1679904460906982,-0.1278967708349228,0.3168168365955353,0.1978507637977600) * RES2_texOff(vec2(-1,0)); +res += mat4x4(-0.0047590560279787,-0.0149335600435734,0.0033453819341958,-0.0012247267877683,0.1112466752529144,0.0147760482504964,0.0031189601868391,0.0391573049128056,-0.0028154491446912,-0.0036881719715893,-0.0116015253588557,-0.0037573333829641,0.0047581391409039,0.0071071563288569,-0.0033221673220396,0.0004882142529823) * RES1_texOff(vec2(-1,1)); +res += mat4x4(-0.0025197160430253,-0.0018677815096453,0.0038254233077168,0.0041981274262071,-0.1321131736040115,-0.0494364202022552,0.0760654658079147,-0.1386690139770508,-0.0016222692793235,-0.0060105528682470,0.0010201989207417,0.0092753591015935,-0.0194614846259356,0.0087382243946195,-0.0606758072972298,0.0156162241473794) * RES2_texOff(vec2(-1,1)); +res += mat4x4(-0.0073722628876567,0.0012844242155552,0.0241398401558399,-0.0075527969747782,-0.0865194946527481,-0.0610522404313087,0.0289319511502981,-0.0994452014565468,0.0281447004526854,-0.0250582899898291,0.0044891634024680,-0.0246205236762762,0.0112307453528047,-0.0010844616917893,-0.0223584957420826,0.0177635718137026) * RES1_texOff(vec2(0,-1)); +res += mat4x4(-0.0585863515734673,0.0953190475702286,-0.0555586628615856,0.1033507287502289,0.1560877263545990,-0.0690897777676582,-0.0341389514505863,-0.0661668032407761,0.0531073249876499,-0.0266165956854820,-0.0203275382518768,0.0017760475166142,-0.1300747394561768,0.1810652017593384,0.0381597876548767,0.1397419273853302) * RES2_texOff(vec2(0,-1)); +res += mat4x4(0.6259804368019104,0.6062518954277039,0.5450409054756165,0.5966195464134216,-0.0423948727548122,0.0760537460446358,-0.0113651463761926,0.3007817566394806,-0.3218322694301605,0.2713021934032440,-0.3143473267555237,0.2303840517997742,0.3493050038814545,0.3590726852416992,0.4138027429580688,0.3391666412353516) * RES1_texOff(vec2(0,0)); +res += mat4x4(0.0790478289127350,-0.0978994593024254,0.0779844969511032,-0.0823706611990929,0.0094470111653209,0.1671760678291321,0.1201528310775757,-0.2016288936138153,0.3667598366737366,0.3651430010795593,-0.3612343966960907,-0.2978236973285675,-0.4231655597686768,0.0091423410922289,-0.1918412446975708,0.4224558770656586) * RES2_texOff(vec2(0,0)); +res += mat4x4(-0.0186564289033413,0.0274957418441772,-0.0064405309967697,0.0056951809674501,0.4864942431449890,-0.2563461959362030,0.4357284605503082,-0.2976118028163910,0.0374982468783855,0.0167757049202919,0.0305800959467888,0.0232830215245485,0.0138373551890254,-0.0191283021122217,0.0032355054281652,0.0055057541467249) * RES1_texOff(vec2(0,1)); +res += mat4x4(-0.0276355985552073,0.0048149987123907,-0.0251619722694159,-0.0057246969081461,0.0271473955363035,-0.0042668608948588,-0.0594691745936871,0.2255926281213760,-0.0203660242259502,0.0721646770834923,0.0137230781838298,-0.0650938376784325,-0.3049557507038116,0.2035628110170364,-0.2509683668613434,0.1962853819131851) * RES2_texOff(vec2(0,1)); +res += mat4x4(0.0109980758279562,-0.0053752651438117,-0.0112550277262926,0.0024017230607569,0.0362104885280132,0.0084348218515515,-0.0106990104541183,-0.0207723993808031,-0.0014961160486564,0.0066790678538382,0.0028113177977502,0.0025022011250257,-0.0093937022611499,0.0016421369509771,0.0035362334456295,-0.0058064293116331) * RES1_texOff(vec2(1,-1)); +res += mat4x4(0.0138889988884330,-0.0078343702480197,0.0061464929021895,0.0202130675315857,-0.0257590841501951,-0.0366640128195286,0.0250097587704659,-0.0498071312904358,-0.0103149358183146,-0.0001786737266229,-0.0099909817799926,0.0062733208760619,0.0131437368690968,-0.0005469865864143,-0.0388854071497917,0.0612070746719837) * RES2_texOff(vec2(1,-1)); +res += mat4x4(0.0052813654765487,0.0215748809278011,0.0107395220547915,-0.0079439217224717,0.0382786765694618,0.0697424262762070,-0.0415962152183056,0.0657853558659554,0.0209470037370920,-0.0218399092555046,-0.0447359494864941,0.0407319553196430,-0.0040902681648731,-0.0196106657385826,-0.0018554026028141,0.0203906055539846) * RES1_texOff(vec2(1,0)); +res += mat4x4(-0.0106181986629963,0.0084018819034100,0.0131329754367471,-0.0198754761368036,0.1117177084088326,0.0990846082568169,-0.0732304081320763,0.0163581725209951,-0.0648830309510231,-0.0451613292098045,0.0206844564527273,0.0031441387254745,-0.0106161693111062,-0.0567689687013626,0.0782861113548279,-0.0306094046682119) * RES2_texOff(vec2(1,0)); +res += mat4x4(0.0012452082009986,-0.0026056850329041,-0.0096226977184415,-0.0037850935477763,-0.0190967041999102,0.0534373670816422,0.1599360853433609,0.0834670960903168,-0.0070255175232887,0.0012873009545729,0.0030876772943884,-0.0093916896730661,-0.0033529615029693,0.0043485122732818,0.0089034689590335,-0.0067489291541278) * RES1_texOff(vec2(1,1)); +res += mat4x4(0.0004713654634543,-0.0034161377698183,-0.0026913962792605,0.0053522582165897,-0.0040974905714393,0.0273330621421337,-0.0333138220012188,-0.0701237097382545,0.0082997502759099,-0.0183656588196754,-0.0122841577976942,-0.0052855615504086,-0.0023795007728040,-0.0438593104481697,-0.1101513057947159,-0.0182559806853533) * RES2_texOff(vec2(1,1)); +return vec4(res); +} + +//!HOOK LUMA +//!WHEN OUTPUT.w LUMA.w / 1.300 > OUTPUT.h LUMA.h / 1.300 > * +//!WIDTH LUMA.w 2 * +//!HEIGHT LUMA.h 2 * +//!DESC aggregation +//!BIND SUBCONV1 +vec4 hook() +{ +vec2 fcoord = fract(SUBCONV1_pos * SUBCONV1_size); +vec2 base = SUBCONV1_pos + (vec2(0.5) - fcoord) * SUBCONV1_pt; +ivec2 index = ivec2(fcoord * vec2(2)); +vec4 res = SUBCONV1_tex(base); +return vec4(res[index.x * 2 + index.y], 0, 0, 1); +} \ No newline at end of file diff --git a/mpv/shaders/KrigBilateral.glsl b/mpv/shaders/KrigBilateral.glsl new file mode 100644 index 0000000..fdda376 --- /dev/null +++ b/mpv/shaders/KrigBilateral.glsl @@ -0,0 +1,216 @@ +// Source: https://gist.github.com/igv/a015fc885d5c22e6891820ad89555637 + +// KrigBilateral by Shiandow +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library. + +//!HOOK CHROMA +//!BIND HOOKED +//!BIND LUMA +//!SAVE LOWRES_Y +//!WIDTH LUMA.w +//!WHEN CHROMA.w LUMA.w < +//!DESC KrigBilateral Downscaling Y pass 1 + +#define offset vec2(0) + +#define axis 1 + +#define Kernel(x) dot(vec3(0.42659, -0.49656, 0.076849), cos(vec3(0, 1, 2) * acos(-1.) * (x + 1.))) + +vec4 hook() { + // Calculate bounds + float low = ceil((LUMA_pos - CHROMA_pt) * LUMA_size - offset - 0.5)[axis]; + float high = floor((LUMA_pos + CHROMA_pt) * LUMA_size - offset - 0.5)[axis]; + + float W = 0.0; + vec4 avg = vec4(0); + vec2 pos = LUMA_pos; + + for (float k = low; k <= high; k++) { + pos[axis] = LUMA_pt[axis] * (k - offset[axis] + 0.5); + float rel = (pos[axis] - LUMA_pos[axis])*CHROMA_size[axis]; + float w = Kernel(rel); + + vec4 y = textureGrad(LUMA_raw, pos, vec2(0.0), vec2(0.0)).xxxx * LUMA_mul; + y.y *= y.y; + avg += w * y; + W += w; + } + avg /= W; + avg.y = abs(avg.y - avg.x * avg.x); + return avg; +} + +//!HOOK CHROMA +//!BIND HOOKED +//!BIND LOWRES_Y +//!SAVE LOWRES_Y +//!WHEN CHROMA.w LUMA.w < +//!DESC KrigBilateral Downscaling Y pass 2 + +#define offset vec2(0) + +#define axis 0 + +#define Kernel(x) dot(vec3(0.42659, -0.49656, 0.076849), cos(vec3(0, 1, 2) * acos(-1.) * (x + 1.))) + +vec4 hook() { + // Calculate bounds + float low = ceil((LOWRES_Y_pos - CHROMA_pt) * LOWRES_Y_size - offset - 0.5)[axis]; + float high = floor((LOWRES_Y_pos + CHROMA_pt) * LOWRES_Y_size - offset - 0.5)[axis]; + + float W = 0.0; + vec4 avg = vec4(0); + vec2 pos = LOWRES_Y_pos; + + for (float k = low; k <= high; k++) { + pos[axis] = LOWRES_Y_pt[axis] * (k - offset[axis] + 0.5); + float rel = (pos[axis] - LOWRES_Y_pos[axis])*CHROMA_size[axis]; + float w = Kernel(rel); + + vec4 y = textureGrad(LOWRES_Y_raw, pos, vec2(0.0), vec2(0.0)).xxxx * LOWRES_Y_mul; + y.y *= y.y; + avg += w * y; + W += w; + } + avg /= W; + avg.y = abs(avg.y - avg.x * avg.x) + LOWRES_Y_texOff(0).y; + return avg; +} + +//!HOOK CHROMA +//!BIND HOOKED +//!BIND LUMA +//!BIND LOWRES_Y +//!WIDTH LUMA.w +//!HEIGHT LUMA.h +//!WHEN CHROMA.w LUMA.w < +//!OFFSET ALIGN +//!DESC KrigBilateral Upscaling UV + +#define sqr(x) dot(x,x) +#define sigma_nsq 256.0/(255.0*255.0) + +#define N 8 + +#define M(i,j) Mx[min(i,j)*N + max(i,j) - (min(i,j)*(min(i,j)+1))/2] + +#define C(i,j) (inversesqrt(1.0 + (X[i].y + X[j].y) / Var) * exp(-0.5 * (sqr(X[i].x - X[j].x) / (localVar + X[i].y + X[j].y) + sqr((coords[i] - coords[j]) / radius))) /*+ (X[i].x - y) * (X[j].x - y) / Var*/) // commented out part works well only on test patterns +#define c(i) (inversesqrt(1.0 + X[i].y / Var) * exp(-0.5 * (sqr(X[i].x - y) / (localVar + X[i].y) + sqr((coords[i] - offset) / radius)))) + +#define getnsum(i) X[i] = vec4(LOWRES_Y_tex(LOWRES_Y_pt*(pos+coords[i]+vec2(0.5))).xy, \ + CHROMA_tex(CHROMA_pt*(pos+coords[i]+vec2(0.5))).xy); \ + w = clamp(1.5 - abs(coords[i]), 0.0, 1.0); \ + total += w.x*w.y*vec4(X[i].x, X[i].x * X[i].x, X[i].y, 1.0); + +#define I3(f, n) f(n) f(n+1) f(n+2) +#define I9(f, n) I3(f, n) I3(f, n+3) I3(f, n+6) + +vec4 hook() { + vec2 pos = CHROMA_pos * HOOKED_size - vec2(0.5); + vec2 offset = pos - round(pos); + pos -= offset; + + vec2 coords[N+1]; + vec4 X[N+1]; + vec2 w; + vec4 total = vec4(0); + + coords[0] = vec2(-1,-1); coords[1] = vec2(-1, 0); coords[2] = vec2(-1, 1); + coords[3] = vec2( 0,-1); coords[4] = vec2( 0, 1); coords[5] = vec2( 1,-1); + coords[6] = vec2( 1, 0); coords[7] = vec2( 1, 1); coords[8] = vec2( 0, 0); + + I9(getnsum, 0) + + total.xyz /= total.w; + float localVar = abs(total.y - total.x * total.x) + sigma_nsq; + float Var = localVar + total.z; + float radius = 1.0; + + float y = LUMA_texOff(0).x; + float Mx[(N*(N+1))/2]; + float b[N]; + vec2 interp = X[N].zw; + + b[0] = c(0) - c(N) - C(0,N) + C(N,N); M(0, 0) = C(0,0) - C(0,N) - C(0,N) + C(N,N); M(0, 1) = C(0,1) - C(1,N) - C(0,N) + C(N,N); M(0, 2) = C(0,2) - C(2,N) - C(0,N) + C(N,N); M(0, 3) = C(0,3) - C(3,N) - C(0,N) + C(N,N); M(0, 4) = C(0,4) - C(4,N) - C(0,N) + C(N,N); M(0, 5) = C(0,5) - C(5,N) - C(0,N) + C(N,N); M(0, 6) = C(0,6) - C(6,N) - C(0,N) + C(N,N); M(0, 7) = C(0,7) - C(7,N) - C(0,N) + C(N,N); + b[1] = c(1) - c(N) - C(1,N) + C(N,N); M(1, 1) = C(1,1) - C(1,N) - C(1,N) + C(N,N); M(1, 2) = C(1,2) - C(2,N) - C(1,N) + C(N,N); M(1, 3) = C(1,3) - C(3,N) - C(1,N) + C(N,N); M(1, 4) = C(1,4) - C(4,N) - C(1,N) + C(N,N); M(1, 5) = C(1,5) - C(5,N) - C(1,N) + C(N,N); M(1, 6) = C(1,6) - C(6,N) - C(1,N) + C(N,N); M(1, 7) = C(1,7) - C(7,N) - C(1,N) + C(N,N); + b[2] = c(2) - c(N) - C(2,N) + C(N,N); M(2, 2) = C(2,2) - C(2,N) - C(2,N) + C(N,N); M(2, 3) = C(2,3) - C(3,N) - C(2,N) + C(N,N); M(2, 4) = C(2,4) - C(4,N) - C(2,N) + C(N,N); M(2, 5) = C(2,5) - C(5,N) - C(2,N) + C(N,N); M(2, 6) = C(2,6) - C(6,N) - C(2,N) + C(N,N); M(2, 7) = C(2,7) - C(7,N) - C(2,N) + C(N,N); + b[3] = c(3) - c(N) - C(3,N) + C(N,N); M(3, 3) = C(3,3) - C(3,N) - C(3,N) + C(N,N); M(3, 4) = C(3,4) - C(4,N) - C(3,N) + C(N,N); M(3, 5) = C(3,5) - C(5,N) - C(3,N) + C(N,N); M(3, 6) = C(3,6) - C(6,N) - C(3,N) + C(N,N); M(3, 7) = C(3,7) - C(7,N) - C(3,N) + C(N,N); + b[4] = c(4) - c(N) - C(4,N) + C(N,N); M(4, 4) = C(4,4) - C(4,N) - C(4,N) + C(N,N); M(4, 5) = C(4,5) - C(5,N) - C(4,N) + C(N,N); M(4, 6) = C(4,6) - C(6,N) - C(4,N) + C(N,N); M(4, 7) = C(4,7) - C(7,N) - C(4,N) + C(N,N); + b[5] = c(5) - c(N) - C(5,N) + C(N,N); M(5, 5) = C(5,5) - C(5,N) - C(5,N) + C(N,N); M(5, 6) = C(5,6) - C(6,N) - C(5,N) + C(N,N); M(5, 7) = C(5,7) - C(7,N) - C(5,N) + C(N,N); + b[6] = c(6) - c(N) - C(6,N) + C(N,N); M(6, 6) = C(6,6) - C(6,N) - C(6,N) + C(N,N); M(6, 7) = C(6,7) - C(7,N) - C(6,N) + C(N,N); + b[7] = c(7) - c(N) - C(7,N) + C(N,N); M(7, 7) = C(7,7) - C(7,N) - C(7,N) + C(N,N); + + b[1] -= b[0] * M(0, 1) / M(0, 0); M(1, 1) -= M(0, 1) * M(0, 1) / M(0, 0); M(1, 2) -= M(0, 2) * M(0, 1) / M(0, 0); M(1, 3) -= M(0, 3) * M(0, 1) / M(0, 0); M(1, 4) -= M(0, 4) * M(0, 1) / M(0, 0); M(1, 5) -= M(0, 5) * M(0, 1) / M(0, 0); M(1, 6) -= M(0, 6) * M(0, 1) / M(0, 0); M(1, 7) -= M(0, 7) * M(0, 1) / M(0, 0); + b[2] -= b[0] * M(0, 2) / M(0, 0); M(2, 2) -= M(0, 2) * M(0, 2) / M(0, 0); M(2, 3) -= M(0, 3) * M(0, 2) / M(0, 0); M(2, 4) -= M(0, 4) * M(0, 2) / M(0, 0); M(2, 5) -= M(0, 5) * M(0, 2) / M(0, 0); M(2, 6) -= M(0, 6) * M(0, 2) / M(0, 0); M(2, 7) -= M(0, 7) * M(0, 2) / M(0, 0); + b[3] -= b[0] * M(0, 3) / M(0, 0); M(3, 3) -= M(0, 3) * M(0, 3) / M(0, 0); M(3, 4) -= M(0, 4) * M(0, 3) / M(0, 0); M(3, 5) -= M(0, 5) * M(0, 3) / M(0, 0); M(3, 6) -= M(0, 6) * M(0, 3) / M(0, 0); M(3, 7) -= M(0, 7) * M(0, 3) / M(0, 0); + b[4] -= b[0] * M(0, 4) / M(0, 0); M(4, 4) -= M(0, 4) * M(0, 4) / M(0, 0); M(4, 5) -= M(0, 5) * M(0, 4) / M(0, 0); M(4, 6) -= M(0, 6) * M(0, 4) / M(0, 0); M(4, 7) -= M(0, 7) * M(0, 4) / M(0, 0); + b[5] -= b[0] * M(0, 5) / M(0, 0); M(5, 5) -= M(0, 5) * M(0, 5) / M(0, 0); M(5, 6) -= M(0, 6) * M(0, 5) / M(0, 0); M(5, 7) -= M(0, 7) * M(0, 5) / M(0, 0); + b[6] -= b[0] * M(0, 6) / M(0, 0); M(6, 6) -= M(0, 6) * M(0, 6) / M(0, 0); M(6, 7) -= M(0, 7) * M(0, 6) / M(0, 0); + b[7] -= b[0] * M(0, 7) / M(0, 0); M(7, 7) -= M(0, 7) * M(0, 7) / M(0, 0); + + b[2] -= b[1] * M(1, 2) / M(1, 1); M(2, 2) -= M(1, 2) * M(1, 2) / M(1, 1); M(2, 3) -= M(1, 3) * M(1, 2) / M(1, 1); M(2, 4) -= M(1, 4) * M(1, 2) / M(1, 1); M(2, 5) -= M(1, 5) * M(1, 2) / M(1, 1); M(2, 6) -= M(1, 6) * M(1, 2) / M(1, 1); M(2, 7) -= M(1, 7) * M(1, 2) / M(1, 1); + b[3] -= b[1] * M(1, 3) / M(1, 1); M(3, 3) -= M(1, 3) * M(1, 3) / M(1, 1); M(3, 4) -= M(1, 4) * M(1, 3) / M(1, 1); M(3, 5) -= M(1, 5) * M(1, 3) / M(1, 1); M(3, 6) -= M(1, 6) * M(1, 3) / M(1, 1); M(3, 7) -= M(1, 7) * M(1, 3) / M(1, 1); + b[4] -= b[1] * M(1, 4) / M(1, 1); M(4, 4) -= M(1, 4) * M(1, 4) / M(1, 1); M(4, 5) -= M(1, 5) * M(1, 4) / M(1, 1); M(4, 6) -= M(1, 6) * M(1, 4) / M(1, 1); M(4, 7) -= M(1, 7) * M(1, 4) / M(1, 1); + b[5] -= b[1] * M(1, 5) / M(1, 1); M(5, 5) -= M(1, 5) * M(1, 5) / M(1, 1); M(5, 6) -= M(1, 6) * M(1, 5) / M(1, 1); M(5, 7) -= M(1, 7) * M(1, 5) / M(1, 1); + b[6] -= b[1] * M(1, 6) / M(1, 1); M(6, 6) -= M(1, 6) * M(1, 6) / M(1, 1); M(6, 7) -= M(1, 7) * M(1, 6) / M(1, 1); + b[7] -= b[1] * M(1, 7) / M(1, 1); M(7, 7) -= M(1, 7) * M(1, 7) / M(1, 1); + + b[3] -= b[2] * M(2, 3) / M(2, 2); M(3, 3) -= M(2, 3) * M(2, 3) / M(2, 2); M(3, 4) -= M(2, 4) * M(2, 3) / M(2, 2); M(3, 5) -= M(2, 5) * M(2, 3) / M(2, 2); M(3, 6) -= M(2, 6) * M(2, 3) / M(2, 2); M(3, 7) -= M(2, 7) * M(2, 3) / M(2, 2); + b[4] -= b[2] * M(2, 4) / M(2, 2); M(4, 4) -= M(2, 4) * M(2, 4) / M(2, 2); M(4, 5) -= M(2, 5) * M(2, 4) / M(2, 2); M(4, 6) -= M(2, 6) * M(2, 4) / M(2, 2); M(4, 7) -= M(2, 7) * M(2, 4) / M(2, 2); + b[5] -= b[2] * M(2, 5) / M(2, 2); M(5, 5) -= M(2, 5) * M(2, 5) / M(2, 2); M(5, 6) -= M(2, 6) * M(2, 5) / M(2, 2); M(5, 7) -= M(2, 7) * M(2, 5) / M(2, 2); + b[6] -= b[2] * M(2, 6) / M(2, 2); M(6, 6) -= M(2, 6) * M(2, 6) / M(2, 2); M(6, 7) -= M(2, 7) * M(2, 6) / M(2, 2); + b[7] -= b[2] * M(2, 7) / M(2, 2); M(7, 7) -= M(2, 7) * M(2, 7) / M(2, 2); + + b[4] -= b[3] * M(3, 4) / M(3, 3); M(4, 4) -= M(3, 4) * M(3, 4) / M(3, 3); M(4, 5) -= M(3, 5) * M(3, 4) / M(3, 3); M(4, 6) -= M(3, 6) * M(3, 4) / M(3, 3); M(4, 7) -= M(3, 7) * M(3, 4) / M(3, 3); + b[5] -= b[3] * M(3, 5) / M(3, 3); M(5, 5) -= M(3, 5) * M(3, 5) / M(3, 3); M(5, 6) -= M(3, 6) * M(3, 5) / M(3, 3); M(5, 7) -= M(3, 7) * M(3, 5) / M(3, 3); + b[6] -= b[3] * M(3, 6) / M(3, 3); M(6, 6) -= M(3, 6) * M(3, 6) / M(3, 3); M(6, 7) -= M(3, 7) * M(3, 6) / M(3, 3); + b[7] -= b[3] * M(3, 7) / M(3, 3); M(7, 7) -= M(3, 7) * M(3, 7) / M(3, 3); + + b[5] -= b[4] * M(4, 5) / M(4, 4); M(5, 5) -= M(4, 5) * M(4, 5) / M(4, 4); M(5, 6) -= M(4, 6) * M(4, 5) / M(4, 4); M(5, 7) -= M(4, 7) * M(4, 5) / M(4, 4); + b[6] -= b[4] * M(4, 6) / M(4, 4); M(6, 6) -= M(4, 6) * M(4, 6) / M(4, 4); M(6, 7) -= M(4, 7) * M(4, 6) / M(4, 4); + b[7] -= b[4] * M(4, 7) / M(4, 4); M(7, 7) -= M(4, 7) * M(4, 7) / M(4, 4); + + b[6] -= b[5] * M(5, 6) / M(5, 5); M(6, 6) -= M(5, 6) * M(5, 6) / M(5, 5); M(6, 7) -= M(5, 7) * M(5, 6) / M(5, 5); + b[7] -= b[5] * M(5, 7) / M(5, 5); M(7, 7) -= M(5, 7) * M(5, 7) / M(5, 5); + + b[7] -= b[6] * M(6, 7) / M(6, 6); M(7, 7) -= M(6, 7) * M(6, 7) / M(6, 6); + + b[7] /= M(7, 7); + interp += b[7] * (X[7] - X[N]).zw; + + b[6] -= M(6, 7) * b[7]; b[6] /= M(6, 6); + interp += b[6] * (X[6] - X[N]).zw; + + b[5] -= M(5, 6) * b[6]; b[5] -= M(5, 7) * b[7]; b[5] /= M(5, 5); + interp += b[5] * (X[5] - X[N]).zw; + + b[4] -= M(4, 5) * b[5]; b[4] -= M(4, 6) * b[6]; b[4] -= M(4, 7) * b[7]; b[4] /= M(4, 4); + interp += b[4] * (X[4] - X[N]).zw; + + b[3] -= M(3, 4) * b[4]; b[3] -= M(3, 5) * b[5]; b[3] -= M(3, 6) * b[6]; b[3] -= M(3, 7) * b[7]; b[3] /= M(3, 3); + interp += b[3] * (X[3] - X[N]).zw; + + b[2] -= M(2, 3) * b[3]; b[2] -= M(2, 4) * b[4]; b[2] -= M(2, 5) * b[5]; b[2] -= M(2, 6) * b[6]; b[2] -= M(2, 7) * b[7]; b[2] /= M(2, 2); + interp += b[2] * (X[2] - X[N]).zw; + + b[1] -= M(1, 2) * b[2]; b[1] -= M(1, 3) * b[3]; b[1] -= M(1, 4) * b[4]; b[1] -= M(1, 5) * b[5]; b[1] -= M(1, 6) * b[6]; b[1] -= M(1, 7) * b[7]; b[1] /= M(1, 1); + interp += b[1] * (X[1] - X[N]).zw; + + b[0] -= M(0, 1) * b[1]; b[0] -= M(0, 2) * b[2]; b[0] -= M(0, 3) * b[3]; b[0] -= M(0, 4) * b[4]; b[0] -= M(0, 5) * b[5]; b[0] -= M(0, 6) * b[6]; b[0] -= M(0, 7) * b[7]; b[0] /= M(0, 0); + interp += b[0] * (X[0] - X[N]).zw; + + return interp.xyxy; +} \ No newline at end of file diff --git a/mpv/shaders/SSimDownscaler.glsl b/mpv/shaders/SSimDownscaler.glsl new file mode 100644 index 0000000..7fefc79 --- /dev/null +++ b/mpv/shaders/SSimDownscaler.glsl @@ -0,0 +1,220 @@ +// Source: https://gist.github.com/igv/36508af3ffc84410fe39761d6969be10 + +// Requires linear-downscaling=no. Can be used with sharp scalers now (finally able to suppress ringing artifacts). + +// SSimDownscaler by Shiandow +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library. + +//!HOOK POSTKERNEL +//!BIND HOOKED +//!BIND PREKERNEL +//!SAVE L2 +//!WIDTH NATIVE_CROPPED.w +//!WHEN NATIVE_CROPPED.h POSTKERNEL.h > +//!COMPONENTS 3 +//!DESC SSimDownscaler L2 pass 1 + +#define axis 1 + +#define offset vec2(0,0) + +#define MN(B,C,x) (x < 1.0 ? ((2.-1.5*B-(C))*x + (-3.+2.*B+C))*x*x + (1.-(B)/3.) : (((-(B)/6.-(C))*x + (B+5.*C))*x + (-2.*B-8.*C))*x+((4./3.)*B+4.*C)) +#define Kernel(x) MN(.0, .5, abs(x)) +#define taps 2.0 + +vec4 hook() { + vec2 base = PREKERNEL_pt * (PREKERNEL_pos * input_size + tex_offset); + + float low = ceil((PREKERNEL_pos - taps*POSTKERNEL_pt) * input_size - offset + tex_offset - 0.5)[axis]; + float high = floor((PREKERNEL_pos + taps*POSTKERNEL_pt) * input_size - offset + tex_offset - 0.5)[axis]; + + float W = 0.0; + vec4 avg = vec4(0); + vec2 pos = base; + + for (float k = low; k <= high; k++) { + pos[axis] = PREKERNEL_pt[axis] * (k - offset[axis] + 0.5); + float rel = (pos[axis] - base[axis])*POSTKERNEL_size[axis]; + float w = Kernel(rel); + + vec4 tex = textureLod(PREKERNEL_raw, pos, 0.0) * PREKERNEL_mul; + avg += w * tex * tex; + W += w; + } + avg /= W; + + return avg; +} + +//!HOOK POSTKERNEL +//!BIND HOOKED +//!BIND L2 +//!SAVE L2 +//!WHEN NATIVE_CROPPED.w POSTKERNEL.w > +//!COMPONENTS 3 +//!DESC SSimDownscaler L2 pass 2 + +#define axis 0 + +#define offset vec2(0,0) + +#define MN(B,C,x) (x < 1.0 ? ((2.-1.5*B-(C))*x + (-3.+2.*B+C))*x*x + (1.-(B)/3.) : (((-(B)/6.-(C))*x + (B+5.*C))*x + (-2.*B-8.*C))*x+((4./3.)*B+4.*C)) +#define Kernel(x) MN(.0, .5, abs(x)) +#define taps 2.0 + +vec4 hook() { + float low = ceil((L2_pos - taps*POSTKERNEL_pt) * L2_size - offset - 0.5)[axis]; + float high = floor((L2_pos + taps*POSTKERNEL_pt) * L2_size - offset - 0.5)[axis]; + + float W = 0.0; + vec4 avg = vec4(0); + vec2 pos = L2_pos; + + for (float k = low; k <= high; k++) { + pos[axis] = L2_pt[axis] * (k - offset[axis] + 0.5); + float rel = (pos[axis] - L2_pos[axis])*POSTKERNEL_size[axis]; + float w = Kernel(rel); + + avg += w * textureLod(L2_raw, pos, 0.0) * L2_mul; + W += w; + } + avg /= W; + + return avg; +} + +//!HOOK POSTKERNEL +//!BIND HOOKED +//!BIND L2 +//!SAVE MR +//!WHEN NATIVE_CROPPED.h POSTKERNEL.h > +//!COMPONENTS 4 +//!DESC SSimDownscaler mean & R + +#define oversharp 0.0 + +#define sigma_nsq 10. / (255.*255.) +#define locality 2.0 + +#define offset vec2(0,0) + +#define Kernel(x) pow(1.0 / locality, abs(x)) +#define taps 3.0 + +#define Luma(rgb) ( dot(rgb, vec3(0.2126, 0.7152, 0.0722)) ) + +mat3x3 ScaleH(vec2 pos) { + float low = ceil(-0.5*taps - offset)[0]; + float high = floor(0.5*taps - offset)[0]; + + float W = 0.0; + mat3x3 avg = mat3x3(0); + + for (float k = low; k <= high; k++) { + pos[0] = HOOKED_pos[0] + HOOKED_pt[0] * k; + float rel = k + offset[0]; + float w = Kernel(rel); + + vec3 L = POSTKERNEL_tex(pos).rgb; + avg += w * mat3x3(L, L*L, L2_tex(pos).rgb); + W += w; + } + avg /= W; + + return avg; +} + +vec4 hook() { + vec2 pos = HOOKED_pos; + + float low = ceil(-0.5*taps - offset)[1]; + float high = floor(0.5*taps - offset)[1]; + + float W = 0.0; + mat3x3 avg = mat3x3(0); + + for (float k = low; k <= high; k++) { + pos[1] = HOOKED_pos[1] + HOOKED_pt[1] * k; + float rel = k + offset[1]; + float w = Kernel(rel); + + avg += w * ScaleH(pos); + W += w; + } + avg /= W; + + float Sl = Luma(max(avg[1] - avg[0] * avg[0], 0.)); + float Sh = Luma(max(avg[2] - avg[0] * avg[0], 0.)); + return vec4(avg[0], mix(sqrt((Sh + sigma_nsq) / (Sl + sigma_nsq)) * (1. + oversharp), clamp(Sh / Sl, 0., 1.), int(Sl > Sh))); +} + +//!HOOK POSTKERNEL +//!BIND HOOKED +//!BIND MR +//!WHEN NATIVE_CROPPED.h POSTKERNEL.h > +//!DESC SSimDownscaler final pass + +#define locality 2.0 + +#define offset vec2(0,0) + +#define Kernel(x) pow(1.0 / locality, abs(x)) +#define taps 3.0 + +#define Gamma(x) ( pow(x, vec3(1.0/2.0)) ) +#define GammaInv(x) ( pow(clamp(x, 0.0, 1.0), vec3(2.0)) ) + +mat3x3 ScaleH(vec2 pos) { + float low = ceil(-0.5*taps - offset)[0]; + float high = floor(0.5*taps - offset)[0]; + + float W = 0.0; + mat3x3 avg = mat3x3(0); + + for (float k = low; k <= high; k++) { + pos[0] = HOOKED_pos[0] + HOOKED_pt[0] * k; + float rel = k + offset[0]; + float w = Kernel(rel); + + vec4 MR = MR_tex(pos); + avg += w * mat3x3(MR.a*MR.rgb, MR.rgb, MR.aaa); + W += w; + } + avg /= W; + + return avg; +} + +vec4 hook() { + vec2 pos = HOOKED_pos; + + float low = ceil(-0.5*taps - offset)[1]; + float high = floor(0.5*taps - offset)[1]; + + float W = 0.0; + mat3x3 avg = mat3x3(0); + + for (float k = low; k <= high; k++) { + pos[1] = HOOKED_pos[1] + HOOKED_pt[1] * k; + float rel = k + offset[1]; + float w = Kernel(rel); + + avg += w * ScaleH(pos); + W += w; + } + avg /= W; + vec4 L = POSTKERNEL_texOff(0); + return vec4(avg[1] + avg[2] * L.rgb - avg[0], L.a); +} \ No newline at end of file diff --git a/mpv/shaders/SSimSuperRes.glsl b/mpv/shaders/SSimSuperRes.glsl new file mode 100644 index 0000000..7cf94cf --- /dev/null +++ b/mpv/shaders/SSimSuperRes.glsl @@ -0,0 +1,205 @@ +// Source: https://gist.github.com/igv/2364ffa6e81540f29cb7ab4c9bc05b6b + +// SSimSuperRes by Shiandow +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library. + +//!HOOK POSTKERNEL +//!BIND HOOKED +//!SAVE LOWRES +//!HEIGHT NATIVE_CROPPED.h +//!WHEN NATIVE_CROPPED.h OUTPUT.h < +//!COMPONENTS 4 +//!DESC SSSR Downscaling I + +#define axis 1 + +#define offset vec2(0,0) + +#define MN(B,C,x) (x < 1.0 ? ((2.-1.5*B-(C))*x + (-3.+2.*B+C))*x*x + (1.-(B)/3.) : (((-(B)/6.-(C))*x + (B+5.*C))*x + (-2.*B-8.*C))*x+((4./3.)*B+4.*C)) +#define Kernel(x) MN(0.334, 0.333, abs(x)) +#define taps 2.0 + +#define Luma(rgb) dot(rgb*rgb, vec3(0.2126, 0.7152, 0.0722)) + +vec4 hook() { + float low = ceil((HOOKED_pos - taps/input_size) * HOOKED_size - offset - 0.5)[axis]; + float high = floor((HOOKED_pos + taps/input_size) * HOOKED_size - offset - 0.5)[axis]; + + float W = 0.0; + vec4 avg = vec4(0); + vec2 pos = HOOKED_pos; + vec4 tex; + + for (float k = low; k <= high; k++) { + pos[axis] = HOOKED_pt[axis] * (k - offset[axis] + 0.5); + float rel = (pos[axis] - HOOKED_pos[axis])*input_size[axis]; + float w = Kernel(rel); + + tex.rgb = textureLod(HOOKED_raw, pos, 0.0).rgb * HOOKED_mul; + tex.a = Luma(tex.rgb); + avg += w * tex; + W += w; + } + avg /= W; + + return vec4(avg.rgb, max(abs(avg.a - Luma(avg.rgb)), 5e-7)); +} + +//!HOOK POSTKERNEL +//!BIND LOWRES +//!SAVE LOWRES +//!WIDTH NATIVE_CROPPED.w +//!HEIGHT NATIVE_CROPPED.h +//!WHEN NATIVE_CROPPED.w OUTPUT.w < +//!COMPONENTS 4 +//!DESC SSSR Downscaling II + +#define axis 0 + +#define offset vec2(0,0) + +#define MN(B,C,x) (x < 1.0 ? ((2.-1.5*B-(C))*x + (-3.+2.*B+C))*x*x + (1.-(B)/3.) : (((-(B)/6.-(C))*x + (B+5.*C))*x + (-2.*B-8.*C))*x+((4./3.)*B+4.*C)) +#define Kernel(x) MN(0.334, 0.333, abs(x)) +#define taps 2.0 + +#define Luma(rgb) dot(rgb*rgb, vec3(0.2126, 0.7152, 0.0722)) + +vec4 hook() { + float low = ceil((LOWRES_pos - taps/input_size) * LOWRES_size - offset - 0.5)[axis]; + float high = floor((LOWRES_pos + taps/input_size) * LOWRES_size - offset - 0.5)[axis]; + + float W = 0.0; + vec4 avg = vec4(0); + vec2 pos = LOWRES_pos; + vec4 tex; + + for (float k = low; k <= high; k++) { + pos[axis] = LOWRES_pt[axis] * (k - offset[axis] + 0.5); + float rel = (pos[axis] - LOWRES_pos[axis])*input_size[axis]; + float w = Kernel(rel); + + tex.rgb = textureLod(LOWRES_raw, pos, 0.0).rgb * LOWRES_mul; + tex.a = Luma(tex.rgb); + avg += w * tex; + W += w; + } + avg /= W; + + return vec4(avg.rgb, max(abs(avg.a - Luma(avg.rgb)), 5e-7) + LOWRES_texOff(0).a); +} + +//!HOOK POSTKERNEL +//!BIND PREKERNEL +//!BIND LOWRES +//!SAVE var +//!WIDTH NATIVE_CROPPED.w +//!HEIGHT NATIVE_CROPPED.h +//!WHEN NATIVE_CROPPED.h OUTPUT.h < +//!COMPONENTS 2 +//!DESC SSSR var + +#define spread 1.0 / 4.0 + +#define GetL(x,y) PREKERNEL_tex(PREKERNEL_pt * (PREKERNEL_pos * input_size + tex_offset + vec2(x,y))).rgb +#define GetH(x,y) LOWRES_texOff(vec2(x,y)).rgb + +#define Luma(rgb) dot(rgb*rgb, vec3(0.2126, 0.7152, 0.0722)) +#define diff(x,y) vec2(Luma((GetL(x,y) - meanL)), Luma((GetH(x,y) - meanH))) + +vec4 hook() { + vec3 meanL = GetL(0,0); + vec3 meanH = GetH(0,0); + for (int X=-1; X<=1; X+=2) { + meanL += GetL(X,0) * spread; + meanH += GetH(X,0) * spread; + } + for (int Y=-1; Y<=1; Y+=2) { + meanL += GetL(0,Y) * spread; + meanH += GetH(0,Y) * spread; + } + meanL /= (1.0 + 4.0*spread); + meanH /= (1.0 + 4.0*spread); + + vec2 var = diff(0,0); + for (int X=-1; X<=1; X+=2) + var += diff(X,0) * spread; + + for (int Y=-1; Y<=1; Y+=2) + var += diff(0,Y) * spread; + + return vec4(max(var / (1.0 + 4.0*spread), vec2(1e-6)), 0, 0); +} + +//!HOOK POSTKERNEL +//!BIND HOOKED +//!BIND PREKERNEL +//!BIND LOWRES +//!BIND var +//!WHEN NATIVE_CROPPED.h OUTPUT.h < +//!DESC SSSR final pass + +#define oversharp 0.4 + +// -- Window Size -- +#define taps 3.0 +#define even (taps - 2.0 * floor(taps / 2.0) == 0.0) +#define minX int(1.0-ceil(taps/2.0)) +#define maxX int(floor(taps/2.0)) + +#define Kernel(x) cos(acos(-1.0)*(x)/taps) // Hann kernel + +// -- Input processing -- +#define var(x,y) var_tex(var_pt * (pos + vec2(x,y) + 0.5)).rg +#define GetL(x,y) PREKERNEL_tex(PREKERNEL_pt * (pos + tex_offset + vec2(x,y) + 0.5)).rgb +#define GetH(x,y) LOWRES_tex(LOWRES_pt * (pos + vec2(x,y) + 0.5)) + +#define Luma(rgb) dot(rgb*rgb, vec3(0.2126, 0.7152, 0.0722)) + +vec4 hook() { + vec4 c0 = HOOKED_texOff(0); + + vec2 pos = HOOKED_pos * LOWRES_size - vec2(0.5); + vec2 offset = pos - (even ? floor(pos) : round(pos)); + pos -= offset; + + vec2 mVar = vec2(0.0); + for (int X=-1; X<=1; X++) + for (int Y=-1; Y<=1; Y++) { + vec2 w = clamp(1.5 - abs(vec2(X,Y)), 0.0, 1.0); + mVar += w.r * w.g * vec2(GetH(X,Y).a, 1.0); + } + mVar.r /= mVar.g; + + // Calculate faithfulness force + float weightSum = 0.0; + vec3 diff = vec3(0); + + for (int X = minX; X <= maxX; X++) + for (int Y = minX; Y <= maxX; Y++) + { + float R = (-1.0 - oversharp) * sqrt(var(X,Y).r / (var(X,Y).g + mVar.r)); + + vec2 krnl = Kernel(vec2(X,Y) - offset); + float weight = krnl.r * krnl.g / (Luma((c0.rgb - GetH(X,Y).rgb)) + GetH(X,Y).a); + + diff += weight * (GetL(X,Y) + GetH(X,Y).rgb * R + (-1.0 - R) * (c0.rgb)); + weightSum += weight; + } + diff /= weightSum; + + c0.rgb = ((c0.rgb) + diff); + + return c0; +} \ No newline at end of file diff --git a/mpv/shaders/adaptive-sharpen.glsl b/mpv/shaders/adaptive-sharpen.glsl new file mode 100644 index 0000000..509ab7d --- /dev/null +++ b/mpv/shaders/adaptive-sharpen.glsl @@ -0,0 +1,231 @@ +// Source: https://gist.github.com/igv/8a77e4eb8276753b54bb94c1c50c317e + +// Requires sigmoid-upscaling=no. Best quality setting (according to objective metrics): curve_height 0.5, overshoot_ctrl true. +// To use it on-demand add the following line to input.conf: n change-list glsl-shaders toggle "~~/adaptive-sharpen.glsl" + +// Copyright (c) 2015-2021, bacondither +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer +// in this position and unchanged. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Adaptive sharpen - version 2021-10-17 +// Tuned for use post-resize + +//!HOOK OUTPUT +//!BIND HOOKED +//!DESC adaptive-sharpen + +//--------------------------------------- Settings ------------------------------------------------ + +#define curve_height 1.0 // Main control of sharpening strength [>0] + // 0.3 <-> 2.0 is a reasonable range of values + +#define overshoot_ctrl false // Allow for higher overshoot if the current edge pixel + // is surrounded by similar edge pixels + +// Defined values under this row are "optimal" DO NOT CHANGE IF YOU DO NOT KNOW WHAT YOU ARE DOING! + +#define curveslope 0.5 // Sharpening curve slope, high edge values + +#define L_compr_low 0.167 // Light compression, default (0.167=~6x) +#define L_compr_high 0.334 // Light compression, surrounded by edges (0.334=~3x) + +#define D_compr_low 0.250 // Dark compression, default (0.250=4x) +#define D_compr_high 0.500 // Dark compression, surrounded by edges (0.500=2x) + +#define scale_lim 0.1 // Abs max change before compression [>0.01] +#define scale_cs 0.056 // Compression slope above scale_lim + +#define pm_p 1.0 // Power mean p-value [>0-1.0] +//------------------------------------------------------------------------------------------------- + +#define max4(a,b,c,d) ( max(max(a, b), max(c, d)) ) + +// Soft if, fast linear approx +#define soft_if(a,b,c) ( sat((a + b + c + 0.056/2.5)/(maxedge + 0.03/2.5) - 0.85) ) + +// Soft limit, modified tanh approx +#define soft_lim(v,s) ( sat(abs(v/s)*(27.0 + pow(v/s, 2.0))/(27.0 + 9.0*pow(v/s, 2.0)))*s ) + +// Weighted power mean +#define wpmean(a,b,w) ( pow(w*pow(abs(a), pm_p) + abs(1.0-w)*pow(abs(b), pm_p), (1.0/pm_p)) ) + +// Get destination pixel values +#define get(x,y) ( HOOKED_texOff(vec2(x, y)).rgb ) +#define sat(x) ( clamp(x, 0.0, 1.0) ) +#define dxdy(val) ( length(fwidth(val)) ) // =~1/2.5 hq edge without c_comp + +#define CtL(RGB) ( sat(dot(RGB, vec3(0.2126, 0.7152, 0.0722))) ) + +#define b_diff(pix) ( (blur-c[pix])*(blur-c[pix]) ) + +vec4 hook() { + + // [ c22 ] + // [ c24, c9, c23 ] + // [ c21, c1, c2, c3, c18 ] + // [ c19, c10, c4, c0, c5, c11, c16 ] + // [ c20, c6, c7, c8, c17 ] + // [ c15, c12, c14 ] + // [ c13 ] + vec3 c[25] = vec3[](get( 0, 0), get(-1,-1), get( 0,-1), get( 1,-1), get(-1, 0), + get( 1, 0), get(-1, 1), get( 0, 1), get( 1, 1), get( 0,-2), + get(-2, 0), get( 2, 0), get( 0, 2), get( 0, 3), get( 1, 2), + get(-1, 2), get( 3, 0), get( 2, 1), get( 2,-1), get(-3, 0), + get(-2, 1), get(-2,-1), get( 0,-3), get( 1,-2), get(-1,-2)); + + float e[13] = float[](dxdy(c[0]), dxdy(c[1]), dxdy(c[2]), dxdy(c[3]), dxdy(c[4]), + dxdy(c[5]), dxdy(c[6]), dxdy(c[7]), dxdy(c[8]), dxdy(c[9]), + dxdy(c[10]), dxdy(c[11]), dxdy(c[12])); + + // Blur, gauss 3x3 + vec3 blur = sat((2.0 * (c[2]+c[4]+c[5]+c[7]) + (c[1]+c[3]+c[6]+c[8]) + 4.0 * c[0]) / 16.0); + + // Contrast compression, center = 0.5, scaled to 1/3 + float c_comp = sat(0.266666681f + 0.9*exp2(dot(blur, vec3(-7.4/3.0)))); + + // Edge detection + // Relative matrix weights + // [ 1 ] + // [ 4, 5, 4 ] + // [ 1, 5, 6, 5, 1 ] + // [ 4, 5, 4 ] + // [ 1 ] + float edge = length( 1.38*b_diff(0) + + 1.15*(b_diff(2) + b_diff(4) + b_diff(5) + b_diff(7)) + + 0.92*(b_diff(1) + b_diff(3) + b_diff(6) + b_diff(8)) + + 0.23*(b_diff(9) + b_diff(10) + b_diff(11) + b_diff(12)) ) * c_comp; + + vec2 cs = vec2(L_compr_low, D_compr_low); + + if (overshoot_ctrl) { + float maxedge = max4( max4(e[1],e[2],e[3],e[4]), max4(e[5],e[6],e[7],e[8]), + max4(e[9],e[10],e[11],e[12]), e[0] ); + + // [ x ] + // [ z, x, w ] + // [ z, z, x, w, w ] + // [ y, y, y, 0, y, y, y ] + // [ w, w, x, z, z ] + // [ w, x, z ] + // [ x ] + float sbe = soft_if(e[2],e[9], dxdy(c[22]))*soft_if(e[7],e[12],dxdy(c[13])) // x dir + + soft_if(e[4],e[10],dxdy(c[19]))*soft_if(e[5],e[11],dxdy(c[16])) // y dir + + soft_if(e[1],dxdy(c[24]),dxdy(c[21]))*soft_if(e[8],dxdy(c[14]),dxdy(c[17])) // z dir + + soft_if(e[3],dxdy(c[23]),dxdy(c[18]))*soft_if(e[6],dxdy(c[20]),dxdy(c[15])); // w dir + + cs = mix(cs, vec2(L_compr_high, D_compr_high), sat(2.4002*sbe - 2.282)); + } + + // RGB to luma + float luma[25] = float[](CtL(c[0]), CtL(c[1]), CtL(c[2]), CtL(c[3]), CtL(c[4]), CtL(c[5]), CtL(c[6]), + CtL(c[7]), CtL(c[8]), CtL(c[9]), CtL(c[10]), CtL(c[11]), CtL(c[12]), + CtL(c[13]), CtL(c[14]), CtL(c[15]), CtL(c[16]), CtL(c[17]), CtL(c[18]), + CtL(c[19]), CtL(c[20]), CtL(c[21]), CtL(c[22]), CtL(c[23]), CtL(c[24])); + + float c0_Y = luma[0]; + + // Precalculated default squared kernel weights + const vec3 w1 = vec3(0.5, 1.0, 1.41421356237); // 0.25, 1.0, 2.0 + const vec3 w2 = vec3(0.86602540378, 1.0, 0.54772255751); // 0.75, 1.0, 0.3 + + // Transition to a concave kernel if the center edge val is above thr + vec3 dW = pow(mix( w1, w2, sat(2.4*edge - 0.82)), vec3(2.0)); + + // Use lower weights for pixels in a more active area relative to center pixel area + // This results in narrower and less visible overshoots around sharp edges + float modif_e0 = 3.0 * e[0] + 0.02/2.5; + + float weights[12] = float[](( min(modif_e0/e[1], dW.y) ), + ( dW.x ), + ( min(modif_e0/e[3], dW.y) ), + ( dW.x ), + ( dW.x ), + ( min(modif_e0/e[6], dW.y) ), + ( dW.x ), + ( min(modif_e0/e[8], dW.y) ), + ( min(modif_e0/e[9], dW.z) ), + ( min(modif_e0/e[10], dW.z) ), + ( min(modif_e0/e[11], dW.z) ), + ( min(modif_e0/e[12], dW.z) )); + + weights[0] = (max(max((weights[8] + weights[9])/4.0, weights[0]), 0.25) + weights[0])/2.0; + weights[2] = (max(max((weights[8] + weights[10])/4.0, weights[2]), 0.25) + weights[2])/2.0; + weights[5] = (max(max((weights[9] + weights[11])/4.0, weights[5]), 0.25) + weights[5])/2.0; + weights[7] = (max(max((weights[10] + weights[11])/4.0, weights[7]), 0.25) + weights[7])/2.0; + + // Calculate the negative part of the laplace kernel and the low threshold weight + float lowthrsum = 0.0; + float weightsum = 0.0; + float neg_laplace = 0.0; + + for (int pix = 0; pix < 12; ++pix) + { + float lowthr = sat((20.*4.5*c_comp*e[pix + 1] - 0.221)); + + neg_laplace += luma[pix+1] * luma[pix+1] * weights[pix] * lowthr; + weightsum += weights[pix] * lowthr; + lowthrsum += lowthr / 12.0; + } + + neg_laplace = sqrt(neg_laplace / weightsum); + + // Compute sharpening magnitude function + float sharpen_val = curve_height/(curve_height*curveslope*edge + 0.625); + + // Calculate sharpening diff and scale + float sharpdiff = (c0_Y - neg_laplace)*(lowthrsum*sharpen_val + 0.01); + + // Calculate local near min & max, partial sort + float temp; + + for (int i1 = 0; i1 < 24; i1 += 2) + { + temp = luma[i1]; + luma[i1] = min(luma[i1], luma[i1+1]); + luma[i1+1] = max(temp, luma[i1+1]); + } + + for (int i2 = 24; i2 > 0; i2 -= 2) + { + temp = luma[0]; + luma[0] = min(luma[0], luma[i2]); + luma[i2] = max(temp, luma[i2]); + + temp = luma[24]; + luma[24] = max(luma[24], luma[i2-1]); + luma[i2-1] = min(temp, luma[i2-1]); + } + + float min_dist = min(abs(luma[24] - c0_Y), abs(c0_Y - luma[0])); + min_dist = min(min_dist, scale_lim*(1.0 - scale_cs) + min_dist*scale_cs); + + // Soft limited anti-ringing with tanh, wpmean to control compression slope + sharpdiff = wpmean(max(sharpdiff, 0.0), soft_lim( max(sharpdiff, 0.0), min_dist ), cs.x ) + - wpmean(min(sharpdiff, 0.0), soft_lim( min(sharpdiff, 0.0), min_dist ), cs.y ); + + float sharpdiff_lim = sat(c0_Y + sharpdiff) - c0_Y; + /*float satmul = (c0_Y + max(sharpdiff_lim*0.9, sharpdiff_lim)*0.3 + 0.03)/(c0_Y + 0.03); + vec3 res = c0_Y + sharpdiff_lim + (c[0] - c0_Y)*satmul; + */ + return vec4(sharpdiff_lim + c[0], HOOKED_texOff(0).a); +} \ No newline at end of file diff --git a/mpv/shaders/filmgrain.hook b/mpv/shaders/filmgrain.hook new file mode 100644 index 0000000..2f84ec2 --- /dev/null +++ b/mpv/shaders/filmgrain.hook @@ -0,0 +1,40 @@ +//!HOOK LUMA +//!BIND HOOKED +//!DESC gaussian film grain + +#define INTENSITY 0.05 + +float permute(float x) +{ + x = (34.0 * x + 1.0) * x; + return fract(x * 1.0/289.0) * 289.0; +} + +float rand(inout float state) +{ + state = permute(state); + return fract(state * 1.0/41.0); +} + +vec4 hook() +{ + vec3 m = vec3(HOOKED_pos, random) + vec3(1.0); + float state = permute(permute(m.x) + m.y) + m.z; + + const float a0 = 0.151015505647689; + const float a1 = -0.5303572634357367; + const float a2 = 1.365020122861334; + const float b0 = 0.132089632343748; + const float b1 = -0.7607324991323768; + + float p = 0.95 * rand(state) + 0.025; + float q = p - 0.5; + float r = q * q; + + float grain = q * (a2 + (a1 * r + a0) / (r*r + b1*r + b0)); + grain *= 0.255121822830526; // normalize to [-1,1) + + vec4 color = HOOKED_tex(HOOKED_pos); + color.rgb += vec3(INTENSITY * grain); + return color; +} diff --git a/neovide/.github/README.md b/neovide/.github/README.md new file mode 100644 index 0000000..affa9d5 --- /dev/null +++ b/neovide/.github/README.md @@ -0,0 +1,3 @@ +
+ +
diff --git a/neovide/.github/title.png b/neovide/.github/title.png new file mode 100644 index 0000000..71ddefc Binary files /dev/null and b/neovide/.github/title.png differ diff --git a/neovide/config.toml b/neovide/config.toml new file mode 100644 index 0000000..aac2b9c --- /dev/null +++ b/neovide/config.toml @@ -0,0 +1,7 @@ +vsync = true +maximized = false +srgb = true +idle = false +no-multigrid = true +neovim_bin = "~/.local/share/bob/nvim-bin/nvim" +frame = "full" diff --git a/nvim/.github/README.md b/nvim/.github/README.md new file mode 100644 index 0000000..9a22296 --- /dev/null +++ b/nvim/.github/README.md @@ -0,0 +1,22 @@ +
+ +
+ +
+ +
+ +
+ +
+ + + + + +
+ +
+ +> [!NOTE] +> All the information about the neovim setup is on the documentation website: https://dotfiles-docs.vercel.app/app-confs/neovim.html diff --git a/nvim/.github/assets/actions-preview.png b/nvim/.github/assets/actions-preview.png new file mode 100644 index 0000000..bd4eb7e Binary files /dev/null and b/nvim/.github/assets/actions-preview.png differ diff --git a/nvim/.github/assets/breadcrumbs.png b/nvim/.github/assets/breadcrumbs.png new file mode 100644 index 0000000..e11bccf Binary files /dev/null and b/nvim/.github/assets/breadcrumbs.png differ diff --git a/nvim/.github/assets/bufferline.png b/nvim/.github/assets/bufferline.png new file mode 100644 index 0000000..bb99904 Binary files /dev/null and b/nvim/.github/assets/bufferline.png differ diff --git a/nvim/.github/assets/cmp-2.png b/nvim/.github/assets/cmp-2.png new file mode 100644 index 0000000..7348b50 Binary files /dev/null and b/nvim/.github/assets/cmp-2.png differ diff --git a/nvim/.github/assets/cmp.png b/nvim/.github/assets/cmp.png new file mode 100644 index 0000000..255c88d Binary files /dev/null and b/nvim/.github/assets/cmp.png differ diff --git a/nvim/.github/assets/dashboard.png b/nvim/.github/assets/dashboard.png new file mode 100644 index 0000000..db9011d Binary files /dev/null and b/nvim/.github/assets/dashboard.png differ diff --git a/nvim/.github/assets/diff-history.png b/nvim/.github/assets/diff-history.png new file mode 100644 index 0000000..de6ffd3 Binary files /dev/null and b/nvim/.github/assets/diff-history.png differ diff --git a/nvim/.github/assets/dressing.png b/nvim/.github/assets/dressing.png new file mode 100644 index 0000000..55b71bc Binary files /dev/null and b/nvim/.github/assets/dressing.png differ diff --git a/nvim/.github/assets/find-files.png b/nvim/.github/assets/find-files.png new file mode 100644 index 0000000..a58c5ea Binary files /dev/null and b/nvim/.github/assets/find-files.png differ diff --git a/nvim/.github/assets/floaterm-float.png b/nvim/.github/assets/floaterm-float.png new file mode 100644 index 0000000..0d940b0 Binary files /dev/null and b/nvim/.github/assets/floaterm-float.png differ diff --git a/nvim/.github/assets/live-grep.png b/nvim/.github/assets/live-grep.png new file mode 100644 index 0000000..d3936df Binary files /dev/null and b/nvim/.github/assets/live-grep.png differ diff --git a/nvim/.github/assets/lualine.png b/nvim/.github/assets/lualine.png new file mode 100644 index 0000000..e6370a4 Binary files /dev/null and b/nvim/.github/assets/lualine.png differ diff --git a/nvim/.github/assets/neo-tree.png b/nvim/.github/assets/neo-tree.png new file mode 100644 index 0000000..5fddc3d Binary files /dev/null and b/nvim/.github/assets/neo-tree.png differ diff --git a/nvim/.github/assets/notify-error.png b/nvim/.github/assets/notify-error.png new file mode 100644 index 0000000..a5a034f Binary files /dev/null and b/nvim/.github/assets/notify-error.png differ diff --git a/nvim/.github/assets/notify-info.png b/nvim/.github/assets/notify-info.png new file mode 100644 index 0000000..29db382 Binary files /dev/null and b/nvim/.github/assets/notify-info.png differ diff --git a/nvim/.github/assets/notify-warning.png b/nvim/.github/assets/notify-warning.png new file mode 100644 index 0000000..e93b064 Binary files /dev/null and b/nvim/.github/assets/notify-warning.png differ diff --git a/nvim/.github/assets/outline.png b/nvim/.github/assets/outline.png new file mode 100644 index 0000000..67dde9b Binary files /dev/null and b/nvim/.github/assets/outline.png differ diff --git a/nvim/.github/assets/trouble.png b/nvim/.github/assets/trouble.png new file mode 100644 index 0000000..5c4fec4 Binary files /dev/null and b/nvim/.github/assets/trouble.png differ diff --git a/nvim/.github/assets/which-key.png b/nvim/.github/assets/which-key.png new file mode 100644 index 0000000..2f1e7c7 Binary files /dev/null and b/nvim/.github/assets/which-key.png differ diff --git a/nvim/.github/title.png b/nvim/.github/title.png new file mode 100644 index 0000000..80dd3e0 Binary files /dev/null and b/nvim/.github/title.png differ diff --git a/nvim/.neoconf.json b/nvim/.neoconf.json new file mode 100644 index 0000000..7c48087 --- /dev/null +++ b/nvim/.neoconf.json @@ -0,0 +1,15 @@ +{ + "neodev": { + "library": { + "enabled": true, + "plugins": true + } + }, + "neoconf": { + "plugins": { + "lua_ls": { + "enabled": true + } + } + } +} diff --git a/nvim/after/ftplugin/javascriptreact.lua b/nvim/after/ftplugin/javascriptreact.lua new file mode 100644 index 0000000..458f3e8 --- /dev/null +++ b/nvim/after/ftplugin/javascriptreact.lua @@ -0,0 +1,16 @@ +-- Automatically end a self-closing tag when pressing / +vim.keymap.set("i", "/", function() + local node = vim.treesitter.get_node() + if not node then + return "/" + end + + if node:type() == "jsx_opening_element" then + local char_at_cursor = vim.fn.strcharpart(vim.fn.strpart(vim.fn.getline("."), vim.fn.col(".") - 2), 0, 1) + local already_have_space = char_at_cursor == " " + + return already_have_space and "/>" or " />" + end + + return "/" +end, { expr = true, buffer = true }) diff --git a/nvim/after/ftplugin/json.lua b/nvim/after/ftplugin/json.lua new file mode 100644 index 0000000..80dcf64 --- /dev/null +++ b/nvim/after/ftplugin/json.lua @@ -0,0 +1,11 @@ +-- When creating a new line with o, make sure there is a trailing comma on the current line +vim.keymap.set("n", "o", function() + local line = vim.api.nvim_get_current_line() + + local should_add_comma = string.find(line, "[^,{[]$") + if should_add_comma then + return "A," + else + return "o" + end +end, { buffer = true, expr = true }) diff --git a/nvim/after/ftplugin/jsonc.lua b/nvim/after/ftplugin/jsonc.lua new file mode 100644 index 0000000..80dcf64 --- /dev/null +++ b/nvim/after/ftplugin/jsonc.lua @@ -0,0 +1,11 @@ +-- When creating a new line with o, make sure there is a trailing comma on the current line +vim.keymap.set("n", "o", function() + local line = vim.api.nvim_get_current_line() + + local should_add_comma = string.find(line, "[^,{[]$") + if should_add_comma then + return "A," + else + return "o" + end +end, { buffer = true, expr = true }) diff --git a/nvim/after/ftplugin/markdown.lua b/nvim/after/ftplugin/markdown.lua new file mode 100644 index 0000000..1d70c21 --- /dev/null +++ b/nvim/after/ftplugin/markdown.lua @@ -0,0 +1,11 @@ +vim.keymap.set({ "n", "x" }, "]#", [[/^#\+ .*]], { desc = "Next Heading", buffer = true }) +vim.keymap.set({ "n", "x" }, "[#", [[?^#\+ .*]], { desc = "Prev Heading", buffer = true }) + +-- stylua: ignore start +if LazyVim.has("markdowny.nvim") then + vim.keymap.set("v", "", function() require('markdowny').bold() end, { buffer = 0 }) + vim.keymap.set("v", "", function() require('markdowny').italic() end, { buffer = 0 }) + vim.keymap.set("v", "", function() require('markdowny').link() end, { buffer = 0 }) + vim.keymap.set("v", "", function() require('markdowny').code() end, { buffer = 0 }) +end +-- stylua: ignore end diff --git a/nvim/after/ftplugin/typescriptreact.lua b/nvim/after/ftplugin/typescriptreact.lua new file mode 100644 index 0000000..458f3e8 --- /dev/null +++ b/nvim/after/ftplugin/typescriptreact.lua @@ -0,0 +1,16 @@ +-- Automatically end a self-closing tag when pressing / +vim.keymap.set("i", "/", function() + local node = vim.treesitter.get_node() + if not node then + return "/" + end + + if node:type() == "jsx_opening_element" then + local char_at_cursor = vim.fn.strcharpart(vim.fn.strpart(vim.fn.getline("."), vim.fn.col(".") - 2), 0, 1) + local already_have_space = char_at_cursor == " " + + return already_have_space and "/>" or " />" + end + + return "/" +end, { expr = true, buffer = true }) diff --git a/nvim/dotfyle.json b/nvim/dotfyle.json new file mode 100644 index 0000000..8142ac8 --- /dev/null +++ b/nvim/dotfyle.json @@ -0,0 +1,4948 @@ +{ + "distribution": "custom", + "masonTools": [ + "basedpyright", + "basedpyright-langserver", + "bash-language-server", + "biome", + "codelldb", + "css-variables-language-server", + "cssmodules-language-server", + "debugpy", + "debugpy-adapter", + "deno", + "emmet-language-server", + "gh", + "htmlhint", + "jq", + "js-debug-adapter", + "lua-language-server", + "markdownlint", + "marksman", + "markuplint", + "prettier", + "prettierd", + "ruff", + "rust-analyzer", + "shellcheck", + "shfmt", + "stylelint", + "stylua", + "tailwindcss-language-server", + "taplo", + "typescript-language-server", + "vscode-css-language-server", + "vscode-eslint-language-server", + "vscode-html-language-server", + "vscode-json-language-server", + "vue-language-server", + "yaml-language-server" + ], + "plugins": [ + "Diogo-ss/five-server.nvim", + "Exafunction/codeium.vim", + "HiPhish/rainbow-delimiters.nvim", + "JoosepAlviste/nvim-ts-context-commentstring", + "L3MON4D3/LuaSnip", + "LazyVim/LazyVim", + "LunarVim/bigfile.nvim", + "MeanderingProgrammer/py-requirements.nvim", + "MunifTanjim/nui.nvim", + "RRethy/nvim-treesitter-endwise", + "RRethy/vim-illuminate", + "Saecki/crates.nvim", + "ThePrimeagen/refactoring.nvim", + "VidocqH/lsp-lens.nvim", + "Weissle/persistent-breakpoints.nvim", + "Zeioth/compiler.nvim", + "Zeioth/dooku.nvim", + "akinsho/bufferline.nvim", + "antosha417/nvim-lsp-file-operations", + "aznhe21/actions-preview.nvim", + "b0o/SchemaStore.nvim", + "catppuccin/nvim", + "cbochs/grapple.nvim", + "chrisgrieser/nvim-puppeteer", + "chrisgrieser/nvim-recorder", + "chrisgrieser/nvim-various-textobjs", + "ckolkey/ts-node-action", + "creativenull/dotfyle-metadata.nvim", + "danymat/neogen", + "dawsers/telescope-floaterm.nvim", + "debugloop/telescope-undo.nvim", + "declancm/cinnamon.nvim", + "dmmulroy/ts-error-translator.nvim", + "dmmulroy/tsc.nvim", + "dnlhc/glance.nvim", + "dstein64/vim-startuptime", + "echasnovski/mini.ai", + "echasnovski/mini.bufremove", + "echasnovski/mini.comment", + "echasnovski/mini.indentscope", + "echasnovski/mini.move", + "echasnovski/mini.pairs", + "echasnovski/mini.surround", + "epwalsh/obsidian.nvim", + "folke/edgy.nvim", + "folke/flash.nvim", + "folke/lazy.nvim", + "folke/neoconf.nvim", + "folke/neodev.nvim", + "folke/noice.nvim", + "folke/persistence.nvim", + "folke/todo-comments.nvim", + "folke/tokyonight.nvim", + "folke/trouble.nvim", + "folke/which-key.nvim", + "gaoDean/autolist.nvim", + "gbprod/yanky.nvim", + "gennaro-tedesco/nvim-jqx", + "haringsrob/nvim_context_vt", + "hrsh7th/cmp-buffer", + "hrsh7th/cmp-nvim-lsp", + "hrsh7th/cmp-path", + "hrsh7th/nvim-cmp", + "iamcco/markdown-preview.nvim", + "jay-babu/mason-nvim-dap.nvim", + "jellydn/gen.nvim", + "jvgrootveld/telescope-zoxide", + "kkharji/sqlite.lua", + "lambdalisue/suda.vim", + "lewis6991/gitsigns.nvim", + "linux-cultist/venv-selector.nvim", + "luckasRanarison/nvim-devdocs", + "lukas-reineke/headlines.nvim", + "lukas-reineke/indent-blankline.nvim", + "mfussenegger/nvim-dap", + "mfussenegger/nvim-dap-python", + "mfussenegger/nvim-lint", + "mikesmithgh/kitty-scrollback.nvim", + "mistricky/codesnap.nvim", + "monaqa/dial.nvim", + "mrcjkb/rustaceanvim", + "mrjones2014/smart-splits.nvim", + "neovim/nvim-lspconfig", + "nvim-lua/plenary.nvim", + "nvim-lualine/lualine.nvim", + "nvim-neo-tree/neo-tree.nvim", + "nvim-neotest/neotest-python", + "nvim-neotest/nvim-nio", + "nvim-pack/nvim-spectre", + "nvim-telescope/telescope-fzf-native.nvim", + "nvim-telescope/telescope.nvim", + "nvim-tree/nvim-web-devicons", + "nvim-treesitter/nvim-treesitter", + "nvim-treesitter/nvim-treesitter-context", + "nvim-treesitter/nvim-treesitter-textobjects", + "nvimdev/dashboard-nvim", + "rafamadriz/friendly-snippets", + "rcarriga/nvim-dap-ui", + "rcarriga/nvim-notify", + "roobert/search-replace.nvim", + "saadparwaiz1/cmp_luasnip", + "sindrets/diffview.nvim", + "smoka7/hydra.nvim", + "smoka7/multicursors.nvim", + "someone-stole-my-name/yaml-companion.nvim", + "stevearc/conform.nvim", + "stevearc/dressing.nvim", + "stevearc/overseer.nvim", + "theHamsta/nvim-dap-virtual-text", + "tsakirist/telescope-lazy.nvim", + "uga-rosa/ccc.nvim", + "voldikss/vim-floaterm", + "vuki656/package-info.nvim", + "wakatime/vim-wakatime", + "williamboman/mason-lspconfig.nvim", + "williamboman/mason.nvim", + "windwp/nvim-ts-autotag", + "zapling/mason-lock.nvim", + "zeioth/garbage-day.nvim", + "ziontee113/icon-picker.nvim" + ], + "keymaps": [ + { + "desc": "Next Tab", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "tabnext" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Escape and Clear hlsearch", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "noh" + }, + { + "desc": "", + "noremap": true, + "lhs": "lÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "l", + "mode": "n", + "rhs": "lua require(\"which-key\").show(\" l\", {mode = \"n\", auto = true})" + }, + { + "desc": "", + "noremap": true, + "lhs": "Þ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "lua require(\"which-key\").show(\" \", {mode = \"n\", auto = true})" + }, + { + "desc": "Toggle Lsp Lens", + "noremap": true, + "lhs": "ue", + "mode": "n", + "rhs": "LspLensToggle" + }, + { + "desc": "Code Action Preview", + "noremap": true, + "lhs": "ca", + "mode": "v", + "rhs": "" + }, + { + "desc": "Code Action Preview", + "noremap": true, + "lhs": "ca", + "mode": "n", + "rhs": "" + }, + { + "desc": "Format Injected Langs", + "noremap": true, + "lhs": "cF", + "mode": "v", + "rhs": "" + }, + { + "desc": "Format Injected Langs", + "noremap": true, + "lhs": "cF", + "mode": "n", + "rhs": "" + }, + { + "desc": "Trait", + "noremap": true, + "lhs": "sst", + "mode": "n", + "rhs": "" + }, + { + "desc": "Struct", + "noremap": true, + "lhs": "sss", + "mode": "n", + "rhs": "" + }, + { + "desc": "Module", + "noremap": true, + "lhs": "ssM", + "mode": "n", + "rhs": "" + }, + { + "desc": "Interface", + "noremap": true, + "lhs": "ssi", + "mode": "n", + "rhs": "" + }, + { + "desc": "Enum", + "noremap": true, + "lhs": "sse", + "mode": "n", + "rhs": "" + }, + { + "desc": "Constructor", + "noremap": true, + "lhs": "ssC", + "mode": "n", + "rhs": "" + }, + { + "desc": "Method", + "noremap": true, + "lhs": "ssm", + "mode": "n", + "rhs": "" + }, + { + "desc": "Function", + "noremap": true, + "lhs": "ssf", + "mode": "n", + "rhs": "" + }, + { + "desc": "Class", + "noremap": true, + "lhs": "ssc", + "mode": "n", + "rhs": "" + }, + { + "desc": "All", + "noremap": true, + "lhs": "ssa", + "mode": "n", + "rhs": "" + }, + { + "desc": "Goto Symbol (Workspace)", + "noremap": true, + "lhs": "sS", + "mode": "n", + "rhs": "" + }, + { + "desc": "Goto Symbol", + "noremap": true, + "lhs": "ss", + "mode": "n", + "rhs": "" + }, + { + "desc": "Colorscheme with Preview", + "noremap": true, + "lhs": "uC", + "mode": "n", + "rhs": "" + }, + { + "desc": "Selection (cwd)", + "noremap": true, + "lhs": "sW", + "mode": "v", + "rhs": "" + }, + { + "desc": "Selection (Root Dir)", + "noremap": true, + "lhs": "sw", + "mode": "v", + "rhs": "" + }, + { + "desc": "Word (cwd)", + "noremap": true, + "lhs": "sW", + "mode": "n", + "rhs": "" + }, + { + "desc": "Word (Root Dir)", + "noremap": true, + "lhs": "sw", + "mode": "n", + "rhs": "" + }, + { + "desc": "Resume", + "noremap": true, + "lhs": "sR", + "mode": "n", + "rhs": "Telescope resume" + }, + { + "desc": "Options", + "noremap": true, + "lhs": "so", + "mode": "n", + "rhs": "Telescope vim_options" + }, + { + "desc": "Jump to Mark", + "noremap": true, + "lhs": "sm", + "mode": "n", + "rhs": "Telescope marks" + }, + { + "desc": "Man Pages", + "noremap": true, + "lhs": "sM", + "mode": "n", + "rhs": "Telescope man_pages" + }, + { + "desc": "Key Maps", + "noremap": true, + "lhs": "sk", + "mode": "n", + "rhs": "Telescope keymaps" + }, + { + "desc": "Search Highlight Groups", + "noremap": true, + "lhs": "sH", + "mode": "n", + "rhs": "Telescope highlights" + }, + { + "desc": "Help Pages", + "noremap": true, + "lhs": "sh", + "mode": "n", + "rhs": "Telescope help_tags" + }, + { + "desc": "Grep (cwd)", + "noremap": true, + "lhs": "sG", + "mode": "n", + "rhs": "" + }, + { + "desc": "Grep (Root Dir)", + "noremap": true, + "lhs": "sg", + "mode": "n", + "rhs": "" + }, + { + "desc": "Workspace Diagnostics", + "noremap": true, + "lhs": "sD", + "mode": "n", + "rhs": "Telescope diagnostics" + }, + { + "desc": "Document Diagnostics", + "noremap": true, + "lhs": "sd", + "mode": "n", + "rhs": "Telescope diagnostics bufnr=0" + }, + { + "desc": "Commands", + "noremap": true, + "lhs": "sC", + "mode": "n", + "rhs": "Telescope commands" + }, + { + "desc": "Command History", + "noremap": true, + "lhs": "sc", + "mode": "n", + "rhs": "Telescope command_history" + }, + { + "desc": "Buffer", + "noremap": true, + "lhs": "sb", + "mode": "n", + "rhs": "Telescope current_buffer_fuzzy_find" + }, + { + "desc": "Auto Commands", + "noremap": true, + "lhs": "sa", + "mode": "n", + "rhs": "Telescope autocommands" + }, + { + "desc": "Registers", + "noremap": true, + "lhs": "s\"", + "mode": "n", + "rhs": "Telescope registers" + }, + { + "desc": "Status", + "noremap": true, + "lhs": "gs", + "mode": "n", + "rhs": "Telescope git_status" + }, + { + "desc": "Commits", + "noremap": true, + "lhs": "gc", + "mode": "n", + "rhs": "Telescope git_commits" + }, + { + "desc": "Recent (cwd)", + "noremap": true, + "lhs": "fR", + "mode": "n", + "rhs": "" + }, + { + "desc": "Recent", + "noremap": true, + "lhs": "fr", + "mode": "n", + "rhs": "Telescope oldfiles" + }, + { + "desc": "Find Files (git-files)", + "noremap": true, + "lhs": "fg", + "mode": "n", + "rhs": "Telescope git_files" + }, + { + "desc": "Find Files (cwd)", + "noremap": true, + "lhs": "fF", + "mode": "n", + "rhs": "" + }, + { + "desc": "Find Files (Root Dir)", + "noremap": true, + "lhs": "ff", + "mode": "n", + "rhs": "" + }, + { + "desc": "Find Config File", + "noremap": true, + "lhs": "fc", + "mode": "n", + "rhs": "" + }, + { + "desc": "Buffers", + "noremap": true, + "lhs": "fb", + "mode": "n", + "rhs": "Telescope buffers sort_mru=true sort_lastused=true" + }, + { + "desc": "Command History", + "noremap": true, + "lhs": ":", + "mode": "n", + "rhs": "Telescope command_history" + }, + { + "desc": "Constructor", + "noremap": true, + "lhs": "sSC", + "mode": "n", + "rhs": "" + }, + { + "desc": "Grep (Root Dir)", + "noremap": true, + "lhs": "/", + "mode": "n", + "rhs": "" + }, + { + "desc": "Switch Buffer", + "noremap": true, + "lhs": ",", + "mode": "n", + "rhs": "Telescope buffers sort_mru=true sort_lastused=true" + }, + { + "desc": "Spelling", + "noremap": true, + "lhs": "S", + "mode": "n", + "rhs": "Telescope spell_suggest" + }, + { + "desc": "Branches", + "noremap": true, + "lhs": "gb", + "mode": "n", + "rhs": "Telescope git_branches" + }, + { + "desc": "Stash", + "noremap": true, + "lhs": "gS", + "mode": "n", + "rhs": "Telescope git_stash" + }, + { + "desc": "File History", + "noremap": true, + "lhs": "gf", + "mode": "n", + "rhs": "Telescope git_bcommits" + }, + { + "desc": "Find Files (hidden)", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Find Files (hidden)", + "noremap": true, + "lhs": "fh", + "mode": "n", + "rhs": "" + }, + { + "desc": "Pickers (Telescope)", + "noremap": true, + "lhs": "sp", + "mode": "n", + "rhs": "Telescope builtin" + }, + { + "desc": "Treesitter Symbols", + "noremap": true, + "lhs": "sA", + "mode": "n", + "rhs": "" + }, + { + "desc": "Variable", + "noremap": true, + "lhs": "sSv", + "mode": "n", + "rhs": "" + }, + { + "desc": "Property", + "noremap": true, + "lhs": "sSp", + "mode": "n", + "rhs": "" + }, + { + "desc": "Field", + "noremap": true, + "lhs": "sSF", + "mode": "n", + "rhs": "" + }, + { + "desc": "Trait", + "noremap": true, + "lhs": "sSt", + "mode": "n", + "rhs": "" + }, + { + "desc": "Struct", + "noremap": true, + "lhs": "sSs", + "mode": "n", + "rhs": "" + }, + { + "desc": "Module", + "noremap": true, + "lhs": "sSM", + "mode": "n", + "rhs": "" + }, + { + "desc": "Interface", + "noremap": true, + "lhs": "sSi", + "mode": "n", + "rhs": "" + }, + { + "desc": "Enum", + "noremap": true, + "lhs": "sSe", + "mode": "n", + "rhs": "" + }, + { + "desc": "Find Files (Root Dir)", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Method", + "noremap": true, + "lhs": "sSm", + "mode": "n", + "rhs": "" + }, + { + "desc": "Function", + "noremap": true, + "lhs": "sSf", + "mode": "n", + "rhs": "" + }, + { + "desc": "Class", + "noremap": true, + "lhs": "sSc", + "mode": "n", + "rhs": "" + }, + { + "desc": "All", + "noremap": true, + "lhs": "sSa", + "mode": "n", + "rhs": "" + }, + { + "desc": "Variable", + "noremap": true, + "lhs": "ssv", + "mode": "n", + "rhs": "" + }, + { + "desc": "Property", + "noremap": true, + "lhs": "ssp", + "mode": "n", + "rhs": "" + }, + { + "desc": "Field", + "noremap": true, + "lhs": "ssF", + "mode": "n", + "rhs": "" + }, + { + "desc": "YAML Schema", + "noremap": true, + "lhs": "cy", + "mode": "n", + "rhs": "Telescope yaml_schema" + }, + { + "desc": "Toggle Treesitter Context", + "noremap": true, + "lhs": "ut", + "mode": "n", + "rhs": "" + }, + { + "desc": "Dap UI", + "noremap": true, + "lhs": "du", + "mode": "n", + "rhs": "" + }, + { + "desc": "Eval", + "noremap": true, + "lhs": "de", + "mode": "v", + "rhs": "" + }, + { + "desc": "Eval", + "noremap": true, + "lhs": "de", + "mode": "n", + "rhs": "" + }, + { + "desc": "Step Over", + "noremap": true, + "lhs": "dO", + "mode": "n", + "rhs": "" + }, + { + "desc": "Step Out", + "noremap": true, + "lhs": "do", + "mode": "n", + "rhs": "" + }, + { + "desc": "Run Last", + "noremap": true, + "lhs": "dl", + "mode": "n", + "rhs": "" + }, + { + "desc": "Up", + "noremap": true, + "lhs": "dk", + "mode": "n", + "rhs": "" + }, + { + "desc": "Down", + "noremap": true, + "lhs": "dj", + "mode": "n", + "rhs": "" + }, + { + "desc": "Step Into", + "noremap": true, + "lhs": "di", + "mode": "n", + "rhs": "" + }, + { + "desc": "Go to Line (No Execute)", + "noremap": true, + "lhs": "dg", + "mode": "n", + "rhs": "" + }, + { + "desc": "Run to Cursor", + "noremap": true, + "lhs": "dC", + "mode": "n", + "rhs": "" + }, + { + "desc": "Run with Args", + "noremap": true, + "lhs": "da", + "mode": "n", + "rhs": "" + }, + { + "desc": "Continue", + "noremap": true, + "lhs": "dc", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Breakpoint", + "noremap": true, + "lhs": "db", + "mode": "n", + "rhs": "" + }, + { + "desc": "Widgets", + "noremap": true, + "lhs": "dw", + "mode": "n", + "rhs": "" + }, + { + "desc": "Terminate", + "noremap": true, + "lhs": "dt", + "mode": "n", + "rhs": "" + }, + { + "desc": "Session", + "noremap": true, + "lhs": "ds", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle REPL", + "noremap": true, + "lhs": "dr", + "mode": "n", + "rhs": "" + }, + { + "desc": "Pause", + "noremap": true, + "lhs": "dp", + "mode": "n", + "rhs": "" + }, + { + "desc": "Breakpoint Condition", + "noremap": true, + "lhs": "dbB", + "mode": "n", + "rhs": "PBSetConditionalBreakpoint" + }, + { + "desc": "Delete All Breakpoints", + "noremap": true, + "lhs": "dbd", + "mode": "n", + "rhs": "PBClearAllBreakpoints" + }, + { + "desc": "Toggle Breakpoint", + "noremap": true, + "lhs": "dbb", + "mode": "n", + "rhs": "PBToggleBreakpoint" + }, + { + "desc": "Todo/Fix/Fixme (Trouble)", + "noremap": true, + "lhs": "xT", + "mode": "n", + "rhs": "TodoTrouble keywords=TODO,FIX,FIXME" + }, + { + "desc": "Todo (Trouble)", + "noremap": true, + "lhs": "xt", + "mode": "n", + "rhs": "TodoTrouble" + }, + { + "desc": "Todo", + "noremap": true, + "lhs": "st", + "mode": "n", + "rhs": "TodoTelescope" + }, + { + "desc": "Todo/Fix/Fixme", + "noremap": true, + "lhs": "sT", + "mode": "n", + "rhs": "TodoTelescope keywords=TODO,FIX,FIXME" + }, + { + "desc": "Toggle Context", + "noremap": true, + "lhs": "ux", + "mode": "n", + "rhs": "NvimContextVtToggle" + }, + { + "desc": "Deletions Inline", + "noremap": true, + "lhs": "ghe", + "mode": "n", + "rhs": "Gitsigns toggle_deleted" + }, + { + "desc": "Toggle Line Blame", + "noremap": true, + "lhs": "uB", + "mode": "n", + "rhs": "Gitsigns toggle_current_line_blame" + }, + { + "desc": "Toggle Current Session Recording", + "noremap": true, + "lhs": "qt", + "mode": "n", + "rhs": "" + }, + { + "desc": "Save Session", + "noremap": true, + "lhs": "qS", + "mode": "n", + "rhs": "" + }, + { + "desc": "Don't Save Current Session", + "noremap": true, + "lhs": "qd", + "mode": "n", + "rhs": "" + }, + { + "desc": "Restore Last Session", + "noremap": true, + "lhs": "ql", + "mode": "n", + "rhs": "" + }, + { + "desc": "Restore Session", + "noremap": true, + "lhs": "qs", + "mode": "n", + "rhs": "" + }, + { + "desc": "Mason", + "noremap": true, + "lhs": "cim", + "mode": "n", + "rhs": "Mason" + }, + { + "desc": "Blame Line (LazyGit)", + "noremap": true, + "lhs": "ghB", + "mode": "n", + "rhs": "" + }, + { + "desc": "Remove Word from Dictionary", + "noremap": true, + "lhs": "@", + "mode": "n", + "rhs": "zug" + }, + { + "desc": "Add Word to Dictionary", + "noremap": true, + "lhs": "!", + "mode": "n", + "rhs": "zg" + }, + { + "desc": "Dashboard", + "noremap": true, + "lhs": "fd", + "mode": "n", + "rhs": "" + }, + { + "desc": "Root", + "noremap": true, + "lhs": "cir", + "mode": "n", + "rhs": "LazyRoot" + }, + { + "desc": "Lint", + "noremap": true, + "lhs": "ciL", + "mode": "n", + "rhs": "" + }, + { + "desc": "Conform", + "noremap": true, + "lhs": "cic", + "mode": "n", + "rhs": "ConformInfo" + }, + { + "desc": "Formatting", + "noremap": true, + "lhs": "cif", + "mode": "n", + "rhs": "LazyFormatInfo" + }, + { + "desc": "Toggle Tabline", + "noremap": true, + "lhs": "u", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Statusline", + "noremap": true, + "lhs": "uS", + "mode": "n", + "rhs": "" + }, + { + "desc": "Current Buffer in New Tab", + "noremap": true, + "lhs": "b", + "mode": "n", + "rhs": "tabnew %" + }, + { + "desc": "Last Buffer", + "noremap": true, + "lhs": "ba", + "mode": "n", + "rhs": "blast" + }, + { + "desc": "First Buffer", + "noremap": true, + "lhs": "bf", + "mode": "n", + "rhs": "bfirst" + }, + { + "desc": "Tabs", + "noremap": true, + "lhs": "f", + "mode": "n", + "rhs": "" + }, + { + "desc": "Tab 9", + "noremap": true, + "lhs": "9", + "mode": "n", + "rhs": "tabn 9" + }, + { + "desc": "Tab 8", + "noremap": true, + "lhs": "8", + "mode": "n", + "rhs": "tabn 8" + }, + { + "desc": "Tab 7", + "noremap": true, + "lhs": "7", + "mode": "n", + "rhs": "tabn 7" + }, + { + "desc": "Tab 6", + "noremap": true, + "lhs": "6", + "mode": "n", + "rhs": "tabn 6" + }, + { + "desc": "Tab 5", + "noremap": true, + "lhs": "5", + "mode": "n", + "rhs": "tabn 5" + }, + { + "desc": "Tab 4", + "noremap": true, + "lhs": "4", + "mode": "n", + "rhs": "tabn 4" + }, + { + "desc": "Tab 3", + "noremap": true, + "lhs": "3", + "mode": "n", + "rhs": "tabn 3" + }, + { + "desc": "Tab 2", + "noremap": true, + "lhs": "2", + "mode": "n", + "rhs": "tabn 2" + }, + { + "desc": "Tab 1", + "noremap": true, + "lhs": "1", + "mode": "n", + "rhs": "tabn 1" + }, + { + "desc": "Lazy Sync", + "noremap": true, + "lhs": "ls", + "mode": "n", + "rhs": "" + }, + { + "desc": "Lazy Check", + "noremap": true, + "lhs": "lC", + "mode": "n", + "rhs": "" + }, + { + "desc": "Lazy Update", + "noremap": true, + "lhs": "lu", + "mode": "n", + "rhs": "" + }, + { + "desc": "LazyVim Changelog", + "noremap": true, + "lhs": "lc", + "mode": "n", + "rhs": "" + }, + { + "desc": "Extras", + "noremap": true, + "lhs": "lx", + "mode": "n", + "rhs": "LazyExtras" + }, + { + "desc": "LazyVim Repo", + "noremap": true, + "lhs": "lr", + "mode": "n", + "rhs": "" + }, + { + "desc": "LazyVim Docs", + "noremap": true, + "lhs": "ld", + "mode": "n", + "rhs": "" + }, + { + "desc": "Lazy", + "noremap": true, + "lhs": "ll", + "mode": "n", + "rhs": "Lazy" + }, + { + "desc": "Search Current Word on Brave Search", + "noremap": true, + "lhs": "?", + "mode": "n", + "rhs": "" + }, + { + "desc": "Previous Tab", + "noremap": true, + "lhs": "[", + "mode": "n", + "rhs": "tabprevious" + }, + { + "desc": "Close Tab", + "noremap": true, + "lhs": "d", + "mode": "n", + "rhs": "tabclose" + }, + { + "desc": "Next Tab", + "noremap": true, + "lhs": "]", + "mode": "n", + "rhs": "tabnext" + }, + { + "desc": "New Tab", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "tabnew" + }, + { + "desc": "First Tab", + "noremap": true, + "lhs": "f", + "mode": "n", + "rhs": "tabfirst" + }, + { + "desc": "Last Tab", + "noremap": true, + "lhs": "l", + "mode": "n", + "rhs": "tablast" + }, + { + "desc": "Split Window Right", + "noremap": true, + "lhs": "|", + "mode": "n", + "rhs": "v" + }, + { + "desc": "Split Window Below", + "noremap": true, + "lhs": "-", + "mode": "n", + "rhs": "s" + }, + { + "desc": "Split Window Right", + "noremap": true, + "lhs": "w|", + "mode": "n", + "rhs": "v" + }, + { + "desc": "Split Window Below", + "noremap": true, + "lhs": "w-", + "mode": "n", + "rhs": "s" + }, + { + "desc": "Delete Window", + "noremap": true, + "lhs": "wd", + "mode": "n", + "rhs": "c" + }, + { + "desc": "Other Window", + "noremap": true, + "lhs": "ww", + "mode": "n", + "rhs": "p" + }, + { + "desc": "", + "noremap": true, + "lhs": "fT", + "mode": "n", + "rhs": "" + }, + { + "desc": "Terminal (Root Dir)", + "noremap": true, + "lhs": "ft", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "L", + "mode": "n", + "rhs": "" + }, + { + "desc": "Inspect Pos", + "noremap": true, + "lhs": "ui", + "mode": "n", + "rhs": "" + }, + { + "desc": "Quit All", + "noremap": true, + "lhs": "qq", + "mode": "n", + "rhs": "qa" + }, + { + "desc": "Toggle Background", + "noremap": true, + "lhs": "ub", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Treesitter Highlight", + "noremap": true, + "lhs": "uT", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Inlay Hints", + "noremap": true, + "lhs": "uh", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Conceal", + "noremap": true, + "lhs": "uc", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Diagnostics", + "noremap": true, + "lhs": "ud", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Line Numbers", + "noremap": true, + "lhs": "ul", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Relative Line Numbers", + "noremap": true, + "lhs": "uL", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Word Wrap", + "noremap": true, + "lhs": "uw", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Spelling", + "noremap": true, + "lhs": "us", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Auto Format (Buffer)", + "noremap": true, + "lhs": "uF", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Auto Format (Global)", + "noremap": true, + "lhs": "uf", + "mode": "n", + "rhs": "" + }, + { + "desc": "Line Diagnostics", + "noremap": true, + "lhs": "cd", + "mode": "n", + "rhs": "" + }, + { + "desc": "Format", + "noremap": true, + "lhs": "cf", + "mode": "v", + "rhs": "" + }, + { + "desc": "Format", + "noremap": true, + "lhs": "cf", + "mode": "n", + "rhs": "" + }, + { + "desc": "Quickfix List", + "noremap": true, + "lhs": "xq", + "mode": "n", + "rhs": "copen" + }, + { + "desc": "Location List", + "noremap": true, + "lhs": "xl", + "mode": "n", + "rhs": "lopen" + }, + { + "desc": "New File", + "noremap": true, + "lhs": "fn", + "mode": "n", + "rhs": "enew" + }, + { + "desc": "Keywordprg", + "noremap": true, + "lhs": "K", + "mode": "n", + "rhs": "norm! K" + }, + { + "desc": "Redraw / Clear hlsearch / Diff Update", + "noremap": true, + "lhs": "ur", + "mode": "n", + "rhs": "nohlsearch|diffupdate|normal! " + }, + { + "desc": "Switch to Other Buffer", + "noremap": true, + "lhs": "`", + "mode": "n", + "rhs": "e #" + }, + { + "desc": "Switch to Other Buffer", + "noremap": true, + "lhs": "bb", + "mode": "n", + "rhs": "e #" + }, + { + "desc": "Jump With Current Word", + "noremap": true, + "lhs": "*", + "mode": "n", + "rhs": "" + }, + { + "desc": "Quickfix List (Trouble)", + "noremap": true, + "lhs": "xQ", + "mode": "n", + "rhs": "Trouble qflist toggle" + }, + { + "desc": "Location List (Trouble)", + "noremap": true, + "lhs": "xL", + "mode": "n", + "rhs": "Trouble loclist toggle" + }, + { + "desc": "Buffer Diagnostics (Trouble)", + "noremap": true, + "lhs": "xX", + "mode": "n", + "rhs": "Trouble diagnostics toggle filter.buf=0" + }, + { + "desc": "Diagnostics (Trouble)", + "noremap": true, + "lhs": "xx", + "mode": "n", + "rhs": "Trouble diagnostics toggle" + }, + { + "desc": "Symbols (Trouble)", + "noremap": true, + "lhs": "cs", + "mode": "n", + "rhs": "Trouble symbols toggle focus=false" + }, + { + "desc": "LSP references/definitions/... (Trouble)", + "noremap": true, + "lhs": "cS", + "mode": "n", + "rhs": "Trouble lsp toggle focus=false win.position=right" + }, + { + "desc": "File 2", + "noremap": true, + "lhs": "m2", + "mode": "n", + "rhs": "Grapple select index=2" + }, + { + "desc": "File 1", + "noremap": true, + "lhs": "m1", + "mode": "n", + "rhs": "Grapple select index=1" + }, + { + "desc": "Loaded Scopes", + "noremap": true, + "lhs": "mS", + "mode": "n", + "rhs": "Grapple toggle_loaded" + }, + { + "desc": "Scopes", + "noremap": true, + "lhs": "ms", + "mode": "n", + "rhs": "Grapple toggle_scopes" + }, + { + "desc": "Clear Current Mark", + "noremap": true, + "lhs": "mc", + "mode": "n", + "rhs": "Grapple untag" + }, + { + "desc": "Clear all Marks", + "noremap": true, + "lhs": "mC", + "mode": "n", + "rhs": "Grapple reset" + }, + { + "desc": "Marks (Telescope)", + "noremap": true, + "lhs": "mt", + "mode": "n", + "rhs": "Telescope grapple tags" + }, + { + "desc": "Marks", + "noremap": true, + "lhs": "mm", + "mode": "n", + "rhs": "Grapple toggle_tags" + }, + { + "desc": "Add Mark", + "noremap": true, + "lhs": "ma", + "mode": "n", + "rhs": "Grapple tag" + }, + { + "desc": "File 9", + "noremap": true, + "lhs": "m9", + "mode": "n", + "rhs": "Grapple select index=9" + }, + { + "desc": "File 8", + "noremap": true, + "lhs": "m8", + "mode": "n", + "rhs": "Grapple select index=8" + }, + { + "desc": "File 7", + "noremap": true, + "lhs": "m7", + "mode": "n", + "rhs": "Grapple select index=7" + }, + { + "desc": "File 6", + "noremap": true, + "lhs": "m6", + "mode": "n", + "rhs": "Grapple select index=6" + }, + { + "desc": "File 5", + "noremap": true, + "lhs": "m5", + "mode": "n", + "rhs": "Grapple select index=5" + }, + { + "desc": "File 4", + "noremap": true, + "lhs": "m4", + "mode": "n", + "rhs": "Grapple select index=4" + }, + { + "desc": "File 3", + "noremap": true, + "lhs": "m3", + "mode": "n", + "rhs": "Grapple select index=3" + }, + { + "desc": "Dismiss All", + "noremap": true, + "lhs": "snd", + "mode": "n", + "rhs": "" + }, + { + "desc": "Noice All", + "noremap": true, + "lhs": "sna", + "mode": "n", + "rhs": "" + }, + { + "desc": "Noice History", + "noremap": true, + "lhs": "snh", + "mode": "n", + "rhs": "" + }, + { + "desc": "Noice Last Message", + "noremap": true, + "lhs": "snl", + "mode": "n", + "rhs": "" + }, + { + "desc": "Edgy Select Window", + "noremap": true, + "lhs": "uE", + "mode": "n", + "rhs": "" + }, + { + "desc": "Buffer 8", + "noremap": true, + "lhs": "b8", + "mode": "n", + "rhs": "BufferLineGoToBuffer 8" + }, + { + "desc": "Buffer 7", + "noremap": true, + "lhs": "b7", + "mode": "n", + "rhs": "BufferLineGoToBuffer 7" + }, + { + "desc": "Buffer 6", + "noremap": true, + "lhs": "b6", + "mode": "n", + "rhs": "BufferLineGoToBuffer 6" + }, + { + "desc": "Buffer 5", + "noremap": true, + "lhs": "b5", + "mode": "n", + "rhs": "BufferLineGoToBuffer 5" + }, + { + "desc": "Buffer 4", + "noremap": true, + "lhs": "b4", + "mode": "n", + "rhs": "BufferLineGoToBuffer 4" + }, + { + "desc": "Buffer 3", + "noremap": true, + "lhs": "b3", + "mode": "n", + "rhs": "BufferLineGoToBuffer 3" + }, + { + "desc": "Buffer 2", + "noremap": true, + "lhs": "b2", + "mode": "n", + "rhs": "BufferLineGoToBuffer 2" + }, + { + "desc": "Buffer 1", + "noremap": true, + "lhs": "b1", + "mode": "n", + "rhs": "BufferLineGoToBuffer 1" + }, + { + "desc": "Delete Buffers to the Right", + "noremap": true, + "lhs": "br", + "mode": "n", + "rhs": "BufferLineCloseRight" + }, + { + "desc": "Delete Other Buffers", + "noremap": true, + "lhs": "bo", + "mode": "n", + "rhs": "BufferLineCloseOthers" + }, + { + "desc": "Delete Non-Pinned Buffers", + "noremap": true, + "lhs": "bP", + "mode": "n", + "rhs": "BufferLineGroupClose ungrouped" + }, + { + "desc": "Toggle Pin", + "noremap": true, + "lhs": "bp", + "mode": "n", + "rhs": "BufferLineTogglePin" + }, + { + "desc": "Delete Buffers to the Left", + "noremap": true, + "lhs": "bl", + "mode": "n", + "rhs": "BufferLineCloseLeft" + }, + { + "desc": "Sort By Extensions", + "noremap": true, + "lhs": "bs", + "mode": "n", + "rhs": "BufferLineSortByExtension" + }, + { + "desc": "Sort By Directory", + "noremap": true, + "lhs": "bS", + "mode": "n", + "rhs": "BufferLineSortByDirectory" + }, + { + "desc": "Pick Buffer", + "noremap": true, + "lhs": ".", + "mode": "n", + "rhs": "BufferLinePick" + }, + { + "desc": "Buffer 9", + "noremap": true, + "lhs": "b9", + "mode": "n", + "rhs": "BufferLineGoToBuffer 9" + }, + { + "desc": "Dismiss All Notifications", + "noremap": true, + "lhs": "un", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "gCÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "wÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "cLÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "Þ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "qÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "dbÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "oÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "mÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "bÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "lÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "uÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "Þ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "ghÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "gCÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "gÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "wÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "xÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "cLÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "ceÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "ciÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "pwÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "ppÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "snÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "sSÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "ssÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "siÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "ftÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "fÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "aÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "qÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "oÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "mÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "bÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "dÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "ghÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "gÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "uÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "xÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "ciÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "ceÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "cÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "pwÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "ppÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "prÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "iÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "snÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "siÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "sÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "ftÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "fÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "aÞ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "srÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "sÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "dÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "cÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "prÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "pÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "iÞ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "Þ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "x", + "rhs": "lua require(\"which-key\").show(\" \", {mode = \"v\", auto = true})" + }, + { + "desc": "Repo History (Diff)", + "noremap": true, + "lhs": "gR", + "mode": "n", + "rhs": "" + }, + { + "desc": "Diff View", + "noremap": true, + "lhs": "gd", + "mode": "n", + "rhs": "" + }, + { + "desc": "Plugins (Lazy)", + "noremap": true, + "lhs": "sP", + "mode": "n", + "rhs": "" + }, + { + "desc": "Upgrade Crate", + "noremap": true, + "lhs": "prU", + "mode": "n", + "rhs": "" + }, + { + "desc": "Update All Crates", + "noremap": true, + "lhs": "pra", + "mode": "n", + "rhs": "" + }, + { + "desc": "Update Crates", + "noremap": true, + "lhs": "pru", + "mode": "v", + "rhs": "" + }, + { + "desc": "Update Crate", + "noremap": true, + "lhs": "pru", + "mode": "n", + "rhs": "" + }, + { + "desc": "Reload", + "noremap": true, + "lhs": "prR", + "mode": "n", + "rhs": "" + }, + { + "desc": "Crates.io", + "noremap": true, + "lhs": "prc", + "mode": "n", + "rhs": "" + }, + { + "desc": "Documentation", + "noremap": true, + "lhs": "prd", + "mode": "n", + "rhs": "" + }, + { + "desc": "Repo", + "noremap": true, + "lhs": "prr", + "mode": "n", + "rhs": "" + }, + { + "desc": "Homepage", + "noremap": true, + "lhs": "prh", + "mode": "n", + "rhs": "" + }, + { + "desc": "Extract into Table", + "noremap": true, + "lhs": "prT", + "mode": "n", + "rhs": "" + }, + { + "desc": "Extract into Inline Table", + "noremap": true, + "lhs": "prt", + "mode": "n", + "rhs": "" + }, + { + "desc": "Upgrade All Crates", + "noremap": true, + "lhs": "prA", + "mode": "n", + "rhs": "" + }, + { + "desc": "Upgrade Crates", + "noremap": true, + "lhs": "prU", + "mode": "v", + "rhs": "" + }, + { + "desc": "Print Variable", + "noremap": true, + "lhs": "dv", + "mode": "x", + "rhs": "" + }, + { + "desc": "Print Variable", + "noremap": true, + "lhs": "dv", + "mode": "n", + "rhs": "" + }, + { + "desc": "Refactor", + "noremap": true, + "lhs": "cR", + "mode": "v", + "rhs": "" + }, + { + "desc": "Refactor", + "noremap": true, + "lhs": "cR", + "mode": "n", + "rhs": "" + }, + { + "desc": "Remove Printed Variables", + "noremap": true, + "lhs": "dR", + "mode": "n", + "rhs": "" + }, + { + "desc": "Find Obsidian Files", + "noremap": true, + "lhs": "fo", + "mode": "n", + "rhs": "" + }, + { + "desc": "Find Files", + "noremap": true, + "lhs": "o", + "mode": "n", + "rhs": "" + }, + { + "desc": "New Note", + "noremap": true, + "lhs": "on", + "mode": "n", + "rhs": "" + }, + { + "desc": "Obsidian Grep", + "noremap": true, + "lhs": "sO", + "mode": "n", + "rhs": "" + }, + { + "desc": "Grep", + "noremap": true, + "lhs": "og", + "mode": "n", + "rhs": "" + }, + { + "desc": "Open on App", + "noremap": true, + "lhs": "oo", + "mode": "n", + "rhs": "" + }, + { + "desc": "Daily Notes", + "noremap": true, + "lhs": "od", + "mode": "n", + "rhs": "" + }, + { + "desc": "Paste Image", + "noremap": true, + "lhs": "oi", + "mode": "n", + "rhs": "" + }, + { + "desc": "Rename", + "noremap": true, + "lhs": "or", + "mode": "n", + "rhs": "" + }, + { + "desc": "Workspace", + "noremap": true, + "lhs": "ow", + "mode": "n", + "rhs": "" + }, + { + "desc": "Extract Note", + "noremap": true, + "lhs": "oe", + "mode": "n", + "rhs": "" + }, + { + "desc": "New Link", + "noremap": true, + "lhs": "oN", + "mode": "n", + "rhs": "" + }, + { + "desc": "Links", + "noremap": true, + "lhs": "oL", + "mode": "n", + "rhs": "" + }, + { + "desc": "Link", + "noremap": true, + "lhs": "ol", + "mode": "n", + "rhs": "" + }, + { + "desc": "Template", + "noremap": true, + "lhs": "ot", + "mode": "n", + "rhs": "" + }, + { + "desc": "Backlinks", + "noremap": true, + "lhs": "ob", + "mode": "n", + "rhs": "" + }, + { + "desc": "Multicursor", + "noremap": true, + "lhs": "M", + "mode": "v", + "rhs": "" + }, + { + "desc": "Multicursor", + "noremap": true, + "lhs": "M", + "mode": "n", + "rhs": "" + }, + { + "desc": "Yank History", + "noremap": true, + "lhs": "sy", + "mode": "n", + "rhs": "" + }, + { + "desc": "Open Yank History", + "noremap": true, + "lhs": "p", + "mode": "n", + "rhs": "" + }, + { + "desc": "Yank History", + "noremap": true, + "lhs": "sy", + "mode": "v", + "rhs": "" + }, + { + "desc": "Devdocs", + "noremap": true, + "lhs": "sE", + "mode": "n", + "rhs": "" + }, + { + "desc": "Devdocs Current", + "noremap": true, + "lhs": "se", + "mode": "n", + "rhs": "" + }, + { + "desc": "Python", + "noremap": true, + "lhs": "cep", + "mode": "n", + "rhs": "" + }, + { + "desc": "Node", + "noremap": true, + "lhs": "cen", + "mode": "n", + "rhs": "" + }, + { + "desc": "Lazygit (cwd)", + "noremap": true, + "lhs": "gG", + "mode": "n", + "rhs": "" + }, + { + "desc": "Lazygit (root dir)", + "noremap": true, + "lhs": "gg", + "mode": "n", + "rhs": "" + }, + { + "desc": "Lazynpm", + "noremap": true, + "lhs": "pwp", + "mode": "n", + "rhs": "" + }, + { + "desc": "Split (cwd)", + "noremap": true, + "lhs": "ftS", + "mode": "n", + "rhs": "" + }, + { + "desc": "Split (root dir)", + "noremap": true, + "lhs": "fts", + "mode": "n", + "rhs": "" + }, + { + "desc": "Floating (cwd)", + "noremap": true, + "lhs": "ftF", + "mode": "n", + "rhs": "" + }, + { + "desc": "Floating (root dir)", + "noremap": true, + "lhs": "ftf", + "mode": "n", + "rhs": "" + }, + { + "desc": "File History (LazyGit)", + "noremap": true, + "lhs": "gF", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Auto Pairs", + "noremap": true, + "lhs": "up", + "mode": "n", + "rhs": "" + }, + { + "desc": "Install New Dependency", + "noremap": true, + "lhs": "pwi", + "mode": "n", + "rhs": "" + }, + { + "desc": "Change Package Version", + "noremap": true, + "lhs": "pwc", + "mode": "n", + "rhs": "" + }, + { + "desc": "Remove Package", + "noremap": true, + "lhs": "pwr", + "mode": "n", + "rhs": "" + }, + { + "desc": "Update Package", + "noremap": true, + "lhs": "pwu", + "mode": "n", + "rhs": "" + }, + { + "desc": "Show Package Versions", + "noremap": true, + "lhs": "pwv", + "mode": "n", + "rhs": "" + }, + { + "desc": "Generate", + "noremap": true, + "lhs": "ig", + "mode": "n", + "rhs": "" + }, + { + "desc": "IA (Gen)", + "noremap": true, + "lhs": "ii", + "mode": "v", + "rhs": "" + }, + { + "desc": "IA (Gen)", + "noremap": true, + "lhs": "ii", + "mode": "n", + "rhs": "" + }, + { + "desc": "Elaborate Text", + "noremap": true, + "lhs": "iE", + "mode": "v", + "rhs": "" + }, + { + "desc": "Fix Code", + "noremap": true, + "lhs": "if", + "mode": "v", + "rhs": "" + }, + { + "desc": "Change Code", + "noremap": true, + "lhs": "ih", + "mode": "v", + "rhs": "" + }, + { + "desc": "Enhance Code", + "noremap": true, + "lhs": "ie", + "mode": "v", + "rhs": "" + }, + { + "desc": "Review Code", + "noremap": true, + "lhs": "ir", + "mode": "v", + "rhs": "" + }, + { + "desc": "Make Table", + "noremap": true, + "lhs": "it", + "mode": "v", + "rhs": "" + }, + { + "desc": "Make List", + "noremap": true, + "lhs": "il", + "mode": "v", + "rhs": "" + }, + { + "desc": "Make Concise", + "noremap": true, + "lhs": "iC", + "mode": "v", + "rhs": "" + }, + { + "desc": "Enhance Wording", + "noremap": true, + "lhs": "iw", + "mode": "v", + "rhs": "" + }, + { + "desc": "Enhance Grammar Spelling", + "noremap": true, + "lhs": "iG", + "mode": "v", + "rhs": "" + }, + { + "desc": "Change", + "noremap": true, + "lhs": "iH", + "mode": "v", + "rhs": "" + }, + { + "desc": "Ask", + "noremap": true, + "lhs": "ia", + "mode": "v", + "rhs": "" + }, + { + "desc": "Summarize", + "noremap": true, + "lhs": "is", + "mode": "v", + "rhs": "" + }, + { + "desc": "Summarize", + "noremap": true, + "lhs": "is", + "mode": "n", + "rhs": "" + }, + { + "desc": "Chat", + "noremap": true, + "lhs": "ic", + "mode": "n", + "rhs": "" + }, + { + "desc": "Open HTML Docs", + "noremap": true, + "lhs": "ao", + "mode": "n", + "rhs": "" + }, + { + "desc": "Generate HTML Docs", + "noremap": true, + "lhs": "ag", + "mode": "n", + "rhs": "" + }, + { + "desc": "Symbols", + "noremap": true, + "lhs": "sis", + "mode": "n", + "rhs": "" + }, + { + "desc": "All", + "noremap": true, + "lhs": "sia", + "mode": "n", + "rhs": "" + }, + { + "desc": "Nerd Fonts", + "noremap": true, + "lhs": "sin", + "mode": "n", + "rhs": "" + }, + { + "desc": "Emoji", + "noremap": true, + "lhs": "sie", + "mode": "n", + "rhs": "" + }, + { + "desc": "Word Globally", + "noremap": true, + "lhs": "srG", + "mode": "n", + "rhs": "" + }, + { + "desc": "Globally", + "noremap": true, + "lhs": "srg", + "mode": "n", + "rhs": "" + }, + { + "desc": "Replace in Files (Spectre)", + "noremap": true, + "lhs": "sr", + "mode": "n", + "rhs": "" + }, + { + "desc": "Word Globally", + "noremap": true, + "lhs": "srG", + "mode": "v", + "rhs": "" + }, + { + "desc": "Git Explorer", + "noremap": true, + "lhs": "ge", + "mode": "n", + "rhs": "" + }, + { + "desc": "Explorer NeoTree (cwd)", + "noremap": true, + "lhs": "E", + "mode": "n", + "rhs": "" + }, + { + "desc": "Explorer NeoTree (Root Dir)", + "noremap": true, + "lhs": "e", + "mode": "n", + "rhs": "" + }, + { + "desc": "Explorer NeoTree (cwd)", + "noremap": true, + "lhs": "fE", + "mode": "n", + "rhs": "" + }, + { + "desc": "Explorer NeoTree (Root Dir)", + "noremap": true, + "lhs": "fe", + "mode": "n", + "rhs": "" + }, + { + "desc": "Buffer Explorer", + "noremap": true, + "lhs": "be", + "mode": "n", + "rhs": "" + }, + { + "desc": "Delete Buffer (Force)", + "noremap": true, + "lhs": "bD", + "mode": "n", + "rhs": "" + }, + { + "desc": "Delete Buffer", + "noremap": true, + "lhs": "bd", + "mode": "n", + "rhs": "" + }, + { + "desc": "File", + "noremap": true, + "lhs": "aF", + "mode": "n", + "rhs": "" + }, + { + "desc": "Type", + "noremap": true, + "lhs": "at", + "mode": "n", + "rhs": "" + }, + { + "desc": "Function", + "noremap": true, + "lhs": "af", + "mode": "n", + "rhs": "" + }, + { + "desc": "Class", + "noremap": true, + "lhs": "aC", + "mode": "n", + "rhs": "" + }, + { + "desc": "Default Annotation", + "noremap": true, + "lhs": "ad", + "mode": "n", + "rhs": "" + }, + { + "desc": "Zoxide", + "noremap": true, + "lhs": "fz", + "mode": "n", + "rhs": "" + }, + { + "desc": "Cmp Status", + "noremap": true, + "lhs": "ciC", + "mode": "n", + "rhs": "" + }, + { + "desc": "Undos", + "noremap": true, + "lhs": "su", + "mode": "n", + "rhs": "" + }, + { + "desc": "Screenshot (Clipboard)", + "noremap": true, + "lhs": "cs", + "mode": "v", + "rhs": "" + }, + { + "desc": "Screenshot (Save)", + "noremap": true, + "lhs": "cS", + "mode": "v", + "rhs": "" + }, + { + "desc": "Word on Buffer", + "noremap": true, + "lhs": "srw", + "mode": "n", + "rhs": "" + }, + { + "desc": "Visual Selection", + "noremap": true, + "lhs": "srv", + "mode": "v", + "rhs": "" + }, + { + "desc": "File on Buffer", + "noremap": true, + "lhs": "srf", + "mode": "n", + "rhs": "" + }, + { + "desc": "Buffer", + "noremap": true, + "lhs": "srb", + "mode": "v", + "rhs": "" + }, + { + "desc": "Buffer", + "noremap": true, + "lhs": "srb", + "mode": "n", + "rhs": "" + }, + { + "desc": "Expression on Buffer", + "noremap": true, + "lhs": "sre", + "mode": "n", + "rhs": "" + }, + { + "desc": "WORD on Buffer", + "noremap": true, + "lhs": "srW", + "mode": "n", + "rhs": "" + }, + { + "desc": "Word on Buffer", + "noremap": true, + "lhs": "srw", + "mode": "v", + "rhs": "" + }, + { + "desc": "Package Info", + "noremap": true, + "lhs": "ppi", + "mode": "n", + "rhs": "" + }, + { + "desc": "Update Package", + "noremap": true, + "lhs": "ppu", + "mode": "n", + "rhs": "" + }, + { + "desc": "Update All Packages", + "noremap": true, + "lhs": "ppa", + "mode": "n", + "rhs": "" + }, + { + "desc": "Select VirtualEnv", + "noremap": true, + "lhs": "cv", + "mode": "n", + "rhs": "" + }, + { + "desc": "Suda Write", + "noremap": true, + "lhs": "W", + "mode": "n", + "rhs": "" + }, + { "desc": "", "noremap": true, "lhs": "!iÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "!aÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "!Þ", "mode": "n", "rhs": "" }, + { + "desc": "", + "noremap": true, + "lhs": "!", + "mode": "n", + "rhs": "lua require(\"which-key\").show(\"!\", {mode = \"n\", auto = true})" + }, + { + "desc": "", + "noremap": true, + "lhs": "\"", + "mode": "n", + "rhs": "lua require(\"which-key\").show(\"\\\"\", {mode = \"n\", auto = true})" + }, + { + "desc": "", + "noremap": true, + "lhs": "\"", + "mode": "x", + "rhs": "lua require(\"which-key\").show(\"\\\"\", {mode = \"v\", auto = true})" + }, + { "desc": "", "noremap": true, "lhs": "#Þ", "mode": "n", "rhs": "" }, + { + "desc": "", + "noremap": true, + "lhs": "#", + "mode": "n", + "rhs": "lua require(\"which-key\").show(\"#\", {mode = \"n\", auto = true})" + }, + { + "desc": " Insert Macro Breakpoint.", + "noremap": true, + "lhs": "##", + "mode": "n", + "rhs": "" + }, + { + "desc": "Search Selected Text (Backwards)", + "noremap": true, + "lhs": "#", + "mode": "x", + "rhs": "y?\\V=escape(@\", '?\\')" + }, + { + "desc": "", + "noremap": false, + "lhs": "%", + "mode": "x", + "rhs": "(MatchitVisualForward)" + }, + { + "desc": "", + "noremap": false, + "lhs": "%", + "mode": "n", + "rhs": "(MatchitNormalForward)" + }, + { + "desc": ":help &-default", + "noremap": true, + "lhs": "&", + "mode": "n", + "rhs": ":&&" + }, + { + "desc": "", + "noremap": true, + "lhs": "'", + "mode": "n", + "rhs": "lua require(\"which-key\").show(\"'\", {mode = \"n\", auto = true})" + }, + { + "desc": "Search Selected Text", + "noremap": true, + "lhs": "*", + "mode": "x", + "rhs": "y/\\V=escape(@\", '/\\')" + }, + { "desc": "", "noremap": true, "lhs": "+", "mode": "n", "rhs": "" }, + { + "desc": "", + "noremap": true, + "lhs": ",", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": ",", + "mode": "n", + "rhs": "" + }, + { "desc": "", "noremap": true, "lhs": "-", "mode": "n", "rhs": "" }, + { + "desc": "", + "noremap": true, + "lhs": ";", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": ";", + "mode": "n", + "rhs": "" + }, + { "desc": "", "noremap": true, "lhs": "<", "mode": "v", "rhs": "gv" }, + { "desc": "", "noremap": true, "lhs": "" }, + { "desc": "", "noremap": true, "lhs": "" }, + { "desc": "", "noremap": true, "lhs": "<Þ", "mode": "n", "rhs": "" }, + { + "desc": "Deindent", + "noremap": true, + "lhs": "<", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "<<", + "mode": "n", + "rhs": "" + }, + { + "desc": "Put and Indent Left", + "noremap": true, + "lhs": "" + }, + { + "desc": "Put Before and Indent Left", + "noremap": true, + "lhs": "" + }, + { "desc": "", "noremap": true, "lhs": "=Þ", "mode": "n", "rhs": "" }, + { + "desc": "", + "noremap": true, + "lhs": "=", + "mode": "n", + "rhs": "lua require(\"which-key\").show(\"=\", {mode = \"n\", auto = true})" + }, + { + "desc": "Put After Applying a Filter", + "noremap": true, + "lhs": "=p", + "mode": "n", + "rhs": "" + }, + { + "desc": "Put Before Applying a Filter", + "noremap": true, + "lhs": "=P", + "mode": "n", + "rhs": "" + }, + { "desc": "", "noremap": true, "lhs": ">", "mode": "v", "rhs": ">gv" }, + { "desc": "", "noremap": true, "lhs": ">aÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": ">iÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": ">Þ", "mode": "n", "rhs": "" }, + { "desc": "Indent", "noremap": true, "lhs": ">", "mode": "n", "rhs": ">>" }, + { + "desc": "", + "noremap": true, + "lhs": ">>", + "mode": "n", + "rhs": "" + }, + { + "desc": "Put Before and Indent Right", + "noremap": true, + "lhs": ">P", + "mode": "n", + "rhs": "" + }, + { + "desc": "Put and Indent Right", + "noremap": true, + "lhs": ">p", + "mode": "n", + "rhs": "" + }, + { + "desc": ":help v_@-default", + "noremap": true, + "lhs": "@", + "mode": "x", + "rhs": "mode() == 'V' ? ':normal! @'.getcharstr().'' : '@'" + }, + { + "desc": "Pick Color", + "noremap": true, + "lhs": "C", + "mode": "n", + "rhs": "" + }, + { "desc": "", "noremap": true, "lhs": "E", "mode": "n", "rhs": "ge" }, + { + "desc": "", + "noremap": true, + "lhs": "F", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "F", + "mode": "n", + "rhs": "" + }, + { + "desc": "Prev Buffer", + "noremap": true, + "lhs": "H", + "mode": "n", + "rhs": "BufferLineCyclePrev" + }, + { + "desc": "Node action", + "noremap": true, + "lhs": "J", + "mode": "n", + "rhs": "" + }, + { + "desc": "Next Buffer", + "noremap": true, + "lhs": "L", + "mode": "n", + "rhs": "BufferLineCycleNext" + }, + { + "desc": "Link", + "noremap": true, + "lhs": "L", + "mode": "x", + "rhs": "" + }, + { + "desc": "Prev Search Result", + "noremap": true, + "lhs": "N", + "mode": "x", + "rhs": "'nN'[v:searchforward]" + }, + { "desc": "", "noremap": true, "lhs": "N", "mode": "n", "rhs": "Nzzzv" }, + { + "desc": "", + "noremap": true, + "lhs": "O", + "mode": "n", + "rhs": "" + }, + { + "desc": "Put Yanked Text Before Cursor", + "noremap": true, + "lhs": "P", + "mode": "x", + "rhs": "" + }, + { + "desc": "Put Yanked Text Before Cursor", + "noremap": true, + "lhs": "P", + "mode": "n", + "rhs": "" + }, + { + "desc": " Play Macro", + "noremap": true, + "lhs": "Q", + "mode": "n", + "rhs": "" + }, + { + "desc": ":help v_Q-default", + "noremap": true, + "lhs": "Q", + "mode": "x", + "rhs": "mode() == 'V' ? ':normal! @=reg_recorded()' : 'Q'" + }, + { + "desc": "Treesitter Search", + "noremap": true, + "lhs": "R", + "mode": "x", + "rhs": "" + }, + { + "desc": "Flash Treesitter", + "noremap": true, + "lhs": "S", + "mode": "x", + "rhs": "" + }, + { + "desc": "Flash Treesitter", + "noremap": true, + "lhs": "S", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "T", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "T", + "mode": "n", + "rhs": "" + }, + { + "desc": "Redo", + "noremap": true, + "lhs": "U", + "mode": "n", + "rhs": "" + }, + { + "desc": ":help Y-default", + "noremap": true, + "lhs": "Y", + "mode": "n", + "rhs": "y$" + }, + { + "desc": "Prev Reference", + "noremap": true, + "lhs": "[[", + "mode": "n", + "rhs": "" + }, + { + "desc": "Previous Todo Comment", + "noremap": true, + "lhs": "[t", + "mode": "n", + "rhs": "" + }, + { + "desc": "Go to indent scope top", + "noremap": true, + "lhs": "[i", + "mode": "x", + "rhs": "lua MiniIndentscope.operator('top')" + }, + { + "desc": "Go to indent scope top", + "noremap": true, + "lhs": "[i", + "mode": "n", + "rhs": "lua MiniIndentscope.operator('top', true)" + }, + { + "desc": "Prev Block Comment", + "noremap": true, + "lhs": "[/", + "mode": "n", + "rhs": "?\\S\\zs\\s*╭zt" + }, + { + "desc": "Previous Tab", + "noremap": true, + "lhs": "[", + "mode": "n", + "rhs": "tabprevious" + }, + { + "desc": "Prev Warning", + "noremap": true, + "lhs": "[w", + "mode": "n", + "rhs": "" + }, + { + "desc": "Prev Error", + "noremap": true, + "lhs": "[e", + "mode": "n", + "rhs": "" + }, + { + "desc": "Previous Trouble/Quickfix Item", + "noremap": true, + "lhs": "[q", + "mode": "n", + "rhs": "" + }, + { + "desc": "Prev Mark", + "noremap": true, + "lhs": "[k", + "mode": "n", + "rhs": "Grapple cycle backward" + }, + { + "desc": "Move Buffer Prev", + "noremap": true, + "lhs": "[B", + "mode": "n", + "rhs": "BufferLineMovePrev" + }, + { + "desc": "Prev Buffer", + "noremap": true, + "lhs": "[b", + "mode": "n", + "rhs": "BufferLineCyclePrev" + }, + { "desc": "", "noremap": true, "lhs": "[Þ", "mode": "n", "rhs": "" }, + { + "desc": "", + "noremap": true, + "lhs": "[", + "mode": "n", + "rhs": "lua require(\"which-key\").show(\"[\", {mode = \"n\", auto = true})" + }, + { "desc": "", "noremap": true, "lhs": "[Þ", "mode": "x", "rhs": "" }, + { + "desc": "", + "noremap": true, + "lhs": "[", + "mode": "x", + "rhs": "lua require(\"which-key\").show(\"[\", {mode = \"v\", auto = true})" + }, + { + "desc": "", + "noremap": false, + "lhs": "[%", + "mode": "x", + "rhs": "(MatchitVisualMultiBackward)" + }, + { + "desc": "", + "noremap": false, + "lhs": "[%", + "mode": "n", + "rhs": "(MatchitNormalMultiBackward)" + }, + { + "desc": "Prev List Type", + "noremap": true, + "lhs": "[.", + "mode": "n", + "rhs": "" + }, + { + "desc": "Cycle Forward Through Yank History", + "noremap": true, + "lhs": "[y", + "mode": "n", + "rhs": "" + }, + { + "desc": "Put Indented Before Cursor (Linewise)", + "noremap": true, + "lhs": "[p", + "mode": "n", + "rhs": "" + }, + { + "desc": "Put Indented Before Cursor (Linewise)", + "noremap": true, + "lhs": "[P", + "mode": "n", + "rhs": "" + }, + { + "desc": "Prev Diagnostic", + "noremap": true, + "lhs": "[d", + "mode": "n", + "rhs": "" + }, + { + "desc": "Next Reference", + "noremap": true, + "lhs": "]]", + "mode": "n", + "rhs": "" + }, + { + "desc": "Next Todo Comment", + "noremap": true, + "lhs": "]t", + "mode": "n", + "rhs": "" + }, + { + "desc": "Go to indent scope bottom", + "noremap": true, + "lhs": "]i", + "mode": "x", + "rhs": "lua MiniIndentscope.operator('bottom')" + }, + { + "desc": "Go to indent scope bottom", + "noremap": true, + "lhs": "]i", + "mode": "n", + "rhs": "lua MiniIndentscope.operator('bottom', true)" + }, + { + "desc": "Next Block Comment", + "noremap": true, + "lhs": "]/", + "mode": "n", + "rhs": "/\\S\\zs\\s*╭zt" + }, + { + "desc": "Next Tab", + "noremap": true, + "lhs": "]", + "mode": "n", + "rhs": "tabnext" + }, + { + "desc": "Next Warning", + "noremap": true, + "lhs": "]w", + "mode": "n", + "rhs": "" + }, + { + "desc": "Next Error", + "noremap": true, + "lhs": "]e", + "mode": "n", + "rhs": "" + }, + { + "desc": "Next Trouble/Quickfix Item", + "noremap": true, + "lhs": "]q", + "mode": "n", + "rhs": "" + }, + { + "desc": "Next Mark", + "noremap": true, + "lhs": "]k", + "mode": "n", + "rhs": "Grapple cycle forward" + }, + { + "desc": "Move Buffer Next", + "noremap": true, + "lhs": "]B", + "mode": "n", + "rhs": "BufferLineMoveNext" + }, + { + "desc": "Next Buffer", + "noremap": true, + "lhs": "]b", + "mode": "n", + "rhs": "BufferLineCycleNext" + }, + { "desc": "", "noremap": true, "lhs": "]Þ", "mode": "n", "rhs": "" }, + { + "desc": "", + "noremap": true, + "lhs": "]", + "mode": "n", + "rhs": "lua require(\"which-key\").show(\"]\", {mode = \"n\", auto = true})" + }, + { "desc": "", "noremap": true, "lhs": "]Þ", "mode": "x", "rhs": "" }, + { + "desc": "", + "noremap": true, + "lhs": "]", + "mode": "x", + "rhs": "lua require(\"which-key\").show(\"]\", {mode = \"v\", auto = true})" + }, + { + "desc": "", + "noremap": false, + "lhs": "]%", + "mode": "x", + "rhs": "(MatchitVisualMultiForward)" + }, + { + "desc": "", + "noremap": false, + "lhs": "]%", + "mode": "n", + "rhs": "(MatchitNormalMultiForward)" + }, + { + "desc": "Next List Type", + "noremap": true, + "lhs": "].", + "mode": "n", + "rhs": "" + }, + { + "desc": "Cycle Backward Through Yank History", + "noremap": true, + "lhs": "]y", + "mode": "n", + "rhs": "" + }, + { + "desc": "Put Indented After Cursor (Linewise)", + "noremap": true, + "lhs": "]p", + "mode": "n", + "rhs": "" + }, + { + "desc": "Put Indented After Cursor (Linewise)", + "noremap": true, + "lhs": "]P", + "mode": "n", + "rhs": "" + }, + { + "desc": "Next Diagnostic", + "noremap": true, + "lhs": "]d", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "`", + "mode": "n", + "rhs": "lua require(\"which-key\").show(\"`\", {mode = \"n\", auto = true})" + }, + { + "desc": "Object scope with border", + "noremap": true, + "lhs": "ai", + "mode": "x", + "rhs": "lua MiniIndentscope.textobject(true)" + }, + { + "desc": "Around last textobject", + "noremap": false, + "lhs": "al", + "mode": "x", + "rhs": "" + }, + { + "desc": "Around next textobject", + "noremap": false, + "lhs": "an", + "mode": "x", + "rhs": "" + }, + { + "desc": "Around textobject", + "noremap": false, + "lhs": "a", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": false, + "lhs": "a%", + "mode": "x", + "rhs": "(MatchitVisualTextObject)" + }, + { + "desc": "Value", + "noremap": true, + "lhs": "av", + "mode": "x", + "rhs": "" + }, + { + "desc": "Number", + "noremap": true, + "lhs": "aN", + "mode": "x", + "rhs": "" + }, + { + "desc": "Key", + "noremap": true, + "lhs": "ak", + "mode": "x", + "rhs": "" + }, + { + "desc": " Edit Macro", + "noremap": true, + "lhs": "cq", + "mode": "n", + "rhs": "" + }, + { "desc": "", "noremap": true, "lhs": "ciÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "crÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "caÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "cÞ", "mode": "n", "rhs": "" }, + { + "desc": "", + "noremap": true, + "lhs": "c", + "mode": "n", + "rhs": "lua require(\"which-key\").show(\"c\", {mode = \"n\", auto = true})" + }, + { + "desc": "vim.lsp.buf.code_action()", + "noremap": true, + "lhs": "crr", + "mode": "n", + "rhs": "" + }, + { + "desc": "vim.lsp.buf.rename()", + "noremap": true, + "lhs": "crn", + "mode": "n", + "rhs": "" + }, + { + "desc": "Mark on Current Line", + "noremap": true, + "lhs": "dm", + "mode": "n", + "rhs": "" + }, + { + "desc": " Delete All Macros", + "noremap": true, + "lhs": "dq", + "mode": "n", + "rhs": "" + }, + { "desc": "", "noremap": true, "lhs": "diÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "daÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "dÞ", "mode": "n", "rhs": "" }, + { + "desc": "", + "noremap": true, + "lhs": "d", + "mode": "n", + "rhs": "lua require(\"which-key\").show(\"d\", {mode = \"n\", auto = true})" + }, + { + "desc": "Don't Yank Empty Line to Clipboard", + "noremap": true, + "lhs": "dd", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "d", + "mode": "v", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "f", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "f", + "mode": "n", + "rhs": "" + }, + { + "desc": "Empty Line Below", + "noremap": true, + "lhs": "go", + "mode": "n", + "rhs": "call append(line('.'), repeat([''], v:count1))" + }, + { + "desc": "Empty Line Above", + "noremap": true, + "lhs": "gO", + "mode": "n", + "rhs": "call append(line('.') - 1, repeat([''], v:count1))" + }, + { + "desc": "Search Inside Visual Selection", + "noremap": true, + "lhs": "g/", + "mode": "x", + "rhs": "/\\%V" + }, + { + "desc": "Move to right \"around\"", + "noremap": false, + "lhs": "g]", + "mode": "x", + "rhs": "" + }, + { + "desc": "Move to right \"around\"", + "noremap": false, + "lhs": "g]", + "mode": "n", + "rhs": "" + }, + { + "desc": "Move to left \"around\"", + "noremap": false, + "lhs": "g[", + "mode": "x", + "rhs": "" + }, + { + "desc": "Move to left \"around\"", + "noremap": false, + "lhs": "g[", + "mode": "n", + "rhs": "" + }, + { "desc": "", "noremap": true, "lhs": "gsÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "guiÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "guaÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "guÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "gUiÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "gUaÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "gUÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "g~iÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "g~aÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "g~Þ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "gÞ", "mode": "n", "rhs": "" }, + { + "desc": "", + "noremap": true, + "lhs": "g", + "mode": "n", + "rhs": "lua require(\"which-key\").show(\"g\", {mode = \"n\", auto = true})" + }, + { "desc": "", "noremap": true, "lhs": "gsÞ", "mode": "x", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "gÞ", "mode": "x", "rhs": "" }, + { + "desc": "", + "noremap": true, + "lhs": "g", + "mode": "x", + "rhs": "lua require(\"which-key\").show(\"g\", {mode = \"v\", auto = true})" + }, + { + "desc": "", + "noremap": false, + "lhs": "g%", + "mode": "x", + "rhs": "(MatchitVisualBackward)" + }, + { + "desc": "", + "noremap": false, + "lhs": "g%", + "mode": "n", + "rhs": "(MatchitNormalBackward)" + }, + { + "desc": "Diagnostics", + "noremap": true, + "lhs": "gd", + "mode": "x", + "rhs": "" + }, + { + "desc": "Put Yanked Text Before Selection", + "noremap": true, + "lhs": "gP", + "mode": "x", + "rhs": "" + }, + { + "desc": "Put Yanked Text After Selection", + "noremap": true, + "lhs": "gp", + "mode": "x", + "rhs": "" + }, + { + "desc": "Put Yanked Text After Selection", + "noremap": true, + "lhs": "gp", + "mode": "n", + "rhs": "" + }, + { + "desc": "Put Yanked Text Before Selection", + "noremap": true, + "lhs": "gP", + "mode": "n", + "rhs": "" + }, + { + "desc": "Goto implementations", + "noremap": true, + "lhs": "gI", + "mode": "n", + "rhs": "" + }, + { + "desc": "Goto Definition", + "noremap": true, + "lhs": "gd", + "mode": "n", + "rhs": "" + }, + { + "desc": "Goto t[y]pe definitions", + "noremap": true, + "lhs": "gy", + "mode": "n", + "rhs": "" + }, + { + "desc": "Increment", + "noremap": true, + "lhs": "g", + "mode": "v", + "rhs": "" + }, + { + "desc": "Increment", + "noremap": true, + "lhs": "g", + "mode": "n", + "rhs": "" + }, + { + "desc": "Decrement", + "noremap": true, + "lhs": "g", + "mode": "n", + "rhs": "" + }, + { + "desc": "Decrement", + "noremap": true, + "lhs": "g", + "mode": "v", + "rhs": "" + }, + { + "desc": "Find Left Surrounding", + "noremap": true, + "lhs": "gsF", + "mode": "n", + "rhs": "" + }, + { + "desc": "Add Surrounding", + "noremap": true, + "lhs": "gsa", + "mode": "n", + "rhs": "" + }, + { + "desc": "Add Surrounding", + "noremap": true, + "lhs": "gsa", + "mode": "v", + "rhs": "" + }, + { + "desc": "Replace Surrounding", + "noremap": true, + "lhs": "gsr", + "mode": "n", + "rhs": "" + }, + { + "desc": "Highlight Surrounding", + "noremap": true, + "lhs": "gsh", + "mode": "n", + "rhs": "" + }, + { + "desc": "Delete Surrounding", + "noremap": true, + "lhs": "gsd", + "mode": "n", + "rhs": "" + }, + { + "desc": "Update `MiniSurround.config.n_lines`", + "noremap": true, + "lhs": "gsn", + "mode": "n", + "rhs": "" + }, + { + "desc": "Find Right Surrounding", + "noremap": true, + "lhs": "gsf", + "mode": "n", + "rhs": "" + }, + { + "desc": "References", + "noremap": true, + "lhs": "gr", + "mode": "n", + "rhs": "" + }, + { + "desc": "Comment line", + "noremap": true, + "lhs": "gcc", + "mode": "n", + "rhs": "" + }, + { + "desc": "Comment selection", + "noremap": true, + "lhs": "gc", + "mode": "x", + "rhs": "" + }, + { + "desc": "Comment", + "noremap": true, + "lhs": "gc", + "mode": "n", + "rhs": "" + }, + { + "desc": "Opens filepath or URI under cursor with the system handler (file explorer, web browser, …)", + "noremap": true, + "lhs": "gx", + "mode": "x", + "rhs": "" + }, + { + "desc": "Opens filepath or URI under cursor with the system handler (file explorer, web browser, …)", + "noremap": true, + "lhs": "gx", + "mode": "n", + "rhs": "" + }, + { + "desc": "Object scope", + "noremap": true, + "lhs": "ii", + "mode": "x", + "rhs": "lua MiniIndentscope.textobject(false)" + }, + { + "desc": "Inside last textobject", + "noremap": false, + "lhs": "il", + "mode": "x", + "rhs": "" + }, + { + "desc": "Inside next textobject", + "noremap": false, + "lhs": "in", + "mode": "x", + "rhs": "" + }, + { + "desc": "Inside textobject", + "noremap": false, + "lhs": "i", + "mode": "x", + "rhs": "" + }, + { + "desc": "Key", + "noremap": true, + "lhs": "ik", + "mode": "x", + "rhs": "" + }, + { + "desc": "Value", + "noremap": true, + "lhs": "iv", + "mode": "x", + "rhs": "" + }, + { + "desc": "Number", + "noremap": true, + "lhs": "iN", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "j", + "mode": "x", + "rhs": "v:count == 0 ? 'gj' : 'j'" + }, + { + "desc": "", + "noremap": true, + "lhs": "j", + "mode": "n", + "rhs": "v:count == 0 ? 'gj' : 'j'" + }, + { + "desc": "", + "noremap": true, + "lhs": "k", + "mode": "x", + "rhs": "v:count == 0 ? 'gk' : 'k'" + }, + { + "desc": "", + "noremap": true, + "lhs": "k", + "mode": "n", + "rhs": "v:count == 0 ? 'gk' : 'k'" + }, + { + "desc": "Next Search Result", + "noremap": true, + "lhs": "n", + "mode": "x", + "rhs": "'Nn'[v:searchforward]" + }, + { "desc": "", "noremap": true, "lhs": "n", "mode": "n", "rhs": "nzzzv" }, + { + "desc": "", + "noremap": true, + "lhs": "o", + "mode": "n", + "rhs": "" + }, + { + "desc": "Paste Without Overwriting", + "noremap": true, + "lhs": "p", + "mode": "v", + "rhs": "\"_dP" + }, + { + "desc": "Put Yanked Text After Cursor", + "noremap": true, + "lhs": "p", + "mode": "n", + "rhs": "" + }, + { + "desc": " Start/Stop Recording", + "noremap": true, + "lhs": "q", + "mode": "n", + "rhs": "" + }, + { + "desc": "Flash", + "noremap": true, + "lhs": "s", + "mode": "x", + "rhs": "" + }, + { + "desc": "Flash", + "noremap": true, + "lhs": "s", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "t", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "t", + "mode": "n", + "rhs": "" + }, + { "desc": "", "noremap": true, "lhs": "viÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "vaÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "vÞ", "mode": "n", "rhs": "" }, + { + "desc": "", + "noremap": true, + "lhs": "v", + "mode": "n", + "rhs": "lua require(\"which-key\").show(\"v\", {mode = \"n\", auto = true})" + }, + { + "desc": " Yank Macro", + "noremap": true, + "lhs": "yq", + "mode": "n", + "rhs": "" + }, + { "desc": "", "noremap": true, "lhs": "yiÞ", "mode": "n", "rhs": "" }, + { + "desc": "", + "noremap": true, + "lhs": "yi", + "mode": "n", + "rhs": "lua require(\"which-key\").show(\"yi\", {mode = \"n\", auto = true})" + }, + { "desc": "", "noremap": true, "lhs": "yaÞ", "mode": "n", "rhs": "" }, + { + "desc": "", + "noremap": true, + "lhs": "ya", + "mode": "n", + "rhs": "lua require(\"which-key\").show(\"ya\", {mode = \"n\", auto = true})" + }, + { + "desc": "Yank Text", + "noremap": true, + "lhs": "y", + "mode": "x", + "rhs": "" + }, + { + "desc": "Yank Text", + "noremap": true, + "lhs": "y", + "mode": "n", + "rhs": "" + }, + { "desc": "", "noremap": true, "lhs": "zÞ", "mode": "x", "rhs": "" }, + { + "desc": "", + "noremap": true, + "lhs": "z", + "mode": "x", + "rhs": "lua require(\"which-key\").show(\"z\", {mode = \"v\", auto = true})" + }, + { "desc": "", "noremap": true, "lhs": "zfiÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "zfaÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "zfÞ", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "zÞ", "mode": "n", "rhs": "" }, + { + "desc": "", + "noremap": true, + "lhs": "z", + "mode": "n", + "rhs": "lua require(\"which-key\").show(\"z\", {mode = \"n\", auto = true})" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "x", + "rhs": "" + }, + { + "desc": "Move to previous reference", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Move to next reference", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Breakpoint Condition", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Debug: Step out", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Debug: Step into", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Debug: Step over", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Debug: Continue", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Breakpoint", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "PBToggleBreakpoint" + }, + { + "desc": "Change Without Yanking", + "noremap": true, + "lhs": "", + "mode": "x", + "rhs": "\"_c" + }, + { + "desc": "Change Without Yanking", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "\"_c" + }, + { + "desc": "Delete Without Yanking", + "noremap": true, + "lhs": "", + "mode": "x", + "rhs": "\"_d" + }, + { + "desc": "Delete Without Yanking", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "\"_d" + }, + { + "desc": "Select all Text", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "ggVG" + }, + { + "desc": "Copy Whole Text to Clipboard", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": ":%y+" + }, + { + "desc": "Previous Tab", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "tabprevious" + }, + { + "desc": "Save Without Formatting", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "noautocmd w" + }, + { + "desc": "which_key_ignore", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Terminal (Root Dir)", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Save File", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "w" + }, + { + "desc": "Save File", + "noremap": true, + "lhs": "", + "mode": "x", + "rhs": "w" + }, + { + "desc": "Increase Window Width", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "vertical resize +2" + }, + { + "desc": "Decrease Window Width", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "vertical resize -2" + }, + { + "desc": "Decrease Window Height", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "resize -2" + }, + { + "desc": "Increase Window Height", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "resize +2" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "x", + "rhs": "v:count == 0 ? 'gk' : 'k'" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "v:count == 0 ? 'gk' : 'k'" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "x", + "rhs": "v:count == 0 ? 'gj' : 'j'" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "v:count == 0 ? 'gj' : 'j'" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "x", + "rhs": "lua Scroll('', 1, 1)" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "lua Scroll('', 1, 1)" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "x", + "rhs": "lua Scroll('', 1, 1)" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "lua Scroll('', 1, 1)" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "x", + "rhs": "lua Scroll('', 1, 1)" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "x", + "rhs": "lua Scroll('', 1, 1)" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "x", + "rhs": "lua Scroll('', 1, 1)" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "lua Scroll('', 1, 1)" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "x", + "rhs": "lua Scroll('', 1, 1)" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "lua Scroll('', 1, 1)" + }, + { + "desc": "Prev Mark", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "Grapple cycle backward" + }, + { + "desc": "Next Mark", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "Grapple cycle forward" + }, + { + "desc": "Move Up", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "m .-2==" + }, + { + "desc": "Move Down", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "m .+1==" + }, + { + "desc": "Last Character of Line", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "$" + }, + { + "desc": "First Character of Line", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "_" + }, + { + "desc": "Move Up", + "noremap": true, + "lhs": "", + "mode": "v", + "rhs": ":m '-2gv=gv" + }, + { + "desc": "Move Down", + "noremap": true, + "lhs": "", + "mode": "v", + "rhs": ":m '>+1gv=gv" + }, + { + "desc": "Move right", + "noremap": true, + "lhs": "", + "mode": "x", + "rhs": "lua MiniMove.move_selection('right')" + }, + { + "desc": "Move left", + "noremap": true, + "lhs": "", + "mode": "x", + "rhs": "lua MiniMove.move_selection('left')" + }, + { + "desc": "Scroll Forward", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Scroll Backward", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": " Switch Macro Slot", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "Þ", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "lua require(\"which-key\").show(\"\\23\", {mode = \"n\", auto = true})" + }, + { + "desc": "", + "noremap": true, + "lhs": "Þ", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "x", + "rhs": "lua require(\"which-key\").show(\"\\18\", {mode = \"v\", auto = true})" + }, + { + "desc": "Terminals", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Redo Compiler", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Open Compiler", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Compiler Results", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Convert color", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Yazi", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Terminal", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Increment", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Decrement", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Decrement", + "noremap": true, + "lhs": "", + "mode": "v", + "rhs": "" + }, + { + "desc": "Increment", + "noremap": true, + "lhs": "", + "mode": "v", + "rhs": "" + }, + { + "desc": "Resize Down", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Resize Left", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Move Cursor Up", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Move Cursor Down", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Move Cursor Left", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Resize Right", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Resize Up", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Open a floating window showing diagnostics under the cursor", + "noremap": false, + "lhs": "", + "mode": "n", + "rhs": "d" + }, + { + "desc": "Open a floating window showing diagnostics under the cursor", + "noremap": true, + "lhs": "d", + "mode": "n", + "rhs": "" + }, + { + "desc": "vim.lsp.buf.code_action()", + "noremap": true, + "lhs": "", + "mode": "x", + "rhs": "" + }, + { + "desc": "vim.lsp.buf.code_action()", + "noremap": true, + "lhs": "r", + "mode": "x", + "rhs": "" + }, + { + "desc": "Move Cursor Right", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + } + ], + "treesitterParsers": [ + "bash", + "c", + "css", + "diff", + "fish", + "git_config", + "html", + "hyprlang", + "javascript", + "jsdoc", + "json", + "json5", + "jsonc", + "lua", + "luadoc", + "luap", + "markdown", + "markdown_inline", + "ninja", + "python", + "query", + "rasi", + "regex", + "requirements", + "ron", + "rst", + "rust", + "scss", + "toml", + "tsx", + "typescript", + "vim", + "vimdoc", + "xml", + "yaml" + ], + "pluginManager": "lazy.nvim", + "leaderKey": "", + "lspServers": [ + "basedpyright", + "bashls", + "biome", + "css_variables", + "cssls", + "cssmodules_ls", + "denols", + "emmet_language_server", + "eslint", + "html", + "jsonls", + "lua_ls", + "marksman", + "ruff", + "tailwindcss", + "taplo", + "tsserver", + "volar", + "yamlls" + ] +} + diff --git a/nvim/init.lua b/nvim/init.lua new file mode 100644 index 0000000..2514f9e --- /dev/null +++ b/nvim/init.lua @@ -0,0 +1,2 @@ +-- bootstrap lazy.nvim, LazyVim and your plugins +require("config.lazy") diff --git a/nvim/lazy-lock.json b/nvim/lazy-lock.json new file mode 100644 index 0000000..d8deb53 --- /dev/null +++ b/nvim/lazy-lock.json @@ -0,0 +1,57 @@ +{ + "LazyVim": { "branch": "main", "commit": "25abbf546d564dc484cf903804661ba12de45507" }, + "SchemaStore.nvim": { "branch": "main", "commit": "c957914d75b4a008ce09f4116e57e59fe6e3fae1" }, + "autolist.nvim": { "branch": "main", "commit": "5f70a5f99e96c8fe3069de042abd2a8ed2deb855" }, + "blink.cmp": { "branch": "main", "commit": "586ee87534f5bf65f1c8dea2d1da2a57e8cddd36" }, + "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" }, + "catppuccin": { "branch": "main", "commit": "fa42eb5e26819ef58884257d5ae95dd0552b9a66" }, + "conform.nvim": { "branch": "master", "commit": "973f3cb73887d510321653044791d7937c7ec0fa" }, + "dial.nvim": { "branch": "master", "commit": "78bd73aaf2b9c8f80715a878feaf56f7ffa8b6ff" }, + "diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" }, + "edgy.nvim": { "branch": "main", "commit": "7e8dedc39abebe40c289b8012cc89b11c69aa7a0" }, + "flash.nvim": { "branch": "main", "commit": "3c942666f115e2811e959eabbdd361a025db8b63" }, + "friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" }, + "gitsigns.nvim": { "branch": "main", "commit": "0cb5a7753d3c4b8e9cfdc9d88d9110cb8d4b1544" }, + "grapple.nvim": { "branch": "main", "commit": "b41ddfc1c39f87f3d1799b99c2f0f1daa524c5f7" }, + "grug-far.nvim": { "branch": "main", "commit": "45981a9af7f4e666a3cdaedb1d21d2ab926727a2" }, + "lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" }, + "lazydev.nvim": { "branch": "main", "commit": "2367a6c0a01eb9edb0464731cc0fb61ed9ab9d2c" }, + "lualine.nvim": { "branch": "master", "commit": "a94fc68960665e54408fe37dcf573193c4ce82c9" }, + "markdown-preview.nvim": { "branch": "master", "commit": "a923f5fc5ba36a3b17e289dc35dc17f66d0548ee" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "1a31f824b9cd5bc6f342fc29e9a53b60d74af245" }, + "mason.nvim": { "branch": "main", "commit": "fc98833b6da5de5a9c5b1446ac541577059555be" }, + "mini.ai": { "branch": "main", "commit": "6a8e0b151d39b293cfa483cdea785e448c2e0e11" }, + "mini.icons": { "branch": "main", "commit": "94848dad1589a199f876539bd79befb0c5e3abf0" }, + "mini.pairs": { "branch": "main", "commit": "42407ccb80ec59c84e7c91d815f42ed90a8cc093" }, + "mini.surround": { "branch": "main", "commit": "d510a830e81a1b436e821c9a038eefb314b58b5d" }, + "neo-tree.nvim": { "branch": "main", "commit": "8c6349bceb1d8a863964dd25dc7944d588a56aaa" }, + "noice.nvim": { "branch": "main", "commit": "0427460c2d7f673ad60eb02b35f5e9926cf67c59" }, + "nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" }, + "nvim-highlight-colors": { "branch": "main", "commit": "b42a5ccec7457b44e89f7ed3b3afb1b375bb2093" }, + "nvim-jqx": { "branch": "master", "commit": "07393e80fa8097e82f9038fec05e948fe8a60fd1" }, + "nvim-lint": { "branch": "master", "commit": "3c5e34c24834a67b1cb37600ab7663eefd2b0390" }, + "nvim-lspconfig": { "branch": "master", "commit": "dbfd8da6206b4ab0e2fe9b72a538f82e2b410102" }, + "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, + "nvim-treesitter-textobjects": { "branch": "master", "commit": "89ebe73cd2836db80a22d9748999ace0241917a5" }, + "nvim-ts-autotag": { "branch": "main", "commit": "a1d526af391f6aebb25a8795cbc05351ed3620b5" }, + "nvim_context_vt": { "branch": "master", "commit": "4ee3f8fe1b3aacacd31eaf77378dffcad0ff9465" }, + "persistence.nvim": { "branch": "main", "commit": "166a79a55bfa7a4db3e26fc031b4d92af71d0b51" }, + "plenary.nvim": { "branch": "master", "commit": "857c5ac632080dba10aae49dba902ce3abf91b35" }, + "py-requirements.nvim": { "branch": "main", "commit": "b30abd4a879c06669bf744630f81627d4cdec6a9" }, + "refactoring.nvim": { "branch": "master", "commit": "74b608dfee827c2372250519d433cc21cb083407" }, + "render-markdown.nvim": { "branch": "main", "commit": "12d951dfe3c884063e874bdfc0b4c86e0843237c" }, + "smart-splits.nvim": { "branch": "master", "commit": "c2744fd80d4735134f96f50acaccc4fa9f48d6cb" }, + "snacks.nvim": { "branch": "main", "commit": "bc0630e43be5699bb94dadc302c0d21615421d93" }, + "suda.vim": { "branch": "master", "commit": "9adda7d195222d4e2854efb2a88005a120296c47" }, + "todo-comments.nvim": { "branch": "main", "commit": "304a8d204ee787d2544d8bc23cd38d2f929e7cc5" }, + "tokyonight.nvim": { "branch": "main", "commit": "057ef5d260c1931f1dffd0f052c685dcd14100a3" }, + "trouble.nvim": { "branch": "main", "commit": "85bedb7eb7fa331a2ccbecb9202d8abba64d37b3" }, + "ts-comments.nvim": { "branch": "main", "commit": "1bd9d0ba1d8b336c3db50692ffd0955fe1bb9f0c" }, + "ts-error-translator.nvim": { "branch": "main", "commit": "47e5ba89f71b9e6c72eaaaaa519dd59bd6897df4" }, + "ts-node-action": { "branch": "master", "commit": "b0850ecd82a508ad846ba250ea13485b0e13321e" }, + "tsc.nvim": { "branch": "main", "commit": "8c1b4ec6a48d038a79ced8674cb15e7db6dd8ef0" }, + "vim-wakatime": { "branch": "master", "commit": "f39c4a201ae350aaba713b59d4a4fdd88e0811aa" }, + "which-key.nvim": { "branch": "main", "commit": "370ec46f710e058c9c1646273e6b225acf47cbed" }, + "yanky.nvim": { "branch": "main", "commit": "04775cc6e10ef038c397c407bc17f00a2f52b378" }, + "yazi.nvim": { "branch": "main", "commit": "d293ec2611356e98d59f03bc3da191c9da23afde" } +} diff --git a/nvim/lazyvim.json b/nvim/lazyvim.json new file mode 100644 index 0000000..ced54f7 --- /dev/null +++ b/nvim/lazyvim.json @@ -0,0 +1,43 @@ +{ + "extras": [ + "lazyvim.plugins.extras.coding.mini-surround", + "lazyvim.plugins.extras.editor.dial", + "lazyvim.plugins.extras.editor.refactoring", + "lazyvim.plugins.extras.util.dot", + "plugins.extras.coding.blink-extended", + "plugins.extras.coding.treesitter.node-action", + "plugins.extras.coding.yanky-extended", + "plugins.extras.editor.flash-extended", + "plugins.extras.editor.git.diffview", + "plugins.extras.editor.gitsigns-extended", + "plugins.extras.editor.marks.grapple", + "plugins.extras.editor.suda", + "plugins.extras.editor.trouble-extended", + "plugins.extras.formatting.prettier-extended", + "plugins.extras.lang.markdown-extended", + "plugins.extras.lang.python-extended", + "plugins.extras.lang.web.html-css", + "plugins.extras.lang.web.typescript-extended", + "plugins.extras.linting.eslint-extended", + "plugins.extras.lsp.lspconfig-extended", + "plugins.extras.lsp.mason-extended", + "plugins.extras.ui.bufferline-extended", + "plugins.extras.ui.colorschemes.catppuccin", + "plugins.extras.ui.context", + "plugins.extras.ui.edgy-extended", + "plugins.extras.ui.highlight-colors", + "plugins.extras.ui.lualine-extended", + "plugins.extras.ui.noice-extended", + "plugins.extras.ui.which-key-extended", + "plugins.extras.util.persistence-extended", + "plugins.extras.util.smart-splits", + "plugins.extras.util.snacks-extended", + "plugins.extras.util.wakatime", + "plugins.extras.util.yazi" + ], + "install_version": 7, + "news": { + "NEWS.md": "10960" + }, + "version": 8 +} \ No newline at end of file diff --git a/nvim/lua/config/autocmds.lua b/nvim/lua/config/autocmds.lua new file mode 100644 index 0000000..46c54db --- /dev/null +++ b/nvim/lua/config/autocmds.lua @@ -0,0 +1,127 @@ +local ac = vim.api.nvim_create_autocmd +local ag = vim.api.nvim_create_augroup + +-- Disable diagnostics in a .env file +ac("BufRead", { + pattern = ".env", + callback = function() + vim.diagnostic.disable(false) + end, +}) + +local auto_close_filetype = { + "lazy", + "mason", + "lspinfo", + "toggleterm", + "null-ls-info", + "TelescopePrompt", + "notify", +} + +-- Auto close window when leaving +ac("BufLeave", { + group = ag("lazyvim_auto_close_win", { clear = true }), + callback = function(event) + local ft = vim.api.nvim_buf_get_option(event.buf, "filetype") + + if vim.fn.index(auto_close_filetype, ft) ~= -1 then + local winids = vim.fn.win_findbuf(event.buf) + for _, win in pairs(winids) do + vim.api.nvim_win_close(win, true) + end + end + end, +}) + +-- Disable leader and localleader for some filetypes +ac("FileType", { + group = ag("lazyvim_unbind_leader_key", { clear = true }), + pattern = { + "lazy", + "mason", + "lspinfo", + "toggleterm", + "null-ls-info", + "neo-tree-popup", + "TelescopePrompt", + "notify", + "floaterm", + }, + callback = function(event) + vim.keymap.set("n", "", "", { buffer = event.buf, desc = "" }) + vim.keymap.set("n", "", "", { buffer = event.buf, desc = "" }) + end, +}) + +-- Delete number column on terminals +ac("TermOpen", { + callback = function() + vim.cmd("setlocal listchars= nonumber norelativenumber") + vim.cmd("setlocal nospell") + end, +}) + +-- Disable next line comments +ac("BufEnter", { + callback = function() + vim.cmd("set formatoptions-=cro") + vim.cmd("setlocal formatoptions-=cro") + end, +}) + +-- Disable eslint on node_modules +ac({ "BufNewFile", "BufRead" }, { + group = ag("DisableEslintOnNodeModules", { clear = true }), + pattern = { "**/node_modules/**", "node_modules", "/node_modules/*" }, + callback = function() + vim.diagnostic.disable(false) + end, +}) + +-- Toggle between relative/absolute line numbers +local numbertoggle = ag("numbertoggle", { clear = true }) +ac({ "BufEnter", "FocusGained", "InsertLeave", "CmdlineLeave", "WinEnter" }, { + pattern = "*", + group = numbertoggle, + callback = function() + if vim.o.nu and vim.api.nvim_get_mode().mode ~= "i" then + vim.opt.relativenumber = true + end + end, +}) + +ac({ "BufLeave", "FocusLost", "InsertEnter", "CmdlineEnter", "WinLeave" }, { + pattern = "*", + group = numbertoggle, + callback = function() + if vim.o.nu then + vim.opt.relativenumber = false + vim.cmd.redraw() + end + end, +}) + +-- Create a dir when saving a file if it doesnt exist +ac("BufWritePre", { + group = ag("auto_create_dir", { clear = true }), + callback = function(args) + if args.match:match("^%w%w+://") then + return + end + local file = vim.uv.fs_realpath(args.match) or args.match + vim.fn.mkdir(vim.fn.fnamemodify(file, ":p:h"), "p") + end, +}) + +-- Toggle lazygit instead of closing +ac("TermOpen", { + pattern = "*", + callback = function() + local term_title = vim.b.term_title + if term_title and term_title:match("lazygit") then + -- Create lazygit specific mappings + vim.keymap.set("t", "q", "close", { buffer = true }) + end + end, +}) diff --git a/nvim/lua/config/keymaps.lua b/nvim/lua/config/keymaps.lua new file mode 100644 index 0000000..70031fa --- /dev/null +++ b/nvim/lua/config/keymaps.lua @@ -0,0 +1,248 @@ +local map = vim.keymap.set +local o = vim.opt + +local lazy = require("lazy") + +-- Search current word +local searching_brave = function() + vim.fn.system({ "xdg-open", "https://search.brave.com/search?q=" .. vim.fn.expand("") }) +end +map("n", "?", searching_brave, { noremap = true, silent = true, desc = "Search Current Word on Brave Search" }) + +-- Lazy options +map("n", "l", "") +map("n", "ll", "Lazy", { desc = "Lazy" }) +-- stylua: ignore start +map("n", "ld", function() vim.fn.system({ "xdg-open", "https://lazyvim.org" }) end, { desc = "LazyVim Docs" }) +map("n", "lr", function() vim.fn.system({ "xdg-open", "https://github.com/LazyVim/LazyVim" }) end, { desc = "LazyVim Repo" }) +map("n", "lx", "LazyExtras", { desc = "Extras" }) +map("n", "lc", function() LazyVim.news.changelog() end, { desc = "LazyVim Changelog" }) + +map("n", "lu", function() lazy.update() end, { desc = "Lazy Update" }) +map("n", "lC", function() lazy.check() end, { desc = "Lazy Check" }) +map("n", "ls", function() lazy.sync() end, { desc = "Lazy Sync" }) +-- stylua: ignore end + +-- Disable LazyVim bindings +map("n", "L", "") +map("n", "fT", "") + +-- Identation +map("n", "<", "<<", { desc = "Deindent" }) +map("n", ">", ">>", { desc = "Indent" }) + +-- Save without formatting +map("n", "", "noautocmd w", { desc = "Save Without Formatting" }) + +-- Cursor navigation on insert mode +map("i", "", "", { desc = "Move Cursor Left" }) +map("i", "", "", { desc = "Move Cursor Left" }) +map("i", "", "", { desc = "Move Cursor Left" }) +map("i", "", "", { desc = "Move Cursor Left" }) + +-- End of the word backwards +map("n", "E", "ge") + +-- Increment/decrement +map("n", "+", "") +map("n", "-", "") + +-- Tabs +map("n", "]", "tabnext", { desc = "Next Tab" }) +map("n", "[", "tabprevious", { desc = "Previous Tab" }) +map("n", "", "tabnext", { desc = "Next Tab" }) +map("n", "", "tabprevious", { desc = "Previous Tab" }) +for i = 1, 9 do + map("n", "" .. i, "tabn " .. i .. "", { desc = "Tab " .. i }) +end +map("n", "f", function() + vim.ui.select(vim.api.nvim_list_tabpages(), { + prompt = "Select Tab:", + format_item = function(tabid) + local wins = vim.api.nvim_tabpage_list_wins(tabid) + local not_floating_win = function(winid) + return vim.api.nvim_win_get_config(winid).relative == "" + end + wins = vim.tbl_filter(not_floating_win, wins) + local bufs = {} + for _, win in ipairs(wins) do + local buf = vim.api.nvim_win_get_buf(win) + local buftype = vim.api.nvim_get_option_value("buftype", { buf = buf }) + if buftype ~= "nofile" then + local fname = vim.api.nvim_buf_get_name(buf) + table.insert(bufs, vim.fn.fnamemodify(fname, ":t")) + end + end + local tabnr = vim.api.nvim_tabpage_get_number(tabid) + local cwd = string.format(" %8s: ", vim.fn.fnamemodify(vim.fn.getcwd(-1, tabnr), ":t")) + local is_current = vim.api.nvim_tabpage_get_number(0) == tabnr and "✸" or " " + return tabnr .. is_current .. cwd .. table.concat(bufs, ", ") + end, + }, function(tabid) + if tabid ~= nil then + vim.cmd(tabid .. "tabnext") + end + end) +end, { desc = "Tabs" }) + +-- Buffers +map("n", "bf", "bfirst", { desc = "First Buffer" }) +map("n", "ba", "blast", { desc = "Last Buffer" }) +map("n", "b", "tabnew %", { desc = "Current Buffer in New Tab" }) + +-- Toggle statusline +map("n", "uS", function() + if o.laststatus:get() == 0 then + o.laststatus = 3 + else + o.laststatus = 0 + end +end, { desc = "Toggle Statusline" }) + +-- Comment box +map("n", "]/", "/\\S\\zs\\s*╭zt", { desc = "Next Block Comment" }) +map("n", "[/", "?\\S\\zs\\s*╭zt", { desc = "Prev Block Comment" }) + +-- Plugin Info +map("n", "cif", "LazyFormatInfo", { desc = "Formatting" }) +map("n", "cic", "ConformInfo", { desc = "Conform" }) +local linters = function() + local linters_attached = require("lint").linters_by_ft[vim.bo.filetype] + local buf_linters = {} + + if not linters_attached then + LazyVim.warn("No linters attached", { title = "Linter" }) + return + end + + for _, linter in pairs(linters_attached) do + table.insert(buf_linters, linter) + end + + local unique_client_names = table.concat(buf_linters, ", ") + local linters = string.format("%s", unique_client_names) + + LazyVim.notify(linters, { title = "Linter" }) +end +map("n", "ciL", linters, { desc = "Lint" }) +map("n", "cir", "LazyRoot", { desc = "Root" }) + +-- U for redo +map("n", "U", "", { desc = "Redo" }) + +-- Copy whole text to clipboard +map("n", "", ":%y+", { desc = "Copy Whole Text to Clipboard", silent = true }) + +-- Motion +map("c", "", "", { desc = "Start Of Line" }) +map("i", "", "", { desc = "Start Of Line" }) +map("i", "", "", { desc = "End Of Line" }) + +-- Select all text +map("n", "", "ggG", { desc = "Select all Text", silent = true, noremap = true }) + +-- Paste options +map("i", "", '"', { desc = "Paste on Insert Mode" }) +map("v", "p", '"_dP', { desc = "Paste Without Overwriting" }) + +-- Delete and change without yanking +map({ "n", "x" }, "", '"_d', { desc = "Delete Without Yanking" }) +map({ "n", "x" }, "", '"_c', { desc = "Change Without Yanking" }) + +-- Deleting without yanking empty line +map("n", "dd", function() + local is_empty_line = vim.api.nvim_get_current_line():match("^%s*$") + if is_empty_line then + return '"_dd' + else + return "dd" + end +end, { noremap = true, expr = true, desc = "Don't Yank Empty Line to Clipboard" }) + +-- Search inside visually highlighted text +map("x", "g/", "/\\%V", { silent = false, desc = "Search Inside Visual Selection" }) + +-- Search visually selected text (slightly better than builtins in Neovim>=0.8) +map("x", "*", [[y/\V=escape(@", '/\')]], { desc = "Search Selected Text", silent = true }) +map("x", "#", [[y?\V=escape(@", '?\')]], { desc = "Search Selected Text (Backwards)", silent = true }) + +-- Dashboard +map("n", "fd", function() + if LazyVim.has("snacks.nvim") then + Snacks.dashboard() + elseif LazyVim.has("alpha-nvim") then + require("alpha").start(true) + elseif LazyVim.has("dashboard-nvim") then + vim.cmd("Dashboard") + end +end, { desc = "Dashboard" }) + +-- Spelling +map("n", "!", "zg", { desc = "Add Word to Dictionary" }) +map("n", "@", "zug", { desc = "Remove Word from Dictionary" }) + +-- Terminal Stuff +if not LazyVim.has("floaterm.nvim") or not LazyVim.has("toggleterm.nvim") then + local lazyterm = function() + Snacks.terminal(nil, { size = { width = 0.8, height = 0.8 }, cwd = LazyVim.root() }) + end + map("n", "ft", lazyterm, { desc = "Terminal (Root Dir)" }) + map("n", "fT", function() + Snacks.terminal(nil, { size = { width = 0.8, height = 0.8 }, cwd = vim.fn.getcwd() }) + end, { desc = "Terminal (cwd)" }) + map("n", [[]], lazyterm, { desc = "Terminal (Root Dir)" }) + map("t", [[]], "close", { desc = "Hide Terminal" }) +end + +-- Marks +map("n", "dm", function() + local cur_line = vim.fn.line(".") + -- Delete buffer local mark + for _, mark in ipairs(vim.fn.getmarklist("%")) do + if mark.pos[2] == cur_line and mark.mark:match("[a-zA-Z]") then + vim.api.nvim_buf_del_mark(0, string.sub(mark.mark, 2, #mark.mark)) + return + end + end + -- Delete global marks + local cur_buf = vim.api.nvim_win_get_buf(vim.api.nvim_get_current_win()) + for _, mark in ipairs(vim.fn.getmarklist()) do + if mark.pos[1] == cur_buf and mark.pos[2] == cur_line and mark.mark:match("[a-zA-Z]") then + vim.api.nvim_buf_del_mark(0, string.sub(mark.mark, 2, #mark.mark)) + return + end + end +end, { noremap = true, desc = "Mark on Current Line" }) + +-- Empty Line +map("n", "gO", "call append(line('.') - 1, repeat([''], v:count1))", { desc = "Empty Line Above" }) +map("n", "go", "call append(line('.'), repeat([''], v:count1))", { desc = "Empty Line Below" }) + +-- Insert Mode +map({ "c", "i", "t" }, "", "", { desc = "Delete Word" }) + +-- Git +map("n", "ghb", Snacks.git.blame_line, { desc = "Blame Line" }) + +-- Windows Split +map("n", "_", "s", { desc = "Split Window Below", remap = true }) +map("n", "\\", "v", { desc = "Split Window Right", remap = true }) + +-- Center when scrolling +if Snacks.scroll.enabled then + map("n", "", function() + vim.wo.scrolloff = 999 + vim.defer_fn(function() + vim.wo.scrolloff = 8 + end, 500) + return "" + end, { expr = true }) + + map("n", "", function() + vim.wo.scrolloff = 999 + vim.defer_fn(function() + vim.wo.scrolloff = 8 + end, 500) + return "" + end, { expr = true }) +end diff --git a/nvim/lua/config/lazy.lua b/nvim/lua/config/lazy.lua new file mode 100644 index 0000000..1f9f43a --- /dev/null +++ b/nvim/lua/config/lazy.lua @@ -0,0 +1,50 @@ +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not vim.uv.fs_stat(lazypath) then + -- bootstrap lazy.nvim + -- stylua: ignore + vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", "--branch=stable", + lazypath }) +end +vim.opt.rtp:prepend(vim.env.LAZY or lazypath) + +require("lazy").setup({ + spec = { + { + "LazyVim/LazyVim", + import = "lazyvim.plugins", + opts = { + colorscheme = "catppuccin", + }, + }, + { + import = "plugins", + }, + }, + ui = { + backdrop = 100, + }, + defaults = { + lazy = true, + version = false, -- always use the latest git commit + -- version = "*", -- try installing the latest stable version for plugins that support semver + }, + local_spec = true, + checker = { enabled = true }, -- automatically check for plugin updates + performance = { + cache = { + enabled = true, + -- disable_events = {}, + }, + rtp = { + -- disable some rtp plugins + disabled_plugins = { + "gzip", + "tarPlugin", + "tohtml", + "tutor", + "netrwPlugin", + "zipPlugin", + }, + }, + }, +}) diff --git a/nvim/lua/config/options.lua b/nvim/lua/config/options.lua new file mode 100644 index 0000000..dc208ae --- /dev/null +++ b/nvim/lua/config/options.lua @@ -0,0 +1,54 @@ +local go = vim.g +local o = vim.opt + +-- Optimizations on startup +vim.loader.enable() + +-- Personal Config and LazyVim global options +go.lualine_info_extras = false +go.codeium_cmp_hide = false +go.lazygit_config = false +go.lazyvim_cmp = "blink" +go.lazyvim_picker = "snacks" + +-- Define leader key +go.mapleader = " " +go.maplocalleader = "\\" + +-- Autoformat on save (Global) +go.autoformat = true + +-- Font +go.gui_font_default_size = 10 +go.gui_font_size = go.gui_font_default_size +go.gui_font_face = "JetBrainsMono Nerd Font" + +-- Enable EditorConfig integration +go.editorconfig = true + +-- Root dir detection +go.root_spec = { + "lsp", + { ".git", "lua", ".obsidian", "package.json", "Makefile", "go.mod", "cargo.toml", "pyproject.toml", "src" }, + "cwd", +} + +-- Disable annoying cmd line stuff +o.showcmd = false +o.laststatus = 3 +o.cmdheight = 0 + +-- Enable spell checking +o.spell = true +o.spelllang:append("es") + +-- Backspacing and indentation when wrapping +o.backspace = { "start", "eol", "indent" } +o.breakindent = true + +-- Smoothscroll +if vim.fn.has("nvim-0.10") == 1 then + o.smoothscroll = true +end + +o.conceallevel = 2 diff --git a/nvim/lua/plugins/disabled.lua b/nvim/lua/plugins/disabled.lua new file mode 100644 index 0000000..1891935 --- /dev/null +++ b/nvim/lua/plugins/disabled.lua @@ -0,0 +1,20 @@ +-- Delete this condition if you want to execute the file +if true then + return {} +end + +-- Example of disabling some plugins. Add yours +local disabled = { + { + "akinsho/bufferline.nvim", + }, + { + "nvim-lualine/lualine.nvim", + }, +} + +for i, plugin in ipairs(disabled) do + plugin.enabled = false +end + +return disabled diff --git a/nvim/lua/plugins/extras/coding/ai/avante.lua b/nvim/lua/plugins/extras/coding/ai/avante.lua new file mode 100644 index 0000000..3211582 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/ai/avante.lua @@ -0,0 +1,20 @@ +return { + { + "yetone/avante.nvim", + event = "VeryLazy", + build = "make", + opts = { + openai = { + endpoint = "http://127.0.0.1:11434", + model = "deepseek-coder-v2", + temperature = 60, + max_tokens = 4096, + ["local"] = true, + }, + }, + dependencies = { + "MeanderingProgrammer/render-markdown.nvim", + ft = { "markdown", "norg", "rmd", "org", "Avante" }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/coding/ai/codecompanion.lua b/nvim/lua/plugins/extras/coding/ai/codecompanion.lua new file mode 100644 index 0000000..50268de --- /dev/null +++ b/nvim/lua/plugins/extras/coding/ai/codecompanion.lua @@ -0,0 +1,91 @@ +local prefix = "a" +local user = vim.env.USER or "User" + +vim.api.nvim_create_autocmd("User", { + pattern = "CodeCompanionChatAdapter", + callback = function(args) + if args.data.adapter == nil or vim.tbl_isempty(args.data) then + return + end + vim.g.llm_name = args.data.adapter.name + end, +}) + +return { + { + "olimorris/codecompanion.nvim", + cmd = { "CodeCompanion", "CodeCompanionActions", "CodeCompanionToggle", "CodeCompanionAdd", "CodeCompanionChat" }, + opts = { + adapters = { + deepseek_coder = function() + return require("codecompanion.adapters").extend("ollama", { + name = "deepseek_coder", + schema = { + model = { + default = "deepseek-coder-v2:latest", + }, + }, + }) + end, + deepseek_r1 = function() + return require("codecompanion.adapters").extend("ollama", { + name = "deepseek_r1", + schema = { + model = { + default = "deepseek-r1:14b", + }, + }, + }) + end, + }, + strategies = { + chat = { + adapter = "deepseek_r1", + roles = { + llm = " CodeCompanion", + user = " " .. user:sub(1, 1):upper() .. user:sub(2), + }, + keymaps = { + close = { modes = { n = "q", i = "" } }, + stop = { modes = { n = "" } }, + }, + }, + inline = { adapter = "deepseek_r1" }, + agent = { adapter = "deepseek_r1" }, + }, + display = { + chat = { + show_settings = true, + render_headers = false, + }, + }, + }, + keys = { + { prefix .. "a", "CodeCompanionActions", mode = { "n", "v" }, desc = "Action Palette" }, + { prefix .. "c", "CodeCompanionChat", mode = { "n", "v" }, desc = "New Chat" }, + { prefix .. "A", "CodeCompanionAdd", mode = "v", desc = "Add Code" }, + { prefix .. "i", "CodeCompanion", mode = "n", desc = "Inline Prompt" }, + { prefix .. "C", "CodeCompanionToggle", mode = "n", desc = "Toggle Chat" }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "ai", icon = "󱚦 ", mode = { "n", "v" } }, + }, + }, + }, + { + "folke/edgy.nvim", + optional = true, + opts = function(_, opts) + opts.right = opts.right or {} + table.insert(opts.right, { + ft = "codecompanion", + title = "CodeCompanion", + size = { width = 70 }, + }) + end, + }, +} diff --git a/nvim/lua/plugins/extras/coding/ai/codeium.lua b/nvim/lua/plugins/extras/coding/ai/codeium.lua new file mode 100644 index 0000000..41d4415 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/ai/codeium.lua @@ -0,0 +1,65 @@ +return { + { + "Exafunction/codeium.vim", + event = "InsertEnter", + config = function() + if vim.g.codeium_cmp_hide == true then + local cmp = require("cmp") + cmp.event:on("menu_opened", function() + vim.g.codeium_manual = true + vim.fn["codeium#Clear"]() + end) + cmp.event:on("menu_closed", function() + vim.g.codeium_manual = false + vim.fn["codeium#Complete"]() + end) + end + + vim.g.codeium_filetypes = { + TelescopePrompt = false, + DressingInput = false, + ["neo-tree-popup"] = false, + ["dap-repl"] = false, + ["snacks_picker_input"] = false, + } + + local opts = { expr = true, silent = true } + vim.g.codeium_disable_bindings = 1 + + vim.keymap.set("i", "", function() + return vim.fn["codeium#Accept"]() + end, opts) + + vim.keymap.set("n", "ch", function() + return vim.fn["codeium#Chat"]() + end, { desc = "Chat with IA (Codeium)" }) + + vim.keymap.set("i", "", function() + return vim.fn["codeium#CycleCompletions"](1) + end, opts) + + vim.keymap.set("i", "", function() + return vim.fn["codeium#CycleCompletions"](-1) + end, opts) + + vim.keymap.set("i", "", function() + return vim.fn["codeium#Clear"]() + end, opts) + + vim.keymap.set("n", "cI", "CodeiumToggle", { desc = "Toggle IA (Codeium)" }) + end, + }, + { + "nvim-lualine/lualine.nvim", + optional = true, + opts = function(_, opts) + local icon = require("lazyvim.config").icons.kinds.Codeium + local function show_codeium_status() + return icon .. vim.fn["codeium#GetStatusString"]() + end + + -- Insert the icon + table.insert(opts.sections.lualine_x, 2, show_codeium_status) + end, + }, +} diff --git a/nvim/lua/plugins/extras/coding/ai/copilot.lua b/nvim/lua/plugins/extras/coding/ai/copilot.lua new file mode 100644 index 0000000..cb2ae51 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/ai/copilot.lua @@ -0,0 +1,24 @@ +return { + { import = "lazyvim.plugins.extras.ai.copilot" }, + { + "zbirenbaum/copilot.lua", + event = "InsertEnter", + opts = { + suggestion = { + enabled = true, + auto_trigger = true, + keymap = { + accept = "", + accept_line = "", + accept_word = "", + next = "", + prev = "", + dismiss = "", + }, + }, + }, + keys = { + { "cI", "Copilot toggle", desc = "Toggle IA (Copilot)" }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/coding/ai/gen.lua b/nvim/lua/plugins/extras/coding/ai/gen.lua new file mode 100644 index 0000000..c429514 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/ai/gen.lua @@ -0,0 +1,65 @@ +local prefix = "a" + +return { + { + "jellydn/gen.nvim", + opts = { + model = "codellama", + host = "localhost", + port = "11434", + display_mode = "split", + show_prompt = true, + show_model = true, + no_auto_close = false, + init = function(options) + pcall(io.popen, "ollama serve > /dev/null 2>&1 &") + end, + command = function(options) + local body = { model = options.model, stream = true } + return "curl --silent --no-buffer -X POST http://" + .. options.host + .. ":" + .. options.port + .. "/api/generate -d $body" + end, + }, + config = function(_, opts) + local gen = require("gen") + gen.setup(opts) + + gen.prompts["Elaborate_Text"] = { + prompt = "Elaborate the following text:\n$text", + } + gen.prompts["Fix_Code"] = { + prompt = "Fix the following code. Only output the result in format ```$filetype\n...\n```:\n```$filetype\n$text\n```", + extract = "```$filetype\n(.-)```", + } + end, + keys = { + { prefix .. "i", "Gen", mode = { "n", "v" }, desc = "IA (Gen)" }, + { prefix .. "g", "Gen Generate", mode = { "n" }, desc = "Generate" }, + { prefix .. "c", "Gen Chat", mode = { "n" }, desc = "Chat" }, + { prefix .. "s", "Gen Summarize", mode = { "n", "v" }, desc = "Summarize" }, + { prefix .. "a", "Gen Ask", mode = { "v" }, desc = "Ask" }, + { prefix .. "H", "Gen Change", mode = { "v" }, desc = "Change" }, + { prefix .. "G", "Gen Enhance_Grammar_Spelling", mode = { "v" }, desc = "Enhance Grammar Spelling" }, + { prefix .. "w", "Gen Enhance_Wording", mode = { "v" }, desc = "Enhance Wording" }, + { prefix .. "C", "Gen Make_Concise", mode = { "v" }, desc = "Make Concise" }, + { prefix .. "l", "Gen Make_List", mode = { "v" }, desc = "Make List" }, + { prefix .. "t", "Gen Make_Table", mode = { "v" }, desc = "Make Table" }, + { prefix .. "r", "Gen Review_Code", mode = { "v" }, desc = "Review Code" }, + { prefix .. "e", "Gen Enhance_Code", mode = { "v" }, desc = "Enhance Code" }, + { prefix .. "h", "Gen Change_Code", mode = { "v" }, desc = "Change Code" }, + { prefix .. "f", "Gen Fix_Code", mode = { "v" }, desc = "Fix Code" }, + { prefix .. "E", "Gen Elaborate_Text", mode = { "v" }, desc = "Elaborate Text" }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "IA (Gen)", icon = "󱚦 " }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/coding/ai/gpt.lua b/nvim/lua/plugins/extras/coding/ai/gpt.lua new file mode 100644 index 0000000..cb74739 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/ai/gpt.lua @@ -0,0 +1,108 @@ +local prefix = "C" + +return { + { + "jackMort/ChatGPT.nvim", + dependencies = { + "MunifTanjim/nui.nvim", + "nvim-lua/plenary.nvim", + "nvim-telescope/telescope.nvim", + }, + cond = function() + local api_key = os.getenv("OPENAI_API_KEY") + return api_key and api_key ~= "" and true or false + end, + opts = { + edit_with_instructions = { + diff = false, + keymaps = { + close = "", + accept = "", + toggle_diff = "", + toggle_settings = "", + cycle_windows = "", + use_output_as_input = "", + }, + }, + chat = { + welcome_message = "", + keymaps = { + close = { "" }, + yank_last = "", + yank_last_code = "", + scroll_up = "", + scroll_down = "", + new_session = "", + cycle_windows = "", + cycle_modes = "", + next_message = "", + prev_message = "", + select_session = { "", "o", "" }, + rename_session = "r", + delete_session = "d", + draft_message = "", + edit_message = "e", + delete_message = "d", + toggle_settings = "", + toggle_message_role = "", + toggle_system_role_open = "", + stop_generating = "", + }, + }, + openai_params = { + model = "gpt-3.5-turbo-16k", + -- model = "gpt-4", + frequency_penalty = 0, + presence_penalty = 0, + max_tokens = 300, + temperature = 0.3, + top_p = 0.3, + n = 1, + -- temperature = 0, + -- top_p = 1, + }, + openai_edit_params = { + model = "gpt-3.5-turbo-16k", + -- model = "gpt-4", + frequency_penalty = 0, + presence_penalty = 0, + temperature = 0, + top_p = 1, + n = 1, + }, + show_quickfixes_cmd = "Trouble quickfix", + -- actions_paths = { "~/.config/nvim/custom_actions.json" }, + }, + cmd = { + "ChatGPT", + "ChatGPTActAs", + "ChatGPTCompleteCode", + "ChatGPTEditWithInstructions", + "ChatGPTRun", + }, + -- stylua: ignore + keys = { + { prefix .. "c", "ChatGPT", desc = "ChatGPT" }, + { prefix .. "e", "ChatGPTEditWithInstruction", desc = "Edit With Instruction", mode = { "n", "v" } }, + { prefix .. "g", "ChatGPTRun grammar_correction", desc = "Grammar Correction", mode = { "n", "v" } }, + { prefix .. "t", "ChatGPTRun translate", desc = "Translate", mode = { "n", "v" } }, + { prefix .. "k", "ChatGPTRun keywords", desc = "Keywords", mode = { "n", "v" } }, + { prefix .. "d", "ChatGPTRun docstring", desc = "Docstring", mode = { "n", "v" } }, + { prefix .. "T", "ChatGPTRun add_tests", desc = "Add Tests", mode = { "n", "v" } }, + { prefix .. "o", "ChatGPTRun optimize_code", desc = "Optimize Code", mode = { "n", "v" } }, + { prefix .. "s", "ChatGPTRun summarize", desc = "Summarize", mode = { "n", "v" } }, + { prefix .. "f", "ChatGPTRun fix_bugs", desc = "Fix Bugs", mode = { "n", "v" } }, + { prefix .. "x", "ChatGPTRun explain_code", desc = "Explain Code", mode = { "n", "v" } }, + { prefix .. "r", "ChatGPTRun roxygen_edit", desc = "Roxygen Edit", mode = { "n", "v" } }, + { prefix .. "l", "ChatGPTRun code_readability_analysis", desc = "Code Readability Analysis", mode = { "n", "v" }, }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "chatGPT", icon = "󰚩 " }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/coding/ai/neocodeium.lua b/nvim/lua/plugins/extras/coding/ai/neocodeium.lua new file mode 100644 index 0000000..76c2c56 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/ai/neocodeium.lua @@ -0,0 +1,40 @@ +return { + "monkoose/neocodeium", + event = "InsertEnter", + config = function() + local neocodeium = require("neocodeium") + neocodeium.setup() + + local commands = require("neocodeium.commands") + if vim.g.codeium_cmp_hide == true then + local cmp = require("cmp") + cmp.event:on("menu_opened", function() + commands.disable() + neocodeium.clear() + end) + + cmp.event:on("menu_closed", function() + commands.enable() + end) + end + + vim.keymap.set("i", "", function() + require("neocodeium").accept() + end) + vim.keymap.set("i", "", function() + require("neocodeium").accept_word() + end) + vim.keymap.set("i", "", function() + require("neocodeium").accept_line() + end) + vim.keymap.set("i", "", function() + require("neocodeium").cycle_or_complete() + end) + vim.keymap.set("i", "", function() + require("neocodeium").cycle_or_complete(-1) + end) + vim.keymap.set("i", "", function() + require("neocodeium").clear() + end) + end, +} diff --git a/nvim/lua/plugins/extras/coding/annotation.lua b/nvim/lua/plugins/extras/coding/annotation.lua new file mode 100644 index 0000000..70f0771 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/annotation.lua @@ -0,0 +1,35 @@ +local prefix = "A" + +return { + { import = "lazyvim.plugins.extras.coding.neogen" }, + { + "danymat/neogen", + -- stylua: ignore + keys = { + { prefix .. "d", function() require("neogen").generate() end, desc = "Default Annotation" }, + { prefix .. "C", function() require("neogen").generate({ type = "class" }) end, desc = "Class" }, + { prefix .. "f", function() require("neogen").generate({ type = "func" }) end, desc = "Function" }, + { prefix .. "t", function() require("neogen").generate({ type = "type" }) end, desc = "Type" }, + { prefix .. "F", function() require("neogen").generate({ type = "file" }) end, desc = "File" }, + { "cn", false }, + }, + }, + { + "Zeioth/dooku.nvim", + cmd = { "DookuGenerate", "DookuOpen", "DookuAutoSetup" }, + opts = {}, + -- stylua: ignore + keys = { + { prefix .. "g", "DookuGenerate", desc = "Generate HTML Docs" }, + { prefix .. "o", "DookuOpen", desc = "Open HTML Docs" }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "annotation/snippets", icon = " " }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/coding/blink-extended.lua b/nvim/lua/plugins/extras/coding/blink-extended.lua new file mode 100644 index 0000000..ef356e4 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/blink-extended.lua @@ -0,0 +1,20 @@ +return { + "saghen/blink.cmp", + opts = { + keymap = { + [""] = { "select_prev", "fallback" }, + [""] = { "select_next", "fallback" }, + }, + completion = { + menu = { + border = "rounded", + winhighlight = "Normal:BlinkCmpDoc,FloatBorder:BlinkCmpDocBorder,CursorLine:BlinkCmpDocCursorLine,Search:None", + }, + documentation = { + window = { + border = "rounded", + }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/coding/cmp-extended.lua b/nvim/lua/plugins/extras/coding/cmp-extended.lua new file mode 100644 index 0000000..e2eded3 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/cmp-extended.lua @@ -0,0 +1,84 @@ +local cmp = require("cmp") + +return { + "hrsh7th/nvim-cmp", + dependencies = { + "hrsh7th/cmp-nvim-lsp", + "hrsh7th/cmp-buffer", + "hrsh7th/cmp-path", + }, + keys = { + { "ciC", "CmpStatus", desc = "Cmp Status" }, + }, + opts = function(_, opts) + opts.mapping = cmp.mapping.preset.insert({ + [""] = cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Insert }), + [""] = cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Insert }), + [""] = cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Insert }), + [""] = cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Insert }), + [""] = cmp.mapping.scroll_docs(-4), + [""] = cmp.mapping.scroll_docs(4), + [""] = cmp.mapping.complete(), + [""] = cmp.mapping.abort(), + [""] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. + [""] = cmp.mapping.confirm({ + behavior = cmp.ConfirmBehavior.Replace, + select = true, + }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. + [""] = function(fallback) + cmp.abort() + fallback() + end, + }) + + opts.window = { + completion = { + border = "rounded", + winhighlight = "Normal:Normal,FloatBorder:Normal,CursorLine:Visual,Search:None", + scrollbar = false, + col_offset = -3, + side_padding = 1, + }, + documentation = { + border = "rounded", + winhighlight = "Normal:Normal,FloatBorder:Normal,CursorLine:Visual,Search:None", + scrollbar = false, + }, + } + + opts.performance = { + debounce = 0, + throttle = 0, + fetching_timeout = 20, + confirm_resolve_timeout = 20, + async_budget = 1, + max_view_entries = 50, + } + + cmp.setup.cmdline({ "/", "?" }, { + mapping = cmp.mapping.preset.cmdline({ + [""] = { + c = function(fallback) + if cmp.visible() then + cmp.select_next_item() + else + fallback() + end + end, + }, + [""] = { + c = function(fallback) + if cmp.visible() then + cmp.select_prev_item() + else + fallback() + end + end, + }, + }), + sources = { + { name = "buffer" }, + }, + }) + end, +} diff --git a/nvim/lua/plugins/extras/coding/cmp/autopairs.lua b/nvim/lua/plugins/extras/coding/cmp/autopairs.lua new file mode 100644 index 0000000..58856a1 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/cmp/autopairs.lua @@ -0,0 +1,125 @@ +return { + { + "hrsh7th/nvim-cmp", + dependencies = { + "windwp/nvim-autopairs", + opts = {}, + }, + opts = function() + local cmp = require("cmp") + local cmp_autopairs = require("nvim-autopairs.completion.cmp") + local ts_utils = require("nvim-treesitter.ts_utils") + local ts_node_func_parens_disabled = { + -- ecma + named_imports = true, + -- rust + use_declaration = true, + } + + local npairs = require("nvim-autopairs") + local Rule = require("nvim-autopairs.rule") + local cond = require("nvim-autopairs.conds") + local brackets = { { "(", ")" }, { "[", "]" }, { "{", "}" } } + + local default_handler = cmp_autopairs.filetypes["*"]["("].handler + cmp_autopairs.filetypes["*"]["("].handler = function(char, item, bufnr, rules, commit_character) + local node_type = ts_utils.get_node_at_cursor():type() + if ts_node_func_parens_disabled[node_type] then + if item.data then + item.data.funcParensDisabled = true + else + char = "" + end + end + default_handler(char, item, bufnr, rules, commit_character) + end + + cmp.event:on("confirm_done", cmp_autopairs.on_confirm_done()) + + npairs.add_rules({ + -- Rule for a pair with left-side ' ' and right side ' ' + Rule(" ", " ") + -- Pair will only occur if the conditional function returns true + :with_pair(function(opts) + -- We are checking if we are inserting a space in (), [], or {} + local pair = opts.line:sub(opts.col - 1, opts.col) + return vim.tbl_contains({ + brackets[1][1] .. brackets[1][2], + brackets[2][1] .. brackets[2][2], + brackets[3][1] .. brackets[3][2], + }, pair) + end) + :with_move(cond.none()) + :with_cr(cond.none()) + -- We only want to delete the pair of spaces when the cursor is as such: ( | ) + :with_del( + function(opts) + local col = vim.api.nvim_win_get_cursor(0)[2] + local context = opts.line:sub(col - 1, col + 2) + return vim.tbl_contains({ + brackets[1][1] .. " " .. brackets[1][2], + brackets[2][1] .. " " .. brackets[2][2], + brackets[3][1] .. " " .. brackets[3][2], + }, context) + end + ), + + -- Javascript arrow key + Rule("%(.*%)%s*%=>$", " { }", { "typescript", "typescriptreact", "javascript" }) + :use_regex(true) + :set_end_pair_length(2), + + -- Auto addspace on = + Rule("=", "") + :with_pair(cond.not_inside_quote()) + :with_pair(function(opts) + local last_char = opts.line:sub(opts.col - 1, opts.col - 1) + if last_char:match("[%w%=%s]") then + return true + end + return false + end) + :replace_endpair(function(opts) + local prev_2char = opts.line:sub(opts.col - 2, opts.col - 1) + local next_char = opts.line:sub(opts.col, opts.col) + next_char = next_char == " " and "" or " " + if prev_2char:match("%w$") then + return " =" .. next_char + end + if prev_2char:match("%=$") then + return next_char + end + if prev_2char:match("=") then + return "=" .. next_char + end + return "" + end) + :set_end_pair_length(0) + :with_move(cond.none()) + :with_del(cond.none()), + }) + + -- For each pair of brackets we will add another rule + for _, bracket in pairs(brackets) do + npairs.add_rules({ + -- Each of these rules is for a pair with left-side '( ' and right-side ' )' for each bracket type + Rule(bracket[1] .. " ", " " .. bracket[2]) + :with_pair(cond.none()) + :with_move(function(opts) + return opts.char == bracket[2] + end) + :with_del(cond.none()) + :use_key(bracket[2]) + -- Removes the trailing whitespace that can occur without this + :replace_map_cr(function(_) + return "2xiO" + end), + }) + end + end, + }, + { + "echasnovski/mini.pairs", + enabled = false, + }, +} diff --git a/nvim/lua/plugins/extras/coding/cmp/dotenv.lua b/nvim/lua/plugins/extras/coding/cmp/dotenv.lua new file mode 100644 index 0000000..a61dd17 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/cmp/dotenv.lua @@ -0,0 +1,9 @@ +return { + "hrsh7th/nvim-cmp", + dependencies = { + "SergioRibera/cmp-dotenv", + }, + opts = function(_, opts) + table.insert(opts.sources, { name = "dotenv" }) + end, +} diff --git a/nvim/lua/plugins/extras/coding/cmp/emoji.lua b/nvim/lua/plugins/extras/coding/cmp/emoji.lua new file mode 100644 index 0000000..bb9ddbd --- /dev/null +++ b/nvim/lua/plugins/extras/coding/cmp/emoji.lua @@ -0,0 +1,9 @@ +return { + "hrsh7th/nvim-cmp", + dependencies = { + "hrsh7th/cmp-emoji", + }, + opts = function(_, opts) + table.insert(opts.sources, { name = "emoji" }) + end, +} diff --git a/nvim/lua/plugins/extras/coding/cmp/fonts.lua b/nvim/lua/plugins/extras/coding/cmp/fonts.lua new file mode 100644 index 0000000..fe76f70 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/cmp/fonts.lua @@ -0,0 +1,9 @@ +return { + "hrsh7th/nvim-cmp", + dependencies = { + "amarakon/nvim-cmp-fonts", + }, + opts = function(_, opts) + table.insert(opts.sources, { name = "fonts", option = { space_filter = "-" } }) + end, +} diff --git a/nvim/lua/plugins/extras/coding/cmp/nerd-fonts.lua b/nvim/lua/plugins/extras/coding/cmp/nerd-fonts.lua new file mode 100644 index 0000000..412cdbb --- /dev/null +++ b/nvim/lua/plugins/extras/coding/cmp/nerd-fonts.lua @@ -0,0 +1,9 @@ +return { + "hrsh7th/nvim-cmp", + dependencies = { + "chrisgrieser/cmp-nerdfont", + }, + opts = function(_, opts) + table.insert(opts.sources, { name = "nerdfont" }) + end, +} diff --git a/nvim/lua/plugins/extras/coding/cmp/npm.lua b/nvim/lua/plugins/extras/coding/cmp/npm.lua new file mode 100644 index 0000000..d6cf6ca --- /dev/null +++ b/nvim/lua/plugins/extras/coding/cmp/npm.lua @@ -0,0 +1,12 @@ +return { + "hrsh7th/nvim-cmp", + dependencies = { + "David-Kunz/cmp-npm", + dependencies = "nvim-lua/plenary.nvim", + ft = "json", + opts = {}, + }, + opts = function(_, opts) + table.insert(opts.sources, { name = "npm", keyword_length = 4 }) + end, +} diff --git a/nvim/lua/plugins/extras/coding/cmp/rg.lua b/nvim/lua/plugins/extras/coding/cmp/rg.lua new file mode 100644 index 0000000..9735f00 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/cmp/rg.lua @@ -0,0 +1,9 @@ +return { + "hrsh7th/nvim-cmp", + dependencies = { + "lukas-reineke/cmp-rg", + }, + opts = function(_, opts) + table.insert(opts.sources, { name = "rg", keyword_length = 3 }) + end, +} diff --git a/nvim/lua/plugins/extras/coding/cmp/under-comparator.lua b/nvim/lua/plugins/extras/coding/cmp/under-comparator.lua new file mode 100644 index 0000000..05db406 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/cmp/under-comparator.lua @@ -0,0 +1,9 @@ +return { + "hrsh7th/nvim-cmp", + dependencies = { + "lukas-reineke/cmp-under-comparator", + }, + opts = function(_, opts) + table.insert(opts.sorting.comparators, 4, require("cmp-under-comparator").under) + end, +} diff --git a/nvim/lua/plugins/extras/coding/cmp/yanky.lua b/nvim/lua/plugins/extras/coding/cmp/yanky.lua new file mode 100644 index 0000000..ae81400 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/cmp/yanky.lua @@ -0,0 +1,9 @@ +return { + "hrsh7th/nvim-cmp", + dependencies = { + "chrisgrieser/cmp_yanky", + }, + opts = function(_, opts) + table.insert(opts.sources, { name = "cmp_yanky" }) + end, +} diff --git a/nvim/lua/plugins/extras/coding/debugprint.lua b/nvim/lua/plugins/extras/coding/debugprint.lua new file mode 100644 index 0000000..16cbe81 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/debugprint.lua @@ -0,0 +1,36 @@ +local prefix = "dd" + +return { + { + "andrewferrier/debugprint.nvim", + opts = { + create_keymaps = false, + }, + -- stylua: ignore + keys = { + { prefix .. "l", function() return require("debugprint").debugprint() end, desc = "Under Line", expr = true }, + { prefix .. "L", function() return require("debugprint").debugprint({ above = true }) end, desc = "Above Line", expr = true }, + { + prefix .. "v", + function() return require("debugprint").debugprint({ variable = true }) end, + desc = "Variable Under Line", + expr = true, + }, + { + prefix .. "V", + function() return require("debugprint").debugprint({ above = true, variable = true }) end, + desc = "Variable Above Line", + expr = true, + }, + { prefix .. "d", function() return require("debugprint").deleteprints() end, desc = "Delete All" }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "debugPrint", icon = "󰐪 " }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/coding/ibus.lua b/nvim/lua/plugins/extras/coding/ibus.lua new file mode 100644 index 0000000..395a3b9 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/ibus.lua @@ -0,0 +1,5 @@ +return { + "kevinhwang91/nvim-ibus-sw", + event = "InsertLeave", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/coding/luasnip-extended.lua b/nvim/lua/plugins/extras/coding/luasnip-extended.lua new file mode 100644 index 0000000..87de938 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/luasnip-extended.lua @@ -0,0 +1,32 @@ +return { + { import = "lazyvim.plugins.extras.coding.luasnip" }, + { + "L3MON4D3/LuaSnip", + dependencies = { + "rafamadriz/friendly-snippets", + config = function() + require("luasnip.loaders.from_vscode").lazy_load() + require("luasnip").filetype_extend("typescript", { "tsdoc" }) + require("luasnip").filetype_extend("typescript", { "next-ts" }) + require("luasnip").filetype_extend("javascript", { "jsdoc" }) + require("luasnip").filetype_extend("javascript", { "next" }) + require("luasnip").filetype_extend("lua", { "luadoc" }) + require("luasnip").filetype_extend("python", { "pydoc" }) + require("luasnip").filetype_extend("rust", { "rustdoc" }) + require("luasnip").filetype_extend("cs", { "csharpdoc" }) + require("luasnip").filetype_extend("java", { "javadoc" }) + require("luasnip").filetype_extend("c", { "cdoc" }) + require("luasnip").filetype_extend("cpp", { "cppdoc" }) + require("luasnip").filetype_extend("php", { "phpdoc" }) + require("luasnip").filetype_extend("kotlin", { "kdoc" }) + require("luasnip").filetype_extend("ruby", { "rdoc" }) + require("luasnip").filetype_extend("sh", { "shelldoc" }) + require("luasnip.loaders.from_vscode").lazy_load({ paths = vim.fn.stdpath("config") .. "/snippets" }) + end, + }, + }, + { + "garymjr/nvim-snippets", + enabled = false, + }, +} diff --git a/nvim/lua/plugins/extras/coding/multicursor.lua b/nvim/lua/plugins/extras/coding/multicursor.lua new file mode 100644 index 0000000..19855c3 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/multicursor.lua @@ -0,0 +1,48 @@ +return { + { + "smoka7/multicursors.nvim", + dependencies = { + "nvim-treesitter/nvim-treesitter", + "smoka7/hydra.nvim", + }, + cmd = { "MCstart", "MCvisual", "MCclear", "MCpattern", "MCvisualPattern", "MCunderCursor" }, + -- stylua: ignore + keys = { + { mode = { "v", "n" }, "M", "MCstart", desc = "Multicursor" }, + }, + opts = { + hint_config = { + border = "rounded", + position = "bottom-right", + }, + generate_hints = { + normal = true, + insert = true, + extend = true, + config = { + column_count = 1, + }, + }, + }, + }, + { + "nvim-lualine/lualine.nvim", + optional = true, + opts = function(_, opts) + local function is_active() + local ok, hydra = pcall(require, "hydra.statusline") + return ok and hydra.is_active() + end + + local function get_name() + local ok, hydra = pcall(require, "hydra.statusline") + if ok then + return hydra.get_name() + end + return "" + end + + table.insert(opts.sections.lualine_b, { get_name, cond = is_active }) + end, + }, +} diff --git a/nvim/lua/plugins/extras/coding/recorder.lua b/nvim/lua/plugins/extras/coding/recorder.lua new file mode 100644 index 0000000..e7c32f9 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/recorder.lua @@ -0,0 +1,34 @@ +return { + { + "chrisgrieser/nvim-recorder", + event = "VeryLazy", + vscode = true, + keys = { + { "q", desc = "Start Recording" }, + { "Q", desc = "Play Recording" }, + { "", desc = "Switch Slot" }, + { "cq", desc = "Edit Macro" }, + { "yq", desc = "Yank Macro" }, + { "dq", desc = "Delete All Macros" }, + }, + opts = { + useNerdFontsIcons = false, + slots = { "a", "b", "c", "d" }, + mapping = { + startStopRecording = "q", + playMacro = "Q", + editMacro = "cq", + switchSlot = "", + deleteAllMacros = "dq", + yankMacro = "yq", + }, + }, + }, + { + "nvim-lualine/lualine.nvim", + optional = true, + opts = function(_, opts) + table.insert(opts.sections.lualine_x, require("recorder").displaySlots) + end, + }, +} diff --git a/nvim/lua/plugins/extras/coding/snippets.lua b/nvim/lua/plugins/extras/coding/snippets.lua new file mode 100644 index 0000000..6518585 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/snippets.lua @@ -0,0 +1,23 @@ +local prefix = "a" + +return { + { + "chrisgrieser/nvim-scissors", + opts = { + jsonFormatter = "jq", + }, + -- stylua: ignore + keys = { + { prefix .. "S", function() require("scissors").editSnippet() end, desc = "Edit Snippets" }, + { prefix .. "s", mode = { "n", "v" }, function() require("scissors").addNewSnippet() end, desc = "Add Snippets" }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "annotation/snippets", icon = " " }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/coding/sniprun.lua b/nvim/lua/plugins/extras/coding/sniprun.lua new file mode 100644 index 0000000..4122a7b --- /dev/null +++ b/nvim/lua/plugins/extras/coding/sniprun.lua @@ -0,0 +1,71 @@ +local prefix = "cu" + +return { + { + "michaelb/sniprun", + run = "bash ./install.sh", + cmd = { "SnipRun", "SnipInfo", "SnipLive", "SnipClose", "SnipReset", "SnipReplMemoryClean" }, + opts = { + selected_interpreters = {}, --# use those instead of the default for the current filetype + repl_enable = { "javascript", "typescript" }, --# enable REPL-like behavior for the given interpreters + repl_disable = {}, --# disable REPL-like behavior for the given interpreters + + interpreter_options = { + GFM_original = { + use_on_filetypes = { "markdown.pandoc" }, --# the 'use_on_filetypes' configuration key is + }, + Python3_original = { + error_truncate = "auto", --# Truncate runtime errors 'long', 'short' or 'auto' + }, + }, + + display = { + "VirtualText", --# display results as virtual text + }, + + live_display = { "VirtualTextOk" }, --# display mode used in live_mode + + display_options = { + terminal_scrollback = vim.o.scrollback, --# change terminal display scrollback lines + terminal_line_number = false, --# whether show line number in terminal window + terminal_signcolumn = false, --# whether show signcolumn in terminal window + terminal_persistence = true, --# always keep the terminal open (true) or close it at every occasion (false) + terminal_width = 45, --# change the terminal display option width + notification_timeout = 5, --# timeout for nvim_notify output + }, + + --# You can use the same keys to customize whether a sniprun producing + --# no output should display nothing or '(no output)' + show_no_output = { + "Classic", + "TempFloatingWindow", --# implies LongTempFloatingWindow, which has no effect on its own + }, + + live_mode_toggle = "off", --# live mode toggle, see Usage - Running for more info + + inline_messages = false, --# inline_message (0/1) is a one-line way to display messages + + borders = "single", --# display borders around floating windows + --# possible values are 'none', 'single', 'double', or 'shadow' + }, + -- stylua: ignore + keys = { + { prefix .. "r", "SnipRun", desc = "Run" }, + { "", "SnipRun", desc = "Run" }, + { prefix .. "r", function() require("sniprun").run("v") end, mode = { "v" }, desc = "Run" }, + { "", function() require("sniprun").run("v") end, mode = { "v" }, desc = "Run" }, + { prefix .. "i", function() require("sniprun").info() end, desc = "Info" }, + { prefix .. "R", function() require("sniprun").reset() end, desc = "Reset" }, + { "", function() require("sniprun").reset() end, desc = "Reset" }, + { prefix .. "l", function() require("sniprun.live_mode").toggle() end, desc = "Live" }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "runner", icon = "󰜎 " }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/coding/treesitter/auto-indent.lua b/nvim/lua/plugins/extras/coding/treesitter/auto-indent.lua new file mode 100644 index 0000000..a5d9c93 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/treesitter/auto-indent.lua @@ -0,0 +1,11 @@ +return { + "vidocqh/auto-indent.nvim", + event = "LazyFile", + opts = { + ---@param lnum: number + ---@return number + indentexpr = function(lnum) + return require("nvim-treesitter.indent").get_indent(lnum) + end, + }, +} diff --git a/nvim/lua/plugins/extras/coding/treesitter/endwise.lua b/nvim/lua/plugins/extras/coding/treesitter/endwise.lua new file mode 100644 index 0000000..0fcffeb --- /dev/null +++ b/nvim/lua/plugins/extras/coding/treesitter/endwise.lua @@ -0,0 +1,11 @@ +return { + "nvim-treesitter/nvim-treesitter", + dependencies = { + "RRethy/nvim-treesitter-endwise", + }, + opts = { + endwise = { + enable = true, + }, + }, +} diff --git a/nvim/lua/plugins/extras/coding/treesitter/guess-indent.lua b/nvim/lua/plugins/extras/coding/treesitter/guess-indent.lua new file mode 100644 index 0000000..c217478 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/treesitter/guess-indent.lua @@ -0,0 +1,5 @@ +return { + "nmac427/guess-indent.nvim", + event = "LazyFile", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/coding/treesitter/mini-align.lua b/nvim/lua/plugins/extras/coding/treesitter/mini-align.lua new file mode 100644 index 0000000..5c48ad1 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/treesitter/mini-align.lua @@ -0,0 +1,9 @@ +return { + "echasnovski/mini.align", + opts = {}, + vscode = true, + keys = { + { "ga", mode = { "n", "v" }, desc = "Align" }, + { "gA", mode = { "n", "v" }, desc = "Align Preview" }, + }, +} diff --git a/nvim/lua/plugins/extras/coding/treesitter/node-action.lua b/nvim/lua/plugins/extras/coding/treesitter/node-action.lua new file mode 100644 index 0000000..87b9327 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/treesitter/node-action.lua @@ -0,0 +1,10 @@ +return { + "ckolkey/ts-node-action", + dependencies = { "nvim-treesitter" }, + vscode = true, + opts = {}, + --stylua: ignore + keys = { + { "J", "NodeAction", mode = "n", desc = "Node action" } + }, +} diff --git a/nvim/lua/plugins/extras/coding/treesitter/puppeteer.lua b/nvim/lua/plugins/extras/coding/treesitter/puppeteer.lua new file mode 100644 index 0000000..4e34eb1 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/treesitter/puppeteer.lua @@ -0,0 +1,4 @@ +return { + "nvim-treesitter/nvim-treesitter", + dependencies = { "chrisgrieser/nvim-puppeteer" }, +} diff --git a/nvim/lua/plugins/extras/coding/treesitter/sibling-swap.lua b/nvim/lua/plugins/extras/coding/treesitter/sibling-swap.lua new file mode 100644 index 0000000..a3f0a2f --- /dev/null +++ b/nvim/lua/plugins/extras/coding/treesitter/sibling-swap.lua @@ -0,0 +1,14 @@ +return { + "Wansmer/sibling-swap.nvim", + dependencies = "nvim-treesitter/nvim-treesitter", + vscode = true, + opts = { + use_default_keymaps = false, + highlight_node_at_cursor = true, + }, + -- stylua: ignore + keys = { + { "", function() require("sibling-swap").swap_with_right() end, desc = "Move Node Right" }, + { "", function() require("sibling-swap").swap_with_left() end, desc = "Move Node Left" }, + }, +} diff --git a/nvim/lua/plugins/extras/coding/treesitter/spider.lua b/nvim/lua/plugins/extras/coding/treesitter/spider.lua new file mode 100644 index 0000000..be0e010 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/treesitter/spider.lua @@ -0,0 +1,12 @@ +return { + "chrisgrieser/nvim-spider", + opts = {}, + vscode = true, + -- stylua: ignore + keys = { + { "e", mode = { "n", "o", "x" }, function() require("spider").motion("e") end, desc = "Spider-e" }, + { "w", mode = { "n", "o", "x" }, function() require("spider").motion("w") end, desc = "Spider-w" }, + { "b", mode = { "n", "o", "x" }, function() require("spider").motion("b") end, desc = "Spider-b" }, + { "E", mode = { "n", "x", "o" }, function() require("spider").motion("ge") end, desc = "Spider-E" }, + }, +} diff --git a/nvim/lua/plugins/extras/coding/treesitter/text-case.lua b/nvim/lua/plugins/extras/coding/treesitter/text-case.lua new file mode 100644 index 0000000..607f5c5 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/treesitter/text-case.lua @@ -0,0 +1,12 @@ +return { + "johmsalas/text-case.nvim", + config = function() + require("textcase").setup() + LazyVim.on_load("telescope.nvim", function() + require("telescope").load_extension("lazy") + end) + end, + keys = { + { "gC", "TextCaseOpenTelescope", mode = { "n", "v" }, desc = "Text Case" }, + }, +} diff --git a/nvim/lua/plugins/extras/coding/treesitter/various-textobjs.lua b/nvim/lua/plugins/extras/coding/treesitter/various-textobjs.lua new file mode 100644 index 0000000..50afb37 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/treesitter/various-textobjs.lua @@ -0,0 +1,35 @@ +return { + "chrisgrieser/nvim-various-textobjs", + opts = { + keymaps = { + useDefaults = false, + }, + }, + vscode = true, + -- stylua: ignore + keys = { + { "im", ft = { "markdown", "toml" }, mode = { "o", "x" }, function() require("various-textobjs").mdlink("inner") end, desc = "Markdown Link" }, + { "am", ft = { "markdown", "toml" }, mode = { "o", "x" }, function() require("various-textobjs").mdlink("outer") end, desc = "Markdown Link" }, + { "iC", ft = { "markdown" }, mode = { "o", "x" }, function() require("various-textobjs").mdFencedCodeBlock("inner") end, desc = "CodeBlock" }, + { "aC", ft = { "markdown" }, mode = { "o", "x" }, function() require("various-textobjs").mdFencedCodeBlock("outer") end, desc = "CodeBlock" }, + { "ie", ft = { "markdown" }, mode = { "o", "x" }, function() require("various-textobjs").mdEmphasis("inner") end, desc = "Emphasis" }, + { "ae", ft = { "markdown" }, mode = { "o", "x" }, function() require("various-textobjs").mdEmphasis("outer") end, desc = "Emphasis" }, + { "gd", mode = { "o", "x" }, function() require("various-textobjs").diagnostics() end, desc = "Diagnostics" }, + { "iy", ft = { "python" }, mode = { "o", "x" }, function() require("various-textobjs").pyTripleQuotes("inner") end, desc = "Triple Quotes" }, + { "ay", ft = { "python" }, mode = { "o", "x" }, function() require("various-textobjs").pyTripleQuotes("outer") end, desc = "Triple Quotes" }, + { "iC", ft = { "css", "scss", "less" }, mode = { "o", "x" }, function() require("various-textobjs").cssSelector("inner") end, desc = "CSS Selector" }, + { "aC", ft = { "css", "scss", "less" }, mode = { "o", "x" }, function() require("various-textobjs").cssSelector("outer") end, desc = "CSS Selector" }, + { "i#", ft = { "css", "scss", "less" }, mode = { "o", "x" }, function() require("various-textobjs").cssColor("inner") end, desc = "CSS Color" }, + { "a#", ft = { "css", "scss", "less" }, mode = { "o", "x" }, function() require("various-textobjs").cssColor("outer") end, desc = "CSS Color" }, + { "iP", ft = { "sh" }, mode = { "o", "x" }, function() require("various-textobjs").shellPipe("inner") end, desc = "Pipe" }, + { "aP", ft = { "sh" }, mode = { "o", "x" }, function() require("various-textobjs").shellPipe("outer") end, desc = "Pipe" }, + { "iH", ft = { "html, xml, css, scss, less" }, mode = { "o", "x" }, function() require("various-textobjs").htmlAttribute("inner") end, desc = "HTML Attribute" }, + { "iv", mode = { "o", "x" }, function() require("various-textobjs").value("inner") end, desc = "Value" }, + { "av", mode = { "o", "x" }, function() require("various-textobjs").value("outer") end, desc = "Value" }, + { "ik", mode = { "o", "x" }, function() require("various-textobjs").key("inner") end, desc = "Key" }, + { "ak", mode = { "o", "x" }, function() require("various-textobjs").key("outer") end, desc = "Key" }, + { "L", mode = { "o", "x" }, function() require("various-textobjs").url() end, desc = "Link" }, + { "iN", mode = { "o", "x" }, function() require("various-textobjs").number("inner") end, desc = "Number" }, + { "aN", mode = { "o", "x" }, function() require("various-textobjs").number("outer") end, desc = "Number" }, + }, +} diff --git a/nvim/lua/plugins/extras/coding/treesitter/wildfire.lua b/nvim/lua/plugins/extras/coding/treesitter/wildfire.lua new file mode 100644 index 0000000..9c0eec1 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/treesitter/wildfire.lua @@ -0,0 +1,6 @@ +return { + "sustech-data/wildfire.nvim", + event = "BufEnter", + vscode = true, + opts = {}, +} diff --git a/nvim/lua/plugins/extras/coding/ultimate-autopair.lua b/nvim/lua/plugins/extras/coding/ultimate-autopair.lua new file mode 100644 index 0000000..9d2d601 --- /dev/null +++ b/nvim/lua/plugins/extras/coding/ultimate-autopair.lua @@ -0,0 +1,12 @@ +return { + { + "altermo/ultimate-autopair.nvim", + event = { "InsertEnter", "CmdlineEnter" }, + branch = "v0.6", --recomended as each new version will have breaking changes + opts = {}, + }, + { + "echasnovski/mini.pairs", + enabled = false, + }, +} diff --git a/nvim/lua/plugins/extras/coding/yanky-extended.lua b/nvim/lua/plugins/extras/coding/yanky-extended.lua new file mode 100644 index 0000000..160030f --- /dev/null +++ b/nvim/lua/plugins/extras/coding/yanky-extended.lua @@ -0,0 +1,45 @@ +return { + { import = "lazyvim.plugins.extras.coding.yanky" }, + { + "gbprod/yanky.nvim", + opts = function(_, opts) + opts.highlight = { timer = 250 } + + if LazyVim.has("telescope.nvim") then + local utils = require("yanky.utils") + local mapping = require("yanky.telescope.mapping") + opts.picker = { + telescope = { + use_default_mappings = false, + mappings = { + default = mapping.put("p"), + i = { + [""] = mapping.put("p"), + [""] = mapping.put("P"), + [""] = mapping.delete(), + [""] = mapping.set_register(utils.get_default_register()), + }, + n = { + p = mapping.put("p"), + P = mapping.put("P"), + d = mapping.delete(), + r = mapping.set_register(utils.get_default_register()), + }, + }, + }, + } + end + end, + keys = { + { + "sy", + function() + vim.cmd([[YankyRingHistory]]) + end, + mode = { "n", "v" }, + desc = "Yank History", + }, + { "p", mode = { "n", "x" }, false }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/dap/core-extended.lua b/nvim/lua/plugins/extras/dap/core-extended.lua new file mode 100644 index 0000000..b4e79b6 --- /dev/null +++ b/nvim/lua/plugins/extras/dap/core-extended.lua @@ -0,0 +1,33 @@ +return { + { import = "lazyvim.plugins.extras.dap.core" }, + { + "mfussenegger/nvim-dap", + opts = { + defaults = { + fallback = { + external_terminal = { + command = "/usr/bin/kitty", + args = { "--class", "kitty-dap", "--hold", "--detach", "nvim-dap", "-c", "DAP" }, + }, + }, + }, + }, + -- stylua: ignore + keys = { + { "", function() require("dap").continue() end, desc = "Debug: Continue" }, + { "", function() require("dap").step_over() end, desc = "Debug: Step over" }, + { "", function() require("dap").step_into() end, desc = "Debug: Step into" }, + { "", function() require("dap").step_out() end, desc = "Debug: Step out" }, + { "", function() require("dap").toggle_breakpoint() end, desc = "Debug: Toggle breakpoint" }, + { "", function() require("dap").set_breakpoint(vim.fn.input('Breakpoint condition: ')) end, desc = "Breakpoint Condition" }, + }, + }, + { + "nvim-neotest/neotest", + optional = true, + -- stylua: ignore + keys = { + { "tL", function() require("neotest").run.run_last({ strategy = "dap" }) end, desc = "Debug Last Test" }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/dap/persistent-breakpoints.lua b/nvim/lua/plugins/extras/dap/persistent-breakpoints.lua new file mode 100644 index 0000000..b1c28e2 --- /dev/null +++ b/nvim/lua/plugins/extras/dap/persistent-breakpoints.lua @@ -0,0 +1,35 @@ +local prefix = "db" + +return { + { + "mfussenegger/nvim-dap", + optional = true, + vscode = false, + dependencies = { + "Weissle/persistent-breakpoints.nvim", + vscode = false, + event = "LazyFile", + keys = { + { prefix .. "d", "PBClearAllBreakpoints", desc = "Delete All Breakpoints" }, + { prefix .. "B", "PBSetConditionalBreakpoint", desc = "Breakpoint Condition" }, + { prefix .. "b", "PBToggleBreakpoint", desc = "Toggle Breakpoint" }, + { "", "PBToggleBreakpoint", desc = "Toggle Breakpoint" }, + }, + opts = { + load_breakpoints_event = { "BufReadPost" }, + }, + }, + keys = { + { "", false }, + { "dB", false }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "breakpoints", icon = " " }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/dap/repl-highlights.lua b/nvim/lua/plugins/extras/dap/repl-highlights.lua new file mode 100644 index 0000000..e84ecb8 --- /dev/null +++ b/nvim/lua/plugins/extras/dap/repl-highlights.lua @@ -0,0 +1,12 @@ +return { + "nvim-treesitter/nvim-treesitter", + dependencies = { + "LiadOz/nvim-dap-repl-highlights", + opts = {}, + }, + opts = function(_, opts) + if type(opts.ensure_installed) == "table" then + vim.list_extend(opts.ensure_installed, { "dap_repl" }) + end + end, +} diff --git a/nvim/lua/plugins/extras/dap/telescope.lua b/nvim/lua/plugins/extras/dap/telescope.lua new file mode 100644 index 0000000..29950ff --- /dev/null +++ b/nvim/lua/plugins/extras/dap/telescope.lua @@ -0,0 +1,17 @@ +return { + "nvim-telescope/telescope-dap.nvim", + cond = LazyVim.has("nvim-dap"), + config = function() + LazyVim.on_load("telescope.nvim", function() + require("telescope").load_extension("dap") + end) + end, + -- stylua: ignore + keys = { + { "dm", "Telescope dap commands", desc = "Commands" }, + { "df", "Telescope dap frames", desc = "Frames" }, + { "dG", "Telescope dap configurations", desc = "Configurations" }, + { "dbL", "Telescope dap list_breakpoints", desc = "List Breakpoints" }, + { "dv", "Telescope dap variables", desc = "Variables" }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/carbon-now.lua b/nvim/lua/plugins/extras/editor/carbon-now.lua new file mode 100644 index 0000000..ca55d59 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/carbon-now.lua @@ -0,0 +1,5 @@ +return { + "kristijanhusak/vim-carbon-now-sh", + cmd = "CarbonNowSh", + vscode = true, +} diff --git a/nvim/lua/plugins/extras/editor/ccc.lua b/nvim/lua/plugins/extras/editor/ccc.lua new file mode 100644 index 0000000..740ac84 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/ccc.lua @@ -0,0 +1,16 @@ +return { + "uga-rosa/ccc.nvim", + ft = { "html", "javascript", "typescript", "javascriptreact", "typescriptreact", "css", "scss", "sh" }, + cmd = { "CccPick", "CccConvert", "CccHighlighterEnable", "CccHighlighterDisable", "CccHighlighterToggle" }, + keys = { + { "up", "CccHighlighterToggle", desc = "Toggle Paint/Colorizer" }, + { "", "CccConvert", desc = "Convert color" }, + { "", "CccPick", desc = "Pick Color" }, + }, + opts = { + highlighter = { + auto_enable = true, + lsp = true, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/codesnap.lua b/nvim/lua/plugins/extras/editor/codesnap.lua new file mode 100644 index 0000000..5adde41 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/codesnap.lua @@ -0,0 +1,19 @@ +return { + "mistricky/codesnap.nvim", + build = "make", + cmd = { "CodeSnap", "CodeSnapSave" }, + vscode = false, + keys = { + { "cs", mode = "v", "'<,'>CodeSnap", desc = "Screenshot (Clipboard)" }, + { "cS", mode = "v", "'<,'>CodeSnapSave", desc = "Screenshot (Save)" }, + }, + cond = vim.env.KITTY_SCROLLBACK_NVIM == nil, + opts = { + save_path = (os.getenv("HOME") .. "/pictures/screenshots/code"), + title = "CodeSnap.nvim", + code_font_family = "JetBrainsMono Nerd Font", + watermark_font_family = "JetBrainsMono Nerd Font", + watermark = "", + bg_theme = "summer", + }, +} diff --git a/nvim/lua/plugins/extras/editor/compiler.lua b/nvim/lua/plugins/extras/editor/compiler.lua new file mode 100644 index 0000000..59092b4 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/compiler.lua @@ -0,0 +1,40 @@ +return { + { + "Zeioth/compiler.nvim", + cmd = { "CompilerOpen", "CompilerToggleResults", "CompilerRedo" }, + dependencies = { "stevearc/overseer.nvim" }, + opts = {}, + -- stylua: ignore + keys = { + { "", "CompilerOpen", desc = "Open Compiler" }, + { "", function() vim.cmd("CompilerStop") vim.cmd("CompilerRedo") end, desc = "Redo Compiler" }, + { "", "CompilerToggleResults", desc = "Toggle Compiler Results" }, + }, + }, + { + "stevearc/overseer.nvim", + cmd = { + "OverseerOpen", + "OverseerClose", + "OverseerToggle", + "OverseerSaveBundle", + "OverseerLoadBundle", + "OverseerDeleteBundle", + "OverseerRunCmd", + "OverseerRun", + "OverseerInfo", + "OverseerBuild", + "OverseerQuickAction", + "OverseerTaskAction ", + "OverseerClearCache", + }, + opts = { + task_list = { + direction = "bottom", + min_height = 15, + max_height = 15, + default_detail = 1, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/dev-container.lua b/nvim/lua/plugins/extras/editor/dev-container.lua new file mode 100644 index 0000000..64f98c9 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/dev-container.lua @@ -0,0 +1,34 @@ +local prefix = "o" + +return { + { + "https://codeberg.org/esensar/nvim-dev-container", + cmd = { + "DevcontainerStart", + "DevcontainerStop", + "DevcontainerLogs", + "DevcontainerEditNearestConfig", + "DevcontainerAttach", + "DevcontainerExec", + "DevcontainerStopAll", + "DevcontainerRemoveAll", + }, + dependencies = { "nvim-treesitter/nvim-treesitter" }, + opts = {}, + keys = { + { prefix .. "s", "DevcontainerStart", desc = "Start" }, + { prefix .. "S", "DevcontainerStop", desc = "Stop" }, + { prefix .. "l", "DevcontainerLogs", desc = "Log" }, + { prefix .. "c", "DevcontainerEditNearestConfig", desc = "Config" }, + { prefix .. "a", "DevcontainerAttach", desc = "Attach" }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { "", group = "containers", icon = " " }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/docs/devdocs.lua b/nvim/lua/plugins/extras/editor/docs/devdocs.lua new file mode 100644 index 0000000..3ea1842 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/docs/devdocs.lua @@ -0,0 +1,45 @@ +return { + "luckasRanarison/nvim-devdocs", + cmd = { + "DevdocsFetch", + "DevdocsInstall", + "DevdocsUninstall", + "DevdocsOpen", + "DevdocsOpenFloat", + "DevdocsOpenCurrent", + "DevdocsOpenCurrentFloat", + "DevdocsUpdate", + "DevdocsUpdateAll", + }, + keys = { + { "sE", "DevdocsOpen", desc = "Devdocs" }, + { "se", "DevdocsOpenCurrent", desc = "Devdocs Current" }, + }, + opts = { + dir_path = vim.fn.stdpath("data") .. "/devdocs", -- installation directory + telescope = {}, -- passed to the telescope picker + float_win = { -- passed to nvim_open_win(), see :h api-floatwin + relative = "editor", + height = 25, + width = 100, + border = "rounded", + }, + wrap = false, -- text wrap, only applies to floating window + previewer_cmd = nil, -- for example: "glow" + cmd_args = {}, -- example using glow: { "-s", "dark", "-w", "80" } + cmd_ignore = {}, -- ignore cmd rendering for the listed docs + picker_cmd = false, -- use cmd previewer in picker preview + picker_cmd_args = {}, -- example using glow: { "-s", "dark", "-w", "50" } + after_open = function(bufnr) + vim.api.nvim_buf_set_keymap(bufnr, "n", "q", ":close", {}) + end, + ensure_installed = { + "javascript", + "lua-5.4", + "fish-3.6", + "git", + "npm", + "node", + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/docs/neorg.lua b/nvim/lua/plugins/extras/editor/docs/neorg.lua new file mode 100644 index 0000000..8956b2f --- /dev/null +++ b/nvim/lua/plugins/extras/editor/docs/neorg.lua @@ -0,0 +1,26 @@ +return { + "nvim-neorg/neorg", + build = ":Neorg sync-parsers", + dependencies = { "nvim-lua/plenary.nvim" }, + ft = "norg", + opts = { + load = { + ["core.defaults"] = {}, -- Loads default behaviour + ["core.concealer"] = {}, -- Adds pretty icons to your documents + ["core.keybinds"] = {}, -- Adds default keybindings + ["core.completion"] = { + config = { + engine = "nvim-cmp", + }, + }, -- Enables support for completion plugins + ["core.journal"] = {}, -- Enables support for the journal module + ["core.dirman"] = { -- Manages Neorg workspaces + config = { + workspaces = { + notes = "~/projects/notes", + }, + }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/docs/obsidian.lua b/nvim/lua/plugins/extras/editor/docs/obsidian.lua new file mode 100644 index 0000000..dc11cef --- /dev/null +++ b/nvim/lua/plugins/extras/editor/docs/obsidian.lua @@ -0,0 +1,99 @@ +local prefix = "o" + +return { + { import = "plugins.extras.lang.markdown-extended" }, + { + -- "epwalsh/obsidian.nvim", + "obsidian-nvim/obsidian.nvim", -- NOTE: Using a fork from the community + ft = "markdown", + keys = { + { prefix .. "o", "ObsidianOpen", desc = "Open on App" }, + { prefix .. "g", "ObsidianSearch", desc = "Grep" }, + { "sO", "ObsidianSearch", desc = "Obsidian Grep" }, + { prefix .. "n", "ObsidianNew", desc = "New Note" }, + { prefix .. "", "ObsidianQuickSwitch", desc = "Find Files" }, + { prefix .. "b", "ObsidianBacklinks", desc = "Backlinks" }, + { prefix .. "t", "ObsidianTags", desc = "Tags" }, + { prefix .. "t", "ObsidianTemplate", desc = "Template" }, + { prefix .. "l", "ObsidianLink", mode = "v", desc = "Link" }, + { prefix .. "L", "ObsidianLinks", desc = "Links" }, + { prefix .. "N", "ObsidianLinkNew", mode = "v", desc = "New Link" }, + { prefix .. "e", "ObsidianExtractNote", mode = "v", desc = "Extract Note" }, + { prefix .. "w", "ObsidianWorkspace", desc = "Workspace" }, + { prefix .. "r", "ObsidianRename", desc = "Rename" }, + { prefix .. "i", "ObsidianPasteImg", desc = "Paste Image" }, + { prefix .. "d", "ObsidianDailies", desc = "Daily Notes" }, + }, + opts = { + workspaces = { + { + name = "personal-brain", + path = "~/documents/obsidian/personal-brain/vault", + }, + }, + + notes_subdir = "01 - Bandeja Entrada", + + daily_notes = { + folder = "03 - Diario/Diariamente", + date_format = "%Y-%m-%d", + alias_format = "%B %-d, %Y", + template = "00 - Data/Plantillas/Diariamente.md", + }, + + completion = { + nvim_cmp = false, + blink = true, + }, + + picker = { + name = "snacks.pick", + }, + + mappings = { + ["gf"] = { + action = function() + return require("obsidian").util.gf_passthrough() + end, + opts = { noremap = false, expr = true, buffer = true }, + }, + [""] = { + action = function() + return require("obsidian").util.toggle_checkbox() + end, + opts = { buffer = true }, + }, + [""] = { + action = function() + return require("obsidian").util.smart_action() + end, + opts = { buffer = true, expr = true }, + }, + }, + + templates = { + subdir = "00 - Data/Plantillas", + date_format = "%Y-%m-%d-%a", + time_format = "%H:%M", + }, + + follow_url_func = function(url) + vim.fn.jobstart({ "xdg-open", url }) + end, + + attachments = { + img_folder = "00 - Data/Documentos", + }, + + ui = { enable = false }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "obsidian", icon = " ", mode = { "n", "v" } }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/docs/peek.lua b/nvim/lua/plugins/extras/editor/docs/peek.lua new file mode 100644 index 0000000..ae68d0b --- /dev/null +++ b/nvim/lua/plugins/extras/editor/docs/peek.lua @@ -0,0 +1,23 @@ +return { + { "iamcco/markdown-preview.nvim", enabled = false }, + { + "toppair/peek.nvim", + build = "deno task --quiet build:fast", + keys = { + { + "cp", + ft = "markdown", + function() + local peek = require("peek") + if peek.is_open() then + peek.close() + else + peek.open() + end + end, + desc = "Peek (Markdown Preview)", + }, + }, + opts = {}, + }, +} diff --git a/nvim/lua/plugins/extras/editor/exercism.lua b/nvim/lua/plugins/extras/editor/exercism.lua new file mode 100644 index 0000000..464c181 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/exercism.lua @@ -0,0 +1,16 @@ +return { + "2kabhishek/exercism.nvim", + cmd = { + "ExercismLanguages", + "ExercismList", + "ExercismSubmit", + "ExercismTest", + }, + dependencies = { + "2kabhishek/utils.nvim", -- required, for utility functions + }, + opts = { + exercism_workspace = "~/dev/study/exercism", + add_default_keybindings = false, + }, +} diff --git a/nvim/lua/plugins/extras/editor/five-server.lua b/nvim/lua/plugins/extras/editor/five-server.lua new file mode 100644 index 0000000..8eb7012 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/five-server.lua @@ -0,0 +1,8 @@ +return { + "Diogo-ss/five-server.nvim", + cmd = { "FiveServer" }, + build = function() + require("fs.utils.install")() + end, + opts = {}, +} diff --git a/nvim/lua/plugins/extras/editor/flash-extended.lua b/nvim/lua/plugins/extras/editor/flash-extended.lua new file mode 100644 index 0000000..3811270 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/flash-extended.lua @@ -0,0 +1,28 @@ +return { + "folke/flash.nvim", + opts = {}, + vscode = true, + keys = { + { + "s", + mode = { "n", "x", "o" }, + function() + require("flash").jump({ + search = { + mode = function(str) + return "\\<" .. str + end, + }, + }) + end, + desc = "Flash", + }, + { + "*", + function() + require("flash").jump({ pattern = vim.fn.expand("") }) + end, + desc = "Jump With Current Word", + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/fold.lua b/nvim/lua/plugins/extras/editor/fold.lua new file mode 100644 index 0000000..92d9ce1 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/fold.lua @@ -0,0 +1,77 @@ +return { + { + "kevinhwang91/nvim-ufo", + event = { "LazyFile" }, + dependencies = { "kevinhwang91/promise-async" }, + init = function() + vim.o.foldcolumn = "1" + vim.o.foldlevel = 99 + vim.o.foldlevelstart = 99 + vim.o.foldenable = true + vim.o.fillchars = [[eob: ,fold: ,foldopen:,foldsep: ,foldclose:]] + end, + opts = function() + local handler = function(virtText, lnum, endLnum, width, truncate) + local newVirtText = {} + local suffix = (" ... 󰁂 %d "):format(endLnum - lnum) + local sufWidth = vim.fn.strdisplaywidth(suffix) + local targetWidth = width - sufWidth + local curWidth = 0 + for _, chunk in ipairs(virtText) do + local chunkText = chunk[1] + local chunkWidth = vim.fn.strdisplaywidth(chunkText) + if targetWidth > curWidth + chunkWidth then + table.insert(newVirtText, chunk) + else + chunkText = truncate(chunkText, targetWidth - curWidth) + local hlGroup = chunk[2] + table.insert(newVirtText, { chunkText, hlGroup }) + chunkWidth = vim.fn.strdisplaywidth(chunkText) + if curWidth + chunkWidth < targetWidth then + suffix = suffix .. (" "):rep(targetWidth - curWidth - chunkWidth) + end + break + end + curWidth = curWidth + chunkWidth + end + table.insert(newVirtText, { suffix, "MoreMsg" }) + return newVirtText + end + + return { + fold_virt_text_handler = handler, + provider_selector = function() + return { "treesitter", "indent" } + end, + open_fold_hl_timeout = 400, + close_fold_kinds_for_ft = { "imports", "comment" }, + preview = { + win_config = { border = { "", "─", "", "", "", "─", "", "" }, winblend = 0 }, + mappings = { + scrollU = "", + scrollD = "", + jumpTop = "[", + jumpBot = "]", + }, + }, + } + end, + keys = { + { + "zp", + function() + local winid = require("ufo").peekFoldedLinesUnderCursor() + if not winid then + vim.lsp.buf.hover() + end + end, + desc = "Peek Folded Line", + }, + }, + }, + { + "chrisgrieser/nvim-origami", + event = { "LazyFile" }, + opts = {}, + }, +} diff --git a/nvim/lua/plugins/extras/editor/fzf/fzf-extended.lua b/nvim/lua/plugins/extras/editor/fzf/fzf-extended.lua new file mode 100644 index 0000000..8af6b84 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/fzf/fzf-extended.lua @@ -0,0 +1,18 @@ +return { + { import = "lazyvim.plugins.extras.editor.fzf" }, + { + "ibhagwan/fzf-lua", + opts = { + previewers = { + builtin = { + syntax_limit_b = 1024 * 100, -- 100KB + }, + }, + }, + keys = { + { "sA", "FzfLua treesitter", desc = "Treesiter Symbols" }, + { "gr", "FzfLua git_branches", desc = "Branches" }, + { "S", "FzfLua spell_suggest", desc = "Spelling" }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/git/diffview.lua b/nvim/lua/plugins/extras/editor/git/diffview.lua new file mode 100644 index 0000000..37b3c97 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/git/diffview.lua @@ -0,0 +1,75 @@ +local prefix = "gC" +local function toggle_diffview(cmd) + if next(require("diffview.lib").views) == nil then + vim.cmd(cmd) + else + vim.cmd("DiffviewClose") + end +end + +return { + { + "sindrets/diffview.nvim", + -- stylua: ignore + keys = { + { "gD", function() toggle_diffview("DiffviewFileHistory") end, desc = "Diff Repo" }, + { "gd", function() toggle_diffview("DiffviewOpen") end, desc = "Diff View" }, + { "gF", function() toggle_diffview("DiffviewFileHistory %") end, desc = "Diff Current File" }, + }, + opts = function(_, opts) + local actions = require("diffview.actions") + + opts.enhanced_diff_hl = true + opts.view = { + default = { winbar_info = true }, + file_history = { winbar_info = true }, + } + opts.hooks = { + diff_buf_read = function(bufnr) + vim.b[bufnr].view_activated = false + end, + } + + opts.keymaps = { + --stylua: ignore + view = { + { "n", prefix .. "o", actions.conflict_choose("ours"), { desc = "Choose the OURS version of a conflict" } }, + { "n", prefix .. "t", actions.conflict_choose("theirs"), { desc = "Choose the THEIRS version of a conflict" } }, + { "n", prefix .. "b", actions.conflict_choose("base"), { desc = "Choose the BASE version of a conflict" } }, + { "n", prefix .. "a", actions.conflict_choose("all"), { desc = "Choose all the versions of a conflict" } }, + { "n", prefix .. "x", actions.conflict_choose("none"), { desc = "Delete the conflict region" } }, + { "n", prefix .. "O", actions.conflict_choose_all("ours"), { desc = "Choose the OURS version of a conflict for the whole file" } }, + { "n", prefix .. "T", actions.conflict_choose_all("theirs"), { desc = "Choose the THEIRS version of a conflict for the whole file" } }, + { "n", prefix .. "B", actions.conflict_choose_all("base"), { desc = "Choose the BASE version of a conflict for the whole file" } }, + { "n", prefix .. "A", actions.conflict_choose_all("all"), { desc = "Choose all the versions of a conflict for the whole file" } }, + { "n", prefix .. "X", actions.conflict_choose_all("none"), { desc = "Delete the conflict region for the whole file" } }, + }, + --stylua: ignore + file_panel = { + { "n", prefix .. "O", actions.conflict_choose_all("ours"), { desc = "Choose the OURS version of a conflict for the whole file" } }, + { "n", prefix .. "T", actions.conflict_choose_all("theirs"), { desc = "Choose the THEIRS version of a conflict for the whole file" } }, + { "n", prefix .. "B", actions.conflict_choose_all("base"), { desc = "Choose the BASE version of a conflict for the whole file" } }, + { "n", prefix .. "A", actions.conflict_choose_all("all"), { desc = "Choose all the versions of a conflict for the whole file" } }, + { "n", prefix .. "X", actions.conflict_choose_all("none"), { desc = "Delete the conflict region for the whole file" } }, + }, + } + end, + }, + { + "NeogitOrg/neogit", + optional = true, + opts = { + integrations = { + diffview = true, + }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "conflicts", icon = " " }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/git/git-conflict.lua b/nvim/lua/plugins/extras/editor/git/git-conflict.lua new file mode 100644 index 0000000..d554c00 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/git/git-conflict.lua @@ -0,0 +1,45 @@ +local prefix = "gC" + +vim.api.nvim_create_autocmd("User", { + pattern = "GitConflictDetected", + callback = function() + vim.notify("Conflict detected in " .. vim.fn.expand("")) + end, +}) + +return { + { + "akinsho/git-conflict.nvim", + opts = { + default_mappings = { + ours = prefix .. "o", + theirs = prefix .. "t", + none = prefix .. "n", + both = prefix .. "b", + }, + }, + cmd = { + "GitConflictChooseTheirs", + "GitConflictChooseOurs", + "GitConflictChooseBoth", + "GitConflictListQf", + "GitConflictRefresh", + "GitConflictNextConflict", + "GitConflictPrevConflict", + }, + keys = { + { "]g", "GitConflictNextConflict", desc = "Next Conflict" }, + { "[g", "GitConflictPrevConflict", desc = "Previous Conflict" }, + { prefix .. "l", "GitConflictListQf", desc = "List Conflicts" }, + { prefix .. "r", "GitConflictRefresh", desc = "Refresh Conflicts" }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "conflicts", icon = " " }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/git/gitgraph.lua b/nvim/lua/plugins/extras/editor/git/gitgraph.lua new file mode 100644 index 0000000..ab73461 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/git/gitgraph.lua @@ -0,0 +1,40 @@ +return { + "isakbm/gitgraph.nvim", + opts = { + symbols = { + merge_commit = "", + commit = "", + }, + format = { + timestamp = "%H:%M:%S %d-%m-%Y", + fields = { "hash", "timestamp", "author", "branch_name", "tag" }, + }, + hooks = { + on_select_commit = function(commit) + if LazyVim.has("diffview.nvim") then + vim.notify("DiffviewOpen " .. commit.hash .. "^!") + vim.cmd(":DiffviewOpen " .. commit.hash .. "^!") + else + print("selected commit:", commit.hash) + end + end, + on_select_range_commit = function(from, to) + if LazyVim.has("diffview.nvim") then + vim.notify("DiffviewOpen " .. from.hash .. "~1.." .. to.hash) + vim.cmd(":DiffviewOpen " .. from.hash .. "~1.." .. to.hash) + else + print("selected range:", from.hash, to.hash) + end + end, + }, + }, + keys = { + { + "gl", + function() + require("gitgraph").draw({}, { all = true, max_count = 5000 }) + end, + desc = "Graph", + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/git/github-extended.lua b/nvim/lua/plugins/extras/editor/git/github-extended.lua new file mode 100644 index 0000000..5015a8c --- /dev/null +++ b/nvim/lua/plugins/extras/editor/git/github-extended.lua @@ -0,0 +1,169 @@ +local prefix = "G" + +return { + { import = "lazyvim.plugins.extras.util.octo" }, + { import = "plugins.extras.lang.git-extended" }, + { + "williamboman/mason.nvim", + opts = function(_, opts) + opts.ensure_installed = opts.ensure_installed or {} + vim.list_extend(opts.ensure_installed, { "gh" }) + end, + }, + { + "almo7aya/openingh.nvim", + cmd = { "OpenInGHRepo", "OpenInGHFile", "OpenInGHFileLines" }, + keys = { + { prefix .. "ro", "OpenInGHRepo", desc = "Open git repo in web", mode = { "n" } }, + { prefix .. "rf", "OpenInGHFile", desc = "Open git file in web", mode = { "n" } }, + { prefix .. "rc", "OpenInGHFileLines", desc = "Open current line in web", mode = { "n", "x", "v" } }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "github", icon = " " }, + { prefix .. "c", group = "comments" }, + { prefix .. "t", group = "threads" }, + { prefix .. "i", group = "issues" }, + { prefix .. "p", group = "pull requests" }, + { prefix .. "pm", group = "merge current PR" }, + { prefix .. "r", group = "repo" }, + { prefix .. "a", group = "assignee/reviewer" }, + { prefix .. "l", group = "label" }, + { prefix .. "e", group = "reaction" }, + { prefix .. "R", group = "review" }, + { prefix .. "g", group = "gist" }, + { prefix .. "s", group = "review" }, + { prefix .. "P", group = "profile" }, + }, + }, + }, + { + "Rawnly/gist.nvim", + cmd = { "GistCreate", "GistCreateFromFile", "GistsList" }, + dependencies = { + "samjwill/nvim-unception", + init = function() + vim.g.unception_block_while_host_edits = true + end, + }, + opts = {}, + keys = { + { prefix .. "gc", "GistCreate", desc = "Create a Gist" }, + { prefix .. "gf", "GistCreateFromFile", desc = "Create a Gist from File" }, + { prefix .. "gl", "GistsList", desc = "List Gists" }, + }, + }, + { + "pwntester/octo.nvim", + opts = { + use_diagnostic_signs = true, + mappings = {}, + }, + keys = { + -- Disable default LazyVim keymaps + { "gi", false }, + { "gI", false }, + { "gp", false }, + { "gP", false }, + { "gr", false }, + { "gS", false }, + + { prefix .. "ca", "Octo comment add", desc = "Add a New Comment" }, + { prefix .. "cd", "Octo comment delete", desc = "Delete a Comment" }, + + { prefix .. "ta", "Octo thread resolve", desc = "Mark Thread as Resolved" }, + { prefix .. "td", "Octo thread unresolve", desc = "Mark Thread as Unresolved" }, + + { prefix .. "ic", "Octo issue close", desc = "Close Current Issue" }, + { prefix .. "ir", "Octo issue reopen", desc = "Reopen Current Issue" }, + { prefix .. "il", "Octo issue list", desc = "List Open Issues" }, + { prefix .. "is", "Octo issue search", desc = "Search Issues" }, + { prefix .. "iu", "Octo issue url", desc = "Copies URL of Current Issue" }, + { prefix .. "io", "Octo issue browser", desc = "Open Current Issue in Browser" }, + + { prefix .. "pp", "Octo pr checkout", desc = "Checkout PR" }, + { prefix .. "pmm", "Octo pr merge commit", desc = "Merge Commit PR" }, + { prefix .. "pms", "Octo pr merge squash", desc = "Squash Merge PR" }, + { prefix .. "pmd", "Octo pr merge delete", desc = "Delete Merge PR" }, + { prefix .. "pmr", "Octo pr merge rebase", desc = "Rebase Merge PR" }, + { prefix .. "pc", "Octo pr close", desc = "Close Current PR" }, + { prefix .. "pn", "Octo pr create", desc = "Create PR for Current Branch" }, + { prefix .. "pd", "Octo pr diff", desc = "Show PR Diff" }, + { prefix .. "ps", "Octo pr search", desc = "Search PR" }, + { prefix .. "ps", "Octo pr list", desc = "List Open PRs" }, + { prefix .. "pr", "Octo pr ready", desc = "Mark Draft as Ready for Review" }, + { prefix .. "po", "Octo pr browser", desc = "Open Current PR in Browser" }, + { prefix .. "pu", "Octo pr url", desc = "Copies URL of Current PR" }, + { prefix .. "pt", "Octo pr commits", desc = "List PR Commits" }, + { prefix .. "pl", "Octo pr commits", desc = "List Changed Files in PR" }, + + { prefix .. "rf", "Octo repo fork", desc = "Fork Repo" }, + { prefix .. "ru", "Octo repo url", desc = "Copies URL of Current Repo" }, + + { prefix .. "aa", " Octo assignee add", desc = "Assign a User" }, + { prefix .. "ar", " Octo assignee remove", desc = "Remove a User" }, + { prefix .. "ap", " Octo reviewer add", desc = "Assign a PR Reviewer" }, + + { prefix .. "la", " Octo label add", desc = "Assign a Label" }, + { prefix .. "lr", " Octo label remove", desc = "Remove a Label" }, + { prefix .. "lc", " Octo label create", desc = "Create a Label" }, + + { prefix .. "e1", "Octo reaction thumbs_up", desc = "Add 👍 Reaction" }, + { prefix .. "e2", "Octo reaction thumbs_down", desc = "Add 👎 Reaction" }, + { prefix .. "e3", "Octo reaction eyes", desc = "Add 👀 Reaction" }, + { prefix .. "e4", "Octo reaction laugh", desc = "Add 😄 Reaction" }, + { prefix .. "e5", "Octo reaction confused", desc = "Add 😕 Reaction" }, + { prefix .. "e6", "Octo reaction rocket", desc = "Add 🚀 Reaction" }, + { prefix .. "e7", "Octo reaction heart", desc = "Add ❤️ Reaction" }, + { prefix .. "e8", "Octo reaction party", desc = "Add 🎉 Reaction" }, + + { prefix .. "x", "Octo actions", desc = "Run an Action" }, + + { prefix .. "ss", " Octo review start", desc = "Start Review" }, + { prefix .. "sf", " Octo review submit", desc = "Submit Review" }, + { prefix .. "sr", " Octo review resume", desc = "Submit Resume" }, + { prefix .. "sd", " Octo review discard", desc = "Delete Pending Review" }, + { prefix .. "sc", " Octo review comments", desc = "View Pending Comments" }, + { prefix .. "sp", " Octo review commit", desc = "Select Commit to Review" }, + { prefix .. "sc", " Octo review close", desc = "Return to PR" }, + }, + }, + { + "2kabhishek/octohub.nvim", + dependencies = { + "2kabhishek/utils.nvim", + }, + cmd = { + "OctoRepos", + "OctoRepo", + "OctoStats", + "OctoActivityStats", + "OctoContributionStats", + "OctoRepoStats", + "OctoProfile", + "OctoRepoWeb", + }, + opts = { + add_default_keybindings = false, + projects_dir = "~/dev/", + }, + keys = { + { prefix .. "rl", "OctoRepos", desc = "List Repos" }, + { prefix .. "rS", "OctoRepos sort:stars", desc = "Top Starred Repos" }, + { prefix .. "rI", "OctoRepos sort:issues", desc = "Top Repos With Issues" }, + { prefix .. "rU", "OctoRepos sort:updated", desc = "Recently Updated Repos" }, + { prefix .. "rP", "OctoRepos type:private", desc = "Private Repos" }, + { prefix .. "rF", "OctoRepos type:fork", desc = "Forked Repos" }, + { prefix .. "rc", "OctoRepo", desc = "Clone/Open Repo" }, + { prefix .. "rs", "OctoRepoStats", desc = "Repo Stats" }, + + { prefix .. "Ps", "OctoStats", desc = "All Stats" }, + { prefix .. "Pa", "OctoActivityStats", desc = "Activity Stats" }, + { prefix .. "Pc", "OctoContributionStats", desc = "Contribution Stats" }, + { prefix .. "Po", "OctoProfile", desc = "Open Profile" }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/git/neogit.lua b/nvim/lua/plugins/extras/editor/git/neogit.lua new file mode 100644 index 0000000..67bc60e --- /dev/null +++ b/nvim/lua/plugins/extras/editor/git/neogit.lua @@ -0,0 +1,24 @@ +local prefix = "gn" + +return { + { + "NeogitOrg/neogit", + cmd = "Neogit", + opts = {}, + keys = { + { prefix .. "n", "Neogit", desc = "Neogit (Root Dir)" }, + { prefix .. "c", "Neogit commit", desc = "Commit" }, + { prefix .. "p", "Neogit pull", desc = "Pull" }, + { prefix .. "P", "Neogit push", desc = "Push" }, + { prefix .. "f", "Neogit fetch", desc = "Fetch" }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "neogit", icon = " " }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/git/worktree.lua b/nvim/lua/plugins/extras/editor/git/worktree.lua new file mode 100644 index 0000000..2860ecc --- /dev/null +++ b/nvim/lua/plugins/extras/editor/git/worktree.lua @@ -0,0 +1,26 @@ +local prefix = "gw" + +return { + { + "ThePrimeagen/git-worktree.nvim", + opts = {}, + config = function() + LazyVim.on_load("telescope.nvim", function() + require("telescope").load_extension("git_worktree") + end) + end, + -- stylua: ignore + keys = { + { prefix .. "m", function() require("telescope").extensions.git_worktree.git_worktrees() end, desc = "Manage Worktrees" }, + { prefix .. "c", function() require("telescope").extensions.git_worktree.create_git_worktree() end, desc = "Create Worktree" }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "worktrees", icon = " " }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/gitsigns-extended.lua b/nvim/lua/plugins/extras/editor/gitsigns-extended.lua new file mode 100644 index 0000000..79a1a00 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/gitsigns-extended.lua @@ -0,0 +1,16 @@ +return { + "lewis6991/gitsigns.nvim", + opts = { + current_line_blame_opts = { + virt_text = true, + virt_text_pos = "eol", -- 'eol' | 'overlay' | 'right_align' + delay = 5, + ignore_whitespace = false, + }, + }, + keys = { + -- stylua: ignore + { "uB", "Gitsigns toggle_current_line_blame", desc = "Toggle Line Blame" }, + { "ghe", "Gitsigns toggle_deleted", desc = "Deletions Inline" }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/hover.lua b/nvim/lua/plugins/extras/editor/hover.lua new file mode 100644 index 0000000..2bd9fa3 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/hover.lua @@ -0,0 +1,22 @@ +return { + "lewis6991/hover.nvim", + init = function() + require("hover.providers.lsp") + require("hover.providers.gh") + require("hover.providers.gh_user") + require("hover.providers.jira") + require("hover.providers.dap") + require("hover.providers.man") + require("hover.providers.dictionary") + end, + opts = { + preview_opts = { + border = "rounded", + }, + }, + -- stylua: ignore + keys = { + { "K", function() require("hover").hover() end, desc = "Hover" }, + { "gk", function() require("hover").hover_select() end, desc = "Hover Select" }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/leap-spooky.lua b/nvim/lua/plugins/extras/editor/leap-spooky.lua new file mode 100644 index 0000000..73c5103 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/leap-spooky.lua @@ -0,0 +1,15 @@ +return { + { import = "lazyvim.plugins.extras.editor.leap" }, + { + "ggandor/leap.nvim", + vscode = true, + dependencies = { + "ggandor/leap-spooky", + vscode = true, + }, + opts = { + prefix = true, + paste_on_remote_yank = true, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/live-server.lua b/nvim/lua/plugins/extras/editor/live-server.lua new file mode 100644 index 0000000..886bc95 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/live-server.lua @@ -0,0 +1,10 @@ +return { + "aurum77/live-server.nvim", + build = function() + require("live_server.util").install() + end, + cmd = { "LiveServer", "LiveServerStart", "LiveServerStop" }, + keys = { + { "cV", ft = "html", "LiveServer", desc = "Live Server" }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/macroni.lua b/nvim/lua/plugins/extras/editor/macroni.lua new file mode 100644 index 0000000..3d370fa --- /dev/null +++ b/nvim/lua/plugins/extras/editor/macroni.lua @@ -0,0 +1,5 @@ +return { + "jesseleite/nvim-macroni", + event = "VeryLazy", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/editor/markmap.lua b/nvim/lua/plugins/extras/editor/markmap.lua new file mode 100644 index 0000000..55561b7 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/markmap.lua @@ -0,0 +1,9 @@ +return { + "Zeioth/markmap.nvim", + build = "yarn global add markmap-cli", + cmd = { "MarkmapOpen", "MarkmapSave", "MarkmapWatch", "MarkmapWatchStop" }, + opts = {}, + keys = { + { "cm", "MarkmapOpen", desc = "Markmap" }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/marks/arena.lua b/nvim/lua/plugins/extras/editor/marks/arena.lua new file mode 100644 index 0000000..26c7c1b --- /dev/null +++ b/nvim/lua/plugins/extras/editor/marks/arena.lua @@ -0,0 +1,43 @@ +return { + { + "dzfrias/arena.nvim", + event = "BufWinEnter", + opts = { + per_project = true, + devicons = true, + }, + -- stylua: ignore + keys = { + { "m", function() require("arena").toggle() end, desc = "Marks" }, + }, + }, + { + "goolord/alpha-nvim", + optional = true, + opts = function(_, dashboard) + -- stylua: ignore + local button = dashboard.button("m", "󰛢 " .. " Marks", function() require("arena").toggle() end) + button.opts.hl = "AlphaButtons" + button.opts.hl_shortcut = "AlphaShortcut" + table.insert(dashboard.section.buttons.val, 5, button) + end, + }, + { + "nvimdev/dashboard-nvim", + optional = true, + opts = function(_, opts) + -- stylua: ignore + local arrow = { + action = function() require("arena").toggle() end, + desc = " Marks", + icon = "󰛢 ", + key = "m", + } + + arrow.desc = arrow.desc .. string.rep(" ", 43 - #arrow.desc) + arrow.key_format = " %s" + + table.insert(opts.config.center, 5, arrow) + end, + }, +} diff --git a/nvim/lua/plugins/extras/editor/marks/arrow.lua b/nvim/lua/plugins/extras/editor/marks/arrow.lua new file mode 100644 index 0000000..55d0a00 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/marks/arrow.lua @@ -0,0 +1,49 @@ +return { + { + "otavioschwanck/arrow.nvim", + event = "VeryLazy", + opts = { + show_icons = true, + }, + -- stylua: ignore + keys = { + { "m", function() require("arrow.ui").openMenu() end, desc = "Marks" }, + }, + }, + { + "nvim-lualine/lualine.nvim", + optional = true, + opts = function(_, opts) + table.insert(opts.sections.lualine_c, require("arrow.statusline").text_for_statusline_with_icons()) + end, + }, + { + "goolord/alpha-nvim", + optional = true, + opts = function(_, dashboard) + -- stylua: ignore + local button = dashboard.button("m", "󰛢 " .. " Marks", function() require("arrow.ui").openMenu() end) + button.opts.hl = "AlphaButtons" + button.opts.hl_shortcut = "AlphaShortcut" + table.insert(dashboard.section.buttons.val, 5, button) + end, + }, + { + "nvimdev/dashboard-nvim", + optional = true, + opts = function(_, opts) + -- stylua: ignore + local arrow = { + action = function() require("arrow.ui").openMenu() end, + desc = " Marks", + icon = "󰛢 ", + key = "m", + } + + arrow.desc = arrow.desc .. string.rep(" ", 43 - #arrow.desc) + arrow.key_format = " %s" + + table.insert(opts.config.center, 5, arrow) + end, + }, +} diff --git a/nvim/lua/plugins/extras/editor/marks/bookmarks.lua b/nvim/lua/plugins/extras/editor/marks/bookmarks.lua new file mode 100644 index 0000000..6560b39 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/marks/bookmarks.lua @@ -0,0 +1,43 @@ +return { + "tomasky/bookmarks.nvim", + config = function() + require("bookmarks").setup({ + save_file = vim.fn.stdpath("state") .. "/bookmarks", + keywords = { + ["@t"] = "󰄵 ", + ["@w"] = " ", + ["@f"] = "󰁨 ", + ["@n"] = " ", + }, + }) + LazyVim.on_load("telescope.nvim", function() + require("telescope").setup({ + extensions = { + repo = { + list = { + fd_opts = { + "--no-ignore-vcs", + }, + search_dirs = { + "~/Repos/", + }, + }, + }, + }, + }) + require("telescope").load_extension("bookmarks") + end) + end, + -- stylua: ignore + keys = { + { "fB", "Telescope bookmarks list", desc = "Bookmarks" }, + { "mm", function() require("bookmarks").bookmark_toggle() end, desc = "Toggle Bookmark" }, + { "ml", function() require("bookmarks").bookmark_ann() end, desc = "Add/Edit Current Line" }, + { "mc", function() require("bookmarks").bookmark_clean() end, desc = "Clear All Bookmarks" }, + { "mn", function() require("bookmarks").bookmark_next() end, desc = "Next Bookmark" }, + { "mp", function() require("bookmarks").bookmark_prev() end, desc = "Previous Bookmark" }, + { "]k", function() require("bookmarks").bookmark_next() end, desc = "Next Bookmark" }, + { "[k", function() require("bookmarks").bookmark_prev() end, desc = "Previous Bookmark" }, + { "mL", function() require("bookmarks").bookmark_list() end, desc = "List Bookmarks" }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/marks/grapple.lua b/nvim/lua/plugins/extras/editor/marks/grapple.lua new file mode 100644 index 0000000..ca6fb91 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/marks/grapple.lua @@ -0,0 +1,83 @@ +local prefix = "m" + +local keys = {} + +-- stylua: ignore start +for i = 1, 9 do + table.insert(keys, { prefix .. i, "Grapple select index=" .. i .. "", desc = "File " .. i }) +end + +table.insert(keys, { prefix .. "a", "Grapple tag", desc = "Add Mark" }) +table.insert(keys, { prefix .. "m", "Grapple toggle_tags", desc = "Marks" }) +table.insert(keys, { prefix .. "t", "Telescope grapple tags", desc = "Marks (Telescope)" }) +table.insert(keys, { prefix .. "C", "Grapple reset", desc = "Clear all Marks" }) +table.insert(keys, { prefix .. "c", "Grapple untag", desc = "Clear Current Mark" }) +table.insert(keys, { prefix .. "s", "Grapple toggle_scopes", desc = "Scopes" }) +table.insert(keys, { prefix .. "S", "Grapple toggle_loaded", desc = "Loaded Scopes" }) + +table.insert(keys, { "]k", "Grapple cycle forward", desc = "Next Mark" }) +table.insert(keys, { "[k", "Grapple cycle backward", desc = "Prev Mark" }) + +table.insert(keys, { "", "Grapple cycle forward", desc = "Next Mark" }) +table.insert(keys, { "", "Grapple cycle backward", desc = "Prev Mark" }) +-- stylua: ignore end + +return { + { + "cbochs/grapple.nvim", + cmd = { "Grapple" }, + keys = keys, + config = function() + require("grapple").setup({ + win_opts = { + footer = "", + }, + }) + LazyVim.on_load("telescope.nvim", function() + require("telescope").load_extension("grapple") + end) + end, + }, + { + "goolord/alpha-nvim", + optional = true, + opts = function(_, dashboard) + local button = dashboard.button("m", "󰛢 " .. " Marks", "Grapple toggle_tags") + button.opts.hl = "AlphaButtons" + button.opts.hl_shortcut = "AlphaShortcut" + table.insert(dashboard.section.buttons.val, 5, button) + end, + }, + { + "nvimdev/dashboard-nvim", + optional = true, + opts = function(_, opts) + local grapple = { + action = "Grapple toggle_tags", + desc = " Marks", + icon = "󰛢 ", + key = "m", + } + + grapple.desc = grapple.desc .. string.rep(" ", 43 - #grapple.desc) + grapple.key_format = " %s" + + table.insert(opts.config.center, 5, grapple) + end, + }, + { + "nvim-lualine/lualine.nvim", + optional = true, + opts = function(_, opts) + table.insert(opts.sections.lualine_c, { require("grapple").statusline, cond = require("grapple").exists }) + end, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "marks", icon = "󰛢 " }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/marks/harpoon-extended.lua b/nvim/lua/plugins/extras/editor/marks/harpoon-extended.lua new file mode 100644 index 0000000..e2c2607 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/marks/harpoon-extended.lua @@ -0,0 +1,110 @@ +local prefix = "m" + +local keys = {} + +-- stylua: ignore start +for i = 1, 9 do + table.insert(keys, { prefix .. i, function() require("harpoon"):list():select(i) end, desc = "File " .. i }) +end + +table.insert(keys, { prefix .. "a", function() require("harpoon"):list():add() end, desc = "Add Mark" }) +table.insert(keys, { prefix .. "m", function() require("harpoon").ui:toggle_quick_menu(require("harpoon"):list()) end, desc = "Marks" }) +table.insert(keys, { prefix .. "t", "Telescope harpoon marks", desc = "Marks (Telescope)" }) +table.insert(keys, { prefix .. "c", function() require("harpoon"):list():clear() end, desc = "Clear all Marks" }) + +table.insert(keys, { "]k", function() require("harpoon"):list():next() end, desc = "Next Mark" }) +table.insert(keys, { "[k", function() require("harpoon"):list():prev() end, desc = "Prev Mark" }) + +table.insert(keys, { "", function() require("harpoon"):list():next() end, desc = "Next Mark" }) +table.insert(keys, { "", function() require("harpoon"):list():prev() end, desc = "Prev Mark" }) +-- stylua: ignore end + +return { + { + "ThePrimeagen/harpoon", + branch = "harpoon2", + dependencies = { + "nvim-lua/plenary.nvim", + }, + keys = keys, + config = function() + local harpoon = require("harpoon") + harpoon:setup({ + menu = { + width = vim.api.nvim_win_get_width(0) - 4, + }, + settings = { + save_on_toggle = true, + }, + }) + + harpoon:extend({ + UI_CREATE = function(cx) + vim.keymap.set("n", "", function() + harpoon.ui:select_menu_item({ vsplit = true }) + end, { buffer = cx.bufnr }) + + vim.keymap.set("n", "", function() + harpoon.ui:select_menu_item({ split = true }) + end, { buffer = cx.bufnr }) + + vim.keymap.set("n", "", function() + harpoon.ui:select_menu_item({ tabedit = true }) + end, { buffer = cx.bufnr }) + end, + }) + + LazyVim.on_load("telescope.nvim", function() + require("telescope").load_extension("harpoon") + end) + end, + }, + { + "nvim-lualine/lualine.nvim", + dependencies = { + "abeldekat/harpoonline", + opts = { formatter = "short", icon = "󰛢" }, + }, + optional = true, + opts = function(_, opts) + table.insert(opts.sections.lualine_c, require("harpoonline").format) + end, + }, + { + "goolord/alpha-nvim", + optional = true, + opts = function(_, dashboard) + -- stylua: ignore + local button = dashboard.button("m", "󰛢 " .. " Marks", function() require("harpoon").ui:toggle_quick_menu(require("harpoon"):list()) end) + button.opts.hl = "AlphaButtons" + button.opts.hl_shortcut = "AlphaShortcut" + table.insert(dashboard.section.buttons.val, 5, button) + end, + }, + { + "nvimdev/dashboard-nvim", + optional = true, + opts = function(_, opts) + local harpoon = { + -- stylua: ignore + action = function() require("harpoon").ui:toggle_quick_menu(require("harpoon"):list()) end, + desc = " Marks", + icon = "󰛢 ", + key = "m", + } + + harpoon.desc = harpoon.desc .. string.rep(" ", 43 - #harpoon.desc) + harpoon.key_format = " %s" + + table.insert(opts.config.center, 5, harpoon) + end, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "marks", icon = "󰛢 " }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/marks/mini-visits.lua b/nvim/lua/plugins/extras/editor/marks/mini-visits.lua new file mode 100644 index 0000000..880cca4 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/marks/mini-visits.lua @@ -0,0 +1,26 @@ +local prefix = "m" + +return { + { + "echasnovski/mini.visits", + event = "BufEnter", + opts = {}, + -- stylua: ignore + keys = { + { prefix .. "a", function() require("mini.visits").add_label() end, desc = "Add Label" }, + { prefix .. "r", function() require("mini.visits").remove_label() end, desc = "Remove Label" }, + { prefix .. "l", function() require("mini.visits").select_label("", nil) end, desc = "Select Label (cwd)", }, + { prefix .. "L", function() require("mini.visits").select_label("", "") end, desc = "Select Label (all)", }, + { prefix .. "p", function() require("mini.visits").select_path() end, desc = "Visited Path (cwd)", }, + { prefix .. "P", function() require("mini.visits").select_path("") end, desc = "Visited Path (all)", }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "marks", icon = "󰛢 " }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/neo-tree-extended.lua b/nvim/lua/plugins/extras/editor/neo-tree-extended.lua new file mode 100644 index 0000000..aad7f33 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/neo-tree-extended.lua @@ -0,0 +1,52 @@ +return { + "nvim-neo-tree/neo-tree.nvim", + opts = { + close_if_last_window = true, + window = { + mappings = { + ["e"] = "open", + ["E"] = function() + vim.api.nvim_exec("Neotree focus filesystem left", true) + end, + ["b"] = function() + vim.api.nvim_exec("Neotree focus buffers left", true) + end, + ["g"] = function() + vim.api.nvim_exec("Neotree focus git_status left", true) + end, + [""] = "fuzzy_finder_directory", + ["D"] = function(state) + local node = state.tree:get_node() + local log = require("neo-tree.log") + state.clipboard = state.clipboard or {} + if diff_Node and diff_Node ~= tostring(node.id) then + local current_Diff = node.id + require("neo-tree.utils").open_file(state, diff_Node, open) + vim.cmd("vert diffs " .. current_Diff) + log.info("Diffing " .. diff_Name .. " against " .. node.name) + diff_Node = nil + current_Diff = nil + state.clipboard = {} + require("neo-tree.ui.renderer").redraw(state) + else + local existing = state.clipboard[node.id] + if existing and existing.action == "diff" then + state.clipboard[node.id] = nil + diff_Node = nil + require("neo-tree.ui.renderer").redraw(state) + else + state.clipboard[node.id] = { action = "diff", node = node } + diff_Name = state.clipboard[node.id].node.name + diff_Node = tostring(state.clipboard[node.id].node.id) + log.info("Diff source file " .. diff_Name) + require("neo-tree.ui.renderer").redraw(state) + end + end + end, + }, + }, + filesystem = { + hijack_netrw_behavior = "open_default", + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/numb.lua b/nvim/lua/plugins/extras/editor/numb.lua new file mode 100644 index 0000000..dd16293 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/numb.lua @@ -0,0 +1,5 @@ +return { + "nacro90/numb.nvim", + event = "CmdlineEnter", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/editor/oil.lua b/nvim/lua/plugins/extras/editor/oil.lua new file mode 100644 index 0000000..994e31a --- /dev/null +++ b/nvim/lua/plugins/extras/editor/oil.lua @@ -0,0 +1,21 @@ +return { + "stevearc/oil.nvim", + dependencies = { + "nvim-tree/nvim-web-devicons", + optional = true, + }, + opts = { + delete_to_trash = true, + float = { + max_height = 45, + max_width = 90, + }, + keymaps = { + ["q"] = "actions.close", + }, + }, + -- stylua: ignore + keys = { + { ";", function() require("oil").toggle_float() end, desc = "Toggle Oil" }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/outline-extended.lua b/nvim/lua/plugins/extras/editor/outline-extended.lua new file mode 100644 index 0000000..9d55ac1 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/outline-extended.lua @@ -0,0 +1,16 @@ +return { + { import = "lazyvim.plugins.extras.editor.outline" }, + { + "hedyhli/outline.nvim", + opts = { + outline_window = { + show_symbol_lineno = true, + auto_jump = true, + jump_highlight_duration = 150, + }, + symbol_folding = { + autofold_depth = 1, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/package-info.lua b/nvim/lua/plugins/extras/editor/package-info.lua new file mode 100644 index 0000000..c204b8d --- /dev/null +++ b/nvim/lua/plugins/extras/editor/package-info.lua @@ -0,0 +1,37 @@ +local prefix = "p" + +return { + { + "vuki656/package-info.nvim", + event = { + "BufRead package.json", + "BufRead package-lock.json", + }, + opts = {}, + -- stylua: ignore + keys = { + { prefix .. "wv", function() require('package-info').show({ force = true }) end, desc = "Show Package Versions" }, + { prefix .. "wu", function() require('package-info').update() end, desc = "Update Package" }, + { prefix .. "wr", function() require('package-info').delete() end, desc = "Remove Package" }, + { prefix .. "wc", function() require('package-info').change_version() end, desc = "Change Package Version" }, + { prefix .. "wi", function() require('package-info').install() end, desc = "Install New Dependency" }, + }, + }, + { + "voldikss/vim-floaterm", + optional = true, + -- stylua: ignore + keys = { + { prefix .. "wp", "FloatermNew --disposable --name=lazynpm --opener=edit --titleposition=center --height=0.85 --width=0.85 --cwd= lazynpm", desc = "Lazynpm" }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "packages/dependencies", icon = " ", mode = { "n", "v" } }, + { prefix .. "w", group = "web", icon = "󰖟 ", mode = { "n", "v" } }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/regex.lua b/nvim/lua/plugins/extras/editor/regex.lua new file mode 100644 index 0000000..589d295 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/regex.lua @@ -0,0 +1,19 @@ +return { + "bennypowers/nvim-regexplainer", + dependencies = { + "MunifTanjim/nui.nvim", + }, + opts = { + auto = "true", + }, + -- stylua: ignore + keys = { + { + "gR", + function() + require("regexplainer").show() + end, + desc = "Regexplainer", + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/retirement.lua b/nvim/lua/plugins/extras/editor/retirement.lua new file mode 100644 index 0000000..a60cdad --- /dev/null +++ b/nvim/lua/plugins/extras/editor/retirement.lua @@ -0,0 +1,8 @@ +return { + "chrisgrieser/nvim-early-retirement", + event = "VeryLazy", + opts = { + retirementAgeMins = 30, + ignoreUnsavedChangesBufs = false, + }, +} diff --git a/nvim/lua/plugins/extras/editor/search-replace.lua b/nvim/lua/plugins/extras/editor/search-replace.lua new file mode 100644 index 0000000..89102e5 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/search-replace.lua @@ -0,0 +1,50 @@ +local prefix = "sr" + +return { + { + "roobert/search-replace.nvim", + opts = { + default_replace_single_buffer_options = "gcI", + default_replace_multi_buffer_options = "egcI", + }, + -- stylua: ignore + keys = { + { prefix .. "b", "SearchReplaceSingleBufferVisualSelection", desc = "Buffer", mode = "v" }, + { prefix .. "v", "SearchReplaceWithinVisualSelection", desc = "Visual Selection", mode = "v" }, + { prefix .. "w", "SearchReplaceWithinVisualSelectionCWord", desc = "Word on Buffer", mode = "v" }, + + { prefix .. "b", "SearchReplaceSingleBufferOpen", desc = "Buffer", mode = "n" }, + { prefix .. "w", "SearchReplaceSingleBufferCWord", desc = "Word on Buffer", mode = "n" }, + { prefix .. "W", "SearchReplaceSingleBufferCWORD", desc = "WORD on Buffer", mode = "n" }, + { prefix .. "e", "SearchReplaceSingleBufferCExpr", desc = "Expression on Buffer", mode = "n" }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "replace", icon = " " }, + }, + }, + }, + { + "MagicDuck/grug-far.nvim", + keys = { + { + prefix .. "p", + function() + local grug = require("grug-far") + local ext = vim.bo.buftype == "" and vim.fn.expand("%:e") + grug.grug_far({ + transient = true, + prefills = { + filesFilter = ext and ext ~= "" and "*." .. ext or nil, + }, + }) + end, + mode = { "n", "v" }, + desc = "Project", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/spectre.lua b/nvim/lua/plugins/extras/editor/spectre.lua new file mode 100644 index 0000000..c31dd43 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/spectre.lua @@ -0,0 +1,39 @@ +local prefix = "sr" + +return { + { + "nvim-pack/nvim-spectre", + build = false, + cmd = "Spectre", + opts = { + open_cmd = "noswapfile vnew", + default = { + find = { + cmd = "rg", + }, + replace = { + cmd = "sd", + }, + }, + use_trouble_qf = true, + }, + -- stylua: ignore + keys = { + { prefix .. "g", function() require("spectre").toggle() end, desc = "Globally" }, + { prefix .. "G", mode = { "n" }, function() require("spectre").open_visual({ select_word = true }) end, desc = "Word Globally" }, + { prefix .. "G", mode = { "v" }, function() require("spectre").open_visual() end, desc = "Word Globally" }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "replace", icon = " " }, + }, + }, + }, + { + "MagicDuck/grug-far.nvim", + enabled = false, + }, +} diff --git a/nvim/lua/plugins/extras/editor/ssr.lua b/nvim/lua/plugins/extras/editor/ssr.lua new file mode 100644 index 0000000..57cf57c --- /dev/null +++ b/nvim/lua/plugins/extras/editor/ssr.lua @@ -0,0 +1,8 @@ +return { + "cshuaimin/ssr.nvim", + opts = {}, + -- stylua: ignore + keys = { + { "srs", function() require("ssr").open() end, desc = "Structural" }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/suda.lua b/nvim/lua/plugins/extras/editor/suda.lua new file mode 100644 index 0000000..657111f --- /dev/null +++ b/nvim/lua/plugins/extras/editor/suda.lua @@ -0,0 +1,11 @@ +return { + "lambdalisue/suda.vim", + -- stylua: ignore + keys = { + { "W", ":SudaWrite", desc = "Suda Write" }, + }, + cmd = { + "SudaRead", + "SudaWrite", + }, +} diff --git a/nvim/lua/plugins/extras/editor/tabscope.lua b/nvim/lua/plugins/extras/editor/tabscope.lua new file mode 100644 index 0000000..57def81 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/tabscope.lua @@ -0,0 +1,8 @@ +return { + "akinsho/bufferline.nvim", + optional = true, + dependencies = { + "backdround/tabscope.nvim", + opts = {}, + }, +} diff --git a/nvim/lua/plugins/extras/editor/telescope/all-recent.lua b/nvim/lua/plugins/extras/editor/telescope/all-recent.lua new file mode 100644 index 0000000..1b3db11 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/telescope/all-recent.lua @@ -0,0 +1,27 @@ +return { + "nvim-telescope/telescope.nvim", + dependencies = { + "prochri/telescope-all-recent.nvim", + dependencies = { + "kkharji/sqlite.lua", + }, + opts = { + pickers = { + ["workspaces.nvim#workspaces"] = { + disable = false, + sorting = "frecency", + }, + ["project.nvim#projects"] = { + disable = false, + sorting = "frecency", + }, + ["yanky.nvim#yank_history"] = { + disable = true, + }, + ["zoxide.nvim#zoxide"] = { + disable = true, + }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/telescope/file-browser.lua b/nvim/lua/plugins/extras/editor/telescope/file-browser.lua new file mode 100644 index 0000000..d2210a4 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/telescope/file-browser.lua @@ -0,0 +1,28 @@ +return { + "nvim-telescope/telescope-file-browser.nvim", + config = function() + LazyVim.on_load("telescope.nvim", function() + require("telescope").setup({ + extensions = { + file_browser = { + hijack_netrw = true, + }, + }, + }) + require("telescope").load_extension("file_browser") + end) + end, + dependencies = { + "nvim-telescope/telescope.nvim", + "nvim-lua/plenary.nvim", + { + "nvim-tree/nvim-web-devicons", + optional = true, + }, + }, + -- stylua: ignore + keys = { + { "'", "Telescope file_browser", desc = "Telescope File Browser (root dir)" }, + { '"', "Telescope file_browser path=%:p:h select_buffer=true", desc = "Telescope File Browser (cwd)" }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/telescope/frecuency.lua b/nvim/lua/plugins/extras/editor/telescope/frecuency.lua new file mode 100644 index 0000000..5b63f53 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/telescope/frecuency.lua @@ -0,0 +1,13 @@ +return { + "nvim-telescope/telescope-frecency.nvim", + opts = {}, + config = function() + LazyVim.on_load("telescope.nvim", function() + require("telescope").load_extension("frecency") + end) + end, + keys = { + { "fq", "Telescope frecency", desc = "Frecency (Root Dir)" }, + { "fQ", "Telescope frecency workspace=CWD", desc = "Frecency (cwd)" }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/telescope/headings.lua b/nvim/lua/plugins/extras/editor/telescope/headings.lua new file mode 100644 index 0000000..5e3dc5c --- /dev/null +++ b/nvim/lua/plugins/extras/editor/telescope/headings.lua @@ -0,0 +1,18 @@ +return { + "crispgm/telescope-heading.nvim", + config = function() + LazyVim.on_load("telescope.nvim", function() + require("telescope").setup({ + extensions = { + heading = { + treesitter = true, + }, + }, + }) + require("telescope").load_extension("heading") + end) + end, + keys = { + { "s#", "Telescope heading", desc = "Headings" }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/telescope/import.lua b/nvim/lua/plugins/extras/editor/telescope/import.lua new file mode 100644 index 0000000..f209407 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/telescope/import.lua @@ -0,0 +1,19 @@ +return { + "piersolenski/telescope-import.nvim", + opts = {}, + config = function() + LazyVim.on_load("telescope.nvim", function() + require("telescope").setup({ + extensions = { + import = { + insert_at_top = true, + }, + }, + }) + require("telescope").load_extension("import") + end) + end, + keys = { + { "sI", "Telescope import", desc = "Imports" }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/telescope/lazy.lua b/nvim/lua/plugins/extras/editor/telescope/lazy.lua new file mode 100644 index 0000000..752e10a --- /dev/null +++ b/nvim/lua/plugins/extras/editor/telescope/lazy.lua @@ -0,0 +1,11 @@ +return { + "tsakirist/telescope-lazy.nvim", + config = function() + LazyVim.on_load("telescope.nvim", function() + require("telescope").load_extension("lazy") + end) + end, + keys = { + { "sp", "Telescope lazy", desc = "Plugins (Lazy)" }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/telescope/live-grep.lua b/nvim/lua/plugins/extras/editor/telescope/live-grep.lua new file mode 100644 index 0000000..f3e3bce --- /dev/null +++ b/nvim/lua/plugins/extras/editor/telescope/live-grep.lua @@ -0,0 +1,13 @@ +return { + "nvim-telescope/telescope-live-grep-args.nvim", + config = function() + LazyVim.on_load("telescope.nvim", function() + require("telescope").load_extension("lazy") + end) + end, + -- stylua: ignore + keys = { + { "sg", function() require("telescope").extensions.live_grep_args.live_grep_args() end, desc = "Grep (root dir)" }, + { "/", function() require("telescope").extensions.live_grep_args.live_grep_args() end, desc = "Grep (root dir)" }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/telescope/luasnip.lua b/nvim/lua/plugins/extras/editor/telescope/luasnip.lua new file mode 100644 index 0000000..9a45a03 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/telescope/luasnip.lua @@ -0,0 +1,11 @@ +return { + "benfowler/telescope-luasnip.nvim", + config = function() + LazyVim.on_load("telescope.nvim", function() + require("telescope").load_extension("luasnip") + end) + end, + keys = { + { "sl", "Telescope luasnip", desc = "Luasnip (Snippets)" }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/telescope/media.lua b/nvim/lua/plugins/extras/editor/telescope/media.lua new file mode 100644 index 0000000..54cdceb --- /dev/null +++ b/nvim/lua/plugins/extras/editor/telescope/media.lua @@ -0,0 +1,18 @@ +return { + "dharmx/telescope-media.nvim", + config = function() + LazyVim.on_load("telescope.nvim", function() + require("telescope").setup({ + extensions = { + media = { + backend = "ueberzug", -- image/gif backend + }, + }, + }) + require("telescope").load_extension("media") + end) + end, + keys = { + { "sM", "Telescope media", desc = "Media" }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/telescope/repo.lua b/nvim/lua/plugins/extras/editor/telescope/repo.lua new file mode 100644 index 0000000..ff29864 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/telescope/repo.lua @@ -0,0 +1,69 @@ +return { + { + "cljoly/telescope-repo.nvim", + event = "VeryLazy", + dependencies = { + { + "airblade/vim-rooter", + init = function() + vim.g["rooter_cd_cmd"] = "lcd" + vim.g["rooter_silent_chdir"] = 1 + end, + }, + { "nvim-telescope/telescope.nvim" }, + { "nvim-lua/plenary.nvim" }, + }, + opts = {}, + config = function() + LazyVim.on_load("telescope.nvim", function() + require("telescope").setup({ + extensions = { + repo = { + list = { + fd_opts = { + "--no-ignore-vcs", + }, + search_dirs = { + "~/dev/", + }, + }, + }, + }, + }) + require("telescope").load_extension("repo") + end) + end, + -- stylua: ignore + keys = { + { "fp", "Telescope repo list", desc = "Projects (~/dev)" }, + { "fP", "lua require'telescope'.extensions.repo.list{search_dirs = { '~/' }}", desc = "Projects (System)" }, + }, + }, + { + "goolord/alpha-nvim", + optional = true, + opts = function(_, dashboard) + local button = dashboard.button("r", " " .. " Repos", "Telescope repo list") + button.opts.hl = "AlphaButtons" + button.opts.hl_shortcut = "AlphaShortcut" + table.insert(dashboard.section.buttons.val, 4, button) + end, + }, + { + "nvimdev/dashboard-nvim", + optional = true, + opts = function(_, opts) + local projects = { + action = "Telescope repo list", + desc = " Repos", + icon = " ", + key = "r", + } + + projects.desc = projects.desc .. string.rep(" ", 43 - #projects.desc) + projects.key_format = " %s" + + table.insert(opts.config.center, 4, projects) + end, + }, +} diff --git a/nvim/lua/plugins/extras/editor/telescope/telescope-extended.lua b/nvim/lua/plugins/extras/editor/telescope/telescope-extended.lua new file mode 100644 index 0000000..2858f40 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/telescope/telescope-extended.lua @@ -0,0 +1,126 @@ +local symbols_prefix = "ss" +local symbols_workspace_prefix = "sS" +local actions = require("telescope.actions") + +return { + { import = "lazyvim.plugins.extras.editor.telescope" }, + { + "nvim-telescope/telescope.nvim", + -- stylua: ignore + keys = { + { + symbols_prefix .. "a", + LazyVim.pick("lsp_document_symbols", { symbols = { "Class", "Function", "Method", "Constructor", "Interface", "Module", "Struct", "Trait", "Field", "Property", "Enum", "Constant" } }), + desc = "All", + }, + { symbols_prefix .. "c", LazyVim.pick("lsp_document_symbols", { symbols = { "Class" } }), desc = "Class" }, + { symbols_prefix .. "f", LazyVim.pick("lsp_document_symbols", { symbols = { "Function" } }), desc = "Function" }, + { symbols_prefix .. "m", LazyVim.pick("lsp_document_symbols", { symbols = { "Method" } }), desc = "Method" }, + { symbols_prefix .. "C", LazyVim.pick("lsp_document_symbols", { symbols = { "Constructor" } }), desc = "Constructor" }, + { symbols_prefix .. "e", LazyVim.pick("lsp_document_symbols", { symbols = { "Enum" } }), desc = "Enum" }, + { symbols_prefix .. "i", LazyVim.pick("lsp_document_symbols", { symbols = { "Interface" } }), desc = "Interface" }, + { symbols_prefix .. "M", LazyVim.pick("lsp_document_symbols", { symbols = { "Module" } }), desc = "Module" }, + { symbols_prefix .. "s", LazyVim.pick("lsp_document_symbols", { symbols = { "Struct" } }), desc = "Struct" }, + { symbols_prefix .. "t", LazyVim.pick("lsp_document_symbols", { symbols = { "Trait" } }), desc = "Trait" }, + { symbols_prefix .. "F", LazyVim.pick("lsp_document_symbols", { symbols = { "Field" } }), desc = "Field" }, + { symbols_prefix .. "p", LazyVim.pick("lsp_document_symbols", { symbols = { "Property" } }), desc = "Property" }, + { symbols_prefix .. "v", LazyVim.pick("lsp_document_symbols", { symbols = { "Variable", "Parameter" } }), desc = "Variable" }, + { + symbols_workspace_prefix .. "a", + LazyVim.pick("lsp_dynamic_workspace_symbols", { symbols = { "Class", "Function", "Method", "Constructor", "Interface", "Module", "Struct", "Trait", "Field", "Property", "Enum", "Constant" } }), + desc = "All", + }, + { symbols_workspace_prefix .. "c", LazyVim.pick("lsp_dynamic_workspace_symbols", { symbols = { "Class" } }), desc = "Class" }, + { symbols_workspace_prefix .. "f", LazyVim.pick("lsp_dynamic_workspace_symbols", { symbols = { "Function" } }), desc = "Function" }, + { symbols_workspace_prefix .. "m", LazyVim.pick("lsp_dynamic_workspace_symbols", { symbols = { "Method" } }), desc = "Method" }, + { symbols_workspace_prefix .. "C", LazyVim.pick("lsp_dynamic_workspace_symbols", { symbols = { "Constructor" } }), desc = "Constructor" }, + { symbols_workspace_prefix .. "e", LazyVim.pick("lsp_dynamic_workspace_symbols", { symbols = { "Enum" } }), desc = "Enum" }, + { symbols_workspace_prefix .. "i", LazyVim.pick("lsp_dynamic_workspace_symbols", { symbols = { "Interface" } }), desc = "Interface" }, + { symbols_workspace_prefix .. "M", LazyVim.pick("lsp_dynamic_workspace_symbols", { symbols = { "Module" } }), desc = "Module" }, + { symbols_workspace_prefix .. "s", LazyVim.pick("lsp_dynamic_workspace_symbols", { symbols = { "Struct" } }), desc = "Struct" }, + { symbols_workspace_prefix .. "t", LazyVim.pick("lsp_dynamic_workspace_symbols", { symbols = { "Trait" } }), desc = "Trait" }, + { symbols_workspace_prefix .. "F", LazyVim.pick("lsp_dynamic_workspace_symbols", { symbols = { "Field" } }), desc = "Field" }, + { symbols_workspace_prefix .. "p", LazyVim.pick("lsp_dynamic_workspace_symbols", { symbols = { "Property" } }), desc = "Property" }, + { symbols_workspace_prefix .. "v", LazyVim.pick("lsp_dynamic_workspace_symbols", { symbols = { "Variable", "Parameter" } }), desc = "Variable" }, + { "sA", LazyVim.pick("treesitter"), desc = "Treesitter Symbols" }, + { "sP", "Telescope builtin", desc = "Pickers (Telescope)" }, + { "fh", LazyVim.pick("find_files", { hidden = true }), desc = "Find Files (hidden)" }, + { "", LazyVim.pick("find_files", { hidden = true }), desc = "Find Files (hidden)" }, + { "gb", "Telescope git_branches", desc = "Branches" }, + { "S", "Telescope spell_suggest", desc = "Spelling" }, + { "gs", false }, + }, + opts = { + defaults = { + mappings = { + i = { + [""] = actions.move_selection_previous, + [""] = actions.move_selection_next, + [""] = actions.close, + [""] = require("telescope.actions.layout").toggle_preview, + [""] = require("telescope.actions.layout").cycle_layout_next, + [""] = require("telescope.actions.layout").cycle_layout_prev, + [""] = actions.cycle_history_next, + [""] = actions.cycle_history_prev, + [""] = require("telescope.actions").select_tab_drop, + [""] = require("telescope.actions").results_scrolling_left, + [""] = require("telescope.actions").results_scrolling_right, + }, + }, + file_ignore_patterns = { + ".gitignore", + "node_modules", + "build", + "dist", + "yarn.lock", + "*.git/*", + "*/tmp/*", + }, + }, + pickers = { + find_files = { + hidden = false, + }, + buffers = { + layout_config = { + height = 0.7, + width = 0.7, + }, + mappings = { + i = { + [""] = require("telescope.actions").delete_buffer, + }, + }, + }, + spell_suggest = { + layout_config = { + prompt_position = "top", + height = 0.3, + width = 0.25, + }, + sorting_strategy = "ascending", + }, + }, + extensions = { + fzf = { + fuzzy = true, + override_generic_sorter = true, + override_file_sorter = true, + case_mode = "smart_case", + }, + ["ui-select"] = { + require("telescope.themes").get_dropdown({}), + }, + }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { symbols_prefix, group = "goto symbols", icon = " " }, + { symbols_workspace_prefix, group = "goto symbols (Workspace)", icon = " " }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/telescope/undotree.lua b/nvim/lua/plugins/extras/editor/telescope/undotree.lua new file mode 100644 index 0000000..a302094 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/telescope/undotree.lua @@ -0,0 +1,25 @@ +return { + { + "debugloop/telescope-undo.nvim", + opts = {}, + config = function() + LazyVim.on_load("telescope.nvim", function() + require("telescope").setup({ + extensions = { + undo = { + side_by_side = true, + layout_strategy = "vertical", + layout_config = { + preview_height = 0.6, + }, + }, + }, + }) + require("telescope").load_extension("undo") + end) + end, + keys = { + { "su", "Telescope undo", desc = "Undos" }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/telescope/urlview.lua b/nvim/lua/plugins/extras/editor/telescope/urlview.lua new file mode 100644 index 0000000..71b6cea --- /dev/null +++ b/nvim/lua/plugins/extras/editor/telescope/urlview.lua @@ -0,0 +1,9 @@ +return { + "axieax/urlview.nvim", + dependencies = { "nvim-telescope/telescope.nvim" }, + cmd = { "UrlView" }, + keys = { { "sU", "UrlView", desc = "Search Urls" } }, + opts = { + default_picker = "telescope", + }, +} diff --git a/nvim/lua/plugins/extras/editor/telescope/workspaces.lua b/nvim/lua/plugins/extras/editor/telescope/workspaces.lua new file mode 100644 index 0000000..c8ef894 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/telescope/workspaces.lua @@ -0,0 +1,55 @@ +return { + { + "natecraddock/workspaces.nvim", + event = "VeryLazy", + cmd = { + "WorkspacesAdd", + "WorkspacesAddDir", + "WorkspacesRemove", + "WorkspacesRename", + "WorkspacesOpen", + "WorkspacesList", + "WorkspacesListDirs", + }, + config = function() + require("workspaces").setup({ + hooks = { + open = { "Telescope find_files" }, + }, + }) + LazyVim.on_load("telescope.nvim", function() + require("telescope").load_extension("workspaces") + end) + end, + keys = { + { "fw", "Telescope workspaces", desc = "Workspaces" }, + }, + }, + { + "goolord/alpha-nvim", + optional = true, + opts = function(_, dashboard) + local button = dashboard.button("w", "󰭤 " .. " Workspaces", "Telescope workspaces") + button.opts.hl = "AlphaButtons" + button.opts.hl_shortcut = "AlphaShortcut" + table.insert(dashboard.section.buttons.val, 4, button) + end, + }, + { + "nvimdev/dashboard-nvim", + optional = true, + opts = function(_, opts) + local projects = { + action = "Telescope workspaces", + desc = " Workspaces", + icon = "󰭤 ", + key = "w", + } + + projects.desc = projects.desc .. string.rep(" ", 43 - #projects.desc) + projects.key_format = " %s" + + table.insert(opts.config.center, 4, projects) + end, + }, +} diff --git a/nvim/lua/plugins/extras/editor/telescope/zoxide.lua b/nvim/lua/plugins/extras/editor/telescope/zoxide.lua new file mode 100644 index 0000000..5002a24 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/telescope/zoxide.lua @@ -0,0 +1,53 @@ +return { + { + "jvgrootveld/telescope-zoxide", + config = function() + LazyVim.on_load("telescope.nvim", function() + require("telescope").setup({ + extensions = { + zoxide = { + mappings = { + default = { + after_action = function(selection) + require("telescope.builtin").find_files({ cwd = selection.path }) + end, + }, + }, + }, + }, + }) + require("telescope").load_extension("zoxide") + end) + end, + keys = { + { "fz", "Telescope zoxide list", desc = "Zoxide" }, + }, + }, + { + "goolord/alpha-nvim", + optional = true, + opts = function(_, dashboard) + local button = dashboard.button("z", " " .. " Zoxide", "Telescope zoxide list ") + button.opts.hl = "AlphaButtons" + button.opts.hl_shortcut = "AlphaShortcut" + table.insert(dashboard.section.buttons.val, 5, button) + end, + }, + { + "nvimdev/dashboard-nvim", + optional = true, + opts = function(_, opts) + local zoxide = { + action = "Telescope zoxide list", + desc = " Zoxide", + icon = " ", + key = "z", + } + + zoxide.desc = zoxide.desc .. string.rep(" ", 43 - #zoxide.desc) + zoxide.key_format = " %s" + + table.insert(opts.config.center, 4, zoxide) + end, + }, +} diff --git a/nvim/lua/plugins/extras/editor/terminal/floaterm.lua b/nvim/lua/plugins/extras/editor/terminal/floaterm.lua new file mode 100644 index 0000000..3ce7fb9 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/terminal/floaterm.lua @@ -0,0 +1,57 @@ +return { + { + "voldikss/vim-floaterm", + cmd = { "FloatermNew", "FloatermToggle", "FloatermNext", "FloatermPrev", "FloatermLast", "FloatermFirst" }, + --stylua: ignore + keys = { + { "", "FloatermNew --disposable --name=yaziroot --opener=edit --titleposition=center --height=0.85 --width=0.85 --cwd= yazi", desc = "Yazi" }, + { "gg", "FloatermNew --name=lazygitroot --opener=edit --titleposition=center --height=0.85 --width=0.85 --cwd= lazygit", desc = "Lazygit (root dir)" }, + { "gG", "FloatermNew --name=lazygitbuffer --opener=edit --titleposition=center --height=0.85 --width=0.85 --cwd= lazygit", desc = "Lazygit (cwd)" }, + { "cen", "FloatermNew --name=node --opener=edit --titleposition=center --wintype=split --height=0.35 node", desc = "Node" }, + { "cep", "FloatermNew --name=python --opener=edit --titleposition=center --wintype=split --height=0.35 python", desc = "Python" }, + { "", "FloatermNext", mode = { "t" }, desc = "Next Terminal" }, + { "", "FloatermPrev", mode = { "t" }, desc = "Prev Terminal" }, + { "", "FloatermLast", mode = { "t" }, desc = "Last Terminal" }, + { "", "FloatermFirst", mode = { "t" }, desc = "First Terminal" }, + { [[]], "FloatermToggle", mode = { "n", "t" }, desc = "Toggle Terminal" }, + { "ftf", "FloatermNew --name=floatroot --opener=edit --titleposition=center --height=0.85 --width=0.85 --cwd=", desc = "Floating (root dir)" }, + { "ftF", "FloatermNew --name=floatbuffer --opener=edit --titleposition=center --height=0.85 --width=0.85 --cwd=", desc = "Floating (cwd)" }, + { "fts", "FloatermNew --name=splitroot --opener=edit --titleposition=center --height=0.35 --wintype=split --cwd=", desc = "Split (root dir)" }, + { "ftS", "FloatermNew --name=splitbuffer --opener=edit --titleposition=center --height=0.35 --wintype=split --cwd=", desc = "Split (cwd)" }, + }, + }, + { + "dawsers/telescope-floaterm.nvim", + config = function() + LazyVim.on_load("telescope.nvim", function() + require("telescope").load_extension("floaterm") + end) + end, + keys = { + { [[]], "Telescope floaterm", desc = "Terminals" }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { "ce", group = "r[e]pl", icon = "󰫧 " }, + { "ft", group = "terminals", icon = " " }, + }, + }, + }, + { + "folke/edgy.nvim", + optional = true, + opts = function(_, opts) + table.insert(opts.bottom, { + ft = "floaterm", + title = "Floaterm", + size = { height = 0.4 }, + filter = function(buf, win) + return vim.api.nvim_win_get_config(win).relative == "" + end, + }) + end, + }, +} diff --git a/nvim/lua/plugins/extras/editor/terminal/toggleterm.lua b/nvim/lua/plugins/extras/editor/terminal/toggleterm.lua new file mode 100644 index 0000000..5c57ac1 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/terminal/toggleterm.lua @@ -0,0 +1,58 @@ +return { + { + "akinsho/toggleterm.nvim", + cmd = { + "ToggleTerm", + "ToggleTermSetName", + "ToggleTermToggleAll", + "ToggleTermSendVisualLines", + "ToggleTermSendCurrentLine", + "ToggleTermSendVisualSelection", + }, + opts = { + size = function(term) + if term.direction == "horizontal" then + return 30 + elseif term.direction == "vertical" then + return vim.o.columns * 0.4 + end + end, + open_mapping = [[]], + hide_numbers = true, -- hide the number column in toggleterm buffers + shade_filetypes = {}, + shade_terminals = true, -- NOTE: this option takes priority over highlights specified so if you specify Normal highlights you should set this to false + shading_factor = "-10", -- the percentage by which to lighten terminal background, default: -30 (gets multiplied by -3 if background is light) + start_in_insert = true, + insert_mappings = true, -- whether or not the open mapping applies in insert mode + terminal_mappings = true, -- whether or not the open mapping applies in the opened terminals + persist_size = true, + persist_mode = true, -- if set to true (default) the previous terminal mode will be remembered + direction = "float", + close_on_exit = true, -- close the terminal window when the process exits + -- Change the default shell. Can be a string or a function returning a string + shell = vim.o.shell, + -- This field is only relevant if direction is set to 'float' + float_opts = { + -- The border key is *almost* the same as 'nvim_open_win' + -- see :h nvim_open_win for details on borders however + -- the 'curved' border is a custom border type + -- not natively supported but implemented in this plugin. + border = "curved", + -- like `size`, width and height can be a number or function which is passed the current terminal + highlights = { border = "Normal", background = "Normal" }, + winblend = 3, + }, + }, + -- stylua: ignore + keys = { + { [[]], "ToggleTerm", mode = "n", desc = "Toggle Terminal" }, + }, + }, + { + "ryanmsnyder/toggleterm-manager.nvim", + opts = {}, + keys = { + { "", "Telescope toggleterm_manager", desc = "Terminals" }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/treesitter-playground.lua b/nvim/lua/plugins/extras/editor/treesitter-playground.lua new file mode 100644 index 0000000..b3741c5 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/treesitter-playground.lua @@ -0,0 +1,41 @@ +if vim.fn.has("nvim-0.10") == 1 then + return { + { + "nvim-treesitter/playground", + dependencies = { + "nvim-treesitter/nvim-treesitter", + build = ":TSInstall query", + opts = { + playground = { + enable = true, + }, + query_linter = { + enable = true, + use_virtual_text = true, + lint_events = { "BufWrite", "CursorHold" }, + }, + }, + }, + keys = { + { "ciT", "TSHighlightCapturesUnderCursor", desc = "Treesitter Highlight Groups" }, + { "cit", "TSPlaygroundToggle", desc = "Treesitter Playground" }, + }, + }, + { + "folke/edgy.nvim", + optional = true, + opts = function(_, opts) + opts.right = opts.right or {} + table.insert(opts.right, { + title = "TS Playground", + ft = "tsplayground", + pinned = true, + open = "TSPlaygroundToggle", + size = { width = 0.3 }, + }) + end, + }, + } +else + LazyVim.notify("Treesitter Playground only works with the nightly build", { title = "Treesitter Playground" }) +end diff --git a/nvim/lua/plugins/extras/editor/trouble-extended.lua b/nvim/lua/plugins/extras/editor/trouble-extended.lua new file mode 100644 index 0000000..bd53b16 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/trouble-extended.lua @@ -0,0 +1,23 @@ +return { + "folke/trouble.nvim", + opts = { + keys = { + e = "jump", + l = "fold_open", + L = "fold_open_recursive", + h = "fold_close", + H = "fold_close_recursive", + }, + modes = { + test = { + mode = "diagnostics", + preview = { + type = "split", + relative = "win", + position = "right", + size = 0.3, + }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/editor/winshift.lua b/nvim/lua/plugins/extras/editor/winshift.lua new file mode 100644 index 0000000..12b6246 --- /dev/null +++ b/nvim/lua/plugins/extras/editor/winshift.lua @@ -0,0 +1,6 @@ +return { + "sindrets/winshift.nvim", + cmd = "WinShift", + opts = { highlight_moving_win = true }, + keys = { { "ws", "WinShift", desc = "Win Shift/Swap" } }, +} diff --git a/nvim/lua/plugins/extras/formatting/prettier-extended.lua b/nvim/lua/plugins/extras/formatting/prettier-extended.lua new file mode 100644 index 0000000..d4afb7d --- /dev/null +++ b/nvim/lua/plugins/extras/formatting/prettier-extended.lua @@ -0,0 +1,46 @@ +local prettier = { "prettierd", "prettier", stop_after_first = true } + +return { + { import = "lazyvim.plugins.extras.formatting.prettier" }, + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "prettierd", + }, + }, + }, + { + "stevearc/conform.nvim", + optional = true, + opts = { + formatters_by_ft = { + ["javascript"] = prettier, + ["javascriptreact"] = prettier, + ["typescript"] = prettier, + ["typescriptreact"] = prettier, + ["vue"] = prettier, + ["css"] = prettier, + ["scss"] = prettier, + ["less"] = prettier, + ["html"] = prettier, + ["json"] = prettier, + ["jsonc"] = prettier, + ["yaml"] = prettier, + ["markdown"] = prettier, + ["markdown.mdx"] = prettier, + ["graphql"] = prettier, + ["handlebars"] = prettier, + }, + }, + }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "prettier", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/formatting/ruff.lua b/nvim/lua/plugins/extras/formatting/ruff.lua new file mode 100644 index 0000000..e1b576a --- /dev/null +++ b/nvim/lua/plugins/extras/formatting/ruff.lua @@ -0,0 +1,19 @@ +return { + { + "stevearc/conform.nvim", + opts = function(_, opts) + opts.formatters_by_ft.python = opts.formatters_by_ft.python or {} + table.insert(opts.formatters_by_ft.python, "ruff_format") + table.insert(opts.formatters_by_ft.python, "ruff_fix") + return opts + end, + }, + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "ruff", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/formatting/rustywind.lua b/nvim/lua/plugins/extras/formatting/rustywind.lua new file mode 100644 index 0000000..e5ff380 --- /dev/null +++ b/nvim/lua/plugins/extras/formatting/rustywind.lua @@ -0,0 +1,33 @@ +return { + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "rustywind", + }, + }, + }, + { + "stevearc/conform.nvim", + opts = function(_, opts) + local function add_formatters(tbl) + for ft, formatters in pairs(tbl) do + if opts.formatters_by_ft[ft] == nil then + opts.formatters_by_ft[ft] = formatters + else + vim.list_extend(opts.formatters_by_ft[ft], formatters) + end + end + end + + add_formatters({ + ["javascript"] = { "rustywind" }, + ["javascriptreact"] = { "rustywind" }, + ["typescript"] = { "rustywind" }, + ["typescriptreact"] = { "rustywind" }, + ["vue"] = { "rustywind" }, + ["html"] = { "rustywind" }, + }) + end, + }, +} diff --git a/nvim/lua/plugins/extras/formatting/shfmt.lua b/nvim/lua/plugins/extras/formatting/shfmt.lua new file mode 100644 index 0000000..db1ce36 --- /dev/null +++ b/nvim/lua/plugins/extras/formatting/shfmt.lua @@ -0,0 +1,30 @@ +return { + { + "stevearc/conform.nvim", + opts = function(_, opts) + local function add_formatters(tbl) + for ft, formatters in pairs(tbl) do + if opts.formatters_by_ft[ft] == nil then + opts.formatters_by_ft[ft] = formatters + else + vim.list_extend(opts.formatters_by_ft[ft], formatters) + end + end + end + + add_formatters({ + ["sh"] = { "shfmt" }, + ["bash"] = { "shfmt" }, + ["zsh"] = { "shfmt" }, + }) + end, + }, + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "shfmt", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/formatting/trim_newlines.lua b/nvim/lua/plugins/extras/formatting/trim_newlines.lua new file mode 100644 index 0000000..3a5761e --- /dev/null +++ b/nvim/lua/plugins/extras/formatting/trim_newlines.lua @@ -0,0 +1,8 @@ +return { + "stevearc/conform.nvim", + opts = function(_, opts) + opts.formatters_by_ft["_"] = opts.formatters_by_ft["_"] or {} + table.insert(opts.formatters_by_ft["_"], "trim_newlines") + return opts + end, +} diff --git a/nvim/lua/plugins/extras/formatting/trim_whitespace.lua b/nvim/lua/plugins/extras/formatting/trim_whitespace.lua new file mode 100644 index 0000000..6e754e0 --- /dev/null +++ b/nvim/lua/plugins/extras/formatting/trim_whitespace.lua @@ -0,0 +1,8 @@ +return { + "stevearc/conform.nvim", + opts = function(_, opts) + opts.formatters_by_ft["_"] = opts.formatters_by_ft["_"] or {} + table.insert(opts.formatters_by_ft["_"], "trim_whitespace") + return opts + end, +} diff --git a/nvim/lua/plugins/extras/lang/ansible-extended.lua b/nvim/lua/plugins/extras/lang/ansible-extended.lua new file mode 100644 index 0000000..42ac6a3 --- /dev/null +++ b/nvim/lua/plugins/extras/lang/ansible-extended.lua @@ -0,0 +1,48 @@ +vim.filetype.add({ + pattern = { + [".*/playbooks/.*%.yaml"] = "yaml.ansible", + [".*/playbooks/.*%.yml"] = "yaml.ansible", + [".*/roles/.*/tasks/.*%.yaml"] = "yaml.ansible", + [".*/roles/.*/tasks/.*%.yml"] = "yaml.ansible", + [".*/tasks/.*%.yaml"] = "yaml.ansible", + [".*/tasks/.*%.yml"] = "yaml.ansible", + [".*/vars/.*%.yaml"] = "yaml.ansible", + [".*/vars/.*%.yml"] = "yaml.ansible", + [".*/defaults/.*%.yaml"] = "yaml.ansible", + [".*/defaults/.*%.yml"] = "yaml.ansible", + [".*/handlers/.*%.yaml"] = "yaml.ansible", + [".*/handlers/.*%.yml"] = "yaml.ansible", + [".*/roles/.*/handlers/.*%.yaml"] = "yaml.ansible", + [".*/roles/.*/handlers/.*%.yml"] = "yaml.ansible", + }, +}) + +return { + { import = "plugins.extras.lang.yaml-extended" }, + { import = "lazyvim.plugins.extras.lang.ansible" }, + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "ansible-language-server", + }, + }, + }, + { + "mfussenegger/nvim-lint", + opts = { + linters_by_ft = { + ansible = { "ansible_lint" }, + }, + }, + }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "ansible", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/bash.lua b/nvim/lua/plugins/extras/lang/bash.lua new file mode 100644 index 0000000..3232f13 --- /dev/null +++ b/nvim/lua/plugins/extras/lang/bash.lua @@ -0,0 +1,56 @@ +return { + { + "nvim-treesitter/nvim-treesitter", + opts = { + ensure_installed = { + "bash", + }, + }, + }, + { + "neovim/nvim-lspconfig", + opts = { + servers = { + bashls = {}, + }, + }, + }, + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "bash-language-server", + "shellcheck", + }, + }, + }, + { + "mfussenegger/nvim-lint", + opts = function(_, opts) + opts.linters_by_ft.bash = opts.linters_by_ft.bash or {} + table.insert(opts.linters_by_ft.bash, "shellcheck") + return opts + end, + }, + { + "nvim-neotest/neotest", + optional = true, + dependencies = { + "rcasia/neotest-bash", + }, + opts = { + adapters = { + ["neotest-bash"] = {}, + }, + }, + }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "bash", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/docker-extended.lua b/nvim/lua/plugins/extras/lang/docker-extended.lua new file mode 100644 index 0000000..c3f40cd --- /dev/null +++ b/nvim/lua/plugins/extras/lang/docker-extended.lua @@ -0,0 +1,12 @@ +return { + { import = "lazyvim.plugins.extras.lang.docker" }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "docker", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/git-extended.lua b/nvim/lua/plugins/extras/lang/git-extended.lua new file mode 100644 index 0000000..547075d --- /dev/null +++ b/nvim/lua/plugins/extras/lang/git-extended.lua @@ -0,0 +1,12 @@ +return { + { import = "lazyvim.plugins.extras.lang.git" }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "git", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/go-extended.lua b/nvim/lua/plugins/extras/lang/go-extended.lua new file mode 100644 index 0000000..72a84cf --- /dev/null +++ b/nvim/lua/plugins/extras/lang/go-extended.lua @@ -0,0 +1,55 @@ +return { + { import = "lazyvim.plugins.extras.lang.go" }, + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "golangci-lint", + }, + }, + }, + { + "ray-x/go.nvim", + dependencies = { + "ray-x/guihua.lua", + "neovim/nvim-lspconfig", + "nvim-treesitter/nvim-treesitter", + }, + opts = {}, + ft = { "go", "gomod" }, + build = function() + require("go.install").update_all_sync() + end, + }, + { + "mfussenegger/nvim-lint", + opts = function(_, opts) + local function add_linters(tbl) + for ft, linters in pairs(tbl) do + if opts.linters_by_ft[ft] == nil then + opts.linters_by_ft[ft] = linters + else + vim.list_extend(opts.linters_by_ft[ft], linters) + end + end + end + + add_linters({ + ["go"] = { "golangcilint" }, + ["gomod"] = { "golangcilint" }, + ["gowork"] = { "golangcilint" }, + }) + + return opts + end, + }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "go", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/haskell.lua b/nvim/lua/plugins/extras/lang/haskell.lua new file mode 100644 index 0000000..7d4162c --- /dev/null +++ b/nvim/lua/plugins/extras/lang/haskell.lua @@ -0,0 +1,12 @@ +return { + { import = "lazyvim.plugins.extras.lang.haskell" }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "haskell-9", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/json-extended.lua b/nvim/lua/plugins/extras/lang/json-extended.lua new file mode 100644 index 0000000..72aad56 --- /dev/null +++ b/nvim/lua/plugins/extras/lang/json-extended.lua @@ -0,0 +1,11 @@ +return { + { import = "lazyvim.plugins.extras.lang.json" }, + { + "gennaro-tedesco/nvim-jqx", + ft = { "json", "yaml" }, + cmd = { "JqxList", "JqxQuery" }, + keys = { + { "cj", ft = { "json", "yaml" }, "JqxList", desc = "Jqx List" }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/julia.lua b/nvim/lua/plugins/extras/lang/julia.lua new file mode 100644 index 0000000..9f00915 --- /dev/null +++ b/nvim/lua/plugins/extras/lang/julia.lua @@ -0,0 +1,44 @@ +return { + { + "nvim-treesitter/nvim-treesitter", + opts = { + ensure_installed = { + "julia", + }, + }, + }, + { + "neovim/nvim-lspconfig", + opts = { + servers = { + julials = {}, + }, + }, + }, + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "julia-lsp", + }, + }, + }, + { + "hrsh7th/nvim-cmp", + dependencies = { + "amarakon/nvim-cmp-lua-latex-symbols", + }, + opts = function(_, opts) + table.insert(opts.sources, { name = "lua-latex-symbols", option = { cache = true } }) + end, + }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "julia", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/markdown-extended.lua b/nvim/lua/plugins/extras/lang/markdown-extended.lua new file mode 100644 index 0000000..1904cec --- /dev/null +++ b/nvim/lua/plugins/extras/lang/markdown-extended.lua @@ -0,0 +1,59 @@ +local filetype = { "markdown", "text", "tex", "plaintex", "norg" } + +return { + { import = "lazyvim.plugins.extras.lang.markdown" }, + { + "gaoDean/autolist.nvim", + enabled = false, + ft = filetype, + opts = {}, + keys = { + { "", "AutolistNewBullet", mode = { "i" }, ft = filetype }, + { "o", "oAutolistNewBullet", mode = { "n" }, ft = filetype }, + { "O", "OAutolistNewBulletBefore", mode = { "n" }, ft = filetype }, + { "", "AutolistToggleCheckbox", mode = { "n" }, ft = filetype }, + { "", "AutolistRecalculate", mode = { "n" }, ft = filetype }, + + { "].", "AutolistCycleNext", mode = { "n" }, desc = "Next List Type", ft = filetype }, + { "[.", "AutolistCyclePrev", mode = { "n" }, desc = "Prev List Type", ft = filetype }, + + { ">>", ">>AutolistRecalculate", mode = { "n" }, ft = filetype }, + { "<<", "<<AutolistRecalculate", mode = { "n" }, ft = filetype }, + { "dd", "ddAutolistRecalculate", mode = { "n" }, ft = filetype }, + { "d", "dAutolistRecalculate", mode = { "v" }, ft = filetype }, + }, + }, + { + "antonk52/markdowny.nvim", + enabled = false, + ft = filetype, + opts = { + filetypes = filetype, + }, + }, + { + "mfussenegger/nvim-lint", + opts = { + linters = { + ["markdownlint-cli2"] = { + prepend_args = { "--config", os.getenv("HOME") .. "/.config/nvim/rules/.markdownlint-cli2.yaml", "--" }, + }, + }, + }, + }, + { + "MeanderingProgrammer/render-markdown.nvim", + opts = { + preset = "lazy", + }, + }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "markdown", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/nix-extended.lua b/nvim/lua/plugins/extras/lang/nix-extended.lua new file mode 100644 index 0000000..f1a9581 --- /dev/null +++ b/nvim/lua/plugins/extras/lang/nix-extended.lua @@ -0,0 +1,20 @@ +return { + { import = "lazyvim.plugins.extras.lang.nix" }, + { + "mfussenegger/nvim-lint", + opts = function(_, opts) + opts.linters_by_ft.nix = opts.linters_by_ft.nix or {} + table.insert(opts.linters_by_ft.nix, "statix") + return opts + end, + }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "nix", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/omnisharp-extended.lua b/nvim/lua/plugins/extras/lang/omnisharp-extended.lua new file mode 100644 index 0000000..23a3e9a --- /dev/null +++ b/nvim/lua/plugins/extras/lang/omnisharp-extended.lua @@ -0,0 +1,15 @@ +return { + { import = "lazyvim.plugins.extras.lang.omnisharp" }, + { + "nvim-neotest/neotest", + optional = true, + dependencies = { + "Issafalcon/neotest-dotnet", + }, + opts = { + adapters = { + ["neotest-dotnet"] = {}, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/pkl.lua b/nvim/lua/plugins/extras/lang/pkl.lua new file mode 100644 index 0000000..33e1350 --- /dev/null +++ b/nvim/lua/plugins/extras/lang/pkl.lua @@ -0,0 +1,10 @@ +return { + "apple/pkl-neovim", + dependencies = { + "nvim-treesitter/nvim-treesitter", + }, + build = function() + vim.cmd("TSInstall! pkl") + end, + event = "BufRead *.pkl", +} diff --git a/nvim/lua/plugins/extras/lang/python-extended.lua b/nvim/lua/plugins/extras/lang/python-extended.lua new file mode 100644 index 0000000..e580538 --- /dev/null +++ b/nvim/lua/plugins/extras/lang/python-extended.lua @@ -0,0 +1,113 @@ +local package_prefix = "pp" + +-- LSP Server to use for Python. +-- Set to "basedpyright" to use basedpyright instead of pyright. +vim.g.lazyvim_python_lsp = "basedpyright" +vim.g.lazyvim_python_ruff = "ruff" + +return { + { import = "lazyvim.plugins.extras.lang.python" }, + { + "neovim/nvim-lspconfig", + opts = { + servers = { + ---@type lspconfig.options.basedpyright + basedpyright = { + settings = { + basedpyright = { + analysis = { + diagnosticSeverityOverrides = { + reportUnusedCallResult = "information", + reportUnusedExpression = "information", + reportUnknownMemberType = "none", + reportUnknownLambdaType = "none", + reportUnknownParameterType = "none", + reportMissingParameterType = "none", + reportUnknownVariableType = "none", + reportUnknownArgumentType = "none", + reportAny = "none", + }, + }, + }, + }, + }, + ---@type lspconfig.options.pyright + pyright = { + settings = { + verboseOutput = true, + autoImportCompletion = true, + python = { + analysis = { + diagnosticSeverityOverrides = { + reportWildcardImportFromLibrary = "none", + reportUnusedImport = "information", + reportUnusedClass = "information", + reportUnusedFunction = "information", + }, + typeCheckingMode = "strict", + autoSearchPaths = true, + useLibraryCodeForTypes = true, + diagnosticMode = "openFilesOnly", + indexing = true, + }, + }, + }, + }, + [vim.g.lazyvim_python_ruff] = { + handlers = { + ["textDocument/publishDiagnostics"] = function() end, + }, + }, + }, + }, + }, + { + "nvim-treesitter/nvim-treesitter", + opts = { + ensure_installed = { + "requirements", + }, + }, + }, + { + "MeanderingProgrammer/py-requirements.nvim", + event = { + "BufRead requirements.txt", + }, + dependencies = { + { "nvim-lua/plenary.nvim" }, + { + "hrsh7th/nvim-cmp", + dependencies = {}, + opts = function(_, opts) + table.insert(opts.sources, { name = "py-requirements" }) + end, + }, + }, + opts = {}, + -- stylua: ignore + keys = { + { package_prefix .. "u", function() require("py-requirements").upgrade() end, desc = "Update Package" }, + { package_prefix .. "i", function() require("py-requirements").show_description() end, desc = "Package Info" }, + { package_prefix .. "a", function() require("py-requirements").upgrade_all() end, desc = "Update All Packages" }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { "p", group = "packages/dependencies", icon = " " }, + { package_prefix, group = "python", icon = " " }, + }, + }, + }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "python-3.11", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/rust-extended.lua b/nvim/lua/plugins/extras/lang/rust-extended.lua new file mode 100644 index 0000000..e7e05f4 --- /dev/null +++ b/nvim/lua/plugins/extras/lang/rust-extended.lua @@ -0,0 +1,57 @@ +local package_prefix = "pr" + +return { + { import = "lazyvim.plugins.extras.lang.rust" }, + { + "stevearc/conform.nvim", + opts = function(_, opts) + opts.formatters_by_ft.toml = opts.formatters_by_ft.toml or {} + table.insert(opts.formatters_by_ft.toml, "taplo") + + opts.formatters_by_ft.rust = opts.formatters_by_ft.rust or {} + table.insert(opts.formatters_by_ft.rust, "rustfmt") + return opts + end, + }, + { + "Saecki/crates.nvim", + -- stylua: ignore + keys = { + { package_prefix .. "R", function() require("crates").reload() end, desc = "Reload" }, + + { package_prefix .. "u", function() require("crates").update_crate() end, desc = "Update Crate" }, + { package_prefix .. "u", mode = "v", function() require("crates").update_crates() end, desc = "Update Crates" }, + { package_prefix .. "a", function() require("crates").update_all_crates() end, desc = "Update All Crates" }, + + { package_prefix .. "U", function() require("crates").upgrade_crate() end, desc = "Upgrade Crate" }, + { package_prefix .. "U", mode = "v", function() require("crates").upgrade_crates() end, desc = "Upgrade Crates" }, + { package_prefix .. "A", function() require("crates").upgrade_all_crates() end, desc = "Upgrade All Crates" }, + + { package_prefix .. "t", function() require("crates").expand_plain_crate_to_inline_table() end, desc = "Extract into Inline Table" }, + { package_prefix .. "T", function() require("crates").extract_crate_into_table() end, desc = "Extract into Table" }, + + { package_prefix .. "h", function() require("crates").open_homepage() end, desc = "Homepage" }, + { package_prefix .. "r", function() require("crates").open_repository() end, desc = "Repo" }, + { package_prefix .. "d", function() require("crates").open_documentation() end, desc = "Documentation" }, + { package_prefix .. "c", function() require("crates").open_crates_io() end, desc = "Crates.io" }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { "p", group = "packages/dependencies", icon = " " }, + { package_prefix, group = "rust", icon = " " }, + }, + }, + }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "rust", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/sql-extended.lua b/nvim/lua/plugins/extras/lang/sql-extended.lua new file mode 100644 index 0000000..e225b6b --- /dev/null +++ b/nvim/lua/plugins/extras/lang/sql-extended.lua @@ -0,0 +1,23 @@ +local prefix = "D" + +return { + { import = "lazyvim.plugins.extras.lang.sql" }, + { + "neovim/nvim-lspconfig", + opts = { + servers = { + sqlls = {}, + }, + }, + }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "sqlite", + "postgresql-16", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/web/angular-extended.lua b/nvim/lua/plugins/extras/lang/web/angular-extended.lua new file mode 100644 index 0000000..68bb6c4 --- /dev/null +++ b/nvim/lua/plugins/extras/lang/web/angular-extended.lua @@ -0,0 +1,14 @@ +return { + { import = "plugins.extras.lang.web.typescript-extended" }, + { import = "plugins.extras.lang.web.html-css" }, + { import = "lazyvim.plugins.extras.lang.angular" }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "angular", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/web/astro-extended.lua b/nvim/lua/plugins/extras/lang/web/astro-extended.lua new file mode 100644 index 0000000..b2d6ae9 --- /dev/null +++ b/nvim/lua/plugins/extras/lang/web/astro-extended.lua @@ -0,0 +1,51 @@ +local inlay_hints_settings = { + parameterNames = { enabled = "all" }, + parameterTypes = { enabled = true }, + variableTypes = { enabled = true }, + propertyDeclarationTypes = { enabled = true }, + functionLikeReturnTypes = { enabled = true }, + enumMemberValues = { enabled = true }, +} + +return { + { import = "lazyvim.plugins.extras.lang.astro" }, + { import = "plugins.extras.lang.web.typescript-extended" }, + { + "neovim/nvim-lspconfig", + opts = { + servers = { + astro = { + settings = { + typescript = { + updateImportsOnFileMove = { enabled = "always" }, + inlayHints = inlay_hints_settings, + }, + javascript = { + updateImportsOnFileMove = { enabled = "always" }, + inlayHints = inlay_hints_settings, + }, + }, + handlers = { + ["textDocument/publishDiagnostics"] = function(err, result, ctx, config) + require("ts-error-translator").translate_diagnostics(err, result, ctx, config) + vim.lsp.diagnostic.on_publish_diagnostics(err, result, ctx, config) + end, + }, + }, + }, + }, + }, + { + "dmmulroy/ts-error-translator.nvim", + opts = {}, + }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "astro", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/web/graphql.lua b/nvim/lua/plugins/extras/lang/web/graphql.lua new file mode 100644 index 0000000..caeeea7 --- /dev/null +++ b/nvim/lua/plugins/extras/lang/web/graphql.lua @@ -0,0 +1,22 @@ +return { + { import = "plugins.extras.lang.web.typescript-extended" }, + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "graphql-language-service-cli", + }, + }, + }, + { + "neovim/nvim-lspconfig", + dependencies = {}, + opts = { + servers = { + graphql = { + filetypes = { "graphql", "javascript", "javascriptreact", "typescript", "typescriptreact" }, + }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/web/html-css.lua b/nvim/lua/plugins/extras/lang/web/html-css.lua new file mode 100644 index 0000000..44dca9d --- /dev/null +++ b/nvim/lua/plugins/extras/lang/web/html-css.lua @@ -0,0 +1,99 @@ +return { + { + "nvim-treesitter/nvim-treesitter", + opts = { + ensure_installed = { + "html", + "css", + "scss", + }, + }, + }, + { + "neovim/nvim-lspconfig", + opts = { + servers = { + emmet_language_server = {}, + html = {}, + cssmodules_ls = {}, + css_variables = {}, + cssls = { + lint = { + compatibleVendorPrefixes = "ignore", + vendorPrefix = "ignore", + unknownVendorSpecificProperties = "ignore", + + -- unknownProperties = "ignore", -- duplicate with stylelint + + duplicateProperties = "warning", + emptyRules = "warning", + importStatement = "warning", + zeroUnits = "warning", + fontFaceProperties = "warning", + hexColorLength = "warning", + argumentsInColorFunction = "warning", + unknownAtRules = "warning", + ieHack = "warning", + propertyIgnoredDueToDisplay = "warning", + }, + }, + }, + }, + }, + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "emmet-language-server", + "html-lsp", + "cssmodules-language-server", + "css-variables-language-server", + "css-lsp", + "htmlhint", + "stylelint", + }, + }, + }, + { + "mfussenegger/nvim-lint", + opts = function(_, opts) + local stylelint = "stylelint" + + local function add_linters(tbl) + for ft, linters in pairs(tbl) do + if opts.linters_by_ft[ft] == nil then + opts.linters_by_ft[ft] = linters + else + vim.list_extend(opts.linters_by_ft[ft], linters) + end + end + end + + add_linters({ + ["html"] = { "htmlhint" }, + ["css"] = { stylelint }, + ["scss"] = { stylelint }, + ["less"] = { stylelint }, + ["sugarss"] = { stylelint }, + ["vue"] = { stylelint }, + ["wxss"] = { stylelint }, + ["javascript"] = { stylelint }, + ["javascriptreact"] = { stylelint }, + ["typescript"] = { stylelint }, + ["typescriptreact"] = { stylelint }, + }) + return opts + end, + }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "html", + "css", + "sass", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/web/htmx.lua b/nvim/lua/plugins/extras/lang/web/htmx.lua new file mode 100644 index 0000000..265b69b --- /dev/null +++ b/nvim/lua/plugins/extras/lang/web/htmx.lua @@ -0,0 +1,18 @@ +return { + { + "neovim/nvim-lspconfig", + opts = { + servers = { + htmx = {}, + }, + }, + }, + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "htmx-lsp", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/web/php-extended.lua b/nvim/lua/plugins/extras/lang/web/php-extended.lua new file mode 100644 index 0000000..a53bd06 --- /dev/null +++ b/nvim/lua/plugins/extras/lang/web/php-extended.lua @@ -0,0 +1,32 @@ +return { + { import = "lazyvim.plugins.extras.lang.php" }, + { + "nvim-treesitter/nvim-treesitter", + opts = { + ensure_installed = { + "phpdoc", + }, + }, + }, + { + "nvim-neotest/neotest", + optional = true, + dependencies = { + "olimorris/neotest-phpunit", + }, + opts = { + adapters = { + ["neotest-phpunit"] = {}, + }, + }, + }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "php", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/web/svelte-extended.lua b/nvim/lua/plugins/extras/lang/web/svelte-extended.lua new file mode 100644 index 0000000..c7ead98 --- /dev/null +++ b/nvim/lua/plugins/extras/lang/web/svelte-extended.lua @@ -0,0 +1,51 @@ +local inlay_hints_settings = { + parameterNames = { enabled = "all" }, + parameterTypes = { enabled = true }, + variableTypes = { enabled = true }, + propertyDeclarationTypes = { enabled = true }, + functionLikeReturnTypes = { enabled = true }, + enumMemberValues = { enabled = true }, +} + +return { + { import = "lazyvim.plugins.extras.lang.svelte" }, + { import = "plugins.extras.lang.web.typescript-extended" }, + { + "neovim/nvim-lspconfig", + opts = { + servers = { + svelte = { + settings = { + typescript = { + updateImportsOnFileMove = { enabled = "always" }, + inlayHints = inlay_hints_settings, + }, + javascript = { + updateImportsOnFileMove = { enabled = "always" }, + inlayHints = inlay_hints_settings, + }, + }, + handlers = { + ["textDocument/publishDiagnostics"] = function(err, result, ctx, config) + require("ts-error-translator").translate_diagnostics(err, result, ctx, config) + vim.lsp.diagnostic.on_publish_diagnostics(err, result, ctx, config) + end, + }, + }, + }, + }, + }, + { + "dmmulroy/ts-error-translator.nvim", + opts = {}, + }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "svelte", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/web/tailwind-extended.lua b/nvim/lua/plugins/extras/lang/web/tailwind-extended.lua new file mode 100644 index 0000000..822ba55 --- /dev/null +++ b/nvim/lua/plugins/extras/lang/web/tailwind-extended.lua @@ -0,0 +1,20 @@ +return { + { import = "lazyvim.plugins.extras.lang.tailwind" }, + { import = "plugins.extras.ui.inline-fold" }, + { + "MaximilianLloyd/tw-values.nvim", + keys = { + { "cT", "TWValues", desc = "Tailwind CSS values" }, + }, + opts = {}, + }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "tailwindcss", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/web/typescript-extended.lua b/nvim/lua/plugins/extras/lang/web/typescript-extended.lua new file mode 100644 index 0000000..88fe2bd --- /dev/null +++ b/nvim/lua/plugins/extras/lang/web/typescript-extended.lua @@ -0,0 +1,104 @@ +return { + { import = "lazyvim.plugins.extras.lang.typescript" }, + { import = "plugins.extras.lang.json-extended" }, + { + "neovim/nvim-lspconfig", + opts = { + servers = { + vtsls = { + handlers = { + ["textDocument/publishDiagnostics"] = function(err, result, ctx, config) + require("ts-error-translator").translate_diagnostics(err, result, ctx, config) + vim.lsp.diagnostic.on_publish_diagnostics(err, result, ctx, config) + end, + }, + init_options = { + preferences = { + disableSuggestions = true, + }, + }, + }, + }, + }, + }, + { + "nvim-treesitter/nvim-treesitter", + opts = { + ensure_installed = { + "javascript", + "jsdoc", + }, + }, + }, + { + "dmmulroy/tsc.nvim", + opts = { + auto_start_watch_mode = false, + use_trouble_qflist = true, + flags = { + watch = false, + }, + }, + keys = { + { "ct", ft = { "typescript", "typescriptreact" }, "TSC", desc = "Type Check" }, + { "xy", ft = { "typescript", "typescriptreact" }, "TSCOpen", desc = "Type Check Quickfix" }, + }, + ft = { + "typescript", + "typescriptreact", + }, + cmd = { + "TSC", + "TSCOpen", + "TSCClose", + "TSStop", + }, + }, + { + "dmmulroy/ts-error-translator.nvim", + opts = {}, + }, + { + "nvim-neotest/neotest", + optional = true, + dependencies = { + "nvim-neotest/neotest-jest", + "adrigzr/neotest-mocha", + "marilari88/neotest-vitest", + }, + opts = { + adapters = { + ["neotest-jest"] = { + jestCommand = "npm test --", + jestConfigFile = "custom.jest.config.ts", + env = { CI = true }, + cwd = function() + return vim.fn.getcwd() + end, + }, + ["neotest-mocha"] = { + command = "npm test --", + env = { CI = true }, + cwd = function() + return vim.fn.getcwd() + end, + }, + ["neotest-vitest"] = {}, + }, + }, + -- stylua: ignore + keys = { + { "tw", function() require('neotest').run.run({ jestCommand = 'jest --watch ' }) end, desc = "Run Watch" }, + }, + }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "react", + "typescript", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/web/vue-2.lua b/nvim/lua/plugins/extras/lang/web/vue-2.lua new file mode 100644 index 0000000..075385a --- /dev/null +++ b/nvim/lua/plugins/extras/lang/web/vue-2.lua @@ -0,0 +1,38 @@ +return { + { + "nvim-treesitter/nvim-treesitter", + opts = { + ensure_installed = { + "vue", + }, + }, + }, + { + "neovim/nvim-lspconfig", + opts = { + servers = { + vuels = {}, + volar = { + enabled = false, + }, + }, + }, + }, + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "vetur-vls", + }, + }, + }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "vue-2", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/web/vue-3-extended.lua b/nvim/lua/plugins/extras/lang/web/vue-3-extended.lua new file mode 100644 index 0000000..b7719e5 --- /dev/null +++ b/nvim/lua/plugins/extras/lang/web/vue-3-extended.lua @@ -0,0 +1,51 @@ +local inlay_hints_settings = { + parameterNames = { enabled = "all" }, + parameterTypes = { enabled = true }, + variableTypes = { enabled = true }, + propertyDeclarationTypes = { enabled = true }, + functionLikeReturnTypes = { enabled = true }, + enumMemberValues = { enabled = true }, +} + +return { + { import = "lazyvim.plugins.extras.lang.vue" }, + { import = "plugins.extras.lang.web.typescript-extended" }, + { + "neovim/nvim-lspconfig", + opts = { + servers = { + volar = { + settings = { + typescript = { + updateImportsOnFileMove = { enabled = "always" }, + inlayHints = inlay_hints_settings, + }, + javascript = { + updateImportsOnFileMove = { enabled = "always" }, + inlayHints = inlay_hints_settings, + }, + }, + handlers = { + ["textDocument/publishDiagnostics"] = function(err, result, ctx, config) + require("ts-error-translator").translate_diagnostics(err, result, ctx, config) + vim.lsp.diagnostic.on_publish_diagnostics(err, result, ctx, config) + end, + }, + }, + }, + }, + }, + { + "dmmulroy/ts-error-translator.nvim", + opts = {}, + }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "vue-3", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/xml.lua b/nvim/lua/plugins/extras/lang/xml.lua new file mode 100644 index 0000000..a93cd7c --- /dev/null +++ b/nvim/lua/plugins/extras/lang/xml.lua @@ -0,0 +1,26 @@ +return { + { + "nvim-treesitter/nvim-treesitter", + opts = { + ensure_installed = { + "xml", + }, + }, + }, + { + "neovim/nvim-lspconfig", + opts = { + servers = { + lemminx = {}, + }, + }, + }, + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "lemminx", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lang/zig.lua b/nvim/lua/plugins/extras/lang/zig.lua new file mode 100644 index 0000000..9e3d375 --- /dev/null +++ b/nvim/lua/plugins/extras/lang/zig.lua @@ -0,0 +1,53 @@ +return { + { import = "lazyvim.plugins.extras.lang.zig" }, + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "codelldb", + }, + }, + }, + { + "mfussenegger/nvim-dap", + optional = true, + opts = function() + local dap = require("dap") + dap.configurations.zig = { + { + name = "Zig Run", + type = "codelldb", + request = "launch", + program = function() + os.execute("zig build") + local command = "find ! -type d -path './zig-out/bin/*' | grep -v 'Test' | sed 's#.*/##'" + local bin_location = io.popen(command, "r") + if bin_location ~= nil then + return "zig-out/bin/" .. bin_location:read("*a"):gsub("[\n\r]", "") + else + return "" + end + end, + cwd = "${workspaceFolder}", + stopOnEntry = false, + args = function() + local argv = {} + arg = vim.fn.input(string.format("Arguments: ")) + for a in string.gmatch(arg, "%S+") do + table.insert(argv, a) + end + return argv + end, + }, + } + end, + }, + { + "stevearc/conform.nvim", + opts = function(_, opts) + opts.formatters_by_ft.python = opts.formatters_by_ft.python or {} + table.insert(opts.formatters_by_ft.python, "zigfmt") + return opts + end, + }, +} diff --git a/nvim/lua/plugins/extras/linting/biome.lua b/nvim/lua/plugins/extras/linting/biome.lua new file mode 100644 index 0000000..a0aea82 --- /dev/null +++ b/nvim/lua/plugins/extras/linting/biome.lua @@ -0,0 +1,66 @@ +return { + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "biome", + }, + }, + }, + { + "neovim/nvim-lspconfig", + opts = { + servers = { + biome = {}, + }, + }, + }, + { + "stevearc/conform.nvim", + opts = function(_, opts) + local function add_formatters(tbl) + for ft, formatters in pairs(tbl) do + if opts.formatters_by_ft[ft] == nil then + opts.formatters_by_ft[ft] = formatters + else + vim.list_extend(opts.formatters_by_ft[ft], formatters) + end + end + end + + add_formatters({ + ["jsonc"] = { "biome" }, + ["json"] = { "biome" }, + ["javascript"] = { "biome" }, + ["typescript"] = { "biome" }, + ["typescriptreact"] = { "biome" }, + ["javascriptreact"] = { "biome" }, + ["astro"] = { "biome" }, + ["svelte"] = { "biome" }, + ["vue"] = { "biome" }, + ["graphql"] = { "biome" }, + ["css"] = { "biome" }, + }) + + opts.formatters = { + biome = { + condition = function(self, ctx) + return vim.fs.find({ "biome.json" }, { path = ctx.filename, upward = true })[1] + end, + }, + prettier = { + condition = function(self, ctx) + return not vim.fs.find({ "biome.json" }, { path = ctx.filename, upward = true })[1] + end, + }, + prettierd = { + condition = function(self, ctx) + return not vim.fs.find({ "biome.json" }, { path = ctx.filename, upward = true })[1] + end, + }, + } + + return opts + end, + }, +} diff --git a/nvim/lua/plugins/extras/linting/eslint-extended.lua b/nvim/lua/plugins/extras/linting/eslint-extended.lua new file mode 100644 index 0000000..b286dea --- /dev/null +++ b/nvim/lua/plugins/extras/linting/eslint-extended.lua @@ -0,0 +1,12 @@ +return { + { import = "lazyvim.plugins.extras.linting.eslint" }, + { + "luckasRanarison/nvim-devdocs", + optional = true, + opts = { + ensure_installed = { + "eslint", + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/linting/pylint.lua b/nvim/lua/plugins/extras/linting/pylint.lua new file mode 100644 index 0000000..5bb4288 --- /dev/null +++ b/nvim/lua/plugins/extras/linting/pylint.lua @@ -0,0 +1,18 @@ +return { + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "pylint", + }, + }, + }, + { + "mfussenegger/nvim-lint", + opts = function(_, opts) + opts.linters_by_ft.python = opts.linters_by_ft.python or {} + table.insert(opts.linters_by_ft.python, "pylint") + return opts + end, + }, +} diff --git a/nvim/lua/plugins/extras/linting/selene.lua b/nvim/lua/plugins/extras/linting/selene.lua new file mode 100644 index 0000000..2aa4dce --- /dev/null +++ b/nvim/lua/plugins/extras/linting/selene.lua @@ -0,0 +1,27 @@ +return { + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "selene", + }, + }, + }, + { + "mfussenegger/nvim-lint", + opts = function(_, opts) + opts.linters_by_ft.lua = opts.linters_by_ft.lua or {} + table.insert(opts.linters_by_ft.lua, "selene") + + opts.linters = { + selene = { + condition = function(ctx) + return vim.fs.find({ "selene.toml" }, { path = ctx.filename, upward = true })[1] + end, + }, + } + + return opts + end, + }, +} diff --git a/nvim/lua/plugins/extras/linting/typos.lua b/nvim/lua/plugins/extras/linting/typos.lua new file mode 100644 index 0000000..633d46e --- /dev/null +++ b/nvim/lua/plugins/extras/linting/typos.lua @@ -0,0 +1,18 @@ +return { + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "typos", + }, + }, + }, + { + "mfussenegger/nvim-lint", + opts = function(_, opts) + opts.linters_by_ft["*"] = opts.linters_by_ft["*"] or {} + table.insert(opts.linters_by_ft["*"], "typos") + return opts + end, + }, +} diff --git a/nvim/lua/plugins/extras/linting/vale.lua b/nvim/lua/plugins/extras/linting/vale.lua new file mode 100644 index 0000000..b17f5cc --- /dev/null +++ b/nvim/lua/plugins/extras/linting/vale.lua @@ -0,0 +1,18 @@ +return { + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "vale", + }, + }, + }, + { + "mfussenegger/nvim-lint", + opts = function(_, opts) + opts.linters_by_ft.markdown = opts.linters_by_ft.markdown or {} + table.insert(opts.linters_by_ft.markdown, "vale") + return opts + end, + }, +} diff --git a/nvim/lua/plugins/extras/lsp/actions-preview.lua b/nvim/lua/plugins/extras/lsp/actions-preview.lua new file mode 100644 index 0000000..c2c4bf8 --- /dev/null +++ b/nvim/lua/plugins/extras/lsp/actions-preview.lua @@ -0,0 +1,39 @@ +return { + { + "neovim/nvim-lspconfig", + opts = function() + local keys = require("lazyvim.plugins.lsp.keymaps").get() + + keys[#keys + 1] = { + "ca", + function() + require("actions-preview").code_actions() + end, + mode = { "n", "v" }, + desc = "Code Action Preview", + } + keys[#keys + 1] = { "gr", "Glance references", desc = "Goto References" } + keys[#keys + 1] = { "gy", "Glance type_definitions", desc = "Goto T[y]pe Definitions" } + keys[#keys + 1] = { "gI", "Glance implementations", desc = "Goto Implementations" } + end, + }, + { + "aznhe21/actions-preview.nvim", + event = "LspAttach", + opts = { + telescope = { + sorting_strategy = "ascending", + layout_strategy = "vertical", + layout_config = { + width = 0.6, + height = 0.7, + prompt_position = "top", + preview_cutoff = 20, + preview_height = function(_, _, max_lines) + return max_lines - 15 + end, + }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lsp/file-operations.lua b/nvim/lua/plugins/extras/lsp/file-operations.lua new file mode 100644 index 0000000..d37a436 --- /dev/null +++ b/nvim/lua/plugins/extras/lsp/file-operations.lua @@ -0,0 +1,8 @@ +return { + "nvim-neo-tree/neo-tree.nvim", + optional = true, + dependencies = { + "antosha417/nvim-lsp-file-operations", + opts = {}, + }, +} diff --git a/nvim/lua/plugins/extras/lsp/garbage-day.lua b/nvim/lua/plugins/extras/lsp/garbage-day.lua new file mode 100644 index 0000000..79f8186 --- /dev/null +++ b/nvim/lua/plugins/extras/lsp/garbage-day.lua @@ -0,0 +1,8 @@ +return { + "zeioth/garbage-day.nvim", + event = "LspAttach", + opts = { + notifications = true, + grace_period = 60 * 10, + }, +} diff --git a/nvim/lua/plugins/extras/lsp/glance.lua b/nvim/lua/plugins/extras/lsp/glance.lua new file mode 100644 index 0000000..baca801 --- /dev/null +++ b/nvim/lua/plugins/extras/lsp/glance.lua @@ -0,0 +1,40 @@ +return { + { + "neovim/nvim-lspconfig", + opts = function() + local keys = require("lazyvim.plugins.lsp.keymaps").get() + + keys[#keys + 1] = { "gd", "Glance definitions", desc = "Goto Definitions" } + keys[#keys + 1] = { "gr", "Glance references", desc = "Goto References" } + keys[#keys + 1] = { "gy", "Glance type_definitions", desc = "Goto T[y]pe Definitions" } + keys[#keys + 1] = { "gI", "Glance implementations", desc = "Goto Implementations" } + end, + }, + { + "dnlhc/glance.nvim", + cmd = { "Glance" }, + event = "LspAttach", + opts = { + border = { + enable = true, + }, + use_trouble_qf = true, + hooks = { + before_open = function(results, open, jump, method) + local uri = vim.uri_from_bufnr(0) + if #results == 1 then + local target_uri = results[1].uri or results[1].targetUri + + if target_uri == uri then + jump(results[1]) + else + open(results) + end + else + open(results) + end + end, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lsp/inc-rename.lua b/nvim/lua/plugins/extras/lsp/inc-rename.lua new file mode 100644 index 0000000..b4b636e --- /dev/null +++ b/nvim/lua/plugins/extras/lsp/inc-rename.lua @@ -0,0 +1,5 @@ +return { + "smjonas/inc-rename.nvim", + cmd = "IncRename", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/lsp/lens.lua b/nvim/lua/plugins/extras/lsp/lens.lua new file mode 100644 index 0000000..55065e8 --- /dev/null +++ b/nvim/lua/plugins/extras/lsp/lens.lua @@ -0,0 +1,19 @@ +return { + "VidocqH/lsp-lens.nvim", + event = "LspAttach", + opts = { + sections = { + definition = false, + references = function(count) + return "󰌹 Ref: " .. count + end, + implements = function(count) + return "󰡱 Imp: " .. count + end, + git_authors = false, + }, + }, + keys = { + { "ue", "LspLensToggle", desc = "Toggle Lsp Lens" }, + }, +} diff --git a/nvim/lua/plugins/extras/lsp/lightbulb.lua b/nvim/lua/plugins/extras/lsp/lightbulb.lua new file mode 100644 index 0000000..681eb35 --- /dev/null +++ b/nvim/lua/plugins/extras/lsp/lightbulb.lua @@ -0,0 +1,12 @@ +return { + "kosayoda/nvim-lightbulb", + event = "LspAttach", + opts = { + autocmd = { enabled = true }, + sign = { enabled = true, text = "" }, + action_kinds = { "quickfix", "refactor" }, + ignore = { + actions_without_kind = true, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lsp/lspconfig-extended.lua b/nvim/lua/plugins/extras/lsp/lspconfig-extended.lua new file mode 100644 index 0000000..0121fbd --- /dev/null +++ b/nvim/lua/plugins/extras/lsp/lspconfig-extended.lua @@ -0,0 +1,66 @@ +local nvim_0_10 = vim.fn.has("nvim-0.10") +local prefix = "cl" + +return { + { + "neovim/nvim-lspconfig", + init = function() + local keys = require("lazyvim.plugins.lsp.keymaps").get() + + keys[#keys + 1] = { "cl", false } + keys[#keys + 1] = { "cil", "LspInfo", desc = "Lsp" } + keys[#keys + 1] = { prefix .. "r", "LspRestart", desc = "Restart Lsp" } + keys[#keys + 1] = { prefix .. "s", "LspStart", desc = "Start Lsp" } + keys[#keys + 1] = { prefix .. "S", "LspStop", desc = "Stop Lsp" } + + -- stylua: ignore start + keys[#keys + 1] = { prefix .. "r", function() vim.lsp.buf.remove_workspace_folder() end, desc = "Remove workspace" } + keys[#keys + 1] = { prefix .. "a", function() vim.lsp.buf.add_workspace_folder() end, desc = "Add workspace" } + -- stylua: ignore end + end, + opts = { + diagnostics = { + virtual_text = { + float = { + border = { + { "┌", "FloatBorder" }, + { "─", "FloatBorder" }, + { "┐", "FloatBorder" }, + { "│", "FloatBorder" }, + { "┘", "FloatBorder" }, + { "─", "FloatBorder" }, + { "└", "FloatBorder" }, + { "│", "FloatBorder" }, + }, + }, + }, + }, + inlay_hints = { + enabled = nvim_0_10, + }, + codelens = { + enabled = false, + }, + servers = { + lua_ls = { + settings = { + Lua = { + hint = { + enable = nvim_0_10, + setType = nvim_0_10, + }, + }, + }, + }, + }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { "cl", group = "lsp", icon = " " }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/lsp/mason-extended.lua b/nvim/lua/plugins/extras/lsp/mason-extended.lua new file mode 100644 index 0000000..cc2a18d --- /dev/null +++ b/nvim/lua/plugins/extras/lsp/mason-extended.lua @@ -0,0 +1,7 @@ +return { + "williamboman/mason.nvim", + keys = { + { "cm", false }, + { "cim", "Mason", desc = "Mason" }, + }, +} diff --git a/nvim/lua/plugins/extras/lsp/neodim.lua b/nvim/lua/plugins/extras/lsp/neodim.lua new file mode 100644 index 0000000..8271f7e --- /dev/null +++ b/nvim/lua/plugins/extras/lsp/neodim.lua @@ -0,0 +1,7 @@ +return { + "zbirenbaum/neodim", + event = "LspAttach", + opts = { + alpha = 0.60, + }, +} diff --git a/nvim/lua/plugins/extras/lsp/symbol-usage.lua b/nvim/lua/plugins/extras/lsp/symbol-usage.lua new file mode 100644 index 0000000..c0c11fa --- /dev/null +++ b/nvim/lua/plugins/extras/lsp/symbol-usage.lua @@ -0,0 +1,22 @@ +return { + "Wansmer/symbol-usage.nvim", + event = function() + if vim.fn.has("nvim-0.10") == 1 then + return "LspAttach" + else + return "BufRead" + end + end, + opts = { + vt_position = "end_of_line", + text_format = function(symbol) + if symbol.references then + local usage = symbol.references <= 1 and "usage" or "usages" + local num = symbol.references == 0 and "no" or symbol.references + return string.format(" 󰌹 %s %s", num, usage) + else + return "" + end + end, + }, +} diff --git a/nvim/lua/plugins/extras/lsp/workspace-diagnostics.lua b/nvim/lua/plugins/extras/lsp/workspace-diagnostics.lua new file mode 100644 index 0000000..1504502 --- /dev/null +++ b/nvim/lua/plugins/extras/lsp/workspace-diagnostics.lua @@ -0,0 +1,5 @@ +return { + "artemave/workspace-diagnostics.nvim", + event = "LspAttach", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/block.lua b/nvim/lua/plugins/extras/ui/block.lua new file mode 100644 index 0000000..6b8d3f0 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/block.lua @@ -0,0 +1,10 @@ +return { + "HampusHauffman/block.nvim", + keys = { { "uo", "Block", desc = "Toggle Block" } }, + opts = { + percent = 0.9, + depth = 4, + colors = nil, + automatic = false, + }, +} diff --git a/nvim/lua/plugins/extras/ui/breadcrumbs.lua b/nvim/lua/plugins/extras/ui/breadcrumbs.lua new file mode 100644 index 0000000..666ea7c --- /dev/null +++ b/nvim/lua/plugins/extras/ui/breadcrumbs.lua @@ -0,0 +1,25 @@ +if vim.fn.has("nvim-0.10") == 1 then + return { + "Bekaboo/dropbar.nvim", + event = "LazyFile", + opts = { + sources = { + terminal = { + name = "", + }, + }, + }, + } +else + return { + "utilyre/barbecue.nvim", + name = "barbecue", + version = "*", + dependencies = { + "SmiteshP/nvim-navic", + "nvim-tree/nvim-web-devicons", + }, + event = "LazyFile", + opts = {}, + } +end diff --git a/nvim/lua/plugins/extras/ui/bufferline-extended.lua b/nvim/lua/plugins/extras/ui/bufferline-extended.lua new file mode 100644 index 0000000..4591380 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/bufferline-extended.lua @@ -0,0 +1,23 @@ +local prefix = "b" + +local keys = {} + +-- stylua: ignore start +table.insert(keys, { prefix .. "S", "BufferLineSortByDirectory", desc = "Sort By Directory" }) +table.insert(keys, { prefix .. "s", "BufferLineSortByExtension", desc = "Sort By Extensions" }) + +table.insert(keys, { prefix .. "<", "BufferLineMovePrev", desc = "Move buffer prev" }) +table.insert(keys, { prefix .. ">", "BufferLineMoveNext", desc = "Move buffer next" }) +-- stylua: ignore end + +return { + "akinsho/bufferline.nvim", + keys = keys, + opts = { + options = { + modified_icon = "", + color_icons = true, + separator_style = "slope", + }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/colorful-winsep.lua b/nvim/lua/plugins/extras/ui/colorful-winsep.lua new file mode 100644 index 0000000..0600a1d --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorful-winsep.lua @@ -0,0 +1,27 @@ +return { + "nvim-zh/colorful-winsep.nvim", + event = { "WinNew", "WinLeave" }, + opts = { + no_exec_files = { + "packer", + "TelescopePrompt", + "CompetiTest", + "netrw", + "NvimTree", + "lazy", + "mason", + "oil", + "neo-tree", + "symbols-outline", + "vim-be-good", + "oil", + "outline", + "trouble", + "startuptime", + "packer", + "spectre", + "alpha", + "edgy", + }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/bamboo.lua b/nvim/lua/plugins/extras/ui/colorschemes/bamboo.lua new file mode 100644 index 0000000..d49248f --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/bamboo.lua @@ -0,0 +1,5 @@ +return { + "ribru17/bamboo.nvim", + name = "bamboo", + lazy = false, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/boo.lua b/nvim/lua/plugins/extras/ui/colorschemes/boo.lua new file mode 100644 index 0000000..7ed3efc --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/boo.lua @@ -0,0 +1,5 @@ +return { + "rockerBOO/boo-colorscheme-nvim", + name = "boo", + lazy = false, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/catppuccin.lua b/nvim/lua/plugins/extras/ui/colorschemes/catppuccin.lua new file mode 100644 index 0000000..7592c38 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/catppuccin.lua @@ -0,0 +1,161 @@ +local palette = require("catppuccin.palettes").get_palette("macchiato") -- Import your favorite catppuccin colors + +return { + { + "catppuccin/nvim", + lazy = false, + name = "catppuccin", + opts = { + styles = { + comments = { "italic" }, + }, + background = { + light = "latte", + dark = "macchiato", + }, + term_colors = true, + custom_highlights = function() + return { + Visual = { bg = palette.surface2 }, + FloatermBorder = { fg = palette.base }, + TelescopeMatching = { fg = palette.blue }, + TelescopeSelection = { fg = palette.text, bg = palette.surface0, bold = true }, + TelescopePromptPrefix = { bg = palette.surface0 }, + TelescopePromptNormal = { bg = palette.surface0 }, + TelescopeResultsNormal = { bg = palette.mantle }, + TelescopePreviewNormal = { bg = palette.mantle }, + TelescopePromptBorder = { bg = palette.surface0, fg = palette.surface0 }, + TelescopeResultsBorder = { bg = palette.mantle, fg = palette.mantle }, + TelescopePreviewBorder = { bg = palette.mantle, fg = palette.mantle }, + TelescopePromptTitle = { bg = palette.red, fg = palette.mantle }, + TelescopeResultsTitle = { fg = palette.mantle }, + TelescopePreviewTitle = { bg = palette.green, fg = palette.mantle }, + } + end, + integrations = { + alpha = true, + cmp = true, + barbecue = { + dim_dirname = true, -- directory name is dimmed by default + bold_basename = true, + dim_context = false, + alt_background = false, + }, + colorful_winsep = { + enabled = true, + color = "lavender", + }, + dap = true, + dap_ui = true, + dashboard = true, + diffview = true, + flash = true, + headlines = true, + gitsigns = true, + grug_far = true, + harpoon = false, + illuminate = true, + indent_blankline = { + enabled = true, + scope_color = "lavender", -- catppuccin color (eg. `lavender`) Default: text + colored_indent_levels = false, + }, + render_markdown = true, + mason = true, + markdown = true, + mini = true, + native_lsp = { + enabled = true, + virtual_text = { + errors = { "italic" }, + hints = { "italic" }, + warnings = { "italic" }, + information = { "italic" }, + }, + underlines = { + errors = { "underline" }, + hints = { "underline" }, + warnings = { "underline" }, + information = { "underline" }, + }, + inlay_hints = { + background = true, + }, + }, + lsp_trouble = false, + navic = { enabled = false, custom_bg = "lualine" }, + neotest = true, + neogit = false, + neotree = true, + notify = true, + noice = true, + ufo = true, + overseer = false, + octo = false, + rainbow_delimiters = true, + semantic_tokens = true, + snacks = true, + telescope = { + enabled = true, + }, + symbols_outline = false, + treesitter = true, + treesitter_context = false, + which_key = true, + }, + }, + }, + { + "akinsho/bufferline.nvim", + opts = { + highlights = require("catppuccin.groups.integrations.bufferline").get({ + styles = { "italic", "bold" }, + custom = { + all = { + fill = { + bg = palette.mantle, + }, + separator_selected = { + bg = palette.base, + fg = palette.mantle, + }, + separator = { + bg = palette.mantle, + fg = palette.mantle, + }, + tab_separator = { + bg = palette.mantle, + fg = palette.mantle, + }, + tab_selected = { + bg = palette.base, + }, + tab_separator_selected = { + bg = palette.base, + fg = palette.mantle, + }, + }, + }, + }), + }, + }, + { + "rasulomaroff/reactive.nvim", + optional = true, + opts = { + load = { "catppuccin-macchiato-cursor", "catppuccin-macchiato-cursorline" }, + }, + }, + { + "rachartier/tiny-devicons-auto-colors.nvim", + optional = true, + opts = { + colors = palette, + factors = { + lightness = 0.9, + chroma = 1, + hue = 0.7, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/cyberdream.lua b/nvim/lua/plugins/extras/ui/colorschemes/cyberdream.lua new file mode 100644 index 0000000..379ca58 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/cyberdream.lua @@ -0,0 +1,12 @@ +return { + "scottmckendry/cyberdream.nvim", + lazy = false, + name = "cyberdream", + opts = { + transparent = true, + italic_comments = true, + hide_fillchars = true, + borderless_telescope = true, + terminal_colors = true, + }, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/doom-one.lua b/nvim/lua/plugins/extras/ui/colorschemes/doom-one.lua new file mode 100644 index 0000000..99dde76 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/doom-one.lua @@ -0,0 +1,5 @@ +return { + "NTBBloodbath/doom-one.nvim", + lazy = false, + name = "doom-one", +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/dracula.lua b/nvim/lua/plugins/extras/ui/colorschemes/dracula.lua new file mode 100644 index 0000000..ad69b67 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/dracula.lua @@ -0,0 +1,6 @@ +return { + "Mofiqul/dracula.nvim", + lazy = false, + name = "dracula", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/edge.lua b/nvim/lua/plugins/extras/ui/colorschemes/edge.lua new file mode 100644 index 0000000..1b46aeb --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/edge.lua @@ -0,0 +1,5 @@ +return { + "sainnhe/edge", + name = "edge", + lazy = false, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/everblush.lua b/nvim/lua/plugins/extras/ui/colorschemes/everblush.lua new file mode 100644 index 0000000..dc7a9e7 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/everblush.lua @@ -0,0 +1,6 @@ +return { + "Everblush/nvim", + name = "everblush", + lazy = false, + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/everforest.lua b/nvim/lua/plugins/extras/ui/colorschemes/everforest.lua new file mode 100644 index 0000000..4df4602 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/everforest.lua @@ -0,0 +1,6 @@ +return { + "sainnhe/everforest", + lazy = false, + name = "everforest", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/fluoromachine.lua b/nvim/lua/plugins/extras/ui/colorschemes/fluoromachine.lua new file mode 100644 index 0000000..255e6a4 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/fluoromachine.lua @@ -0,0 +1,6 @@ +return { + "maxmx03/fluoromachine.nvim", + lazy = false, + name = "fluoromachine", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/github.lua b/nvim/lua/plugins/extras/ui/colorschemes/github.lua new file mode 100644 index 0000000..08ba6b4 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/github.lua @@ -0,0 +1,5 @@ +return { + "projekt0n/github-nvim-theme", + lazy = false, + name = "github", +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/gruvbox-material.lua b/nvim/lua/plugins/extras/ui/colorschemes/gruvbox-material.lua new file mode 100644 index 0000000..fc9de68 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/gruvbox-material.lua @@ -0,0 +1,5 @@ +return { + "sainnhe/gruvbox-material", + name = "gruvbox-material", + lazy = false, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/gruvbox.lua b/nvim/lua/plugins/extras/ui/colorschemes/gruvbox.lua new file mode 100644 index 0000000..04d05d6 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/gruvbox.lua @@ -0,0 +1,27 @@ +return { + "ellisonleao/gruvbox.nvim", + lazy = false, + name = "gruvbox", + opts = { + undercurl = true, + underline = true, + bold = true, + italic = { + strings = true, + comments = true, + operators = false, + folds = true, + }, + strikethrough = true, + invert_selection = false, + invert_signs = false, + invert_tabline = false, + invert_intend_guides = false, + inverse = true, -- invert background for search, diffs, statuslines and errors + contrast = "", -- can be "hard", "soft" or empty string + palette_overrides = {}, + overrides = {}, + dim_inactive = false, + transparent_mode = false, + }, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/helix.lua b/nvim/lua/plugins/extras/ui/colorschemes/helix.lua new file mode 100644 index 0000000..dfc4d11 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/helix.lua @@ -0,0 +1,6 @@ +return { + "oneslash/helix-nvim", + lazy = false, + name = "helix", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/horizon.lua b/nvim/lua/plugins/extras/ui/colorschemes/horizon.lua new file mode 100644 index 0000000..fc05fe7 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/horizon.lua @@ -0,0 +1,23 @@ +return { + "akinsho/horizon.nvim", + lazy = false, + name = "horizon", + opts = { + plugins = { + cmp = true, + indent_blankline = true, + nvim_tree = true, + telescope = true, + which_key = true, + barbar = true, + notify = true, + symbols_outline = true, + neo_tree = true, + gitsigns = true, + crates = true, + hop = true, + navic = true, + quickscope = false, + }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/hybrid.lua b/nvim/lua/plugins/extras/ui/colorschemes/hybrid.lua new file mode 100644 index 0000000..61179ab --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/hybrid.lua @@ -0,0 +1,6 @@ +return { + "HoNamDuong/hybrid.nvim", + name = "hybrid", + lazy = false, + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/iceberg.lua b/nvim/lua/plugins/extras/ui/colorschemes/iceberg.lua new file mode 100644 index 0000000..9ace02d --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/iceberg.lua @@ -0,0 +1,5 @@ +return { + "cocopon/iceberg.vim", + lazy = false, + name = "iceberg", +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/juliana.lua b/nvim/lua/plugins/extras/ui/colorschemes/juliana.lua new file mode 100644 index 0000000..a3a46b8 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/juliana.lua @@ -0,0 +1,5 @@ +return { + "kaiuri/nvim-juliana", + lazy = false, + name = "juliana", +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/kanagawa.lua b/nvim/lua/plugins/extras/ui/colorschemes/kanagawa.lua new file mode 100644 index 0000000..3baa0e0 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/kanagawa.lua @@ -0,0 +1,6 @@ +return { + "rebelot/kanagawa.nvim", + lazy = false, + name = "kanagawa", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/material.lua b/nvim/lua/plugins/extras/ui/colorschemes/material.lua new file mode 100644 index 0000000..c4beb91 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/material.lua @@ -0,0 +1,6 @@ +return { + "marko-cerovac/material.nvim", + lazy = false, + name = "material", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/melange.lua b/nvim/lua/plugins/extras/ui/colorschemes/melange.lua new file mode 100644 index 0000000..b92d35f --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/melange.lua @@ -0,0 +1,5 @@ +return { + "savq/melange-nvim", + lazy = false, + name = "melange", +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/mellifluous.lua b/nvim/lua/plugins/extras/ui/colorschemes/mellifluous.lua new file mode 100644 index 0000000..4c7f170 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/mellifluous.lua @@ -0,0 +1,6 @@ +return { + "ramojus/mellifluous.nvim", + name = "mellifluous", + lazy = false, + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/miasma.lua b/nvim/lua/plugins/extras/ui/colorschemes/miasma.lua new file mode 100644 index 0000000..540cb14 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/miasma.lua @@ -0,0 +1,5 @@ +return { + "xero/miasma.nvim", + name = "miasma", + lazy = false, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/mini-base16.lua b/nvim/lua/plugins/extras/ui/colorschemes/mini-base16.lua new file mode 100644 index 0000000..a54f2d4 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/mini-base16.lua @@ -0,0 +1,5 @@ +return { + "echasnovski/mini.base16", + lazy = false, + name = "base16", +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/modus.lua b/nvim/lua/plugins/extras/ui/colorschemes/modus.lua new file mode 100644 index 0000000..0e1455c --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/modus.lua @@ -0,0 +1,6 @@ +return { + "miikanissi/modus-themes.nvim", + name = "modus", + lazy = false, + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/monokai-pro.lua b/nvim/lua/plugins/extras/ui/colorschemes/monokai-pro.lua new file mode 100644 index 0000000..445ed0d --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/monokai-pro.lua @@ -0,0 +1,16 @@ +return { + "loctvl842/monokai-pro.nvim", + lazy = false, + name = "monokai-pro", + opts = { + terminal_colors = true, + devicons = true, -- highlight the icons of `nvim-web-devicons` + filter = "pro", -- classic | octagon | pro | machine | ristretto | spectrum + plugins = { + indent_blankline = { + context_highlight = "pro", -- default | pro + context_start_underline = false, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/moonfly.lua b/nvim/lua/plugins/extras/ui/colorschemes/moonfly.lua new file mode 100644 index 0000000..8f8e3b0 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/moonfly.lua @@ -0,0 +1,5 @@ +return { + "bluz71/vim-moonfly-colors", + name = "moonfly", + lazy = false, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/moonlight.lua b/nvim/lua/plugins/extras/ui/colorschemes/moonlight.lua new file mode 100644 index 0000000..a563d03 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/moonlight.lua @@ -0,0 +1,5 @@ +return { + "shaunsingh/moonlight.nvim", + name = "moonlight", + lazy = false, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/neosolarized.lua b/nvim/lua/plugins/extras/ui/colorschemes/neosolarized.lua new file mode 100644 index 0000000..dfea12b --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/neosolarized.lua @@ -0,0 +1,5 @@ +return { + "Tsuzat/NeoSolarized.nvim", + lazy = false, + name = "solarized", +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/nightfly.lua b/nvim/lua/plugins/extras/ui/colorschemes/nightfly.lua new file mode 100644 index 0000000..a06f2aa --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/nightfly.lua @@ -0,0 +1,5 @@ +return { + "bluz71/vim-nightfly-colors", + name = "nightfly", + lazy = false, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/nightfox.lua b/nvim/lua/plugins/extras/ui/colorschemes/nightfox.lua new file mode 100644 index 0000000..be88d47 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/nightfox.lua @@ -0,0 +1,13 @@ +return { + "EdenEast/nightfox.nvim", + lazy = false, + name = "nightfox", + opts = { + options = {}, + groups = { + all = { + MatchParen = { fg = "NONE" }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/nord.lua b/nvim/lua/plugins/extras/ui/colorschemes/nord.lua new file mode 100644 index 0000000..ce7c577 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/nord.lua @@ -0,0 +1,5 @@ +return { + "shaunsingh/nord.nvim", + lazy = false, + name = "nord", +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/nordic.lua b/nvim/lua/plugins/extras/ui/colorschemes/nordic.lua new file mode 100644 index 0000000..c2c9692 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/nordic.lua @@ -0,0 +1,6 @@ +return { + "AlexvZyl/nordic.nvim", + lazy = false, + name = "nordic", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/nvimgelion.lua b/nvim/lua/plugins/extras/ui/colorschemes/nvimgelion.lua new file mode 100644 index 0000000..5e25a93 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/nvimgelion.lua @@ -0,0 +1,6 @@ +return { + "nyngwang/nvimgelion", + name = "nvimgelion", + lazy = false, + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/oceanic.lua b/nvim/lua/plugins/extras/ui/colorschemes/oceanic.lua new file mode 100644 index 0000000..41e0ad6 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/oceanic.lua @@ -0,0 +1,5 @@ +return { + "mhartington/oceanic-next", + name = "oceanic-next", + lazy = false, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/onedark.lua b/nvim/lua/plugins/extras/ui/colorschemes/onedark.lua new file mode 100644 index 0000000..5588dfb --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/onedark.lua @@ -0,0 +1,44 @@ +return { + "navarasu/onedark.nvim", + lazy = false, + name = "onedark", + opts = { + -- Main options -- + style = "dark", -- Default theme style. Choose between 'dark', 'darker', 'cool', 'deep', 'warm', 'warmer' and 'light' + transparent = false, -- Show/hide background + term_colors = true, -- Change terminal color as per the selected theme style + ending_tildes = false, -- Show the end-of-buffer tildes. By default they are hidden + cmp_itemkind_reverse = false, -- reverse item kind highlights in cmp menu + + -- toggle theme style --- + toggle_style_key = nil, -- keybind to toggle theme style. Leave it nil to disable it, or set it to a string, for example "ts" + toggle_style_list = { "dark", "darker", "cool", "deep", "warm", "warmer", "light" }, -- List of styles to toggle between + + -- Change code style --- + -- Options are italic, bold, underline, none + -- You can configure multiple style with comma seperated, For e.g., keywords = 'italic,bold' + code_style = { + comments = "italic", + keywords = "none", + functions = "none", + strings = "none", + variables = "none", + }, + + -- Lualine options -- + lualine = { + transparent = false, -- lualine center bar transparency + }, + + -- Custom Highlights -- + colors = {}, -- Override default colors + highlights = {}, -- Override highlight groups + + -- Plugins Config -- + diagnostics = { + darker = true, -- darker colors for diagnostic + undercurl = true, -- use undercurl instead of underline for diagnostics + background = true, -- use background color for virtual text + }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/onedarkpro.lua b/nvim/lua/plugins/extras/ui/colorschemes/onedarkpro.lua new file mode 100644 index 0000000..971df4e --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/onedarkpro.lua @@ -0,0 +1,6 @@ +return { + "olimorris/onedarkpro.nvim", + lazy = false, + name = "onedarkpro", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/onenord.lua b/nvim/lua/plugins/extras/ui/colorschemes/onenord.lua new file mode 100644 index 0000000..b8067b5 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/onenord.lua @@ -0,0 +1,6 @@ +return { + "rmehri01/onenord.nvim", + name = "onenord", + lazy = false, + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/oxocarbon.lua b/nvim/lua/plugins/extras/ui/colorschemes/oxocarbon.lua new file mode 100644 index 0000000..c8a20f6 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/oxocarbon.lua @@ -0,0 +1,5 @@ +return { + "nyoom-engineering/oxocarbon.nvim", + lazy = false, + name = "oxocarbon", +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/poimandres.lua b/nvim/lua/plugins/extras/ui/colorschemes/poimandres.lua new file mode 100644 index 0000000..f72d322 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/poimandres.lua @@ -0,0 +1,6 @@ +return { + "olivercederborg/poimandres.nvim", + lazy = false, + name = "poimandres", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/rasmus.lua b/nvim/lua/plugins/extras/ui/colorschemes/rasmus.lua new file mode 100644 index 0000000..9d08775 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/rasmus.lua @@ -0,0 +1,5 @@ +return { + "kvrohit/rasmus.nvim", + name = "rasmus", + lazy = false, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/rose-pine.lua b/nvim/lua/plugins/extras/ui/colorschemes/rose-pine.lua new file mode 100644 index 0000000..695c391 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/rose-pine.lua @@ -0,0 +1,10 @@ +return { + "rose-pine/neovim", + lazy = false, + name = "rose-pine", + opts = { + highlight_groups = { + EndOfBuffer = { fg = "base" }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/sherbet.lua b/nvim/lua/plugins/extras/ui/colorschemes/sherbet.lua new file mode 100644 index 0000000..54b1464 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/sherbet.lua @@ -0,0 +1,5 @@ +return { + "lewpoly/sherbet.nvim", + name = "sherbet", + lazy = false, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/solarized-osaka.lua b/nvim/lua/plugins/extras/ui/colorschemes/solarized-osaka.lua new file mode 100644 index 0000000..fe6f17e --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/solarized-osaka.lua @@ -0,0 +1,6 @@ +return { + "craftzdog/solarized-osaka.nvim", + name = "solarized-osaka", + lazy = false, + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/sonokai.lua b/nvim/lua/plugins/extras/ui/colorschemes/sonokai.lua new file mode 100644 index 0000000..2e292fa --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/sonokai.lua @@ -0,0 +1,6 @@ +return { + "sainnhe/sonokai", + lazy = false, + name = "sonokai", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/synthweave.lua b/nvim/lua/plugins/extras/ui/colorschemes/synthweave.lua new file mode 100644 index 0000000..6c06ffe --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/synthweave.lua @@ -0,0 +1,6 @@ +return { + "samharju/synthweave.nvim", + name = "synthweave", + lazy = false, + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/tokyonight.lua b/nvim/lua/plugins/extras/ui/colorschemes/tokyonight.lua new file mode 100644 index 0000000..a8be6e6 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/tokyonight.lua @@ -0,0 +1,35 @@ +return { + "folke/tokyonight.nvim", + name = "tokyonight", + lazy = false, + opts = { + style = "storm", -- The theme comes in three styles, `storm`, `moon`, a darker variant `night` and `day` + light_style = "day", -- The theme is used when the background is set to light + transparent = false, -- Enable this to disable setting the background color + terminal_colors = true, -- Configure the colors used when opening a `:terminal` in Neovim + styles = { + -- Style to be applied to different syntax groups + -- Value is any valid attr-list value for `:help nvim_set_hl` + comments = { italic = true }, + keywords = { italic = true }, + functions = {}, + variables = {}, + -- Background styles. Can be "dark", "transparent" or "normal" + sidebars = "dark", -- style for sidebars, see below + floats = "dark", -- style for floating windows + }, + sidebars = { "qf", "help" }, -- Set a darker background on sidebar-like windows. For example: `["qf", "vista_kind", "terminal", "packer"]` + day_brightness = 0.3, -- Adjusts the brightness of the colors of the **Day** style. Number between 0 and 1, from dull to vibrant colors + hide_inactive_statusline = false, -- Enabling this option, will hide inactive statuslines and replace them with a thin border instead. Should work with the standard **StatusLine** and **LuaLine**. + dim_inactive = false, -- dims inactive windows + lualine_bold = false, -- When `true`, section headers in the lualine theme will be bold + + --- You can override specific color groups to use other groups or a hex color + --- function will be called with a ColorScheme table + on_colors = function(colors) end, + + --- You can override specific highlights to use other groups or a hex color + --- function will be called with a Highlights and ColorScheme table + on_highlights = function(highlights, colors) end, + }, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/vscode.lua b/nvim/lua/plugins/extras/ui/colorschemes/vscode.lua new file mode 100644 index 0000000..33af892 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/vscode.lua @@ -0,0 +1,6 @@ +return { + "Mofiqul/vscode.nvim", + lazy = false, + name = "vscode", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/zenbones.lua b/nvim/lua/plugins/extras/ui/colorschemes/zenbones.lua new file mode 100644 index 0000000..e1ebc05 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/zenbones.lua @@ -0,0 +1,6 @@ +return { + "mcchrish/zenbones.nvim", + name = "zenbones", + lazy = false, + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/colorschemes/zephyrium.lua b/nvim/lua/plugins/extras/ui/colorschemes/zephyrium.lua new file mode 100644 index 0000000..67461e5 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/colorschemes/zephyrium.lua @@ -0,0 +1,5 @@ +return { + "titanzero/zephyrium", + name = "zephyrium", + lazy = false, +} diff --git a/nvim/lua/plugins/extras/ui/comment-box.lua b/nvim/lua/plugins/extras/ui/comment-box.lua new file mode 100644 index 0000000..1e1ac76 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/comment-box.lua @@ -0,0 +1,26 @@ +local prefix = "ac" + +return { + { + "LudoPinelli/comment-box.nvim", + opts = {}, + vscode = true, + keys = { + { prefix .. "b", "CBccbox", mode = { "n", "v" }, desc = "Comment Box" }, + { prefix .. "t", "CBllline", mode = { "n", "v" }, desc = "Tiled Line" }, + { prefix .. "l", "CBline", desc = "Line" }, + { prefix .. "m", "CBllbox14", mode = { "n", "v" }, desc = "Marked" }, + { prefix .. "c", "CBcatalog", desc = "Catalog" }, + { prefix .. "d", "CBd", mode = { "n", "v" }, desc = "Delete Comment Style" }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { "A", group = "annotation/snippets", icon = " " }, + { prefix, group = "comments", icon = " " }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/context.lua b/nvim/lua/plugins/extras/ui/context.lua new file mode 100644 index 0000000..0ca1dab --- /dev/null +++ b/nvim/lua/plugins/extras/ui/context.lua @@ -0,0 +1,17 @@ +return { + "haringsrob/nvim_context_vt", + event = "LazyFile", + dependencies = "nvim-treesitter/nvim-treesitter", + opts = { + prefix = " 󱞷", + highlight = "NonText", + min_rows = 7, + disable_ft = { "markdown", "css" }, + -- Disable display of virtual text below blocks for indentation based + -- languages like Python + disable_virtual_lines_ft = { "yaml" }, + }, + keys = { + { "ux", "NvimContextVtToggle", desc = "Toggle Context" }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/dashboard-extended.lua b/nvim/lua/plugins/extras/ui/dashboard-extended.lua new file mode 100644 index 0000000..d1903c4 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/dashboard-extended.lua @@ -0,0 +1,22 @@ +return { + { import = "lazyvim.plugins.extras.ui.dashboard" }, + { + "nvimdev/dashboard-nvim", + opts = function(_, opts) + local logo = [[ +  + ████ ██████ █████ ██ + ███████████ █████  + █████████ ███████████████████ ███ ███████████ + █████████ ███ █████████████ █████ ██████████████ + █████████ ██████████ █████████ █████ █████ ████ █████ + ███████████ ███ ███ █████████ █████ █████ ████ █████ +██████ █████████████████████ ████ █████ █████ ████ ██████ + ]] + + logo = string.rep("\n", 8) .. logo .. "\n\n" + opts.config.header = vim.split(logo, "\n") + return opts + end, + }, +} diff --git a/nvim/lua/plugins/extras/ui/diagflow.lua b/nvim/lua/plugins/extras/ui/diagflow.lua new file mode 100644 index 0000000..4b4549e --- /dev/null +++ b/nvim/lua/plugins/extras/ui/diagflow.lua @@ -0,0 +1,5 @@ +return { + "dgagn/diagflow.nvim", + event = "LspAttach", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/edgy-extended.lua b/nvim/lua/plugins/extras/ui/edgy-extended.lua new file mode 100644 index 0000000..eddc64a --- /dev/null +++ b/nvim/lua/plugins/extras/ui/edgy-extended.lua @@ -0,0 +1,9 @@ +return { + { import = "lazyvim.plugins.extras.ui.edgy" }, + { + "folke/edgy.nvim", + opts = { + animate = { enabled = false }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/fidget.lua b/nvim/lua/plugins/extras/ui/fidget.lua new file mode 100644 index 0000000..4247157 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/fidget.lua @@ -0,0 +1,18 @@ +return { + { + "j-hui/fidget.nvim", + event = "LspAttach", + opts = {}, + }, + { + "folke/noice.nvim", + optional = true, + opts = { + lsp = { + progress = { + enabled = false, + }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/helpview.lua b/nvim/lua/plugins/extras/ui/helpview.lua new file mode 100644 index 0000000..5bec967 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/helpview.lua @@ -0,0 +1,5 @@ +return { + "OXY2DEV/helpview.nvim", + ft = "help", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/highlight-colors.lua b/nvim/lua/plugins/extras/ui/highlight-colors.lua new file mode 100644 index 0000000..f2b095f --- /dev/null +++ b/nvim/lua/plugins/extras/ui/highlight-colors.lua @@ -0,0 +1,9 @@ +return { + "brenoprata10/nvim-highlight-colors", + event = "VeryLazy", + opts = {}, + -- stylua: ignore + keys = { + { "uc", function() require("nvim-highlight-colors").toggle() end, desc = "Toggle Highlight Colors" }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/highlight-undo.lua b/nvim/lua/plugins/extras/ui/highlight-undo.lua new file mode 100644 index 0000000..7b4e059 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/highlight-undo.lua @@ -0,0 +1,8 @@ +return { + "tzachar/highlight-undo.nvim", + event = "LazyFile", + vscode = true, + opts = { + duration = 700, + }, +} diff --git a/nvim/lua/plugins/extras/ui/image.lua b/nvim/lua/plugins/extras/ui/image.lua new file mode 100644 index 0000000..90aa307 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/image.lua @@ -0,0 +1,36 @@ +return { + "3rd/image.nvim", + event = "LazyFile", + dependencies = { + { "nvim-treesitter/nvim-treesitter" }, + }, + opts = { + backend = "kitty", + integrations = { + markdown = { + enabled = true, + clear_in_insert_mode = false, + download_remote_images = true, + only_render_image_at_cursor = false, + filetypes = { "markdown", "vimwiki" }, -- markdown extensions (ie. quarto) can go here + }, + neorg = { + enabled = true, + clear_in_insert_mode = false, + download_remote_images = true, + only_render_image_at_cursor = false, + filetypes = { "norg" }, + }, + }, + max_width = nil, + max_height = nil, + max_width_window_percentage = nil, + max_height_window_percentage = 50, + kitty_method = "normal", + window_overlap_clear_enabled = true, -- toggles images when windows are overlapped + window_overlap_clear_ft_ignore = { "cmp_menu", "cmp_docs", "" }, + editor_only_render_when_focused = false, -- auto show/hide images when the editor gains/looses focus + tmux_show_only_in_active_window = true, -- auto show/hide images in the correct Tmux window (needs visual-activity off) + hijack_file_patterns = { "*.png", "*.jpg", "*.jpeg", "*.gif", "*.webp" }, -- render image files as images when opened + }, +} diff --git a/nvim/lua/plugins/extras/ui/img-clip.lua b/nvim/lua/plugins/extras/ui/img-clip.lua new file mode 100644 index 0000000..2255998 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/img-clip.lua @@ -0,0 +1,7 @@ +return { + "HakonHarnes/img-clip.nvim", + opts = {}, + keys = { + { "P", "PasteImage", desc = "Paste Clipboard Image" }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/import-cost.lua b/nvim/lua/plugins/extras/ui/import-cost.lua new file mode 100644 index 0000000..4925005 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/import-cost.lua @@ -0,0 +1,6 @@ +return { + "barrett-ruth/import-cost.nvim", + build = "sh install.sh npm", + event = "LazyFile", + config = true, +} diff --git a/nvim/lua/plugins/extras/ui/inline-fold.lua b/nvim/lua/plugins/extras/ui/inline-fold.lua new file mode 100644 index 0000000..46e47a3 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/inline-fold.lua @@ -0,0 +1,28 @@ +return { + "malbertzard/inline-fold.nvim", + init = function() + vim.api.nvim_create_autocmd({ "BufEnter", "BufWinEnter" }, { + pattern = { "*.html", "*.tsx", "*.jsx" }, + callback = function(_) + if not require("inline-fold.module").isHidden then + vim.cmd("InlineFoldToggle") + end + end, + }) + end, + ft = "html", + cmd = "InlineFoldToggle", + opts = { + defaultPlaceholder = "…", + queries = { + html = { + { pattern = 'class="([^"]*)"' }, + { pattern = 'href="(.-)"' }, + { pattern = 'src="(.-)"' }, + }, + }, + }, + keys = { + { "uI", "InlineFoldToggle", desc = "Toggle Inline Fold" }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/log-highlight.lua b/nvim/lua/plugins/extras/ui/log-highlight.lua new file mode 100644 index 0000000..e5275b1 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/log-highlight.lua @@ -0,0 +1,5 @@ +return { + "fei6409/log-highlight.nvim", + ft = "log", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/lualine-extended.lua b/nvim/lua/plugins/extras/ui/lualine-extended.lua new file mode 100644 index 0000000..f612034 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/lualine-extended.lua @@ -0,0 +1,63 @@ +local formatter = function() + local formatters = require("conform").list_formatters(0) + if #formatters == 0 then + return "" + end + + return "󰛖 " +end + +local linter = function() + local linters = require("lint").linters_by_ft[vim.bo.filetype] + if #linters == 0 then + return "" + end + + return "󱉶 " +end + +return { + "nvim-lualine/lualine.nvim", + opts = function(_, opts) + opts.options.component_separators = { left = "", right = "" } + opts.options.section_separators = { left = "", right = "" } + + opts.sections.lualine_a = { { "mode", icon = "" } } + opts.sections.lualine_c[4] = { + LazyVim.lualine.pretty_path({ + filename_hl = "Bold", + modified_hl = "MatchParen", + directory_hl = "Conceal", + }), + } + + if vim.g.lualine_info_extras == true then + table.insert(opts.sections.lualine_x, 2, { "lsp_status" }) + table.insert(opts.sections.lualine_x, 2, formatter) + table.insert(opts.sections.lualine_x, 2, linter) + end + + opts.sections.lualine_y = { "progress" } + opts.sections.lualine_z = { + { "location", separator = "" }, + { + function() + return "" + end, + padding = { left = 0, right = 1 }, + }, + } + opts.extensions = { + "lazy", + "man", + "mason", + "nvim-dap-ui", + "overseer", + "quickfix", + "toggleterm", + "trouble", + "neo-tree", + "symbols-outline", + } + end, +} diff --git a/nvim/lua/plugins/extras/ui/minimap.lua b/nvim/lua/plugins/extras/ui/minimap.lua new file mode 100644 index 0000000..370a959 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/minimap.lua @@ -0,0 +1,22 @@ +return { + "echasnovski/mini.map", + opts = function() + local map = require("mini.map") + return { + symbols = { + encode = require("mini.map").gen_encode_symbols.dot("4x2"), + }, + integrations = { + map.gen_integration.builtin_search(), + map.gen_integration.gitsigns(), + map.gen_integration.diagnostic(), + }, + window = { + show_integration_count = false, + }, + } + end, + keys = { + { "um", "lua MiniMap.toggle()", desc = "Toggle Minimap" }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/modes.lua b/nvim/lua/plugins/extras/ui/modes.lua new file mode 100644 index 0000000..76ea2d9 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/modes.lua @@ -0,0 +1,5 @@ +return { + "mvllow/modes.nvim", + event = "VeryLazy", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/modicator.lua b/nvim/lua/plugins/extras/ui/modicator.lua new file mode 100644 index 0000000..3b2456b --- /dev/null +++ b/nvim/lua/plugins/extras/ui/modicator.lua @@ -0,0 +1,11 @@ +return { + "mawkler/modicator.nvim", + event = "LazyFile", + init = function() + -- These are required for Modicator to work + vim.o.cursorline = true + vim.o.number = true + vim.o.termguicolors = true + end, + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/noice-extended.lua b/nvim/lua/plugins/extras/ui/noice-extended.lua new file mode 100644 index 0000000..3ee5781 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/noice-extended.lua @@ -0,0 +1,16 @@ +return { + "folke/noice.nvim", + opts = function(_, opts) + table.insert(opts.routes, { + filter = { + event = "notify", + find = "No information available", + }, + opts = { + skip = true, + }, + }) + opts.presets.lsp_doc_border = true + opts.presets.bottom_search = false + end, +} diff --git a/nvim/lua/plugins/extras/ui/rainbow-delimeters.lua b/nvim/lua/plugins/extras/ui/rainbow-delimeters.lua new file mode 100644 index 0000000..eeacaf5 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/rainbow-delimeters.lua @@ -0,0 +1,7 @@ +return { + "HiPhish/rainbow-delimiters.nvim", + event = "LazyFile", + config = function() + require("rainbow-delimiters.setup").setup() + end, +} diff --git a/nvim/lua/plugins/extras/ui/reactive.lua b/nvim/lua/plugins/extras/ui/reactive.lua new file mode 100644 index 0000000..5dfe1be --- /dev/null +++ b/nvim/lua/plugins/extras/ui/reactive.lua @@ -0,0 +1,8 @@ +return { + "rasulomaroff/reactive.nvim", + event = "VeryLazy", + opts = {}, + keys = { + { "uM", "ReactiveToggle", desc = "Mode Lines" }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/scrollbar.lua b/nvim/lua/plugins/extras/ui/scrollbar.lua new file mode 100644 index 0000000..a1e321e --- /dev/null +++ b/nvim/lua/plugins/extras/ui/scrollbar.lua @@ -0,0 +1,28 @@ +local excluded_filetypes = { "neo-tree", "alpha", "Outline", "edgy", "floaterm" } + +if vim.fn.has("nvim-0.10") == 1 then + return { + "lewis6991/satellite.nvim", + opts = { + excluded_filetypes = excluded_filetypes, + }, + event = "LazyFile", + } +else + return { + "dstein64/nvim-scrollview", + event = "LazyFile", + keys = { { "uV", "ScrollViewToggle", desc = "Toggle Scrollview" } }, + config = function() + require("scrollview").setup({ + excluded_filetypes = excluded_filetypes, + signs_column = 0, + winblend = 25, + diagnostics_error_symbol = "", + diagnostics_warn_symbol = "", + diagnostics_info_symbol = "", + diagnostics_hint_symbol = "", + }) + end, + } +end diff --git a/nvim/lua/plugins/extras/ui/showkeys.lua b/nvim/lua/plugins/extras/ui/showkeys.lua new file mode 100644 index 0000000..9a80162 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/showkeys.lua @@ -0,0 +1,8 @@ +return { + "nvchad/showkeys", + cmd = "ShowkeysToggle", + opts = { + timeout = 1, + maxkeys = 8, + }, +} diff --git a/nvim/lua/plugins/extras/ui/smooth-scrolling.lua b/nvim/lua/plugins/extras/ui/smooth-scrolling.lua new file mode 100644 index 0000000..b9a5873 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/smooth-scrolling.lua @@ -0,0 +1,26 @@ +return { + "declancm/cinnamon.nvim", + event = "VeryLazy", + config = function() + require("cinnamon").setup({ + options = { + delay = 5, + }, + }) + + local keymaps = { + [""] = "zz", + [""] = "zz", + ["n"] = "nzzzv", + ["N"] = "Nzzzv", + } + + local scroll = require("cinnamon").scroll + + for key, value in pairs(keymaps) do + vim.keymap.set("n", key, function() + scroll(value) + end) + end + end, +} diff --git a/nvim/lua/plugins/extras/ui/specs.lua b/nvim/lua/plugins/extras/ui/specs.lua new file mode 100644 index 0000000..e7e7bc2 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/specs.lua @@ -0,0 +1,8 @@ +return { + "edluffy/specs.nvim", + opts = {}, + -- stylua: ignore + keys = { + { "", function() require("specs").show_specs() end, desc = "Specs" }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/status-column.lua b/nvim/lua/plugins/extras/ui/status-column.lua new file mode 100644 index 0000000..61e48f3 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/status-column.lua @@ -0,0 +1,38 @@ +return { + { + "luukvbaal/statuscol.nvim", + event = { "LazyFile" }, + opts = function() + local builtin = require("statuscol.builtin") + return { + ft_ignore = { "neo-tree", "neo-tree-popup", "alpha", "lazy", "mason", "dashboard" }, + segments = { + { text = { builtin.lnumfunc }, click = "v:lua.ScLa" }, + { + sign = { name = { "Diagnostic*" }, text = { ".*" }, maxwidth = 1, colwidth = 1, auto = true }, + click = "v:lua.ScSa", + }, + { text = { builtin.foldfunc, " " }, click = "v:lua.ScFa" }, + }, + } + end, + config = function(_, opts) + require("statuscol").setup(opts) + end, + }, + { + "lewis6991/gitsigns.nvim", + opts = { + signs = { + add = { text = "┃" }, + change = { text = "┃" }, + delete = { text = "󱈸" }, + topdelete = { text = "󱈸" }, + changedelete = { text = "┃" }, + untracked = { text = "┇" }, + }, + signcolumn = true, + numhl = true, + }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/sunglasses.lua b/nvim/lua/plugins/extras/ui/sunglasses.lua new file mode 100644 index 0000000..05eb81d --- /dev/null +++ b/nvim/lua/plugins/extras/ui/sunglasses.lua @@ -0,0 +1,8 @@ +return { + "miversen33/sunglasses.nvim", + event = "UIEnter", + opts = { + filter_type = "SHADE", + filter_percent = 0.85, + }, +} diff --git a/nvim/lua/plugins/extras/ui/theme-loader.lua b/nvim/lua/plugins/extras/ui/theme-loader.lua new file mode 100644 index 0000000..aec5bcb --- /dev/null +++ b/nvim/lua/plugins/extras/ui/theme-loader.lua @@ -0,0 +1,17 @@ +return { + { + "rafi/theme-loader.nvim", + lazy = false, + priority = 999, + opts = {}, + }, + { + "LazyVim/LazyVim", + config = function(_, opts) + opts = opts or {} + -- disable the colorscheme + opts.colorscheme = function() end + require("lazyvim").setup(opts) + end, + }, +} diff --git a/nvim/lua/plugins/extras/ui/tiny-inline-diagnostic.lua b/nvim/lua/plugins/extras/ui/tiny-inline-diagnostic.lua new file mode 100644 index 0000000..5124ea4 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/tiny-inline-diagnostic.lua @@ -0,0 +1,5 @@ +return { + "rachartier/tiny-inline-diagnostic.nvim", + event = "VeryLazy", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/transparent.lua b/nvim/lua/plugins/extras/ui/transparent.lua new file mode 100644 index 0000000..e5f30c9 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/transparent.lua @@ -0,0 +1,7 @@ +return { + "xiyaowong/nvim-transparent", + opts = {}, + keys = { + { "uP", "TransparentToggle", desc = "Toggle Transparent" }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/which-key-extended.lua b/nvim/lua/plugins/extras/ui/which-key-extended.lua new file mode 100644 index 0000000..f398163 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/which-key-extended.lua @@ -0,0 +1,13 @@ +return { + "folke/which-key.nvim", + opts = { + -- preset = "classic", + icons = { + group = "", + }, + spec = { + { "ci", group = "info", icon = " " }, + { "l", group = "lazy", icon = "󰒲 " }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/ui/windows.lua b/nvim/lua/plugins/extras/ui/windows.lua new file mode 100644 index 0000000..5a226a0 --- /dev/null +++ b/nvim/lua/plugins/extras/ui/windows.lua @@ -0,0 +1,14 @@ +return { + "anuvyklack/windows.nvim", + event = "WinNew", + dependencies = { + { "anuvyklack/middleclass" }, + { "anuvyklack/animation.nvim" }, + }, + keys = { + { "wv", "WindowsMaximizeVertically", desc = "Vertical Zoom" }, + { "wh", "WindowsMaximizeHorizontally", desc = "Horizontal Zoom" }, + { "we", "WindowsEqualize", desc = "Equalize Zoom" }, + }, + opts = {}, +} diff --git a/nvim/lua/plugins/extras/ui/zen-mode.lua b/nvim/lua/plugins/extras/ui/zen-mode.lua new file mode 100644 index 0000000..782e9ae --- /dev/null +++ b/nvim/lua/plugins/extras/ui/zen-mode.lua @@ -0,0 +1,43 @@ +local executeCommandIfExists = function(command) + if vim.fn.exists(command) ~= 0 then + vim.cmd(command) + end +end + +return { + { + "folke/zen-mode.nvim", + cmd = "ZenMode", + keys = { { "z", "ZenMode", desc = "Zen Mode" } }, + opts = { + on_open = function(_) + vim.opt.laststatus = 0 + executeCommandIfExists(":SatelliteDisable") + executeCommandIfExists(":ScrollViewDisable") + executeCommandIfExists(":LspLensOff") + executeCommandIfExists(":NvimContextVtToggle") + executeCommandIfExists(":IBLDisable") + LazyVim.toggle.inlay_hints() + executeCommandIfExists(":Gitsigns toggle_current_line_blame") + executeCommandIfExists(":CccHighlighterDisable") + end, + on_close = function() + vim.opt.laststatus = 3 + executeCommandIfExists(":SatelliteEnable") + executeCommandIfExists(":ScrollViewEnable") + executeCommandIfExists(":LspLensOn") + executeCommandIfExists(":NvimContextVtToggle") + executeCommandIfExists(":IBLEnable") + LazyVim.toggle.inlay_hints() + executeCommandIfExists(":Gitsigns toggle_current_line_blame") + executeCommandIfExists(":CccHighlighterEnable") + end, + }, + }, + { + "folke/twilight.nvim", + cmd = "Twilight", + keys = { { "Z", "Twilight", desc = "Zen Twilight" } }, + opts = {}, + }, +} diff --git a/nvim/lua/plugins/extras/util/autosave.lua b/nvim/lua/plugins/extras/util/autosave.lua new file mode 100644 index 0000000..b81e362 --- /dev/null +++ b/nvim/lua/plugins/extras/util/autosave.lua @@ -0,0 +1,31 @@ +return { + "Pocco81/auto-save.nvim", + event = { "InsertLeave", "TextChanged" }, + opts = { + debounce_delay = 1000, + callbacks = { + before_saving = function() + -- save global autoformat status + vim.g.OLD_AUTOFORMAT = vim.g.autoformat_enabled + + vim.g.autoformat_enabled = false + vim.g.OLD_AUTOFORMAT_BUFFERS = {} + -- disable all manually enabled buffers + for _, bufnr in ipairs(vim.api.nvim_list_bufs()) do + if vim.b[bufnr].autoformat_enabled then + table.insert(vim.g.OLD_BUFFER_AUTOFORMATS, bufnr) + vim.b[bufnr].autoformat_enabled = false + end + end + end, + after_saving = function() + -- restore global autoformat status + vim.g.autoformat_enabled = vim.g.OLD_AUTOFORMAT + -- reenable all manually enabled buffers + for _, bufnr in ipairs(vim.g.OLD_AUTOFORMAT_BUFFERS or {}) do + vim.b[bufnr].autoformat_enabled = true + end + end, + }, + }, +} diff --git a/nvim/lua/plugins/extras/util/better-escape.lua b/nvim/lua/plugins/extras/util/better-escape.lua new file mode 100644 index 0000000..a72749e --- /dev/null +++ b/nvim/lua/plugins/extras/util/better-escape.lua @@ -0,0 +1,5 @@ +return { + "max397574/better-escape.nvim", + opts = {}, + event = "InsertEnter", +} diff --git a/nvim/lua/plugins/extras/util/cloak.lua b/nvim/lua/plugins/extras/util/cloak.lua new file mode 100644 index 0000000..3feedcb --- /dev/null +++ b/nvim/lua/plugins/extras/util/cloak.lua @@ -0,0 +1,10 @@ +return { + "laytan/cloak.nvim", + event = "BufRead .env*", + cmd = { "CloakDisable", "CloakEnable", "CloakToggle" }, + opts = {}, + -- stylua: ignore + keys = { + { "ck", function() require("cloak").toggle() end, desc = "Toggle Cloak" }, + }, +} diff --git a/nvim/lua/plugins/extras/util/discordrcp.lua b/nvim/lua/plugins/extras/util/discordrcp.lua new file mode 100644 index 0000000..e7e5663 --- /dev/null +++ b/nvim/lua/plugins/extras/util/discordrcp.lua @@ -0,0 +1,26 @@ +return { + "IogaMaster/neocord", + event = "VeryLazy", + opts = { + logo = "auto", -- "auto" or url + logo_tooltip = nil, -- nil or string + main_image = "language", -- "language" or "logo" + client_id = "1157438221865717891", -- Use your own Discord application client id (not recommended) + log_level = nil, -- Log messages at or above this level (one of the following: "debug", "info", "warn", "error") + debounce_timeout = 10, -- Number of seconds to debounce events (or calls to `:lua package.loaded.presence:update(, true)`) + blacklist = {}, -- A list of strings or Lua patterns that disable Rich Presence if the current file name, path, or workspace matches + file_assets = {}, -- Custom file asset definitions keyed by file names and extensions (see default config at `lua/presence/file_assets.lua` for reference) + show_time = true, -- Show the timer + global_timer = false, -- if set true, timer won't update when any event are triggered + + -- Rich Presence text options + editing_text = "Editing %s", -- Format string rendered when an editable file is loaded in the buffer (either string or function(filename: string): string) + file_explorer_text = "Browsing %s", -- Format string rendered when browsing a file explorer (either string or function(file_explorer_name: string): string) + git_commit_text = "Committing changes", -- Format string rendered when committing changes in git (either string or function(filename: string): string) + plugin_manager_text = "Managing plugins", -- Format string rendered when managing plugins (either string or function(plugin_manager_name: string): string) + reading_text = "Reading %s", -- Format string rendered when a read-only or unmodifiable file is loaded in the buffer (either string or function(filename: string): string) + workspace_text = "Working on %s", -- Format string rendered when in a git repository (either string or function(project_name: string|nil, filename: string): string) + line_number_text = "Line %s out of %s", -- Format string rendered when `enable_line_number` is set to true (either string or function(line_number: number, line_count: number): string) + terminal_text = "Using Terminal", -- Format string rendered when in terminal mode. + }, +} diff --git a/nvim/lua/plugins/extras/util/dotfyle.lua b/nvim/lua/plugins/extras/util/dotfyle.lua new file mode 100644 index 0000000..7426a6d --- /dev/null +++ b/nvim/lua/plugins/extras/util/dotfyle.lua @@ -0,0 +1,4 @@ +return { + "creativenull/dotfyle-metadata.nvim", + cmd = { "DotfyleGenerate", "DotfyleOpen" }, +} diff --git a/nvim/lua/plugins/extras/util/esqueleto.lua b/nvim/lua/plugins/extras/util/esqueleto.lua new file mode 100644 index 0000000..83745d2 --- /dev/null +++ b/nvim/lua/plugins/extras/util/esqueleto.lua @@ -0,0 +1,21 @@ +return { + "cvigilv/esqueleto.nvim", + event = "VeryLazy", + opts = { + directories = { + vim.fn.stdpath("config") .. "/templates", + }, + patterns = { + -- File + "README", + "LICENSE", + -- Filetype + "sh", + "markdown", + "python", + "lua", + "html", + "vue", + }, + }, +} diff --git a/nvim/lua/plugins/extras/util/hardtime.lua b/nvim/lua/plugins/extras/util/hardtime.lua new file mode 100644 index 0000000..f70aa9a --- /dev/null +++ b/nvim/lua/plugins/extras/util/hardtime.lua @@ -0,0 +1,40 @@ +return { + "m4xshen/hardtime.nvim", + dependencies = { "MunifTanjim/nui.nvim", "nvim-lua/plenary.nvim" }, + event = "LazyFile", + keys = { + { "uH", "Hardtime toggle", desc = "Toggle Hardtime" }, + }, + opts = { + disabled_filetypes = { + "qf", + "netrw", + "NvimTree", + "lazy", + "mason", + "oil", + "neo-tree", + "symbols-outline", + "vim-be-good", + "oil", + "outline", + }, + restriction_mode = "hint", + restricted_keys = { + ["h"] = { "n", "x" }, + ["l"] = { "n", "x" }, + ["-"] = { "n", "x" }, + ["+"] = { "n", "x" }, + ["gj"] = { "n", "x" }, + ["gk"] = { "n", "x" }, + [""] = { "n", "x" }, + [""] = { "n", "x" }, + }, + disabled_keys = { + [""] = { "" }, + [""] = { "" }, + [""] = { "" }, + [""] = { "" }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/util/hawtkeys.lua b/nvim/lua/plugins/extras/util/hawtkeys.lua new file mode 100644 index 0000000..181e8f9 --- /dev/null +++ b/nvim/lua/plugins/extras/util/hawtkeys.lua @@ -0,0 +1,5 @@ +return { + "tris203/hawtkeys.nvim", + cmd = { "Hawtkeys", "HawtkeysDupes", "HawtkeysAll" }, + opts = {}, +} diff --git a/nvim/lua/plugins/extras/util/icon-picker.lua b/nvim/lua/plugins/extras/util/icon-picker.lua new file mode 100644 index 0000000..ead3cd0 --- /dev/null +++ b/nvim/lua/plugins/extras/util/icon-picker.lua @@ -0,0 +1,28 @@ +local prefix = "si" + +return { + { + "ziontee113/icon-picker.nvim", + dependencies = { + "stevearc/dressing.nvim", + }, + opts = { + disable_legacy_commands = true, + }, + -- stylua: ignore + keys = { + { prefix .. "a", "IconPickerNormal", desc = "All" }, + { prefix .. "s", "IconPickerNormal symbols", desc = "Symbols" }, + { prefix .. "e", "IconPickerNormal emoji", desc = "Emoji" }, + { prefix .. "n", "IconPickerNormal nerd_font_v3", desc = "Nerd Fonts" }, + }, + }, + { + "folke/which-key.nvim", + opts = { + spec = { + { prefix, group = "icons", icon = " " }, + }, + }, + }, +} diff --git a/nvim/lua/plugins/extras/util/kitty-scrollback.lua b/nvim/lua/plugins/extras/util/kitty-scrollback.lua new file mode 100644 index 0000000..0e4c70c --- /dev/null +++ b/nvim/lua/plugins/extras/util/kitty-scrollback.lua @@ -0,0 +1,7 @@ +return { + "mikesmithgh/kitty-scrollback.nvim", + lazy = true, + cmd = { "KittyScrollbackGenerateKittens", "KittyScrollbackCheckHealth" }, + event = { "User KittyScrollbackLaunch" }, + opts = {}, +} diff --git a/nvim/lua/plugins/extras/util/leetcode.lua b/nvim/lua/plugins/extras/util/leetcode.lua new file mode 100644 index 0000000..2839579 --- /dev/null +++ b/nvim/lua/plugins/extras/util/leetcode.lua @@ -0,0 +1,14 @@ +return { + "kawre/leetcode.nvim", + build = ":TSUpdate html", + dependencies = { + "nvim-telescope/telescope.nvim", + "nvim-lua/plenary.nvim", -- required by telescope + "MunifTanjim/nui.nvim", + + -- optional + "nvim-treesitter/nvim-treesitter", + "nvim-tree/nvim-web-devicons", + }, + opts = {}, +} diff --git a/nvim/lua/plugins/extras/util/live-command.lua b/nvim/lua/plugins/extras/util/live-command.lua new file mode 100644 index 0000000..3e01980 --- /dev/null +++ b/nvim/lua/plugins/extras/util/live-command.lua @@ -0,0 +1,5 @@ +return { + "smjonas/live-command.nvim", + event = "VeryLazy", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/util/live-share.lua b/nvim/lua/plugins/extras/util/live-share.lua new file mode 100644 index 0000000..bf4cd77 --- /dev/null +++ b/nvim/lua/plugins/extras/util/live-share.lua @@ -0,0 +1,8 @@ +return { + "azratul/live-share.nvim", + cmd = { "LiveShareServer", "LiveShareJoin" }, + dependencies = { + "jbyuki/instant.nvim", + }, + opts = {}, +} diff --git a/nvim/lua/plugins/extras/util/mason-lock.lua b/nvim/lua/plugins/extras/util/mason-lock.lua new file mode 100644 index 0000000..f46a416 --- /dev/null +++ b/nvim/lua/plugins/extras/util/mason-lock.lua @@ -0,0 +1,8 @@ +return { + "williamboman/mason.nvim", + dependencies = { + "zapling/mason-lock.nvim", + cmd = { "MasonLock", "MasonLockRestore" }, + opts = {}, + }, +} diff --git a/nvim/lua/plugins/extras/util/mise.lua b/nvim/lua/plugins/extras/util/mise.lua new file mode 100644 index 0000000..523d3a9 --- /dev/null +++ b/nvim/lua/plugins/extras/util/mise.lua @@ -0,0 +1,5 @@ +return { + "ejrichards/mise.nvim", + event = "VeryLazy", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/util/neovide.lua b/nvim/lua/plugins/extras/util/neovide.lua new file mode 100644 index 0000000..a8cc77b --- /dev/null +++ b/nvim/lua/plugins/extras/util/neovide.lua @@ -0,0 +1,45 @@ +if not vim.g.neovide then + return {} +end + +RefreshGuiFont = function() + vim.opt.guifont = string.format("%s:h%s", vim.g.gui_font_face, vim.g.gui_font_size) +end + +ResizeGuiFont = function(delta) + vim.g.gui_font_size = vim.g.gui_font_size + delta + RefreshGuiFont() +end + +-- Keymaps +local opts = { noremap = true, silent = true } + +vim.keymap.set({ "n", "i" }, "", function() + ResizeGuiFont(1) +end, opts) +vim.keymap.set({ "n", "i" }, "", function() + ResizeGuiFont(-1) +end, opts) + +-- Options +vim.g.neovide_padding_top = 5 +vim.g.neovide_padding_right = 5 +vim.g.neovide_padding_left = 5 + +vim.g.neovide_window_blurred = true +vim.g.neovide_floating_blur_amount_x = 5.0 +vim.g.neovide_floating_blur_amount_y = 5.0 +vim.g.neovide_floating_shadow = true +vim.g.neovide_floating_z_height = 10 + +vim.g.neovide_cursor_antialiasing = false + +vim.g.neovide_cursor_vfx_mode = "pixiedust" +vim.g.neovide_hide_mouse_when_typing = true + +vim.o.guifont = "JetBrainsMono Nerd Font:h10" + +vim.opt.winblend = 20 +vim.g.neovide_refresh_rate = 75 + +return {} diff --git a/nvim/lua/plugins/extras/util/no-neck-pain.lua b/nvim/lua/plugins/extras/util/no-neck-pain.lua new file mode 100644 index 0000000..b469714 --- /dev/null +++ b/nvim/lua/plugins/extras/util/no-neck-pain.lua @@ -0,0 +1,8 @@ +return { + "shortcuts/no-neck-pain.nvim", + opts = {}, + -- stylua: ignore + keys = { + { "uN", "NoNeckPain", desc = "No Neck Pain" }, + }, +} diff --git a/nvim/lua/plugins/extras/util/persisted.lua b/nvim/lua/plugins/extras/util/persisted.lua new file mode 100644 index 0000000..32ff5c4 --- /dev/null +++ b/nvim/lua/plugins/extras/util/persisted.lua @@ -0,0 +1,119 @@ +return { + { + "folke/persistence.nvim", + enabled = false, + }, + { + "olimorris/persisted.nvim", + init = function() + vim.api.nvim_create_autocmd({ "User" }, { + pattern = "PersistedTelescopeLoadPre", + callback = function(session) + -- Save the currently loaded session using a global variable + require("persisted").save({ session = vim.g.persisted_loaded_session }) + + -- Delete all of the open buffers + vim.api.nvim_input(":%bd!") + end, + }) + end, + lazy = false, + config = function() + LazyVim.on_load("telescope.nvim", function() + require("telescope").setup({ + extensions = { + persisted = { + layout_config = { + height = 0.6, + width = 0.6, + }, + }, + }, + }) + require("telescope").load_extension("persisted") + end) + require("persisted").setup({ + use_git_branch = true, + should_save = function() + if vim.bo.filetype == "dashboard" then + return false + end + return true + end, + }) + end, + keys = { + { + "ql", + function() + require("persisted").load() + end, + desc = "Load Session", + }, + { + "qL", + function() + require("persisted").load({ last = true }) + end, + desc = "Load Last Session", + }, + { + "qt", + function() + require("persisted").stop() + end, + desc = "Stop Current Session", + }, + { + "qv", + function() + require("persisted").save() + end, + desc = "Save Current Session", + }, + { + "qr", + function() + require("persisted").start() + end, + desc = "Start Recording Current Session", + }, + { + "qs", + function() + require("persisted").select() + end, + desc = "Select Sessions", + }, + { + "qS", + "Telescope persisted", + desc = "Select Session (Telescope)", + }, + }, + }, + { + "nvimdev/dashboard-nvim", + opts = function(_, opts) + -- Remove the older session plugin entry + for i, section in ipairs(opts.config.center) do + if section.key == "s" then + table.remove(opts.config.center, i) + break + end + end + + local session = { + action = 'lua require("persisted").load()', + desc = " Restore Session", + icon = " ", + key = "s", + } + + session.desc = session.desc .. string.rep(" ", 43 - #session.desc) + session.key_format = " %s" + + table.insert(opts.config.center, 9, session) + end, + }, +} diff --git a/nvim/lua/plugins/extras/util/persistence-extended.lua b/nvim/lua/plugins/extras/util/persistence-extended.lua new file mode 100644 index 0000000..17ede8d --- /dev/null +++ b/nvim/lua/plugins/extras/util/persistence-extended.lua @@ -0,0 +1,38 @@ +return { + "folke/persistence.nvim", + optional = true, + keys = { + -- stylua: ignore start + { "ql", function() require("persistence").load() end, desc = "Load Session" }, + { "qs", function() require("persistence").select() end,desc = "Select Session" }, + { "qL", function() require("persistence").load({ last = true }) end, desc = "Restore Last Session" }, + { "qd", function() require("persistence").stop() end, desc = "Don't Save Current Session" }, + { + "qS", + function() + local p = require("persistence") + p.save() + LazyVim.notify("Session Saved", { title = "Persistence" }) + end, + desc = "Save Session", + }, + { + "qt", + function() + local isActive = true + local p = require("persistence") + if isActive then + p.stop() + isActive = false + vim.notify("Stopped Session Recording", vim.log.levels.INFO, { title = "Persistence" }) + else + p.start() + isActive = true + vim.notify("Started Session Recording", vim.log.levels.INFO, { title = "Persistence" }) + end + end, + desc = "Toggle Recording" + }, + -- stylua: ignore end + }, +} diff --git a/nvim/lua/plugins/extras/util/pomo.lua b/nvim/lua/plugins/extras/util/pomo.lua new file mode 100644 index 0000000..1cb2a1c --- /dev/null +++ b/nvim/lua/plugins/extras/util/pomo.lua @@ -0,0 +1,36 @@ +return { + { + "epwalsh/pomo.nvim", + cmd = { "TimerStart", "TimerStop", "TimerRepeat" }, + opts = { + notifiers = { + { + name = "Default", + opts = { + sticky = false, + }, + }, + }, + }, + }, + { + "nvim-lualine/lualine.nvim", + optional = true, + opts = function(_, opts) + local function pomoTimer() + local ok, pomo = pcall(require, "pomo") + if not ok then + return "" + end + + local timer = pomo.get_first_to_finish() + if timer == nil then + return "" + end + + return "󰄉 " .. tostring(timer) + end + table.insert(opts.sections.lualine_x, { pomoTimer }) + end, + }, +} diff --git a/nvim/lua/plugins/extras/util/rest-extended.lua b/nvim/lua/plugins/extras/util/rest-extended.lua new file mode 100644 index 0000000..04aa3be --- /dev/null +++ b/nvim/lua/plugins/extras/util/rest-extended.lua @@ -0,0 +1,32 @@ +return { + { import = "lazyvim.plugins.extras.util.rest" }, + { + "mistweaverco/kulala.nvim", + opts = { + icons = { + inlay = { + loading = "󰔟", + done = " ", + error = " ", + }, + lualine = " ", + }, + }, + }, + { + "neovim/nvim-lspconfig", + opts = { + servers = { + kulala_ls = {}, + }, + }, + }, + { + "stevearc/conform.nvim", + opts = function(_, opts) + opts.formatters_by_ft.http = opts.formatters_by_ft.http or {} + table.insert(opts.formatters_by_ft.python, "kulala") + return opts + end, + }, +} diff --git a/nvim/lua/plugins/extras/util/scrollEOF.lua b/nvim/lua/plugins/extras/util/scrollEOF.lua new file mode 100644 index 0000000..09b5e2a --- /dev/null +++ b/nvim/lua/plugins/extras/util/scrollEOF.lua @@ -0,0 +1,5 @@ +return { + "Aasim-A/scrollEOF.nvim", + event = "CursorMoved", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/util/smart-splits.lua b/nvim/lua/plugins/extras/util/smart-splits.lua new file mode 100644 index 0000000..1c694ab --- /dev/null +++ b/nvim/lua/plugins/extras/util/smart-splits.lua @@ -0,0 +1,20 @@ +return { + "mrjones2014/smart-splits.nvim", + build = "./kitty/install-kittens.bash", + event = "VeryLazy", + -- stylua: ignore + keys = { + { "", function() require("smart-splits").resize_left() end, desc = "Resize Left" }, + { "", function() require("smart-splits").resize_down() end, desc = "Resize Down" }, + { "", function() require("smart-splits").resize_up() end, desc = "Resize Up" }, + { "", function() require("smart-splits").resize_right() end, desc = "Resize Right" }, + { "", function() require("smart-splits").move_cursor_left() end, desc = "Move Cursor Left" }, + { "", function() require("smart-splits").move_cursor_down() end, desc = "Move Cursor Down" }, + { "", function() require("smart-splits").move_cursor_up() end, desc = "Move Cursor Up" }, + { "", function() require("smart-splits").move_cursor_right() end, desc = "Move Cursor Right" }, + { "", function() require("smart-splits").swap_buf_left() end, desc = "Swap Buffer Left" }, + { "", function() require("smart-splits").swap_buf_down() end, desc = "Swap Buffer Down" }, + { "", function() require("smart-splits").swap_buf_up() end, desc = "Swap Buffer Up" }, + { "", function() require("smart-splits").swap_buf_right() end, desc = "Swap Buffer Right" }, + }, +} diff --git a/nvim/lua/plugins/extras/util/snacks-extended.lua b/nvim/lua/plugins/extras/util/snacks-extended.lua new file mode 100644 index 0000000..bdfe7bb --- /dev/null +++ b/nvim/lua/plugins/extras/util/snacks-extended.lua @@ -0,0 +1,68 @@ +return { + "folke/snacks.nvim", + opts = { + dashboard = { + preset = { + header = [[ +  + ████ ██████ █████ ██ + ███████████ █████  + █████████ ███████████████████ ███ ███████████ + █████████ ███ █████████████ █████ ██████████████ + █████████ ██████████ █████████ █████ █████ ████ █████ + ███████████ ███ ███ █████████ █████ █████ ████ █████ +██████ █████████████████████ ████ █████ █████ ████ ██████ + ]], + }, + }, + lazygit = { + configure = false, + }, + notifier = { + style = "fancy", + }, + terminal = { + win = { + position = "float", + }, + }, + picker = { + previewers = { + git = { + builtin = false, + }, + }, + matcher = { + frecency = true, + }, + win = { + input = { + keys = { + [""] = { "preview_scroll_up", mode = { "i", "n" } }, + [""] = { "list_scroll_down", mode = { "i", "n" } }, + [""] = { "preview_scroll_down", mode = { "i", "n" } }, + [""] = { "list_scroll_up", mode = { "i", "n" } }, + }, + }, + }, + }, + image = { + enabled = true, + doc = { + inline = false, + }, + }, + scroll = { + animate = { + duration = { step = 10, total = 150 }, + }, + }, + }, + -- stylua: ignore + keys = { + { "fz", function() Snacks.picker.zoxide() end, desc = "Zoxide" }, + { "S", function() Snacks.picker.spelling() end, desc = "Spelling" }, + { "gB", function() Snacks.picker.git_branches() end, desc = "Git Branches" }, + { "go", function() Snacks.gitbrowse() end, desc = "Git Open Line" }, + }, +} diff --git a/nvim/lua/plugins/extras/util/speedtyper.lua b/nvim/lua/plugins/extras/util/speedtyper.lua new file mode 100644 index 0000000..0906d98 --- /dev/null +++ b/nvim/lua/plugins/extras/util/speedtyper.lua @@ -0,0 +1,5 @@ +return { + "NStefan002/speedtyper.nvim", + cmd = "Speedtyper", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/util/tmux.lua b/nvim/lua/plugins/extras/util/tmux.lua new file mode 100644 index 0000000..7055b4b --- /dev/null +++ b/nvim/lua/plugins/extras/util/tmux.lua @@ -0,0 +1,5 @@ +return { + "aserowy/tmux.nvim", + event = "VeryLazy", + opts = {}, +} diff --git a/nvim/lua/plugins/extras/util/vim-be-good.lua b/nvim/lua/plugins/extras/util/vim-be-good.lua new file mode 100644 index 0000000..4151549 --- /dev/null +++ b/nvim/lua/plugins/extras/util/vim-be-good.lua @@ -0,0 +1,4 @@ +return { + "ThePrimeagen/vim-be-good", + cmd = "VimBeGood", +} diff --git a/nvim/lua/plugins/extras/util/vscode.lua b/nvim/lua/plugins/extras/util/vscode.lua new file mode 100644 index 0000000..8642ec5 --- /dev/null +++ b/nvim/lua/plugins/extras/util/vscode.lua @@ -0,0 +1,144 @@ +if not vim.g.vscode then + return {} +end + +local vscode = require("vscode-neovim") +local map = vim.keymap.set + +-- Options +vim.o.spell = false +vim.opt.timeoutlen = 150 -- To show whichkey without delay +vim.notify = vscode.notify +vim.g.clipboard = vim.g.vscode_clipboard + +local function vscode_action(cmd, opts) + return function() + vscode.action(cmd, opts) + end +end + +-- Add some vscode specific keymaps +vim.api.nvim_create_autocmd("User", { + pattern = "LazyVimKeymaps", + callback = function() + -- view problems + map("n", "xx", vscode_action("workbench.actions.view.problems")) + -- open file explorer + map("n", "e", vscode_action("workbench.view.explorer")) + -- terminal + map("n", [[]], vscode_action("workbench.action.terminal.toggleTerminal")) + map("n", "fts", vscode_action("workbench.action.terminal.newWithCwd")) + -- working with editors (buffers) + map("n", "bo", vscode_action("workbench.action.closeOtherEditors")) + map("n", "bb", function() + vscode_action("workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup") + vscode_action("list.select") + end) + map("n", "bn", vscode_action("workbench.action.nextEditor")) + map("n", "bu", vscode_action("workbench.action.reopenClosedEditor")) + map("n", "bh", vscode_action("workbench.action.moveEditorToLeftGroup")) + map("n", "bj", vscode_action("workbench.action.moveEditorToBelowGroup")) + map("n", "bk", vscode_action("workbench.action.moveEditorToAboveGroup")) + map("n", "bl", vscode_action("workbench.action.moveEditorToRightGroup")) + map("n", ",", vscode_action("workbench.action.showAllEditors")) + map("n", "bA", vscode_action("workbench.action.closeAllEditors")) + map("n", "ba", vscode_action("workbench.action.lastEditorInGroup")) + map("n", "bf", vscode_action("workbench.action.firstEditorInGroup")) + map("n", "bL", vscode_action("workbench.action.closeEditorsToTheLeft")) + map("n", "bR", vscode_action("workbench.action.closeEditorsToTheRight")) + map("n", "H", vscode_action("workbench.action.previousEditorInGroup")) + map("n", "L", vscode_action("workbench.action.nextEditorInGroup")) + map("n", "bd", vscode_action("workbench.action.closeActiveEditor")) + map("n", "", vscode_action("workbench.action.showMultipleEditorTabs")) + map("n", "", vscode_action("workbench.action.showEditorTab")) + -- breakpoints + map("n", "", vscode_action("editor.debug.action.toggleBreakpoint")) + -- windows + map("n", "|", vscode_action("workbench.action.splitEditorRight")) + map("n", "-", vscode_action("workbench.action.splitEditorDown")) + -- LSP actions + map("n", "ca", vscode_action("editor.action.codeAction")) + map("n", "gy", vscode_action("editor.action.goToTypeDefinition")) + map("n", "gr", vscode_action("editor.action.goToReferences")) + map("n", "gi", vscode_action("editor.action.goToImplementation")) + map("n", "K", vscode_action("editor.action.showHover")) + map("n", "cr", vscode_action("editor.action.rename")) + map("n", "co", vscode_action("editor.action.organizeImports")) + map("n", "cf", vscode_action("editor.action.formatDocument")) + map("n", "ss", vscode_action("workbench.action.gotoSymbol")) + map("n", "sS", vscode_action("workbench.action.showAllSymbols")) + -- refactor + map("n", "cR", vscode_action("editor.action.refactor")) + -- markdown preview + map("n", "cp", vscode_action("markdown.showPreviewToSide")) + -- project manager + map("n", "fp", vscode_action("projectManager.listProjects")) + -- zen mode + map("n", "z", vscode_action("workbench.action.toggleZenMode")) + -- cspell + map("n", "!", vscode_action("cSpell.addWordToDictionary")) + map("n", "us", vscode_action("cSpell.toggleEnableSpellChecker")) + -- comments + map("n", "xt", vscode_action("workspaceAnchors.focus")) + -- git + map("n", "gg", vscode_action("gitlens.views.home.focus")) + map("n", "ub", vscode_action("gitlens.toggleFileBlame")) + map("n", "]h", function() + vscode_action("workbench.action.editor.nextChange") + vscode_action("workbench.action.compareEditor.nextChange") + end) + map("n", "[h", function() + vscode_action("workbench.action.editor.previousChange") + vscode_action("workbench.action.compareEditor.previousChange") + end) + -- statusline + map("n", "uS", vscode_action("workbench.action.toggleStatusbarVisibility")) + -- codeium + map("n", "cI", vscode_action("codeium.toggleEnable")) + map({ "n", "v" }, "id", vscode_action("codeium.generateFunctionDocstring")) + map("n", "ic", vscode_action("codeium.openChatView")) + map("n", "is", vscode_action("codeium.openSearchView")) + map({ "n", "v" }, "ie", vscode_action("codeium.explainCodeBlock")) + map({ "n", "v" }, "iE", vscode_action("codeium.explainProblem")) + map({ "n", "v" }, "ii", vscode_action("codeium.openCodeiumCommand")) + -- diagnostics + map("n", "]d", vscode_action("editor.action.marker.next")) + map("n", "[d", vscode_action("editor.action.marker.prev")) + -- zoxide + map("n", "fz", vscode_action("autojump.openFolder")) + -- whichkey + map("n", "", vscode_action("whichkey.show")) + -- search + map("n", "", "Find") + map("n", "ff", "Find") + map("n", "/", vscode_action("workbench.action.findInFiles")) + map("n", "sg", vscode_action("workbench.action.findInFiles")) + map("n", "sc", vscode_action("workbench.action.showCommands")) + -- ui + map("n", "uC", vscode_action("workbench.action.selectTheme")) + end, +}) + +return { + { import = "lazyvim.plugins.extras.vscode" }, + { + "LazyVim/LazyVim", + config = function(_, opts) + opts = opts or {} + -- disable the colorscheme + opts.colorscheme = function() end + require("lazyvim").setup(opts) + end, + }, + { + "folke/flash.nvim", + init = function() + local palette = require("catppuccin.palettes").get_palette("macchiato") + local bg = palette.none + vim.api.nvim_set_hl(0, "FlashBackdrop", { fg = bg }) + vim.api.nvim_set_hl(0, "FlashLabel", { fg = palette.green, bg = bg, bold = true }) + vim.api.nvim_set_hl(0, "FlashMatch", { fg = palette.lavender, bg = bg }) + vim.api.nvim_set_hl(0, "FlashCurrent", { fg = palette.peach, bg = bg }) + end, + }, +} diff --git a/nvim/lua/plugins/extras/util/wakatime.lua b/nvim/lua/plugins/extras/util/wakatime.lua new file mode 100644 index 0000000..1fedee0 --- /dev/null +++ b/nvim/lua/plugins/extras/util/wakatime.lua @@ -0,0 +1,7 @@ +return { + "wakatime/vim-wakatime", + event = "VeryLazy", + setup = function() + vim.cmd([[packadd wakatime/vim-wakatime]]) + end, +} diff --git a/nvim/lua/plugins/extras/util/yadm.lua b/nvim/lua/plugins/extras/util/yadm.lua new file mode 100644 index 0000000..dde0453 --- /dev/null +++ b/nvim/lua/plugins/extras/util/yadm.lua @@ -0,0 +1,19 @@ +return { + { + "lewis6991/gitsigns.nvim", + dependencies = { + "purarue/gitsigns-yadm.nvim", + }, + opts = { + _on_attach_pre = function(bufnr, callback) + if vim.fn.executable("yadm") == 1 then + require("gitsigns-yadm").yadm_signs(callback, { bufnr = bufnr }) + else + -- if optionally disabling the plugin, make sure to call + -- 'callback' with no arguments + callback() + end + end, + }, + }, +} diff --git a/nvim/lua/plugins/extras/util/yazi.lua b/nvim/lua/plugins/extras/util/yazi.lua new file mode 100644 index 0000000..a7b73f4 --- /dev/null +++ b/nvim/lua/plugins/extras/util/yazi.lua @@ -0,0 +1,19 @@ +return { + { + "mikavilpas/yazi.nvim", + keys = { + { "e", "Yazi", desc = "Yazi (Current File)" }, + { "E", "Yazi cwd", desc = "Yazi (cwd)" }, + { "", "Yazi toggle", desc = "Resume Last Yazi Session" }, + }, + opts = { + open_for_directories = true, + floating_window_scaling_factor = 0.8, + yazi_floating_window_border = "none", + }, + }, + { + "nvim-neo-tree/neo-tree.nvim", + enabled = false, + }, +} diff --git a/nvim/lua/plugins/lazyvim/extras.lua b/nvim/lua/plugins/lazyvim/extras.lua new file mode 100644 index 0000000..9b14907 --- /dev/null +++ b/nvim/lua/plugins/lazyvim/extras.lua @@ -0,0 +1,87 @@ +-- Here are the plugins from the extras that are included in LazyVim and I didnt change + +return { + -- Coding + { "tzachar/cmp-tabnine", optional = true }, + { "Exafunction/codeium.nvim", optional = true }, + { "echasnovski/mini.surround", optional = true }, + { "JoosepAlviste/nvim-ts-context-commentstring", optional = true }, + + -- DAP + { "jbyuki/one-small-step-for-vimkind", optional = true }, + + -- Editor + { "RRethy/vim-illuminate", optional = true }, + { "stevearc/aerial.nvim", optional = true }, + { "ggandor/flit.nvim", optional = true }, + { "ggandor/leap.nvim", optional = true }, + { "tpope/vim-repeat", optional = true }, + { "echasnovski/mini.files", optional = true }, + { "SmiteshP/nvim-navic", optional = true }, + + -- Lang + -- Clangd + { "p00f/clangd_extensions.nvim", optional = true }, + + -- CMake + { "Civitasv/cmake-tools.nvim", optional = true }, + + -- Elixir + { "jfpedroza/neotest-elixir", optional = true }, + + -- Go + { "leoluz/nvim-dap-go", optional = true }, + { "nvim-neotest/neotest-go", optional = true }, + + -- Java + { "mfussenegger/nvim-jdtls", optional = true }, + + -- JSON + { "b0o/SchemaStore.nvim", optional = true }, + + -- Markdown + { "iamcco/markdown-preview.nvim", optional = true }, + { "lukas-reineke/headlines.nvim", optional = true }, + + -- C# + { "Hoffs/omnisharp-extended-lsp.nvim", optional = true }, + + -- Python + { "wookayin/semshi", optional = true }, + { "nvim-neotest/neotest-python", optional = true }, + { "mfussenegger/nvim-dap-python", optional = true }, + { "linux-cultist/venv-selector.nvim", optional = true }, + + -- Ruby + { "suketa/nvim-dap-ruby", optional = true }, + { "olimorris/neotest-rspec", optional = true }, + + -- Rust + { "Saecki/crates.nvim", optional = true }, + { "mrcjkb/rustaceanvim", optional = true }, + + -- Tailwind + { "roobert/tailwindcss-colorizer-cmp.nvim", optional = true }, + + -- Tex + { "lervag/vimtex", optional = true }, + + -- YAML + { "b0o/SchemaStore.nvim", optional = true }, + + -- LSP + { "nvimtools/none-ls.nvim", optional = true }, + { "folke/neoconf.nvim", optional = true }, + { "folke/neodev.nvim", optional = true }, + + -- UI + { "echasnovski/mini.animate", optional = true }, + { "echasnovski/mini.indentscope", optional = true }, + { "echasnovski/mini.starter", optional = true }, + { "nvim-treesitter/nvim-treesitter-context", optional = true }, + + -- Util + { "echasnovski/mini.hipatterns", optional = true }, + { "dstein64/vim-startuptime", optional = true }, + { "ahmedkhalf/project.nvim", optional = true }, +} diff --git a/nvim/lua/plugins/lazyvim/included.lua b/nvim/lua/plugins/lazyvim/included.lua new file mode 100644 index 0000000..e5b5e8c --- /dev/null +++ b/nvim/lua/plugins/lazyvim/included.lua @@ -0,0 +1,35 @@ +-- Here are the plugins that are included in LazyVim and I didnt change + +return { + -- Coding + { "garymjr/nvim-snippets" }, + { "folke/ts-comments.nvim" }, + { "echasnovski/mini.comment" }, + { "echasnovski/mini.ai" }, + { "folke/lazydev.nvim" }, + + -- Editor + { "folke/trouble.nvim" }, + { "folke/todo-comments.nvim" }, + + -- LSP + { "folke/neodev.nvim" }, + { "williamboman/mason-lspconfig.nvim" }, + + -- TreeSitter + { "nvim-treesitter/nvim-treesitter" }, + { "nvim-treesitter/nvim-treesitter-textobjects" }, + { "windwp/nvim-ts-autotag" }, + + -- UI + { "lukas-reineke/indent-blankline.nvim" }, + { "stevearc/dressing.nvim" }, + { "folke/noice.nvim" }, + { "echasnovski/mini.icons" }, + { "MunifTanjim/nui.nvim" }, + + -- Util + { "folke/persistence.nvim" }, + { "folke/snacks.nvim" }, + { "nvim-lua/plenary.nvim" }, +} diff --git a/nvim/rules/.eslintrc.json b/nvim/rules/.eslintrc.json new file mode 100644 index 0000000..e5ee6c0 --- /dev/null +++ b/nvim/rules/.eslintrc.json @@ -0,0 +1,16 @@ +{ + "env": { + "es2021": true, + "node": true, + "browser": false + }, + "extends": ["eslint:recommended", "plugin:prettier/recommended"], + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "ignorePatterns": ["test/", "dist/"], + "rules": { + "prettier/prettier": "error" + } +} diff --git a/nvim/rules/.markdownlint-cli2.yaml b/nvim/rules/.markdownlint-cli2.yaml new file mode 100644 index 0000000..be5669a --- /dev/null +++ b/nvim/rules/.markdownlint-cli2.yaml @@ -0,0 +1,5 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/DavidAnson/markdownlint-cli2/main/schema/markdownlint-cli2-config-schema.json +config: + MD013: false + MD033: false + MD045: false diff --git a/nvim/rules/.markdownlint.jsonc b/nvim/rules/.markdownlint.jsonc new file mode 100644 index 0000000..548f000 --- /dev/null +++ b/nvim/rules/.markdownlint.jsonc @@ -0,0 +1,23 @@ +{ + "$schema": "https://raw.githubusercontent.com/DavidAnson/markdownlint/main/schema/markdownlint-config-schema.json", + "blanks-around-headings": { + "lines_below": 0, + }, + "ul-style": { + "style": "sublist", + }, + "ol-prefix": { + "style": "ordered", + }, + "line-length": { + "tables": false, + "code_blocks": false, + }, + "no-inline-html": { + "allowed_elements": ["div", "img", "details", "summary", "kbd", "a", "br"], + }, + "ul-indent": false, + "no-hard-tabs": false, + "blanks-around-lists": false, + "first-line-heading": false, +} diff --git a/nvim/rules/.prettierrc.json b/nvim/rules/.prettierrc.json new file mode 100644 index 0000000..ae1478c --- /dev/null +++ b/nvim/rules/.prettierrc.json @@ -0,0 +1,8 @@ +{ + "trailingComma": "es5", + "tabWidth": 2, + "useTabs": false, + "printWidth": 120, + "semi": false, + "singleQuote": false +} diff --git a/nvim/rules/.pylintrc b/nvim/rules/.pylintrc new file mode 100644 index 0000000..14e4a97 --- /dev/null +++ b/nvim/rules/.pylintrc @@ -0,0 +1,8 @@ +[FORMAT] +max-line-length = 120 + +[BASIC] +indent-string = " " + +[REPORTS] +output-format=colorized diff --git a/nvim/rules/.stylelintrc.json b/nvim/rules/.stylelintrc.json new file mode 100644 index 0000000..c735b45 --- /dev/null +++ b/nvim/rules/.stylelintrc.json @@ -0,0 +1,10 @@ +{ + "extends": "stylelint-config-standard", + "rules": { + "indentation": 2, + "selector-pseudo-element-colon-notation": "double", + "declaration-block-trailing-semicolon": "always", + "no-empty-source": null, + "color-hex-case": "lower" + } +} diff --git a/nvim/rules/biome.json b/nvim/rules/biome.json new file mode 100644 index 0000000..0789721 --- /dev/null +++ b/nvim/rules/biome.json @@ -0,0 +1,38 @@ +{ + // Use the schema of the version installed from mason + "$schema": "~/.local/share/nvim/mason/packages/biome/node_modules/@biomejs/biome/configuration_schema.json", + "organizeImports": { + "enabled": true + }, + "formatter": { + "enabled": true, + "lineWidth": 120, + "indentStyle": "space", + "indentWidth": 2, + "formatWithErrors": true + }, + "javascript": { + "globals": [ + "ObjC", // JXA variable + "Application", + "delay", + "Path", + "$", + "dv" // dataview + ] + }, + "linter": { + "enabled": true, + "rules": { + "all": true + } + }, + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "json": { + "parser": { "allowComments": true } // for `tsconfig.json` + } +} diff --git a/nvim/rules/cspell.json b/nvim/rules/cspell.json new file mode 100644 index 0000000..44e3144 --- /dev/null +++ b/nvim/rules/cspell.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json", + "version": "0.2", + "language": "en", + "globRoot": ".", + "dictionaryDefinitions": [ + { + "name": "cspell-dictionary", + "path": "./cspell-dictionary.txt", + "addWords": true + } + ], + "dictionaries": ["cspell-dictionary"], + "ignorePaths": ["node_modules", "dist", "build", "/cspell-dictionary.txt"] +} diff --git a/nvim/rules/rustfmt.toml b/nvim/rules/rustfmt.toml new file mode 100644 index 0000000..ce8a7a2 --- /dev/null +++ b/nvim/rules/rustfmt.toml @@ -0,0 +1,8 @@ +imports_granularity = "Crate" +group_imports = "One" +imports_layout = "Horizontal" + +max_width = 120 + +struct_lit_style = "Block" +enum_style = "Block" diff --git a/nvim/rules/stylua.toml b/nvim/rules/stylua.toml new file mode 100644 index 0000000..91e0fef --- /dev/null +++ b/nvim/rules/stylua.toml @@ -0,0 +1,6 @@ +indent_type = "Spaces" +indent_width = 2 +column_width = 120 + +[sort_requires] +enabled = true diff --git a/nvim/snippets/languages/css.json b/nvim/snippets/languages/css.json new file mode 100644 index 0000000..835896f --- /dev/null +++ b/nvim/snippets/languages/css.json @@ -0,0 +1,13 @@ +{ + "ignore (prettier)": { + "body": "/* prettier-ignore */", + "prefix": "ignore (prettier)" + }, + "ignore range (stylelint)": { + "body": [ + "/* stylelint-disable ${1:no-duplicate-selectors} */", + "/* stylelint-enable ${1:no-duplicate-selectors} */" + ], + "prefix": "ignore range (stylelint)" + } +} diff --git a/nvim/snippets/languages/global.json b/nvim/snippets/languages/global.json new file mode 100644 index 0000000..96e7c98 --- /dev/null +++ b/nvim/snippets/languages/global.json @@ -0,0 +1,6 @@ +{ + "nonbreaking space": { + "body": " ", + "prefix": "nonbreaking space" + } +} diff --git a/nvim/snippets/languages/lua.json b/nvim/snippets/languages/lua.json new file mode 100644 index 0000000..f7e8a98 --- /dev/null +++ b/nvim/snippets/languages/lua.json @@ -0,0 +1,50 @@ +{ + "@class (LuaDoc)": { + "body": [ + "---@class (exact) ${1:class_name}", + "---@field ${2:field_name} string", + "---@field ${3:field_name} string" + ], + "description": "https://github.com/LuaLS/lua-language-server/wiki/Annotations#class", + "prefix": "@class (LuaDoc)" + }, + "@type (LuaDoc)": { + "body": "---@type ${1:string}", + "prefix": "@type (LuaDoc)" + }, + "export module": { + "body": [ + "local M = {}", + "--------------------------------------------------------------------------------", + "", + "$0--------------------------------------------------------------------------------", + "return M" + ], + "prefix": "export module" + }, + "find all in string": { + "body": [ + "local ${1:matches} = {}", + "for match in ${2:str}:gmatch(${3:pattern}) do", + "\ttable.insert(${1:matches}, match)", + "end" + ], + "prefix": "find all in string" + }, + "home": { + "body": "os.getenv(\"HOME\")", + "prefix": "home" + }, + "ignore (stylua)": { + "body": "-- stylua: ignore", + "prefix": "ignore (stylua)" + }, + "ignore start/end (stylua)": { + "body": ["-- stylua: ignore start", "-- stylua: ignore end"], + "prefix": "ignore start/end (stylua)" + }, + "import module": { + "body": "local ${1:name} = require(\"${2:module}.${1:name}\")", + "prefix": "import module" + } +} diff --git a/nvim/snippets/languages/markdown.json b/nvim/snippets/languages/markdown.json new file mode 100644 index 0000000..10dad64 --- /dev/null +++ b/nvim/snippets/languages/markdown.json @@ -0,0 +1,72 @@ +{ + "caution (callout)": { + "body": [ + "> [!CAUTION]", + "> $0" + ], + "description": "https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts", + "prefix": "caution (callout)" + }, + "centerdiv": { + "body": "
$0
", + "prefix": "centerdiv" + }, + "details & summary": { + "body": [ + "
", + "${1:Text}", + "$0", + "
" + ], + "description": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details", + "prefix": [ + "toggle / fold", + "details & summary" + ] + }, + "div": { + "body": "
$0
", + "description": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div", + "prefix": "div" + }, + "image": { + "body": "\"${2:alt", + "description": "HTML syntax for images used to display images with reduced size", + "prefix": "image" + }, + "important (callout)": { + "body": [ + "> [!IMPORTANT]", + "> $0" + ], + "description": "https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts", + "prefix": "important (callout)" + }, + "note (callout)": { + "body": [ + "> [!NOTE]", + "> $0" + ], + "description": "https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts", + "prefix": [ + "info (callout)", + "note (callout)" + ] + }, + "tip (callout)": { + "body": [ + "> [!TIP]", + "> $0" + ], + "description": "https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts", + "prefix": "tip (callout)" + }, + "warning (callout)": { + "body": [ + "> [!WARNING]", + "> $0" + ], + "description": "https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts", + "prefix": "warning (callout)" + } +} diff --git a/nvim/snippets/languages/python/python.json b/nvim/snippets/languages/python/python.json new file mode 100644 index 0000000..01932ee --- /dev/null +++ b/nvim/snippets/languages/python/python.json @@ -0,0 +1,19 @@ +{ + "list comprehension": { + "body": "list(${1:value} for ${2:value} in ${3:iterable})$0", + "description": "List comprehension for creating a list based on existing lists.", + "prefix": "list comprehension" + }, + "replace (regex)": { + "body": "re.sub(r\"${1:regex}\", r\"${2:replace}\", ${3:str})$0", + "prefix": "replace (regex)" + }, + "ternary": { + "body": "${1:value1} if ${2:condition} else ${3:value2}", + "prefix": "ternary" + }, + "while": { + "body": "while ${1:condition}:\n\t${2:pass}$0", + "prefix": "while" + } +} diff --git a/nvim/snippets/package.json b/nvim/snippets/package.json new file mode 100644 index 0000000..b0de615 --- /dev/null +++ b/nvim/snippets/package.json @@ -0,0 +1,48 @@ +{ + "DOCS": [ + "https://code.visualstudio.com/api/language-extensions/snippet-guide", + "https://code.visualstudio.com/docs/editor/userdefinedsnippets", + "https://github.com/L3MON4D3/LuaSnip/blob/master/DOC.md#vs-code" + ], + "contributes": { + "snippets": [ + { + "language": [ + "plaintext", + "markdown", + "tex", + "html", + "global", + "all" + ], + "path": "./languages/global.json" + }, + { + "language": "markdown", + "path": "./languages/markdown.json" + }, + { + "language": [ + "css", + "scss", + "sass", + "less", + "stylus" + ], + "path": "./languages/css.json" + }, + { + "language": "python", + "path": "./languages/python/python.json" + }, + { + "language": "lua", + "path": "./languages/lua.json" + }, + { + "language": "lua", + "path": "./projects/nvim.json" + } + ] + } +} diff --git a/nvim/snippets/projects/nvim.json b/nvim/snippets/projects/nvim.json new file mode 100644 index 0000000..061fe97 --- /dev/null +++ b/nvim/snippets/projects/nvim.json @@ -0,0 +1,38 @@ +{ + "autocmd": { + "body": [ + "vim.api.nvim_create_autocmd(\"${1:event}\", {", + "\tcallback = function()", + "\t\t$0", + "\tend,", + "})" + ], + "prefix": "autocmd" + }, + "autocmd (Filetype)": { + "body": [ + "vim.api.nvim_create_autocmd(\"FileType\", {", + "\tpattern = \"${1:ft}\",", + "\tcallback = function()", + "\t\t$0", + "\tend,", + "})" + ], + "filetype": "lua", + "prefix": "autocmd (Filetype)" + }, + "check if file exists": { + "body": "local fileExists = vim.uv.fs_stat(\"${1:filepath}\") ~= nil", + "prefix": "check if file exists" + }, + "keymap": { + "body": "map(\"n\", \"${1:lhs}\", \"${2:rhs}\", { desc = \"${3:description}\" })", + "filetype": "lua", + "prefix": "keymap" + }, + "notify": { + "body": "vim.notify(${1:message}, ${2:level}, { title = \"${3:title}\" })", + "filetype": "lua", + "prefix": "notify" + } +} diff --git a/nvim/spell/en.utf-8.add b/nvim/spell/en.utf-8.add new file mode 100644 index 0000000..82d0782 --- /dev/null +++ b/nvim/spell/en.utf-8.add @@ -0,0 +1,31 @@ +repl +EditorConfig +cmd +dir +stylua +Smoothscroll +config +nvim +atuin/! +keybinds +xz/! +keymap +Yadm +dotfiles +dont +Youtube +Github +Catppuccin +Hyprland +catppuccin +yazi +LazyVim +keymaps +neovim +VSCodium +tmux +zellij +PLugin +systemd +filetype +hyprland diff --git a/nvim/spell/en.utf-8.add.spl b/nvim/spell/en.utf-8.add.spl new file mode 100644 index 0000000..fbee06c Binary files /dev/null and b/nvim/spell/en.utf-8.add.spl differ diff --git a/nvim/spell/en.utf-8.spl b/nvim/spell/en.utf-8.spl new file mode 100644 index 0000000..e4b1e1c Binary files /dev/null and b/nvim/spell/en.utf-8.spl differ diff --git a/nvim/spell/en.utf-8.sug b/nvim/spell/en.utf-8.sug new file mode 100644 index 0000000..103ebfc Binary files /dev/null and b/nvim/spell/en.utf-8.sug differ diff --git a/nvim/spell/es.utf-8.spl b/nvim/spell/es.utf-8.spl new file mode 100644 index 0000000..505c4d3 Binary files /dev/null and b/nvim/spell/es.utf-8.spl differ diff --git a/nvim/spell/es.utf-8.sug b/nvim/spell/es.utf-8.sug new file mode 100644 index 0000000..6c65c5f Binary files /dev/null and b/nvim/spell/es.utf-8.sug differ diff --git a/nvim/stylua.toml b/nvim/stylua.toml new file mode 100644 index 0000000..0f90030 --- /dev/null +++ b/nvim/stylua.toml @@ -0,0 +1,3 @@ +indent_type = "Spaces" +indent_width = 2 +column_width = 120 diff --git a/nvim/templates/LICENSE/Apache2.0 b/nvim/templates/LICENSE/Apache2.0 new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/nvim/templates/LICENSE/Apache2.0 @@ -0,0 +1,201 @@ + 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. diff --git a/nvim/templates/LICENSE/GNUGPLv3 b/nvim/templates/LICENSE/GNUGPLv3 new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/nvim/templates/LICENSE/GNUGPLv3 @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/nvim/templates/LICENSE/MIT b/nvim/templates/LICENSE/MIT new file mode 100644 index 0000000..8aa2645 --- /dev/null +++ b/nvim/templates/LICENSE/MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) [year] [fullname] + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/nvim/templates/LICENSE/Unlicensed b/nvim/templates/LICENSE/Unlicensed new file mode 100644 index 0000000..fdddb29 --- /dev/null +++ b/nvim/templates/LICENSE/Unlicensed @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/nvim/templates/go/main.go b/nvim/templates/go/main.go new file mode 100644 index 0000000..38dd16d --- /dev/null +++ b/nvim/templates/go/main.go @@ -0,0 +1,3 @@ +package main + +func main() {} diff --git a/nvim/templates/html/index.html b/nvim/templates/html/index.html new file mode 100644 index 0000000..bf9f12e --- /dev/null +++ b/nvim/templates/html/index.html @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/nvim/templates/python/main.py b/nvim/templates/python/main.py new file mode 100644 index 0000000..ec9fb5b --- /dev/null +++ b/nvim/templates/python/main.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python3 + + +def main(): + print("Hello, World!") + + +if __name__ == "__main__": + main() diff --git a/nvim/templates/vue/component.vue b/nvim/templates/vue/component.vue new file mode 100644 index 0000000..928b8a0 --- /dev/null +++ b/nvim/templates/vue/component.vue @@ -0,0 +1,14 @@ + + + + + diff --git a/nwg-look/config b/nwg-look/config new file mode 100644 index 0000000..07de2f1 --- /dev/null +++ b/nwg-look/config @@ -0,0 +1,6 @@ +{ + "export-settings-ini": true, + "export-gtkrc-20": false, + "export-index-theme": true, + "export-xsettingsd": true +} \ No newline at end of file diff --git a/pacman/.github/README.md b/pacman/.github/README.md new file mode 100644 index 0000000..affa9d5 --- /dev/null +++ b/pacman/.github/README.md @@ -0,0 +1,3 @@ +
+ +
diff --git a/pacman/.github/title.png b/pacman/.github/title.png new file mode 100644 index 0000000..94f155a Binary files /dev/null and b/pacman/.github/title.png differ diff --git a/pacman/arch-packages.txt b/pacman/arch-packages.txt new file mode 100644 index 0000000..12efcca --- /dev/null +++ b/pacman/arch-packages.txt @@ -0,0 +1,141 @@ +alsa-plugins +amd-ucode +android-file-transfer +atuin +baobab +base +base-devel +bat +bob +btop +calf +cliphist +cmake +cpio +dnsmasq +docker +docker-compose +dolphin-emu +dua-cli +easyeffects +efibootmgr +eza +fastfetch +fd +fish +fisher +fzf +gamemode +git-delta +gnome-disk-utility +gnome-keyring +greetd +greetd-tuigreet +grim +grub +gst-plugin-pipewire +hyprcursor +hypridle +hyprland +hyprlang +hyprlock +hyprpicker +hyprutils +hyprwayland-scanner +jq +kitty +krita +kvantum +kvantum-qt5 +lazygit +lib32-libva-mesa-driver +lib32-mesa +lib32-mesa-vdpau +lib32-vulkan-radeon +libguestfs +libpulse +libreoffice-fresh +libva-mesa-driver +linux +linux-firmware +linux-lts +linux-lts-headers +linux-zen +linux-zen-headers +logrotate +lsp-plugins +mangohud +mesa-vdpau +meson +mpv +nemo +nemo-fileroller +nemo-image-converter +networkmanager +nm-connection-editor +noto-fonts-cjk +nvtop +nwg-look +obs-studio +obsidian +onefetch +openbsd-netcat +opencl-rusticl-mesa +pavucontrol +pipewire +pipewire-alsa +pipewire-jack +pipewire-pulse +polkit-gnome +protonmail-bridge-core +qbittorrent +qemu-desktop +qemu-full +qt5ct +ripgrep +ripgrep-all +rocm-opencl-sdk +rocm-smi-lib +rofi-wayland +rustup +satty +scrcpy +sd +slurp +starship +steam +swaync +swww +syncthing +systemd-resolvconf +thunderbird +tmux +tmuxp +ttf-font-awesome +ttf-jetbrains-mono-nerd +ttf-nerd-fonts-symbols-mono +udiskie +ufw +vde2 +vim +virt-manager +virt-viewer +vivid +vulkan-headers +vulkan-radeon +vulkan-tools +waybar +wev +wine +wireguard-tools +wireplumber +wl-clipboard +xdg-desktop-portal-hyprland +xdg-user-dirs +xdg-utils +yadm +yazi +zathura +zathura-pdf-mupdf +zoxide +zram-generator diff --git a/pacman/aur-packages.txt b/pacman/aur-packages.txt new file mode 100644 index 0000000..fd670cc --- /dev/null +++ b/pacman/aur-packages.txt @@ -0,0 +1,42 @@ +atlauncher-bin +auto-cpufreq +bottles +brave-bin +catppuccin-cursors-macchiato +catppuccin-gtk-theme-macchiato +cava +cemu-bin +check-broken-packages-pacman-hook-git +devify +downgrade +gallery-dl +heroic-games-launcher-bin +keyb-bin +lazydocker +ludusavi +mise-bin +paccache-hook +pacseek +proton-ge-custom-bin +pyprland +qimgv-light +reflector-pacman-hook-git +ryujinx-bin +spicetify-cli +spotify +swayosd-git +sync-pacman-hook-git +sysz +tidal-hifi-bin +topgrade-bin +trashy +ttf-ms-win11-auto +universal-android-debloater-bin +upscayl-bin +vesktop +vscodium-bin +vscodium-bin-marketplace +waybar-updates +wttrbar +yay +zen-browser-avx2-bin diff --git a/pacman/hooks/40-orphans.hook b/pacman/hooks/40-orphans.hook new file mode 100644 index 0000000..e408efe --- /dev/null +++ b/pacman/hooks/40-orphans.hook @@ -0,0 +1,11 @@ +[Trigger] +Operation = Install +Operation = Upgrade +Operation = Remove +Type = Package +Target = * + +[Action] +Description = Orphaned package notification +When = PostTransaction +Exec = /usr/bin/bash -c "/usr/bin/pacman -Qtd || /usr/bin/echo '=> No orphans found.'" diff --git a/pacman/hooks/50-pacman-list.hook b/pacman/hooks/50-pacman-list.hook new file mode 100644 index 0000000..9dacef5 --- /dev/null +++ b/pacman/hooks/50-pacman-list.hook @@ -0,0 +1,11 @@ +[Trigger] +Type = Package +Operation = Install +Operation = Upgrade +Operation = Remove +Target = * + +[Action] +Description = Create a backup list of all installed packages +When = PostTransaction +Exec = /bin/sh -c "pacman -Qme | awk '{ print $1 }' > /home/matt/.config/pacman/aur-packages.txt && pacman -Qne | awk '{ print $1 }' > /home/matt/.config/pacman/arch-packages.txt" diff --git a/pacman/hooks/90-needrestart-pacman.hook b/pacman/hooks/90-needrestart-pacman.hook new file mode 100644 index 0000000..50dde97 --- /dev/null +++ b/pacman/hooks/90-needrestart-pacman.hook @@ -0,0 +1,12 @@ +[Trigger] +Operation = Install +Operation = Upgrade +Operation = Remove +Type = Package +Target = * + +[Action] +Description = Checking which daemons need to be restarted after library upgrades. +When = PostTransaction +Exec = /usr/bin/needrestart +Depends = needrestart diff --git a/pacman/hooks/95-backup-boot.hook b/pacman/hooks/95-backup-boot.hook new file mode 100644 index 0000000..c591ec0 --- /dev/null +++ b/pacman/hooks/95-backup-boot.hook @@ -0,0 +1,11 @@ +[Trigger] +Operation = Upgrade +Operation = Install +Operation = Remove +Type = Package +Target = linux + +[Action] +Description = Backing up /boot... +When = PreTransaction +Exec = /usr/bin/rsync -avzq --delete /boot /.bootbackup diff --git a/qimgv/.github/README.md b/qimgv/.github/README.md new file mode 100644 index 0000000..affa9d5 --- /dev/null +++ b/qimgv/.github/README.md @@ -0,0 +1,3 @@ +
+ +
diff --git a/qimgv/.github/title.png b/qimgv/.github/title.png new file mode 100644 index 0000000..51813d8 Binary files /dev/null and b/qimgv/.github/title.png differ diff --git a/qimgv/qimgv.conf b/qimgv/qimgv.conf new file mode 100644 index 0000000..35396e8 --- /dev/null +++ b/qimgv/qimgv.conf @@ -0,0 +1,79 @@ +[General] +JPEGSaveQuality=100 +absoluteZoomStep=false +autoResizeLimit=90 +autoResizeWindow=false +backgroundOpacity=1 +blurBackground=false +confirmDelete=true +confirmTrash=true +cursorAutohiding=true +defaultCropAction=0 +defaultFitMode=0 +defaultViewMode=1 +drawTransparencyGrid=false +enableSmoothScroll=true +expandImage=false +expandLimit=2 +firstRun=false +fixedZoomLevels="0.05,0.1,0.125,0.166,0.25,0.333,0.5,0.66,1,1.5,2,3,4,5,6,7,8" +focusPointIn1to1Mode=1 +folderEndAction=0 +folderViewIconSize=120 +folderViewMode=2 +imageScrolling=1 +infoBarFullscreen=true +infoBarWindowed=true +jxlAnimation=false +keepFitMode=false +language=en_US +lastVerMajor=1 +lastVerMicro=3 +lastVerMinor=0 +loopSlideshow=false +memoryAllocationLimit=1024 +mpvBinary=/usr/bin/mpv +openInFullscreen=false +panelCenterSelection=false +panelEnabled=true +panelFullscreenOnly=true +panelPinned=false +panelPosition=top +panelPreviewsSize=140 +playVideoSounds=false +scalingFilter=1 +showSaveOverlay=true +slideshowInterval=3000 +smoothAnimatedImages=true +smoothUpscaling=true +sortFolders=true +sortingMode=0 +squareThumbnails=false +thumbPanelStyle=1 +thumbnailCache=true +thumbnailerThreads=4 +trackpadDetection=true +unloadThumbs=true +unlockMinZoom=true +useFixedZoomLevels=false +useOpenGL=false +usePreloader=true +useSystemColorScheme=false +videoPlayback=false +windowTitleExtendedInfo=true +zoomIndicatorMode=0 +zoomStep=0.20000000298023224 + +[Controls] +shortcuts="zoomIn=+", "frameStepBack=,", "zoomOut=-", "frameStep=.", "fitWindow=1", "fitWidth=2", "fitNormal=3", "s:satty=A", "scrollLeft=Alt+H", "scrollDown=Alt+J", "scrollUp=Alt+K", "scrollRight=Alt+L", "exit=Alt+X", "folderView=Backspace", "copyFile=C", "copyFileClipboard=Ctrl+C", "showInDirectory=Ctrl+D", "zoomOut=Ctrl+Down", "flipH=Ctrl+H", "rotateLeft=Ctrl+L", "seekVideoBackward=Ctrl+Left", "open=Ctrl+O", "print=Ctrl+P", "exit=Ctrl+Q", "rotateRight=Ctrl+R", "seekVideoForward=Ctrl+Right", "save=Ctrl+S", "copyPathClipboard=Ctrl+Shift+C", "saveAs=Ctrl+Shift+S", "zoomIn=Ctrl+Up", "flipV=Ctrl+V", "zoomOutCursor=Ctrl+WheelDown", "zoomInCursor=Ctrl+WheelUp", "discardEdits=Ctrl+Z", "toggleShuffle=Ctrl+`", "moveToTrash=Del", "scrollDown=Down", "s:krita=E", "jumpToLast=End", "folderView=Enter", "toggleFullscreen=F", "toggleFullscreen=F11", "renameFile=F2", "reloadImage=F5", "prevImage=H", "jumpToFirst=Home", "toggleImageInfo=I", "nextImage=L", "toggleFullscreen=LMB_DoubleClick", "prevImage=Left", "moveFile=M", "contextMenu=Menu", "exit=MiddleButton", "s:nemo=O", "openSettings=P", "closeFullScreenOrExit=Q", "resize=R", "contextMenu=RMB", "nextImage=Right", "removeFile=Shift+Del", "toggleFullscreenInfoBar=Shift+F", "prevDirectory=Shift+H", "nextDirectory=Shift+L", "prevDirectory=Shift+Left", "s:yazi=Shift+O", "nextDirectory=Shift+Right", "toggleFitMode=Space", "scrollUp=Up", "nextImage=WheelDown", "prevImage=WheelUp", "crop=X", "prevImage=XButton1", "nextImage=XButton2", "toggleSlideshow=`" + +[Scripts] +script\1\name=krita +script\1\value=@Variant(\0\0\0\x7f\0\0\0\aScript\0\0\0\0\x18\0k\0r\0i\0t\0\x61\0 \0%\0\x66\0i\0l\0\x65\0%\0) +script\2\name=nemo +script\2\value=@Variant(\0\0\0\x7f\0\0\0\aScript\0\0\0\0\x16\0n\0\x65\0m\0o\0 \0%\0\x66\0i\0l\0\x65\0%\0) +script\3\name=satty +script\3\value=@Variant(\0\0\0\x7f\0\0\0\aScript\0\0\0\0\x1e\0s\0\x61\0t\0t\0y\0 \0-\0\x66\0 \0%\0\x66\0i\0l\0\x65\0%\0) +script\4\name=yazi +script\4\value=@Variant(\0\0\0\x7f\0\0\0\aScript\0\0\0\0\"\0k\0i\0t\0t\0y\0 \0y\0\x61\0z\0i\0 \0%\0\x66\0i\0l\0\x65\0%\0) +script\size=4 diff --git a/qimgv/savedState.conf b/qimgv/savedState.conf new file mode 100644 index 0000000..da41db4 --- /dev/null +++ b/qimgv/savedState.conf @@ -0,0 +1,7 @@ +[General] +bookmarks=/home/matt/Images +lastDisplay=0 +maximizedWindow=true +placesPanel=true +savedPaths=/home/matt, /home/matt, /home/matt, /home/matt, /home/matt, /home/matt, /home/matt, /home/matt, /home/matt +windowGeometry=@Rect(0 0 1075 672) diff --git a/qimgv/theme.conf b/qimgv/theme.conf new file mode 100644 index 0000000..5aa8cb4 --- /dev/null +++ b/qimgv/theme.conf @@ -0,0 +1,13 @@ +[Colors] +accent=#8aadf4 +background=#24273a +background_fullscreen=#24273a +folderview=#24273a +folderview_topbar=#1e2030 +icons=#cad3f5 +overlay=#a5adcb +overlay_text=#a5adcb +scrollbar=#869fd1 +text=#cad3f5 +widget=#1e2030 +widget_border=#1e2030 diff --git a/qt5ct/.github/README.md b/qt5ct/.github/README.md new file mode 100644 index 0000000..affa9d5 --- /dev/null +++ b/qt5ct/.github/README.md @@ -0,0 +1,3 @@ +
+ +
diff --git a/qt5ct/.github/title.png b/qt5ct/.github/title.png new file mode 100644 index 0000000..a852366 Binary files /dev/null and b/qt5ct/.github/title.png differ diff --git a/qt5ct/colors/Catppuccin-Macchiato.conf b/qt5ct/colors/Catppuccin-Macchiato.conf new file mode 100644 index 0000000..fdae012 --- /dev/null +++ b/qt5ct/colors/Catppuccin-Macchiato.conf @@ -0,0 +1,4 @@ +[ColorScheme] +active_colors=#ffcad3f5, #ff1e2030, #ffa5adcb, #ff939ab7, #ff494d64, #ff6e738d, #ffcad3f5, #ffcad3f5, #ffcad3f5, #ff24273a, #ff1e2030, #ff8087a2, #ff8aadf4, #ff24273a, #ff8aadf4, #ffed8796, #ff24273a, #ffcad3f5, #ff181926, #ffcad3f5, #808087a2 +disabled_colors=#ffa5adcb, #ff1e2030, #ffa5adcb, #ff939ab7, #ff494d64, #ff6e738d, #ffa5adcb, #ffa5adcb, #ffa5adcb, #ff24273a, #ff1e2030, #ff8087a2, #ff8aadf4, #ff494d64, #ff8aadf4, #ffed8796, #ff24273a, #ffcad3f5, #ff181926, #ffcad3f5, #808087a2 +inactive_colors=#ffcdd6f4, #ff1e2030, #ffa5adcb, #ff939ab7, #ff494d64, #ff6e738d, #ffcad3f5, #ffcad3f5, #ffcad3f5, #ff24273a, #ff1e2030, #ff8087a2, #ff8aadf4, #ffa5adcb, #ff8aadf4, #ffed8796, #ff24273a, #ffcad3f5, #ff181926, #ffcad3f5, #808087a2 diff --git a/qt5ct/qt5ct.conf b/qt5ct/qt5ct.conf new file mode 100644 index 0000000..5ddd0d1 --- /dev/null +++ b/qt5ct/qt5ct.conf @@ -0,0 +1,32 @@ +[Appearance] +color_scheme_path=~/.config/qt5ct/colors/Catppuccin-Macchiato.conf +custom_palette=true +icon_theme=Catppuccin-SE +standard_dialogs=default +style=kvantum-dark + +[Fonts] +fixed="JetBrainsMono Nerd Font,10,-1,5,50,0,0,0,0,0,Regular" +general="JetBrainsMono Nerd Font,10,-1,5,50,0,0,0,0,0,Regular" + +[Interface] +activate_item_on_single_click=1 +buttonbox_layout=0 +cursor_flash_time=1000 +dialog_buttons_have_icons=1 +double_click_interval=400 +gui_effects=General, AnimateMenu, AnimateCombo, AnimateTooltip, AnimateToolBox +keyboard_scheme=2 +menus_have_icons=true +show_shortcuts_in_context_menus=true +stylesheets=@Invalid() +toolbutton_style=4 +underline_shortcut=1 +wheel_scroll_lines=3 + +[SettingsWindow] +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\x4\x38\0\0\x6\x7f\0\0\a+\0\0\0\0\0\0\x4\x38\0\0\x2\x7f\0\0\b3\0\0\0\0\x2\0\0\0\n\0\0\0\0\0\0\0\x4\x38\0\0\x6\x7f\0\0\a+) + +[Troubleshooting] +force_raster_widgets=1 +ignored_applications=@Invalid() diff --git a/rg/.github/README.md b/rg/.github/README.md new file mode 100644 index 0000000..affa9d5 --- /dev/null +++ b/rg/.github/README.md @@ -0,0 +1,3 @@ +
+ +
diff --git a/rg/.github/title.png b/rg/.github/title.png new file mode 100644 index 0000000..5e64712 Binary files /dev/null and b/rg/.github/title.png differ diff --git a/rg/.ripgreprc b/rg/.ripgreprc new file mode 100644 index 0000000..5f0ad8b --- /dev/null +++ b/rg/.ripgreprc @@ -0,0 +1,3 @@ +#!/bin/bash + +--smart-case diff --git a/rofi/.github/README.md b/rofi/.github/README.md new file mode 100644 index 0000000..539cce9 --- /dev/null +++ b/rofi/.github/README.md @@ -0,0 +1,40 @@ +
+ +
+ +
+ +
+ +
+ +
+ + + + + + +
+ +# :camera: ‎ Gallery + +| **Applications** | +| ------------------------------------------ | +| ![applications](./assets/applications.png) | + +| **Game Launcher** | +| -------------------------------------------- | +| ![game-launcher](./assets/game-launcher.png) | + +| **Powermenu** | +| ------------------------------------ | +| ![powermenu](./assets/powermenu.png) | + +| **Screenshots** | +| ---------------------------------------- | +| ![screenshots](./assets/screenshots.png) | + +| **Wallpapers** | +| -------------------------------------- | +| ![wallpapers](./assets/wallpapers.png) | diff --git a/rofi/.github/assets/applications.png b/rofi/.github/assets/applications.png new file mode 100644 index 0000000..8da19d1 Binary files /dev/null and b/rofi/.github/assets/applications.png differ diff --git a/rofi/.github/assets/game-launcher.png b/rofi/.github/assets/game-launcher.png new file mode 100644 index 0000000..de4ce80 Binary files /dev/null and b/rofi/.github/assets/game-launcher.png differ diff --git a/rofi/.github/assets/powermenu.png b/rofi/.github/assets/powermenu.png new file mode 100644 index 0000000..3b492a2 Binary files /dev/null and b/rofi/.github/assets/powermenu.png differ diff --git a/rofi/.github/assets/screenshots.png b/rofi/.github/assets/screenshots.png new file mode 100644 index 0000000..5069e9c Binary files /dev/null and b/rofi/.github/assets/screenshots.png differ diff --git a/rofi/.github/assets/wallpapers.png b/rofi/.github/assets/wallpapers.png new file mode 100644 index 0000000..3fb9b8e Binary files /dev/null and b/rofi/.github/assets/wallpapers.png differ diff --git a/rofi/.github/title.png b/rofi/.github/title.png new file mode 100644 index 0000000..66b5568 Binary files /dev/null and b/rofi/.github/title.png differ diff --git a/rofi/config.rasi b/rofi/config.rasi new file mode 100644 index 0000000..9f501e8 --- /dev/null +++ b/rofi/config.rasi @@ -0,0 +1,95 @@ +configuration { + // General Settings + modi: "drun,run,filebrowser"; + case-sensitive: false; + cycle: false; + filter: ""; + scroll-method: 0; + normalize-match: true; + show-icons: true; + icon-theme: "Catppuccin-SE"; + font: "JetBrainsMono Nerd Font 10"; + steal-focus: false; + hover-select: true; + + // Keybindings + kb-row-up: "Control+k,Up"; + kb-row-down: "Control+j,Down"; + kb-accept-entry: "Return,KP_Enter"; + kb-remove-to-eol: ""; + + // Matching setting + matching: "normal"; + tokenize: true; + + // SSH settings + ssh-client: "ssh"; + ssh-command: "{terminal} -e {ssh-client} {host} [-p {port}]"; + parse-hosts: true; + parse-known-hosts: true; + + // Drun settings + drun-categories: ""; + drun-match-fields: "name,generic,exec,categories,keywords"; + drun-display-format: "{name} [({generic})]"; + drun-show-actions: false; + drun-url-launcher: "xdg-open"; + drun-use-desktop-cache: false; + drun-reload-desktop-cache: false; + drun { + // Parse user desktop files. + parse-user: true; + // Parse system desktop files. + parse-system: true; + } + + // Run settings + run-command: "{cmd}"; + run-list-command: ""; + run-shell-command: "{terminal} -e {cmd}"; + + // Fallback Icon + run,drun { + fallback-icon: "application-x-addon"; + } + + // Window switcher settings + window-match-fields: "title,class,role,name,desktop"; + window-command: "wmctrl -i -R {window}"; + window-format: "{w} - {c} - {t:0}"; + window-thumbnail: false; + + // History and Sorting + disable-history: false; + sorting-method: "fzf"; + max-history-size: 25; + + // Display setting + display-window: "Windows"; + display-windowcd: "Window CD"; + display-run: "Run"; + display-ssh: "SSH"; + display-drun: "Apps"; + display-combi: "Combi"; + display-keys: "Keys"; + display-filebrowser: "Files"; + + // Misc setting + terminal: "rofi-sensible-terminal"; + sort: false; + threads: 0; + click-to-exit: true; + + // File browser settings + filebrowser { + directories-first: true; + sorting-method: "name"; + } + + // Other settings + timeout { + action: "kb-cancel"; + delay: 0; + } +} +@theme "style" diff --git a/rofi/scripts/clipboard/clipboard b/rofi/scripts/clipboard/clipboard new file mode 100755 index 0000000..c52aba1 --- /dev/null +++ b/rofi/scripts/clipboard/clipboard @@ -0,0 +1,8 @@ +#!/bin/bash + +if ! command -v cliphist >/dev/null 2>&1; then + notify-send "Program not found" "Make sure you have installed cliphist" + exit 1 +else + cliphist list | rofi -dmenu | cliphist decode | wl-copy +fi diff --git a/rofi/scripts/emoji/emoji b/rofi/scripts/emoji/emoji new file mode 100755 index 0000000..6b7cf96 --- /dev/null +++ b/rofi/scripts/emoji/emoji @@ -0,0 +1,3 @@ +#!/bin/bash + +rofi -modi emoji -show emoji -emoji-mode copy -theme ~/.config/rofi/scripts/emoji/style.rasi -emoji-format '{emoji} {name} [({group})]' diff --git a/rofi/scripts/emoji/style.rasi b/rofi/scripts/emoji/style.rasi new file mode 100644 index 0000000..5cb8e73 --- /dev/null +++ b/rofi/scripts/emoji/style.rasi @@ -0,0 +1,10 @@ +// Config +configuration { + modi: "emoji"; + show: "emoji"; + emoji-mode: "copy"; + display-emoji: "Emojis"; + show-icons: true; +} + +@theme "~/.config/rofi/style.rasi" diff --git a/rofi/scripts/game-launcher/style.rasi b/rofi/scripts/game-launcher/style.rasi new file mode 100644 index 0000000..48bb2ff --- /dev/null +++ b/rofi/scripts/game-launcher/style.rasi @@ -0,0 +1,135 @@ +// Config +configuration { + modi: "games"; + show-icons: true; + drun-display-format: "{name}"; + font: "JetBrainsMono Nerd Font 9"; +} + +@theme "~/.config/rofi/theme/catppuccin-macchiato.rasi" + +// Main +window { + enabled: true; + fullscreen: false; + width: 90%; + transparency: "real"; + cursor: "default"; + spacing: 0px; + padding: 0px; + border: 2px; + border-radius: 10px; + border-color: @accent; + background-color: transparent; +} + +mainbox { + enabled: true; + children: [ "inputbar-box", "listview" ]; + background-color: @background; +} + +inputbar-box { + children: [ dummy, inputbar, dummy ]; + orientation: horizontal; + expand: false; + margin: 20px 0px 0px 0px; + background-color: transparent; +} + +dummy { + expand: true; + background-color: transparent; +} + +inputbar { + enabled: true; + spacing: 15px; + margin: 0px; + background-color: transparent; + children: [ "textbox-prompt-colon", "entry" ]; +} + +textbox-prompt-colon { + enabled: true; + expand: false; + padding: 13px 12px 13px 16px; + border: 0px; + border-radius: 7px; + border-color: @border-tb; + background-color: @background-tb; + text-color: @foreground; + str: " "; +} + +entry { + enabled: true; + padding: 12px 16px; + border: 0px; + border-radius: 7px; + border-color: @border-tb; + background-color: @background-tb; + text-color: @foreground; + cursor: text; + placeholder: "Search..."; + placeholder-color: inherit; + vertical-align: 0.5; + horizontal-align: 0.0; + width: 10%; +} + +// Lists +listview { + enabled: true; + columns: 10; + lines: 1; + spacing: 30px; + padding: 20px 40px 40px 40px; + cycle: true; + dynamic: false; + scrollbar: false; + layout: vertical; + reverse: false; + fixed-height: true; + fixed-columns: true; + cursor: "default"; + background-color: transparent; + text-color: @foreground; +} + +// Elements +element { + enabled: true; + orientation: vertical; + spacing: 0px; + padding: 5px; + border-radius: 15px; + cursor: pointer; + background-color: transparent; + text-color: @foreground; +} + +element selected.normal { + background-color: @accent; + text-color: @foreground; +} + +element-icon { + size: 25%; + spacing: 0px; + padding: 10px; + cursor: inherit; + border-radius: 20px; + background-color: transparent; + text-color: inherit; +} + +element-text { + vertical-align: 0.5; + horizontal-align: 0.5; + spacing: 0px; + padding: 10px; + cursor: inherit; + background-color: transparent; + text-color: inherit; +} diff --git a/rofi/scripts/keybindings/keybindings b/rofi/scripts/keybindings/keybindings new file mode 100755 index 0000000..db85ddb --- /dev/null +++ b/rofi/scripts/keybindings/keybindings @@ -0,0 +1,14 @@ +#!/bin/bash + +if ! command -v keyb >/dev/null 2>&1; then + notify-send "Program not found" "Make sure you have installed keyb" + exit 1 +else + CONFIG=$(fd --base-directory "$HOME/.config/keyb/bindings" --type f . | sed 's/\.yml$//' | rofi -dmenu) + + if [ -z "$CONFIG" ]; then + exit + fi + + hyprctl dispatch exec "[float;size 45% 80%;center 1] kitty keyb -k '$HOME/.config/keyb/bindings/$CONFIG.yml'" +fi diff --git a/rofi/scripts/powermenu/powermenu b/rofi/scripts/powermenu/powermenu new file mode 100755 index 0000000..cfc7212 --- /dev/null +++ b/rofi/scripts/powermenu/powermenu @@ -0,0 +1,80 @@ +#!/bin/bash + +# variables +uptime="$(uptime -p | sed -e 's/up //g')" +shutdown='󰐥' +reboot='󰜉' +lock='' +suspend='󰤄' +logout='󰍃' +yes='󰸞' +no='󱎘' + +rofi_cmd() { + rofi -dmenu \ + -p "Uptime: $uptime" \ + -mesg "Uptime: $uptime" \ + -theme ~/.config/rofi/scripts/powermenu/style.rasi +} + +confirm_cmd() { + rofi -theme-str 'window {location: center; anchor: center; fullscreen: false; width: 350px;}' \ + -theme-str 'mainbox {children: [ "message", "listview" ];}' \ + -theme-str 'listview {columns: 2; lines: 1;}' \ + -theme-str 'element-text {horizontal-align: 0.5;}' \ + -theme-str 'textbox {horizontal-align: 0.5;}' \ + -dmenu \ + -p 'Confirmation' \ + -mesg 'Are you sure?' \ + -theme ~/.config/rofi/scripts/powermenu/style.rasi +} + +confirm_exit() { + echo -e "$yes\n$no" | confirm_cmd +} + +run_rofi() { + echo -e "$lock\n$suspend\n$logout\n$reboot\n$shutdown" | rofi_cmd +} + +# Execute Command +run_cmd() { + selected="$(confirm_exit)" + if [[ "$selected" == "$yes" ]]; then + if [[ $1 == '--shutdown' ]]; then + systemctl poweroff + elif [[ $1 == '--reboot' ]]; then + systemctl reboot + elif [[ $1 == '--suspend' ]]; then + mpc -q pause + hyprlock + systemctl suspend + elif [[ $1 == '--logout' ]]; then + hyprctl dispatch exit + elif [[ $1 == '--lock' ]]; then + hyprlock + fi + else + exit 0 + fi +} + +# Actions +chosen="$(run_rofi)" +case ${chosen} in +$shutdown) + run_cmd --shutdown + ;; +$reboot) + run_cmd --reboot + ;; +$lock) + run_cmd --lock + ;; +$suspend) + run_cmd --suspend + ;; +$logout) + run_cmd --logout + ;; +esac diff --git a/rofi/scripts/powermenu/style.rasi b/rofi/scripts/powermenu/style.rasi new file mode 100644 index 0000000..fa2c414 --- /dev/null +++ b/rofi/scripts/powermenu/style.rasi @@ -0,0 +1,168 @@ +// Config +configuration { + show-icons: false; + me-select-entry: ""; + me-accept-entry: [ MousePrimary, MouseSecondary, MouseDPrimary ]; +} + +@theme "~/.config/rofi/theme/catppuccin-macchiato.rasi" + +// Main Window +window { + transparency: "real"; + location: center; + anchor: center; + fullscreen: false; + width: 450px; + x-offset: 0px; + y-offset: 0px; + + enabled: true; + margin: 0px; + padding: 0px; + border: 2px solid; + border-radius: 10px; + border-color: @accent; + cursor: "default"; + background-color: @background; +} + +// Main Box +mainbox { + enabled: true; + spacing: 15px; + margin: 0px; + padding: 30px; + border: 0px solid; + border-radius: 5px; + border-color: @selected; + background-color: transparent; + children: [ "message", "listview" ]; +} + +// Inputbar +inputbar { + enabled: false; + spacing: 15px; + margin: 0px; + padding: 0px; + border: 0px; + border-radius: 5px; + border-color: @selected; + background-color: transparent; + text-color: @foreground; + children: [ "textbox-prompt-colon", "prompt" ]; +} + +dummy { + background-color: transparent; +} + +textbox-prompt-colon { + font: "Symbols Nerd Font 12"; + enabled: false; + expand: false; + str: ""; + padding: 0 14px; + border-radius: 10px; + border-color: @urgent; + border: 2px solid; + background-color: @background; + text-color: @foreground; + vertical-align: 0.5; + horizontal-align: 0.5; +} + +prompt { + enabled: false; + padding: 12px; + border-radius: 10px; + border-color: @active; + border: 2px solid; + background-color: @background; + text-color: @foreground; +} + +// Message +message { + enabled: false; + margin: 0px; + padding: 12px; + border: 0px solid; + border-radius: 10px; + border-color: @selected; + background-color: @background-tb; + text-color: @foreground; +} + +textbox { + background-color: inherit; + text-color: inherit; + vertical-align: 0.5; + horizontal-align: 0.5; + placeholder-color: @foreground; + blink: true; + markup: true; +} + +error-message { + padding: 12px; + border: 0px solid; + border-radius: 10px; + border-color: @selected; + background-color: @background; + text-color: @foreground; +} + +// Listview +listview { + enabled: true; + columns: 5; + lines: 1; + cycle: true; + dynamic: true; + scrollbar: false; + layout: vertical; + reverse: false; + fixed-height: true; + fixed-columns: true; + spacing: 15px; + margin: 0px; + padding: 0px; + border: 0px solid; + border-radius: 0px; + border-color: @selected; + background-color: transparent; + text-color: @foreground; + cursor: "default"; +} + +// Elements +element { + enabled: true; + spacing: 0px; + margin: 0px; + padding: 10px; + border: 0px solid; + border-radius: 10px; + border-color: @accent; + background-color: transparent; + text-color: @foreground; + cursor: pointer; +} + +element-text { + font: "Symbols Nerd Font 24"; + background-color: transparent; + text-color: inherit; + cursor: inherit; + vertical-align: 0; // NOTE: Change this back to 0.5 once https://github.com/davatorium/rofi/issues/2076 is resolved + horizontal-align: 0.5; +} + +element selected.normal { + background-color: var(foreground); + border-color: var(selected); + border: 0px solid; + text-color: var(background); +} diff --git a/rofi/scripts/screenshot/screenshot b/rofi/scripts/screenshot/screenshot new file mode 100755 index 0000000..557cff7 --- /dev/null +++ b/rofi/scripts/screenshot/screenshot @@ -0,0 +1,34 @@ +#!/bin/bash + +if [ "$1" = "--freeze" ]; then + extra_args="--freeze" +fi + +# variables +theme="$HOME/.config/rofi/scripts/screenshot/style.rasi" +hyprshot="$HOME/.config/hypr/scripts/hyprshot" +save_dir="$HOME/pictures/screenshots/pc" +filename="captura-$(date +%Y-%m-%d-%s).png" +command="$hyprshot -o $save_dir -f $filename $extra_args" + +# options to be displayed +region="󰆞" +output="" +window="" +folder="" + +selected="$(echo -e "$region\n$output\n$window\n$folder" | rofi -dmenu -theme "${theme}")" +case $selected in +$region) + $command -m region + ;; +$output) + $command -m output + ;; +$window) + $command -m window + ;; +$folder) + ~/.config/rofi/scripts/screenshot/screenshot_selection + ;; +esac diff --git a/rofi/scripts/screenshot/screenshot_selection b/rofi/scripts/screenshot/screenshot_selection new file mode 100755 index 0000000..0b81efa --- /dev/null +++ b/rofi/scripts/screenshot/screenshot_selection @@ -0,0 +1,28 @@ +#!/bin/bash + +screenshots_dir=$HOME/pictures/screenshots/pc +theme="$HOME/.config/rofi/scripts/wallpaper/style.rasi" + +build_theme() { + rows=$1 + cols=$2 + icon_size=$3 + + echo "element{orientation:vertical;}element-text{horizontal-align:0.5;}element-icon{size:$icon_size.0000em;}listview{lines:$rows;columns:$cols;}" +} + +rofi_cmd="rofi -dmenu -i -show-icons -theme-str $(build_theme 5 4 10) -theme ${theme}" + +choice=$( + ls -t --escape "$screenshots_dir" -p | grep -v / | + while read A; do echo -en "$A\x00icon\x1f$screenshots_dir/$A\n"; done | + $rofi_cmd +) + +screenshot="$screenshots_dir/$choice" + +if command -v satty &>/dev/null; then + satty -f "$screenshot" +else + xdg-open "$screenshot" +fi diff --git a/rofi/scripts/screenshot/style.rasi b/rofi/scripts/screenshot/style.rasi new file mode 100644 index 0000000..ce0c84a --- /dev/null +++ b/rofi/scripts/screenshot/style.rasi @@ -0,0 +1,168 @@ +// Config +configuration { + show-icons: false; + me-select-entry: ""; + me-accept-entry: [ MousePrimary, MouseSecondary, MouseDPrimary ]; +} + +@theme "~/.config/rofi/theme/catppuccin-macchiato.rasi" + +// Main Window +window { + transparency: "real"; + location: center; + anchor: center; + fullscreen: false; + width: 450px; + x-offset: 0px; + y-offset: 0px; + + enabled: true; + margin: 0px; + padding: 0px; + border: 2px solid; + border-radius: 10px; + border-color: @accent; + cursor: "default"; + background-color: @background; +} + +// Main Box +mainbox { + enabled: true; + spacing: 15px; + margin: 0px; + padding: 30px; + border: 0px solid; + border-radius: 5px; + border-color: @selected; + background-color: transparent; + children: [ "message", "listview" ]; +} + +// Inputbar +inputbar { + enabled: false; + spacing: 15px; + margin: 0px; + padding: 0px; + border: 0px; + border-radius: 5px; + border-color: @selected; + background-color: transparent; + text-color: @foreground; + children: [ "textbox-prompt-colon", "prompt" ]; +} + +dummy { + background-color: transparent; +} + +textbox-prompt-colon { + font: "Symbols Nerd Font 12"; + enabled: false; + expand: false; + str: ""; + padding: 0 14px; + border-radius: 10px; + border-color: @urgent; + border: 2px solid; + background-color: @background; + text-color: @foreground; + vertical-align: 0.5; + horizontal-align: 0.5; +} + +prompt { + enabled: false; + padding: 12px; + border-radius: 10px; + border-color: @active; + border: 2px solid; + background-color: @background; + text-color: @foreground; +} + +// Message +message { + enabled: false; + margin: 0px; + padding: 12px; + border: 0px solid; + border-radius: 10px; + border-color: @selected; + background-color: @background-tb; + text-color: @foreground; +} + +textbox { + background-color: inherit; + text-color: inherit; + vertical-align: 0.5; + horizontal-align: 0.5; + placeholder-color: @foreground; + blink: true; + markup: true; +} + +error-message { + padding: 12px; + border: 0px solid; + border-radius: 10px; + border-color: @selected; + background-color: @background; + text-color: @foreground; +} + +// Listview +listview { + enabled: true; + columns: 4; + lines: 1; + cycle: true; + dynamic: true; + scrollbar: false; + layout: vertical; + reverse: false; + fixed-height: true; + fixed-columns: true; + spacing: 15px; + margin: 0px; + padding: 0px; + border: 0px solid; + border-radius: 0px; + border-color: @selected; + background-color: transparent; + text-color: @foreground; + cursor: "default"; +} + +// Elements +element { + enabled: true; + spacing: 0px; + margin: 0px; + padding: 10px; + border: 0px solid; + border-radius: 10px; + border-color: @accent; + background-color: transparent; + text-color: @foreground; + cursor: pointer; +} + +element-text { + font: "Symbols Nerd Font 24"; + background-color: transparent; + text-color: inherit; + cursor: inherit; + vertical-align: 0; // NOTE: Change this back to 0.5 once https://github.com/davatorium/rofi/issues/2076 is resolved + horizontal-align: 0.5; +} + +element selected.normal { + background-color: var(foreground); + border-color: var(selected); + border: 0px solid; + text-color: var(background); +} diff --git a/rofi/scripts/wallpaper/style.rasi b/rofi/scripts/wallpaper/style.rasi new file mode 100644 index 0000000..65b30c9 --- /dev/null +++ b/rofi/scripts/wallpaper/style.rasi @@ -0,0 +1,7 @@ +@theme "~/.config/rofi/style.rasi" + +// Window +window { + width: 900px; + height: 700px; +} diff --git a/rofi/scripts/wallpaper/wallpaper b/rofi/scripts/wallpaper/wallpaper new file mode 100755 index 0000000..4e3a3e8 --- /dev/null +++ b/rofi/scripts/wallpaper/wallpaper @@ -0,0 +1,31 @@ +#!/bin/bash + +wallpapers_dir="$HOME/.config/hypr/theme/walls/" + +build_theme() { + rows=$1 + cols=$2 + icon_size=$3 + + echo "element{orientation:vertical;}element-text{horizontal-align:0.5;}element-icon{size:$icon_size.0000em;}listview{lines:$rows;columns:$cols;}" +} + +theme="$HOME/.config/rofi/scripts/wallpaper/style.rasi" + +rofi_cmd="rofi -dmenu -i -show-icons -theme-str $(build_theme 4 3 12) -theme ${theme}" + +choice=$( + ls --escape "$wallpapers_dir" | + while read A; do echo -en "$A\x00icon\x1f$wallpapers_dir/$A\n"; done | + $rofi_cmd +) + +wallpaper="$wallpapers_dir/$choice" + +swww img "$wallpaper" \ + --transition-bezier 0.5,1.19,.8,.4 \ + --transition-type wipe \ + --transition-duration 2 \ + --transition-fps 75 && notify-send "Wallpaper Changed" -i "$wallpaper" --app-name=Wallpaper + +exit 1 diff --git a/rofi/style.rasi b/rofi/style.rasi new file mode 100644 index 0000000..ecfa811 --- /dev/null +++ b/rofi/style.rasi @@ -0,0 +1,174 @@ +configuration { + modi: "drun"; + show-icons: true; + display-drun: "Apps"; + display-run: "Run"; + display-filebrowser: "Files"; + display-window: "Windows"; + drun-display-format: "{name} [({generic})]"; + me-select-entry: ""; + me-accept-entry: [ MousePrimary, MouseSecondary, MouseDPrimary ]; +} + +@theme "~/.config/rofi/theme/catppuccin-macchiato.rasi" + +// Main Window +window { + location: center; + anchor: center; + fullscreen: false; + border: 2px; + border-radius: 10px; + border-color: @accent; + width: 500px; + x-offset: 0px; + y-offset: 0px; + enabled: true; + margin: 0px; + padding: 0px; + border-radius: 10px; + cursor: "default"; + transparency: "real"; + background-color: @background; +} + +// Main Box +mainbox { + enabled: true; + spacing: 15px; + padding: 30px; + background-color: transparent; + children: [ "inputbar", "mode-switcher", "listview" ]; +} + +// Inputbar +inputbar { + enabled: true; + spacing: 15px; + margin: 0px; + background-color: transparent; + children: [ "textbox-prompt-colon", "entry" ]; +} + +textbox-prompt-colon { + enabled: true; + expand: false; + padding: 13px 12px 13px 16px; + border: 0px; + border-radius: 7px; + border-color: @border-tb; + background-color: @background-tb; + text-color: @foreground; + str: " "; +} + +entry { + enabled: true; + padding: 12px 16px; + border: 0px; + border-radius: 7px; + border-color: @border-tb; + background-color: @background-tb; + text-color: @foreground; + cursor: text; + placeholder: "Search..."; + placeholder-color: inherit; + vertical-align: 0.5; + horizontal-align: 0.0; +} + +// Listview +listview { + enabled: true; + columns: 1; + lines: 5; + cycle: true; + dynamic: true; + scrollbar: false; + layout: vertical; + reverse: false; + fixed-height: true; + fixed-columns: true; + spacing: 10px; + background-color: transparent; + cursor: "default"; +} + +// Elements +element { + enabled: true; + spacing: 10px; + margin: 0px; + padding: 10px; + border: 0px solid; + border-radius: 7px; + background-color: transparent; + text-color: @foreground; + cursor: pointer; +} + +element normal.active { + background-image: @active; + text-color: @foreground; +} + +element selected.normal { + border-radius: 7px; + background-image: @selected; + text-color: @foreground; +} + +element selected.active { + background-image: @urgent; + text-color: @foreground; +} + +element-icon { + background-color: transparent; + size: 48px; + cursor: inherit; +} + +element-text { + background-color: inherit; + text-color: inherit; + cursor: inherit; + vertical-align: 0.5; + horizontal-align: 0.0; +} + +// Mode Switcher +mode-switcher { + enabled: true; + expand: false; + spacing: 15px; + background-color: transparent; +} + +button { + padding: 10px; + border-radius: 7px; + background-image: @button; + text-color: @background; + cursor: pointer; +} + +button selected { + background-image: @button-selected; + text-color: @background; +} + +// Message +error-message { + padding: 20px; + background-color: @background; + text-color: @foreground; +} + +textbox { + padding: 0px; + border-radius: 7px; + text-color: @foreground; + vertical-align: 0.5; + horizontal-align: 0.0; +} diff --git a/rofi/theme/catppuccin-macchiato.rasi b/rofi/theme/catppuccin-macchiato.rasi new file mode 100644 index 0000000..ba81e7c --- /dev/null +++ b/rofi/theme/catppuccin-macchiato.rasi @@ -0,0 +1,12 @@ +* { + background: #24273ACC; + foreground: #CAD3F5FF; + accent: #B7BDF869; + background-tb: #494D64FF; + border-tb: #363A4FFF; + selected: linear-gradient(to right, #363A4FFF, #B7BDF869); + button: linear-gradient(#939AB7FF); + button-selected: linear-gradient(#B7BDF869); + active: linear-gradient(to right, #8BD5CAFF, #A6DA95FF); + urgent: #ED8796FF; +} diff --git a/satty/.github/README.md b/satty/.github/README.md new file mode 100644 index 0000000..affa9d5 --- /dev/null +++ b/satty/.github/README.md @@ -0,0 +1,3 @@ +
+ +
diff --git a/satty/.github/title.png b/satty/.github/title.png new file mode 100644 index 0000000..5f63227 Binary files /dev/null and b/satty/.github/title.png differ diff --git a/satty/config.toml b/satty/config.toml new file mode 100644 index 0000000..758a24f --- /dev/null +++ b/satty/config.toml @@ -0,0 +1,25 @@ +[general] +fullscreen = false +early-exit = false +initial-tool = "brush" +copy-command = "wl-copy" +annotation-size-factor = 2 +output-filename = "/tmp/test-%Y-%m-%d_%H:%M:%S.png" +save-after-copy = false +default-hide-toolbars = false +disable-notifications = true + +[font] +family = "JetBrainsMono Nerd Font" +style = "Regular" + +[color-palette] + +palette = [ + "#8aadf4", # Blue + "#ed8796", # Red + "#a6da95", # Green + "#eed49f", # Yellow + "#c6a0f6", # Mauve + "#cad3f5", # White +] diff --git a/swaylock b/swaylock new file mode 160000 index 0000000..77246bb --- /dev/null +++ b/swaylock @@ -0,0 +1 @@ +Subproject commit 77246bbbbf8926bdb8962cffab6616bc2b9e8a06 diff --git a/swaync/.github/README.md b/swaync/.github/README.md new file mode 100644 index 0000000..affa9d5 --- /dev/null +++ b/swaync/.github/README.md @@ -0,0 +1,3 @@ +
+ +
diff --git a/swaync/.github/title.png b/swaync/.github/title.png new file mode 100644 index 0000000..76cc263 Binary files /dev/null and b/swaync/.github/title.png differ diff --git a/swaync/config.json b/swaync/config.json new file mode 100644 index 0000000..8905a59 --- /dev/null +++ b/swaync/config.json @@ -0,0 +1,82 @@ +{ + "$schema": "/etc/xdg/swaync/configSchema.json", + "positionX": "right", + "positionY": "bottom", + "layer": "top", + "cssPriority": "user", + "control-center-margin-top": 0, + "control-center-margin-bottom": 0, + "control-center-margin-right": 0, + "control-center-margin-left": 0, + "notification-icon-size": 100, + "notification-body-image-height": 100, + "notification-body-image-width": 200, + "timeout": 10, + "timeout-low": 5, + "timeout-critical": 0, + "fit-to-screen": true, + "control-center-width": 450, + "control-center-height": 600, + "notification-window-width": 400, + "keyboard-shortcuts": true, + "image-visibility": "when-available", + "transition-time": 200, + "hide-on-clear": false, + "hide-on-action": true, + "widgets": ["title", "notifications", "mpris"], + "widget-config": { + "title": { + "text": "Notifications", + "clear-all-button": true, + "button-text": "Clear All" + }, + "dnd": { + "text": "Do Not Disturb" + }, + "label": { + "max-lines": 1, + "text": "Notification Center" + }, + "mpris": { + "image-size": 96, + "image-radius": 12, + "blur": false + }, + "buttons-grid": { + "actions": [ + { + "label": "󰐥", + "command": "systemctl poweroff" + }, + { + "label": "󰜉", + "command": "systemctl reboot" + }, + { + "label": "󰌾", + "command": "$HOME/.config/sway/lock.sh" + }, + { + "label": "󰍃", + "command": "swaymsg exit" + }, + { + "label": "󰏥", + "command": "systemctl suspend" + }, + { + "label": "󰛳", + "command": "nm-connection-editor" + }, + { + "label": "󰂯", + "command": "blueman-manager" + }, + { + "label": "", + "command": "kooha" + } + ] + } + } +} diff --git a/swaync/style.css b/swaync/style.css new file mode 100644 index 0000000..7c43daa --- /dev/null +++ b/swaync/style.css @@ -0,0 +1,377 @@ +@define-color cc-bg rgba(0, 0, 0, 1); +@define-color noti-border-color rgba(255, 255, 255, 0.15); +@define-color noti-bg #24273a; +@define-color noti-bg-darker #363a4f; +@define-color noti-bg-hover rgb(27, 27, 43); +@define-color noti-bg-focus rgba(27, 27, 27, 0.6); +@define-color noti-close-bg rgba(255, 255, 255, 0.1); +@define-color noti-close-bg-hover rgba(255, 255, 255, 0.15); +@define-color text-color #cad3f5; + +* { + all: unset; + font-size: 14px; + font-family: "JetBrainsMono NF"; + transition: 200ms; +} + +.widget-mpris { + background: linear-gradient(to right, #363a4f, rgba(183, 189, 248, 0.3)); + + padding: 10px; + border-radius: 10px; +} + +.widget-mpris-player { + padding: 8px; + margin: 8px; +} + +.widget-mpris-title { + font-weight: 700; + font-size: 1.25rem; +} + +.widget-mpris-subtitle { + font-size: 1.1rem; +} + +.widget-buttons-grid { + font-size: x-large; + padding: 8px; + margin-top: 10px; + border-radius: 10px; +} + +.widget-buttons-grid > flowbox > flowboxchild > button { + margin: 3px; + background: #494d64; + border-radius: 6px; + color: #cad3f5; +} + +.widget-buttons-grid > flowbox > flowboxchild > button:hover { + background: #6e738d; +} + +.floating-notifications.background .notification-row .notification-background { + box-shadow: + 0 0 8px 0 rgba(0, 0, 0, 0.8), + inset 0 0 0 1px #363a4f; + border-radius: 10px; + margin: 8px; + background-color: #24273a; + color: #cad3f5; + border: 2px solid rgba(183, 189, 248, 0.5); + padding: 0; +} + +.floating-notifications.background + .notification-row + .notification-background + .notification { + padding: 7px; + border-radius: 10px; +} + +.floating-notifications.background + .notification-row + .notification-background + .notification.critical { + box-shadow: inset 0 0 7px 0 #ed8796; +} + +.floating-notifications.background + .notification-row + .notification-background + .notification + .notification-content { + margin: 7px; +} + +.floating-notifications.background + .notification-row + .notification-background + .notification + .notification-content + .summary { + color: #cad3f5; +} + +.floating-notifications.background + .notification-row + .notification-background + .notification + .notification-content + .time { + color: #a5adcb; +} + +.floating-notifications.background + .notification-row + .notification-background + .notification + .notification-content + .body { + color: #cad3f5; +} + +.floating-notifications.background + .notification-row + .notification-background + .notification + > *:last-child + > * { + min-height: 2.5em; +} + +.floating-notifications.background + .notification-row + .notification-background + .notification + > *:last-child + > * + .notification-action { + border-radius: 7px; + color: #cad3f5; + background-color: #363a4f; + box-shadow: inset 0 0 0 1px #494d64; + margin: 7px; +} + +.floating-notifications.background + .notification-row + .notification-background + .notification + > *:last-child + > * + .notification-action:hover { + box-shadow: inset 0 0 0 1px #494d64; + background-color: #363a4f; + color: #cad3f5; +} + +.floating-notifications.background + .notification-row + .notification-background + .notification + > *:last-child + > * + .notification-action:active { + box-shadow: inset 0 0 0 1px #494d64; + background-color: #7dc4e4; + color: #cad3f5; +} + +.floating-notifications.background + .notification-row + .notification-background + .close-button { + margin: 7px; + padding: 2px; + border-radius: 6.3px; + color: #24273a; + background-color: #ed8796; +} + +.floating-notifications.background + .notification-row + .notification-background + .close-button:hover { + background-color: #ee99a0; + color: #24273a; +} + +.floating-notifications.background + .notification-row + .notification-background + .close-button:active { + background-color: #ed8796; + color: #24273a; +} + +.control-center { + box-shadow: + 0 0 8px 0 rgba(0, 0, 0, 0.8), + inset 0 0 0 1px #363a4f; + border-radius: 10px; + margin: 18px; + background-color: #24273a; + color: #cad3f5; + border: 2px solid rgba(183, 189, 248, 0.5); + padding: 14px; +} + +.control-center .widget-title { + color: #cad3f5; + font-size: 1.3em; +} + +.control-center .widget-title button { + border-radius: 7px; + color: #cad3f5; + background-color: #363a4f; + box-shadow: inset 0 0 0 1px #494d64; + padding: 8px; +} + +.control-center .widget-title button:hover { + box-shadow: inset 0 0 0 1px #494d64; + background-color: #5b6078; + color: #cad3f5; +} + +.control-center .widget-title button:active { + box-shadow: inset 0 0 0 1px #494d64; + background-color: #7dc4e4; + color: #24273a; +} + +.control-center .notification-row .notification-background { + border-radius: 7px; + color: #cad3f5; + background-color: #363a4f; + box-shadow: inset 0 0 0 1px #494d64; + margin-top: 10px; +} + +.control-center .notification-row .notification-background .notification { + padding: 7px; + border-radius: 7px; +} + +.control-center + .notification-row + .notification-background + .notification.critical { + box-shadow: inset 0 0 7px 0 #ed8796; +} + +.control-center + .notification-row + .notification-background + .notification + .notification-content { + margin: 7px; +} + +.control-center + .notification-row + .notification-background + .notification + .notification-content + .summary { + color: #cad3f5; +} + +.control-center + .notification-row + .notification-background + .notification + .notification-content + .time { + color: #a5adcb; +} + +.control-center + .notification-row + .notification-background + .notification + .notification-content + .body { + color: #cad3f5; +} + +.control-center + .notification-row + .notification-background + .notification + > *:last-child + > * { + min-height: 2.5em; +} + +.control-center + .notification-row + .notification-background + .notification + > *:last-child + > * + .notification-action { + border-radius: 7px; + color: #cad3f5; + background-color: #494d64; + box-shadow: inset 0 0 0 1px #494d64; + margin: 7px; +} + +.control-center + .notification-row + .notification-background + .notification + > *:last-child + > * + .notification-action:hover { + box-shadow: inset 0 0 0 1px #494d64; + background-color: #5b6078; + color: #cad3f5; +} + +.control-center + .notification-row + .notification-background + .notification + > *:last-child + > * + .notification-action:active { + box-shadow: inset 0 0 0 1px #494d64; + background-color: #7dc4e4; + color: #cad3f5; +} + +.control-center .notification-row .notification-background .close-button { + margin: 7px; + padding: 2px; + border-radius: 6.3px; + color: #24273a; + background-color: #ee99a0; +} + +.control-center .notification-row .notification-background .close-button:hover { + background-color: #ed8796; + color: #24273a; +} + +.control-center + .notification-row + .notification-background + .close-button:active { + background-color: #ed8796; + color: #24273a; +} + +.control-center .notification-row .notification-background:hover { + box-shadow: inset 0 0 0 1px #494d64; + background-color: #8087a2; + color: #cad3f5; +} + +.control-center .notification-row .notification-background:active { + box-shadow: inset 0 0 0 1px #494d64; + background-color: #7dc4e4; + color: #cad3f5; +} + +.notification-row + .notification-background + .notification + .notification-default-action + .notification-content + .image { + /* Notification Primary Image */ + -gtk-icon-effect: none; + border-radius: 10px; + /* Size in px */ + margin: 4px; + margin-right: 20px; +} diff --git a/tmux/.github/README.md b/tmux/.github/README.md new file mode 100644 index 0000000..ef8c9ec --- /dev/null +++ b/tmux/.github/README.md @@ -0,0 +1,22 @@ +
+ +
+ +
+ +
+ +
+ +
+ + + + + +
+ +
+ +> [!NOTE] +> All the information about the tmux setup is on the documentation website: https://dotfiles-docs.vercel.app/app-confs/tmux.html diff --git a/tmux/.github/overview-1.png b/tmux/.github/overview-1.png new file mode 100644 index 0000000..26129ce Binary files /dev/null and b/tmux/.github/overview-1.png differ diff --git a/tmux/.github/overview-2.png b/tmux/.github/overview-2.png new file mode 100644 index 0000000..27da51d Binary files /dev/null and b/tmux/.github/overview-2.png differ diff --git a/tmux/.github/overview-3.png b/tmux/.github/overview-3.png new file mode 100644 index 0000000..3ac7052 Binary files /dev/null and b/tmux/.github/overview-3.png differ diff --git a/tmux/.github/title.png b/tmux/.github/title.png new file mode 100644 index 0000000..7d83e1e Binary files /dev/null and b/tmux/.github/title.png differ diff --git a/tmux/conf/binds.conf b/tmux/conf/binds.conf new file mode 100644 index 0000000..955d576 --- /dev/null +++ b/tmux/conf/binds.conf @@ -0,0 +1,57 @@ +# Set new prefix (Alt+Space) +unbind C-b +set -g prefix M-Space +bind Space send-prefix + +# Config reload +bind C-r source-file ~/.config/tmux/tmux.conf \; display-message "tmux.conf reloaded" + +# Vim mode +setw -g mode-keys vi +set -g status-keys vi + +bind 'v' copy-mode +bind -T copy-mode-vi v send -X begin-selection +bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "wl-copy" +bind p paste-buffer +bind -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "wl-copy" + +# Split windows +bind | split-window -hc "#{pane_current_path}" +bind-key "\\" split-window -fh -c "#{pane_current_path}" +bind - split-window -vc "#{pane_current_path}" + +# Maintain the same path when creating a new window +bind c new-window -c "#{pane_current_path}" +bind-key C command-prompt -p "Enter window name:" "new-window -n '%%'" + +# Move to the next and prev window +bind-key l next-window +bind-key h previous-window + +bind-key -n C-M-l next-window +bind-key -n C-M-h previous-window + +# Change window name +bind-key r command-prompt -I "#W" "rename-window '%%'" +bind-key R command-prompt -I "#W" "rename-session '%%'" + +# Move to the next and prev session +bind j switch-client -n +bind k switch-client -p + +# Close a window +bind-key Q kill-window + +# Close a pane +bind-key q kill-pane + +# Close a session +bind-key M-q kill-session + +# Swap windows +bind -r "<" swap-window -d -t -1 +bind -r ">" swap-window -d -t +1 + +# Projects +bind-key Enter popup -E -h 80% -w 80% "dev" diff --git a/tmux/conf/options.conf b/tmux/conf/options.conf new file mode 100644 index 0000000..bf9164a --- /dev/null +++ b/tmux/conf/options.conf @@ -0,0 +1,31 @@ +# Enable mouse +set -g mouse on + +# Theming and layout +set -g default-terminal "${TERM}" +set -g status-position top +set -as terminal-overrides ',*:Smulx=\E[4::%p1%dm' +set -as terminal-overrides ',*:Setulc=\E[58::2::%p1%{65536}%/%d::%p1%{256}%/%{255}%&%d::%p1%{255}%&%d%;m' + +# Windows and panes +set -g base-index 1 +setw -g pane-base-index 1 +set-window-option -g pane-base-index 1 +set-option -g renumber-windows 1 +setw -g aggressive-resize on + +# Shell +set-option -g default-shell $SHELL +set-option -g default-command $SHELL + +# Environment +set-environment -g TMUX_DATA_DIR "${HOME}/.local/share/tmux" + +# Ohers +set -g history-limit 100000 +set-option -g lock-after-time 0 +set -s escape-time 0 +set -g set-titles on +set -g allow-passthrough on +set -ga update-environment TERM +set -ga update-environment TERM_PROGRAM diff --git a/tmux/conf/plugins.conf b/tmux/conf/plugins.conf new file mode 100644 index 0000000..a543a9e --- /dev/null +++ b/tmux/conf/plugins.conf @@ -0,0 +1,61 @@ +# Plugins Declaration +set -g @plugin 'tmux-plugins/tpm' +set -g @plugin 'tmux-plugins/tmux-sensible' +set -g @plugin 'catppuccin/tmux#v0.3.0' +set -g @plugin 'omerxx/tmux-sessionx' +set -g @plugin 'wfxr/tmux-fzf-url' +set -g @plugin 'omerxx/tmux-floax' +set -g @plugin 'mrjones2014/smart-splits.nvim' + +# Plugin Options +# Catppuccin +set -g @catppuccin_directory_text "#{pane_current_path}" +set -g @catppuccin_window_current_text "#{window_name}" +set -g @catppuccin_window_default_text "#{window_name}" +set -g @catppuccin_flavor 'macchiato' + +set -g @catppuccin_window_left_separator "█" +set -g @catppuccin_window_right_separator "█" +set -g @catppuccin_window_number_position "right" +set -g @catppuccin_window_middle_separator " █" +set -g @catppuccin_window_default_fill "number" +set -g @catppuccin_window_current_background "#{thm_gray}" + +set -g @catppuccin_status_modules_right "directory user host" +set -g @catppuccin_status_modules_left "session" +set -g @catppuccin_status_left_separator "█" +set -g @catppuccin_status_right_separator "" +set -g @catppuccin_status_fill "all" +set -g @catppuccin_status_connect_separator "yes" + +# Sessionx +set -g @sessionx-bind 'space' +set -g @sessionx-filter-current 'true' +set -g @sessionx-preview-location 'top' +set -g @sessionx-preview-ratio '65%' +set -g @sessionx-window-height '80%' +set -g @sessionx-window-width '75%' +set -g @sessionx-tmuxinator-mode 'on' +set -g @sessionx-bind-window-mode 'alt-w' +set -g @sessionx-bind-tree-mode 'alt-t' +set -g @sessionx-bind-new-window 'alt-c' +set -g @sessionx-bind-rename-session 'alt-r' +set -g @sessionx-bind-kill-session 'alt-q' +set -g @sessionx-bind-configuration-path 'alt-e' +set -g @sessionx-bind-back 'alt-b' +set -g @sessionx-ls-command 'eza -a --icons --group-directories-first --color always' +set -g @sessionx-filtered-sessions 'scratch' + +# fzf-url +set -g @fzf-url-bind 'u' + +# Floax +set -g @floax-bind '-n M-p' +set -g @floax-border-color 'white' +set -g @floax-text-color 'white' + +# smart-splits +set -g @smart-splits_resize_left_key 'C-left' +set -g @smart-splits_resize_down_key 'C-down' +set -g @smart-splits_resize_up_key 'C-up' +set -g @smart-splits_resize_right_key 'C-right' diff --git a/tmux/tmux.conf b/tmux/tmux.conf new file mode 100644 index 0000000..290f6f2 --- /dev/null +++ b/tmux/tmux.conf @@ -0,0 +1,11 @@ +# Import +source-file ~/.config/tmux/conf/plugins.conf +source-file ~/.config/tmux/conf/binds.conf +source-file ~/.config/tmux/conf/options.conf + +run '~/.config/tmux/plugins/tpm/tpm' + +# Padding for the status bar (Need to put it here to work correctly) +set -Fg 'status-format[1]' '#{status-format[0]}' +set -g 'status-format[1]' '' +set -g status 2 diff --git a/tmuxp/.github/README.md b/tmuxp/.github/README.md new file mode 100644 index 0000000..affa9d5 --- /dev/null +++ b/tmuxp/.github/README.md @@ -0,0 +1,3 @@ +
+ +
diff --git a/tmuxp/.github/title.png b/tmuxp/.github/title.png new file mode 100644 index 0000000..6753012 Binary files /dev/null and b/tmuxp/.github/title.png differ diff --git a/tmuxp/default.yaml b/tmuxp/default.yaml new file mode 100644 index 0000000..6965887 --- /dev/null +++ b/tmuxp/default.yaml @@ -0,0 +1,5 @@ +windows: + - window_name: editor + panes: + - shell_command: + - nvim diff --git a/tmuxp/web-node.yaml b/tmuxp/web-node.yaml new file mode 100644 index 0000000..6e0e074 --- /dev/null +++ b/tmuxp/web-node.yaml @@ -0,0 +1,10 @@ +windows: + - window_name: editor + panes: + - shell_command: + - nvim + - window_name: service + panes: + - shell_command: + - mise run serve + # - pnpm run serve diff --git a/tmuxp/web-static.yaml b/tmuxp/web-static.yaml new file mode 100644 index 0000000..0e29484 --- /dev/null +++ b/tmuxp/web-static.yaml @@ -0,0 +1,9 @@ +windows: + - window_name: editor + panes: + - shell_command: + - nvim + - window_name: service + panes: + - shell_command: + - five-server diff --git a/user-dirs.dirs b/user-dirs.dirs new file mode 100644 index 0000000..6f1a1bb --- /dev/null +++ b/user-dirs.dirs @@ -0,0 +1,16 @@ +# This file is written by xdg-user-dirs-update +# If you want to change or add directories, just edit the line you're +# interested in. All local changes will be retained on the next run. +# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped +# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an +# absolute path. No other format is supported. +# +XDG_DESKTOP_DIR="$HOME/desktop" +XDG_DOCUMENTS_DIR="$HOME/documents" +XDG_DOWNLOAD_DIR="$HOME/downloads" +XDG_MUSIC_DIR="$HOME/" +XDG_PICTURES_DIR="$HOME/" +XDG_PUBLICSHARE_DIR="$HOME/" +XDG_TEMPLATES_DIR="$HOME/" +XDG_VIDEOS_DIR="$HOME/" +XDG_GAMES_DIR="$HOME/games" diff --git a/waybar/.github/README.md b/waybar/.github/README.md new file mode 100644 index 0000000..affa9d5 --- /dev/null +++ b/waybar/.github/README.md @@ -0,0 +1,3 @@ +
+ +
diff --git a/waybar/.github/title.png b/waybar/.github/title.png new file mode 100644 index 0000000..51b9648 Binary files /dev/null and b/waybar/.github/title.png differ diff --git a/waybar/bars/bar-1.jsonc b/waybar/bars/bar-1.jsonc new file mode 100644 index 0000000..62c5968 --- /dev/null +++ b/waybar/bars/bar-1.jsonc @@ -0,0 +1,30 @@ +{ + "include": [ + "~/.config/waybar/modules/custom-cava.jsonc", + "~/.config/waybar/modules/custom-wf-recorder.jsonc", + "~/.config/waybar/modules/custom-updates.jsonc", + "~/.config/waybar/modules/custom-music.jsonc", + "~/.config/waybar/modules/custom-logo.jsonc", + "~/.config/waybar/modules/custom-notifications.jsonc", + "~/.config/waybar/modules/custom-weather.jsonc", + "~/.config/waybar/modules/hyprland-language.jsonc", + "~/.config/waybar/modules/hyprland-workspaces.jsonc", + "~/.config/waybar/modules/clock-1.jsonc", + "~/.config/waybar/modules/pulseaudio.jsonc", + ], + "modules-left": [ + "custom/arch", + "hyprland/workspaces", + "custom/cava", + "custom/wf-recorder", + ], + "modules-center": ["custom/music"], + "modules-right": [ + "custom/updates", + "hyprland/language", + "custom/weather", + "clock#cl1", + "pulseaudio", + "custom/notifications", + ], +} diff --git a/waybar/bars/bar-2.jsonc b/waybar/bars/bar-2.jsonc new file mode 100644 index 0000000..f0db478 --- /dev/null +++ b/waybar/bars/bar-2.jsonc @@ -0,0 +1,25 @@ +{ + "include": [ + "~/.config/waybar/modules/cpu.jsonc", + "~/.config/waybar/modules/memory.jsonc", + "~/.config/waybar/modules/custom-gpu-usage.jsonc", + "~/.config/waybar/modules/temperature-gpu.jsonc", + "~/.config/waybar/modules/temperature-cpu.jsonc", + "~/.config/waybar/modules/custom-logo.jsonc", + "~/.config/waybar/modules/custom-notifications.jsonc", + "~/.config/waybar/modules/hyprland-window.jsonc", + "~/.config/waybar/modules/hyprland-workspaces.jsonc", + "~/.config/waybar/modules/network.jsonc", + ], + "modules-left": ["custom/arch", "hyprland/workspaces"], + "modules-center": ["hyprland/window"], + "modules-right": [ + "network", + "memory", + "cpu", + "temperature#cpu", + "custom/gpu-usage", + "temperature#gpu", + "custom/notifications", + ], +} diff --git a/waybar/bars/bar-3.jsonc b/waybar/bars/bar-3.jsonc new file mode 100644 index 0000000..7ff5089 --- /dev/null +++ b/waybar/bars/bar-3.jsonc @@ -0,0 +1,12 @@ +{ + "include": [ + "~/.config/waybar/modules/clock-2.jsonc", + "~/.config/waybar/modules/custom-logo.jsonc", + "~/.config/waybar/modules/custom-notifications.jsonc", + "~/.config/waybar/modules/hyprland-workspaces.jsonc", + "~/.config/waybar/modules/tray.jsonc", + ], + "modules-left": ["custom/arch", "hyprland/workspaces"], + "modules-center": ["clock#cl2"], + "modules-right": ["tray", "custom/notifications"], +} diff --git a/waybar/bars/main.jsonc b/waybar/bars/main.jsonc new file mode 100644 index 0000000..e608a1a --- /dev/null +++ b/waybar/bars/main.jsonc @@ -0,0 +1,33 @@ + +{ + "include": [ + "~/.config/waybar/modules/custom-logo.jsonc", + "~/.config/waybar/modules/custom-notifications.jsonc", + "~/.config/waybar/modules/clock-1.jsonc", + "~/.config/waybar/modules/pulseaudio.jsonc", + "~/.config/waybar/modules/cpu.jsonc", + "~/.config/waybar/modules/memory.jsonc", + "~/.config/waybar/modules/temperature.cpu.jsonc", + "~/.config/waybar/modules/battery.jsonc", + "~/.config/waybar/modules/network.jsonc", + "~/.config/waybar/modules/wireguard.jsonc", + "~/.config/waybar/modules/docker.jsonc", + ], + "modules-left": [ + "custom/arch", + "clock#cl1", + ], + "modules-center": [ + "cpu", + "memory", + "temperature#cpu", + "battery", + ], + "modules-right": [ + "custom/docker", + "custom/wireguard", + "network", + "pulseaudio", + "custom/notifications", + ], +} diff --git a/waybar/config.jsonc b/waybar/config.jsonc new file mode 100644 index 0000000..eb8cd64 --- /dev/null +++ b/waybar/config.jsonc @@ -0,0 +1,16 @@ +[ + { + "include": "~/.config/waybar/bars/main.jsonc", + "height": 50, + "layer": "top", + "output": "eDP-1", + "mode": "dock", + "exclusive": true, + "passtrough": false, + "gtk-layer-shell": true, + "margin-top": 5, + "margin-left": 5, + "margin-bottom": 0, + "margin-right": 5, + }, +] diff --git a/waybar/modules/backlight.jsonc b/waybar/modules/backlight.jsonc new file mode 100644 index 0000000..486975b --- /dev/null +++ b/waybar/modules/backlight.jsonc @@ -0,0 +1,9 @@ +{ + "backlight": { + "device": "intel_backlight", + "format": "{percent}% {icon}", + "format-icons": ["", "", "", "", "", "", "", "", ""], + "on-scroll-up": "swayosd-client --brightness +10", + "on-scroll-down": "swayosd-client --brightness -10", + }, +} diff --git a/waybar/modules/battery.jsonc b/waybar/modules/battery.jsonc new file mode 100644 index 0000000..5d06740 --- /dev/null +++ b/waybar/modules/battery.jsonc @@ -0,0 +1,15 @@ +{ + "battery": { + "format": "{capacity}% {icon}", + "format-charging": " {capacity}%", + "format-plugged": " {capacity}%", + "format-alt": "{time} {icon}", + "format-icons": ["󰂎", "󰁺", "󰁻", "󰁼", "󰁽", "󰁾", "󰁿", "󰂀", "󰂁", "󰂂", "󰁹"], + "interval": 5, + "states": { + "warning": 30, + "critical": 10, + }, + "tooltip": false, + }, +} diff --git a/waybar/modules/bluetooth.jsonc b/waybar/modules/bluetooth.jsonc new file mode 100644 index 0000000..2941011 --- /dev/null +++ b/waybar/modules/bluetooth.jsonc @@ -0,0 +1,14 @@ +{ + "bluetooth": { + "format": "", + "format-disabled": "", + "format-connected": " {num_connections}", + "format-connected-battery": "{icon} {num_connections}", + "format-icons": ["󰥇", "󰤾", "󰤿", "󰥀", "󰥁", "󰥂", "󰥃", "󰥄", "󰥅", "󰥆", "󰥈"], + "tooltip-format": "{controller_alias}\n{num_connections} connected", + "tooltip-format-connected": "{controller_alias}\n{num_connections} connected\n\n{device_enumerate}", + "tooltip-format-enumerate-connected": "{device_alias}", + "tooltip-format-enumerate-connected-battery": "{device_alias}\t{icon} {device_battery_percentage}%", + "on-click": "pypr toggle bluetooth", + }, +} diff --git a/waybar/modules/clock-1.jsonc b/waybar/modules/clock-1.jsonc new file mode 100644 index 0000000..5cfcdf1 --- /dev/null +++ b/waybar/modules/clock-1.jsonc @@ -0,0 +1,30 @@ +{ + "clock#cl1": { + "tooltip-format": "{calendar}", + "calendar": { + "mode": "month", + "mode-mon-col": 3, + "weeks-pos": "right", + "on-scroll": 1, + "on-click-right": "mode", + "format": { + "months": "{}", + "days": "{}", + "weeks": "W{}", + "weekdays": "{}", + "today": "{}", + }, + }, + "interval": 1, + "format": "{:%H:%M:%OS}  ", + "format-alt": "{:%A, %B %d, %Y}  ", + "actions": { + "on-click-right": "mode", + "on-click-forward": "tz_up", + "on-click-backward": "tz_down", + "on-scroll-up": "shift_up", + "on-scroll-down": "shift_down", + }, + "on-click-middle": "thunderbird -calendar && hyprctl dispatch workspace 23", + }, +} diff --git a/waybar/modules/clock-2.jsonc b/waybar/modules/clock-2.jsonc new file mode 100644 index 0000000..27a6d70 --- /dev/null +++ b/waybar/modules/clock-2.jsonc @@ -0,0 +1,28 @@ +{ + "clock#cl2": { + "tooltip-format": "{calendar}", + "calendar": { + "mode": "year", + "mode-mon-col": 3, + "weeks-pos": "right", + "on-scroll": 1, + "on-click-right": "mode", + "format": { + "months": "{}", + "days": "{}", + "weeks": "W{}", + "weekdays": "{}", + "today": "{}", + }, + }, + "format": "{:%H:%M  - %A, %B %d, %Y  }", + "actions": { + "on-click-right": "mode", + "on-click-forward": "tz_up", + "on-click-backward": "tz_down", + "on-scroll-up": "shift_up", + "on-scroll-down": "shift_down", + }, + "on-click-middle": "thunderbird -calendar && hyprctl dispatch workspace 23", + }, +} diff --git a/waybar/modules/cpu.jsonc b/waybar/modules/cpu.jsonc new file mode 100644 index 0000000..82ea49d --- /dev/null +++ b/waybar/modules/cpu.jsonc @@ -0,0 +1,8 @@ +{ + "cpu": { + "on-click": "pypr toggle btop", + "format": "CPU: {usage}%", + "tooltip": false, + "interval": 2, + }, +} diff --git a/waybar/modules/custom-cava.jsonc b/waybar/modules/custom-cava.jsonc new file mode 100644 index 0000000..6464257 --- /dev/null +++ b/waybar/modules/custom-cava.jsonc @@ -0,0 +1,19 @@ +{ + "custom/cava": { + "exec": "~/.config/waybar/scripts/cava.sh", + "format": "{}", + "format-icons": [ + "", + "", + "", + "", + "", + "", + "", + "", + ], + "on-click": "kitty --class center-float-mini cava", + "on-click-right": "qpwgraph", + "on-click-middle": "easyeffects", + }, +} diff --git a/waybar/modules/custom-gpu-usage.jsonc b/waybar/modules/custom-gpu-usage.jsonc new file mode 100644 index 0000000..f151e49 --- /dev/null +++ b/waybar/modules/custom-gpu-usage.jsonc @@ -0,0 +1,9 @@ +{ + "custom/gpu-usage": { + "exec": "cat /sys/class/hwmon/hwmon4/device/gpu_busy_percent", + "on-click": "pypr toggle nvtop", + "format": "GPU: {}%", + "return-type": "", + "interval": 2, + }, +} diff --git a/waybar/modules/custom-logo.jsonc b/waybar/modules/custom-logo.jsonc new file mode 100644 index 0000000..37b6f2e --- /dev/null +++ b/waybar/modules/custom-logo.jsonc @@ -0,0 +1,8 @@ +{ + "custom/arch": { + "format": "  ", + "tooltip": false, + "on-click": "sleep 0.1 && rofi -show drun", + "on-click-right": "~/.config/rofi/scripts/powermenu/powermenu", + }, +} diff --git a/waybar/modules/custom-music.jsonc b/waybar/modules/custom-music.jsonc new file mode 100644 index 0000000..9032612 --- /dev/null +++ b/waybar/modules/custom-music.jsonc @@ -0,0 +1,13 @@ +{ + "custom/music": { + "format": "{0}", + "return-type": "json", + "max-length": 100, + "escape": true, + "tooltip": true, + "exec": "~/.config/waybar/scripts/mediaplayer.py --player spotify", + "on-click": "playerctl play-pause", + "on-scroll-up": "playerctl next", + "on-scroll-down": "playerctl previous", + }, +} diff --git a/waybar/modules/custom-notifications.jsonc b/waybar/modules/custom-notifications.jsonc new file mode 100644 index 0000000..06486a5 --- /dev/null +++ b/waybar/modules/custom-notifications.jsonc @@ -0,0 +1,22 @@ +{ + "custom/notifications": { + "tooltip": false, + "format": "{} {icon}", + "format-icons": { + "notification": "", + "none": "", + "dnd-notification": "", + "dnd-none": "", + "inhibited-notification": "", + "inhibited-none": "", + "dnd-inhibited-notification": "", + "dnd-inhibited-none": "", + }, + "return-type": "json", + "exec-if": "which swaync-client", + "exec": "swaync-client -swb", + "on-click": "sleep 0.1 && swaync-client -t -sw", + "on-click-right": "swaync-client -d -sw", + "escape": true, + }, +} diff --git a/waybar/modules/custom-updates.jsonc b/waybar/modules/custom-updates.jsonc new file mode 100644 index 0000000..b6c13c9 --- /dev/null +++ b/waybar/modules/custom-updates.jsonc @@ -0,0 +1,15 @@ +{ + "custom/updates": { + "format": "{} {icon}", + "return-type": "json", + "tooltip": true, + "format-icons": { + "pending-updates": " ", + "updated": " ", + }, + "exec-if": "which waybar-updates", + "exec": "waybar-updates", + "on-click": "pypr toggle topgrade-system", + "on-click-right": "pypr toggle topgrade-all", + }, +} diff --git a/waybar/modules/custom-weather.jsonc b/waybar/modules/custom-weather.jsonc new file mode 100644 index 0000000..2ee5f38 --- /dev/null +++ b/waybar/modules/custom-weather.jsonc @@ -0,0 +1,13 @@ +{ + "custom/weather": { + "exec-if": "which wttrbar", + "exec": "wttrbar --location Alicante", + "restart-interval": 300, + "tooltip": true, + "format": "{}°", + "return-type": "json", + "on-click": "kitty --hold --class center-float fish -c 'wttr Alicante'", + "on-click-right": "kitty --hold --class center-float fish -c 'wttr -v2 Alicante'", + "on-click-middle": "xdg-open https://wttr.in/alicante", + }, +} diff --git a/waybar/modules/custom-wf-recorder.jsonc b/waybar/modules/custom-wf-recorder.jsonc new file mode 100644 index 0000000..b006183 --- /dev/null +++ b/waybar/modules/custom-wf-recorder.jsonc @@ -0,0 +1,11 @@ +{ + "custom/wf-recorder": { + "format": "{}", + "interval": "once", + "exec": "echo ''", + "tooltip": "false", + "exec-if": "pgrep 'wf-recorder'", + "on-click": "exec $HOME/.config/hypr/scripts/rofi/recording", + "signal": 8, + }, +} diff --git a/waybar/modules/docker.jsonc b/waybar/modules/docker.jsonc new file mode 100644 index 0000000..d4e1ffd --- /dev/null +++ b/waybar/modules/docker.jsonc @@ -0,0 +1,12 @@ +{ + "custom/docker": { + //"exec-if": "which wg", + "exec": "/home/timo/.config/waybar/scripts/get_docker_status.sh", + "return-type": "json", + "format": " {}", + "interval": 5, + "tooltip": "true", + //"on-click": "pypr toggle network", + //"on-click-right": "pypr toggle wifi", + }, +} diff --git a/waybar/modules/hyprland-language.jsonc b/waybar/modules/hyprland-language.jsonc new file mode 100644 index 0000000..900392f --- /dev/null +++ b/waybar/modules/hyprland-language.jsonc @@ -0,0 +1,8 @@ +{ + "hyprland/language": { + "format": "{}", + "format-en": " US", + "format-es": " ES", + "on-click": "hyprctl switchxkblayout evision-usb-device next", + }, +} diff --git a/waybar/modules/hyprland-window.jsonc b/waybar/modules/hyprland-window.jsonc new file mode 100644 index 0000000..5957ddb --- /dev/null +++ b/waybar/modules/hyprland-window.jsonc @@ -0,0 +1,14 @@ +{ + "hyprland/window": { + "format": "{}", + "max-length": 80, + "rewrite": { + "(.*) — Mozilla Firefox": "$1 󰇧", + "(.*) — Ablaze Floorp": "$1 󰇧", + "(.*)VSCodium": "Codium 󰨞", + "(.*)Spotify": "Spotify 󰓇", + "(.*)Steam": "Steam 󰓓", + }, + "separate-outputs": false, + }, +} diff --git a/waybar/modules/hyprland-workspaces.jsonc b/waybar/modules/hyprland-workspaces.jsonc new file mode 100644 index 0000000..3a62dba --- /dev/null +++ b/waybar/modules/hyprland-workspaces.jsonc @@ -0,0 +1,42 @@ +{ + "hyprland/workspaces": { + "disable-scroll": true, + "active-only": false, + "all-outputs": false, + "enable-bar-scroll": true, + "format": "{icon}", + "format-icons": { + "1": "󰇧", + "2": "", + "3": "", + "4": "", + "5": "🎜", + "6": "", + "7": "", + "8": "", + "9": "", + "10": "󰇧", + "11": "", + "12": "", + "13": "", + "14": "🎜", + "15": "", + "16": "", + "17": "", + "18": "", + "19": "", + "20": "󰍨", + "21": "✉", + "22": "🖵", + "23": "󰇧", + "24": "", + "25": "", + "26": "", + "27": "", + }, + "on-scroll-up": "hyprctl dispatch workspace r-1", + "on-scroll-down": "hyprctl dispatch workspace r+1", + "on-click": "activate", + "sort-by-number": true, + }, +} diff --git a/waybar/modules/memory.jsonc b/waybar/modules/memory.jsonc new file mode 100644 index 0000000..3edb32c --- /dev/null +++ b/waybar/modules/memory.jsonc @@ -0,0 +1,8 @@ +{ + "memory": { + "format": "{}%  ", + "on-click": "pypr toggle btop", + "tooltip": true, + "interval": 2, + }, +} diff --git a/waybar/modules/network.jsonc b/waybar/modules/network.jsonc new file mode 100644 index 0000000..ad7916f --- /dev/null +++ b/waybar/modules/network.jsonc @@ -0,0 +1,14 @@ +{ + "network": { + "format-wifi": " {essid}", + "format-ethernet": "󰈀 {ifname}", + "tooltip-format-wifi": "Network: {essid}\nSignal strength: {signaldBm}dBm ({signalStrength}%)\nFrequency: {frequency}MHz\nInterface: {ifname}\nIP: {ipaddr}/{cidr}\nGateway: {gwaddr}\nNetmask: {netmask}\n {bandwidthDownBytes}  {bandwidthUpBytes}", + "tooltip-format-ethernet": "Network: {essid}\nInterface: {ifname}\nIP: {ipaddr}/{cidr}\nGateway: {gwaddr}\nNetmask: {netmask}\n {bandwidthDownBytes}  {bandwidthUpBytes}", + "format-linked": "󰈀 {ifname} (No IP)", + "format-disconnected": "󰖪 ", + "tooltip": true, + "interval": 2, + //"on-click": "pypr toggle network", + //"on-click-right": "pypr toggle wifi", + }, +} diff --git a/waybar/modules/pulseaudio.jsonc b/waybar/modules/pulseaudio.jsonc new file mode 100644 index 0000000..8f6dbcb --- /dev/null +++ b/waybar/modules/pulseaudio.jsonc @@ -0,0 +1,25 @@ +{ + "pulseaudio": { + "format": "{icon} {volume}% {format_source}", + "format-bluetooth": "{icon} {volume}% {format_source}", + "format-bluetooth-muted": "  {volume}% {format_source}", + "format-muted": " {format_source}", + "format-source": " ", + "format-source-muted": " ", + "format-icons": { + "headphone": " ", + "hands-free": " ", + "headset": " ", + "phone": " ", + "portable": " ", + "car": " ", + "default": [" ", " ", " "], + }, + "tooltip-format": "{desc}, {volume}%", + "on-click": "swayosd-client --output-volume mute-toggle", + "on-click-right": "swayosd-client --input-volume mute-toggle", + "on-click-middle": "pypr toggle volume", + "on-scroll-up": "swayosd-client --output-volume +1", + "on-scroll-down": "swayosd-client --output-volume -1", + }, +} diff --git a/waybar/modules/temperature-cpu.jsonc b/waybar/modules/temperature-cpu.jsonc new file mode 100644 index 0000000..df0a4f1 --- /dev/null +++ b/waybar/modules/temperature-cpu.jsonc @@ -0,0 +1,12 @@ +{ + "temperature#cpu": { + "critical-threshold": 90, + "on-click": "pypr toggle btop", + "hwmon-path": "/sys/class/hwmon/hwmon2/temp1_input", + "format-critical": "{icon} {temperatureC}°C", + "format": "{icon} {temperatureC}°C", + "format-icons": ["", "", ""], + "tooltip": true, + "interval": 2, + }, +} diff --git a/waybar/modules/temperature-gpu.jsonc b/waybar/modules/temperature-gpu.jsonc new file mode 100644 index 0000000..e706e31 --- /dev/null +++ b/waybar/modules/temperature-gpu.jsonc @@ -0,0 +1,12 @@ +{ + "temperature#gpu": { + "critical-threshold": 80, + "on-click": "pypr toggle nvtop", + "hwmon-path": "/sys/class/hwmon/hwmon4/temp1_input", + "format-critical": "{icon} {temperatureC}°C", + "format": "{icon} {temperatureC}°C", + "format-icons": ["", "", ""], + "tooltip": true, + "interval": 2, + }, +} diff --git a/waybar/modules/tray.jsonc b/waybar/modules/tray.jsonc new file mode 100644 index 0000000..28c799e --- /dev/null +++ b/waybar/modules/tray.jsonc @@ -0,0 +1,5 @@ +{ + "tray": { + "spacing": 10, + }, +} diff --git a/waybar/modules/wireguard.jsonc b/waybar/modules/wireguard.jsonc new file mode 100644 index 0000000..dcc92b9 --- /dev/null +++ b/waybar/modules/wireguard.jsonc @@ -0,0 +1,12 @@ +{ + "custom/wireguard": { + //"exec-if": "which wg", + "exec": "/home/timo/.config/waybar/scripts/get_wg_status.sh", + "return-type": "json", + "format": "󰒄 {}", + "interval": 5, + "tooltip": "true", + //"on-click": "pypr toggle network", + //"on-click-right": "pypr toggle wifi", + }, +} diff --git a/waybar/scripts/cava.sh b/waybar/scripts/cava.sh new file mode 100755 index 0000000..ed73733 --- /dev/null +++ b/waybar/scripts/cava.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +bar="▁▂▃▄▅▆▇█" +dict="s/;//g" + +bar_length=${#bar} + +for ((i = 0; i < bar_length; i++)); do + dict+=";s/$i/${bar:$i:1}/g" +done + +config_file="/tmp/bar_cava_config" +cat >"$config_file" <{{.Image}}\n' | column -t -o ' ' | sed ':a;N;$!ba;s/\n/\\n/g') + +active_container_cnt=$(echo -e $docker_ps_output | grep -c "") +echo "{ \"text\": \"$active_container_cnt\", \"tooltip\": \"$docker_ps_output\", \"class\": \"\", \"percentage\": 0 }" diff --git a/waybar/scripts/get_wg_status.sh b/waybar/scripts/get_wg_status.sh new file mode 100755 index 0000000..5de62f7 --- /dev/null +++ b/waybar/scripts/get_wg_status.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +# Function to format output as JSON +function format { + local tooltip="" + local first=true + + while IFS= read -r line; do + if [[ -z "$line" ]]; then + continue + fi + + # Check if the line starts with "interface" or "peer" + if [[ "$line" == interface:* ]]; then + if [ "$first" = false ]; then + tooltip+="\n" + fi + tooltip+="Interface: ${line#*: }" + first=false + elif [[ "$line" == peer:* ]]; then + if [ "$first" = false ]; then + tooltip+="\n" + fi + tooltip+="Peer: ${line#*: }" + first=false + elif [[ "$line" == *"received,"* ]]; then + # Extract received and sent data + received=$(echo "$line" | grep -oP '\d+\.\d+ (B|KiB|MiB|GiB) received' | awk '{print $1 " " $2}') + sent=$(echo "$line" | grep -oP '\d+\.\d+ (B|KiB|MiB|GiB) sent' | awk '{print $1 " " $2}') + tooltip+="\n $received  $sent" + else + # For other lines + if [ "$first" = false ]; then + tooltip+="\n" + fi + key=$(echo "$line" | sed "s/ //" | awk -F ': ' '{print $1}') + value=$(echo "$line" | awk -F ': ' '{print $2}') + tooltip+="$key: $value" + first=false + fi + done + + echo "$tooltip" +} + +# Read wg show output and format +wg_show_output=$(sudo wg show) + +if [[ -z $wg_show_output ]]; then + echo "{ \"text\": \"---\", \"tooltip\": \"disconnected\", \"class\": \"\", \"percentage\": 0 }" +else + tooltip=$(echo "$wg_show_output" | format) + echo "{ \"text\": \"$(echo $wg_show_output | grep -o 'wg[0-9]*')\", \"tooltip\": \"$tooltip\", \"class\": \"\", \"percentage\": 0 }" +fi + + diff --git a/waybar/scripts/mediaplayer.py b/waybar/scripts/mediaplayer.py new file mode 100755 index 0000000..ea9b241 --- /dev/null +++ b/waybar/scripts/mediaplayer.py @@ -0,0 +1,218 @@ +#!/usr/bin/env python3 +import gi + +gi.require_version("Playerctl", "2.0") +from gi.repository import Playerctl, GLib +from gi.repository.Playerctl import Player +import argparse +import logging +import sys +import signal +import gi +import json +import os +from typing import List + +logger = logging.getLogger(__name__) + + +def signal_handler(sig, frame): + logger.info("Received signal to stop, exiting") + sys.stdout.write("\n") + sys.stdout.flush() + # loop.quit() + sys.exit(0) + + +class PlayerManager: + def __init__(self, selected_player=None, excluded_player=[]): + self.manager = Playerctl.PlayerManager() + self.loop = GLib.MainLoop() + self.manager.connect( + "name-appeared", lambda *args: self.on_player_appeared(*args) + ) + self.manager.connect( + "player-vanished", lambda *args: self.on_player_vanished(*args) + ) + + signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGTERM, signal_handler) + signal.signal(signal.SIGPIPE, signal.SIG_DFL) + self.selected_player = selected_player + self.excluded_player = excluded_player.split(",") if excluded_player else [] + + self.init_players() + + def init_players(self): + for player in self.manager.props.player_names: + if player.name in self.excluded_player: + continue + if self.selected_player is not None and self.selected_player != player.name: + logger.debug(f"{player.name} is not the filtered player, skipping it") + continue + self.init_player(player) + + def run(self): + logger.info("Starting main loop") + self.loop.run() + + def init_player(self, player): + logger.info(f"Initialize new player: {player.name}") + player = Playerctl.Player.new_from_name(player) + player.connect("playback-status", self.on_playback_status_changed, None) + player.connect("metadata", self.on_metadata_changed, None) + self.manager.manage_player(player) + self.on_metadata_changed(player, player.props.metadata) + + def get_players(self) -> List[Player]: + return self.manager.props.players + + def write_output(self, text, player): + logger.debug(f"Writing output: {text}") + + output = { + "text": text, + "class": "custom-" + player.props.player_name, + "alt": player.props.player_name, + } + + sys.stdout.write(json.dumps(output) + "\n") + sys.stdout.flush() + + def clear_output(self): + sys.stdout.write("\n") + sys.stdout.flush() + + def on_playback_status_changed(self, player, status, _=None): + logger.debug( + f"Playback status changed for player {player.props.player_name}: {status}" + ) + self.on_metadata_changed(player, player.props.metadata) + + def get_first_playing_player(self): + players = self.get_players() + logger.debug(f"Getting first playing player from {len(players)} players") + if len(players) > 0: + # if any are playing, show the first one that is playing + # reverse order, so that the most recently added ones are preferred + for player in players[::-1]: + if player.props.status == "Playing": + return player + # if none are playing, show the first one + return players[0] + else: + logger.debug("No players found") + return None + + def show_most_important_player(self): + logger.debug("Showing most important player") + # show the currently playing player + # or else show the first paused player + # or else show nothing + current_player = self.get_first_playing_player() + if current_player is not None: + self.on_metadata_changed(current_player, current_player.props.metadata) + else: + self.clear_output() + + def on_metadata_changed(self, player, metadata, _=None): + logger.debug(f"Metadata changed for player {player.props.player_name}") + player_name = player.props.player_name + artist = player.get_artist() + title = player.get_title() + title = title.replace("&", "&") + + track_info = "" + if ( + player_name == "spotify" + and "mpris:trackid" in metadata.keys() + and ":ad:" in player.props.metadata["mpris:trackid"] + ): + track_info = "Advertisement" + elif artist is not None and title is not None: + track_info = f"{artist} - {title}" + else: + track_info = title + + if track_info: + if player.props.status != "Playing": + track_info = " " + track_info + # only print output if no other player is playing + current_playing = self.get_first_playing_player() + if ( + current_playing is None + or current_playing.props.player_name == player.props.player_name + ): + self.write_output(track_info, player) + else: + logger.debug( + f"Other player {current_playing.props.player_name} is playing, skipping" + ) + + def on_player_appeared(self, _, player): + logger.info(f"Player has appeared: {player.name}") + if player.name in self.excluded_player: + logger.debug( + "New player appeared, but it's in exclude player list, skipping" + ) + return + if player is not None and ( + self.selected_player is None or player.name == self.selected_player + ): + self.init_player(player) + else: + logger.debug( + "New player appeared, but it's not the selected player, skipping" + ) + + def on_player_vanished(self, _, player): + logger.info(f"Player {player.props.player_name} has vanished") + self.show_most_important_player() + + +def parse_arguments(): + parser = argparse.ArgumentParser() + + # Increase verbosity with every occurrence of -v + parser.add_argument("-v", "--verbose", action="count", default=0) + + parser.add_argument("-x", "--exclude", "- Comma-separated list of excluded player") + + # Define for which player we"re listening + parser.add_argument("--player") + + parser.add_argument("--enable-logging", action="store_true") + + return parser.parse_args() + + +def main(): + arguments = parse_arguments() + + # Initialize logging + if arguments.enable_logging: + logfile = os.path.join( + os.path.dirname(os.path.realpath(__file__)), "media-player.log" + ) + logging.basicConfig( + filename=logfile, + level=logging.DEBUG, + format="%(asctime)s %(name)s %(levelname)s:%(lineno)d %(message)s", + ) + + # Logging is set by default to WARN and higher. + # With every occurrence of -v it's lowered by one + logger.setLevel(max((3 - arguments.verbose) * 10, 0)) + + logger.info("Creating player manager") + if arguments.player: + logger.info(f"Filtering for player: {arguments.player}") + if arguments.exclude: + logger.info(f"Exclude player {arguments.exclude}") + + player = PlayerManager(arguments.player, arguments.exclude) + player.run() + + +if __name__ == "__main__": + main() diff --git a/waybar/style.css b/waybar/style.css new file mode 100644 index 0000000..664a9d5 --- /dev/null +++ b/waybar/style.css @@ -0,0 +1,403 @@ +/* Variables */ +@define-color mantle #1e2030; +@define-color base rgb(36, 39, 58); +@define-color text #cad3f5; +@define-color surface0 #363a4f; +@define-color surface2 #5b6078; +@define-color blue #8aadf4; +@define-color green #a6da95; +@define-color peach #f5a97f; +@define-color rosewater #f4dbd6; +@define-color lavender #b7bdf8; +@define-color yellow #eed49f; +@define-color red #ed8796; +@define-color maroon #ee99a0; +@define-color teal #8bd5ca; +@define-color sky #91d7e3; +@define-color sapphire #7dc4e4; +@define-color mauve #c6a0f6; +@define-color pink #f5bde6; +@define-color border rgba(183, 189, 248, 0.4); +@define-color shadow rgb(30, 32, 48); + +* { + font-family: JetBrainsMono Nerd Font; + font-size: 13px; + min-height: 0; +} + +/* General Settings */ +#battery, +#cava, +#custom-cava, +#custom-clipboard, +#custom-notifications, +#custom-arch, +#custom-gpu-usage, +#custom-updates, +#mode, +#cpu, +#memory, +#temperature, +#custom-music, +#custom-fans, +#clock, +#idle_inhibitor, +#bluetooth, +#custom-wf-recorder, +#pulseaudio, +#backlight, +#network, +#tray, +#custom-power-menu, +#language, +#window, +#custom-weather, +#custom-weather.severe, +#custom-weather.sunnyDay, +#custom-weather.clearNight, +#custom-weather.cloudyFoggyDay, +#custom-weather.cloudyFoggyNight, +#custom-weather.rainyDay, +#custom-weather.rainyNight, +#custom-weather.showyIcyDay, +#custom-weather.snowyIcyNight, +#custom-weather.default, +#custom-wireguard, +#custom-docker { + background-color: alpha(@base, 0.9); + padding: 0 10px; + margin: 2px 4px 5px 4px; + border-radius: 10px; + box-shadow: 3px 3px 1px 1px alpha(@shadow, 0.7); + border: 2px solid @border; + background-clip: padding-box; +} + +window#waybar { + color: @text; + background: transparent; +} + +window#waybar.hidden { + opacity: 0; +} + +#workspaces * { + font-size: 14px; +} +#workspaces button label { + color: @lavender; + font-weight: bolder; + transition: all 0.5s cubic-bezier(0.55, -0.68, 0.48, 1.68); +} + +#workspaces button.active label { + color: @base; + font-weight: bolder; +} + +#workspaces button.urgent { + background-color: @red; +} + +#workspaces button.urgent label { + color: @base; + font-weight: bolder; +} + +#workspaces { + background-color: alpha(@base, 0.9); + border: 2px solid @border; + padding: 0 10px; + margin: 2px 4px 5px 4px; + box-shadow: 3px 3px 1px 1px alpha(@shadow, 0.7); + border-radius: 10px; + background-clip: padding-box; +} + +#workspaces button { + border-radius: 15px; + margin-right: 3px; + margin-left: 3px; + margin-top: 3px; + margin-bottom: 3px; + padding: 0 5px; + font-weight: bolder; + min-width: 20px; + color: @base; + transition: all 0.3s cubic-bezier(0.55, -0.68, 0.48, 1.682); +} + +#workspaces button.active { + padding-right: 6px; + padding-left: 6px; + box-shadow: 3px 3px 1px 1px alpha(@shadow, 0.7); + padding-bottom: 3px; + margin-top: 5px; + margin-bottom: 5px; + background: linear-gradient( + 52deg, + rgba(139, 213, 202, 1) 0%, + rgba(138, 173, 244, 1) 30%, + rgba(183, 189, 248, 1) 48%, + rgba(198, 160, 246, 1) 77%, + rgba(238, 153, 160, 1) 100% + ); + background-size: 400% 400%; + animation: gradient 15s ease infinite; + transition: all 0.3s cubic-bezier(0.55, -0.68, 0.48, 1.682); + color: @mauve; + border-radius: 12px; +} + +#workspaces button:hover { + background-color: @surface0; +} + +#workspaces button.focused:hover { + background-color: alpha(@base, 0.9); +} + +#workspaces button.focused:hover label { + color: @text; +} + +/* Individual Modules */ +#battery { + color: @mauve; +} + +#battery.warning { + color: @yellow; +} + +#battery.critical { + color: @peach; +} + +#battery.urgent { + color: @red; +} + +#custom-cava { + color: @lavender; + border-radius: 12px; +} + +#cpu, +#custom-docker { + color: @blue; + transition: all 0.5s cubic-bezier(0.55, -0.68, 0.48, 1.68); +} + +#memory { + color: @green; + transition: all 0.5s cubic-bezier(0.55, -0.68, 0.48, 1.68); +} + +#custom-notifications { + color: @yellow; +} + +#custom-weather { + color: @red; +} + +#custom-updates { + color: @teal; +} + +#custom-wf-recorder { + color: @red; +} + +#custom-gpu-temp { + color: @peach; +} + +#custom-gpu-usage { + color: @teal; +} + +#custom-power-menu, +#custom-wireguard { + color: @red; +} + +#temperature { + color: @peach; +} + +#bluetooth { + color: @blue; +} + +#window { + background: linear-gradient( + 52deg, + rgba(139, 213, 202, 1) 0%, + rgba(138, 173, 244, 1) 30%, + rgba(183, 189, 248, 1) 48%, + rgba(198, 160, 246, 1) 77%, + rgba(238, 153, 160, 1) 100% + ); + background-size: 400% 400%; + animation: gradient 15s ease infinite; + text-shadow: 0px 0px 5px @lavender; + font-weight: bold; + color: @mantle; + transition: all 0.3s cubic-bezier(0.55, -0.68, 0.48, 1.682); + border: none; +} + +#temperature.critical { + background-color: @red; + color: @mantle; +} + +#custom-music { + background: @lavender; + background: linear-gradient( + 52deg, + rgba(139, 213, 202, 1) 0%, + rgba(138, 173, 244, 1) 30%, + rgba(183, 189, 248, 1) 48%, + rgba(198, 160, 246, 1) 77%, + rgba(238, 153, 160, 1) 100% + ); + background-size: 400% 400%; + animation: gradient 15s ease infinite; + text-shadow: 0px 0px 5px @border; + font-weight: bold; + color: @mantle; + transition: all 0.3s cubic-bezier(0.55, -0.68, 0.48, 1.682); + border: none; +} + +#custom-fans { + color: @green; +} + +#clock { + color: @lavender; +} + +#language { + color: @blue; +} + +#pulseaudio { + color: @pink; +} + +#pulseaudio.muted { + background-color: @red; + color: @mantle; +} + +#pulseaudio.source-muted { + background-color: @peach; + color: @mantle; +} + +#backlight { + color: @blue; +} + +#battery { + color: @green; +} + +#battery.charging, +#battery.plugged { + background-color: @green; + color: @mantle; +} + +#battery.critical:not(.charging) { + background-color: @red; + color: @mantle; + animation-name: blink; + animation-duration: 0.5s; + animation-timing-function: linear; + animation-iteration-count: infinite; + animation-direction: alternate; +} + +#network { + color: @sky; +} + +#network.disconnected { + background-color: @red; + color: @mantle; +} + +#network.linked { + background-color: @peach; + color: @mantle; +} + +#clock.cl2 { + background: @lavender; + background: linear-gradient( + 52deg, + rgba(139, 213, 202, 1) 0%, + rgba(138, 173, 244, 1) 30%, + rgba(183, 189, 248, 1) 48%, + rgba(198, 160, 246, 1) 77%, + rgba(238, 153, 160, 1) 100% + ); + background-size: 400% 400%; + animation: gradient 15s ease infinite; + text-shadow: 0px 0px 5px @border; + font-weight: bold; + color: @mantle; + transition: all 0.3s cubic-bezier(0.55, -0.68, 0.48, 1.682); + border: none; +} + +/* Animation Keyframes */ +@keyframes blink { + to { + background-color: alpha(@base, 0.9); + color: @red; + } +} + +@keyframes gradient { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} + +@keyframes gradient_f { + 0% { + background-position: 0% 200%; + } + + 50% { + background-position: 200% 0%; + } + + 100% { + background-position: 400% 200%; + } +} + +@keyframes gradient_f_nh { + 0% { + background-position: 0% 200%; + } + + 100% { + background-position: 200% 200%; + } +} diff --git a/yay/.github/README.md b/yay/.github/README.md new file mode 100644 index 0000000..affa9d5 --- /dev/null +++ b/yay/.github/README.md @@ -0,0 +1,3 @@ +
+ +
diff --git a/yay/.github/title.png b/yay/.github/title.png new file mode 100644 index 0000000..cc27754 Binary files /dev/null and b/yay/.github/title.png differ diff --git a/yay/config.json b/yay/config.json new file mode 100644 index 0000000..68eba18 --- /dev/null +++ b/yay/config.json @@ -0,0 +1,47 @@ +{ + "aururl": "https://aur.archlinux.org", + "aurrpcurl": "https://aur.archlinux.org/rpc?", + "editor": "nvim", + "editorflags": "", + "makepkgbin": "makepkg", + "makepkgconf": "", + "pacmanbin": "pacman", + "redownload": "no", + "answerclean": "", + "answerdiff": "", + "answeredit": "", + "answerupgrade": "", + "gitbin": "git", + "gpgbin": "gpg", + "gpgflags": "", + "mflags": "", + "sortby": "votes", + "searchby": "name-desc", + "gitflags": "", + "removemake": "ask", + "sudobin": "sudo", + "sudoflags": "", + "version": "12.1.3", + "requestsplitn": 150, + "completionrefreshtime": 7, + "maxconcurrentdownloads": 0, + "bottomup": true, + "sudoloop": false, + "timeupdate": false, + "devel": false, + "cleanAfter": false, + "provides": true, + "pgpfetch": true, + "cleanmenu": true, + "diffmenu": true, + "editmenu": true, + "combinedupgrade": true, + "useask": false, + "batchinstall": false, + "singlelineresults": false, + "separatesources": true, + "debug": false, + "rpc": true, + "doubleconfirm": true, + "rebuild": "no" +} diff --git a/yazi/.github/README.md b/yazi/.github/README.md new file mode 100644 index 0000000..d0b162a --- /dev/null +++ b/yazi/.github/README.md @@ -0,0 +1,21 @@ +
+ +
+ +
+ +
+ +
+ +
+ + + + + +
+
+ +> [!NOTE] +> All the information about the yazi setup is on the documentation website: https://dotfiles-docs.vercel.app/app-confs/yazi.html diff --git a/yazi/.github/overview-1.png b/yazi/.github/overview-1.png new file mode 100644 index 0000000..8e32f8b Binary files /dev/null and b/yazi/.github/overview-1.png differ diff --git a/yazi/.github/overview-2.png b/yazi/.github/overview-2.png new file mode 100644 index 0000000..4b54a89 Binary files /dev/null and b/yazi/.github/overview-2.png differ diff --git a/yazi/.github/overview-3.png b/yazi/.github/overview-3.png new file mode 100644 index 0000000..6a06e7b Binary files /dev/null and b/yazi/.github/overview-3.png differ diff --git a/yazi/.github/title.png b/yazi/.github/title.png new file mode 100644 index 0000000..5622afd Binary files /dev/null and b/yazi/.github/title.png differ diff --git a/yazi/flavors/catppuccin-macchiato.yazi/flavor.toml b/yazi/flavors/catppuccin-macchiato.yazi/flavor.toml new file mode 100644 index 0000000..d8a7501 --- /dev/null +++ b/yazi/flavors/catppuccin-macchiato.yazi/flavor.toml @@ -0,0 +1,1204 @@ +[manager] +cwd = { fg = "#8bd5ca" } + +# Hovered +hovered = { fg = "#24273a", bg = "#8aadf4" } +preview_hovered = { underline = true } + +# Find +find_keyword = { fg = "#eed49f", italic = true } +find_position = { fg = "#f5bde6", bg = "reset", italic = true } + +# Marker +marker_copied = { fg = "#a6da95", bg = "#a6da95" } +marker_cut = { fg = "#ed8796", bg = "#ed8796" } +marker_selected = { fg = "#8aadf4", bg = "#8aadf4" } + +# Tab +tab_active = { fg = "#24273a", bg = "#cad3f5" } +tab_inactive = { fg = "#cad3f5", bg = "#494d64" } +tab_width = 1 + +# Count +count_copied = { fg = "#24273a", bg = "#a6da95" } +count_cut = { fg = "#24273a", bg = "#ed8796" } +count_selected = { fg = "#24273a", bg = "#8aadf4" } + +# Border +border_symbol = "│" +border_style = { fg = "#8087a2" } + +# Highlighting +syntect_theme = "~/.config/bat/themes/Catppuccin-macchiato.tmTheme" + +[status] +separator_open = "" +separator_close = "" +separator_style = { fg = "#494d64", bg = "#494d64" } + +# Mode +mode_normal = { fg = "#24273a", bg = "#8aadf4" } +mode_select = { fg = "#24273a", bg = "#a6da95" } +mode_unset = { fg = "#24273a", bg = "#f0c6c6" } + +# Progress +progress_label = { fg = "#cad3f5" } +progress_normal = { fg = "#8aadf4", bg = "#494d64" } +progress_error = { fg = "#ed8796", bg = "#494d64" } + +# Permissions +permissions_t = { fg = "#8aadf4" } +permissions_r = { fg = "#eed49f" } +permissions_w = { fg = "#ed8796" } +permissions_x = { fg = "#a6da95" } +permissions_s = { fg = "#8087a2" } + +[input] +border = { fg = "#8aadf4" } +title = {} +value = {} +selected = { reversed = true } + +[select] +border = { fg = "#8aadf4" } +active = { fg = "#f5bde6" } +inactive = {} + +[tasks] +border = { fg = "#8aadf4" } +title = {} +hovered = { underline = true } + +[which] +mask = { bg = "#363a4f" } +cand = { fg = "#8bd5ca" } +rest = { fg = "#939ab7" } +desc = { fg = "#f5bde6" } +separator = "  " +separator_style = { fg = "#5b6078" } + +[help] +on = { fg = "#f5bde6" } +exec = { fg = "#8bd5ca" } +desc = { fg = "#939ab7" } +hovered = { bg = "#5b6078" } +footer = { fg = "#494d64", bg = "#cad3f5" } + +[filetype] + +rules = [ + { name = "*", is = "block", fg = "#cad3f5" }, + { name = "*", is = "char", fg = "#a6da95" }, + { name = "*/", fg = "#8aadf4" }, + { name = "*", is = "exec", fg = "#ed8796", bold = true }, + { name = "*", is = "fifo", fg = "#181926", bg = "#8aadf4" }, + { name = "*", is = "orphan", fg = "#181926", bg = "#ed8796" }, + { name = "*", is = "sock", fg = "#181926", bg = "#f5bde6" }, + { name = "*", is = "link", fg = "#f5bde6" }, + { name = "*", is = "sticky", fg = "#cad3f5" }, + { name = "*.txt", fg = "#eed49f" }, + { name = "*README", fg = "#eed49f" }, + { name = "*README.rst", fg = "#eed49f" }, + { name = "*README.md", fg = "#eed49f" }, + { name = "*README.txt", fg = "#eed49f" }, + { name = "*LICENSE", fg = "#939ab7" }, + { name = "*LICENSE-MIT", fg = "#939ab7" }, + { name = "*LICENSE-APACHE", fg = "#939ab7" }, + { name = "*LICENSE.md", fg = "#939ab7" }, + { name = "*LICENSE.txt", fg = "#939ab7" }, + { name = "*COPYING", fg = "#939ab7" }, + { name = "*COPYRIGHT", fg = "#939ab7" }, + { name = "*INSTALL", fg = "#eed49f" }, + { name = "*INSTALL.md", fg = "#eed49f" }, + { name = "*INSTALL.txt", fg = "#eed49f" }, + { name = "*AUTHORS", fg = "#eed49f" }, + { name = "*HISTORY", fg = "#eed49f" }, + { name = "*CODE_OF_CONDUCT", fg = "#eed49f" }, + { name = "*CODE_OF_CONDUCT.md", fg = "#eed49f" }, + { name = "*CODE_OF_CONDUCT.txt", fg = "#eed49f" }, + { name = "*CONTRIBUTING", fg = "#eed49f" }, + { name = "*CONTRIBUTING.md", fg = "#eed49f" }, + { name = "*CONTRIBUTING.txt", fg = "#eed49f" }, + { name = "*CONTRIBUTORS", fg = "#eed49f" }, + { name = "*CONTRIBUTORS.md", fg = "#eed49f" }, + { name = "*CONTRIBUTORS.txt", fg = "#eed49f" }, + { name = "*CHANGELOG", fg = "#eed49f" }, + { name = "*CHANGELOG.md", fg = "#eed49f" }, + { name = "*CHANGELOG.txt", fg = "#eed49f" }, + { name = "*CODEOWNERS", fg = "#8bd5ca" }, + { name = "*PATENTS", fg = "#eed49f" }, + { name = "*VERSION", fg = "#eed49f" }, + { name = "*NOTICE", fg = "#eed49f" }, + { name = "*CHANGES", fg = "#eed49f" }, + { name = "*LEGACY", fg = "#eed49f" }, + { name = "*TODO", fg = "#eed49f" }, + { name = "*TODO.md", fg = "#eed49f" }, + { name = "*TODO.txt", fg = "#eed49f" }, + { name = "*.log", fg = "#5b6078" }, + { name = "*.asciidoc", fg = "#eed49f" }, + { name = "*.etx", fg = "#eed49f" }, + { name = "*.info", fg = "#eed49f" }, + { name = "*.markdown", fg = "#eed49f" }, + { name = "*.md", fg = "#eed49f" }, + { name = "*.mkd", fg = "#eed49f" }, + { name = "*.mdx", fg = "#eed49f" }, + { name = "*.org", fg = "#eed49f" }, + { name = "*.norg", fg = "#eed49f" }, + { name = "*.tex", fg = "#a6da95" }, + { name = "*.textile", fg = "#a6da95" }, + { name = "*.bib", fg = "#eed49f" }, + { name = "*.bst", fg = "#eed49f" }, + { name = "*.json", fg = "#eed49f" }, + { name = "*.jsonc", fg = "#eed49f" }, + { name = "*.json5", fg = "#eed49f" }, + { name = "*.hjson", fg = "#eed49f" }, + { name = "*.jsonl", fg = "#eed49f" }, + { name = "*.jsonnet", fg = "#eed49f" }, + { name = "*.ndjson", fg = "#eed49f" }, + { name = "*.rss", fg = "#ed8796" }, + { name = "*.xml", fg = "#eed49f" }, + { name = "*.fxml", fg = "#eed49f" }, + { name = "*.toml", fg = "#eed49f" }, + { name = "*.ps1", fg = "#eed49f" }, + { name = "*.tml", fg = "#eed49f" }, + { name = "*.yaml", fg = "#eed49f" }, + { name = "*.yml", fg = "#eed49f" }, + { name = "*.ml", fg = "#a6da95" }, + { name = "*.mli", fg = "#a6da95" }, + { name = "*.xmp", fg = "#eed49f" }, + { name = "*.ltx", fg = "#a6da95" }, + { name = "*.db", fg = "#a6da95" }, + { name = "*.pdf", fg = "#ed8796" }, + { name = "*.PDF", fg = "#ed8796" }, + { name = "*.epub", fg = "#ed8796" }, + { name = "*.docm", fg = "#87afff", underline = true }, + { name = "*.doc", fg = "#ed8796" }, + { name = "*.docx", fg = "#ed8796" }, + { name = "*.odb", fg = "#87afff" }, + { name = "*.odt", fg = "#ed8796" }, + { name = "*.rtf", fg = "#ed8796" }, + { name = "*.pages", fg = "#87afff" }, + { name = "*.odp", fg = "#ed8796" }, + { name = "*.pps", fg = "#ed8796" }, + { name = "*.ppt", fg = "#ed8796" }, + { name = "*.pptx", fg = "#ed8796" }, + { name = "*.ppts", fg = "#ed8796" }, + { name = "*.pptxm", fg = "#ed8796", underline = true }, + { name = "*.pptsm", fg = "#ed8796", underline = true }, + { name = "*.prisma", fg = "#ed8796" }, + { name = "*.csv", fg = "#eed49f" }, + { name = "*.tsv", fg = "#eed49f" }, + { name = "*.ods", fg = "#ed8796" }, + { name = "*.xlr", fg = "#ed8796" }, + { name = "*.o", fg = "#5b6078" }, + { name = "*.la", fg = "#5b6078" }, + { name = "*.lo", fg = "#5b6078" }, + { name = "*CMakeCache", fg = "#5b6078" }, + { name = "*MakeFile.in", fg = "#5b6078" }, + { name = "*.cache", fg = "#5b6078" }, + { name = "*.class", fg = "#5b6078" }, + { name = "*.scons_opt", fg = "#5b6078" }, + { name = "*.scons_dblite", fg = "#5b6078" }, + { name = "*.xls", fg = "#ed8796" }, + { name = "*.xlsx", fg = "#ed8796" }, + { name = "*.xlsxm", fg = "#ed8796", underline = true }, + { name = "*.xltm", fg = "#ed8796", underline = true }, + { name = "*.xltx", fg = "#ed8796" }, + { name = "*.key", fg = "#eed49f" }, + { name = "*.config", fg = "#eed49f" }, + { name = "*.cfg", fg = "#eed49f" }, + { name = "*.conf", fg = "#eed49f" }, + { name = "*authorized_keys", fg = "#eed49f" }, + { name = "*known_hosts", fg = "#eed49f" }, + { name = "*.ini", fg = "#eed49f" }, + { name = "*.ui", fg = "#eed49f" }, + { name = "*.webmanifest", fg = "#eed49f" }, + { name = "*.profile", fg = "#a6da95" }, + { name = "*.bash_profile", fg = "#a6da95" }, + { name = "*.bash_logout", fg = "#eed49f" }, + { name = "*.bashrc", fg = "#a6da95" }, + { name = "*.zshenv", fg = "#a6da95" }, + { name = "*.zprofile", fg = "#a6da95" }, + { name = "*.viminfo", fg = "#eed49f" }, + { name = "*.icon", fg = "#f0c6c6" }, + { name = "*.epf", fg = "#ed8796" }, + { name = "*.git", fg = "#5b6078" }, + { name = "*.github", fg = "#5b6078" }, + { name = "*.gitignore", fg = "#8bd5ca" }, + { name = "*.ignore", fg = "#8bd5ca" }, + { name = "*.cmake", fg = "#8bd5ca" }, + { name = "*.CMakeLists.txt", fg = "#8bd5ca" }, + { name = "*.cmake.in", fg = "#8bd5ca" }, + { name = "*.fdignore", fg = "#8bd5ca" }, + { name = "*.rgignore", fg = "#8bd5ca" }, + { name = "*.tfignore", fg = "#8bd5ca" }, + { name = "*.gitattributes", fg = "#8bd5ca" }, + { name = "*.gitmodules", fg = "#8bd5ca" }, + { name = "*.gitconfig", fg = "#8bd5ca" }, + { name = "*.mailmap", fg = "#8bd5ca" }, + { name = "*.awk", fg = "#a6da95" }, + { name = "*.bash", fg = "#a6da95" }, + { name = "*.bat", fg = "#ed8796", bold = true }, + { name = "*.com", fg = "#ed8796", bold = true }, + { name = "*.exe", fg = "#ed8796", bold = true }, + { name = "*.sh", fg = "#a6da95" }, + { name = "*.zsh", fg = "#a6da95" }, + { name = "*.fish", fg = "#a6da95" }, + { name = "*.vim", fg = "#a6da95" }, + { name = "*.py", fg = "#a6da95" }, + { name = "*.ipynb", fg = "#a6da95" }, + { name = "*.rb", fg = "#a6da95" }, + { name = "*.gemspec", fg = "#8bd5ca" }, + { name = "*v.mod", fg = "#8bd5ca" }, + { name = "*.flake8", fg = "#8bd5ca" }, + { name = "*.clang-format", fg = "#8bd5ca" }, + { name = "*.msql", fg = "#a6da95" }, + { name = "*.mysql", fg = "#a6da95" }, + { name = "*.prql", fg = "#a6da95" }, + { name = "*.pgsql", fg = "#a6da95" }, + { name = "*.sql", fg = "#a6da95" }, + { name = "*.sqlite3", fg = "#a6da95" }, + { name = "*.sqlite", fg = "#a6da95" }, + { name = "*.r", fg = "#a6da95" }, + { name = "*.R", fg = "#a6da95" }, + { name = "*.clj", fg = "#a6da95" }, + { name = "*.cljs", fg = "#a6da95" }, + { name = "*.cljc", fg = "#a6da95" }, + { name = "*.cljw", fg = "#a6da95" }, + { name = "*.scala", fg = "#a6da95" }, + { name = "*.dart", fg = "#a6da95" }, + { name = "*.asm", fg = "#a6da95" }, + { name = "*.lisp", fg = "#a6da95" }, + { name = "*.matlab", fg = "#a6da95" }, + { name = "*.kt", fg = "#a6da95" }, + { name = "*.kts", fg = "#a6da95" }, + { name = "*.mojo", fg = "#a6da95" }, + { name = "*.elc", fg = "#a6da95" }, + { name = "*.elm", fg = "#a6da95" }, + { name = "*.lua", fg = "#a6da95" }, + { name = "*.c", fg = "#a6da95" }, + { name = "*.C", fg = "#a6da95" }, + { name = "*.h", fg = "#a6da95" }, + { name = "*.H", fg = "#a6da95" }, + { name = "*.c++", fg = "#a6da95" }, + { name = "*.h++", fg = "#a6da95" }, + { name = "*.hpp", fg = "#a6da95" }, + { name = "*.hxx", fg = "#a6da95" }, + { name = "*.M", fg = "#a6da95" }, + { name = "*.m", fg = "#a6da95" }, + { name = "*.cc", fg = "#a6da95" }, + { name = "*.cs", fg = "#a6da95" }, + { name = "*.csx", fg = "#a6da95" }, + { name = "*.cp", fg = "#a6da95" }, + { name = "*.cpp", fg = "#a6da95" }, + { name = "*.cxx", fg = "#a6da95" }, + { name = "*.cr", fg = "#a6da95" }, + { name = "*.go", fg = "#a6da95" }, + { name = "*.f", fg = "#a6da95" }, + { name = "*.F", fg = "#a6da95" }, + { name = "*.for", fg = "#a6da95" }, + { name = "*.ftn", fg = "#a6da95" }, + { name = "*.nim", fg = "#a6da95" }, + { name = "*.nimble", fg = "#a6da95" }, + { name = "*.s", fg = "#a6da95" }, + { name = "*.S", fg = "#a6da95" }, + { name = "*.rs", fg = "#a6da95" }, + { name = "*.scpt", fg = "#a6da95" }, + { name = "*.swift", fg = "#a6da95" }, + { name = "*.vala", fg = "#a6da95" }, + { name = "*.hs", fg = "#a6da95" }, + { name = "*.lhs", fg = "#a6da95" }, + { name = "*.agda", fg = "#a6da95" }, + { name = "*.lagda", fg = "#a6da95" }, + { name = "*.lagda.tex", fg = "#a6da95" }, + { name = "*.lagda.rst", fg = "#a6da95" }, + { name = "*.lagda.md", fg = "#a6da95" }, + { name = "*.zig", fg = "#a6da95" }, + { name = "*.v", fg = "#a6da95" }, + { name = "*.pyc", fg = "#5b6078" }, + { name = "*.pyd", fg = "#5b6078" }, + { name = "*.pyo", fg = "#5b6078" }, + { name = "*.fs", fg = "#a6da95" }, + { name = "*.fsi", fg = "#a6da95" }, + { name = "*.fsx", fg = "#a6da95" }, + { name = "*.http", fg = "#a6da95" }, + { name = "*.css", fg = "#a6da95" }, + { name = "*.less", fg = "#a6da95" }, + { name = "*.sass", fg = "#a6da95" }, + { name = "*.scss", fg = "#a6da95" }, + { name = "*.htm", fg = "#eed49f" }, + { name = "*.html", fg = "#eed49f" }, + { name = "*.xhtml", fg = "#eed49f" }, + { name = "*.shtml", fg = "#eed49f" }, + { name = "*.jhtm", fg = "#eed49f" }, + { name = "*.mht", fg = "#eed49f" }, + { name = "*.svelte", fg = "#a6da95" }, + { name = "*.vue", fg = "#a6da95" }, + { name = "*.astro", fg = "#a6da95" }, + { name = "*.js", fg = "#a6da95" }, + { name = "*.jsx", fg = "#a6da95" }, + { name = "*.ts", fg = "#a6da95" }, + { name = "*.tsx", fg = "#a6da95" }, + { name = "*.mjs", fg = "#a6da95" }, + { name = "*.cjs", fg = "#a6da95" }, + { name = "*.coffee", fg = "#a6da95" }, + { name = "*.java", fg = "#a6da95" }, + { name = "*.jl", fg = "#a6da95" }, + { name = "*.php", fg = "#a6da95" }, + { name = "*.twig", fg = "#a6da95" }, + { name = "*.vb", fg = "#a6da95" }, + { name = "*Containerfile", fg = "#8bd5ca" }, + { name = "*.containerignore", fg = "#8bd5ca" }, + { name = "*Dockerfile", fg = "#eed49f" }, + { name = "*.dockerignore", fg = "#8bd5ca" }, + { name = "*Makefile", fg = "#8bd5ca" }, + { name = "*Makefile.am", fg = "#8bd5ca" }, + { name = "*configure", fg = "#8bd5ca" }, + { name = "*configure.ac", fg = "#8bd5ca" }, + { name = "*requirements.txt", fg = "#8bd5ca" }, + { name = "*.make", fg = "#8bd5ca" }, + { name = "*.mk", fg = "#8bd5ca" }, + { name = "*.nix", fg = "#eed49f" }, + { name = "*appveyor.yml", fg = "#8bd5ca" }, + { name = "*azure-pipelines.yml", fg = "#8bd5ca" }, + { name = "*.cirrus.yml", fg = "#8bd5ca" }, + { name = "*.gitlab-ci.yml", fg = "#8bd5ca" }, + { name = "*.travis.yml", fg = "#8bd5ca" }, + { name = "*.old", fg = "#5b6078" }, + { name = "*.out", fg = "#5b6078" }, + { name = "*.SKIP", fg = "#5b6078" }, + { name = "*.diff", fg = "#a6da95" }, + { name = "*.patch", fg = "#a6da95" }, + { name = "*.bmp", fg = "#f0c6c6" }, + { name = "*.exr", fg = "#f0c6c6" }, + { name = "*.gif", fg = "#f0c6c6" }, + { name = "*.3fr", fg = "#f0c6c6" }, + { name = "*.bay", fg = "#f0c6c6" }, + { name = "*.cdr", fg = "#f0c6c6" }, + { name = "*.dicom", fg = "#f0c6c6" }, + { name = "*.fliff", fg = "#f0c6c6" }, + { name = "*.tif", fg = "#f0c6c6" }, + { name = "*.tiff", fg = "#f0c6c6" }, + { name = "*.ppm", fg = "#f0c6c6" }, + { name = "*.qoi", fg = "#f0c6c6" }, + { name = "*.tga", fg = "#f0c6c6" }, + { name = "*.heif", fg = "#f0c6c6" }, + { name = "*.ico", fg = "#f0c6c6" }, + { name = "*.icns", fg = "#f0c6c6" }, + { name = "*.jpeg", fg = "#f0c6c6" }, + { name = "*.jpg", fg = "#f0c6c6" }, + { name = "*.jxl", fg = "#f0c6c6" }, + { name = "*.nth", fg = "#f0c6c6" }, + { name = "*.png", fg = "#f0c6c6" }, + { name = "*.mos", fg = "#f0c6c6" }, + { name = "*.raw", fg = "#f0c6c6" }, + { name = "*.psd", fg = "#f0c6c6" }, + { name = "*.xvf", fg = "#f0c6c6" }, + { name = "*.avif", fg = "#f0c6c6" }, + { name = "*.pxm", fg = "#f0c6c6" }, + { name = "*.xpm", fg = "#f0c6c6" }, + { name = "*.ai", fg = "#f0c6c6" }, + { name = "*.pxd", fg = "#f0c6c6" }, + { name = "*.webp", fg = "#f0c6c6" }, + { name = "*.webm", fg = "#f0c6c6" }, + { name = "*.kra", fg = "#f0c6c6" }, + { name = "*.svg", fg = "#f0c6c6" }, + { name = "*.ps", fg = "#ed8796" }, + { name = "*.avi", fg = "#f0c6c6" }, + { name = "*.m2v", fg = "#f0c6c6" }, + { name = "*.m4v", fg = "#f0c6c6" }, + { name = "*.mkv", fg = "#f0c6c6" }, + { name = "*.MOV", fg = "#f0c6c6" }, + { name = "*.mov", fg = "#f0c6c6" }, + { name = "*.mp4", fg = "#f0c6c6" }, + { name = "*.obj", fg = "#f0c6c6" }, + { name = "*.usd", fg = "#f0c6c6" }, + { name = "*.step", fg = "#f0c6c6" }, + { name = "*.blend", fg = "#f0c6c6" }, + { name = "*.amf", fg = "#f0c6c6" }, + { name = "*.mpeg", fg = "#f0c6c6" }, + { name = "*.mpg", fg = "#f0c6c6" }, + { name = "*.sample", fg = "#f0c6c6" }, + { name = "*.wmv", fg = "#f0c6c6" }, + { name = "*.webm", fg = "#f0c6c6" }, + { name = "*.flv", fg = "#f0c6c6" }, + { name = "*.h264", fg = "#f0c6c6" }, + { name = "*.ogv", fg = "#f0c6c6" }, + { name = "*.f4v", fg = "#f0c6c6" }, + { name = "*.VOB", fg = "#f0c6c6" }, + { name = "*.vob", fg = "#f0c6c6" }, + { name = "*.m4a", fg = "#f0c6c6" }, + { name = "*.mp3", fg = "#f0c6c6" }, + { name = "*.mp4a", fg = "#f0c6c6" }, + { name = "*.ogg", fg = "#f0c6c6" }, + { name = "*.opus", fg = "#f0c6c6" }, + { name = "*.wma", fg = "#f0c6c6" }, + { name = "*.ape", fg = "#f0c6c6" }, + { name = "*.aif", fg = "#f0c6c6" }, + { name = "*.flac", fg = "#f0c6c6" }, + { name = "*.mid", fg = "#f0c6c6" }, + { name = "*.midi", fg = "#f0c6c6" }, + { name = "*.wav", fg = "#f0c6c6" }, + { name = "*.wv", fg = "#f0c6c6" }, + { name = "*.wmv", fg = "#f0c6c6" }, + { name = "*.afm", fg = "#f0c6c6" }, + { name = "*.fon", fg = "#f0c6c6" }, + { name = "*.fnt", fg = "#f0c6c6" }, + { name = "*.pfb", fg = "#f0c6c6" }, + { name = "*.pfm", fg = "#f0c6c6" }, + { name = "*.ttf", fg = "#f0c6c6" }, + { name = "*.otf", fg = "#f0c6c6" }, + { name = "*.woff", fg = "#f0c6c6" }, + { name = "*.woff2", fg = "#f0c6c6" }, + { name = "*.PFA", fg = "#f0c6c6" }, + { name = "*.pfa", fg = "#f0c6c6" }, + { name = "*.7z", fg = "#7dc4e4" }, + { name = "*.arj", fg = "#7dc4e4" }, + { name = "*.a", fg = "#7dc4e4" }, + { name = "*.bz", fg = "#7dc4e4" }, + { name = "*.bz2", fg = "#7dc4e4" }, + { name = "*.gz", fg = "#7dc4e4" }, + { name = "*.pkg", fg = "#7dc4e4" }, + { name = "*.rar", fg = "#7dc4e4" }, + { name = "*.tar", fg = "#7dc4e4" }, + { name = "*.tbz", fg = "#7dc4e4" }, + { name = "*.tbz2", fg = "#7dc4e4" }, + { name = "*.tgz", fg = "#7dc4e4" }, + { name = "*.xz", fg = "#7dc4e4" }, + { name = "*.z", fg = "#7dc4e4" }, + { name = "*.zz", fg = "#7dc4e4" }, + { name = "*.zip", fg = "#7dc4e4" }, + { name = "*.zipx", fg = "#7dc4e4" }, + { name = "*.zst", fg = "#7dc4e4" }, + { name = "*.zstd", fg = "#7dc4e4" }, + { name = "*.cpio", fg = "#7dc4e4" }, + { name = "*.lrz", fg = "#7dc4e4" }, + { name = "*.lz", fg = "#7dc4e4" }, + { name = "*.lzma", fg = "#7dc4e4" }, + { name = "*.lzo", fg = "#7dc4e4" }, + { name = "*.apk", fg = "#7dc4e4" }, + { name = "*.ipa", fg = "#7dc4e4" }, + { name = "*.deb", fg = "#7dc4e4" }, + { name = "*.rpm", fg = "#7dc4e4" }, + { name = "*.jar", fg = "#7dc4e4" }, + { name = "*.xbps", fg = "#7dc4e4" }, + { name = "*.jad", fg = "#7dc4e4" }, + { name = "*.bag", fg = "#7dc4e4" }, + { name = "*.dmg", fg = "#7dc4e4" }, + { name = "*.iso", fg = "#7dc4e4" }, + { name = "*.toast", fg = "#7dc4e4" }, + { name = "*.bin", fg = "#7dc4e4" }, + { name = "*.pak", fg = "#7dc4e4" }, + { name = "*.pk3", fg = "#7dc4e4" }, + { name = "*.xpi", fg = "#7dc4e4" }, + { name = "*.img", fg = "#7dc4e4" }, + { name = "*.qcow", fg = "#7dc4e4" }, + { name = "*.fvd", fg = "#7dc4e4" }, + { name = "*.sparseimage", fg = "#7dc4e4" }, + { name = "*.vcd", fg = "#7dc4e4" }, + { name = "*.vdi", fg = "#7dc4e4" }, + { name = "*.vhd", fg = "#7dc4e4" }, + { name = "*.vhdx", fg = "#7dc4e4" }, + { name = "*.vfd", fg = "#7dc4e4" }, + { name = "*.vmdk", fg = "#7dc4e4" }, + { name = "*.tmp", fg = "#5b6078" }, + { name = "*.timestamp", fg = "#5b6078" }, + { name = "*~", fg = "#5b6078" }, + { name = "*.bak", fg = "#5b6078" }, + { name = "*.rlib", fg = "#5b6078" }, + { name = "*.rmeta", fg = "#5b6078" }, + { name = "*.dll", fg = "#ed8796" }, + { name = "*.pid", fg = "#5b6078" }, + { name = "*.state", fg = "#5b6078" }, + { name = "*lockfile", fg = "#5b6078" }, + { name = "*lock", fg = "#5b6078" }, + { name = "*.err", fg = "#ed8796" }, + { name = "*.error", fg = "#ed8796" }, + { name = "*.stderr", fg = "#5b6078" }, + { name = "*.service", fg = "#eed49f" }, + { name = "*@.service", fg = "#eed49f" }, + { name = "*.socket", fg = "#eed49f" }, + { name = "*.swap", fg = "#7dc4e4" }, + { name = "*.device", fg = "#7dc4e4" }, + { name = "*.mount", fg = "#7dc4e4" }, + { name = "*.automount", fg = "#7dc4e4" }, + { name = "*.target", fg = "#7dc4e4" }, + { name = "*.path", fg = "#7dc4e4" }, + { name = "*.timer", fg = "#7dc4e4" }, + { name = "*.snapshot", fg = "#7dc4e4" }, + { name = "*.lnk", fg = "#7dc4e4" }, + { name = "*.applescript", fg = "#a6da95" }, + { name = "*.m3u", fg = "#f0c6c6" }, + { name = "*.m3u8", fg = "#f0c6c6" }, + { name = "*.md5", fg = "#f0c6c6" }, + { name = "*.properties", fg = "#eed49f" }, + { name = "*.theme", fg = "#eed49f" }, + { name = "*.torrent", fg = "#7dc4e4" }, + { name = "*.asc", fg = "#a6da95" }, + { name = "*.gpg", fg = "#a6da95" }, + { name = "*.signature", fg = "#a6da95" }, + { name = "*.sig", fg = "#a6da95" }, + { name = "*.p12", fg = "#a6da95" }, + { name = "*.pem", fg = "#a6da95" }, + { name = "*.pgp", fg = "#a6da95" }, + { name = "*.p7s", fg = "#a6da95" }, + { name = "*.pub", fg = "#a6da95" }, + { name = "*id_dsa", fg = "#a6da95" }, + { name = "*id_rsa", fg = "#a6da95" }, + { name = "*id_ecdsa", fg = "#a6da95" }, + { name = "*id_ed25519", fg = "#a6da95" }, + { name = "*.DS_Store", fg = "#5b6078" }, + { name = "*.localized", fg = "#5b6078" }, + { name = "*.CFUserTextEncoding", fg = "#5b6078" }, + { name = "*.groovy", fg = "#a6da95" }, + { name = "*.gvy", fg = "#a6da95" }, + { name = "*go.mod", fg = "#8bd5ca" }, + { name = "*setup.py", fg = "#8bd5ca" }, + { name = "*pyproject.toml", fg = "#8bd5ca" }, + { name = "*.editorconfig", fg = "#8bd5ca" }, + { name = "*.pro", fg = "#8bd5ca" }, + { name = "*Doxyfile", fg = "#8bd5ca" }, + { name = "*.dox", fg = "#8bd5ca" }, + { name = "*.gradle", fg = "#a6da95" }, + { name = "*PkgInfo", fg = "#5b6078" }, + { name = "*.desktop", fg = "#eed49f" }, + { name = "*passwd", fg = "#eed49f" }, + { name = "*shadow", fg = "#eed49f" }, + { name = "*.pas", fg = "#a6da95" }, + { name = "*.strings", fg = "#8bd5ca" }, + { name = "*package-lock.json", fg = "#5b6078" }, + { name = "*go.sum", fg = "#5b6078" }, + { name = "*bun.lockb", fg = "#5b6078" }, + { name = "*stdin", fg = "#5b6078" }, + { name = "*stdout", fg = "#5b6078" }, + { name = "*.ex", fg = "#a6da95" }, + { name = "*.exs", fg = "#a6da95" }, + { name = "*.ics", fg = "#ed8796" }, +] + +[icon] +dirs = [ + { name = ".config", text = "" }, + { name = ".git", text = "" }, + { name = ".github", text = "" }, + { name = "Desktop", text = "" }, + { name = "Documents", text = "" }, + { name = "Downloads", text = "" }, + { name = "Library", text = "" }, + { name = "Obsidian", text = "󰠮" }, + { name = "Games", text = "" }, + { name = "Movies", text = "" }, + { name = "Music", text = "" }, + { name = "Pictures", text = "" }, + { name = "Public", text = "" }, + { name = "Templates", text = "" }, + { name = "Videos", text = "" }, + { name = "desktop", text = "" }, + { name = "dev", text = "" }, + { name = "documents", text = "" }, + { name = "downloads", text = "" }, + { name = "library", text = "" }, + { name = "obsidian", text = "󰠮" }, + { name = "games", text = "" }, + { name = "movies", text = "" }, + { name = "music", text = "" }, + { name = "pictures", text = "" }, + { name = "public", text = "" }, + { name = "templates", text = "" }, + { name = "videos", text = "" }, +] + +files = [ + { name = "gulpfile.js", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = ".babelrc", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "copying.lesser", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = ".npmrc", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "docker-compose.yml", text = "󰡨", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "svelte.config.js", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "copying", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "prettier.config.ts", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "gruntfile.babel.js", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = ".SRCINFO", text = "󰣇", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = ".xinitrc", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "docker-compose.yaml", text = "󰡨", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "nuxt.config.ts", text = "󱄆", fg_dark = "#8bd5ca", fg_light = "#8bd5ca" }, + { name = "build", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = ".editorconfig", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "nuxt.config.mjs", text = "󱄆", fg_dark = "#8bd5ca", fg_light = "#8bd5ca" }, + { name = ".gitlab-ci.yml", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "PKGBUILD", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = ".bash_profile", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = ".bashrc", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "compose.yml", text = "󰡨", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "eslint.config.cjs", text = "", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "go.mod", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = ".mailmap", text = "󰊢", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "gtkrc", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "go.work", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "justfile", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "kritadisplayrc", text = "", fg_dark = "#c6a0f6", fg_light = "#c6a0f6" }, + { name = "commitlint.config.js", text = "󰜘", fg_dark = "#8bd5ca", fg_light = "#8bd5ca" }, + { name = ".env", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "PrusaSlicerGcodeViewer.ini", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "r", text = "󰟔", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "license", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = ".gitignore", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "tailwind.config.js", text = "󱏿", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = ".prettierrc.yml", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = ".zprofile", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = ".zshenv", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "xmonad.hs", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = ".eslintignore", text = "", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "tsconfig.json", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = ".prettierrc.json5", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = ".ds_store", text = "", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "gulpfile.coffee", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "R", text = "󰟔", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = ".zshrc", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = ".prettierrc.toml", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = ".gvimrc", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = ".xsession", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = ".justfile", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = ".gitconfig", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "gradle-wrapper.properties", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "ionic.config.json", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "cantorrc", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = ".gleam", text = "", fg_dark = "#f5bde6", fg_light = "#f5bde6" }, + { name = "package-lock.json", text = "", fg_dark = "#363a4f", fg_light = "#363a4f" }, + { name = "package.json", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "hyprland.conf", text = "", fg_dark = "#8bd5ca", fg_light = "#8bd5ca" }, + { name = "gulpfile.babel.js", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = ".nvmrc", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = ".prettierignore", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "ext_typoscript_setup.txt", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "QtProject.conf", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "avif", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "mix.lock", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "build.gradle", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "gemfile$", text = "", fg_dark = "#181926", fg_light = "#181926" }, + { name = ".vimrc", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "i18n.config.ts", text = "󰗊", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "gulpfile.ts", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "build.zig.zon", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "checkhealth", text = "󰓙", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "xmobarrc", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "_vimrc", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = ".luaurc", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "kdenlive-layoutsrc", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "gradlew", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "xsettingsd.conf", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "vlcrc", text = "󰕼", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "xorg.conf", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "xmobarrc.hs", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "workspace", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = ".gitattributes", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "favicon.ico", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "go.sum", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "pom.xml", text = "", fg_dark = "#363a4f", fg_light = "#363a4f" }, + { name = "webpack", text = "󰜫", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "vagrantfile$", text = "", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "unlicense", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "tmux.conf.local", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "settings.gradle", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = ".dockerignore", text = "󰡨", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "sym-lib-table", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "_gvimrc", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "kdenliverc", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "kdeglobals", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = ".prettierrc.yaml", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "rmd", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "tailwind.config.mjs", text = "󱏿", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "sxhkdrc", text = "", fg_dark = "#1e2030", fg_light = "#1e2030" }, + { name = "robots.txt", text = "󰚩", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "tailwind.config.ts", text = "󱏿", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "prettier.config.mjs", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "mpv.conf", text = "", fg_dark = "#24273a", fg_light = "#24273a" }, + { name = "py.typed", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "PrusaSlicer.ini", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "procfile", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "rakefile", text = "", fg_dark = "#181926", fg_light = "#181926" }, + { name = "kritarc", text = "", fg_dark = "#c6a0f6", fg_light = "#c6a0f6" }, + { name = ".Xresources", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "prettier.config.js", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "commitlint.config.ts", text = "󰜘", fg_dark = "#8bd5ca", fg_light = "#8bd5ca" }, + { name = "weston.ini", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "eslint.config.js", text = "", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "cmakelists.txt", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = ".git-blame-ignore-revs", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "config", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "nuxt.config.cjs", text = "󱄆", fg_dark = "#8bd5ca", fg_light = "#8bd5ca" }, + { name = "node_modules", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "makefile", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "lxqt.conf", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "i18n.config.js", text = "󰗊", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "FreeCAD.conf", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "prettier.config.cjs", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "tmux.conf", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "kalgebrarc", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "i3status.conf", text = "", fg_dark = "#cad3f5", fg_light = "#cad3f5" }, + { name = ".settings.json", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "containerfile", text = "󰡨", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "i3blocks.conf", text = "", fg_dark = "#cad3f5", fg_light = "#cad3f5" }, + { name = "lxde-rc.xml", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "gradle.properties", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "hypridle.conf", text = "", fg_dark = "#8bd5ca", fg_light = "#8bd5ca" }, + { name = "gruntfile.ts", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "gruntfile.js", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "dockerfile", text = "󰡨", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "groovy", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "hyprlock.conf", text = "", fg_dark = "#8bd5ca", fg_light = "#8bd5ca" }, + { name = ".prettierrc", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "gnumakefile", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "commit_editmsg", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "fp-lib-table", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "fp-info-cache", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "eslint.config.ts", text = "", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "nuxt.config.js", text = "󱄆", fg_dark = "#8bd5ca", fg_light = "#8bd5ca" }, + { name = "platformio.ini", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = ".nuxtrc", text = "󱄆", fg_dark = "#8bd5ca", fg_light = "#8bd5ca" }, + { name = "gruntfile.coffee", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "eslint.config.mjs", text = "", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "compose.yaml", text = "󰡨", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "bspwmrc", text = "", fg_dark = "#1e2030", fg_light = "#1e2030" }, + { name = "brewfile", text = "", fg_dark = "#181926", fg_light = "#181926" }, + { name = ".eslintrc", text = "", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = ".gtkrc-2.0", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = ".Xauthority", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = ".prettierrc.json", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = ".npmignore", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = ".gitmodules", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, +] +exts = [ + { name = "rake", text = "", fg_dark = "#181926", fg_light = "#181926" }, + { name = "skp", text = "󰻫", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "eln", text = "", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "razor", text = "󱦘", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "vue", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "sln", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "el", text = "", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "blp", text = "󰺾", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "jl", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "mdx", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "jsx", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "ml", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "less", text = "", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "pot", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "pl", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "mli", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "gif", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "aif", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "cxxm", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "fcbak", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "aac", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "query", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "android", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "m3u8", text = "󰲹", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "leex", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "liquid", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "cue", text = "󰲹", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "fcmacro", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "log", text = "󰌱", fg_dark = "#cad3f5", fg_light = "#cad3f5" }, + { name = "pm", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "brep", text = "󰻫", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "blend", text = "󰂫", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "md5", text = "󰕥", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "sql", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "xcplayground", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "erb", text = "", fg_dark = "#181926", fg_light = "#181926" }, + { name = "t", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "cache", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "r", text = "󰟔", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "x", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "import", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "m", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "lrc", text = "󰨖", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "o", text = "", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "d", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "c", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "h", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "rss", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "hbs", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "godxot", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "eot", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "awk", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "fsx", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "a", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "pyi", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "asc", text = "󰦝", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "ass", text = "󰨖", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "css", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "psb", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "csproj", text = "󰪮", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "csv", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "gcode", text = "󰐫", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "ics", text = "", fg_dark = "#363a4f", fg_light = "#363a4f" }, + { name = "mk", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "bz", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "fctb", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "gz", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "wasm", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "glb", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "elc", text = "", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "flf", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "elf", text = "", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "dropbox", text = "", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "tres", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "apk", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "ape", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "slvs", text = "󰻫", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "apl", text = "⍝", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "cs", text = "󰌛", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "azcli", text = "", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "pp", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "flc", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "gemspec", text = "", fg_dark = "#181926", fg_light = "#181926" }, + { name = "pls", text = "󰲹", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "cfg", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "fcscript", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "gnumakefile", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "zst", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "pxi", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "woff2", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "kicad_pcb", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "zsh", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "kicad_wks", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "info", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "cppm", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "svg", text = "󰜡", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "flac", text = "", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "cuh", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "bin", text = "", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "zig", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "yml", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "yaml", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "fsscript", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "xz", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "diff", text = "", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "mojo", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "cshtml", text = "󱦗", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "bak", text = "󰁯", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "nfo", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "bat", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "cpy", text = "⚙", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "gql", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "c++", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "lff", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "obj", text = "󰆧", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "sha512", text = "󰕥", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "scm", text = "󰘧", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "aiff", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "sig", text = "λ", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "webm", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "zip", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "wrz", text = "󰆧", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "jwmrc", text = "", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "xml", text = "󰗀", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "cbl", text = "⚙", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "rmd", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "xaml", text = "󰙳", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "xm", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "wvc", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "drl", text = "", fg_dark = "#ee99a0", fg_light = "#ee99a0" }, + { name = "erl", text = "", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "3gp", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "ccm", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "ino", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "kbx", text = "󰯄", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "test.js", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "wrl", text = "󰆧", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "pcm", text = "", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "woff", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "scala", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "webpack", text = "󰜫", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "hrl", text = "", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "kra", text = "", fg_dark = "#c6a0f6", fg_light = "#c6a0f6" }, + { name = "kicad_pro", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "bazel", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "toml", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "iges", text = "󰻫", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "crdownload", text = "", fg_dark = "#8bd5ca", fg_light = "#8bd5ca" }, + { name = "so", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "strings", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "xls", text = "󰈛", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "wav", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "vsix", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "kicad_prl", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "mov", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "bash", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "sqlite3", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "vsh", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "vim", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "lck", text = "", fg_dark = "#b8c0e0", fg_light = "#b8c0e0" }, + { name = "go", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "pyo", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "vhdl", text = "󰍛", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "vhd", text = "󰍛", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "rar", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "magnet", text = "", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "vala", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "coffee", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "kdbx", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "po", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "v", text = "󰍛", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "prisma", text = "", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "f90", text = "󱈚", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "txt", text = "󰈙", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "mo", text = "∞", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "mp4", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "cljc", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "heex", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "exs", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "clj", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "luau", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "fcparam", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "markdown", text = "", fg_dark = "#cad3f5", fg_light = "#cad3f5" }, + { name = "dxf", text = "󰻫", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "luac", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "desktop", text = "", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "docx", text = "󰈬", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "cljd", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "txz", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "bicepparam", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "kt", text = "", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "fcstd", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "md", text = "", fg_dark = "#cad3f5", fg_light = "#cad3f5" }, + { name = "edn", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "sub", text = "󰨖", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "ttf", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "tsx", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "hurl", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "dll", text = "", fg_dark = "#181926", fg_light = "#181926" }, + { name = "lhs", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "tsconfig", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "msf", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "ts", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "rproj", text = "󰗆", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "org", text = "", fg_dark = "#8bd5ca", fg_light = "#8bd5ca" }, + { name = "signature", text = "λ", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "elm", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "pyc", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "tmux", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "tgz", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "nu", text = ">", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "tfvars", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "lua", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "astro", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "lib", text = "", fg_dark = "#181926", fg_light = "#181926" }, + { name = "tex", text = "", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "ogg", text = "", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "stp", text = "󰻫", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "sublime", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "test.tsx", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "nswag", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "test.ts", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "test.jsx", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "dwg", text = "󰻫", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "bib", text = "󱉟", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "sass", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "templ", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "tcl", text = "󰛓", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "pck", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "swift", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "makefile", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "xcstrings", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "slim", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "iso", text = "", fg_dark = "#f0c6c6", fg_light = "#f0c6c6" }, + { name = "fsi", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "dart", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "nix", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "svelte", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "sv", text = "󰍛", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "bz2", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "sha256", text = "󰕥", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "twig", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "material", text = "󰔉", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "ppt", text = "󰈧", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "pyd", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "step", text = "󰻫", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "hx", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "webmanifest", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "kicad_sch", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "cjs", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "stl", text = "󰆧", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "ejs", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "ssa", text = "󰨖", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "license", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "jsonc", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "download", text = "", fg_dark = "#8bd5ca", fg_light = "#8bd5ca" }, + { name = "ige", text = "󰻫", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "sqlite", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "psd1", text = "󰨊", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "dump", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "resi", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "spec.ts", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "fnl", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "cu", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "scss", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "config.ru", text = "", fg_dark = "#181926", fg_light = "#181926" }, + { name = "psd", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "db", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "epub", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "haml", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "sol", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "sml", text = "λ", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "svh", text = "󰍛", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "sldprt", text = "󰻫", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "ico", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "xlsx", text = "󰈛", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "rs", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "dconf", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "bz3", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "fdmdownload", text = "", fg_dark = "#8bd5ca", fg_light = "#8bd5ca" }, + { name = "fs", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "patch", text = "", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "hs", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "xcf", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "js", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "pyw", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "sha384", text = "󰕥", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "fcmat", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "csh", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "suo", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "sha224", text = "󰕥", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "sha1", text = "󰕥", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "cr", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "huff", text = "󰡘", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "sh", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "sc", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "ksh", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "cc", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "wma", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "mp3", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "conf", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "3mf", text = "󰆧", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "sbt", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "kicad_mod", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "terminal", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "rlib", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "pdf", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "mts", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "kdenlive", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "kts", text = "", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "spec.tsx", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "res", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "hxx", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "rb", text = "", fg_dark = "#181926", fg_light = "#181926" }, + { name = "vh", text = "󰍛", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "ixx", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "cson", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "cts", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "7z", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "ex", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "cpp", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "qss", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "app", text = "", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "jxl", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "qrc", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "qml", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "epp", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "otf", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "hh", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "qm", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "pro", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "exe", text = "", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "kdenlivetitle", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "kdb", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "mpp", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "Dockerfile", text = "󰡨", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "bqn", text = "⎉", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "torrent", text = "", fg_dark = "#8bd5ca", fg_light = "#8bd5ca" }, + { name = "m3u", text = "󰲹", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "py", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "pxd", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "f3d", text = "󰻫", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "out", text = "", fg_dark = "#494d64", fg_light = "#494d64" }, + { name = "spec.jsx", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "kicad_dru", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "a6da95", text = "󰨊", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "ui", text = "", fg_dark = "#363a4f", fg_light = "#363a4f" }, + { name = "styl", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "f#", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "png", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "ply", text = "󰆧", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "php", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "eex", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "tbc", text = "󰛓", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "part", text = "", fg_dark = "#8bd5ca", fg_light = "#8bd5ca" }, + { name = "pub", text = "󰷖", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "ipynb", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "opus", text = "", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "git", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "bmp", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "blade.php", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "nim", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "xpi", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "mustache", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "tscn", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "scad", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "ai", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "hex", text = "", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "hpp", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "xul", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "mobi", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "fcstd1", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "ical", text = "", fg_dark = "#363a4f", fg_light = "#363a4f" }, + { name = "icalendar", text = "", fg_dark = "#363a4f", fg_light = "#363a4f" }, + { name = "bicep", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "mm", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "mkv", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "graphql", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "mjs", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "mint", text = "󰌪", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "m4v", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "m4a", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "tf", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "gv", text = "󱁉", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "lock", text = "", fg_dark = "#b8c0e0", fg_light = "#b8c0e0" }, + { name = "krz", text = "", fg_dark = "#c6a0f6", fg_light = "#c6a0f6" }, + { name = "kpp", text = "", fg_dark = "#c6a0f6", fg_light = "#c6a0f6" }, + { name = "ko", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "kicad_sym", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "psm1", text = "󰨊", fg_dark = "#6e738d", fg_light = "#6e738d" }, + { name = "pyx", text = "", fg_dark = "#8aadf4", fg_light = "#8aadf4" }, + { name = "json5", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "json", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "bzl", text = "", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "ifb", text = "", fg_dark = "#363a4f", fg_light = "#363a4f" }, + { name = "image", text = "", fg_dark = "#f0c6c6", fg_light = "#f0c6c6" }, + { name = "jpg", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "jpeg", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "java", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "wv", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "ini", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "cast", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "cp", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "fctl", text = "", fg_dark = "#ed8796", fg_light = "#ed8796" }, + { name = "ifc", text = "󰻫", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "sldasm", text = "󰻫", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "html", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "typoscript", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "🔥", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "htm", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "ste", text = "󰻫", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "spec.js", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "gresource", text = "", fg_dark = "#f4dbd6", fg_light = "#f4dbd6" }, + { name = "ebook", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "gradle", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "gd", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "fish", text = "", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "igs", text = "󰻫", fg_dark = "#a6da95", fg_light = "#a6da95" }, + { name = "fbx", text = "󰆧", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "env", text = "", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "srt", text = "󰨖", fg_dark = "#eed49f", fg_light = "#eed49f" }, + { name = "dot", text = "󱁉", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "doc", text = "󰈬", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "d.ts", text = "", fg_dark = "#f5a97f", fg_light = "#f5a97f" }, + { name = "applescript", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "cxx", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "img", text = "", fg_dark = "#f0c6c6", fg_light = "#f0c6c6" }, + { name = "cljs", text = "", fg_dark = "#7dc4e4", fg_light = "#7dc4e4" }, + { name = "cobol", text = "⚙", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "cob", text = "⚙", fg_dark = "#5b6078", fg_light = "#5b6078" }, + { name = "cmake", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, + { name = "webp", text = "", fg_dark = "#8087a2", fg_light = "#8087a2" }, +] diff --git a/yazi/init.lua b/yazi/init.lua new file mode 100644 index 0000000..dbcd34a --- /dev/null +++ b/yazi/init.lua @@ -0,0 +1,193 @@ +local catppuccin_palette = { + rosewater = "#f4dbd6", + flamingo = "#f0c6c6", + pink = "#f5bde6", + mauve = "#c6a0f6", + red = "#ed8796", + maroon = "#ee99a0", + peach = "#f5a97f", + yellow = "#eed49f", + green = "#a6da95", + teal = "#8bd5ca", + sky = "#91d7e3", + sapphire = "#7dc4e4", + blue = "#8aadf4", + lavender = "#b7bdf8", + text = "#cad3f5", + subtext1 = "#b8c0e0", + subtext0 = "#a5adcb", + overlay2 = "#939ab7", + overlay1 = "#8087a2", + overlay0 = "#6e738d", + surface2 = "#5b6078", + surface1 = "#494d64", + surface0 = "#363a4f", + base = "#24273a", + mantle = "#1e2030", + crust = "#181926", +} + +-- Plugins +require("full-border"):setup({ + type = ui.Border.ROUNDED, +}) + +require("zoxide"):setup({ + update_db = true, +}) + +require("session"):setup({ + sync_yanked = true, +}) + +require("searchjump"):setup({ + unmatch_fg = catppuccin_palette.overlay0, + match_str_fg = catppuccin_palette.peach, + match_str_bg = catppuccin_palette.base, + first_match_str_fg = catppuccin_palette.lavender, + first_match_str_bg = catppuccin_palette.base, + lable_fg = catppuccin_palette.green, + lable_bg = catppuccin_palette.base, + only_current = false, -- only search the current window + show_search_in_statusbar = false, + auto_exit_when_unmatch = false, + enable_capital_lable = false, + search_patterns = {}, -- demo:{"%.e%d+","s%d+e%d+"} +}) + +require("yatline"):setup({ + section_separator = { open = "", close = "" }, + inverse_separator = { open = "", close = "" }, + part_separator = { open = "", close = "" }, + + style_a = { + fg = catppuccin_palette.mantle, + bg_mode = { + normal = catppuccin_palette.blue, + select = catppuccin_palette.mauve, + un_set = catppuccin_palette.red, + }, + }, + style_b = { bg = catppuccin_palette.surface0, fg = catppuccin_palette.text }, + style_c = { bg = catppuccin_palette.base, fg = catppuccin_palette.text }, + + permissions_t_fg = catppuccin_palette.green, + permissions_r_fg = catppuccin_palette.yellow, + permissions_w_fg = catppuccin_palette.red, + permissions_x_fg = catppuccin_palette.sky, + permissions_s_fg = catppuccin_palette.lavender, + + selected = { icon = "󰻭", fg = catppuccin_palette.yellow }, + copied = { icon = "", fg = catppuccin_palette.green }, + cut = { icon = "", fg = catppuccin_palette.red }, + + total = { icon = "", fg = catppuccin_palette.yellow }, + succ = { icon = "", fg = catppuccin_palette.green }, + fail = { icon = "", fg = catppuccin_palette.red }, + found = { icon = "", fg = catppuccin_palette.blue }, + processed = { icon = "", fg = catppuccin_palette.green }, + + tab_width = 20, + tab_use_inverse = true, + + show_background = false, + + display_header_line = true, + display_status_line = true, + + header_line = { + left = { + section_a = { + { type = "line", custom = false, name = "tabs", params = { "left" } }, + }, + section_b = { + { type = "coloreds", custom = false, name = "githead" }, + }, + section_c = {}, + }, + right = { + section_a = { + { type = "string", custom = false, name = "tab_path" }, + }, + section_b = { + { type = "coloreds", custom = false, name = "task_workload" }, + }, + section_c = { + { type = "coloreds", custom = false, name = "task_states" }, + }, + }, + }, + + status_line = { + left = { + section_a = { + { type = "string", custom = false, name = "tab_mode" }, + }, + section_b = { + { type = "string", custom = false, name = "hovered_size" }, + }, + section_c = { + { type = "string", custom = false, name = "hovered_name" }, + { type = "coloreds", custom = false, name = "count" }, + }, + }, + right = { + section_a = { + { type = "string", custom = false, name = "cursor_position" }, + }, + section_b = { + { type = "string", custom = false, name = "cursor_percentage" }, + }, + section_c = { + { type = "string", custom = false, name = "hovered_file_extension", params = { true } }, + { type = "coloreds", custom = false, name = "permissions" }, + }, + }, + }, +}) + +require("yatline-githead"):setup({ + show_branch = true, + branch_prefix = "", + branch_symbol = "", + branch_borders = "", + + commit_symbol = " ", + + show_behind_ahead = true, + behind_symbol = " ", + ahead_symbol = " ", + + show_stashes = true, + stashes_symbol = " ", + + show_state = true, + show_state_prefix = true, + state_symbol = "󱅉", + + show_staged = true, + staged_symbol = " ", + + show_unstaged = true, + unstaged_symbol = " ", + + show_untracked = true, + untracked_symbol = " ", + + prefix_color = catppuccin_palette.pink, + branch_color = catppuccin_palette.pink, + commit_color = catppuccin_palette.mauve, + stashes_color = catppuccin_palette.teal, + state_color = catppuccin_palette.lavender, + staged_color = catppuccin_palette.green, + unstaged_color = catppuccin_palette.yellow, + untracked_color = catppuccin_palette.pink, + ahead_color = catppuccin_palette.green, + behind_color = catppuccin_palette.yellow, +}) + +require("git"):setup() + +require("fg"):setup({ + default_action = "jump", +}) diff --git a/yazi/keymap.toml b/yazi/keymap.toml new file mode 100644 index 0000000..5e47e60 --- /dev/null +++ b/yazi/keymap.toml @@ -0,0 +1,58 @@ +"$schema" = "https://yazi-rs.github.io/schemas/keymap.json" + +[manager] + +prepend_keymap = [ + { on = [ + "!", + ], run = 'shell "$SHELL" --block', desc = "Open shell here" }, + { on = [ + "c", + "a", + ], run = "plugin compress", desc = "Archive selected files" }, + { on = "", run = "seek -5", desc = "Seek up 5 units in the preview" }, + { on = "", run = "seek 5", desc = "Seek down 5 units in the preview" }, + { on = "K", run = "arrow -50%", desc = "Move cursor up half page" }, + { on = "J", run = "arrow 50%", desc = "Move cursor down half page" }, + { on = "", run = "arrow -5", desc = "Move cursor up half page" }, + { on = "", run = "arrow 5", desc = "Move cursor down half page" }, + { on = [ + "f", + "g", + ], run = "plugin fg", desc = "find file by content (fuzzy match)" }, + { on = [ + "f", + "f", + ], run = "filter --smart", desc = "Filter files" }, + { on = [ + "s", + ], run = "plugin searchjump", desc = "Flash" }, + { on = "S", run = "search --via=fd", desc = "Search files by name using fd" }, + { on = [ + "", + ], run = 'shell -- for path in "$@"; do echo "file://$path"; done | wl-copy -t text/uri-list', desc = "Copy to clipboard" }, + { on = "A", run = "create --dir", desc = "Create a dir" }, + { on = [ + "g", + "r", + ], run = 'shell -- ya emit cd "$(git rev-parse --show-toplevel)"', desc = "Root of Git Repo" }, + { on = "H", run = "tab_switch -1 --relative", desc = "Switch to the previous tab" }, + { on = "L", run = "tab_switch 1 --relative", desc = "Switch to the next tab" }, + { on = "<", run = "tab_swap -1", desc = "Swap current tab with previous tab" }, + { on = ">", run = "tab_swap 1", desc = "Swap current tab with next tab" }, +] + +append_keymap = [ + { on = [ + "e", + ], run = "open", desc = "Open the selected files" }, + { on = [ + "E", + ], run = "open --interactive", desc = "Open the selected files interactively" }, +] + +[completion] +prepend_keymap = [ + { on = "", run = "arrow -1", desc = "Move cursor up" }, + { on = "", run = "arrow 1", desc = "Move cursor down" }, +] diff --git a/yazi/package.toml b/yazi/package.toml new file mode 100644 index 0000000..fb2a964 --- /dev/null +++ b/yazi/package.toml @@ -0,0 +1,27 @@ +[[plugin.deps]] +use = "yazi-rs/plugins:full-border" +rev = "2730199" +hash = "1f3dad061209081a6b04dd6ff2cb06c7" + +[[plugin.deps]] +use = "KKV9/compress" +rev = "60b24af" +hash = "ee025be766240cc98e671754ac836da3" + +[[plugin.deps]] +use = "imsi32/yatline" +rev = "6b0fc1e" +hash = "ab115c6cc77f5710c27f39dfa2f3d4d" + +[[plugin.deps]] +use = "imsi32/yatline-githead" +rev = "3b0eb7c" +hash = "bfd30c396bbe2af526cb949d97ce3dcf" + +[[plugin.deps]] +use = "yazi-rs/plugins:git" +rev = "2730199" +hash = "e0d2c8d7e7afe5b82270367098d1a821" + +[flavor] +deps = [] diff --git a/yazi/theme.toml b/yazi/theme.toml new file mode 100644 index 0000000..f9408ae --- /dev/null +++ b/yazi/theme.toml @@ -0,0 +1,14 @@ +[icon] +prepend_dirs = [ + { name = "desktop", text = "" }, + { name = "dev", text = "" }, + { name = "documents", text = "" }, + { name = "downloads", text = "" }, + { name = "music", text = "" }, + { name = "games", text = "󰊴" }, + { name = "pictures", text = "" }, + { name = "videos", text = "" }, +] + +[flavor] +use = "catppuccin-macchiato" diff --git a/yazi/yazi.toml b/yazi/yazi.toml new file mode 100644 index 0000000..0dd35b0 --- /dev/null +++ b/yazi/yazi.toml @@ -0,0 +1,90 @@ +"$schema" = "https://yazi-rs.github.io/schemas/yazi.json" + +[manager] +ratio = [1, 4, 3] +sort_by = "natural" +sort_dir_first = true + +[opener] +folder = [ + { run = 'hyprctl dispatch exec "[float; size 60% 60%; center 1] nemo" "$1"', orphan = true, desc = "nemo", for = "linux" }, + { run = '''fish -c "nvim "$1""''', block = true, desc = "neovim", for = "linux" }, + { run = 'kitty --detach nvim "$@"', orphan = true, desc = "neovim (detached)", for = "linux" }, + { run = '''fish -c "lazygit -p "$1""''', block = true, desc = "lazygit", for = "linux" }, + { run = 'codium "$@"', orphan = true, desc = "vscodium", for = "linux" }, + { run = 'kitty "$@"', orphan = true, desc = "kitty", for = "linux" }, + { run = 'xdg-open "$@"', orphan = true, desc = "xdg-open", for = "linux" }, +] + +text = [ + { run = '$EDITOR "$@"', block = true, desc = "$EDITOR", for = "linux" }, + { run = 'nvim "$@"', block = true, desc = "neovim", for = "linux" }, + { run = 'kitty --detach nvim "$@"', block = true, desc = "neovim (detached)", for = "linux" }, + { run = 'codium "$@"', orphan = true, desc = "vscodium", for = "linux" }, + { run = 'xdg-open "$@"', orphan = true, desc = "xdg-open", for = "linux" }, +] + +document = [ + { run = 'xdg-open "$@"', orphan = true, desc = "xdg-open", for = "linux" }, + { run = 'zathura "$@"', orphan = true, desc = "zathura", for = "linux" }, + { run = 'libreoffice "$@"', orphan = true, desc = "libreoffice", for = "linux" }, +] + +image = [ + { run = 'xdg-open "$@"', orphan = true, desc = "xdg-open", for = "linux" }, + { run = 'qimgv "$@"', orphan = true, desc = "qimgv", for = "linux" }, + { run = 'krita "$@"', orphan = true, desc = "krita", for = "linux" }, + { run = 'satty --filename "$@"', orphan = true, desc = "satty", for = "linux" }, +] + +video = [ + { run = 'xdg-open "$@"', orphan = true, desc = "xdg-open", for = "linux" }, + { run = 'mpv "$@"', orphan = true, desc = "mpv", for = "linux" }, + { run = 'vlc "$@"', orphan = true, desc = "vlc", for = "linux" }, +] + +audio = [ + { run = 'xdg-open "$@"', orphan = true, desc = "xdg-open", for = "linux" }, + { run = 'mpv "$@"', orphan = true, desc = "mpv", for = "linux" }, + { run = 'vlc "$@"', orphan = true, desc = "vlc", for = "linux" }, +] + +fallback = [ + { run = 'xdg-open "$@"', orphan = true, desc = "xdg-open", for = "linux" }, +] + +[open] +rules = [ + { name = "*/", use = "folder" }, + + { mime = "text/*", use = "text" }, + { mime = "image/*", use = "image" }, + { mime = "video/*", use = "video" }, + { mime = "application/octet-stream", use = "video" }, + { mime = "audio/*", use = "audio" }, + { mime = "inode/x-empty", use = "text" }, + { mime = "application/json", use = "text" }, + + { mime = "application/zip", use = "archive" }, + { mime = "application/gzip", use = "archive" }, + { mime = "application/x-bzip", use = "archive" }, + { mime = "application/x-bzip2", use = "archive" }, + { mime = "application/x-tar", use = "archive" }, + { mime = "application/x-7z-compressed", use = "archive" }, + { mime = "application/x-rar", use = "archive" }, + { mime = "application/pdf", use = "document" }, + { mime = "application/epub+zip", use = "document" }, + { mime = "application/x-mobipocket-ebook", use = "document" }, + + { mime = "*", use = "fallback" }, +] + +[[plugin.prepend_fetchers]] +id = "git" +name = "*" +run = "git" + +[[plugin.prepend_fetchers]] +id = "git" +name = "*/" +run = "git" diff --git a/zathura/.github/README.md b/zathura/.github/README.md new file mode 100644 index 0000000..affa9d5 --- /dev/null +++ b/zathura/.github/README.md @@ -0,0 +1,3 @@ +
+ +
diff --git a/zathura/.github/title.png b/zathura/.github/title.png new file mode 100644 index 0000000..6619f0b Binary files /dev/null and b/zathura/.github/title.png differ diff --git a/zathura/zathurarc b/zathura/zathurarc new file mode 100644 index 0000000..429f1d2 --- /dev/null +++ b/zathura/zathurarc @@ -0,0 +1,71 @@ +# Open document in fit-width mode by default +set adjust-open "best-fit" + +# One page per row by default +set pages-per-row 1 + +# Stop at page boundries +set scroll-page-aware "true" +set smooth-scroll "true" +set scroll-full-overlap 0.01 +set scroll-step 100 + +# Zoom settings +set zoom-min 10 +set guioptions "" + +set render-loading "false" +set font "JetBrainsMono NF" +unmap f +map f toggle_fullscreen +unmap a +map a toggle_statusbar +map [fullscreen] f toggle_fullscreen + + +set selection-clipboard clipboard +set window-title-page true + +# Colors +set default-fg rgba(202,211,245,1) +set default-bg rgba(36,39,58,1) + +set completion-bg rgba(54,58,79,1) +set completion-fg rgba(202,211,245,1) +set completion-highlight-bg rgba(87,82,104,1) +set completion-highlight-fg rgba(202,211,245,1) +set completion-group-bg rgba(54,58,79,1) +set completion-group-fg rgba(138,173,244,1) + +set statusbar-fg rgba(202,211,245,1) +set statusbar-bg rgba(54,58,79,1) + +set notification-bg rgba(54,58,79,1) +set notification-fg rgba(202,211,245,1) +set notification-error-bg rgba(54,58,79,1) +set notification-error-fg rgba(237,135,150,1) +set notification-warning-bg rgba(54,58,79,1) +set notification-warning-fg rgba(250,227,176,1) + +set inputbar-fg rgba(202,211,245,1) +set inputbar-bg rgba(54,58,79,1) + +set recolor "true" +set recolor-lightcolor rgba(36,39,58,1) +set recolor-darkcolor rgba(202,211,245,1) + +set index-fg rgba(202,211,245,1) +set index-bg rgba(36,39,58,1) +set index-active-fg rgba(202,211,245,1) +set index-active-bg rgba(54,58,79,1) + +set render-loading-bg rgba(36,39,58,1) +set render-loading-fg rgba(202,211,245,1) + +set highlight-color rgba(87,82,104,0.5) +set highlight-fg rgba(245,189,230,0.5) +set highlight-active-color rgba(245,189,230,0.5) + +set recolor "true" +set recolor-reverse-video "true" +set recolor-keephue "true"