@ckeditor/ckeditor5-ui 38.0.1 → 38.1.1

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 (127) hide show
  1. package/lang/translations/it.po +1 -1
  2. package/package.json +3 -32
  3. package/src/augmentation.d.ts +86 -86
  4. package/src/augmentation.js +5 -5
  5. package/src/bindings/addkeyboardhandlingforgrid.d.ts +27 -27
  6. package/src/bindings/addkeyboardhandlingforgrid.js +107 -107
  7. package/src/bindings/clickoutsidehandler.d.ts +28 -28
  8. package/src/bindings/clickoutsidehandler.js +36 -36
  9. package/src/bindings/csstransitiondisablermixin.d.ts +40 -40
  10. package/src/bindings/csstransitiondisablermixin.js +55 -55
  11. package/src/bindings/injectcsstransitiondisabler.d.ts +59 -59
  12. package/src/bindings/injectcsstransitiondisabler.js +71 -71
  13. package/src/bindings/preventdefault.d.ts +33 -33
  14. package/src/bindings/preventdefault.js +34 -34
  15. package/src/bindings/submithandler.d.ts +57 -57
  16. package/src/bindings/submithandler.js +47 -47
  17. package/src/button/button.d.ts +178 -178
  18. package/src/button/button.js +5 -5
  19. package/src/button/buttonview.d.ts +177 -177
  20. package/src/button/buttonview.js +231 -231
  21. package/src/button/switchbuttonview.d.ts +45 -45
  22. package/src/button/switchbuttonview.js +75 -75
  23. package/src/colorgrid/colorgridview.d.ts +132 -132
  24. package/src/colorgrid/colorgridview.js +124 -124
  25. package/src/colorgrid/colortileview.d.ts +28 -28
  26. package/src/colorgrid/colortileview.js +40 -40
  27. package/src/colorgrid/utils.d.ts +47 -47
  28. package/src/colorgrid/utils.js +84 -84
  29. package/src/colorpicker/colorpickerview.d.ts +110 -110
  30. package/src/colorpicker/colorpickerview.js +253 -250
  31. package/src/colorpicker/utils.d.ts +35 -35
  32. package/src/colorpicker/utils.js +99 -99
  33. package/src/componentfactory.d.ts +81 -81
  34. package/src/componentfactory.js +104 -104
  35. package/src/dropdown/button/dropdownbutton.d.ts +25 -25
  36. package/src/dropdown/button/dropdownbutton.js +5 -5
  37. package/src/dropdown/button/dropdownbuttonview.d.ts +48 -48
  38. package/src/dropdown/button/dropdownbuttonview.js +66 -66
  39. package/src/dropdown/button/splitbuttonview.d.ts +161 -161
  40. package/src/dropdown/button/splitbuttonview.js +152 -152
  41. package/src/dropdown/dropdownpanelfocusable.d.ts +21 -21
  42. package/src/dropdown/dropdownpanelfocusable.js +5 -5
  43. package/src/dropdown/dropdownpanelview.d.ts +62 -62
  44. package/src/dropdown/dropdownpanelview.js +96 -96
  45. package/src/dropdown/dropdownview.d.ts +315 -315
  46. package/src/dropdown/dropdownview.js +378 -378
  47. package/src/dropdown/utils.d.ts +221 -221
  48. package/src/dropdown/utils.js +434 -434
  49. package/src/editableui/editableuiview.d.ts +72 -72
  50. package/src/editableui/editableuiview.js +112 -112
  51. package/src/editableui/inline/inlineeditableuiview.d.ts +40 -40
  52. package/src/editableui/inline/inlineeditableuiview.js +48 -48
  53. package/src/editorui/bodycollection.d.ts +55 -51
  54. package/src/editorui/bodycollection.js +84 -78
  55. package/src/editorui/boxed/boxededitoruiview.d.ts +40 -40
  56. package/src/editorui/boxed/boxededitoruiview.js +81 -81
  57. package/src/editorui/editorui.d.ts +282 -274
  58. package/src/editorui/editorui.js +410 -388
  59. package/src/editorui/editoruiview.d.ts +39 -39
  60. package/src/editorui/editoruiview.js +38 -38
  61. package/src/editorui/poweredby.d.ts +71 -76
  62. package/src/editorui/poweredby.js +294 -291
  63. package/src/focuscycler.d.ts +183 -183
  64. package/src/focuscycler.js +220 -220
  65. package/src/formheader/formheaderview.d.ts +53 -53
  66. package/src/formheader/formheaderview.js +63 -63
  67. package/src/icon/iconview.d.ts +78 -78
  68. package/src/icon/iconview.js +112 -112
  69. package/src/iframe/iframeview.d.ts +50 -50
  70. package/src/iframe/iframeview.js +63 -63
  71. package/src/index.d.ts +62 -61
  72. package/src/index.js +61 -60
  73. package/src/input/inputview.d.ts +121 -121
  74. package/src/input/inputview.js +106 -106
  75. package/src/inputnumber/inputnumberview.d.ts +49 -49
  76. package/src/inputnumber/inputnumberview.js +40 -40
  77. package/src/inputtext/inputtextview.d.ts +18 -18
  78. package/src/inputtext/inputtextview.js +27 -27
  79. package/src/label/labelview.d.ts +36 -36
  80. package/src/label/labelview.js +41 -41
  81. package/src/labeledfield/labeledfieldview.d.ts +182 -182
  82. package/src/labeledfield/labeledfieldview.js +157 -157
  83. package/src/labeledfield/utils.d.ts +93 -93
  84. package/src/labeledfield/utils.js +131 -131
  85. package/src/labeledinput/labeledinputview.d.ts +125 -125
  86. package/src/labeledinput/labeledinputview.js +125 -125
  87. package/src/list/listitemview.d.ts +35 -35
  88. package/src/list/listitemview.js +40 -40
  89. package/src/list/listseparatorview.d.ts +18 -18
  90. package/src/list/listseparatorview.js +28 -28
  91. package/src/list/listview.d.ts +65 -65
  92. package/src/list/listview.js +90 -90
  93. package/src/model.d.ts +22 -22
  94. package/src/model.js +31 -31
  95. package/src/notification/notification.d.ts +211 -211
  96. package/src/notification/notification.js +187 -187
  97. package/src/panel/balloon/balloonpanelview.d.ts +685 -685
  98. package/src/panel/balloon/balloonpanelview.js +988 -988
  99. package/src/panel/balloon/contextualballoon.d.ts +299 -299
  100. package/src/panel/balloon/contextualballoon.js +572 -572
  101. package/src/panel/sticky/stickypanelview.d.ts +132 -132
  102. package/src/panel/sticky/stickypanelview.js +139 -139
  103. package/src/template.d.ts +942 -942
  104. package/src/template.js +1294 -1294
  105. package/src/toolbar/balloon/balloontoolbar.d.ts +122 -122
  106. package/src/toolbar/balloon/balloontoolbar.js +300 -300
  107. package/src/toolbar/block/blockbuttonview.d.ts +35 -35
  108. package/src/toolbar/block/blockbuttonview.js +41 -41
  109. package/src/toolbar/block/blocktoolbar.d.ts +161 -153
  110. package/src/toolbar/block/blocktoolbar.js +391 -374
  111. package/src/toolbar/normalizetoolbarconfig.d.ts +39 -39
  112. package/src/toolbar/normalizetoolbarconfig.js +51 -51
  113. package/src/toolbar/toolbarlinebreakview.d.ts +18 -18
  114. package/src/toolbar/toolbarlinebreakview.js +28 -28
  115. package/src/toolbar/toolbarseparatorview.d.ts +18 -18
  116. package/src/toolbar/toolbarseparatorview.js +28 -28
  117. package/src/toolbar/toolbarview.d.ts +265 -265
  118. package/src/toolbar/toolbarview.js +717 -717
  119. package/src/tooltipmanager.d.ts +180 -180
  120. package/src/tooltipmanager.js +353 -353
  121. package/src/view.d.ts +422 -422
  122. package/src/view.js +396 -396
  123. package/src/viewcollection.d.ts +139 -139
  124. package/src/viewcollection.js +206 -206
  125. package/theme/components/colorpicker/colorpicker.css +4 -4
  126. package/theme/globals/_poweredby.css +5 -1
  127. package/theme/icons/project-logo.svg +1 -1
@@ -1,132 +1,132 @@
1
- /**
2
- * @license 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
- * @module ui/panel/sticky/stickypanelview
7
- */
8
- import View from '../../view';
9
- import type ViewCollection from '../../viewcollection';
10
- import { type Locale } from '@ckeditor/ckeditor5-utils';
11
- import '../../../theme/components/panel/stickypanel.css';
12
- /**
13
- * The sticky panel view class.
14
- */
15
- export default class StickyPanelView extends View {
16
- /**
17
- * Collection of the child views which creates balloon panel contents.
18
- */
19
- readonly content: ViewCollection;
20
- /**
21
- * Controls whether the sticky panel should be active.
22
- *
23
- * @readonly
24
- * @observable
25
- */
26
- isActive: boolean;
27
- /**
28
- * Controls whether the sticky panel is in the "sticky" state.
29
- *
30
- * @readonly
31
- * @observable
32
- */
33
- isSticky: boolean;
34
- /**
35
- * The limiter element for the sticky panel instance. Its bounding rect limits
36
- * the "stickyness" of the panel, i.e. when the panel reaches the bottom
37
- * edge of the limiter, it becomes sticky to that edge and does not float
38
- * off the limiter. It is mandatory for the panel to work properly and once
39
- * set, it cannot be changed.
40
- *
41
- * @readonly
42
- * @observable
43
- */
44
- limiterElement: HTMLElement | null;
45
- /**
46
- * The offset from the bottom edge of {@link #limiterElement}
47
- * which stops the panel from stickying any further to prevent limiter's content
48
- * from being completely covered.
49
- *
50
- * @readonly
51
- * @observable
52
- * @default 50
53
- */
54
- limiterBottomOffset: number;
55
- /**
56
- * The offset from the top edge of the web browser's viewport which makes the
57
- * panel become sticky. The default value is `0`, which means the panel becomes
58
- * sticky when it's upper edge touches the top of the page viewport.
59
- *
60
- * This attribute is useful when the web page has UI elements positioned to the top
61
- * either using `position: fixed` or `position: sticky`, which would cover the
62
- * sticky panel or vice–versa (depending on the `z-index` hierarchy).
63
- *
64
- * Bound to {@link module:ui/editorui/editorui~EditorUI#viewportOffset `EditorUI#viewportOffset`}.
65
- *
66
- * If {@link module:core/editor/editorconfig~EditorConfig#ui `EditorConfig#ui.viewportOffset.top`} is defined, then
67
- * it will override the default value.
68
- *
69
- * @observable
70
- * @default 0
71
- */
72
- viewportTopOffset: number;
73
- /**
74
- * Controls the `margin-left` CSS style of the panel.
75
- *
76
- * @private
77
- * @readonly
78
- * @observable
79
- */
80
- _marginLeft: string | null;
81
- /**
82
- * Set `true` if the sticky panel reached the bottom edge of the
83
- * {@link #limiterElement}.
84
- *
85
- * @private
86
- * @readonly
87
- * @observable
88
- */
89
- _isStickyToTheLimiter: boolean;
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`.
94
- *
95
- * @private
96
- * @readonly
97
- * @observable
98
- */
99
- _hasViewportTopOffset: boolean;
100
- /**
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.
107
- */
108
- private _limiterRect?;
109
- /**
110
- * A dummy element which visually fills the space as long as the
111
- * actual panel is sticky. It prevents flickering of the UI.
112
- */
113
- private _contentPanelPlaceholder;
114
- /**
115
- * The panel which accepts children into {@link #content} collection.
116
- * Also an element which is positioned when {@link #isSticky}.
117
- */
118
- private _contentPanel;
119
- /**
120
- * @inheritDoc
121
- */
122
- constructor(locale?: Locale);
123
- /**
124
- * @inheritDoc
125
- */
126
- render(): void;
127
- /**
128
- * Analyzes the environment to decide whether the panel should
129
- * be sticky or not.
130
- */
131
- private _checkIfShouldBeSticky;
132
- }
1
+ /**
2
+ * @license 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
+ * @module ui/panel/sticky/stickypanelview
7
+ */
8
+ import View from '../../view';
9
+ import type ViewCollection from '../../viewcollection';
10
+ import { type Locale } from '@ckeditor/ckeditor5-utils';
11
+ import '../../../theme/components/panel/stickypanel.css';
12
+ /**
13
+ * The sticky panel view class.
14
+ */
15
+ export default class StickyPanelView extends View {
16
+ /**
17
+ * Collection of the child views which creates balloon panel contents.
18
+ */
19
+ readonly content: ViewCollection;
20
+ /**
21
+ * Controls whether the sticky panel should be active.
22
+ *
23
+ * @readonly
24
+ * @observable
25
+ */
26
+ isActive: boolean;
27
+ /**
28
+ * Controls whether the sticky panel is in the "sticky" state.
29
+ *
30
+ * @readonly
31
+ * @observable
32
+ */
33
+ isSticky: boolean;
34
+ /**
35
+ * The limiter element for the sticky panel instance. Its bounding rect limits
36
+ * the "stickyness" of the panel, i.e. when the panel reaches the bottom
37
+ * edge of the limiter, it becomes sticky to that edge and does not float
38
+ * off the limiter. It is mandatory for the panel to work properly and once
39
+ * set, it cannot be changed.
40
+ *
41
+ * @readonly
42
+ * @observable
43
+ */
44
+ limiterElement: HTMLElement | null;
45
+ /**
46
+ * The offset from the bottom edge of {@link #limiterElement}
47
+ * which stops the panel from stickying any further to prevent limiter's content
48
+ * from being completely covered.
49
+ *
50
+ * @readonly
51
+ * @observable
52
+ * @default 50
53
+ */
54
+ limiterBottomOffset: number;
55
+ /**
56
+ * The offset from the top edge of the web browser's viewport which makes the
57
+ * panel become sticky. The default value is `0`, which means the panel becomes
58
+ * sticky when it's upper edge touches the top of the page viewport.
59
+ *
60
+ * This attribute is useful when the web page has UI elements positioned to the top
61
+ * either using `position: fixed` or `position: sticky`, which would cover the
62
+ * sticky panel or vice–versa (depending on the `z-index` hierarchy).
63
+ *
64
+ * Bound to {@link module:ui/editorui/editorui~EditorUI#viewportOffset `EditorUI#viewportOffset`}.
65
+ *
66
+ * If {@link module:core/editor/editorconfig~EditorConfig#ui `EditorConfig#ui.viewportOffset.top`} is defined, then
67
+ * it will override the default value.
68
+ *
69
+ * @observable
70
+ * @default 0
71
+ */
72
+ viewportTopOffset: number;
73
+ /**
74
+ * Controls the `margin-left` CSS style of the panel.
75
+ *
76
+ * @private
77
+ * @readonly
78
+ * @observable
79
+ */
80
+ _marginLeft: string | null;
81
+ /**
82
+ * Set `true` if the sticky panel reached the bottom edge of the
83
+ * {@link #limiterElement}.
84
+ *
85
+ * @private
86
+ * @readonly
87
+ * @observable
88
+ */
89
+ _isStickyToTheLimiter: boolean;
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`.
94
+ *
95
+ * @private
96
+ * @readonly
97
+ * @observable
98
+ */
99
+ _hasViewportTopOffset: boolean;
100
+ /**
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.
107
+ */
108
+ private _limiterRect?;
109
+ /**
110
+ * A dummy element which visually fills the space as long as the
111
+ * actual panel is sticky. It prevents flickering of the UI.
112
+ */
113
+ private _contentPanelPlaceholder;
114
+ /**
115
+ * The panel which accepts children into {@link #content} collection.
116
+ * Also an element which is positioned when {@link #isSticky}.
117
+ */
118
+ private _contentPanel;
119
+ /**
120
+ * @inheritDoc
121
+ */
122
+ constructor(locale?: Locale);
123
+ /**
124
+ * @inheritDoc
125
+ */
126
+ render(): void;
127
+ /**
128
+ * Analyzes the environment to decide whether the panel should
129
+ * be sticky or not.
130
+ */
131
+ private _checkIfShouldBeSticky;
132
+ }
@@ -1,139 +1,139 @@
1
- /**
2
- * @license 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
- * @module ui/panel/sticky/stickypanelview
7
- */
8
- import View from '../../view';
9
- import Template from '../../template';
10
- import { global, toUnit } from '@ckeditor/ckeditor5-utils';
11
- import '../../../theme/components/panel/stickypanel.css';
12
- const toPx = toUnit('px');
13
- /**
14
- * The sticky panel view class.
15
- */
16
- export default class StickyPanelView extends View {
17
- /**
18
- * @inheritDoc
19
- */
20
- constructor(locale) {
21
- super(locale);
22
- const bind = this.bindTemplate;
23
- this.set('isActive', false);
24
- this.set('isSticky', false);
25
- this.set('limiterElement', null);
26
- this.set('limiterBottomOffset', 50);
27
- this.set('viewportTopOffset', 0);
28
- this.set('_marginLeft', null);
29
- this.set('_isStickyToTheLimiter', false);
30
- this.set('_hasViewportTopOffset', false);
31
- this.content = this.createCollection();
32
- this._contentPanelPlaceholder = new Template({
33
- tag: 'div',
34
- attributes: {
35
- class: [
36
- 'ck',
37
- 'ck-sticky-panel__placeholder'
38
- ],
39
- style: {
40
- display: bind.to('isSticky', isSticky => isSticky ? 'block' : 'none'),
41
- height: bind.to('isSticky', isSticky => {
42
- return isSticky ? toPx(this._panelRect.height) : null;
43
- })
44
- }
45
- }
46
- }).render();
47
- this._contentPanel = new Template({
48
- tag: 'div',
49
- attributes: {
50
- class: [
51
- 'ck',
52
- 'ck-sticky-panel__content',
53
- // Toggle class of the panel when "sticky" state changes in the view.
54
- bind.if('isSticky', 'ck-sticky-panel__content_sticky'),
55
- bind.if('_isStickyToTheLimiter', 'ck-sticky-panel__content_sticky_bottom-limit')
56
- ],
57
- style: {
58
- width: bind.to('isSticky', isSticky => {
59
- return isSticky ? toPx(this._contentPanelPlaceholder.getBoundingClientRect().width) : null;
60
- }),
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
- }),
67
- marginLeft: bind.to('_marginLeft')
68
- }
69
- },
70
- children: this.content
71
- }).render();
72
- this.setTemplate({
73
- tag: 'div',
74
- attributes: {
75
- class: [
76
- 'ck',
77
- 'ck-sticky-panel'
78
- ]
79
- },
80
- children: [
81
- this._contentPanelPlaceholder,
82
- this._contentPanel
83
- ]
84
- });
85
- }
86
- /**
87
- * @inheritDoc
88
- */
89
- render() {
90
- super.render();
91
- // 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
- });
97
- // Synchronize with `model.isActive` because sticking an inactive panel is pointless.
98
- this.listenTo(this, 'change:isActive', () => {
99
- this._checkIfShouldBeSticky();
100
- });
101
- }
102
- /**
103
- * Analyzes the environment to decide whether the panel should
104
- * be sticky or not.
105
- */
106
- _checkIfShouldBeSticky() {
107
- const panelRect = this._panelRect = this._contentPanel.getBoundingClientRect();
108
- let limiterRect;
109
- if (!this.limiterElement) {
110
- this.isSticky = false;
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;
123
- }
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);
131
- }
132
- // Detach the panel from the top edge of the viewport.
133
- else {
134
- this._isStickyToTheLimiter = false;
135
- this._hasViewportTopOffset = false;
136
- this._marginLeft = null;
137
- }
138
- }
139
- }
1
+ /**
2
+ * @license 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
+ * @module ui/panel/sticky/stickypanelview
7
+ */
8
+ import View from '../../view';
9
+ import Template from '../../template';
10
+ import { global, toUnit } from '@ckeditor/ckeditor5-utils';
11
+ import '../../../theme/components/panel/stickypanel.css';
12
+ const toPx = toUnit('px');
13
+ /**
14
+ * The sticky panel view class.
15
+ */
16
+ export default class StickyPanelView extends View {
17
+ /**
18
+ * @inheritDoc
19
+ */
20
+ constructor(locale) {
21
+ super(locale);
22
+ const bind = this.bindTemplate;
23
+ this.set('isActive', false);
24
+ this.set('isSticky', false);
25
+ this.set('limiterElement', null);
26
+ this.set('limiterBottomOffset', 50);
27
+ this.set('viewportTopOffset', 0);
28
+ this.set('_marginLeft', null);
29
+ this.set('_isStickyToTheLimiter', false);
30
+ this.set('_hasViewportTopOffset', false);
31
+ this.content = this.createCollection();
32
+ this._contentPanelPlaceholder = new Template({
33
+ tag: 'div',
34
+ attributes: {
35
+ class: [
36
+ 'ck',
37
+ 'ck-sticky-panel__placeholder'
38
+ ],
39
+ style: {
40
+ display: bind.to('isSticky', isSticky => isSticky ? 'block' : 'none'),
41
+ height: bind.to('isSticky', isSticky => {
42
+ return isSticky ? toPx(this._panelRect.height) : null;
43
+ })
44
+ }
45
+ }
46
+ }).render();
47
+ this._contentPanel = new Template({
48
+ tag: 'div',
49
+ attributes: {
50
+ class: [
51
+ 'ck',
52
+ 'ck-sticky-panel__content',
53
+ // Toggle class of the panel when "sticky" state changes in the view.
54
+ bind.if('isSticky', 'ck-sticky-panel__content_sticky'),
55
+ bind.if('_isStickyToTheLimiter', 'ck-sticky-panel__content_sticky_bottom-limit')
56
+ ],
57
+ style: {
58
+ width: bind.to('isSticky', isSticky => {
59
+ return isSticky ? toPx(this._contentPanelPlaceholder.getBoundingClientRect().width) : null;
60
+ }),
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
+ }),
67
+ marginLeft: bind.to('_marginLeft')
68
+ }
69
+ },
70
+ children: this.content
71
+ }).render();
72
+ this.setTemplate({
73
+ tag: 'div',
74
+ attributes: {
75
+ class: [
76
+ 'ck',
77
+ 'ck-sticky-panel'
78
+ ]
79
+ },
80
+ children: [
81
+ this._contentPanelPlaceholder,
82
+ this._contentPanel
83
+ ]
84
+ });
85
+ }
86
+ /**
87
+ * @inheritDoc
88
+ */
89
+ render() {
90
+ super.render();
91
+ // 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
+ });
97
+ // Synchronize with `model.isActive` because sticking an inactive panel is pointless.
98
+ this.listenTo(this, 'change:isActive', () => {
99
+ this._checkIfShouldBeSticky();
100
+ });
101
+ }
102
+ /**
103
+ * Analyzes the environment to decide whether the panel should
104
+ * be sticky or not.
105
+ */
106
+ _checkIfShouldBeSticky() {
107
+ const panelRect = this._panelRect = this._contentPanel.getBoundingClientRect();
108
+ let limiterRect;
109
+ if (!this.limiterElement) {
110
+ this.isSticky = false;
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;
123
+ }
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);
131
+ }
132
+ // Detach the panel from the top edge of the viewport.
133
+ else {
134
+ this._isStickyToTheLimiter = false;
135
+ this._hasViewportTopOffset = false;
136
+ this._marginLeft = null;
137
+ }
138
+ }
139
+ }