PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 4.0.1
Tutor LMS – eLearning and online course solution v4.0.1
4.0.1 4.0.0 3.9.15 3.9.14 3.9.13 3.9.12 3.9.11 trunk 1.0.0 1.0.0-alpha 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.2.0 1.2.1 1.2.11 1.2.12 1.2.13 1.2.20 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.7 1.7.8 1.7.9 1.8.0 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.15 1.9.16 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.1.1 2.1.10 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.3.0 2.4.0 2.5.0 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 3.0.0 3.0.1 3.0.2 3.1.0 3.2.0 3.2.1 3.2.2 3.2.3 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.7.0 3.7.1 3.7.2 3.7.3 3.7.4 3.8.0 3.8.1 3.8.2 3.8.3 3.9.0 3.9.1 3.9.10 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9
tutor / components / Tooltip.php
tutor / components Last commit date
Constants 4 days ago Accordion.php 4 days ago Alert.php 4 days ago AttachmentCard.php 4 days ago Avatar.php 4 days ago Badge.php 4 days ago BaseComponent.php 4 days ago Button.php 4 days ago ConfirmationModal.php 4 days ago CourseFilter.php 4 days ago DateFilter.php 4 days ago DropdownFilter.php 4 days ago EmptyState.php 4 days ago FileUploader.php 4 days ago InputField.php 4 days ago Modal.php 4 days ago Nav.php 4 days ago Pagination.php 4 days ago Popover.php 4 days ago PreviewTrigger.php 4 days ago Progress.php 4 days ago SearchFilter.php 4 days ago Sorting.php 4 days ago StarRating.php 4 days ago StarRatingInput.php 4 days ago StatusSelect.php 4 days ago SvgIcon.php 4 days ago Table.php 4 days ago Tabs.php 4 days ago Tooltip.php 4 days ago WPEditor.php 4 days ago
Tooltip.php
285 lines
1 <?php
2 /**
3 * Tutor Component: Tooltip
4 *
5 * Provides a fluent builder for rendering tooltips with
6 * different placements, sizes, and triggers.
7 *
8 * @package Tutor\Components
9 * @author Themeum
10 * @link https://themeum.com
11 * @since 4.0.0
12 */
13
14 namespace Tutor\Components;
15
16 defined( 'ABSPATH' ) || exit;
17
18 use Tutor\Components\Constants\Size;
19
20 /**
21 * Tooltip Component Class.
22 *
23 * Example usage:
24 * ```
25 * Tooltip::make()
26 * ->content( 'Helpful information' )
27 * ->placement( 'top' )
28 * ->size( Size::SMALL )
29 * ->trigger_element( '<button class="tutor-btn">Hover me</button>' )
30 * ->render();
31 * ```
32 *
33 * @since 4.0.0
34 */
35 class Tooltip extends BaseComponent {
36
37 /**
38 * Placement constants.
39 */
40 public const PLACEMENT_TOP = 'top';
41 public const PLACEMENT_BOTTOM = 'bottom';
42 public const PLACEMENT_START = 'start';
43 public const PLACEMENT_END = 'end';
44
45 /**
46 * Arrow alignment constants.
47 */
48 public const ARROW_START = 'start';
49 public const ARROW_CENTER = 'center';
50 public const ARROW_END = 'end';
51
52 /**
53 * Trigger constants.
54 */
55 public const HOVER = 'hover';
56 public const CLICK = 'click';
57 public const FOCUS = 'focus';
58
59 /**
60 * Tooltip content (HTML or text).
61 *
62 * @var string
63 */
64 protected $content = '';
65
66 /**
67 * Tooltip placement (top|bottom|start|end).
68 *
69 * @var string
70 */
71 protected $placement = self::PLACEMENT_TOP;
72
73 /**
74 * Tooltip size (small|medium|large).
75 *
76 * @var string
77 */
78 protected $size = Size::SMALL;
79
80 /**
81 * Arrow alignment (start|center|end).
82 *
83 * @var string
84 */
85 protected $arrow = self::ARROW_START;
86
87 /**
88 * Tooltip trigger type (hover|focus|click).
89 *
90 * @var string
91 */
92 protected $trigger = self::HOVER;
93
94 /**
95 * The element that triggers the tooltip.
96 *
97 * @var string
98 */
99 protected $trigger_element = '';
100
101 /**
102 * Distance from the trigger in pixels.
103 *
104 * @var int
105 */
106 protected $offset = 8;
107
108 /**
109 * Delay in milliseconds for showing/hiding.
110 *
111 * @var array
112 */
113 protected $delay = array(
114 'show' => 0,
115 'hide' => 0,
116 );
117
118 /**
119 * Set and sanitize the tooltip content.
120 *
121 * @param string $content HTML or text content.
122 * @param array<string, array<string, bool>> $extra_tags Optional.
123 * Additional HTML tags and attributes in KSES-compatible format.
124 *
125 * @return $this
126 */
127 public function content( string $content, $extra_tags = array() ): self {
128
129 $this->content = wp_kses( $content, $this->get_allowed_html_tags( $extra_tags ) );
130 return $this;
131 }
132
133 /**
134 * Set the tooltip placement.
135 *
136 * @param string $placement top|bottom|start|end.
137 *
138 * @return $this
139 */
140 public function placement( string $placement ): self {
141 $allowed = array(
142 self::PLACEMENT_TOP,
143 self::PLACEMENT_BOTTOM,
144 self::PLACEMENT_START,
145 self::PLACEMENT_END,
146 );
147 if ( in_array( $placement, $allowed, true ) ) {
148 $this->placement = $placement;
149 }
150 return $this;
151 }
152
153 /**
154 * Set the tooltip size.
155 *
156 * @param string $size small|large.
157 *
158 * @return $this
159 */
160 public function size( string $size ): self {
161 $allowed = array( Size::SMALL, Size::MEDIUM, Size::LARGE );
162 if ( in_array( $size, $allowed, true ) ) {
163 $this->size = $size;
164 }
165 return $this;
166 }
167
168 /**
169 * Set the arrow alignment.
170 *
171 * @param string $arrow start|center|end.
172 *
173 * @return $this
174 */
175 public function arrow( string $arrow ): self {
176 $allowed = array(
177 self::ARROW_START,
178 self::ARROW_CENTER,
179 self::ARROW_END,
180 );
181 if ( in_array( $arrow, $allowed, true ) ) {
182 $this->arrow = $arrow;
183 }
184 return $this;
185 }
186
187 /**
188 * Set the trigger type.
189 *
190 * @param string $trigger hover|focus|click.
191 *
192 * @return $this
193 */
194 public function trigger_on( string $trigger ): self {
195 $allowed = array(
196 self::HOVER,
197 self::FOCUS,
198 self::CLICK,
199 );
200 if ( in_array( $trigger, $allowed, true ) ) {
201 $this->trigger = $trigger;
202 }
203 return $this;
204 }
205
206 /**
207 * Set the element that triggers the tooltip.
208 *
209 * @param string $trigger_element HTML for the trigger element.
210 *
211 * @return $this
212 */
213 public function trigger_element( string $trigger_element ): self {
214 $this->trigger_element = $trigger_element;
215 return $this;
216 }
217
218 /**
219 * Set the offset.
220 *
221 * @param int $offset Distance in pixels.
222 *
223 * @return $this
224 */
225 public function offset( int $offset ): self {
226 $this->offset = $offset;
227 return $this;
228 }
229
230 /**
231 * Set the show and hide delay.
232 *
233 * @param int $show Show delay in ms.
234 * @param int $hide Hide delay in ms.
235 *
236 * @return $this
237 */
238 public function delay( int $show, int $hide = 0 ): self {
239 $this->delay = array(
240 'show' => $show,
241 'hide' => $hide,
242 );
243 return $this;
244 }
245
246 /**
247 * Get the final tooltip HTML.
248 *
249 * @return string HTML output.
250 */
251 public function get(): string {
252 $config = array(
253 'placement' => $this->placement,
254 'trigger' => $this->trigger,
255 'size' => $this->size,
256 'arrow' => $this->arrow,
257 'offset' => $this->offset,
258 'delay' => $this->delay,
259 );
260
261 // Prepare x-data dynamic config.
262 $x_data = sprintf( 'tutorTooltip(%s)', wp_json_encode( $config ) );
263
264 $trigger_html = $this->trigger_element;
265
266 $this->component_string = sprintf(
267 '<div x-data="%1$s" x-ref="trigger" class="tutor-tooltip-wrap %2$s" %3$s>
268 %4$s
269 <template x-teleport="body">
270 <div x-ref="content" x-show="open" x-cloak x-transition class="tutor-tooltip">
271 %5$s
272 </div>
273 </template>
274 </div>',
275 esc_attr( $x_data ),
276 esc_attr( $this->attributes['class'] ?? '' ),
277 $this->get_attributes_string(),
278 $trigger_html,
279 $this->content
280 );
281
282 return $this->component_string;
283 }
284 }
285