@ckeditor/ckeditor5-ui 38.1.0 → 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 (123) hide show
  1. package/package.json +3 -3
  2. package/src/augmentation.d.ts +86 -86
  3. package/src/augmentation.js +5 -5
  4. package/src/bindings/addkeyboardhandlingforgrid.d.ts +27 -27
  5. package/src/bindings/addkeyboardhandlingforgrid.js +107 -107
  6. package/src/bindings/clickoutsidehandler.d.ts +28 -28
  7. package/src/bindings/clickoutsidehandler.js +36 -36
  8. package/src/bindings/csstransitiondisablermixin.d.ts +40 -40
  9. package/src/bindings/csstransitiondisablermixin.js +55 -55
  10. package/src/bindings/injectcsstransitiondisabler.d.ts +59 -59
  11. package/src/bindings/injectcsstransitiondisabler.js +71 -71
  12. package/src/bindings/preventdefault.d.ts +33 -33
  13. package/src/bindings/preventdefault.js +34 -34
  14. package/src/bindings/submithandler.d.ts +57 -57
  15. package/src/bindings/submithandler.js +47 -47
  16. package/src/button/button.d.ts +178 -178
  17. package/src/button/button.js +5 -5
  18. package/src/button/buttonview.d.ts +177 -177
  19. package/src/button/buttonview.js +231 -231
  20. package/src/button/switchbuttonview.d.ts +45 -45
  21. package/src/button/switchbuttonview.js +75 -75
  22. package/src/colorgrid/colorgridview.d.ts +132 -132
  23. package/src/colorgrid/colorgridview.js +124 -124
  24. package/src/colorgrid/colortileview.d.ts +28 -28
  25. package/src/colorgrid/colortileview.js +40 -40
  26. package/src/colorgrid/utils.d.ts +47 -47
  27. package/src/colorgrid/utils.js +84 -84
  28. package/src/colorpicker/colorpickerview.d.ts +110 -110
  29. package/src/colorpicker/colorpickerview.js +253 -253
  30. package/src/colorpicker/utils.d.ts +35 -35
  31. package/src/colorpicker/utils.js +99 -99
  32. package/src/componentfactory.d.ts +81 -81
  33. package/src/componentfactory.js +104 -104
  34. package/src/dropdown/button/dropdownbutton.d.ts +25 -25
  35. package/src/dropdown/button/dropdownbutton.js +5 -5
  36. package/src/dropdown/button/dropdownbuttonview.d.ts +48 -48
  37. package/src/dropdown/button/dropdownbuttonview.js +66 -66
  38. package/src/dropdown/button/splitbuttonview.d.ts +161 -161
  39. package/src/dropdown/button/splitbuttonview.js +152 -152
  40. package/src/dropdown/dropdownpanelfocusable.d.ts +21 -21
  41. package/src/dropdown/dropdownpanelfocusable.js +5 -5
  42. package/src/dropdown/dropdownpanelview.d.ts +62 -62
  43. package/src/dropdown/dropdownpanelview.js +96 -96
  44. package/src/dropdown/dropdownview.d.ts +315 -315
  45. package/src/dropdown/dropdownview.js +378 -378
  46. package/src/dropdown/utils.d.ts +221 -221
  47. package/src/dropdown/utils.js +434 -434
  48. package/src/editableui/editableuiview.d.ts +72 -72
  49. package/src/editableui/editableuiview.js +112 -112
  50. package/src/editableui/inline/inlineeditableuiview.d.ts +40 -40
  51. package/src/editableui/inline/inlineeditableuiview.js +48 -48
  52. package/src/editorui/bodycollection.d.ts +55 -55
  53. package/src/editorui/bodycollection.js +84 -84
  54. package/src/editorui/boxed/boxededitoruiview.d.ts +40 -40
  55. package/src/editorui/boxed/boxededitoruiview.js +81 -81
  56. package/src/editorui/editorui.d.ts +282 -282
  57. package/src/editorui/editorui.js +410 -410
  58. package/src/editorui/editoruiview.d.ts +39 -39
  59. package/src/editorui/editoruiview.js +38 -38
  60. package/src/editorui/poweredby.d.ts +71 -71
  61. package/src/editorui/poweredby.js +294 -294
  62. package/src/focuscycler.d.ts +183 -183
  63. package/src/focuscycler.js +220 -220
  64. package/src/formheader/formheaderview.d.ts +53 -53
  65. package/src/formheader/formheaderview.js +63 -63
  66. package/src/icon/iconview.d.ts +78 -78
  67. package/src/icon/iconview.js +112 -112
  68. package/src/iframe/iframeview.d.ts +50 -50
  69. package/src/iframe/iframeview.js +63 -63
  70. package/src/index.d.ts +62 -62
  71. package/src/index.js +61 -61
  72. package/src/input/inputview.d.ts +121 -121
  73. package/src/input/inputview.js +106 -106
  74. package/src/inputnumber/inputnumberview.d.ts +49 -49
  75. package/src/inputnumber/inputnumberview.js +40 -40
  76. package/src/inputtext/inputtextview.d.ts +18 -18
  77. package/src/inputtext/inputtextview.js +27 -27
  78. package/src/label/labelview.d.ts +36 -36
  79. package/src/label/labelview.js +41 -41
  80. package/src/labeledfield/labeledfieldview.d.ts +182 -182
  81. package/src/labeledfield/labeledfieldview.js +157 -157
  82. package/src/labeledfield/utils.d.ts +93 -93
  83. package/src/labeledfield/utils.js +131 -131
  84. package/src/labeledinput/labeledinputview.d.ts +125 -125
  85. package/src/labeledinput/labeledinputview.js +125 -125
  86. package/src/list/listitemview.d.ts +35 -35
  87. package/src/list/listitemview.js +40 -40
  88. package/src/list/listseparatorview.d.ts +18 -18
  89. package/src/list/listseparatorview.js +28 -28
  90. package/src/list/listview.d.ts +65 -65
  91. package/src/list/listview.js +90 -90
  92. package/src/model.d.ts +22 -22
  93. package/src/model.js +31 -31
  94. package/src/notification/notification.d.ts +211 -211
  95. package/src/notification/notification.js +187 -187
  96. package/src/panel/balloon/balloonpanelview.d.ts +685 -685
  97. package/src/panel/balloon/balloonpanelview.js +988 -988
  98. package/src/panel/balloon/contextualballoon.d.ts +299 -299
  99. package/src/panel/balloon/contextualballoon.js +572 -572
  100. package/src/panel/sticky/stickypanelview.d.ts +132 -132
  101. package/src/panel/sticky/stickypanelview.js +139 -139
  102. package/src/template.d.ts +942 -942
  103. package/src/template.js +1294 -1294
  104. package/src/toolbar/balloon/balloontoolbar.d.ts +122 -122
  105. package/src/toolbar/balloon/balloontoolbar.js +300 -300
  106. package/src/toolbar/block/blockbuttonview.d.ts +35 -35
  107. package/src/toolbar/block/blockbuttonview.js +41 -41
  108. package/src/toolbar/block/blocktoolbar.d.ts +161 -161
  109. package/src/toolbar/block/blocktoolbar.js +391 -391
  110. package/src/toolbar/normalizetoolbarconfig.d.ts +39 -39
  111. package/src/toolbar/normalizetoolbarconfig.js +51 -51
  112. package/src/toolbar/toolbarlinebreakview.d.ts +18 -18
  113. package/src/toolbar/toolbarlinebreakview.js +28 -28
  114. package/src/toolbar/toolbarseparatorview.d.ts +18 -18
  115. package/src/toolbar/toolbarseparatorview.js +28 -28
  116. package/src/toolbar/toolbarview.d.ts +265 -265
  117. package/src/toolbar/toolbarview.js +717 -717
  118. package/src/tooltipmanager.d.ts +180 -180
  119. package/src/tooltipmanager.js +353 -353
  120. package/src/view.d.ts +422 -422
  121. package/src/view.js +396 -396
  122. package/src/viewcollection.d.ts +139 -139
  123. package/src/viewcollection.js +206 -206
@@ -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
+ }