@uxbertlabs/reportly 1.0.22 → 1.0.24

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.
package/dist/index.esm.js CHANGED
@@ -9297,51 +9297,144 @@ var parseBackgroundColor = function (context, element, backgroundColorOverride)
9297
9297
  // Screenshot capture using html2canvas
9298
9298
  class Screenshot {
9299
9299
  constructor() {
9300
+ this.captureDelay = 500; // Default delay before capture
9300
9301
  this.currentScreenshot = null;
9301
9302
  }
9303
+ /**
9304
+ * Wait for specified milliseconds
9305
+ */
9302
9306
  wait(ms) {
9303
9307
  return new Promise(resolve => setTimeout(resolve, ms));
9304
9308
  }
9309
+ /**
9310
+ * Wait for animations to complete and DOM to stabilize
9311
+ */
9312
+ async waitForStability() {
9313
+ // Wait for initial stabilization
9314
+ await this.wait(this.captureDelay);
9315
+ // Wait for images to load
9316
+ await this.waitForImages();
9317
+ // Wait for fonts to load
9318
+ await this.waitForFonts();
9319
+ // Additional short wait for any final rendering
9320
+ await this.wait(100);
9321
+ }
9322
+ /**
9323
+ * Wait for all images to finish loading
9324
+ */
9325
+ async waitForImages() {
9326
+ const images = Array.from(document.images);
9327
+ const imagePromises = images.map(img => {
9328
+ if (img.complete) {
9329
+ return Promise.resolve();
9330
+ }
9331
+ return new Promise(resolve => {
9332
+ img.addEventListener('load', () => resolve(), {
9333
+ once: true
9334
+ });
9335
+ img.addEventListener('error', () => resolve(), {
9336
+ once: true
9337
+ });
9338
+ // Timeout after 3 seconds for slow images
9339
+ setTimeout(() => resolve(), 3000);
9340
+ });
9341
+ });
9342
+ await Promise.all(imagePromises);
9343
+ }
9344
+ /**
9345
+ * Wait for fonts to load
9346
+ */
9347
+ async waitForFonts() {
9348
+ if ('fonts' in document) {
9349
+ try {
9350
+ await Promise.race([document.fonts.ready, this.wait(1000) // Timeout after 1 second
9351
+ ]);
9352
+ } catch (e) {
9353
+ // Font loading failed, continue anyway
9354
+ console.warn('Font loading check failed:', e);
9355
+ }
9356
+ }
9357
+ }
9358
+ /**
9359
+ * Force a reflow to ensure styles are applied
9360
+ */
9361
+ forceReflow() {
9362
+ // Reading offsetHeight forces a reflow
9363
+ document.body.offsetHeight;
9364
+ }
9305
9365
  async capture(mode = "fullpage") {
9306
9366
  try {
9307
- // Hide UXbert UI elements before capturing
9367
+ // Show loading screen immediately (before hiding UI)
9368
+ this.showLoadingScreen();
9369
+ // Wait for DOM to stabilize, animations to complete, and assets to load
9370
+ await this.waitForStability();
9371
+ // Hide loading screen and UXbert UI elements BEFORE capturing
9372
+ this.hideLoadingScreen();
9308
9373
  this.hideUXbertElements();
9374
+ // Force a reflow to ensure all styles are computed
9375
+ this.forceReflow();
9309
9376
  const originalScrollY = window.scrollY;
9310
9377
  let canvas;
9311
9378
  if (mode === "viewport") {
9312
9379
  // Capture only the current viewport
9313
9380
  canvas = await html2canvas(document.body, {
9314
- // foreignObjectRendering: true,
9315
9381
  useCORS: true,
9316
9382
  allowTaint: false,
9317
- logging: true,
9383
+ logging: false,
9318
9384
  width: window.innerWidth,
9319
9385
  height: window.innerHeight,
9320
9386
  windowWidth: window.innerWidth,
9321
9387
  windowHeight: window.innerHeight,
9322
9388
  x: window.scrollX,
9323
9389
  y: window.scrollY,
9324
- onclone: async () => {
9325
- // Show loading screen after clone (won't appear in screenshot)
9326
- this.showLoadingScreen();
9327
- // Wait 1 second after cloning to let animations complete
9328
- await this.wait(1000);
9390
+ // Improved rendering options
9391
+ backgroundColor: null,
9392
+ imageTimeout: 5000,
9393
+ removeContainer: true,
9394
+ scale: window.devicePixelRatio || 1,
9395
+ onclone: clonedDoc => {
9396
+ // Ensure all styles are applied in the cloned document
9397
+ const clonedBody = clonedDoc.body;
9398
+ // Force all animations to their final state
9399
+ const animatedElements = clonedBody.querySelectorAll('*');
9400
+ animatedElements.forEach(el => {
9401
+ const element = el;
9402
+ // Pause all animations
9403
+ element.style.animationPlayState = 'paused';
9404
+ element.style.animationDelay = '-9999s';
9405
+ element.style.animationIterationCount = '1';
9406
+ // Disable transitions
9407
+ element.style.transition = 'none';
9408
+ });
9409
+ // Ensure lazy-loaded images are visible
9410
+ const images = clonedBody.querySelectorAll('img');
9411
+ images.forEach(img => {
9412
+ img.style.opacity = '1';
9413
+ img.style.visibility = 'visible';
9414
+ });
9329
9415
  },
9330
9416
  ignoreElements: element => {
9417
+ // Ignore loading screen by ID
9418
+ if (element.id === 'uxbert-screenshot-loading') {
9419
+ return true;
9420
+ }
9421
+ // Ignore Uxbert elements
9422
+ if (element.getAttribute('data-uxbert-reportly') !== null || element.className?.toString().includes('uxbert-') || element.id?.includes('uxbert-')) {
9423
+ return true;
9424
+ }
9331
9425
  // Skip cross-origin images that might cause issues
9332
9426
  if (element.tagName === "IMG") {
9333
9427
  const img = element;
9334
9428
  try {
9335
9429
  // Test if image is accessible
9336
- const canvas = document.createElement("canvas");
9337
- const ctx = canvas.getContext("2d");
9338
- canvas.width = 1;
9339
- canvas.height = 1;
9430
+ const testCanvas = document.createElement("canvas");
9431
+ const ctx = testCanvas.getContext("2d");
9432
+ testCanvas.width = 1;
9433
+ testCanvas.height = 1;
9340
9434
  ctx?.drawImage(img, 0, 0, 1, 1);
9341
- canvas.toDataURL(); // This will throw if tainted
9435
+ testCanvas.toDataURL();
9342
9436
  return false; // Include the image
9343
9437
  } catch (e) {
9344
- // Image is tainted, skip it
9345
9438
  console.warn("Skipping cross-origin image:", img.src);
9346
9439
  return true;
9347
9440
  }
@@ -9352,6 +9445,8 @@ class Screenshot {
9352
9445
  } else {
9353
9446
  // Scroll to top to capture full page
9354
9447
  window.scrollTo(0, 0);
9448
+ // Wait a bit for scroll to settle
9449
+ await this.wait(100);
9355
9450
  // Get full page dimensions
9356
9451
  const fullPageHeight = Math.max(document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight);
9357
9452
  const fullPageWidth = Math.max(document.body.scrollWidth, document.body.offsetWidth, document.documentElement.clientWidth, document.documentElement.scrollWidth, document.documentElement.offsetWidth);
@@ -9362,25 +9457,56 @@ class Screenshot {
9362
9457
  logging: false,
9363
9458
  width: fullPageWidth,
9364
9459
  height: fullPageHeight,
9365
- onclone: async () => {
9366
- // Show loading screen after clone (won't appear in screenshot)
9367
- this.showLoadingScreen();
9460
+ windowWidth: fullPageWidth,
9461
+ windowHeight: fullPageHeight,
9462
+ // Improved rendering options
9463
+ backgroundColor: null,
9464
+ imageTimeout: 5000,
9465
+ removeContainer: true,
9466
+ scale: window.devicePixelRatio || 1,
9467
+ onclone: clonedDoc => {
9468
+ // Ensure all styles are applied in the cloned document
9469
+ const clonedBody = clonedDoc.body;
9470
+ // Force all animations to their final state
9471
+ const animatedElements = clonedBody.querySelectorAll('*');
9472
+ animatedElements.forEach(el => {
9473
+ const element = el;
9474
+ // Pause all animations at their end state
9475
+ element.style.animationPlayState = 'paused';
9476
+ element.style.animationDelay = '-9999s';
9477
+ element.style.animationIterationCount = '1';
9478
+ // Disable transitions
9479
+ element.style.transition = 'none';
9480
+ });
9481
+ // Ensure lazy-loaded images are visible
9482
+ const images = clonedBody.querySelectorAll('img');
9483
+ images.forEach(img => {
9484
+ img.style.opacity = '1';
9485
+ img.style.visibility = 'visible';
9486
+ });
9368
9487
  },
9369
9488
  ignoreElements: element => {
9489
+ // Ignore loading screen by ID
9490
+ if (element.id === 'uxbert-screenshot-loading') {
9491
+ return true;
9492
+ }
9493
+ // Ignore Uxbert elements
9494
+ if (element.getAttribute('data-uxbert-reportly') !== null || element.className?.toString().includes('uxbert-') || element.id?.includes('uxbert-')) {
9495
+ return true;
9496
+ }
9370
9497
  // Skip cross-origin images that might cause issues
9371
9498
  if (element.tagName === "IMG") {
9372
9499
  const img = element;
9373
9500
  try {
9374
9501
  // Test if image is accessible
9375
- const canvas = document.createElement("canvas");
9376
- const ctx = canvas.getContext("2d");
9377
- canvas.width = 1;
9378
- canvas.height = 1;
9502
+ const testCanvas = document.createElement("canvas");
9503
+ const ctx = testCanvas.getContext("2d");
9504
+ testCanvas.width = 1;
9505
+ testCanvas.height = 1;
9379
9506
  ctx?.drawImage(img, 0, 0, 1, 1);
9380
- canvas.toDataURL(); // This will throw if tainted
9507
+ testCanvas.toDataURL();
9381
9508
  return false; // Include the image
9382
9509
  } catch (e) {
9383
- // Image is tainted, skip it
9384
9510
  console.warn("Skipping cross-origin image:", img.src);
9385
9511
  return true;
9386
9512
  }
@@ -9393,15 +9519,13 @@ class Screenshot {
9393
9519
  }
9394
9520
  // Show UXbert UI elements again
9395
9521
  this.showUXbertElements();
9396
- // Hide loading screen
9397
- this.hideLoadingScreen();
9398
9522
  // Convert to base64
9399
9523
  this.currentScreenshot = canvas.toDataURL("image/png");
9400
9524
  return this.currentScreenshot;
9401
9525
  } catch (error) {
9402
9526
  console.error("Screenshot capture failed:", error);
9403
- this.showUXbertElements();
9404
9527
  this.hideLoadingScreen();
9528
+ this.showUXbertElements();
9405
9529
  throw error;
9406
9530
  }
9407
9531
  }
@@ -9485,6 +9609,19 @@ class Screenshot {
9485
9609
  loadingOverlay.remove();
9486
9610
  }
9487
9611
  }
9612
+ /**
9613
+ * Set the delay before capture in milliseconds
9614
+ * @param ms - Delay in milliseconds (default: 500)
9615
+ */
9616
+ setCaptureDelay(ms) {
9617
+ this.captureDelay = Math.max(0, Math.min(ms, 5000)); // Clamp between 0-5000ms
9618
+ }
9619
+ /**
9620
+ * Get the current capture delay
9621
+ */
9622
+ getCaptureDelay() {
9623
+ return this.captureDelay;
9624
+ }
9488
9625
  getScreenshot() {
9489
9626
  return this.currentScreenshot;
9490
9627
  }
@@ -10144,2963 +10281,12 @@ const X = createLucideIcon("x", __iconNode);
10144
10281
 
10145
10282
  function r(e){var t,f,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=" "),n+=f);}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}
10146
10283
 
10147
- const CLASS_PART_SEPARATOR = '-';
10148
- const createClassGroupUtils = config => {
10149
- const classMap = createClassMap(config);
10150
- const {
10151
- conflictingClassGroups,
10152
- conflictingClassGroupModifiers
10153
- } = config;
10154
- const getClassGroupId = className => {
10155
- const classParts = className.split(CLASS_PART_SEPARATOR);
10156
- // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and remove it from classParts.
10157
- if (classParts[0] === '' && classParts.length !== 1) {
10158
- classParts.shift();
10159
- }
10160
- return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className);
10161
- };
10162
- const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {
10163
- const conflicts = conflictingClassGroups[classGroupId] || [];
10164
- if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {
10165
- return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]];
10166
- }
10167
- return conflicts;
10168
- };
10169
- return {
10170
- getClassGroupId,
10171
- getConflictingClassGroupIds
10172
- };
10173
- };
10174
- const getGroupRecursive = (classParts, classPartObject) => {
10175
- if (classParts.length === 0) {
10176
- return classPartObject.classGroupId;
10177
- }
10178
- const currentClassPart = classParts[0];
10179
- const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);
10180
- const classGroupFromNextClassPart = nextClassPartObject ? getGroupRecursive(classParts.slice(1), nextClassPartObject) : undefined;
10181
- if (classGroupFromNextClassPart) {
10182
- return classGroupFromNextClassPart;
10183
- }
10184
- if (classPartObject.validators.length === 0) {
10185
- return undefined;
10186
- }
10187
- const classRest = classParts.join(CLASS_PART_SEPARATOR);
10188
- return classPartObject.validators.find(({
10189
- validator
10190
- }) => validator(classRest))?.classGroupId;
10191
- };
10192
- const arbitraryPropertyRegex = /^\[(.+)\]$/;
10193
- const getGroupIdForArbitraryProperty = className => {
10194
- if (arbitraryPropertyRegex.test(className)) {
10195
- const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)[1];
10196
- const property = arbitraryPropertyClassName?.substring(0, arbitraryPropertyClassName.indexOf(':'));
10197
- if (property) {
10198
- // I use two dots here because one dot is used as prefix for class groups in plugins
10199
- return 'arbitrary..' + property;
10200
- }
10201
- }
10202
- };
10203
10284
  /**
10204
- * Exported for testing only
10285
+ * Combines class names without Tailwind merging
10286
+ * Use this for scoped CSS classes (uxbert-*)
10205
10287
  */
10206
- const createClassMap = config => {
10207
- const {
10208
- theme,
10209
- classGroups
10210
- } = config;
10211
- const classMap = {
10212
- nextPart: new Map(),
10213
- validators: []
10214
- };
10215
- for (const classGroupId in classGroups) {
10216
- processClassesRecursively(classGroups[classGroupId], classMap, classGroupId, theme);
10217
- }
10218
- return classMap;
10219
- };
10220
- const processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {
10221
- classGroup.forEach(classDefinition => {
10222
- if (typeof classDefinition === 'string') {
10223
- const classPartObjectToEdit = classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition);
10224
- classPartObjectToEdit.classGroupId = classGroupId;
10225
- return;
10226
- }
10227
- if (typeof classDefinition === 'function') {
10228
- if (isThemeGetter(classDefinition)) {
10229
- processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);
10230
- return;
10231
- }
10232
- classPartObject.validators.push({
10233
- validator: classDefinition,
10234
- classGroupId
10235
- });
10236
- return;
10237
- }
10238
- Object.entries(classDefinition).forEach(([key, classGroup]) => {
10239
- processClassesRecursively(classGroup, getPart(classPartObject, key), classGroupId, theme);
10240
- });
10241
- });
10242
- };
10243
- const getPart = (classPartObject, path) => {
10244
- let currentClassPartObject = classPartObject;
10245
- path.split(CLASS_PART_SEPARATOR).forEach(pathPart => {
10246
- if (!currentClassPartObject.nextPart.has(pathPart)) {
10247
- currentClassPartObject.nextPart.set(pathPart, {
10248
- nextPart: new Map(),
10249
- validators: []
10250
- });
10251
- }
10252
- currentClassPartObject = currentClassPartObject.nextPart.get(pathPart);
10253
- });
10254
- return currentClassPartObject;
10255
- };
10256
- const isThemeGetter = func => func.isThemeGetter;
10257
-
10258
- // LRU cache inspired from hashlru (https://github.com/dominictarr/hashlru/blob/v1.0.4/index.js) but object replaced with Map to improve performance
10259
- const createLruCache = maxCacheSize => {
10260
- if (maxCacheSize < 1) {
10261
- return {
10262
- get: () => undefined,
10263
- set: () => {}
10264
- };
10265
- }
10266
- let cacheSize = 0;
10267
- let cache = new Map();
10268
- let previousCache = new Map();
10269
- const update = (key, value) => {
10270
- cache.set(key, value);
10271
- cacheSize++;
10272
- if (cacheSize > maxCacheSize) {
10273
- cacheSize = 0;
10274
- previousCache = cache;
10275
- cache = new Map();
10276
- }
10277
- };
10278
- return {
10279
- get(key) {
10280
- let value = cache.get(key);
10281
- if (value !== undefined) {
10282
- return value;
10283
- }
10284
- if ((value = previousCache.get(key)) !== undefined) {
10285
- update(key, value);
10286
- return value;
10287
- }
10288
- },
10289
- set(key, value) {
10290
- if (cache.has(key)) {
10291
- cache.set(key, value);
10292
- } else {
10293
- update(key, value);
10294
- }
10295
- }
10296
- };
10297
- };
10298
- const IMPORTANT_MODIFIER = '!';
10299
- const MODIFIER_SEPARATOR = ':';
10300
- const MODIFIER_SEPARATOR_LENGTH = MODIFIER_SEPARATOR.length;
10301
- const createParseClassName = config => {
10302
- const {
10303
- prefix,
10304
- experimentalParseClassName
10305
- } = config;
10306
- /**
10307
- * Parse class name into parts.
10308
- *
10309
- * Inspired by `splitAtTopLevelOnly` used in Tailwind CSS
10310
- * @see https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js
10311
- */
10312
- let parseClassName = className => {
10313
- const modifiers = [];
10314
- let bracketDepth = 0;
10315
- let parenDepth = 0;
10316
- let modifierStart = 0;
10317
- let postfixModifierPosition;
10318
- for (let index = 0; index < className.length; index++) {
10319
- let currentCharacter = className[index];
10320
- if (bracketDepth === 0 && parenDepth === 0) {
10321
- if (currentCharacter === MODIFIER_SEPARATOR) {
10322
- modifiers.push(className.slice(modifierStart, index));
10323
- modifierStart = index + MODIFIER_SEPARATOR_LENGTH;
10324
- continue;
10325
- }
10326
- if (currentCharacter === '/') {
10327
- postfixModifierPosition = index;
10328
- continue;
10329
- }
10330
- }
10331
- if (currentCharacter === '[') {
10332
- bracketDepth++;
10333
- } else if (currentCharacter === ']') {
10334
- bracketDepth--;
10335
- } else if (currentCharacter === '(') {
10336
- parenDepth++;
10337
- } else if (currentCharacter === ')') {
10338
- parenDepth--;
10339
- }
10340
- }
10341
- const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.substring(modifierStart);
10342
- const baseClassName = stripImportantModifier(baseClassNameWithImportantModifier);
10343
- const hasImportantModifier = baseClassName !== baseClassNameWithImportantModifier;
10344
- const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : undefined;
10345
- return {
10346
- modifiers,
10347
- hasImportantModifier,
10348
- baseClassName,
10349
- maybePostfixModifierPosition
10350
- };
10351
- };
10352
- if (prefix) {
10353
- const fullPrefix = prefix + MODIFIER_SEPARATOR;
10354
- const parseClassNameOriginal = parseClassName;
10355
- parseClassName = className => className.startsWith(fullPrefix) ? parseClassNameOriginal(className.substring(fullPrefix.length)) : {
10356
- isExternal: true,
10357
- modifiers: [],
10358
- hasImportantModifier: false,
10359
- baseClassName: className,
10360
- maybePostfixModifierPosition: undefined
10361
- };
10362
- }
10363
- if (experimentalParseClassName) {
10364
- const parseClassNameOriginal = parseClassName;
10365
- parseClassName = className => experimentalParseClassName({
10366
- className,
10367
- parseClassName: parseClassNameOriginal
10368
- });
10369
- }
10370
- return parseClassName;
10371
- };
10372
- const stripImportantModifier = baseClassName => {
10373
- if (baseClassName.endsWith(IMPORTANT_MODIFIER)) {
10374
- return baseClassName.substring(0, baseClassName.length - 1);
10375
- }
10376
- /**
10377
- * In Tailwind CSS v3 the important modifier was at the start of the base class name. This is still supported for legacy reasons.
10378
- * @see https://github.com/dcastil/tailwind-merge/issues/513#issuecomment-2614029864
10379
- */
10380
- if (baseClassName.startsWith(IMPORTANT_MODIFIER)) {
10381
- return baseClassName.substring(1);
10382
- }
10383
- return baseClassName;
10384
- };
10385
-
10386
- /**
10387
- * Sorts modifiers according to following schema:
10388
- * - Predefined modifiers are sorted alphabetically
10389
- * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it
10390
- */
10391
- const createSortModifiers = config => {
10392
- const orderSensitiveModifiers = Object.fromEntries(config.orderSensitiveModifiers.map(modifier => [modifier, true]));
10393
- const sortModifiers = modifiers => {
10394
- if (modifiers.length <= 1) {
10395
- return modifiers;
10396
- }
10397
- const sortedModifiers = [];
10398
- let unsortedModifiers = [];
10399
- modifiers.forEach(modifier => {
10400
- const isPositionSensitive = modifier[0] === '[' || orderSensitiveModifiers[modifier];
10401
- if (isPositionSensitive) {
10402
- sortedModifiers.push(...unsortedModifiers.sort(), modifier);
10403
- unsortedModifiers = [];
10404
- } else {
10405
- unsortedModifiers.push(modifier);
10406
- }
10407
- });
10408
- sortedModifiers.push(...unsortedModifiers.sort());
10409
- return sortedModifiers;
10410
- };
10411
- return sortModifiers;
10412
- };
10413
- const createConfigUtils = config => ({
10414
- cache: createLruCache(config.cacheSize),
10415
- parseClassName: createParseClassName(config),
10416
- sortModifiers: createSortModifiers(config),
10417
- ...createClassGroupUtils(config)
10418
- });
10419
- const SPLIT_CLASSES_REGEX = /\s+/;
10420
- const mergeClassList = (classList, configUtils) => {
10421
- const {
10422
- parseClassName,
10423
- getClassGroupId,
10424
- getConflictingClassGroupIds,
10425
- sortModifiers
10426
- } = configUtils;
10427
- /**
10428
- * Set of classGroupIds in following format:
10429
- * `{importantModifier}{variantModifiers}{classGroupId}`
10430
- * @example 'float'
10431
- * @example 'hover:focus:bg-color'
10432
- * @example 'md:!pr'
10433
- */
10434
- const classGroupsInConflict = [];
10435
- const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);
10436
- let result = '';
10437
- for (let index = classNames.length - 1; index >= 0; index -= 1) {
10438
- const originalClassName = classNames[index];
10439
- const {
10440
- isExternal,
10441
- modifiers,
10442
- hasImportantModifier,
10443
- baseClassName,
10444
- maybePostfixModifierPosition
10445
- } = parseClassName(originalClassName);
10446
- if (isExternal) {
10447
- result = originalClassName + (result.length > 0 ? ' ' + result : result);
10448
- continue;
10449
- }
10450
- let hasPostfixModifier = !!maybePostfixModifierPosition;
10451
- let classGroupId = getClassGroupId(hasPostfixModifier ? baseClassName.substring(0, maybePostfixModifierPosition) : baseClassName);
10452
- if (!classGroupId) {
10453
- if (!hasPostfixModifier) {
10454
- // Not a Tailwind class
10455
- result = originalClassName + (result.length > 0 ? ' ' + result : result);
10456
- continue;
10457
- }
10458
- classGroupId = getClassGroupId(baseClassName);
10459
- if (!classGroupId) {
10460
- // Not a Tailwind class
10461
- result = originalClassName + (result.length > 0 ? ' ' + result : result);
10462
- continue;
10463
- }
10464
- hasPostfixModifier = false;
10465
- }
10466
- const variantModifier = sortModifiers(modifiers).join(':');
10467
- const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;
10468
- const classId = modifierId + classGroupId;
10469
- if (classGroupsInConflict.includes(classId)) {
10470
- // Tailwind class omitted due to conflict
10471
- continue;
10472
- }
10473
- classGroupsInConflict.push(classId);
10474
- const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);
10475
- for (let i = 0; i < conflictGroups.length; ++i) {
10476
- const group = conflictGroups[i];
10477
- classGroupsInConflict.push(modifierId + group);
10478
- }
10479
- // Tailwind class not in conflict
10480
- result = originalClassName + (result.length > 0 ? ' ' + result : result);
10481
- }
10482
- return result;
10483
- };
10484
-
10485
- /**
10486
- * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.
10487
- *
10488
- * Specifically:
10489
- * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js
10490
- * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts
10491
- *
10492
- * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)
10493
- */
10494
- function twJoin() {
10495
- let index = 0;
10496
- let argument;
10497
- let resolvedValue;
10498
- let string = '';
10499
- while (index < arguments.length) {
10500
- if (argument = arguments[index++]) {
10501
- if (resolvedValue = toValue(argument)) {
10502
- string && (string += ' ');
10503
- string += resolvedValue;
10504
- }
10505
- }
10506
- }
10507
- return string;
10508
- }
10509
- const toValue = mix => {
10510
- if (typeof mix === 'string') {
10511
- return mix;
10512
- }
10513
- let resolvedValue;
10514
- let string = '';
10515
- for (let k = 0; k < mix.length; k++) {
10516
- if (mix[k]) {
10517
- if (resolvedValue = toValue(mix[k])) {
10518
- string && (string += ' ');
10519
- string += resolvedValue;
10520
- }
10521
- }
10522
- }
10523
- return string;
10524
- };
10525
- function createTailwindMerge(createConfigFirst, ...createConfigRest) {
10526
- let configUtils;
10527
- let cacheGet;
10528
- let cacheSet;
10529
- let functionToCall = initTailwindMerge;
10530
- function initTailwindMerge(classList) {
10531
- const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());
10532
- configUtils = createConfigUtils(config);
10533
- cacheGet = configUtils.cache.get;
10534
- cacheSet = configUtils.cache.set;
10535
- functionToCall = tailwindMerge;
10536
- return tailwindMerge(classList);
10537
- }
10538
- function tailwindMerge(classList) {
10539
- const cachedResult = cacheGet(classList);
10540
- if (cachedResult) {
10541
- return cachedResult;
10542
- }
10543
- const result = mergeClassList(classList, configUtils);
10544
- cacheSet(classList, result);
10545
- return result;
10546
- }
10547
- return function callTailwindMerge() {
10548
- return functionToCall(twJoin.apply(null, arguments));
10549
- };
10550
- }
10551
- const fromTheme = key => {
10552
- const themeGetter = theme => theme[key] || [];
10553
- themeGetter.isThemeGetter = true;
10554
- return themeGetter;
10555
- };
10556
- const arbitraryValueRegex = /^\[(?:(\w[\w-]*):)?(.+)\]$/i;
10557
- const arbitraryVariableRegex = /^\((?:(\w[\w-]*):)?(.+)\)$/i;
10558
- const fractionRegex = /^\d+\/\d+$/;
10559
- const tshirtUnitRegex = /^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/;
10560
- const lengthUnitRegex = /\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/;
10561
- const colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/;
10562
- // Shadow always begins with x and y offset separated by underscore optionally prepended by inset
10563
- const shadowRegex = /^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/;
10564
- const imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/;
10565
- const isFraction = value => fractionRegex.test(value);
10566
- const isNumber = value => !!value && !Number.isNaN(Number(value));
10567
- const isInteger = value => !!value && Number.isInteger(Number(value));
10568
- const isPercent = value => value.endsWith('%') && isNumber(value.slice(0, -1));
10569
- const isTshirtSize = value => tshirtUnitRegex.test(value);
10570
- const isAny = () => true;
10571
- const isLengthOnly = value =>
10572
- // `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.
10573
- // For example, `hsl(0 0% 0%)` would be classified as a length without this check.
10574
- // I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.
10575
- lengthUnitRegex.test(value) && !colorFunctionRegex.test(value);
10576
- const isNever = () => false;
10577
- const isShadow = value => shadowRegex.test(value);
10578
- const isImage = value => imageRegex.test(value);
10579
- const isAnyNonArbitrary = value => !isArbitraryValue(value) && !isArbitraryVariable(value);
10580
- const isArbitrarySize = value => getIsArbitraryValue(value, isLabelSize, isNever);
10581
- const isArbitraryValue = value => arbitraryValueRegex.test(value);
10582
- const isArbitraryLength = value => getIsArbitraryValue(value, isLabelLength, isLengthOnly);
10583
- const isArbitraryNumber = value => getIsArbitraryValue(value, isLabelNumber, isNumber);
10584
- const isArbitraryPosition = value => getIsArbitraryValue(value, isLabelPosition, isNever);
10585
- const isArbitraryImage = value => getIsArbitraryValue(value, isLabelImage, isImage);
10586
- const isArbitraryShadow = value => getIsArbitraryValue(value, isLabelShadow, isShadow);
10587
- const isArbitraryVariable = value => arbitraryVariableRegex.test(value);
10588
- const isArbitraryVariableLength = value => getIsArbitraryVariable(value, isLabelLength);
10589
- const isArbitraryVariableFamilyName = value => getIsArbitraryVariable(value, isLabelFamilyName);
10590
- const isArbitraryVariablePosition = value => getIsArbitraryVariable(value, isLabelPosition);
10591
- const isArbitraryVariableSize = value => getIsArbitraryVariable(value, isLabelSize);
10592
- const isArbitraryVariableImage = value => getIsArbitraryVariable(value, isLabelImage);
10593
- const isArbitraryVariableShadow = value => getIsArbitraryVariable(value, isLabelShadow, true);
10594
- // Helpers
10595
- const getIsArbitraryValue = (value, testLabel, testValue) => {
10596
- const result = arbitraryValueRegex.exec(value);
10597
- if (result) {
10598
- if (result[1]) {
10599
- return testLabel(result[1]);
10600
- }
10601
- return testValue(result[2]);
10602
- }
10603
- return false;
10604
- };
10605
- const getIsArbitraryVariable = (value, testLabel, shouldMatchNoLabel = false) => {
10606
- const result = arbitraryVariableRegex.exec(value);
10607
- if (result) {
10608
- if (result[1]) {
10609
- return testLabel(result[1]);
10610
- }
10611
- return shouldMatchNoLabel;
10612
- }
10613
- return false;
10614
- };
10615
- // Labels
10616
- const isLabelPosition = label => label === 'position' || label === 'percentage';
10617
- const isLabelImage = label => label === 'image' || label === 'url';
10618
- const isLabelSize = label => label === 'length' || label === 'size' || label === 'bg-size';
10619
- const isLabelLength = label => label === 'length';
10620
- const isLabelNumber = label => label === 'number';
10621
- const isLabelFamilyName = label => label === 'family-name';
10622
- const isLabelShadow = label => label === 'shadow';
10623
- const getDefaultConfig = () => {
10624
- /**
10625
- * Theme getters for theme variable namespaces
10626
- * @see https://tailwindcss.com/docs/theme#theme-variable-namespaces
10627
- */
10628
- /***/
10629
- const themeColor = fromTheme('color');
10630
- const themeFont = fromTheme('font');
10631
- const themeText = fromTheme('text');
10632
- const themeFontWeight = fromTheme('font-weight');
10633
- const themeTracking = fromTheme('tracking');
10634
- const themeLeading = fromTheme('leading');
10635
- const themeBreakpoint = fromTheme('breakpoint');
10636
- const themeContainer = fromTheme('container');
10637
- const themeSpacing = fromTheme('spacing');
10638
- const themeRadius = fromTheme('radius');
10639
- const themeShadow = fromTheme('shadow');
10640
- const themeInsetShadow = fromTheme('inset-shadow');
10641
- const themeTextShadow = fromTheme('text-shadow');
10642
- const themeDropShadow = fromTheme('drop-shadow');
10643
- const themeBlur = fromTheme('blur');
10644
- const themePerspective = fromTheme('perspective');
10645
- const themeAspect = fromTheme('aspect');
10646
- const themeEase = fromTheme('ease');
10647
- const themeAnimate = fromTheme('animate');
10648
- /**
10649
- * Helpers to avoid repeating the same scales
10650
- *
10651
- * We use functions that create a new array every time they're called instead of static arrays.
10652
- * This ensures that users who modify any scale by mutating the array (e.g. with `array.push(element)`) don't accidentally mutate arrays in other parts of the config.
10653
- */
10654
- /***/
10655
- const scaleBreak = () => ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'];
10656
- const scalePosition = () => ['center', 'top', 'bottom', 'left', 'right', 'top-left',
10657
- // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
10658
- 'left-top', 'top-right',
10659
- // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
10660
- 'right-top', 'bottom-right',
10661
- // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
10662
- 'right-bottom', 'bottom-left',
10663
- // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
10664
- 'left-bottom'];
10665
- const scalePositionWithArbitrary = () => [...scalePosition(), isArbitraryVariable, isArbitraryValue];
10666
- const scaleOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'];
10667
- const scaleOverscroll = () => ['auto', 'contain', 'none'];
10668
- const scaleUnambiguousSpacing = () => [isArbitraryVariable, isArbitraryValue, themeSpacing];
10669
- const scaleInset = () => [isFraction, 'full', 'auto', ...scaleUnambiguousSpacing()];
10670
- const scaleGridTemplateColsRows = () => [isInteger, 'none', 'subgrid', isArbitraryVariable, isArbitraryValue];
10671
- const scaleGridColRowStartAndEnd = () => ['auto', {
10672
- span: ['full', isInteger, isArbitraryVariable, isArbitraryValue]
10673
- }, isInteger, isArbitraryVariable, isArbitraryValue];
10674
- const scaleGridColRowStartOrEnd = () => [isInteger, 'auto', isArbitraryVariable, isArbitraryValue];
10675
- const scaleGridAutoColsRows = () => ['auto', 'min', 'max', 'fr', isArbitraryVariable, isArbitraryValue];
10676
- const scaleAlignPrimaryAxis = () => ['start', 'end', 'center', 'between', 'around', 'evenly', 'stretch', 'baseline', 'center-safe', 'end-safe'];
10677
- const scaleAlignSecondaryAxis = () => ['start', 'end', 'center', 'stretch', 'center-safe', 'end-safe'];
10678
- const scaleMargin = () => ['auto', ...scaleUnambiguousSpacing()];
10679
- const scaleSizing = () => [isFraction, 'auto', 'full', 'dvw', 'dvh', 'lvw', 'lvh', 'svw', 'svh', 'min', 'max', 'fit', ...scaleUnambiguousSpacing()];
10680
- const scaleColor = () => [themeColor, isArbitraryVariable, isArbitraryValue];
10681
- const scaleBgPosition = () => [...scalePosition(), isArbitraryVariablePosition, isArbitraryPosition, {
10682
- position: [isArbitraryVariable, isArbitraryValue]
10683
- }];
10684
- const scaleBgRepeat = () => ['no-repeat', {
10685
- repeat: ['', 'x', 'y', 'space', 'round']
10686
- }];
10687
- const scaleBgSize = () => ['auto', 'cover', 'contain', isArbitraryVariableSize, isArbitrarySize, {
10688
- size: [isArbitraryVariable, isArbitraryValue]
10689
- }];
10690
- const scaleGradientStopPosition = () => [isPercent, isArbitraryVariableLength, isArbitraryLength];
10691
- const scaleRadius = () => [
10692
- // Deprecated since Tailwind CSS v4.0.0
10693
- '', 'none', 'full', themeRadius, isArbitraryVariable, isArbitraryValue];
10694
- const scaleBorderWidth = () => ['', isNumber, isArbitraryVariableLength, isArbitraryLength];
10695
- const scaleLineStyle = () => ['solid', 'dashed', 'dotted', 'double'];
10696
- const scaleBlendMode = () => ['normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn', 'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity'];
10697
- const scaleMaskImagePosition = () => [isNumber, isPercent, isArbitraryVariablePosition, isArbitraryPosition];
10698
- const scaleBlur = () => [
10699
- // Deprecated since Tailwind CSS v4.0.0
10700
- '', 'none', themeBlur, isArbitraryVariable, isArbitraryValue];
10701
- const scaleRotate = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue];
10702
- const scaleScale = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue];
10703
- const scaleSkew = () => [isNumber, isArbitraryVariable, isArbitraryValue];
10704
- const scaleTranslate = () => [isFraction, 'full', ...scaleUnambiguousSpacing()];
10705
- return {
10706
- cacheSize: 500,
10707
- theme: {
10708
- animate: ['spin', 'ping', 'pulse', 'bounce'],
10709
- aspect: ['video'],
10710
- blur: [isTshirtSize],
10711
- breakpoint: [isTshirtSize],
10712
- color: [isAny],
10713
- container: [isTshirtSize],
10714
- 'drop-shadow': [isTshirtSize],
10715
- ease: ['in', 'out', 'in-out'],
10716
- font: [isAnyNonArbitrary],
10717
- 'font-weight': ['thin', 'extralight', 'light', 'normal', 'medium', 'semibold', 'bold', 'extrabold', 'black'],
10718
- 'inset-shadow': [isTshirtSize],
10719
- leading: ['none', 'tight', 'snug', 'normal', 'relaxed', 'loose'],
10720
- perspective: ['dramatic', 'near', 'normal', 'midrange', 'distant', 'none'],
10721
- radius: [isTshirtSize],
10722
- shadow: [isTshirtSize],
10723
- spacing: ['px', isNumber],
10724
- text: [isTshirtSize],
10725
- 'text-shadow': [isTshirtSize],
10726
- tracking: ['tighter', 'tight', 'normal', 'wide', 'wider', 'widest']
10727
- },
10728
- classGroups: {
10729
- // --------------
10730
- // --- Layout ---
10731
- // --------------
10732
- /**
10733
- * Aspect Ratio
10734
- * @see https://tailwindcss.com/docs/aspect-ratio
10735
- */
10736
- aspect: [{
10737
- aspect: ['auto', 'square', isFraction, isArbitraryValue, isArbitraryVariable, themeAspect]
10738
- }],
10739
- /**
10740
- * Container
10741
- * @see https://tailwindcss.com/docs/container
10742
- * @deprecated since Tailwind CSS v4.0.0
10743
- */
10744
- container: ['container'],
10745
- /**
10746
- * Columns
10747
- * @see https://tailwindcss.com/docs/columns
10748
- */
10749
- columns: [{
10750
- columns: [isNumber, isArbitraryValue, isArbitraryVariable, themeContainer]
10751
- }],
10752
- /**
10753
- * Break After
10754
- * @see https://tailwindcss.com/docs/break-after
10755
- */
10756
- 'break-after': [{
10757
- 'break-after': scaleBreak()
10758
- }],
10759
- /**
10760
- * Break Before
10761
- * @see https://tailwindcss.com/docs/break-before
10762
- */
10763
- 'break-before': [{
10764
- 'break-before': scaleBreak()
10765
- }],
10766
- /**
10767
- * Break Inside
10768
- * @see https://tailwindcss.com/docs/break-inside
10769
- */
10770
- 'break-inside': [{
10771
- 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column']
10772
- }],
10773
- /**
10774
- * Box Decoration Break
10775
- * @see https://tailwindcss.com/docs/box-decoration-break
10776
- */
10777
- 'box-decoration': [{
10778
- 'box-decoration': ['slice', 'clone']
10779
- }],
10780
- /**
10781
- * Box Sizing
10782
- * @see https://tailwindcss.com/docs/box-sizing
10783
- */
10784
- box: [{
10785
- box: ['border', 'content']
10786
- }],
10787
- /**
10788
- * Display
10789
- * @see https://tailwindcss.com/docs/display
10790
- */
10791
- display: ['block', 'inline-block', 'inline', 'flex', 'inline-flex', 'table', 'inline-table', 'table-caption', 'table-cell', 'table-column', 'table-column-group', 'table-footer-group', 'table-header-group', 'table-row-group', 'table-row', 'flow-root', 'grid', 'inline-grid', 'contents', 'list-item', 'hidden'],
10792
- /**
10793
- * Screen Reader Only
10794
- * @see https://tailwindcss.com/docs/display#screen-reader-only
10795
- */
10796
- sr: ['sr-only', 'not-sr-only'],
10797
- /**
10798
- * Floats
10799
- * @see https://tailwindcss.com/docs/float
10800
- */
10801
- float: [{
10802
- float: ['right', 'left', 'none', 'start', 'end']
10803
- }],
10804
- /**
10805
- * Clear
10806
- * @see https://tailwindcss.com/docs/clear
10807
- */
10808
- clear: [{
10809
- clear: ['left', 'right', 'both', 'none', 'start', 'end']
10810
- }],
10811
- /**
10812
- * Isolation
10813
- * @see https://tailwindcss.com/docs/isolation
10814
- */
10815
- isolation: ['isolate', 'isolation-auto'],
10816
- /**
10817
- * Object Fit
10818
- * @see https://tailwindcss.com/docs/object-fit
10819
- */
10820
- 'object-fit': [{
10821
- object: ['contain', 'cover', 'fill', 'none', 'scale-down']
10822
- }],
10823
- /**
10824
- * Object Position
10825
- * @see https://tailwindcss.com/docs/object-position
10826
- */
10827
- 'object-position': [{
10828
- object: scalePositionWithArbitrary()
10829
- }],
10830
- /**
10831
- * Overflow
10832
- * @see https://tailwindcss.com/docs/overflow
10833
- */
10834
- overflow: [{
10835
- overflow: scaleOverflow()
10836
- }],
10837
- /**
10838
- * Overflow X
10839
- * @see https://tailwindcss.com/docs/overflow
10840
- */
10841
- 'overflow-x': [{
10842
- 'overflow-x': scaleOverflow()
10843
- }],
10844
- /**
10845
- * Overflow Y
10846
- * @see https://tailwindcss.com/docs/overflow
10847
- */
10848
- 'overflow-y': [{
10849
- 'overflow-y': scaleOverflow()
10850
- }],
10851
- /**
10852
- * Overscroll Behavior
10853
- * @see https://tailwindcss.com/docs/overscroll-behavior
10854
- */
10855
- overscroll: [{
10856
- overscroll: scaleOverscroll()
10857
- }],
10858
- /**
10859
- * Overscroll Behavior X
10860
- * @see https://tailwindcss.com/docs/overscroll-behavior
10861
- */
10862
- 'overscroll-x': [{
10863
- 'overscroll-x': scaleOverscroll()
10864
- }],
10865
- /**
10866
- * Overscroll Behavior Y
10867
- * @see https://tailwindcss.com/docs/overscroll-behavior
10868
- */
10869
- 'overscroll-y': [{
10870
- 'overscroll-y': scaleOverscroll()
10871
- }],
10872
- /**
10873
- * Position
10874
- * @see https://tailwindcss.com/docs/position
10875
- */
10876
- position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],
10877
- /**
10878
- * Top / Right / Bottom / Left
10879
- * @see https://tailwindcss.com/docs/top-right-bottom-left
10880
- */
10881
- inset: [{
10882
- inset: scaleInset()
10883
- }],
10884
- /**
10885
- * Right / Left
10886
- * @see https://tailwindcss.com/docs/top-right-bottom-left
10887
- */
10888
- 'inset-x': [{
10889
- 'inset-x': scaleInset()
10890
- }],
10891
- /**
10892
- * Top / Bottom
10893
- * @see https://tailwindcss.com/docs/top-right-bottom-left
10894
- */
10895
- 'inset-y': [{
10896
- 'inset-y': scaleInset()
10897
- }],
10898
- /**
10899
- * Start
10900
- * @see https://tailwindcss.com/docs/top-right-bottom-left
10901
- */
10902
- start: [{
10903
- start: scaleInset()
10904
- }],
10905
- /**
10906
- * End
10907
- * @see https://tailwindcss.com/docs/top-right-bottom-left
10908
- */
10909
- end: [{
10910
- end: scaleInset()
10911
- }],
10912
- /**
10913
- * Top
10914
- * @see https://tailwindcss.com/docs/top-right-bottom-left
10915
- */
10916
- top: [{
10917
- top: scaleInset()
10918
- }],
10919
- /**
10920
- * Right
10921
- * @see https://tailwindcss.com/docs/top-right-bottom-left
10922
- */
10923
- right: [{
10924
- right: scaleInset()
10925
- }],
10926
- /**
10927
- * Bottom
10928
- * @see https://tailwindcss.com/docs/top-right-bottom-left
10929
- */
10930
- bottom: [{
10931
- bottom: scaleInset()
10932
- }],
10933
- /**
10934
- * Left
10935
- * @see https://tailwindcss.com/docs/top-right-bottom-left
10936
- */
10937
- left: [{
10938
- left: scaleInset()
10939
- }],
10940
- /**
10941
- * Visibility
10942
- * @see https://tailwindcss.com/docs/visibility
10943
- */
10944
- visibility: ['visible', 'invisible', 'collapse'],
10945
- /**
10946
- * Z-Index
10947
- * @see https://tailwindcss.com/docs/z-index
10948
- */
10949
- z: [{
10950
- z: [isInteger, 'auto', isArbitraryVariable, isArbitraryValue]
10951
- }],
10952
- // ------------------------
10953
- // --- Flexbox and Grid ---
10954
- // ------------------------
10955
- /**
10956
- * Flex Basis
10957
- * @see https://tailwindcss.com/docs/flex-basis
10958
- */
10959
- basis: [{
10960
- basis: [isFraction, 'full', 'auto', themeContainer, ...scaleUnambiguousSpacing()]
10961
- }],
10962
- /**
10963
- * Flex Direction
10964
- * @see https://tailwindcss.com/docs/flex-direction
10965
- */
10966
- 'flex-direction': [{
10967
- flex: ['row', 'row-reverse', 'col', 'col-reverse']
10968
- }],
10969
- /**
10970
- * Flex Wrap
10971
- * @see https://tailwindcss.com/docs/flex-wrap
10972
- */
10973
- 'flex-wrap': [{
10974
- flex: ['nowrap', 'wrap', 'wrap-reverse']
10975
- }],
10976
- /**
10977
- * Flex
10978
- * @see https://tailwindcss.com/docs/flex
10979
- */
10980
- flex: [{
10981
- flex: [isNumber, isFraction, 'auto', 'initial', 'none', isArbitraryValue]
10982
- }],
10983
- /**
10984
- * Flex Grow
10985
- * @see https://tailwindcss.com/docs/flex-grow
10986
- */
10987
- grow: [{
10988
- grow: ['', isNumber, isArbitraryVariable, isArbitraryValue]
10989
- }],
10990
- /**
10991
- * Flex Shrink
10992
- * @see https://tailwindcss.com/docs/flex-shrink
10993
- */
10994
- shrink: [{
10995
- shrink: ['', isNumber, isArbitraryVariable, isArbitraryValue]
10996
- }],
10997
- /**
10998
- * Order
10999
- * @see https://tailwindcss.com/docs/order
11000
- */
11001
- order: [{
11002
- order: [isInteger, 'first', 'last', 'none', isArbitraryVariable, isArbitraryValue]
11003
- }],
11004
- /**
11005
- * Grid Template Columns
11006
- * @see https://tailwindcss.com/docs/grid-template-columns
11007
- */
11008
- 'grid-cols': [{
11009
- 'grid-cols': scaleGridTemplateColsRows()
11010
- }],
11011
- /**
11012
- * Grid Column Start / End
11013
- * @see https://tailwindcss.com/docs/grid-column
11014
- */
11015
- 'col-start-end': [{
11016
- col: scaleGridColRowStartAndEnd()
11017
- }],
11018
- /**
11019
- * Grid Column Start
11020
- * @see https://tailwindcss.com/docs/grid-column
11021
- */
11022
- 'col-start': [{
11023
- 'col-start': scaleGridColRowStartOrEnd()
11024
- }],
11025
- /**
11026
- * Grid Column End
11027
- * @see https://tailwindcss.com/docs/grid-column
11028
- */
11029
- 'col-end': [{
11030
- 'col-end': scaleGridColRowStartOrEnd()
11031
- }],
11032
- /**
11033
- * Grid Template Rows
11034
- * @see https://tailwindcss.com/docs/grid-template-rows
11035
- */
11036
- 'grid-rows': [{
11037
- 'grid-rows': scaleGridTemplateColsRows()
11038
- }],
11039
- /**
11040
- * Grid Row Start / End
11041
- * @see https://tailwindcss.com/docs/grid-row
11042
- */
11043
- 'row-start-end': [{
11044
- row: scaleGridColRowStartAndEnd()
11045
- }],
11046
- /**
11047
- * Grid Row Start
11048
- * @see https://tailwindcss.com/docs/grid-row
11049
- */
11050
- 'row-start': [{
11051
- 'row-start': scaleGridColRowStartOrEnd()
11052
- }],
11053
- /**
11054
- * Grid Row End
11055
- * @see https://tailwindcss.com/docs/grid-row
11056
- */
11057
- 'row-end': [{
11058
- 'row-end': scaleGridColRowStartOrEnd()
11059
- }],
11060
- /**
11061
- * Grid Auto Flow
11062
- * @see https://tailwindcss.com/docs/grid-auto-flow
11063
- */
11064
- 'grid-flow': [{
11065
- 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense']
11066
- }],
11067
- /**
11068
- * Grid Auto Columns
11069
- * @see https://tailwindcss.com/docs/grid-auto-columns
11070
- */
11071
- 'auto-cols': [{
11072
- 'auto-cols': scaleGridAutoColsRows()
11073
- }],
11074
- /**
11075
- * Grid Auto Rows
11076
- * @see https://tailwindcss.com/docs/grid-auto-rows
11077
- */
11078
- 'auto-rows': [{
11079
- 'auto-rows': scaleGridAutoColsRows()
11080
- }],
11081
- /**
11082
- * Gap
11083
- * @see https://tailwindcss.com/docs/gap
11084
- */
11085
- gap: [{
11086
- gap: scaleUnambiguousSpacing()
11087
- }],
11088
- /**
11089
- * Gap X
11090
- * @see https://tailwindcss.com/docs/gap
11091
- */
11092
- 'gap-x': [{
11093
- 'gap-x': scaleUnambiguousSpacing()
11094
- }],
11095
- /**
11096
- * Gap Y
11097
- * @see https://tailwindcss.com/docs/gap
11098
- */
11099
- 'gap-y': [{
11100
- 'gap-y': scaleUnambiguousSpacing()
11101
- }],
11102
- /**
11103
- * Justify Content
11104
- * @see https://tailwindcss.com/docs/justify-content
11105
- */
11106
- 'justify-content': [{
11107
- justify: [...scaleAlignPrimaryAxis(), 'normal']
11108
- }],
11109
- /**
11110
- * Justify Items
11111
- * @see https://tailwindcss.com/docs/justify-items
11112
- */
11113
- 'justify-items': [{
11114
- 'justify-items': [...scaleAlignSecondaryAxis(), 'normal']
11115
- }],
11116
- /**
11117
- * Justify Self
11118
- * @see https://tailwindcss.com/docs/justify-self
11119
- */
11120
- 'justify-self': [{
11121
- 'justify-self': ['auto', ...scaleAlignSecondaryAxis()]
11122
- }],
11123
- /**
11124
- * Align Content
11125
- * @see https://tailwindcss.com/docs/align-content
11126
- */
11127
- 'align-content': [{
11128
- content: ['normal', ...scaleAlignPrimaryAxis()]
11129
- }],
11130
- /**
11131
- * Align Items
11132
- * @see https://tailwindcss.com/docs/align-items
11133
- */
11134
- 'align-items': [{
11135
- items: [...scaleAlignSecondaryAxis(), {
11136
- baseline: ['', 'last']
11137
- }]
11138
- }],
11139
- /**
11140
- * Align Self
11141
- * @see https://tailwindcss.com/docs/align-self
11142
- */
11143
- 'align-self': [{
11144
- self: ['auto', ...scaleAlignSecondaryAxis(), {
11145
- baseline: ['', 'last']
11146
- }]
11147
- }],
11148
- /**
11149
- * Place Content
11150
- * @see https://tailwindcss.com/docs/place-content
11151
- */
11152
- 'place-content': [{
11153
- 'place-content': scaleAlignPrimaryAxis()
11154
- }],
11155
- /**
11156
- * Place Items
11157
- * @see https://tailwindcss.com/docs/place-items
11158
- */
11159
- 'place-items': [{
11160
- 'place-items': [...scaleAlignSecondaryAxis(), 'baseline']
11161
- }],
11162
- /**
11163
- * Place Self
11164
- * @see https://tailwindcss.com/docs/place-self
11165
- */
11166
- 'place-self': [{
11167
- 'place-self': ['auto', ...scaleAlignSecondaryAxis()]
11168
- }],
11169
- // Spacing
11170
- /**
11171
- * Padding
11172
- * @see https://tailwindcss.com/docs/padding
11173
- */
11174
- p: [{
11175
- p: scaleUnambiguousSpacing()
11176
- }],
11177
- /**
11178
- * Padding X
11179
- * @see https://tailwindcss.com/docs/padding
11180
- */
11181
- px: [{
11182
- px: scaleUnambiguousSpacing()
11183
- }],
11184
- /**
11185
- * Padding Y
11186
- * @see https://tailwindcss.com/docs/padding
11187
- */
11188
- py: [{
11189
- py: scaleUnambiguousSpacing()
11190
- }],
11191
- /**
11192
- * Padding Start
11193
- * @see https://tailwindcss.com/docs/padding
11194
- */
11195
- ps: [{
11196
- ps: scaleUnambiguousSpacing()
11197
- }],
11198
- /**
11199
- * Padding End
11200
- * @see https://tailwindcss.com/docs/padding
11201
- */
11202
- pe: [{
11203
- pe: scaleUnambiguousSpacing()
11204
- }],
11205
- /**
11206
- * Padding Top
11207
- * @see https://tailwindcss.com/docs/padding
11208
- */
11209
- pt: [{
11210
- pt: scaleUnambiguousSpacing()
11211
- }],
11212
- /**
11213
- * Padding Right
11214
- * @see https://tailwindcss.com/docs/padding
11215
- */
11216
- pr: [{
11217
- pr: scaleUnambiguousSpacing()
11218
- }],
11219
- /**
11220
- * Padding Bottom
11221
- * @see https://tailwindcss.com/docs/padding
11222
- */
11223
- pb: [{
11224
- pb: scaleUnambiguousSpacing()
11225
- }],
11226
- /**
11227
- * Padding Left
11228
- * @see https://tailwindcss.com/docs/padding
11229
- */
11230
- pl: [{
11231
- pl: scaleUnambiguousSpacing()
11232
- }],
11233
- /**
11234
- * Margin
11235
- * @see https://tailwindcss.com/docs/margin
11236
- */
11237
- m: [{
11238
- m: scaleMargin()
11239
- }],
11240
- /**
11241
- * Margin X
11242
- * @see https://tailwindcss.com/docs/margin
11243
- */
11244
- mx: [{
11245
- mx: scaleMargin()
11246
- }],
11247
- /**
11248
- * Margin Y
11249
- * @see https://tailwindcss.com/docs/margin
11250
- */
11251
- my: [{
11252
- my: scaleMargin()
11253
- }],
11254
- /**
11255
- * Margin Start
11256
- * @see https://tailwindcss.com/docs/margin
11257
- */
11258
- ms: [{
11259
- ms: scaleMargin()
11260
- }],
11261
- /**
11262
- * Margin End
11263
- * @see https://tailwindcss.com/docs/margin
11264
- */
11265
- me: [{
11266
- me: scaleMargin()
11267
- }],
11268
- /**
11269
- * Margin Top
11270
- * @see https://tailwindcss.com/docs/margin
11271
- */
11272
- mt: [{
11273
- mt: scaleMargin()
11274
- }],
11275
- /**
11276
- * Margin Right
11277
- * @see https://tailwindcss.com/docs/margin
11278
- */
11279
- mr: [{
11280
- mr: scaleMargin()
11281
- }],
11282
- /**
11283
- * Margin Bottom
11284
- * @see https://tailwindcss.com/docs/margin
11285
- */
11286
- mb: [{
11287
- mb: scaleMargin()
11288
- }],
11289
- /**
11290
- * Margin Left
11291
- * @see https://tailwindcss.com/docs/margin
11292
- */
11293
- ml: [{
11294
- ml: scaleMargin()
11295
- }],
11296
- /**
11297
- * Space Between X
11298
- * @see https://tailwindcss.com/docs/margin#adding-space-between-children
11299
- */
11300
- 'space-x': [{
11301
- 'space-x': scaleUnambiguousSpacing()
11302
- }],
11303
- /**
11304
- * Space Between X Reverse
11305
- * @see https://tailwindcss.com/docs/margin#adding-space-between-children
11306
- */
11307
- 'space-x-reverse': ['space-x-reverse'],
11308
- /**
11309
- * Space Between Y
11310
- * @see https://tailwindcss.com/docs/margin#adding-space-between-children
11311
- */
11312
- 'space-y': [{
11313
- 'space-y': scaleUnambiguousSpacing()
11314
- }],
11315
- /**
11316
- * Space Between Y Reverse
11317
- * @see https://tailwindcss.com/docs/margin#adding-space-between-children
11318
- */
11319
- 'space-y-reverse': ['space-y-reverse'],
11320
- // --------------
11321
- // --- Sizing ---
11322
- // --------------
11323
- /**
11324
- * Size
11325
- * @see https://tailwindcss.com/docs/width#setting-both-width-and-height
11326
- */
11327
- size: [{
11328
- size: scaleSizing()
11329
- }],
11330
- /**
11331
- * Width
11332
- * @see https://tailwindcss.com/docs/width
11333
- */
11334
- w: [{
11335
- w: [themeContainer, 'screen', ...scaleSizing()]
11336
- }],
11337
- /**
11338
- * Min-Width
11339
- * @see https://tailwindcss.com/docs/min-width
11340
- */
11341
- 'min-w': [{
11342
- 'min-w': [themeContainer, 'screen', /** Deprecated. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */
11343
- 'none', ...scaleSizing()]
11344
- }],
11345
- /**
11346
- * Max-Width
11347
- * @see https://tailwindcss.com/docs/max-width
11348
- */
11349
- 'max-w': [{
11350
- 'max-w': [themeContainer, 'screen', 'none', /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */
11351
- 'prose', /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */
11352
- {
11353
- screen: [themeBreakpoint]
11354
- }, ...scaleSizing()]
11355
- }],
11356
- /**
11357
- * Height
11358
- * @see https://tailwindcss.com/docs/height
11359
- */
11360
- h: [{
11361
- h: ['screen', 'lh', ...scaleSizing()]
11362
- }],
11363
- /**
11364
- * Min-Height
11365
- * @see https://tailwindcss.com/docs/min-height
11366
- */
11367
- 'min-h': [{
11368
- 'min-h': ['screen', 'lh', 'none', ...scaleSizing()]
11369
- }],
11370
- /**
11371
- * Max-Height
11372
- * @see https://tailwindcss.com/docs/max-height
11373
- */
11374
- 'max-h': [{
11375
- 'max-h': ['screen', 'lh', ...scaleSizing()]
11376
- }],
11377
- // ------------------
11378
- // --- Typography ---
11379
- // ------------------
11380
- /**
11381
- * Font Size
11382
- * @see https://tailwindcss.com/docs/font-size
11383
- */
11384
- 'font-size': [{
11385
- text: ['base', themeText, isArbitraryVariableLength, isArbitraryLength]
11386
- }],
11387
- /**
11388
- * Font Smoothing
11389
- * @see https://tailwindcss.com/docs/font-smoothing
11390
- */
11391
- 'font-smoothing': ['antialiased', 'subpixel-antialiased'],
11392
- /**
11393
- * Font Style
11394
- * @see https://tailwindcss.com/docs/font-style
11395
- */
11396
- 'font-style': ['italic', 'not-italic'],
11397
- /**
11398
- * Font Weight
11399
- * @see https://tailwindcss.com/docs/font-weight
11400
- */
11401
- 'font-weight': [{
11402
- font: [themeFontWeight, isArbitraryVariable, isArbitraryNumber]
11403
- }],
11404
- /**
11405
- * Font Stretch
11406
- * @see https://tailwindcss.com/docs/font-stretch
11407
- */
11408
- 'font-stretch': [{
11409
- 'font-stretch': ['ultra-condensed', 'extra-condensed', 'condensed', 'semi-condensed', 'normal', 'semi-expanded', 'expanded', 'extra-expanded', 'ultra-expanded', isPercent, isArbitraryValue]
11410
- }],
11411
- /**
11412
- * Font Family
11413
- * @see https://tailwindcss.com/docs/font-family
11414
- */
11415
- 'font-family': [{
11416
- font: [isArbitraryVariableFamilyName, isArbitraryValue, themeFont]
11417
- }],
11418
- /**
11419
- * Font Variant Numeric
11420
- * @see https://tailwindcss.com/docs/font-variant-numeric
11421
- */
11422
- 'fvn-normal': ['normal-nums'],
11423
- /**
11424
- * Font Variant Numeric
11425
- * @see https://tailwindcss.com/docs/font-variant-numeric
11426
- */
11427
- 'fvn-ordinal': ['ordinal'],
11428
- /**
11429
- * Font Variant Numeric
11430
- * @see https://tailwindcss.com/docs/font-variant-numeric
11431
- */
11432
- 'fvn-slashed-zero': ['slashed-zero'],
11433
- /**
11434
- * Font Variant Numeric
11435
- * @see https://tailwindcss.com/docs/font-variant-numeric
11436
- */
11437
- 'fvn-figure': ['lining-nums', 'oldstyle-nums'],
11438
- /**
11439
- * Font Variant Numeric
11440
- * @see https://tailwindcss.com/docs/font-variant-numeric
11441
- */
11442
- 'fvn-spacing': ['proportional-nums', 'tabular-nums'],
11443
- /**
11444
- * Font Variant Numeric
11445
- * @see https://tailwindcss.com/docs/font-variant-numeric
11446
- */
11447
- 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],
11448
- /**
11449
- * Letter Spacing
11450
- * @see https://tailwindcss.com/docs/letter-spacing
11451
- */
11452
- tracking: [{
11453
- tracking: [themeTracking, isArbitraryVariable, isArbitraryValue]
11454
- }],
11455
- /**
11456
- * Line Clamp
11457
- * @see https://tailwindcss.com/docs/line-clamp
11458
- */
11459
- 'line-clamp': [{
11460
- 'line-clamp': [isNumber, 'none', isArbitraryVariable, isArbitraryNumber]
11461
- }],
11462
- /**
11463
- * Line Height
11464
- * @see https://tailwindcss.com/docs/line-height
11465
- */
11466
- leading: [{
11467
- leading: [/** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */
11468
- themeLeading, ...scaleUnambiguousSpacing()]
11469
- }],
11470
- /**
11471
- * List Style Image
11472
- * @see https://tailwindcss.com/docs/list-style-image
11473
- */
11474
- 'list-image': [{
11475
- 'list-image': ['none', isArbitraryVariable, isArbitraryValue]
11476
- }],
11477
- /**
11478
- * List Style Position
11479
- * @see https://tailwindcss.com/docs/list-style-position
11480
- */
11481
- 'list-style-position': [{
11482
- list: ['inside', 'outside']
11483
- }],
11484
- /**
11485
- * List Style Type
11486
- * @see https://tailwindcss.com/docs/list-style-type
11487
- */
11488
- 'list-style-type': [{
11489
- list: ['disc', 'decimal', 'none', isArbitraryVariable, isArbitraryValue]
11490
- }],
11491
- /**
11492
- * Text Alignment
11493
- * @see https://tailwindcss.com/docs/text-align
11494
- */
11495
- 'text-alignment': [{
11496
- text: ['left', 'center', 'right', 'justify', 'start', 'end']
11497
- }],
11498
- /**
11499
- * Placeholder Color
11500
- * @deprecated since Tailwind CSS v3.0.0
11501
- * @see https://v3.tailwindcss.com/docs/placeholder-color
11502
- */
11503
- 'placeholder-color': [{
11504
- placeholder: scaleColor()
11505
- }],
11506
- /**
11507
- * Text Color
11508
- * @see https://tailwindcss.com/docs/text-color
11509
- */
11510
- 'text-color': [{
11511
- text: scaleColor()
11512
- }],
11513
- /**
11514
- * Text Decoration
11515
- * @see https://tailwindcss.com/docs/text-decoration
11516
- */
11517
- 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],
11518
- /**
11519
- * Text Decoration Style
11520
- * @see https://tailwindcss.com/docs/text-decoration-style
11521
- */
11522
- 'text-decoration-style': [{
11523
- decoration: [...scaleLineStyle(), 'wavy']
11524
- }],
11525
- /**
11526
- * Text Decoration Thickness
11527
- * @see https://tailwindcss.com/docs/text-decoration-thickness
11528
- */
11529
- 'text-decoration-thickness': [{
11530
- decoration: [isNumber, 'from-font', 'auto', isArbitraryVariable, isArbitraryLength]
11531
- }],
11532
- /**
11533
- * Text Decoration Color
11534
- * @see https://tailwindcss.com/docs/text-decoration-color
11535
- */
11536
- 'text-decoration-color': [{
11537
- decoration: scaleColor()
11538
- }],
11539
- /**
11540
- * Text Underline Offset
11541
- * @see https://tailwindcss.com/docs/text-underline-offset
11542
- */
11543
- 'underline-offset': [{
11544
- 'underline-offset': [isNumber, 'auto', isArbitraryVariable, isArbitraryValue]
11545
- }],
11546
- /**
11547
- * Text Transform
11548
- * @see https://tailwindcss.com/docs/text-transform
11549
- */
11550
- 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],
11551
- /**
11552
- * Text Overflow
11553
- * @see https://tailwindcss.com/docs/text-overflow
11554
- */
11555
- 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],
11556
- /**
11557
- * Text Wrap
11558
- * @see https://tailwindcss.com/docs/text-wrap
11559
- */
11560
- 'text-wrap': [{
11561
- text: ['wrap', 'nowrap', 'balance', 'pretty']
11562
- }],
11563
- /**
11564
- * Text Indent
11565
- * @see https://tailwindcss.com/docs/text-indent
11566
- */
11567
- indent: [{
11568
- indent: scaleUnambiguousSpacing()
11569
- }],
11570
- /**
11571
- * Vertical Alignment
11572
- * @see https://tailwindcss.com/docs/vertical-align
11573
- */
11574
- 'vertical-align': [{
11575
- align: ['baseline', 'top', 'middle', 'bottom', 'text-top', 'text-bottom', 'sub', 'super', isArbitraryVariable, isArbitraryValue]
11576
- }],
11577
- /**
11578
- * Whitespace
11579
- * @see https://tailwindcss.com/docs/whitespace
11580
- */
11581
- whitespace: [{
11582
- whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces']
11583
- }],
11584
- /**
11585
- * Word Break
11586
- * @see https://tailwindcss.com/docs/word-break
11587
- */
11588
- break: [{
11589
- break: ['normal', 'words', 'all', 'keep']
11590
- }],
11591
- /**
11592
- * Overflow Wrap
11593
- * @see https://tailwindcss.com/docs/overflow-wrap
11594
- */
11595
- wrap: [{
11596
- wrap: ['break-word', 'anywhere', 'normal']
11597
- }],
11598
- /**
11599
- * Hyphens
11600
- * @see https://tailwindcss.com/docs/hyphens
11601
- */
11602
- hyphens: [{
11603
- hyphens: ['none', 'manual', 'auto']
11604
- }],
11605
- /**
11606
- * Content
11607
- * @see https://tailwindcss.com/docs/content
11608
- */
11609
- content: [{
11610
- content: ['none', isArbitraryVariable, isArbitraryValue]
11611
- }],
11612
- // -------------------
11613
- // --- Backgrounds ---
11614
- // -------------------
11615
- /**
11616
- * Background Attachment
11617
- * @see https://tailwindcss.com/docs/background-attachment
11618
- */
11619
- 'bg-attachment': [{
11620
- bg: ['fixed', 'local', 'scroll']
11621
- }],
11622
- /**
11623
- * Background Clip
11624
- * @see https://tailwindcss.com/docs/background-clip
11625
- */
11626
- 'bg-clip': [{
11627
- 'bg-clip': ['border', 'padding', 'content', 'text']
11628
- }],
11629
- /**
11630
- * Background Origin
11631
- * @see https://tailwindcss.com/docs/background-origin
11632
- */
11633
- 'bg-origin': [{
11634
- 'bg-origin': ['border', 'padding', 'content']
11635
- }],
11636
- /**
11637
- * Background Position
11638
- * @see https://tailwindcss.com/docs/background-position
11639
- */
11640
- 'bg-position': [{
11641
- bg: scaleBgPosition()
11642
- }],
11643
- /**
11644
- * Background Repeat
11645
- * @see https://tailwindcss.com/docs/background-repeat
11646
- */
11647
- 'bg-repeat': [{
11648
- bg: scaleBgRepeat()
11649
- }],
11650
- /**
11651
- * Background Size
11652
- * @see https://tailwindcss.com/docs/background-size
11653
- */
11654
- 'bg-size': [{
11655
- bg: scaleBgSize()
11656
- }],
11657
- /**
11658
- * Background Image
11659
- * @see https://tailwindcss.com/docs/background-image
11660
- */
11661
- 'bg-image': [{
11662
- bg: ['none', {
11663
- linear: [{
11664
- to: ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl']
11665
- }, isInteger, isArbitraryVariable, isArbitraryValue],
11666
- radial: ['', isArbitraryVariable, isArbitraryValue],
11667
- conic: [isInteger, isArbitraryVariable, isArbitraryValue]
11668
- }, isArbitraryVariableImage, isArbitraryImage]
11669
- }],
11670
- /**
11671
- * Background Color
11672
- * @see https://tailwindcss.com/docs/background-color
11673
- */
11674
- 'bg-color': [{
11675
- bg: scaleColor()
11676
- }],
11677
- /**
11678
- * Gradient Color Stops From Position
11679
- * @see https://tailwindcss.com/docs/gradient-color-stops
11680
- */
11681
- 'gradient-from-pos': [{
11682
- from: scaleGradientStopPosition()
11683
- }],
11684
- /**
11685
- * Gradient Color Stops Via Position
11686
- * @see https://tailwindcss.com/docs/gradient-color-stops
11687
- */
11688
- 'gradient-via-pos': [{
11689
- via: scaleGradientStopPosition()
11690
- }],
11691
- /**
11692
- * Gradient Color Stops To Position
11693
- * @see https://tailwindcss.com/docs/gradient-color-stops
11694
- */
11695
- 'gradient-to-pos': [{
11696
- to: scaleGradientStopPosition()
11697
- }],
11698
- /**
11699
- * Gradient Color Stops From
11700
- * @see https://tailwindcss.com/docs/gradient-color-stops
11701
- */
11702
- 'gradient-from': [{
11703
- from: scaleColor()
11704
- }],
11705
- /**
11706
- * Gradient Color Stops Via
11707
- * @see https://tailwindcss.com/docs/gradient-color-stops
11708
- */
11709
- 'gradient-via': [{
11710
- via: scaleColor()
11711
- }],
11712
- /**
11713
- * Gradient Color Stops To
11714
- * @see https://tailwindcss.com/docs/gradient-color-stops
11715
- */
11716
- 'gradient-to': [{
11717
- to: scaleColor()
11718
- }],
11719
- // ---------------
11720
- // --- Borders ---
11721
- // ---------------
11722
- /**
11723
- * Border Radius
11724
- * @see https://tailwindcss.com/docs/border-radius
11725
- */
11726
- rounded: [{
11727
- rounded: scaleRadius()
11728
- }],
11729
- /**
11730
- * Border Radius Start
11731
- * @see https://tailwindcss.com/docs/border-radius
11732
- */
11733
- 'rounded-s': [{
11734
- 'rounded-s': scaleRadius()
11735
- }],
11736
- /**
11737
- * Border Radius End
11738
- * @see https://tailwindcss.com/docs/border-radius
11739
- */
11740
- 'rounded-e': [{
11741
- 'rounded-e': scaleRadius()
11742
- }],
11743
- /**
11744
- * Border Radius Top
11745
- * @see https://tailwindcss.com/docs/border-radius
11746
- */
11747
- 'rounded-t': [{
11748
- 'rounded-t': scaleRadius()
11749
- }],
11750
- /**
11751
- * Border Radius Right
11752
- * @see https://tailwindcss.com/docs/border-radius
11753
- */
11754
- 'rounded-r': [{
11755
- 'rounded-r': scaleRadius()
11756
- }],
11757
- /**
11758
- * Border Radius Bottom
11759
- * @see https://tailwindcss.com/docs/border-radius
11760
- */
11761
- 'rounded-b': [{
11762
- 'rounded-b': scaleRadius()
11763
- }],
11764
- /**
11765
- * Border Radius Left
11766
- * @see https://tailwindcss.com/docs/border-radius
11767
- */
11768
- 'rounded-l': [{
11769
- 'rounded-l': scaleRadius()
11770
- }],
11771
- /**
11772
- * Border Radius Start Start
11773
- * @see https://tailwindcss.com/docs/border-radius
11774
- */
11775
- 'rounded-ss': [{
11776
- 'rounded-ss': scaleRadius()
11777
- }],
11778
- /**
11779
- * Border Radius Start End
11780
- * @see https://tailwindcss.com/docs/border-radius
11781
- */
11782
- 'rounded-se': [{
11783
- 'rounded-se': scaleRadius()
11784
- }],
11785
- /**
11786
- * Border Radius End End
11787
- * @see https://tailwindcss.com/docs/border-radius
11788
- */
11789
- 'rounded-ee': [{
11790
- 'rounded-ee': scaleRadius()
11791
- }],
11792
- /**
11793
- * Border Radius End Start
11794
- * @see https://tailwindcss.com/docs/border-radius
11795
- */
11796
- 'rounded-es': [{
11797
- 'rounded-es': scaleRadius()
11798
- }],
11799
- /**
11800
- * Border Radius Top Left
11801
- * @see https://tailwindcss.com/docs/border-radius
11802
- */
11803
- 'rounded-tl': [{
11804
- 'rounded-tl': scaleRadius()
11805
- }],
11806
- /**
11807
- * Border Radius Top Right
11808
- * @see https://tailwindcss.com/docs/border-radius
11809
- */
11810
- 'rounded-tr': [{
11811
- 'rounded-tr': scaleRadius()
11812
- }],
11813
- /**
11814
- * Border Radius Bottom Right
11815
- * @see https://tailwindcss.com/docs/border-radius
11816
- */
11817
- 'rounded-br': [{
11818
- 'rounded-br': scaleRadius()
11819
- }],
11820
- /**
11821
- * Border Radius Bottom Left
11822
- * @see https://tailwindcss.com/docs/border-radius
11823
- */
11824
- 'rounded-bl': [{
11825
- 'rounded-bl': scaleRadius()
11826
- }],
11827
- /**
11828
- * Border Width
11829
- * @see https://tailwindcss.com/docs/border-width
11830
- */
11831
- 'border-w': [{
11832
- border: scaleBorderWidth()
11833
- }],
11834
- /**
11835
- * Border Width X
11836
- * @see https://tailwindcss.com/docs/border-width
11837
- */
11838
- 'border-w-x': [{
11839
- 'border-x': scaleBorderWidth()
11840
- }],
11841
- /**
11842
- * Border Width Y
11843
- * @see https://tailwindcss.com/docs/border-width
11844
- */
11845
- 'border-w-y': [{
11846
- 'border-y': scaleBorderWidth()
11847
- }],
11848
- /**
11849
- * Border Width Start
11850
- * @see https://tailwindcss.com/docs/border-width
11851
- */
11852
- 'border-w-s': [{
11853
- 'border-s': scaleBorderWidth()
11854
- }],
11855
- /**
11856
- * Border Width End
11857
- * @see https://tailwindcss.com/docs/border-width
11858
- */
11859
- 'border-w-e': [{
11860
- 'border-e': scaleBorderWidth()
11861
- }],
11862
- /**
11863
- * Border Width Top
11864
- * @see https://tailwindcss.com/docs/border-width
11865
- */
11866
- 'border-w-t': [{
11867
- 'border-t': scaleBorderWidth()
11868
- }],
11869
- /**
11870
- * Border Width Right
11871
- * @see https://tailwindcss.com/docs/border-width
11872
- */
11873
- 'border-w-r': [{
11874
- 'border-r': scaleBorderWidth()
11875
- }],
11876
- /**
11877
- * Border Width Bottom
11878
- * @see https://tailwindcss.com/docs/border-width
11879
- */
11880
- 'border-w-b': [{
11881
- 'border-b': scaleBorderWidth()
11882
- }],
11883
- /**
11884
- * Border Width Left
11885
- * @see https://tailwindcss.com/docs/border-width
11886
- */
11887
- 'border-w-l': [{
11888
- 'border-l': scaleBorderWidth()
11889
- }],
11890
- /**
11891
- * Divide Width X
11892
- * @see https://tailwindcss.com/docs/border-width#between-children
11893
- */
11894
- 'divide-x': [{
11895
- 'divide-x': scaleBorderWidth()
11896
- }],
11897
- /**
11898
- * Divide Width X Reverse
11899
- * @see https://tailwindcss.com/docs/border-width#between-children
11900
- */
11901
- 'divide-x-reverse': ['divide-x-reverse'],
11902
- /**
11903
- * Divide Width Y
11904
- * @see https://tailwindcss.com/docs/border-width#between-children
11905
- */
11906
- 'divide-y': [{
11907
- 'divide-y': scaleBorderWidth()
11908
- }],
11909
- /**
11910
- * Divide Width Y Reverse
11911
- * @see https://tailwindcss.com/docs/border-width#between-children
11912
- */
11913
- 'divide-y-reverse': ['divide-y-reverse'],
11914
- /**
11915
- * Border Style
11916
- * @see https://tailwindcss.com/docs/border-style
11917
- */
11918
- 'border-style': [{
11919
- border: [...scaleLineStyle(), 'hidden', 'none']
11920
- }],
11921
- /**
11922
- * Divide Style
11923
- * @see https://tailwindcss.com/docs/border-style#setting-the-divider-style
11924
- */
11925
- 'divide-style': [{
11926
- divide: [...scaleLineStyle(), 'hidden', 'none']
11927
- }],
11928
- /**
11929
- * Border Color
11930
- * @see https://tailwindcss.com/docs/border-color
11931
- */
11932
- 'border-color': [{
11933
- border: scaleColor()
11934
- }],
11935
- /**
11936
- * Border Color X
11937
- * @see https://tailwindcss.com/docs/border-color
11938
- */
11939
- 'border-color-x': [{
11940
- 'border-x': scaleColor()
11941
- }],
11942
- /**
11943
- * Border Color Y
11944
- * @see https://tailwindcss.com/docs/border-color
11945
- */
11946
- 'border-color-y': [{
11947
- 'border-y': scaleColor()
11948
- }],
11949
- /**
11950
- * Border Color S
11951
- * @see https://tailwindcss.com/docs/border-color
11952
- */
11953
- 'border-color-s': [{
11954
- 'border-s': scaleColor()
11955
- }],
11956
- /**
11957
- * Border Color E
11958
- * @see https://tailwindcss.com/docs/border-color
11959
- */
11960
- 'border-color-e': [{
11961
- 'border-e': scaleColor()
11962
- }],
11963
- /**
11964
- * Border Color Top
11965
- * @see https://tailwindcss.com/docs/border-color
11966
- */
11967
- 'border-color-t': [{
11968
- 'border-t': scaleColor()
11969
- }],
11970
- /**
11971
- * Border Color Right
11972
- * @see https://tailwindcss.com/docs/border-color
11973
- */
11974
- 'border-color-r': [{
11975
- 'border-r': scaleColor()
11976
- }],
11977
- /**
11978
- * Border Color Bottom
11979
- * @see https://tailwindcss.com/docs/border-color
11980
- */
11981
- 'border-color-b': [{
11982
- 'border-b': scaleColor()
11983
- }],
11984
- /**
11985
- * Border Color Left
11986
- * @see https://tailwindcss.com/docs/border-color
11987
- */
11988
- 'border-color-l': [{
11989
- 'border-l': scaleColor()
11990
- }],
11991
- /**
11992
- * Divide Color
11993
- * @see https://tailwindcss.com/docs/divide-color
11994
- */
11995
- 'divide-color': [{
11996
- divide: scaleColor()
11997
- }],
11998
- /**
11999
- * Outline Style
12000
- * @see https://tailwindcss.com/docs/outline-style
12001
- */
12002
- 'outline-style': [{
12003
- outline: [...scaleLineStyle(), 'none', 'hidden']
12004
- }],
12005
- /**
12006
- * Outline Offset
12007
- * @see https://tailwindcss.com/docs/outline-offset
12008
- */
12009
- 'outline-offset': [{
12010
- 'outline-offset': [isNumber, isArbitraryVariable, isArbitraryValue]
12011
- }],
12012
- /**
12013
- * Outline Width
12014
- * @see https://tailwindcss.com/docs/outline-width
12015
- */
12016
- 'outline-w': [{
12017
- outline: ['', isNumber, isArbitraryVariableLength, isArbitraryLength]
12018
- }],
12019
- /**
12020
- * Outline Color
12021
- * @see https://tailwindcss.com/docs/outline-color
12022
- */
12023
- 'outline-color': [{
12024
- outline: scaleColor()
12025
- }],
12026
- // ---------------
12027
- // --- Effects ---
12028
- // ---------------
12029
- /**
12030
- * Box Shadow
12031
- * @see https://tailwindcss.com/docs/box-shadow
12032
- */
12033
- shadow: [{
12034
- shadow: [
12035
- // Deprecated since Tailwind CSS v4.0.0
12036
- '', 'none', themeShadow, isArbitraryVariableShadow, isArbitraryShadow]
12037
- }],
12038
- /**
12039
- * Box Shadow Color
12040
- * @see https://tailwindcss.com/docs/box-shadow#setting-the-shadow-color
12041
- */
12042
- 'shadow-color': [{
12043
- shadow: scaleColor()
12044
- }],
12045
- /**
12046
- * Inset Box Shadow
12047
- * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow
12048
- */
12049
- 'inset-shadow': [{
12050
- 'inset-shadow': ['none', themeInsetShadow, isArbitraryVariableShadow, isArbitraryShadow]
12051
- }],
12052
- /**
12053
- * Inset Box Shadow Color
12054
- * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color
12055
- */
12056
- 'inset-shadow-color': [{
12057
- 'inset-shadow': scaleColor()
12058
- }],
12059
- /**
12060
- * Ring Width
12061
- * @see https://tailwindcss.com/docs/box-shadow#adding-a-ring
12062
- */
12063
- 'ring-w': [{
12064
- ring: scaleBorderWidth()
12065
- }],
12066
- /**
12067
- * Ring Width Inset
12068
- * @see https://v3.tailwindcss.com/docs/ring-width#inset-rings
12069
- * @deprecated since Tailwind CSS v4.0.0
12070
- * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158
12071
- */
12072
- 'ring-w-inset': ['ring-inset'],
12073
- /**
12074
- * Ring Color
12075
- * @see https://tailwindcss.com/docs/box-shadow#setting-the-ring-color
12076
- */
12077
- 'ring-color': [{
12078
- ring: scaleColor()
12079
- }],
12080
- /**
12081
- * Ring Offset Width
12082
- * @see https://v3.tailwindcss.com/docs/ring-offset-width
12083
- * @deprecated since Tailwind CSS v4.0.0
12084
- * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158
12085
- */
12086
- 'ring-offset-w': [{
12087
- 'ring-offset': [isNumber, isArbitraryLength]
12088
- }],
12089
- /**
12090
- * Ring Offset Color
12091
- * @see https://v3.tailwindcss.com/docs/ring-offset-color
12092
- * @deprecated since Tailwind CSS v4.0.0
12093
- * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158
12094
- */
12095
- 'ring-offset-color': [{
12096
- 'ring-offset': scaleColor()
12097
- }],
12098
- /**
12099
- * Inset Ring Width
12100
- * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring
12101
- */
12102
- 'inset-ring-w': [{
12103
- 'inset-ring': scaleBorderWidth()
12104
- }],
12105
- /**
12106
- * Inset Ring Color
12107
- * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color
12108
- */
12109
- 'inset-ring-color': [{
12110
- 'inset-ring': scaleColor()
12111
- }],
12112
- /**
12113
- * Text Shadow
12114
- * @see https://tailwindcss.com/docs/text-shadow
12115
- */
12116
- 'text-shadow': [{
12117
- 'text-shadow': ['none', themeTextShadow, isArbitraryVariableShadow, isArbitraryShadow]
12118
- }],
12119
- /**
12120
- * Text Shadow Color
12121
- * @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color
12122
- */
12123
- 'text-shadow-color': [{
12124
- 'text-shadow': scaleColor()
12125
- }],
12126
- /**
12127
- * Opacity
12128
- * @see https://tailwindcss.com/docs/opacity
12129
- */
12130
- opacity: [{
12131
- opacity: [isNumber, isArbitraryVariable, isArbitraryValue]
12132
- }],
12133
- /**
12134
- * Mix Blend Mode
12135
- * @see https://tailwindcss.com/docs/mix-blend-mode
12136
- */
12137
- 'mix-blend': [{
12138
- 'mix-blend': [...scaleBlendMode(), 'plus-darker', 'plus-lighter']
12139
- }],
12140
- /**
12141
- * Background Blend Mode
12142
- * @see https://tailwindcss.com/docs/background-blend-mode
12143
- */
12144
- 'bg-blend': [{
12145
- 'bg-blend': scaleBlendMode()
12146
- }],
12147
- /**
12148
- * Mask Clip
12149
- * @see https://tailwindcss.com/docs/mask-clip
12150
- */
12151
- 'mask-clip': [{
12152
- 'mask-clip': ['border', 'padding', 'content', 'fill', 'stroke', 'view']
12153
- }, 'mask-no-clip'],
12154
- /**
12155
- * Mask Composite
12156
- * @see https://tailwindcss.com/docs/mask-composite
12157
- */
12158
- 'mask-composite': [{
12159
- mask: ['add', 'subtract', 'intersect', 'exclude']
12160
- }],
12161
- /**
12162
- * Mask Image
12163
- * @see https://tailwindcss.com/docs/mask-image
12164
- */
12165
- 'mask-image-linear-pos': [{
12166
- 'mask-linear': [isNumber]
12167
- }],
12168
- 'mask-image-linear-from-pos': [{
12169
- 'mask-linear-from': scaleMaskImagePosition()
12170
- }],
12171
- 'mask-image-linear-to-pos': [{
12172
- 'mask-linear-to': scaleMaskImagePosition()
12173
- }],
12174
- 'mask-image-linear-from-color': [{
12175
- 'mask-linear-from': scaleColor()
12176
- }],
12177
- 'mask-image-linear-to-color': [{
12178
- 'mask-linear-to': scaleColor()
12179
- }],
12180
- 'mask-image-t-from-pos': [{
12181
- 'mask-t-from': scaleMaskImagePosition()
12182
- }],
12183
- 'mask-image-t-to-pos': [{
12184
- 'mask-t-to': scaleMaskImagePosition()
12185
- }],
12186
- 'mask-image-t-from-color': [{
12187
- 'mask-t-from': scaleColor()
12188
- }],
12189
- 'mask-image-t-to-color': [{
12190
- 'mask-t-to': scaleColor()
12191
- }],
12192
- 'mask-image-r-from-pos': [{
12193
- 'mask-r-from': scaleMaskImagePosition()
12194
- }],
12195
- 'mask-image-r-to-pos': [{
12196
- 'mask-r-to': scaleMaskImagePosition()
12197
- }],
12198
- 'mask-image-r-from-color': [{
12199
- 'mask-r-from': scaleColor()
12200
- }],
12201
- 'mask-image-r-to-color': [{
12202
- 'mask-r-to': scaleColor()
12203
- }],
12204
- 'mask-image-b-from-pos': [{
12205
- 'mask-b-from': scaleMaskImagePosition()
12206
- }],
12207
- 'mask-image-b-to-pos': [{
12208
- 'mask-b-to': scaleMaskImagePosition()
12209
- }],
12210
- 'mask-image-b-from-color': [{
12211
- 'mask-b-from': scaleColor()
12212
- }],
12213
- 'mask-image-b-to-color': [{
12214
- 'mask-b-to': scaleColor()
12215
- }],
12216
- 'mask-image-l-from-pos': [{
12217
- 'mask-l-from': scaleMaskImagePosition()
12218
- }],
12219
- 'mask-image-l-to-pos': [{
12220
- 'mask-l-to': scaleMaskImagePosition()
12221
- }],
12222
- 'mask-image-l-from-color': [{
12223
- 'mask-l-from': scaleColor()
12224
- }],
12225
- 'mask-image-l-to-color': [{
12226
- 'mask-l-to': scaleColor()
12227
- }],
12228
- 'mask-image-x-from-pos': [{
12229
- 'mask-x-from': scaleMaskImagePosition()
12230
- }],
12231
- 'mask-image-x-to-pos': [{
12232
- 'mask-x-to': scaleMaskImagePosition()
12233
- }],
12234
- 'mask-image-x-from-color': [{
12235
- 'mask-x-from': scaleColor()
12236
- }],
12237
- 'mask-image-x-to-color': [{
12238
- 'mask-x-to': scaleColor()
12239
- }],
12240
- 'mask-image-y-from-pos': [{
12241
- 'mask-y-from': scaleMaskImagePosition()
12242
- }],
12243
- 'mask-image-y-to-pos': [{
12244
- 'mask-y-to': scaleMaskImagePosition()
12245
- }],
12246
- 'mask-image-y-from-color': [{
12247
- 'mask-y-from': scaleColor()
12248
- }],
12249
- 'mask-image-y-to-color': [{
12250
- 'mask-y-to': scaleColor()
12251
- }],
12252
- 'mask-image-radial': [{
12253
- 'mask-radial': [isArbitraryVariable, isArbitraryValue]
12254
- }],
12255
- 'mask-image-radial-from-pos': [{
12256
- 'mask-radial-from': scaleMaskImagePosition()
12257
- }],
12258
- 'mask-image-radial-to-pos': [{
12259
- 'mask-radial-to': scaleMaskImagePosition()
12260
- }],
12261
- 'mask-image-radial-from-color': [{
12262
- 'mask-radial-from': scaleColor()
12263
- }],
12264
- 'mask-image-radial-to-color': [{
12265
- 'mask-radial-to': scaleColor()
12266
- }],
12267
- 'mask-image-radial-shape': [{
12268
- 'mask-radial': ['circle', 'ellipse']
12269
- }],
12270
- 'mask-image-radial-size': [{
12271
- 'mask-radial': [{
12272
- closest: ['side', 'corner'],
12273
- farthest: ['side', 'corner']
12274
- }]
12275
- }],
12276
- 'mask-image-radial-pos': [{
12277
- 'mask-radial-at': scalePosition()
12278
- }],
12279
- 'mask-image-conic-pos': [{
12280
- 'mask-conic': [isNumber]
12281
- }],
12282
- 'mask-image-conic-from-pos': [{
12283
- 'mask-conic-from': scaleMaskImagePosition()
12284
- }],
12285
- 'mask-image-conic-to-pos': [{
12286
- 'mask-conic-to': scaleMaskImagePosition()
12287
- }],
12288
- 'mask-image-conic-from-color': [{
12289
- 'mask-conic-from': scaleColor()
12290
- }],
12291
- 'mask-image-conic-to-color': [{
12292
- 'mask-conic-to': scaleColor()
12293
- }],
12294
- /**
12295
- * Mask Mode
12296
- * @see https://tailwindcss.com/docs/mask-mode
12297
- */
12298
- 'mask-mode': [{
12299
- mask: ['alpha', 'luminance', 'match']
12300
- }],
12301
- /**
12302
- * Mask Origin
12303
- * @see https://tailwindcss.com/docs/mask-origin
12304
- */
12305
- 'mask-origin': [{
12306
- 'mask-origin': ['border', 'padding', 'content', 'fill', 'stroke', 'view']
12307
- }],
12308
- /**
12309
- * Mask Position
12310
- * @see https://tailwindcss.com/docs/mask-position
12311
- */
12312
- 'mask-position': [{
12313
- mask: scaleBgPosition()
12314
- }],
12315
- /**
12316
- * Mask Repeat
12317
- * @see https://tailwindcss.com/docs/mask-repeat
12318
- */
12319
- 'mask-repeat': [{
12320
- mask: scaleBgRepeat()
12321
- }],
12322
- /**
12323
- * Mask Size
12324
- * @see https://tailwindcss.com/docs/mask-size
12325
- */
12326
- 'mask-size': [{
12327
- mask: scaleBgSize()
12328
- }],
12329
- /**
12330
- * Mask Type
12331
- * @see https://tailwindcss.com/docs/mask-type
12332
- */
12333
- 'mask-type': [{
12334
- 'mask-type': ['alpha', 'luminance']
12335
- }],
12336
- /**
12337
- * Mask Image
12338
- * @see https://tailwindcss.com/docs/mask-image
12339
- */
12340
- 'mask-image': [{
12341
- mask: ['none', isArbitraryVariable, isArbitraryValue]
12342
- }],
12343
- // ---------------
12344
- // --- Filters ---
12345
- // ---------------
12346
- /**
12347
- * Filter
12348
- * @see https://tailwindcss.com/docs/filter
12349
- */
12350
- filter: [{
12351
- filter: [
12352
- // Deprecated since Tailwind CSS v3.0.0
12353
- '', 'none', isArbitraryVariable, isArbitraryValue]
12354
- }],
12355
- /**
12356
- * Blur
12357
- * @see https://tailwindcss.com/docs/blur
12358
- */
12359
- blur: [{
12360
- blur: scaleBlur()
12361
- }],
12362
- /**
12363
- * Brightness
12364
- * @see https://tailwindcss.com/docs/brightness
12365
- */
12366
- brightness: [{
12367
- brightness: [isNumber, isArbitraryVariable, isArbitraryValue]
12368
- }],
12369
- /**
12370
- * Contrast
12371
- * @see https://tailwindcss.com/docs/contrast
12372
- */
12373
- contrast: [{
12374
- contrast: [isNumber, isArbitraryVariable, isArbitraryValue]
12375
- }],
12376
- /**
12377
- * Drop Shadow
12378
- * @see https://tailwindcss.com/docs/drop-shadow
12379
- */
12380
- 'drop-shadow': [{
12381
- 'drop-shadow': [
12382
- // Deprecated since Tailwind CSS v4.0.0
12383
- '', 'none', themeDropShadow, isArbitraryVariableShadow, isArbitraryShadow]
12384
- }],
12385
- /**
12386
- * Drop Shadow Color
12387
- * @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color
12388
- */
12389
- 'drop-shadow-color': [{
12390
- 'drop-shadow': scaleColor()
12391
- }],
12392
- /**
12393
- * Grayscale
12394
- * @see https://tailwindcss.com/docs/grayscale
12395
- */
12396
- grayscale: [{
12397
- grayscale: ['', isNumber, isArbitraryVariable, isArbitraryValue]
12398
- }],
12399
- /**
12400
- * Hue Rotate
12401
- * @see https://tailwindcss.com/docs/hue-rotate
12402
- */
12403
- 'hue-rotate': [{
12404
- 'hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue]
12405
- }],
12406
- /**
12407
- * Invert
12408
- * @see https://tailwindcss.com/docs/invert
12409
- */
12410
- invert: [{
12411
- invert: ['', isNumber, isArbitraryVariable, isArbitraryValue]
12412
- }],
12413
- /**
12414
- * Saturate
12415
- * @see https://tailwindcss.com/docs/saturate
12416
- */
12417
- saturate: [{
12418
- saturate: [isNumber, isArbitraryVariable, isArbitraryValue]
12419
- }],
12420
- /**
12421
- * Sepia
12422
- * @see https://tailwindcss.com/docs/sepia
12423
- */
12424
- sepia: [{
12425
- sepia: ['', isNumber, isArbitraryVariable, isArbitraryValue]
12426
- }],
12427
- /**
12428
- * Backdrop Filter
12429
- * @see https://tailwindcss.com/docs/backdrop-filter
12430
- */
12431
- 'backdrop-filter': [{
12432
- 'backdrop-filter': [
12433
- // Deprecated since Tailwind CSS v3.0.0
12434
- '', 'none', isArbitraryVariable, isArbitraryValue]
12435
- }],
12436
- /**
12437
- * Backdrop Blur
12438
- * @see https://tailwindcss.com/docs/backdrop-blur
12439
- */
12440
- 'backdrop-blur': [{
12441
- 'backdrop-blur': scaleBlur()
12442
- }],
12443
- /**
12444
- * Backdrop Brightness
12445
- * @see https://tailwindcss.com/docs/backdrop-brightness
12446
- */
12447
- 'backdrop-brightness': [{
12448
- 'backdrop-brightness': [isNumber, isArbitraryVariable, isArbitraryValue]
12449
- }],
12450
- /**
12451
- * Backdrop Contrast
12452
- * @see https://tailwindcss.com/docs/backdrop-contrast
12453
- */
12454
- 'backdrop-contrast': [{
12455
- 'backdrop-contrast': [isNumber, isArbitraryVariable, isArbitraryValue]
12456
- }],
12457
- /**
12458
- * Backdrop Grayscale
12459
- * @see https://tailwindcss.com/docs/backdrop-grayscale
12460
- */
12461
- 'backdrop-grayscale': [{
12462
- 'backdrop-grayscale': ['', isNumber, isArbitraryVariable, isArbitraryValue]
12463
- }],
12464
- /**
12465
- * Backdrop Hue Rotate
12466
- * @see https://tailwindcss.com/docs/backdrop-hue-rotate
12467
- */
12468
- 'backdrop-hue-rotate': [{
12469
- 'backdrop-hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue]
12470
- }],
12471
- /**
12472
- * Backdrop Invert
12473
- * @see https://tailwindcss.com/docs/backdrop-invert
12474
- */
12475
- 'backdrop-invert': [{
12476
- 'backdrop-invert': ['', isNumber, isArbitraryVariable, isArbitraryValue]
12477
- }],
12478
- /**
12479
- * Backdrop Opacity
12480
- * @see https://tailwindcss.com/docs/backdrop-opacity
12481
- */
12482
- 'backdrop-opacity': [{
12483
- 'backdrop-opacity': [isNumber, isArbitraryVariable, isArbitraryValue]
12484
- }],
12485
- /**
12486
- * Backdrop Saturate
12487
- * @see https://tailwindcss.com/docs/backdrop-saturate
12488
- */
12489
- 'backdrop-saturate': [{
12490
- 'backdrop-saturate': [isNumber, isArbitraryVariable, isArbitraryValue]
12491
- }],
12492
- /**
12493
- * Backdrop Sepia
12494
- * @see https://tailwindcss.com/docs/backdrop-sepia
12495
- */
12496
- 'backdrop-sepia': [{
12497
- 'backdrop-sepia': ['', isNumber, isArbitraryVariable, isArbitraryValue]
12498
- }],
12499
- // --------------
12500
- // --- Tables ---
12501
- // --------------
12502
- /**
12503
- * Border Collapse
12504
- * @see https://tailwindcss.com/docs/border-collapse
12505
- */
12506
- 'border-collapse': [{
12507
- border: ['collapse', 'separate']
12508
- }],
12509
- /**
12510
- * Border Spacing
12511
- * @see https://tailwindcss.com/docs/border-spacing
12512
- */
12513
- 'border-spacing': [{
12514
- 'border-spacing': scaleUnambiguousSpacing()
12515
- }],
12516
- /**
12517
- * Border Spacing X
12518
- * @see https://tailwindcss.com/docs/border-spacing
12519
- */
12520
- 'border-spacing-x': [{
12521
- 'border-spacing-x': scaleUnambiguousSpacing()
12522
- }],
12523
- /**
12524
- * Border Spacing Y
12525
- * @see https://tailwindcss.com/docs/border-spacing
12526
- */
12527
- 'border-spacing-y': [{
12528
- 'border-spacing-y': scaleUnambiguousSpacing()
12529
- }],
12530
- /**
12531
- * Table Layout
12532
- * @see https://tailwindcss.com/docs/table-layout
12533
- */
12534
- 'table-layout': [{
12535
- table: ['auto', 'fixed']
12536
- }],
12537
- /**
12538
- * Caption Side
12539
- * @see https://tailwindcss.com/docs/caption-side
12540
- */
12541
- caption: [{
12542
- caption: ['top', 'bottom']
12543
- }],
12544
- // ---------------------------------
12545
- // --- Transitions and Animation ---
12546
- // ---------------------------------
12547
- /**
12548
- * Transition Property
12549
- * @see https://tailwindcss.com/docs/transition-property
12550
- */
12551
- transition: [{
12552
- transition: ['', 'all', 'colors', 'opacity', 'shadow', 'transform', 'none', isArbitraryVariable, isArbitraryValue]
12553
- }],
12554
- /**
12555
- * Transition Behavior
12556
- * @see https://tailwindcss.com/docs/transition-behavior
12557
- */
12558
- 'transition-behavior': [{
12559
- transition: ['normal', 'discrete']
12560
- }],
12561
- /**
12562
- * Transition Duration
12563
- * @see https://tailwindcss.com/docs/transition-duration
12564
- */
12565
- duration: [{
12566
- duration: [isNumber, 'initial', isArbitraryVariable, isArbitraryValue]
12567
- }],
12568
- /**
12569
- * Transition Timing Function
12570
- * @see https://tailwindcss.com/docs/transition-timing-function
12571
- */
12572
- ease: [{
12573
- ease: ['linear', 'initial', themeEase, isArbitraryVariable, isArbitraryValue]
12574
- }],
12575
- /**
12576
- * Transition Delay
12577
- * @see https://tailwindcss.com/docs/transition-delay
12578
- */
12579
- delay: [{
12580
- delay: [isNumber, isArbitraryVariable, isArbitraryValue]
12581
- }],
12582
- /**
12583
- * Animation
12584
- * @see https://tailwindcss.com/docs/animation
12585
- */
12586
- animate: [{
12587
- animate: ['none', themeAnimate, isArbitraryVariable, isArbitraryValue]
12588
- }],
12589
- // ------------------
12590
- // --- Transforms ---
12591
- // ------------------
12592
- /**
12593
- * Backface Visibility
12594
- * @see https://tailwindcss.com/docs/backface-visibility
12595
- */
12596
- backface: [{
12597
- backface: ['hidden', 'visible']
12598
- }],
12599
- /**
12600
- * Perspective
12601
- * @see https://tailwindcss.com/docs/perspective
12602
- */
12603
- perspective: [{
12604
- perspective: [themePerspective, isArbitraryVariable, isArbitraryValue]
12605
- }],
12606
- /**
12607
- * Perspective Origin
12608
- * @see https://tailwindcss.com/docs/perspective-origin
12609
- */
12610
- 'perspective-origin': [{
12611
- 'perspective-origin': scalePositionWithArbitrary()
12612
- }],
12613
- /**
12614
- * Rotate
12615
- * @see https://tailwindcss.com/docs/rotate
12616
- */
12617
- rotate: [{
12618
- rotate: scaleRotate()
12619
- }],
12620
- /**
12621
- * Rotate X
12622
- * @see https://tailwindcss.com/docs/rotate
12623
- */
12624
- 'rotate-x': [{
12625
- 'rotate-x': scaleRotate()
12626
- }],
12627
- /**
12628
- * Rotate Y
12629
- * @see https://tailwindcss.com/docs/rotate
12630
- */
12631
- 'rotate-y': [{
12632
- 'rotate-y': scaleRotate()
12633
- }],
12634
- /**
12635
- * Rotate Z
12636
- * @see https://tailwindcss.com/docs/rotate
12637
- */
12638
- 'rotate-z': [{
12639
- 'rotate-z': scaleRotate()
12640
- }],
12641
- /**
12642
- * Scale
12643
- * @see https://tailwindcss.com/docs/scale
12644
- */
12645
- scale: [{
12646
- scale: scaleScale()
12647
- }],
12648
- /**
12649
- * Scale X
12650
- * @see https://tailwindcss.com/docs/scale
12651
- */
12652
- 'scale-x': [{
12653
- 'scale-x': scaleScale()
12654
- }],
12655
- /**
12656
- * Scale Y
12657
- * @see https://tailwindcss.com/docs/scale
12658
- */
12659
- 'scale-y': [{
12660
- 'scale-y': scaleScale()
12661
- }],
12662
- /**
12663
- * Scale Z
12664
- * @see https://tailwindcss.com/docs/scale
12665
- */
12666
- 'scale-z': [{
12667
- 'scale-z': scaleScale()
12668
- }],
12669
- /**
12670
- * Scale 3D
12671
- * @see https://tailwindcss.com/docs/scale
12672
- */
12673
- 'scale-3d': ['scale-3d'],
12674
- /**
12675
- * Skew
12676
- * @see https://tailwindcss.com/docs/skew
12677
- */
12678
- skew: [{
12679
- skew: scaleSkew()
12680
- }],
12681
- /**
12682
- * Skew X
12683
- * @see https://tailwindcss.com/docs/skew
12684
- */
12685
- 'skew-x': [{
12686
- 'skew-x': scaleSkew()
12687
- }],
12688
- /**
12689
- * Skew Y
12690
- * @see https://tailwindcss.com/docs/skew
12691
- */
12692
- 'skew-y': [{
12693
- 'skew-y': scaleSkew()
12694
- }],
12695
- /**
12696
- * Transform
12697
- * @see https://tailwindcss.com/docs/transform
12698
- */
12699
- transform: [{
12700
- transform: [isArbitraryVariable, isArbitraryValue, '', 'none', 'gpu', 'cpu']
12701
- }],
12702
- /**
12703
- * Transform Origin
12704
- * @see https://tailwindcss.com/docs/transform-origin
12705
- */
12706
- 'transform-origin': [{
12707
- origin: scalePositionWithArbitrary()
12708
- }],
12709
- /**
12710
- * Transform Style
12711
- * @see https://tailwindcss.com/docs/transform-style
12712
- */
12713
- 'transform-style': [{
12714
- transform: ['3d', 'flat']
12715
- }],
12716
- /**
12717
- * Translate
12718
- * @see https://tailwindcss.com/docs/translate
12719
- */
12720
- translate: [{
12721
- translate: scaleTranslate()
12722
- }],
12723
- /**
12724
- * Translate X
12725
- * @see https://tailwindcss.com/docs/translate
12726
- */
12727
- 'translate-x': [{
12728
- 'translate-x': scaleTranslate()
12729
- }],
12730
- /**
12731
- * Translate Y
12732
- * @see https://tailwindcss.com/docs/translate
12733
- */
12734
- 'translate-y': [{
12735
- 'translate-y': scaleTranslate()
12736
- }],
12737
- /**
12738
- * Translate Z
12739
- * @see https://tailwindcss.com/docs/translate
12740
- */
12741
- 'translate-z': [{
12742
- 'translate-z': scaleTranslate()
12743
- }],
12744
- /**
12745
- * Translate None
12746
- * @see https://tailwindcss.com/docs/translate
12747
- */
12748
- 'translate-none': ['translate-none'],
12749
- // ---------------------
12750
- // --- Interactivity ---
12751
- // ---------------------
12752
- /**
12753
- * Accent Color
12754
- * @see https://tailwindcss.com/docs/accent-color
12755
- */
12756
- accent: [{
12757
- accent: scaleColor()
12758
- }],
12759
- /**
12760
- * Appearance
12761
- * @see https://tailwindcss.com/docs/appearance
12762
- */
12763
- appearance: [{
12764
- appearance: ['none', 'auto']
12765
- }],
12766
- /**
12767
- * Caret Color
12768
- * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities
12769
- */
12770
- 'caret-color': [{
12771
- caret: scaleColor()
12772
- }],
12773
- /**
12774
- * Color Scheme
12775
- * @see https://tailwindcss.com/docs/color-scheme
12776
- */
12777
- 'color-scheme': [{
12778
- scheme: ['normal', 'dark', 'light', 'light-dark', 'only-dark', 'only-light']
12779
- }],
12780
- /**
12781
- * Cursor
12782
- * @see https://tailwindcss.com/docs/cursor
12783
- */
12784
- cursor: [{
12785
- cursor: ['auto', 'default', 'pointer', 'wait', 'text', 'move', 'help', 'not-allowed', 'none', 'context-menu', 'progress', 'cell', 'crosshair', 'vertical-text', 'alias', 'copy', 'no-drop', 'grab', 'grabbing', 'all-scroll', 'col-resize', 'row-resize', 'n-resize', 'e-resize', 's-resize', 'w-resize', 'ne-resize', 'nw-resize', 'se-resize', 'sw-resize', 'ew-resize', 'ns-resize', 'nesw-resize', 'nwse-resize', 'zoom-in', 'zoom-out', isArbitraryVariable, isArbitraryValue]
12786
- }],
12787
- /**
12788
- * Field Sizing
12789
- * @see https://tailwindcss.com/docs/field-sizing
12790
- */
12791
- 'field-sizing': [{
12792
- 'field-sizing': ['fixed', 'content']
12793
- }],
12794
- /**
12795
- * Pointer Events
12796
- * @see https://tailwindcss.com/docs/pointer-events
12797
- */
12798
- 'pointer-events': [{
12799
- 'pointer-events': ['auto', 'none']
12800
- }],
12801
- /**
12802
- * Resize
12803
- * @see https://tailwindcss.com/docs/resize
12804
- */
12805
- resize: [{
12806
- resize: ['none', '', 'y', 'x']
12807
- }],
12808
- /**
12809
- * Scroll Behavior
12810
- * @see https://tailwindcss.com/docs/scroll-behavior
12811
- */
12812
- 'scroll-behavior': [{
12813
- scroll: ['auto', 'smooth']
12814
- }],
12815
- /**
12816
- * Scroll Margin
12817
- * @see https://tailwindcss.com/docs/scroll-margin
12818
- */
12819
- 'scroll-m': [{
12820
- 'scroll-m': scaleUnambiguousSpacing()
12821
- }],
12822
- /**
12823
- * Scroll Margin X
12824
- * @see https://tailwindcss.com/docs/scroll-margin
12825
- */
12826
- 'scroll-mx': [{
12827
- 'scroll-mx': scaleUnambiguousSpacing()
12828
- }],
12829
- /**
12830
- * Scroll Margin Y
12831
- * @see https://tailwindcss.com/docs/scroll-margin
12832
- */
12833
- 'scroll-my': [{
12834
- 'scroll-my': scaleUnambiguousSpacing()
12835
- }],
12836
- /**
12837
- * Scroll Margin Start
12838
- * @see https://tailwindcss.com/docs/scroll-margin
12839
- */
12840
- 'scroll-ms': [{
12841
- 'scroll-ms': scaleUnambiguousSpacing()
12842
- }],
12843
- /**
12844
- * Scroll Margin End
12845
- * @see https://tailwindcss.com/docs/scroll-margin
12846
- */
12847
- 'scroll-me': [{
12848
- 'scroll-me': scaleUnambiguousSpacing()
12849
- }],
12850
- /**
12851
- * Scroll Margin Top
12852
- * @see https://tailwindcss.com/docs/scroll-margin
12853
- */
12854
- 'scroll-mt': [{
12855
- 'scroll-mt': scaleUnambiguousSpacing()
12856
- }],
12857
- /**
12858
- * Scroll Margin Right
12859
- * @see https://tailwindcss.com/docs/scroll-margin
12860
- */
12861
- 'scroll-mr': [{
12862
- 'scroll-mr': scaleUnambiguousSpacing()
12863
- }],
12864
- /**
12865
- * Scroll Margin Bottom
12866
- * @see https://tailwindcss.com/docs/scroll-margin
12867
- */
12868
- 'scroll-mb': [{
12869
- 'scroll-mb': scaleUnambiguousSpacing()
12870
- }],
12871
- /**
12872
- * Scroll Margin Left
12873
- * @see https://tailwindcss.com/docs/scroll-margin
12874
- */
12875
- 'scroll-ml': [{
12876
- 'scroll-ml': scaleUnambiguousSpacing()
12877
- }],
12878
- /**
12879
- * Scroll Padding
12880
- * @see https://tailwindcss.com/docs/scroll-padding
12881
- */
12882
- 'scroll-p': [{
12883
- 'scroll-p': scaleUnambiguousSpacing()
12884
- }],
12885
- /**
12886
- * Scroll Padding X
12887
- * @see https://tailwindcss.com/docs/scroll-padding
12888
- */
12889
- 'scroll-px': [{
12890
- 'scroll-px': scaleUnambiguousSpacing()
12891
- }],
12892
- /**
12893
- * Scroll Padding Y
12894
- * @see https://tailwindcss.com/docs/scroll-padding
12895
- */
12896
- 'scroll-py': [{
12897
- 'scroll-py': scaleUnambiguousSpacing()
12898
- }],
12899
- /**
12900
- * Scroll Padding Start
12901
- * @see https://tailwindcss.com/docs/scroll-padding
12902
- */
12903
- 'scroll-ps': [{
12904
- 'scroll-ps': scaleUnambiguousSpacing()
12905
- }],
12906
- /**
12907
- * Scroll Padding End
12908
- * @see https://tailwindcss.com/docs/scroll-padding
12909
- */
12910
- 'scroll-pe': [{
12911
- 'scroll-pe': scaleUnambiguousSpacing()
12912
- }],
12913
- /**
12914
- * Scroll Padding Top
12915
- * @see https://tailwindcss.com/docs/scroll-padding
12916
- */
12917
- 'scroll-pt': [{
12918
- 'scroll-pt': scaleUnambiguousSpacing()
12919
- }],
12920
- /**
12921
- * Scroll Padding Right
12922
- * @see https://tailwindcss.com/docs/scroll-padding
12923
- */
12924
- 'scroll-pr': [{
12925
- 'scroll-pr': scaleUnambiguousSpacing()
12926
- }],
12927
- /**
12928
- * Scroll Padding Bottom
12929
- * @see https://tailwindcss.com/docs/scroll-padding
12930
- */
12931
- 'scroll-pb': [{
12932
- 'scroll-pb': scaleUnambiguousSpacing()
12933
- }],
12934
- /**
12935
- * Scroll Padding Left
12936
- * @see https://tailwindcss.com/docs/scroll-padding
12937
- */
12938
- 'scroll-pl': [{
12939
- 'scroll-pl': scaleUnambiguousSpacing()
12940
- }],
12941
- /**
12942
- * Scroll Snap Align
12943
- * @see https://tailwindcss.com/docs/scroll-snap-align
12944
- */
12945
- 'snap-align': [{
12946
- snap: ['start', 'end', 'center', 'align-none']
12947
- }],
12948
- /**
12949
- * Scroll Snap Stop
12950
- * @see https://tailwindcss.com/docs/scroll-snap-stop
12951
- */
12952
- 'snap-stop': [{
12953
- snap: ['normal', 'always']
12954
- }],
12955
- /**
12956
- * Scroll Snap Type
12957
- * @see https://tailwindcss.com/docs/scroll-snap-type
12958
- */
12959
- 'snap-type': [{
12960
- snap: ['none', 'x', 'y', 'both']
12961
- }],
12962
- /**
12963
- * Scroll Snap Type Strictness
12964
- * @see https://tailwindcss.com/docs/scroll-snap-type
12965
- */
12966
- 'snap-strictness': [{
12967
- snap: ['mandatory', 'proximity']
12968
- }],
12969
- /**
12970
- * Touch Action
12971
- * @see https://tailwindcss.com/docs/touch-action
12972
- */
12973
- touch: [{
12974
- touch: ['auto', 'none', 'manipulation']
12975
- }],
12976
- /**
12977
- * Touch Action X
12978
- * @see https://tailwindcss.com/docs/touch-action
12979
- */
12980
- 'touch-x': [{
12981
- 'touch-pan': ['x', 'left', 'right']
12982
- }],
12983
- /**
12984
- * Touch Action Y
12985
- * @see https://tailwindcss.com/docs/touch-action
12986
- */
12987
- 'touch-y': [{
12988
- 'touch-pan': ['y', 'up', 'down']
12989
- }],
12990
- /**
12991
- * Touch Action Pinch Zoom
12992
- * @see https://tailwindcss.com/docs/touch-action
12993
- */
12994
- 'touch-pz': ['touch-pinch-zoom'],
12995
- /**
12996
- * User Select
12997
- * @see https://tailwindcss.com/docs/user-select
12998
- */
12999
- select: [{
13000
- select: ['none', 'text', 'all', 'auto']
13001
- }],
13002
- /**
13003
- * Will Change
13004
- * @see https://tailwindcss.com/docs/will-change
13005
- */
13006
- 'will-change': [{
13007
- 'will-change': ['auto', 'scroll', 'contents', 'transform', isArbitraryVariable, isArbitraryValue]
13008
- }],
13009
- // -----------
13010
- // --- SVG ---
13011
- // -----------
13012
- /**
13013
- * Fill
13014
- * @see https://tailwindcss.com/docs/fill
13015
- */
13016
- fill: [{
13017
- fill: ['none', ...scaleColor()]
13018
- }],
13019
- /**
13020
- * Stroke Width
13021
- * @see https://tailwindcss.com/docs/stroke-width
13022
- */
13023
- 'stroke-w': [{
13024
- stroke: [isNumber, isArbitraryVariableLength, isArbitraryLength, isArbitraryNumber]
13025
- }],
13026
- /**
13027
- * Stroke
13028
- * @see https://tailwindcss.com/docs/stroke
13029
- */
13030
- stroke: [{
13031
- stroke: ['none', ...scaleColor()]
13032
- }],
13033
- // ---------------------
13034
- // --- Accessibility ---
13035
- // ---------------------
13036
- /**
13037
- * Forced Color Adjust
13038
- * @see https://tailwindcss.com/docs/forced-color-adjust
13039
- */
13040
- 'forced-color-adjust': [{
13041
- 'forced-color-adjust': ['auto', 'none']
13042
- }]
13043
- },
13044
- conflictingClassGroups: {
13045
- overflow: ['overflow-x', 'overflow-y'],
13046
- overscroll: ['overscroll-x', 'overscroll-y'],
13047
- inset: ['inset-x', 'inset-y', 'start', 'end', 'top', 'right', 'bottom', 'left'],
13048
- 'inset-x': ['right', 'left'],
13049
- 'inset-y': ['top', 'bottom'],
13050
- flex: ['basis', 'grow', 'shrink'],
13051
- gap: ['gap-x', 'gap-y'],
13052
- p: ['px', 'py', 'ps', 'pe', 'pt', 'pr', 'pb', 'pl'],
13053
- px: ['pr', 'pl'],
13054
- py: ['pt', 'pb'],
13055
- m: ['mx', 'my', 'ms', 'me', 'mt', 'mr', 'mb', 'ml'],
13056
- mx: ['mr', 'ml'],
13057
- my: ['mt', 'mb'],
13058
- size: ['w', 'h'],
13059
- 'font-size': ['leading'],
13060
- 'fvn-normal': ['fvn-ordinal', 'fvn-slashed-zero', 'fvn-figure', 'fvn-spacing', 'fvn-fraction'],
13061
- 'fvn-ordinal': ['fvn-normal'],
13062
- 'fvn-slashed-zero': ['fvn-normal'],
13063
- 'fvn-figure': ['fvn-normal'],
13064
- 'fvn-spacing': ['fvn-normal'],
13065
- 'fvn-fraction': ['fvn-normal'],
13066
- 'line-clamp': ['display', 'overflow'],
13067
- rounded: ['rounded-s', 'rounded-e', 'rounded-t', 'rounded-r', 'rounded-b', 'rounded-l', 'rounded-ss', 'rounded-se', 'rounded-ee', 'rounded-es', 'rounded-tl', 'rounded-tr', 'rounded-br', 'rounded-bl'],
13068
- 'rounded-s': ['rounded-ss', 'rounded-es'],
13069
- 'rounded-e': ['rounded-se', 'rounded-ee'],
13070
- 'rounded-t': ['rounded-tl', 'rounded-tr'],
13071
- 'rounded-r': ['rounded-tr', 'rounded-br'],
13072
- 'rounded-b': ['rounded-br', 'rounded-bl'],
13073
- 'rounded-l': ['rounded-tl', 'rounded-bl'],
13074
- 'border-spacing': ['border-spacing-x', 'border-spacing-y'],
13075
- 'border-w': ['border-w-x', 'border-w-y', 'border-w-s', 'border-w-e', 'border-w-t', 'border-w-r', 'border-w-b', 'border-w-l'],
13076
- 'border-w-x': ['border-w-r', 'border-w-l'],
13077
- 'border-w-y': ['border-w-t', 'border-w-b'],
13078
- 'border-color': ['border-color-x', 'border-color-y', 'border-color-s', 'border-color-e', 'border-color-t', 'border-color-r', 'border-color-b', 'border-color-l'],
13079
- 'border-color-x': ['border-color-r', 'border-color-l'],
13080
- 'border-color-y': ['border-color-t', 'border-color-b'],
13081
- translate: ['translate-x', 'translate-y', 'translate-none'],
13082
- 'translate-none': ['translate', 'translate-x', 'translate-y', 'translate-z'],
13083
- 'scroll-m': ['scroll-mx', 'scroll-my', 'scroll-ms', 'scroll-me', 'scroll-mt', 'scroll-mr', 'scroll-mb', 'scroll-ml'],
13084
- 'scroll-mx': ['scroll-mr', 'scroll-ml'],
13085
- 'scroll-my': ['scroll-mt', 'scroll-mb'],
13086
- 'scroll-p': ['scroll-px', 'scroll-py', 'scroll-ps', 'scroll-pe', 'scroll-pt', 'scroll-pr', 'scroll-pb', 'scroll-pl'],
13087
- 'scroll-px': ['scroll-pr', 'scroll-pl'],
13088
- 'scroll-py': ['scroll-pt', 'scroll-pb'],
13089
- touch: ['touch-x', 'touch-y', 'touch-pz'],
13090
- 'touch-x': ['touch'],
13091
- 'touch-y': ['touch'],
13092
- 'touch-pz': ['touch']
13093
- },
13094
- conflictingClassGroupModifiers: {
13095
- 'font-size': ['leading']
13096
- },
13097
- orderSensitiveModifiers: ['*', '**', 'after', 'backdrop', 'before', 'details-content', 'file', 'first-letter', 'first-line', 'marker', 'placeholder', 'selection']
13098
- };
13099
- };
13100
- const twMerge = /*#__PURE__*/createTailwindMerge(getDefaultConfig);
13101
-
13102
10288
  function cn(...inputs) {
13103
- return twMerge(clsx(inputs));
10289
+ return clsx(inputs);
13104
10290
  }
13105
10291
 
13106
10292
  function FloatingButton({
@@ -13117,16 +10303,14 @@ function FloatingButton({
13117
10303
  return null;
13118
10304
  }
13119
10305
  const positionClasses = {
13120
- "bottom-right": "bottom-6 right-6",
13121
- "bottom-left": "bottom-6 left-6",
13122
- "top-right": "top-6 right-6",
13123
- "top-left": "top-6 left-6"
10306
+ "bottom-right": "position-bottom-right",
10307
+ "bottom-left": "position-bottom-left",
10308
+ "top-right": "position-top-right",
10309
+ "top-left": "position-top-left"
13124
10310
  };
13125
10311
  return /*#__PURE__*/React.createElement("button", {
13126
- className: cn("cursor-pointer", "fixed flex items-center justify-center w-14 h-14 rounded-full shadow-lg", "bg-foreground text-background hover:bg-foreground/90", "transition-all duration-200 ease-in-out", "hover:scale-110 active:scale-95", "focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", positionClasses[config.ui.position], className),
13127
- style: {
13128
- zIndex: "var(--uxbert-z-button)"
13129
- },
10312
+ "data-uxbert-reportly": true,
10313
+ className: cn("uxbert-floating-button", positionClasses[config.ui.position], className),
13130
10314
  onClick: startAnnotation,
13131
10315
  title: "Report an issue",
13132
10316
  "aria-label": "Report an issue"
@@ -13183,12 +10367,10 @@ function IssueModal({
13183
10367
  }));
13184
10368
  }, []);
13185
10369
  const handleClose = useCallback(() => {
13186
- // Check if there's any data that would be lost
13187
10370
  const hasData = state.screenshot !== null || formData.title.trim() !== "" || formData.description.trim() !== "";
13188
10371
  if (hasData) {
13189
10372
  const confirmed = window.confirm("Are you sure you want to close? All unsaved data (screenshot, title, description) will be lost.");
13190
10373
  if (confirmed) {
13191
- // Clear all data
13192
10374
  reset();
13193
10375
  setFormData({
13194
10376
  title: "",
@@ -13199,7 +10381,6 @@ function IssueModal({
13199
10381
  closeModal();
13200
10382
  }
13201
10383
  } else {
13202
- // No data to lose, just close
13203
10384
  closeModal();
13204
10385
  }
13205
10386
  }, [state.screenshot, formData.title, formData.description, reset, closeModal]);
@@ -13232,7 +10413,6 @@ function IssueModal({
13232
10413
  try {
13233
10414
  setIsSubmitting(true);
13234
10415
  submitIssue(formData);
13235
- // Form data is cleared by the submitIssue function which calls reset()
13236
10416
  setFormData({
13237
10417
  title: "",
13238
10418
  description: "",
@@ -13278,32 +10458,30 @@ function IssueModal({
13278
10458
  }, [formData, state.screenshot, submitToN8n]);
13279
10459
  if (!state.isOpen) return null;
13280
10460
  return /*#__PURE__*/React.createElement("div", {
13281
- className: cn("fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center p-4 animate-fade-in", className),
13282
- style: {
13283
- zIndex: "var(--uxbert-z-modal)"
13284
- }
10461
+ "data-uxbert-reportly": true,
10462
+ className: cn("uxbert-modal-overlay", className)
13285
10463
  }, /*#__PURE__*/React.createElement("div", {
13286
- className: cn("bg-background rounded-lg shadow-2xl w-full max-w-2xl max-h-[90vh] overflow-y-auto", "animate-slide-up border border-border")
10464
+ className: "uxbert-modal-container"
13287
10465
  }, /*#__PURE__*/React.createElement("div", {
13288
- className: "p-6 border-b border-border"
10466
+ className: "uxbert-modal-header"
13289
10467
  }, /*#__PURE__*/React.createElement("div", {
13290
- className: "p-3 pb-6 flex items-center justify-center"
10468
+ className: "uxbert-logo-container"
13291
10469
  }, /*#__PURE__*/React.createElement(Logo, null)), /*#__PURE__*/React.createElement("div", {
13292
- className: "flex items-center justify-between "
10470
+ className: "uxbert-modal-header-content"
13293
10471
  }, /*#__PURE__*/React.createElement("div", {
13294
- className: "flex items-center gap-3"
10472
+ className: "uxbert-modal-title-wrapper"
13295
10473
  }, /*#__PURE__*/React.createElement("div", {
13296
- className: "w-10 h-10 rounded-full bg-foreground/10 flex items-center justify-center"
10474
+ className: "uxbert-modal-icon"
13297
10475
  }, /*#__PURE__*/React.createElement(Camera, {
13298
10476
  className: "w-5 h-5",
13299
10477
  style: {
13300
10478
  color: "currentColor"
13301
10479
  }
13302
10480
  })), /*#__PURE__*/React.createElement("h2", {
13303
- className: "text-xl font-semibold"
10481
+ className: "uxbert-modal-title"
13304
10482
  }, "Report Issue")), /*#__PURE__*/React.createElement("button", {
13305
10483
  onClick: handleClose,
13306
- className: "p-2 rounded-md hover:bg-muted transition-colors cursor-pointer",
10484
+ className: "uxbert-modal-close",
13307
10485
  "aria-label": "Close"
13308
10486
  }, /*#__PURE__*/React.createElement(X, {
13309
10487
  className: "w-5 h-5",
@@ -13311,50 +10489,50 @@ function IssueModal({
13311
10489
  color: "currentColor"
13312
10490
  }
13313
10491
  })))), /*#__PURE__*/React.createElement("div", {
13314
- className: "p-6"
10492
+ className: "uxbert-modal-body"
13315
10493
  }, !state.screenshot ? (/*#__PURE__*/React.createElement("div", {
13316
- className: "text-center py-8"
10494
+ className: "uxbert-capture-section"
13317
10495
  }, /*#__PURE__*/React.createElement("div", {
13318
- className: "w-16 h-16 bg-muted rounded-full flex items-center justify-center mx-auto mb-4"
10496
+ className: "uxbert-capture-icon"
13319
10497
  }, /*#__PURE__*/React.createElement(Camera, {
13320
- className: "w-8 h-8 text-muted-foreground",
10498
+ className: "w-8 h-8",
13321
10499
  style: {
13322
- color: "currentColor"
10500
+ color: "var(--uxbert-color-muted-foreground)"
13323
10501
  }
13324
10502
  })), /*#__PURE__*/React.createElement("h3", {
13325
- className: "text-lg font-medium mb-2"
10503
+ className: "uxbert-capture-title"
13326
10504
  }, "Capture Screenshot"), /*#__PURE__*/React.createElement("p", {
13327
- className: "text-sm text-muted-foreground mb-6"
10505
+ className: "uxbert-capture-description"
13328
10506
  }, "Choose what to capture before reporting your issue"), /*#__PURE__*/React.createElement("div", {
13329
- className: "flex flex-col gap-3 max-w-xs mx-auto mb-6"
10507
+ className: "uxbert-capture-modes"
13330
10508
  }, /*#__PURE__*/React.createElement("label", {
13331
- className: cn("flex items-center gap-3 p-4 rounded-lg border-2 cursor-pointer transition-all", captureMode === "viewport" ? "border-foreground bg-foreground/5" : "border-border hover:border-foreground/50")
10509
+ className: cn("uxbert-capture-mode-option", captureMode === "viewport" && "active")
13332
10510
  }, /*#__PURE__*/React.createElement("input", {
13333
10511
  type: "radio",
13334
10512
  name: "captureMode",
13335
10513
  value: "viewport",
13336
10514
  checked: captureMode === "viewport",
13337
10515
  onChange: e => setCaptureMode(e.target.value),
13338
- className: "w-4 h-4"
10516
+ className: "uxbert-capture-mode-radio"
13339
10517
  }), /*#__PURE__*/React.createElement("span", {
13340
- className: "text-sm font-medium"
10518
+ className: "uxbert-capture-mode-label"
13341
10519
  }, "Current viewport only")), /*#__PURE__*/React.createElement("label", {
13342
- className: cn("flex items-center gap-3 p-4 rounded-lg border-2 cursor-pointer transition-all", captureMode === "fullpage" ? "border-foreground bg-foreground/5" : "border-border hover:border-foreground/50")
10520
+ className: cn("uxbert-capture-mode-option", captureMode === "fullpage" && "active")
13343
10521
  }, /*#__PURE__*/React.createElement("input", {
13344
10522
  type: "radio",
13345
10523
  name: "captureMode",
13346
10524
  value: "fullpage",
13347
10525
  checked: captureMode === "fullpage",
13348
10526
  onChange: e => setCaptureMode(e.target.value),
13349
- className: "w-4 h-4"
10527
+ className: "uxbert-capture-mode-radio"
13350
10528
  }), /*#__PURE__*/React.createElement("span", {
13351
- className: "text-sm font-medium"
10529
+ className: "uxbert-capture-mode-label"
13352
10530
  }, "Full page"))), /*#__PURE__*/React.createElement("button", {
13353
10531
  onClick: handleCapture,
13354
10532
  disabled: state.isCapturing,
13355
- className: cn("inline-flex items-center gap-2 px-6 py-3 rounded-md font-medium transition-all cursor-pointer", "bg-foreground text-background hover:bg-foreground/90", "disabled:opacity-50 disabled:cursor-not-allowed")
10533
+ className: cn("uxbert-button", "uxbert-button-primary")
13356
10534
  }, state.isCapturing ? (/*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(LoaderCircle, {
13357
- className: "w-4 h-4 animate-spin",
10535
+ className: "w-4 h-4 uxbert-spinner",
13358
10536
  style: {
13359
10537
  color: "currentColor"
13360
10538
  }
@@ -13364,25 +10542,25 @@ function IssueModal({
13364
10542
  color: "currentColor"
13365
10543
  }
13366
10544
  }), "Capture Screenshot"))))) : (/*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
13367
- className: "mb-6"
10545
+ className: "uxbert-screenshot-section"
13368
10546
  }, /*#__PURE__*/React.createElement("h3", {
13369
- className: "text-sm font-medium mb-3 flex items-center gap-2"
10547
+ className: "uxbert-screenshot-header"
13370
10548
  }, /*#__PURE__*/React.createElement(Camera, {
13371
10549
  className: "w-4 h-4",
13372
10550
  style: {
13373
10551
  color: "currentColor"
13374
10552
  }
13375
10553
  }), "Screenshot Preview"), /*#__PURE__*/React.createElement("div", {
13376
- className: "border border-border rounded-lg overflow-hidden bg-muted"
10554
+ className: "uxbert-screenshot-preview"
13377
10555
  }, /*#__PURE__*/React.createElement("img", {
13378
10556
  src: state.screenshot,
13379
10557
  alt: "Screenshot preview",
13380
- className: "w-full h-auto max-h-72 object-contain"
10558
+ className: "uxbert-screenshot-image"
13381
10559
  })), /*#__PURE__*/React.createElement("div", {
13382
- className: "flex gap-2 mt-3"
10560
+ className: "uxbert-screenshot-actions"
13383
10561
  }, /*#__PURE__*/React.createElement("button", {
13384
10562
  onClick: handleRetake,
13385
- className: "flex items-center gap-2 px-4 py-2 text-sm rounded-md border border-border hover:bg-muted transition-colors cursor-pointer"
10563
+ className: cn("uxbert-button", "uxbert-button-secondary")
13386
10564
  }, /*#__PURE__*/React.createElement(RotateCcw, {
13387
10565
  className: "w-4 h-4",
13388
10566
  style: {
@@ -13390,7 +10568,7 @@ function IssueModal({
13390
10568
  }
13391
10569
  }), "Retake"), /*#__PURE__*/React.createElement("button", {
13392
10570
  onClick: startAnnotation,
13393
- className: "flex items-center gap-2 px-4 py-2 text-sm rounded-md border border-border hover:bg-muted transition-colors cursor-pointer"
10571
+ className: cn("uxbert-button", "uxbert-button-secondary")
13394
10572
  }, /*#__PURE__*/React.createElement(PenLine, {
13395
10573
  className: "w-4 h-4",
13396
10574
  style: {
@@ -13398,14 +10576,14 @@ function IssueModal({
13398
10576
  }
13399
10577
  }), "Annotate"))), /*#__PURE__*/React.createElement("form", {
13400
10578
  onSubmit: handleSubmit,
13401
- className: "space-y-5"
10579
+ className: "uxbert-form"
13402
10580
  }, /*#__PURE__*/React.createElement("div", {
13403
- className: "space-y-2"
10581
+ className: "uxbert-form-group"
13404
10582
  }, /*#__PURE__*/React.createElement("label", {
13405
10583
  htmlFor: "issue-title",
13406
- className: "text-sm font-medium block"
10584
+ className: "uxbert-form-label"
13407
10585
  }, "Issue Title ", /*#__PURE__*/React.createElement("span", {
13408
- className: "text-destructive"
10586
+ className: "uxbert-form-required"
13409
10587
  }, "*")), /*#__PURE__*/React.createElement("input", {
13410
10588
  id: "issue-title",
13411
10589
  type: "text",
@@ -13413,31 +10591,31 @@ function IssueModal({
13413
10591
  onChange: e => handleInputChange("title", e.target.value),
13414
10592
  placeholder: "Brief description of the issue",
13415
10593
  required: true,
13416
- className: cn("w-full px-4 py-2.5 rounded-md border border-input bg-background", "focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent", "placeholder:text-muted-foreground transition-colors")
10594
+ className: "uxbert-form-input"
13417
10595
  })), /*#__PURE__*/React.createElement("div", {
13418
- className: "space-y-2"
10596
+ className: "uxbert-form-group"
13419
10597
  }, /*#__PURE__*/React.createElement("label", {
13420
10598
  htmlFor: "issue-description",
13421
- className: "text-sm font-medium block"
10599
+ className: "uxbert-form-label"
13422
10600
  }, "Description"), /*#__PURE__*/React.createElement("textarea", {
13423
10601
  id: "issue-description",
13424
10602
  value: formData.description,
13425
10603
  onChange: e => handleInputChange("description", e.target.value),
13426
10604
  placeholder: "Detailed description of the issue (optional)",
13427
10605
  rows: 4,
13428
- className: cn("w-full px-4 py-2.5 rounded-md border border-input bg-background resize-none", "focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent", "placeholder:text-muted-foreground transition-colors")
10606
+ className: "uxbert-form-textarea"
13429
10607
  })), /*#__PURE__*/React.createElement("div", {
13430
- className: "grid grid-cols-2 gap-4"
10608
+ className: "uxbert-form-grid"
13431
10609
  }, /*#__PURE__*/React.createElement("div", {
13432
- className: "space-y-2"
10610
+ className: "uxbert-form-group"
13433
10611
  }, /*#__PURE__*/React.createElement("label", {
13434
10612
  htmlFor: "issue-priority",
13435
- className: "text-sm font-medium block"
10613
+ className: "uxbert-form-label"
13436
10614
  }, "Priority"), /*#__PURE__*/React.createElement("select", {
13437
10615
  id: "issue-priority",
13438
10616
  value: formData.priority,
13439
10617
  onChange: e => handleInputChange("priority", e.target.value),
13440
- className: cn("w-full px-4 py-2.5 rounded-md border border-input bg-background", "focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent", "transition-colors cursor-pointer")
10618
+ className: "uxbert-form-select"
13441
10619
  }, /*#__PURE__*/React.createElement("option", {
13442
10620
  value: "Low"
13443
10621
  }, "Low"), /*#__PURE__*/React.createElement("option", {
@@ -13447,42 +10625,42 @@ function IssueModal({
13447
10625
  }, "High"), /*#__PURE__*/React.createElement("option", {
13448
10626
  value: "Critical"
13449
10627
  }, "Critical"))), /*#__PURE__*/React.createElement("div", {
13450
- className: "space-y-2"
10628
+ className: "uxbert-form-group"
13451
10629
  }, /*#__PURE__*/React.createElement("label", {
13452
10630
  htmlFor: "device-type",
13453
- className: "text-sm font-medium block"
10631
+ className: "uxbert-form-label"
13454
10632
  }, "Device Type"), /*#__PURE__*/React.createElement("select", {
13455
10633
  id: "device-type",
13456
10634
  value: formData.deviceType,
13457
10635
  onChange: e => handleInputChange("deviceType", e.target.value),
13458
- className: cn("w-full px-4 py-2.5 rounded-md border border-input bg-background", "focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent", "transition-colors cursor-pointer")
10636
+ className: "uxbert-form-select"
13459
10637
  }, /*#__PURE__*/React.createElement("option", {
13460
10638
  value: "desktop"
13461
10639
  }, "Desktop"), /*#__PURE__*/React.createElement("option", {
13462
10640
  value: "mobile"
13463
10641
  }, "Mobile")))), /*#__PURE__*/React.createElement("div", {
13464
- className: "flex gap-3 pt-4"
10642
+ className: "uxbert-button-actions"
13465
10643
  }, /*#__PURE__*/React.createElement("button", {
13466
10644
  type: "submit",
13467
10645
  disabled: isSubmitting,
13468
- className: cn("flex-1 inline-flex items-center justify-center gap-2 px-6 py-3 rounded-md font-medium transition-all cursor-pointer", "bg-foreground text-background hover:bg-foreground/90", "disabled:opacity-50 disabled:cursor-not-allowed")
10646
+ className: cn("uxbert-button", "uxbert-button-primary", "uxbert-button-full")
13469
10647
  }, isSubmitting ? (/*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(LoaderCircle, {
13470
- className: "w-4 h-4 animate-spin",
10648
+ className: "w-4 h-4 uxbert-spinner",
13471
10649
  style: {
13472
- color: "var(--background)"
10650
+ color: "var(--uxbert-color-background)"
13473
10651
  }
13474
10652
  }), "Downloading...")) : (/*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Download, {
13475
10653
  className: "w-4 h-4",
13476
10654
  style: {
13477
- color: "var(--background)"
10655
+ color: "var(--uxbert-color-background)"
13478
10656
  }
13479
10657
  }), "Download JSON"))), state.config.integrations?.n8n?.enabled && (/*#__PURE__*/React.createElement("button", {
13480
10658
  type: "button",
13481
10659
  onClick: handleN8nSubmit,
13482
10660
  disabled: isSubmittingN8n,
13483
- className: cn("flex-1 inline-flex items-center justify-center gap-2 px-6 py-3 rounded-md font-medium transition-all cursor-pointer", "bg-foreground text-background hover:bg-foreground/90", "disabled:opacity-50 disabled:cursor-not-allowed")
10661
+ className: cn("uxbert-button", "uxbert-button-primary", "uxbert-button-full")
13484
10662
  }, isSubmittingN8n ? (/*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(LoaderCircle, {
13485
- className: "w-4 h-4 animate-spin",
10663
+ className: "w-4 h-4 uxbert-spinner",
13486
10664
  style: {
13487
10665
  color: "currentColor"
13488
10666
  }
@@ -13562,40 +10740,38 @@ function AnnotationToolbar({
13562
10740
  }
13563
10741
  };
13564
10742
  return /*#__PURE__*/React.createElement("div", {
13565
- className: cn("fixed top-1/2 right-6 -translate-y-1/2", "bg-background border border-border rounded-lg shadow-xl", "p-4 space-y-6 min-w-[200px] max-w-[220px]", className),
13566
- style: {
13567
- zIndex: "var(--uxbert-z-toolbar)"
13568
- }
10743
+ "data-uxbert-reportly": true,
10744
+ className: cn("uxbert-toolbar", className)
13569
10745
  }, /*#__PURE__*/React.createElement("div", {
13570
- className: "space-y-3"
10746
+ className: "uxbert-toolbar-section"
13571
10747
  }, /*#__PURE__*/React.createElement("h4", {
13572
- className: "text-xs font-semibold text-muted-foreground uppercase tracking-wide"
10748
+ className: "uxbert-toolbar-heading"
13573
10749
  }, "Tools"), /*#__PURE__*/React.createElement("div", {
13574
- className: "grid grid-cols-2 gap-2"
10750
+ className: "uxbert-toolbar-tools"
13575
10751
  }, tools.map(({
13576
10752
  id,
13577
10753
  label,
13578
10754
  Icon
13579
10755
  }) => (/*#__PURE__*/React.createElement("button", {
13580
10756
  key: id,
13581
- className: cn("flex items-center justify-center p-3 rounded-md border-2 transition-all", "hover:bg-muted", state.currentTool === id ? "border-foreground bg-foreground text-background" : "border-border bg-background"),
10757
+ className: cn("uxbert-toolbar-tool", state.currentTool === id && "active"),
13582
10758
  onClick: () => setTool(id),
13583
10759
  title: label,
13584
10760
  "aria-label": label
13585
10761
  }, /*#__PURE__*/React.createElement(Icon, {
13586
- className: "w-5 h-5 text-current"
10762
+ className: "w-5 h-5"
13587
10763
  })))))), /*#__PURE__*/React.createElement("div", {
13588
- className: "space-y-3"
10764
+ className: "uxbert-toolbar-section"
13589
10765
  }, /*#__PURE__*/React.createElement("h4", {
13590
- className: "text-xs font-semibold text-muted-foreground uppercase tracking-wide"
10766
+ className: "uxbert-toolbar-heading"
13591
10767
  }, "Colors"), /*#__PURE__*/React.createElement("div", {
13592
- className: "grid grid-cols-4 gap-2"
10768
+ className: "uxbert-toolbar-colors"
13593
10769
  }, colors.map(({
13594
10770
  hex,
13595
10771
  name
13596
10772
  }) => (/*#__PURE__*/React.createElement("button", {
13597
10773
  key: hex,
13598
- className: cn("w-8 h-8 rounded-full border-3 transition-all hover:scale-110", state.currentColor === hex ? "border-foreground scale-110 ring-2 ring-foreground ring-offset-2 ring-offset-background" : "border-transparent"),
10774
+ className: cn("uxbert-toolbar-color", state.currentColor === hex && "active"),
13599
10775
  style: {
13600
10776
  backgroundColor: hex
13601
10777
  },
@@ -13603,13 +10779,13 @@ function AnnotationToolbar({
13603
10779
  title: name,
13604
10780
  "aria-label": `Color: ${name}`
13605
10781
  }))))), /*#__PURE__*/React.createElement("div", {
13606
- className: "space-y-3"
10782
+ className: "uxbert-toolbar-section"
13607
10783
  }, /*#__PURE__*/React.createElement("h4", {
13608
- className: "text-xs font-semibold text-muted-foreground uppercase tracking-wide"
10784
+ className: "uxbert-toolbar-heading"
13609
10785
  }, "Actions"), /*#__PURE__*/React.createElement("div", {
13610
- className: "space-y-2"
10786
+ className: "uxbert-toolbar-actions"
13611
10787
  }, /*#__PURE__*/React.createElement("button", {
13612
- className: cn("w-full flex items-center justify-center gap-2 px-3 py-2.5 text-sm rounded-md", "border border-border hover:bg-muted transition-colors"),
10788
+ className: "uxbert-toolbar-action",
13613
10789
  onClick: onUndo,
13614
10790
  title: "Undo last action",
13615
10791
  "aria-label": "Undo"
@@ -13619,7 +10795,7 @@ function AnnotationToolbar({
13619
10795
  color: "currentColor"
13620
10796
  }
13621
10797
  }), "Undo"), /*#__PURE__*/React.createElement("button", {
13622
- className: cn("w-full flex items-center justify-center gap-2 px-3 py-2.5 text-sm rounded-md", "border border-destructive/50 text-destructive hover:bg-destructive/10 transition-colors"),
10798
+ className: cn("uxbert-toolbar-action", "destructive"),
13623
10799
  onClick: onClear,
13624
10800
  title: "Clear all annotations",
13625
10801
  "aria-label": "Clear all"
@@ -13629,9 +10805,11 @@ function AnnotationToolbar({
13629
10805
  color: "currentColor"
13630
10806
  }
13631
10807
  }), "Clear"))), /*#__PURE__*/React.createElement("div", {
13632
- className: "space-y-2 pt-4 border-t border-border"
10808
+ className: cn("uxbert-toolbar-section", "uxbert-toolbar-divider")
10809
+ }, /*#__PURE__*/React.createElement("div", {
10810
+ className: "uxbert-toolbar-actions"
13633
10811
  }, /*#__PURE__*/React.createElement("button", {
13634
- className: cn("w-full flex items-center justify-center gap-2 px-3 py-2.5 text-sm rounded-md", "border border-border hover:bg-muted transition-colors"),
10812
+ className: "uxbert-toolbar-action",
13635
10813
  onClick: handleExit,
13636
10814
  title: "Exit without saving",
13637
10815
  "aria-label": "Exit"
@@ -13641,7 +10819,7 @@ function AnnotationToolbar({
13641
10819
  color: "currentColor"
13642
10820
  }
13643
10821
  }), "Exit"), /*#__PURE__*/React.createElement("button", {
13644
- className: cn("w-full flex items-center justify-center gap-2 px-3 py-2.5 text-sm rounded-md font-medium", "bg-foreground text-background hover:bg-foreground/90 transition-colors"),
10822
+ className: cn("uxbert-toolbar-action", "uxbert-toolbar-action-primary"),
13645
10823
  onClick: handleDone,
13646
10824
  title: "Finish and save annotations",
13647
10825
  "aria-label": "Done"
@@ -13650,7 +10828,7 @@ function AnnotationToolbar({
13650
10828
  style: {
13651
10829
  color: "currentColor"
13652
10830
  }
13653
- }), "Done")));
10831
+ }), "Done"))));
13654
10832
  }
13655
10833
 
13656
10834
  class AnnotationManager {
@@ -14323,6 +11501,7 @@ function ReportlyInner() {
14323
11501
  endAnnotation();
14324
11502
  };
14325
11503
  return /*#__PURE__*/React.createElement("div", {
11504
+ "data-uxbert-reportly": true,
14326
11505
  "data-theme": state.config.ui?.theme || "light"
14327
11506
  }, /*#__PURE__*/React.createElement(FloatingButton, null), /*#__PURE__*/React.createElement(IssueModal, null), /*#__PURE__*/React.createElement(AnnotationToolbar, {
14328
11507
  onUndo: handleUndo,