diff --git a/apps/browser/src/autofill/content/components/buttons/action-button.ts b/apps/browser/src/autofill/content/components/buttons/action-button.ts
new file mode 100644
index 00000000000..a9b4742b448
--- /dev/null
+++ b/apps/browser/src/autofill/content/components/buttons/action-button.ts
@@ -0,0 +1,66 @@
+import { css } from "@emotion/css";
+import { html } from "lit";
+
+import { Theme } from "@bitwarden/common/platform/enums";
+
+import { border, themes, typography, spacing } from "../constants/styles";
+
+export function ActionButton({
+ buttonAction,
+ buttonText,
+ disabled = false,
+ theme,
+}: {
+ buttonAction: (e: Event) => void;
+ buttonText: string;
+ disabled?: boolean;
+ theme: Theme;
+}) {
+ const handleButtonClick = (event: Event) => {
+ if (!disabled) {
+ buttonAction(event);
+ }
+ };
+
+ return html`
+
+ `;
+}
+
+const actionButtonStyles = ({ disabled, theme }: { disabled: boolean; theme: Theme }) => css`
+ ${typography.body2}
+
+ user-select: none;
+ border: 1px solid transparent;
+ border-radius: ${border.radius.full};
+ padding: ${spacing["1"]} ${spacing["3"]};
+ width: 100%;
+ overflow: hidden;
+ text-align: center;
+ text-overflow: ellipsis;
+ font-weight: 700;
+
+ ${disabled
+ ? `
+ background-color: ${themes[theme].secondary["300"]};
+ color: ${themes[theme].text.muted};
+ `
+ : `
+ background-color: ${themes[theme].primary["600"]};
+ cursor: pointer;
+ color: ${themes[theme].text.contrast};
+
+ :hover {
+ border-color: ${themes[theme].primary["700"]};
+ background-color: ${themes[theme].primary["700"]};
+ color: ${themes[theme].text.contrast};
+ }
+ `}
+`;
diff --git a/apps/browser/src/autofill/content/components/buttons/badge-button.ts b/apps/browser/src/autofill/content/components/buttons/badge-button.ts
new file mode 100644
index 00000000000..3b3b84f8166
--- /dev/null
+++ b/apps/browser/src/autofill/content/components/buttons/badge-button.ts
@@ -0,0 +1,67 @@
+import { css } from "@emotion/css";
+import { html } from "lit";
+
+import { Theme } from "@bitwarden/common/platform/enums";
+
+import { border, themes, typography, spacing } from "../constants/styles";
+
+export function BadgeButton({
+ buttonAction,
+ buttonText,
+ disabled = false,
+ theme,
+}: {
+ buttonAction: (e: Event) => void;
+ buttonText: string;
+ disabled?: boolean;
+ theme: Theme;
+}) {
+ const handleButtonClick = (event: Event) => {
+ if (!disabled) {
+ buttonAction(event);
+ }
+ };
+
+ return html`
+
+ `;
+}
+
+const badgeButtonStyles = ({ disabled, theme }: { disabled: boolean; theme: Theme }) => css`
+ ${typography.helperMedium}
+
+ user-select: none;
+ border-radius: ${border.radius.full};
+ padding: ${spacing["1"]} ${spacing["2"]};
+ max-height: fit-content;
+ overflow: hidden;
+ text-align: center;
+ text-overflow: ellipsis;
+ font-weight: 500;
+
+ ${disabled
+ ? `
+ border: 0.5px solid ${themes[theme].secondary["300"]};
+ background-color: ${themes[theme].secondary["300"]};
+ color: ${themes[theme].text.muted};
+ `
+ : `
+ border: 0.5px solid ${themes[theme].primary["700"]};
+ background-color: ${themes[theme].primary["100"]};
+ cursor: pointer;
+ color: ${themes[theme].primary["700"]};
+
+ :hover {
+ border-color: ${themes[theme].primary["600"]};
+ background-color: ${themes[theme].primary["600"]};
+ color: ${themes[theme].text.contrast};
+ }
+ `}
+`;
diff --git a/apps/browser/src/autofill/content/components/buttons/close-button.ts b/apps/browser/src/autofill/content/components/buttons/close-button.ts
new file mode 100644
index 00000000000..c32d0c130e3
--- /dev/null
+++ b/apps/browser/src/autofill/content/components/buttons/close-button.ts
@@ -0,0 +1,39 @@
+import { css } from "@emotion/css";
+import { html } from "lit";
+
+import { Theme } from "@bitwarden/common/platform/enums";
+
+import { spacing, themes } from "../constants/styles";
+import { Close as CloseIcon } from "../icons";
+
+export function CloseButton({
+ handleCloseNotification,
+ theme,
+}: {
+ handleCloseNotification: (e: Event) => void;
+ theme: Theme;
+}) {
+ return html`
+
+ `;
+}
+
+const closeButtonStyles = (theme: Theme) => css`
+ border: 1px solid transparent;
+ border-radius: ${spacing["1"]};
+ background-color: transparent;
+ cursor: pointer;
+ width: 36px;
+ height: 36px;
+
+ :hover {
+ border: 1px solid ${themes[theme].primary["600"]};
+ }
+
+ > svg {
+ width: 20px;
+ height: 20px;
+ }
+`;
diff --git a/apps/browser/src/autofill/content/components/buttons/edit-button.ts b/apps/browser/src/autofill/content/components/buttons/edit-button.ts
new file mode 100644
index 00000000000..695cbfd3b9d
--- /dev/null
+++ b/apps/browser/src/autofill/content/components/buttons/edit-button.ts
@@ -0,0 +1,60 @@
+import { css } from "@emotion/css";
+import { html } from "lit";
+
+import { Theme } from "@bitwarden/common/platform/enums";
+
+import { themes, typography, spacing } from "../constants/styles";
+import { PencilSquare } from "../icons";
+
+export function EditButton({
+ buttonAction,
+ buttonText,
+ disabled = false,
+ theme,
+}: {
+ buttonAction: (e: Event) => void;
+ buttonText: string;
+ disabled?: boolean;
+ theme: Theme;
+}) {
+ return html`
+
+ `;
+}
+
+const editButtonStyles = ({ disabled, theme }: { disabled?: boolean; theme: Theme }) => css`
+ ${typography.helperMedium}
+
+ user-select: none;
+ display: flex;
+ border: 1px solid transparent;
+ border-radius: ${spacing["1"]};
+ background-color: transparent;
+ padding: ${spacing["1"]};
+ max-height: fit-content;
+ overflow: hidden;
+
+ ${!disabled
+ ? `
+ cursor: pointer;
+
+ :hover {
+ border-color: ${themes[theme].primary["600"]};
+ }
+ `
+ : ""}
+
+ > svg {
+ width: 16px;
+ height: fit-content;
+ }
+`;
diff --git a/apps/browser/src/autofill/content/components/cipher/cipher-action.ts b/apps/browser/src/autofill/content/components/cipher/cipher-action.ts
new file mode 100644
index 00000000000..2d386d34d6a
--- /dev/null
+++ b/apps/browser/src/autofill/content/components/cipher/cipher-action.ts
@@ -0,0 +1,31 @@
+import { Theme } from "@bitwarden/common/platform/enums";
+
+import { BadgeButton } from "../../../content/components/buttons/badge-button";
+import { EditButton } from "../../../content/components/buttons/edit-button";
+import { NotificationTypes } from "../../../notification/abstractions/notification-bar";
+
+export function CipherAction({
+ handleAction = () => {
+ /* no-op */
+ },
+ notificationType,
+ theme,
+}: {
+ handleAction?: (e: Event) => void;
+ notificationType: typeof NotificationTypes.Change | typeof NotificationTypes.Add;
+ theme: Theme;
+}) {
+ return notificationType === NotificationTypes.Change
+ ? BadgeButton({
+ buttonAction: handleAction,
+ // @TODO localize
+ buttonText: "Update item",
+ theme,
+ })
+ : EditButton({
+ buttonAction: handleAction,
+ // @TODO localize
+ buttonText: "Edit item",
+ theme,
+ });
+}
diff --git a/apps/browser/src/autofill/content/components/cipher/cipher-icon.ts b/apps/browser/src/autofill/content/components/cipher/cipher-icon.ts
new file mode 100644
index 00000000000..73d3f7604a9
--- /dev/null
+++ b/apps/browser/src/autofill/content/components/cipher/cipher-icon.ts
@@ -0,0 +1,33 @@
+import { css } from "@emotion/css";
+import { html } from "lit";
+
+import { Theme } from "@bitwarden/common/platform/enums";
+
+import { Globe } from "../../../content/components/icons";
+
+/**
+ * @param {string} props.color contextual color override if no icon URI is available
+ * @param {string} props.size valid CSS `width` value, represents the width-basis of the graphic, with height maintaining original aspect-ratio
+ */
+export function CipherIcon({
+ color,
+ size,
+ theme,
+ uri,
+}: {
+ color: string;
+ size: string;
+ theme: Theme;
+ uri?: string;
+}) {
+ const iconClass = cipherIconStyle({ width: size });
+
+ return uri
+ ? html``
+ : html`${Globe({ color, theme })}`;
+}
+
+const cipherIconStyle = ({ width }: { width: string }) => css`
+ width: ${width};
+ height: fit-content;
+`;
diff --git a/apps/browser/src/autofill/content/components/cipher/cipher-indicator-icons.ts b/apps/browser/src/autofill/content/components/cipher/cipher-indicator-icons.ts
new file mode 100644
index 00000000000..38b4292f8e5
--- /dev/null
+++ b/apps/browser/src/autofill/content/components/cipher/cipher-indicator-icons.ts
@@ -0,0 +1,35 @@
+import { css } from "@emotion/css";
+import { html } from "lit";
+
+import { Theme } from "@bitwarden/common/platform/enums";
+
+import { themes } from "../../../content/components/constants/styles";
+import { Business, Family } from "../../../content/components/icons";
+
+// @TODO connect data source to icon checks
+// @TODO support other indicator types (attachments, etc)
+export function CipherInfoIndicatorIcons({
+ isBusinessOrg,
+ isFamilyOrg,
+ theme,
+}: {
+ isBusinessOrg?: boolean;
+ isFamilyOrg?: boolean;
+ theme: Theme;
+}) {
+ const indicatorIcons = [
+ ...(isBusinessOrg ? [Business({ color: themes[theme].text.muted, theme })] : []),
+ ...(isFamilyOrg ? [Family({ color: themes[theme].text.muted, theme })] : []),
+ ];
+
+ return indicatorIcons.length
+ ? html` ${indicatorIcons} `
+ : null; // @TODO null case should be handled by parent
+}
+
+const cipherInfoIndicatorIconsStyles = css`
+ > svg {
+ width: fit-content;
+ height: 12px;
+ }
+`;
diff --git a/apps/browser/src/autofill/content/components/cipher/cipher-info.ts b/apps/browser/src/autofill/content/components/cipher/cipher-info.ts
new file mode 100644
index 00000000000..de374b44a97
--- /dev/null
+++ b/apps/browser/src/autofill/content/components/cipher/cipher-info.ts
@@ -0,0 +1,48 @@
+import { css } from "@emotion/css";
+import { html } from "lit";
+
+import { Theme } from "@bitwarden/common/platform/enums";
+
+import { themes, typography } from "../../../content/components/constants/styles";
+
+import { CipherInfoIndicatorIcons } from "./cipher-indicator-icons";
+import { CipherData } from "./types";
+
+// @TODO support other cipher types (card, identity, notes, etc)
+export function CipherInfo({ cipher, theme }: { cipher: CipherData; theme: Theme }) {
+ const { name, login } = cipher;
+
+ return html`
+
{{ "aDeviceIs" | i18n }}
+{{ "deviceListDescription" | i18n }}
+ +