From 1baa7a42b1910991e216dda28c44a8bd03544d25 Mon Sep 17 00:00:00 2001 From: Philipp Daun Date: Fri, 13 Feb 2026 20:01:06 +0100 Subject: [PATCH 01/20] Install middle ellipsis package --- package-lock.json | 10 ++++++++++ package.json | 1 + 2 files changed, 11 insertions(+) diff --git a/package-lock.json b/package-lock.json index 001c7435d6f..8d7eeb4918a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "name": "statamic", "dependencies": { "@davidenke/marked-text-renderer": "^3.0.0", + "@dynamic-middle-ellipsis/core": "^1.0.2", "@floating-ui/dom": "^1.6.0", "@he-tree/vue": "^2.10.0-beta.2", "@hoppscotch/vue-toasted": "^0.1.0", @@ -338,6 +339,15 @@ "marked": "^15.0.8" } }, + "node_modules/@dynamic-middle-ellipsis/core": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@dynamic-middle-ellipsis/core/-/core-1.0.2.tgz", + "integrity": "sha512-vMIQaKvojcKAAwSfHyE+aR2wVyo4UMP61Z34HQw+FyrENWi4Tf+Xyl2DBtP/76RVsbgLjtCJmkiA/+yZxaraAQ==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@emnapi/core": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", diff --git a/package.json b/package.json index 5ee5f6ea33e..34141e60c23 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ }, "dependencies": { "@davidenke/marked-text-renderer": "^3.0.0", + "@dynamic-middle-ellipsis/core": "^1.0.2", "@floating-ui/dom": "^1.6.0", "@he-tree/vue": "^2.10.0-beta.2", "@hoppscotch/vue-toasted": "^0.1.0", From 4bc7bfff889a644208e5d022e26e048791de4024 Mon Sep 17 00:00:00 2001 From: Philipp Daun Date: Fri, 13 Feb 2026 20:01:29 +0100 Subject: [PATCH 02/20] Create truncated text component --- packages/cms/src/ui.js | 1 + resources/js/components/ui/TruncatedText.vue | 29 ++++++++++++++++++++ resources/js/components/ui/index.js | 1 + 3 files changed, 31 insertions(+) create mode 100644 resources/js/components/ui/TruncatedText.vue diff --git a/packages/cms/src/ui.js b/packages/cms/src/ui.js index 6b276d43130..2ea1cb98bbe 100644 --- a/packages/cms/src/ui.js +++ b/packages/cms/src/ui.js @@ -117,6 +117,7 @@ export const { TimePicker, ToggleGroup, ToggleItem, + TruncatedText, Widget, registerIconSet, registerIconSetFromStrings, diff --git a/resources/js/components/ui/TruncatedText.vue b/resources/js/components/ui/TruncatedText.vue new file mode 100644 index 00000000000..350ec2e44ea --- /dev/null +++ b/resources/js/components/ui/TruncatedText.vue @@ -0,0 +1,29 @@ + + + diff --git a/resources/js/components/ui/index.js b/resources/js/components/ui/index.js index aa0127f5660..efe4cfd5060 100644 --- a/resources/js/components/ui/index.js +++ b/resources/js/components/ui/index.js @@ -85,6 +85,7 @@ export { default as Textarea } from './Textarea.vue'; export { default as TimePicker } from './TimePicker/TimePicker.vue'; export { default as ToggleGroup } from './Toggle/Group.vue'; export { default as ToggleItem } from './Toggle/Item.vue'; +export { default as TruncatedText } from './TruncatedText.vue'; export { default as Avatar } from "./Avatar.vue"; export { default as CreateForm } from "./CreateForm.vue"; From 788da3df85cde5409449774b8465d5d2f93f8df1 Mon Sep 17 00:00:00 2001 From: Philipp Daun Date: Fri, 13 Feb 2026 20:02:14 +0100 Subject: [PATCH 03/20] Truncate asset filename --- resources/js/components/assets/Browser/Grid.vue | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/resources/js/components/assets/Browser/Grid.vue b/resources/js/components/assets/Browser/Grid.vue index c3513ce3fd7..f673deb6915 100644 --- a/resources/js/components/assets/Browser/Grid.vue +++ b/resources/js/components/assets/Browser/Grid.vue @@ -168,7 +168,9 @@ -
+
+ +
@@ -193,7 +195,8 @@ import { DropdownMenu, DropdownLabel, DropdownItem, - DropdownSeparator + DropdownSeparator, + TruncatedText } from '@ui'; import { injectListingContext } from '@/components/ui/Listing/Listing.vue'; import ItemActions from '@/components/actions/ItemActions.vue'; @@ -217,6 +220,7 @@ export default { DropdownSeparator, ItemActions, FolderSvg, + TruncatedText, }, props: { From b1dcc41ed9fa7069674a532b9a8c15e3b6e8038a Mon Sep 17 00:00:00 2001 From: Philipp Daun Date: Fri, 13 Feb 2026 20:02:27 +0100 Subject: [PATCH 04/20] Use default font for asset filename --- resources/css/components/assets.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/css/components/assets.css b/resources/css/components/assets.css index 248c2d9efe1..fa75c89b11f 100644 --- a/resources/css/components/assets.css +++ b/resources/css/components/assets.css @@ -158,7 +158,7 @@ } .asset-filename { - @apply font-mono text-xs text-gray-500 dark:text-gray-300 mt-2 whitespace-nowrap text-center; + @apply text-xs text-gray-500 dark:text-gray-300 mt-2 whitespace-nowrap text-center; .selected & { @apply text-blue-500; .dark & { From ee417056bfb6e3c1fa19fd27cdc82c3c3b033064 Mon Sep 17 00:00:00 2001 From: Philipp Daun Date: Fri, 13 Feb 2026 20:49:30 +0100 Subject: [PATCH 05/20] Properly truncate text --- resources/js/components/ui/TruncatedText.vue | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/resources/js/components/ui/TruncatedText.vue b/resources/js/components/ui/TruncatedText.vue index 350ec2e44ea..960c53019c5 100644 --- a/resources/js/components/ui/TruncatedText.vue +++ b/resources/js/components/ui/TruncatedText.vue @@ -11,11 +11,10 @@ let cleanup = null; onMounted(() => { const truncateOnResize = createMiddleEllipsisUtils(); - console.log(props.text, truncated.value.innerText, truncated.value.innerText); cleanup = truncateOnResize({ targetElement: truncated.value, - originalText: props.text, + originalText: truncated.value.innerText, }); }); @@ -25,5 +24,7 @@ onUnmounted(() => { From 65f66ed00b7b0ac812adac57c6a4ee169ab8b8be Mon Sep 17 00:00:00 2001 From: Philipp Daun Date: Wed, 18 Feb 2026 12:10:19 +0100 Subject: [PATCH 06/20] Use predictable font for asset filename --- resources/css/components/assets.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/css/components/assets.css b/resources/css/components/assets.css index fa75c89b11f..11cd6e9a443 100644 --- a/resources/css/components/assets.css +++ b/resources/css/components/assets.css @@ -158,7 +158,8 @@ } .asset-filename { - @apply text-xs text-gray-500 dark:text-gray-300 mt-2 whitespace-nowrap text-center; + @apply text-xs text-gray-500 dark:text-gray-300 mt-2 whitespace-nowrap text-center st-text-legibility; + font-variant: tabular-nums; /* Disable common-ligatures from body default */ .selected & { @apply text-blue-500; .dark & { From 5ccf1fe255dacaa6a0558fa5514553d184237bfa Mon Sep 17 00:00:00 2001 From: Philipp Daun Date: Wed, 18 Feb 2026 12:12:41 +0100 Subject: [PATCH 07/20] Define character map for truncated text --- .../ui/TruncatedTextCharacterMap.js | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 resources/js/components/ui/TruncatedTextCharacterMap.js diff --git a/resources/js/components/ui/TruncatedTextCharacterMap.js b/resources/js/components/ui/TruncatedTextCharacterMap.js new file mode 100644 index 00000000000..6741eaf5707 --- /dev/null +++ b/resources/js/components/ui/TruncatedTextCharacterMap.js @@ -0,0 +1,100 @@ +export default { + "inter": { + "0": 10.0625, + "1": 6.4288330078125, + "2": 9.6710205078125, + "3": 9.848953247070312, + "4": 10.285598754882812, + "5": 9.462677001953125, + "6": 9.857650756835938, + "7": 9.121536254882812, + "8": 9.833343505859375, + "9": 9.857650756835938, + " ": 4.4444580078125, + "!": 4.480926513671875, + "\"": 7.342041015625, + "#": 10.072921752929688, + "$": 10.217025756835938, + "%": 15.46533203125, + "&": 10.2413330078125, + "'": 4.7152862548828125, + "(": 5.7187652587890625, + ")": 5.7187652587890625, + "*": 7.958343505859375, + "+": 10.526046752929688, + ",": 4.4878692626953125, + "-": 7.3038330078125, + ".": 4.4878692626953125, + "/": 5.7031402587890625, + ":": 4.4878692626953125, + ";": 4.687530517578125, + "<": 10.526046752929688, + "=": 10.526046752929688, + ">": 10.526046752929688, + "?": 8.202239990234375, + "@": 15.467010498046875, + "A": 11.086814880371094, + "B": 10.440109252929688, + "C": 11.672744750976562, + "D": 11.489593505859375, + "E": 9.578994750976562, + "F": 9.381088256835938, + "G": 11.90972900390625, + "H": 11.828140258789062, + "I": 4.2326507568359375, + "J": 9.068588256835938, + "K": 10.68316650390625, + "L": 8.993057250976562, + "M": 14.371536254882812, + "N": 11.977447509765625, + "O": 12.20660400390625, + "P": 10.171005249023438, + "Q": 12.20660400390625, + "R": 10.276901245117188, + "S": 10.217025756835938, + "T": 10.265640258789062, + "U": 11.833343505859375, + "V": 11.099838256835938, + "W": 15.888031005859375, + "X": 10.848968505859375, + "Y": 10.795150756835938, + "Z": 10.03472900390625, + "[": 5.7187652587890625, + "\\": 5.316856384277344, + "]": 5.7187652587890625, + "^": 7.4791717529296875, + "_": 7.29339599609375, + "`": 5.0191192626953125, + "a": 8.906265258789062, + "b": 9.71356201171875, + "c": 9.054702758789062, + "d": 9.71356201171875, + "e": 9.24481201171875, + "f": 5.504364013671875, + "g": 9.727447509765625, + "h": 9.3819580078125, + "i": 3.8107757568359375, + "j": 3.8107757568359375, + "k": 8.707473754882812, + "l": 3.8107757568359375, + "m": 13.949661254882812, + "n": 9.375015258789062, + "o": 9.503494262695312, + "p": 9.71356201171875, + "q": 9.71356201171875, + "r": 6.038200378417969, + "s": 8.3507080078125, + "t": 5.175346374511719, + "u": 9.3819580078125, + "v": 8.902786254882812, + "w": 12.975723266601562, + "x": 8.664947509765625, + "y": 8.902786254882812, + "z": 8.704879760742188, + "{": 6.7465362548828125, + "|": 5.255218505859375, + "}": 6.7465362548828125, + "~": 10.526046752929688, + "": 0 + } +} From 0a2dd2b28eb83dac4bfaf21ae5f6b4e2e3cf0413 Mon Sep 17 00:00:00 2001 From: Philipp Daun Date: Wed, 18 Feb 2026 12:13:55 +0100 Subject: [PATCH 08/20] Passt custom character map into ellipsis util --- resources/js/components/ui/TruncatedText.vue | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/resources/js/components/ui/TruncatedText.vue b/resources/js/components/ui/TruncatedText.vue index 960c53019c5..677c4e17ef9 100644 --- a/resources/js/components/ui/TruncatedText.vue +++ b/resources/js/components/ui/TruncatedText.vue @@ -1,20 +1,21 @@