@brightspot/ui 1.3.0 → 1.4.0

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 (109) hide show
  1. package/dist/global.d.ts +10 -0
  2. package/dist/storybook/assets/{Avatar.stories-CpXI9mXR.js → Avatar.stories-DrhezTR1.js} +1 -1
  3. package/dist/storybook/assets/{AvatarGroup.stories-D4NymG47.js → AvatarGroup.stories-DrlxT-mF.js} +1 -1
  4. package/dist/storybook/assets/{Badge.stories-BP4Yixze.js → Badge.stories-DtJcBfOR.js} +1 -1
  5. package/dist/storybook/assets/{Button.stories-DDpQzCOq.js → Button.stories-BKUfLgSY.js} +1 -1
  6. package/dist/storybook/assets/{CircularProgress.stories-B82LXwfS.js → CircularProgress.stories-dpmD-XJT.js} +1 -1
  7. package/dist/storybook/assets/{ClipboardMixin.stories-Cr3efF-v.js → ClipboardMixin.stories-C0pnQ7BY.js} +1 -1
  8. package/dist/storybook/assets/{Color-64QXVMR3-BucypS4O.js → Color-64QXVMR3-Dnd9S2a1.js} +1 -1
  9. package/dist/storybook/assets/{Colors.stories-CeKs5FaB.js → Colors.stories-bKK25qgF.js} +1 -1
  10. package/dist/storybook/assets/{ComponentStatesMixin-BkLj42wt.js → ComponentStatesMixin-C2HZ9ZFb.js} +1 -1
  11. package/dist/storybook/assets/{ComponentStatesMixin.stories--YPoyrpQ.js → ComponentStatesMixin.stories-9mRp2zuB.js} +1 -1
  12. package/dist/storybook/assets/{CopyToClipboard.stories-6vqDwd-F.js → CopyToClipboard.stories-BW3oaT1i.js} +1 -1
  13. package/dist/storybook/assets/Debounce.stories-BXx3CKvQ.js +199 -0
  14. package/dist/storybook/assets/{Events.stories-DD9wfoHi.js → Events.stories-PBeiuWQn.js} +1 -1
  15. package/dist/storybook/assets/{Heading.stories-D-Pvm7NG.js → Heading.stories-Djkl0MoC.js} +1 -1
  16. package/dist/storybook/assets/{Icon.stories-BbR3S56H.js → Icon.stories-Cam1fyud.js} +1 -1
  17. package/dist/storybook/assets/{LinearProgress.stories-B9XHLvVn.js → LinearProgress.stories-BDNoYIJu.js} +1 -1
  18. package/dist/storybook/assets/Rtc.stories-BrTAIAi1.js +281 -0
  19. package/dist/storybook/assets/{ScrollShadow.stories-CHFpB4Zf.js → ScrollShadow.stories-DHcKhkag.js} +1 -1
  20. package/dist/storybook/assets/{Throttle.stories-BGNJSyDp.js → Throttle.stories-cSYT_BXu.js} +1 -1
  21. package/dist/storybook/assets/{WithTooltip-SK46ZJ2J-QQZnlVfm.js → WithTooltip-SK46ZJ2J-Df0E-KJO.js} +5 -5
  22. package/dist/storybook/assets/{formatter-OMEEQ6HG-D3LRXsK-.js → formatter-OMEEQ6HG-DFa_WTfb.js} +1 -1
  23. package/dist/storybook/assets/{iframe-CpEKhsmw.css → iframe-BMxUFmpF.css} +1 -1
  24. package/dist/storybook/assets/{iframe-D-tG1MVV.js → iframe-lTczLWsL.js} +73 -73
  25. package/dist/storybook/assets/{index-mcT8sPvs.js → index-yMswRDPh.js} +1 -1
  26. package/dist/storybook/assets/onFind-C6olvKHR.js +1 -0
  27. package/dist/storybook/assets/{onFind.stories-Dagoyfc5.js → onFind.stories-DfW54CDE.js} +10 -10
  28. package/dist/storybook/assets/onRemove.stories-C7W9KyRr.js +234 -0
  29. package/dist/storybook/assets/onVisible.stories-CIl6R0q4.js +187 -0
  30. package/dist/storybook/assets/{syntaxhighlighter-CAVLW7PM-BoS99i_u.js → syntaxhighlighter-CAVLW7PM-DoI0ixeu.js} +1 -1
  31. package/dist/storybook/iframe.html +2 -2
  32. package/dist/storybook/index.json +1 -1
  33. package/dist/storybook/project.json +1 -1
  34. package/dist/tailwind-plugin-button.js +3 -0
  35. package/dist/tailwind-plugin-button.js.map +1 -1
  36. package/dist/tailwind-plugin-button.ts +4 -0
  37. package/dist/util/Socket.d.ts +29 -0
  38. package/dist/util/Socket.d.ts.map +1 -0
  39. package/dist/util/Socket.js +153 -0
  40. package/dist/util/Socket.js.map +1 -0
  41. package/dist/util/Tether.d.ts +18 -0
  42. package/dist/util/Tether.d.ts.map +1 -0
  43. package/dist/util/Tether.js +102 -0
  44. package/dist/util/Tether.js.map +1 -0
  45. package/dist/util/TetherLayout.d.ts +12 -0
  46. package/dist/util/TetherLayout.d.ts.map +1 -0
  47. package/dist/util/TetherLayout.js +121 -0
  48. package/dist/util/TetherLayout.js.map +1 -0
  49. package/dist/util/debounce.d.ts +3 -0
  50. package/dist/util/debounce.d.ts.map +1 -0
  51. package/dist/util/debounce.js +15 -0
  52. package/dist/util/debounce.js.map +1 -0
  53. package/dist/util/focusable.d.ts +9 -0
  54. package/dist/util/focusable.d.ts.map +1 -0
  55. package/dist/util/focusable.js +19 -0
  56. package/dist/util/focusable.js.map +1 -0
  57. package/dist/util/getComponentKey.d.ts +2 -0
  58. package/dist/util/getComponentKey.d.ts.map +1 -0
  59. package/dist/util/getComponentKey.js +21 -0
  60. package/dist/util/getComponentKey.js.map +1 -0
  61. package/dist/util/keyboard.d.ts +8 -0
  62. package/dist/util/keyboard.d.ts.map +1 -0
  63. package/dist/util/keyboard.js +138 -0
  64. package/dist/util/keyboard.js.map +1 -0
  65. package/dist/util/noise.d.ts +6 -0
  66. package/dist/util/noise.d.ts.map +1 -0
  67. package/dist/util/noise.js +43 -0
  68. package/dist/util/noise.js.map +1 -0
  69. package/dist/util/onFindOnce.d.ts +3 -0
  70. package/dist/util/onFindOnce.d.ts.map +1 -0
  71. package/dist/util/onFindOnce.js +25 -0
  72. package/dist/util/onFindOnce.js.map +1 -0
  73. package/dist/util/onRTEReady.d.ts +22 -0
  74. package/dist/util/onRTEReady.d.ts.map +1 -0
  75. package/dist/util/onRTEReady.js +69 -0
  76. package/dist/util/onRTEReady.js.map +1 -0
  77. package/dist/util/onRemove.d.ts +7 -0
  78. package/dist/util/onRemove.d.ts.map +1 -0
  79. package/dist/util/onRemove.js +24 -0
  80. package/dist/util/onRemove.js.map +1 -0
  81. package/dist/util/onVisible.d.ts +3 -0
  82. package/dist/util/onVisible.d.ts.map +1 -0
  83. package/dist/util/onVisible.js +22 -0
  84. package/dist/util/onVisible.js.map +1 -0
  85. package/dist/util/previousUntil.d.ts +2 -0
  86. package/dist/util/previousUntil.d.ts.map +1 -0
  87. package/dist/util/previousUntil.js +21 -0
  88. package/dist/util/previousUntil.js.map +1 -0
  89. package/dist/util/repaint.d.ts +3 -0
  90. package/dist/util/repaint.d.ts.map +1 -0
  91. package/dist/util/repaint.js +14 -0
  92. package/dist/util/repaint.js.map +1 -0
  93. package/dist/util/rtc.d.ts +10 -0
  94. package/dist/util/rtc.d.ts.map +1 -0
  95. package/dist/util/rtc.js +184 -0
  96. package/dist/util/rtc.js.map +1 -0
  97. package/dist/util/storage.d.ts +6 -0
  98. package/dist/util/storage.d.ts.map +1 -0
  99. package/dist/util/storage.js +18 -0
  100. package/dist/util/storage.js.map +1 -0
  101. package/dist/util/transition.d.ts +2 -0
  102. package/dist/util/transition.d.ts.map +1 -0
  103. package/dist/util/transition.js +4 -0
  104. package/dist/util/transition.js.map +1 -0
  105. package/dist/util/types.d.ts +10 -0
  106. package/dist/util/types.d.ts.map +1 -0
  107. package/dist/util/types.js +2 -0
  108. package/dist/util/types.js.map +1 -0
  109. package/package.json +6 -2
@@ -1 +1 @@
1
- import{R as o}from"./WithTooltip-SK46ZJ2J-QQZnlVfm.js";import"./preload-helper-PPVm8Dsz.js";import"./iframe-D-tG1MVV.js";import"./_commonjsHelpers-CqkleIqs.js";const e={},c=o.createContext(e);function m(t){const n=o.useContext(c);return o.useMemo(function(){return typeof t=="function"?t(n):{...n,...t}},[n,t])}function s(t){let n;return t.disableParentContext?n=typeof t.components=="function"?t.components(e):t.components||e:n=m(t.components),o.createElement(c.Provider,{value:n},t.children)}export{s as MDXProvider,m as useMDXComponents};
1
+ import{R as o}from"./WithTooltip-SK46ZJ2J-Df0E-KJO.js";import"./preload-helper-PPVm8Dsz.js";import"./iframe-lTczLWsL.js";import"./_commonjsHelpers-CqkleIqs.js";const e={},c=o.createContext(e);function m(t){const n=o.useContext(c);return o.useMemo(function(){return typeof t=="function"?t(n):{...n,...t}},[n,t])}function s(t){let n;return t.disableParentContext?n=typeof t.components=="function"?t.components(e):t.components||e:n=m(t.components),o.createElement(c.Provider,{value:n},t.children)}export{s as MDXProvider,m as useMDXComponents};
@@ -0,0 +1 @@
1
+ import{g as J}from"./_commonjsHelpers-CqkleIqs.js";var b={exports:{}},K=b.exports,P;function X(){return P||(P=1,(function(r){(function(n,e){r.exports?r.exports=e():n.log=e()})(K,function(){var n=function(){},e="undefined",o=typeof window!==e&&typeof window.navigator!==e&&/Trident\/|MSIE /.test(window.navigator.userAgent),a=["trace","debug","info","warn","error"],s={},f=null;function I(l,c){var t=l[c];if(typeof t.bind=="function")return t.bind(l);try{return Function.prototype.bind.call(t,l)}catch{return function(){return Function.prototype.apply.apply(t,[l,arguments])}}}function q(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function _(l){return l==="debug"&&(l="log"),typeof console===e?!1:l==="trace"&&o?q:console[l]!==void 0?I(console,l):console.log!==void 0?I(console,"log"):n}function v(){for(var l=this.getLevel(),c=0;c<a.length;c++){var t=a[c];this[t]=c<l?n:this.methodFactory(t,l,this.name)}if(this.log=this.debug,typeof console===e&&l<this.levels.SILENT)return"No console available for logging"}function W(l){return function(){typeof console!==e&&(v.call(this),this[l].apply(this,arguments))}}function $(l,c,t){return _(l)||W.apply(this,arguments)}function F(l,c){var t=this,w,E,d,g="loglevel";typeof l=="string"?g+=":"+l:typeof l=="symbol"&&(g=void 0);function z(i){var u=(a[i]||"silent").toUpperCase();if(!(typeof window===e||!g)){try{window.localStorage[g]=u;return}catch{}try{window.document.cookie=encodeURIComponent(g)+"="+u+";"}catch{}}}function M(){var i;if(!(typeof window===e||!g)){try{i=window.localStorage[g]}catch{}if(typeof i===e)try{var u=window.document.cookie,m=encodeURIComponent(g),S=u.indexOf(m+"=");S!==-1&&(i=/^([^;]+)/.exec(u.slice(S+m.length+1))[1])}catch{}return t.levels[i]===void 0&&(i=void 0),i}}function G(){if(!(typeof window===e||!g)){try{window.localStorage.removeItem(g)}catch{}try{window.document.cookie=encodeURIComponent(g)+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC"}catch{}}}function h(i){var u=i;if(typeof u=="string"&&t.levels[u.toUpperCase()]!==void 0&&(u=t.levels[u.toUpperCase()]),typeof u=="number"&&u>=0&&u<=t.levels.SILENT)return u;throw new TypeError("log.setLevel() called with invalid level: "+i)}t.name=l,t.levels={TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4,SILENT:5},t.methodFactory=c||$,t.getLevel=function(){return d??E??w},t.setLevel=function(i,u){return d=h(i),u!==!1&&z(d),v.call(t)},t.setDefaultLevel=function(i){E=h(i),M()||t.setLevel(i,!1)},t.resetLevel=function(){d=null,G(),v.call(t)},t.enableAll=function(i){t.setLevel(t.levels.TRACE,i)},t.disableAll=function(i){t.setLevel(t.levels.SILENT,i)},t.rebuild=function(){if(f!==t&&(w=h(f.getLevel())),v.call(t),f===t)for(var i in s)s[i].rebuild()},w=h(f?f.getLevel():"WARN");var R=M();R!=null&&(d=h(R)),v.call(t)}f=new F,f.getLogger=function(c){if(typeof c!="symbol"&&typeof c!="string"||c==="")throw new TypeError("You must supply a name when creating a logger.");var t=s[c];return t||(t=s[c]=new F(c,f.methodFactory)),t};var B=typeof window!==e?window.log:void 0;return f.noConflict=function(){return typeof window!==e&&window.log===f&&(window.log=B),f},f.getLoggers=function(){return s},f.default=f,f})})(b)),b.exports}var Y=X();const H=J(Y);let Q=0;class Z{#r;#e;#t;#l;#o;constructor(n,e,o){this.#r=n,this.#e=`data-ofc${Q++}`,Array.isArray(e)||(e=[e]),this.#t=e.map(e.some(s=>s.indexOf(",")>-1)?s=>s:s=>`${s}:not([${this.#e}])`).join(","),this.#l=o;const a=e.map(s=>s.trim()).filter(s=>s.indexOf(" ")<0&&s.indexOf(",")<0);a.length===e.length&&(this.#o=a)}addTriggerElements(n,e){if(this.#r.contains(e)){e.matches(this.#t)&&n.push(e);for(const o of e.querySelectorAll(this.#t))n.push(o)}}trigger(n){if(document.readyState!=="loading")if(this.#o&&Array.isArray(n))for(const e of n)this.#o.some(o=>e.matches(o))&&this.#n(e);else for(const e of this.#r.querySelectorAll(this.#t))this.#n(e)}#n(n){if(!D(n)&&!n.hasAttribute(this.#e)){n.setAttribute(this.#e,"");try{this.#l(n)}catch(e){H.error("Failed callback!",n,e)}}}}let x=!1,C=!1,p=!1,y=[],A;const T=[];function D(r){return r instanceof Element?r.closest(".CIG-wordCount")!==null||r.closest(".ContentEdit-previewDisplay")!==null||r.closest(".ContentLabel")!==null||r.closest(".PreviewFrame-typeDisplay")!==null||r.closest(".ProseMirrorToolbar")!==null||r.closest(".ProseMirror")!==null||r.closest(".ProseMirrorContainer")!==null||r.closest(".ProseMirror-fullscreen-container")!==null||r.closest(".ProseMirror-comments")!==null||r.closest(".RichTextEditor")!==null||r.closest(".WorkInProgressSaveStatus")!==null||r.closest("#aria-live-container")!==null||r.closest(".widget-urlsAutomatic")!==null:!1}const N=Array.prototype.every,O=r=>r.nodeType===Node.TEXT_NODE;function L(r){if(x){C=!0;return}const n=Array.isArray(r),e=[];if(n){for(const o of r){const a=o.target;if(!D(a))switch(o.type){case"attributes":o.oldValue!==a.getAttribute(o.attributeName)&&e.push(o);break;case"childList":(!N.call(o.addedNodes,O)||!N.call(o.removedNodes,O))&&e.push(o);break}}if(e.length===0)return}if(e.length>500&&(p=!0),!p)if(n)for(const o of e){const a=o.target;switch(o.type){case"attributes":y.push(a);break;case"childList":for(const s of T)s.addTriggerElements(y,a);break}}else p=!0;(p||y.length>0)&&!A&&(A=window.requestAnimationFrame(()=>{const o=p?void 0:y;p=!1,y=[],A=0,T.forEach(a=>a.trigger(o))}))}function U(){document.documentElement.hidden=!1,L(),new MutationObserver(L).observe(document,{attributes:!0,attributeFilter:["class","data-bsp-autosubmit","data-chart-type","data-code-type","data-internal-name","data-tab","name","rel","target"],attributeOldValue:!0,childList:!0,subtree:!0})}document.documentElement.hidden=!0;document.readyState==="loading"?document.addEventListener("DOMContentLoaded",U):U();function k(r,n,e){let o,a;typeof e<"u"?(o=r,a=n):(o=document,a=r,e=n);const s=new Z(o,a,e);s.trigger(),T.push(s)}k.triggerCallbacks=L;k.pause=()=>{x=!0};k.resume=()=>{x=!1,C&&(C=!1,setTimeout(L,100))};export{k as o};
@@ -1,4 +1,4 @@
1
- import{x as q}from"./iframe-D-tG1MVV.js";import{g as K}from"./_commonjsHelpers-CqkleIqs.js";import"./preload-helper-PPVm8Dsz.js";var E={exports:{}},X=E.exports,U;function Y(){return U||(U=1,(function(i){(function(n,e){i.exports?i.exports=e():n.log=e()})(X,function(){var n=function(){},e="undefined",o=typeof window!==e&&typeof window.navigator!==e&&/Trident\/|MSIE /.test(window.navigator.userAgent),a=["trace","debug","info","warn","error"],r={},c=null;function k(s,d){var t=s[d];if(typeof t.bind=="function")return t.bind(s);try{return Function.prototype.bind.call(t,s)}catch{return function(){return Function.prototype.apply.apply(t,[s,arguments])}}}function g(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function f(s){return s==="debug"&&(s="log"),typeof console===e?!1:s==="trace"&&o?g:console[s]!==void 0?k(console,s):console.log!==void 0?k(console,"log"):n}function v(){for(var s=this.getLevel(),d=0;d<a.length;d++){var t=a[d];this[t]=d<s?n:this.methodFactory(t,s,this.name)}if(this.log=this.debug,typeof console===e&&s<this.levels.SILENT)return"No console available for logging"}function z(s){return function(){typeof console!==e&&(v.call(this),this[s].apply(this,arguments))}}function _(s,d,t){return f(s)||z.apply(this,arguments)}function O(s,d){var t=this,x,S,p,m="loglevel";typeof s=="string"?m+=":"+s:typeof s=="symbol"&&(m=void 0);function G(l){var u=(a[l]||"silent").toUpperCase();if(!(typeof window===e||!m)){try{window.localStorage[m]=u;return}catch{}try{window.document.cookie=encodeURIComponent(m)+"="+u+";"}catch{}}}function P(){var l;if(!(typeof window===e||!m)){try{l=window.localStorage[m]}catch{}if(typeof l===e)try{var u=window.document.cookie,w=encodeURIComponent(m),D=u.indexOf(w+"=");D!==-1&&(l=/^([^;]+)/.exec(u.slice(D+w.length+1))[1])}catch{}return t.levels[l]===void 0&&(l=void 0),l}}function V(){if(!(typeof window===e||!m)){try{window.localStorage.removeItem(m)}catch{}try{window.document.cookie=encodeURIComponent(m)+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC"}catch{}}}function y(l){var u=l;if(typeof u=="string"&&t.levels[u.toUpperCase()]!==void 0&&(u=t.levels[u.toUpperCase()]),typeof u=="number"&&u>=0&&u<=t.levels.SILENT)return u;throw new TypeError("log.setLevel() called with invalid level: "+l)}t.name=s,t.levels={TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4,SILENT:5},t.methodFactory=d||_,t.getLevel=function(){return p??S??x},t.setLevel=function(l,u){return p=y(l),u!==!1&&G(p),v.call(t)},t.setDefaultLevel=function(l){S=y(l),P()||t.setLevel(l,!1)},t.resetLevel=function(){p=null,V(),v.call(t)},t.enableAll=function(l){t.setLevel(t.levels.TRACE,l)},t.disableAll=function(l){t.setLevel(t.levels.SILENT,l)},t.rebuild=function(){if(c!==t&&(x=y(c.getLevel())),v.call(t),c===t)for(var l in r)r[l].rebuild()},x=y(c?c.getLevel():"WARN");var R=P();R!=null&&(p=y(R)),v.call(t)}c=new O,c.getLogger=function(d){if(typeof d!="symbol"&&typeof d!="string"||d==="")throw new TypeError("You must supply a name when creating a logger.");var t=r[d];return t||(t=r[d]=new O(d,c.methodFactory)),t};var j=typeof window!==e?window.log:void 0;return c.noConflict=function(){return typeof window!==e&&window.log===c&&(window.log=j),c},c.getLoggers=function(){return r},c.default=c,c})})(E)),E.exports}var Q=Y();const Z=K(Q);let ee=0;class te{#n;#e;#t;#i;#o;constructor(n,e,o){this.#n=n,this.#e=`data-ofc${ee++}`,Array.isArray(e)||(e=[e]),this.#t=e.map(e.some(r=>r.indexOf(",")>-1)?r=>r:r=>`${r}:not([${this.#e}])`).join(","),this.#i=o;const a=e.map(r=>r.trim()).filter(r=>r.indexOf(" ")<0&&r.indexOf(",")<0);a.length===e.length&&(this.#o=a)}addTriggerElements(n,e){if(this.#n.contains(e)){e.matches(this.#t)&&n.push(e);for(const o of e.querySelectorAll(this.#t))n.push(o)}}trigger(n){if(document.readyState!=="loading")if(this.#o&&Array.isArray(n))for(const e of n)this.#o.some(o=>e.matches(o))&&this.#r(e);else for(const e of this.#n.querySelectorAll(this.#t))this.#r(e)}#r(n){if(!H(n)&&!n.hasAttribute(this.#e)){n.setAttribute(this.#e,"");try{this.#i(n)}catch(e){Z.error("Failed callback!",n,e)}}}}let $=!1,A=!1,h=!1,b=[],M;const T=[];function H(i){return i instanceof Element?i.closest(".CIG-wordCount")!==null||i.closest(".ContentEdit-previewDisplay")!==null||i.closest(".ContentLabel")!==null||i.closest(".PreviewFrame-typeDisplay")!==null||i.closest(".ProseMirrorToolbar")!==null||i.closest(".ProseMirror")!==null||i.closest(".ProseMirrorContainer")!==null||i.closest(".ProseMirror-fullscreen-container")!==null||i.closest(".ProseMirror-comments")!==null||i.closest(".RichTextEditor")!==null||i.closest(".WorkInProgressSaveStatus")!==null||i.closest("#aria-live-container")!==null||i.closest(".widget-urlsAutomatic")!==null:!1}const N=Array.prototype.every,B=i=>i.nodeType===Node.TEXT_NODE;function L(i){if($){A=!0;return}const n=Array.isArray(i),e=[];if(n){for(const o of i){const a=o.target;if(!H(a))switch(o.type){case"attributes":o.oldValue!==a.getAttribute(o.attributeName)&&e.push(o);break;case"childList":(!N.call(o.addedNodes,B)||!N.call(o.removedNodes,B))&&e.push(o);break}}if(e.length===0)return}if(e.length>500&&(h=!0),!h)if(n)for(const o of e){const a=o.target;switch(o.type){case"attributes":b.push(a);break;case"childList":for(const r of T)r.addTriggerElements(b,a);break}}else h=!0;(h||b.length>0)&&!M&&(M=window.requestAnimationFrame(()=>{const o=h?void 0:b;h=!1,b=[],M=0,T.forEach(a=>a.trigger(o))}))}function W(){document.documentElement.hidden=!1,L(),new MutationObserver(L).observe(document,{attributes:!0,attributeFilter:["class","data-bsp-autosubmit","data-chart-type","data-code-type","data-internal-name","data-tab","name","rel","target"],attributeOldValue:!0,childList:!0,subtree:!0})}document.documentElement.hidden=!0;document.readyState==="loading"?document.addEventListener("DOMContentLoaded",W):W();function F(i,n,e){let o,a;typeof e<"u"?(o=i,a=n):(o=document,a=i,e=n);const r=new te(o,a,e);r.trigger(),T.push(r)}F.triggerCallbacks=L;F.pause=()=>{$=!0};F.resume=()=>{$=!1,A&&(A=!1,setTimeout(L,100))};const re={title:"Utilities/onFind",tags:["autodocs"],parameters:{docs:{subtitle:"The `onFind` utility observes DOM mutations and executes callbacks when elements matching specified selectors appear. Uses MutationObserver internally to efficiently track element additions and attribute changes."},controls:{expanded:!0}},argTypes:{selector:{control:{type:"text"},description:"CSS selector to watch for"}},args:{selector:".dynamic-item"}},I={render:i=>{const n=`onfind-${Math.random().toString(36).substring(2,9)}`,e=`.dynamic-item-${n}`;let o=0,a=0;const r=()=>{const g=document.getElementById(`${n}-items-count`),f=document.getElementById(`${n}-found-count`);g&&(g.textContent=String(o)),f&&(f.textContent=String(a))};return F(e,g=>{a++,r(),g.classList.add("ring-2","ring-success-500")}),q`
1
+ import{x as r}from"./iframe-lTczLWsL.js";import{o as l}from"./onFind-C6olvKHR.js";import"./preload-helper-PPVm8Dsz.js";import"./_commonjsHelpers-CqkleIqs.js";const v={title:"Utilities/onFind",tags:["autodocs"],parameters:{docs:{subtitle:"The `onFind` utility observes DOM mutations and executes callbacks when elements matching specified selectors appear. Uses MutationObserver internally to efficiently track element additions and attribute changes."},controls:{expanded:!0}},argTypes:{selector:{control:{type:"text"},description:"CSS selector to watch for"}},args:{selector:".dynamic-item"}},i={render:m=>{const t=`onfind-${Math.random().toString(36).substring(2,9)}`,c=`.dynamic-item-${t}`;let o=0,a=0;const d=()=>{const e=document.getElementById(`${t}-items-count`),n=document.getElementById(`${t}-found-count`);e&&(e.textContent=String(o)),n&&(n.textContent=String(a))};return l(c,e=>{a++,d(),e.classList.add("ring-2","ring-success-500")}),r`
2
2
  <div class="space-y-4">
3
3
  <div class="text-base">
4
4
  <p class="mb-2">
@@ -8,28 +8,28 @@ import{x as q}from"./iframe-D-tG1MVV.js";import{g as K}from"./_commonjsHelpers-C
8
8
  </div>
9
9
 
10
10
  <div class="flex gap-2">
11
- <button @click=${()=>{o++;const g=document.getElementById(`${n}-container`);if(g){const f=document.createElement("div");f.className=`dynamic-item-${n} rounded border bg-white p-4`,f.textContent=`Item ${o}`,g.appendChild(f)}r()}} class="bg-primary-500 hover:bg-primary-600 rounded px-4 py-2 text-white">
11
+ <button @click=${()=>{o++;const e=document.getElementById(`${t}-container`);if(e){const n=document.createElement("div");n.className=`dynamic-item-${t} rounded border bg-white p-4`,n.textContent=`Item ${o}`,e.appendChild(n)}d()}} class="bg-primary-500 hover:bg-primary-600 rounded px-4 py-2 text-white">
12
12
  Add Item
13
13
  </button>
14
- <button @click=${()=>{o=0,a=0;const g=document.getElementById(`${n}-container`);g&&(g.innerHTML=""),r()}} class="rounded bg-gray-200 px-4 py-2 hover:bg-gray-300">Clear All</button>
14
+ <button @click=${()=>{o=0,a=0;const e=document.getElementById(`${t}-container`);e&&(e.innerHTML=""),d()}} class="rounded bg-gray-200 px-4 py-2 hover:bg-gray-300">Clear All</button>
15
15
  </div>
16
16
 
17
- <div id="${n}-container" class="min-h-32 space-y-2 rounded border-2 border-gray-300 bg-gray-50 p-4">
17
+ <div id="${t}-container" class="min-h-32 space-y-2 rounded border-2 border-gray-300 bg-gray-50 p-4">
18
18
  <div class="text-sm text-gray-500">Items will appear here...</div>
19
19
  </div>
20
20
 
21
21
  <div class="flex justify-around">
22
22
  <div>
23
23
  <div class="text-xs text-gray-500">Items created</div>
24
- <div id="${n}-items-count" class="text-2xl font-bold text-gray-900">0</div>
24
+ <div id="${t}-items-count" class="text-2xl font-bold text-gray-900">0</div>
25
25
  </div>
26
26
  <div>
27
27
  <div class="text-xs text-gray-500">Items detected by onFind</div>
28
- <div id="${n}-found-count" class="text-primary-600 text-2xl font-bold">0</div>
28
+ <div id="${t}-found-count" class="text-primary-600 text-2xl font-bold">0</div>
29
29
  </div>
30
30
  </div>
31
31
  </div>
32
- `},parameters:{docs:{description:{story:"Interactive example showing onFind detecting dynamically added elements. Elements are automatically highlighted when detected."}}}},C={render:()=>q`
32
+ `},parameters:{docs:{description:{story:"Interactive example showing onFind detecting dynamically added elements. Elements are automatically highlighted when detected."}}}},s={render:()=>r`
33
33
  <div class="space-y-4 text-sm">
34
34
  <div>
35
35
  <h3 class="mb-2 font-bold">Basic Usage</h3>
@@ -111,7 +111,7 @@ onFind.resume()</code></pre>
111
111
  </p>
112
112
  </div>
113
113
  </div>
114
- `,parameters:{docs:{description:{story:"Code examples and documentation for using the onFind utility."}}}};I.parameters={...I.parameters,docs:{...I.parameters?.docs,source:{originalSource:`{
114
+ `,parameters:{docs:{description:{story:"Code examples and documentation for using the onFind utility."}}}};i.parameters={...i.parameters,docs:{...i.parameters?.docs,source:{originalSource:`{
115
115
  render: args => {
116
116
  const instanceId = \`onfind-\${Math.random().toString(36).substring(2, 9)}\`;
117
117
  const uniqueSelector = \`.dynamic-item-\${instanceId}\`;
@@ -190,7 +190,7 @@ onFind.resume()</code></pre>
190
190
  }
191
191
  }
192
192
  }
193
- }`,...I.parameters?.docs?.source}}};C.parameters={...C.parameters,docs:{...C.parameters?.docs,source:{originalSource:`{
193
+ }`,...i.parameters?.docs?.source}}};s.parameters={...s.parameters,docs:{...s.parameters?.docs,source:{originalSource:`{
194
194
  render: () => html\`
195
195
  <div class="space-y-4 text-sm">
196
196
  <div>
@@ -281,4 +281,4 @@ onFind.resume()</code></pre>
281
281
  }
282
282
  }
283
283
  }
284
- }`,...C.parameters?.docs?.source}}};const se=["Interactive","UsageExample"];export{I as Interactive,C as UsageExample,se as __namedExportsOrder,re as default};
284
+ }`,...s.parameters?.docs?.source}}};const f=["Interactive","UsageExample"];export{i as Interactive,s as UsageExample,f as __namedExportsOrder,v as default};
@@ -0,0 +1,234 @@
1
+ import{x as p}from"./iframe-lTczLWsL.js";import"./preload-helper-PPVm8Dsz.js";let l=!1;function m(e,o){const s=new MutationObserver(r=>{for(const v of r)for(const n of v.removedNodes)n.contains(e)&&!l&&(s.disconnect(),o())});s.observe(document,{childList:!0,subtree:!0})}m.pause=()=>{l=!0};m.resume=()=>{l=!1};const b={title:"Utilities/onRemove",tags:["autodocs"],parameters:{docs:{subtitle:"The `onRemove` utility triggers a callback when a DOM element is removed from the document. Uses MutationObserver to watch for removals, with global pause/resume support."},controls:{expanded:!0}},argTypes:{selector:{control:{type:"text"},description:"CSS selector of element to watch"}},args:{selector:".watched-item"}},i={render:()=>{const e=`onremove-${Math.random().toString(36).substring(2,9)}`;let o=0,s=0;const r=()=>{const n=document.getElementById(`${e}-items-count`),t=document.getElementById(`${e}-removed-count`);n&&(n.textContent=String(o)),t&&(t.textContent=String(s))};return p`
2
+ <div class="space-y-4">
3
+ <div class="text-base">
4
+ <p class="mb-2">
5
+ Click "Add Item" to create elements, then click "Remove" on each item. The onRemove callback detects
6
+ removals and logs them.
7
+ </p>
8
+ </div>
9
+
10
+ <div class="flex gap-2">
11
+ <button @click=${()=>{o++;const n=document.getElementById(`${e}-container`);if(!n)return;const t=document.createElement("div"),u=o;t.className="flex items-center justify-between rounded border bg-white p-4",t.innerHTML=`<span>Item ${u}</span>`;const d=document.createElement("button");d.className="rounded bg-red-100 px-2 py-1 text-xs text-red-700 hover:bg-red-200",d.textContent="Remove",d.addEventListener("click",()=>t.remove()),t.appendChild(d),n.appendChild(t),m(t,()=>{s++,o--,r();const g=document.getElementById(`${e}-log`);if(g){const c=document.createElement("div");c.className="text-sm text-gray-600",c.textContent=`Item ${u} removed at ${new Date().toLocaleTimeString()}`,g.prepend(c)}}),r()}} class="bg-primary-500 hover:bg-primary-600 rounded px-4 py-2 text-white">
12
+ Add Item
13
+ </button>
14
+ </div>
15
+
16
+ <div id="${e}-container" class="min-h-32 space-y-2 rounded border-2 border-gray-300 bg-gray-50 p-4">
17
+ <div class="text-sm text-gray-500">Items will appear here...</div>
18
+ </div>
19
+
20
+ <div class="flex justify-around">
21
+ <div>
22
+ <div class="text-xs text-gray-500">Active items</div>
23
+ <div id="${e}-items-count" class="text-2xl font-bold text-gray-900">0</div>
24
+ </div>
25
+ <div>
26
+ <div class="text-xs text-gray-500">Removals detected</div>
27
+ <div id="${e}-removed-count" class="text-primary-600 text-2xl font-bold">0</div>
28
+ </div>
29
+ </div>
30
+
31
+ <div>
32
+ <h4 class="mb-1 text-xs font-bold text-gray-500">Removal Log</h4>
33
+ <div id="${e}-log" class="max-h-32 overflow-y-auto rounded border border-gray-200 bg-gray-50 p-2">
34
+ <div class="text-sm text-gray-400">No removals yet.</div>
35
+ </div>
36
+ </div>
37
+ </div>
38
+ `},parameters:{docs:{description:{story:"Interactive example showing onRemove detecting when elements are removed from the DOM. Add items, then remove them to see the callback fire."}}}},a={render:()=>p`
39
+ <div class="space-y-4 text-sm">
40
+ <div>
41
+ <h3 class="mb-2 font-bold">Basic Usage</h3>
42
+ <pre
43
+ class="overflow-x-auto rounded bg-gray-900 p-4 text-gray-100"
44
+ ><code>import onRemove from '@brightspot/ui/dist/util/onRemove.js'
45
+
46
+ // Clean up when element is removed
47
+ const widget = document.querySelector('.my-widget')
48
+ onRemove(widget, () => {
49
+ console.log('Widget was removed')
50
+ // Tear down event listeners, intervals, etc.
51
+ })</code></pre>
52
+ </div>
53
+
54
+ <div>
55
+ <h3 class="mb-2 font-bold">Pause and Resume</h3>
56
+ <pre class="overflow-x-auto rounded bg-gray-900 p-4 text-gray-100"><code>// Pause during bulk DOM operations
57
+ onRemove.pause()
58
+
59
+ // Move elements around without triggering callbacks
60
+ container.innerHTML = ''
61
+ container.append(...reorderedElements)
62
+
63
+ // Resume watching
64
+ onRemove.resume()</code></pre>
65
+ </div>
66
+
67
+ <div>
68
+ <h3 class="mb-2 font-bold">Common Use Cases</h3>
69
+ <ul class="list-inside list-disc space-y-1 text-gray-700">
70
+ <li>Cleaning up event listeners when elements are removed</li>
71
+ <li>Cancelling intervals or timeouts tied to DOM elements</li>
72
+ <li>Disconnecting observers or WebSocket connections</li>
73
+ <li>Releasing resources when components are destroyed</li>
74
+ </ul>
75
+ </div>
76
+
77
+ <div>
78
+ <h3 class="mb-2 font-bold">Parameters</h3>
79
+ <ul class="space-y-2">
80
+ <li><code class="rounded bg-gray-200 px-1">element</code> (Element): The DOM element to watch for removal</li>
81
+ <li>
82
+ <code class="rounded bg-gray-200 px-1">callback</code> (function): Called once when the element is removed
83
+ from the document
84
+ </li>
85
+ </ul>
86
+ </div>
87
+ </div>
88
+ `,parameters:{docs:{description:{story:"Code examples and documentation for using the onRemove utility."}}}};i.parameters={...i.parameters,docs:{...i.parameters?.docs,source:{originalSource:`{
89
+ render: () => {
90
+ const instanceId = \`onremove-\${Math.random().toString(36).substring(2, 9)}\`;
91
+ let itemCount = 0;
92
+ let removeCount = 0;
93
+ const updateCounts = () => {
94
+ const itemsEl = document.getElementById(\`\${instanceId}-items-count\`);
95
+ const removedEl = document.getElementById(\`\${instanceId}-removed-count\`);
96
+ if (itemsEl) itemsEl.textContent = String(itemCount);
97
+ if (removedEl) removedEl.textContent = String(removeCount);
98
+ };
99
+ const addItem = () => {
100
+ itemCount++;
101
+ const container = document.getElementById(\`\${instanceId}-container\`);
102
+ if (!container) return;
103
+ const item = document.createElement('div');
104
+ const itemNum = itemCount;
105
+ item.className = 'flex items-center justify-between rounded border bg-white p-4';
106
+ item.innerHTML = \`<span>Item \${itemNum}</span>\`;
107
+ const removeBtn = document.createElement('button');
108
+ removeBtn.className = 'rounded bg-red-100 px-2 py-1 text-xs text-red-700 hover:bg-red-200';
109
+ removeBtn.textContent = 'Remove';
110
+ removeBtn.addEventListener('click', () => item.remove());
111
+ item.appendChild(removeBtn);
112
+ container.appendChild(item);
113
+
114
+ // Watch for this element's removal
115
+ onRemove(item, () => {
116
+ removeCount++;
117
+ itemCount--;
118
+ updateCounts();
119
+ const log = document.getElementById(\`\${instanceId}-log\`);
120
+ if (log) {
121
+ const entry = document.createElement('div');
122
+ entry.className = 'text-sm text-gray-600';
123
+ entry.textContent = \`Item \${itemNum} removed at \${new Date().toLocaleTimeString()}\`;
124
+ log.prepend(entry);
125
+ }
126
+ });
127
+ updateCounts();
128
+ };
129
+ return html\`
130
+ <div class="space-y-4">
131
+ <div class="text-base">
132
+ <p class="mb-2">
133
+ Click "Add Item" to create elements, then click "Remove" on each item. The onRemove callback detects
134
+ removals and logs them.
135
+ </p>
136
+ </div>
137
+
138
+ <div class="flex gap-2">
139
+ <button @click=\${addItem} class="bg-primary-500 hover:bg-primary-600 rounded px-4 py-2 text-white">
140
+ Add Item
141
+ </button>
142
+ </div>
143
+
144
+ <div id="\${instanceId}-container" class="min-h-32 space-y-2 rounded border-2 border-gray-300 bg-gray-50 p-4">
145
+ <div class="text-sm text-gray-500">Items will appear here...</div>
146
+ </div>
147
+
148
+ <div class="flex justify-around">
149
+ <div>
150
+ <div class="text-xs text-gray-500">Active items</div>
151
+ <div id="\${instanceId}-items-count" class="text-2xl font-bold text-gray-900">0</div>
152
+ </div>
153
+ <div>
154
+ <div class="text-xs text-gray-500">Removals detected</div>
155
+ <div id="\${instanceId}-removed-count" class="text-primary-600 text-2xl font-bold">0</div>
156
+ </div>
157
+ </div>
158
+
159
+ <div>
160
+ <h4 class="mb-1 text-xs font-bold text-gray-500">Removal Log</h4>
161
+ <div id="\${instanceId}-log" class="max-h-32 overflow-y-auto rounded border border-gray-200 bg-gray-50 p-2">
162
+ <div class="text-sm text-gray-400">No removals yet.</div>
163
+ </div>
164
+ </div>
165
+ </div>
166
+ \`;
167
+ },
168
+ parameters: {
169
+ docs: {
170
+ description: {
171
+ story: \`Interactive example showing onRemove detecting when elements are removed from the DOM. Add items, then remove them to see the callback fire.\`
172
+ }
173
+ }
174
+ }
175
+ }`,...i.parameters?.docs?.source}}};a.parameters={...a.parameters,docs:{...a.parameters?.docs,source:{originalSource:`{
176
+ render: () => html\`
177
+ <div class="space-y-4 text-sm">
178
+ <div>
179
+ <h3 class="mb-2 font-bold">Basic Usage</h3>
180
+ <pre
181
+ class="overflow-x-auto rounded bg-gray-900 p-4 text-gray-100"
182
+ ><code>import onRemove from '@brightspot/ui/dist/util/onRemove.js'
183
+
184
+ // Clean up when element is removed
185
+ const widget = document.querySelector('.my-widget')
186
+ onRemove(widget, () => {
187
+ console.log('Widget was removed')
188
+ // Tear down event listeners, intervals, etc.
189
+ })</code></pre>
190
+ </div>
191
+
192
+ <div>
193
+ <h3 class="mb-2 font-bold">Pause and Resume</h3>
194
+ <pre class="overflow-x-auto rounded bg-gray-900 p-4 text-gray-100"><code>// Pause during bulk DOM operations
195
+ onRemove.pause()
196
+
197
+ // Move elements around without triggering callbacks
198
+ container.innerHTML = ''
199
+ container.append(...reorderedElements)
200
+
201
+ // Resume watching
202
+ onRemove.resume()</code></pre>
203
+ </div>
204
+
205
+ <div>
206
+ <h3 class="mb-2 font-bold">Common Use Cases</h3>
207
+ <ul class="list-inside list-disc space-y-1 text-gray-700">
208
+ <li>Cleaning up event listeners when elements are removed</li>
209
+ <li>Cancelling intervals or timeouts tied to DOM elements</li>
210
+ <li>Disconnecting observers or WebSocket connections</li>
211
+ <li>Releasing resources when components are destroyed</li>
212
+ </ul>
213
+ </div>
214
+
215
+ <div>
216
+ <h3 class="mb-2 font-bold">Parameters</h3>
217
+ <ul class="space-y-2">
218
+ <li><code class="rounded bg-gray-200 px-1">element</code> (Element): The DOM element to watch for removal</li>
219
+ <li>
220
+ <code class="rounded bg-gray-200 px-1">callback</code> (function): Called once when the element is removed
221
+ from the document
222
+ </li>
223
+ </ul>
224
+ </div>
225
+ </div>
226
+ \`,
227
+ parameters: {
228
+ docs: {
229
+ description: {
230
+ story: \`Code examples and documentation for using the onRemove utility.\`
231
+ }
232
+ }
233
+ }
234
+ }`,...a.parameters?.docs?.source}}};const y=["Interactive","UsageExample"];export{i as Interactive,a as UsageExample,y as __namedExportsOrder,b as default};
@@ -0,0 +1,187 @@
1
+ import{x as c}from"./iframe-lTczLWsL.js";import{o as m}from"./onFind-C6olvKHR.js";import"./preload-helper-PPVm8Dsz.js";import"./_commonjsHelpers-CqkleIqs.js";let b=0;function v(t,a){const i=`_ovc${b++}`,s=new IntersectionObserver(e=>{for(const n of e)if(n.isIntersecting){const r=n.target,d=r.classList;d.contains(i)||(d.add(i),s.unobserve(r),a(r))}});m(t,e=>{s.observe(e)})}const u={title:"Utilities/onVisible",tags:["autodocs"],parameters:{docs:{subtitle:"The `onVisible` utility triggers a callback once when elements matching a selector become visible in the viewport. Combines `onFind` with `IntersectionObserver` for lazy initialization of dynamically added elements."},controls:{expanded:!0}},argTypes:{selector:{control:{type:"text"},description:"CSS selector to watch for visibility"}},args:{selector:".lazy-item"}},o={render:()=>{const t=`onvisible-${Math.random().toString(36).substring(2,9)}`,a=`.lazy-item-${t}`;let i=0;const s=()=>{const e=document.getElementById(`${t}-visible-count`);e&&(e.textContent=String(i))};return v(a,e=>{i++,s(),e.classList.remove("opacity-30"),e.classList.add("ring-2","ring-success-500","opacity-100"),e.textContent+=" — visible!"}),c`
2
+ <div class="space-y-4">
3
+ <div class="text-base">
4
+ <p class="mb-2">
5
+ Scroll down inside the box below. Items start faded and are highlighted when they enter the viewport. Each
6
+ callback fires only once per element.
7
+ </p>
8
+ </div>
9
+
10
+ <div class="flex justify-around">
11
+ <div>
12
+ <div class="text-xs text-gray-500">Items detected as visible</div>
13
+ <div id="${t}-visible-count" class="text-primary-600 text-2xl font-bold">0</div>
14
+ </div>
15
+ </div>
16
+
17
+ <div class="h-64 overflow-y-scroll rounded border-2 border-gray-300 bg-gray-50 p-4">
18
+ <div class="space-y-4">
19
+ ${Array.from({length:30},(e,n)=>c`<div class="${`lazy-item-${t}`} rounded border bg-white p-4 opacity-30 transition-all">
20
+ Item ${n+1}
21
+ </div>`)}
22
+ </div>
23
+ </div>
24
+ </div>
25
+ `},parameters:{docs:{description:{story:"Interactive example showing onVisible detecting elements as they scroll into view. Elements are highlighted once when they become visible."}}}},l={render:()=>c`
26
+ <div class="space-y-4 text-sm">
27
+ <div>
28
+ <h3 class="mb-2 font-bold">Basic Usage</h3>
29
+ <pre
30
+ class="overflow-x-auto rounded bg-gray-900 p-4 text-gray-100"
31
+ ><code>import { onVisible } from '@brightspot/ui/dist/util/onVisible.js'
32
+
33
+ // Lazy-load images when they scroll into view
34
+ onVisible('.lazy-image', (element) => {
35
+ element.src = element.dataset.src
36
+ })
37
+
38
+ // Initialize heavy components only when visible
39
+ onVisible('.chart-container', (element) => {
40
+ initChart(element)
41
+ })</code></pre>
42
+ </div>
43
+
44
+ <div>
45
+ <h3 class="mb-2 font-bold">How It Works</h3>
46
+ <p class="text-gray-700">
47
+ onVisible combines two utilities: <code class="rounded bg-gray-200 px-1">onFind</code> detects when matching
48
+ elements are added to the DOM, then <code class="rounded bg-gray-200 px-1">IntersectionObserver</code> watches
49
+ for when those elements enter the viewport. The callback fires at most once per element.
50
+ </p>
51
+ </div>
52
+
53
+ <div>
54
+ <h3 class="mb-2 font-bold">Common Use Cases</h3>
55
+ <ul class="list-inside list-disc space-y-1 text-gray-700">
56
+ <li>Lazy-loading images or iframes</li>
57
+ <li>Deferring expensive component initialization</li>
58
+ <li>Triggering animations on scroll</li>
59
+ <li>Analytics tracking for element impressions</li>
60
+ </ul>
61
+ </div>
62
+
63
+ <div>
64
+ <h3 class="mb-2 font-bold">Parameters</h3>
65
+ <ul class="space-y-2">
66
+ <li>
67
+ <code class="rounded bg-gray-200 px-1">selectors</code> (string | string[]): CSS selector(s) to watch for
68
+ </li>
69
+ <li>
70
+ <code class="rounded bg-gray-200 px-1">callback</code> (function): Called once per element when it becomes
71
+ visible
72
+ </li>
73
+ </ul>
74
+ </div>
75
+ </div>
76
+ `,parameters:{docs:{description:{story:"Code examples and documentation for using the onVisible utility."}}}};o.parameters={...o.parameters,docs:{...o.parameters?.docs,source:{originalSource:`{
77
+ render: () => {
78
+ const instanceId = \`onvisible-\${Math.random().toString(36).substring(2, 9)}\`;
79
+ const uniqueSelector = \`.lazy-item-\${instanceId}\`;
80
+ let visibleCount = 0;
81
+ const updateCount = () => {
82
+ const el = document.getElementById(\`\${instanceId}-visible-count\`);
83
+ if (el) el.textContent = String(visibleCount);
84
+ };
85
+ onVisible(uniqueSelector, (element: HTMLElement) => {
86
+ visibleCount++;
87
+ updateCount();
88
+ element.classList.remove('opacity-30');
89
+ element.classList.add('ring-2', 'ring-success-500', 'opacity-100');
90
+ element.textContent += ' — visible!';
91
+ });
92
+ return html\`
93
+ <div class="space-y-4">
94
+ <div class="text-base">
95
+ <p class="mb-2">
96
+ Scroll down inside the box below. Items start faded and are highlighted when they enter the viewport. Each
97
+ callback fires only once per element.
98
+ </p>
99
+ </div>
100
+
101
+ <div class="flex justify-around">
102
+ <div>
103
+ <div class="text-xs text-gray-500">Items detected as visible</div>
104
+ <div id="\${instanceId}-visible-count" class="text-primary-600 text-2xl font-bold">0</div>
105
+ </div>
106
+ </div>
107
+
108
+ <div class="h-64 overflow-y-scroll rounded border-2 border-gray-300 bg-gray-50 p-4">
109
+ <div class="space-y-4">
110
+ \${Array.from({
111
+ length: 30
112
+ }, (_, i) => html\`<div class="\${\`lazy-item-\${instanceId}\`} rounded border bg-white p-4 opacity-30 transition-all">
113
+ Item \${i + 1}
114
+ </div>\`)}
115
+ </div>
116
+ </div>
117
+ </div>
118
+ \`;
119
+ },
120
+ parameters: {
121
+ docs: {
122
+ description: {
123
+ story: \`Interactive example showing onVisible detecting elements as they scroll into view. Elements are highlighted once when they become visible.\`
124
+ }
125
+ }
126
+ }
127
+ }`,...o.parameters?.docs?.source}}};l.parameters={...l.parameters,docs:{...l.parameters?.docs,source:{originalSource:`{
128
+ render: () => html\`
129
+ <div class="space-y-4 text-sm">
130
+ <div>
131
+ <h3 class="mb-2 font-bold">Basic Usage</h3>
132
+ <pre
133
+ class="overflow-x-auto rounded bg-gray-900 p-4 text-gray-100"
134
+ ><code>import { onVisible } from '@brightspot/ui/dist/util/onVisible.js'
135
+
136
+ // Lazy-load images when they scroll into view
137
+ onVisible('.lazy-image', (element) => {
138
+ element.src = element.dataset.src
139
+ })
140
+
141
+ // Initialize heavy components only when visible
142
+ onVisible('.chart-container', (element) => {
143
+ initChart(element)
144
+ })</code></pre>
145
+ </div>
146
+
147
+ <div>
148
+ <h3 class="mb-2 font-bold">How It Works</h3>
149
+ <p class="text-gray-700">
150
+ onVisible combines two utilities: <code class="rounded bg-gray-200 px-1">onFind</code> detects when matching
151
+ elements are added to the DOM, then <code class="rounded bg-gray-200 px-1">IntersectionObserver</code> watches
152
+ for when those elements enter the viewport. The callback fires at most once per element.
153
+ </p>
154
+ </div>
155
+
156
+ <div>
157
+ <h3 class="mb-2 font-bold">Common Use Cases</h3>
158
+ <ul class="list-inside list-disc space-y-1 text-gray-700">
159
+ <li>Lazy-loading images or iframes</li>
160
+ <li>Deferring expensive component initialization</li>
161
+ <li>Triggering animations on scroll</li>
162
+ <li>Analytics tracking for element impressions</li>
163
+ </ul>
164
+ </div>
165
+
166
+ <div>
167
+ <h3 class="mb-2 font-bold">Parameters</h3>
168
+ <ul class="space-y-2">
169
+ <li>
170
+ <code class="rounded bg-gray-200 px-1">selectors</code> (string | string[]): CSS selector(s) to watch for
171
+ </li>
172
+ <li>
173
+ <code class="rounded bg-gray-200 px-1">callback</code> (function): Called once per element when it becomes
174
+ visible
175
+ </li>
176
+ </ul>
177
+ </div>
178
+ </div>
179
+ \`,
180
+ parameters: {
181
+ docs: {
182
+ description: {
183
+ story: \`Code examples and documentation for using the onVisible utility.\`
184
+ }
185
+ }
186
+ }
187
+ }`,...l.parameters?.docs?.source}}};const f=["Interactive","UsageExample"];export{o as Interactive,l as UsageExample,f as __namedExportsOrder,u as default};