Skip to content

Add support for embedded Avatars#7

Merged
brionmario merged 1 commit into
thunder-id:mainfrom
brionmario:avatars
Jul 21, 2026
Merged

Add support for embedded Avatars#7
brionmario merged 1 commit into
thunder-id:mainfrom
brionmario:avatars

Conversation

@brionmario

@brionmario brionmario commented Jul 20, 2026

Copy link
Copy Markdown
Member

Purpose

Adds a logo module and a ThunderIDLogo widget that render an application/user branding "logo spec" string — emoji:<glyph>, avatar:shape=...,variant=...,content=...,colors=...,bg=..., or a bare URL — as the appropriate Flutter widget, mirroring the same spec used by the JS and Android SDKs (see thunder-id/thunderid#4182).

Approach

  • logo_spec.dart parses the emoji:/avatar: schemes into a sealed LogoSpec result (EmojiLogo / AvatarLogo / AssetLogo / UrlLogo) via resolveLogoSpec(spec, fallbackSeedText), falling back to UrlLogo for anything unrecognized so callers can always render something.
  • deriveAvatarContent fills in a spec's content from a fallback seed (e.g. a display name) when it's missing — initials for letter variants, a deterministic hash-picked name into the curated icon set for the anonymous variants, using the same 32-bit polynomial hash as the web SDK so a given seed picks the same icon on every platform.
  • AvatarLogoRender/AvatarLogoBadge (avatar_logo.dart) natively render the one_letter/two_letter gradient-swatch variants, reproducing the web SDK's palette, hash-derived rotation angle, and gradient math bit-for-bit (covered by reference test vectors against known web SDK outputs).
  • curated_logo_icons.dart lists the curated anonymous_animal/anonymous_entity content keys, backed by bundled asset images under assets/logo-icons/anonymous/ and assets/logo-icons/entity/ (declared in pubspec.yaml), generated from the same source SVGs as the other SDKs' curated icon sets.
  • ThunderIDLogo (thunderid_logo.dart) is the one-stop widget: it resolves the spec and renders the right thing (emoji text, AvatarLogoBadge, bundled asset image, or Image.network) so most callers never need to branch on the resolved kind themselves.
  • All four files are re-exported from the package's public lib/thunderid_flutter.dart barrel.

Related Issues

Related PRs

Checklist

  • Followed the contribution guidelines.
  • Manual test round performed and verified.
  • Documentation provided. (Add links if there are any)
  • Tests provided. (Add links if there are any)
    • Unit Tests
    • Integration Tests
  • Breaking changes. (Fill if applicable)
    • Breaking changes section filled.
    • breaking change label added.

Security checks

  • Followed secure coding standards in WSO2 Secure Coding Guidelines
  • Confirmed that this PR doesn't commit any keys, passwords, tokens, usernames, or other secrets.

Summary by CodeRabbit

  • New Features

    • Added support for rendering emoji, gradient avatar, curated animal/entity, and URL-based logos.
    • Added configurable avatar shapes, variants, colors, backgrounds, initials, and sizes.
    • Added deterministic avatar content and gradient generation.
    • Added graceful fallback behavior for unsupported or unavailable logo sources.
    • Bundled curated logo artwork for offline display.
  • Tests

    • Added comprehensive coverage for logo parsing, rendering, deterministic output, fallbacks, and bundled assets.

@coderabbitai

coderabbitai Bot commented Jul 20, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adds a Flutter logo pipeline with parsed logo specifications, deterministic gradient avatars, curated anonymous icon assets, a ThunderIDLogo widget, public exports, asset packaging, and end-to-end tests.

Changes

Logo rendering pipeline

Layer / File(s) Summary
Logo contracts and curated assets
lib/src/logo/logo_spec.dart, lib/src/logo/curated_logo_icons.dart
Defines logo result types, avatar parameters, wire values, and curated anonymous animal/entity asset resolvers.
Deterministic avatar rendering
lib/src/logo/avatar_logo.dart, test/logo_test.dart
Derives avatar content and web-compatible gradient parameters, then renders shaped badges with initials and optional solid backgrounds.
Logo spec resolution
lib/src/logo/logo_spec.dart, pubspec.yaml, test/logo_test.dart
Parses emoji, avatar, and fallback URL specs, resolves curated variants to packaged assets, and tests parameter defaults and fallback behavior.
Widget integration and public exports
lib/src/logo/thunderid_logo.dart, lib/thunderid_flutter.dart, test/logo_test.dart
Adds rendering branches for emoji, avatars, assets, and URLs, exposes the APIs publicly, and tests widget output paths.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant ThunderIDLogo
  participant resolveLogoSpec
  participant AvatarLogoBadge
  participant FlutterAssets
  Client->>ThunderIDLogo: provide logo spec and fallback seed
  ThunderIDLogo->>resolveLogoSpec: parse and resolve spec
  resolveLogoSpec-->>ThunderIDLogo: return EmojiLogo, AvatarLogo, AssetLogo, or UrlLogo
  ThunderIDLogo->>AvatarLogoBadge: render resolved avatar
  ThunderIDLogo->>FlutterAssets: load resolved bundled asset
  FlutterAssets-->>ThunderIDLogo: return asset image
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title is relevant to the main change, though it only mentions avatars and not the broader logo-spec support.
Description check ✅ Passed The description matches the template with Purpose, Approach, Related Issues/PRs, Checklist, and Security checks filled in.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@brionmario

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
lib/src/logo/curated_logo_icons.dart (1)

44-50: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Extract a shared helper; consider case-insensitive matching.

anonymousAnimalAssetPath and anonymousEntityAssetPath are identical apart from the list and path segment. Also, both rely on the content value already being lowercase — if a caller ever passes mixed case, the match silently fails and falls back to UrlLogo instead of resolving the bundled asset.

♻️ Proposed refactor
+String? _resolveCuratedAsset(
+  List<String> names,
+  String category,
+  String name,
+) {
+  final lower = name.toLowerCase();
+  return names.contains(lower)
+      ? 'packages/thunderid_flutter/assets/logo-icons/$category/$lower.png'
+      : null;
+}
+
-String? anonymousAnimalAssetPath(String name) =>
-    kAnonymousAnimalNames.contains(name)
-        ? 'packages/thunderid_flutter/assets/logo-icons/anonymous/$name.png'
-        : null;
+String? anonymousAnimalAssetPath(String name) =>
+    _resolveCuratedAsset(kAnonymousAnimalNames, 'anonymous', name);
...
-String? anonymousEntityAssetPath(String name) =>
-    kAnonymousEntityNames.contains(name)
-        ? 'packages/thunderid_flutter/assets/logo-icons/entity/$name.png'
-        : null;
+String? anonymousEntityAssetPath(String name) =>
+    _resolveCuratedAsset(kAnonymousEntityNames, 'entity', name);

Also applies to: 92-98

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@lib/src/logo/curated_logo_icons.dart` around lines 44 - 50, Extract the
duplicated lookup logic from anonymousAnimalAssetPath and
anonymousEntityAssetPath into a shared helper parameterized by the allowed names
and asset path segment. Normalize the supplied name for case-insensitive
matching while preserving the existing bundled asset path and null fallback
behavior.
lib/src/logo/logo_spec.dart (1)

92-128: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider narrowing AvatarLogo.variant to exclude anonymous variants.

AvatarLogo.variant is typed as the full AvatarVariant (all 4 cases), but resolveLogoSpec only ever constructs an AvatarLogo for oneLetter/twoLetteranonymousAnimal/anonymousEntity always short-circuit to AssetLogo/UrlLogo (lines 193-201). Since the constructor is public, nothing stops a caller from building AvatarLogo(variant: AvatarVariant.anonymousAnimal, ...) directly, which AvatarLogoRender.forSeed (avatar_logo.dart) would silently treat like twoLetter rather than rejecting.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@lib/src/logo/logo_spec.dart` around lines 92 - 128, Restrict
AvatarLogo.variant to a type or contract that permits only the oneLetter and
twoLetter variants, and update its constructor, equality, hashCode, and
dependent usages as needed. Preserve resolveLogoSpec’s existing behavior while
preventing direct construction with anonymousAnimal or anonymousEntity, and
ensure AvatarLogoRender.forSeed continues receiving only supported variants.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@lib/src/logo/curated_logo_icons.dart`:
- Around line 44-50: Extract the duplicated lookup logic from
anonymousAnimalAssetPath and anonymousEntityAssetPath into a shared helper
parameterized by the allowed names and asset path segment. Normalize the
supplied name for case-insensitive matching while preserving the existing
bundled asset path and null fallback behavior.

In `@lib/src/logo/logo_spec.dart`:
- Around line 92-128: Restrict AvatarLogo.variant to a type or contract that
permits only the oneLetter and twoLetter variants, and update its constructor,
equality, hashCode, and dependent usages as needed. Preserve resolveLogoSpec’s
existing behavior while preventing direct construction with anonymousAnimal or
anonymousEntity, and ensure AvatarLogoRender.forSeed continues receiving only
supported variants.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: b27b2899-9f86-4301-a0e0-e50dc38ae9fa

📥 Commits

Reviewing files that changed from the base of the PR and between e097cf4 and 07a44fc.

⛔ Files ignored due to path filters (156)
  • assets/logo-icons/anonymous/2.0x/capybara.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/2.0x/chameleon.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/2.0x/chinchilla.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/2.0x/chipmunk.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/2.0x/chupacabra.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/2.0x/dingo.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/2.0x/dinosaur.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/2.0x/frog.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/2.0x/giraffe.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/2.0x/hedgehog.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/2.0x/hippo.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/2.0x/jackal.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/2.0x/jackalope.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/2.0x/mink.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/2.0x/otter.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/2.0x/platypus.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/2.0x/quagga.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/2.0x/raccoon.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/2.0x/skunk.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/3.0x/capybara.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/3.0x/chameleon.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/3.0x/chinchilla.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/3.0x/chipmunk.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/3.0x/chupacabra.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/3.0x/dingo.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/3.0x/dinosaur.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/3.0x/frog.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/3.0x/giraffe.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/3.0x/hedgehog.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/3.0x/hippo.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/3.0x/jackal.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/3.0x/jackalope.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/3.0x/mink.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/3.0x/otter.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/3.0x/platypus.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/3.0x/quagga.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/3.0x/raccoon.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/3.0x/skunk.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/capybara.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/chameleon.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/chinchilla.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/chipmunk.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/chupacabra.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/dingo.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/dinosaur.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/frog.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/giraffe.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/hedgehog.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/hippo.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/jackal.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/jackalope.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/mink.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/otter.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/platypus.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/quagga.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/raccoon.png is excluded by !**/*.png
  • assets/logo-icons/anonymous/skunk.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/anchor.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/antenna.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/anvil.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/arch.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/bridge.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/chevron.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/circuit_node.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/compass.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/cube.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/diamond.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/dome.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/gate.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/hexagon.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/key.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/lighthouse.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/lock.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/obelisk.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/octagon.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/orbit_ring.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/parallelogram.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/pavilion.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/pentagon.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/plus_facet.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/silo.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/spiral.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/spire.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/star.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/tower.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/townhouse.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/triangle_stack.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/turbine.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/valve.png is excluded by !**/*.png
  • assets/logo-icons/entity/2.0x/windmill.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/anchor.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/antenna.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/anvil.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/arch.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/bridge.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/chevron.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/circuit_node.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/compass.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/cube.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/diamond.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/dome.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/gate.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/hexagon.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/key.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/lighthouse.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/lock.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/obelisk.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/octagon.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/orbit_ring.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/parallelogram.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/pavilion.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/pentagon.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/plus_facet.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/silo.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/spiral.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/spire.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/star.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/tower.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/townhouse.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/triangle_stack.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/turbine.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/valve.png is excluded by !**/*.png
  • assets/logo-icons/entity/3.0x/windmill.png is excluded by !**/*.png
  • assets/logo-icons/entity/anchor.png is excluded by !**/*.png
  • assets/logo-icons/entity/antenna.png is excluded by !**/*.png
  • assets/logo-icons/entity/anvil.png is excluded by !**/*.png
  • assets/logo-icons/entity/arch.png is excluded by !**/*.png
  • assets/logo-icons/entity/bridge.png is excluded by !**/*.png
  • assets/logo-icons/entity/chevron.png is excluded by !**/*.png
  • assets/logo-icons/entity/circuit_node.png is excluded by !**/*.png
  • assets/logo-icons/entity/compass.png is excluded by !**/*.png
  • assets/logo-icons/entity/cube.png is excluded by !**/*.png
  • assets/logo-icons/entity/diamond.png is excluded by !**/*.png
  • assets/logo-icons/entity/dome.png is excluded by !**/*.png
  • assets/logo-icons/entity/gate.png is excluded by !**/*.png
  • assets/logo-icons/entity/hexagon.png is excluded by !**/*.png
  • assets/logo-icons/entity/key.png is excluded by !**/*.png
  • assets/logo-icons/entity/lighthouse.png is excluded by !**/*.png
  • assets/logo-icons/entity/lock.png is excluded by !**/*.png
  • assets/logo-icons/entity/obelisk.png is excluded by !**/*.png
  • assets/logo-icons/entity/octagon.png is excluded by !**/*.png
  • assets/logo-icons/entity/orbit_ring.png is excluded by !**/*.png
  • assets/logo-icons/entity/parallelogram.png is excluded by !**/*.png
  • assets/logo-icons/entity/pavilion.png is excluded by !**/*.png
  • assets/logo-icons/entity/pentagon.png is excluded by !**/*.png
  • assets/logo-icons/entity/plus_facet.png is excluded by !**/*.png
  • assets/logo-icons/entity/silo.png is excluded by !**/*.png
  • assets/logo-icons/entity/spiral.png is excluded by !**/*.png
  • assets/logo-icons/entity/spire.png is excluded by !**/*.png
  • assets/logo-icons/entity/star.png is excluded by !**/*.png
  • assets/logo-icons/entity/tower.png is excluded by !**/*.png
  • assets/logo-icons/entity/townhouse.png is excluded by !**/*.png
  • assets/logo-icons/entity/triangle_stack.png is excluded by !**/*.png
  • assets/logo-icons/entity/turbine.png is excluded by !**/*.png
  • assets/logo-icons/entity/valve.png is excluded by !**/*.png
  • assets/logo-icons/entity/windmill.png is excluded by !**/*.png
📒 Files selected for processing (7)
  • lib/src/logo/avatar_logo.dart
  • lib/src/logo/curated_logo_icons.dart
  • lib/src/logo/logo_spec.dart
  • lib/src/logo/thunderid_logo.dart
  • lib/thunderid_flutter.dart
  • pubspec.yaml
  • test/logo_test.dart

@brionmario
brionmario merged commit e722925 into thunder-id:main Jul 21, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants