diff --git a/.eslintrc.js b/.eslintrc.js
index d9e94ac198..c4284ac583 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -268,7 +268,7 @@ const typescriptRules = {
zones: [
{
target: ['ts/util', 'ts/types'],
- from: ['ts/components', 'ts/axo'],
+ from: ['ts/components/**', 'ts/axo/**/*.dom.*'],
message: 'Importing components is forbidden from ts/{util,types}',
},
],
@@ -452,7 +452,7 @@ module.exports = {
},
},
{
- files: ['ts/axo/**/*.tsx'],
+ files: ['ts/axo/**/*.{ts,tsx}'],
rules: {
// Rule doesn't understand TypeScript namespaces
'no-inner-declarations': 'off',
diff --git a/fixtures/badges/planet/planet-16-dark.svg b/fixtures/badges/planet/planet-16-dark.svg
new file mode 100644
index 0000000000..2be31e12f5
--- /dev/null
+++ b/fixtures/badges/planet/planet-16-dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/planet/planet-16-light.svg b/fixtures/badges/planet/planet-16-light.svg
new file mode 100644
index 0000000000..a97f4028c9
--- /dev/null
+++ b/fixtures/badges/planet/planet-16-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/planet/planet-160.svg b/fixtures/badges/planet/planet-160.svg
new file mode 100644
index 0000000000..b2fee5faee
--- /dev/null
+++ b/fixtures/badges/planet/planet-160.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/planet/planet-24-dark.svg b/fixtures/badges/planet/planet-24-dark.svg
new file mode 100644
index 0000000000..5da16a1156
--- /dev/null
+++ b/fixtures/badges/planet/planet-24-dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/planet/planet-24-light.svg b/fixtures/badges/planet/planet-24-light.svg
new file mode 100644
index 0000000000..f583645e3d
--- /dev/null
+++ b/fixtures/badges/planet/planet-24-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/planet/planet-36-dark.svg b/fixtures/badges/planet/planet-36-dark.svg
new file mode 100644
index 0000000000..6b6db5a87e
--- /dev/null
+++ b/fixtures/badges/planet/planet-36-dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/planet/planet-36-light.svg b/fixtures/badges/planet/planet-36-light.svg
new file mode 100644
index 0000000000..ceae782206
--- /dev/null
+++ b/fixtures/badges/planet/planet-36-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/rocket/rocket-16-dark.svg b/fixtures/badges/rocket/rocket-16-dark.svg
new file mode 100644
index 0000000000..ef089b6705
--- /dev/null
+++ b/fixtures/badges/rocket/rocket-16-dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/rocket/rocket-16-light.svg b/fixtures/badges/rocket/rocket-16-light.svg
new file mode 100644
index 0000000000..f8731b7d5a
--- /dev/null
+++ b/fixtures/badges/rocket/rocket-16-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/rocket/rocket-160.svg b/fixtures/badges/rocket/rocket-160.svg
new file mode 100644
index 0000000000..275781af2d
--- /dev/null
+++ b/fixtures/badges/rocket/rocket-160.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/rocket/rocket-24-dark.svg b/fixtures/badges/rocket/rocket-24-dark.svg
new file mode 100644
index 0000000000..fe2f61cf2a
--- /dev/null
+++ b/fixtures/badges/rocket/rocket-24-dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/rocket/rocket-24-light.svg b/fixtures/badges/rocket/rocket-24-light.svg
new file mode 100644
index 0000000000..6b326a295c
--- /dev/null
+++ b/fixtures/badges/rocket/rocket-24-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/rocket/rocket-36-dark.svg b/fixtures/badges/rocket/rocket-36-dark.svg
new file mode 100644
index 0000000000..c5f1325bd4
--- /dev/null
+++ b/fixtures/badges/rocket/rocket-36-dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/rocket/rocket-36-light.svg b/fixtures/badges/rocket/rocket-36-light.svg
new file mode 100644
index 0000000000..ab13c60bb7
--- /dev/null
+++ b/fixtures/badges/rocket/rocket-36-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/star/star-16-dark.svg b/fixtures/badges/star/star-16-dark.svg
new file mode 100644
index 0000000000..701eccc304
--- /dev/null
+++ b/fixtures/badges/star/star-16-dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/star/star-16-light.svg b/fixtures/badges/star/star-16-light.svg
new file mode 100644
index 0000000000..2b2b5e6586
--- /dev/null
+++ b/fixtures/badges/star/star-16-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/star/star-160.svg b/fixtures/badges/star/star-160.svg
new file mode 100644
index 0000000000..1d9d4e4acb
--- /dev/null
+++ b/fixtures/badges/star/star-160.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/star/star-24-dark.svg b/fixtures/badges/star/star-24-dark.svg
new file mode 100644
index 0000000000..3b1a13bbe3
--- /dev/null
+++ b/fixtures/badges/star/star-24-dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/star/star-24-light.svg b/fixtures/badges/star/star-24-light.svg
new file mode 100644
index 0000000000..357fa29e6d
--- /dev/null
+++ b/fixtures/badges/star/star-24-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/star/star-36-dark.svg b/fixtures/badges/star/star-36-dark.svg
new file mode 100644
index 0000000000..7bb13d0457
--- /dev/null
+++ b/fixtures/badges/star/star-36-dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/star/star-36-light.svg b/fixtures/badges/star/star-36-light.svg
new file mode 100644
index 0000000000..d0ea4d3bd0
--- /dev/null
+++ b/fixtures/badges/star/star-36-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/sun/sun-16-dark.svg b/fixtures/badges/sun/sun-16-dark.svg
new file mode 100644
index 0000000000..53d097ef4c
--- /dev/null
+++ b/fixtures/badges/sun/sun-16-dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/sun/sun-16-light.svg b/fixtures/badges/sun/sun-16-light.svg
new file mode 100644
index 0000000000..8802f93957
--- /dev/null
+++ b/fixtures/badges/sun/sun-16-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/sun/sun-160.svg b/fixtures/badges/sun/sun-160.svg
new file mode 100644
index 0000000000..ca252d2a3f
--- /dev/null
+++ b/fixtures/badges/sun/sun-160.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/sun/sun-24-dark.svg b/fixtures/badges/sun/sun-24-dark.svg
new file mode 100644
index 0000000000..4dd44da190
--- /dev/null
+++ b/fixtures/badges/sun/sun-24-dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/sun/sun-24-light.svg b/fixtures/badges/sun/sun-24-light.svg
new file mode 100644
index 0000000000..012303a8aa
--- /dev/null
+++ b/fixtures/badges/sun/sun-24-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/sun/sun-36-dark.svg b/fixtures/badges/sun/sun-36-dark.svg
new file mode 100644
index 0000000000..12f6836c39
--- /dev/null
+++ b/fixtures/badges/sun/sun-36-dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/sun/sun-36-light.svg b/fixtures/badges/sun/sun-36-light.svg
new file mode 100644
index 0000000000..105fd634de
--- /dev/null
+++ b/fixtures/badges/sun/sun-36-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/ufo/ufo-16-dark.svg b/fixtures/badges/ufo/ufo-16-dark.svg
new file mode 100644
index 0000000000..395b8b8134
--- /dev/null
+++ b/fixtures/badges/ufo/ufo-16-dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/ufo/ufo-16-light.svg b/fixtures/badges/ufo/ufo-16-light.svg
new file mode 100644
index 0000000000..e2fa22e461
--- /dev/null
+++ b/fixtures/badges/ufo/ufo-16-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/ufo/ufo-160.svg b/fixtures/badges/ufo/ufo-160.svg
new file mode 100644
index 0000000000..a6d5072e09
--- /dev/null
+++ b/fixtures/badges/ufo/ufo-160.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/ufo/ufo-24-dark.svg b/fixtures/badges/ufo/ufo-24-dark.svg
new file mode 100644
index 0000000000..412bcd9f40
--- /dev/null
+++ b/fixtures/badges/ufo/ufo-24-dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/ufo/ufo-24-light.svg b/fixtures/badges/ufo/ufo-24-light.svg
new file mode 100644
index 0000000000..9e8d21d2fb
--- /dev/null
+++ b/fixtures/badges/ufo/ufo-24-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/ufo/ufo-36-dark.svg b/fixtures/badges/ufo/ufo-36-dark.svg
new file mode 100644
index 0000000000..6dbc21d2ac
--- /dev/null
+++ b/fixtures/badges/ufo/ufo-36-dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fixtures/badges/ufo/ufo-36-light.svg b/fixtures/badges/ufo/ufo-36-light.svg
new file mode 100644
index 0000000000..5b79d5718c
--- /dev/null
+++ b/fixtures/badges/ufo/ufo-36-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss
index d9f8f5b262..9d0e00e134 100644
--- a/stylesheets/_modules.scss
+++ b/stylesheets/_modules.scss
@@ -6189,14 +6189,6 @@ button.module-calling-participants-list__contact {
}
}
-.module-background-color {
- &__default {
- background-color: variables.$color-black-alpha-40;
- }
-
- @include mixins.avatar-colors();
-}
-
.module-tooltip {
--tooltip-text-color: #{variables.$color-gray-75};
--tooltip-background-color: #{variables.$color-gray-02};
diff --git a/ts/axo/AriaClickable.dom.tsx b/ts/axo/AriaClickable.dom.tsx
index 25523073ff..0bf27d1341 100644
--- a/ts/axo/AriaClickable.dom.tsx
+++ b/ts/axo/AriaClickable.dom.tsx
@@ -5,7 +5,7 @@ import type { ReactNode, MouseEvent, FC } from 'react';
import { useLayoutEffect } from '@react-aria/utils';
import { computeAccessibleName } from 'dom-accessibility-api';
import { tw } from './tw.dom.js';
-import { assert } from './_internal/assert.dom.js';
+import { assert } from './_internal/assert.std.js';
import {
createStrictContext,
useStrictContext,
diff --git a/ts/axo/AxoAvatar.dom.stories.tsx b/ts/axo/AxoAvatar.dom.stories.tsx
new file mode 100644
index 0000000000..53b2736452
--- /dev/null
+++ b/ts/axo/AxoAvatar.dom.stories.tsx
@@ -0,0 +1,379 @@
+// Copyright 2026 Signal Messenger, LLC
+// SPDX-License-Identifier: AGPL-3.0-only
+import type { Meta } from '@storybook/react';
+import type { JSX, ReactNode } from 'react';
+import React from 'react';
+import { action } from '@storybook/addon-actions';
+import { AxoAvatar } from './AxoAvatar.dom.js';
+import { tw } from './tw.dom.js';
+import { BADGES_FIXTURE } from './_internal/storybook-fixtures.std.js';
+import { _getAllAxoSymbolIconNames } from './_internal/AxoSymbolDefs.generated.std.js';
+import { AxoTokens } from './AxoTokens.std.js';
+
+export default {
+ title: 'Axo/AxoAvatar',
+} satisfies Meta;
+
+function Stack(props: { children: ReactNode }) {
+ return