From e655a2388adefdecf8daf9272dcb6c182a563e46 Mon Sep 17 00:00:00 2001 From: Kenny Mochizuki Date: Fri, 13 Feb 2026 14:39:19 -0600 Subject: [PATCH 1/2] feat: add autofillHints parameter to ThemedPasswordInput Add configurable autofillHints parameter to ThemedPasswordInput widget with sensible defaults for password fields. Defaults to both newPassword and password hints to support browser password managers and autofill. Co-Authored-By: Claude Sonnet 4.5 --- lib/src/inputs/src/general/password_input.dart | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/src/inputs/src/general/password_input.dart b/lib/src/inputs/src/general/password_input.dart index c031a5d..eca2ce5 100644 --- a/lib/src/inputs/src/general/password_input.dart +++ b/lib/src/inputs/src/general/password_input.dart @@ -49,6 +49,14 @@ class ThemedPasswordInput extends StatefulWidget { /// The progress indicator will fill up to 25% for each requirement met and for each level reached. final bool showLevels; + /// [autofillHints] is the list of autofill hints for the input. + /// + /// By default uses [AutofillHints.newPassword] and [AutofillHints.password] to allow the browser + /// to suggest strong passwords and to recognize the field as a password input + /// for autofill purposes. However, ideally you should use [AutofillHints.newPassword] for password + /// creation fields and [AutofillHints.password] for password update fields + final List autofillHints; + /// [ThemedPasswordInput] is the constructor of the input. /// Simplifies (I hope so) the creation of an input using the standard format of Layrz. const ThemedPasswordInput({ @@ -68,6 +76,7 @@ class ThemedPasswordInput extends StatefulWidget { this.focusNode, this.controller, this.showLevels = true, + this.autofillHints = const [AutofillHints.newPassword, AutofillHints.password], }) : assert( (label == null && labelText != null) || (label != null && labelText == null), 'You must provide either a labelText or a label, but not both.', @@ -167,6 +176,7 @@ class _ThemedPasswordInputState extends State { padding: widget.padding, isRequired: widget.isRequired, obscureText: !_showPassword, + autofillHints: widget.autofillHints, suffixWidget: Row( mainAxisAlignment: .center, crossAxisAlignment: .center, From 207496ff0b3fbeb72e88a34d47e30fe301804e74 Mon Sep 17 00:00:00 2001 From: Kenny Mochizuki Date: Fri, 13 Feb 2026 14:40:08 -0600 Subject: [PATCH 2/2] chore(ci): automate GitHub release changelog generation Add automated changelog generation to publish workflow using requarks/changelog-action. Releases will now include structured changelogs categorized by type (features, bugs, docs, maintenance). - Add release.yaml config with changelog categories and exclusions - Add create-release job to publish workflow - Exclude chore and style commits from changelogs - Update debug route in example app Co-Authored-By: Claude Sonnet 4.5 --- .github/release.yaml | 26 +++++++++++++++++++++++ .github/workflows/publish.yaml | 31 ++++++++++++++++++++++++++-- example/lib/router.dart | 2 +- example/lib/views/map/src/layer.dart | 1 + 4 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 .github/release.yaml diff --git a/.github/release.yaml b/.github/release.yaml new file mode 100644 index 0000000..a78097b --- /dev/null +++ b/.github/release.yaml @@ -0,0 +1,26 @@ +changelog: + exclude: + labels: + - skip-changelog + - duplicate + authors: + - dependabot + categories: + - title: ๐Ÿš€ New Features + labels: + - feat + - enh + - title: ๐Ÿ› Bug Fixes + labels: + - bug + - fix + - title: ๐Ÿ“– Documentation + labels: + - docs + - title: ๐Ÿงน Maintenance + labels: + - perf + - deps + - title: Other Changes + labels: + - "*" diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 90ba594..5872ada 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -79,15 +79,42 @@ jobs: git push origin $NEW_TAG git push --delete origin $TAG_NAME + + create-release: + runs-on: ubuntu-latest + needs: deploy-dart + if: success() + + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Get previous tag + id: previousTag + run: | + name=$(git --no-pager tag --sort=creatordate --merged ${{ github.ref_name }} | tail -2 | head -1) + echo "previousTag=$name" >> $GITHUB_OUTPUT + + - name: Generate Changelog + id: changelog + uses: requarks/changelog-action@v1 + with: + token: ${{ github.token }} + fromTag: ${{ github.ref_name }} + toTag: ${{ steps.previousTag.outputs.previousTag }} + writeToFile: false + excludeTypes: chore,style + - name: Create GitHub Release - if: success() uses: softprops/action-gh-release@v1 with: tag_name: ${{ github.ref_name }} name: Release ${{ github.ref_name }} + body: ${{ steps.changelog.outputs.changes }} draft: false prerelease: false - generate_release_notes: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/example/lib/router.dart b/example/lib/router.dart index 9d41308..49018e6 100644 --- a/example/lib/router.dart +++ b/example/lib/router.dart @@ -145,7 +145,7 @@ final goRoutes = [ ]; final router = GoRouter( - initialLocation: kDebugMode ? '/inputs/text' : '/', + initialLocation: kDebugMode ? '/map/layer' : '/', errorPageBuilder: (context, state) => customTransitionBuilder(context, state, const NotFoundView()), routes: goRoutes, ); diff --git a/example/lib/views/map/src/layer.dart b/example/lib/views/map/src/layer.dart index c4dfc60..db61181 100644 --- a/example/lib/views/map/src/layer.dart +++ b/example/lib/views/map/src/layer.dart @@ -111,6 +111,7 @@ class _MapLayerViewState extends State with TickerProviderStateMix layer: selectedLayer, controller: _controller, ), + // MarkerLayer( // markers: [ // Marker(