useyuva 0.0.26 → 0.0.27

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 (202) hide show
  1. package/README.md +1 -0
  2. package/dist/esm/apps-5c2vy32k.js +1 -0
  3. package/dist/esm/apps-ghkaqqx8.js +128 -0
  4. package/dist/esm/chat.js +33 -16
  5. package/dist/esm/{client-ebw9d6ms.js → client-k8txer77.js} +1 -1
  6. package/dist/esm/docs.js +4 -4
  7. package/dist/esm/index-0b3zs3hm.js +2 -0
  8. package/dist/esm/index-17p275de.js +2 -0
  9. package/dist/esm/index-1tyn193t.js +2 -0
  10. package/dist/esm/index-4mayxpxs.js +2 -0
  11. package/dist/esm/index-5tfxryvn.js +2 -0
  12. package/dist/esm/index-69xd7mjq.js +12 -0
  13. package/dist/esm/index-kf733km6.js +2 -0
  14. package/dist/esm/index.js +1 -1
  15. package/dist/esm/panel-jfe47dat.js +1 -0
  16. package/dist/esm/react.js +1 -1
  17. package/dist/esm/status.js +2 -2
  18. package/dist/esm/subscribe.js +2 -2
  19. package/dist/esm/thread-3y5hexyq.js +61 -0
  20. package/dist/esm/yuva-chat-j6fbj8y2.js +282 -0
  21. package/dist/types/apps/apps.d.ts +4 -0
  22. package/dist/types/apps/feedback.d.ts +3 -0
  23. package/dist/types/apps/help.d.ts +4 -0
  24. package/dist/types/apps/roadmap.d.ts +3 -0
  25. package/dist/types/apps/status.d.ts +3 -0
  26. package/dist/types/apps/styles.d.ts +1 -0
  27. package/dist/types/apps/subscribe.d.ts +3 -0
  28. package/dist/types/apps/whatsnew.d.ts +3 -0
  29. package/dist/types/catalogs/apps.d.ts +2 -0
  30. package/dist/types/client/api.d.ts +25 -0
  31. package/dist/types/client/client.d.ts +41 -2
  32. package/dist/types/element.d.ts +2 -1
  33. package/dist/types/i18n.d.ts +1 -1
  34. package/dist/types/index.d.ts +2 -2
  35. package/dist/types/locales/ar/apps.d.ts +2 -0
  36. package/dist/types/locales/bn/apps.d.ts +2 -0
  37. package/dist/types/locales/ca/apps.d.ts +2 -0
  38. package/dist/types/locales/cs/apps.d.ts +2 -0
  39. package/dist/types/locales/da/apps.d.ts +2 -0
  40. package/dist/types/locales/de/apps.d.ts +2 -0
  41. package/dist/types/locales/el/apps.d.ts +2 -0
  42. package/dist/types/locales/en/apps.d.ts +2 -0
  43. package/dist/types/locales/es/apps.d.ts +2 -0
  44. package/dist/types/locales/es-MX/apps.d.ts +2 -0
  45. package/dist/types/locales/fi/apps.d.ts +2 -0
  46. package/dist/types/locales/fr/apps.d.ts +2 -0
  47. package/dist/types/locales/fr-CA/apps.d.ts +2 -0
  48. package/dist/types/locales/gu/apps.d.ts +2 -0
  49. package/dist/types/locales/he/apps.d.ts +2 -0
  50. package/dist/types/locales/hi/apps.d.ts +2 -0
  51. package/dist/types/locales/hr/apps.d.ts +2 -0
  52. package/dist/types/locales/hu/apps.d.ts +2 -0
  53. package/dist/types/locales/id/apps.d.ts +2 -0
  54. package/dist/types/locales/it/apps.d.ts +2 -0
  55. package/dist/types/locales/ja/apps.d.ts +2 -0
  56. package/dist/types/locales/kn/apps.d.ts +2 -0
  57. package/dist/types/locales/ko/apps.d.ts +2 -0
  58. package/dist/types/locales/ml/apps.d.ts +2 -0
  59. package/dist/types/locales/mr/apps.d.ts +2 -0
  60. package/dist/types/locales/ms/apps.d.ts +2 -0
  61. package/dist/types/locales/nb/apps.d.ts +2 -0
  62. package/dist/types/locales/nl/apps.d.ts +2 -0
  63. package/dist/types/locales/or/apps.d.ts +2 -0
  64. package/dist/types/locales/pa/apps.d.ts +2 -0
  65. package/dist/types/locales/pl/apps.d.ts +2 -0
  66. package/dist/types/locales/pt-BR/apps.d.ts +2 -0
  67. package/dist/types/locales/pt-PT/apps.d.ts +2 -0
  68. package/dist/types/locales/ro/apps.d.ts +2 -0
  69. package/dist/types/locales/ru/apps.d.ts +2 -0
  70. package/dist/types/locales/sk/apps.d.ts +2 -0
  71. package/dist/types/locales/sl/apps.d.ts +2 -0
  72. package/dist/types/locales/sv/apps.d.ts +2 -0
  73. package/dist/types/locales/ta/apps.d.ts +2 -0
  74. package/dist/types/locales/te/apps.d.ts +2 -0
  75. package/dist/types/locales/th/apps.d.ts +2 -0
  76. package/dist/types/locales/tr/apps.d.ts +2 -0
  77. package/dist/types/locales/uk/apps.d.ts +2 -0
  78. package/dist/types/locales/ur/apps.d.ts +2 -0
  79. package/dist/types/locales/vi/apps.d.ts +2 -0
  80. package/dist/types/locales/zh-Hans/apps.d.ts +2 -0
  81. package/dist/types/locales/zh-Hant/apps.d.ts +2 -0
  82. package/dist/types/panel/capture.d.ts +2 -0
  83. package/dist/types/panel/chat.d.ts +3 -1
  84. package/dist/types/panel/helpers.d.ts +15 -0
  85. package/dist/types/panel/home.d.ts +18 -0
  86. package/dist/types/panel/icons.d.ts +28 -0
  87. package/dist/types/panel/styles.d.ts +1 -1
  88. package/dist/types/react.d.ts +30 -2
  89. package/dist/types/schema.gen.d.ts +18078 -11611
  90. package/dist/types/translate.d.ts +1 -1
  91. package/dist/types/types.d.ts +33 -1
  92. package/dist/types/updates.d.ts +3 -0
  93. package/dist/widget/yuva-apps-ar-wk63tmr6.js +1 -0
  94. package/dist/widget/yuva-apps-bn-mv215pfz.js +1 -0
  95. package/dist/widget/yuva-apps-ca-mxrszyen.js +1 -0
  96. package/dist/widget/yuva-apps-cs-szpm8fq7.js +1 -0
  97. package/dist/widget/yuva-apps-da-v9sx8j55.js +1 -0
  98. package/dist/widget/yuva-apps-de-fd1snm0x.js +1 -0
  99. package/dist/widget/yuva-apps-el-wecybgxk.js +1 -0
  100. package/dist/widget/yuva-apps-en-skz2hc45.js +1 -0
  101. package/dist/widget/yuva-apps-es-18nqt6cs.js +1 -0
  102. package/dist/widget/yuva-apps-es-mx-23h92xvs.js +1 -0
  103. package/dist/widget/yuva-apps-fi-9tffjg50.js +1 -0
  104. package/dist/widget/yuva-apps-fr-ca-ma4cfsvr.js +1 -0
  105. package/dist/widget/yuva-apps-fr-v6fmnc7n.js +1 -0
  106. package/dist/widget/yuva-apps-gu-4v1dxzbn.js +1 -0
  107. package/dist/widget/yuva-apps-he-yy8ajb9j.js +1 -0
  108. package/dist/widget/yuva-apps-hi-zezzdfb4.js +1 -0
  109. package/dist/widget/yuva-apps-hr-skjtsrz6.js +1 -0
  110. package/dist/widget/yuva-apps-hu-q79hae7c.js +1 -0
  111. package/dist/widget/yuva-apps-id-rvr6g27r.js +1 -0
  112. package/dist/widget/yuva-apps-it-hkfb6swg.js +1 -0
  113. package/dist/widget/yuva-apps-ja-71z2p7a6.js +1 -0
  114. package/dist/widget/yuva-apps-kn-xm2wsv24.js +1 -0
  115. package/dist/widget/yuva-apps-ko-5b90egt2.js +1 -0
  116. package/dist/widget/yuva-apps-ml-qyjc0208.js +1 -0
  117. package/dist/widget/yuva-apps-mr-wh0985vm.js +1 -0
  118. package/dist/widget/yuva-apps-ms-2et5c44x.js +1 -0
  119. package/dist/widget/yuva-apps-nb-hnr4p136.js +1 -0
  120. package/dist/widget/yuva-apps-nl-m5z18z8w.js +1 -0
  121. package/dist/widget/yuva-apps-or-6ggz8n7c.js +1 -0
  122. package/dist/widget/yuva-apps-pa-p0zp743s.js +1 -0
  123. package/dist/widget/yuva-apps-pl-ayf5z37n.js +1 -0
  124. package/dist/widget/yuva-apps-pt-br-pmegf5s7.js +1 -0
  125. package/dist/widget/yuva-apps-pt-pt-fqqmhnsg.js +1 -0
  126. package/dist/widget/yuva-apps-ro-kq1mexyc.js +1 -0
  127. package/dist/widget/yuva-apps-ru-k3vhm4n9.js +1 -0
  128. package/dist/widget/yuva-apps-sk-n0st8g80.js +1 -0
  129. package/dist/widget/yuva-apps-sl-5yzf8nkk.js +1 -0
  130. package/dist/widget/yuva-apps-sv-bfchg8n0.js +1 -0
  131. package/dist/widget/yuva-apps-ta-zgn0hzpc.js +1 -0
  132. package/dist/widget/yuva-apps-te-eyyyp1fs.js +1 -0
  133. package/dist/widget/yuva-apps-th-tq3fdyxf.js +1 -0
  134. package/dist/widget/yuva-apps-tr-9bq6yzyy.js +1 -0
  135. package/dist/widget/yuva-apps-uk-0azd9r77.js +1 -0
  136. package/dist/widget/yuva-apps-ur-j8m34b8k.js +1 -0
  137. package/dist/widget/yuva-apps-vi-hs9e6h1q.js +1 -0
  138. package/dist/widget/yuva-apps-zh-hans-bc7j7gt0.js +1 -0
  139. package/dist/widget/yuva-apps-zh-hant-9ke56jnf.js +1 -0
  140. package/dist/widget/yuva-chat-apps-yrvvqdf9.js +128 -0
  141. package/dist/widget/{yuva-docs-thread-3594bmxy.js → yuva-docs-thread-gha4vzfm.js} +5 -5
  142. package/dist/widget/yuva-panel-ar-w9kxar7b.js +1 -0
  143. package/dist/widget/yuva-panel-bn-w0jg8rz0.js +1 -0
  144. package/dist/widget/yuva-panel-ca-3xmep2qy.js +1 -0
  145. package/dist/widget/yuva-panel-cs-jxdap7hk.js +1 -0
  146. package/dist/widget/yuva-panel-da-xy0gn2ch.js +1 -0
  147. package/dist/widget/yuva-panel-de-z1haaaf5.js +1 -0
  148. package/dist/widget/yuva-panel-el-vhskf13n.js +1 -0
  149. package/dist/widget/yuva-panel-en-yntqp1wb.js +1 -0
  150. package/dist/widget/yuva-panel-es-91gq45ad.js +1 -0
  151. package/dist/widget/yuva-panel-es-mx-593ry1sp.js +1 -0
  152. package/dist/widget/yuva-panel-fi-dw2qy2ep.js +1 -0
  153. package/dist/widget/yuva-panel-fr-ca-kwqpxepb.js +1 -0
  154. package/dist/widget/yuva-panel-fr-mksekp2w.js +1 -0
  155. package/dist/widget/yuva-panel-gu-9brj4atb.js +1 -0
  156. package/dist/widget/yuva-panel-he-kwf5a5r1.js +1 -0
  157. package/dist/widget/yuva-panel-hi-hyqwxkva.js +1 -0
  158. package/dist/widget/yuva-panel-hr-xyc32ytv.js +1 -0
  159. package/dist/widget/yuva-panel-hu-dsf2tr60.js +1 -0
  160. package/dist/widget/yuva-panel-id-egadejce.js +1 -0
  161. package/dist/widget/yuva-panel-it-dstzsdpt.js +1 -0
  162. package/dist/widget/yuva-panel-ja-5ep2nhr6.js +1 -0
  163. package/dist/widget/yuva-panel-kn-ggsqc21e.js +1 -0
  164. package/dist/widget/yuva-panel-ko-7cr7d0zc.js +1 -0
  165. package/dist/widget/yuva-panel-ml-0vb742gf.js +1 -0
  166. package/dist/widget/yuva-panel-mr-f7sn0acm.js +1 -0
  167. package/dist/widget/yuva-panel-ms-7xavwv7n.js +1 -0
  168. package/dist/widget/yuva-panel-nb-34x0g8mq.js +1 -0
  169. package/dist/widget/yuva-panel-nl-rkak2t5r.js +1 -0
  170. package/dist/widget/yuva-panel-or-q6eks6dh.js +1 -0
  171. package/dist/widget/yuva-panel-pa-26mhm7me.js +1 -0
  172. package/dist/widget/yuva-panel-pl-6bsq33w3.js +1 -0
  173. package/dist/widget/yuva-panel-pt-br-5bf6ja6w.js +1 -0
  174. package/dist/widget/yuva-panel-pt-pt-2a7vh8y9.js +1 -0
  175. package/dist/widget/yuva-panel-ro-9255bnc4.js +1 -0
  176. package/dist/widget/yuva-panel-ru-1ydh24ae.js +1 -0
  177. package/dist/widget/yuva-panel-sk-50gc8kfg.js +1 -0
  178. package/dist/widget/yuva-panel-sl-0j7nnz7k.js +1 -0
  179. package/dist/widget/yuva-panel-sv-175kbch1.js +1 -0
  180. package/dist/widget/yuva-panel-ta-x4nnzatk.js +1 -0
  181. package/dist/widget/yuva-panel-te-35y4486b.js +1 -0
  182. package/dist/widget/yuva-panel-th-rx5h6eq6.js +1 -0
  183. package/dist/widget/yuva-panel-tr-ywyzb4rn.js +1 -0
  184. package/dist/widget/yuva-panel-uk-9h1czxf0.js +1 -0
  185. package/dist/widget/yuva-panel-ur-peb4hk7h.js +1 -0
  186. package/dist/widget/yuva-panel-vi-t97hnjrg.js +1 -0
  187. package/dist/widget/yuva-panel-zh-hans-djf7yajw.js +1 -0
  188. package/dist/widget/yuva-panel-zh-hant-a9cgjbmw.js +1 -0
  189. package/dist/widget/yuva-subscribe-client-32k2vgq4.js +11 -0
  190. package/dist/yuva-chat.js +238 -158
  191. package/dist/yuva-docs.js +6 -6
  192. package/dist/yuva-status.js +5 -5
  193. package/dist/yuva-subscribe.js +2 -2
  194. package/dist/yuva.js +33 -16
  195. package/package.json +1 -1
  196. package/dist/esm/index-3wpqkv7x.js +0 -2
  197. package/dist/esm/index-6brgxahe.js +0 -12
  198. package/dist/esm/index-ceev0134.js +0 -2
  199. package/dist/esm/index-rdzxvj2r.js +0 -2
  200. package/dist/esm/thread-g9jsp0c5.js +0 -61
  201. package/dist/esm/yuva-chat-9hx7wb3q.js +0 -202
  202. package/dist/widget/yuva-subscribe-client-bx862wkt.js +0 -11
@@ -0,0 +1,128 @@
1
+ import{messages}from"./index-1tyn193t.js";import{icons,el,iconButton,textButton,searchField,fileSize,canCapture,captureScreen}from"./index-5tfxryvn.js";import{updatesSince}from"./index-kf733km6.js";import{readStored,writeStored}from"./index-8f1n6nzn.js";import{ApiError2,call}from"./index-gk84nm8f.js";import{translate,addStyles}from"./index-4mayxpxs.js";var maxFiles=10,labels={bug:{id:"vXemf6"},idea:{id:"tWA9nu"},praise:{id:"40pif-"},other:{id:"_IX_7x"}},prompts={bug:{id:"hGstEn"},idea:{id:"IGDwkb"},praise:{id:"KyYwnP"},other:{id:"7nGhhM"}};function currentPage(){if(!/^https?:$/.test(location.protocol))return{};let page_url=location.origin+location.pathname;if(page_url.length>2000)return{};let page_title=Array.from(document.title.trim()).slice(0,300).join("").trim();return page_title?{page_url,page_title}:{page_url}}function feedbackApp(context,t,root){let categories=context.inbox.feedback_categories,category=categories[0]??"other",score=0,files=[],phase="form",error="",created="",destroyed=!1,text=el("textarea","field");text.rows=4,text.dir="auto",text.maxLength=1e4,text.addEventListener("input",()=>syncSend());let picker=el("input");picker.type="file",picker.multiple=!0,picker.hidden=!0,picker.addEventListener("change",()=>{add(Array.from(picker.files??[])),picker.value=""});let send=el("button","primary");send.type="button",send.addEventListener("click",()=>void submit());function add(more){files=[...files,...more].slice(0,maxFiles),render()}function syncSend(){send.disabled=phase==="sending"||text.value.trim()===""&&files.length===0}async function submit(){let body=text.value.trim();if(phase==="sending"||!body&&files.length===0)return;phase="sending",error="",render();try{let result=await context.client.sendFeedback({category,body:body||void 0,score:score||void 0,allow_email:!1,files,...currentPage()});context.created(result),created=result.conversation.id,phase="sent"}catch(failure){phase="form";let status=failure instanceof ApiError2?failure.status:0;error=status===413?t({id:"eOu9Px"}):status===415?t({id:"JkW3Ph"}):status===429?t({id:"tzsBOP"}):failure instanceof ApiError2&&failure.code==="network"?t({id:"GQVIIl"}):t({id:"tAL5wg"})}if(!destroyed)render()}function section(label){let sec=el("section","sec");return sec.append(el("h2","label",label)),sec}function render(){if(destroyed)return;if(phase==="sent"){let card=el("div","done-card");card.insertAdjacentHTML("beforeend",icons.check);let actions=el("div","rowbtns");actions.append(textButton(t({id:"DPfwMq"}),"quiet",()=>context.back()),textButton(t({id:"s_9asQ"}),"primary",()=>context.viewConversation(created))),card.append(el("p","empty",t({id:"SOk0EB"})),el("p","hint",t({id:"8hJxF9"})),actions);let sec=el("section","sec");sec.append(card),root.replaceChildren(sec);return}let kinds=section(`01 — ${t({id:"fUu_-z"})}`),group=el("div","seg");group.setAttribute("role","group"),group.setAttribute("aria-label",t({id:"fUu_-z"}));for(let value of categories){let button=textButton(t(labels[value]),"",()=>{category=value,render()});button.setAttribute("aria-pressed",String(value===category)),group.append(button)}kinds.append(group);let rate=section(`02 — ${t({id:"0Z-Vvf"})}`),scores=el("div","scores");scores.setAttribute("role","group"),scores.setAttribute("aria-label",t({id:"0Z-Vvf"}));for(let n=1;n<=5;n++){let button=textButton(String(n),"",()=>{score=score===n?0:n,render()});button.setAttribute("aria-label",t({id:"FITYG3",values:{n}})),button.setAttribute("aria-pressed",String(n===score)),scores.append(button)}let ends=el("div","ends");ends.append(el("span","",t({id:"O26H3-"})),el("span","",t({id:"WxATd2"}))),rate.append(scores,ends);let more=section(`03 — ${t({id:"5N30dV"})}`);text.placeholder=t(prompts[category]),text.setAttribute("aria-label",t({id:"5N30dV"})),text.disabled=phase==="sending";let attach=el("div","attach"),chips=el("div","chips");chips.hidden=files.length===0,files.forEach((file,index)=>{let chip=el("span","chip");chip.insertAdjacentHTML("beforeend",icons.file);let two=el("span","two");two.append(el("b","",file.name||"image"),el("span","",fileSize(context.locale,file.size))),chip.append(two,iconButton(icons.closeSmall,t({id:"w61W3L",values:{0:file.name}}),()=>{files=files.filter((_,i)=>i!==index),render()},"icon sm")),chips.append(chip)});let attachButton=iconButton(icons.attach,t({id:"N7m8E-"}),()=>picker.click(),"icon tool");if(attach.append(chips,attachButton),canCapture())attach.append(iconButton(icons.shot,t({id:"TZglEu"}),()=>void captureScreen(root.closest(".panel")??void 0).then((file)=>file&&add([file])),"icon tool"));attach.append(picker),more.append(text,attach);let foot=el("section","sec");if(send.textContent=phase==="sending"?t({id:"Sad2tK"}):t({id:"RoafuO"}),foot.append(send),error)foot.append(el("p","error",error));foot.append(el("p","note",t({id:"8hJxF9"}))),syncSend(),root.replaceChildren(kinds,rate,more,el("div","fill"),foot)}return render(),()=>{destroyed=!0}}var minQuery=2,unsafe="script, style, iframe, object, embed, form, link, meta, base";function pageUrl(){if(!/^https?:$/.test(location.protocol))return;let url=location.origin+location.pathname;return url.length>2000?void 0:url}function marked(text,highlights,field){let ranges=highlights.filter((h)=>h.field===field&&h.end>h.start).sort((a,b)=>a.start-b.start),nodes=[],at=0;for(let{start,end}of ranges){if(start<at)continue;if(start>at)nodes.push(document.createTextNode(text.slice(at,start)));nodes.push(el("mark","",text.slice(start,end))),at=end}if(at<text.length)nodes.push(document.createTextNode(text.slice(at)));return nodes}function article(html){let prose=el("div","prose"),template=document.createElement("template");template.innerHTML=html;for(let node of template.content.querySelectorAll(unsafe))node.remove();for(let node of template.content.querySelectorAll("*")){for(let attribute of Array.from(node.attributes))if(/^on/i.test(attribute.name)||/^(href|src|xlink:href)$/i.test(attribute.name)&&/^\s*javascript:/i.test(attribute.value))node.removeAttribute(attribute.name);if(node instanceof HTMLAnchorElement)node.target="_blank",node.rel="noopener noreferrer";if(node instanceof HTMLImageElement)node.loading="lazy"}return prose.append(template.content),prose}function helpApp(context,t,root){let{client,locale}=context,help=client.help,reactions=new Map,collections=new Map,articles=new Map,stack=[],screen=context.params.article?{kind:"article",id:context.params.article}:{kind:"home"},center={},query=context.params.query??"",results=null,searched="",searchFailed=!1,timer,sequence=0,destroyed=!1,field=searchField(t({id:"x7I72g"}),query,(value)=>{query=value,search(!0)},(value)=>{if(query=value,clearTimeout(timer),query.trim().length<minQuery)sequence++,results=null,searched="",render();else timer=setTimeout(()=>void search(!1),250)});function section(label){let sec=el("section","sec");if(label)sec.append(el("h2","label",label));return sec}function messageUs(articleId){let sec=section(""),row=el("div","ask"),words=el("div","ask-text");return words.append(el("b","",t({id:"bjvU7E"})),el("span","",t({id:"ylt3ut"}))),row.append(words,textButton(t({id:"R2riAW"}),"primary",()=>context.ask(articleId))),sec.append(row),sec}function row(item,highlights,from){let button=el("button","hrow");button.type="button";let text=el("span","hrow-text"),title=el("b");title.dir="auto",title.append(...marked(item.title,highlights,"title"));let excerpt=el("span");if(excerpt.dir="auto",excerpt.append(...marked(item.excerpt,highlights,"excerpt")),text.append(title),item.excerpt)text.append(excerpt);return button.append(text),button.insertAdjacentHTML("beforeend",icons.chevron),button.addEventListener("click",()=>{if(from)help.click({q:from,locale,article_id:item.id}).catch(()=>{return});go({kind:"article",id:item.id,search:from})}),button}function list(label,items){let sec=section(label),rows=el("div","hrows");for(let item of items)rows.append(row(item,[]));return sec.append(rows),sec}function pills(items){let wrap=el("div","pills");for(let item of items){let pill=textButton(item.name,"pill",()=>go({kind:"collection",id:item.id}));if(pill.dir="auto",item.count!==void 0)pill.append(el("span","",new Intl.NumberFormat(locale).format(item.count)));wrap.append(pill)}return wrap}function failure(retry){let sec=section("");return sec.append(el("p","empty",t({id:"5isRv0"})),textButton(t({id:"KDw4GX"}),"primary",retry)),sec}function loading(){let sec=section("");return sec.append(el("p","hint",t({id:"Pwqkdw"}))),sec}function backRow(){let sec=el("div","hback"),button=textButton("","link soft",back);return button.insertAdjacentHTML("beforeend",icons.back),button.append(t({id:"iH8pgl"})),sec.append(button),sec}function homeNodes(){let nodes=[],top=el("section","sec");if(top.append(field),nodes.push(top),query.trim().length>=minQuery&&searched){let found=results?.items??[],sec=section(`01 — ${t({id:"CCeCzs"})}`);if(searchFailed)return[...nodes,failure(()=>void search(!0))];if(found.length===0)sec.append(el("p","hint",t({id:"Sk2rkp"})));else{let rows=el("div","hrows");for(let item of found)rows.append(row(item,item.highlights,searched));sec.append(rows)}if(nodes.push(sec),found.length===0)nodes.push(el("div","fill"),messageUs());return nodes}if(center.failed)return[...nodes,failure(loadCenter)];let data=center.data;if(!data)return[...nodes,loading()];let best=data.suggested.length>0?data.suggested:data.popular,n=1;if(best.length>0)nodes.push(list(`0${n++} — ${data.suggested.length>0?t({id:"CCeCzs"}):t({id:"y8C3fj"})}`,best));let roots=data.collections.filter((c)=>!c.parent_id);if(roots.length>0){let sec=section(`0${n++} — ${t({id:"O2UpM1"})}`);sec.append(pills(roots.map((c)=>({id:c.id,name:c.name,count:c.article_count})))),nodes.push(sec)}return nodes.push(el("div","fill"),messageUs()),nodes}function collectionNodes(id){let state=collections.get(id)??{};if(state.failed)return[failure(()=>void loadCollection(id))];let data=state.data;if(!data)return[loading()];let head=section(`01 — ${data.collection.name}`);if(data.collection.description){let description=el("p","hint",data.collection.description);description.dir="auto",head.append(description)}if(data.collections.length>0)head.append(pills(data.collections.map((c)=>({id:c.id,name:c.name,count:c.article_count}))));let nodes=[head];if(data.articles.length>0)nodes.push(list("",data.articles));return nodes.push(el("div","fill"),messageUs()),nodes}function rate(item,search,rating){let previous=reactions.get(item.id);if(previous===rating)return;reactions.set(item.id,rating),render(),help.react(item.id,{rating,previous,locale:item.locale,search}).catch(()=>{if(previous)reactions.set(item.id,previous);else reactions.delete(item.id);render()})}function articleNodes(id,search){let state=articles.get(id)??{};if(state.failed)return[failure(()=>void loadArticle(id))];let item=state.data;if(!item)return[loading()];let body=section(""),title=el("h1","article-title",item.title);title.dir="auto",body.append(title,article(item.body_html));let nodes=[body],verdict=section(`01 — ${t({id:"eu8b5Q"})}`),given=reactions.get(item.id),group=el("div","seg");group.setAttribute("role","group"),group.setAttribute("aria-label",t({id:"eu8b5Q"}));for(let[rating,label]of[["up",t({id:"l75CjT"})],["down",t({id:"1UzENP"})]]){let button=textButton(label,"",()=>rate(item,search,rating));button.setAttribute("aria-pressed",String(given===rating)),group.append(button)}if(verdict.append(group),given)verdict.append(el("p","note",t({id:"SOk0EB"})));if(nodes.push(verdict),item.related.length>0)nodes.push(list(`02 — ${t({id:"HZx_Lj"})}`,item.related));return nodes.push(el("div","fill"),messageUs(item.id)),nodes}function render(){if(destroyed)return;let nodes=[];if(screen.kind==="home")nodes.push(...homeNodes());else nodes.push(backRow()),nodes.push(...screen.kind==="collection"?collectionNodes(screen.id):articleNodes(screen.id,screen.search));let input=field.querySelector("input"),focused=root.getRootNode().activeElement===input;if(root.replaceChildren(...nodes),focused)input?.focus({preventScroll:!0});root.scrollTop=0}function go(next){if(stack.push(screen),screen=next,next.kind==="collection"&&!collections.get(next.id)?.data)loadCollection(next.id);if(next.kind==="article")loadArticle(next.id);render()}function back(){let previous=stack.pop();if(!previous)return context.back();screen=previous,render()}async function search(final){let q=query.trim();if(clearTimeout(timer),q.length<minQuery)return;let mine=++sequence;try{let found=await help.search(q,{locale,limit:8,final});if(mine!==sequence||destroyed)return;results=found,searched=q,searchFailed=!1}catch{if(mine!==sequence||destroyed)return;searchFailed=!0,searched=q}render()}async function loadCenter(){center={},render();try{center={data:await help.get({locale,page:pageUrl()})}}catch{center={failed:!0}}render()}async function loadCollection(id){collections.set(id,{}),render();try{collections.set(id,{data:await help.collection(id,{locale})})}catch{collections.set(id,{failed:!0})}render()}async function loadArticle(id){if(articles.get(id)?.data)return;articles.set(id,{}),render();try{articles.set(id,{data:await help.article(id,{locale})})}catch{articles.set(id,{failed:!0})}render()}if(screen.kind==="home")loadCenter();else loadArticle(screen.id);if(query.trim().length>=minQuery)search(!0);return()=>{destroyed=!0,clearTimeout(timer)}}var tabs=["ideas","planned","in_progress","shipped"],tabIcons={ideas:icons.idea,planned:icons.planned,in_progress:icons.progress,shipped:icons.shipped},pageSize=20,minTitle=3,voteIcon=icons.vote.replace('width="20" height="20"','width="14" height="14"');function excerptOf(html){let template=document.createElement("template");template.innerHTML=html;let text=(template.content.textContent??"").replace(/\s+/g," ").trim();return text.length>140?`${text.slice(0,139)}…`:text}function roadmapApp(context,t,root){let{client,locale}=context,columns=new Map,details=new Map,stack=[],screen=context.params.idea?{kind:"idea",id:context.params.idea}:{kind:"list"};if(context.params.idea)stack.push({kind:"list"});let tab="ideas",board=null,writer=null,busy=new Set,acting=0,error="",notice="",similar=[],suggested=null,sending=!1,destroyed=!1,timer,sequence=0,suggestions=context.inbox.roadmap?.suggestions??"off",titleField=el("input","field");titleField.maxLength=200,titleField.dir="auto";let bodyField=el("textarea","field");bodyField.rows=5,bodyField.maxLength=20000,bodyField.dir="auto";let replyField=el("textarea","field");replyField.rows=3,replyField.maxLength=20000,replyField.dir="auto";let similarBox=el("div","ideas"),similarSection=el("section","sec"),submit=el("button","primary");submit.type="button",submit.addEventListener("click",()=>void send());let replyButton=textButton(t({id:"ImOQa9"}),"primary",()=>void reply());titleField.addEventListener("input",()=>{syncSend(),clearTimeout(timer);let q=titleField.value.trim(),mine=++sequence;if(q.length<minTitle){similar=[],renderSimilar();return}timer=setTimeout(()=>{client.listIdeas({q,sort:"top",limit:3}).then((page)=>{if(mine!==sequence||destroyed)return;similar=page.items,renderSimilar()}).catch(()=>{return})},300)}),bodyField.addEventListener("input",()=>syncSend()),replyField.addEventListener("input",()=>syncSend());function section(label){let sec=el("section","sec");if(label)sec.append(el("h2","label",label));return sec}function stageLabel(stage){return stage==="planned"?t({id:"Iqh0Uv"}):stage==="in_progress"?t({id:"_LCAwL"}):stage==="shipped"?t({id:"AoOqHM"}):t({id:"iwr7AP"})}function syncSend(){submit.disabled=sending||titleField.value.trim().length<minTitle||bodyField.value.trim()==="",replyButton.disabled=busy.has("reply")||replyField.value.trim()===""}function failureText(failure){if(!(failure instanceof ApiError2))return t({id:"tAL5wg"});if(failure.code==="popup_blocked")return t({id:"1so6q_"});if(failure.code==="sign_in_cancelled")return"";if(failure.status===429)return t({id:"tzsBOP"});if(failure.code==="network")return t({id:"GQVIIl"});return t({id:"tAL5wg"})}async function ensureWriter(){if(writer)return;await client.readerSignIn(),writer="reader"}function column(){let value=columns.get(tab);if(!value)columns.set(tab,value={items:[],loading:!1,failed:!1});return value}async function load(more){let which=tab,current=column();if(current.loading)return;if(current.loading=!0,current.failed=!1,!more)current.items=[];render();try{let page=await client.listIdeas({stage:which,sort:"top",limit:pageSize,cursor:more?current.cursor:void 0}),known=new Set(current.items.map((item)=>item.id));current.items=[...current.items,...page.items.filter((item)=>!known.has(item.id))],current.cursor=page.next_cursor}catch{current.failed=!0}if(current.loading=!1,!destroyed)render()}async function loadBoard(){try{board=await client.roadmap()}catch{board=null}if(!destroyed&&screen.kind==="list")render()}async function loadIdea(id,force=!1){if(!force&&details.get(id)?.data)return;if(!details.get(id)?.data)details.set(id,{});render();try{details.set(id,{data:await client.getDiscussion(id)})}catch{details.set(id,{failed:!0})}if(!destroyed)render()}function refresh(){if(columns.clear(),details.clear(),screen.kind==="list")load(!1);else if(screen.kind==="idea")loadIdea(screen.id,!0)}function patch(post){for(let value of columns.values())value.items=value.items.map((item)=>item.opening_post_id===post.id?{...item,votes:post.votes,voted:post.voted}:item);for(let[id,state]of details){let detail=state.data;if(detail?.discussion.opening_post_id===post.id)details.set(id,{data:{...detail,discussion:{...detail.discussion,votes:post.votes,voted:post.voted}}})}}function vote(idea){if(busy.has(idea.id))return;busy.add(idea.id),acting++,error="";let wasSignedIn=!!writer;ensureWriter().then(async()=>{if(patch(await client.voteDiscussionPost(idea.opening_post_id,!idea.voted)),!wasSignedIn)refresh()}).catch((failure)=>{error=failureText(failure)}).finally(()=>{busy.delete(idea.id),acting--,render()}),render()}async function send(){let title=titleField.value.trim(),body=bodyField.value.trim();if(sending||title.length<minTitle||!body)return;sending=!0,acting++,error="",syncSend();try{await ensureWriter(),suggested=await client.suggestIdea({title,body}),titleField.value="",bodyField.value="",similar=[],columns.clear(),loadBoard()}catch(failure){error=failureText(failure)}sending=!1,acting--,render()}async function reply(){let current=screen,body=replyField.value.trim();if(current.kind!=="idea"||!body||busy.has("reply"))return;busy.add("reply"),acting++,error="",notice="",syncSend();try{await ensureWriter();let post=await client.replyToDiscussion(current.id,{body});if(replyField.value="",post.state==="pending")notice=t({id:"r1ViQ0"});await loadIdea(current.id,!0)}catch(failure){error=failureText(failure)}busy.delete("reply"),acting--,render()}function voteButton(idea){let button=el("button","vote");return button.type="button",button.disabled=idea.stage==="shipped"||idea.stage==="closed"||busy.has(idea.id),button.setAttribute("aria-pressed",String(!!idea.voted)),button.setAttribute("aria-label",idea.voted?t({id:"OC9zF0",values:{0:idea.title}}):t({id:"lJuwH3",values:{0:idea.title}})),button.insertAdjacentHTML("beforeend",voteIcon),button.append(el("span","",new Intl.NumberFormat(locale).format(idea.votes))),button.addEventListener("click",()=>vote(idea)),button}function ideaRow(idea){let row=el("div","idea"),text=el("button","idea-text");text.type="button";let title=el("b","",idea.title);title.dir="auto",text.append(title);let lede=excerptOf(idea.body_html);if(lede){let line=el("span","lede",lede);line.dir="auto",text.append(line)}let meta=el("span","meta");if(idea.state==="pending")meta.append(el("span","badge-line",t({id:"r1ViQ0"})));else meta.append(el("span","",t({id:"Hw3P48",values:{0:idea.reply_count}})));return text.append(meta),text.addEventListener("click",()=>go({kind:"idea",id:idea.id})),row.append(voteButton(idea),text),row}function failure(retry){let sec=section("");return sec.append(el("p","empty",t({id:"5isRv0"})),textButton(t({id:"KDw4GX"}),"primary",retry)),sec}function loading(){let sec=section("");return sec.append(el("p","hint",t({id:"Pwqkdw"}))),sec}function backRow(){let sec=el("div","hback"),button=textButton("","link soft",back);return button.insertAdjacentHTML("beforeend",icons.back),button.append(t({id:"iH8pgl"})),sec.append(button),sec}function listNodes(){let top=el("section","sec rm-top");if(suggestions!=="off"||board?.description){let head=el("div","rm-head"),about=el("p","hint",board?.description??"");if(about.dir="auto",head.append(about),suggestions!=="off"){let button=textButton("","pill suggest",()=>go({kind:"suggest"}));button.insertAdjacentHTML("beforeend",icons.plus),button.append(t({id:"L3-fF1"})),head.append(button)}top.append(head)}let strip=el("div","tabs");strip.setAttribute("role","tablist");for(let value of tabs){let button=el("button");button.type="button",button.insertAdjacentHTML("beforeend",tabIcons[value]),button.setAttribute("aria-label",stageLabel(value)),button.dataset.tip=stageLabel(value),button.setAttribute("role","tab"),button.setAttribute("aria-selected",String(value===tab)),button.addEventListener("click",()=>{if(value===tab)return;if(tab=value,error="",!columns.has(value))load(!1);render()}),strip.append(button)}top.append(strip);let current=column();if(current.failed&&current.items.length===0)return[top,failure(()=>void load(!1))];let body=el("section","sec rm-list");if(current.items.length===0)body.append(el("p","hint",current.loading?t({id:"Pwqkdw"}):t({id:"WpXcBJ"})));else{let list=el("div","ideas");for(let idea of current.items)list.append(ideaRow(idea));if(body.append(list),current.cursor)body.append(textButton(current.loading?t({id:"Pwqkdw"}):t({id:"yQ2kGp"}),"link brand",()=>void load(!0)))}if(error)body.append(el("p","error",error));let nodes=[top,body,el("div","fill")];if(!writer){let foot=section("");foot.append(el("p","note",t({id:"-qzaeL"}))),nodes.push(foot)}return nodes}function ideaNodes(id){let state=details.get(id)??{};if(state.failed)return[failure(()=>void loadIdea(id,!0))];let detail=state.data;if(!detail)return[loading()];let idea=detail.discussion,head=section(""),top=el("div","idea-top"),heading=el("div","idea-head"),title=el("h1","article-title",idea.title);title.dir="auto";let tags=el("div","meta");if(tags.append(el("span","stage",stageLabel(idea.stage))),idea.state==="pending")tags.append(el("span","badge-line",t({id:"r1ViQ0"})));if(heading.append(title,tags),top.append(voteButton(idea),heading),head.append(top),idea.body_html)head.append(article(idea.body_html));if(error)head.append(el("p","error",error));let nodes=[head],replies=section(`01 — ${t({id:"N8UzTV"})}`);if(detail.posts.length===0)replies.append(el("p","hint",t({id:"eA01mj"})));for(let post of detail.posts){let item=el("div","reply"),who=el("div","who-line"),name=el("b","",post.author.deleted?"?":post.author.name||"");if(name.dir="auto",who.append(name),post.author.kind==="member")who.append(el("span","tag",t({id:"KM6m8p"})));if(post.state==="pending")who.append(el("span","badge-line",t({id:"r1ViQ0"})));item.append(who,article(post.body_html)),replies.append(item)}if(nodes.push(replies),!idea.locked){let compose=section(`02 — ${t({id:"wQ8Ayo"})}`);if(replyField.setAttribute("aria-label",t({id:"wQ8Ayo"})),notice)compose.append(el("p","note",notice));syncSend(),compose.append(replyField,replyButton),nodes.push(compose)}return nodes.push(el("div","fill")),nodes}function renderSimilar(){similarBox.replaceChildren(...similar.map((idea)=>ideaRow(idea))),similarSection.hidden=similar.length===0}function suggestNodes(){let sent=suggested;if(sent){let card=el("div","done-card");card.insertAdjacentHTML("beforeend",icons.check);let actions=el("div","rowbtns");actions.append(textButton(t({id:"DPfwMq"}),"quiet",()=>{suggested=null,back()}),textButton(t({id:"CRm_lr"}),"primary",()=>{suggested=null,stack.pop(),details.set(sent.id,{data:{discussion:sent,posts:[]}}),screen={kind:"idea",id:sent.id},render()})),card.append(el("p","empty",sent.state==="pending"?t({id:"SjYh1G"}):t({id:"PEdX5E"})),actions);let sec=section("");return sec.append(card),[sec]}let form=section(`01 — ${t({id:"iDynVL"})}`);titleField.placeholder=t({id:"F268WL"}),titleField.setAttribute("aria-label",t({id:"F268WL"})),bodyField.placeholder=t({id:"giiL14"}),bodyField.setAttribute("aria-label",t({id:"giiL14"})),titleField.disabled=bodyField.disabled=sending,form.append(titleField,bodyField),similarSection.replaceChildren(el("h2","label",`02 — ${t({id:"2CuHlT"})}`),similarBox),renderSimilar();let foot=section("");if(submit.textContent=sending?t({id:"Sad2tK"}):t({id:"v8ZlFT"}),foot.append(submit),error)foot.append(el("p","error",error));if(!writer)foot.append(el("p","note",t({id:"-qzaeL"})));return syncSend(),[form,similarSection,el("div","fill"),foot]}function render(){if(destroyed)return;let nodes=[];if(screen.kind==="list")nodes.push(...listNodes());else nodes.push(backRow()),nodes.push(...screen.kind==="idea"?ideaNodes(screen.id):suggestNodes());let active=root.getRootNode().activeElement,keep=active===titleField||active===bodyField||active===replyField?active:null,scroll=root.scrollTop;if(root.replaceChildren(...nodes),keep instanceof HTMLElement)keep.focus({preventScroll:!0});root.scrollTop=scroll}function go(next){if(stack.push(screen),screen=next,error="",notice="",next.kind==="idea")loadIdea(next.id);render(),root.scrollTop=0}function back(){let previous=stack.pop();if(!previous)return context.back();screen=previous,error="",notice="",render(),root.scrollTop=0}let offReader=client.on("reader",(reader)=>{if(writer=reader?"reader":writer==="reader"?null:writer,acting===0)refresh()});if(client.discussionWriter().catch(()=>null).then((value)=>{writer=value,render()}),screen.kind==="idea")loadIdea(screen.id);else load(!1);return loadBoard(),()=>{destroyed=!0,clearTimeout(timer),offReader()}}var fetcher=(url,init)=>fetch(url,init),shownDays=60,overall={operational:{id:"UQbwrz"},degraded:{id:"uN55Po"},partial_outage:{id:"IyJo7F"},major_outage:{id:"n8LtxM"},maintenance:{id:"6Dd2PM"}},part={operational:{id:"zga9sT"},degraded:{id:"SYgxDf"},partial_outage:{id:"3nRszo"},major_outage:{id:"gUjkl_"},maintenance:{id:"6Dd2PM"}},tone={operational:"",degraded:"warn",partial_outage:"bad",major_outage:"bad",maintenance:"maint"},incidentState={investigating:{id:"WAnUgI"},identified:{id:"tddaHo"},monitoring:{id:"1gZQhL"},resolved:{id:"O6H89R"},scheduled:{id:"4ba0NE"},in_progress:{id:"_LCAwL"},completed:{id:"qqWcBV"}};function statusApp(context,t,root){let status=context.inbox.status,{locale}=context,page=null,destroyed=!1;function section(label){let sec=el("section","sec");if(label)sec.append(el("h2","label",label));return sec}function date(value){return new Intl.DateTimeFormat(locale,{month:"short",day:"numeric"}).format(new Date(value))}function ago(value){let minutes=Math.max(0,Math.round((Date.now()-Date.parse(value))/60000)),format=new Intl.RelativeTimeFormat(locale,{numeric:"auto"});if(minutes<60)return format.format(-minutes,"minute");if(minutes<1440)return format.format(-Math.round(minutes/60),"hour");return format.format(-Math.round(minutes/1440),"day")}function render(){if(destroyed||!status)return;let state=page?.state??status.state,head=section(""),stat=el("div","stat"),mark=el("span",`stat-mark ${tone[state]}`);mark.innerHTML=state==="operational"?icons.check:icons.alert;let words=el("div");if(words.append(el("b","",t(overall[state]))),page)words.append(el("span","",ago(page.updated_at)));stat.append(mark,words),head.append(stat);let nodes=[head];if(page&&page.components.length>0){let sec=section(`01 — ${t({id:"RRa_CR"})}`);for(let component of page.components){let row=el("div","comp"),top=el("div","comp-top");top.append(el("span","",component.name),el("span","",component.uptime===void 0?t(part[component.state]):new Intl.NumberFormat(locale,{style:"percent",maximumFractionDigits:2}).format(component.uptime/100))),row.append(top);let days=(component.days??[]).slice(-shownDays);if(days.length>0){let cells=el("div","cells");cells.setAttribute("role","img"),cells.setAttribute("aria-label",`${component.name}, ${t(part[component.state])}`);for(let day of days){let cell=el("i",tone[day.state]);cell.title=`${date(day.date)}: ${t(part[day.state])}`,cells.append(cell)}row.append(cells)}sec.append(row)}nodes.push(sec)}let incidents=page?[...page.open,...page.recent].slice(0,4).map((incident)=>({id:incident.id,title:incident.title,url:incident.url,state:incident.state,at:incident.updated_at})):status.open.map((incident)=>({id:incident.id,title:incident.title,url:incident.url,state:incident.state,at:incident.updated_at})),list=section(`${page&&page.components.length>0?"02":"01"} — ${t({id:"JN4pgo"})}`);if(incidents.length===0)list.append(el("p","hint",t({id:"LBTzx_"})));for(let incident of incidents){let item=el("div","inc"),link=el("a","",incident.title);link.href=incident.url,link.target="_blank",link.rel="noopener noreferrer",link.dir="auto",item.append(link,el("span","",`${t(incidentState[incident.state])} · ${date(incident.at)}`)),list.append(item)}nodes.push(list);let foot=section(""),open=el("a","link brand",t({id:"7fnHMC"}));if(open.href=status.url,open.target="_blank",open.rel="noopener noreferrer",foot.append(open),context.mailingLists)foot.append(textButton(t({id:"Qw6AA4"}),"primary",()=>context.open("subscribe")));nodes.push(el("div","fill"),foot),root.replaceChildren(...nodes)}render();let slug=status?.slug;if(slug)call(fetcher,context.client.server,`/client/v1/status/${encodeURIComponent(slug)}`).then((result)=>{page=result,render()}).catch(()=>{return});return()=>{destroyed=!0}}var styles=`
2
+ .app { flex: 1; min-block-size: 0; display: flex; flex-direction: column; }
3
+ .app .page { flex: 1; }
4
+ .seg { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; border: 1px solid var(--yuva-strong); border-radius: 10px; overflow: hidden; }
5
+ .seg button { min-block-size: 44px; padding: 0 8px; border: 0; background: transparent; color: var(--yuva-muted); cursor: pointer; }
6
+ .seg button + button { border-inline-start: 1px solid var(--yuva-strong); }
7
+ .seg button[aria-pressed="true"] { background: var(--yuva-fg); color: var(--yuva-bg); }
8
+ .scores { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 8px; }
9
+ .scores button { min-block-size: 48px; padding: 0; border: 1px solid var(--yuva-strong); border-radius: 10px; background: transparent; color: var(--yuva-muted); font-family: var(--yuva-mono); font-size: 15px; font-weight: 500; cursor: pointer; }
10
+ .scores button[aria-pressed="true"] { background: var(--yuva-wash); border-color: var(--yuva-brand); color: var(--yuva-brand); }
11
+ .ends { display: flex; justify-content: space-between; font-size: 12px; color: var(--yuva-faint); }
12
+ .attach { display: flex; align-items: center; gap: 4px; }
13
+ .attach .chips { padding: 0; flex: 1; }
14
+ .rowbtns { display: flex; gap: 8px; align-self: stretch; }
15
+ .rowbtns > * { flex: 1; }
16
+ .stat { display: flex; align-items: center; gap: 12px; }
17
+ .stat-mark { display: grid; place-items: center; flex: none; inline-size: 40px; block-size: 40px; border-radius: 50%; background: color-mix(in srgb, var(--yuva-ok) 14%, var(--yuva-bg)); color: var(--yuva-ok); }
18
+ .stat-mark.warn { background: color-mix(in srgb, var(--yuva-warn) 16%, var(--yuva-bg)); color: var(--yuva-warn); }
19
+ .stat-mark.bad { background: color-mix(in srgb, var(--yuva-danger) 14%, var(--yuva-bg)); color: var(--yuva-danger); }
20
+ .stat-mark.maint { background: color-mix(in srgb, var(--yuva-info) 14%, var(--yuva-bg)); color: var(--yuva-info); }
21
+ .stat b { display: block; font-size: 16px; font-weight: 600; }
22
+ .stat span { font-family: var(--yuva-mono); font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--yuva-faint); }
23
+ .comp { display: flex; flex-direction: column; gap: 6px; }
24
+ .comp-top { display: flex; justify-content: space-between; gap: 8px; }
25
+ .comp-top span:last-child { font-family: var(--yuva-mono); font-size: 12px; color: var(--yuva-muted); }
26
+ .cells { display: flex; gap: 2px; block-size: 22px; }
27
+ .cells i { flex: 1; min-inline-size: 1px; border-radius: 1px; background: var(--yuva-ok); }
28
+ .cells i.none { background: var(--yuva-border); }
29
+ .cells i.warn { background: var(--yuva-warn); }
30
+ .cells i.bad { background: var(--yuva-danger); }
31
+ .cells i.maint { background: var(--yuva-info); }
32
+ .inc { display: flex; flex-direction: column; gap: 2px; padding-block: 8px; border-block-end: 1px solid var(--yuva-border); }
33
+ .inc:last-of-type { border-block-end: 0; }
34
+ .inc a { color: inherit; font-weight: 500; text-decoration: none; }
35
+ .inc a:hover { text-decoration: underline; }
36
+ .inc span { font-size: 12px; color: var(--yuva-faint); }
37
+ .lists { display: flex; flex-direction: column; gap: 8px; }
38
+ .check { display: flex; gap: 10px; align-items: flex-start; min-block-size: 28px; font-size: 13px; color: var(--yuva-muted); }
39
+ .check input { flex: none; inline-size: 18px; block-size: 18px; margin: 1px 0 0; accent-color: var(--yuva-accent); }
40
+ .check b { display: block; font-weight: 500; color: var(--yuva-fg); }
41
+ .form { display: flex; flex-direction: column; gap: 12px; }
42
+ .form .row2 { display: flex; gap: 8px; }
43
+ .form .row2 .field { flex: 1; min-inline-size: 0; }
44
+ .done-card { display: flex; flex-direction: column; align-items: center; gap: 8px; text-align: center; padding: 8px 0; }
45
+ .done-card svg { inline-size: 28px; block-size: 28px; color: var(--yuva-ok); }
46
+ .done-card .rowbtns { inline-size: 100%; margin-block-start: 8px; }
47
+ .note { margin: 0; font-size: 12px; color: var(--yuva-faint); }
48
+ .hback { flex: none; padding: 6px 28px 0; }
49
+ .hback .link { display: inline-flex; align-items: center; gap: 4px; }
50
+ .hrows { display: flex; flex-direction: column; margin-block-end: -8px; }
51
+ .hrow { display: flex; align-items: center; gap: 12px; min-block-size: 56px; padding: 8px 0; border: 0; border-block-end: 1px solid var(--yuva-border); background: transparent; color: inherit; text-align: start; cursor: pointer; }
52
+ .hrow:last-child { border-block-end: 0; }
53
+ .hrow-text { flex: 1; min-inline-size: 0; display: flex; flex-direction: column; gap: 2px; }
54
+ .hrow-text b { font-weight: 500; }
55
+ .hrow-text span { font-size: 12px; color: var(--yuva-muted); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
56
+ .hrow > svg { flex: none; color: var(--yuva-faint); }
57
+ .hrow mark, .hrow-text mark { background: var(--yuva-wash); color: inherit; border-radius: 2px; }
58
+ .hrow:hover .hrow-text b { text-decoration: underline; }
59
+ .pills { display: flex; flex-wrap: wrap; gap: 8px; }
60
+ .pill { display: inline-flex; align-items: center; gap: 8px; min-block-size: 36px; padding: 0 12px; border: 1px solid var(--yuva-strong); border-radius: 999px; background: transparent; color: inherit; cursor: pointer; }
61
+ .pill:hover { background: var(--yuva-deep); }
62
+ .pill span { font-family: var(--yuva-mono); font-size: 11px; color: var(--yuva-faint); }
63
+ .ask { display: flex; align-items: center; gap: 12px; }
64
+ .ask-text { flex: 1; min-inline-size: 0; display: flex; flex-direction: column; }
65
+ .ask-text b { font-weight: 500; }
66
+ .ask-text span { font-size: 12px; color: var(--yuva-muted); }
67
+ .article-title { margin: 0; font-size: 22px; line-height: 1.2; font-weight: 600; letter-spacing: -0.01em; overflow-wrap: anywhere; }
68
+ .prose { overflow-wrap: anywhere; line-height: 1.55; }
69
+ .prose > :first-child { margin-block-start: 0; }
70
+ .prose > :last-child { margin-block-end: 0; }
71
+ .prose h1, .prose h2, .prose h3, .prose h4 { margin: 20px 0 8px; font-size: 16px; line-height: 1.3; font-weight: 600; }
72
+ .prose p, .prose ul, .prose ol, .prose pre, .prose blockquote, .prose table { margin: 0 0 12px; }
73
+ .prose ul, .prose ol { padding-inline-start: 20px; }
74
+ .prose a { color: var(--yuva-brand); }
75
+ .prose img { max-inline-size: 100%; block-size: auto; border-radius: 8px; }
76
+ .prose code { font-family: var(--yuva-mono); font-size: 13px; padding: 1px 4px; border-radius: 4px; background: var(--yuva-deep); }
77
+ .prose pre { padding: 10px; border-radius: 8px; background: var(--yuva-deep); overflow-x: auto; }
78
+ .prose pre code { padding: 0; background: none; }
79
+ .prose blockquote { padding-inline-start: 12px; border-inline-start: 2px solid var(--yuva-strong); color: var(--yuva-muted); }
80
+ .prose table { display: block; overflow-x: auto; border-collapse: collapse; }
81
+ .prose th, .prose td { padding: 4px 8px; border: 1px solid var(--yuva-border); text-align: start; }
82
+ .rm-top { gap: 12px; }
83
+ .rm-head { display: flex; align-items: center; gap: 12px; }
84
+ .rm-head .hint { flex: 1; min-inline-size: 0; font-size: 13px; }
85
+ .pill.suggest { flex: none; margin-inline-start: auto; gap: 6px; min-block-size: 36px; font-size: 13px; font-weight: 500; }
86
+ .tabs { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; border-block-end: 1px solid var(--yuva-border); margin-inline: -8px; }
87
+ .tabs button { position: relative; display: flex; align-items: center; justify-content: center; min-block-size: 44px; padding: 0; border: 0; border-block-end: 2px solid transparent; margin-block-end: -1px; background: transparent; color: var(--yuva-faint); cursor: pointer; }
88
+ .tabs button:hover { color: var(--yuva-muted); }
89
+ .tabs button::after { content: attr(data-tip); position: absolute; inset-block-start: calc(100% + 6px); left: 50%; transform: translateX(-50%); z-index: 2; padding: 4px 8px; border-radius: 6px; background: var(--yuva-fg); color: var(--yuva-bg); font-family: var(--yuva-mono); font-size: 11px; letter-spacing: 0.04em; text-transform: uppercase; white-space: nowrap; pointer-events: none; opacity: 0; transition: opacity 0.12s; }
90
+ .tabs button:first-child::after { left: auto; inset-inline-start: 4px; transform: none; }
91
+ .tabs button:last-child::after { left: auto; inset-inline-end: 4px; transform: none; }
92
+ .tabs button:hover::after, .tabs button:focus-visible::after { opacity: 1; }
93
+ .tabs button[aria-selected="true"] { color: var(--yuva-fg); border-block-end-color: var(--yuva-brand); }
94
+ .rm-list { padding-block-start: 4px; }
95
+ .ideas { display: flex; flex-direction: column; }
96
+ .idea { display: flex; gap: 14px; padding-block: 14px; border-block-end: 1px solid var(--yuva-border); }
97
+ .idea:last-child { border-block-end: 0; }
98
+ .vote { flex: none; inline-size: 48px; min-block-size: 52px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; padding: 0; border: 1px solid var(--yuva-strong); border-radius: 10px; background: transparent; color: var(--yuva-muted); cursor: pointer; }
99
+ .vote span { font-family: var(--yuva-mono); font-size: 12px; font-weight: 500; }
100
+ .vote[aria-pressed="true"] { background: var(--yuva-wash); border-color: var(--yuva-brand); color: var(--yuva-brand); }
101
+ .vote:disabled { cursor: default; opacity: 0.7; }
102
+ .idea-text { flex: 1; min-inline-size: 0; display: flex; flex-direction: column; align-items: flex-start; gap: 4px; padding: 0; border: 0; background: transparent; color: inherit; text-align: start; cursor: pointer; }
103
+ .idea-text b { font-weight: 500; overflow-wrap: anywhere; }
104
+ .idea-text:hover b { text-decoration: underline; }
105
+ .idea .lede { font-size: 13px; color: var(--yuva-muted); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; overflow-wrap: anywhere; }
106
+ .meta { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; font-size: 12px; color: var(--yuva-faint); }
107
+ .badge-line, .stage, .tag { font-family: var(--yuva-mono); font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase; padding: 2px 6px; border: 1px solid var(--yuva-strong); border-radius: 4px; }
108
+ .badge-line { color: var(--yuva-warn); border-color: currentColor; }
109
+ .stage { color: var(--yuva-brand); border-color: currentColor; }
110
+ .idea-top { display: flex; gap: 14px; align-items: flex-start; }
111
+ .idea-head { flex: 1; min-inline-size: 0; display: flex; flex-direction: column; gap: 8px; }
112
+ .reply { display: flex; flex-direction: column; gap: 4px; padding-block: 10px; border-block-end: 1px solid var(--yuva-border); }
113
+ .reply:last-of-type { border-block-end: 0; }
114
+ .who-line { display: flex; align-items: center; gap: 8px; }
115
+ .wn-list { padding-block-start: 0; }
116
+ .wn-entry { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; inline-size: 100%; padding: 16px 0; border: 0; border-block-end: 1px solid var(--yuva-border); background: transparent; color: inherit; text-align: start; cursor: pointer; }
117
+ .wn-entry b { font-size: 15px; font-weight: 500; overflow-wrap: anywhere; }
118
+ .wn-entry:hover b { text-decoration: underline; }
119
+ .wn-lede { font-size: 13px; color: var(--yuva-muted); overflow-wrap: anywhere; }
120
+ .wn-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; font-family: var(--yuva-mono); font-size: 11px; letter-spacing: 0.06em; text-transform: uppercase; }
121
+ .wn-meta .unread-dot { margin: 0; inline-size: 7px; block-size: 7px; }
122
+ .wn-date { color: var(--yuva-faint); }
123
+ .wn-label { padding: 2px 6px; border-radius: 4px; background: var(--yuva-deep); color: var(--yuva-fg); }
124
+ .wn-label.new { background: var(--yuva-wash); color: var(--yuva-brand); }
125
+ .wn-label.fixed { color: var(--yuva-muted); }
126
+ .wn-image { display: block; max-inline-size: 100%; block-size: auto; border-radius: 10px; border: 1px solid var(--yuva-border); }
127
+ .who-line b { font-weight: 500; }
128
+ `;var tokenMinimumAge=2100;function subscribeApp(context,t,root){let{client,locale}=context,lists=[],token="",tokenAt=0,loaded=!1,failed=!1,phase="idle",confirmation=!1,error="",emailError="",consentError="",destroyed=!1,chosen=new Set,email=el("input","field");email.type="email",email.autocomplete="email",email.value=client.session?.contact.email??"",email.placeholder=t({id:"njBr8W"}),email.setAttribute("aria-label",t({id:"XJURKP"}));let consent=el("input");consent.type="checkbox",consent.id="yuva-consent",consent.addEventListener("change",()=>{consentError="",render()});function selected(){return lists.filter((list)=>chosen.has(list.id))}function consentText(items){let list=new Intl.ListFormat(locale,{type:"conjunction"}).format(items.map((item)=>item.name)),inbox=context.inbox.name;return t({id:"dMJfG5",values:{list,inbox}})}async function load(){try{let result=await client.lists();lists=result.lists,token=result.form_token,tokenAt=Date.now();for(let list of lists)chosen.add(list.id)}catch{failed=!0}loaded=!0,render()}async function submit(){if(phase!=="idle")return;let items=selected(),address=email.value.trim();if(error=items.length===0?t({id:"-g5O6h"}):"",emailError=email.checkValidity()&&address?"":t({id:"E_qvzP"}),consentError=consent.checked?"":t({id:"lDEbTy"}),error||emailError||consentError){render();return}phase="sending",render();let send=async(retry)=>{let wait=tokenAt+tokenMinimumAge-Date.now();if(wait>0)await new Promise((resolve)=>setTimeout(resolve,wait));try{confirmation=(await client.subscribe({email:address,list_ids:items.map((item)=>item.id),locale,page_url:location.href.split("#")[0].slice(0,2000),consent_text:consentText(items),form_token:token})).confirmation}catch(failure){if(retry&&failure instanceof ApiError2&&failure.code==="form_token")return token=(await client.lists()).form_token,tokenAt=Date.now(),send(!1);throw failure}};try{await send(!0),phase="done"}catch(failure){if(phase="idle",failure instanceof ApiError2&&failure.code==="invalid_email")emailError=t({id:"E_qvzP"});else error=failure instanceof ApiError2&&failure.code==="rate_limited"?t({id:"tzsBOP"}):failure instanceof ApiError2&&failure.code==="network"?t({id:"GQVIIl"}):t({id:"jWgNnM"})}if(!destroyed)render()}function render(){if(destroyed)return;let sec=el("section","sec");if(sec.append(el("h2","label",`01 — ${t({id:"7kOr80"})}`)),!loaded)sec.append(el("p","hint",t({id:"Pwqkdw"})));else if(failed||lists.length===0)sec.append(el("p","hint",t({id:"jWgNnM"})));else if(phase==="done"){let card=el("div","done-card");card.insertAdjacentHTML("beforeend",icons.check),card.append(el("p","empty",confirmation?t({id:"y3k2zM"}):t({id:"rgySXy"}))),sec.append(card)}else{let form=el("form","form");form.noValidate=!0,form.addEventListener("submit",(event)=>{event.preventDefault(),submit()});let row=el("div","row2"),button=el("button","btn",phase==="sending"?t({id:"1w51t9"}):t({id:"EDl9kS"}));if(button.type="submit",button.disabled=phase==="sending",row.append(email,button),form.append(row),emailError)form.append(el("p","error",emailError));if(lists.length>1){let group=el("div","lists");group.setAttribute("role","group"),group.setAttribute("aria-label",t({id:"h16FyT"}));for(let list of lists){let label=el("label","check"),box=el("input");box.type="checkbox",box.checked=chosen.has(list.id),box.addEventListener("change",()=>{if(box.checked)chosen.add(list.id);else chosen.delete(list.id);error="",render()});let text=el("span");if(text.append(el("b","",list.name)),list.description)text.append(list.description);label.append(box,text),group.append(label)}form.append(group)}let agree=el("label","check");if(agree.htmlFor=consent.id,agree.append(consent,el("span","",consentText(selected().length>0?selected():lists))),form.append(agree),consentError)form.append(el("p","error",consentError));if(error)form.append(el("p","error",error));sec.append(form)}root.replaceChildren(sec)}return render(),load(),()=>{destroyed=!0}}var pageSize2=20;function whatsNewApp(context,t,root){let{client,locale}=context,since=updatesSince(readStored(client.channel).whats_new_seen),items=[],stack=[],screen=context.params.entry?{kind:"entry",id:context.params.entry}:{kind:"list"};if(context.params.entry)stack.push({kind:"list"});let cursor,loading=!1,loaded=!1,failed=!1,single={},destroyed=!1,labelText=(label)=>label==="new"?t({id:"isRobC"}):label==="improved"?t({id:"5j51A1"}):t({id:"TpqW74"});function dateText(value){let at=new Date(value);return new Intl.DateTimeFormat(locale,at.getFullYear()===new Date().getFullYear()?{month:"short",day:"numeric"}:{year:"numeric",month:"short",day:"numeric"}).format(at)}function markSeen(){let newest=items.reduce((latest,entry)=>Math.max(latest,Date.parse(entry.published_at)),0);if(!newest||newest<=since)return;let stored=readStored(client.channel);if(stored.whats_new_seen&&Date.parse(stored.whats_new_seen)>=newest)return;writeStored(client.channel,{...stored,whats_new_seen:new Date(newest).toISOString()}),context.seenUpdates()}function meta(entry){let line=el("div","wn-meta");for(let label of entry.labels)line.append(el("span",`wn-label ${label}`,labelText(label)));if(line.append(el("span","wn-date",dateText(entry.published_at))),Date.parse(entry.published_at)>since){let dot=el("span","unread-dot");dot.setAttribute("role","img"),dot.setAttribute("aria-label",t({id:"KuVpz-"})),line.append(dot)}return line}async function load(more){if(loading)return;loading=!0,failed=!1,render();try{let page=await client.whatsNew({locale,limit:pageSize2,cursor:more?cursor:void 0}),known=new Set(items.map((entry)=>entry.id));items.push(...page.items.filter((entry)=>!known.has(entry.id))),cursor=page.next_cursor,loaded=!0,markSeen()}catch{failed=!0}loading=!1,render()}async function loadEntry(id){single={};let known=items.find((entry)=>entry.id===id);if(known)return single={entry:known},render();render();try{single={entry:await client.whatsNewEntry(id,{locale})}}catch{single={failed:!0}}render()}function go(next){if(stack.push(screen),screen=next,next.kind==="entry")loadEntry(next.id);render(),root.scrollTop=0}function back(){let previous=stack.pop();if(!previous)return context.back();screen=previous,render(),root.scrollTop=0}function notice(text,retry){let sec=el("section","sec");if(sec.append(el("p",retry?"empty":"hint",text)),retry)sec.append(textButton(t({id:"KDw4GX"}),"primary",retry));return sec}function listNodes(){if(failed&&items.length===0)return[notice(t({id:"5isRv0"}),()=>void load(!1))];if(items.length===0)return[notice(loaded?t({id:"xwh17S"}):t({id:"Pwqkdw"}))];let list=el("section","sec wn-list");for(let entry of items){let row=el("button","wn-entry");row.type="button";let title=el("b","",entry.title);if(title.dir="auto",row.append(meta(entry),title),entry.excerpt){let lede=el("span","wn-lede",entry.excerpt);lede.dir="auto",row.append(lede)}row.addEventListener("click",()=>go({kind:"entry",id:entry.id})),list.append(row)}if(cursor)list.append(textButton(loading?t({id:"Pwqkdw"}):t({id:"yQ2kGp"}),"link brand",()=>void load(!0)));if(failed)list.append(el("p","error",t({id:"5isRv0"})));return[list,el("div","fill")]}function entryNodes(id){if(single.failed)return[notice(t({id:"5isRv0"}),()=>void loadEntry(id))];let entry=single.entry;if(!entry)return[notice(t({id:"Pwqkdw"}))];let sec=el("section","sec"),title=el("h1","article-title",entry.title);if(title.dir="auto",sec.append(meta(entry),title),entry.image){let image=el("img","wn-image");image.src=entry.image.url,image.alt="",image.width=entry.image.width,image.height=entry.image.height,image.loading="lazy",sec.append(image)}sec.append(article(entry.html));let link=el("a","link brand",t({id:"HQrBQl"}));return link.href=entry.url,link.target="_blank",link.rel="noopener noreferrer",sec.append(link),[sec,el("div","fill")]}function backRow(){let sec=el("div","hback"),button=textButton("","link soft",back);return button.insertAdjacentHTML("beforeend",icons.back),button.append(t({id:"iH8pgl"})),sec.append(button),sec}function render(){if(destroyed)return;let nodes=[];if(screen.kind==="list")nodes.push(...listNodes());else nodes.push(backRow(),...entryNodes(screen.id));let scroll=root.scrollTop;root.replaceChildren(...nodes),root.scrollTop=scroll}if(screen.kind==="entry")loadEntry(screen.id);return load(!1),()=>{destroyed=!0}}var apps={feedback:feedbackApp,help:helpApp,roadmap:roadmapApp,status:statusApp,subscribe:subscribeApp,"whats-new":whatsNewApp},loadMessages=(locale)=>typeof YUVA_APPS_LOCALES==="string"?import(new URL(localeFile(YUVA_APPS_LOCALES,locale),import.meta.url).href).then((module)=>module.messages).catch(()=>messages):import("./apps-5c2vy32k.js").then((module)=>module.catalogs[locale]??messages),localeFile=(map,locale)=>JSON.parse(map)[locale]??"about:blank";async function mountApp(kind,context){let messages2=await loadMessages(context.locale),t=(descriptor)=>translate(messages2,descriptor,messages),element=el("div","app"),page=el("div","page"),fallback=addStyles(context.root,styles);element.append(...fallback?[fallback]:[],page);let destroy=apps[kind](context,t,page);return{element,destroy}}export{mountApp};
package/dist/esm/chat.js CHANGED
@@ -1,33 +1,49 @@
1
- import{resolveLocale,catalogFor,translatePlain}from"./index-ceev0134.js";import{launcherOf,contrastOn,readStored,writeStored}from"./index-8f1n6nzn.js";import{directionOf,addStyles}from"./index-3wpqkv7x.js";var styles=`
1
+ import{countUpdates}from"./index-kf733km6.js";import{resolveLocale,catalogFor,translatePlain}from"./index-0b3zs3hm.js";import{launcherOf,contrastOn,readStored,writeStored}from"./index-8f1n6nzn.js";import{directionOf,addStyles}from"./index-4mayxpxs.js";var styles=`
2
2
  :host {
3
3
  --yuva-accent: #2563eb;
4
4
  --yuva-on-accent: #ffffff;
5
5
  --yuva-bg: #ffffff;
6
- --yuva-fg: #111827;
7
- --yuva-muted: #6b7280;
8
- --yuva-border: #e5e7eb;
9
- --yuva-soft: #f3f4f6;
6
+ --yuva-deep: #f7f7f8;
7
+ --yuva-fg: #0b0b0f;
8
+ --yuva-muted: #52525b;
9
+ --yuva-faint: #71717a;
10
+ --yuva-border: #ececef;
11
+ --yuva-strong: #d4d4d8;
12
+ --yuva-ok: #15803d;
13
+ --yuva-warn: #d97706;
14
+ --yuva-info: #2563eb;
10
15
  --yuva-danger: #dc2626;
16
+ --yuva-brand: var(--yuva-accent);
17
+ --yuva-wash: color-mix(in srgb, var(--yuva-accent) 9%, var(--yuva-bg));
11
18
  --yuva-shadow: 0 12px 40px rgb(15 23 42 / 0.18);
19
+ --yuva-font: "Geist", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
20
+ --yuva-mono: "Geist Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
12
21
  color-scheme: light;
13
22
  position: fixed;
14
23
  bottom: 20px;
15
24
  right: 20px;
16
25
  z-index: 2147483000;
17
- font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
18
- font-size: 15px;
26
+ font-family: var(--yuva-font);
27
+ font-size: 14px;
19
28
  line-height: 1.45;
20
29
  color: var(--yuva-fg);
21
30
  }
22
31
  :host([position="left"]) { right: auto; left: 20px; }
23
32
  @media (prefers-color-scheme: dark) {
24
33
  :host {
25
- --yuva-bg: #1c1f24;
26
- --yuva-fg: #f3f4f6;
27
- --yuva-muted: #9ca3af;
28
- --yuva-border: #30343b;
29
- --yuva-soft: #2a2e35;
34
+ --yuva-bg: #09090b;
35
+ --yuva-deep: #121216;
36
+ --yuva-fg: #fafafa;
37
+ --yuva-muted: #a1a1aa;
38
+ --yuva-faint: #8a8a93;
39
+ --yuva-border: #1f1f23;
40
+ --yuva-strong: #3a3a41;
41
+ --yuva-ok: #4ade80;
42
+ --yuva-warn: #facc15;
43
+ --yuva-info: #60a5fa;
30
44
  --yuva-danger: #f87171;
45
+ --yuva-brand: color-mix(in srgb, var(--yuva-accent) 60%, #ffffff);
46
+ --yuva-wash: color-mix(in srgb, var(--yuva-accent) 18%, var(--yuva-bg));
31
47
  --yuva-shadow: 0 12px 40px rgb(0 0 0 / 0.5);
32
48
  color-scheme: dark;
33
49
  }
@@ -78,15 +94,16 @@ import{resolveLocale,catalogFor,translatePlain}from"./index-ceev0134.js";import{
78
94
  box-sizing: border-box;
79
95
  background: var(--yuva-bg);
80
96
  border: 1px solid var(--yuva-border);
81
- border-radius: 16px;
97
+ border-radius: 12px;
98
+ position: relative;
82
99
  }
83
100
  .panel[hidden] { display: none; }
84
101
  :host(:not([layout="embedded"])) .panel {
85
102
  position: absolute;
86
103
  bottom: 72px;
87
104
  right: 0;
88
- inline-size: min(380px, calc(100vw - 32px));
89
- block-size: min(600px, calc(100vh - 112px));
105
+ inline-size: min(400px, calc(100vw - 32px));
106
+ block-size: min(720px, calc(100vh - 112px));
90
107
  box-shadow: var(--yuva-shadow);
91
108
  }
92
109
  :host([position="left"]:not([layout="embedded"])) .panel { right: auto; left: 0; }
@@ -106,4 +123,4 @@ import{resolveLocale,catalogFor,translatePlain}from"./index-ceev0134.js";import{
106
123
  block-size: 100%;
107
124
  min-block-size: 320px;
108
125
  }
109
- `,chatIcon='<svg width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" aria-hidden="true"><path d="M4 5h16v11H9l-5 4z"/></svg>',closeIcon='<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M6 6l12 12M18 6L6 18"/></svg>',scriptSrc=document.currentScript instanceof HTMLScriptElement?document.currentScript.src:"";class YuvaChatElement extends HTMLElement{static observedAttributes=["channel","server","layout","locale","dir","identity-token","open"];static loadPanel=()=>import(new URL("yuva-chat.js",scriptSrc||location.href).href);#root;#launcher=null;#badge=null;#panel;#controller=null;#messages={};#open=!1;#unread=0;#identity=null;#refused=!1;constructor(){super();this.#root=this.attachShadow({mode:"open"}),this.#panel=document.createElement("section"),this.#panel.className="panel",this.#panel.setAttribute("role","dialog"),this.#panel.hidden=!0,this.#panel.addEventListener("keydown",(event)=>{if(event.key==="Escape"&&this.layout==="launcher")this.close()})}get layout(){return this.getAttribute("layout")==="embedded"?"embedded":"launcher"}get channel(){return this.getAttribute("channel")}get server(){return(this.getAttribute("server")||(scriptSrc?new URL(scriptSrc).origin:location.origin)).replace(/\/+$/,"")}get locale(){return resolveLocale(this.getAttribute("locale"),navigator.language)}get isOpen(){return this.#open}get unread(){return this.#unread}setIdentityToken(source){if(this.#identity=source,this.#controller)this.#controller.then((controller)=>controller.identityChanged())}async signOut(){if(this.#identity=null,this.removeAttribute("identity-token"),this.#controller)await(await this.#controller).signOut()}async rate(conversationId,rating,comment){return(await this.#ensureController()).rate(conversationId,rating,comment)}connectedCallback(){this.#render();let channel=this.channel;if(this.layout==="embedded"||this.hasAttribute("open")||!channel)return;let stored=readStored(channel);if(stored.launcher)this.#applyLauncher(stored.launcher);let idle=()=>{if(!this.isConnected||this.#controller||this.channel!==channel)return;if(stored.session)this.#ensureController();else this.#styleLauncher(channel)};if("requestIdleCallback"in window)requestIdleCallback(idle,{timeout:3000});else setTimeout(idle,1000)}#styleLauncher(channel){fetch(`${this.server}/client/v1/channels/${encodeURIComponent(channel)}`,{credentials:"omit"}).then((response)=>{if(response.status===403||response.status===404)this.#refuse();return response.ok?response.json():null}).then((inbox)=>{if(!inbox||this.channel!==channel||this.#controller)return;let launcher=launcherOf(inbox);this.#applyLauncher(launcher),writeStored(channel,{...readStored(channel),launcher})}).catch(()=>{return})}disconnectedCallback(){let controller=this.#controller;if(this.#controller=null,controller)controller.then((c)=>c.destroy())}attributeChangedCallback(name,previous,value){if(!this.isConnected||previous===value)return;if(name==="open"){value===null?this.close():this.open();return}if(name==="identity-token"){if(this.#controller)this.#controller.then((controller)=>controller.identityChanged());return}if(name==="channel"||name==="server"){this.disconnectedCallback(),this.#refused=!1,this.#render();return}if(this.#render(),this.#controller)this.#controller.then((controller)=>controller.update())}async open(){if(this.#open||this.#refused)return;this.#open=!0,this.toggleAttribute("open-panel",!0),this.#syncLauncher();let controller=await this.#ensureController();if(!this.#open)return;if(this.#panel.hidden=!1,controller.opened(),this.layout!=="embedded")this.dispatchEvent(new Event("yuva-open",{bubbles:!0,composed:!0}))}close(){if(!this.#open||this.layout==="embedded")return;if(this.#open=!1,this.toggleAttribute("open-panel",!1),this.#panel.hidden=!0,this.#syncLauncher(),this.#launcher?.focus(),this.#controller)this.#controller.then((controller)=>controller.closed())}toggle(){return this.#open?this.close():this.open()}#config(){return{channel:this.channel,server:this.server,layout:this.layout,locale:this.locale}}#ensureController(){return this.#controller??=YuvaChatElement.loadPanel().then(({mount})=>mount({panel:this.#panel,config:()=>this.#config(),identityToken:async()=>this.#identity?await this.#identity()??null:this.getAttribute("identity-token"),isOpen:()=>this.#open,close:()=>this.close(),setUnread:(count)=>{this.#unread=count,this.#syncLauncher(),this.dispatchEvent(new CustomEvent("yuva-unread",{detail:{count}}))},setLauncher:(style)=>this.#applyLauncher(style),refused:()=>this.#refuse()})),this.#controller}#refuse(){if(this.#refused)return;this.#refused=!0,console.warn(`Yuva: channel ${this.channel} is unknown or does not allow ${location.origin}`),this.#open=!1,this.toggleAttribute("open-panel",!1),this.disconnectedCallback(),this.#render()}#applyLauncher(style){if(this.setAttribute("position",style.position==="left"?"left":"right"),style.color&&/^#[0-9a-f]{6}$/i.test(style.color))this.style.setProperty("--yuva-accent",style.color),this.style.setProperty("--yuva-on-accent",contrastOn(style.color))}#render(){let locale=this.locale;this.#messages=catalogFor(locale),this.setAttribute("lang",locale);let fallbackStyle=addStyles(this.#root,styles),head=fallbackStyle?[fallbackStyle]:[];if(this.#panel.dir=this.getAttribute("dir")??directionOf(locale),this.#panel.setAttribute("aria-modal","false"),this.#refused){this.#launcher=null,this.#badge=null,this.#root.replaceChildren();return}if(this.layout==="embedded"){this.#launcher=null,this.#badge=null,this.#root.replaceChildren(...head,this.#panel),this.#open=!1,this.open();return}let launcher=document.createElement("button");if(launcher.type="button",launcher.className="launcher",launcher.addEventListener("click",()=>void this.toggle()),this.#launcher=launcher,this.#badge=document.createElement("span"),this.#badge.className="badge",this.#badge.setAttribute("aria-hidden","true"),this.#root.replaceChildren(...head,this.#panel,launcher),this.#syncLauncher(),this.hasAttribute("open")&&!this.#open)this.open()}#syncLauncher(){let launcher=this.#launcher,badge=this.#badge;if(!launcher||!badge)return;let count=this.#unread;launcher.setAttribute("aria-expanded",String(this.#open)),launcher.setAttribute("aria-label",this.#open?translatePlain(this.#messages,{id:"pqZJT2"}):count>0?translatePlain(this.#messages,{id:"OkHvGB",values:{count}}):translatePlain(this.#messages,{id:"6I7cJR"})),launcher.innerHTML=this.#open?closeIcon:chatIcon,badge.textContent=count>9?"9+":String(count),badge.hidden=this.#open||count===0,launcher.append(badge)}}function define(){if(!customElements.get("yuva-chat"))customElements.define("yuva-chat",YuvaChatElement)}YuvaChatElement.loadPanel=()=>import("./yuva-chat-9hx7wb3q.js");define();export{YuvaChatElement,define};
126
+ `,chatIcon='<svg width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" aria-hidden="true"><path d="M4 5h16v11H9l-5 4z"/></svg>',closeIcon='<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M6 6l12 12M18 6L6 18"/></svg>',scriptSrc=document.currentScript instanceof HTMLScriptElement?document.currentScript.src:"";class YuvaChatElement extends HTMLElement{static observedAttributes=["channel","server","layout","locale","dir","identity-token","open"];static loadPanel=()=>import(new URL("yuva-chat.js",scriptSrc||location.href).href);#root;#launcher=null;#badge=null;#panel;#controller=null;#messages={};#open=!1;#unread=0;#updates=0;#identity=null;#refused=!1;constructor(){super();this.#root=this.attachShadow({mode:"open"}),this.#panel=document.createElement("section"),this.#panel.className="panel",this.#panel.setAttribute("role","dialog"),this.#panel.hidden=!0,this.#panel.addEventListener("keydown",(event)=>{if(event.key==="Escape"&&this.layout==="launcher")this.close()})}get layout(){return this.getAttribute("layout")==="embedded"?"embedded":"launcher"}get channel(){return this.getAttribute("channel")}get server(){return(this.getAttribute("server")||(scriptSrc?new URL(scriptSrc).origin:location.origin)).replace(/\/+$/,"")}get locale(){return resolveLocale(this.getAttribute("locale"),navigator.language)}get isOpen(){return this.#open}get unread(){return this.#unread}setIdentityToken(source){if(this.#identity=source,this.#controller)this.#controller.then((controller)=>controller.identityChanged())}async signOut(){if(this.#identity=null,this.removeAttribute("identity-token"),this.#controller)await(await this.#controller).signOut()}async rate(conversationId,rating,comment){return(await this.#ensureController()).rate(conversationId,rating,comment)}async openApp(kind,params){if(await this.open(),!this.#open)return;await(await this.#ensureController()).openApp(kind,params)}connectedCallback(){this.#render();let channel=this.channel;if(this.layout==="embedded"||this.hasAttribute("open")||!channel)return;let stored=readStored(channel);if(stored.launcher)this.#applyLauncher(stored.launcher);let idle=()=>{if(!this.isConnected||this.#controller||this.channel!==channel)return;if(stored.session)this.#ensureController();else this.#styleLauncher(channel)};if("requestIdleCallback"in window)requestIdleCallback(idle,{timeout:3000});else setTimeout(idle,1000)}#styleLauncher(channel){fetch(`${this.server}/client/v1/channels/${encodeURIComponent(channel)}`,{credentials:"omit"}).then((response)=>{if(response.status===403||response.status===404)this.#refuse();return response.ok?response.json():null}).then((inbox)=>{if(!inbox||this.channel!==channel||this.#controller)return;let launcher=launcherOf(inbox);if(this.#applyLauncher(launcher),writeStored(channel,{...readStored(channel),launcher}),inbox.chat.announce_updates)countUpdates(this.server,channel,inbox,this.locale).then((count)=>{if(this.#controller||this.channel!==channel)return;this.#updates=count,this.#syncLauncher()}).catch(()=>{return})}).catch(()=>{return})}disconnectedCallback(){let controller=this.#controller;if(this.#controller=null,controller)controller.then((c)=>c.destroy())}attributeChangedCallback(name,previous,value){if(!this.isConnected||previous===value)return;if(name==="open"){value===null?this.close():this.open();return}if(name==="identity-token"){if(this.#controller)this.#controller.then((controller)=>controller.identityChanged());return}if(name==="channel"||name==="server"){this.disconnectedCallback(),this.#refused=!1,this.#render();return}if(this.#render(),this.#controller)this.#controller.then((controller)=>controller.update())}async open(){if(this.#open||this.#refused)return;this.#open=!0,this.toggleAttribute("open-panel",!0),this.#syncLauncher();let controller=await this.#ensureController();if(!this.#open)return;if(this.#panel.hidden=!1,controller.opened(),this.layout!=="embedded")this.dispatchEvent(new Event("yuva-open",{bubbles:!0,composed:!0}))}close(){if(!this.#open||this.layout==="embedded")return;if(this.#open=!1,this.toggleAttribute("open-panel",!1),this.#panel.hidden=!0,this.#syncLauncher(),this.#launcher?.focus(),this.#controller)this.#controller.then((controller)=>controller.closed())}toggle(){return this.#open?this.close():this.open()}#config(){return{channel:this.channel,server:this.server,layout:this.layout,locale:this.locale}}#ensureController(){return this.#controller??=YuvaChatElement.loadPanel().then(({mount})=>mount({panel:this.#panel,config:()=>this.#config(),identityToken:async()=>this.#identity?await this.#identity()??null:this.getAttribute("identity-token"),isOpen:()=>this.#open,close:()=>this.close(),setUnread:(count)=>{this.#unread=count,this.#syncLauncher(),this.dispatchEvent(new CustomEvent("yuva-unread",{detail:{count}}))},setUpdates:(count)=>{this.#updates=count,this.#syncLauncher()},setLauncher:(style)=>this.#applyLauncher(style),refused:()=>this.#refuse()})).then(async(controller)=>(await controller.ready,controller)),this.#controller}#refuse(){if(this.#refused)return;this.#refused=!0,console.warn(`Yuva: channel ${this.channel} is unknown or does not allow ${location.origin}`),this.#open=!1,this.toggleAttribute("open-panel",!1),this.disconnectedCallback(),this.#render()}#applyLauncher(style){if(this.setAttribute("position",style.position==="left"?"left":"right"),style.color&&/^#[0-9a-f]{6}$/i.test(style.color))this.style.setProperty("--yuva-accent",style.color),this.style.setProperty("--yuva-on-accent",contrastOn(style.color))}#render(){let locale=this.locale;this.#messages=catalogFor(locale),this.setAttribute("lang",locale);let fallbackStyle=addStyles(this.#root,styles),head=fallbackStyle?[fallbackStyle]:[];if(this.#panel.dir=this.getAttribute("dir")??directionOf(locale),this.#panel.setAttribute("aria-modal","false"),this.#refused){this.#launcher=null,this.#badge=null,this.#root.replaceChildren();return}if(this.layout==="embedded"){this.#launcher=null,this.#badge=null,this.#root.replaceChildren(...head,this.#panel),this.#open=!1,this.open();return}let launcher=document.createElement("button");if(launcher.type="button",launcher.className="launcher",launcher.addEventListener("click",()=>void this.toggle()),this.#launcher=launcher,this.#badge=document.createElement("span"),this.#badge.className="badge",this.#badge.setAttribute("aria-hidden","true"),this.#root.replaceChildren(...head,this.#panel,launcher),this.#syncLauncher(),this.hasAttribute("open")&&!this.#open)this.open()}#syncLauncher(){let launcher=this.#launcher,badge=this.#badge;if(!launcher||!badge)return;let unread=this.#unread,count=unread>0?unread:this.#updates;launcher.setAttribute("aria-expanded",String(this.#open)),launcher.setAttribute("aria-label",this.#open?translatePlain(this.#messages,{id:"pqZJT2"}):unread>0?translatePlain(this.#messages,{id:"OkHvGB",values:{count}}):count>0?translatePlain(this.#messages,{id:"TidMpF",values:{count}},void 0,this.locale):translatePlain(this.#messages,{id:"6I7cJR"})),launcher.innerHTML=this.#open?closeIcon:chatIcon,badge.textContent=count>9?"9+":String(count),badge.hidden=this.#open||count===0,launcher.append(badge)}}function define(){if(!customElements.get("yuva-chat"))customElements.define("yuva-chat",YuvaChatElement)}YuvaChatElement.loadPanel=()=>import("./yuva-chat-j6fbj8y2.js");define();export{YuvaChatElement,define};
@@ -1 +1 @@
1
- import{storageKey2,readerStorageKey2,randomId2,YuvaClient2,createYuvaClient2}from"./index-6brgxahe.js";export{YuvaClient2 as YuvaClient,createYuvaClient2 as createYuvaClient,randomId2 as randomId,readerStorageKey2 as readerStorageKey,storageKey2 as storageKey};
1
+ import{storageKey2,readerStorageKey2,randomId2,YuvaClient2,createYuvaClient2}from"./index-69xd7mjq.js";export{YuvaClient2 as YuvaClient,createYuvaClient2 as createYuvaClient,randomId2 as randomId,readerStorageKey2 as readerStorageKey,storageKey2 as storageKey};