diff --git a/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/views/edit/content-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/views/edit/content-editor.element.ts
index 5b531ae552..731389f7d0 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/views/edit/content-editor.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/views/edit/content-editor.element.ts
@@ -236,8 +236,8 @@ export class UmbContentWorkspaceViewEditElement extends UmbLitElement implements
href=${fullPath}
data-mark="content-tab:${path ?? 'root'}"
>${hint && !active
- ? html`${hint.text}${hint.text}`
: nothing}`;
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/badge/badge.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/badge/badge.element.ts
new file mode 100644
index 0000000000..13bb1e67ad
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/badge/badge.element.ts
@@ -0,0 +1,72 @@
+import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
+import { html, customElement, property, css, LitElement, ifDefined } from '@umbraco-cms/backoffice/external/lit';
+import type { UUIInterfaceColor, UUIInterfaceLook } from '@umbraco-cms/backoffice/external/uui';
+
+/**
+ * @element umb-badge
+ * @description A wrapper for the uui-badge component with position fixed support to go on top of other elements.
+ * @augments {LitElement}
+ */
+@customElement('umb-badge')
+export class UmbBadgeElement extends LitElement {
+ /**
+ * Changes the look of the button to one of the predefined, symbolic looks.
+ * @type {"default" | "positive" | "warning" | "danger"}
+ * @attr
+ * @default "default"
+ */
+ @property({ type: String })
+ color?: UUIInterfaceColor;
+
+ /**
+ * Changes the look of the button to one of the predefined, symbolic looks.
+ * @type {"default" | "primary" | "secondary" | "outline" | "placeholder"}
+ * @attr
+ * @default "default"
+ */
+ @property({ type: String })
+ look?: UUIInterfaceLook;
+
+ /**
+ * Bring attention to this badge by applying a bounce animation.
+ * @type boolean
+ * @attr
+ * @default false
+ */
+ @property({ type: Boolean })
+ attention?: boolean;
+
+ override render() {
+ return html``;
+ }
+
+ static override styles = [
+ UmbTextStyles,
+ css`
+ :host {
+ position: absolute;
+ anchor-name: --umb-badge-anchor;
+ /** because inset has no effect on uui-badge in this case, we then apply it here: */
+ inset: var(--uui-badge-inset, -8px -8px auto auto);
+ }
+
+ @supports (position-anchor: --my-name) {
+ uui-badge {
+ position: fixed;
+ position-anchor: --umb-badge-anchor;
+ z-index: 1;
+ top: anchor(top);
+ right: anchor(right);
+ }
+ }
+ `,
+ ];
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ 'umb-badge': UmbBadgeElement;
+ }
+}
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/badge/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/badge/index.ts
new file mode 100644
index 0000000000..4094fdef5a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/badge/index.ts
@@ -0,0 +1 @@
+export * from './badge.element.js';
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts
index a6494c5c3b..f1d63a722e 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts
@@ -2,6 +2,7 @@
// TODO: we need to move these files into their respective folders/silos. We then need a way for a silo to globally register a component
export * from './backoffice-modal-container/backoffice-modal-container.element.js';
export * from './backoffice-notification-container/backoffice-notification-container.element.js';
+export * from './badge/index.js';
export * from './body-layout/body-layout.element.js';
export * from './code-block/index.js';
export * from './dropdown/index.js';
@@ -25,6 +26,6 @@ export * from './multiple-color-picker-input/index.js';
export * from './multiple-text-string-input/index.js';
export * from './popover-layout/index.js';
export * from './ref-item/index.js';
-export * from './stack/index.js';
export * from './split-panel/index.js';
+export * from './stack/index.js';
export * from './table/index.js';
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts
index 46f7f14c46..df17e89301 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts
@@ -193,8 +193,8 @@ export class UmbWorkspaceEditorElement extends UmbLitElement {
data-mark="workspace:view-link:${manifest.alias}">
${hint && !active
- ? html`${hint.text}${hint.text}`
: nothing}
@@ -275,12 +275,9 @@ export class UmbWorkspaceEditorElement extends UmbLitElement {
position: relative;
}
- uui-badge {
- position: absolute;
+ umb-badge {
font-size: var(--uui-type-small-size);
- top: -0.5em;
- right: auto;
- left: calc(50% + 0.8em);
+ right: -1.5em;
}
umb-extension-slot[slot='actions'] {
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view-variant-selector.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view-variant-selector.element.ts
index 7cb20c7228..8c0b26eea3 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view-variant-selector.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view-variant-selector.element.ts
@@ -337,7 +337,7 @@ export class UmbWorkspaceSplitViewVariantSelectorElement<
const hintsOrderedByWeight = Array.from(this._hintMap.values()).sort((a, b) => (b.weight || 0) - (a.weight || 0));
firstHintOnInactiveVariant = hintsOrderedByWeight.find((hint) => {
if (!hint.variantId) return false;
- return !hint.variantId.isInvariant() && hint.variantId.compare(this._activeVariant!) === false;
+ return !hint.variantId.isInvariant() && this.#isVariantActive(hint.variantId) === false;
});
}
@@ -369,8 +369,8 @@ export class UmbWorkspaceSplitViewVariantSelectorElement<
${this.#getVariantSpecInfo(this._activeVariant)}
${this.#renderReadOnlyTag(this._activeVariant?.culture)}
- ${this.#renderHintBadge(firstHintOnInactiveVariant)}
+ ${!this._variantSelectorOpen ? this.#renderHintBadge(firstHintOnInactiveVariant) : nothing}
${this._activeVariants.length > 1
? html`
@@ -424,9 +424,8 @@ export class UmbWorkspaceSplitViewVariantSelectorElement<
${this.#getVariantSpecInfo(variantOption)}
- ${this.#renderHintBadge(!active ? hint : undefined)}
- ${this.#renderSplitViewButton(variantOption)}
+ ${this.#renderHintBadge(!active ? hint : undefined)} ${this.#renderSplitViewButton(variantOption)}
${this.#isVariantExpanded(variantId)
? html` ${subVariantOptions.map((option) => this.#renderSegmentVariantOption(option))} `
@@ -436,9 +435,9 @@ export class UmbWorkspaceSplitViewVariantSelectorElement<
#renderHintBadge(hint?: UmbVariantHint) {
if (!hint) return nothing;
- return html`
- ${hint.text}
-
`;
+ return html` ${hint.text}`;
}
#isCreated(variantOption: VariantOptionModelType) {