@ckeditor/ckeditor5-ui 38.2.0-alpha.0 → 39.0.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 (87) hide show
  1. package/README.md +0 -1
  2. package/lang/contexts.json +2 -1
  3. package/lang/translations/ar.po +5 -1
  4. package/lang/translations/ast.po +4 -0
  5. package/lang/translations/az.po +4 -0
  6. package/lang/translations/bg.po +5 -1
  7. package/lang/translations/bn.po +5 -1
  8. package/lang/translations/ca.po +5 -1
  9. package/lang/translations/cs.po +5 -1
  10. package/lang/translations/da.po +5 -1
  11. package/lang/translations/de-ch.po +4 -0
  12. package/lang/translations/de.po +5 -1
  13. package/lang/translations/el.po +5 -1
  14. package/lang/translations/en-au.po +4 -0
  15. package/lang/translations/en-gb.po +4 -0
  16. package/lang/translations/en.po +4 -0
  17. package/lang/translations/eo.po +4 -0
  18. package/lang/translations/es.po +5 -1
  19. package/lang/translations/et.po +5 -1
  20. package/lang/translations/eu.po +4 -0
  21. package/lang/translations/fa.po +4 -0
  22. package/lang/translations/fi.po +5 -1
  23. package/lang/translations/fr.po +5 -1
  24. package/lang/translations/gl.po +7 -3
  25. package/lang/translations/he.po +5 -1
  26. package/lang/translations/hi.po +5 -1
  27. package/lang/translations/hr.po +6 -2
  28. package/lang/translations/hu.po +5 -1
  29. package/lang/translations/id.po +5 -1
  30. package/lang/translations/it.po +4 -0
  31. package/lang/translations/ja.po +5 -1
  32. package/lang/translations/km.po +4 -0
  33. package/lang/translations/kn.po +4 -0
  34. package/lang/translations/ko.po +5 -1
  35. package/lang/translations/ku.po +4 -0
  36. package/lang/translations/lt.po +5 -1
  37. package/lang/translations/lv.po +5 -1
  38. package/lang/translations/ms.po +5 -1
  39. package/lang/translations/nb.po +4 -0
  40. package/lang/translations/ne.po +4 -0
  41. package/lang/translations/nl.po +5 -1
  42. package/lang/translations/no.po +5 -1
  43. package/lang/translations/pl.po +5 -1
  44. package/lang/translations/pt-br.po +5 -1
  45. package/lang/translations/pt.po +5 -1
  46. package/lang/translations/ro.po +5 -1
  47. package/lang/translations/ru.po +5 -1
  48. package/lang/translations/sk.po +5 -1
  49. package/lang/translations/sl.po +4 -0
  50. package/lang/translations/sq.po +17 -13
  51. package/lang/translations/sr-latn.po +4 -0
  52. package/lang/translations/sr.po +5 -1
  53. package/lang/translations/sv.po +5 -1
  54. package/lang/translations/th.po +5 -1
  55. package/lang/translations/tk.po +4 -0
  56. package/lang/translations/tr.po +5 -1
  57. package/lang/translations/tt.po +4 -0
  58. package/lang/translations/ug.po +4 -0
  59. package/lang/translations/uk.po +5 -1
  60. package/lang/translations/ur.po +4 -0
  61. package/lang/translations/uz.po +4 -0
  62. package/lang/translations/vi.po +5 -1
  63. package/lang/translations/zh-cn.po +5 -1
  64. package/lang/translations/zh.po +5 -1
  65. package/package.json +4 -5
  66. package/src/colorgrid/colortileview.js +1 -1
  67. package/src/colorpicker/colorpickerview.d.ts +35 -8
  68. package/src/colorpicker/colorpickerview.js +29 -12
  69. package/src/colorpicker/utils.d.ts +8 -0
  70. package/src/colorselector/colorgridsfragmentview.d.ts +194 -0
  71. package/src/colorselector/colorgridsfragmentview.js +289 -0
  72. package/src/colorselector/colorpickerfragmentview.d.ts +128 -0
  73. package/src/colorselector/colorpickerfragmentview.js +205 -0
  74. package/src/colorselector/colorselectorview.d.ts +242 -0
  75. package/src/colorselector/colorselectorview.js +256 -0
  76. package/src/colorselector/documentcolorcollection.d.ts +70 -0
  77. package/src/colorselector/documentcolorcollection.js +42 -0
  78. package/src/dropdown/dropdownpanelview.js +2 -1
  79. package/src/dropdown/utils.js +4 -1
  80. package/src/editorui/poweredby.js +6 -1
  81. package/src/index.d.ts +2 -1
  82. package/src/index.js +1 -0
  83. package/src/panel/sticky/stickypanelview.d.ts +41 -15
  84. package/src/panel/sticky/stickypanelview.js +138 -46
  85. package/theme/components/colorpicker/colorpicker.css +10 -0
  86. package/theme/components/colorselector/colorselector.css +35 -0
  87. package/theme/icons/project-logo.svg +1 -1
@@ -86,26 +86,24 @@ export default class StickyPanelView extends View {
86
86
  * @readonly
87
87
  * @observable
88
88
  */
89
- _isStickyToTheLimiter: boolean;
89
+ _isStickyToTheBottomOfLimiter: boolean;
90
90
  /**
91
- * Set `true` if the sticky panel uses the {@link #viewportTopOffset},
92
- * i.e. not {@link #_isStickyToTheLimiter} and the {@link #viewportTopOffset}
93
- * is not `0`.
91
+ * The `top` CSS position of the panel when it is sticky to the top of the viewport or scrollable
92
+ * ancestors of the {@link #limiterElement}.
94
93
  *
95
94
  * @private
96
95
  * @readonly
97
96
  * @observable
98
97
  */
99
- _hasViewportTopOffset: boolean;
98
+ _stickyTopOffset: number | null;
100
99
  /**
101
- * The DOM bounding client rect of the {@link module:ui/view~View#element} of the panel.
102
- */
103
- private _panelRect?;
104
- /**
105
- * The DOM bounding client rect of the {@link #limiterElement}
106
- * of the panel.
100
+ * The `bottom` CSS position of the panel when it is sticky to the bottom of the {@link #limiterElement}.
101
+ *
102
+ * @private
103
+ * @readonly
104
+ * @observable
107
105
  */
108
- private _limiterRect?;
106
+ _stickyBottomOffset: number | null;
109
107
  /**
110
108
  * A dummy element which visually fills the space as long as the
111
109
  * actual panel is sticky. It prevents flickering of the UI.
@@ -125,8 +123,36 @@ export default class StickyPanelView extends View {
125
123
  */
126
124
  render(): void;
127
125
  /**
128
- * Analyzes the environment to decide whether the panel should
129
- * be sticky or not.
126
+ * Analyzes the environment to decide whether the panel should be sticky or not.
127
+ * Then handles the positioning of the panel.
128
+ *
129
+ * @param [scrollTarget] The element which is being scrolled.
130
+ */
131
+ checkIfShouldBeSticky(scrollTarget?: HTMLElement | Document): void;
132
+ /**
133
+ * Sticks the panel at the given CSS `top` offset.
134
+ *
135
+ * @private
136
+ * @param topOffset
137
+ */
138
+ private _stickToTopOfAncestors;
139
+ /**
140
+ * Sticks the panel at the bottom of the limiter with a given CSS `bottom` offset.
141
+ *
142
+ * @private
143
+ * @param stickyBottomOffset
144
+ */
145
+ private _stickToBottomOfLimiter;
146
+ /**
147
+ * Unsticks the panel putting it back to its original position.
148
+ *
149
+ * @private
150
+ */
151
+ private _unstick;
152
+ /**
153
+ * Returns the bounding rect of the {@link #_contentPanel}.
154
+ *
155
+ * @private
130
156
  */
131
- private _checkIfShouldBeSticky;
157
+ private get _contentPanelRect();
132
158
  }
@@ -7,7 +7,8 @@
7
7
  */
8
8
  import View from '../../view';
9
9
  import Template from '../../template';
10
- import { global, toUnit } from '@ckeditor/ckeditor5-utils';
10
+ import { getElementsIntersectionRect, getScrollableAncestors, global, toUnit, Rect } from '@ckeditor/ckeditor5-utils';
11
+ // @if CK_DEBUG_STICKYPANEL // const RectDrawer = require( '@ckeditor/ckeditor5-utils/tests/_utils/rectdrawer' ).default
11
12
  import '../../../theme/components/panel/stickypanel.css';
12
13
  const toPx = toUnit('px');
13
14
  /**
@@ -26,8 +27,9 @@ export default class StickyPanelView extends View {
26
27
  this.set('limiterBottomOffset', 50);
27
28
  this.set('viewportTopOffset', 0);
28
29
  this.set('_marginLeft', null);
29
- this.set('_isStickyToTheLimiter', false);
30
- this.set('_hasViewportTopOffset', false);
30
+ this.set('_isStickyToTheBottomOfLimiter', false);
31
+ this.set('_stickyTopOffset', null);
32
+ this.set('_stickyBottomOffset', null);
31
33
  this.content = this.createCollection();
32
34
  this._contentPanelPlaceholder = new Template({
33
35
  tag: 'div',
@@ -39,7 +41,7 @@ export default class StickyPanelView extends View {
39
41
  style: {
40
42
  display: bind.to('isSticky', isSticky => isSticky ? 'block' : 'none'),
41
43
  height: bind.to('isSticky', isSticky => {
42
- return isSticky ? toPx(this._panelRect.height) : null;
44
+ return isSticky ? toPx(this._contentPanelRect.height) : null;
43
45
  })
44
46
  }
45
47
  }
@@ -52,18 +54,14 @@ export default class StickyPanelView extends View {
52
54
  'ck-sticky-panel__content',
53
55
  // Toggle class of the panel when "sticky" state changes in the view.
54
56
  bind.if('isSticky', 'ck-sticky-panel__content_sticky'),
55
- bind.if('_isStickyToTheLimiter', 'ck-sticky-panel__content_sticky_bottom-limit')
57
+ bind.if('_isStickyToTheBottomOfLimiter', 'ck-sticky-panel__content_sticky_bottom-limit')
56
58
  ],
57
59
  style: {
58
60
  width: bind.to('isSticky', isSticky => {
59
61
  return isSticky ? toPx(this._contentPanelPlaceholder.getBoundingClientRect().width) : null;
60
62
  }),
61
- top: bind.to('_hasViewportTopOffset', _hasViewportTopOffset => {
62
- return _hasViewportTopOffset ? toPx(this.viewportTopOffset) : null;
63
- }),
64
- bottom: bind.to('_isStickyToTheLimiter', _isStickyToTheLimiter => {
65
- return _isStickyToTheLimiter ? toPx(this.limiterBottomOffset) : null;
66
- }),
63
+ top: bind.to('_stickyTopOffset', value => value ? toPx(value) : value),
64
+ bottom: bind.to('_stickyBottomOffset', value => value ? toPx(value) : value),
67
65
  marginLeft: bind.to('_marginLeft')
68
66
  }
69
67
  },
@@ -89,51 +87,145 @@ export default class StickyPanelView extends View {
89
87
  render() {
90
88
  super.render();
91
89
  // Check if the panel should go into the sticky state immediately.
92
- this._checkIfShouldBeSticky();
93
- // Update sticky state of the panel as the window is being scrolled.
94
- this.listenTo(global.window, 'scroll', () => {
95
- this._checkIfShouldBeSticky();
96
- });
90
+ this.checkIfShouldBeSticky();
91
+ // Update sticky state of the panel as the window and ancestors are being scrolled.
92
+ this.listenTo(global.document, 'scroll', (evt, data) => {
93
+ this.checkIfShouldBeSticky(data.target);
94
+ }, { useCapture: true });
97
95
  // Synchronize with `model.isActive` because sticking an inactive panel is pointless.
98
96
  this.listenTo(this, 'change:isActive', () => {
99
- this._checkIfShouldBeSticky();
97
+ this.checkIfShouldBeSticky();
100
98
  });
101
99
  }
102
100
  /**
103
- * Analyzes the environment to decide whether the panel should
104
- * be sticky or not.
101
+ * Analyzes the environment to decide whether the panel should be sticky or not.
102
+ * Then handles the positioning of the panel.
103
+ *
104
+ * @param [scrollTarget] The element which is being scrolled.
105
105
  */
106
- _checkIfShouldBeSticky() {
107
- const panelRect = this._panelRect = this._contentPanel.getBoundingClientRect();
108
- let limiterRect;
109
- if (!this.limiterElement) {
110
- this.isSticky = false;
106
+ checkIfShouldBeSticky(scrollTarget) {
107
+ // @if CK_DEBUG_STICKYPANEL // RectDrawer.clear();
108
+ if (!this.limiterElement || !this.isActive) {
109
+ this._unstick();
110
+ return;
111
111
  }
112
- else {
113
- limiterRect = this._limiterRect = this.limiterElement.getBoundingClientRect();
114
- // The panel must be active to become sticky.
115
- this.isSticky = this.isActive &&
116
- // The limiter's top edge must be beyond the upper edge of the visible viewport (+the viewportTopOffset).
117
- limiterRect.top < this.viewportTopOffset &&
118
- // The model#limiterElement's height mustn't be smaller than the panel's height and model#limiterBottomOffset.
119
- // There's no point in entering the sticky mode if the model#limiterElement is very, very small, because
120
- // it would immediately set model#_isStickyToTheLimiter true and, given model#limiterBottomOffset, the panel
121
- // would be positioned before the model#limiterElement.
122
- this._panelRect.height + this.limiterBottomOffset < limiterRect.height;
112
+ const scrollableAncestors = getScrollableAncestors(this.limiterElement);
113
+ if (scrollTarget && !scrollableAncestors.includes(scrollTarget)) {
114
+ return;
123
115
  }
124
- // Stick the panel to the top edge of the viewport simulating CSS position:sticky.
125
- // TODO: Possibly replaced by CSS in the future http://caniuse.com/#feat=css-sticky
126
- if (this.isSticky) {
127
- this._isStickyToTheLimiter =
128
- limiterRect.bottom < panelRect.height + this.limiterBottomOffset + this.viewportTopOffset;
129
- this._hasViewportTopOffset = !this._isStickyToTheLimiter && !!this.viewportTopOffset;
130
- this._marginLeft = this._isStickyToTheLimiter ? null : toPx(-global.window.scrollX);
116
+ const visibleAncestorsRect = getElementsIntersectionRect(scrollableAncestors, this.viewportTopOffset);
117
+ const limiterRect = new Rect(this.limiterElement);
118
+ // @if CK_DEBUG_STICKYPANEL // if ( visibleAncestorsRect ) {
119
+ // @if CK_DEBUG_STICKYPANEL // RectDrawer.draw( visibleAncestorsRect,
120
+ // @if CK_DEBUG_STICKYPANEL // { outlineWidth: '3px', opacity: '.8', outlineColor: 'red', outlineOffset: '-3px' },
121
+ // @if CK_DEBUG_STICKYPANEL // 'Visible anc'
122
+ // @if CK_DEBUG_STICKYPANEL // );
123
+ // @if CK_DEBUG_STICKYPANEL // }
124
+ // @if CK_DEBUG_STICKYPANEL //
125
+ // @if CK_DEBUG_STICKYPANEL // RectDrawer.draw( limiterRect,
126
+ // @if CK_DEBUG_STICKYPANEL // { outlineWidth: '3px', opacity: '.8', outlineColor: 'green', outlineOffset: '-3px' },
127
+ // @if CK_DEBUG_STICKYPANEL // 'Limiter'
128
+ // @if CK_DEBUG_STICKYPANEL // );
129
+ // Stick the panel only if
130
+ // * the limiter's ancestors are intersecting with each other so that some of their rects are visible,
131
+ // * and the limiter's top edge is above the visible ancestors' top edge.
132
+ if (visibleAncestorsRect && limiterRect.top < visibleAncestorsRect.top) {
133
+ const visibleLimiterRect = limiterRect.getIntersection(visibleAncestorsRect);
134
+ // Sticky the panel only if the limiter's visible rect is at least partially visible in the
135
+ // visible ancestors' rects intersection.
136
+ if (visibleLimiterRect) {
137
+ // @if CK_DEBUG_STICKYPANEL // RectDrawer.draw( visibleLimiterRect,
138
+ // @if CK_DEBUG_STICKYPANEL // { outlineWidth: '3px', opacity: '.8', outlineColor: 'fuchsia', outlineOffset: '-3px',
139
+ // @if CK_DEBUG_STICKYPANEL // backgroundColor: 'rgba(255, 0, 255, .3)' },
140
+ // @if CK_DEBUG_STICKYPANEL // 'Visible limiter'
141
+ // @if CK_DEBUG_STICKYPANEL // );
142
+ const visibleAncestorsTop = visibleAncestorsRect.top;
143
+ // Check if there's a change the panel can be sticky to the bottom of the limiter.
144
+ if (visibleAncestorsTop + this._contentPanelRect.height + this.limiterBottomOffset > visibleLimiterRect.bottom) {
145
+ const stickyBottomOffset = Math.max(limiterRect.bottom - visibleAncestorsRect.bottom, 0) + this.limiterBottomOffset;
146
+ // @if CK_DEBUG_STICKYPANEL // const stickyBottomOffsetRect = new Rect( {
147
+ // @if CK_DEBUG_STICKYPANEL // top: limiterRect.bottom - stickyBottomOffset, left: 0, right: 2000,
148
+ // @if CK_DEBUG_STICKYPANEL // bottom: limiterRect.bottom - stickyBottomOffset, width: 2000, height: 1
149
+ // @if CK_DEBUG_STICKYPANEL // } );
150
+ // @if CK_DEBUG_STICKYPANEL // RectDrawer.draw( stickyBottomOffsetRect,
151
+ // @if CK_DEBUG_STICKYPANEL // { outlineWidth: '1px', opacity: '.8', outlineColor: 'black' },
152
+ // @if CK_DEBUG_STICKYPANEL // 'Sticky bottom offset'
153
+ // @if CK_DEBUG_STICKYPANEL // );
154
+ // Check if sticking the panel to the bottom of the limiter does not cause it to suddenly
155
+ // move upwards if there's not enough space for it.
156
+ if (limiterRect.bottom - stickyBottomOffset > limiterRect.top + this._contentPanelRect.height) {
157
+ this._stickToBottomOfLimiter(stickyBottomOffset);
158
+ }
159
+ else {
160
+ this._unstick();
161
+ }
162
+ }
163
+ else {
164
+ if (this._contentPanelRect.height + this.limiterBottomOffset < limiterRect.height) {
165
+ this._stickToTopOfAncestors(visibleAncestorsTop);
166
+ }
167
+ else {
168
+ this._unstick();
169
+ }
170
+ }
171
+ }
172
+ else {
173
+ this._unstick();
174
+ }
131
175
  }
132
- // Detach the panel from the top edge of the viewport.
133
176
  else {
134
- this._isStickyToTheLimiter = false;
135
- this._hasViewportTopOffset = false;
136
- this._marginLeft = null;
177
+ this._unstick();
137
178
  }
179
+ // @if CK_DEBUG_STICKYPANEL // console.clear();
180
+ // @if CK_DEBUG_STICKYPANEL // console.log( 'isSticky', this.isSticky );
181
+ // @if CK_DEBUG_STICKYPANEL // console.log( '_isStickyToTheBottomOfLimiter', this._isStickyToTheBottomOfLimiter );
182
+ // @if CK_DEBUG_STICKYPANEL // console.log( '_stickyTopOffset', this._stickyTopOffset );
183
+ // @if CK_DEBUG_STICKYPANEL // console.log( '_stickyBottomOffset', this._stickyBottomOffset );
184
+ }
185
+ /**
186
+ * Sticks the panel at the given CSS `top` offset.
187
+ *
188
+ * @private
189
+ * @param topOffset
190
+ */
191
+ _stickToTopOfAncestors(topOffset) {
192
+ this.isSticky = true;
193
+ this._isStickyToTheBottomOfLimiter = false;
194
+ this._stickyTopOffset = topOffset;
195
+ this._stickyBottomOffset = null;
196
+ this._marginLeft = toPx(-global.window.scrollX);
197
+ }
198
+ /**
199
+ * Sticks the panel at the bottom of the limiter with a given CSS `bottom` offset.
200
+ *
201
+ * @private
202
+ * @param stickyBottomOffset
203
+ */
204
+ _stickToBottomOfLimiter(stickyBottomOffset) {
205
+ this.isSticky = true;
206
+ this._isStickyToTheBottomOfLimiter = true;
207
+ this._stickyTopOffset = null;
208
+ this._stickyBottomOffset = stickyBottomOffset;
209
+ this._marginLeft = toPx(-global.window.scrollX);
210
+ }
211
+ /**
212
+ * Unsticks the panel putting it back to its original position.
213
+ *
214
+ * @private
215
+ */
216
+ _unstick() {
217
+ this.isSticky = false;
218
+ this._isStickyToTheBottomOfLimiter = false;
219
+ this._stickyTopOffset = null;
220
+ this._stickyBottomOffset = null;
221
+ this._marginLeft = null;
222
+ }
223
+ /**
224
+ * Returns the bounding rect of the {@link #_contentPanel}.
225
+ *
226
+ * @private
227
+ */
228
+ get _contentPanelRect() {
229
+ return new Rect(this._contentPanel);
138
230
  }
139
231
  }
@@ -16,6 +16,16 @@
16
16
  flex-direction: row;
17
17
  flex-wrap: nowrap;
18
18
  justify-content: space-between;
19
+ margin: var(--ck-spacing-large) 0 0;
20
+ width: unset;
21
+
22
+ & .ck.ck-labeled-field-view {
23
+ padding-top: unset;
24
+ }
25
+
26
+ & .ck.ck-input-text {
27
+ width: unset;
28
+ }
19
29
 
20
30
  & .ck-color-picker__hash-view {
21
31
  padding-top: var(--ck-spacing-tiny);
@@ -0,0 +1,35 @@
1
+ /*
2
+ * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+
6
+ @import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";
7
+
8
+ .ck.ck-color-selector {
9
+ /* View fragment with color grids. */
10
+ & .ck-color-grids-fragment {
11
+ & .ck-button.ck-color-selector__remove-color,
12
+ & .ck-button.ck-color-selector__color-picker {
13
+ display: flex;
14
+ align-items: center;
15
+
16
+ @mixin ck-dir rtl {
17
+ justify-content: flex-start;
18
+ }
19
+ }
20
+ }
21
+
22
+ /* View fragment with a color picker. */
23
+ & .ck-color-picker-fragment {
24
+ & .ck.ck-color-selector_action-bar {
25
+ display: flex;
26
+ flex-direction: row;
27
+ justify-content: space-around;
28
+
29
+ & .ck-button-save,
30
+ & .ck-button-cancel {
31
+ flex: 1
32
+ }
33
+ }
34
+ }
35
+ }
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="53" height="10" viewBox="0 0 53 10"><path fill="#1C2331" d="M31.724 1.492a15.139 15.139 0 0 0 .045 1.16 2.434 2.434 0 0 0-.687-.34 3.68 3.68 0 0 0-1.103-.166 2.332 2.332 0 0 0-1.14.255 1.549 1.549 0 0 0-.686.87c-.15.41-.225.98-.225 1.712 0 .939.148 1.659.444 2.161.297.503.792.754 1.487.754.452.015.9-.094 1.294-.316.296-.174.557-.4.771-.669l.14.852h1.282V.007h-1.623v1.485ZM31 6.496a1.77 1.77 0 0 1-.494.061.964.964 0 0 1-.521-.127.758.758 0 0 1-.296-.466 3.984 3.984 0 0 1-.093-.992 4.208 4.208 0 0 1 .098-1.052.753.753 0 0 1 .307-.477 1.08 1.08 0 0 1 .55-.122c.233-.004.466.026.69.089l.483.144v2.553c-.11.076-.213.143-.307.2a1.73 1.73 0 0 1-.417.189ZM35.68 0l-.702.004c-.322.002-.482.168-.48.497l.004.581c.002.33.164.493.486.49l.702-.004c.322-.002.481-.167.48-.496L36.165.49c-.002-.33-.164-.493-.486-.491ZM36.145 2.313l-1.612.01.034 5.482 1.613-.01-.035-5.482ZM39.623.79 37.989.8 38 2.306l-.946.056.006 1.009.949-.006.024 2.983c.003.476.143.844.419 1.106.275.26.658.39 1.148.387.132 0 .293-.01.483-.03.19-.02.38-.046.57-.08.163-.028.324-.068.482-.119l-.183-1.095-.702.004a.664.664 0 0 1-.456-.123.553.553 0 0 1-.14-.422l-.016-2.621 1.513-.01-.006-1.064-1.514.01-.01-1.503ZM46.226 2.388c-.41-.184-.956-.274-1.636-.27-.673.004-1.215.101-1.627.29-.402.179-.72.505-.888.91-.18.419-.268.979-.264 1.68.004.688.1 1.24.285 1.655.172.404.495.724.9.894.414.18.957.268 1.63.264.68-.004 1.224-.099 1.632-.284.4-.176.714-.501.878-.905.176-.418.263-.971.258-1.658-.004-.702-.097-1.261-.28-1.677a1.696 1.696 0 0 0-.888-.9Zm-.613 3.607a.77.77 0 0 1-.337.501 1.649 1.649 0 0 1-1.317.009.776.776 0 0 1-.343-.497 4.066 4.066 0 0 1-.105-1.02 4.136 4.136 0 0 1 .092-1.03.786.786 0 0 1 .337-.507 1.59 1.59 0 0 1 1.316-.008.79.79 0 0 1 .344.502c.078.337.113.683.105 1.03.012.343-.019.685-.092 1.02ZM52.114 2.07a2.67 2.67 0 0 0-1.128.278c-.39.191-.752.437-1.072.73l-.157-.846-1.273.008.036 5.572 1.623-.01-.024-3.78c.35-.124.646-.22.887-.286.26-.075.53-.114.8-.118l.45-.003.144-1.546-.286.001ZM22.083 7.426l-1.576-2.532a2.137 2.137 0 0 0-.172-.253 1.95 1.95 0 0 0-.304-.29.138.138 0 0 1 .042-.04 1.7 1.7 0 0 0 .328-.374l1.75-2.71c.01-.015.025-.028.024-.048-.01-.01-.021-.007-.031-.007L20.49 1.17a.078.078 0 0 0-.075.045l-.868 1.384c-.23.366-.46.732-.688 1.099a.108.108 0 0 1-.112.06c-.098-.005-.196-.001-.294-.002-.018 0-.038.006-.055-.007.002-.02.002-.039.005-.058a4.6 4.6 0 0 0 .046-.701V1.203c0-.02-.009-.032-.03-.03h-.033L16.93 1.17c-.084 0-.073-.01-.073.076v6.491c-.001.018.006.028.025.027h1.494c.083 0 .072.007.072-.071v-2.19c0-.055-.003-.11-.004-.166a3.366 3.366 0 0 0-.05-.417h.06c.104 0 .209.002.313-.002a.082.082 0 0 1 .084.05c.535.913 1.07 1.824 1.607 2.736a.104.104 0 0 0 .103.062c.554-.003 1.107-.002 1.66-.002l.069-.003-.019-.032-.188-.304ZM27.112 6.555c-.005-.08-.004-.08-.082-.08h-2.414c-.053 0-.106-.003-.159-.011a.279.279 0 0 1-.246-.209.558.558 0 0 1-.022-.15c0-.382 0-.762-.002-1.143 0-.032.007-.049.042-.044h2.504c.029.003.037-.012.034-.038V3.814c0-.089.013-.078-.076-.078h-2.44c-.07 0-.062.003-.062-.06v-.837c0-.047.004-.093.013-.14a.283.283 0 0 1 .241-.246.717.717 0 0 1 .146-.011h2.484c.024.002.035-.009.036-.033l.003-.038.03-.496c.01-.183.024-.365.034-.548.005-.085.003-.087-.082-.094-.218-.018-.437-.038-.655-.05a17.845 17.845 0 0 0-.657-.026 72.994 72.994 0 0 0-1.756-.016 1.7 1.7 0 0 0-.471.064 1.286 1.286 0 0 0-.817.655c-.099.196-.149.413-.145.633v3.875c0 .072.003.144.011.216a1.27 1.27 0 0 0 .711 1.029c.228.113.48.167.734.158.757-.005 1.515.002 2.272-.042.274-.016.548-.034.82-.053.03-.002.043-.008.04-.041-.008-.104-.012-.208-.019-.312a69.964 69.964 0 0 1-.05-.768ZM16.14 7.415l-.127-1.075c-.004-.03-.014-.04-.044-.037a13.125 13.125 0 0 1-.998.073c-.336.01-.672.02-1.008.016-.116-.001-.233-.014-.347-.039a.746.746 0 0 1-.45-.262c-.075-.1-.132-.211-.167-.33a3.324 3.324 0 0 1-.126-.773 9.113 9.113 0 0 1-.015-.749c0-.285.022-.57.065-.852.023-.158.066-.312.127-.46a.728.728 0 0 1 .518-.443 1.64 1.64 0 0 1 .397-.048c.628-.001 1.255.003 1.882.05.022.001.033-.006.036-.026l.003-.031.06-.55c.019-.177.036-.355.057-.532.004-.034-.005-.046-.04-.056a5.595 5.595 0 0 0-1.213-.21 10.783 10.783 0 0 0-.708-.02c-.24-.003-.48.01-.719.041a3.477 3.477 0 0 0-.625.14 1.912 1.912 0 0 0-.807.497c-.185.2-.33.433-.424.688a4.311 4.311 0 0 0-.24 1.096c-.031.286-.045.572-.042.86-.006.43.024.86.091 1.286.04.25.104.497.193.734.098.279.26.53.473.734.214.205.473.358.756.446.344.11.702.17 1.063.177a8.505 8.505 0 0 0 1.578-.083 6.11 6.11 0 0 0 .766-.18c.03-.008.047-.023.037-.057a.157.157 0 0 1-.003-.025Z"/><path fill="#AFE229" d="M6.016 6.69a1.592 1.592 0 0 0-.614.21c-.23.132-.422.32-.56.546-.044.072-.287.539-.287.539l-.836 1.528.009.006c.038.025.08.046.123.063.127.046.26.07.395.073.505.023 1.011-.007 1.517-.003.29.009.58.002.869-.022a.886.886 0 0 0 .395-.116.962.962 0 0 0 .312-.286c.056-.083.114-.163.164-.249.24-.408.48-.816.718-1.226.075-.128.148-.257.222-.386l.112-.192a1.07 1.07 0 0 0 .153-.518l-1.304.023s-1.258-.005-1.388.01Z"/><path fill="#771BFF" d="m2.848 9.044.76-1.39.184-.352c-.124-.067-.245-.14-.367-.21-.346-.204-.706-.384-1.045-.6a.984.984 0 0 1-.244-.207c-.108-.134-.136-.294-.144-.46-.021-.409-.002-.818-.009-1.227-.003-.195 0-.39.003-.585.004-.322.153-.553.427-.713l.833-.488c.22-.13.44-.257.662-.385.05-.029.105-.052.158-.077.272-.128.519-.047.76.085l.044.028c.123.06.242.125.358.196.318.178.635.357.952.537.095.056.187.117.275.184.194.144.254.35.266.578.016.284.007.569.006.853-.001.28.004.558 0 .838.592-.003 1.259 0 1.259 0l.723-.013c-.003-.292-.007-.584-.007-.876 0-.524.015-1.048-.016-1.571-.024-.42-.135-.8-.492-1.067a5.02 5.02 0 0 0-.506-.339A400.52 400.52 0 0 0 5.94.787C5.722.664 5.513.524 5.282.423 5.255.406 5.228.388 5.2.373 4.758.126 4.305-.026 3.807.21c-.097.046-.197.087-.29.14A699.896 699.896 0 0 0 .783 1.948c-.501.294-.773.717-.778 1.31-.004.36-.009.718-.001 1.077.016.754-.017 1.508.024 2.261.016.304.07.6.269.848.127.15.279.28.448.382.622.4 1.283.734 1.92 1.11l.183.109Z"/></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 53 10"><path d="M31.724 1.492a15.139 15.139 0 0 0 .045 1.16 2.434 2.434 0 0 0-.687-.34 3.68 3.68 0 0 0-1.103-.166 2.332 2.332 0 0 0-1.14.255 1.549 1.549 0 0 0-.686.87c-.15.41-.225.98-.225 1.712 0 .939.148 1.659.444 2.161.297.503.792.754 1.487.754.452.015.9-.094 1.294-.316.296-.174.557-.4.771-.669l.14.852h1.282V.007h-1.623v1.485ZM31 6.496a1.77 1.77 0 0 1-.494.061.964.964 0 0 1-.521-.127.758.758 0 0 1-.296-.466 3.984 3.984 0 0 1-.093-.992 4.208 4.208 0 0 1 .098-1.052.753.753 0 0 1 .307-.477 1.08 1.08 0 0 1 .55-.122 2.4 2.4 0 0 1 .69.089l.483.144v2.553c-.11.076-.213.143-.307.2a1.73 1.73 0 0 1-.417.189ZM35.68 0l-.702.004c-.322.002-.482.168-.48.497l.004.581c.002.33.164.493.486.49l.702-.004c.322-.002.481-.167.48-.496L36.165.49c-.002-.33-.164-.493-.486-.491Zm.465 2.313-1.612.01.034 5.482 1.613-.01-.035-5.482ZM39.623.79 37.989.8 38 2.306l-.946.056.006 1.009.949-.006.024 2.983c.003.476.143.844.419 1.106.275.26.658.39 1.148.387.132 0 .293-.01.483-.03.19-.02.38-.046.57-.08.163-.028.324-.068.482-.119l-.183-1.095-.702.004a.664.664 0 0 1-.456-.123.553.553 0 0 1-.14-.422l-.016-2.621 1.513-.01-.006-1.064-1.514.01-.01-1.503Zm6.603 1.598c-.41-.184-.956-.274-1.636-.27-.673.004-1.215.101-1.627.29-.402.179-.72.505-.888.91-.18.419-.268.979-.264 1.68.004.688.1 1.24.285 1.655.172.404.495.724.9.894.414.18.957.268 1.63.264.68-.004 1.224-.099 1.632-.284.4-.176.714-.501.878-.905.176-.418.263-.971.258-1.658-.004-.702-.097-1.261-.28-1.677a1.696 1.696 0 0 0-.888-.9Zm-.613 3.607a.77.77 0 0 1-.337.501 1.649 1.649 0 0 1-1.317.009.776.776 0 0 1-.343-.497 4.066 4.066 0 0 1-.105-1.02 4.136 4.136 0 0 1 .092-1.03.786.786 0 0 1 .337-.507 1.59 1.59 0 0 1 1.316-.008.79.79 0 0 1 .344.502c.078.337.113.683.105 1.03.012.343-.019.685-.092 1.02Zm6.501-3.925a2.67 2.67 0 0 0-1.128.278c-.39.191-.752.437-1.072.73l-.157-.846-1.273.008.036 5.572 1.623-.01-.024-3.78c.35-.124.646-.22.887-.286.26-.075.53-.114.8-.118l.45-.003.144-1.546-.286.001ZM22.083 7.426l-1.576-2.532a2.137 2.137 0 0 0-.172-.253 1.95 1.95 0 0 0-.304-.29.138.138 0 0 1 .042-.04 1.7 1.7 0 0 0 .328-.374l1.75-2.71c.01-.015.025-.028.024-.048-.01-.01-.021-.007-.031-.007L20.49 1.17a.078.078 0 0 0-.075.045l-.868 1.384c-.23.366-.46.732-.688 1.099a.108.108 0 0 1-.112.06c-.098-.005-.196-.001-.294-.002-.018 0-.038.006-.055-.007.002-.02.002-.039.005-.058a4.6 4.6 0 0 0 .046-.701V1.203c0-.02-.009-.032-.03-.03h-.033L16.93 1.17c-.084 0-.073-.01-.073.076v6.491c-.001.018.006.028.025.027h1.494c.083 0 .072.007.072-.071v-2.19c0-.055-.003-.11-.004-.166a3.366 3.366 0 0 0-.05-.417h.06c.104 0 .209.002.313-.002a.082.082 0 0 1 .084.05c.535.913 1.07 1.824 1.607 2.736a.104.104 0 0 0 .103.062c.554-.003 1.107-.002 1.66-.002l.069-.003-.019-.032-.188-.304Zm5.029-.871c-.005-.08-.004-.08-.082-.08h-2.414c-.053 0-.106-.003-.159-.011a.279.279 0 0 1-.246-.209.558.558 0 0 1-.022-.15c0-.382 0-.762-.002-1.143 0-.032.007-.049.042-.044h2.504c.029.003.037-.012.034-.038V3.814c0-.089.013-.078-.076-.078h-2.44c-.07 0-.062.003-.062-.06v-.837c0-.047.004-.093.013-.14a.283.283 0 0 1 .241-.246.717.717 0 0 1 .146-.011h2.484c.024.002.035-.009.036-.033l.003-.038.03-.496c.01-.183.024-.365.034-.548.005-.085.003-.087-.082-.094-.218-.018-.437-.038-.655-.05a17.845 17.845 0 0 0-.657-.026 72.994 72.994 0 0 0-1.756-.016 1.7 1.7 0 0 0-.471.064 1.286 1.286 0 0 0-.817.655 1.349 1.349 0 0 0-.145.633v3.875c0 .072.003.144.011.216a1.27 1.27 0 0 0 .711 1.029c.228.113.48.167.734.158.757-.005 1.515.002 2.272-.042.274-.016.548-.034.82-.053.03-.002.043-.008.04-.041-.008-.104-.012-.208-.019-.312a69.964 69.964 0 0 1-.05-.768Zm-10.972.86-.127-1.075c-.004-.03-.014-.04-.044-.037a13.125 13.125 0 0 1-.998.073c-.336.01-.672.02-1.008.016a1.693 1.693 0 0 1-.347-.039.746.746 0 0 1-.45-.262 1.038 1.038 0 0 1-.167-.33 3.324 3.324 0 0 1-.126-.773 9.113 9.113 0 0 1-.015-.749c0-.285.022-.57.065-.852a1.94 1.94 0 0 1 .127-.46.728.728 0 0 1 .518-.443 1.64 1.64 0 0 1 .397-.048c.628-.001 1.255.003 1.882.05.022.001.033-.006.036-.026l.003-.031.06-.55c.019-.177.036-.355.057-.532.004-.034-.005-.046-.04-.056a5.595 5.595 0 0 0-1.213-.21 10.783 10.783 0 0 0-.708-.02 5.09 5.09 0 0 0-.719.041 3.477 3.477 0 0 0-.625.14 1.912 1.912 0 0 0-.807.497c-.185.2-.33.433-.424.688a4.311 4.311 0 0 0-.24 1.096 7.262 7.262 0 0 0-.042.86c-.006.43.024.86.091 1.286.04.25.104.497.193.734.098.279.26.53.473.734.214.205.473.358.756.446.344.11.702.17 1.063.177a8.505 8.505 0 0 0 1.578-.083 6.11 6.11 0 0 0 .766-.18c.03-.008.047-.023.037-.057a.157.157 0 0 1-.003-.025Z"/><path d="M6.016 6.69a1.592 1.592 0 0 0-.614.21c-.23.132-.422.32-.56.546-.044.072-.287.539-.287.539l-.836 1.528.009.006c.038.025.08.046.123.063.127.046.26.07.395.073.505.023 1.011-.007 1.517-.003.29.009.58.002.869-.022a.886.886 0 0 0 .395-.116.962.962 0 0 0 .312-.286c.056-.083.114-.163.164-.249.24-.408.48-.816.718-1.226.075-.128.148-.257.222-.386l.112-.192a1.07 1.07 0 0 0 .153-.518l-1.304.023s-1.258-.005-1.388.01Z"/><path d="m2.848 9.044.76-1.39.184-.352c-.124-.067-.245-.14-.367-.21-.346-.204-.706-.384-1.045-.6a.984.984 0 0 1-.244-.207c-.108-.134-.136-.294-.144-.46-.021-.409-.002-.818-.009-1.227-.003-.195 0-.39.003-.585.004-.322.153-.553.427-.713l.833-.488c.22-.13.44-.257.662-.385.05-.029.105-.052.158-.077.272-.128.519-.047.76.085l.044.028c.123.06.242.125.358.196.318.178.635.357.952.537.095.056.187.117.275.184.194.144.254.35.266.578.016.284.007.569.006.853-.001.28.004.558 0 .838.592-.003 1.259 0 1.259 0l.723-.013c-.003-.292-.007-.584-.007-.876 0-.524.015-1.048-.016-1.571-.024-.42-.135-.8-.492-1.067a5.02 5.02 0 0 0-.506-.339A400.52 400.52 0 0 0 5.94.787C5.722.664 5.513.524 5.282.423 5.255.406 5.228.388 5.2.373 4.758.126 4.305-.026 3.807.21c-.097.046-.197.087-.29.14A699.896 699.896 0 0 0 .783 1.948c-.501.294-.773.717-.778 1.31-.004.36-.009.718-.001 1.077.016.754-.017 1.508.024 2.261.016.304.07.6.269.848.127.15.279.28.448.382.622.4 1.283.734 1.92 1.11l.183.109Z"/></svg>