Skip to content

Commit e741917

Browse files
[6.x] Add MiddleEllipsis component to Storybook (#14215)
1 parent 7ca830f commit e741917

3 files changed

Lines changed: 136 additions & 0 deletions

File tree

resources/js/components/ui/MiddleEllipsis/MiddleEllipsis.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { ref, onMounted, onUnmounted, watch } from 'vue';
33
import truncateOnResize from './TruncateText.js';
44
55
const props = defineProps({
6+
/** The text to display. Will be truncated from the middle when it overflows its container. */
67
text: { type: String, required: true },
78
});
89
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
import type { Meta, StoryObj } from '@storybook/vue3';
2+
import { MiddleEllipsis } from '@ui';
3+
4+
const meta = {
5+
title: 'Components/MiddleEllipsis',
6+
component: MiddleEllipsis,
7+
argTypes: {
8+
text: {
9+
control: 'text',
10+
},
11+
},
12+
} satisfies Meta<typeof MiddleEllipsis>;
13+
14+
export default meta;
15+
type Story = StoryObj<typeof meta>;
16+
17+
export const Default: Story = {
18+
args: {
19+
text: 'uploads/images/2024/vacation-photos/IMG_20240615_143256.jpg',
20+
},
21+
decorators: [
22+
() => ({
23+
template: '<div style="width: 250px;"><story /></div>',
24+
}),
25+
],
26+
};
27+
28+
const introCode = `
29+
<MiddleEllipsis text="uploads/images/2024/vacation-photos/IMG_20240615_143256.jpg" />
30+
`;
31+
32+
export const _DocsIntro: Story = {
33+
tags: ['!dev'],
34+
parameters: {
35+
docs: {
36+
source: { code: introCode },
37+
},
38+
},
39+
render: () => ({
40+
components: { MiddleEllipsis },
41+
template: `
42+
<div style="width: 250px;">
43+
<MiddleEllipsis text="uploads/images/2024/vacation-photos/IMG_20240615_143256.jpg" />
44+
</div>
45+
`,
46+
}),
47+
};
48+
49+
const widthsCode = `
50+
<div style="width: 500px;"><MiddleEllipsis :text="text" /></div>
51+
<div style="width: 400px;"><MiddleEllipsis :text="text" /></div>
52+
<div style="width: 300px;"><MiddleEllipsis :text="text" /></div>
53+
<div style="width: 200px;"><MiddleEllipsis :text="text" /></div>
54+
`;
55+
56+
export const _DifferentWidths: Story = {
57+
tags: ['!dev'],
58+
parameters: {
59+
docs: {
60+
source: { code: widthsCode },
61+
},
62+
},
63+
render: () => ({
64+
components: { MiddleEllipsis },
65+
setup() {
66+
const text = 'uploads/images/2024/vacation-photos/IMG_20240615_143256.jpg';
67+
return { text };
68+
},
69+
template: `
70+
<div class="space-y-4">
71+
<div>
72+
<div class="text-xs text-gray-600 mb-1">500px</div>
73+
<div style="width: 500px;"><MiddleEllipsis :text="text" /></div>
74+
</div>
75+
<div>
76+
<div class="text-xs text-gray-600 mb-1">400px</div>
77+
<div style="width: 400px;"><MiddleEllipsis :text="text" /></div>
78+
</div>
79+
<div>
80+
<div class="text-xs text-gray-600 mb-1">300px</div>
81+
<div style="width: 300px;"><MiddleEllipsis :text="text" /></div>
82+
</div>
83+
<div>
84+
<div class="text-xs text-gray-600 mb-1">200px</div>
85+
<div style="width: 200px;"><MiddleEllipsis :text="text" /></div>
86+
</div>
87+
</div>
88+
`,
89+
}),
90+
};
91+
92+
const resizableCode = `
93+
<div style="resize: horizontal; overflow: auto; width: 250px;">
94+
<MiddleEllipsis text="uploads/images/2024/vacation-photos/IMG_20240615_143256.jpg" />
95+
</div>
96+
`;
97+
98+
export const _Resizable: Story = {
99+
tags: ['!dev'],
100+
parameters: {
101+
docs: {
102+
source: { code: resizableCode },
103+
},
104+
},
105+
render: () => ({
106+
components: { MiddleEllipsis },
107+
template: `
108+
<div>
109+
<div class="text-xs text-gray-600 mb-2">Drag the corner to resize</div>
110+
<div class="border border-dashed rounded" style="resize: horizontal; overflow: auto; min-width: 100px; max-width: 500px; width: 250px; padding: 8px;">
111+
<MiddleEllipsis text="uploads/images/2024/vacation-photos/IMG_20240615_143256.jpg" />
112+
</div>
113+
</div>
114+
`,
115+
}),
116+
};
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { Canvas, Meta, ArgTypes } from '@storybook/addon-docs/blocks';
2+
import * as MiddleEllipsisStories from '../MiddleEllipsis.stories';
3+
4+
<Meta of={MiddleEllipsisStories} />
5+
6+
# MiddleEllipsis
7+
Truncates text from the middle when it overflows its container, preserving both the beginning and end of the string. This is useful for displaying file paths, URLs, and other strings where context at both ends is important.
8+
<Canvas of={MiddleEllipsisStories._DocsIntro} sourceState={'shown'} />
9+
10+
## Responsive Behavior
11+
The component fills its container and automatically truncates when needed. The full text is always available in the element's `title` attribute for hover tooltips.
12+
<Canvas of={MiddleEllipsisStories._DifferentWidths} sourceState={'shown'} />
13+
14+
## Live Resizing
15+
The truncation updates in real-time as the container is resized. Try dragging the corner of the box below.
16+
<Canvas of={MiddleEllipsisStories._Resizable} sourceState={'shown'} />
17+
18+
## Arguments
19+
<ArgTypes of={MiddleEllipsisStories} />

0 commit comments

Comments
 (0)