From 591247a09a08563f9363163b7a85e39c22b14e83 Mon Sep 17 00:00:00 2001 From: Ben Tran Date: Thu, 14 May 2026 15:11:23 +0930 Subject: [PATCH 01/40] INT-3359: Support jQuery v4 --- package.json | 2 +- src/demo/html/demo.html | 4 +- src/main/ts/Integration.ts | 18 +++++- src/test/ts/browser/JqAppendTest.ts | 29 ++++++++- src/test/ts/browser/LoadTest.ts | 89 +++++++++++++------------- src/test/ts/browser/OriginalTest.ts | 94 +++++++++++++--------------- src/test/ts/browser/ScriptSrcTest.ts | 49 +++++++++------ yarn.lock | 12 ++-- 8 files changed, 170 insertions(+), 127 deletions(-) diff --git a/package.json b/package.json index c2cf986..5630745 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "@storybook/testing-library": "^0.0.13", "@tinymce/beehive-flow": "^0.19.0", "@tinymce/eslint-plugin": "^3.0.0", - "@types/jquery": "^3.5.16", + "@types/jquery": "^4.0.0", "@types/react": "^17.0.0", "babel-loader": "^8.3.0", "react": "^17.0.0", diff --git a/src/demo/html/demo.html b/src/demo/html/demo.html index 6ea2231..a67b610 100644 --- a/src/demo/html/demo.html +++ b/src/demo/html/demo.html @@ -5,8 +5,8 @@ Page Title - - + + diff --git a/src/main/ts/Integration.ts b/src/main/ts/Integration.ts index 402d783..09eea23 100644 --- a/src/main/ts/Integration.ts +++ b/src/main/ts/Integration.ts @@ -144,9 +144,25 @@ const tinymceFn = function (this: JQuery, settings?: RawEditorExten export const setupIntegration = () => { const jq = getJquery(); + + const tinymce = (elem: any, text: any) => { + return ( + elem.textContent || + elem.innerText || + $( elem ).text() || + "" + ).toLowerCase().indexOf( (text || "").toLowerCase() ) > -1; + } + + (jq.expr.pseudos as any).tinymce = $.expr.createPseudo ? + $.expr.createPseudo(( text ) => ( elem ) => !!getTinymceInstance(elem)) + : ( elem: any, i: any, match: any ) => { + return tinymce( elem, match[3] ); + }; + // Add :tinymce pseudo selector this will select elements that has been converted into editor instances // it's now possible to use things like $('*:tinymce') to get all TinyMCE bound elements. - jq.expr.pseudos.tinymce = (e: Element) => !!getTinymceInstance(e); + // jq.expr.pseudos.tinymce = (e: Element) => !!getTinymceInstance(e); // Add a tinymce function for creating editors (jq.fn as any).tinymce = tinymceFn; }; \ No newline at end of file diff --git a/src/test/ts/browser/JqAppendTest.ts b/src/test/ts/browser/JqAppendTest.ts index 31b5684..ddef6eb 100644 --- a/src/test/ts/browser/JqAppendTest.ts +++ b/src/test/ts/browser/JqAppendTest.ts @@ -1,24 +1,35 @@ import { Assertions } from '@ephox/agar'; -import { context, describe, it } from '@ephox/bedrock-client'; +import { after, before, context, describe, it } from '@ephox/bedrock-client'; import { setupIntegration } from '../../../main/ts/Integration'; import { createEditor, createHTML } from '../Utils'; +import { Arr } from '@ephox/katamari'; +import { Remove, SelectorFilter } from '@ephox/sugar'; -setupIntegration(); describe('Check jQuery\'s `.append()` function', () => { + + before(setupIntegration); + + after(() => { + $('*:tinymce').remove(); + Arr.map(SelectorFilter.all('div.test-editor'), Remove.remove); + }); + context('Append a string', () => { it('check that appending to a div works', () => { const div = document.createElement('div'); $(div).append('

Hello world

'); Assertions.assertEq('Expected content to match the appended content.', `

Hello world

`, div.innerHTML); }); + it('check that appending to an empty editor works', async () => { await createEditor((elm, ed) => { $(elm).append(`

Hello world

`); Assertions.assertEq('Expected editor content to match the appended content.', `

Hello world

`, ed.getContent()); }); }); + it('check that appending to an non-empty editor works', async () => { await createEditor((elm, ed) => { ed.setContent('

Original content

'); @@ -31,18 +42,21 @@ describe('Check jQuery\'s `.append()` function', () => { }); }); }); + context('Append a list of string', () => { it('check that appending to a div works', () => { const div = document.createElement('div'); $(div).append('

Hello

', '

', '

world

'); Assertions.assertEq('Expected content to match the appended content.', `

Hello

world

`, div.innerHTML); }); + it('check that appending to an empty editor works', async () => { await createEditor((elm, ed) => { $(elm).append('

Hello

', '

', '

world

'); Assertions.assertEq('Expected editor content to match the appended content.', `

Hello

\n

 

\n

world

`, ed.getContent()); }); }); + it('check that appending to an non-empty editor works', async () => { await createEditor((elm, ed) => { ed.setContent('

Original content

'); @@ -63,6 +77,7 @@ describe('Check jQuery\'s `.append()` function', () => { $(div).append(p); Assertions.assertEq('Expected content to match the appended content.', `

Hello world

`, div.innerHTML); }); + it('check that appending to an empty editor works', async () => { await createEditor((elm, ed) => { const p = document.createElement('p'); @@ -71,6 +86,7 @@ describe('Check jQuery\'s `.append()` function', () => { Assertions.assertEq('Expected editor content to match the appended content.', `

Hello world

`, ed.getContent()); }); }); + it('check that appending to an non-empty editor works', async () => { await createEditor((elm, ed) => { ed.setContent('

Original content

'); @@ -85,6 +101,7 @@ describe('Check jQuery\'s `.append()` function', () => { }); }); }); + context('Append a list of node', () => { it('check that appending to a div works', () => { const div = document.createElement('div'); @@ -96,6 +113,7 @@ describe('Check jQuery\'s `.append()` function', () => { $(div).append(p1, p2, p3); Assertions.assertEq('Expected content to match the appended content.', `

Hello

world

`, div.innerHTML); }); + it('check that appending to an empty editor works', async () => { await createEditor((elm, ed) => { const p1 = document.createElement('p'); @@ -107,6 +125,7 @@ describe('Check jQuery\'s `.append()` function', () => { Assertions.assertEq('Expected editor content to match the appended content.', `

Hello

\n

 

\n

world

`, ed.getContent()); }); }); + it('check that appending to an non-empty editor works', async () => { await createEditor((elm, ed) => { ed.setContent('

Original content

'); @@ -124,6 +143,7 @@ describe('Check jQuery\'s `.append()` function', () => { }); }); }); + context('Append a jquery node set', () => { it('check that appending to a div works', async () => { await createHTML(`

One

Two

Three

`, (root) => { @@ -134,6 +154,7 @@ describe('Check jQuery\'s `.append()` function', () => { Assertions.assertEq('Expected the nodes to have been removed from the root', `

Two

`, root.innerHTML); }); }); + it('check that appending to an empty editor works', async () => { await createEditor(async (elm, ed) => { await createHTML(`

One

Two

Three

`, (root) => { @@ -144,6 +165,7 @@ describe('Check jQuery\'s `.append()` function', () => { }); }); }); + it('check that appending to an non-empty editor works', async () => { await createEditor(async (elm, ed) => { await createHTML(`

One

Two

Three

`, (root) => { @@ -157,6 +179,7 @@ describe('Check jQuery\'s `.append()` function', () => { }); }); }); + context('Append a list of jquery node set', () => { it('check that appending to a div works', async () => { // eslint-disable-next-line max-len @@ -169,6 +192,7 @@ describe('Check jQuery\'s `.append()` function', () => { Assertions.assertEq('Expected the nodes to have been removed from the root', `

Four

`, root.innerHTML); }); }); + it('check that appending to an empty editor works', async () => { await createEditor(async (elm, ed) => { // eslint-disable-next-line max-len @@ -181,6 +205,7 @@ describe('Check jQuery\'s `.append()` function', () => { }); }); }); + it('check that appending to an non-empty editor works', async () => { await createEditor(async (elm, ed) => { // eslint-disable-next-line max-len diff --git a/src/test/ts/browser/LoadTest.ts b/src/test/ts/browser/LoadTest.ts index b0bd898..209eb24 100644 --- a/src/test/ts/browser/LoadTest.ts +++ b/src/test/ts/browser/LoadTest.ts @@ -1,55 +1,54 @@ -import { Pipeline, Step, Waiter, Assertions } from '@ephox/agar'; -import { SugarElement, SugarBody, Insert, Remove, SelectorFilter, Class } from '@ephox/sugar'; -import { UnitTest } from '@ephox/bedrock-client'; +import { Assertions } from '@ephox/agar'; +import { after, before, describe, it } from '@ephox/bedrock-client'; +import { Class, Insert, Remove, SelectorFilter, SugarBody, SugarElement } from '@ephox/sugar'; import { setupIntegration } from '../../../main/ts/Integration'; -import { Arr, Cell } from '@ephox/katamari'; +import { Arr } from '@ephox/katamari'; import { Editor } from 'tinymce'; -UnitTest.asynctest('LoadTest', (success, failure) => { - // Note that bedrock uses jQuery so we don't need to load it - setupIntegration(); - const seenSetup = Cell(false); - const seenInit = Cell(false); +setupIntegration(); + +describe('LoadTest', () => { + let seenSetup = false; let editorInstance: Editor; - Pipeline.async('', [ - Step.sync(() => { - // make an SugarElement for jQuery to target - const ce = SugarElement.fromTag('div'); - Class.add(ce, 'test-editor'); - Insert.append(SugarBody.body(), ce); - }), - Step.sync(() => { - // select the SugarElement we just created and use the jQuery extension to make tinymce + + before(async () => { + const ce = SugarElement.fromTag('div'); + Class.add(ce, 'test-editor'); + Insert.append(SugarBody.body(), ce); + + await new Promise((resolve) => { $('div.test-editor').tinymce({ - setup: (_editor: Editor) => { - seenSetup.set(true); - }, - init_instance_callback: (editor: Editor) => { - editorInstance = editor; - seenInit.set(true); + license_key: 'gpl', + setup: (editor: Editor) => { + seenSetup = true; + editor.on('SkinLoaded', () => { + editorInstance = editor; + setTimeout(resolve, 100); + }); } }).catch((err) => { /* eslint-disable-next-line no-console */ console.error('TinyMCE init failed', err); + resolve(undefined); }); - }), - Waiter.sTryUntilPredicate('Waiting for editor setup', () => seenSetup.get()), - Waiter.sTryUntilPredicate('Waiting for editor init', () => seenInit.get()), - Step.sync(() => { - Assertions.assertEq('Test editor can be got from jQuery', editorInstance, $('div.test-editor').tinymce()); - }), - Step.sync(() => { - $('div.test-editor').html('

Hello world

'); - }), - Step.sync(() => { - Assertions.assertHtmlStructure('Check editor content', '

Hello world

', editorInstance.getContent()); - }), - Step.sync(() => { - // remove the editor with jQuery - $('*:tinymce').remove(); - }), - Step.sync(() => { - Arr.map(SelectorFilter.all('div.test-editor'), Remove.remove); - }) - ], success, failure); -}); \ No newline at end of file + }); + }); + + after(() => { + $('*:tinymce').remove(); + Arr.map(SelectorFilter.all('div.test-editor'), Remove.remove); + }); + + it('calls setup callback', () => { + Assertions.assertEq('setup was called', true, seenSetup); + }); + + it('can be retrieved from jQuery', () => { + Assertions.assertEq('Test editor can be got from jQuery', editorInstance, $('div.test-editor').tinymce()); + }); + + it('can set HTML content via jQuery', () => { + $('div.test-editor').html('

Hello world

'); + Assertions.assertHtmlStructure('Check editor content', '

Hello world

', editorInstance.getContent()); + }); +}); diff --git a/src/test/ts/browser/OriginalTest.ts b/src/test/ts/browser/OriginalTest.ts index ced7132..de277d3 100644 --- a/src/test/ts/browser/OriginalTest.ts +++ b/src/test/ts/browser/OriginalTest.ts @@ -1,15 +1,14 @@ -import { UnitTest } from '@ephox/bedrock-client'; -import { SugarElement, SugarBody, Insert, Remove, SelectorFilter, Html, Class } from '@ephox/sugar'; +import { Assertions } from '@ephox/agar'; +import { after, before, describe, it } from '@ephox/bedrock-client'; import { Arr } from '@ephox/katamari'; -import { LegacyUnit } from '@ephox/mcagar'; +import { Class, Html, Insert, Remove, SelectorFilter, SugarBody, SugarElement } from '@ephox/sugar'; +import { setupIntegration } from '../../../main/ts/Integration'; import { getTinymce } from '../../../main/ts/TinyMCE'; -import { Pipeline } from '@ephox/agar'; -UnitTest.asynctest('browser.tinymce.core.JqueryIntegrationTest', (success, failure) => { - const suite = LegacyUnit.createSuite(); +describe('JqueryIntegrationTest', () => { + before(async () => { + setupIntegration(); - const setup = () => { - // make an SugarElement for jQuery to target const ce = SugarElement.fromTag('div'); Class.add(ce, 'test-editor'); Html.set(ce, @@ -18,19 +17,16 @@ UnitTest.asynctest('browser.tinymce.core.JqueryIntegrationTest', (success, failu '' ); Insert.append(SugarBody.body(), ce); - }; - suite.asyncTest('Setup editors', (_, done) => { - $(() => { + await new Promise((resolve) => { $('#elm1,#elm2').tinymce({ - base_url: '/project/tinymce/js/tinymce', + base_url: '/project/node_modules/tinymce', + script_url: '/project/node_modules/tinymce/tinymce.min.js', init_instance_callback: () => { const ed1 = getTinymce().get('elm1'); const ed2 = getTinymce().get('elm2'); - - // When both editors are initialized if (ed1 && ed1.initialized && ed2 && ed2.initialized) { - done(); + resolve(); } } }).catch((err) => { @@ -40,62 +36,66 @@ UnitTest.asynctest('browser.tinymce.core.JqueryIntegrationTest', (success, failu }); }); - suite.test('Get editor instance', () => { - LegacyUnit.equal($('#elm1').tinymce().id, 'elm1'); - LegacyUnit.equal($('#elm2').tinymce().id, 'elm2'); - LegacyUnit.equal($('#elm3').tinymce(), undefined); + after(() => { + (getTinymce().EditorManager as any).remove(); + Arr.map(SelectorFilter.all('div.test-editor'), Remove.remove); }); - suite.test('Get contents using jQuery', () => { - getTinymce().get('elm1')?.setContent('

Editor 1

'); + it('Get editor instance', () => { + Assertions.assertEq('elm1 editor id', 'elm1', $('#elm1').tinymce()?.id); + Assertions.assertEq('elm2 editor id', 'elm2', $('#elm2').tinymce()?.id); + Assertions.assertEq('elm3 has no editor', undefined, $('#elm3').tinymce()); + }); - LegacyUnit.equal($('#elm1').html(), '

Editor 1

'); - LegacyUnit.equal($('#elm1').val(), '

Editor 1

'); - LegacyUnit.equal($('#elm1').attr('value'), '

Editor 1

'); - LegacyUnit.equal($('#elm1').text(), 'Editor 1'); + it('Get contents using jQuery', () => { + getTinymce().get('elm1')?.setContent('

Editor 1

'); + Assertions.assertEq('html()', '

Editor 1

', $('#elm1').html()); + Assertions.assertEq('val()', '

Editor 1

', $('#elm1').val()); + Assertions.assertEq('attr(value)', '

Editor 1

', $('#elm1').attr('value')); + Assertions.assertEq('text()', 'Editor 1', $('#elm1').text()); }); - suite.test('Set contents using jQuery', () => { + it('Set contents using jQuery', () => { $('#elm1').html('Test 1'); - LegacyUnit.equal($('#elm1').html(), '

Test 1

'); + Assertions.assertEq('html() after html()', '

Test 1

', $('#elm1').html()); $('#elm1').val('Test 2'); - LegacyUnit.equal($('#elm1').html(), '

Test 2

'); + Assertions.assertEq('html() after val()', '

Test 2

', $('#elm1').html()); $('#elm1').text('Test 3'); - LegacyUnit.equal($('#elm1').html(), '

Test 3

'); + Assertions.assertEq('html() after text()', '

Test 3

', $('#elm1').html()); $('#elm1').attr('value', 'Test 4'); - LegacyUnit.equal($('#elm1').html(), '

Test 4

'); + Assertions.assertEq('html() after attr()', '

Test 4

', $('#elm1').html()); }); - suite.test('append/prepend contents using jQuery', () => { + it('append/prepend contents using jQuery', () => { getTinymce().get('elm1')?.setContent('

Editor 1

'); $('#elm1').append('

Test 1

'); - LegacyUnit.equal($('#elm1').html(), '

Editor 1

\n

Test 1

'); + Assertions.assertEq('after append', '

Editor 1

\n

Test 1

', $('#elm1').html()); $('#elm1').prepend('

Test 2

'); - LegacyUnit.equal($('#elm1').html(), '

Test 2

\n

Editor 1

\n

Test 1

'); + Assertions.assertEq('after prepend', '

Test 2

\n

Editor 1

\n

Test 1

', $('#elm1').html()); }); - suite.test('Find using :tinymce selector', () => { - LegacyUnit.equal($('textarea:tinymce').length, 2); + it('Find using :tinymce selector', () => { + Assertions.assertEq(':tinymce selector length', 2, $('textarea:tinymce').length); }); - suite.test('Set contents using :tinymce selector', () => { + it('Set contents using :tinymce selector', () => { $('textarea:tinymce').val('Test 1'); - LegacyUnit.equal($('#elm1').val(), '

Test 1

'); - LegacyUnit.equal($('#elm2').val(), '

Test 1

'); - LegacyUnit.equal($('#elm3').val(), 'Textarea'); + Assertions.assertEq('elm1 val', '

Test 1

', $('#elm1').val()); + Assertions.assertEq('elm2 val', '

Test 1

', $('#elm2').val()); + Assertions.assertEq('elm3 val', 'Textarea', $('#elm3').val()); }); - suite.test('Get contents using :tinymce selector', () => { + it('Get contents using :tinymce selector', () => { $('textarea:tinymce').val('Test get'); - LegacyUnit.equal($('textarea:tinymce').val(), '

Test get

'); + Assertions.assertEq('val via :tinymce selector', '

Test get

', $('textarea:tinymce').val()); }); - suite.test('applyPatch is only called once', () => { + it('applyPatch is only called once', () => { const options = {}; $('#elm1').tinymce(options).catch((err) => { @@ -112,14 +112,6 @@ UnitTest.asynctest('browser.tinymce.core.JqueryIntegrationTest', (success, failu }); // eslint-disable-next-line @typescript-eslint/unbound-method - LegacyUnit.equal($.fn.val, oldValFn); + Assertions.assertEq('val fn unchanged after second init', oldValFn, $.fn.val); }); - - setup(); - Pipeline.async({}, suite.toSteps({}), () => { - (getTinymce().EditorManager as any).remove(); - Arr.map(SelectorFilter.all('div.test-editor'), Remove.remove); - success(); - }, failure); }); - diff --git a/src/test/ts/browser/ScriptSrcTest.ts b/src/test/ts/browser/ScriptSrcTest.ts index c66d449..87cf7d2 100644 --- a/src/test/ts/browser/ScriptSrcTest.ts +++ b/src/test/ts/browser/ScriptSrcTest.ts @@ -1,30 +1,43 @@ import { Assertions } from '@ephox/agar'; -import { UnitTest } from '@ephox/bedrock-client'; +import { describe, it } from '@ephox/bedrock-client'; import { getScriptSrc } from '../../../main/ts/Integration'; -UnitTest.test('ScriptSrcTest', () => { +describe('ScriptSrcTest', () => { const aUrl = 'http://example.com/tinymce/tinymce.min.js'; const aKey = 'abcdef0123456789'; const aChannel = '5.4.2'; - Assertions.assertEq('Test empty settings', - 'https://cdn.tiny.cloud/1/no-api-key/tinymce/8/tinymce.min.js', - getScriptSrc({})); - Assertions.assertEq('Test "script_url"', - aUrl, getScriptSrc({ script_url: aUrl })); + it('returns default CDN URL for empty settings', () => { + Assertions.assertEq('Test empty settings', + 'https://cdn.tiny.cloud/1/no-api-key/tinymce/8/tinymce.min.js', + getScriptSrc({})); + }); - Assertions.assertEq('Test "channel"', - 'https://cdn.tiny.cloud/1/no-api-key/tinymce/5.4.2/tinymce.min.js', - getScriptSrc({ channel: aChannel })); + it('uses "script_url" when provided', () => { + Assertions.assertEq('Test "script_url"', + aUrl, getScriptSrc({ script_url: aUrl })); + }); - Assertions.assertEq('Test "api_key"', - 'https://cdn.tiny.cloud/1/abcdef0123456789/tinymce/8/tinymce.min.js', - getScriptSrc({ api_key: aKey })); + it('uses "channel" in the CDN URL', () => { + Assertions.assertEq('Test "channel"', + 'https://cdn.tiny.cloud/1/no-api-key/tinymce/5.4.2/tinymce.min.js', + getScriptSrc({ channel: aChannel })); + }); - Assertions.assertEq('Test "api_key" and "channel"', - 'https://cdn.tiny.cloud/1/abcdef0123456789/tinymce/5.4.2/tinymce.min.js', - getScriptSrc({ channel: aChannel, api_key: aKey })); + it('uses "api_key" in the CDN URL', () => { + Assertions.assertEq('Test "api_key"', + 'https://cdn.tiny.cloud/1/abcdef0123456789/tinymce/8/tinymce.min.js', + getScriptSrc({ api_key: aKey })); + }); - Assertions.assertEq('Test "script_url" with others', - aUrl, getScriptSrc({ script_url: aUrl, channel: aChannel, api_key: aKey })); + it('uses both "api_key" and "channel" in the CDN URL', () => { + Assertions.assertEq('Test "api_key" and "channel"', + 'https://cdn.tiny.cloud/1/abcdef0123456789/tinymce/5.4.2/tinymce.min.js', + getScriptSrc({ channel: aChannel, api_key: aKey })); + }); + + it('"script_url" takes precedence over other options', () => { + Assertions.assertEq('Test "script_url" with others', + aUrl, getScriptSrc({ script_url: aUrl, channel: aChannel, api_key: aKey })); + }); }); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index d5ba915..0fa0a53 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3783,12 +3783,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jquery@^3.5.16": - version "3.5.33" - resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.33.tgz#f42f40bac3edd84abdc9f6297d28e570fe463b35" - integrity sha512-SeyVJXlCZpEki5F0ghuYe+L+PprQta6nRZqhONt9F13dWBtR/ftoaIbdRQ7cis7womE+X2LKhsDdDtkkDhJS6g== - dependencies: - "@types/sizzle" "*" +"@types/jquery@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-4.0.0.tgz#b7717b6e5103b50b115b707950357f302cc92fba" + integrity sha512-Z+to+A2VkaHq1DfI2oSwsoCdhCHMpTSgjWzNcbNlRGYzksDBpPUgEcAL+RQjOBJRaLoEAOHXxqDGBVP+BblBwg== "@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" @@ -3932,7 +3930,7 @@ "@types/node" "*" "@types/send" "<1" -"@types/sizzle@*", "@types/sizzle@^2.3.3": +"@types/sizzle@^2.3.3": version "2.3.10" resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.10.tgz#277a542aff6776d8a9b15f2ac682a663e3e94bbd" integrity sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww== From 78e2bf5cd05c26a1bc5012e5aab7e7c300e19dae Mon Sep 17 00:00:00 2001 From: Ben Tran Date: Thu, 14 May 2026 15:27:27 +0930 Subject: [PATCH 02/40] Use jquery 4 in storybook --- .storybook/preview-head.html | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.storybook/preview-head.html b/.storybook/preview-head.html index a58da23..8e74f36 100644 --- a/.storybook/preview-head.html +++ b/.storybook/preview-head.html @@ -1,8 +1,5 @@ - +