@measured/puck-plugin-heading-analyzer 0.14.2-canary.2b2ef32 → 0.14.2-canary.47496c2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. package/dist/index.js +1379 -13
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -35204,6 +35204,26 @@ function getFurthestAway({
35204
35204
  }).sort((a2, b) => b.distance - a2.distance);
35205
35205
  return sorted[0] ? sorted[0].id : null;
35206
35206
  }
35207
+ function normalizeFamilies(pageBorderBox, candidates) {
35208
+ const families = candidates.reduce((acc, candidate) => {
35209
+ var _a3;
35210
+ const familyName = ((_a3 = candidate.parents[0]) == null ? void 0 : _a3.id) || candidate.descriptor.id;
35211
+ const family = acc[familyName] || [];
35212
+ const generation = candidate.parents.length;
35213
+ family[generation] = [...family[generation] || [], candidate];
35214
+ return __spreadProps(__spreadValues({}, acc), {
35215
+ [familyName]: family
35216
+ });
35217
+ }, {});
35218
+ return Object.keys(families).map((familyName) => {
35219
+ const family = families[familyName].flat();
35220
+ const reversedFamily = [...family].reverse();
35221
+ const chosenMember = reversedFamily.find((member) => {
35222
+ return pageBorderBox.center.x < member.page.borderBox.right && pageBorderBox.center.x > member.page.borderBox.left && pageBorderBox.center.y > member.page.borderBox.top && pageBorderBox.center.y < member.page.borderBox.bottom;
35223
+ });
35224
+ return chosenMember || family[0];
35225
+ });
35226
+ }
35207
35227
  function getDroppableOver({
35208
35228
  pageBorderBox,
35209
35229
  draggable: draggable2,
@@ -35244,10 +35264,14 @@ function getDroppableOver({
35244
35264
  if (candidates.length === 1) {
35245
35265
  return candidates[0].descriptor.id;
35246
35266
  }
35267
+ const normalizedCandidates = normalizeFamilies(pageBorderBox, candidates);
35268
+ if (normalizedCandidates.length === 1) {
35269
+ return normalizedCandidates[0].descriptor.id;
35270
+ }
35247
35271
  return getFurthestAway({
35248
35272
  pageBorderBox,
35249
35273
  draggable: draggable2,
35250
- candidates
35274
+ candidates: normalizedCandidates
35251
35275
  });
35252
35276
  }
35253
35277
  function getIsDisplaced({
@@ -37618,7 +37642,7 @@ function getBody() {
37618
37642
  !document.body ? process.env.NODE_ENV !== "production" ? invariant2(false, "document.body is not ready") : invariant2(false) : void 0;
37619
37643
  return document.body;
37620
37644
  }
37621
- var import_react5, import_react_dom2, isProduction$1, spacesAndTabs, lineStartWithSpaces, clean$2, getDevMessage, getFormattedMessage, isDisabledFlag, warning2, error, loaded, isProduction2, prefix$1, RbdInvariant, ErrorBoundary, dragHandleUsageInstructions, position, onDragStart, withLocation, withCombine, onDragUpdate, returnedToStart, onDragEnd, preset, preset$1, origin, add, subtract, isEqual$1, negate, patch, distance2, closest$1, apply, executeClip, offsetByPosition, getCorners, noSpacing2, scroll$1, increase, clip2, getSubject, scrollDroppable, toDroppableMap, toDraggableMap, toDroppableList, toDraggableList, getDraggablesInsideDroppable, removeDraggableFromList, moveToNextCombine, isHomeOf, noDisplacedBy, emptyGroups, noImpact, noImpact$1, isWithin, isPartiallyVisibleThroughFrame, isTotallyVisibleThroughFrame, vertical, horizontal, isTotallyVisibleThroughFrameOnAxis, getDroppableDisplaced, isVisibleInDroppable, isVisibleInViewport, isVisible$1, isPartiallyVisible, isTotallyVisible, isTotallyVisibleOnAxis, getShouldAnimate, fromCombine, fromReorder, moveToNextIndex, getCombinedItemDisplacement, whenCombining, distanceFromStartToBorderBoxCenter, distanceFromEndToBorderBoxCenter, getCrossAxisBorderBoxCenter, goAfter, goBefore, goIntoStart, whenReordering, withDroppableDisplacement, getResultWithoutDroppableDisplacement, getPageBorderBoxCenterFromImpact, scrollViewport, speculativelyIncrease, withViewportDisplacement, getClientFromPageBorderBoxCenter, isTotallyVisibleInNewLocation, moveToNextPlace, getKnownActive, getBestCrossAxisDroppable, getCurrentPageBorderBoxCenter, getCurrentPageBorderBox, getClosestDraggable, getDisplacedBy, getRequiredGrowthForPlaceholder, withMaxScroll, addPlaceholder, removePlaceholder, moveToNewDroppable, moveCrossAxis, whatIsDraggedOver, getDroppableOver$1, moveInDirection, offsetRectByPosition, withDroppableScroll, getReorderImpact, combineThresholdDivisor, getCombineImpact, getDragImpact, patchDroppableMap, clearUnusedPlaceholder, recomputePlaceholders, update, recompute, getClientBorderBoxCenter, refreshSnap, getHomeLocation, getLiftEffect, patchDimensionMap, start, finish, offsetDraggable, getFrame, adjustAdditionsForScrollChanges, timingsKey, publishWhileDraggingInVirtual, isSnapping, postDroppableChange, idle$2, reducer, beforeInitialCapture, lift$1, initialPublish, publishWhileDragging, collectionStarting, updateDroppableScroll, updateDroppableIsEnabled, updateDroppableIsCombineEnabled, move, moveByWindowScroll, updateViewportMaxScroll, moveUp, moveDown, moveRight, moveLeft, flush, animateDrop, completeDrop, drop$1, dropPending, dropAnimationFinished, lift, style, curves, combine, timings, outOfTheWayTiming, transitions, moveTo, transforms, minDropTime, maxDropTime, dropTimeRange, maxDropTimeAtDistance, cancelDropModifier, getDropDuration, getNewHomeClientOffset, getDropImpact, dropMiddleware, drop, getWindowScroll3, shouldEnd, scrollListener, scrollListener$1, getExpiringAnnounce, getAsyncMarshal, areLocationsEqual, isCombineEqual, isCriticalEqual, withTimings, getDragStart, getPublisher, responders, dropAnimationFinishMiddleware, dropAnimationFinish, dropAnimationFlushOnScrollMiddleware, dropAnimationFlushOnScroll, dimensionMarshalStopper, focus, shouldStop, autoScroll, pendingDrop, pendingDrop$1, composeEnhancers, createStore2, clean$1, getMaxScroll, getDocumentElement, getMaxWindowScroll, getViewport, getInitialPublish, createDimensionMarshal, canStartDrag, scrollWindow, getScrollableDroppables, getScrollableDroppableOver, getBestScrollableDroppable, defaultAutoScrollerOptions, getDistanceThresholds, getPercentage, minScroll, getValueFromDistance, dampenValueByTime, getValue, getScrollOnAxis, adjustForSizeLimits, clean, getScroll$1, smallestSigned, getOverlap, canPartiallyScroll, canScrollWindow, getWindowOverlap, canScrollDroppable, getDroppableOverlap, getWindowScrollChange, getDroppableScrollChange, iframeCache, createCol, matrixPattern, getMatrix, getOrigin, findNearestTransform, defaultTransform, getTransform, applyTransformPoint, applyTransformRect, applyTransformSpacing, applyTransformBox, resetToOrigin, getIframeScroll, scroll, createFluidScroller, createJumpScroller, createAutoScroller, prefix2, dragHandle, draggable, droppable, scrollContainer, makeGetSelector, getStyles, noPointerEvents, getStyles$1, useIsomorphicLayoutEffect2, useLayoutEffect2, getHead, createStyleEl, alwaysDataAttr, dynamicDataAttr, getWindowFromEl, dragHandleCache, StoreContext, getBodyElement, visuallyHidden, visuallyHidden$1, getId, count$1, defaults, useUniqueId$1, AppContext, peerDependencies, semver, getVersion, isSatisfied, checkReactVersion, suffix, checkDoctype, tab, enter, escape, space, pageUp, pageDown, end, home, arrowLeft, arrowUp, arrowRight, arrowDown, preventedKeys, preventStandardKeyEvents, supportedEventName, supportedPageVisibilityEventName, primaryButton, sloppyClickThreshold, idle$1, scrollJumpKeys, idle, timeForLongPress, forcePressThreshold, interactiveTagNames, getBorderBoxCenterPosition, supportedMatchesName, defaultSensors, createResponders, createAutoScrollerOptions, count, useUniqueContextId$1, zIndexOptions, getDraggingTransition, getDraggingOpacity, getShouldDraggingAnimate, applyOffsetBox, DroppableContext, Draggable, Draggable$1, isStrictEqual, whatIsDraggedOverFromResult, getCombineWithFromResult, getCombineWithFromImpact, atRest, makeMapStateToProps$1, mapDispatchToProps$1, ConnectedDraggable, ConnectedDraggable$1, getScroll, isEqual2, isScroll, isAuto, isVisible, isEither, isBoth, isElementScrollable, isBodyScrollable, getClosestScrollable, getClosestScrollable$1, getIsFixed, getEnv, getDroppableDimension, getClient, getDimension, immediate, delayed, getListenerOptions, getScrollable, getClosestScrollableFromDrag, empty, getSize, getStyle, Placeholder, Placeholder$1, shared, standard, virtual, AnimateInOut, Droppable, Droppable$1, defaultProps, attachDefaultPropsToOwnProps, isMatchingType, getDraggable, makeMapStateToProps, mapDispatchToProps, ConnectedDroppable, ConnectedDroppable$1;
37645
+ var import_react5, import_react_dom2, isProduction$1, spacesAndTabs, lineStartWithSpaces, clean$2, getDevMessage, getFormattedMessage, isDisabledFlag, warning2, error, loaded, isProduction2, prefix$1, RbdInvariant, ErrorBoundary, dragHandleUsageInstructions, position, onDragStart, withLocation, withCombine, onDragUpdate, returnedToStart, onDragEnd, preset, preset$1, origin, add, subtract, isEqual$1, negate, patch, distance2, closest$1, apply, executeClip, offsetByPosition, getCorners, noSpacing2, scroll$1, increase, clip2, getSubject, scrollDroppable, toDroppableMap, toDraggableMap, toDroppableList, toDraggableList, getDraggablesInsideDroppable, removeDraggableFromList, moveToNextCombine, isHomeOf, noDisplacedBy, emptyGroups, noImpact, noImpact$1, isWithin, isPartiallyVisibleThroughFrame, isTotallyVisibleThroughFrame, vertical, horizontal, isTotallyVisibleThroughFrameOnAxis, getDroppableDisplaced, isVisibleInDroppable, isVisibleInViewport, isVisible$1, isPartiallyVisible, isTotallyVisible, isTotallyVisibleOnAxis, getShouldAnimate, fromCombine, fromReorder, moveToNextIndex, getCombinedItemDisplacement, whenCombining, distanceFromStartToBorderBoxCenter, distanceFromEndToBorderBoxCenter, getCrossAxisBorderBoxCenter, goAfter, goBefore, goIntoStart, whenReordering, withDroppableDisplacement, getResultWithoutDroppableDisplacement, getPageBorderBoxCenterFromImpact, scrollViewport, speculativelyIncrease, withViewportDisplacement, getClientFromPageBorderBoxCenter, isTotallyVisibleInNewLocation, moveToNextPlace, getKnownActive, getBestCrossAxisDroppable, getCurrentPageBorderBoxCenter, getCurrentPageBorderBox, getClosestDraggable, getDisplacedBy, getRequiredGrowthForPlaceholder, withMaxScroll, addPlaceholder, removePlaceholder, moveToNewDroppable, moveCrossAxis, whatIsDraggedOver, getDroppableOver$1, moveInDirection, offsetRectByPosition, withDroppableScroll, getReorderImpact, combineThresholdDivisor, getCombineImpact, getDragImpact, patchDroppableMap, clearUnusedPlaceholder, recomputePlaceholders, update, recompute, getClientBorderBoxCenter, refreshSnap, getHomeLocation, getLiftEffect, patchDimensionMap, start, finish, offsetDraggable, getFrame, adjustAdditionsForScrollChanges, timingsKey, publishWhileDraggingInVirtual, isSnapping, postDroppableChange, idle$2, reducer, beforeInitialCapture, lift$1, initialPublish, publishWhileDragging, collectionStarting, updateDroppableScroll, updateDroppableIsEnabled, updateDroppableIsCombineEnabled, move, moveByWindowScroll, updateViewportMaxScroll, moveUp, moveDown, moveRight, moveLeft, flush, animateDrop, completeDrop, drop$1, dropPending, dropAnimationFinished, lift, style, curves, combine, timings, outOfTheWayTiming, transitions, moveTo, transforms, minDropTime, maxDropTime, dropTimeRange, maxDropTimeAtDistance, cancelDropModifier, getDropDuration, getNewHomeClientOffset, getDropImpact, dropMiddleware, drop, getWindowScroll3, shouldEnd, scrollListener, scrollListener$1, getExpiringAnnounce, getAsyncMarshal, areLocationsEqual, isCombineEqual, isCriticalEqual, withTimings, getDragStart, getPublisher, responders, dropAnimationFinishMiddleware, dropAnimationFinish, dropAnimationFlushOnScrollMiddleware, dropAnimationFlushOnScroll, dimensionMarshalStopper, focus, shouldStop, autoScroll, pendingDrop, pendingDrop$1, composeEnhancers, createStore2, clean$1, getMaxScroll, getDocumentElement, getMaxWindowScroll, getViewport, getInitialPublish, createDimensionMarshal, canStartDrag, scrollWindow, getScrollableDroppables, getScrollableDroppableOver, getBestScrollableDroppable, defaultAutoScrollerOptions, getDistanceThresholds, getPercentage, minScroll, getValueFromDistance, dampenValueByTime, getValue, getScrollOnAxis, adjustForSizeLimits, clean, getScroll$1, smallestSigned, getOverlap, canPartiallyScroll, canScrollWindow, getWindowOverlap, canScrollDroppable, getDroppableOverlap, getWindowScrollChange, getDroppableScrollChange, iframeCache, createCol, matrixPattern, getMatrix, getOrigin, findNearestTransform, defaultTransform, getTransform, applyTransformPoint, applyTransformRect, applyTransformSpacing, applyTransformBox, resetToOrigin, getIframeScroll, scroll, createFluidScroller, createJumpScroller, createAutoScroller, prefix2, dragHandle, draggable, droppable, scrollContainer, makeGetSelector, getStyles, noPointerEvents, getStyles$1, useIsomorphicLayoutEffect2, useLayoutEffect2, getHead, createStyleEl, alwaysDataAttr, dynamicDataAttr, getWindowFromEl, dragHandleCache, StoreContext, getBodyElement, visuallyHidden, visuallyHidden$1, getId, count$1, defaults, useUniqueId$1, AppContext, peerDependencies, semver, getVersion, isSatisfied, checkReactVersion, suffix, checkDoctype, tab, enter, escape, space, pageUp, pageDown, end, home, arrowLeft, arrowUp, arrowRight, arrowDown, preventedKeys, preventStandardKeyEvents, supportedEventName, supportedPageVisibilityEventName, primaryButton, sloppyClickThreshold, idle$1, scrollJumpKeys, idle, timeForLongPress, forcePressThreshold, interactiveTagNames, getBorderBoxCenterPosition, supportedMatchesName, defaultSensors, createResponders, createAutoScrollerOptions, count, useUniqueContextId$1, zIndexOptions, getDraggingTransition, getDraggingOpacity, getShouldDraggingAnimate, applyOffsetBox, DroppableContext, Draggable, Draggable$1, isStrictEqual, whatIsDraggedOverFromResult, getCombineWithFromResult, getCombineWithFromImpact, atRest, makeMapStateToProps$1, mapDispatchToProps$1, ConnectedDraggable, ConnectedDraggable$1, getScroll, isEqual2, isScroll, isAuto, isVisible, isEither, isBoth, isElementScrollable, isBodyScrollable, getClosestScrollable, getClosestScrollable$1, getIsFixed, getEnv, getDroppableDimension, getClient, getParents, getDimension, immediate, delayed, getListenerOptions, getScrollable, getClosestScrollableFromDrag, empty, getSize, getStyle, Placeholder, Placeholder$1, shared, standard, virtual, AnimateInOut, Droppable, Droppable$1, defaultProps, attachDefaultPropsToOwnProps, isMatchingType, getDraggable, makeMapStateToProps, mapDispatchToProps, ConnectedDroppable, ConnectedDroppable$1;
37622
37646
  var init_dnd_esm = __esm({
37623
37647
  "../../node_modules/@measured/dnd/dist/dnd.esm.js"() {
37624
37648
  init_react_import();
@@ -41987,7 +42011,8 @@ var init_dnd_esm = __esm({
41987
42011
  client,
41988
42012
  page,
41989
42013
  closest: closest2,
41990
- transform
42014
+ transform,
42015
+ parents
41991
42016
  }) => {
41992
42017
  const frame = (() => {
41993
42018
  if (!closest2) {
@@ -42036,7 +42061,8 @@ var init_dnd_esm = __esm({
42036
42061
  page,
42037
42062
  frame,
42038
42063
  subject,
42039
- transform
42064
+ transform,
42065
+ parents
42040
42066
  };
42041
42067
  return dimension;
42042
42068
  };
@@ -42073,6 +42099,27 @@ var init_dnd_esm = __esm({
42073
42099
  });
42074
42100
  return client;
42075
42101
  };
42102
+ getParents = (ref2) => {
42103
+ var _a3;
42104
+ const contextId = ref2.getAttribute(`${prefix2}-droppable-context-id`);
42105
+ const parentDescriptors = [];
42106
+ if (!contextId)
42107
+ return [];
42108
+ let currentEl = ref2;
42109
+ while (currentEl) {
42110
+ currentEl = (_a3 = currentEl.parentElement) == null ? void 0 : _a3.closest(`[${prefix2}-droppable-context-id="${contextId}"]`);
42111
+ const id = currentEl == null ? void 0 : currentEl.getAttribute(`${prefix2}-droppable-id`);
42112
+ if (id) {
42113
+ parentDescriptors.push({
42114
+ id,
42115
+ mode: "standard",
42116
+ type: "DEFAULT"
42117
+ });
42118
+ }
42119
+ }
42120
+ parentDescriptors.reverse();
42121
+ return parentDescriptors;
42122
+ };
42076
42123
  getDimension = ({
42077
42124
  ref: ref2,
42078
42125
  descriptor,
@@ -42108,6 +42155,7 @@ var init_dnd_esm = __esm({
42108
42155
  shouldClipSubject
42109
42156
  };
42110
42157
  })();
42158
+ const parents = getParents(ref2);
42111
42159
  const dimension = getDroppableDimension({
42112
42160
  descriptor,
42113
42161
  isEnabled: !isDropDisabled,
@@ -42117,7 +42165,8 @@ var init_dnd_esm = __esm({
42117
42165
  client,
42118
42166
  page,
42119
42167
  closest: closest2,
42120
- transform
42168
+ transform,
42169
+ parents
42121
42170
  });
42122
42171
  return dimension;
42123
42172
  };
@@ -42588,6 +42637,1291 @@ var init_dnd_esm = __esm({
42588
42637
  }
42589
42638
  });
42590
42639
 
42640
+ // ../../node_modules/ua-parser-js/src/ua-parser.js
42641
+ var require_ua_parser = __commonJS({
42642
+ "../../node_modules/ua-parser-js/src/ua-parser.js"(exports, module2) {
42643
+ init_react_import();
42644
+ (function(window2, undefined2) {
42645
+ "use strict";
42646
+ var LIBVERSION = "1.0.37", EMPTY = "", UNKNOWN = "?", FUNC_TYPE = "function", UNDEF_TYPE = "undefined", OBJ_TYPE = "object", STR_TYPE = "string", MAJOR = "major", MODEL = "model", NAME = "name", TYPE2 = "type", VENDOR = "vendor", VERSION = "version", ARCHITECTURE = "architecture", CONSOLE = "console", MOBILE = "mobile", TABLET = "tablet", SMARTTV = "smarttv", WEARABLE = "wearable", EMBEDDED = "embedded", UA_MAX_LENGTH = 500;
42647
+ var AMAZON = "Amazon", APPLE = "Apple", ASUS = "ASUS", BLACKBERRY = "BlackBerry", BROWSER = "Browser", CHROME = "Chrome", EDGE = "Edge", FIREFOX = "Firefox", GOOGLE = "Google", HUAWEI = "Huawei", LG = "LG", MICROSOFT = "Microsoft", MOTOROLA = "Motorola", OPERA = "Opera", SAMSUNG = "Samsung", SHARP = "Sharp", SONY = "Sony", XIAOMI = "Xiaomi", ZEBRA = "Zebra", FACEBOOK = "Facebook", CHROMIUM_OS = "Chromium OS", MAC_OS = "Mac OS";
42648
+ var extend = function(regexes2, extensions) {
42649
+ var mergedRegexes = {};
42650
+ for (var i2 in regexes2) {
42651
+ if (extensions[i2] && extensions[i2].length % 2 === 0) {
42652
+ mergedRegexes[i2] = extensions[i2].concat(regexes2[i2]);
42653
+ } else {
42654
+ mergedRegexes[i2] = regexes2[i2];
42655
+ }
42656
+ }
42657
+ return mergedRegexes;
42658
+ }, enumerize = function(arr) {
42659
+ var enums = {};
42660
+ for (var i2 = 0; i2 < arr.length; i2++) {
42661
+ enums[arr[i2].toUpperCase()] = arr[i2];
42662
+ }
42663
+ return enums;
42664
+ }, has = function(str1, str2) {
42665
+ return typeof str1 === STR_TYPE ? lowerize(str2).indexOf(lowerize(str1)) !== -1 : false;
42666
+ }, lowerize = function(str) {
42667
+ return str.toLowerCase();
42668
+ }, majorize = function(version2) {
42669
+ return typeof version2 === STR_TYPE ? version2.replace(/[^\d\.]/g, EMPTY).split(".")[0] : undefined2;
42670
+ }, trim = function(str, len) {
42671
+ if (typeof str === STR_TYPE) {
42672
+ str = str.replace(/^\s\s*/, EMPTY);
42673
+ return typeof len === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
42674
+ }
42675
+ };
42676
+ var rgxMapper = function(ua, arrays) {
42677
+ var i2 = 0, j, k, p, q, matches, match;
42678
+ while (i2 < arrays.length && !matches) {
42679
+ var regex = arrays[i2], props = arrays[i2 + 1];
42680
+ j = k = 0;
42681
+ while (j < regex.length && !matches) {
42682
+ if (!regex[j]) {
42683
+ break;
42684
+ }
42685
+ matches = regex[j++].exec(ua);
42686
+ if (!!matches) {
42687
+ for (p = 0; p < props.length; p++) {
42688
+ match = matches[++k];
42689
+ q = props[p];
42690
+ if (typeof q === OBJ_TYPE && q.length > 0) {
42691
+ if (q.length === 2) {
42692
+ if (typeof q[1] == FUNC_TYPE) {
42693
+ this[q[0]] = q[1].call(this, match);
42694
+ } else {
42695
+ this[q[0]] = q[1];
42696
+ }
42697
+ } else if (q.length === 3) {
42698
+ if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
42699
+ this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined2;
42700
+ } else {
42701
+ this[q[0]] = match ? match.replace(q[1], q[2]) : undefined2;
42702
+ }
42703
+ } else if (q.length === 4) {
42704
+ this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined2;
42705
+ }
42706
+ } else {
42707
+ this[q] = match ? match : undefined2;
42708
+ }
42709
+ }
42710
+ }
42711
+ }
42712
+ i2 += 2;
42713
+ }
42714
+ }, strMapper = function(str, map) {
42715
+ for (var i2 in map) {
42716
+ if (typeof map[i2] === OBJ_TYPE && map[i2].length > 0) {
42717
+ for (var j = 0; j < map[i2].length; j++) {
42718
+ if (has(map[i2][j], str)) {
42719
+ return i2 === UNKNOWN ? undefined2 : i2;
42720
+ }
42721
+ }
42722
+ } else if (has(map[i2], str)) {
42723
+ return i2 === UNKNOWN ? undefined2 : i2;
42724
+ }
42725
+ }
42726
+ return str;
42727
+ };
42728
+ var oldSafariMap = {
42729
+ "1.0": "/8",
42730
+ "1.2": "/1",
42731
+ "1.3": "/3",
42732
+ "2.0": "/412",
42733
+ "2.0.2": "/416",
42734
+ "2.0.3": "/417",
42735
+ "2.0.4": "/419",
42736
+ "?": "/"
42737
+ }, windowsVersionMap = {
42738
+ "ME": "4.90",
42739
+ "NT 3.11": "NT3.51",
42740
+ "NT 4.0": "NT4.0",
42741
+ "2000": "NT 5.0",
42742
+ "XP": ["NT 5.1", "NT 5.2"],
42743
+ "Vista": "NT 6.0",
42744
+ "7": "NT 6.1",
42745
+ "8": "NT 6.2",
42746
+ "8.1": "NT 6.3",
42747
+ "10": ["NT 6.4", "NT 10.0"],
42748
+ "RT": "ARM"
42749
+ };
42750
+ var regexes = {
42751
+ browser: [
42752
+ [
42753
+ /\b(?:crmo|crios)\/([\w\.]+)/i
42754
+ // Chrome for Android/iOS
42755
+ ],
42756
+ [VERSION, [NAME, "Chrome"]],
42757
+ [
42758
+ /edg(?:e|ios|a)?\/([\w\.]+)/i
42759
+ // Microsoft Edge
42760
+ ],
42761
+ [VERSION, [NAME, "Edge"]],
42762
+ [
42763
+ // Presto based
42764
+ /(opera mini)\/([-\w\.]+)/i,
42765
+ // Opera Mini
42766
+ /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,
42767
+ // Opera Mobi/Tablet
42768
+ /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i
42769
+ // Opera
42770
+ ],
42771
+ [NAME, VERSION],
42772
+ [
42773
+ /opios[\/ ]+([\w\.]+)/i
42774
+ // Opera mini on iphone >= 8.0
42775
+ ],
42776
+ [VERSION, [NAME, OPERA + " Mini"]],
42777
+ [
42778
+ /\bopr\/([\w\.]+)/i
42779
+ // Opera Webkit
42780
+ ],
42781
+ [VERSION, [NAME, OPERA]],
42782
+ [
42783
+ // Mixed
42784
+ /\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i
42785
+ // Baidu
42786
+ ],
42787
+ [VERSION, [NAME, "Baidu"]],
42788
+ [
42789
+ /(kindle)\/([\w\.]+)/i,
42790
+ // Kindle
42791
+ /(lunascape|maxthon|netfront|jasmine|blazer)[\/ ]?([\w\.]*)/i,
42792
+ // Lunascape/Maxthon/Netfront/Jasmine/Blazer
42793
+ // Trident based
42794
+ /(avant|iemobile|slim)\s?(?:browser)?[\/ ]?([\w\.]*)/i,
42795
+ // Avant/IEMobile/SlimBrowser
42796
+ /(?:ms|\()(ie) ([\w\.]+)/i,
42797
+ // Internet Explorer
42798
+ // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
42799
+ /(flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|qq|duckduckgo)\/([-\w\.]+)/i,
42800
+ // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ
42801
+ /(heytap|ovi)browser\/([\d\.]+)/i,
42802
+ // Heytap/Ovi
42803
+ /(weibo)__([\d\.]+)/i
42804
+ // Weibo
42805
+ ],
42806
+ [NAME, VERSION],
42807
+ [
42808
+ /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i
42809
+ // UCBrowser
42810
+ ],
42811
+ [VERSION, [NAME, "UC" + BROWSER]],
42812
+ [
42813
+ /microm.+\bqbcore\/([\w\.]+)/i,
42814
+ // WeChat Desktop for Windows Built-in Browser
42815
+ /\bqbcore\/([\w\.]+).+microm/i,
42816
+ /micromessenger\/([\w\.]+)/i
42817
+ // WeChat
42818
+ ],
42819
+ [VERSION, [NAME, "WeChat"]],
42820
+ [
42821
+ /konqueror\/([\w\.]+)/i
42822
+ // Konqueror
42823
+ ],
42824
+ [VERSION, [NAME, "Konqueror"]],
42825
+ [
42826
+ /trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i
42827
+ // IE11
42828
+ ],
42829
+ [VERSION, [NAME, "IE"]],
42830
+ [
42831
+ /ya(?:search)?browser\/([\w\.]+)/i
42832
+ // Yandex
42833
+ ],
42834
+ [VERSION, [NAME, "Yandex"]],
42835
+ [
42836
+ /slbrowser\/([\w\.]+)/i
42837
+ // Smart Lenovo Browser
42838
+ ],
42839
+ [VERSION, [NAME, "Smart Lenovo " + BROWSER]],
42840
+ [
42841
+ /(avast|avg)\/([\w\.]+)/i
42842
+ // Avast/AVG Secure Browser
42843
+ ],
42844
+ [[NAME, /(.+)/, "$1 Secure " + BROWSER], VERSION],
42845
+ [
42846
+ /\bfocus\/([\w\.]+)/i
42847
+ // Firefox Focus
42848
+ ],
42849
+ [VERSION, [NAME, FIREFOX + " Focus"]],
42850
+ [
42851
+ /\bopt\/([\w\.]+)/i
42852
+ // Opera Touch
42853
+ ],
42854
+ [VERSION, [NAME, OPERA + " Touch"]],
42855
+ [
42856
+ /coc_coc\w+\/([\w\.]+)/i
42857
+ // Coc Coc Browser
42858
+ ],
42859
+ [VERSION, [NAME, "Coc Coc"]],
42860
+ [
42861
+ /dolfin\/([\w\.]+)/i
42862
+ // Dolphin
42863
+ ],
42864
+ [VERSION, [NAME, "Dolphin"]],
42865
+ [
42866
+ /coast\/([\w\.]+)/i
42867
+ // Opera Coast
42868
+ ],
42869
+ [VERSION, [NAME, OPERA + " Coast"]],
42870
+ [
42871
+ /miuibrowser\/([\w\.]+)/i
42872
+ // MIUI Browser
42873
+ ],
42874
+ [VERSION, [NAME, "MIUI " + BROWSER]],
42875
+ [
42876
+ /fxios\/([-\w\.]+)/i
42877
+ // Firefox for iOS
42878
+ ],
42879
+ [VERSION, [NAME, FIREFOX]],
42880
+ [
42881
+ /\bqihu|(qi?ho?o?|360)browser/i
42882
+ // 360
42883
+ ],
42884
+ [[NAME, "360 " + BROWSER]],
42885
+ [
42886
+ /(oculus|sailfish|huawei|vivo)browser\/([\w\.]+)/i
42887
+ ],
42888
+ [[NAME, /(.+)/, "$1 " + BROWSER], VERSION],
42889
+ [
42890
+ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser
42891
+ /samsungbrowser\/([\w\.]+)/i
42892
+ // Samsung Internet
42893
+ ],
42894
+ [VERSION, [NAME, SAMSUNG + " Internet"]],
42895
+ [
42896
+ /(comodo_dragon)\/([\w\.]+)/i
42897
+ // Comodo Dragon
42898
+ ],
42899
+ [[NAME, /_/g, " "], VERSION],
42900
+ [
42901
+ /metasr[\/ ]?([\d\.]+)/i
42902
+ // Sogou Explorer
42903
+ ],
42904
+ [VERSION, [NAME, "Sogou Explorer"]],
42905
+ [
42906
+ /(sogou)mo\w+\/([\d\.]+)/i
42907
+ // Sogou Mobile
42908
+ ],
42909
+ [[NAME, "Sogou Mobile"], VERSION],
42910
+ [
42911
+ /(electron)\/([\w\.]+) safari/i,
42912
+ // Electron-based App
42913
+ /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,
42914
+ // Tesla
42915
+ /m?(qqbrowser|2345Explorer)[\/ ]?([\w\.]+)/i
42916
+ // QQBrowser/2345 Browser
42917
+ ],
42918
+ [NAME, VERSION],
42919
+ [
42920
+ /(lbbrowser)/i,
42921
+ // LieBao Browser
42922
+ /\[(linkedin)app\]/i
42923
+ // LinkedIn App for iOS & Android
42924
+ ],
42925
+ [NAME],
42926
+ [
42927
+ // WebView
42928
+ /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i
42929
+ // Facebook App for iOS & Android
42930
+ ],
42931
+ [[NAME, FACEBOOK], VERSION],
42932
+ [
42933
+ /(Klarna)\/([\w\.]+)/i,
42934
+ // Klarna Shopping Browser for iOS & Android
42935
+ /(kakao(?:talk|story))[\/ ]([\w\.]+)/i,
42936
+ // Kakao App
42937
+ /(naver)\(.*?(\d+\.[\w\.]+).*\)/i,
42938
+ // Naver InApp
42939
+ /safari (line)\/([\w\.]+)/i,
42940
+ // Line App for iOS
42941
+ /\b(line)\/([\w\.]+)\/iab/i,
42942
+ // Line App for Android
42943
+ /(alipay)client\/([\w\.]+)/i,
42944
+ // Alipay
42945
+ /(chromium|instagram|snapchat)[\/ ]([-\w\.]+)/i
42946
+ // Chromium/Instagram/Snapchat
42947
+ ],
42948
+ [NAME, VERSION],
42949
+ [
42950
+ /\bgsa\/([\w\.]+) .*safari\//i
42951
+ // Google Search Appliance on iOS
42952
+ ],
42953
+ [VERSION, [NAME, "GSA"]],
42954
+ [
42955
+ /musical_ly(?:.+app_?version\/|_)([\w\.]+)/i
42956
+ // TikTok
42957
+ ],
42958
+ [VERSION, [NAME, "TikTok"]],
42959
+ [
42960
+ /headlesschrome(?:\/([\w\.]+)| )/i
42961
+ // Chrome Headless
42962
+ ],
42963
+ [VERSION, [NAME, CHROME + " Headless"]],
42964
+ [
42965
+ / wv\).+(chrome)\/([\w\.]+)/i
42966
+ // Chrome WebView
42967
+ ],
42968
+ [[NAME, CHROME + " WebView"], VERSION],
42969
+ [
42970
+ /droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i
42971
+ // Android Browser
42972
+ ],
42973
+ [VERSION, [NAME, "Android " + BROWSER]],
42974
+ [
42975
+ /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i
42976
+ // Chrome/OmniWeb/Arora/Tizen/Nokia
42977
+ ],
42978
+ [NAME, VERSION],
42979
+ [
42980
+ /version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i
42981
+ // Mobile Safari
42982
+ ],
42983
+ [VERSION, [NAME, "Mobile Safari"]],
42984
+ [
42985
+ /version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i
42986
+ // Safari & Safari Mobile
42987
+ ],
42988
+ [VERSION, NAME],
42989
+ [
42990
+ /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i
42991
+ // Safari < 3.0
42992
+ ],
42993
+ [NAME, [VERSION, strMapper, oldSafariMap]],
42994
+ [
42995
+ /(webkit|khtml)\/([\w\.]+)/i
42996
+ ],
42997
+ [NAME, VERSION],
42998
+ [
42999
+ // Gecko based
43000
+ /(navigator|netscape\d?)\/([-\w\.]+)/i
43001
+ // Netscape
43002
+ ],
43003
+ [[NAME, "Netscape"], VERSION],
43004
+ [
43005
+ /mobile vr; rv:([\w\.]+)\).+firefox/i
43006
+ // Firefox Reality
43007
+ ],
43008
+ [VERSION, [NAME, FIREFOX + " Reality"]],
43009
+ [
43010
+ /ekiohf.+(flow)\/([\w\.]+)/i,
43011
+ // Flow
43012
+ /(swiftfox)/i,
43013
+ // Swiftfox
43014
+ /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\/ ]?([\w\.\+]+)/i,
43015
+ // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror/Klar
43016
+ /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i,
43017
+ // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
43018
+ /(firefox)\/([\w\.]+)/i,
43019
+ // Other Firefox-based
43020
+ /(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i,
43021
+ // Mozilla
43022
+ // Other
43023
+ /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
43024
+ // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir/Obigo/Mosaic/Go/ICE/UP.Browser
43025
+ /(links) \(([\w\.]+)/i,
43026
+ // Links
43027
+ /panasonic;(viera)/i
43028
+ // Panasonic Viera
43029
+ ],
43030
+ [NAME, VERSION],
43031
+ [
43032
+ /(cobalt)\/([\w\.]+)/i
43033
+ // Cobalt
43034
+ ],
43035
+ [NAME, [VERSION, /master.|lts./, ""]]
43036
+ ],
43037
+ cpu: [
43038
+ [
43039
+ /(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\)]/i
43040
+ // AMD64 (x64)
43041
+ ],
43042
+ [[ARCHITECTURE, "amd64"]],
43043
+ [
43044
+ /(ia32(?=;))/i
43045
+ // IA32 (quicktime)
43046
+ ],
43047
+ [[ARCHITECTURE, lowerize]],
43048
+ [
43049
+ /((?:i[346]|x)86)[;\)]/i
43050
+ // IA32 (x86)
43051
+ ],
43052
+ [[ARCHITECTURE, "ia32"]],
43053
+ [
43054
+ /\b(aarch64|arm(v?8e?l?|_?64))\b/i
43055
+ // ARM64
43056
+ ],
43057
+ [[ARCHITECTURE, "arm64"]],
43058
+ [
43059
+ /\b(arm(?:v[67])?ht?n?[fl]p?)\b/i
43060
+ // ARMHF
43061
+ ],
43062
+ [[ARCHITECTURE, "armhf"]],
43063
+ [
43064
+ // PocketPC mistakenly identified as PowerPC
43065
+ /windows (ce|mobile); ppc;/i
43066
+ ],
43067
+ [[ARCHITECTURE, "arm"]],
43068
+ [
43069
+ /((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i
43070
+ // PowerPC
43071
+ ],
43072
+ [[ARCHITECTURE, /ower/, EMPTY, lowerize]],
43073
+ [
43074
+ /(sun4\w)[;\)]/i
43075
+ // SPARC
43076
+ ],
43077
+ [[ARCHITECTURE, "sparc"]],
43078
+ [
43079
+ /((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i
43080
+ // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
43081
+ ],
43082
+ [[ARCHITECTURE, lowerize]]
43083
+ ],
43084
+ device: [
43085
+ [
43086
+ //////////////////////////
43087
+ // MOBILES & TABLETS
43088
+ /////////////////////////
43089
+ // Samsung
43090
+ /\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i
43091
+ ],
43092
+ [MODEL, [VENDOR, SAMSUNG], [TYPE2, TABLET]],
43093
+ [
43094
+ /\b((?:s[cgp]h|gt|sm)-\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
43095
+ /samsung[- ]([-\w]+)/i,
43096
+ /sec-(sgh\w+)/i
43097
+ ],
43098
+ [MODEL, [VENDOR, SAMSUNG], [TYPE2, MOBILE]],
43099
+ [
43100
+ // Apple
43101
+ /(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i
43102
+ // iPod/iPhone
43103
+ ],
43104
+ [MODEL, [VENDOR, APPLE], [TYPE2, MOBILE]],
43105
+ [
43106
+ /\((ipad);[-\w\),; ]+apple/i,
43107
+ // iPad
43108
+ /applecoremedia\/[\w\.]+ \((ipad)/i,
43109
+ /\b(ipad)\d\d?,\d\d?[;\]].+ios/i
43110
+ ],
43111
+ [MODEL, [VENDOR, APPLE], [TYPE2, TABLET]],
43112
+ [
43113
+ /(macintosh);/i
43114
+ ],
43115
+ [MODEL, [VENDOR, APPLE]],
43116
+ [
43117
+ // Sharp
43118
+ /\b(sh-?[altvz]?\d\d[a-ekm]?)/i
43119
+ ],
43120
+ [MODEL, [VENDOR, SHARP], [TYPE2, MOBILE]],
43121
+ [
43122
+ // Huawei
43123
+ /\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i
43124
+ ],
43125
+ [MODEL, [VENDOR, HUAWEI], [TYPE2, TABLET]],
43126
+ [
43127
+ /(?:huawei|honor)([-\w ]+)[;\)]/i,
43128
+ /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i
43129
+ ],
43130
+ [MODEL, [VENDOR, HUAWEI], [TYPE2, MOBILE]],
43131
+ [
43132
+ // Xiaomi
43133
+ /\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i,
43134
+ // Xiaomi POCO
43135
+ /\b; (\w+) build\/hm\1/i,
43136
+ // Xiaomi Hongmi 'numeric' models
43137
+ /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,
43138
+ // Xiaomi Hongmi
43139
+ /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,
43140
+ // Xiaomi Redmi
43141
+ /oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i,
43142
+ // Xiaomi Redmi 'numeric' models
43143
+ /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i
43144
+ // Xiaomi Mi
43145
+ ],
43146
+ [[MODEL, /_/g, " "], [VENDOR, XIAOMI], [TYPE2, MOBILE]],
43147
+ [
43148
+ /oid[^\)]+; (2\d{4}(283|rpbf)[cgl])( bui|\))/i,
43149
+ // Redmi Pad
43150
+ /\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i
43151
+ // Mi Pad tablets
43152
+ ],
43153
+ [[MODEL, /_/g, " "], [VENDOR, XIAOMI], [TYPE2, TABLET]],
43154
+ [
43155
+ // OPPO
43156
+ /; (\w+) bui.+ oppo/i,
43157
+ /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i
43158
+ ],
43159
+ [MODEL, [VENDOR, "OPPO"], [TYPE2, MOBILE]],
43160
+ [
43161
+ // Vivo
43162
+ /vivo (\w+)(?: bui|\))/i,
43163
+ /\b(v[12]\d{3}\w?[at])(?: bui|;)/i
43164
+ ],
43165
+ [MODEL, [VENDOR, "Vivo"], [TYPE2, MOBILE]],
43166
+ [
43167
+ // Realme
43168
+ /\b(rmx[1-3]\d{3})(?: bui|;|\))/i
43169
+ ],
43170
+ [MODEL, [VENDOR, "Realme"], [TYPE2, MOBILE]],
43171
+ [
43172
+ // Motorola
43173
+ /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
43174
+ /\bmot(?:orola)?[- ](\w*)/i,
43175
+ /((?:moto[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i
43176
+ ],
43177
+ [MODEL, [VENDOR, MOTOROLA], [TYPE2, MOBILE]],
43178
+ [
43179
+ /\b(mz60\d|xoom[2 ]{0,2}) build\//i
43180
+ ],
43181
+ [MODEL, [VENDOR, MOTOROLA], [TYPE2, TABLET]],
43182
+ [
43183
+ // LG
43184
+ /((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
43185
+ ],
43186
+ [MODEL, [VENDOR, LG], [TYPE2, TABLET]],
43187
+ [
43188
+ /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
43189
+ /\blg[-e;\/ ]+((?!browser|netcast|android tv)\w+)/i,
43190
+ /\blg-?([\d\w]+) bui/i
43191
+ ],
43192
+ [MODEL, [VENDOR, LG], [TYPE2, MOBILE]],
43193
+ [
43194
+ // Lenovo
43195
+ /(ideatab[-\w ]+)/i,
43196
+ /lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i
43197
+ ],
43198
+ [MODEL, [VENDOR, "Lenovo"], [TYPE2, TABLET]],
43199
+ [
43200
+ // Nokia
43201
+ /(?:maemo|nokia).*(n900|lumia \d+)/i,
43202
+ /nokia[-_ ]?([-\w\.]*)/i
43203
+ ],
43204
+ [[MODEL, /_/g, " "], [VENDOR, "Nokia"], [TYPE2, MOBILE]],
43205
+ [
43206
+ // Google
43207
+ /(pixel c)\b/i
43208
+ // Google Pixel C
43209
+ ],
43210
+ [MODEL, [VENDOR, GOOGLE], [TYPE2, TABLET]],
43211
+ [
43212
+ /droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i
43213
+ // Google Pixel
43214
+ ],
43215
+ [MODEL, [VENDOR, GOOGLE], [TYPE2, MOBILE]],
43216
+ [
43217
+ // Sony
43218
+ /droid.+ (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i
43219
+ ],
43220
+ [MODEL, [VENDOR, SONY], [TYPE2, MOBILE]],
43221
+ [
43222
+ /sony tablet [ps]/i,
43223
+ /\b(?:sony)?sgp\w+(?: bui|\))/i
43224
+ ],
43225
+ [[MODEL, "Xperia Tablet"], [VENDOR, SONY], [TYPE2, TABLET]],
43226
+ [
43227
+ // OnePlus
43228
+ / (kb2005|in20[12]5|be20[12][59])\b/i,
43229
+ /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
43230
+ ],
43231
+ [MODEL, [VENDOR, "OnePlus"], [TYPE2, MOBILE]],
43232
+ [
43233
+ // Amazon
43234
+ /(alexa)webm/i,
43235
+ /(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i,
43236
+ // Kindle Fire without Silk / Echo Show
43237
+ /(kf[a-z]+)( bui|\)).+silk\//i
43238
+ // Kindle Fire HD
43239
+ ],
43240
+ [MODEL, [VENDOR, AMAZON], [TYPE2, TABLET]],
43241
+ [
43242
+ /((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i
43243
+ // Fire Phone
43244
+ ],
43245
+ [[MODEL, /(.+)/g, "Fire Phone $1"], [VENDOR, AMAZON], [TYPE2, MOBILE]],
43246
+ [
43247
+ // BlackBerry
43248
+ /(playbook);[-\w\),; ]+(rim)/i
43249
+ // BlackBerry PlayBook
43250
+ ],
43251
+ [MODEL, VENDOR, [TYPE2, TABLET]],
43252
+ [
43253
+ /\b((?:bb[a-f]|st[hv])100-\d)/i,
43254
+ /\(bb10; (\w+)/i
43255
+ // BlackBerry 10
43256
+ ],
43257
+ [MODEL, [VENDOR, BLACKBERRY], [TYPE2, MOBILE]],
43258
+ [
43259
+ // Asus
43260
+ /(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i
43261
+ ],
43262
+ [MODEL, [VENDOR, ASUS], [TYPE2, TABLET]],
43263
+ [
43264
+ / (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i
43265
+ ],
43266
+ [MODEL, [VENDOR, ASUS], [TYPE2, MOBILE]],
43267
+ [
43268
+ // HTC
43269
+ /(nexus 9)/i
43270
+ // HTC Nexus 9
43271
+ ],
43272
+ [MODEL, [VENDOR, "HTC"], [TYPE2, TABLET]],
43273
+ [
43274
+ /(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,
43275
+ // HTC
43276
+ // ZTE
43277
+ /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
43278
+ /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i
43279
+ // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
43280
+ ],
43281
+ [VENDOR, [MODEL, /_/g, " "], [TYPE2, MOBILE]],
43282
+ [
43283
+ // Acer
43284
+ /droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
43285
+ ],
43286
+ [MODEL, [VENDOR, "Acer"], [TYPE2, TABLET]],
43287
+ [
43288
+ // Meizu
43289
+ /droid.+; (m[1-5] note) bui/i,
43290
+ /\bmz-([-\w]{2,})/i
43291
+ ],
43292
+ [MODEL, [VENDOR, "Meizu"], [TYPE2, MOBILE]],
43293
+ [
43294
+ // Ulefone
43295
+ /; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
43296
+ ],
43297
+ [MODEL, [VENDOR, "Ulefone"], [TYPE2, MOBILE]],
43298
+ [
43299
+ // MIXED
43300
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno)[-_ ]?([-\w]*)/i,
43301
+ // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
43302
+ /(hp) ([\w ]+\w)/i,
43303
+ // HP iPAQ
43304
+ /(asus)-?(\w+)/i,
43305
+ // Asus
43306
+ /(microsoft); (lumia[\w ]+)/i,
43307
+ // Microsoft Lumia
43308
+ /(lenovo)[-_ ]?([-\w]+)/i,
43309
+ // Lenovo
43310
+ /(jolla)/i,
43311
+ // Jolla
43312
+ /(oppo) ?([\w ]+) bui/i
43313
+ // OPPO
43314
+ ],
43315
+ [VENDOR, MODEL, [TYPE2, MOBILE]],
43316
+ [
43317
+ /(kobo)\s(ereader|touch)/i,
43318
+ // Kobo
43319
+ /(archos) (gamepad2?)/i,
43320
+ // Archos
43321
+ /(hp).+(touchpad(?!.+tablet)|tablet)/i,
43322
+ // HP TouchPad
43323
+ /(kindle)\/([\w\.]+)/i,
43324
+ // Kindle
43325
+ /(nook)[\w ]+build\/(\w+)/i,
43326
+ // Nook
43327
+ /(dell) (strea[kpr\d ]*[\dko])/i,
43328
+ // Dell Streak
43329
+ /(le[- ]+pan)[- ]+(\w{1,9}) bui/i,
43330
+ // Le Pan Tablets
43331
+ /(trinity)[- ]*(t\d{3}) bui/i,
43332
+ // Trinity Tablets
43333
+ /(gigaset)[- ]+(q\w{1,9}) bui/i,
43334
+ // Gigaset Tablets
43335
+ /(vodafone) ([\w ]+)(?:\)| bui)/i
43336
+ // Vodafone
43337
+ ],
43338
+ [VENDOR, MODEL, [TYPE2, TABLET]],
43339
+ [
43340
+ /(surface duo)/i
43341
+ // Surface Duo
43342
+ ],
43343
+ [MODEL, [VENDOR, MICROSOFT], [TYPE2, TABLET]],
43344
+ [
43345
+ /droid [\d\.]+; (fp\du?)(?: b|\))/i
43346
+ // Fairphone
43347
+ ],
43348
+ [MODEL, [VENDOR, "Fairphone"], [TYPE2, MOBILE]],
43349
+ [
43350
+ /(u304aa)/i
43351
+ // AT&T
43352
+ ],
43353
+ [MODEL, [VENDOR, "AT&T"], [TYPE2, MOBILE]],
43354
+ [
43355
+ /\bsie-(\w*)/i
43356
+ // Siemens
43357
+ ],
43358
+ [MODEL, [VENDOR, "Siemens"], [TYPE2, MOBILE]],
43359
+ [
43360
+ /\b(rct\w+) b/i
43361
+ // RCA Tablets
43362
+ ],
43363
+ [MODEL, [VENDOR, "RCA"], [TYPE2, TABLET]],
43364
+ [
43365
+ /\b(venue[\d ]{2,7}) b/i
43366
+ // Dell Venue Tablets
43367
+ ],
43368
+ [MODEL, [VENDOR, "Dell"], [TYPE2, TABLET]],
43369
+ [
43370
+ /\b(q(?:mv|ta)\w+) b/i
43371
+ // Verizon Tablet
43372
+ ],
43373
+ [MODEL, [VENDOR, "Verizon"], [TYPE2, TABLET]],
43374
+ [
43375
+ /\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i
43376
+ // Barnes & Noble Tablet
43377
+ ],
43378
+ [MODEL, [VENDOR, "Barnes & Noble"], [TYPE2, TABLET]],
43379
+ [
43380
+ /\b(tm\d{3}\w+) b/i
43381
+ ],
43382
+ [MODEL, [VENDOR, "NuVision"], [TYPE2, TABLET]],
43383
+ [
43384
+ /\b(k88) b/i
43385
+ // ZTE K Series Tablet
43386
+ ],
43387
+ [MODEL, [VENDOR, "ZTE"], [TYPE2, TABLET]],
43388
+ [
43389
+ /\b(nx\d{3}j) b/i
43390
+ // ZTE Nubia
43391
+ ],
43392
+ [MODEL, [VENDOR, "ZTE"], [TYPE2, MOBILE]],
43393
+ [
43394
+ /\b(gen\d{3}) b.+49h/i
43395
+ // Swiss GEN Mobile
43396
+ ],
43397
+ [MODEL, [VENDOR, "Swiss"], [TYPE2, MOBILE]],
43398
+ [
43399
+ /\b(zur\d{3}) b/i
43400
+ // Swiss ZUR Tablet
43401
+ ],
43402
+ [MODEL, [VENDOR, "Swiss"], [TYPE2, TABLET]],
43403
+ [
43404
+ /\b((zeki)?tb.*\b) b/i
43405
+ // Zeki Tablets
43406
+ ],
43407
+ [MODEL, [VENDOR, "Zeki"], [TYPE2, TABLET]],
43408
+ [
43409
+ /\b([yr]\d{2}) b/i,
43410
+ /\b(dragon[- ]+touch |dt)(\w{5}) b/i
43411
+ // Dragon Touch Tablet
43412
+ ],
43413
+ [[VENDOR, "Dragon Touch"], MODEL, [TYPE2, TABLET]],
43414
+ [
43415
+ /\b(ns-?\w{0,9}) b/i
43416
+ // Insignia Tablets
43417
+ ],
43418
+ [MODEL, [VENDOR, "Insignia"], [TYPE2, TABLET]],
43419
+ [
43420
+ /\b((nxa|next)-?\w{0,9}) b/i
43421
+ // NextBook Tablets
43422
+ ],
43423
+ [MODEL, [VENDOR, "NextBook"], [TYPE2, TABLET]],
43424
+ [
43425
+ /\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i
43426
+ // Voice Xtreme Phones
43427
+ ],
43428
+ [[VENDOR, "Voice"], MODEL, [TYPE2, MOBILE]],
43429
+ [
43430
+ /\b(lvtel\-)?(v1[12]) b/i
43431
+ // LvTel Phones
43432
+ ],
43433
+ [[VENDOR, "LvTel"], MODEL, [TYPE2, MOBILE]],
43434
+ [
43435
+ /\b(ph-1) /i
43436
+ // Essential PH-1
43437
+ ],
43438
+ [MODEL, [VENDOR, "Essential"], [TYPE2, MOBILE]],
43439
+ [
43440
+ /\b(v(100md|700na|7011|917g).*\b) b/i
43441
+ // Envizen Tablets
43442
+ ],
43443
+ [MODEL, [VENDOR, "Envizen"], [TYPE2, TABLET]],
43444
+ [
43445
+ /\b(trio[-\w\. ]+) b/i
43446
+ // MachSpeed Tablets
43447
+ ],
43448
+ [MODEL, [VENDOR, "MachSpeed"], [TYPE2, TABLET]],
43449
+ [
43450
+ /\btu_(1491) b/i
43451
+ // Rotor Tablets
43452
+ ],
43453
+ [MODEL, [VENDOR, "Rotor"], [TYPE2, TABLET]],
43454
+ [
43455
+ /(shield[\w ]+) b/i
43456
+ // Nvidia Shield Tablets
43457
+ ],
43458
+ [MODEL, [VENDOR, "Nvidia"], [TYPE2, TABLET]],
43459
+ [
43460
+ /(sprint) (\w+)/i
43461
+ // Sprint Phones
43462
+ ],
43463
+ [VENDOR, MODEL, [TYPE2, MOBILE]],
43464
+ [
43465
+ /(kin\.[onetw]{3})/i
43466
+ // Microsoft Kin
43467
+ ],
43468
+ [[MODEL, /\./g, " "], [VENDOR, MICROSOFT], [TYPE2, MOBILE]],
43469
+ [
43470
+ /droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i
43471
+ // Zebra
43472
+ ],
43473
+ [MODEL, [VENDOR, ZEBRA], [TYPE2, TABLET]],
43474
+ [
43475
+ /droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i
43476
+ ],
43477
+ [MODEL, [VENDOR, ZEBRA], [TYPE2, MOBILE]],
43478
+ [
43479
+ ///////////////////
43480
+ // SMARTTVS
43481
+ ///////////////////
43482
+ /smart-tv.+(samsung)/i
43483
+ // Samsung
43484
+ ],
43485
+ [VENDOR, [TYPE2, SMARTTV]],
43486
+ [
43487
+ /hbbtv.+maple;(\d+)/i
43488
+ ],
43489
+ [[MODEL, /^/, "SmartTV"], [VENDOR, SAMSUNG], [TYPE2, SMARTTV]],
43490
+ [
43491
+ /(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i
43492
+ // LG SmartTV
43493
+ ],
43494
+ [[VENDOR, LG], [TYPE2, SMARTTV]],
43495
+ [
43496
+ /(apple) ?tv/i
43497
+ // Apple TV
43498
+ ],
43499
+ [VENDOR, [MODEL, APPLE + " TV"], [TYPE2, SMARTTV]],
43500
+ [
43501
+ /crkey/i
43502
+ // Google Chromecast
43503
+ ],
43504
+ [[MODEL, CHROME + "cast"], [VENDOR, GOOGLE], [TYPE2, SMARTTV]],
43505
+ [
43506
+ /droid.+aft(\w+)( bui|\))/i
43507
+ // Fire TV
43508
+ ],
43509
+ [MODEL, [VENDOR, AMAZON], [TYPE2, SMARTTV]],
43510
+ [
43511
+ /\(dtv[\);].+(aquos)/i,
43512
+ /(aquos-tv[\w ]+)\)/i
43513
+ // Sharp
43514
+ ],
43515
+ [MODEL, [VENDOR, SHARP], [TYPE2, SMARTTV]],
43516
+ [
43517
+ /(bravia[\w ]+)( bui|\))/i
43518
+ // Sony
43519
+ ],
43520
+ [MODEL, [VENDOR, SONY], [TYPE2, SMARTTV]],
43521
+ [
43522
+ /(mitv-\w{5}) bui/i
43523
+ // Xiaomi
43524
+ ],
43525
+ [MODEL, [VENDOR, XIAOMI], [TYPE2, SMARTTV]],
43526
+ [
43527
+ /Hbbtv.*(technisat) (.*);/i
43528
+ // TechniSAT
43529
+ ],
43530
+ [VENDOR, MODEL, [TYPE2, SMARTTV]],
43531
+ [
43532
+ /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,
43533
+ // Roku
43534
+ /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i
43535
+ // HbbTV devices
43536
+ ],
43537
+ [[VENDOR, trim], [MODEL, trim], [TYPE2, SMARTTV]],
43538
+ [
43539
+ /\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i
43540
+ // SmartTV from Unidentified Vendors
43541
+ ],
43542
+ [[TYPE2, SMARTTV]],
43543
+ [
43544
+ ///////////////////
43545
+ // CONSOLES
43546
+ ///////////////////
43547
+ /(ouya)/i,
43548
+ // Ouya
43549
+ /(nintendo) ([wids3utch]+)/i
43550
+ // Nintendo
43551
+ ],
43552
+ [VENDOR, MODEL, [TYPE2, CONSOLE]],
43553
+ [
43554
+ /droid.+; (shield) bui/i
43555
+ // Nvidia
43556
+ ],
43557
+ [MODEL, [VENDOR, "Nvidia"], [TYPE2, CONSOLE]],
43558
+ [
43559
+ /(playstation [345portablevi]+)/i
43560
+ // Playstation
43561
+ ],
43562
+ [MODEL, [VENDOR, SONY], [TYPE2, CONSOLE]],
43563
+ [
43564
+ /\b(xbox(?: one)?(?!; xbox))[\); ]/i
43565
+ // Microsoft Xbox
43566
+ ],
43567
+ [MODEL, [VENDOR, MICROSOFT], [TYPE2, CONSOLE]],
43568
+ [
43569
+ ///////////////////
43570
+ // WEARABLES
43571
+ ///////////////////
43572
+ /((pebble))app/i
43573
+ // Pebble
43574
+ ],
43575
+ [VENDOR, MODEL, [TYPE2, WEARABLE]],
43576
+ [
43577
+ /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i
43578
+ // Apple Watch
43579
+ ],
43580
+ [MODEL, [VENDOR, APPLE], [TYPE2, WEARABLE]],
43581
+ [
43582
+ /droid.+; (glass) \d/i
43583
+ // Google Glass
43584
+ ],
43585
+ [MODEL, [VENDOR, GOOGLE], [TYPE2, WEARABLE]],
43586
+ [
43587
+ /droid.+; (wt63?0{2,3})\)/i
43588
+ ],
43589
+ [MODEL, [VENDOR, ZEBRA], [TYPE2, WEARABLE]],
43590
+ [
43591
+ /(quest( 2| pro)?)/i
43592
+ // Oculus Quest
43593
+ ],
43594
+ [MODEL, [VENDOR, FACEBOOK], [TYPE2, WEARABLE]],
43595
+ [
43596
+ ///////////////////
43597
+ // EMBEDDED
43598
+ ///////////////////
43599
+ /(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i
43600
+ // Tesla
43601
+ ],
43602
+ [VENDOR, [TYPE2, EMBEDDED]],
43603
+ [
43604
+ /(aeobc)\b/i
43605
+ // Echo Dot
43606
+ ],
43607
+ [MODEL, [VENDOR, AMAZON], [TYPE2, EMBEDDED]],
43608
+ [
43609
+ ////////////////////
43610
+ // MIXED (GENERIC)
43611
+ ///////////////////
43612
+ /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+? mobile safari/i
43613
+ // Android Phones from Unidentified Vendors
43614
+ ],
43615
+ [MODEL, [TYPE2, MOBILE]],
43616
+ [
43617
+ /droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i
43618
+ // Android Tablets from Unidentified Vendors
43619
+ ],
43620
+ [MODEL, [TYPE2, TABLET]],
43621
+ [
43622
+ /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i
43623
+ // Unidentifiable Tablet
43624
+ ],
43625
+ [[TYPE2, TABLET]],
43626
+ [
43627
+ /(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i
43628
+ // Unidentifiable Mobile
43629
+ ],
43630
+ [[TYPE2, MOBILE]],
43631
+ [
43632
+ /(android[-\w\. ]{0,9});.+buil/i
43633
+ // Generic Android Device
43634
+ ],
43635
+ [MODEL, [VENDOR, "Generic"]]
43636
+ ],
43637
+ engine: [
43638
+ [
43639
+ /windows.+ edge\/([\w\.]+)/i
43640
+ // EdgeHTML
43641
+ ],
43642
+ [VERSION, [NAME, EDGE + "HTML"]],
43643
+ [
43644
+ /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i
43645
+ // Blink
43646
+ ],
43647
+ [VERSION, [NAME, "Blink"]],
43648
+ [
43649
+ /(presto)\/([\w\.]+)/i,
43650
+ // Presto
43651
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,
43652
+ // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
43653
+ /ekioh(flow)\/([\w\.]+)/i,
43654
+ // Flow
43655
+ /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,
43656
+ // KHTML/Tasman/Links
43657
+ /(icab)[\/ ]([23]\.[\d\.]+)/i,
43658
+ // iCab
43659
+ /\b(libweb)/i
43660
+ ],
43661
+ [NAME, VERSION],
43662
+ [
43663
+ /rv\:([\w\.]{1,9})\b.+(gecko)/i
43664
+ // Gecko
43665
+ ],
43666
+ [VERSION, NAME]
43667
+ ],
43668
+ os: [
43669
+ [
43670
+ // Windows
43671
+ /microsoft (windows) (vista|xp)/i
43672
+ // Windows (iTunes)
43673
+ ],
43674
+ [NAME, VERSION],
43675
+ [
43676
+ /(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i
43677
+ // Windows Phone
43678
+ ],
43679
+ [NAME, [VERSION, strMapper, windowsVersionMap]],
43680
+ [
43681
+ /windows nt 6\.2; (arm)/i,
43682
+ // Windows RT
43683
+ /windows[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i,
43684
+ /(?:win(?=3|9|n)|win 9x )([nt\d\.]+)/i
43685
+ ],
43686
+ [[VERSION, strMapper, windowsVersionMap], [NAME, "Windows"]],
43687
+ [
43688
+ // iOS/macOS
43689
+ /ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i,
43690
+ // iOS
43691
+ /(?:ios;fbsv\/|iphone.+ios[\/ ])([\d\.]+)/i,
43692
+ /cfnetwork\/.+darwin/i
43693
+ ],
43694
+ [[VERSION, /_/g, "."], [NAME, "iOS"]],
43695
+ [
43696
+ /(mac os x) ?([\w\. ]*)/i,
43697
+ /(macintosh|mac_powerpc\b)(?!.+haiku)/i
43698
+ // Mac OS
43699
+ ],
43700
+ [[NAME, MAC_OS], [VERSION, /_/g, "."]],
43701
+ [
43702
+ // Mobile OSes
43703
+ /droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i
43704
+ // Android-x86/HarmonyOS
43705
+ ],
43706
+ [VERSION, NAME],
43707
+ [
43708
+ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS
43709
+ /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i,
43710
+ /(blackberry)\w*\/([\w\.]*)/i,
43711
+ // Blackberry
43712
+ /(tizen|kaios)[\/ ]([\w\.]+)/i,
43713
+ // Tizen/KaiOS
43714
+ /\((series40);/i
43715
+ // Series 40
43716
+ ],
43717
+ [NAME, VERSION],
43718
+ [
43719
+ /\(bb(10);/i
43720
+ // BlackBerry 10
43721
+ ],
43722
+ [VERSION, [NAME, BLACKBERRY]],
43723
+ [
43724
+ /(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i
43725
+ // Symbian
43726
+ ],
43727
+ [VERSION, [NAME, "Symbian"]],
43728
+ [
43729
+ /mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i
43730
+ // Firefox OS
43731
+ ],
43732
+ [VERSION, [NAME, FIREFOX + " OS"]],
43733
+ [
43734
+ /web0s;.+rt(tv)/i,
43735
+ /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i
43736
+ // WebOS
43737
+ ],
43738
+ [VERSION, [NAME, "webOS"]],
43739
+ [
43740
+ /watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i
43741
+ // watchOS
43742
+ ],
43743
+ [VERSION, [NAME, "watchOS"]],
43744
+ [
43745
+ // Google Chromecast
43746
+ /crkey\/([\d\.]+)/i
43747
+ // Google Chromecast
43748
+ ],
43749
+ [VERSION, [NAME, CHROME + "cast"]],
43750
+ [
43751
+ /(cros) [\w]+(?:\)| ([\w\.]+)\b)/i
43752
+ // Chromium OS
43753
+ ],
43754
+ [[NAME, CHROMIUM_OS], VERSION],
43755
+ [
43756
+ // Smart TVs
43757
+ /panasonic;(viera)/i,
43758
+ // Panasonic Viera
43759
+ /(netrange)mmh/i,
43760
+ // Netrange
43761
+ /(nettv)\/(\d+\.[\w\.]+)/i,
43762
+ // NetTV
43763
+ // Console
43764
+ /(nintendo|playstation) ([wids345portablevuch]+)/i,
43765
+ // Nintendo/Playstation
43766
+ /(xbox); +xbox ([^\);]+)/i,
43767
+ // Microsoft Xbox (360, One, X, S, Series X, Series S)
43768
+ // Other
43769
+ /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,
43770
+ // Joli/Palm
43771
+ /(mint)[\/\(\) ]?(\w*)/i,
43772
+ // Mint
43773
+ /(mageia|vectorlinux)[; ]/i,
43774
+ // Mageia/VectorLinux
43775
+ /([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,
43776
+ // Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire
43777
+ /(hurd|linux) ?([\w\.]*)/i,
43778
+ // Hurd/Linux
43779
+ /(gnu) ?([\w\.]*)/i,
43780
+ // GNU
43781
+ /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,
43782
+ // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
43783
+ /(haiku) (\w+)/i
43784
+ // Haiku
43785
+ ],
43786
+ [NAME, VERSION],
43787
+ [
43788
+ /(sunos) ?([\w\.\d]*)/i
43789
+ // Solaris
43790
+ ],
43791
+ [[NAME, "Solaris"], VERSION],
43792
+ [
43793
+ /((?:open)?solaris)[-\/ ]?([\w\.]*)/i,
43794
+ // Solaris
43795
+ /(aix) ((\d)(?=\.|\)| )[\w\.])*/i,
43796
+ // AIX
43797
+ /\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux|serenityos)/i,
43798
+ // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX/SerenityOS
43799
+ /(unix) ?([\w\.]*)/i
43800
+ // UNIX
43801
+ ],
43802
+ [NAME, VERSION]
43803
+ ]
43804
+ };
43805
+ var UAParser2 = function(ua, extensions) {
43806
+ if (typeof ua === OBJ_TYPE) {
43807
+ extensions = ua;
43808
+ ua = undefined2;
43809
+ }
43810
+ if (!(this instanceof UAParser2)) {
43811
+ return new UAParser2(ua, extensions).getResult();
43812
+ }
43813
+ var _navigator = typeof window2 !== UNDEF_TYPE && window2.navigator ? window2.navigator : undefined2;
43814
+ var _ua = ua || (_navigator && _navigator.userAgent ? _navigator.userAgent : EMPTY);
43815
+ var _uach = _navigator && _navigator.userAgentData ? _navigator.userAgentData : undefined2;
43816
+ var _rgxmap = extensions ? extend(regexes, extensions) : regexes;
43817
+ var _isSelfNav = _navigator && _navigator.userAgent == _ua;
43818
+ this.getBrowser = function() {
43819
+ var _browser = {};
43820
+ _browser[NAME] = undefined2;
43821
+ _browser[VERSION] = undefined2;
43822
+ rgxMapper.call(_browser, _ua, _rgxmap.browser);
43823
+ _browser[MAJOR] = majorize(_browser[VERSION]);
43824
+ if (_isSelfNav && _navigator && _navigator.brave && typeof _navigator.brave.isBrave == FUNC_TYPE) {
43825
+ _browser[NAME] = "Brave";
43826
+ }
43827
+ return _browser;
43828
+ };
43829
+ this.getCPU = function() {
43830
+ var _cpu = {};
43831
+ _cpu[ARCHITECTURE] = undefined2;
43832
+ rgxMapper.call(_cpu, _ua, _rgxmap.cpu);
43833
+ return _cpu;
43834
+ };
43835
+ this.getDevice = function() {
43836
+ var _device = {};
43837
+ _device[VENDOR] = undefined2;
43838
+ _device[MODEL] = undefined2;
43839
+ _device[TYPE2] = undefined2;
43840
+ rgxMapper.call(_device, _ua, _rgxmap.device);
43841
+ if (_isSelfNav && !_device[TYPE2] && _uach && _uach.mobile) {
43842
+ _device[TYPE2] = MOBILE;
43843
+ }
43844
+ if (_isSelfNav && _device[MODEL] == "Macintosh" && _navigator && typeof _navigator.standalone !== UNDEF_TYPE && _navigator.maxTouchPoints && _navigator.maxTouchPoints > 2) {
43845
+ _device[MODEL] = "iPad";
43846
+ _device[TYPE2] = TABLET;
43847
+ }
43848
+ return _device;
43849
+ };
43850
+ this.getEngine = function() {
43851
+ var _engine = {};
43852
+ _engine[NAME] = undefined2;
43853
+ _engine[VERSION] = undefined2;
43854
+ rgxMapper.call(_engine, _ua, _rgxmap.engine);
43855
+ return _engine;
43856
+ };
43857
+ this.getOS = function() {
43858
+ var _os = {};
43859
+ _os[NAME] = undefined2;
43860
+ _os[VERSION] = undefined2;
43861
+ rgxMapper.call(_os, _ua, _rgxmap.os);
43862
+ if (_isSelfNav && !_os[NAME] && _uach && _uach.platform != "Unknown") {
43863
+ _os[NAME] = _uach.platform.replace(/chrome os/i, CHROMIUM_OS).replace(/macos/i, MAC_OS);
43864
+ }
43865
+ return _os;
43866
+ };
43867
+ this.getResult = function() {
43868
+ return {
43869
+ ua: this.getUA(),
43870
+ browser: this.getBrowser(),
43871
+ engine: this.getEngine(),
43872
+ os: this.getOS(),
43873
+ device: this.getDevice(),
43874
+ cpu: this.getCPU()
43875
+ };
43876
+ };
43877
+ this.getUA = function() {
43878
+ return _ua;
43879
+ };
43880
+ this.setUA = function(ua2) {
43881
+ _ua = typeof ua2 === STR_TYPE && ua2.length > UA_MAX_LENGTH ? trim(ua2, UA_MAX_LENGTH) : ua2;
43882
+ return this;
43883
+ };
43884
+ this.setUA(_ua);
43885
+ return this;
43886
+ };
43887
+ UAParser2.VERSION = LIBVERSION;
43888
+ UAParser2.BROWSER = enumerize([NAME, VERSION, MAJOR]);
43889
+ UAParser2.CPU = enumerize([ARCHITECTURE]);
43890
+ UAParser2.DEVICE = enumerize([MODEL, VENDOR, TYPE2, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);
43891
+ UAParser2.ENGINE = UAParser2.OS = enumerize([NAME, VERSION]);
43892
+ if (typeof exports !== UNDEF_TYPE) {
43893
+ if (typeof module2 !== UNDEF_TYPE && module2.exports) {
43894
+ exports = module2.exports = UAParser2;
43895
+ }
43896
+ exports.UAParser = UAParser2;
43897
+ } else {
43898
+ if (typeof define === FUNC_TYPE && define.amd) {
43899
+ define(function() {
43900
+ return UAParser2;
43901
+ });
43902
+ } else if (typeof window2 !== UNDEF_TYPE) {
43903
+ window2.UAParser = UAParser2;
43904
+ }
43905
+ }
43906
+ var $ = typeof window2 !== UNDEF_TYPE && (window2.jQuery || window2.Zepto);
43907
+ if ($ && !$.ua) {
43908
+ var parser = new UAParser2();
43909
+ $.ua = parser.getResult();
43910
+ $.ua.get = function() {
43911
+ return parser.getUA();
43912
+ };
43913
+ $.ua.set = function(ua) {
43914
+ parser.setUA(ua);
43915
+ var result = parser.getResult();
43916
+ for (var prop in result) {
43917
+ $.ua[prop] = result[prop];
43918
+ }
43919
+ };
43920
+ }
43921
+ })(typeof window === "object" ? window : exports);
43922
+ }
43923
+ });
43924
+
42591
43925
  // ../../node_modules/use-debounce/dist/index.module.js
42592
43926
  var index_module_exports = {};
42593
43927
  __export(index_module_exports, {
@@ -74391,6 +75725,7 @@ var require_dist2 = __commonJS({
74391
75725
  { width: 768, height: "auto", icon: "Tablet", label: "Medium" },
74392
75726
  { width: 1280, height: "auto", icon: "Monitor", label: "Large" }
74393
75727
  ];
75728
+ var import_ua_parser_js2 = require_ua_parser();
74394
75729
  var import_jsx_runtime22 = require("react/jsx-runtime");
74395
75730
  var defaultAppState2 = {
74396
75731
  data: { content: [], root: { props: { title: "" } } },
@@ -74430,7 +75765,8 @@ var require_dist2 = __commonJS({
74430
75765
  setZoomConfig: () => null,
74431
75766
  status: "LOADING",
74432
75767
  setStatus: () => null,
74433
- iframe: {}
75768
+ iframe: {},
75769
+ safariFallbackMode: false
74434
75770
  };
74435
75771
  var appContext2 = (0, import_react32.createContext)(defaultContext2);
74436
75772
  var AppProvider = ({
@@ -74442,10 +75778,34 @@ var require_dist2 = __commonJS({
74442
75778
  (0, import_react32.useEffect)(() => {
74443
75779
  setStatus("MOUNTED");
74444
75780
  }, []);
75781
+ const [safariFallbackMode, setSafariFallbackMode] = (0, import_react32.useState)(false);
75782
+ (0, import_react32.useEffect)(() => {
75783
+ var _a3, _b, _c;
75784
+ const ua = new import_ua_parser_js2.UAParser(navigator.userAgent);
75785
+ const { browser } = ua.getResult();
75786
+ if (browser.name === "Safari" && (((_a3 = browser.version) == null ? void 0 : _a3.indexOf("17.2.")) || ((_b = browser.version) == null ? void 0 : _b.indexOf("17.3.")) || ((_c = browser.version) == null ? void 0 : _c.indexOf("17.4.")))) {
75787
+ if (process.env.NODE_ENV !== "production" && value.iframe.enabled) {
75788
+ console.warn(
75789
+ `Detected Safari ${browser.version}, which contains a bug that prevents Puck DropZones from detecting a mouseover event within an iframe. This affects Safari versions 17.2, 17.3 and 17.4.
75790
+
75791
+ Running in compatibility mode, which may have some DropZone side-effects. Alternatively, consider disabling iframes: https://puckeditor.com/docs/integrating-puck/viewports#opting-out-of-iframes.
75792
+
75793
+ See https://github.com/measuredco/puck/issues/411 for more information. This message will not show in production.`
75794
+ );
75795
+ }
75796
+ setSafariFallbackMode(true);
75797
+ }
75798
+ }, []);
74445
75799
  return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
74446
75800
  appContext2.Provider,
74447
75801
  {
74448
- value: __spreadProps2(__spreadValues2({}, value), { zoomConfig, setZoomConfig, status, setStatus }),
75802
+ value: __spreadProps2(__spreadValues2({}, value), {
75803
+ zoomConfig,
75804
+ setZoomConfig,
75805
+ status,
75806
+ setStatus,
75807
+ safariFallbackMode
75808
+ }),
74449
75809
  children
74450
75810
  }
74451
75811
  );
@@ -74641,7 +76001,7 @@ var require_dist2 = __commonJS({
74641
76001
  var import_react72 = require("react");
74642
76002
  var import_dnd3 = (init_dnd_esm(), __toCommonJS(dnd_esm_exports));
74643
76003
  init_react_import2();
74644
- var styles_module_default32 = { "DraggableComponent": "_DraggableComponent_1542z_1", "DraggableComponent--isDragging": "_DraggableComponent--isDragging_1542z_11", "DraggableComponent-contents": "_DraggableComponent-contents_1542z_16", "DraggableComponent-overlay": "_DraggableComponent-overlay_1542z_29", "DraggableComponent-loadingOverlay": "_DraggableComponent-loadingOverlay_1542z_49", "DraggableComponent--isLocked": "_DraggableComponent--isLocked_1542z_65", "DraggableComponent--forceHover": "_DraggableComponent--forceHover_1542z_71", "DraggableComponent--isSelected": "_DraggableComponent--isSelected_1542z_76", "DraggableComponent--indicativeHover": "_DraggableComponent--indicativeHover_1542z_81", "DraggableComponent-actionsOverlay": "_DraggableComponent-actionsOverlay_1542z_97", "DraggableComponent-actions": "_DraggableComponent-actions_1542z_97", "DraggableComponent-actionsLabel": "_DraggableComponent-actionsLabel_1542z_127", "DraggableComponent-action": "_DraggableComponent-action_1542z_97" };
76004
+ var styles_module_default32 = { "DraggableComponent": "_DraggableComponent_59z7f_1", "DraggableComponent--isDragging": "_DraggableComponent--isDragging_59z7f_11", "DraggableComponent-contents": "_DraggableComponent-contents_59z7f_16", "DraggableComponent-overlay": "_DraggableComponent-overlay_59z7f_29", "DraggableComponent-loadingOverlay": "_DraggableComponent-loadingOverlay_59z7f_49", "DraggableComponent--isLocked": "_DraggableComponent--isLocked_59z7f_65", "DraggableComponent--forceHover": "_DraggableComponent--forceHover_59z7f_71", "DraggableComponent--isSelected": "_DraggableComponent--isSelected_59z7f_76", "DraggableComponent--indicativeHover": "_DraggableComponent--indicativeHover_59z7f_81", "DraggableComponent-actionsOverlay": "_DraggableComponent-actionsOverlay_59z7f_97", "DraggableComponent-actions": "_DraggableComponent-actions_59z7f_97", "DraggableComponent-actionsLabel": "_DraggableComponent-actionsLabel_59z7f_127", "DraggableComponent-action": "_DraggableComponent-action_59z7f_97" };
74645
76005
  init_react_import2();
74646
76006
  init_react_import2();
74647
76007
  var import_react52 = require("react");
@@ -74982,7 +76342,7 @@ var require_dist2 = __commonJS({
74982
76342
  );
74983
76343
  };
74984
76344
  init_react_import2();
74985
- var styles_module_default42 = { "DropZone": "_DropZone_w4btq_1", "DropZone-content": "_DropZone-content_w4btq_10", "DropZone--userIsDragging": "_DropZone--userIsDragging_w4btq_15", "DropZone--draggingOverArea": "_DropZone--draggingOverArea_w4btq_19", "DropZone--draggingNewComponent": "_DropZone--draggingNewComponent_w4btq_20", "DropZone--isAreaSelected": "_DropZone--isAreaSelected_w4btq_26", "DropZone--hoveringOverArea": "_DropZone--hoveringOverArea_w4btq_27", "DropZone--isDisabled": "_DropZone--isDisabled_w4btq_28", "DropZone--isRootZone": "_DropZone--isRootZone_w4btq_29", "DropZone--hasChildren": "_DropZone--hasChildren_w4btq_30", "DropZone--isDestination": "_DropZone--isDestination_w4btq_40", "DropZone-item": "_DropZone-item_w4btq_52", "DropZone-hitbox": "_DropZone-hitbox_w4btq_56" };
76345
+ var styles_module_default42 = { "DropZone": "_DropZone_djoti_1", "DropZone-content": "_DropZone-content_djoti_10", "DropZone--userIsDragging": "_DropZone--userIsDragging_djoti_15", "DropZone--draggingOverArea": "_DropZone--draggingOverArea_djoti_19", "DropZone--draggingNewComponent": "_DropZone--draggingNewComponent_djoti_20", "DropZone--isAreaSelected": "_DropZone--isAreaSelected_djoti_26", "DropZone--hoveringOverArea": "_DropZone--hoveringOverArea_djoti_27", "DropZone--isDisabled": "_DropZone--isDisabled_djoti_28", "DropZone--isRootZone": "_DropZone--isRootZone_djoti_29", "DropZone--hasChildren": "_DropZone--hasChildren_djoti_30", "DropZone--isDestination": "_DropZone--isDestination_djoti_40", "DropZone-item": "_DropZone-item_djoti_52", "DropZone-hitbox": "_DropZone-hitbox_djoti_56" };
74986
76346
  init_react_import2();
74987
76347
  var import_react82 = require("react");
74988
76348
  var import_use_debounce = (init_index_module(), __toCommonJS(index_module_exports));
@@ -75167,7 +76527,11 @@ var require_dist2 = __commonJS({
75167
76527
  let isEnabled = userWillDrag;
75168
76528
  if (userIsDragging) {
75169
76529
  if (draggingNewComponent) {
75170
- isEnabled = hoveringOverArea;
76530
+ if (appContext22.safariFallbackMode) {
76531
+ isEnabled = true;
76532
+ } else {
76533
+ isEnabled = hoveringOverArea;
76534
+ }
75171
76535
  } else {
75172
76536
  isEnabled = draggingOverArea && hoveringOverZone;
75173
76537
  }
@@ -76933,7 +78297,7 @@ var require_dist2 = __commonJS({
76933
78297
  disabled: readOnly,
76934
78298
  onChange: (e2) => {
76935
78299
  if (e2.currentTarget.value === "true" || e2.currentTarget.value === "false") {
76936
- onChange(Boolean(e2.currentTarget.value));
78300
+ onChange(JSON.parse(e2.currentTarget.value));
76937
78301
  return;
76938
78302
  }
76939
78303
  onChange(e2.currentTarget.value);
@@ -77428,7 +78792,7 @@ var require_dist2 = __commonJS({
77428
78792
  var import_react222 = require("react");
77429
78793
  var import_auto_frame_component = __toESM2(require_dist());
77430
78794
  init_react_import2();
77431
- var styles_module_default16 = { "PuckPreview": "_PuckPreview_1mia0_1", "PuckPreview-frame": "_PuckPreview-frame_1mia0_5" };
78795
+ var styles_module_default16 = { "PuckPreview": "_PuckPreview_rxwlr_1", "PuckPreview-frame": "_PuckPreview-frame_rxwlr_5" };
77432
78796
  var import_jsx_runtime29 = require("react/jsx-runtime");
77433
78797
  var getClassName21 = get_class_name_factory_default2("PuckPreview", styles_module_default16);
77434
78798
  var Preview = ({ id = "puck-preview" }) => {
@@ -78948,6 +80312,7 @@ var defaultViewports = [
78948
80312
  ];
78949
80313
 
78950
80314
  // ../core/components/Puck/context.tsx
80315
+ var import_ua_parser_js = __toESM(require_ua_parser());
78951
80316
  var import_jsx_runtime4 = require("react/jsx-runtime");
78952
80317
  var defaultAppState = {
78953
80318
  data: { content: [], root: { props: { title: "" } } },
@@ -78987,7 +80352,8 @@ var defaultContext = {
78987
80352
  setZoomConfig: () => null,
78988
80353
  status: "LOADING",
78989
80354
  setStatus: () => null,
78990
- iframe: {}
80355
+ iframe: {},
80356
+ safariFallbackMode: false
78991
80357
  };
78992
80358
  var appContext = (0, import_react10.createContext)(defaultContext);
78993
80359
  function useAppContext() {