@internetstiftelsen/styleguide 5.0.18 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/app.js +71 -0
  2. package/dist/assets/js/Events.js +43 -77
  3. package/dist/assets/js/RequestError.js +16 -31
  4. package/dist/assets/js/anchorScroll.js +22 -15
  5. package/dist/assets/js/charCounter.js +100 -142
  6. package/dist/assets/js/className.js +19 -20
  7. package/dist/assets/js/conditional.js +96 -152
  8. package/dist/assets/js/debounce.js +15 -22
  9. package/dist/assets/js/el.js +108 -159
  10. package/dist/assets/js/getCookieByName.js +13 -11
  11. package/dist/assets/js/hasCookieConsent.js +30 -40
  12. package/dist/assets/js/htmlTextLength.js +12 -10
  13. package/dist/assets/js/iconToggle.js +16 -20
  14. package/dist/assets/js/nodeAdded.js +40 -53
  15. package/dist/assets/js/objToQuery.js +25 -41
  16. package/dist/assets/js/offset.js +29 -25
  17. package/dist/assets/js/ot.js +10 -13
  18. package/dist/assets/js/parallax.js +23 -23
  19. package/dist/assets/js/queryToObj.js +16 -22
  20. package/dist/assets/js/readSpeakerHandling.js +26 -28
  21. package/dist/assets/js/request.js +43 -52
  22. package/dist/assets/js/responsivePosition.js +46 -74
  23. package/dist/assets/js/stringToNode.js +11 -10
  24. package/dist/assets/js/template.js +15 -21
  25. package/dist/assets/js/textToggle.js +19 -24
  26. package/dist/assets/js/track.js +14 -12
  27. package/dist/assets/js/uid.js +10 -6
  28. package/dist/assets/js/utmGenerator.js +27 -33
  29. package/dist/assets/js/validationMessage.js +18 -25
  30. package/dist/assets/js/youtube.js +134 -170
  31. package/dist/atoms/button/Button.js +42 -55
  32. package/dist/atoms/file/file.js +25 -29
  33. package/dist/atoms/file/filePreview.js +27 -31
  34. package/dist/atoms/grid-toggle/grid-toggle.js +6 -9
  35. package/dist/atoms/height-limiter/height-limiter.js +37 -50
  36. package/dist/atoms/password-toggle/password-toggle.js +9 -11
  37. package/dist/atoms/range/range.js +32 -39
  38. package/dist/atoms/textarea/rich-text.js +223 -205
  39. package/dist/atoms/tooltip/tooltip.js +13 -17
  40. package/dist/components.js +42 -77
  41. package/dist/focusTrap.js +66 -77
  42. package/dist/molecules/alert/alert.js +15 -20
  43. package/dist/molecules/context-menu/context-menu.js +11 -16
  44. package/dist/molecules/continue-video-guide/continue-video-guide.js +90 -101
  45. package/dist/molecules/cookie-disclaimer/cookie-disclaimer.js +24 -33
  46. package/dist/molecules/form/Form.js +242 -352
  47. package/dist/molecules/form/index.js +15 -14
  48. package/dist/molecules/glider/glider-course.js +62 -75
  49. package/dist/molecules/glider/glider-hero.js +88 -101
  50. package/dist/molecules/glider/glider.js +49 -45
  51. package/dist/molecules/modal/modal.js +256 -325
  52. package/dist/molecules/multi-select/multi-select.js +198 -304
  53. package/dist/molecules/natural-language-form/natural-language-form.js +32 -46
  54. package/dist/molecules/overview-navigation/overview-navigation.js +90 -141
  55. package/dist/molecules/share/share.js +15 -20
  56. package/dist/molecules/system-error/system-error.js +6 -9
  57. package/dist/organisms/accordion/accordion.js +44 -50
  58. package/dist/organisms/footer/footer.js +1 -1
  59. package/dist/organisms/haveibeenpwned/haveibeenpwned.js +17 -16
  60. package/dist/organisms/mailchimp/mailchimp.js +72 -89
  61. package/dist/organisms/map-box/map-box.js +3 -4
  62. package/dist/organisms/mega-menu/mega-menu.js +177 -212
  63. package/dist/organisms/podcast/podcast.js +192 -215
  64. package/dist/organisms/schedule/schedule-filter.js +9 -15
  65. package/dist/organisms/tabs/tabs.js +194 -253
  66. package/dist/organisms/timeline/openTimelineItem.js +38 -51
  67. package/dist/organisms/timeline/timeline.js +111 -128
  68. package/dist/organisms/video-guide/VideoGuidePlayback.js +210 -286
  69. package/dist/organisms/video-guide/VideoGuideSubtitles.js +57 -80
  70. package/dist/organisms/video-guide/VideoGuideTimeline.js +74 -108
  71. package/dist/organisms/video-guide/getCurrentCueIndex.js +11 -9
  72. package/dist/organisms/video-guide/video-guide.js +66 -103
  73. package/dist/utilities/tab-highlighting/tab-highlighting.js +14 -22
  74. package/dist/vendor/toggle/a11y.toggle-switcher.js +10 -16
  75. package/package.json +78 -99
  76. package/src/app.js +5 -5
  77. package/src/assets/js/anchorScroll.js +1 -1
  78. package/src/assets/js/offset.js +1 -1
  79. package/src/atoms/button/Button.js +1 -1
  80. package/src/atoms/icon/richtext-ordered-list.svg +1 -1
  81. package/src/atoms/icon/sprite.svg +6 -5
  82. package/src/molecules/glider/glider-course.js +0 -2
  83. package/src/molecules/glider/glider.js +2 -2
  84. package/src/organisms/accordion/accordion.js +1 -2
  85. package/src/organisms/timeline/timeline.js +2 -3
  86. package/dist/atoms/timeline/anchorScroll.js +0 -13
  87. package/dist/atoms/toggle-high-contrast/toggle-high-contrast.js +0 -12
  88. package/dist/molecules/glider/glider-single.js +0 -68
  89. package/dist/molecules/modal/modal-graph.js +0 -40
  90. package/dist/molecules/timeline-navigation/timeline-navigation.js +0 -34
  91. /package/src/atoms/icon/{heading-3.svg → richtext-heading-3.svg} +0 -0
  92. /package/src/molecules/alert/{_alert.scss → alert.scss} +0 -0
@@ -1,55 +1,42 @@
1
- 'use strict';
2
-
3
- var elements = document.querySelectorAll('.js-height-limit');
1
+ "use strict";
2
+ const elements = document.querySelectorAll('.js-height-limit');
4
3
  function update(innerContainer, button, height) {
5
- if (button.classList.contains('is-clicked')) {
6
- return;
7
- }
8
-
9
- if (innerContainer.offsetHeight >= height) {
10
- innerContainer.setAttribute('style', 'max-height:' + height + 'px;');
11
- innerContainer.classList.add('is-limited');
12
- button.classList.remove('is-hidden');
13
- } else {
14
- innerContainer.removeAttribute('style');
15
- innerContainer.classList.remove('is-limited');
16
- button.classList.add('is-hidden');
17
- }
4
+ if (button.classList.contains('is-clicked')) {
5
+ return;
6
+ }
7
+ if (innerContainer.offsetHeight >= height) {
8
+ innerContainer.setAttribute('style', `max-height:${height}px;`);
9
+ innerContainer.classList.add('is-limited');
10
+ button.classList.remove('is-hidden');
11
+ } else {
12
+ innerContainer.removeAttribute('style');
13
+ innerContainer.classList.remove('is-limited');
14
+ button.classList.add('is-hidden');
15
+ }
18
16
  }
19
-
20
17
  function setup(element) {
21
- var height = element.getAttribute('data-height');
22
- var innerContainer = element.querySelector('[class*="inner"]');
23
- var button = element.querySelector('.js-toggle-height');
24
- var buttonTextElement = button.querySelector('span');
25
- var buttonText = buttonTextElement.innerText;
26
- var toggleText = element.getAttribute('data-toggle-text');
27
- var topPosition = void 0;
28
-
29
- update(innerContainer, button, height);
30
-
31
- button.addEventListener('click', function () {
32
- innerContainer.classList.toggle('is-limited');
33
- innerContainer.setAttribute('style', innerContainer.style.maxHeight === height + 'px' ? 'max-height:none' : 'max-height:' + height + 'px');
34
- buttonTextElement.innerText = buttonTextElement.innerText === buttonText ? toggleText : buttonText;
35
- button.classList.toggle('is-clicked');
36
-
37
- if (!innerContainer.classList.contains('is-limited')) {
38
- topPosition = document.documentElement.scrollTop;
39
- } else {
40
- window.scroll(0, topPosition);
41
- }
42
-
43
- setTimeout(function () {
44
- return update(innerContainer, button, height);
45
- }, 1);
46
- });
47
-
48
- window.addEventListener('resize', function () {
49
- return update(innerContainer, button, height);
50
- });
18
+ const height = element.getAttribute('data-height');
19
+ const innerContainer = element.querySelector('[class*="inner"]');
20
+ const button = element.querySelector('.js-toggle-height');
21
+ const buttonTextElement = button.querySelector('span');
22
+ const buttonText = buttonTextElement.innerText;
23
+ const toggleText = element.getAttribute('data-toggle-text');
24
+ let topPosition;
25
+ update(innerContainer, button, height);
26
+ button.addEventListener('click', ()=>{
27
+ innerContainer.classList.toggle('is-limited');
28
+ innerContainer.setAttribute('style', innerContainer.style.maxHeight === `${height}px` ? 'max-height:none' : `max-height:${height}px`);
29
+ buttonTextElement.innerText = buttonTextElement.innerText === buttonText ? toggleText : buttonText;
30
+ button.classList.toggle('is-clicked');
31
+ if (!innerContainer.classList.contains('is-limited')) {
32
+ topPosition = document.documentElement.scrollTop;
33
+ } else {
34
+ window.scroll(0, topPosition);
35
+ }
36
+ setTimeout(()=>update(innerContainer, button, height), 1);
37
+ });
38
+ window.addEventListener('resize', ()=>update(innerContainer, button, height));
51
39
  }
52
-
53
40
  if (elements) {
54
- [].forEach.call(elements, setup);
55
- }
41
+ [].forEach.call(elements, setup);
42
+ }
@@ -1,12 +1,10 @@
1
- 'use strict';
2
-
3
- var elements = document.querySelectorAll('.js-toggle-input-type');
4
-
1
+ "use strict";
2
+ const elements = document.querySelectorAll('.js-toggle-input-type');
5
3
  if (elements) {
6
- [].forEach.call(elements, function (element) {
7
- element.addEventListener('click', function () {
8
- var input = element.previousElementSibling;
9
- input.type = input.type === 'password' ? 'text' : 'password';
10
- });
11
- });
12
- }
4
+ [].forEach.call(elements, (element)=>{
5
+ element.addEventListener('click', ()=>{
6
+ const input = element.previousElementSibling;
7
+ input.type = input.type === 'password' ? 'text' : 'password';
8
+ });
9
+ });
10
+ }
@@ -1,41 +1,34 @@
1
- 'use strict';
2
-
3
- var ranges = document.querySelectorAll('.js-range-wrapper');
1
+ "use strict";
2
+ const ranges = document.querySelectorAll('.js-range-wrapper');
4
3
  function setValue(range, rangeValue, rangeInput) {
5
- var val = range.value;
6
- var min = range.min ? range.min : 0;
7
- var max = range.max ? range.max : 100;
8
- var newVal = Number((val - min) * 100 / (max - min));
9
- rangeValue.innerHTML = val;
10
-
11
- if (rangeInput) {
12
- rangeInput.value = val;
13
- }
14
-
15
- // Sorta magic numbers based on size of the native UI thumb
16
- rangeValue.style.left = 'calc(' + newVal + '% + (' + (8 - newVal * 0.15) + 'px))';
4
+ const val = range.value;
5
+ const min = range.min ? range.min : 0;
6
+ const max = range.max ? range.max : 100;
7
+ const newVal = Number((val - min) * 100 / (max - min));
8
+ rangeValue.innerHTML = val;
9
+ if (rangeInput) {
10
+ rangeInput.value = val;
11
+ }
12
+ // Sorta magic numbers based on size of the native UI thumb
13
+ rangeValue.style.left = `calc(${newVal}% + (${8 - newVal * 0.15}px))`;
17
14
  }
18
-
19
- ranges.forEach(function (wrap) {
20
- var range = wrap.querySelector('.js-range');
21
- var rangeValue = wrap.querySelector('.js-range-value');
22
- var rangeInput = wrap.querySelector('.js-range-input');
23
-
24
- range.addEventListener('input', function () {
25
- setValue(range, rangeValue, rangeInput);
26
- range.focus();
27
- });
28
-
29
- if (rangeInput) {
30
- rangeInput.addEventListener('input', function () {
31
- if (rangeInput.value !== '') {
32
- range.value = rangeInput.value;
33
- rangeValue.innerHTML = rangeInput.value;
34
- setValue(range, rangeValue, rangeInput);
35
- }
36
- rangeInput.focus();
37
- });
38
- }
39
-
40
- setValue(range, rangeValue, rangeInput);
41
- });
15
+ ranges.forEach((wrap)=>{
16
+ const range = wrap.querySelector('.js-range');
17
+ const rangeValue = wrap.querySelector('.js-range-value');
18
+ const rangeInput = wrap.querySelector('.js-range-input');
19
+ range.addEventListener('input', ()=>{
20
+ setValue(range, rangeValue, rangeInput);
21
+ range.focus();
22
+ });
23
+ if (rangeInput) {
24
+ rangeInput.addEventListener('input', ()=>{
25
+ if (rangeInput.value !== '') {
26
+ range.value = rangeInput.value;
27
+ rangeValue.innerHTML = rangeInput.value;
28
+ setValue(range, rangeValue, rangeInput);
29
+ }
30
+ rangeInput.focus();
31
+ });
32
+ }
33
+ setValue(range, rangeValue, rangeInput);
34
+ });
@@ -1,226 +1,244 @@
1
- 'use strict';
2
-
1
+ "use strict";
3
2
  Object.defineProperty(exports, "__esModule", {
4
- value: true
3
+ value: true
5
4
  });
6
- exports.setupTextArea = setupTextArea;
7
- exports.init = init;
8
-
9
- var _core = require('@tiptap/core');
10
-
11
- var _extensionDocument = require('@tiptap/extension-document');
12
-
13
- var _extensionDocument2 = _interopRequireDefault(_extensionDocument);
14
-
15
- var _extensionParagraph = require('@tiptap/extension-paragraph');
16
-
17
- var _extensionParagraph2 = _interopRequireDefault(_extensionParagraph);
18
-
19
- var _extensionText = require('@tiptap/extension-text');
20
-
21
- var _extensionText2 = _interopRequireDefault(_extensionText);
22
-
23
- var _extensionBulletList = require('@tiptap/extension-bullet-list');
24
-
25
- var _extensionBulletList2 = _interopRequireDefault(_extensionBulletList);
26
-
27
- var _extensionListItem = require('@tiptap/extension-list-item');
28
-
29
- var _extensionListItem2 = _interopRequireDefault(_extensionListItem);
30
-
31
- var _extensionBold = require('@tiptap/extension-bold');
32
-
33
- var _extensionBold2 = _interopRequireDefault(_extensionBold);
34
-
35
- var _extensionItalic = require('@tiptap/extension-italic');
36
-
37
- var _extensionItalic2 = _interopRequireDefault(_extensionItalic);
38
-
39
- var _extensionLink = require('@tiptap/extension-link');
40
-
41
- var _extensionHistory = require('@tiptap/extension-history');
42
-
43
- var _extensionHistory2 = _interopRequireDefault(_extensionHistory);
44
-
45
- var _className = require('../../assets/js/className');
46
-
47
- var _className2 = _interopRequireDefault(_className);
48
-
49
- var _modal = require('../../molecules/modal/modal');
50
-
51
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
52
-
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ init: function() {
13
+ return init;
14
+ },
15
+ setupTextArea: function() {
16
+ return setupTextArea;
17
+ }
18
+ });
19
+ const _core = require("@tiptap/core");
20
+ const _extensiondocument = /*#__PURE__*/ _interop_require_default(require("@tiptap/extension-document"));
21
+ const _extensionparagraph = /*#__PURE__*/ _interop_require_default(require("@tiptap/extension-paragraph"));
22
+ const _extensiontext = /*#__PURE__*/ _interop_require_default(require("@tiptap/extension-text"));
23
+ const _extensionbulletlist = /*#__PURE__*/ _interop_require_default(require("@tiptap/extension-bullet-list"));
24
+ const _extensionorderedlist = /*#__PURE__*/ _interop_require_default(require("@tiptap/extension-ordered-list"));
25
+ const _extensionheading = /*#__PURE__*/ _interop_require_default(require("@tiptap/extension-heading"));
26
+ const _extensionlistitem = /*#__PURE__*/ _interop_require_default(require("@tiptap/extension-list-item"));
27
+ const _extensionbold = /*#__PURE__*/ _interop_require_default(require("@tiptap/extension-bold"));
28
+ const _extensionitalic = /*#__PURE__*/ _interop_require_default(require("@tiptap/extension-italic"));
29
+ const _extensionlink = require("@tiptap/extension-link");
30
+ const _extensionhistory = /*#__PURE__*/ _interop_require_default(require("@tiptap/extension-history"));
31
+ const _className = /*#__PURE__*/ _interop_require_default(require("../../assets/js/className"));
32
+ const _modal = require("../../molecules/modal/modal");
33
+ function _interop_require_default(obj) {
34
+ return obj && obj.__esModule ? obj : {
35
+ default: obj
36
+ };
37
+ }
53
38
  function clearAndCapitalize(str) {
54
- return str.replace(/-/, '').toUpperCase();
39
+ return str.replace(/-/, '').toUpperCase();
55
40
  }
56
-
57
41
  function kebabToCamel(str) {
58
- return str.replace(/-\w/g, clearAndCapitalize);
42
+ return str.replace(/-\w/g, clearAndCapitalize);
59
43
  }
60
-
61
44
  function kebabToPascal(str) {
62
- return str.replace(/(^\w|-\w)/g, clearAndCapitalize);
45
+ return str.replace(/(^\w|-\w)/g, clearAndCapitalize);
46
+ }
47
+ function insertHeading(button, editor) {
48
+ const levelAttr = button.dataset.richTextControl;
49
+ const level = parseInt(levelAttr.replace('heading-', ''), 10);
50
+ editor.commands.toggleHeading({
51
+ level
52
+ });
53
+ const toolbar = button.parentElement; // The toolbar div
54
+ const headingButtons = toolbar.querySelectorAll('button[data-rich-text-control^="heading-"]');
55
+ headingButtons.forEach((btn)=>{
56
+ btn.classList.remove('is-active');
57
+ });
58
+ if (editor.isActive('heading', {
59
+ level
60
+ })) {
61
+ button.classList.add('is-active');
62
+ }
63
63
  }
64
-
65
64
  function insertLink(el, editor) {
66
- var addLink = function addLink(e, modal, close) {
67
- e.preventDefault();
68
-
69
- var value = modal.querySelector('input').value.trim();
70
-
71
- if (!value.length) {
72
- editor.commands.unsetLink();
73
- } else {
74
- var isAbsolute = new RegExp('(?:^[a-z][a-z0-9+.-]*:|//)', 'i');
75
-
76
- if (!isAbsolute.test(value)) {
77
- value = 'https://' + value;
78
- }
79
-
80
- editor.commands.toggleLink({ href: value });
81
- }
82
-
83
- close();
84
- };
85
-
86
- if (editor.view.state.selection.empty) {
87
- return;
88
- }
89
-
90
- var currentValue = editor.getAttributes('link').href ? editor.getAttributes('link').href : '';
91
-
92
- (0, _modal.open)({
93
- title: 'Lägg till länk',
94
- content: '\n\t\t\t<p class="u-m-b-0 u-m-t-default"><input type="url" value="' + currentValue + '" class="' + (0, _className2.default)('a-input') + '"></p>\n\t\t',
95
- actions: [{
96
- text: 'Avbryt',
97
- color: 'transparent',
98
- attrs: {
99
- 'data-modal-close': null
100
- }
101
- }, {
102
- text: 'Spara',
103
- modifier: 'primary',
104
- key: 'enter',
105
- onClick: addLink
106
- }]
107
- }, {
108
- onOpen: function onOpen(id, modal) {
109
- modal.querySelector('input').focus();
110
- }
111
- });
65
+ const addLink = (e, modal, close)=>{
66
+ e.preventDefault();
67
+ let value = modal.querySelector('input').value.trim();
68
+ if (!value.length) {
69
+ editor.commands.unsetLink();
70
+ } else {
71
+ const isAbsolute = new RegExp('(?:^[a-z][a-z0-9+.-]*:|//)', 'i');
72
+ if (!isAbsolute.test(value)) {
73
+ value = `https://${value}`;
74
+ }
75
+ editor.commands.toggleLink({
76
+ href: value
77
+ });
78
+ }
79
+ close();
80
+ };
81
+ if (editor.view.state.selection.empty) {
82
+ return;
83
+ }
84
+ const currentValue = editor.getAttributes('link').href ? editor.getAttributes('link').href : '';
85
+ (0, _modal.open)({
86
+ title: 'Lägg till länk',
87
+ content: `
88
+ <p class="u-m-b-0 u-m-t-default"><input type="url" value="${currentValue}" class="${(0, _className.default)('a-input')}"></p>
89
+ `,
90
+ actions: [
91
+ {
92
+ text: 'Avbryt',
93
+ color: 'transparent',
94
+ attrs: {
95
+ 'data-modal-close': null
96
+ }
97
+ },
98
+ {
99
+ text: 'Spara',
100
+ modifier: 'primary',
101
+ key: 'enter',
102
+ onClick: addLink
103
+ }
104
+ ]
105
+ }, {
106
+ onOpen (id, modal) {
107
+ modal.querySelector('input').focus();
108
+ }
109
+ });
112
110
  }
113
-
114
111
  function createToolbarButton(el, control, editor) {
115
- var button = document.createElement('button');
116
- var iconId = ['link'].includes(control) ? control : 'richtext-' + control;
117
-
118
- button.setAttribute('data-rich-text-control', control);
119
- button.value = kebabToCamel(control);
120
- button.innerHTML = '\n\t\t<span class="u-visuallyhidden">' + control.replace('-', ' ') + '</span>\n\t\t<svg class="icon">\n\t\t\t<use xlink:href="#icon-' + iconId + '"></use>\n\t\t</svg>\n\t';
121
-
122
- el.appendChild(button);
123
-
124
- button.addEventListener('click', function (e) {
125
- e.preventDefault();
126
-
127
- if (control === 'link') {
128
- insertLink(el, editor);
129
- } else {
130
- var method = 'toggle' + kebabToPascal(control);
131
-
132
- editor.chain().focus()[method]().run();
133
- }
134
- });
112
+ const button = document.createElement('button');
113
+ const iconId = [
114
+ 'link'
115
+ ].includes(control) ? control : `richtext-${control}`;
116
+ button.setAttribute('data-rich-text-control', control);
117
+ button.value = kebabToCamel(control);
118
+ button.innerHTML = `
119
+ <span class="u-visuallyhidden">${control.replace('-', ' ')}</span>
120
+ <svg class="icon">
121
+ <use xlink:href="#icon-${iconId}"></use>
122
+ </svg>
123
+ `;
124
+ el.appendChild(button);
125
+ button.addEventListener('click', (e)=>{
126
+ e.preventDefault();
127
+ if (control === 'link') {
128
+ insertLink(el, editor);
129
+ } else if (control === 'heading-2' || control === 'heading-3') {
130
+ insertHeading(button, editor);
131
+ } else {
132
+ const method = `toggle${kebabToPascal(control)}`;
133
+ editor.chain().focus()[method]().run();
134
+ }
135
+ });
135
136
  }
136
-
137
137
  function toogleButtonState(editor, el) {
138
- [].forEach.call(el.parentNode.querySelectorAll('[data-rich-text-control]'), function (control) {
139
- if (editor.isActive(control.value)) {
140
- control.classList.add('is-active');
141
- } else {
142
- control.classList.remove('is-active');
143
- }
144
-
145
- if (control.value === 'link' && editor.view.state.selection.empty) {
146
- control.disabled = true;
147
- } else if (control.value === 'link') {
148
- control.disabled = false;
149
- }
150
- });
138
+ const buttons = el.parentNode.querySelectorAll('[data-rich-text-control]');
139
+ buttons.forEach((button)=>{
140
+ const control = button.getAttribute('data-rich-text-control');
141
+ const value = kebabToCamel(control);
142
+ // 🧠 Handle heading separately
143
+ if (control === 'heading-2' || control === 'heading-3') {
144
+ const level = parseInt(control.replace('heading-', ''), 10);
145
+ if (editor.isActive('heading', {
146
+ level
147
+ })) {
148
+ button.classList.add('is-active');
149
+ } else {
150
+ button.classList.remove('is-active');
151
+ }
152
+ return;
153
+ }
154
+ // 🔠 Handle all others like bold, italic, bullet-list, etc.
155
+ if (editor.isActive(value)) {
156
+ button.classList.add('is-active');
157
+ } else {
158
+ button.classList.remove('is-active');
159
+ }
160
+ // 🔗 Special logic for link
161
+ if (value === 'link') {
162
+ button.disabled = editor.view.state.selection.empty;
163
+ }
164
+ });
151
165
  }
152
-
153
166
  function createToolbar(el, editor) {
154
- var toolbar = document.createElement('div');
155
-
156
- toolbar.className = (0, _className2.default)('a-textarea__toolbar');
157
-
158
- el.parentNode.insertBefore(toolbar, el);
159
-
160
- ['bold', 'italic', 'link', 'bullet-list'].forEach(function (control) {
161
- createToolbarButton(toolbar, control, editor);
162
- });
167
+ const toolbar = document.createElement('div');
168
+ toolbar.className = (0, _className.default)('a-textarea__toolbar');
169
+ el.parentNode.insertBefore(toolbar, el);
170
+ [
171
+ 'heading-2',
172
+ 'heading-3',
173
+ 'bold',
174
+ 'italic',
175
+ 'link',
176
+ 'bullet-list',
177
+ 'ordered-list'
178
+ ].forEach((control)=>{
179
+ createToolbarButton(toolbar, control, editor);
180
+ });
163
181
  }
164
-
165
182
  function getHTML(editor) {
166
- var html = editor.getHTML();
167
-
168
- return html.replace(/<li><p>/g, '<li>').replace(/<\/p><\/li>/g, '</li>');
183
+ const html = editor.getHTML();
184
+ return html.replace(/<li><p>/g, '<li>').replace(/<\/p><\/li>/g, '</li>');
169
185
  }
170
-
171
- function setupTextArea(el) {
172
- var onChange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
173
-
174
- var editorEl = document.createElement('div');
175
- var editor = new _core.Editor({
176
- element: editorEl,
177
- extensions: [_extensionDocument2.default, _extensionParagraph2.default, _extensionText2.default, _extensionListItem2.default, _extensionBulletList2.default, _extensionBold2.default, _extensionItalic2.default, _extensionLink.Link.configure({
178
- openOnClick: false,
179
- HTMLAttributes: {
180
- class: 'u-link'
181
- }
182
- }), _extensionHistory2.default.configure({
183
- depth: 10
184
- })],
185
- content: el.value,
186
- onTransaction: function onTransaction(props) {
187
- toogleButtonState(props.editor, editorEl);
188
- },
189
- onUpdate: function onUpdate(props) {
190
- var html = getHTML(props.editor);
191
-
192
- el.value = html;
193
- onChange(html);
194
- }
195
- });
196
-
197
- editorEl.className = el.className;
198
- editorEl.classList.add((0, _className2.default)('a-textarea--rich-text'));
199
-
200
- el.classList.add((0, _className2.default)('a-textarea--hidden'));
201
- el.editor = editor;
202
-
203
- el.parentNode.insertBefore(editorEl, el);
204
-
205
- createToolbar(editorEl, editor);
206
-
207
- var event = new CustomEvent('editor-ready', {
208
- detail: {
209
- editor: editor
210
- }
211
- });
212
-
213
- el.dispatchEvent(event);
186
+ function setupTextArea(el, onChange = ()=>{}) {
187
+ const editorEl = document.createElement('div');
188
+ const editor = new _core.Editor({
189
+ element: editorEl,
190
+ extensions: [
191
+ _extensiondocument.default,
192
+ _extensionparagraph.default,
193
+ _extensiontext.default,
194
+ _extensionlistitem.default,
195
+ _extensionbulletlist.default,
196
+ _extensionorderedlist.default,
197
+ _extensionheading.default.configure({
198
+ levels: [
199
+ 2,
200
+ 3
201
+ ]
202
+ }),
203
+ _extensionbold.default,
204
+ _extensionitalic.default,
205
+ _extensionlink.Link.configure({
206
+ openOnClick: false,
207
+ HTMLAttributes: {
208
+ class: 'u-link'
209
+ }
210
+ }),
211
+ _extensionhistory.default.configure({
212
+ depth: 10
213
+ })
214
+ ],
215
+ content: el.value,
216
+ onTransaction (props) {
217
+ toogleButtonState(props.editor, editorEl);
218
+ },
219
+ onUpdate (props) {
220
+ const html = getHTML(props.editor);
221
+ el.value = html;
222
+ onChange(html);
223
+ }
224
+ });
225
+ editorEl.className = el.className;
226
+ editorEl.classList.add((0, _className.default)('a-textarea--rich-text'));
227
+ el.classList.add((0, _className.default)('a-textarea--hidden'));
228
+ el.editor = editor;
229
+ el.parentNode.insertBefore(editorEl, el);
230
+ createToolbar(editorEl, editor);
231
+ const event = new CustomEvent('editor-ready', {
232
+ detail: {
233
+ editor
234
+ }
235
+ });
236
+ el.dispatchEvent(event);
214
237
  }
215
-
216
238
  function init() {
217
- var els = document.querySelectorAll('textarea[data-rich-text]');
218
-
219
- if (els.length) {
220
- [].forEach.call(els, function (el) {
221
- return setupTextArea(el);
222
- });
223
- }
239
+ const els = document.querySelectorAll('textarea[data-rich-text]');
240
+ if (els.length) {
241
+ [].forEach.call(els, (el)=>setupTextArea(el));
242
+ }
224
243
  }
225
-
226
- init();
244
+ init();