@levo-so/react 0.1.34 → 0.1.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/Checbox-sq-atGlJ.js.map +1 -0
  2. package/dist/CheckboxWidget-BrVNbP0R.js.map +1 -0
  3. package/dist/CollectionFormBuilder-CkD8uVKZ.js.map +1 -0
  4. package/dist/CurrencyWidget-D_q2AYWu.js.map +1 -0
  5. package/dist/DateTimeWidget-CsuCisSs.js.map +1 -0
  6. package/dist/DefaultFormVariant-rv38sBOZ.js.map +1 -0
  7. package/dist/DropdownWidget-CsTQ0Ojo.js.map +1 -0
  8. package/dist/EmailWidget-Did2OUyB.js.map +1 -0
  9. package/dist/FormCaptcha-C_DxR2za.js.map +1 -0
  10. package/dist/GeocoderWidget-CyzcaWxa.js.map +1 -0
  11. package/dist/Input-Vv7mKQFt.js.map +1 -0
  12. package/dist/MultiGeocoderWidget-DgwiZ330.js.map +1 -0
  13. package/dist/MultiTextWidget-Dic46WBU.js.map +1 -0
  14. package/dist/PhoneWidget-DKH-Wzgz.js.map +1 -0
  15. package/dist/RadioWidget-CTgWKCg2.js.map +1 -0
  16. package/dist/RichTextWidget-C30H7mVF.js.map +1 -0
  17. package/dist/Sonner-t6JVKA0a.js.map +1 -0
  18. package/dist/Spinner-BcBoT-J5.js.map +1 -0
  19. package/dist/StepsFormVariant-myT97AwJ.js.map +1 -0
  20. package/dist/SwitchWidget-BS-rmHiq.js.map +1 -0
  21. package/dist/TextWidget-aNB-0vc-.js.map +1 -0
  22. package/dist/TextareaWidget-CEH-97Oj.js.map +1 -0
  23. package/dist/ToggleCheckboxWidget-C0buyS29.js.map +1 -0
  24. package/dist/Tooltip-DoWyn3Ho.js.map +1 -0
  25. package/dist/URLWidget-DrZlRAD7.js.map +1 -0
  26. package/dist/UploadWidget-Bw7urh-7.js.map +1 -0
  27. package/dist/audience/hooks/useDownloadSpeed.d.ts.map +1 -1
  28. package/dist/audience/hooks/usePerformanceMetrics.d.ts +8 -11
  29. package/dist/audience/hooks/usePerformanceMetrics.d.ts.map +1 -1
  30. package/dist/audience/hooks/useTrackClicks.d.ts.map +1 -1
  31. package/dist/audience/index.js +1 -1
  32. package/dist/audience/index.js.map +1 -0
  33. package/dist/byteToSize-BFKZSBu1.js.map +1 -0
  34. package/dist/cn-C9QoOYNG.js.map +1 -0
  35. package/dist/collection/index.js.map +1 -0
  36. package/dist/components/index.js.map +1 -0
  37. package/dist/errorHandler-_34Yv8wA.js.map +1 -0
  38. package/dist/index.js +1 -1
  39. package/dist/index.js.map +1 -0
  40. package/dist/isEmptyObject-C5s4GzLE.js.map +1 -0
  41. package/dist/jsx-runtime-B6kdoens.js.map +1 -0
  42. package/dist/membership/index.js.map +1 -0
  43. package/dist/page-t8PpNiSB.js +567 -0
  44. package/dist/page-t8PpNiSB.js.map +1 -0
  45. package/dist/providers/index.js.map +1 -0
  46. package/dist/utils/index.js.map +1 -0
  47. package/package.json +4 -4
  48. package/dist/page-BaAkHGtG.js +0 -562
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-t8PpNiSB.js","sources":["../src/audience/components/block.tsx","../src/audience/components/component.tsx","../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isObject.js","../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_freeGlobal.js","../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_root.js","../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/now.js","../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_trimmedEndIndex.js","../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseTrim.js","../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Symbol.js","../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getRawTag.js","../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_objectToString.js","../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseGetTag.js","../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isObjectLike.js","../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isSymbol.js","../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/toNumber.js","../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/debounce.js","../src/audience/hooks/useScrollBehavior.tsx","../src/audience/hooks/useOpenTabs.tsx","../src/audience/hooks/useCurrentTab.tsx","../src/audience/utils/autocapture.ts","../src/audience/utils/rageclick.ts","../src/audience/hooks/useTrackClicks.tsx","../src/audience/hooks/usePerformanceMetrics.tsx","../src/audience/hooks/useTextSelection.tsx","../src/audience/hooks/useDownloadSpeed.tsx","../src/audience/components/page.tsx"],"sourcesContent":["\"use client\";\n\nimport type React from \"react\";\nimport { useEffect } from \"react\";\nimport { useInView } from \"react-intersection-observer\";\nimport type { ILevoAudience } from \"@levo-so/core\";\n\nimport { useLevo } from \"../../providers/LevoProvider\";\n\nexport const LevoAudienceBlock: React.FC<{\n id: string;\n properties?: ILevoAudience.Properties;\n}> = ({ id, properties = {} }) => {\n const { audience } = useLevo();\n\n const { ref: containerRef, inView } = useInView({\n triggerOnce: true,\n });\n\n useEffect(() => {\n if (audience?.instance && inView) {\n audience?.track(\"block.view\", {\n ...properties,\n resource: \"block\",\n identifier: id,\n });\n }\n }, [inView]);\n\n return <div ref={containerRef} style={{ height: \"0px\" }} />;\n};\n\nexport default LevoAudienceBlock;\n","\"use client\";\n\nimport type { ILevoAudience } from \"@levo-so/core\";\nimport { useEffect } from \"react\";\n\nimport { useLevo } from \"../../providers/LevoProvider\";\n\nexport const LevoAudienceComponent: React.FC<{\n event: string;\n properties: ILevoAudience.Properties;\n}> = ({ event, properties }) => {\n const { audience } = useLevo();\n\n useEffect(() => {\n if (audience?.instance) {\n audience?.track(event, properties);\n }\n }, [audience?.instance, event, properties]);\n\n return null;\n};\n\nexport default LevoAudienceComponent;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nexport default now;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nexport default trimmedEndIndex;\n","import trimmedEndIndex from './_trimmedEndIndex.js';\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nexport default baseTrim;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nexport default isSymbol;\n","import baseTrim from './_baseTrim.js';\nimport isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default toNumber;\n","import isObject from './isObject.js';\nimport now from './now.js';\nimport toNumber from './toNumber.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nexport default debounce;\n","\"use client\";\n\nimport debounce from \"lodash-es/debounce\";\nimport { useEffect, useState } from \"react\";\n\n/**\n * A custom React hook to track scroll behavior, speed, and pattern.\n * @returns {object} { depth, speedCategory }\n */\nexport const useScrollBehavior = () => {\n const [depth, setDepth] = useState(0);\n const [prevMilestone, setPrevMilestone] = useState(0);\n const [prevScrollY, setPrevScrollY] = useState(0);\n const [prevTime, setPrevTime] = useState(Date.now());\n const [speedCategory, setSpeedCategory] = useState(\"read\"); // Default to 'read'\n\n const updateScrollData = debounce(() => {\n const scrolledY = window.scrollY;\n const documentHeight = document.documentElement.scrollHeight;\n const viewportHeight = window.innerHeight;\n\n const currentDepth = Math.round(\n (scrolledY / (documentHeight - viewportHeight)) * 100,\n );\n\n // track every 5% of the page\n const currentMilestone = Math.floor(currentDepth / 5) * 5;\n\n if (currentMilestone <= prevMilestone) {\n return; // Do nothing if not reaching a new milestone\n }\n\n const currentTime = Date.now();\n const timeDiff = (currentTime - prevTime) / 1000; // Time in seconds\n const scrollDiffY = Math.abs(scrolledY - prevScrollY);\n const scrollSpeed = scrollDiffY / timeDiff; // Speed in px/sec\n\n // Categorize speed\n setSpeedCategory(scrollSpeed > 300 ? \"scan\" : \"read\");\n\n // Update state\n setPrevScrollY(scrolledY);\n setPrevTime(currentTime);\n setPrevMilestone(currentMilestone);\n setDepth(currentMilestone);\n }, 250);\n\n useEffect(() => {\n window.addEventListener(\"scroll\", updateScrollData);\n return () => window.removeEventListener(\"scroll\", updateScrollData);\n }, []);\n\n return { depth, speedCategory };\n};\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nconst LOCAL_STORAGE_KEY = \"lv_insights_ot\";\n\nconst useOpenTabs = (): number => {\n const [openTabs, setOpenTabs] = useState<number>(0);\n\n useEffect(() => {\n // Get the current count of open tabs from localStorage\n const initialCount = Number(localStorage.getItem(LOCAL_STORAGE_KEY)) || 0;\n setOpenTabs(initialCount);\n\n // Increment open tabs when a new tab is opened\n localStorage.setItem(LOCAL_STORAGE_KEY, (initialCount + 1).toString());\n\n // Listener for changes in localStorage (storage event)\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key === LOCAL_STORAGE_KEY) {\n setOpenTabs(Number(event.newValue) || 0);\n }\n };\n\n // Listen for storage events (other tabs modifying localStorage)\n window.addEventListener(\"storage\", handleStorageChange);\n\n // Decrement open tabs when the tab is closed or reloaded\n const handleBeforeUnload = () => {\n const currentTabs = Number(localStorage.getItem(LOCAL_STORAGE_KEY)) || 0;\n if (currentTabs > 0) {\n localStorage.setItem(LOCAL_STORAGE_KEY, (currentTabs - 1).toString());\n }\n };\n\n window.addEventListener(\"beforeunload\", handleBeforeUnload);\n\n // Cleanup when component unmounts\n return () => {\n window.removeEventListener(\"storage\", handleStorageChange);\n window.removeEventListener(\"beforeunload\", handleBeforeUnload);\n };\n }, []);\n\n return openTabs;\n};\n\nexport default useOpenTabs;\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nconst CURRENT_TAB_LOCAL_STORAGE_KEY = \"lv_insights_ct\";\nconst ALL_TABS_LOCAL_STORAGE_KEY = \"lv_insights_at\";\n\nconst useCurrentTab = (): string | null => {\n const [tabId, setTabId] = useState<string | null>(null);\n\n useEffect(() => {\n // Check if a unique ID exists in sessionStorage\n let existingTabId = sessionStorage.getItem(CURRENT_TAB_LOCAL_STORAGE_KEY);\n\n // If it exists, check if it's already in localStorage (duplicate tab detection)\n const openTabIds = JSON.parse(\n localStorage.getItem(ALL_TABS_LOCAL_STORAGE_KEY) || \"[]\",\n );\n if (existingTabId && openTabIds.includes(existingTabId)) {\n // If it's a duplicate tab (ID already exists), generate a new unique ID\n existingTabId = null;\n }\n\n // If no valid ID exists, generate a new unique one\n if (!existingTabId) {\n existingTabId = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n sessionStorage.setItem(CURRENT_TAB_LOCAL_STORAGE_KEY, existingTabId); // Store in sessionStorage\n }\n\n // Add the unique tab ID to the localStorage list\n if (!openTabIds.includes(existingTabId)) {\n openTabIds.push(existingTabId);\n localStorage.setItem(\n ALL_TABS_LOCAL_STORAGE_KEY,\n JSON.stringify(openTabIds),\n ); // Update localStorage\n }\n\n // Set the tab ID in state\n setTabId(existingTabId);\n\n // Cleanup on tab close or reload\n const handleBeforeUnload = () => {\n const updatedTabIds = openTabIds.filter(\n (id: string) => id !== existingTabId,\n );\n localStorage.setItem(\n ALL_TABS_LOCAL_STORAGE_KEY,\n JSON.stringify(updatedTabIds),\n ); // Update the tab list\n };\n\n window.addEventListener(\"beforeunload\", handleBeforeUnload);\n\n // Cleanup event listener when the component unmounts\n return () => {\n window.removeEventListener(\"beforeunload\", handleBeforeUnload);\n };\n }, []);\n\n return tabId;\n};\n\nexport default useCurrentTab;\n","const isString = (x: unknown): x is string => {\n return Object.prototype.toString.call(x) == \"[object String]\";\n};\n\nconst includes = <T = any>(str: T[] | string, needle: T): boolean => {\n return (str as any).indexOf(needle) !== -1;\n};\n\n// UNDERSCORE\n// Embed part of the Underscore Library\nconst trim = (str: string): string => {\n return str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, \"\");\n};\n\nconst isUndefined = (x: unknown): x is undefined => x === void 0;\n\nconst isNull = (x: unknown): x is null => {\n return x === null;\n};\n\n/*\n sometimes you want to check if something is null or undefined\n that's what this is for\n */\nconst isNullish = (x: unknown): x is null | undefined =>\n isUndefined(x) || isNull(x);\n\n/*\n * Check whether an element has nodeType Node.TEXT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport const isTextNode = (\n el: Element | undefined | null,\n): el is HTMLElement => {\n return !!el && el?.nodeType === 3; // Node.TEXT_NODE - use integer constant for browser portability\n};\n\n/*\n * Check whether an element has nodeType Node.ELEMENT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nfunction isElementNode(el: Node | Element | undefined | null): el is Element {\n return !!el && el?.nodeType === 1; // Node.ELEMENT_NODE - use integer constant for browser portability\n}\n\n/*\n * Check whether an element is of a given tag type.\n * Due to potential reference discrepancies (such as the webcomponents.js polyfill),\n * we want to match tagNames instead of specific references because something like\n * element === document.body won't always work because element might not be a native\n * element.\n * @param {Element} el - element to check\n * @param {string} tag - tag name (e.g., \"div\")\n * @returns {boolean} whether el is of the given tag type\n */\nfunction isTag(el: Element | undefined | null, tag: string): el is HTMLElement {\n return (\n !!el && !!el?.tagName && el?.tagName.toLowerCase() === tag.toLowerCase()\n );\n}\n\nfunction splitClassString(s: string): string[] {\n return s ? trim(s).split(/\\s+/) : [];\n}\n\n/*\n * Get the className of an element, accounting for edge cases where element.className is an object\n *\n * Because this is a string it can contain unexpected characters\n * So, this method safely splits the className and returns that array.\n */\nfunction getClassNames(el: Element): string[] {\n let className = \"\";\n switch (typeof el?.className) {\n case \"string\":\n className = el?.className;\n break;\n // TODO: when is this ever used?\n case \"object\": // handle cases where className might be SVGAnimatedString or some other type\n className =\n (el?.className && \"baseVal\" in el?.className\n ? (el?.className as any).baseVal\n : null) ||\n el?.getAttribute(\"class\") ||\n \"\";\n break;\n default:\n className = \"\";\n }\n\n return splitClassString(className);\n}\n\nexport const makeSafeText = (\n s: string | null | undefined,\n length = 255,\n): string => {\n if (isNullish(s)) {\n return \"\";\n }\n\n return (\n trim(s)\n // scrub potentially sensitive values\n .split(/(\\s+)/)\n .filter((s) => shouldCaptureValue(s))\n .join(\"\")\n // normalize whitespace\n .replace(/[\\r\\n]/g, \" \")\n .replace(/[ ]+/g, \" \")\n // truncate\n .substring(0, length)\n );\n};\n\n/*\n * Get the direct text content of an element, protecting against sensitive data collection.\n * Concats textContent of each of the element's text node children; this avoids potential\n * collection of sensitive data that could happen if we used element.textContent and the\n * element had sensitive child elements, since element.textContent includes child content.\n * Scrubs values that look like they could be sensitive (i.e. cc or ssn number).\n * @param {Element} el - element to get the text of\n * @returns {string} the element's direct text content\n */\nexport const getSafeText = (el: Element): string => {\n let elText = \"\";\n\n if (\n shouldCaptureElement(el) &&\n // !isSensitiveElement(el) &&\n el?.childNodes &&\n el?.childNodes.length\n ) {\n for (const child of el?.childNodes) {\n if (isTextNode(child as Element) && child.textContent) {\n elText += makeSafeText(child.textContent) ?? \"\";\n }\n }\n }\n\n return trim(elText);\n};\n\nexport const getEventTarget = (e: Event): Element | null => {\n // https://developer.mozilla.org/en-US/docs/Web/API/Event/target#Compatibility_notes\n if (isUndefined(e.target)) {\n return (e?.srcElement as Element) || null;\n }\n if ((e?.target as HTMLElement)?.shadowRoot) {\n return (e?.composedPath()?.[0] as Element) || null;\n }\n return (e?.target as Element) || null;\n};\n\n/*\n * Check whether a DOM event should be \"captured\" or if it may contain sentitive data\n * using a variety of heuristics.\n * @param {Element} el - element to check\n * @param {Event} event - event to check\n * @param {Object} autocaptureConfig - autocapture config\n * @param {boolean} captureOnAnyElement - whether to capture on any element, clipboard autocapture doesn't restrict to \"clickable\" elements\n * @param {string[]} allowedEventTypes - event types to capture, normally just 'click', but some autocapture types react to different events, some elements have fixed events (e.g., form has \"submit\")\n * @returns {boolean} whether the event should be captured\n */\nexport const shouldCaptureDomEvent = (el: Element, event: Event): boolean => {\n if (!window || !el || isTag(el, \"html\") || !isElementNode(el)) {\n return false;\n }\n\n const compStyles = window.getComputedStyle(el);\n if (\n compStyles &&\n compStyles.getPropertyValue(\"cursor\") === \"pointer\" &&\n event.type === \"click\"\n ) {\n return true;\n }\n\n const tag = el?.tagName.toLowerCase();\n switch (tag) {\n case \"html\":\n return false;\n case \"form\":\n return event.type === \"submit\";\n case \"input\":\n case \"select\":\n case \"textarea\":\n return [\"change\", \"click\"].includes(event.type);\n default:\n return event.type === \"click\";\n }\n};\n\n/*\n * Check whether a DOM element should be \"captured\" or if it may contain sentitive data\n * using a variety of heuristics.\n * @param {Element} el - element to check\n * @returns {boolean} whether the element should be captured\n */\nfunction shouldCaptureElement(el: Element): boolean {\n if (includes(getClassNames(el), \"ph-include\")) {\n return true;\n }\n\n // don't include hidden or password fields\n const type = (el as HTMLInputElement).type || \"\";\n if (isString(type)) {\n // it's possible for el?.type to be a DOM element if el is a form with a child input[name=\"type\"]\n switch (type.toLowerCase()) {\n case \"hidden\":\n return false;\n case \"password\":\n return false;\n }\n }\n\n // filter out data from fields that look like sensitive fields\n const name = (el as HTMLInputElement).name || el?.id || \"\";\n // See https://github.com/posthog/posthog-js/issues/165\n // Under specific circumstances a bug caused .replace to be called on a DOM element\n // instead of a string, removing the element from the page. Ensure this issue is mitigated.\n if (isString(name)) {\n // it's possible for el?.name or el?.id to be a DOM element if el is a form with a child input[name=\"name\"]\n const sensitiveNameRegex =\n /^cc|cardnum|ccnum|creditcard|csc|cvc|cvv|exp|pass|pwd|routing|seccode|securitycode|securitynum|socialsec|socsec|ssn/i;\n if (sensitiveNameRegex.test(name.replace(/[^a-zA-Z0-9]/g, \"\"))) {\n return false;\n }\n }\n\n return true;\n}\n\n/*\n * Check whether a DOM element is 'sensitive' and we should only capture limited data\n * @param {Element} el - element to check\n * @returns {boolean} whether the element should be captured\n */\n// export const isSensitiveElement = (el: Element): boolean => {\n// // don't send data from inputs or similar elements since there will always be\n// // a risk of clientside javascript placing sensitive data in attributes\n// const allowedInputTypes = [\"button\", \"checkbox\", \"submit\", \"reset\"];\n// if (\n// (isTag(el, \"input\") &&\n// !allowedInputTypes.includes((el as HTMLInputElement).type)) ||\n// isTag(el, \"select\") ||\n// isTag(el, \"textarea\") ||\n// el?.getAttribute(\"contenteditable\") === \"true\"\n// ) {\n// return true;\n// }\n// return false;\n// };\n\n// Define the core pattern for matching credit card numbers\nconst coreCCPattern = `(4[0-9]{12}(?:[0-9]{3})?)|(5[1-5][0-9]{14})|(6(?:011|5[0-9]{2})[0-9]{12})|(3[47][0-9]{13})|(3(?:0[0-5]|[68][0-9])[0-9]{11})|((?:2131|1800|35[0-9]{3})[0-9]{11})`;\n// Create the Anchored version of the regex by adding '^' at the start and '$' at the end\nconst anchoredCCRegex = new RegExp(`^(?:${coreCCPattern})$`);\n// The Unanchored version is essentially the core pattern, usable as is for partial matches\nconst unanchoredCCRegex = new RegExp(coreCCPattern);\n\n// Define the core pattern for matching SSNs with optional dashes\nconst coreSSNPattern = `\\\\d{3}-?\\\\d{2}-?\\\\d{4}`;\n// Create the Anchored version of the regex by adding '^' at the start and '$' at the end\nconst anchoredSSNRegex = new RegExp(`^(${coreSSNPattern})$`);\n// The Unanchored version is essentially the core pattern itself, usable for partial matches\nconst unanchoredSSNRegex = new RegExp(`(${coreSSNPattern})`);\n\n/*\n * Check whether a string value should be \"captured\" or if it may contain sensitive data\n * using a variety of heuristics.\n * @param {string} value - string value to check\n * @param {boolean} anchorRegexes - whether to anchor the regexes to the start and end of the string\n * @returns {boolean} whether the element should be captured\n */\nexport const shouldCaptureValue = (\n value: string,\n anchorRegexes = true,\n): boolean => {\n if (isNullish(value)) {\n return false;\n }\n\n if (isString(value)) {\n value = trim(value);\n\n // check to see if input value looks like a credit card number\n // see: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s20.html\n const ccRegex = anchorRegexes ? anchoredCCRegex : unanchoredCCRegex;\n if (ccRegex.test((value || \"\").replace(/[- ]/g, \"\"))) {\n return false;\n }\n\n // check to see if input value looks like a social security number\n const ssnRegex = anchorRegexes ? anchoredSSNRegex : unanchoredSSNRegex;\n if (ssnRegex.test(value)) {\n return false;\n }\n }\n\n return true;\n};\n\n/*\n * Check whether an attribute name is an Angular style attr (either _ngcontent or _nghost)\n * These update on each build and lead to noise in the element chain\n * More details on the attributes here: https://angular.io/guide/view-encapsulation\n * @param {string} attributeName - string value to check\n * @returns {boolean} whether the element is an angular tag\n */\nexport const isAngularStyleAttr = (attributeName: string): boolean => {\n if (isString(attributeName)) {\n return (\n attributeName.substring(0, 10) === \"_ngcontent\" ||\n attributeName.substring(0, 7) === \"_nghost\"\n );\n }\n return false;\n};\n\n/*\n * Iterate through children of a target element looking for span tags\n * and return the text content of the span tags, separated by spaces,\n * along with the direct text content of the target element\n * @param {Element} target - element to check\n * @returns {string} text content of the target element and its child span tags\n */\nexport const getDirectAndNestedSpanText = (target: Element): string => {\n let text = getSafeText(target);\n text = `${text} ${getNestedSpanText(target)}`.trim();\n return shouldCaptureValue(text) ? text : \"\";\n};\n\n/*\n * Iterate through children of a target element looking for span tags\n * and return the text content of the span tags, separated by spaces\n * @param {Element} target - element to check\n * @returns {string} text content of span tags\n */\nfunction getNestedSpanText(target: Element): string {\n let text = \"\";\n if (target?.childNodes.length) {\n for (const child of target.childNodes) {\n if (child && (child as Element).tagName?.toLowerCase() === \"span\") {\n try {\n const spanText = getSafeText(child as Element);\n text = `${text} ${spanText}`.trim();\n\n if (child?.childNodes.length) {\n text = `${text} ${getNestedSpanText(child as Element)}`.trim();\n }\n } catch (e) {\n //\n }\n }\n }\n }\n return text;\n}\n\nexport type Property = any;\nexport type Properties = Record<string, Property>;\n\nconst inputBasedElementTags = [\"input\", \"textarea\", \"select\"];\n\nexport const getAttributes = (element: Element): Properties => {\n const tag_name = element?.tagName?.toLowerCase();\n\n const properties: Properties = {\n element: tag_name,\n };\n\n if (tag_name?.toLowerCase() === \"a\" || tag_name?.toLowerCase() === \"button\") {\n properties.text = getDirectAndNestedSpanText(element);\n } else {\n properties.text = getSafeText(element);\n }\n\n // capture the deny list here because this not-a-class class makes it tricky to use this.config in the function below\n const attributes = Array.from(element.attributes).reduce(\n (acc, attr) => {\n // // Only capture attributes we know are safe\n // if (\n // isSensitiveElement(element) &&\n // ![\"name\", \"id\", \"class\", \"aria-label\"].includes(attr.name)\n // ) {\n // return acc;\n // }\n\n if (shouldCaptureValue(attr.value) && !isAngularStyleAttr(attr.name)) {\n if (attr.name === \"class\") {\n return acc;\n }\n\n acc[attr.name] =\n typeof attr?.value === \"string\"\n ? makeSafeText(attr.value)\n : attr.value;\n }\n\n return acc;\n },\n {} as Record<string, string>,\n );\n\n properties.attributes = attributes;\n\n if (\n inputBasedElementTags.includes(tag_name) ||\n element?.getAttribute(\"contenteditable\") === \"true\"\n ) {\n let value;\n\n if (element.matches('input[type=\"checkbox\"], input[type=\"radio\"]')) {\n value = (element as HTMLInputElement).checked;\n } else if (\n element.matches(\"input, select, textarea\") &&\n !element.matches('input[type=\"password\"]')\n ) {\n value = (element as HTMLInputElement).value;\n }\n\n if (value !== undefined) {\n properties.value =\n typeof value === \"string\" || value === null\n ? makeSafeText(value, 1024)\n : value;\n }\n\n let label = \"\";\n\n if (properties?.attributes.id) {\n // Method 1: If the label is associated via `for` attribute\n label = makeSafeText(\n document\n .querySelector(`label[for=\"${properties?.attributes.id}\"]`)\n ?.textContent?.trim() || \"\",\n );\n }\n\n // Method 2: If the input is wrapped by the label\n const wrappingLabel = element.closest(\"label\");\n\n if (!label) {\n label = makeSafeText(wrappingLabel?.textContent?.trim() || \"\");\n }\n\n if (label) {\n properties.label = label;\n }\n }\n\n return properties;\n};\n\nexport const getPropertiesFromEvent = (e: Event, eventName: string) => {\n /*** Don't mess with this code without running IE8 tests on it ***/\n let target = getEventTarget(e);\n\n if (isTextNode(target)) {\n // defeat Safari bug (see: http://www.quirksmode.org/js/events_properties.html)\n target = (target.parentNode || null) as Element | null;\n }\n\n const isCopyEvent = [\"copy\", \"cut\"].includes(eventName);\n\n if (target && (isCopyEvent || shouldCaptureDomEvent(target, e))) {\n const properties = getAttributes(target);\n\n if (isCopyEvent) {\n // you can't read the data from the clipboard event,\n // but you can guess that you can read it from the window's current selection\n const selectedContent = makeSafeText(window?.getSelection()?.toString());\n const clipType = (e as ClipboardEvent)?.type || \"clipboard\";\n\n properties.copy_text = selectedContent ?? \"\";\n properties.copy_type = clipType ?? \"\";\n }\n\n return properties;\n }\n\n return null;\n};\n","// Naive rage click implementation: If mouse has not moved further than RAGE_CLICK_THRESHOLD_PX\n// over RAGE_CLICK_CLICK_COUNT clicks with max RAGE_CLICK_TIMEOUT_MS between clicks, it's\n// counted as a rage click\n\nconst RAGE_CLICK_THRESHOLD_PX = 30;\nconst RAGE_CLICK_TIMEOUT_MS = 1000;\nconst RAGE_CLICK_CLICK_COUNT = 3;\n\nclass RageClick {\n clicks: { x: number; y: number; timestamp: number }[];\n\n constructor() {\n this.clicks = [];\n }\n\n isRageClick(x: number, y: number, timestamp: number): boolean {\n const lastClick = this.clicks[this.clicks.length - 1];\n if (\n lastClick &&\n Math.abs(x - lastClick.x) + Math.abs(y - lastClick.y) <\n RAGE_CLICK_THRESHOLD_PX &&\n timestamp - lastClick.timestamp < RAGE_CLICK_TIMEOUT_MS\n ) {\n this.clicks.push({ x, y, timestamp });\n\n if (this.clicks.length === RAGE_CLICK_CLICK_COUNT) {\n return true;\n }\n } else {\n this.clicks = [{ x, y, timestamp }];\n }\n\n return false;\n }\n}\n\nexport const rageClick = new RageClick();\n","\"use client\";\n\nimport type { ILevoAudience } from \"@levo-so/core\";\nimport { useEffect } from \"react\";\n\nimport { rageClick } from \"../utils/rageclick\";\nimport { getAttributes } from \"../utils/autocapture\";\nimport { useLevo } from \"../../providers/LevoProvider\";\n\nconst useTrackClicks = () => {\n const { audience } = useLevo();\n\n useEffect(() => {\n let clickTimeout: NodeJS.Timeout | null = null;\n\n const handleClick = (event: MouseEvent) => {\n if (clickTimeout) {\n clearTimeout(clickTimeout);\n clickTimeout = null;\n return; // Prevent single click tracking if a double click occurs\n }\n\n clickTimeout = setTimeout(() => {\n trackClick(event, false);\n clickTimeout = null;\n }, 250);\n };\n\n const handleDoubleClick = (event: MouseEvent) => {\n if (clickTimeout) {\n clearTimeout(clickTimeout);\n clickTimeout = null;\n }\n trackClick(event, true);\n };\n\n const trackClick = (event: MouseEvent, isDoubleClick = false) => {\n try {\n let properties: ILevoAudience.Properties = {\n hostname: window.location.hostname,\n pathname: window.location.pathname,\n page_title: document.title,\n url: window.location.href,\n created_at: new Date().toISOString(),\n event_type: isDoubleClick ? \"dblclick\" : \"click\",\n button_type: event.button,\n };\n\n if (event.target instanceof HTMLElement) {\n const element = event.target as HTMLElement;\n\n properties.rage_click = rageClick?.isRageClick(\n event.clientX,\n event.clientY,\n new Date().getTime(),\n );\n\n properties = {\n ...properties,\n ...getAttributes(element),\n };\n\n let href: string | null = element?.getAttribute(\"href\");\n\n if (!href) {\n let parentNode: ParentNode | null = element.parentNode;\n let checkCount = 0;\n\n while (parentNode && checkCount < 8) {\n const current_href =\n parentNode?.parentElement?.getAttribute(\"href\");\n\n // Find any parent node with href attribute\n if (current_href) {\n href = current_href;\n break;\n }\n\n parentNode = parentNode.parentNode;\n checkCount++;\n }\n }\n\n audience?.track(\"page.click\", {\n ...properties,\n href: href || undefined,\n });\n }\n } catch (e) {\n //\n }\n };\n\n document.addEventListener(\"click\", handleClick);\n document.addEventListener(\"dblclick\", handleDoubleClick);\n\n return () => {\n document.removeEventListener(\"click\", handleClick);\n document.removeEventListener(\"dblclick\", handleDoubleClick);\n };\n }, [audience]);\n};\n\nexport default useTrackClicks;\n","import { useState, useEffect } from \"react\";\n\nimport { useLevo } from \"../../providers/LevoProvider\";\n\ntype NullableNumber = number | null;\n\ntype TrackPayload = Partial<{\n page_loaded_at: NullableNumber;\n script_load: NullableNumber;\n script_load_at: NullableNumber;\n first_contentful_paint: NullableNumber;\n first_contentful_paint_at: NullableNumber;\n window_onload: NullableNumber;\n window_onload_at: NullableNumber;\n}>;\n\ntype PerformanceMetric = {\n value: NullableNumber;\n timestamp: NullableNumber;\n};\n\nconst toInt = (value: number): number => Number(value.toFixed(0));\n\nconst usePerformanceMetrics = (_: string) => {\n const { audience } = useLevo();\n\n const [script] = useState<PerformanceMetric>({\n value: toInt(performance.now()),\n timestamp: toInt(Date.now()),\n });\n\n const [fcp, setFcp] = useState<PerformanceMetric>({\n value: null,\n timestamp: null,\n });\n\n const [windowOnload, setWindowOnload] = useState<PerformanceMetric>({\n value: null,\n timestamp: null,\n });\n\n useEffect(() => {\n let isMounted = true;\n\n const updateMetric = (\n setter: React.Dispatch<React.SetStateAction<PerformanceMetric>>,\n value: number,\n ) => {\n if (isMounted) {\n setter({ value: toInt(value), timestamp: toInt(Date.now()) });\n }\n };\n\n const paintObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.name === \"first-contentful-paint\") {\n updateMetric(setFcp, entry.startTime);\n }\n }\n });\n paintObserver.observe({ type: \"paint\", buffered: true });\n\n const onLoadHandler = () =>\n updateMetric(setWindowOnload, performance.now());\n\n if (document.readyState === \"complete\") {\n updateMetric(setWindowOnload, performance.now());\n } else {\n window.addEventListener(\"load\", onLoadHandler);\n }\n\n return () => {\n isMounted = false;\n paintObserver.disconnect();\n window.removeEventListener(\"load\", onLoadHandler);\n };\n }, []);\n\n useEffect(() => {\n if (script && audience) {\n audience?.track<TrackPayload>(\"page.metrics\", {\n script_load: script.value,\n script_load_at: script.timestamp,\n version: 2,\n });\n }\n }, [script, audience]);\n\n useEffect(() => {\n if (fcp.value !== null && audience) {\n audience?.track<TrackPayload>(\"page.metrics\", {\n first_contentful_paint: fcp.value,\n first_contentful_paint_at: fcp.timestamp,\n version: 2,\n });\n }\n }, [fcp, audience]);\n\n useEffect(() => {\n if (windowOnload.value !== null && audience) {\n audience?.track<TrackPayload>(\"page.metrics\", {\n window_onload: windowOnload.value,\n window_onload_at: windowOnload.timestamp,\n version: 2,\n });\n }\n }, [windowOnload, audience]);\n\n return { script, fcp, window_onload: windowOnload };\n};\n\nexport default usePerformanceMetrics;\n","import { useEffect } from \"react\";\n\nimport { useLevo } from \"../../providers/LevoProvider\";\nimport { makeSafeText } from \"../utils/autocapture\";\n\nconst useTextSelection = () => {\n const { audience } = useLevo();\n\n useEffect(() => {\n let debounceTimer: NodeJS.Timeout;\n const onSelectionChange = () => {\n clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n const selection = window.getSelection();\n if (selection && selection?.rangeCount > 0) {\n const selectedText = selection?.toString();\n if (selectedText) {\n audience?.track(\"page.selection\", {\n text: makeSafeText(selectedText),\n });\n }\n }\n }, 1000); // Adjust delay as needed\n };\n\n document.addEventListener(\"selectionchange\", onSelectionChange);\n\n return () => {\n clearTimeout(debounceTimer);\n document.removeEventListener(\"selectionchange\", onSelectionChange);\n };\n }, []);\n};\n\nexport default useTextSelection;\n","import { useState, useEffect } from \"react\";\nimport { LocalStorageLock } from \"@levo-so/core\";\n\nconst CACHE_KEY = \"lv_insights_st\"; // speed test\nconst EXPIRY_TIME_MS = 15 * 60 * 1000; // 15 minutes\n\nconst useDownloadSpeed = (\n testUrl: string = \"https://cachefly.cachefly.net/1mb.test\",\n) => {\n const [speedMbps, setSpeedMbps] = useState<number | null>(null);\n\n useEffect(() => {\n const cachedData = localStorage.getItem(CACHE_KEY);\n if (cachedData) {\n const { speed, timestamp } = JSON.parse(cachedData);\n if (Date.now() - timestamp < EXPIRY_TIME_MS) {\n setSpeedMbps(speed);\n return;\n }\n }\n\n let timeoutId: NodeJS.Timeout | null = null;\n\n const measureSpeed = async () => {\n const lock = new LocalStorageLock(\"download_speed\");\n if (!lock.acquireLock()) {\n return;\n }\n try {\n const fileSizeMb = 8; // 1MB file = 8 megabits\n\n const startTime = performance.now();\n await fetch(testUrl, { cache: \"no-store\" });\n const endTime = performance.now();\n\n const durationSeconds = (endTime - startTime) / 1000;\n const speed = Math.round(fileSizeMb / durationSeconds);\n\n setSpeedMbps(speed);\n localStorage.setItem(\n CACHE_KEY,\n JSON.stringify({ speed, timestamp: Date.now() }),\n );\n } catch (error) {\n //\n } finally {\n lock.releaseLock();\n }\n };\n\n const onUserInteraction = () => {\n document.removeEventListener(\"mousemove\", onUserInteraction);\n document.removeEventListener(\"keydown\", onUserInteraction);\n document.removeEventListener(\"scroll\", onUserInteraction);\n\n timeoutId = setTimeout(measureSpeed, 5000); // Delay by 5s after interaction\n };\n\n document.addEventListener(\"mousemove\", onUserInteraction, { once: true });\n document.addEventListener(\"keydown\", onUserInteraction, { once: true });\n document.addEventListener(\"scroll\", onUserInteraction, { once: true });\n\n return () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n document.removeEventListener(\"mousemove\", onUserInteraction);\n document.removeEventListener(\"keydown\", onUserInteraction);\n document.removeEventListener(\"scroll\", onUserInteraction);\n };\n }, [testUrl]);\n\n return speedMbps;\n};\n\nexport default useDownloadSpeed;\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { LifecycleState, usePageLifecycle } from \"use-page-lifecycle\";\nimport type { ILevoAudience, LevoClient } from \"@levo-so/core\";\nimport type { LevoAudience } from \"@levo-so/core/audience-plugin\";\n\nimport { useLevo } from \"../../providers/LevoProvider\";\nimport { useScrollBehavior } from \"../hooks/useScrollBehavior\";\nimport useOpenTabs from \"../hooks/useOpenTabs\";\nimport useCurrentTab from \"../hooks/useCurrentTab\";\nimport { getPropertiesFromEvent } from \"../utils/autocapture\";\nimport useTrackClicks from \"../hooks/useTrackClicks\";\nimport usePerformanceMetrics from \"../hooks/usePerformanceMetrics\";\nimport useTextSelection from \"../hooks/useTextSelection\";\nimport useDownloadSpeed from \"../hooks/useDownloadSpeed\";\n\ndeclare global {\n interface Window {\n levo_client?: LevoClient;\n levo_audience?: LevoAudience;\n }\n}\n\nexport const LevoAudiencePage: React.FC<{\n id?: string;\n properties?: ILevoAudience.Properties;\n}> = ({ id, properties = {} }) => {\n const href = typeof window !== \"undefined\" ? window.location.href : \"\";\n\n const { client, audience } = useLevo();\n\n useEffect(() => {\n if (client && typeof window !== \"undefined\") {\n window.levo_client = client;\n }\n }, [client]);\n\n useEffect(() => {\n if (audience && typeof window !== \"undefined\") {\n window.levo_audience = audience;\n }\n }, [audience]);\n\n /**\n * This hook is used to track the number of open tabs.\n */\n useOpenTabs();\n\n /**\n * This hook is used to track the current tab.\n */\n useCurrentTab();\n\n /**\n * This hook is used to track clicks on the page.\n */\n useTrackClicks();\n\n const speed = useDownloadSpeed();\n\n useEffect(() => {\n if (audience?.instance && speed) {\n audience.track(\"user.speedtest\", {\n speed,\n unit: \"Mbps\",\n });\n }\n }, [audience?.instance, speed]);\n\n /**\n * This hook is used to track the scroll depth of the page.\n */\n const scrollBehavior = useScrollBehavior();\n\n useEffect(() => {\n if (audience?.instance) {\n audience.track(\"page.scroll\", {\n resource: \"page\",\n identifier: id,\n percent: scrollBehavior.depth,\n speed_category: scrollBehavior.speedCategory,\n });\n }\n }, [\n audience?.instance,\n scrollBehavior.depth,\n scrollBehavior.speedCategory,\n id,\n ]);\n\n /**\n * This hook is used to track the performance metrics of the page\n * including the time to first paint, time to load, script load time.\n */\n usePerformanceMetrics(href);\n\n /**\n * This hook is used to track the text selection of the page.\n */\n useTextSelection();\n\n /**\n * This hook is used to track when the user leaves the page\n * using the beforeunload event.\n */\n useEffect(() => {\n const handleBeforeUnload = () => {\n audience?.bounce({\n resource: \"page\",\n identifier: id,\n });\n };\n\n if (window) {\n window.addEventListener(\"beforeunload\", handleBeforeUnload);\n }\n\n return () => {\n if (window) {\n window.removeEventListener(\"beforeunload\", handleBeforeUnload);\n }\n };\n }, [audience, id]);\n\n /**\n * This hook is used to track the lifecycle state of the page\n * by listening to the usePageLifecycle hook.\n */\n\n const [lifecycleState] = usePageLifecycle();\n\n useEffect(() => {\n /**\n * Active state if the page is visible and has input focus.\n * ACTIVE = \"active\",\n *\n * Passive state if the page is visible but does not have input focus.\n * PASSIVE = \"passive\",\n *\n * Hidden state if the page is not visible and has not been frozen.\n * HIDDEN = \"hidden\",\n *\n * Frozen state.\n * FROZEN = \"frozen\",\n *\n * Terminated state if the page has started unloading and is being cleared from the browser's memory.\n * TERMINATED = \"terminated\",\n *\n * Unknown state, fallback.\n * UNKNOWN = \"unknown\"\n **/\n\n if (\n lifecycleState === LifecycleState.TERMINATED ||\n lifecycleState === LifecycleState.HIDDEN ||\n lifecycleState === LifecycleState.UNKNOWN ||\n lifecycleState === LifecycleState.FROZEN\n ) {\n audience?.bounce({\n resource: \"page\",\n identifier: id,\n state: lifecycleState,\n });\n }\n }, [lifecycleState, audience, id]);\n\n /**\n * This hook is used to track the page views only when the URL changes.\n */\n useEffect(() => {\n const handleOnLoad = () => {\n if (client?.insightsUrl && client.workspace && href) {\n if (!audience?.instance) {\n audience?.initiate({\n ...properties,\n id,\n created_at: new Date().toISOString(),\n });\n } else {\n audience.instance.page({\n resource: \"page\",\n identifier: id,\n });\n }\n }\n };\n\n handleOnLoad();\n }, [client?.insightsUrl, client?.workspace, href]);\n\n /**\n * This hook is used to track events on the page.\n */\n useEffect(() => {\n const collectEventNames = {\n change: \"form.change\",\n submit: \"form.submit\",\n copy: \"page.copy\",\n cut: \"page.copy\",\n };\n\n const handler =\n (eventName: keyof typeof collectEventNames) => (e: Event) => {\n const properties = getPropertiesFromEvent(e, eventName);\n\n if (properties) {\n audience?.track(collectEventNames[eventName], properties);\n }\n };\n\n const eventHandlers = {\n change: handler(\"change\"),\n copy: handler(\"copy\"),\n cut: handler(\"cut\"),\n submit: handler(\"submit\"),\n };\n\n document.addEventListener(\"change\", eventHandlers.change);\n document.addEventListener(\"copy\", eventHandlers.copy);\n document.addEventListener(\"cut\", eventHandlers.cut);\n document.addEventListener(\"submit\", eventHandlers.submit);\n\n return () => {\n document.removeEventListener(\"change\", eventHandlers.change);\n document.removeEventListener(\"copy\", eventHandlers.copy);\n document.removeEventListener(\"cut\", eventHandlers.cut);\n document.removeEventListener(\"submit\", eventHandlers.submit);\n };\n }, []);\n\n if (\n !client?.insightsUrl ||\n !client.workspace ||\n !client.workspace.startsWith(\"W\")\n ) {\n console.error(\n \"[@levo-so/react] The utility could not be initialized, due to missing workspace, or endpoint for insights.\",\n );\n return null;\n }\n\n return null;\n};\n\nexport default LevoAudiencePage;\n"],"names":["LevoAudienceBlock","id","properties","audience","useLevo","containerRef","inView","useInView","useEffect","jsx","LevoAudienceComponent","event","isObject","value","type","freeGlobal","freeSelf","root","now","reWhitespace","trimmedEndIndex","string","index","reTrimStart","baseTrim","Symbol","objectProto","hasOwnProperty","nativeObjectToString","symToStringTag","getRawTag","isOwn","tag","unmasked","result","objectToString","nullTag","undefinedTag","baseGetTag","isObjectLike","symbolTag","isSymbol","NAN","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","toNumber","other","isBinary","FUNC_ERROR_TEXT","nativeMax","nativeMin","debounce","func","wait","options","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","invokeFunc","time","args","thisArg","leadingEdge","timerExpired","remainingWait","timeSinceLastCall","timeSinceLastInvoke","timeWaiting","shouldInvoke","trailingEdge","cancel","flush","debounced","isInvoking","useScrollBehavior","depth","setDepth","useState","prevMilestone","setPrevMilestone","prevScrollY","setPrevScrollY","prevTime","setPrevTime","speedCategory","setSpeedCategory","updateScrollData","scrolledY","documentHeight","viewportHeight","currentDepth","currentMilestone","currentTime","timeDiff","scrollSpeed","LOCAL_STORAGE_KEY","useOpenTabs","openTabs","setOpenTabs","initialCount","handleStorageChange","handleBeforeUnload","currentTabs","CURRENT_TAB_LOCAL_STORAGE_KEY","ALL_TABS_LOCAL_STORAGE_KEY","useCurrentTab","tabId","setTabId","existingTabId","openTabIds","updatedTabIds","isString","x","includes","str","needle","trim","isUndefined","isNull","isNullish","isTextNode","el","isElementNode","isTag","splitClassString","s","getClassNames","className","makeSafeText","length","shouldCaptureValue","getSafeText","elText","shouldCaptureElement","child","getEventTarget","e","_a","_b","shouldCaptureDomEvent","compStyles","name","coreCCPattern","anchoredCCRegex","unanchoredCCRegex","coreSSNPattern","anchoredSSNRegex","unanchoredSSNRegex","anchorRegexes","isAngularStyleAttr","attributeName","getDirectAndNestedSpanText","target","text","getNestedSpanText","spanText","inputBasedElementTags","getAttributes","element","tag_name","attributes","acc","attr","label","_c","wrappingLabel","_d","getPropertiesFromEvent","eventName","isCopyEvent","selectedContent","clipType","RAGE_CLICK_THRESHOLD_PX","RAGE_CLICK_TIMEOUT_MS","RAGE_CLICK_CLICK_COUNT","RageClick","__publicField","y","timestamp","lastClick","rageClick","useTrackClicks","clickTimeout","handleClick","trackClick","handleDoubleClick","isDoubleClick","href","parentNode","checkCount","current_href","toInt","usePerformanceMetrics","_","script","fcp","setFcp","windowOnload","setWindowOnload","isMounted","updateMetric","setter","paintObserver","list","entry","onLoadHandler","useTextSelection","debounceTimer","onSelectionChange","selection","selectedText","CACHE_KEY","EXPIRY_TIME_MS","useDownloadSpeed","testUrl","speedMbps","setSpeedMbps","cachedData","speed","timeoutId","measureSpeed","lock","LocalStorageLock","startTime","durationSeconds","onUserInteraction","LevoAudiencePage","client","scrollBehavior","lifecycleState","usePageLifecycle","LifecycleState","collectEventNames","handler","eventHandlers"],"mappings":"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","x_google_ignoreList":[2,3,4,5,6,7,8,9,10,11,12,13,14,15]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../core/dist/chunk-QJSKNLTV.js","../../../core/dist/plugins/LevoLogger.js","../../../core/dist/plugins/LevoMedia.js","../../src/providers/LevoProvider.tsx"],"sourcesContent":["// src/plugins/LevoPlugin.ts\nvar LevoPlugin = class {\n client;\n constructor(client) {\n this.client = client;\n }\n};\n\nexport { LevoPlugin };\n","import { LevoPlugin } from '../chunk-QJSKNLTV.js';\nimport wretch from 'wretch';\n\nvar LogBatch = class {\n logApiUrl = \"https://public-api.levo.so\";\n logs = [];\n activeFlush = Promise.resolve();\n nextFlush = setTimeout(() => {\n }, 0);\n lastFlush = /* @__PURE__ */ new Date();\n constructor(options = {}) {\n if (options?.logApiUrl) {\n this.logApiUrl = options?.logApiUrl;\n }\n }\n sendLogs = async (logs) => {\n const url = `${this.logApiUrl}/v1/apm/logs/json`;\n const sendFallback = () => {\n return wretch().url(url).post(logs).res().catch((e) => console.error(e));\n };\n try {\n if (typeof fetch === \"undefined\") {\n throw new Error(\"fetch is not defined\");\n } else if (typeof window !== \"undefined\" && navigator.sendBeacon) {\n try {\n if (!navigator.sendBeacon.bind(navigator)(url, JSON.stringify(logs))) {\n return sendFallback();\n }\n } catch {\n return sendFallback();\n }\n } else {\n return sendFallback();\n }\n } catch (e) {\n console.warn(`Failed to send logs to server: ${e}`);\n this.logs = [...this.logs, ...logs];\n }\n };\n ingest = (log) => {\n if (!this.logApiUrl) return;\n const task = Array.isArray(log) ? log : [log];\n this.logs.push(task);\n if (this.logs.length >= 50 || this.lastFlush.getTime() < Date.now() - 1500) {\n clearTimeout(this.nextFlush);\n this.activeFlush = this.flush();\n } else {\n clearTimeout(this.nextFlush);\n this.nextFlush = setTimeout(() => {\n this.activeFlush = this.flush();\n }, 1500);\n }\n };\n flush = async () => {\n const tasks = this.logs.splice(0, this.logs.length);\n clearTimeout(this.nextFlush);\n await this.activeFlush;\n if (tasks.length === 0) {\n this.lastFlush = /* @__PURE__ */ new Date();\n return;\n }\n try {\n await this.sendLogs(tasks);\n } catch (e) {\n console.log(\"error sending logs\", e);\n } finally {\n this.lastFlush = /* @__PURE__ */ new Date();\n }\n };\n};\n\n// src/plugins/LevoLogger.ts\nvar isBrowser = typeof window !== \"undefined\";\nvar LogLevel = /* @__PURE__ */ ((LogLevel2) => {\n LogLevel2[LogLevel2[\"debug\"] = 0] = \"debug\";\n LogLevel2[LogLevel2[\"info\"] = 1] = \"info\";\n LogLevel2[LogLevel2[\"warn\"] = 2] = \"warn\";\n LogLevel2[LogLevel2[\"error\"] = 3] = \"error\";\n LogLevel2[LogLevel2[\"off\"] = 100] = \"off\";\n return LogLevel2;\n})(LogLevel || {});\nvar getMethodName = (level) => {\n switch (level) {\n case 0 /* debug */:\n return \"log\";\n case 1 /* info */:\n return \"info\";\n case 2 /* warn */:\n return \"warn\";\n case 3 /* error */:\n return \"error\";\n default:\n return \"log\";\n }\n};\nvar LevoLogger = class extends LevoPlugin {\n logLevel = 0 /* debug */;\n enableRemote = false;\n batch;\n context;\n constructor(client, batchOptions = {}, context = {}) {\n super(client);\n this.batch = new LogBatch(batchOptions);\n this.context = context;\n this.logLevel = batchOptions?.level ?? (this.client.NODE_ENV !== \"development\" ? 1 /* info */ : 0 /* debug */);\n this.enableRemote = batchOptions?.enableRemote ?? this.client.NODE_ENV !== \"development\";\n }\n debug = (...args) => {\n this.log(0 /* debug */, args);\n };\n info = (...args) => {\n this.log(1 /* info */, args);\n };\n warn = (...args) => {\n this.log(2 /* warn */, args);\n };\n error = (...args) => {\n this.log(3 /* error */, args);\n };\n format(messages) {\n let message = \"\";\n const formattedMessages = messages.map((arg) => {\n let payload = \"\";\n const isMessageEmpty = !message;\n if (typeof arg === \"string\") {\n payload = arg;\n if (isMessageEmpty) {\n message = arg;\n }\n } else if (arg instanceof Error) {\n payload = {\n message: arg.message,\n name: arg.name,\n stack: arg.stack\n };\n if (isMessageEmpty) {\n message = arg.message;\n }\n } else if (typeof arg === \"object\") {\n payload = arg;\n } else {\n payload = String(arg);\n if (isMessageEmpty) {\n message = String(arg);\n }\n }\n return payload;\n }).filter(Boolean);\n if (!message && formattedMessages.length > 0) {\n message = \"Default message (Check content for details)\";\n }\n if (formattedMessages?.length === 1 && formattedMessages[0] === message) {\n return { message, content: {} };\n }\n return {\n message,\n content: formattedMessages\n };\n }\n log = (level, args) => {\n const messages = Array.isArray(args) ? args : [args];\n if (level < this.logLevel) {\n return;\n }\n if (this.enableRemote && level === 3 /* error */) {\n const { content = {}, message } = this.format(messages);\n if (message) {\n const log = {\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n level: \"error\",\n workspace: this.client.workspace,\n appName: this.client.appName,\n isBrowser,\n ...this.context,\n message,\n content\n };\n if (isBrowser) {\n log.hostname = window.location.hostname;\n log.pathname = window.location.pathname;\n log.url = window.location.href;\n log.page_title = window.document.title;\n log.userAgent = window.navigator.userAgent;\n }\n this.batch.ingest(log);\n }\n }\n const method = getMethodName(level);\n console[method](...messages);\n };\n};\n\nexport { LevoLogger, LogLevel, isBrowser };\n","import { LevoPlugin } from '../chunk-QJSKNLTV.js';\n\n// src/plugins/LevoMedia.ts\nvar LevoMedia = class extends LevoPlugin {\n mediaBulkUpload = (formData, options = {}) => {\n return this.client.fetch.url(\"/v1/assets/media/bulk\").options(options).post(formData).json();\n };\n getAllMedia = async (data = {}) => {\n return await this.client.fetch.url(\"/v1/assets/media/query\").post(data).json();\n };\n};\n\nexport { LevoMedia };\n","\"use client\";\n\nimport type { LevoClient } from \"@levo-so/core\";\nimport type { LevoBlog } from \"@levo-so/core/blog-plugin\";\nimport type { LevoCollection } from \"@levo-so/core/collection-plugin\";\nimport type { LevoAudience } from \"@levo-so/core/audience-plugin\";\nimport { LevoLogger } from \"@levo-so/core/logger-plugin\";\nimport { LevoMedia } from \"@levo-so/core/media-plugin\";\nimport type { LevoMembership } from \"@levo-so/core/membership-plugin\";\nimport type React from \"react\";\nimport { createContext, useContext, useState } from \"react\";\n\ninterface ILevoContext {\n client: LevoClient;\n audience?: LevoAudience;\n membership?: LevoMembership;\n collection?: LevoCollection;\n blog?: LevoBlog;\n media: LevoMedia;\n logger: LevoLogger;\n}\n\nconst LevoContext = createContext<ILevoContext | null>(null);\n\ninterface ILevoProps extends Partial<Omit<ILevoContext, \"media\" | \"logger\">> {\n client: LevoClient;\n children: React.ReactNode;\n}\n\nexport const LevoProvider: React.FC<ILevoProps> = ({\n children,\n client,\n ...props\n}) => {\n const [logger] = useState(new LevoLogger(client));\n const [media] = useState(new LevoMedia(client));\n\n return (\n <LevoContext.Provider\n value={{\n client,\n media,\n logger,\n ...props,\n }}\n >\n {children}\n </LevoContext.Provider>\n );\n};\n\nexport const useLevo = () => {\n const levoStoreContext = useContext(LevoContext);\n\n if (!levoStoreContext) {\n throw new Error(\"useLevo must be used within LevoProvider\");\n }\n\n return levoStoreContext as ILevoContext;\n};\n"],"names":["LevoPlugin","client","__publicField","LogBatch","options","logs","url","sendFallback","wretch","e","log","task","tasks","isBrowser","getMethodName","level","LevoLogger","batchOptions","context","args","messages","content","message","method","formattedMessages","arg","payload","isMessageEmpty","LevoMedia","formData","data","LevoContext","createContext","LevoProvider","children","props","logger","useState","media","jsx","useLevo","levoStoreContext","useContext"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@levo-so/react",
3
- "version": "0.1.34",
3
+ "version": "0.1.35",
4
4
  "author": "Levo Engineering <devs@theinternetfolks.com>",
5
5
  "description": "Levo suite for React based applications",
6
6
  "type": "module",
@@ -16,7 +16,7 @@
16
16
  "peerDependencies": {
17
17
  "react": ">=18",
18
18
  "react-dom": ">=18",
19
- "@levo-so/core": "0.1.34"
19
+ "@levo-so/core": "0.1.35"
20
20
  },
21
21
  "dependencies": {
22
22
  "@radix-ui/react-checkbox": "1.1.1",
@@ -91,8 +91,8 @@
91
91
  "vite": "5.4.3",
92
92
  "vite-plugin-dts": "4.1.0",
93
93
  "@levo/eslint-config": "0.0.0",
94
- "@levo/tw-config": "0.0.0",
95
- "@levo/ts-config": "0.0.0"
94
+ "@levo/ts-config": "0.0.0",
95
+ "@levo/tw-config": "0.0.0"
96
96
  },
97
97
  "main": "./dist/index.js",
98
98
  "module": "./dist/index.js",