datalog-theme 0.8.0 → 0.9.1

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 (127) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +84 -0
  3. data/CITATION.cff +2 -2
  4. data/README.md +4 -2
  5. data/_data/i18n/en.yml +321 -0
  6. data/_data/i18n/es.yml +321 -0
  7. data/_data/i18n/pt.yml +321 -0
  8. data/_data/js_manifest.json +16 -0
  9. data/_includes/components/academic-dashboard.html +4 -4
  10. data/_includes/components/author-bio.html +21 -11
  11. data/_includes/components/author-list.html +32 -0
  12. data/_includes/components/breadcrumbs.html +6 -4
  13. data/_includes/components/citation-tools.html +18 -58
  14. data/_includes/components/comments-thread.html +90 -0
  15. data/_includes/components/contact-form.html +120 -0
  16. data/_includes/components/correction-report.html +82 -0
  17. data/_includes/components/enhanced-toc.html +6 -7
  18. data/_includes/components/hero.html +1 -1
  19. data/_includes/components/license-link.html +13 -0
  20. data/_includes/components/license-notice.html +28 -0
  21. data/_includes/components/moderation-inbox.html +139 -0
  22. data/_includes/components/post-hero.html +2 -2
  23. data/_includes/components/reactions.html +49 -0
  24. data/_includes/components/reading-list.html +34 -0
  25. data/_includes/components/reading-mode-toggle.html +67 -0
  26. data/_includes/components/reading-state-bookmark.html +27 -0
  27. data/_includes/components/reading-state-panel.html +62 -0
  28. data/_includes/components/reading-state-resume.html +17 -0
  29. data/_includes/components/reproducibility.html +61 -0
  30. data/_includes/components/responsive-image.html +3 -3
  31. data/_includes/components/revision-history.html +39 -0
  32. data/_includes/components/revision-notice.html +35 -0
  33. data/_includes/components/series-nav.html +64 -0
  34. data/_includes/components/subscribe-form.html +88 -0
  35. data/_includes/components/subscription-manage.html +69 -0
  36. data/_includes/components/visualization-card.html +1 -1
  37. data/_includes/components/webmentions.html +48 -0
  38. data/_includes/csp-meta.html +21 -1
  39. data/_includes/footer/nav-column.html +1 -1
  40. data/_includes/footer.html +5 -2
  41. data/_includes/head.html +64 -52
  42. data/_includes/header/navigation.html +2 -2
  43. data/_includes/header.html +1 -1
  44. data/_includes/layouts/default/article.html +6 -8
  45. data/_includes/meta/dynamic-services-config.html +14 -0
  46. data/_includes/meta/math-config.html +12 -5
  47. data/_includes/meta/person-json.html +27 -0
  48. data/_includes/meta/publisher.html +45 -0
  49. data/_includes/meta/schema.html +84 -48
  50. data/_includes/meta/scholarly.html +122 -0
  51. data/_includes/meta/scripts-loader.html +2 -0
  52. data/_includes/meta/webmention-discovery.html +14 -0
  53. data/_includes/post/related-posts.html +1 -1
  54. data/_includes/scripts.html +57 -0
  55. data/_layouts/dataset.html +5 -4
  56. data/_layouts/default.html +1 -1
  57. data/_layouts/home.html +2 -2
  58. data/_layouts/notebook.html +1 -1
  59. data/_layouts/package.html +8 -7
  60. data/_layouts/page.html +15 -0
  61. data/_layouts/portfolio.html +1 -1
  62. data/_layouts/post.html +94 -25
  63. data/_layouts/project.html +5 -5
  64. data/_layouts/research.html +27 -75
  65. data/_plugins/authors.rb +151 -0
  66. data/_plugins/citation_exports.rb +93 -0
  67. data/_plugins/config_validator.rb +223 -20
  68. data/_plugins/critical_css_check.rb +42 -0
  69. data/_plugins/i18n.rb +6 -4
  70. data/_plugins/image_optimizer.rb +240 -186
  71. data/_plugins/licenses.rb +147 -0
  72. data/_plugins/math_preprocessor.rb +55 -11
  73. data/_plugins/references.rb +260 -0
  74. data/_plugins/reproducibility.rb +167 -0
  75. data/_plugins/responsive_content.rb +40 -0
  76. data/_plugins/revisions.rb +102 -0
  77. data/_plugins/scholarly.rb +55 -0
  78. data/_plugins/series.rb +104 -0
  79. data/_plugins/statements.rb +87 -0
  80. data/_sass/_base.scss +13 -1
  81. data/_sass/_comments-thread.scss +159 -0
  82. data/_sass/_layout.scss +402 -1
  83. data/_sass/_mathematical.scss +38 -1
  84. data/_sass/_moderation.scss +222 -0
  85. data/_sass/_post-components.scss +4 -2
  86. data/_sass/_print.scss +299 -0
  87. data/_sass/_reactions.scss +89 -0
  88. data/_sass/_reading-state.scss +290 -0
  89. data/_sass/_service-forms.scss +204 -0
  90. data/_sass/_subscriptions.scss +140 -0
  91. data/_sass/_syntax-highlighting.scss +3 -3
  92. data/_sass/_theme.scss +11 -0
  93. data/_sass/_typography.scss +116 -0
  94. data/_sass/_utilities.scss +5 -0
  95. data/_sass/_variables.scss +6 -0
  96. data/_sass/_webmentions.scss +125 -0
  97. data/assets/js/dist/academic.js +1 -1
  98. data/assets/js/dist/analytics-dashboard.js +1 -1
  99. data/assets/js/dist/chunks/chunk-PATLC23F.js +1 -0
  100. data/assets/js/dist/chunks/chunk-VZ5WKQVA.js +1 -0
  101. data/assets/js/dist/chunks/chunk-WIRUK3OZ.js +1 -0
  102. data/assets/js/dist/comments.js +2 -0
  103. data/assets/js/dist/contact.js +1 -0
  104. data/assets/js/dist/core.js +1 -1
  105. data/assets/js/dist/corrections.js +1 -0
  106. data/assets/js/dist/loader.js +1 -1
  107. data/assets/js/dist/math.js +1 -1
  108. data/assets/js/dist/moderation.js +1 -0
  109. data/assets/js/dist/notebook.js +1 -1
  110. data/assets/js/dist/reactions.js +1 -0
  111. data/assets/js/dist/reading-state.js +1 -0
  112. data/assets/js/dist/search.js +1 -1
  113. data/assets/js/dist/sources.json +52 -0
  114. data/assets/js/dist/subscriptions.js +1 -0
  115. data/assets/js/dist/visualizations.js +2 -2
  116. data/assets/js/dist/webmentions.js +1 -0
  117. data/assets/js/loader.js +34 -0
  118. data/datalog-theme.gemspec +1 -2
  119. data/lib/datalog/cli.rb +9 -1
  120. data/lib/datalog/critical_css.rb +168 -0
  121. data/lib/datalog/plugins/comments.rb +33 -3
  122. data/lib/datalog/theme/installed_files.rb +113 -0
  123. data/lib/datalog/theme/repository_checkout.rb +6 -2
  124. data/lib/datalog/theme/version.rb +5 -1
  125. data/lib/datalog-theme.rb +1 -0
  126. metadata +60 -23
  127. data/assets/js/dist/chunks/chunk-225H5YXE.js +0 -1
@@ -0,0 +1 @@
1
+ import{a as C,b as q}from"./chunks/chunk-PATLC23F.js";var fe=new Set(["SCRIPT","STYLE","TEMPLATE","NOSCRIPT"]),W=3;function Q(e){let t=e.ownerDocument,n=[],a="",r=t.createTreeWalker(e,4,{acceptNode(o){return fe.has(o.parentNode&&o.parentNode.nodeName)?2:1}});for(let o=r.nextNode();o;o=r.nextNode())n.push({node:o,start:a.length,end:a.length+o.data.length}),a+=o.data;return{text:a,nodes:n}}function P(e,t){return!!(e.compareDocumentPosition(t)&4)}function F(e,t,n){if(t.nodeType===W){let o=e.nodes.find(i=>i.node===t);return o?o.start+n:0}let a=t.childNodes[n];if(!a){let o=e.nodes.find(i=>!t.contains(i.node)&&P(t,i.node));return o?o.start:e.text.length}let r=e.nodes.find(o=>o.node===a||a.contains(o.node)||P(a,o.node));return r?r.start:e.text.length}function Z(e,t){let n=t.nodeType===W?t.parentNode:t,a=null;return e.querySelectorAll("h2[id], h3[id], h4[id]").forEach(r=>{(r===n||r.contains(n)||P(r,n))&&(a=r.id)}),a}function ee(e,t){let n=Q(t),a=F(n,e.startContainer,e.startOffset),r=F(n,e.endContainer,e.endOffset);return r<=a?null:{quote:n.text.slice(a,r),prefix:n.text.slice(Math.max(0,a-32),a),suffix:n.text.slice(r,r+32),section:Z(t,e.startContainer)}}function K(e,t){let n=[],a=e.indexOf(t);for(;a!==-1;)n.push(a),a=e.indexOf(t,a+1);return n}function z(e){let t="",n=[],a=!1;for(let r=0;r<e.length;r+=1){let o=e[r];/\s/.test(o)?a||(t+=" ",n.push(r),a=!0):(t+=o,n.push(r),a=!1)}return{out:t,map:n}}function pe(e,t){let n=0;for(;n<e.length&&n<t.length&&e[e.length-1-n]===t[t.length-1-n];)n+=1;return n}function ge(e,t){let n=0;for(;n<e.length&&n<t.length&&e[n]===t[n];)n+=1;return n}function G(e,t,n){let a=e.nodes.find(i=>t>=i.start&&t<i.end)||e.nodes.find(i=>t===i.end),r=e.nodes.find(i=>n>i.start&&n<=i.end);if(!a||!r)return null;let o=a.node.ownerDocument.createRange();return o.setStart(a.node,t-a.start),o.setEnd(r.node,n-r.start),o}function D(e,t){if(!t||typeof t.quote!="string"||t.quote==="")return null;let n=Q(e),a=K(n.text,t.quote).map(o=>({start:o,end:o+t.quote.length}));if(a.length===0){let o=z(n.text),i=z(t.quote).out.trim();i&&(a=K(o.out,i).map(s=>({start:o.map[s],end:o.map[s+i.length-1]+1})))}if(a.length===0)return null;let r=a.map(o=>q(C({},o),{section:Z(e,G(n,o.start,o.end).startContainer),score:pe(n.text.slice(Math.max(0,o.start-32),o.start),t.prefix||"")+ge(n.text.slice(o.end,o.end+32),t.suffix||"")}));if(t.section){let o=r.filter(i=>i.section===t.section);if(o.length)r=o;else return null}return r.sort((o,i)=>i.score-o.score),r.length>1&&(r[0].score===0||r[0].score===r[1].score)||!t.section&&(t.prefix||t.suffix)&&r[0].score===0?null:G(n,r[0].start,r[0].end)}var he="datalog-annotation",te="reading-highlight";function me(e=window){return!!(e&&e.CSS&&"highlights"in e.CSS&&typeof e.Highlight=="function")}function ye(e){e.querySelectorAll(`mark.${te}`).forEach(t=>{let n=t.parentNode;for(;t.firstChild;)n.insertBefore(t.firstChild,t);n.removeChild(t),n.normalize()})}function Se(e,t){let n=e.startContainer.ownerDocument,a=e.commonAncestorContainer,r=[];if(a.nodeType===3)r.push(a);else{let o=n.createTreeWalker(a,4);for(let i=o.nextNode();i;i=o.nextNode())e.intersectsNode(i)&&r.push(i)}r.forEach(o=>{var l;if(!o.data.trim()||((l=o.parentElement)==null?void 0:l.namespaceURI)!=="http://www.w3.org/1999/xhtml")return;let i=n.createRange();if(i.setStart(o,o===e.startContainer?e.startOffset:0),i.setEnd(o,o===e.endContainer?e.endOffset:o.data.length),i.collapsed)return;let s=n.createElement("mark");s.className=te,s.dataset.annotationId=t,i.surroundContents(s)})}function ne(e,t,n={}){let a=e.ownerDocument.defaultView,r=n.api===void 0?me(a):n.api,o=[],i=[];ye(e);let s=[];return t.forEach(l=>{let g=D(e,l);g?(o.push(l.id),s.push([l.id,g])):i.push(l.id)}),r?a.CSS.highlights.set(he,new a.Highlight(...s.map(([,l])=>l))):s.reverse().forEach(([l,g])=>Se(g,l)),{found:o,lost:i}}var _="datalog-reading:";function ve(e=window){try{let t=e.localStorage,n=`${_}probe`;return t.setItem(n,"1"),t.removeItem(n),t}catch(t){if(t.name==="QuotaExceededError"||t.code===22)try{return e.localStorage.getItem(`${_}probe`),e.localStorage}catch(n){return null}return null}}function A(e,t=""){return{article:e,title:t,bookmarked:!1,annotations:[]}}function xe(e){return!!(e&&typeof e.id=="string"&&typeof e.quote=="string"&&e.quote.length>0)}function U(e){try{let t=JSON.parse(e);return t&&typeof t=="object"?t:null}catch(t){return null}}function B(e){if(!e||typeof e.article!="string"||e.article==="")return null;let t=A(e.article,typeof e.title=="string"?e.title:"");t.bookmarked=e.bookmarked===!0;let n=new Map;return(Array.isArray(e.annotations)?e.annotations:[]).filter(xe).forEach(a=>{let r={id:a.id,quote:a.quote};["prefix","suffix","section","note","created_at"].forEach(o=>{typeof a[o]=="string"&&(r[o]=a[o])}),n.set(r.id,r)}),t.annotations=[...n.values()],e.progress&&Number.isFinite(e.progress.ratio)&&(t.progress={ratio:Math.min(1,Math.max(0,e.progress.ratio)),anchor:typeof e.progress.anchor=="string"?e.progress.anchor:null},typeof e.progress.updated_at=="string"&&(t.progress.updated_at=e.progress.updated_at)),typeof e.saved_at=="string"&&(t.saved_at=e.saved_at),typeof e.updated_at=="string"&&(t.updated_at=e.updated_at),t}function re(e=ve()){let t=!!e,n=c=>`${_}${c}`;function a(){let c=[];for(let f=0;f<e.length;f+=1){let p=e.key(f);p&&p.startsWith(_)&&p!==`${_}probe`&&c.push(p)}return c}function r(c){if(!t)return null;try{return B(U(e.getItem(n(c))))}catch(f){return null}}function o(c,f){if(!t)return!1;try{let p=B(q(C({},f),{article:c}));return p?(p.updated_at=new Date().toISOString(),e.setItem(n(c),JSON.stringify(p)),!0):!1}catch(p){return!1}}function i(c){if(!t)return!1;try{return e.removeItem(n(c)),!0}catch(f){return!1}}function s(){if(!t)return[];try{return a().map(c=>B(U(e.getItem(c)))).filter(Boolean)}catch(c){return[]}}function l(){if(!t)return!1;try{return a().forEach(c=>e.removeItem(c)),!0}catch(c){return!1}}function g(){return JSON.stringify({format:1,exported_at:new Date().toISOString(),articles:s()},null,2)}function h(c){let f=U(c),p=Array.isArray(f)?f:f&&Array.isArray(f.articles)?f.articles:null;if(!p)throw new Error("Not a reading data export");return p.reduce((x,k)=>{var N;let m=B(k);if(!m)return x;let E=r(m.article);if(E&&(m.annotations=[...new Map([...E.annotations,...m.annotations].map(w=>[w.id,w])).values()],m.bookmarked=m.bookmarked||E.bookmarked,m.title=m.title||E.title,m.saved_at=m.saved_at||E.saved_at,(!m.progress||(Date.parse((N=E.progress)==null?void 0:N.updated_at)||0)>(Date.parse(m.progress.updated_at)||0))&&(m.progress=E.progress)),!o(m.article,m))throw new Error("Reading data could not be saved");return x+1},0)}return{available:t,read:r,write:o,remove:i,all:s,clear:l,exportJSON:g,importJSON:h}}var Ee=.4;function ke({scrollY:e,innerHeight:t,contentTop:n,contentHeight:a,headings:r}){let o=e+t*Ee,i=a>0?Math.min(1,Math.max(0,(o-n)/a)):0,s=null;return r.forEach(l=>{l.top<=o&&(s=l.id)}),{ratio:Math.round(i*1e3)/1e3,anchor:s}}function oe(e,t,n){return!!(e&&typeof e.ratio=="number"&&e.ratio>=.05&&e.ratio<=.92&&t>n*1.5)}function ae({content:e,store:t,article:n,title:a,win:r=window,interval:o=1e3,shouldSave:i=()=>!0,onError:s=()=>{}}){let l=null,g=null,h=()=>{let k=e.getBoundingClientRect(),m=Array.from(e.querySelectorAll("h2[id], h3[id], h4[id]")).map(E=>({id:E.id,top:E.getBoundingClientRect().top+r.scrollY}));return ke({scrollY:r.scrollY,innerHeight:r.innerHeight,contentTop:k.top+r.scrollY,contentHeight:k.height,headings:m})},c=()=>{let k=h();if(!i(k)||g&&Math.abs(g.ratio-k.ratio)<.01)return;let m=t.read(n)||A(n,a);m.title=m.title||a,m.progress=q(C({},k),{updated_at:new Date().toISOString()}),t.write(n,m)?g=k:s()},f=()=>{l||(l=r.setTimeout(()=>{l=null,c()},o))},p=()=>{l!==null&&(r.clearTimeout(l),l=null,c())},x=()=>{r.document.visibilityState==="hidden"&&p()};return r.addEventListener("scroll",f,{passive:!0}),r.addEventListener("pagehide",p),r.document.addEventListener("visibilitychange",x),{stop(){r.removeEventListener("scroll",f),r.removeEventListener("pagehide",p),r.document.removeEventListener("visibilitychange",x),l&&r.clearTimeout(l),l=null},save:c,snapshot:h}}var be=new Set(["INPUT","TEXTAREA","SELECT"]);function M(e,t){return Object.keys(t).reduce((n,a)=>n.split(`{{${a}}}`).join(String(t[a])),e||"")}function Ce(){let e=globalThis.crypto;return e&&typeof e.randomUUID=="function"?e.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}function qe(e){let t=e.activeElement;return!!(t&&(be.has(t.tagName)||t.isContentEditable))}function I(e){var a,r;let t=e.querySelector("[data-reading-status]"),n=((a=e.dataset)==null?void 0:a.saveFailed)||((r=e.querySelector("[data-reading-unavailable]"))==null?void 0:r.textContent)||"Reading data could not be saved.";t&&(t.textContent=n)}function ie(e,t){if(!t)return"";let n=e.ownerDocument.getElementById(t);return n&&e.contains(n)?n.textContent.trim():t}function we(e,t){let n=e.startContainer.nodeType===3?e.startContainer.parentElement:e.startContainer;n&&typeof n.scrollIntoView=="function"&&n.scrollIntoView({block:"center"});let a=t.getSelection&&t.getSelection();a&&(a.removeAllRanges(),a.addRange(e))}function se(e,t){let n=e.dataset.article,a=e.dataset.title||"",r=e.querySelector("[data-bookmark-label]")||e,o=()=>{let i=t.read(n),s=!!(i&&i.bookmarked);e.setAttribute("aria-pressed",s?"true":"false"),r.textContent=s?e.dataset.labelSaved:e.dataset.labelSave};return t.available?(e.addEventListener("click",()=>{let i=t.read(n)||A(n,a);i.title=i.title||a,i.bookmarked=!i.bookmarked,i.saved_at=i.bookmarked?new Date().toISOString():void 0,t.write(n,i)||I(e.ownerDocument),o()}),o(),{refresh:o}):(e.disabled=!0,e.title=e.dataset.unavailable||"",{refresh:o})}function le(e,t,n,a){let r=e.ownerDocument,o=r.defaultView,i=e.querySelector("[data-reading-status]"),s=f=>{i&&(i.textContent=f)},l=e.querySelector("[data-reading-export]");l&&l.addEventListener("click",()=>{let f=new o.Blob([t.exportJSON()],{type:"application/json"}),p=o.URL.createObjectURL(f),x=r.createElement("a");x.href=p,x.download="datalog-reading-data.json",r.body.appendChild(x),x.click(),x.remove(),o.URL.revokeObjectURL(p),s(l.dataset.done||"")});let g=e.querySelector("[data-reading-import]");g&&g.addEventListener("change",()=>{let f=g.files&&g.files[0];f&&(f.text().then(p=>{let x=t.importJSON(p);s(M(g.dataset.done,{count:x})),n()}).catch(()=>s(g.dataset.failed||"")),g.value="")});let h=e.querySelector("[data-reading-erase-article]");h&&a&&h.addEventListener("click",()=>{if(!t.remove(a))return I(e);s(h.dataset.done||""),n("erase")});let c=e.querySelector("[data-reading-erase-all]");c&&c.addEventListener("click",()=>{if(!(c.dataset.confirm&&!o.confirm(c.dataset.confirm))){if(!t.clear())return I(e);s(c.dataset.done||""),n("erase")}})}function Le(e,t,n={}){let a=e.ownerDocument,r=a.defaultView,o=e.dataset.article,i=e.dataset.title||"",s=n.content||a.querySelector(".post-content"),l=e.dataset.progress!=="false",g=e.dataset.highlights!=="false",h=a.querySelector("[data-reading-resume]"),c=e.querySelector("[data-reading-toolbar]"),f=e.querySelector("[data-reading-list-items]"),p=e.querySelector("[data-reading-empty]"),x=e.querySelector("[data-reading-item-template]"),k=e.querySelector("[data-reading-unavailable]"),m=n.bookmark?se(n.bookmark,t):null,E=null,N=[],w=null,b=()=>t.read(o)||A(o,i),$=d=>{d.title=d.title||i;let u=t.write(o,d);return u||I(e),u};if(!t.available)return k&&(k.hidden=!1),e.querySelectorAll("button, input").forEach(d=>{d.disabled=!0}),{available:!1,record:b,addAnnotation:()=>null,removeAnnotation:()=>!1,repaint:()=>null};let X=()=>{if(!s||!g)return{found:[],lost:[]};let d=ne(s,b().annotations);return N=d.lost,d},ce=()=>{if(!f||!x)return;let d=b().annotations;f.textContent="",p&&(p.hidden=d.length>0),d.forEach(u=>{let y=x.content.firstElementChild.cloneNode(!0);y.dataset.annotation=u.id;let S=y.querySelector("[data-annotation-quote]");S.textContent=u.quote.length>160?`${u.quote.slice(0,157)}\u2026`:u.quote;let v=y.querySelector("[data-annotation-section]");v.textContent=ie(s,u.section);let T=y.querySelector("[data-annotation-lost]");T.hidden=!N.includes(u.id);let H=y.querySelector("[data-annotation-note]");H.value=u.note||"",H.addEventListener("change",()=>{let O=b(),Y=O.annotations.find(ue=>ue.id===u.id);Y&&(Y.note=H.value,$(O))}),y.querySelector("[data-annotation-go]").addEventListener("click",()=>{let O=s&&D(s,u);O&&we(O,r)}),y.querySelector("[data-annotation-remove]").addEventListener("click",()=>{R.removeAnnotation(u.id)}),f.appendChild(y)})},L=()=>{X(),ce(),m&&m.refresh()},j=()=>{c&&(c.hidden=!0)},de=d=>{if(c&&(E=d,c.hidden=!1,typeof d.getBoundingClientRect=="function")){let u=d.getBoundingClientRect();c.style.top=`${Math.max(0,u.top+r.scrollY-c.offsetHeight-8)}px`,c.style.left=`${Math.max(0,u.left+r.scrollX)}px`}},J=()=>{let d=r.getSelection&&r.getSelection();if(!d||d.rangeCount===0||d.isCollapsed||!s)return null;let u=d.getRangeAt(0);return s.contains(u.commonAncestorContainer)?u:null},R={available:!0,record:b,repaint:X,addAnnotation(d,u=""){if(!s)return null;let y=ee(d,s);if(!y||y.quote.trim()==="")return null;let S=q(C({id:Ce()},y),{note:u,created_at:new Date().toISOString()}),v=b();return v.annotations.push(S),$(v)?(L(),S):null},removeAnnotation(d){let u=b(),y=u.annotations.length;return u.annotations=u.annotations.filter(S=>S.id!==d),u.annotations.length===y||!$(u)?!1:(L(),!0)},highlightSelection(d=!1){let u=E||J();if(!u)return null;let y=R.addAnnotation(u);if(!y)return null;E=null,j();let S=r.getSelection&&r.getSelection();if(S&&S.removeAllRanges(),y&&d&&f){let v=f.querySelector(`[data-annotation="${y.id}"] [data-annotation-note]`);v&&v.focus()}return y}};if(g&&c&&s){let d=null;a.addEventListener("selectionchange",()=>{d&&r.clearTimeout(d),d=r.setTimeout(()=>{let S=J();S?de(S.cloneRange()):c.contains(a.activeElement)||(E=null,j())},150)});let u=c.querySelector("[data-reading-highlight]"),y=c.querySelector("[data-reading-note]");u&&u.addEventListener("click",()=>R.highlightSelection(!1)),y&&y.addEventListener("click",()=>R.highlightSelection(!0)),a.addEventListener("keydown",S=>{if(!e.isConnected||S.defaultPrevented||S.isComposing||!S.altKey||!S.shiftKey||qe(a))return;let v=S.code?S.code.replace(/^Key/,"").toLowerCase():S.key.toLowerCase();(v==="h"||v==="n")&&(S.preventDefault(),R.highlightSelection(v==="n"))})}if(l&&s){let d=b().progress;if(h&&!r.location.hash&&oe(d,s.getBoundingClientRect().height,r.innerHeight)){let u=h.querySelector("[data-reading-resume-detail]");if(u){let v=ie(s,d.anchor),T=Math.round(d.ratio*100);u.textContent=`${v?`${v} \xB7 `:""}${M(h.dataset.progressLabel,{percent:T})}`}h.hidden=!1;let y=h.querySelector("[data-reading-resume-go]");y&&y.addEventListener("click",()=>{let v=d.anchor&&a.getElementById(d.anchor);if(v&&typeof v.scrollIntoView=="function")v.scrollIntoView({block:"start"});else{let T=s.getBoundingClientRect();r.scrollTo(0,T.top+r.scrollY+T.height*d.ratio-r.innerHeight*.4)}h.hidden=!0});let S=h.querySelector("[data-reading-resume-dismiss]");S&&S.addEventListener("click",()=>{h.hidden=!0})}w=ae({content:s,store:t,article:o,title:i,win:r,shouldSave:u=>!h||h.hidden?!0:u.ratio<d.ratio?!1:(h.hidden=!0,!0),onError:()=>I(e)})}return le(e,t,d=>{d==="erase"&&(w==null||w.stop(),h&&(h.hidden=!0)),L()},o),a.addEventListener("datalog:math-ready",L),a.addEventListener("datalog:viz-rendered",L),L(),R}function Re(e,t){let n=e.ownerDocument,a=e.querySelector("[data-reading-list-items]"),r=e.querySelector("[data-reading-list-empty]"),o=e.querySelector("[data-reading-unavailable]"),i=()=>{if(!a)return;let s=t.all().filter(l=>l.bookmarked||l.progress||l.annotations.length>0).sort((l,g)=>String(g.updated_at||"").localeCompare(String(l.updated_at||"")));a.textContent="",r&&(r.hidden=s.length>0),s.forEach(l=>{let g=n.createElement("li");g.className="reading-list__item";let h=n.createElement("a");h.href=l.article,h.textContent=l.title||l.article,g.appendChild(h);let c=n.createElement("span");c.className="reading-list__meta";let f=[];l.bookmarked&&f.push(e.dataset.savedLabel||""),l.progress&&f.push(M(e.dataset.progressLabel,{percent:Math.round(l.progress.ratio*100)})),l.annotations.length>0&&f.push(M(e.dataset.highlightsLabel,{count:l.annotations.length})),c.textContent=f.filter(Boolean).join(" \xB7 "),g.appendChild(c);let p=n.createElement("button");p.type="button",p.className="post-tool",p.textContent=e.dataset.removeLabel||"",p.addEventListener("click",()=>{if(!t.remove(l.article))return I(e);i()}),g.appendChild(p),a.appendChild(g)})};return t.available?(le(e,t,i),i(),{render:i}):(o&&(o.hidden=!1),e.querySelectorAll("button, input").forEach(s=>{s.disabled=!0}),{render:i})}function V(e=document,t=re()){let n=e.querySelector("[data-reading-state]"),a=e.querySelector("[data-reading-list]"),r=e.querySelector("[data-bookmark-toggle]"),o={article:null,list:null};return n?o.article=Le(n,t,{bookmark:r}):r&&se(r,t),a&&(o.list=Re(a,t)),o}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>V()):V();export{V as initReadingState};
@@ -1 +1 @@
1
- import"./chunks/chunk-225H5YXE.js";var Q="datalog-search-analytics";function j({panel:e,list:n,empty:t,onSelect:i}){if(!e||!n||!t)return{record(){},render(){}};let r=d(),f="";function d(){let u=Object.create(null);try{let c=window.localStorage.getItem(Q);if(c){let a=JSON.parse(c);a&&typeof a=="object"&&Object.entries(a).forEach(([l,S])=>{typeof S=="number"&&Number.isFinite(S)&&(u[l]=S)})}}catch(c){}return u}function m(){try{window.localStorage.setItem(Q,JSON.stringify(r))}catch(u){}}function s(u){let c=(u||"").trim();!c||c===f||(f=c,r[c]=(r[c]||0)+1,m(),p())}function p(){let u=Object.entries(r).filter(([a])=>a&&a.trim().length>1).sort((a,l)=>l[1]-a[1]).slice(0,5);if(n.replaceChildren(),u.length===0){t.hidden=!1;return}t.hidden=!0;let c=document.createDocumentFragment();u.forEach(([a,l])=>{let S=document.createElement("li"),g=document.createElement("button");g.type="button",g.className="search-analytics__query",g.textContent=`${a} (${l})`,g.addEventListener("click",()=>{typeof i=="function"&&i(a)}),S.appendChild(g),c.appendChild(S)}),n.appendChild(c)}return{record:s,render:p}}function k(e=""){let n=e==null?"":String(e);try{return n.toLowerCase().normalize("NFKD").replace(new RegExp("\\p{Diacritic}","gu"),"")}catch(t){return n.toLowerCase()}}function F(e=""){return k(e).replace(/\s+/g,"")}function P(e=""){return k(e).split(/[^\p{L}\p{N}\\._]+/u).filter(Boolean)}function H(e=""){return/\\|\^|_|\{|\}|\$/.test(e)}function B(e=""){return/`|::|->|=>|\(|\)|\{|\}|\[|\]|=|\bdef\b|\bfunction\b|\bclass\b/.test(e)}function K(e,n){if(!e||!n)return!1;let t=0;for(let i=0;i<e.length&&t<n.length;i+=1)e[i]===n[t]&&(t+=1);return t===n.length}function ae(e){return e&&new DOMParser().parseFromString(String(e),"text/html").body.textContent||""}function O(e,n,t){if(!e)return"";let i=ae(e),r=Math.max(0,n-80),f=Math.min(i.length,n+t+80);return`${i.slice(r,f)}${f<i.length?"\u2026":""}`}function ie(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var oe={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function _(e){return String(e).replace(/[&<>"']/g,n=>oe[n])}function N(e,n){if(!e)return"";let t=String(e),i=Array.from(new Set(P(n||""))).sort((s,p)=>p.length-s.length);if(!i.length)return _(t);let r=new RegExp(i.map(ie).join("|"),"giu"),f="",d=0,m;for(;(m=r.exec(t))!==null;)f+=`${_(t.slice(d,m.index))}<mark>${_(m[0])}</mark>`,d=m.index+m[0].length;return f+_(t.slice(d))}function M(e){return(e||"").toString().split(/[-_\s]+/).map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join(" ")}function X(e){switch(e){case"post":return"Tutorial & Blog";case"project":return"Project";case"research":return"Research";case"dataset":return"Dataset";default:return M(e||"Page")}}function J({panel:e,limit:n=8,onSelect:t}){if(!e)return{setSuggestions(){},update(){},close(){},handleNavigation(){}};let i=[],r=-1;function f(c){i=Array.isArray(c)?[...c]:[]}function d(c){r=-1;let a=(c||"").trim().toLowerCase();if(!a){p();return}let l=i.filter(g=>g&&g.toLowerCase().includes(a)).slice(0,n);if(l.length===0){p();return}let S=document.createDocumentFragment();l.forEach((g,C)=>{let E=document.createElement("button");E.type="button",E.className="search-autocomplete__option",E.setAttribute("role","option"),E.dataset.autocompleteOption="",E.dataset.value=g,E.setAttribute("aria-selected",C===r?"true":"false"),E.replaceChildren(),E.insertAdjacentHTML("beforeend",N(g,a)),S.appendChild(E)}),e.replaceChildren(),e.appendChild(S),e.hidden=!1}function m(c,a){if(e.hidden)return;let l=Array.from(e.querySelectorAll("[data-autocomplete-option]"));if(l.length!==0){if(c.key==="ArrowDown")c.preventDefault(),r=(r+1)%l.length,s(l);else if(c.key==="ArrowUp")c.preventDefault(),r=(r-1+l.length)%l.length,s(l);else if(c.key==="Enter"&&r>=0){c.preventDefault();let S=l[r],g=S?S.dataset.value:"";g&&a&&(a.value=g),typeof t=="function"&&t(g),u()}}}function s(c){c.forEach((a,l)=>{let S=l===r;a.setAttribute("aria-selected",S?"true":"false"),a.classList.toggle("is-active",S)})}function p(){e.replaceChildren(),e.hidden=!0,r=-1}function u(){p()}return e.addEventListener("click",c=>{let a=c.target.closest("[data-autocomplete-option]");if(!a)return;let l=a.dataset.value||"";l&&typeof t=="function"&&t(l),u()}),{setSuggestions:f,update:d,close:u,handleNavigation:m}}function W(e=[]){let n=Array.isArray(e)?[...e]:[];function t(d){n=Array.isArray(d)?[...d]:[]}function i(d,m={}){let s=(d||"").trim();if(!s)return[];let p=k(s),u=P(s),c=H(s),a=B(s),{type:l="",language:S="",difficulty:g="",tags:C=new Set}=m;return n.map(E=>ce(E,{rawQuery:s,normalizedQuery:p,queryTokens:u,mathQuery:c,codeQuery:a,typeFilter:l,languageFilter:S,difficultyFilter:g,selectedTags:C})).filter(E=>E&&E.score>0).sort((E,T)=>T.score-E.score||E.title.localeCompare(T.title))}function r(d=150){return se(n,d)}function f(){return[...n]}return{setDocuments:t,search:i,suggestions:r,getDocuments:f}}function se(e=[],n=150){let t=new Set;return e.forEach(i=>{i.title&&t.add(i.title),Array.isArray(i.languages)&&i.languages.forEach(r=>t.add(r)),Array.isArray(i.tags)&&i.tags.forEach(r=>t.add(`#${r}`)),Array.isArray(i.math)&&i.math.slice(0,3).forEach(r=>t.add(r))}),Array.from(t).slice(0,n)}function ce(e,n){let{rawQuery:t,normalizedQuery:i,queryTokens:r,mathQuery:f,codeQuery:d,typeFilter:m,languageFilter:s,difficultyFilter:p,selectedTags:u}=n;if(m&&e.type!==m)return null;let c=Array.isArray(e.languages)?e.languages:[];if(s&&!c.includes(s))return null;if(p){let y=String(e.difficulty||"").toLowerCase();if(!y||y!==p)return null}if(u&&u.size>0){let y=new Set(G(e).tags);for(let o of u)if(!y.has(o))return null}if(!t)return null;let{title:a,summary:l,content:S,tags:g,languages:C,difficulty:E}=G(e),T=Array.isArray(e.code)?e.code:[],q=Array.isArray(e.math)?e.math:[],x=0,w="",D=null,A=null;if(a.includes(i)&&(x+=40),r.forEach(y=>{y&&(a.includes(y)&&(x+=12),l.includes(y)&&(x+=8),S.includes(y)&&(x+=6),g.forEach(o=>{o.includes(y)&&(x+=4)}),C.forEach(o=>{o.includes(y)&&(x+=4)}),E.includes(y)&&(x+=2))}),T.length>0){let y=F(t);for(let o of T){let b=String(o.language||"").toLowerCase(),v=o.code||"",z=F(v);if(z.includes(y)){x+=30,D={language:b,code:v};break}if(d&&K(z,y)){x+=18,D={language:b,code:v};break}}!D&&T[0]&&(D={language:String(T[0].language||"").toLowerCase(),code:T[0].code||""})}if(q.length>0){let y=i.replace(/\\/g,"");for(let o of q)if(k(String(o)).includes(y)){x+=26,A=o;break}f&&!A&&q[0]&&(A=q[0],x+=10)}if(S.includes(i)){let y=S.indexOf(i);w=O(e.content||"",y,t.length),x+=10}else if(l.includes(i)){let y=l.indexOf(i);w=O(e.summary||"",y,t.length),x+=6}return x===0?null:{id:`${e.url}`,title:e.title,url:e.url,summary:e.summary,snippet:w,codeSnippet:D,mathSnippet:A,tags:e.tags||[],languages:e.languages||[],difficulty:e.difficulty||"",type:e.type||"page",date:e.date,readingTime:e.reading_time,score:x}}var Y=new WeakMap;function G(e){let n=Y.get(e);if(n)return n;let t=e.normalized||{},i={title:t.title||k(e.title||""),summary:t.summary||k(e.summary||""),content:t.content||k(e.content||""),tags:V(t.tags,e.tags),languages:V(t.languages,e.languages),difficulty:t.difficulty||k(e.difficulty||"")};return Y.set(e,i),i}function V(e,n){return Array.isArray(e)&&e.length>0?e:Array.isArray(n)?n.map(t=>k(t)):[]}function Z(e,n,t){if(!e)return;let i=new Set;n.forEach(d=>{(d.tags||d.topics||[]).forEach(s=>{if(!s)return;let p=String(s).trim().toLowerCase();p&&i.add(p)})});let r=Array.from(i).sort();if(r.length===0){let d=document.createElement("p");d.className="search-filter__empty",d.textContent="No tags available yet.",e.replaceChildren(d);return}let f=document.createDocumentFragment();r.forEach(d=>{let m=document.createElement("button");m.type="button",m.className="search-filter__tag",m.textContent=d,m.dataset.filterTag=d,m.setAttribute("aria-pressed",t.has(d)?"true":"false"),f.appendChild(m)}),e.replaceChildren(),e.appendChild(f)}function ee(e,n,t){let{resultsList:i,resultsMeta:r,emptyState:f,template:d}=t;if(!i||!r||!f||!d)return;if(i.replaceChildren(),!n){r.textContent="Enter a query to begin.",f.hidden=!0;return}if(e.length===0){r.textContent=`No matches for \u201C${n}\u201D.`,f.hidden=!1;return}f.hidden=!0,r.textContent=`${e.length} result${e.length===1?"":"s"} for \u201C${n}\u201D.`;let m=document.createDocumentFragment();e.forEach(s=>{let p=d.content.cloneNode(!0),u=p.querySelector("[data-result-type]"),c=p.querySelector("[data-result-difficulty]"),a=p.querySelector("[data-result-languages]"),l=p.querySelector("[data-result-link]"),S=p.querySelector("[data-result-summary]"),g=p.querySelector("[data-result-code]"),C=g?g.querySelector("code"):null,E=p.querySelector("[data-result-math]"),T=p.querySelector("[data-result-math-preview]"),q=p.querySelector("[data-result-math-code]"),x=p.querySelector("[data-result-math-copy]"),w=p.querySelector("[data-result-excerpt]"),D=p.querySelector("[data-result-tags]"),A=p.querySelector("[data-result-date]");if(u&&(u.textContent=X(s.type)),c&&(s.difficulty?(c.textContent=`Difficulty: ${M(s.difficulty)}`,c.hidden=!1):c.hidden=!0),a&&(s.languages&&s.languages.length>0?(a.textContent=`Languages: ${s.languages.map(y=>M(y)).join(", ")}`,a.hidden=!1):a.hidden=!0),l&&(l.textContent=s.title||s.url,l.setAttribute("href",s.url)),S&&(S.replaceChildren(),S.insertAdjacentHTML("beforeend",N(s.summary||"",n))),E&&q&&(s.mathSnippet?(E.hidden=!1,q.textContent=s.mathSnippet,T&&(window.DatalogMath&&typeof window.DatalogMath.renderLatex=="function"?window.DatalogMath.renderLatex(T,s.mathSnippet,{display:!1,enhance:!1}):window.MathJax&&typeof window.MathJax.typesetPromise=="function"?(T.textContent=`\\(${s.mathSnippet}\\)`,window.MathJax.typesetPromise([T]).catch(()=>{T.textContent=s.mathSnippet})):T.textContent=s.mathSnippet),x&&x.addEventListener("click",()=>le(s.mathSnippet,E))):E.hidden=!0),w&&(s.snippet?(w.replaceChildren(),w.insertAdjacentHTML("beforeend",N(s.snippet,n)),w.hidden=!1):w.hidden=!0),g&&C)if(s.codeSnippet&&s.codeSnippet.code){let y=s.codeSnippet.language||"text";g.classList.remove("language-none"),g.classList.add(`language-${y}`),C.className=`language-${y}`,C.textContent=s.codeSnippet.code,g.hidden=!1}else g.hidden=!0;if(D&&(D.replaceChildren(),(s.tags||[]).forEach(y=>{let o=document.createElement("li");o.textContent=`#${y}`,D.appendChild(o)})),A)if(s.date){let y=new Date(s.date);Number.isNaN(y.getTime())?A.hidden=!0:(A.textContent=y.toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"}),A.hidden=!1)}else A.hidden=!0;m.appendChild(p)}),i.appendChild(m)}function le(e,n){if(!e)return;let t=()=>{if(!n)return;let r=n.querySelector("[data-result-math-copy]"),f=r?r.querySelector(".visually-hidden"):null;if(r&&f){let d=r.getAttribute("data-sr-original")||f.textContent;r.getAttribute("data-sr-original")||r.setAttribute("data-sr-original",d||"Copy LaTeX"),f.textContent="Copied LaTeX",r.classList.add("is-copied"),window.setTimeout(()=>{f.textContent=r.getAttribute("data-sr-original")||"Copy LaTeX",r.classList.remove("is-copied")},2e3)}},i=()=>{let r=document.createElement("textarea");r.value=e,r.setAttribute("aria-hidden","true"),r.style.position="fixed",r.style.opacity="0",document.body.appendChild(r),r.select();try{document.execCommand("copy"),t()}catch(f){}document.body.removeChild(r)};navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(e).then(()=>t()).catch(()=>i()):i()}var ue=8;function te(){let e=document.querySelector("[data-search-app]");if(!e)return;let n=e.querySelector("[data-search-form]"),t=e.querySelector("[data-search-input]"),i=e.querySelector("[data-search-results]"),r=e.querySelector("[data-search-meta]"),f=e.querySelector("[data-search-empty]"),d=e.querySelector("[data-search-autocomplete]"),m=e.querySelector("[data-search-analytics]"),s=m?m.querySelector(".search-app__analytics-list"):null,p=m?m.querySelector(".search-app__analytics-empty"):null,u=document.getElementById("search-result-template"),c=e.querySelector("[data-filter-type]"),a=e.querySelector("[data-filter-language]"),l=e.querySelector("[data-filter-difficulty]"),S=e.querySelector("[data-filter-tags]"),g=e.getAttribute("data-search-index")||"/search.json",C=new Set,E=W(),T=j({panel:m,list:s,empty:p,onSelect:o=>{t&&(t.value=o,A())}}),q=J({panel:d,limit:ue,onSelect:o=>{o&&t&&(t.value=o,t.focus(),A())}}),x=!1,w=new URLSearchParams(window.location.search);t&&w.has("q")&&(t.value=w.get("q")||""),c&&w.has("type")&&(c.value=w.get("type")),a&&w.has("language")&&(a.value=w.get("language")),l&&w.has("difficulty")&&(l.value=w.get("difficulty")),w.has("tags")&&w.get("tags").split(",").map(o=>o.trim().toLowerCase()).filter(Boolean).forEach(o=>C.add(o)),fe(t,()=>{q.close(),A()}),de(g).then(o=>{let b=o.documents||[];E.setDocuments(b),q.setSuggestions(E.suggestions()),Z(S,b,C),x=!0,D()}).catch(o=>{r&&(r.textContent="Unable to load the search index. Please try again later.")}),n&&n.addEventListener("submit",o=>{o.preventDefault(),A()}),t&&(t.addEventListener("input",()=>{q.update(t.value)}),t.addEventListener("keydown",o=>{q.handleNavigation(o,t)}),t.addEventListener("focus",()=>{q.update(t.value)})),c&&c.addEventListener("change",A),a&&a.addEventListener("change",A),l&&l.addEventListener("change",A),e.addEventListener("click",o=>{let b=o.target;if(b.matches("[data-filter-tag]")){let v=b.getAttribute("data-filter-tag");v&&(C.has(v)?(C.delete(v),b.setAttribute("aria-pressed","false")):(C.add(v),b.setAttribute("aria-pressed","true")),A())}}),document.addEventListener("click",o=>{!d||d.hidden||e.contains(o.target)||q.close()}),document.addEventListener("keydown",o=>{let b=document.activeElement?document.activeElement.tagName:"";["INPUT","TEXTAREA"].includes(b)||(o.key==="/"&&!o.ctrlKey&&!o.metaKey&&!o.altKey||(o.key==="k"||o.key==="K")&&(o.ctrlKey||o.metaKey))&&(o.preventDefault(),t&&(t.focus(),t.select()))}),T.render();function D(){t&&t.value.trim()?A():y()}function A(){if(!t)return;if(!x){r&&(r.textContent="Loading technical index\u2026");return}let o=t.value.trim(),b={type:c?c.value:"",language:a?a.value:"",difficulty:l?l.value:"",tags:C},v=E.search(o,b);ee(v,o,{resultsList:i,resultsMeta:r,emptyState:f,template:u}),y(o),T.record(o)}function y(o){let b=new URL(window.location.href),v=b.searchParams;o?v.set("q",o):v.delete("q"),c&&c.value?v.set("type",c.value):v.delete("type"),a&&a.value?v.set("language",a.value):v.delete("language"),l&&l.value?v.set("difficulty",l.value):v.delete("difficulty"),C.size>0?v.set("tags",Array.from(C).join(",")):v.delete("tags");let z=v.toString(),R=z?`${b.pathname}?${z}`:b.pathname;window.history.replaceState({},"",R)}}function de(e){return fetch(e,{credentials:"same-origin"}).then(n=>{if(!n.ok)throw new Error(`HTTP ${n.status}`);return n.json()})}function fe(e,n){e&&e.addEventListener("keydown",t=>{t.key==="Escape"&&(e.value="",typeof n=="function"&&n())})}var pe=300,ge="search-result-",U=500;function he(e,n=pe){let t,i=(...r)=>{t&&window.clearTimeout(t),t=window.setTimeout(()=>{t=void 0,e.apply(null,r)},n)};return i.cancel=()=>{t&&(window.clearTimeout(t),t=void 0)},i}function $(e,n){if(!e)return;let t=String(n||"");e.textContent===t?e.textContent=`${t}\xA0`:e.textContent=t,t.trim()?e.removeAttribute("hidden"):e.setAttribute("hidden","")}function me(){let e=document.querySelector("[data-search-app]");if(!e)return;let n=e.querySelector("[data-search-form]"),t=e.querySelector("[data-search-input]"),i=e.querySelector("[data-search-results]"),r=e.querySelector("[data-search-empty]"),f=e.querySelector("[data-search-loading]"),d=e.querySelector("[data-search-region]"),m=e.querySelector('[data-search-live="count"]'),s=e.querySelector('[data-search-live="selection"]'),p=e.querySelector('[data-search-live="status"]');if(!t||!i)return;let u=-1,c=0,a=[],l=!1,S=0,g=null,C=he(()=>{n&&(l=!0,o(),$(p,"Loading results\u2026"),n.dispatchEvent(new Event("submit",{cancelable:!0})))});new MutationObserver(()=>{A()}).observe(i,{childList:!0}),A(),t.addEventListener("input",()=>{w(!1),C()}),t.addEventListener("keydown",T);function T(h){if(!a.length&&["ArrowDown","ArrowUp","Enter"].includes(h.key))return!1;switch(h.key){case"ArrowDown":return h.preventDefault(),q(1),!0;case"ArrowUp":return h.preventDefault(),q(-1),!0;case"Enter":return u>=0?(h.preventDefault(),v(),!0):!1;case"Escape":return h.preventDefault(),z(),!0;default:return!1}}function q(h){if(!a.length)return;let L=u===-1?h>0?0:a.length-1:(u+h+a.length)%a.length;x(L)}function x(h){if(!(h<-1||h>=a.length)&&u!==h)if(u>=0&&a[u]&&a[u].classList.remove("is-active"),u=h,u>=0){let L=a[u];if(!L)return;L.classList.add("is-active");let I=D(L);t.setAttribute("aria-activedescendant",I);let re=R(L);$(s,`Result ${u+1} of ${a.length}: ${re}`),L.scrollIntoView({block:"nearest"})}else t.removeAttribute("aria-activedescendant"),$(s,"Search results selection cleared.")}function w(h=!0){u>=0&&a[u]&&a[u].classList.remove("is-active"),u=-1,t.removeAttribute("aria-activedescendant"),h&&$(s,"Search results selection cleared.")}function D(h){if(h.id)return h.id;c+=1;let L=`${ge}${c}`;return h.id=L,L}function A(){a=Array.from(i.querySelectorAll(".search-result")),a.forEach(h=>{D(h),h.setAttribute("role","option"),h.setAttribute("tabindex","-1")}),u>=a.length&&w(!1),l&&(l=!1,$(p,"Results updated.")),b(),y()}function y(){if(!m)return;let h=t.value.trim();if(!h){$(m,"Enter a query to begin.");return}if(r&&!r.hidden&&a.length===0){$(m,`No results found for \u201C${h}\u201D.`);return}$(m,`${a.length} result${a.length===1?"":"s"} found for \u201C${h}\u201D.`)}function o(){d&&d.setAttribute("aria-busy","true"),f&&(g&&(window.clearTimeout(g),g=null),S=Date.now(),f.hidden=!1,f.removeAttribute("hidden"))}function b(){if(d&&d.setAttribute("aria-busy","false"),f){let h=()=>{f.hidden=!0,f.setAttribute("hidden",""),g=null,S=0},L=S?Date.now()-S:U;if(L<U){let I=U-L;g&&window.clearTimeout(g),g=window.setTimeout(h,I)}else h()}}function v(){let h=u>=0?a[u]:null;if(!h)return;let L=h.querySelector("[data-result-link]");L&&L.href&&window.location.assign(L.href)}function z(){C.cancel(),t.value="",w(),$(p,"Search cleared."),n&&(l=!0,o(),n.dispatchEvent(new Event("submit",{cancelable:!0})))}function R(h){let L=h.querySelector("[data-result-link]");if(L&&L.textContent)return L.textContent.trim();let I=h.querySelector(".search-result__title");return I&&I.textContent?I.textContent.trim():"Result"}}var ye=typeof process!="undefined"&&process.env&&process.env.VITEST==="true";function ne(){te(),me()}ye||(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",ne):ne());export{he as debounce,me as setupSearchEnhancements,$ as updateLiveRegion};
1
+ import"./chunks/chunk-PATLC23F.js";var Q="datalog-search-analytics";function j({panel:e,list:n,empty:t,onSelect:i}){if(!e||!n||!t)return{record(){},render(){}};let r=d(),f="";function d(){let u=Object.create(null);try{let c=window.localStorage.getItem(Q);if(c){let a=JSON.parse(c);a&&typeof a=="object"&&Object.entries(a).forEach(([l,S])=>{typeof S=="number"&&Number.isFinite(S)&&(u[l]=S)})}}catch(c){}return u}function m(){try{window.localStorage.setItem(Q,JSON.stringify(r))}catch(u){}}function s(u){let c=(u||"").trim();!c||c===f||(f=c,r[c]=(r[c]||0)+1,m(),p())}function p(){let u=Object.entries(r).filter(([a])=>a&&a.trim().length>1).sort((a,l)=>l[1]-a[1]).slice(0,5);if(n.replaceChildren(),u.length===0){t.hidden=!1;return}t.hidden=!0;let c=document.createDocumentFragment();u.forEach(([a,l])=>{let S=document.createElement("li"),g=document.createElement("button");g.type="button",g.className="search-analytics__query",g.textContent=`${a} (${l})`,g.addEventListener("click",()=>{typeof i=="function"&&i(a)}),S.appendChild(g),c.appendChild(S)}),n.appendChild(c)}return{record:s,render:p}}function k(e=""){let n=e==null?"":String(e);try{return n.toLowerCase().normalize("NFKD").replace(new RegExp("\\p{Diacritic}","gu"),"")}catch(t){return n.toLowerCase()}}function F(e=""){return k(e).replace(/\s+/g,"")}function P(e=""){return k(e).split(/[^\p{L}\p{N}\\._]+/u).filter(Boolean)}function H(e=""){return/\\|\^|_|\{|\}|\$/.test(e)}function B(e=""){return/`|::|->|=>|\(|\)|\{|\}|\[|\]|=|\bdef\b|\bfunction\b|\bclass\b/.test(e)}function K(e,n){if(!e||!n)return!1;let t=0;for(let i=0;i<e.length&&t<n.length;i+=1)e[i]===n[t]&&(t+=1);return t===n.length}function ae(e){return e&&new DOMParser().parseFromString(String(e),"text/html").body.textContent||""}function O(e,n,t){if(!e)return"";let i=ae(e),r=Math.max(0,n-80),f=Math.min(i.length,n+t+80);return`${i.slice(r,f)}${f<i.length?"\u2026":""}`}function ie(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var oe={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function _(e){return String(e).replace(/[&<>"']/g,n=>oe[n])}function N(e,n){if(!e)return"";let t=String(e),i=Array.from(new Set(P(n||""))).sort((s,p)=>p.length-s.length);if(!i.length)return _(t);let r=new RegExp(i.map(ie).join("|"),"giu"),f="",d=0,m;for(;(m=r.exec(t))!==null;)f+=`${_(t.slice(d,m.index))}<mark>${_(m[0])}</mark>`,d=m.index+m[0].length;return f+_(t.slice(d))}function M(e){return(e||"").toString().split(/[-_\s]+/).map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join(" ")}function X(e){switch(e){case"post":return"Tutorial & Blog";case"project":return"Project";case"research":return"Research";case"dataset":return"Dataset";default:return M(e||"Page")}}function J({panel:e,limit:n=8,onSelect:t}){if(!e)return{setSuggestions(){},update(){},close(){},handleNavigation(){}};let i=[],r=-1;function f(c){i=Array.isArray(c)?[...c]:[]}function d(c){r=-1;let a=(c||"").trim().toLowerCase();if(!a){p();return}let l=i.filter(g=>g&&g.toLowerCase().includes(a)).slice(0,n);if(l.length===0){p();return}let S=document.createDocumentFragment();l.forEach((g,C)=>{let E=document.createElement("button");E.type="button",E.className="search-autocomplete__option",E.setAttribute("role","option"),E.dataset.autocompleteOption="",E.dataset.value=g,E.setAttribute("aria-selected",C===r?"true":"false"),E.replaceChildren(),E.insertAdjacentHTML("beforeend",N(g,a)),S.appendChild(E)}),e.replaceChildren(),e.appendChild(S),e.hidden=!1}function m(c,a){if(e.hidden)return;let l=Array.from(e.querySelectorAll("[data-autocomplete-option]"));if(l.length!==0){if(c.key==="ArrowDown")c.preventDefault(),r=(r+1)%l.length,s(l);else if(c.key==="ArrowUp")c.preventDefault(),r=(r-1+l.length)%l.length,s(l);else if(c.key==="Enter"&&r>=0){c.preventDefault();let S=l[r],g=S?S.dataset.value:"";g&&a&&(a.value=g),typeof t=="function"&&t(g),u()}}}function s(c){c.forEach((a,l)=>{let S=l===r;a.setAttribute("aria-selected",S?"true":"false"),a.classList.toggle("is-active",S)})}function p(){e.replaceChildren(),e.hidden=!0,r=-1}function u(){p()}return e.addEventListener("click",c=>{let a=c.target.closest("[data-autocomplete-option]");if(!a)return;let l=a.dataset.value||"";l&&typeof t=="function"&&t(l),u()}),{setSuggestions:f,update:d,close:u,handleNavigation:m}}function W(e=[]){let n=Array.isArray(e)?[...e]:[];function t(d){n=Array.isArray(d)?[...d]:[]}function i(d,m={}){let s=(d||"").trim();if(!s)return[];let p=k(s),u=P(s),c=H(s),a=B(s),{type:l="",language:S="",difficulty:g="",tags:C=new Set}=m;return n.map(E=>ce(E,{rawQuery:s,normalizedQuery:p,queryTokens:u,mathQuery:c,codeQuery:a,typeFilter:l,languageFilter:S,difficultyFilter:g,selectedTags:C})).filter(E=>E&&E.score>0).sort((E,T)=>T.score-E.score||E.title.localeCompare(T.title))}function r(d=150){return se(n,d)}function f(){return[...n]}return{setDocuments:t,search:i,suggestions:r,getDocuments:f}}function se(e=[],n=150){let t=new Set;return e.forEach(i=>{i.title&&t.add(i.title),Array.isArray(i.languages)&&i.languages.forEach(r=>t.add(r)),Array.isArray(i.tags)&&i.tags.forEach(r=>t.add(`#${r}`)),Array.isArray(i.math)&&i.math.slice(0,3).forEach(r=>t.add(r))}),Array.from(t).slice(0,n)}function ce(e,n){let{rawQuery:t,normalizedQuery:i,queryTokens:r,mathQuery:f,codeQuery:d,typeFilter:m,languageFilter:s,difficultyFilter:p,selectedTags:u}=n;if(m&&e.type!==m)return null;let c=Array.isArray(e.languages)?e.languages:[];if(s&&!c.includes(s))return null;if(p){let y=String(e.difficulty||"").toLowerCase();if(!y||y!==p)return null}if(u&&u.size>0){let y=new Set(G(e).tags);for(let o of u)if(!y.has(o))return null}if(!t)return null;let{title:a,summary:l,content:S,tags:g,languages:C,difficulty:E}=G(e),T=Array.isArray(e.code)?e.code:[],q=Array.isArray(e.math)?e.math:[],x=0,w="",D=null,A=null;if(a.includes(i)&&(x+=40),r.forEach(y=>{y&&(a.includes(y)&&(x+=12),l.includes(y)&&(x+=8),S.includes(y)&&(x+=6),g.forEach(o=>{o.includes(y)&&(x+=4)}),C.forEach(o=>{o.includes(y)&&(x+=4)}),E.includes(y)&&(x+=2))}),T.length>0){let y=F(t);for(let o of T){let b=String(o.language||"").toLowerCase(),v=o.code||"",z=F(v);if(z.includes(y)){x+=30,D={language:b,code:v};break}if(d&&K(z,y)){x+=18,D={language:b,code:v};break}}!D&&T[0]&&(D={language:String(T[0].language||"").toLowerCase(),code:T[0].code||""})}if(q.length>0){let y=i.replace(/\\/g,"");for(let o of q)if(k(String(o)).includes(y)){x+=26,A=o;break}f&&!A&&q[0]&&(A=q[0],x+=10)}if(S.includes(i)){let y=S.indexOf(i);w=O(e.content||"",y,t.length),x+=10}else if(l.includes(i)){let y=l.indexOf(i);w=O(e.summary||"",y,t.length),x+=6}return x===0?null:{id:`${e.url}`,title:e.title,url:e.url,summary:e.summary,snippet:w,codeSnippet:D,mathSnippet:A,tags:e.tags||[],languages:e.languages||[],difficulty:e.difficulty||"",type:e.type||"page",date:e.date,readingTime:e.reading_time,score:x}}var Y=new WeakMap;function G(e){let n=Y.get(e);if(n)return n;let t=e.normalized||{},i={title:t.title||k(e.title||""),summary:t.summary||k(e.summary||""),content:t.content||k(e.content||""),tags:V(t.tags,e.tags),languages:V(t.languages,e.languages),difficulty:t.difficulty||k(e.difficulty||"")};return Y.set(e,i),i}function V(e,n){return Array.isArray(e)&&e.length>0?e:Array.isArray(n)?n.map(t=>k(t)):[]}function Z(e,n,t){if(!e)return;let i=new Set;n.forEach(d=>{(d.tags||d.topics||[]).forEach(s=>{if(!s)return;let p=String(s).trim().toLowerCase();p&&i.add(p)})});let r=Array.from(i).sort();if(r.length===0){let d=document.createElement("p");d.className="search-filter__empty",d.textContent="No tags available yet.",e.replaceChildren(d);return}let f=document.createDocumentFragment();r.forEach(d=>{let m=document.createElement("button");m.type="button",m.className="search-filter__tag",m.textContent=d,m.dataset.filterTag=d,m.setAttribute("aria-pressed",t.has(d)?"true":"false"),f.appendChild(m)}),e.replaceChildren(),e.appendChild(f)}function ee(e,n,t){let{resultsList:i,resultsMeta:r,emptyState:f,template:d}=t;if(!i||!r||!f||!d)return;if(i.replaceChildren(),!n){r.textContent="Enter a query to begin.",f.hidden=!0;return}if(e.length===0){r.textContent=`No matches for \u201C${n}\u201D.`,f.hidden=!1;return}f.hidden=!0,r.textContent=`${e.length} result${e.length===1?"":"s"} for \u201C${n}\u201D.`;let m=document.createDocumentFragment();e.forEach(s=>{let p=d.content.cloneNode(!0),u=p.querySelector("[data-result-type]"),c=p.querySelector("[data-result-difficulty]"),a=p.querySelector("[data-result-languages]"),l=p.querySelector("[data-result-link]"),S=p.querySelector("[data-result-summary]"),g=p.querySelector("[data-result-code]"),C=g?g.querySelector("code"):null,E=p.querySelector("[data-result-math]"),T=p.querySelector("[data-result-math-preview]"),q=p.querySelector("[data-result-math-code]"),x=p.querySelector("[data-result-math-copy]"),w=p.querySelector("[data-result-excerpt]"),D=p.querySelector("[data-result-tags]"),A=p.querySelector("[data-result-date]");if(u&&(u.textContent=X(s.type)),c&&(s.difficulty?(c.textContent=`Difficulty: ${M(s.difficulty)}`,c.hidden=!1):c.hidden=!0),a&&(s.languages&&s.languages.length>0?(a.textContent=`Languages: ${s.languages.map(y=>M(y)).join(", ")}`,a.hidden=!1):a.hidden=!0),l&&(l.textContent=s.title||s.url,l.setAttribute("href",s.url)),S&&(S.replaceChildren(),S.insertAdjacentHTML("beforeend",N(s.summary||"",n))),E&&q&&(s.mathSnippet?(E.hidden=!1,q.textContent=s.mathSnippet,T&&(window.DatalogMath&&typeof window.DatalogMath.renderLatex=="function"?window.DatalogMath.renderLatex(T,s.mathSnippet,{display:!1,enhance:!1}):window.MathJax&&typeof window.MathJax.typesetPromise=="function"?(T.textContent=`\\(${s.mathSnippet}\\)`,window.MathJax.typesetPromise([T]).catch(()=>{T.textContent=s.mathSnippet})):T.textContent=s.mathSnippet),x&&x.addEventListener("click",()=>le(s.mathSnippet,E))):E.hidden=!0),w&&(s.snippet?(w.replaceChildren(),w.insertAdjacentHTML("beforeend",N(s.snippet,n)),w.hidden=!1):w.hidden=!0),g&&C)if(s.codeSnippet&&s.codeSnippet.code){let y=s.codeSnippet.language||"text";g.classList.remove("language-none"),g.classList.add(`language-${y}`),C.className=`language-${y}`,C.textContent=s.codeSnippet.code,g.hidden=!1}else g.hidden=!0;if(D&&(D.replaceChildren(),(s.tags||[]).forEach(y=>{let o=document.createElement("li");o.textContent=`#${y}`,D.appendChild(o)})),A)if(s.date){let y=new Date(s.date);Number.isNaN(y.getTime())?A.hidden=!0:(A.textContent=y.toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"}),A.hidden=!1)}else A.hidden=!0;m.appendChild(p)}),i.appendChild(m)}function le(e,n){if(!e)return;let t=()=>{if(!n)return;let r=n.querySelector("[data-result-math-copy]"),f=r?r.querySelector(".visually-hidden"):null;if(r&&f){let d=r.getAttribute("data-sr-original")||f.textContent;r.getAttribute("data-sr-original")||r.setAttribute("data-sr-original",d||"Copy LaTeX"),f.textContent="Copied LaTeX",r.classList.add("is-copied"),window.setTimeout(()=>{f.textContent=r.getAttribute("data-sr-original")||"Copy LaTeX",r.classList.remove("is-copied")},2e3)}},i=()=>{let r=document.createElement("textarea");r.value=e,r.setAttribute("aria-hidden","true"),r.style.position="fixed",r.style.opacity="0",document.body.appendChild(r),r.select();try{document.execCommand("copy"),t()}catch(f){}document.body.removeChild(r)};navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(e).then(()=>t()).catch(()=>i()):i()}var ue=8;function te(){let e=document.querySelector("[data-search-app]");if(!e)return;let n=e.querySelector("[data-search-form]"),t=e.querySelector("[data-search-input]"),i=e.querySelector("[data-search-results]"),r=e.querySelector("[data-search-meta]"),f=e.querySelector("[data-search-empty]"),d=e.querySelector("[data-search-autocomplete]"),m=e.querySelector("[data-search-analytics]"),s=m?m.querySelector(".search-app__analytics-list"):null,p=m?m.querySelector(".search-app__analytics-empty"):null,u=document.getElementById("search-result-template"),c=e.querySelector("[data-filter-type]"),a=e.querySelector("[data-filter-language]"),l=e.querySelector("[data-filter-difficulty]"),S=e.querySelector("[data-filter-tags]"),g=e.getAttribute("data-search-index")||"/search.json",C=new Set,E=W(),T=j({panel:m,list:s,empty:p,onSelect:o=>{t&&(t.value=o,A())}}),q=J({panel:d,limit:ue,onSelect:o=>{o&&t&&(t.value=o,t.focus(),A())}}),x=!1,w=new URLSearchParams(window.location.search);t&&w.has("q")&&(t.value=w.get("q")||""),c&&w.has("type")&&(c.value=w.get("type")),a&&w.has("language")&&(a.value=w.get("language")),l&&w.has("difficulty")&&(l.value=w.get("difficulty")),w.has("tags")&&w.get("tags").split(",").map(o=>o.trim().toLowerCase()).filter(Boolean).forEach(o=>C.add(o)),fe(t,()=>{q.close(),A()}),de(g).then(o=>{let b=o.documents||[];E.setDocuments(b),q.setSuggestions(E.suggestions()),Z(S,b,C),x=!0,D()}).catch(o=>{r&&(r.textContent="Unable to load the search index. Please try again later.")}),n&&n.addEventListener("submit",o=>{o.preventDefault(),A()}),t&&(t.addEventListener("input",()=>{q.update(t.value)}),t.addEventListener("keydown",o=>{q.handleNavigation(o,t)}),t.addEventListener("focus",()=>{q.update(t.value)})),c&&c.addEventListener("change",A),a&&a.addEventListener("change",A),l&&l.addEventListener("change",A),e.addEventListener("click",o=>{let b=o.target;if(b.matches("[data-filter-tag]")){let v=b.getAttribute("data-filter-tag");v&&(C.has(v)?(C.delete(v),b.setAttribute("aria-pressed","false")):(C.add(v),b.setAttribute("aria-pressed","true")),A())}}),document.addEventListener("click",o=>{!d||d.hidden||e.contains(o.target)||q.close()}),document.addEventListener("keydown",o=>{let b=document.activeElement?document.activeElement.tagName:"";["INPUT","TEXTAREA"].includes(b)||(o.key==="/"&&!o.ctrlKey&&!o.metaKey&&!o.altKey||(o.key==="k"||o.key==="K")&&(o.ctrlKey||o.metaKey))&&(o.preventDefault(),t&&(t.focus(),t.select()))}),T.render();function D(){t&&t.value.trim()?A():y()}function A(){if(!t)return;if(!x){r&&(r.textContent="Loading technical index\u2026");return}let o=t.value.trim(),b={type:c?c.value:"",language:a?a.value:"",difficulty:l?l.value:"",tags:C},v=E.search(o,b);ee(v,o,{resultsList:i,resultsMeta:r,emptyState:f,template:u}),y(o),T.record(o)}function y(o){let b=new URL(window.location.href),v=b.searchParams;o?v.set("q",o):v.delete("q"),c&&c.value?v.set("type",c.value):v.delete("type"),a&&a.value?v.set("language",a.value):v.delete("language"),l&&l.value?v.set("difficulty",l.value):v.delete("difficulty"),C.size>0?v.set("tags",Array.from(C).join(",")):v.delete("tags");let z=v.toString(),R=z?`${b.pathname}?${z}`:b.pathname;window.history.replaceState({},"",R)}}function de(e){return fetch(e,{credentials:"same-origin"}).then(n=>{if(!n.ok)throw new Error(`HTTP ${n.status}`);return n.json()})}function fe(e,n){e&&e.addEventListener("keydown",t=>{t.key==="Escape"&&(e.value="",typeof n=="function"&&n())})}var pe=300,ge="search-result-",U=500;function he(e,n=pe){let t,i=(...r)=>{t&&window.clearTimeout(t),t=window.setTimeout(()=>{t=void 0,e.apply(null,r)},n)};return i.cancel=()=>{t&&(window.clearTimeout(t),t=void 0)},i}function $(e,n){if(!e)return;let t=String(n||"");e.textContent===t?e.textContent=`${t}\xA0`:e.textContent=t,t.trim()?e.removeAttribute("hidden"):e.setAttribute("hidden","")}function me(){let e=document.querySelector("[data-search-app]");if(!e)return;let n=e.querySelector("[data-search-form]"),t=e.querySelector("[data-search-input]"),i=e.querySelector("[data-search-results]"),r=e.querySelector("[data-search-empty]"),f=e.querySelector("[data-search-loading]"),d=e.querySelector("[data-search-region]"),m=e.querySelector('[data-search-live="count"]'),s=e.querySelector('[data-search-live="selection"]'),p=e.querySelector('[data-search-live="status"]');if(!t||!i)return;let u=-1,c=0,a=[],l=!1,S=0,g=null,C=he(()=>{n&&(l=!0,o(),$(p,"Loading results\u2026"),n.dispatchEvent(new Event("submit",{cancelable:!0})))});new MutationObserver(()=>{A()}).observe(i,{childList:!0}),A(),t.addEventListener("input",()=>{w(!1),C()}),t.addEventListener("keydown",T);function T(h){if(!a.length&&["ArrowDown","ArrowUp","Enter"].includes(h.key))return!1;switch(h.key){case"ArrowDown":return h.preventDefault(),q(1),!0;case"ArrowUp":return h.preventDefault(),q(-1),!0;case"Enter":return u>=0?(h.preventDefault(),v(),!0):!1;case"Escape":return h.preventDefault(),z(),!0;default:return!1}}function q(h){if(!a.length)return;let L=u===-1?h>0?0:a.length-1:(u+h+a.length)%a.length;x(L)}function x(h){if(!(h<-1||h>=a.length)&&u!==h)if(u>=0&&a[u]&&a[u].classList.remove("is-active"),u=h,u>=0){let L=a[u];if(!L)return;L.classList.add("is-active");let I=D(L);t.setAttribute("aria-activedescendant",I);let re=R(L);$(s,`Result ${u+1} of ${a.length}: ${re}`),L.scrollIntoView({block:"nearest"})}else t.removeAttribute("aria-activedescendant"),$(s,"Search results selection cleared.")}function w(h=!0){u>=0&&a[u]&&a[u].classList.remove("is-active"),u=-1,t.removeAttribute("aria-activedescendant"),h&&$(s,"Search results selection cleared.")}function D(h){if(h.id)return h.id;c+=1;let L=`${ge}${c}`;return h.id=L,L}function A(){a=Array.from(i.querySelectorAll(".search-result")),a.forEach(h=>{D(h),h.setAttribute("role","option"),h.setAttribute("tabindex","-1")}),u>=a.length&&w(!1),l&&(l=!1,$(p,"Results updated.")),b(),y()}function y(){if(!m)return;let h=t.value.trim();if(!h){$(m,"Enter a query to begin.");return}if(r&&!r.hidden&&a.length===0){$(m,`No results found for \u201C${h}\u201D.`);return}$(m,`${a.length} result${a.length===1?"":"s"} found for \u201C${h}\u201D.`)}function o(){d&&d.setAttribute("aria-busy","true"),f&&(g&&(window.clearTimeout(g),g=null),S=Date.now(),f.hidden=!1,f.removeAttribute("hidden"))}function b(){if(d&&d.setAttribute("aria-busy","false"),f){let h=()=>{f.hidden=!0,f.setAttribute("hidden",""),g=null,S=0},L=S?Date.now()-S:U;if(L<U){let I=U-L;g&&window.clearTimeout(g),g=window.setTimeout(h,I)}else h()}}function v(){let h=u>=0?a[u]:null;if(!h)return;let L=h.querySelector("[data-result-link]");L&&L.href&&window.location.assign(L.href)}function z(){C.cancel(),t.value="",w(),$(p,"Search cleared."),n&&(l=!0,o(),n.dispatchEvent(new Event("submit",{cancelable:!0})))}function R(h){let L=h.querySelector("[data-result-link]");if(L&&L.textContent)return L.textContent.trim();let I=h.querySelector(".search-result__title");return I&&I.textContent?I.textContent.trim():"Result"}}var ye=typeof process!="undefined"&&process.env&&process.env.VITEST==="true";function ne(){te(),me()}ye||(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",ne):ne());export{he as debounce,me as setupSearchEnhancements,$ as updateLiveRegion};
@@ -0,0 +1,52 @@
1
+ {
2
+ "sources": {
3
+ "assets/js/academic.js": "c4a510fe7457b70273361e0dec773299604d17c2fbd43eab62a78dd9ff2175da",
4
+ "assets/js/analytics-dashboard.js": "98458c96b2f93c4842a3c4c4197cbcc6e1ebc84f74b322e1935408d3d0d8a3ae",
5
+ "assets/js/comments.js": "5710a30b20bdffa02b256ec9f9e6b07f0871fa5903eb5b60880aba6e915956f5",
6
+ "assets/js/comments/thread.js": "33e15eaba2eb8d18cf407eb1c1bfacc7b211d29317536e71c2c2e6ad115cea31",
7
+ "assets/js/contact.js": "7b93f9f5d8f3c0852303ea22c970845072935de50fd6f765087825e60b845c69",
8
+ "assets/js/contact/form.js": "502c755ee72b7f6d050cd3965c25c4979586c1e5c444dd944a77767925c8c5ae",
9
+ "assets/js/core/copy-buttons.js": "339e890158e3c9e5b06f85c56f8658b352a15df8c955e1208dbfa8a75443a55e",
10
+ "assets/js/core/dark-mode.js": "1d4a699f6b810c829138823e346d96fa95bb89a3247937f5ff001a476d1856f3",
11
+ "assets/js/core/github-cards.js": "7eb0c4f489fd838f4c62ed0e5ba59ad4c51e01c8a7ccf04c2ef26c1b47fa284e",
12
+ "assets/js/core/language-filter.js": "adbe34d62cbbf77bbaab8339101f5c75d8934eed735c7279c95ab007bd56f461",
13
+ "assets/js/core/navigation.js": "5d8457d996c040343fdb2ba44c204cdb04dfa2f509c127f702095d720c4d3469",
14
+ "assets/js/core/scroll-progress.js": "9610488213fa83f9270d0f2c9026b7f3e689503f41efa0c01317a51760d44b5f",
15
+ "assets/js/core/search-hotkeys.js": "19881663e3db178e92ab58a382c5369aab5a3045b58410d906eb117924125186",
16
+ "assets/js/core/skip-links.js": "138265a3aa853bf07a798efd03d56b14a5733f6e6c1810ccf87e4cfb86d52c30",
17
+ "assets/js/corrections.js": "16010732e7d653490d7b08d8dea88616008f9ae15efbc0f42848c52a7c8a6209",
18
+ "assets/js/corrections/form.js": "525c281ca7c964b0415c5571360b87c7827299d870c673d87f2b1b398b240e8b",
19
+ "assets/js/dynamic-services/client.js": "32e9cf9ad040553b2b96c3d92733c9b7626846f6dfb0aa6072ceab9f498b90b0",
20
+ "assets/js/dynamic-services/form-state.js": "96bfe09e7ea789d57d50f9f36cce8f53823d650dab6e5b4cc10f17c3fbec504e",
21
+ "assets/js/loader.js": "4544818b74f4c34a634c58008ca3348ad0bede869ccf81af27ba4dad1cbb9283",
22
+ "assets/js/main.js": "3f613ee824f48b83f9065f087bc8e1a75f0368e37a23dacf3196c2b9ffcd38ad",
23
+ "assets/js/math.js": "267693a35a1b9cbf3a9c5475fdaadf3eac5b715bd60af0761b4c0adf0eaf521a",
24
+ "assets/js/moderation.js": "2e9bcb00f0dcf4dd436458d99764989c9728794716dd33c59310d65206323c46",
25
+ "assets/js/moderation/inbox.js": "80d3cdf358faf1f0440a4b99f2609cc8a958700c0a4768f00ae10dd6a3c5b624",
26
+ "assets/js/notebook.js": "361f716a76b398aeb564ef05ba026018b1bc083de28d75c9b8df5776a6ccb21a",
27
+ "assets/js/reactions.js": "8386cffaacba9a1f976274f8145b95e9c1c2409da977dfc94ca195477971848b",
28
+ "assets/js/reactions/widget.js": "8407a55582e017fc9652cf2968db084c06e63e116150abf11c4eac9b7ef90596",
29
+ "assets/js/reading-state.js": "d2543904e203ccad34e0950bdeb2c526ad0908ee147d8f031e421b6bd0115fd6",
30
+ "assets/js/reading-state/anchors.js": "d9051f08c4aff812b841fc1e8ca2eee5859bdb856f17015399fae41fb7a27ab2",
31
+ "assets/js/reading-state/highlights.js": "c806bb70dcc40affac4367a3ca0c7cdbd1e64b8e59571346185f1257168c8ad8",
32
+ "assets/js/reading-state/progress.js": "96d9c1a4692b958e4d3a43b0701cd4c7254f4b20404394deb2cd8e5984d5e33b",
33
+ "assets/js/reading-state/storage.js": "9e0eac8d71be811e5f0d27f75f85af1b638e81332572e33b2213bddef6991d9a",
34
+ "assets/js/reading-state/ui.js": "56e443887597ed71c776a8fad99de48d5798ae5be64c0a37cca16f1475388380",
35
+ "assets/js/search.js": "602c89a4a2608ba6662140975a381b8d7d8847c0a10ba11b72247b27c2104f8d",
36
+ "assets/js/search/analytics.js": "e0473ca5b34073e3246b5b1baec9d4d670a067102e98369208fdc10ff8e4cc1e",
37
+ "assets/js/search/app.js": "66d93d600d184132c7f6de57764860b5d890b0e777a68e1ec3535399158eec20",
38
+ "assets/js/search/autocomplete.js": "fb1f2e3751c628a589b71800dcd4be725f4b71736b20b32063e3920ff579e59a",
39
+ "assets/js/search/engine.js": "a3731200c827952e6b3aeaa2a8c457277af7b2134f0071fc93e0e2224fb8ccc7",
40
+ "assets/js/search/filters.js": "0b4bb4f36132cc876a9bf86326cdd0829d9a2c79455ebf4491b55020b3dfb584",
41
+ "assets/js/search/render.js": "75eaec880b1fe09a27bf11515a813628fc2a299cacaf340ebd1fd6cc4f5ea678",
42
+ "assets/js/search/utils.js": "a805c21d30ce0d02007609d510c43e99cbb53681ed37b77dd0755af4ccb39e08",
43
+ "assets/js/subscriptions.js": "053b8387521deb5d4f940ef9effc816bc7e754e351460bda098cccd112d0b0c3",
44
+ "assets/js/subscriptions/form.js": "8eee3b658940140bdada2648daae37f11261e38a5a896e863771b12586030898",
45
+ "assets/js/subscriptions/manage.js": "0600cb83cf580e2430c87b9128fba62d42aa1741a12d8ce49ddefb940881f4f3",
46
+ "assets/js/visualizations.js": "a0414ea4ec2fd0829d049642420d753529c331966958c298901bff46d8cc26d4",
47
+ "assets/js/webmentions.js": "f36402477bf0e6bd835e3ccf3a0fb67eb3af590ef6da179613eab10409e79803",
48
+ "assets/js/webmentions/list.js": "64dfbad25539d4ae2571bcd61c24a869520c1ec3c1a191b22d4984f1e88c21cf",
49
+ "package-lock.json": "47c57dbc04bc096bd3d1c0153bf214e1b9127167cd3625947bc518cb0c5888d1",
50
+ "scripts/build_js.mjs": "b976e20ead1e5b69973b5f7413480f0b004db4dfac5a843c220059794eb57af3"
51
+ }
52
+ }
@@ -0,0 +1 @@
1
+ import{a as O,b as R,c as q,d as T,e as I}from"./chunks/chunk-WIRUK3OZ.js";import{a as x,c as C}from"./chunks/chunk-VZ5WKQVA.js";import"./chunks/chunk-PATLC23F.js";var h="subscriptions",M=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;function N(e,a){let s=e.querySelector(a);if(!s)return{};try{return JSON.parse(s.textContent)||{}}catch(t){return{}}}function $(e,a={}){let s={email:e.email||""};return a.hasTopics&&(s.topics=[].concat(e.topics||[]).filter(Boolean)),a.sourceUrl&&(s.source_url=a.sourceUrl),a.locale&&(s.locale=a.locale),s}function j(e,a,s={}){let t={};return M.test(e.email)||(t.email=s.email_invalid||"That does not look like an email address."),Array.isArray(e.topics)&&e.topics.length===0&&(t.topics=s.topics_required||"Pick at least one."),a.website&&(t.website="spam"),Object.keys(t).length>0?t:null}function P(e,a={}){let s=a.client||C(),t=e.querySelector("form"),c=N(e,"[data-subscribe-labels]"),g=c.errors||{},S=e.ownerDocument,o=S.querySelector('link[rel="canonical"]'),k={sourceUrl:e.dataset.subscribeSource||o&&o.href||"",locale:e.dataset.subscribeLocale||S.documentElement.lang||"",hasTopics:t.querySelector('[name="topics"]')!==null},v=e.dataset.subscribeDoubleOptIn!=="false",E=O(t),w=d=>{t.dataset.result=d,q(t,"success",c[d]||"")};if(!s.enabled)return q(t,"disabled",g.disabled||""),{form:t,available:!1,submit:async()=>null};let f=R(s,h,t,g);t.addEventListener("focusin",()=>f().catch(()=>{}),{once:!0});let b={form:t,available:!0,async submit(){let d=T(t),p=$(d,k),l=j(p,d,c);if(delete t.dataset.result,l)return l.website?(w("pending"),null):(q(t,"invalid",g.invalid||"",l),null);q(t,"pending",c.sending||"");try{await f()}catch(i){return null}try{let i=await s.post(s.pathFor(h),p,{idempotencyKey:E.key(p)}),u=i&&i.data&&typeof i.data.status=="string"?i.data.status:"";return E.clear(),t.reset(),w(u==="confirmed"||u==="subscribed"||u===""&&!v?"confirmed":"pending"),i}catch(i){return i&&i.kind==="conflict"?w("duplicate"):I(t,i,g),null}}};return t.addEventListener("submit",d=>{d.preventDefault(),b.submit()}),b}function U(e=document){return Array.from(e.querySelectorAll("[data-subscribe]")).map(a=>P(a))}var J=["confirm","unsubscribe","manage"],K=/^[A-Za-z0-9._~-]{8,512}$/;function z(e,a){let s=e.querySelector(a);if(!s)return{};try{return JSON.parse(s.textContent)||{}}catch(t){return{}}}function B(e){let a=new URLSearchParams(e||""),s=J.find(c=>a.has(c));if(!s)return null;let t=(a.get(s)||"").trim();return K.test(t)?{action:s,token:t}:null}function V(e,a={}){let s=e.ownerDocument,t=s.defaultView,c=a.client||C(),g=a.location||t&&t.location||{search:"",pathname:"/"},S=a.history===void 0?t&&t.history:a.history,o=z(e,"[data-manage-labels]"),k=o.errors||{},v=e.querySelector("[data-manage-status]"),E=e.querySelector("[data-manage-idle]"),w=e.querySelector("[data-manage-unsubscribe-panel]"),f=e.querySelector("[data-manage-preferences]"),b=B(g.search),d=b?`${c.pathFor(h)}/${encodeURIComponent(b.token)}`:"",p=null,l=s.createElement("button");l.type="button",l.className="post-tool",l.dataset.manageRetry="",l.textContent=o.retry||"Try again",l.hidden=!0,l.addEventListener("click",()=>p==null?void 0:p()),e.appendChild(l);let i=(r,n="",A=!1)=>{e.dataset.state=r,l.hidden=r!=="error"||!p,v&&(v.textContent=n,v.hidden=n==="",v.setAttribute("role",A?"alert":"status"))},u=r=>{[E,w,f].forEach(n=>{n&&(n.hidden=n!==r)})},F=(r,n,A)=>{let L=n&&r&&(r.kind==="not_found"||r.status===410);p=r!=null&&r.retryable?A:null,u(null),i("error",L?o.invalid_link||"":x(r,k),!0)},y=r=>{e.setAttribute("aria-busy",r?"true":"false"),e.querySelectorAll("button").forEach(n=>{n.disabled=r})},m={root:e,request:b,async confirm(){let r=!1;y(!0),u(null),i("pending",o.confirming||"");try{await c.feature(h),r=!0;let n=await c.post(`${c.pathFor(h)}/confirm`,{token:b.token});return i("confirmed",o.confirmed||""),n}catch(n){return F(n,r,()=>m.confirm()),null}finally{y(!1)}},async unsubscribe(){let r=!1;y(!0),i("pending",o.unsubscribing||"");try{await c.feature(h),r=!0;let n=await c.delete(d);return u(null),i("unsubscribed",o.unsubscribed||""),n}catch(n){return F(n,r,()=>m.unsubscribe()),null}finally{y(!1)}},async load(){let r=!1;y(!0),u(null),i("loading",o.loading||"");try{await c.feature(h),r=!0;let n=await c.get(d),A=n&&n.data&&Array.isArray(n.data.topics)?n.data.topics.map(String):[];return f&&f.querySelectorAll('[name="topics"]').forEach(L=>{L.checked=A.includes(L.value)}),u(f),i("loaded"),A}catch(n){return F(n,r,()=>m.load()),null}finally{y(!1)}},async save(){let r=Array.from(f.querySelectorAll('[name="topics"]:checked')).map(n=>n.value);y(!0),i("pending",o.saving||"");try{let n=await c.patch(d,{topics:r});return i("saved",o.saved||""),n}catch(n){return i("error",x(n,k),!0),null}finally{y(!1)}}};return e.querySelectorAll("[data-manage-unsubscribe]").forEach(r=>{r.addEventListener("click",()=>m.unsubscribe())}),f&&f.addEventListener("submit",r=>{r.preventDefault(),m.save()}),c.enabled?b?(S&&typeof S.replaceState=="function"&&S.replaceState(null,"",g.pathname),b.action==="confirm"?m.confirm():b.action==="manage"?m.load():(u(w),i("idle")),m):(u(E),i("idle"),m):(u(null),i("disabled",k.disabled||""),m)}function D(e=document){return Array.from(e.querySelectorAll("[data-subscription-manage]")).map(a=>V(a))}function _(){U(document),D(document)}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",_,{once:!0}):_();
@@ -1,4 +1,4 @@
1
- (function(){let Z=typeof process!="undefined"&&process.env&&process.env.VITEST==="true",_="[data-viz-type]",I='script[type="application/json"]',F='script[type="application/vnd.jupyter.widget-state+json"]',K='script[type="application/vnd.jupyter.widget-view+json"]',q=new Map,L=new Set,k="viz-table-fallback-template",z=(t,e={})=>{if(!t)return Promise.reject(new Error("Missing script source"));if(q.has(t))return q.get(t);let r=new Promise((n,s)=>{let o=document.createElement("script");o.src=t,o.async=e.async!==!1,e.integrity&&(o.integrity=e.integrity,o.crossOrigin=e.crossOrigin||"anonymous"),o.onload=()=>n(o),o.onerror=a=>s(a),document.head.appendChild(o)});return q.set(t,r),r},Q=t=>!t||L.has(t)?Promise.resolve():new Promise((e,r)=>{let n=document.createElement("link");n.rel="stylesheet",n.href=t,n.onload=()=>{L.add(t),e(n)},n.onerror=s=>r(s),document.head.appendChild(n)}),b=t=>Object.prototype.toString.call(t)==="[object Object]",y=t=>t===null||typeof t=="undefined"?"":t instanceof Date?t.toISOString():Array.isArray(t)?t.map(e=>y(e)).join(", "):b(t)?Object.entries(t).map(([e,r])=>`${e}: ${y(r)}`).join("; "):typeof t=="boolean"?t?"Yes":"No":typeof t=="number"?Number.isFinite(t)?`${t}`:"":String(t),T=(t,e=[])=>b(t)?Object.entries(t).reduce((r,[n,s])=>{let o=e.concat([n]);return b(s)?Object.assign(r,T(s,o)):Array.isArray(s)?r[o.join(" \u203A ")]=s.map(a=>y(a)).join(", "):r[o.join(" \u203A ")]=s,r},{}):{[e.join(" \u203A ")||"Value"]:t},m=t=>{if(!t)return[];if(Array.isArray(t)){if(!t.length)return[];if(t.every(e=>b(e)))return t.map(e=>T(e));if(Array.isArray(t[0])){let e=t[0],r=e.every(o=>typeof o=="string"||typeof o=="number"),n=e.map((o,a)=>r?y(o):`Column ${a+1}`),s=r?1:0;return t.slice(s).map((o,a)=>{let c={};return Array.isArray(o)?(n.forEach((i,l)=>{c[i]=o[l]}),n.length||o.forEach((i,l)=>{c[`Column ${l+1}`]=i})):c[`Row ${a+1}`]=o,c})}return t.map((e,r)=>({Index:r+1,Value:e}))}return b(t)?Array.isArray(t.data)?m(t.data):Array.isArray(t.values)?m(t.values):Array.isArray(t.rows)?m(t.rows):[T(t)]:[{Value:t}]},tt=t=>{let e=["Series","Trace","Group","Category","Index","X","Y","Z","Value","Text"],r=[];return e.forEach(n=>{t.includes(n)&&r.push(n)}),t.filter(n=>!e.includes(n)).sort().forEach(n=>r.push(n)),r},et=t=>{let e=t.getAttribute("data-viz-title");if(e)return e;let r=t.querySelector(".viz-title");return r&&r.textContent?r.textContent.trim():t.getAttribute("data-viz-slug")||"Visualization data"},rt=()=>{let t=document.getElementById(k);if(t)return t;t=document.createElement("template"),t.id=k;let e=document.createElement("div");return e.insertAdjacentHTML("afterbegin",'<div class="viz-table-container" data-viz-table-container><button type="button" class="viz-table-toggle" data-viz-table-toggle aria-expanded="false">Show data table</button><div class="viz-table-wrapper" data-viz-table-wrapper hidden><table class="viz-table" data-viz-table><caption data-viz-table-caption></caption><thead data-viz-table-head></thead><tbody data-viz-table-body></tbody></table></div></div>'),t.content.appendChild(e.firstElementChild),document.body.appendChild(t),t},E=(t,e={})=>{let{caption:r,rows:n}=e,s=m(n);if(!s.length)return;let o=Array.from(s.reduce((p,f)=>(Object.keys(f).forEach(O=>p.add(O)),p),new Set));if(!o.length)return;let a=tt(o),i=rt().content.firstElementChild.cloneNode(!0),l=i.querySelector("[data-viz-table-toggle]"),u=i.querySelector("[data-viz-table-wrapper]"),H=i.querySelector("[data-viz-table]"),w=i.querySelector("[data-viz-table-caption]"),h=i.querySelector("[data-viz-table-head]"),S=i.querySelector("[data-viz-table-body]"),A=`${t.getAttribute("data-viz-slug")||t.id||"viz"}-table`;H.id=A,l.setAttribute("aria-controls",A),w.textContent=r||et(t);let x=document.createElement("tr");a.forEach(p=>{let f=document.createElement("th");f.scope="col",f.textContent=p,x.appendChild(f)}),h.appendChild(x),s.forEach(p=>{let f=document.createElement("tr");a.forEach((O,yt)=>{let X=y(p[O]);if(yt===0){let v=document.createElement("th");v.scope="row",v.textContent=X,f.appendChild(v)}else{let v=document.createElement("td");v.textContent=X,f.appendChild(v)}}),S.appendChild(f)}),l.addEventListener("click",()=>{let p=l.getAttribute("aria-expanded")==="true";l.setAttribute("aria-expanded",String(!p)),l.textContent=p?"Show data table":"Hide data table",p?u.setAttribute("hidden",""):u.removeAttribute("hidden")});let Y=t.querySelector("[data-viz-table-container]");Y&&Y.remove(),t.appendChild(i),(t.querySelector("[data-viz-canvas]")||t).setAttribute("aria-describedby",A)},N=(t=[])=>{let e=[];return t.forEach((r,n)=>{let s=r.name||`Series ${n+1}`,o=Array.isArray(r.x)?r.x:[],a=Array.isArray(r.y)?r.y:[],c=Array.isArray(r.text)?r.text:[],i=r.z;if(Array.isArray(i)&&i.length&&Array.isArray(i[0])){let u=o.length?o:i[0].map((w,h)=>h+1);(a.length?a:i.map((w,h)=>h+1)).forEach((w,h)=>{let S=i[h]||[];u.forEach((A,x)=>{e.push({Series:s,Y:w,X:A,Value:Array.isArray(S)?S[x]:S,Text:c[h]?y(c[h]):""})})});return}let l=Math.max(o.length,a.length,c.length);for(let u=0;u<l;u+=1)e.push({Series:s,X:o[u],Y:a[u],Text:c[u]})}),e.length?e:null},M=t=>t?Array.isArray(t)?t:b(t)&&Array.isArray(t.data)?t.data:t:null,V=t=>{let e=t.querySelector("script[data-observable-data]");if(!e)return null;try{return JSON.parse(e.textContent||"null")}catch(r){return null}},g=null,j=new Set,C=(t,e)=>{if(typeof window[e]!="undefined")return Promise.resolve(window[e]);let r=()=>z(t).then(()=>window[e]);if(g)return g.then(o=>new Promise((a,c)=>{o([t],i=>a(i||window[e]),c)}),r);let n=r();j.add(n);let s=()=>j.delete(n);return n.then(s,s),n},D=()=>C("https://cdn.jsdelivr.net/npm/plotly.js-dist-min@2.27.0/plotly.min.js","Plotly"),nt=()=>C("https://cdn.jsdelivr.net/npm/d3@7/dist/d3.min.js","d3"),ot=()=>C("https://cdn.jsdelivr.net/npm/@bokeh/bokehjs@3.3.3/build/js/bokeh.min.js","Bokeh").then(t=>t&&t.Plotting?t:z("https://cdn.jsdelivr.net/npm/@bokeh/bokehjs@3.3.3/build/js/bokeh-api.min.js").then(()=>window.Bokeh)),R=()=>(g||(g=Promise.allSettled([...j]).then(()=>typeof window.requirejs!="undefined"?window.requirejs:z("https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js",{async:!1}).then(()=>window.requirejs))),g),st=()=>R().then(t=>{let e=window.__datalogWidgetManagerPromise;if(e)return e;let r=new Promise((n,s)=>{t.config({paths:{"@jupyter-widgets/html-manager":"https://cdn.jsdelivr.net/npm/@jupyter-widgets/html-manager@1.0.8/dist/embed-amd","@jupyter-widgets/base":"https://cdn.jsdelivr.net/npm/@jupyter-widgets/base@6.0.7/dist/index","@jupyter-widgets/controls":"https://cdn.jsdelivr.net/npm/@jupyter-widgets/controls@5.0.7/dist/index","@lumino/coreutils":"https://cdn.jsdelivr.net/npm/@lumino/coreutils@2.1.1/dist/index","@lumino/widgets":"https://cdn.jsdelivr.net/npm/@lumino/widgets@2.3.1/dist/index"}}),t(["@jupyter-widgets/html-manager"],o=>n(o),o=>s(o))});return window.__datalogWidgetManagerPromise=r,r}),at=(t,e)=>{let r=document.createElement("button");return r.type="button",r.className="viz-toolbar__button",r.textContent=t,r.addEventListener("click",n=>{n.preventDefault(),e(n)}),r},d=(t,e,r="info")=>{let n=t.querySelector("[data-viz-status]");n&&(n.textContent=e,n.dataset.tone=r)},$=t=>{let e=t.getAttribute("data-viz-version"),r=t.getAttribute("data-viz-updated"),n=t.querySelector("[data-viz-meta]");if(!n)return;let s=[];e&&s.push(`v${e}`),r&&s.push(`Updated ${r}`),n.textContent=s.join(" \xB7 ")},it=t=>{let e=t.querySelector("[data-viz-canvas]")||t,r=t.querySelector(I);if(!r)return d(t,"Missing Plotly specification","error"),Promise.resolve();let n={};try{n=JSON.parse(r.textContent||"{}")}catch(a){return d(t,"Invalid Plotly specification","error"),Promise.resolve()}let s=Array.isArray(n.data)?n.data:[],o=Object.assign({autosize:!0},n.layout||{});return D().then(a=>a.newPlot(e,s,o,{responsive:!0,displaylogo:!1})).then(()=>{d(t,"Interactive");let a=t.querySelector("[data-viz-export]");a&&(a.replaceChildren(),a.appendChild(at("Download PNG",()=>{D().then(i=>{i.downloadImage(e,{format:"png",filename:t.getAttribute("data-viz-slug")||"visualization"})})})));let c=N(s);c&&E(t,{caption:o&&o.title?y(o.title.text||o.title):void 0,rows:c})}).catch(()=>{d(t,"Plotly failed to load","error")})},B=(t,e,r,n)=>{let s={args:n,done:!1,error:null,result:void 0},o=document.createElement("script"),a=t.nonce||t.getAttribute("nonce");a&&(o.nonce=a),o.datalogRun=s,o.textContent=`(function (run) {
1
+ (function(){let Z=typeof process!="undefined"&&process.env&&process.env.VITEST==="true",I="[data-viz-type]",_='script[type="application/json"]',F='script[type="application/vnd.jupyter.widget-state+json"]',K='script[type="application/vnd.jupyter.widget-view+json"]',q=new Map,k=new Set,L="viz-table-fallback-template",z=(t,e={})=>{if(!t)return Promise.reject(new Error("Missing script source"));if(q.has(t))return q.get(t);let r=new Promise((n,s)=>{let o=document.createElement("script");o.src=t,o.async=e.async!==!1,e.integrity&&(o.integrity=e.integrity,o.crossOrigin=e.crossOrigin||"anonymous"),o.onload=()=>n(o),o.onerror=a=>s(a),document.head.appendChild(o)});return q.set(t,r),r},Q=t=>!t||k.has(t)?Promise.resolve():new Promise((e,r)=>{let n=document.createElement("link");n.rel="stylesheet",n.href=t,n.onload=()=>{k.add(t),e(n)},n.onerror=s=>r(s),document.head.appendChild(n)}),b=t=>Object.prototype.toString.call(t)==="[object Object]",y=t=>t===null||typeof t=="undefined"?"":t instanceof Date?t.toISOString():Array.isArray(t)?t.map(e=>y(e)).join(", "):b(t)?Object.entries(t).map(([e,r])=>`${e}: ${y(r)}`).join("; "):typeof t=="boolean"?t?"Yes":"No":typeof t=="number"?Number.isFinite(t)?`${t}`:"":String(t),T=(t,e=[])=>b(t)?Object.entries(t).reduce((r,[n,s])=>{let o=e.concat([n]);return b(s)?Object.assign(r,T(s,o)):Array.isArray(s)?r[o.join(" \u203A ")]=s.map(a=>y(a)).join(", "):r[o.join(" \u203A ")]=s,r},{}):{[e.join(" \u203A ")||"Value"]:t},m=t=>{if(!t)return[];if(Array.isArray(t)){if(!t.length)return[];if(t.every(e=>b(e)))return t.map(e=>T(e));if(Array.isArray(t[0])){let e=t[0],r=e.every(o=>typeof o=="string"||typeof o=="number"),n=e.map((o,a)=>r?y(o):`Column ${a+1}`),s=r?1:0;return t.slice(s).map((o,a)=>{let c={};return Array.isArray(o)?(n.forEach((i,l)=>{c[i]=o[l]}),n.length||o.forEach((i,l)=>{c[`Column ${l+1}`]=i})):c[`Row ${a+1}`]=o,c})}return t.map((e,r)=>({Index:r+1,Value:e}))}return b(t)?Array.isArray(t.data)?m(t.data):Array.isArray(t.values)?m(t.values):Array.isArray(t.rows)?m(t.rows):[T(t)]:[{Value:t}]},tt=t=>{let e=["Series","Trace","Group","Category","Index","X","Y","Z","Value","Text"],r=[];return e.forEach(n=>{t.includes(n)&&r.push(n)}),t.filter(n=>!e.includes(n)).sort().forEach(n=>r.push(n)),r},et=t=>{let e=t.getAttribute("data-viz-title");if(e)return e;let r=t.querySelector(".viz-title");return r&&r.textContent?r.textContent.trim():t.getAttribute("data-viz-slug")||"Visualization data"},rt=()=>{let t=document.getElementById(L);if(t)return t;t=document.createElement("template"),t.id=L;let e=document.createElement("div");return e.insertAdjacentHTML("afterbegin",'<div class="viz-table-container" data-viz-table-container><button type="button" class="viz-table-toggle" data-viz-table-toggle aria-expanded="false">Show data table</button><div class="viz-table-wrapper" data-viz-table-wrapper hidden><table class="viz-table" data-viz-table><caption data-viz-table-caption></caption><thead data-viz-table-head></thead><tbody data-viz-table-body></tbody></table></div></div>'),t.content.appendChild(e.firstElementChild),document.body.appendChild(t),t},E=(t,e={})=>{let{caption:r,rows:n}=e,s=m(n);if(!s.length)return;let o=Array.from(s.reduce((p,f)=>(Object.keys(f).forEach(O=>p.add(O)),p),new Set));if(!o.length)return;let a=tt(o),i=rt().content.firstElementChild.cloneNode(!0),l=i.querySelector("[data-viz-table-toggle]"),u=i.querySelector("[data-viz-table-wrapper]"),H=i.querySelector("[data-viz-table]"),w=i.querySelector("[data-viz-table-caption]"),h=i.querySelector("[data-viz-table-head]"),S=i.querySelector("[data-viz-table-body]"),A=`${t.getAttribute("data-viz-slug")||t.id||"viz"}-table`;H.id=A,l.setAttribute("aria-controls",A),w.textContent=r||et(t);let x=document.createElement("tr");a.forEach(p=>{let f=document.createElement("th");f.scope="col",f.textContent=p,x.appendChild(f)}),h.appendChild(x),s.forEach(p=>{let f=document.createElement("tr");a.forEach((O,yt)=>{let X=y(p[O]);if(yt===0){let v=document.createElement("th");v.scope="row",v.textContent=X,f.appendChild(v)}else{let v=document.createElement("td");v.textContent=X,f.appendChild(v)}}),S.appendChild(f)}),l.addEventListener("click",()=>{let p=l.getAttribute("aria-expanded")==="true";l.setAttribute("aria-expanded",String(!p)),l.textContent=p?"Show data table":"Hide data table",p?u.setAttribute("hidden",""):u.removeAttribute("hidden")});let Y=t.querySelector("[data-viz-table-container]");Y&&Y.remove(),t.appendChild(i),(t.querySelector("[data-viz-canvas]")||t).setAttribute("aria-describedby",A)},M=(t=[])=>{let e=[];return t.forEach((r,n)=>{let s=r.name||`Series ${n+1}`,o=Array.isArray(r.x)?r.x:[],a=Array.isArray(r.y)?r.y:[],c=Array.isArray(r.text)?r.text:[],i=r.z;if(Array.isArray(i)&&i.length&&Array.isArray(i[0])){let u=o.length?o:i[0].map((w,h)=>h+1);(a.length?a:i.map((w,h)=>h+1)).forEach((w,h)=>{let S=i[h]||[];u.forEach((A,x)=>{e.push({Series:s,Y:w,X:A,Value:Array.isArray(S)?S[x]:S,Text:c[h]?y(c[h]):""})})});return}let l=Math.max(o.length,a.length,c.length);for(let u=0;u<l;u+=1)e.push({Series:s,X:o[u],Y:a[u],Text:c[u]})}),e.length?e:null},N=t=>t?Array.isArray(t)?t:b(t)&&Array.isArray(t.data)?t.data:t:null,V=t=>{let e=t.querySelector("script[data-observable-data]");if(!e)return null;try{return JSON.parse(e.textContent||"null")}catch(r){return null}},g=null,j=new Set,C=(t,e)=>{if(typeof window[e]!="undefined")return Promise.resolve(window[e]);let r=()=>z(t).then(()=>window[e]);if(g)return g.then(o=>new Promise((a,c)=>{o([t],i=>a(i||window[e]),c)}),r);let n=r();j.add(n);let s=()=>j.delete(n);return n.then(s,s),n},D=()=>C("https://cdn.jsdelivr.net/npm/plotly.js-dist-min@2.27.0/plotly.min.js","Plotly"),nt=()=>C("https://cdn.jsdelivr.net/npm/d3@7/dist/d3.min.js","d3"),ot=()=>C("https://cdn.jsdelivr.net/npm/@bokeh/bokehjs@3.3.3/build/js/bokeh.min.js","Bokeh").then(t=>t&&t.Plotting?t:z("https://cdn.jsdelivr.net/npm/@bokeh/bokehjs@3.3.3/build/js/bokeh-api.min.js").then(()=>window.Bokeh)),R=()=>(g||(g=Promise.allSettled([...j]).then(()=>typeof window.requirejs!="undefined"?window.requirejs:z("https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js",{async:!1}).then(()=>window.requirejs))),g),st=()=>R().then(t=>{let e=window.__datalogWidgetManagerPromise;if(e)return e;let r=new Promise((n,s)=>{t.config({paths:{"@jupyter-widgets/html-manager":"https://cdn.jsdelivr.net/npm/@jupyter-widgets/html-manager@1.0.8/dist/embed-amd","@jupyter-widgets/base":"https://cdn.jsdelivr.net/npm/@jupyter-widgets/base@6.0.7/dist/index","@jupyter-widgets/controls":"https://cdn.jsdelivr.net/npm/@jupyter-widgets/controls@5.0.7/dist/index","@lumino/coreutils":"https://cdn.jsdelivr.net/npm/@lumino/coreutils@2.1.1/dist/index","@lumino/widgets":"https://cdn.jsdelivr.net/npm/@lumino/widgets@2.3.1/dist/index"}}),t(["@jupyter-widgets/html-manager"],o=>n(o),o=>s(o))});return window.__datalogWidgetManagerPromise=r,r}),at=(t,e)=>{let r=document.createElement("button");return r.type="button",r.className="viz-toolbar__button",r.textContent=t,r.addEventListener("click",n=>{n.preventDefault(),e(n)}),r},d=(t,e,r="info")=>{let n=t.querySelector("[data-viz-status]");n&&(n.textContent=e,n.dataset.tone=r),(e==="Interactive"||e==="Embedded")&&queueMicrotask(()=>document.dispatchEvent(new CustomEvent("datalog:viz-rendered",{detail:{element:t}})))},$=t=>{let e=t.getAttribute("data-viz-version"),r=t.getAttribute("data-viz-updated"),n=t.querySelector("[data-viz-meta]");if(!n)return;let s=[];e&&s.push(`v${e}`),r&&s.push(`Updated ${r}`),n.textContent=s.join(" \xB7 ")},it=t=>{let e=t.querySelector("[data-viz-canvas]")||t,r=t.querySelector(_);if(!r)return d(t,"Missing Plotly specification","error"),Promise.resolve();let n={};try{n=JSON.parse(r.textContent||"{}")}catch(a){return d(t,"Invalid Plotly specification","error"),Promise.resolve()}let s=Array.isArray(n.data)?n.data:[],o=Object.assign({autosize:!0},n.layout||{});return D().then(a=>a.newPlot(e,s,o,{responsive:!0,displaylogo:!1})).then(()=>{d(t,"Interactive");let a=t.querySelector("[data-viz-export]");a&&(a.replaceChildren(),a.appendChild(at("Download PNG",()=>{D().then(i=>{i.downloadImage(e,{format:"png",filename:t.getAttribute("data-viz-slug")||"visualization"})})})));let c=M(s);c&&E(t,{caption:o&&o.title?y(o.title.text||o.title):void 0,rows:c})}).catch(()=>{d(t,"Plotly failed to load","error")})},B=(t,e,r,n)=>{let s={args:n,done:!1,error:null,result:void 0},o=document.createElement("script"),a=t.nonce||t.getAttribute("nonce");a&&(o.nonce=a),o.datalogRun=s,o.textContent=`(function (run) {
2
2
  try {
3
3
  run.result = (function (${e.join(", ")}) {
4
4
  ${r}
@@ -8,4 +8,4 @@ run.done = true;
8
8
  run.error = error;
9
9
  }
10
10
  })(document.currentScript.datalogRun);`;try{document.head.appendChild(o)}finally{o.remove()}if(s.error)throw s.error;if(!s.done)throw new Error("The Content Security Policy did not allow the visualization script to run");return s.result},ct=t=>{let e=t.querySelector("[data-d3-script]");return e?nt().then(r=>{let n=e.textContent||"",s=t.querySelector("[data-viz-canvas]")||t;s.replaceChildren();let o=[],a=c=>{typeof c!="undefined"&&o.push(c)};try{let c=`${n}
11
- ;try { if (typeof data !== 'undefined') captureData(data); } catch (instrumentationError) {}`,i=B(e,["d3","element","captureData"],c,[r,s,a]);typeof i!="undefined"&&a(i);let l=o.length?o[o.length-1]:null,u=M(l);u&&E(t,{rows:u}),d(t,"Interactive")}catch(c){s.replaceChildren(),d(t,"D3 rendering error","error")}}).catch(()=>d(t,"D3 assets failed to load","error")):(d(t,"Missing D3 rendering instructions","error"),Promise.resolve())},dt=t=>{try{let e=new URL(t,"https://observablehq.com");if(e.origin!=="https://observablehq.com")return null;let r=Array.from(e.searchParams,([n,s])=>`${encodeURIComponent(n)}=${encodeURIComponent(s)}`).join("&");return"https://observablehq.com"+e.pathname+(r?"?"+r:"")}catch(e){return null}},lt=t=>{let e=t.getAttribute("data-observable-src")||t.getAttribute("data-viz-src");if(!e)return d(t,"Missing Observable notebook source","error"),Promise.resolve();let r=dt(e);if(!r)return d(t,"Observable embeds must come from observablehq.com","error"),Promise.resolve();let n=document.createElement("iframe");n.src=r,n.loading="lazy",n.title=t.getAttribute("data-viz-title")||"Observable visualization",n.setAttribute("allowfullscreen",""),n.setAttribute("sandbox","allow-scripts allow-same-origin allow-popups allow-forms"),n.className="viz-embed",(t.querySelector("[data-viz-canvas]")||t).replaceChildren(n),d(t,"Embedded");let o=V(t);return o&&E(t,{rows:o}),Promise.resolve()},ut=t=>{let e=t.querySelector(I),r=t.querySelector("[data-bokeh-script]"),n=t.querySelector("[data-viz-canvas]")||t;return!e&&!r?(d(t,"Missing Bokeh specification","error"),Promise.resolve()):ot().then(s=>{if(e){let o={};try{o=JSON.parse(e.textContent||"{}")}catch(c){d(t,"Invalid Bokeh specification","error");return}let a=n.id||`bokeh-${Math.random().toString(36).slice(2)}`;n.id=a;try{s.embed.embed_item(o,a),d(t,"Interactive")}catch(c){d(t,"Bokeh rendering error","error")}return}if(r){let o=r.textContent||"";n.replaceChildren();try{B(r,["Bokeh","element"],o,[s,n]),d(t,"Interactive")}catch(a){d(t,"Bokeh rendering error","error")}}}).catch(s=>{d(t,"Bokeh assets failed to load","error")})},pt=t=>{let e=t.getAttribute("data-shiny-src");if(!e)return d(t,"Missing Shiny application source","error"),Promise.resolve();let r=document.createElement("iframe");r.src=e,r.loading="lazy",r.title=t.getAttribute("data-viz-title")||"R Shiny application",r.className="viz-embed",r.setAttribute("allow","fullscreen"),r.setAttribute("sandbox","allow-scripts allow-forms allow-same-origin");let n=t.getAttribute("data-shiny-height");return r.style.height=n||"640px",(t.querySelector("[data-viz-canvas]")||t).replaceChildren(r),d(t,"Embedded"),Promise.resolve()},ht=t=>{let e=t.querySelector(F),r=t.querySelector(K);if(!e||!r)return d(t,"Missing widget state payload","error"),Promise.resolve();let n,s;try{n=JSON.parse(e.textContent||"{}"),s=JSON.parse(r.textContent||"{}")}catch(a){return d(t,"Invalid widget payload","error"),Promise.resolve()}let o=t.querySelector("[data-viz-canvas]")||t;return o.replaceChildren(),st().then(a=>{let c=new a.HTMLManager({loader:a.requireLoader});return c.set_state(n).then(()=>c.get_model(s.model_id)).then(i=>c.create_view(i)).then(i=>c.display_view(i,o)).then(()=>d(t,"Interactive")).catch(i=>{d(t,"Widget rendering error","error")})}).catch(a=>{d(t,"Widget assets failed to load","error")})},P=t=>{let e=t.getAttribute("data-viz-type");switch($(t),e){case"plotly":return it(t);case"observable":return lt(t);case"d3":return ct(t);case"bokeh":return ut(t);case"shiny":return pt(t);case"ipywidgets":return ht(t);default:return d(t,"Unsupported visualization type","error"),Promise.resolve()}},W=()=>{if(!("IntersectionObserver"in window)){document.querySelectorAll(_).forEach(e=>{P(e)});return}let t=new IntersectionObserver((e,r)=>{e.filter(n=>n.isIntersecting).forEach(n=>{let s=n.target;r.unobserve(s),P(s)})},{rootMargin:"200px 0px"});document.querySelectorAll(_).forEach(e=>{t.observe(e)})},U=t=>{document.querySelectorAll("[data-viz-card]").forEach(r=>{let n=!t.tech||r.dataset.vizTech===t.tech,s=(r.dataset.vizTags||"").split(",").map(a=>a.trim()).filter(Boolean),o=!t.tag||s.includes(t.tag);r.hidden=!(n&&o)})},G=()=>{let t=document.querySelector("[data-viz-gallery]");if(!t)return;let e=t.querySelector('[data-viz-filter="tech"]'),r=t.querySelector('[data-viz-filter="tag"]'),n=()=>{U({tech:e&&e.value!=="all"?e.value:"",tag:r&&r.value!=="all"?r.value:""})};e&&e.addEventListener("change",n),r&&r.addEventListener("change",n),n()},J=()=>{W(),G()},ft={loadScript:z,loadStyle:Q,loadUmd:C,ensureRequire:R,resetRequireLoading:()=>{g=null,j.clear()},normalizeRecords:m,stringifyValue:y,buildDataTable:E,annotateVersionMetadata:$,buildPlotlyRecords:N,buildD3Records:M,buildObservableRecords:V,filterGallery:U,renderVisualization:P,initializeVisualizations:W,initializeGallery:G};typeof globalThis!="undefined"&&(globalThis.__DATALOG_VIZ_INTERNALS__=ft),Z||(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",J):J())})();
11
+ ;try { if (typeof data !== 'undefined') captureData(data); } catch (instrumentationError) {}`,i=B(e,["d3","element","captureData"],c,[r,s,a]);typeof i!="undefined"&&a(i);let l=o.length?o[o.length-1]:null,u=N(l);u&&E(t,{rows:u}),d(t,"Interactive")}catch(c){s.replaceChildren(),d(t,"D3 rendering error","error")}}).catch(()=>d(t,"D3 assets failed to load","error")):(d(t,"Missing D3 rendering instructions","error"),Promise.resolve())},dt=t=>{try{let e=new URL(t,"https://observablehq.com");if(e.origin!=="https://observablehq.com")return null;let r=Array.from(e.searchParams,([n,s])=>`${encodeURIComponent(n)}=${encodeURIComponent(s)}`).join("&");return"https://observablehq.com"+e.pathname+(r?"?"+r:"")}catch(e){return null}},lt=t=>{let e=t.getAttribute("data-observable-src")||t.getAttribute("data-viz-src");if(!e)return d(t,"Missing Observable notebook source","error"),Promise.resolve();let r=dt(e);if(!r)return d(t,"Observable embeds must come from observablehq.com","error"),Promise.resolve();let n=document.createElement("iframe");n.src=r,n.loading="lazy",n.title=t.getAttribute("data-viz-title")||"Observable visualization",n.setAttribute("allowfullscreen",""),n.setAttribute("sandbox","allow-scripts allow-same-origin allow-popups allow-forms"),n.className="viz-embed",(t.querySelector("[data-viz-canvas]")||t).replaceChildren(n),d(t,"Embedded");let o=V(t);return o&&E(t,{rows:o}),Promise.resolve()},ut=t=>{let e=t.querySelector(_),r=t.querySelector("[data-bokeh-script]"),n=t.querySelector("[data-viz-canvas]")||t;return!e&&!r?(d(t,"Missing Bokeh specification","error"),Promise.resolve()):ot().then(s=>{if(e){let o={};try{o=JSON.parse(e.textContent||"{}")}catch(c){d(t,"Invalid Bokeh specification","error");return}let a=n.id||`bokeh-${Math.random().toString(36).slice(2)}`;n.id=a;try{s.embed.embed_item(o,a),d(t,"Interactive")}catch(c){d(t,"Bokeh rendering error","error")}return}if(r){let o=r.textContent||"";n.replaceChildren();try{B(r,["Bokeh","element"],o,[s,n]),d(t,"Interactive")}catch(a){d(t,"Bokeh rendering error","error")}}}).catch(s=>{d(t,"Bokeh assets failed to load","error")})},pt=t=>{let e=t.getAttribute("data-shiny-src");if(!e)return d(t,"Missing Shiny application source","error"),Promise.resolve();let r=document.createElement("iframe");r.src=e,r.loading="lazy",r.title=t.getAttribute("data-viz-title")||"R Shiny application",r.className="viz-embed",r.setAttribute("allow","fullscreen"),r.setAttribute("sandbox","allow-scripts allow-forms allow-same-origin");let n=t.getAttribute("data-shiny-height");return r.style.height=n||"640px",(t.querySelector("[data-viz-canvas]")||t).replaceChildren(r),d(t,"Embedded"),Promise.resolve()},ht=t=>{let e=t.querySelector(F),r=t.querySelector(K);if(!e||!r)return d(t,"Missing widget state payload","error"),Promise.resolve();let n,s;try{n=JSON.parse(e.textContent||"{}"),s=JSON.parse(r.textContent||"{}")}catch(a){return d(t,"Invalid widget payload","error"),Promise.resolve()}let o=t.querySelector("[data-viz-canvas]")||t;return o.replaceChildren(),st().then(a=>{let c=new a.HTMLManager({loader:a.requireLoader});return c.set_state(n).then(()=>c.get_model(s.model_id)).then(i=>c.create_view(i)).then(i=>c.display_view(i,o)).then(()=>d(t,"Interactive")).catch(i=>{d(t,"Widget rendering error","error")})}).catch(a=>{d(t,"Widget assets failed to load","error")})},P=t=>{let e=t.getAttribute("data-viz-type");switch($(t),e){case"plotly":return it(t);case"observable":return lt(t);case"d3":return ct(t);case"bokeh":return ut(t);case"shiny":return pt(t);case"ipywidgets":return ht(t);default:return d(t,"Unsupported visualization type","error"),Promise.resolve()}},W=()=>{if(!("IntersectionObserver"in window)){document.querySelectorAll(I).forEach(e=>{P(e)});return}let t=new IntersectionObserver((e,r)=>{e.filter(n=>n.isIntersecting).forEach(n=>{let s=n.target;r.unobserve(s),P(s)})},{rootMargin:"200px 0px"});document.querySelectorAll(I).forEach(e=>{t.observe(e)})},U=t=>{document.querySelectorAll("[data-viz-card]").forEach(r=>{let n=!t.tech||r.dataset.vizTech===t.tech,s=(r.dataset.vizTags||"").split(",").map(a=>a.trim()).filter(Boolean),o=!t.tag||s.includes(t.tag);r.hidden=!(n&&o)})},G=()=>{let t=document.querySelector("[data-viz-gallery]");if(!t)return;let e=t.querySelector('[data-viz-filter="tech"]'),r=t.querySelector('[data-viz-filter="tag"]'),n=()=>{U({tech:e&&e.value!=="all"?e.value:"",tag:r&&r.value!=="all"?r.value:""})};e&&e.addEventListener("change",n),r&&r.addEventListener("change",n),n()},J=()=>{W(),G()},ft={loadScript:z,loadStyle:Q,loadUmd:C,ensureRequire:R,resetRequireLoading:()=>{g=null,j.clear()},normalizeRecords:m,stringifyValue:y,buildDataTable:E,annotateVersionMetadata:$,buildPlotlyRecords:M,buildD3Records:N,buildObservableRecords:V,filterGallery:U,renderVisualization:P,initializeVisualizations:W,initializeGallery:G};typeof globalThis!="undefined"&&(globalThis.__DATALOG_VIZ_INTERNALS__=ft),Z||(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",J):J())})();
@@ -0,0 +1 @@
1
+ import{a as N,c as A}from"./chunks/chunk-VZ5WKQVA.js";import"./chunks/chunk-PATLC23F.js";var S="webmentions",_=["mention","reply"],I=["mention","reply","repost","like"],O=200,F=280,T=/^https?:\/\//i,M=new Set(["disabled","unsupported","version"]);function U(e,t){let r=e.querySelector(t);if(!r)return{};try{return JSON.parse(r.textContent)||{}}catch(s){return{}}}function x(e,t){if(typeof e!="string")return"";let r=e.replace(/\s+/g," ").trim();return r.length>t?`${r.slice(0,t-1).trimEnd()}\u2026`:r}function j(e){try{return new URL(e).hostname.replace(/^www\./,"")}catch(t){return""}}function k(e,t=_){if(!e||typeof e!="object"||Array.isArray(e))return null;let r=typeof e.source=="string"?e.source.trim():"",s=typeof e.type=="string"?e.type.trim().toLowerCase():"mention";if(e.verified!==!0||!T.test(r)||!t.includes(s))return null;let a=e.author&&typeof e.author=="object"?e.author:{},f=typeof a.url=="string"&&T.test(a.url.trim())?a.url.trim():"",i=typeof e.published_at=="string"&&!Number.isNaN(Date.parse(e.published_at))?e.published_at:"";return{id:e.id===null||e.id===void 0?"":String(e.id),source:r,host:j(r),type:s,title:x(e.title,O),excerpt:x(e.excerpt,F),author:{name:x(a.name,120),url:f},published_at:i}}function R(e,t=_){return(e&&typeof e=="object"&&Array.isArray(e.mentions)?e.mentions:[]).map(s=>k(s,t)).filter(Boolean).sort((s,a)=>(Date.parse(a.published_at)||0)-(Date.parse(s.published_at)||0))}function q(e,t){let r=new Date(e);if(Number.isNaN(r.getTime()))return"";try{return r.toLocaleDateString(t||void 0,{dateStyle:"medium"})}catch(s){return r.toISOString().slice(0,10)}}function W(e,t,r={}){let{labels:s={},lang:a}=r,f=s.types||{},i=e.createElement("li");i.className=`webmention webmention--${t.type}`,t.id&&(i.dataset.mentionId=t.id);let c=e.createElement("span");c.className="webmention__type",c.textContent=f[t.type]||t.type,i.appendChild(c);let d=e.createElement("a");d.className="webmention__title",d.href=t.source,d.rel="nofollow noopener ugc",d.textContent=t.title||t.host||t.source,i.appendChild(d);let u=e.createElement("span");if(u.className="webmention__meta",t.author.name){let n;t.author.url?(n=e.createElement("a"),n.href=t.author.url,n.rel="nofollow noopener ugc"):n=e.createElement("span"),n.className="webmention__author",n.textContent=t.author.name,u.appendChild(n)}if(t.host&&t.title){let n=e.createElement("span");n.className="webmention__host",n.textContent=t.host,u.appendChild(n)}if(t.published_at){let n=e.createElement("time");n.className="webmention__time",n.dateTime=t.published_at,n.textContent=q(t.published_at,a),u.appendChild(n)}if(u.childNodes.length>0&&i.appendChild(u),t.excerpt){let n=e.createElement("p");n.className="webmention__excerpt",n.textContent=t.excerpt,i.appendChild(n)}return i}function $(e,t={}){let r=e.ownerDocument,s=t.window||r.defaultView,a=t.client||A(),f=e.dataset.webmentionsTarget||"",i=(e.dataset.webmentionsTypes||_.join(",")).split(",").map(o=>o.trim().toLowerCase()).filter(o=>I.includes(o)),c=U(e,"[data-webmentions-labels]"),d=c.errors||{},u=r.documentElement.lang||void 0,n=e.querySelector("[data-webmentions-status]"),w=e.querySelector("[data-webmentions-list]"),h=null,g=!1,C=!1,b=(o,l="",p={})=>{if(e.dataset.state=o,!!n&&(n.textContent=l,n.hidden=l==="",n.setAttribute("role",p.alert?"alert":"status"),p.retry)){let m=r.createElement("button");m.type="button",m.className="post-tool",m.setAttribute("data-webmentions-retry",""),m.textContent=c.retry||"Try again",m.addEventListener("click",()=>y.load()),n.appendChild(r.createTextNode(" ")),n.appendChild(m)}},D=()=>(h||(h=a.feature(S).catch(o=>{throw h=null,o})),h),y={root:e,types:i,async load(){if(g)return null;g=!0,b("loading",c.loading||"");try{await D();let o=await a.get(`${a.pathFor(S)}?target=${encodeURIComponent(f)}`),l=R(o&&o.data,i);return w.textContent="",l.forEach(p=>w.appendChild(W(r,p,{labels:c,lang:u}))),w.hidden=l.length===0,b(l.length>0?"loaded":"empty",l.length>0?"":c.empty||""),C=!0,l}catch(o){return o&&M.has(o.kind)?(b("disabled"),e.hidden=!0):b("error",N(o,d),{alert:!0,retry:!0}),null}finally{g=!1}}},E=()=>{C||y.load()};if(t.immediate||!s||typeof s.IntersectionObserver!="function")E();else{let o=new s.IntersectionObserver(l=>{l.some(p=>p.isIntersecting)&&(o.disconnect(),E())},{rootMargin:"400px 0px"});o.observe(e)}return y}function L(e=document){return Array.from(e.querySelectorAll("[data-webmentions]")).map(t=>$(t))}function v(){L(document)}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",v,{once:!0}):v();
data/assets/js/loader.js CHANGED
@@ -80,6 +80,40 @@ const FEATURE_CONFIG = [
80
80
  {
81
81
  name: "notebook",
82
82
  test: () => document.body?.dataset.featureNotebook === "true" || document.querySelector(".notebook-output")
83
+ },
84
+ {
85
+ name: "reading-state",
86
+ // A post with the reading-state panel, or a page listing the saved articles.
87
+ test: () => document.querySelector("[data-reading-state], [data-reading-list]")
88
+ },
89
+ {
90
+ name: "corrections",
91
+ test: () => document.querySelector("[data-correction-report]")
92
+ },
93
+ {
94
+ name: "contact",
95
+ test: () => document.querySelector("[data-contact-form]")
96
+ },
97
+ {
98
+ name: "comments",
99
+ test: () => document.querySelector("[data-comments-thread]")
100
+ },
101
+ {
102
+ name: "reactions",
103
+ test: () => document.querySelector("[data-reactions]")
104
+ },
105
+ {
106
+ name: "webmentions",
107
+ test: () => document.querySelector("[data-webmentions]")
108
+ },
109
+ {
110
+ name: "subscriptions",
111
+ // A subscribe form, or the page the newsletter's emails link to.
112
+ test: () => document.querySelector("[data-subscribe], [data-subscription-manage]")
113
+ },
114
+ {
115
+ name: "moderation",
116
+ test: () => document.querySelector("[data-moderation-inbox]")
83
117
  }
84
118
  ];
85
119
 
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
26
26
 
27
27
  # The sass-embedded and nokogiri releases the theme is tested with need Ruby
28
28
  # 3.2; the gemspec said 3.0.
29
- spec.required_ruby_version = ">= 3.2"
29
+ spec.required_ruby_version = Datalog::Theme::RUBY_REQUIREMENT
30
30
  spec.require_paths = ["lib"]
31
31
  spec.bindir = "bin"
32
32
  spec.executables = ["datalog"]
@@ -79,7 +79,6 @@ Gem::Specification.new do |spec|
79
79
  spec.add_runtime_dependency "fastimage", "~> 2.2"
80
80
  spec.add_runtime_dependency "loofah", "~> 2.19"
81
81
  spec.add_runtime_dependency "nokogiri", "~> 1.15"
82
- spec.add_runtime_dependency "mini_magick", ">= 4.12", "< 6"
83
82
  spec.add_runtime_dependency "logger", "~> 1.6"
84
83
  spec.add_runtime_dependency "thor", "~> 1.3"
85
84
  # googleauth, with the Google Cloud gems it brings, is needed only by the
data/lib/datalog/cli.rb CHANGED
@@ -422,6 +422,14 @@ module Datalog
422
422
  end
423
423
  end
424
424
 
425
+ desc "critical-css", "Write the critical CSS a production build inlines, into _includes/critical-css"
426
+ method_option :critical, type: :array,
427
+ desc: "Command that runs critical (default: node_modules/.bin/critical or npx critical@8)"
428
+ def critical_css
429
+ require_relative "critical_css"
430
+ CriticalCss.command(site_root, options[:critical], ->(*line) { say_status(*line) })
431
+ end
432
+
425
433
  register(New, "new", "new COMMAND", "Scaffold posts, notebooks, and portfolio projects")
426
434
 
427
435
  private
@@ -439,7 +447,7 @@ module Datalog
439
447
  end
440
448
 
441
449
  def ruby_supported?
442
- Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("3.0.0")
450
+ Gem::Requirement.new(Datalog::Theme::RUBY_REQUIREMENT).satisfied_by?(Gem::Version.new(RUBY_VERSION))
443
451
  end
444
452
 
445
453
  def gemfile_path(root)
@@ -0,0 +1,168 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "date"
4
+ require "fileutils"
5
+ require "jekyll"
6
+ require "open3"
7
+ require "tmpdir"
8
+ require "yaml"
9
+
10
+ module Datalog
11
+ # Writes the critical CSS a production build inlines. head.html inlines
12
+ # _includes/critical-css/<target>.html for a page's layout (home, post, or
13
+ # default for every other layout) and then loads main.css without blocking
14
+ # rendering. Critical CSS depends on a site's own pages and styles, so the
15
+ # theme ships those files empty and each site writes its own with
16
+ # `datalog critical-css`.
17
+ class CriticalCss
18
+ TARGETS = %w[home post default].freeze
19
+ DEFAULT_DIMENSIONS = [{ "width" => 1920, "height" => 1080 }, { "width" => 375, "height" => 667 }].freeze
20
+ PACKAGE = "critical@8"
21
+
22
+ class Error < StandardError; end
23
+
24
+ attr_reader :root, :settings
25
+
26
+ # `datalog critical-css`. status reports a line as the command's shell
27
+ # does; an error ends the command with exit status 1.
28
+ def self.command(root, critical, status)
29
+ config = YAML.safe_load_file(File.join(root, "_config.yml"), permitted_classes: [Date, Time]) || {}
30
+ log = ->(message) { status.call(:critical, message, :blue) }
31
+ written = new(root, config["critical_css"], critical: critical, log: log).run
32
+ written.each_value { |path| status.call(:write, path, :green) }
33
+ rescue Error, Jekyll::Errors::FatalException, SystemCallError => e
34
+ status.call(:error, e.message, :red)
35
+ exit 1
36
+ end
37
+
38
+ # critical: the command that runs critical, as a list of words. By default
39
+ # the site's own node_modules/.bin/critical, or `npx --yes critical@8`.
40
+ def initialize(root, settings, critical: nil, log: ->(_message) {})
41
+ @root = File.expand_path(root)
42
+ @settings = settings || {}
43
+ @critical = critical
44
+ @log = log
45
+ end
46
+
47
+ # Returns the files written, by target. A target with no page to extract
48
+ # from, such as post on a site without posts, is left as it is.
49
+ def run
50
+ unless settings["enabled"] == true
51
+ raise Error, "critical_css.enabled is not true in _config.yml, so no page would inline critical CSS"
52
+ end
53
+
54
+ Dir.mktmpdir("datalog-critical") do |site_dir|
55
+ @log.call("Building the site for production into a temporary directory")
56
+ build(site_dir)
57
+ pages_for(site_dir).each_with_object({}) do |(target, page), written|
58
+ if page.nil?
59
+ @log.call("No page uses the #{target} layout; _includes/critical-css/#{target}.html is left as it is")
60
+ next
61
+ end
62
+
63
+ @log.call("Extracting critical CSS for #{target} from #{page}")
64
+ written[target] = write(target, extract(site_dir, page))
65
+ end
66
+ end
67
+ end
68
+
69
+ # A production build, with critical CSS turned off for it: pages then link
70
+ # main.css as usual, and CSS inlined by an earlier run cannot skew the result.
71
+ def build(destination)
72
+ previous = ENV.fetch("JEKYLL_ENV", nil)
73
+ ENV["JEKYLL_ENV"] = "production"
74
+ config = Jekyll.configuration(
75
+ "source" => root, "destination" => destination, "quiet" => true,
76
+ "critical_css" => settings.merge("enabled" => false)
77
+ )
78
+ Jekyll::Site.new(config).process
79
+ ensure
80
+ ENV["JEKYLL_ENV"] = previous
81
+ end
82
+
83
+ # The page each target extracts from: the one critical_css.pages names, or
84
+ # the first built page with that layout, nearest the site root first.
85
+ def pages_for(site_dir)
86
+ configured = settings["pages"] || {}
87
+ found = TARGETS.to_h { |target| [target, configured[target] && page_file(site_dir, configured[target])] }
88
+ missing = TARGETS.reject { |target| found[target] }
89
+
90
+ html_files(site_dir).each do |page|
91
+ break if missing.empty?
92
+
93
+ target = target_of(File.read(File.join(site_dir, page), encoding: "utf-8"))
94
+ next unless missing.delete(target)
95
+
96
+ found[target] = page
97
+ end
98
+ found
99
+ end
100
+
101
+ # Mirrors head.html: the home and post layouts have their own file, and
102
+ # every other page the theme's default layout renders uses default. Pages
103
+ # kept out of search engines, such as the search page, are not typical.
104
+ def target_of(html)
105
+ classes = html[/<body\b[^>]*\bclass="([^"]*)"/, 1].to_s.split
106
+ return unless classes.include?("site-body")
107
+ return "home" if classes.include?("layout-home")
108
+ return "post" if classes.include?("layout-post")
109
+
110
+ "default" unless html.match?(/<meta name="robots" content="noindex/)
111
+ end
112
+
113
+ # Only the site's stylesheet: the Google Fonts stylesheet would inline
114
+ # @font-face rules for the font files headless Chrome is served (TrueType),
115
+ # and fetching it made each page take over a minute.
116
+ def extract(site_dir, page)
117
+ arguments = [page, "--base", site_dir, "--css", File.join(site_dir, "assets", "css", "main.css"),
118
+ *dimension_arguments, *penthouse_arguments]
119
+ output, errors, status = Open3.capture3(*critical_command, *arguments, chdir: site_dir)
120
+ unless status.success?
121
+ raise Error, "critical could not extract CSS from #{page}: #{errors.strip.lines.last(5).join.strip}"
122
+ end
123
+
124
+ css = output.strip
125
+ raise Error, "critical found no critical CSS in #{page}" if css.empty?
126
+
127
+ css
128
+ end
129
+
130
+ def write(target, css)
131
+ path = File.join(root, "_includes", "critical-css", "#{target}.html")
132
+ FileUtils.mkdir_p(File.dirname(path))
133
+ # The include is rendered as Liquid; raw keeps a "{{" in CSS from being read as a tag.
134
+ File.write(path, "{% raw %}\n#{css}\n{% endraw %}\n")
135
+ path
136
+ end
137
+
138
+ def critical_command
139
+ return @critical if @critical
140
+
141
+ local = File.join(root, "node_modules", ".bin", Gem.win_platform? ? "critical.cmd" : "critical")
142
+ File.file?(local) ? [local] : ["npx", "--yes", PACKAGE]
143
+ end
144
+
145
+ def dimension_arguments
146
+ dimensions = Array(settings["dimensions"]).grep(Hash)
147
+ dimensions = DEFAULT_DIMENSIONS if dimensions.empty?
148
+ dimensions.flat_map { |entry| ["--dimensions", "#{entry['width']}x#{entry['height']}"] }
149
+ end
150
+
151
+ def penthouse_arguments
152
+ options = settings["penthouse_options"]
153
+ return [] unless options.is_a?(Hash)
154
+
155
+ options.flat_map { |key, value| ["--penthouse-#{key}", value.to_s] }
156
+ end
157
+
158
+ def page_file(site_dir, url)
159
+ path = url.to_s.sub(%r{\A/+}, "")
160
+ path = File.join(path, "index.html") if path.empty? || path.end_with?("/")
161
+ path if File.file?(File.join(site_dir, path))
162
+ end
163
+
164
+ def html_files(site_dir)
165
+ Dir.glob("**/*.html", base: site_dir).sort_by { |page| [page.count("/"), page] }
166
+ end
167
+ end
168
+ end