From 414f05640a1cca2da1c204046613b9c6156605b5 Mon Sep 17 00:00:00 2001 From: "Adrien Minne (adrm)" Date: Wed, 22 Oct 2025 13:36:28 +0200 Subject: [PATCH 1/3] [FIX] demo: log something when catching global errors We have a external listener listening on `window.error`, but we don't log anything when catching an error. Task: 5082659 --- demo/main.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/demo/main.js b/demo/main.js index 4b75fa36fb..338d075578 100644 --- a/demo/main.js +++ b/demo/main.js @@ -215,7 +215,10 @@ class Demo extends Component { useExternalListener(window, "beforeunload", this.leaveCollaborativeSession.bind(this)); useExternalListener(window, "unhandledrejection", this.notifyError.bind(this)); - useExternalListener(window, "error", this.notifyError.bind(this)); + useExternalListener(window, "error", (ev) => { + console.error("Global error caught: ", ev.error || ev.message); + this.notifyError(); + }); onWillStart(() => this.initiateConnection()); From c707bdba511f141fb6dd778b3b9261082d897011 Mon Sep 17 00:00:00 2001 From: "Adrien Minne (adrm)" Date: Wed, 22 Oct 2025 10:39:30 +0200 Subject: [PATCH 2/3] [REF] composer: use opacity rather than color alpha For the dark mode, we will start using colors using `light-dark()` CSS variables. Those colors do not work with the `toHex` method. To prepare for this change: - compare raw color string in content_editable_helper instead of hex value - use opacity style rather then changing the color alpha value Task: 5082659 --- src/components/composer/composer/composer.ts | 10 ++++------ .../composer/content_editable_helper.ts | 13 +++++++++---- tests/composer/composer_component.test.ts | 18 ++++++++++++++++++ 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/components/composer/composer/composer.ts b/src/components/composer/composer/composer.ts index 02cdae57a4..64c68070ee 100644 --- a/src/components/composer/composer/composer.ts +++ b/src/components/composer/composer/composer.ts @@ -1,6 +1,6 @@ import { NEWLINE, SCROLLBAR_WIDTH } from "@odoo/o-spreadsheet-engine/constants"; import { Component, onMounted, onWillUnmount, useEffect, useRef, useState } from "@odoo/owl"; -import { debounce, deepEquals, isFormula, setColorAlpha } from "../../../helpers/index"; +import { debounce, deepEquals, isFormula } from "../../../helpers/index"; import { cssPropertiesToCss } from "@odoo/o-spreadsheet-engine/components/helpers/css"; import { DEFAULT_TOKEN_COLOR } from "@odoo/o-spreadsheet-engine/constants"; @@ -43,6 +43,7 @@ export type HtmlContent = { onHover?: (rect: Rect) => void; onStopHover?: () => void; color?: Color; + opacity?: number; backgroundColor?: Color; classes?: string[]; }; @@ -635,10 +636,6 @@ export class Composer extends Component const { end, start } = this.props.composerStore.composerSelection; for (let index = 0; index < tokens.length; index++) { const token = tokens[index]; - let color = token.color || DEFAULT_TOKEN_COLOR; - if (token.isBlurred) { - color = setColorAlpha(color, 0.5); - } const classes: string[] = []; if ( token.type === "REFERENCE" && @@ -662,7 +659,8 @@ export class Composer extends Component result.push({ value: token.value, - color, + color: token.color || DEFAULT_TOKEN_COLOR, + opacity: token.isBlurred ? 0.5 : 1, classes, onHover: (rect) => this.onTokenHover(index, rect), onStopHover: () => this.onTokenHover(undefined), diff --git a/src/components/composer/content_editable_helper.ts b/src/components/composer/content_editable_helper.ts index 2ed9624ece..e584e1619c 100644 --- a/src/components/composer/content_editable_helper.ts +++ b/src/components/composer/content_editable_helper.ts @@ -1,5 +1,5 @@ import { NEWLINE } from "@odoo/o-spreadsheet-engine/constants"; -import { deepEquals, toHex } from "../../helpers"; +import { deepEquals } from "../../helpers"; import { getBoundingRectAsPOJO, getCurrentSelection, @@ -162,6 +162,9 @@ export class ContentEditableHelper { const span = document.createElement("span"); span.innerText = content.value; span.style.color = content.color || ""; + if (content.opacity !== undefined && content.opacity !== 1) { + span.style.opacity = content.opacity.toString(); + } span.addEventListener("mousemove", () => { content.onHover?.(getBoundingRectAsPOJO(span)); }); @@ -266,11 +269,13 @@ export class ContentEditableHelper { } function compareContentToSpanElement(content: HtmlContent, node: HTMLElement): boolean { - const contentColor = content.color ? toHex(content.color) : ""; - const nodeColor = node.style?.color ? toHex(node.style.color) : ""; + const contentColor = content.color || ""; + const nodeColor = node.style?.color || ""; + const nodeOpacity = node.style?.opacity || "1"; const sameColor = contentColor === nodeColor; const sameClass = deepEquals(content.classes, [...node.classList]); const sameContent = node.innerText === content.value; - return sameColor && sameClass && sameContent; + const sameOpacity = (content.opacity ?? 1).toString() === nodeOpacity; + return sameColor && sameClass && sameContent && sameOpacity; } diff --git a/tests/composer/composer_component.test.ts b/tests/composer/composer_component.test.ts index 359a4fe784..d5dabe58d0 100644 --- a/tests/composer/composer_component.test.ts +++ b/tests/composer/composer_component.test.ts @@ -1342,6 +1342,24 @@ describe("Composer blurs formula parts not affected by cursor position.", () => ]); }); + test("blurred tokens have reduced opacity", async () => { + const str = "=SUM(COS("; + await typeInComposer(str); + composerStore.changeComposerCursorSelection(str.length, str.length); + await nextTick(); + const spans = [...fixture.querySelectorAll("div.o-composer span")].map((el) => ({ + value: el.textContent || "", + opacity: el.style.opacity || "1", + })); + expect(spans).toEqual([ + { value: "=", opacity: "0.5" }, + { value: "SUM", opacity: "0.5" }, + { value: "(", opacity: "0.5" }, + { value: "COS", opacity: "1" }, + { value: "(", opacity: "1" }, + ]); + }); + describe("lighten correctly when too much parenthesis", () => { test.each([ "", From ef6090143a6d8c611247d30bb18e4c7420ab1b1e Mon Sep 17 00:00:00 2001 From: "Adrien Minne (adrm)" Date: Wed, 22 Oct 2025 09:48:05 +0200 Subject: [PATCH 3/3] [IMP] spreadsheet: implement dark mode for UI This commit implements a dark mode for spreadsheet for the whole UI, excluding the canvas and the figures. It is mostly implemented using the `light-dark()` CSS function, which allows to define colors for both light and dark modes. The style `color-scheme: dark/light` is set on the main spreadsheet component based on its props. Some notes/limitations: - the composer token colors stay the same for dark/light mode, the colors were simply a bit tweaked to look okay in both modes. Having them change based on the mode would be hard mostly because we need to sync the token colors with the highlight colors, but the highlight are drawn on the canvas, which does not support `light-dark()`. - box-shadow colors were not changed for dark mode. Maybe they should be white instead of dark-gray, but they are not in odoo. That means that we have mostly invisible shadows in dark mode, and need to add a border to the popover to separate it from the background. Task: 5082659 --- .husky/css_check.js | 4 +- demo/main.js | 15 +- .../o-spreadsheet-engine/src/constants.ts | 2 +- .../o-spreadsheet-engine/src/helpers/color.ts | 4 +- .../border_editor/border_editor.css | 12 +- .../border_editor/border_editor.xml | 4 +- src/components/bottom_bar/bottom_bar.css | 2 +- .../bottom_bar_sheet/bottom_bar_sheet.css | 6 +- .../bottom_bar_statistic.css | 2 +- src/components/color_picker/color_picker.css | 16 +- src/components/color_picker/color_picker.xml | 4 +- .../color_picker/color_picker_widget.css | 2 +- .../autocomplete_dropdown.css | 1 - .../autocomplete_dropdown.ts | 2 +- .../autocomplete_dropdown.xml | 2 +- src/components/composer/composer/composer.css | 9 +- src/components/composer/composer/composer.xml | 2 +- .../formula_assistant/formula_assistant.css | 3 +- .../formula_assistant/formula_assistant.xml | 2 +- .../composer/grid_composer/grid_composer.css | 1 + .../composer/speech_bubble/speech_bubble.css | 4 +- .../error_tooltip/error_tooltip.css | 1 - .../error_tooltip/error_tooltip.xml | 2 +- .../chart_dashboard_menu.css | 2 +- src/components/figures/figure/figure.css | 3 + .../font_size_editor/font_size_editor.css | 2 +- src/components/icon_picker/icon_picker.css | 1 - src/components/icon_picker/icon_picker.xml | 2 +- src/components/icons/icons.xml | 6 + .../link/link_display/link_display.css | 3 +- .../link/link_display/link_display.xml | 2 +- .../link/link_editor/link_editor.css | 3 +- .../link/link_editor/link_editor.xml | 4 +- src/components/menu/menu.css | 1 - src/components/menu/menu.xml | 2 +- src/components/menu_popover/menu_popover.css | 1 - src/components/menu_popover/menu_popover.xml | 5 +- .../pivot_html_renderer.css | 4 +- src/components/popover/popover.css | 7 + .../carousel_panel/carousel_panel.css | 1 - .../carousel_panel/carousel_panel.xml | 2 +- .../chart_type_picker/chart_previews.xml | 387 +++++++++++------- .../chart_type_picker/chart_type_picker.css | 1 - .../chart_type_picker/chart_type_picker.xml | 2 +- .../components/checkbox/checkbox.css | 6 + .../radio_selection/radio_selection.css | 6 + .../cf_editor/cf_editor.css | 2 +- .../cf_editor/cf_editor.ts | 17 +- .../cf_editor/color_scale_rule_editor.xml | 2 +- .../cf_preview/cf_preview.css | 1 - .../cf_preview/cf_preview.xml | 5 +- .../custom_currency/custom_currency.css | 3 - .../data_validation/dv_preview/dv_preview.css | 2 +- .../side_panel/more_formats/more_formats.css | 3 +- .../side_panel/more_formats/more_formats.xml | 2 +- .../add_dimension_button.css | 3 - .../add_dimension_button.xml | 2 +- .../pivot_dimension/pivot_dimension.css | 5 - .../pivot_dimension/pivot_dimension.xml | 2 +- .../side_panel/side_panel/side_panel.css | 3 +- .../side_panel/side_panel/side_panel.xml | 2 +- .../small_bottom_bar/small_bottom_bar.css | 1 - .../small_bottom_bar/small_bottom_bar.xml | 2 +- src/components/spreadsheet/spreadsheet.css | 30 +- src/components/spreadsheet/spreadsheet.ts | 10 + src/components/spreadsheet/spreadsheet.xml | 2 +- .../table_style_preview.css | 1 - .../table_style_preview.xml | 2 +- .../table_styles_popover.css | 3 +- .../table_styles_popover.xml | 2 +- .../dropdown_action/dropdown_action.css | 2 - .../dropdown_action/dropdown_action.xml | 2 +- src/components/top_bar/top_bar.css | 1 - src/components/top_bar/top_bar.xml | 4 +- src/variables.css | 77 ++-- .../top_bar_component.test.ts.snap | 8 +- .../bottom_bar_component.test.ts.snap | 2 +- .../color_picker_component.test.ts.snap | 4 +- ...tocomplete_dropdown_component.test.ts.snap | 18 +- .../composer_component.test.ts.snap | 34 +- .../formula_assistant_component.test.ts.snap | 3 +- tests/composer/composer_component.test.ts | 8 +- ...al_formatting_panel_component.test.ts.snap | 4 +- .../data_validation_list_component.test.ts | 4 +- .../link_display_component.test.ts.snap | 2 +- .../context_menu_component.test.ts.snap | 2 +- .../spreadsheet_pivot_side_panel.test.ts.snap | 4 +- .../spreadsheet_pivot_side_panel.test.ts | 8 +- .../error_tooltip_component.test.ts.snap | 2 +- tests/setup/jest.setup.ts | 7 + tests/setup/jest_extend.ts | 7 +- .../spreadsheet_component.test.ts.snap | 6 +- .../spreadsheet/spreadsheet_component.test.ts | 6 + .../filter_menu_component.test.ts.snap | 2 + tests/test_helpers/dom_helper.ts | 2 +- 95 files changed, 520 insertions(+), 361 deletions(-) diff --git a/.husky/css_check.js b/.husky/css_check.js index ee8ae13e96..31bb08895a 100644 --- a/.husky/css_check.js +++ b/.husky/css_check.js @@ -21,7 +21,7 @@ for (const file of files) { content = content.replace(commentPattern, ""); // look for first level selectors const firstLevelSelectors = content.match(firstLevelSelectorPattern) || []; - if (!firstLevelSelectors.every((line) => line.startsWith(".o-spreadsheet "))) { + if (!firstLevelSelectors.every((line) => line.startsWith(".o-spreadsheet ") || line.startsWith(".o-spreadsheet."))) { faultyFiles.push(file); } } @@ -38,7 +38,7 @@ Every css selector should be encompassed within .o-spreadsheet. For example: .o-spreadsheet { ... } -or +or .o-spreadsheet .foo { ... } diff --git a/demo/main.js b/demo/main.js index 338d075578..d773832f43 100644 --- a/demo/main.js +++ b/demo/main.js @@ -70,7 +70,7 @@ let start; class Demo extends Component { setup() { - this.state = useState({ key: 0, displayHeader: false }); + this.state = useState({ key: 0, displayHeader: false, colorScheme: "light" }); this.stateUpdateMessages = []; this.client = { id: uuidGenerator.uuidv4(), @@ -108,6 +108,15 @@ class Demo extends Component { icon: "o-spreadsheet-Icon.OPEN_DASHBOARD", }); + topbarMenuRegistry.addChild("dark_mode", ["file"], { + name: "Toggle dark mode", + sequence: 12.5, + isReadonlyAllowed: true, + execute: () => + (this.state.colorScheme = this.state.colorScheme === "dark" ? "light" : "dark"), + icon: "o-spreadsheet-Icon.DARK_MODE", + }); + topbarMenuRegistry.addChild("read_write", ["file"], { name: "Open with write access", sequence: 13, @@ -334,11 +343,11 @@ Demo.template = xml/* xml */ `
A header
- +
- +
`; Demo.components = { Spreadsheet }; diff --git a/packages/o-spreadsheet-engine/src/constants.ts b/packages/o-spreadsheet-engine/src/constants.ts index ab440f861f..5724c6af88 100644 --- a/packages/o-spreadsheet-engine/src/constants.ts +++ b/packages/o-spreadsheet-engine/src/constants.ts @@ -277,7 +277,7 @@ export const DEFAULT_CAROUSEL_TITLE_STYLE: ChartStyle = { color: TEXT_BODY, }; -export const DEFAULT_TOKEN_COLOR: Color = "#000000"; +export const DEFAULT_TOKEN_COLOR: Color = "light-dark(#000000, #ffffff)"; const functionColor = DEFAULT_TOKEN_COLOR; const operatorColor = "#3da4ab"; diff --git a/packages/o-spreadsheet-engine/src/helpers/color.ts b/packages/o-spreadsheet-engine/src/helpers/color.ts index 6518f4e8c7..c4914c09ac 100644 --- a/packages/o-spreadsheet-engine/src/helpers/color.ts +++ b/packages/o-spreadsheet-engine/src/helpers/color.ts @@ -15,12 +15,10 @@ export const colors = [ "#00a3a3", "#f012be", "#3d9970", - "#111111", "#62A300", "#ff4136", "#949494", - "#85144b", - "#001f3f", + "#ff5c9d", ]; /* diff --git a/src/components/border_editor/border_editor.css b/src/components/border_editor/border_editor.css index 3c0df1f59c..33cd1715d2 100644 --- a/src/components/border_editor/border_editor.css +++ b/src/components/border_editor/border_editor.css @@ -1,7 +1,6 @@ .o-spreadsheet { .o-border-selector { padding: 4px; - background-color: white; .o-divider { border-right: 1px solid var(--os-gray-300); @@ -30,7 +29,6 @@ } .o-border-style-dropdown { - background: #ffffff; padding: 4px; .o-style-preview { margin: 7px 5px 7px 5px; @@ -38,19 +36,19 @@ height: 5px; } .o-style-thin { - border-bottom: 1px solid #000000; + border-bottom: 1px solid var(--os-black); } .o-style-medium { - border-bottom: 2px solid #000000; + border-bottom: 2px solid var(--os-black); } .o-style-thick { - border-bottom: 3px solid #000000; + border-bottom: 3px solid var(--os-black); } .o-style-dashed { - border-bottom: 1px dashed #000000; + border-bottom: 1px dashed var(--os-black); } .o-style-dotted { - border-bottom: 1px dotted #000000; + border-bottom: 1px dotted var(--os-black); } .o-dropdown-border-type { cursor: pointer; diff --git a/src/components/border_editor/border_editor.xml b/src/components/border_editor/border_editor.xml index b6ec88c67e..ca38ff8fec 100644 --- a/src/components/border_editor/border_editor.xml +++ b/src/components/border_editor/border_editor.xml @@ -3,7 +3,7 @@ Border Color
@@ -52,7 +52,7 @@ -
+
-
+
Standard
Custom
-
+
diff --git a/src/components/color_picker/color_picker_widget.css b/src/components/color_picker/color_picker_widget.css index ca4fb2859c..4ca9dd6cc7 100644 --- a/src/components/color_picker/color_picker_widget.css +++ b/src/components/color_picker/color_picker_widget.css @@ -14,7 +14,7 @@ border-radius: 2px; cursor: pointer; &:not([disabled]):hover { - background-color: rgba(0, 0, 0, 0.08); + background-color: var(--os-background-gray-color-hover); } } diff --git a/src/components/composer/autocomplete_dropdown/autocomplete_dropdown.css b/src/components/composer/autocomplete_dropdown/autocomplete_dropdown.css index 6977afcfe3..3ff1da5d34 100644 --- a/src/components/composer/autocomplete_dropdown/autocomplete_dropdown.css +++ b/src/components/composer/autocomplete_dropdown/autocomplete_dropdown.css @@ -2,7 +2,6 @@ .o-autocomplete-dropdown { pointer-events: auto; cursor: pointer; - background-color: #fff; max-width: 400px; z-index: 1; .o-autocomplete-value-focus { diff --git a/src/components/composer/autocomplete_dropdown/autocomplete_dropdown.ts b/src/components/composer/autocomplete_dropdown/autocomplete_dropdown.ts index 8df5009813..f4d28d26b3 100644 --- a/src/components/composer/autocomplete_dropdown/autocomplete_dropdown.ts +++ b/src/components/composer/autocomplete_dropdown/autocomplete_dropdown.ts @@ -36,7 +36,7 @@ export class TextValueProvider extends Component { getCss(html: HtmlContent) { return cssPropertiesToCss({ - color: html.color || "#000000", + color: html.color, background: html.backgroundColor, }); } diff --git a/src/components/composer/autocomplete_dropdown/autocomplete_dropdown.xml b/src/components/composer/autocomplete_dropdown/autocomplete_dropdown.xml index 651521e8be..3b17bb148f 100644 --- a/src/components/composer/autocomplete_dropdown/autocomplete_dropdown.xml +++ b/src/components/composer/autocomplete_dropdown/autocomplete_dropdown.xml @@ -3,7 +3,7 @@
+ 'o-autocomplete-dropdown bg-white': props.proposals.length}">
- +
-
+
diff --git a/src/components/composer/grid_composer/grid_composer.css b/src/components/composer/grid_composer/grid_composer.css index bdea36a2f3..7254469279 100644 --- a/src/components/composer/grid_composer/grid_composer.css +++ b/src/components/composer/grid_composer/grid_composer.css @@ -1,5 +1,6 @@ .o-spreadsheet { div.o-grid-composer { + color-scheme: light; z-index: var(--os-components-importance-grid-composer); position: absolute; font-family: var(--os-default-font); diff --git a/src/components/composer/speech_bubble/speech_bubble.css b/src/components/composer/speech_bubble/speech_bubble.css index a6b2041cde..13064a25e8 100644 --- a/src/components/composer/speech_bubble/speech_bubble.css +++ b/src/components/composer/speech_bubble/speech_bubble.css @@ -1,6 +1,6 @@ .o-spreadsheet { .o-speech-bubble { - background-color: white; + background-color: var(--os-white-bg); box-sizing: border-box; box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); border: 1px solid var(--os-gray-400); @@ -11,7 +11,7 @@ position: absolute; top: 100%; left: 50%; - background-color: white; + background-color: var(--os-white-bg); height: var(--os-bubble-arrow-size); width: var(--os-bubble-arrow-size); transform-origin: top left; diff --git a/src/components/error_tooltip/error_tooltip.css b/src/components/error_tooltip/error_tooltip.css index e1fcc6539b..56eaee2960 100644 --- a/src/components/error_tooltip/error_tooltip.css +++ b/src/components/error_tooltip/error_tooltip.css @@ -1,7 +1,6 @@ .o-spreadsheet { .o-error-tooltip { font-size: 13px; - background-color: white; border-left: 3px solid red; padding: 10px; overflow-wrap: break-word; diff --git a/src/components/error_tooltip/error_tooltip.xml b/src/components/error_tooltip/error_tooltip.xml index 4f60336b28..6b297310ea 100644 --- a/src/components/error_tooltip/error_tooltip.xml +++ b/src/components/error_tooltip/error_tooltip.xml @@ -1,6 +1,6 @@ -
+
Error
diff --git a/src/components/figures/chart/chart_dashboard_menu/chart_dashboard_menu.css b/src/components/figures/chart/chart_dashboard_menu/chart_dashboard_menu.css index 731ea36e10..240761bb6e 100644 --- a/src/components/figures/chart/chart_dashboard_menu/chart_dashboard_menu.css +++ b/src/components/figures/chart/chart_dashboard_menu/chart_dashboard_menu.css @@ -14,7 +14,7 @@ &:hover, &:target { color: var(--os-gray-900) !important; - background: rgba(0, 0, 0, 0.1); + background: var(--os-background-gray-color-hover); } .o-chart-preview { diff --git a/src/components/figures/figure/figure.css b/src/components/figures/figure/figure.css index d3754e5e26..e97a198455 100644 --- a/src/components/figures/figure/figure.css +++ b/src/components/figures/figure/figure.css @@ -1,5 +1,8 @@ .o-spreadsheet { div.o-figure { + color-scheme: light; + color: var(--os-text-body); + position: absolute; width: 100%; height: 100%; diff --git a/src/components/font_size_editor/font_size_editor.css b/src/components/font_size_editor/font_size_editor.css index c3336b5f4a..74382d3e43 100644 --- a/src/components/font_size_editor/font_size_editor.css +++ b/src/components/font_size_editor/font_size_editor.css @@ -14,7 +14,7 @@ line-height: 26px; padding: 3px 12px; &:hover { - background-color: rgba(0, 0, 0, 0.08); + background-color: var(--os-background-gray-color-hover); } } } diff --git a/src/components/icon_picker/icon_picker.css b/src/components/icon_picker/icon_picker.css index 3d3cb33339..823371c987 100644 --- a/src/components/icon_picker/icon_picker.css +++ b/src/components/icon_picker/icon_picker.css @@ -2,7 +2,6 @@ .o-icon-picker { position: absolute; box-shadow: 1px 2px 5px 2px rgba(51, 51, 51, 0.15); - background-color: white; padding: 2px 1px; z-index: var(--os-components-importance-icon-picker); } diff --git a/src/components/icon_picker/icon_picker.xml b/src/components/icon_picker/icon_picker.xml index 3d7bad8f1f..e762b1fdae 100644 --- a/src/components/icon_picker/icon_picker.xml +++ b/src/components/icon_picker/icon_picker.xml @@ -1,6 +1,6 @@ -
+
@@ -1048,4 +1049,9 @@ /> + +
+ +
+
diff --git a/src/components/link/link_display/link_display.css b/src/components/link/link_display/link_display.css index 70ecd04b6e..c91fd48d7a 100644 --- a/src/components/link/link_display/link_display.css +++ b/src/components/link/link_display/link_display.css @@ -1,7 +1,6 @@ .o-spreadsheet { .o-link-tool { font-size: 13px; - background-color: white; box-shadow: 0 1px 4px 3px rgba(60, 64, 67, 0.15); padding: 6px 12px; border-radius: 4px; @@ -42,6 +41,6 @@ } .o-link-icon:hover { cursor: pointer; - color: #000; + color: var(--os-black); } } diff --git a/src/components/link/link_display/link_display.xml b/src/components/link/link_display/link_display.xml index 380910b166..7266003825 100644 --- a/src/components/link/link_display/link_display.xml +++ b/src/components/link/link_display/link_display.xml @@ -1,6 +1,6 @@ -