Skip to content

Commit 1058c30

Browse files
authored
Merge pull request #1403 from Textualize/nested-height-fix
fix for nested heights
2 parents 552b0cc + 93716e7 commit 1058c30

File tree

6 files changed

+241
-3
lines changed

6 files changed

+241
-3
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
77

88
## [0.8.0] - Unreleased
99

10+
### Fixed
11+
12+
- Fixed issues with nested auto dimensions https://github.com/Textualize/textual/issues/1402
13+
1014
### Added
1115

1216
- Added `textual.actions.SkipAction` exception which can be raised from an action to allow parents to process bindings.

src/textual/widget.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2176,8 +2176,14 @@ def refresh(
21762176

21772177
if layout:
21782178
self._layout_required = True
2179-
if isinstance(self._parent, Widget):
2180-
self._parent._clear_arrangement_cache()
2179+
for ancestor in self.ancestors:
2180+
if not isinstance(ancestor, Widget):
2181+
break
2182+
if ancestor.styles.auto_dimensions:
2183+
for ancestor in self.ancestors_with_self:
2184+
if isinstance(ancestor, Widget):
2185+
ancestor._clear_arrangement_cache()
2186+
break
21812187

21822188
if repaint:
21832189
self._set_dirty(*regions)

tests/snapshot_tests/__snapshots__/test_snapshots.ambr

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7143,6 +7143,165 @@
71437143

71447144
'''
71457145
# ---
7146+
# name: test_nested_auto_heights
7147+
'''
7148+
<svg class="rich-terminal" viewBox="0 0 994 635.5999999999999" xmlns="http://www.w3.org/2000/svg">
7149+
<!-- Generated with Rich https://www.textualize.io -->
7150+
<style>
7151+
7152+
@font-face {
7153+
font-family: "Fira Code";
7154+
src: local("FiraCode-Regular"),
7155+
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
7156+
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
7157+
font-style: normal;
7158+
font-weight: 400;
7159+
}
7160+
@font-face {
7161+
font-family: "Fira Code";
7162+
src: local("FiraCode-Bold"),
7163+
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
7164+
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
7165+
font-style: bold;
7166+
font-weight: 700;
7167+
}
7168+
7169+
.terminal-2940916684-matrix {
7170+
font-family: Fira Code, monospace;
7171+
font-size: 20px;
7172+
line-height: 24.4px;
7173+
font-variant-east-asian: full-width;
7174+
}
7175+
7176+
.terminal-2940916684-title {
7177+
font-size: 18px;
7178+
font-weight: bold;
7179+
font-family: arial;
7180+
}
7181+
7182+
.terminal-2940916684-r1 { fill: #90ee90 }
7183+
.terminal-2940916684-r2 { fill: #c5c8c6 }
7184+
.terminal-2940916684-r3 { fill: #add8e6 }
7185+
.terminal-2940916684-r4 { fill: #808080 }
7186+
.terminal-2940916684-r5 { fill: #dddddd }
7187+
.terminal-2940916684-r6 { fill: #ffdddd }
7188+
</style>
7189+
7190+
<defs>
7191+
<clipPath id="terminal-2940916684-clip-terminal">
7192+
<rect x="0" y="0" width="975.0" height="584.5999999999999" />
7193+
</clipPath>
7194+
<clipPath id="terminal-2940916684-line-0">
7195+
<rect x="0" y="1.5" width="976" height="24.65"/>
7196+
</clipPath>
7197+
<clipPath id="terminal-2940916684-line-1">
7198+
<rect x="0" y="25.9" width="976" height="24.65"/>
7199+
</clipPath>
7200+
<clipPath id="terminal-2940916684-line-2">
7201+
<rect x="0" y="50.3" width="976" height="24.65"/>
7202+
</clipPath>
7203+
<clipPath id="terminal-2940916684-line-3">
7204+
<rect x="0" y="74.7" width="976" height="24.65"/>
7205+
</clipPath>
7206+
<clipPath id="terminal-2940916684-line-4">
7207+
<rect x="0" y="99.1" width="976" height="24.65"/>
7208+
</clipPath>
7209+
<clipPath id="terminal-2940916684-line-5">
7210+
<rect x="0" y="123.5" width="976" height="24.65"/>
7211+
</clipPath>
7212+
<clipPath id="terminal-2940916684-line-6">
7213+
<rect x="0" y="147.9" width="976" height="24.65"/>
7214+
</clipPath>
7215+
<clipPath id="terminal-2940916684-line-7">
7216+
<rect x="0" y="172.3" width="976" height="24.65"/>
7217+
</clipPath>
7218+
<clipPath id="terminal-2940916684-line-8">
7219+
<rect x="0" y="196.7" width="976" height="24.65"/>
7220+
</clipPath>
7221+
<clipPath id="terminal-2940916684-line-9">
7222+
<rect x="0" y="221.1" width="976" height="24.65"/>
7223+
</clipPath>
7224+
<clipPath id="terminal-2940916684-line-10">
7225+
<rect x="0" y="245.5" width="976" height="24.65"/>
7226+
</clipPath>
7227+
<clipPath id="terminal-2940916684-line-11">
7228+
<rect x="0" y="269.9" width="976" height="24.65"/>
7229+
</clipPath>
7230+
<clipPath id="terminal-2940916684-line-12">
7231+
<rect x="0" y="294.3" width="976" height="24.65"/>
7232+
</clipPath>
7233+
<clipPath id="terminal-2940916684-line-13">
7234+
<rect x="0" y="318.7" width="976" height="24.65"/>
7235+
</clipPath>
7236+
<clipPath id="terminal-2940916684-line-14">
7237+
<rect x="0" y="343.1" width="976" height="24.65"/>
7238+
</clipPath>
7239+
<clipPath id="terminal-2940916684-line-15">
7240+
<rect x="0" y="367.5" width="976" height="24.65"/>
7241+
</clipPath>
7242+
<clipPath id="terminal-2940916684-line-16">
7243+
<rect x="0" y="391.9" width="976" height="24.65"/>
7244+
</clipPath>
7245+
<clipPath id="terminal-2940916684-line-17">
7246+
<rect x="0" y="416.3" width="976" height="24.65"/>
7247+
</clipPath>
7248+
<clipPath id="terminal-2940916684-line-18">
7249+
<rect x="0" y="440.7" width="976" height="24.65"/>
7250+
</clipPath>
7251+
<clipPath id="terminal-2940916684-line-19">
7252+
<rect x="0" y="465.1" width="976" height="24.65"/>
7253+
</clipPath>
7254+
<clipPath id="terminal-2940916684-line-20">
7255+
<rect x="0" y="489.5" width="976" height="24.65"/>
7256+
</clipPath>
7257+
<clipPath id="terminal-2940916684-line-21">
7258+
<rect x="0" y="513.9" width="976" height="24.65"/>
7259+
</clipPath>
7260+
<clipPath id="terminal-2940916684-line-22">
7261+
<rect x="0" y="538.3" width="976" height="24.65"/>
7262+
</clipPath>
7263+
</defs>
7264+
7265+
<rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="992" height="633.6" rx="8"/><text class="terminal-2940916684-title" fill="#c5c8c6" text-anchor="middle" x="496" y="27">NestedAutoApp</text>
7266+
<g transform="translate(26,22)">
7267+
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
7268+
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
7269+
<circle cx="44" cy="0" r="7" fill="#28c840"/>
7270+
</g>
7271+
7272+
<g transform="translate(9, 41)" clip-path="url(#terminal-2940916684-clip-terminal)">
7273+
<rect fill="#008000" x="0" y="1.5" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#008000" x="0" y="25.9" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#0000ff" x="12.2" y="25.9" width="207.4" height="24.65" shape-rendering="crispEdges"/><rect fill="#008000" x="219.6" y="25.9" width="744.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#008000" x="963.8" y="25.9" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#008000" x="0" y="50.3" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#0000ff" x="12.2" y="50.3" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#000000" x="24.4" y="50.3" width="183" height="24.65" shape-rendering="crispEdges"/><rect fill="#0000ff" x="207.4" y="50.3" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#008000" x="219.6" y="50.3" width="744.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#008000" x="963.8" y="50.3" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#008000" x="0" y="74.7" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#0000ff" x="12.2" y="74.7" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#000000" x="24.4" y="74.7" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#000000" x="36.6" y="74.7" width="158.6" height="24.65" shape-rendering="crispEdges"/><rect fill="#000000" x="195.2" y="74.7" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#0000ff" x="207.4" y="74.7" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#008000" x="219.6" y="74.7" width="744.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#008000" x="963.8" y="74.7" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#008000" x="0" y="99.1" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#0000ff" x="12.2" y="99.1" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#000000" x="24.4" y="99.1" width="183" height="24.65" shape-rendering="crispEdges"/><rect fill="#0000ff" x="207.4" y="99.1" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#008000" x="219.6" y="99.1" width="744.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#008000" x="963.8" y="99.1" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#008000" x="0" y="123.5" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#0000ff" x="12.2" y="123.5" width="207.4" height="24.65" shape-rendering="crispEdges"/><rect fill="#008000" x="219.6" y="123.5" width="744.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#008000" x="963.8" y="123.5" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#008000" x="0" y="147.9" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#ff0000" x="0" y="172.3" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#ff0000" x="0" y="196.7" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#ff0000" x="0" y="221.1" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#ff0000" x="0" y="245.5" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#ff0000" x="0" y="269.9" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#ff0000" x="0" y="294.3" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#ff0000" x="0" y="318.7" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#ff0000" x="0" y="343.1" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#ff0000" x="0" y="367.5" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#ff0000" x="0" y="391.9" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#ff0000" x="0" y="416.3" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#ff0000" x="0" y="440.7" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#ff0000" x="0" y="465.1" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#ff0000" x="0" y="489.5" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#ff0000" x="0" y="513.9" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#ff0000" x="0" y="538.3" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#ff0000" x="0" y="562.7" width="976" height="24.65" shape-rendering="crispEdges"/>
7274+
<g class="terminal-2940916684-matrix">
7275+
<text class="terminal-2940916684-r1" x="0" y="20" textLength="976" clip-path="url(#terminal-2940916684-line-0)">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓</text><text class="terminal-2940916684-r2" x="976" y="20" textLength="12.2" clip-path="url(#terminal-2940916684-line-0)">
7276+
</text><text class="terminal-2940916684-r1" x="0" y="44.4" textLength="12.2" clip-path="url(#terminal-2940916684-line-1)">┃</text><text class="terminal-2940916684-r3" x="12.2" y="44.4" textLength="207.4" clip-path="url(#terminal-2940916684-line-1)">┏━━━━━━━━━━━━━━━┓</text><text class="terminal-2940916684-r1" x="963.8" y="44.4" textLength="12.2" clip-path="url(#terminal-2940916684-line-1)">┃</text><text class="terminal-2940916684-r2" x="976" y="44.4" textLength="12.2" clip-path="url(#terminal-2940916684-line-1)">
7277+
</text><text class="terminal-2940916684-r1" x="0" y="68.8" textLength="12.2" clip-path="url(#terminal-2940916684-line-2)">┃</text><text class="terminal-2940916684-r3" x="12.2" y="68.8" textLength="12.2" clip-path="url(#terminal-2940916684-line-2)">┃</text><text class="terminal-2940916684-r4" x="24.4" y="68.8" textLength="183" clip-path="url(#terminal-2940916684-line-2)">┏━━━━━━━━━━━━━┓</text><text class="terminal-2940916684-r3" x="207.4" y="68.8" textLength="12.2" clip-path="url(#terminal-2940916684-line-2)">┃</text><text class="terminal-2940916684-r1" x="963.8" y="68.8" textLength="12.2" clip-path="url(#terminal-2940916684-line-2)">┃</text><text class="terminal-2940916684-r2" x="976" y="68.8" textLength="12.2" clip-path="url(#terminal-2940916684-line-2)">
7278+
</text><text class="terminal-2940916684-r1" x="0" y="93.2" textLength="12.2" clip-path="url(#terminal-2940916684-line-3)">┃</text><text class="terminal-2940916684-r3" x="12.2" y="93.2" textLength="12.2" clip-path="url(#terminal-2940916684-line-3)">┃</text><text class="terminal-2940916684-r4" x="24.4" y="93.2" textLength="12.2" clip-path="url(#terminal-2940916684-line-3)">┃</text><text class="terminal-2940916684-r5" x="36.6" y="93.2" textLength="158.6" clip-path="url(#terminal-2940916684-line-3)">JUST&#160;ONE&#160;LINE</text><text class="terminal-2940916684-r4" x="195.2" y="93.2" textLength="12.2" clip-path="url(#terminal-2940916684-line-3)">┃</text><text class="terminal-2940916684-r3" x="207.4" y="93.2" textLength="12.2" clip-path="url(#terminal-2940916684-line-3)">┃</text><text class="terminal-2940916684-r1" x="963.8" y="93.2" textLength="12.2" clip-path="url(#terminal-2940916684-line-3)">┃</text><text class="terminal-2940916684-r2" x="976" y="93.2" textLength="12.2" clip-path="url(#terminal-2940916684-line-3)">
7279+
</text><text class="terminal-2940916684-r1" x="0" y="117.6" textLength="12.2" clip-path="url(#terminal-2940916684-line-4)">┃</text><text class="terminal-2940916684-r3" x="12.2" y="117.6" textLength="12.2" clip-path="url(#terminal-2940916684-line-4)">┃</text><text class="terminal-2940916684-r4" x="24.4" y="117.6" textLength="183" clip-path="url(#terminal-2940916684-line-4)">┗━━━━━━━━━━━━━┛</text><text class="terminal-2940916684-r3" x="207.4" y="117.6" textLength="12.2" clip-path="url(#terminal-2940916684-line-4)">┃</text><text class="terminal-2940916684-r1" x="963.8" y="117.6" textLength="12.2" clip-path="url(#terminal-2940916684-line-4)">┃</text><text class="terminal-2940916684-r2" x="976" y="117.6" textLength="12.2" clip-path="url(#terminal-2940916684-line-4)">
7280+
</text><text class="terminal-2940916684-r1" x="0" y="142" textLength="12.2" clip-path="url(#terminal-2940916684-line-5)">┃</text><text class="terminal-2940916684-r3" x="12.2" y="142" textLength="207.4" clip-path="url(#terminal-2940916684-line-5)">┗━━━━━━━━━━━━━━━┛</text><text class="terminal-2940916684-r1" x="963.8" y="142" textLength="12.2" clip-path="url(#terminal-2940916684-line-5)">┃</text><text class="terminal-2940916684-r2" x="976" y="142" textLength="12.2" clip-path="url(#terminal-2940916684-line-5)">
7281+
</text><text class="terminal-2940916684-r1" x="0" y="166.4" textLength="976" clip-path="url(#terminal-2940916684-line-6)">┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛</text><text class="terminal-2940916684-r2" x="976" y="166.4" textLength="12.2" clip-path="url(#terminal-2940916684-line-6)">
7282+
</text><text class="terminal-2940916684-r2" x="976" y="190.8" textLength="12.2" clip-path="url(#terminal-2940916684-line-7)">
7283+
</text><text class="terminal-2940916684-r2" x="976" y="215.2" textLength="12.2" clip-path="url(#terminal-2940916684-line-8)">
7284+
</text><text class="terminal-2940916684-r2" x="976" y="239.6" textLength="12.2" clip-path="url(#terminal-2940916684-line-9)">
7285+
</text><text class="terminal-2940916684-r2" x="976" y="264" textLength="12.2" clip-path="url(#terminal-2940916684-line-10)">
7286+
</text><text class="terminal-2940916684-r2" x="976" y="288.4" textLength="12.2" clip-path="url(#terminal-2940916684-line-11)">
7287+
</text><text class="terminal-2940916684-r2" x="976" y="312.8" textLength="12.2" clip-path="url(#terminal-2940916684-line-12)">
7288+
</text><text class="terminal-2940916684-r2" x="976" y="337.2" textLength="12.2" clip-path="url(#terminal-2940916684-line-13)">
7289+
</text><text class="terminal-2940916684-r2" x="976" y="361.6" textLength="12.2" clip-path="url(#terminal-2940916684-line-14)">
7290+
</text><text class="terminal-2940916684-r2" x="976" y="386" textLength="12.2" clip-path="url(#terminal-2940916684-line-15)">
7291+
</text><text class="terminal-2940916684-r2" x="976" y="410.4" textLength="12.2" clip-path="url(#terminal-2940916684-line-16)">
7292+
</text><text class="terminal-2940916684-r2" x="976" y="434.8" textLength="12.2" clip-path="url(#terminal-2940916684-line-17)">
7293+
</text><text class="terminal-2940916684-r2" x="976" y="459.2" textLength="12.2" clip-path="url(#terminal-2940916684-line-18)">
7294+
</text><text class="terminal-2940916684-r2" x="976" y="483.6" textLength="12.2" clip-path="url(#terminal-2940916684-line-19)">
7295+
</text><text class="terminal-2940916684-r2" x="976" y="508" textLength="12.2" clip-path="url(#terminal-2940916684-line-20)">
7296+
</text><text class="terminal-2940916684-r2" x="976" y="532.4" textLength="12.2" clip-path="url(#terminal-2940916684-line-21)">
7297+
</text><text class="terminal-2940916684-r2" x="976" y="556.8" textLength="12.2" clip-path="url(#terminal-2940916684-line-22)">
7298+
</text>
7299+
</g>
7300+
</g>
7301+
</svg>
7302+
7303+
'''
7304+
# ---
71467305
# name: test_offsets
71477306
'''
71487307
<svg class="rich-terminal" viewBox="0 0 994 635.5999999999999" xmlns="http://www.w3.org/2000/svg">

tests/snapshot_tests/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ def pytest_terminal_summary(
188188
Displays the link to the snapshot report that was generated in a prior hook.
189189
"""
190190
diffs = getattr(config, "_textual_snapshots", None)
191-
console = Console()
191+
console = Console(legacy_windows=False, force_terminal=True)
192192
if diffs:
193193
snapshot_report_location = config._textual_snapshot_html_report
194194
console.rule("[b red]Textual Snapshot Report", style="red")
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#!/usr/bin/env python3
2+
3+
from __future__ import annotations
4+
5+
from textual.app import App, ComposeResult
6+
from textual.containers import Vertical
7+
from textual.widgets import Static
8+
9+
10+
class NestedAutoApp(App[None]):
11+
CSS = """
12+
Screen {
13+
background: red;
14+
}
15+
16+
#my-static-container {
17+
border: heavy lightgreen;
18+
background: green;
19+
height: auto;
20+
max-height: 10;
21+
}
22+
23+
#my-static-wrapper {
24+
border: heavy lightblue;
25+
background: blue;
26+
width: auto;
27+
height: auto;
28+
}
29+
30+
#my-static {
31+
border: heavy gray;
32+
background: black;
33+
width: auto;
34+
height: auto;
35+
}
36+
"""
37+
BINDINGS = [
38+
("1", "1", "1"),
39+
("2", "2", "2"),
40+
("q", "quit", "Quit"),
41+
]
42+
43+
def compose(self) -> ComposeResult:
44+
self._static = Static("", id="my-static")
45+
yield Vertical(
46+
Vertical(
47+
self._static,
48+
id="my-static-wrapper",
49+
),
50+
id="my-static-container",
51+
)
52+
53+
def action_1(self) -> None:
54+
self._static.update(
55+
"\n".join(f"Lorem {i} Ipsum {i} Sit {i}" for i in range(1, 21))
56+
)
57+
58+
def action_2(self) -> None:
59+
self._static.update("JUST ONE LINE")
60+
61+
62+
if __name__ == "__main__":
63+
app = NestedAutoApp()
64+
app.run()

tests/snapshot_tests/test_snapshots.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,11 @@ def test_offsets(snap_compare):
162162
assert snap_compare("snapshot_apps/offsets.py")
163163

164164

165+
def test_nested_auto_heights(snap_compare):
166+
"""Test refreshing widget within a auto sized container"""
167+
assert snap_compare("snapshot_apps/nested_auto_heights.py", press=["1", "2", "_"])
168+
169+
165170
# --- Other ---
166171

167172

0 commit comments

Comments
 (0)