Compare commits
7
Commits
v0.3.0
...
1ff7c36723
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1ff7c36723 | ||
|
|
f75fef3f55 | ||
|
|
246ee67fb3 | ||
|
|
5b5f38a48d | ||
|
|
1266166676 | ||
|
|
8d4b910e23 | ||
|
|
5e78b3b492 |
@@ -0,0 +1,100 @@
|
|||||||
|
name: Bug Report
|
||||||
|
about: Something broke
|
||||||
|
title: "bug: "
|
||||||
|
labels:
|
||||||
|
- bug
|
||||||
|
|
||||||
|
body:
|
||||||
|
- type: textarea
|
||||||
|
id: description
|
||||||
|
attributes:
|
||||||
|
label: What happened
|
||||||
|
placeholder: Describe the bug
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: expected
|
||||||
|
attributes:
|
||||||
|
label: What should happen
|
||||||
|
placeholder: Expected behavior
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: steps
|
||||||
|
attributes:
|
||||||
|
label: Steps to reproduce
|
||||||
|
placeholder: |
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
|
render: shell
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
id: os
|
||||||
|
attributes:
|
||||||
|
label: OS
|
||||||
|
options:
|
||||||
|
- NixOS
|
||||||
|
- Arch
|
||||||
|
- Debian / Ubuntu
|
||||||
|
- Fedora
|
||||||
|
- Alpine
|
||||||
|
- Artix
|
||||||
|
- Gentoo
|
||||||
|
- Other
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: other-os
|
||||||
|
attributes:
|
||||||
|
label: Other OS (if "Other" above)
|
||||||
|
placeholder: e.g. Void, Gentoo, FreeBSD
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
id: init
|
||||||
|
attributes:
|
||||||
|
label: Init system
|
||||||
|
description: Relevant for UWSM configuration
|
||||||
|
options:
|
||||||
|
- systemd
|
||||||
|
- non-systemd (openrc / runit / s6 / ...)
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: qt-version
|
||||||
|
attributes:
|
||||||
|
label: Qt version
|
||||||
|
placeholder: 6.7
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: commit
|
||||||
|
attributes:
|
||||||
|
label: Branch / commit
|
||||||
|
placeholder: main / abc1234
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: logs
|
||||||
|
attributes:
|
||||||
|
label: Logs / backtrace / screenshots
|
||||||
|
render: shell
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: workaround
|
||||||
|
attributes:
|
||||||
|
label: Found a workaround?
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
name: Feature Request
|
||||||
|
about: Idea or improvement
|
||||||
|
title: "feat: "
|
||||||
|
labels:
|
||||||
|
- enhancement
|
||||||
|
|
||||||
|
body:
|
||||||
|
- type: textarea
|
||||||
|
id: problem
|
||||||
|
attributes:
|
||||||
|
label: What's missing / annoying
|
||||||
|
placeholder: The use case or pain point
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: solution
|
||||||
|
attributes:
|
||||||
|
label: How should it work
|
||||||
|
placeholder: Describe the desired behavior
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: alternatives
|
||||||
|
attributes:
|
||||||
|
label: Other approaches considered
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
id: scope
|
||||||
|
attributes:
|
||||||
|
label: Area
|
||||||
|
options:
|
||||||
|
- Core / Daemon
|
||||||
|
- UI / Components
|
||||||
|
- Plugin system
|
||||||
|
- CMake / Build
|
||||||
|
- CI / Tooling
|
||||||
|
- Documentation
|
||||||
|
- Other
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: context
|
||||||
|
attributes:
|
||||||
|
label: Mockups / references / notes
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
name: Pull Request
|
||||||
|
about: Submit changes
|
||||||
|
title: ""
|
||||||
|
labels: []
|
||||||
|
|
||||||
|
body:
|
||||||
|
- type: textarea
|
||||||
|
id: description
|
||||||
|
attributes:
|
||||||
|
label: What & why
|
||||||
|
placeholder: Describe the change and motivation
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: issue
|
||||||
|
attributes:
|
||||||
|
label: Related issue
|
||||||
|
placeholder: "#123"
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
id: type
|
||||||
|
attributes:
|
||||||
|
label: Type
|
||||||
|
options:
|
||||||
|
- Bug fix
|
||||||
|
- New feature
|
||||||
|
- Refactor / style
|
||||||
|
- CI / build / tooling
|
||||||
|
- Documentation
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
id: tested
|
||||||
|
attributes:
|
||||||
|
label: Tested
|
||||||
|
options:
|
||||||
|
- label: Build succeeds
|
||||||
|
- label: Existing tests pass
|
||||||
|
- label: Manually verified
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: breaking
|
||||||
|
attributes:
|
||||||
|
label: Breaking changes?
|
||||||
|
placeholder: API/ABI breakage? Migration path?
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
id: checklist
|
||||||
|
attributes:
|
||||||
|
label: Checklist
|
||||||
|
options:
|
||||||
|
- label: CI passes (format, lint, typecheck)
|
||||||
|
- label: Clean commits
|
||||||
|
- label: No new warnings
|
||||||
|
- label: Docs updated if needed
|
||||||
@@ -81,6 +81,29 @@ jobs:
|
|||||||
cd cli
|
cd cli
|
||||||
python -m pytest tests/ -v
|
python -m pytest tests/ -v
|
||||||
|
|
||||||
|
typecheck:
|
||||||
|
runs-on: alpine
|
||||||
|
container: node:26-alpine
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install tools
|
||||||
|
run: |
|
||||||
|
apk add --no-cache \
|
||||||
|
git \
|
||||||
|
python3 \
|
||||||
|
py3-pip
|
||||||
|
python3 -m venv .venv
|
||||||
|
. .venv/bin/activate
|
||||||
|
pip install --no-cache-dir basedpyright
|
||||||
|
|
||||||
|
- name: Type check
|
||||||
|
run: |
|
||||||
|
. .venv/bin/activate
|
||||||
|
basedpyright
|
||||||
|
|
||||||
buildcheck:
|
buildcheck:
|
||||||
runs-on: alpine
|
runs-on: alpine
|
||||||
container: node:26-alpine
|
container: node:26-alpine
|
||||||
|
|||||||
@@ -21,8 +21,6 @@ TextFieldBase {
|
|||||||
property bool isError
|
property bool isError
|
||||||
property string leadingIcon
|
property string leadingIcon
|
||||||
readonly property int leadingOffset: leadingIcon ? leadingIconLoader.width + leadingIconLoader.anchors.leftMargin : 0
|
readonly property int leadingOffset: leadingIcon ? leadingIconLoader.width + leadingIconLoader.anchors.leftMargin : 0
|
||||||
readonly property real outlineGap: placeholder.width * root.smallFontScale + Appearance.spacing.extraSmall * 2
|
|
||||||
property real outlineGapScale: activeFocus || text ? 1 : 0
|
|
||||||
property int radius: Appearance.rounding.small
|
property int radius: Appearance.rounding.small
|
||||||
readonly property real smallFontScale: smallFontSize / font.pointSize
|
readonly property real smallFontScale: smallFontSize / font.pointSize
|
||||||
property int smallFontSize: Appearance.font.size.small
|
property int smallFontSize: Appearance.font.size.small
|
||||||
@@ -57,11 +55,6 @@ TextFieldBase {
|
|||||||
onClicked: root.focus = true
|
onClicked: root.focus = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Behavior on outlineGapScale {
|
|
||||||
Anim {
|
|
||||||
type: Anim.DefaultEffects
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onEditingFinished: {
|
onEditingFinished: {
|
||||||
if (!valid)
|
if (!valid)
|
||||||
@@ -103,7 +96,7 @@ TextFieldBase {
|
|||||||
when: root.type === CustomTextField.Outlined && (root.activeFocus || root.text)
|
when: root.type === CustomTextField.Outlined && (root.activeFocus || root.text)
|
||||||
|
|
||||||
PropertyChanges {
|
PropertyChanges {
|
||||||
placeholder.anchors.leftMargin: -(1 - root.smallFontScale) * placeholder.width / 2 + root.horizontalPadding + -Appearance.spacing.extraSmall
|
placeholder.anchors.leftMargin: -(1 - root.smallFontScale) * placeholder.width / 2 + root.horizontalPadding
|
||||||
placeholder.scale: root.smallFontScale
|
placeholder.scale: root.smallFontScale
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,7 +129,7 @@ TextFieldBase {
|
|||||||
|
|
||||||
AnchorAnim {
|
AnchorAnim {
|
||||||
duration: Appearance.anim.durations.expressiveEffects
|
duration: Appearance.anim.durations.expressiveEffects
|
||||||
easing: Appearance.anim.curves.expressiveDefaultEffects
|
easing.bezierCurve: Appearance.anim.curves.expressiveEffects
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -146,12 +139,11 @@ TextFieldBase {
|
|||||||
|
|
||||||
active: root.leadingIcon
|
active: root.leadingIcon
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.leftMargin: Appearance.padding.larger
|
anchors.leftMargin: Appearance.padding.normal
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
|
||||||
sourceComponent: MaterialIcon {
|
sourceComponent: MaterialIcon {
|
||||||
color: DynamicColors.palette.m3onSurfaceVariant
|
color: DynamicColors.palette.m3onSurfaceVariant
|
||||||
font.pointSize: Appearance.font.size.large
|
|
||||||
text: root.leadingIcon
|
text: root.leadingIcon
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -161,12 +153,11 @@ TextFieldBase {
|
|||||||
|
|
||||||
active: root.trailingIcon
|
active: root.trailingIcon
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.rightMargin: Appearance.padding.larger
|
anchors.rightMargin: Appearance.padding.normal
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
|
||||||
sourceComponent: MaterialIcon {
|
sourceComponent: MaterialIcon {
|
||||||
color: DynamicColors.palette.m3onSurfaceVariant
|
color: DynamicColors.palette.m3onSurfaceVariant
|
||||||
font.pointSize: Appearance.font.size.large
|
|
||||||
text: root.trailingIcon
|
text: root.trailingIcon
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -201,12 +192,24 @@ TextFieldBase {
|
|||||||
preferredRendererType: Shape.CurveRenderer
|
preferredRendererType: Shape.CurveRenderer
|
||||||
|
|
||||||
ShapePath {
|
ShapePath {
|
||||||
|
id: path
|
||||||
|
|
||||||
|
readonly property real inset: strokeWidth / 2
|
||||||
|
readonly property real outlineGap: placeholder.width * root.smallFontScale + Appearance.spacing.small * 2
|
||||||
|
property real outlineGapScale: root.activeFocus || root.text ? 1 : 0
|
||||||
|
|
||||||
capStyle: ShapePath.RoundCap
|
capStyle: ShapePath.RoundCap
|
||||||
fillColor: "transparent"
|
fillColor: "transparent"
|
||||||
startX: root.horizontalPadding - root.clampedRadius + root.outlineGap * (1 - root.outlineGapScale) / 2 + root.outlineGap * root.outlineGapScale
|
startX: path.inset + root.horizontalPadding - root.clampedRadius + path.outlineGap * (1 - path.outlineGapScale) / 2 + path.outlineGap * path.outlineGapScale
|
||||||
|
startY: path.inset
|
||||||
strokeColor: root.isError ? DynamicColors.palette.m3error : (root.activeFocus ? DynamicColors.palette.m3primary : DynamicColors.palette.m3outline)
|
strokeColor: root.isError ? DynamicColors.palette.m3error : (root.activeFocus ? DynamicColors.palette.m3primary : DynamicColors.palette.m3outline)
|
||||||
strokeWidth: root.activeFocus ? 2 : 1
|
strokeWidth: root.activeFocus ? 2 : 1
|
||||||
|
|
||||||
|
Behavior on outlineGapScale {
|
||||||
|
Anim {
|
||||||
|
type: Anim.DefaultEffects
|
||||||
|
}
|
||||||
|
}
|
||||||
Behavior on strokeColor {
|
Behavior on strokeColor {
|
||||||
CAnim {
|
CAnim {
|
||||||
}
|
}
|
||||||
@@ -217,54 +220,56 @@ TextFieldBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
PathLine {
|
PathLine {
|
||||||
x: bg.width - root.clampedRadius
|
x: bg.width - path.inset - root.clampedRadius
|
||||||
|
y: path.inset
|
||||||
}
|
}
|
||||||
|
|
||||||
PathArc {
|
PathArc {
|
||||||
radiusX: root.clampedRadius
|
radiusX: root.clampedRadius
|
||||||
radiusY: root.clampedRadius
|
radiusY: root.clampedRadius
|
||||||
x: bg.width
|
x: bg.width - path.inset
|
||||||
y: root.clampedRadius
|
y: path.inset + root.clampedRadius
|
||||||
}
|
}
|
||||||
|
|
||||||
PathLine {
|
PathLine {
|
||||||
x: bg.width
|
x: bg.width - path.inset
|
||||||
y: bg.height - root.clampedRadius
|
y: bg.height - path.inset - root.clampedRadius
|
||||||
}
|
}
|
||||||
|
|
||||||
PathArc {
|
PathArc {
|
||||||
radiusX: root.clampedRadius
|
radiusX: root.clampedRadius
|
||||||
radiusY: root.clampedRadius
|
radiusY: root.clampedRadius
|
||||||
x: bg.width - root.clampedRadius
|
x: bg.width - path.inset - root.clampedRadius
|
||||||
y: bg.height
|
y: bg.height - path.inset
|
||||||
}
|
}
|
||||||
|
|
||||||
PathLine {
|
PathLine {
|
||||||
x: root.clampedRadius
|
x: path.inset + root.clampedRadius
|
||||||
y: bg.height
|
y: bg.height - path.inset
|
||||||
}
|
}
|
||||||
|
|
||||||
PathArc {
|
PathArc {
|
||||||
radiusX: root.clampedRadius
|
radiusX: root.clampedRadius
|
||||||
radiusY: root.clampedRadius
|
radiusY: root.clampedRadius
|
||||||
x: 0
|
x: path.inset
|
||||||
y: bg.height - root.clampedRadius
|
y: bg.height - path.inset - root.clampedRadius
|
||||||
}
|
}
|
||||||
|
|
||||||
PathLine {
|
PathLine {
|
||||||
x: 0
|
x: path.inset
|
||||||
y: root.clampedRadius
|
y: path.inset + root.clampedRadius
|
||||||
}
|
}
|
||||||
|
|
||||||
PathArc {
|
PathArc {
|
||||||
radiusX: root.clampedRadius
|
radiusX: root.clampedRadius
|
||||||
radiusY: root.clampedRadius
|
radiusY: root.clampedRadius
|
||||||
x: root.clampedRadius
|
x: path.inset + root.clampedRadius
|
||||||
y: 0
|
y: path.inset
|
||||||
}
|
}
|
||||||
|
|
||||||
PathLine {
|
PathLine {
|
||||||
x: root.horizontalPadding - root.clampedRadius + root.outlineGap * (1 - root.outlineGapScale) / 2
|
x: path.inset + root.horizontalPadding - root.clampedRadius / 2 + path.outlineGap * (1 - path.outlineGapScale) / 2
|
||||||
|
y: path.inset
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,6 +54,10 @@ select = [
|
|||||||
"RUF",
|
"RUF",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[tool.basedpyright]
|
||||||
|
typeCheckingMode = "basic"
|
||||||
|
include = ["cli/src"]
|
||||||
|
|
||||||
[tool.pytest.ini_options]
|
[tool.pytest.ini_options]
|
||||||
testpaths = ["cli/tests"]
|
testpaths = ["cli/tests"]
|
||||||
pythonpath = ["cli/src"]
|
pythonpath = ["cli/src"]
|
||||||
|
|||||||
Reference in New Issue
Block a user