PluginProbe
ThinkRank AI SEO – AI SEO Plugin for WordPress: Schema, XML Sitemaps, Meta Tags, Search Console & Local SEO / 1.0.0
ThinkRank AI SEO – AI SEO Plugin for WordPress: Schema, XML Sitemaps, Meta Tags, Search Console & Local SEO v1.0.0
2.7.0 2.6.0 2.5.0 2.4.0 2.3.0 2.2.0 2.1.1 2.1.0 2.0.2 2.0.1 2.0.0 1.32.0 1.31.0 1.30.0 1.29.0 1.28.0 1.27.0 1.26.0 1.25.0 trunk 1.0.0 1.0.1 1.0.2 1.1.0 1.10.0 All 48 releases
thinkrank / src / admin / styles / _utilities.scss

_utilities.scss in ThinkRank AI SEO – AI SEO Plugin for WordPress: Schema, XML Sitemaps, Meta Tags, Search Console & Local SEO 1.0.0, at src/admin/styles/_utilities.scss

790 lines 34.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * Utility Classes
3 *
4 * Tailwind-inspired utility classes for rapid development
5 * All utilities are prefixed with 'thinkrank-' to avoid conflicts
6 *
7 * @package ThinkRank
8 * @since 1.0.0
9 */
10
11 // Import shared variables for access to design tokens
12 @use '../../shared/styles/variables' as *;
13
14 /* ==========================================================================
15 SPACING UTILITIES
16 ========================================================================== */
17
18 // Generate spacing utilities using the spacing scale
19 @each $key, $value in $spacing-scale {
20 // Margin utilities
21 .thinkrank-m-#{$key} { margin: #{$value} !important; }
22 .thinkrank-mt-#{$key} { margin-top: #{$value} !important; }
23 .thinkrank-mb-#{$key} { margin-bottom: #{$value} !important; }
24 .thinkrank-ml-#{$key} { margin-left: #{$value} !important; }
25 .thinkrank-mr-#{$key} { margin-right: #{$value} !important; }
26 .thinkrank-mx-#{$key} {
27 margin-left: #{$value} !important;
28 margin-right: #{$value} !important;
29 }
30 .thinkrank-my-#{$key} {
31 margin-top: #{$value} !important;
32 margin-bottom: #{$value} !important;
33 }
34
35 // Padding utilities
36 .thinkrank-p-#{$key} { padding: #{$value} !important; }
37 .thinkrank-pt-#{$key} { padding-top: #{$value} !important; }
38 .thinkrank-pb-#{$key} { padding-bottom: #{$value} !important; }
39 .thinkrank-pl-#{$key} { padding-left: #{$value} !important; }
40 .thinkrank-pr-#{$key} { padding-right: #{$value} !important; }
41 .thinkrank-px-#{$key} {
42 padding-left: #{$value} !important;
43 padding-right: #{$value} !important;
44 }
45 .thinkrank-py-#{$key} {
46 padding-top: #{$value} !important;
47 padding-bottom: #{$value} !important;
48 }
49 }
50
51 // Auto margins
52 .thinkrank-m-auto { margin: auto !important; }
53 .thinkrank-mx-auto { margin-left: auto !important; margin-right: auto !important; }
54 .thinkrank-my-auto { margin-top: auto !important; margin-bottom: auto !important; }
55
56 // Space between utilities (for child elements)
57 .thinkrank-space-y-1 > * + * { margin-top: 0.25rem !important; }
58 .thinkrank-space-y-2 > * + * { margin-top: 0.5rem !important; }
59 .thinkrank-space-y-3 > * + * { margin-top: 0.75rem !important; }
60 .thinkrank-space-y-4 > * + * { margin-top: 1rem !important; }
61 .thinkrank-space-y-6 > * + * { margin-top: 1.5rem !important; }
62 .thinkrank-space-x-1 > * + * { margin-left: 0.25rem !important; }
63 .thinkrank-space-x-2 > * + * { margin-left: 0.5rem !important; }
64 .thinkrank-space-x-3 > * + * { margin-left: 0.75rem !important; }
65
66 /* ==========================================================================
67 LAYOUT UTILITIES
68 ========================================================================== */
69
70 // Display utilities
71 .thinkrank-block { display: block !important; }
72 .thinkrank-inline-block { display: inline-block !important; }
73 .thinkrank-inline { display: inline !important; }
74 .thinkrank-flex { display: flex !important; }
75 .thinkrank-inline-flex { display: inline-flex !important; }
76 .thinkrank-grid { display: grid !important; }
77 .thinkrank-inline-grid { display: inline-grid !important; }
78 .thinkrank-hidden { display: none !important; }
79
80 // Position utilities
81 .thinkrank-static { position: static !important; }
82 .thinkrank-relative { position: relative !important; }
83 .thinkrank-absolute { position: absolute !important; }
84 .thinkrank-fixed { position: fixed !important; }
85 .thinkrank-sticky { position: sticky !important; }
86
87 // Position values
88 .thinkrank-top-0 { top: 0 !important; }
89 .thinkrank-top-3 { top: 0.75rem !important; }
90 .thinkrank-top-4 { top: 1rem !important; }
91 .thinkrank-top-6 { top: 1.5rem !important; }
92 .thinkrank-right-0 { right: 0 !important; }
93 .thinkrank-right-3 { right: 0.75rem !important; }
94 .thinkrank-right-4 { right: 1rem !important; }
95 .thinkrank-bottom-0 { bottom: 0 !important; }
96 .thinkrank-left-0 { left: 0 !important; }
97
98 // Z-index utilities
99 .thinkrank-z-10 { z-index: 10 !important; }
100
101 // Focus utilities
102 .thinkrank-focus\:border-blue:focus { border-color: $primary-blue !important; }
103 .thinkrank-focus\:ring-2:focus {
104 box-shadow: 0 0 0 2px rgba($primary-blue, 0.2) !important;
105 }
106 .thinkrank-focus\:ring-blue:focus {
107 --thinkrank-ring-color: #{$primary-blue};
108 }
109 .thinkrank-focus\:ring-opacity-20:focus {
110 --thinkrank-ring-opacity: 0.2;
111 }
112
113 // Min height utilities
114 .thinkrank-min-h-32 { min-height: 8rem !important; }
115
116 // Animation utilities
117 .thinkrank-animate-spin {
118 animation: thinkrank-spin 1s linear infinite !important;
119 }
120
121 @keyframes thinkrank-spin {
122 from { transform: rotate(0deg); }
123 to { transform: rotate(360deg); }
124 }
125
126 // Screen reader utilities
127 .thinkrank-sr-only {
128 position: absolute !important;
129 width: 1px !important;
130 height: 1px !important;
131 padding: 0 !important;
132 margin: -1px !important;
133 overflow: hidden !important;
134 clip: rect(0, 0, 0, 0) !important;
135 white-space: nowrap !important;
136 border: 0 !important;
137 }
138
139 // Additional utilities for AI components
140 .thinkrank-max-w-lg { max-width: 32rem !important; }
141 .thinkrank-max-w-sm { max-width: 24rem !important; }
142 .thinkrank-max-h-80 { max-height: 20rem !important; }
143 .thinkrank-max-h-96 { max-height: 24rem !important; }
144 .thinkrank-max-h-160 { max-height: 40rem !important; }
145 .thinkrank-max-h-screen-75 { max-height: 75vh !important; }
146 .thinkrank-overflow-y-auto { overflow-y: auto !important; }
147 .thinkrank-leading-tight { line-height: 1.25 !important; }
148 .thinkrank-leading-relaxed { line-height: 1.625 !important; }
149 .thinkrank-font-mono { font-family: ui-monospace, SFMono-Regular, "SF Mono", Consolas, "Liberation Mono", Menlo, monospace !important; }
150 .thinkrank-space-y-2 > * + * { margin-top: 0.5rem !important; }
151 .thinkrank-space-y-3 > * + * { margin-top: 0.75rem !important; }
152 .thinkrank-truncate {
153 overflow: hidden !important;
154 text-overflow: ellipsis !important;
155 white-space: nowrap !important;
156 }
157 .thinkrank-py-0\.5 { padding-top: 0.125rem !important; padding-bottom: 0.125rem !important; }
158 .thinkrank-h-6 { height: 1.5rem !important; }
159 .thinkrank-w-3 { width: 0.75rem !important; }
160 .thinkrank-h-3 { height: 0.75rem !important; }
161
162 // Hover utilities
163 .hover\:thinkrank-underline:hover { text-decoration: underline !important; }
164 .hover\:thinkrank-text-gray-700:hover { color: $gray-700 !important; }
165 .hover\:thinkrank-text-red-dark:hover { color: $error-red !important; }
166
167 /* ==========================================================================
168 FLEXBOX UTILITIES
169 ========================================================================== */
170
171 // Flex direction
172 .thinkrank-flex-row { flex-direction: row !important; }
173 .thinkrank-flex-row-reverse { flex-direction: row-reverse !important; }
174 .thinkrank-flex-col { flex-direction: column !important; }
175 .thinkrank-flex-col-reverse { flex-direction: column-reverse !important; }
176
177 // Flex wrap
178 .thinkrank-flex-wrap { flex-wrap: wrap !important; }
179 .thinkrank-flex-wrap-reverse { flex-wrap: wrap-reverse !important; }
180 .thinkrank-flex-nowrap { flex-wrap: nowrap !important; }
181
182 // Flex grow/shrink
183 .thinkrank-flex-1 { flex: 1 1 0% !important; }
184 .thinkrank-flex-auto { flex: 1 1 auto !important; }
185 .thinkrank-flex-initial { flex: 0 1 auto !important; }
186 .thinkrank-flex-none { flex: none !important; }
187 .thinkrank-flex-grow { flex-grow: 1 !important; }
188 .thinkrank-flex-grow-0 { flex-grow: 0 !important; }
189 .thinkrank-flex-shrink { flex-shrink: 1 !important; }
190 .thinkrank-flex-shrink-0 { flex-shrink: 0 !important; }
191
192 // Justify content
193 .thinkrank-justify-start { justify-content: flex-start !important; }
194 .thinkrank-justify-end { justify-content: flex-end !important; }
195 .thinkrank-justify-center { justify-content: center !important; }
196 .thinkrank-justify-between { justify-content: space-between !important; }
197 .thinkrank-justify-around { justify-content: space-around !important; }
198 .thinkrank-justify-evenly { justify-content: space-evenly !important; }
199
200 // Align items
201 .thinkrank-items-start { align-items: flex-start !important; }
202 .thinkrank-items-end { align-items: flex-end !important; }
203 .thinkrank-items-center { align-items: center !important; }
204 .thinkrank-items-baseline { align-items: baseline !important; }
205 .thinkrank-items-stretch { align-items: stretch !important; }
206
207 // Align content
208 .thinkrank-content-start { align-content: flex-start !important; }
209 .thinkrank-content-end { align-content: flex-end !important; }
210 .thinkrank-content-center { align-content: center !important; }
211 .thinkrank-content-between { align-content: space-between !important; }
212 .thinkrank-content-around { align-content: space-around !important; }
213 .thinkrank-content-evenly { align-content: space-evenly !important; }
214
215 // Align self
216 .thinkrank-self-auto { align-self: auto !important; }
217 .thinkrank-self-start { align-self: flex-start !important; }
218 .thinkrank-self-end { align-self: flex-end !important; }
219 .thinkrank-self-center { align-self: center !important; }
220 .thinkrank-self-stretch { align-self: stretch !important; }
221 .thinkrank-self-baseline { align-self: baseline !important; }
222
223 /* ==========================================================================
224 GRID UTILITIES
225 ========================================================================== */
226
227 // Grid template columns
228 .thinkrank-grid-cols-1 { grid-template-columns: repeat(1, 1fr) !important; }
229 .thinkrank-grid-cols-2 { grid-template-columns: repeat(2, 1fr) !important; }
230 .thinkrank-grid-cols-3 { grid-template-columns: repeat(3, 1fr) !important; }
231 .thinkrank-grid-cols-4 { grid-template-columns: repeat(4, 1fr) !important; }
232 .thinkrank-grid-cols-5 { grid-template-columns: repeat(5, 1fr) !important; }
233 .thinkrank-grid-cols-6 { grid-template-columns: repeat(6, 1fr) !important; }
234 .thinkrank-grid-cols-none { grid-template-columns: none !important; }
235
236 // Grid template rows
237 .thinkrank-grid-rows-1 { grid-template-rows: repeat(1, 1fr) !important; }
238 .thinkrank-grid-rows-2 { grid-template-rows: repeat(2, 1fr) !important; }
239 .thinkrank-grid-rows-3 { grid-template-rows: repeat(3, 1fr) !important; }
240 .thinkrank-grid-rows-4 { grid-template-rows: repeat(4, 1fr) !important; }
241 .thinkrank-grid-rows-none { grid-template-rows: none !important; }
242
243 // Grid column span utilities
244 .thinkrank-col-span-1 { grid-column: span 1 / span 1 !important; }
245 .thinkrank-col-span-2 { grid-column: span 2 / span 2 !important; }
246 .thinkrank-col-span-3 { grid-column: span 3 / span 3 !important; }
247 .thinkrank-col-span-full { grid-column: 1 / -1 !important; }
248
249 // Responsive grid column span utilities
250 .thinkrank-col-span-1-lg { grid-column: span 1 / span 1 !important; }
251 .thinkrank-col-span-2-lg { grid-column: span 2 / span 2 !important; }
252
253 // Grid column span
254 .thinkrank-col-auto { grid-column: auto !important; }
255 .thinkrank-col-span-1 { grid-column: span 1 / span 1 !important; }
256 .thinkrank-col-span-2 { grid-column: span 2 / span 2 !important; }
257 .thinkrank-col-span-3 { grid-column: span 3 / span 3 !important; }
258 .thinkrank-col-span-4 { grid-column: span 4 / span 4 !important; }
259 .thinkrank-col-span-5 { grid-column: span 5 / span 5 !important; }
260 .thinkrank-col-span-6 { grid-column: span 6 / span 6 !important; }
261 .thinkrank-col-span-full { grid-column: 1 / -1 !important; }
262
263 // Grid row span
264 .thinkrank-row-auto { grid-row: auto !important; }
265 .thinkrank-row-span-1 { grid-row: span 1 / span 1 !important; }
266 .thinkrank-row-span-2 { grid-row: span 2 / span 2 !important; }
267 .thinkrank-row-span-3 { grid-row: span 3 / span 3 !important; }
268 .thinkrank-row-span-4 { grid-row: span 4 / span 4 !important; }
269 .thinkrank-row-span-full { grid-row: 1 / -1 !important; }
270
271 // Gap utilities
272 .thinkrank-gap-0 { gap: 0 !important; }
273 .thinkrank-gap-1 { gap: $spacing-xs !important; }
274 .thinkrank-gap-2 { gap: $spacing-sm !important; }
275 .thinkrank-gap-3 { gap: $spacing-md !important; }
276 .thinkrank-gap-4 { gap: $spacing-lg !important; }
277 .thinkrank-gap-5 { gap: $spacing-xl !important; }
278 .thinkrank-gap-6 { gap: $spacing-2xl !important; }
279 .thinkrank-gap-8 { gap: $spacing-3xl !important; }
280
281 // Gap x/y utilities
282 .thinkrank-gap-x-0 { column-gap: 0 !important; }
283 .thinkrank-gap-x-1 { column-gap: $spacing-xs !important; }
284 .thinkrank-gap-x-2 { column-gap: $spacing-sm !important; }
285 .thinkrank-gap-x-3 { column-gap: $spacing-md !important; }
286 .thinkrank-gap-x-4 { column-gap: $spacing-lg !important; }
287 .thinkrank-gap-x-6 { column-gap: $spacing-2xl !important; }
288
289 .thinkrank-gap-y-0 { row-gap: 0 !important; }
290 .thinkrank-gap-y-1 { row-gap: $spacing-xs !important; }
291 .thinkrank-gap-y-2 { row-gap: $spacing-sm !important; }
292 .thinkrank-gap-y-3 { row-gap: $spacing-md !important; }
293 .thinkrank-gap-y-4 { row-gap: $spacing-lg !important; }
294 .thinkrank-gap-y-6 { row-gap: $spacing-2xl !important; }
295
296 /* ==========================================================================
297 WIDTH & HEIGHT UTILITIES
298 ========================================================================== */
299
300 // Width utilities
301 .thinkrank-w-auto { width: auto !important; }
302 .thinkrank-w-full { width: 100% !important; }
303 .thinkrank-w-screen { width: 100vw !important; }
304 .thinkrank-w-min { width: min-content !important; }
305 .thinkrank-w-max { width: max-content !important; }
306 .thinkrank-w-fit { width: fit-content !important; }
307
308 // Fixed width utilities
309 .thinkrank-w-3 { width: 0.75rem !important; } // 12px
310 .thinkrank-w-4 { width: 1rem !important; } // 16px
311 .thinkrank-w-5 { width: 1.25rem !important; } // 20px
312 .thinkrank-w-8 { width: 2rem !important; } // 32px
313 .thinkrank-w-10 { width: 2.5rem !important; } // 40px
314 .thinkrank-w-16 { width: 4rem !important; } // 64px
315
316 // Height utilities
317 .thinkrank-h-auto { height: auto !important; }
318 .thinkrank-h-full { height: 100% !important; }
319 .thinkrank-h-screen { height: 100vh !important; }
320
321 // Fixed height utilities
322 .thinkrank-h-3 { height: 0.75rem !important; } // 12px
323 .thinkrank-h-4 { height: 1rem !important; } // 16px
324 .thinkrank-h-5 { height: 1.25rem !important; } // 20px
325 .thinkrank-h-8 { height: 2rem !important; } // 32px
326 .thinkrank-h-10 { height: 2.5rem !important; } // 40px
327 .thinkrank-h-16 { height: 4rem !important; } // 64px
328 .thinkrank-h-min { height: min-content !important; }
329 .thinkrank-h-max { height: max-content !important; }
330 .thinkrank-h-fit { height: fit-content !important; }
331
332 // Min/Max width
333 .thinkrank-min-w-0 { min-width: 0 !important; }
334 .thinkrank-min-w-full { min-width: 100% !important; }
335 .thinkrank-max-w-none { max-width: none !important; }
336 .thinkrank-max-w-full { max-width: 100% !important; }
337
338 // Min/Max height
339 .thinkrank-min-h-0 { min-height: 0 !important; }
340 .thinkrank-min-h-full { min-height: 100% !important; }
341 .thinkrank-max-h-full { max-height: 100% !important; }
342 .thinkrank-max-h-screen { max-height: 100vh !important; }
343
344 /* ==========================================================================
345 TEXT UTILITIES
346 ========================================================================== */
347
348 // Text alignment
349 .thinkrank-text-left { text-align: left !important; }
350 .thinkrank-text-center { text-align: center !important; }
351 .thinkrank-text-right { text-align: right !important; }
352 .thinkrank-text-justify { text-align: justify !important; }
353
354 // Font sizes
355 .thinkrank-text-xs { font-size: $font-size-xs !important; }
356 .thinkrank-text-sm { font-size: $font-size-sm !important; }
357 .thinkrank-text-base { font-size: $font-size-base !important; }
358 .thinkrank-text-lg { font-size: $font-size-lg !important; }
359 .thinkrank-text-xl { font-size: $font-size-xl !important; }
360 .thinkrank-text-2xl { font-size: $font-size-2xl !important; }
361 .thinkrank-text-3xl { font-size: $font-size-3xl !important; }
362
363 // Font weights
364 .thinkrank-font-normal { font-weight: $font-weight-normal !important; }
365 .thinkrank-font-medium { font-weight: $font-weight-medium !important; }
366 .thinkrank-font-semibold { font-weight: $font-weight-semibold !important; }
367 .thinkrank-font-bold { font-weight: $font-weight-bold !important; }
368
369 // Line heights
370 .thinkrank-leading-tight { line-height: $line-height-tight !important; }
371 .thinkrank-leading-normal { line-height: $line-height-normal !important; }
372 .thinkrank-leading-relaxed { line-height: $line-height-relaxed !important; }
373
374 // Text colors using design tokens
375 .thinkrank-text-primary { color: $text-primary !important; }
376 .thinkrank-text-secondary { color: $text-secondary !important; }
377 .thinkrank-text-tertiary { color: $text-tertiary !important; }
378 .thinkrank-text-muted { color: $text-muted !important; }
379 .thinkrank-text-white { color: $white !important; }
380
381 // Brand text colors
382 .thinkrank-text-blue { color: $primary-blue !important; }
383 .thinkrank-text-green { color: $success-green !important; }
384 .thinkrank-text-orange { color: $warning-orange !important; }
385 .thinkrank-text-red { color: $error-red !important; }
386
387 // Provider colors
388 .thinkrank-text-openai { color: $openai-green !important; }
389 .thinkrank-text-claude { color: $claude-orange !important; }
390
391 // Text utilities
392 .thinkrank-whitespace-pre-wrap { white-space: pre-wrap !important; }
393 .thinkrank-overflow-x-auto { overflow-x: auto !important; }
394 .thinkrank-truncate {
395 overflow: hidden !important;
396 text-overflow: ellipsis !important;
397 white-space: nowrap !important;
398 }
399
400 // List utilities
401 .thinkrank-list-disc { list-style-type: disc !important; }
402 .thinkrank-list-inside { list-style-position: inside !important; }
403
404 /* ==========================================================================
405 BACKGROUND UTILITIES
406 ========================================================================== */
407
408 // Background colors
409 .thinkrank-bg-transparent { background-color: transparent !important; }
410 .thinkrank-bg-white { background-color: $white !important; }
411 .thinkrank-bg-gray-50 { background-color: $gray-50 !important; }
412 .thinkrank-bg-gray-100 { background-color: $gray-100 !important; }
413 .thinkrank-bg-gray-200 { background-color: $gray-200 !important; }
414
415 // Brand background colors
416 .thinkrank-bg-blue { background-color: $primary-blue !important; }
417 .thinkrank-bg-green { background-color: $success-green !important; }
418 .thinkrank-bg-orange { background-color: $warning-orange !important; }
419 .thinkrank-bg-red { background-color: $error-red !important; }
420 .thinkrank-bg-purple { background-color: $purple !important; }
421
422 // Provider background colors
423 .thinkrank-bg-openai { background-color: $openai-green !important; }
424 .thinkrank-bg-claude { background-color: $claude-orange !important; }
425
426 // Background opacity utilities (using CSS custom properties for flexibility)
427 .thinkrank-bg-opacity-5 { --thinkrank-bg-opacity: 0.05; }
428 .thinkrank-bg-opacity-10 { --thinkrank-bg-opacity: 0.1; }
429 .thinkrank-bg-opacity-20 { --thinkrank-bg-opacity: 0.2; }
430 .thinkrank-bg-opacity-50 { --thinkrank-bg-opacity: 0.5; }
431
432 // Background color with opacity combinations
433 .thinkrank-bg-blue.thinkrank-bg-opacity-5 { background-color: rgba(59, 130, 246, 0.05) !important; }
434 .thinkrank-bg-blue.thinkrank-bg-opacity-10 { background-color: rgba(59, 130, 246, 0.1) !important; }
435 .thinkrank-bg-blue.thinkrank-bg-opacity-20 { background-color: rgba(59, 130, 246, 0.2) !important; }
436 .thinkrank-bg-green.thinkrank-bg-opacity-5 { background-color: rgba(34, 197, 94, 0.05) !important; }
437 .thinkrank-bg-green.thinkrank-bg-opacity-10 { background-color: rgba(34, 197, 94, 0.1) !important; }
438 .thinkrank-bg-orange.thinkrank-bg-opacity-5 { background-color: rgba(249, 115, 22, 0.05) !important; }
439 .thinkrank-bg-orange.thinkrank-bg-opacity-10 { background-color: rgba(249, 115, 22, 0.1) !important; }
440 .thinkrank-bg-orange.thinkrank-bg-opacity-20 { background-color: rgba(249, 115, 22, 0.2) !important; }
441 .thinkrank-bg-purple.thinkrank-bg-opacity-5 { background-color: rgba(147, 51, 234, 0.05) !important; }
442 .thinkrank-bg-purple.thinkrank-bg-opacity-10 { background-color: rgba(147, 51, 234, 0.1) !important; }
443 .thinkrank-bg-purple.thinkrank-bg-opacity-20 { background-color: rgba(147, 51, 234, 0.2) !important; }
444
445 // Add yellow background color
446 .thinkrank-bg-yellow { background-color: $warning-orange !important; }
447
448 /* ==========================================================================
449 BORDER UTILITIES
450 ========================================================================== */
451
452 // Border width
453 .thinkrank-border-0 { border-width: 0 !important; }
454 .thinkrank-border { border-width: 1px !important; }
455 .thinkrank-border-2 { border-width: 2px !important; }
456 .thinkrank-border-t { border-top-width: 1px !important; }
457 .thinkrank-border-b { border-bottom-width: 1px !important; }
458 .thinkrank-border-l { border-left-width: 1px !important; }
459 .thinkrank-border-r { border-right-width: 1px !important; }
460
461 // Border colors
462 .thinkrank-border-transparent { border-color: transparent !important; }
463 .thinkrank-border-light { border-color: $border-light !important; }
464 .thinkrank-border-medium { border-color: $border-medium !important; }
465 .thinkrank-border-dark { border-color: $border-dark !important; }
466
467 // Brand border colors
468 .thinkrank-border-blue { border-color: $primary-blue !important; }
469 .thinkrank-border-green { border-color: $success-green !important; }
470 .thinkrank-border-orange { border-color: $warning-orange !important; }
471 .thinkrank-border-red { border-color: $error-red !important; }
472 .thinkrank-border-purple { border-color: $purple !important; }
473
474 // Border opacity utilities
475 .thinkrank-border-opacity-10 { --thinkrank-border-opacity: 0.1; }
476 .thinkrank-border-opacity-20 { --thinkrank-border-opacity: 0.2; }
477 .thinkrank-border-opacity-50 { --thinkrank-border-opacity: 0.5; }
478
479 // Border color with opacity combinations
480 .thinkrank-border-blue.thinkrank-border-opacity-20 { border-color: rgba(59, 130, 246, 0.2) !important; }
481 .thinkrank-border-green.thinkrank-border-opacity-20 { border-color: rgba(34, 197, 94, 0.2) !important; }
482
483 // Border left width utilities
484 .thinkrank-border-l-4 { border-left-width: 4px !important; }
485
486 // Border radius
487 .thinkrank-rounded-none { border-radius: 0 !important; }
488 .thinkrank-rounded-sm { border-radius: $radius-sm !important; }
489 .thinkrank-rounded { border-radius: $radius-md !important; }
490 .thinkrank-rounded-md { border-radius: $radius-md !important; }
491 .thinkrank-rounded-lg { border-radius: $radius-lg !important; }
492 .thinkrank-rounded-xl { border-radius: $radius-xl !important; }
493 .thinkrank-rounded-2xl { border-radius: $radius-2xl !important; }
494 .thinkrank-rounded-3xl { border-radius: $radius-3xl !important; }
495 .thinkrank-rounded-full { border-radius: $radius-full !important; }
496
497 /* ==========================================================================
498 SHADOW UTILITIES
499 ========================================================================== */
500
501 .thinkrank-shadow-none { box-shadow: none !important; }
502 .thinkrank-shadow-sm { box-shadow: $shadow-sm !important; }
503 .thinkrank-shadow { box-shadow: $shadow-md !important; }
504 .thinkrank-shadow-md { box-shadow: $shadow-md !important; }
505 .thinkrank-shadow-lg { box-shadow: $shadow-lg !important; }
506 .thinkrank-shadow-xl { box-shadow: $shadow-xl !important; }
507 .thinkrank-shadow-2xl { box-shadow: $shadow-2xl !important; }
508
509 /* ==========================================================================
510 RESPONSIVE UTILITIES
511 ========================================================================== */
512
513 // Mobile-first responsive utilities (xs: 0-575px)
514 @media (max-width: #{$breakpoint-sm - 1px}) {
515 // Display utilities
516 .thinkrank-hidden-xs { display: none !important; }
517 .thinkrank-block-xs { display: block !important; }
518 .thinkrank-flex-xs { display: flex !important; }
519 .thinkrank-grid-xs { display: grid !important; }
520
521 // Flexbox utilities
522 .thinkrank-flex-col-xs { flex-direction: column !important; }
523 .thinkrank-flex-row-xs { flex-direction: row !important; }
524 .thinkrank-items-center-xs { align-items: center !important; }
525 .thinkrank-items-start-xs { align-items: flex-start !important; }
526 .thinkrank-justify-center-xs { justify-content: center !important; }
527 .thinkrank-justify-between-xs { justify-content: space-between !important; }
528
529 // Grid utilities
530 .thinkrank-grid-cols-1-xs { grid-template-columns: repeat(1, 1fr) !important; }
531 .thinkrank-grid-cols-2-xs { grid-template-columns: repeat(2, 1fr) !important; }
532 .thinkrank-gap-2-xs { gap: $spacing-sm !important; }
533 .thinkrank-gap-4-xs { gap: $spacing-lg !important; }
534
535 // Text utilities
536 .thinkrank-text-center-xs { text-align: center !important; }
537 .thinkrank-text-left-xs { text-align: left !important; }
538 .thinkrank-text-sm-xs { font-size: $font-size-sm !important; }
539 .thinkrank-text-xs-xs { font-size: $font-size-xs !important; }
540
541 // Spacing utilities
542 .thinkrank-p-2-xs { padding: $spacing-sm !important; }
543 .thinkrank-p-4-xs { padding: $spacing-lg !important; }
544 .thinkrank-px-4-xs { padding-left: $spacing-lg !important; padding-right: $spacing-lg !important; }
545 .thinkrank-py-4-xs { padding-top: $spacing-lg !important; padding-bottom: $spacing-lg !important; }
546 .thinkrank-m-2-xs { margin: $spacing-sm !important; }
547 .thinkrank-m-4-xs { margin: $spacing-lg !important; }
548 .thinkrank-mb-4-xs { margin-bottom: $spacing-lg !important; }
549 .thinkrank-mt-4-xs { margin-top: $spacing-lg !important; }
550
551 // Width utilities
552 .thinkrank-w-full-xs { width: 100% !important; }
553 .thinkrank-w-auto-xs { width: auto !important; }
554 }
555
556 // Small devices (sm: 576px and up)
557 @media (min-width: $breakpoint-sm) {
558 // Display utilities
559 .thinkrank-hidden-sm { display: none !important; }
560 .thinkrank-block-sm { display: block !important; }
561 .thinkrank-flex-sm { display: flex !important; }
562 .thinkrank-grid-sm { display: grid !important; }
563
564 // Flexbox utilities
565 .thinkrank-flex-col-sm { flex-direction: column !important; }
566 .thinkrank-flex-row-sm { flex-direction: row !important; }
567 .thinkrank-items-center-sm { align-items: center !important; }
568 .thinkrank-items-start-sm { align-items: flex-start !important; }
569 .thinkrank-justify-center-sm { justify-content: center !important; }
570 .thinkrank-justify-between-sm { justify-content: space-between !important; }
571
572 // Grid utilities
573 .thinkrank-grid-cols-1-sm { grid-template-columns: repeat(1, 1fr) !important; }
574 .thinkrank-grid-cols-2-sm { grid-template-columns: repeat(2, 1fr) !important; }
575 .thinkrank-grid-cols-3-sm { grid-template-columns: repeat(3, 1fr) !important; }
576 .thinkrank-gap-4-sm { gap: $spacing-lg !important; }
577 .thinkrank-gap-6-sm { gap: $spacing-2xl !important; }
578
579 // Text utilities
580 .thinkrank-text-center-sm { text-align: center !important; }
581 .thinkrank-text-left-sm { text-align: left !important; }
582 .thinkrank-text-base-sm { font-size: $font-size-base !important; }
583
584 // Spacing utilities
585 .thinkrank-p-6-sm { padding: $spacing-2xl !important; }
586 .thinkrank-px-6-sm { padding-left: $spacing-2xl !important; padding-right: $spacing-2xl !important; }
587 .thinkrank-py-6-sm { padding-top: $spacing-2xl !important; padding-bottom: $spacing-2xl !important; }
588 }
589
590 // Medium devices (md: 768px and up) - Tablet
591 @media (min-width: $breakpoint-md) {
592 // Display utilities
593 .thinkrank-hidden-md { display: none !important; }
594 .thinkrank-block-md { display: block !important; }
595 .thinkrank-flex-md { display: flex !important; }
596 .thinkrank-grid-md { display: grid !important; }
597
598 // Flexbox utilities
599 .thinkrank-flex-col-md { flex-direction: column !important; }
600 .thinkrank-flex-row-md { flex-direction: row !important; }
601 .thinkrank-items-center-md { align-items: center !important; }
602 .thinkrank-items-start-md { align-items: flex-start !important; }
603 .thinkrank-justify-center-md { justify-content: center !important; }
604 .thinkrank-justify-between-md { justify-content: space-between !important; }
605 .thinkrank-justify-start-md { justify-content: flex-start !important; }
606 .thinkrank-justify-end-md { justify-content: flex-end !important; }
607
608 // Grid utilities
609 .thinkrank-grid-cols-1-md { grid-template-columns: repeat(1, 1fr) !important; }
610 .thinkrank-grid-cols-2-md { grid-template-columns: repeat(2, 1fr) !important; }
611 .thinkrank-grid-cols-3-md { grid-template-columns: repeat(3, 1fr) !important; }
612 .thinkrank-grid-cols-4-md { grid-template-columns: repeat(4, 1fr) !important; }
613 .thinkrank-gap-6-md { gap: $spacing-2xl !important; }
614 .thinkrank-gap-8-md { gap: $spacing-3xl !important; }
615
616 // Text utilities
617 .thinkrank-text-center-md { text-align: center !important; }
618 .thinkrank-text-left-md { text-align: left !important; }
619 .thinkrank-text-lg-md { font-size: $font-size-lg !important; }
620
621 // Spacing utilities
622 .thinkrank-p-8-md { padding: $spacing-3xl !important; }
623 .thinkrank-px-8-md { padding-left: $spacing-3xl !important; padding-right: $spacing-3xl !important; }
624 .thinkrank-py-8-md { padding-top: $spacing-3xl !important; padding-bottom: $spacing-3xl !important; }
625
626 // Width utilities
627 .thinkrank-w-auto-md { width: auto !important; }
628 .thinkrank-w-1-2-md { width: 50% !important; }
629 .thinkrank-w-1-3-md { width: 33.333333% !important; }
630 .thinkrank-w-2-3-md { width: 66.666667% !important; }
631 .thinkrank-w-1-4-md { width: 25% !important; }
632 .thinkrank-w-3-4-md { width: 75% !important; }
633 }
634
635 // Large devices (lg: 1024px and up) - Desktop
636 @media (min-width: $breakpoint-lg) {
637 // Display utilities
638 .thinkrank-hidden-lg { display: none !important; }
639 .thinkrank-block-lg { display: block !important; }
640 .thinkrank-flex-lg { display: flex !important; }
641 .thinkrank-grid-lg { display: grid !important; }
642
643 // Flexbox utilities
644 .thinkrank-flex-col-lg { flex-direction: column !important; }
645 .thinkrank-flex-row-lg { flex-direction: row !important; }
646 .thinkrank-items-center-lg { align-items: center !important; }
647 .thinkrank-items-start-lg { align-items: flex-start !important; }
648 .thinkrank-justify-center-lg { justify-content: center !important; }
649 .thinkrank-justify-between-lg { justify-content: space-between !important; }
650 .thinkrank-justify-start-lg { justify-content: flex-start !important; }
651 .thinkrank-justify-end-lg { justify-content: flex-end !important; }
652
653 // Grid utilities
654 .thinkrank-grid-cols-1-lg { grid-template-columns: repeat(1, 1fr) !important; }
655 .thinkrank-grid-cols-2-lg { grid-template-columns: repeat(2, 1fr) !important; }
656 .thinkrank-grid-cols-3-lg { grid-template-columns: repeat(3, 1fr) !important; }
657 .thinkrank-grid-cols-4-lg { grid-template-columns: repeat(4, 1fr) !important; }
658 .thinkrank-grid-cols-5-lg { grid-template-columns: repeat(5, 1fr) !important; }
659 .thinkrank-grid-cols-6-lg { grid-template-columns: repeat(6, 1fr) !important; }
660 .thinkrank-gap-8-lg { gap: $spacing-3xl !important; }
661 .thinkrank-gap-10-lg { gap: $spacing-4xl !important; }
662
663 // Grid column span utilities for lg
664 .thinkrank-col-span-1-lg { grid-column: span 1 / span 1 !important; }
665 .thinkrank-col-span-2-lg { grid-column: span 2 / span 2 !important; }
666 .thinkrank-col-span-3-lg { grid-column: span 3 / span 3 !important; }
667
668 // Text utilities
669 .thinkrank-text-center-lg { text-align: center !important; }
670 .thinkrank-text-left-lg { text-align: left !important; }
671 .thinkrank-text-xl-lg { font-size: $font-size-xl !important; }
672 .thinkrank-text-2xl-lg { font-size: $font-size-2xl !important; }
673
674 // Spacing utilities
675 .thinkrank-p-10-lg { padding: $spacing-4xl !important; }
676 .thinkrank-px-10-lg { padding-left: $spacing-4xl !important; padding-right: $spacing-4xl !important; }
677 .thinkrank-py-10-lg { padding-top: $spacing-4xl !important; padding-bottom: $spacing-4xl !important; }
678 }
679
680 // Extra large devices (xl: 1200px and up) - Large Desktop
681 @media (min-width: $breakpoint-xl) {
682 // Display utilities
683 .thinkrank-hidden-xl { display: none !important; }
684 .thinkrank-block-xl { display: block !important; }
685 .thinkrank-flex-xl { display: flex !important; }
686 .thinkrank-grid-xl { display: grid !important; }
687
688 // Grid utilities
689 .thinkrank-grid-cols-5-xl { grid-template-columns: repeat(5, 1fr) !important; }
690 .thinkrank-grid-cols-6-xl { grid-template-columns: repeat(6, 1fr) !important; }
691 .thinkrank-gap-12-xl { gap: $spacing-5xl !important; }
692
693 // Text utilities
694 .thinkrank-text-3xl-xl { font-size: $font-size-3xl !important; }
695
696 // Spacing utilities
697 .thinkrank-p-12-xl { padding: $spacing-5xl !important; }
698 .thinkrank-px-12-xl { padding-left: $spacing-5xl !important; padding-right: $spacing-5xl !important; }
699 .thinkrank-py-12-xl { padding-top: $spacing-5xl !important; padding-bottom: $spacing-5xl !important; }
700 }
701
702 // Legacy responsive utilities (for backward compatibility)
703 @media (max-width: #{$breakpoint-md - 1px}) {
704 .thinkrank-hidden-mobile { display: none !important; }
705 .thinkrank-flex-col-mobile { flex-direction: column !important; }
706 .thinkrank-grid-cols-1-mobile { grid-template-columns: repeat(1, 1fr) !important; }
707 .thinkrank-text-center-mobile { text-align: center !important; }
708 .thinkrank-px-4-mobile { padding-left: $spacing-lg !important; padding-right: $spacing-lg !important; }
709 .thinkrank-py-4-mobile { padding-top: $spacing-lg !important; padding-bottom: $spacing-lg !important; }
710 .thinkrank-gap-4-mobile { gap: $spacing-lg !important; }
711 }
712
713 @media (min-width: $breakpoint-md) {
714 .thinkrank-hidden-desktop { display: none !important; }
715 .thinkrank-flex-row-desktop { flex-direction: row !important; }
716 .thinkrank-grid-cols-2-desktop { grid-template-columns: repeat(2, 1fr) !important; }
717 .thinkrank-grid-cols-3-desktop { grid-template-columns: repeat(3, 1fr) !important; }
718 .thinkrank-text-left-desktop { text-align: left !important; }
719 }
720
721 /* ==========================================================================
722 UTILITY COMBINATIONS (COMMON PATTERNS)
723 ========================================================================== */
724
725 // Common flex patterns
726 .thinkrank-flex-center {
727 display: flex !important;
728 align-items: center !important;
729 justify-content: center !important;
730 }
731
732 .thinkrank-flex-between {
733 display: flex !important;
734 align-items: center !important;
735 justify-content: space-between !important;
736 }
737
738 .thinkrank-flex-start {
739 display: flex !important;
740 align-items: center !important;
741 justify-content: flex-start !important;
742 }
743
744 .thinkrank-flex-end {
745 display: flex !important;
746 align-items: center !important;
747 justify-content: flex-end !important;
748 }
749
750 // Common text patterns
751 .thinkrank-truncate {
752 overflow: hidden !important;
753 text-overflow: ellipsis !important;
754 white-space: nowrap !important;
755 }
756
757 .thinkrank-break-words {
758 overflow-wrap: break-word !important;
759 word-break: break-word !important;
760 }
761
762 // Screen reader only
763 .thinkrank-sr-only {
764 position: absolute !important;
765 width: 1px !important;
766 height: 1px !important;
767 padding: 0 !important;
768 margin: -1px !important;
769 overflow: hidden !important;
770 clip: rect(0, 0, 0, 0) !important;
771 white-space: nowrap !important;
772 border: 0 !important;
773 }
774
775 /* ==========================================================================
776 CURSOR UTILITIES
777 ========================================================================== */
778
779 .thinkrank-cursor-pointer {
780 cursor: pointer !important;
781 }
782
783 .thinkrank-cursor-default {
784 cursor: default !important;
785 }
786
787 .thinkrank-cursor-not-allowed {
788 cursor: not-allowed !important;
789 }
790