diff --git a/packages/styleguide/src/lib/Typography/Anchor/Anchor.mdx b/packages/styleguide/src/lib/Typography/Anchor/Anchor.mdx
index 9ab4dff4c49..55681bd1875 100644
--- a/packages/styleguide/src/lib/Typography/Anchor/Anchor.mdx
+++ b/packages/styleguide/src/lib/Typography/Anchor/Anchor.mdx
@@ -27,6 +27,9 @@ export const parameters = {
+
+
+
## Usage
Use an anchor to navigate to another page, resource, or location on the same page.
diff --git a/packages/styleguide/src/lib/Typography/Anchor/Anchor.stories.tsx b/packages/styleguide/src/lib/Typography/Anchor/Anchor.stories.tsx
index d9b2703ac0b..41da65c6db5 100644
--- a/packages/styleguide/src/lib/Typography/Anchor/Anchor.stories.tsx
+++ b/packages/styleguide/src/lib/Typography/Anchor/Anchor.stories.tsx
@@ -1,9 +1,10 @@
-import { Anchor, GridBox, Text } from '@codecademy/gamut';
+import { Anchor, Box, GridBox, Text, ToolTip } from '@codecademy/gamut';
import {
MiniArrowRightIcon,
MiniInfoOutlineIcon,
} from '@codecademy/gamut-icons';
import type { Meta, StoryObj } from '@storybook/react';
+import React, { useEffect, useRef, useState } from 'react';
import { PolymorphicAnchors, VariantsExample } from './Anchor.examples';
@@ -85,3 +86,79 @@ export const IconModes: Story = {
export const PolymorphicAnchor: Story = {
render: () => ,
};
+
+export const TruncateWithTooltip: React.FC<{
+ text: string;
+ toolTipString: string;
+}> = ({ text, toolTipString }) => {
+ const containerRef = useRef(null);
+ const [adjustedText, setAdjustedText] = useState(text);
+
+ const calculateMaxText = (containerWidth: number) => {
+ // Assuming an average character width of 8px, adjust as necessary
+ const averageCharWidth = 8;
+ const maxChars = Math.floor(containerWidth / averageCharWidth);
+ return maxChars;
+ };
+
+ const [shouldTruncate, setShouldTruncate] = useState(false);
+
+ useEffect(() => {
+ const handleResize = () => {
+ if (containerRef.current) {
+ const { width } = containerRef.current.getBoundingClientRect();
+ const maxTextLength = calculateMaxText(width);
+ const isTruncated = maxTextLength < text.length;
+ if (isTruncated) {
+ // Adjust the text to fit within the max length
+ const truncatedText = text.slice(0, maxTextLength) + '...';
+ setAdjustedText(truncatedText);
+ } else {
+ setAdjustedText(text);
+ }
+ setShouldTruncate(isTruncated);
+ }
+ };
+ handleResize(); // Initial check
+ window.addEventListener('resize', handleResize);
+ return () => {
+ window.removeEventListener('resize', handleResize);
+ };
+ });
+
+ const anchor = (
+
+ {adjustedText}
+
+ );
+
+ return (
+
+ {shouldTruncate ? (
+
+ {anchor}
+
+ ) : (
+ anchor
+ )}
+
+ );
+};
+
+export const TruncateWithToolTipExample: Story = {
+ render: () => (
+
+ ),
+};
+
+export const TruncateWithNoToolTipExample: Story = {
+ render: () => (
+
+ ),
+};