useyuva 0.0.7 → 0.0.8

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.
@@ -1,9 +1,11 @@
1
1
  import type { MessageDescriptor } from "@lingui/core";
2
2
  import { type ClientInbox } from "../client/api.js";
3
3
  import { type IdentityTokenSource, type YuvaClient } from "../client/client.js";
4
+ import { el } from "./dom.js";
5
+ export { el };
4
6
  declare const Base: typeof HTMLElement;
7
+ export declare const scriptSrc: string;
5
8
  export declare const baseStyles = "\n:host {\n --yuva-accent: #2563eb;\n --yuva-on-accent: #ffffff;\n --yuva-border: rgb(127 127 127 / 0.35);\n --yuva-soft: rgb(127 127 127 / 0.1);\n --yuva-danger: #dc2626;\n display: block;\n color: inherit;\n font: inherit;\n line-height: 1.5;\n}\n:host([hidden]) { display: none; }\n@media (prefers-color-scheme: dark) {\n :host { --yuva-danger: #f87171; }\n}\n[hidden] { display: none !important; }\n* { box-sizing: border-box; }\np { margin: 0; }\n.muted { opacity: 0.72; font-size: 0.9em; }\n.error { color: var(--yuva-danger); font-size: 0.9em; }\nform { display: flex; flex-direction: column; gap: 8px; }\ntextarea, input {\n inline-size: 100%;\n padding: 8px 10px;\n border: 1px solid var(--yuva-border);\n border-radius: 8px;\n background: transparent;\n color: inherit;\n font: inherit;\n}\ntextarea { resize: vertical; min-block-size: 72px; }\ntextarea:focus-visible, input:focus-visible { outline: 2px solid var(--yuva-accent); outline-offset: -1px; border-color: transparent; }\n.actions { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; justify-content: flex-end; }\n.send {\n padding: 8px 14px;\n border: 0;\n border-radius: 8px;\n background: var(--yuva-accent);\n color: var(--yuva-on-accent);\n font: inherit;\n font-weight: 600;\n cursor: pointer;\n}\n.send:disabled { opacity: 0.6; cursor: default; }\n.send:focus-visible, .link:focus-visible { outline: 2px solid var(--yuva-accent); outline-offset: 2px; }\n.link { padding: 0; border: 0; background: none; color: inherit; font: inherit; text-decoration: underline; cursor: pointer; opacity: 0.8; }\n@media (max-width: 480px) { textarea, input { font-size: 16px; } }\n";
6
- export declare function el<K extends keyof HTMLElementTagNameMap>(tag: K, className?: string, text?: string): HTMLElementTagNameMap[K];
7
9
  export declare abstract class YuvaDocsElement extends Base {
8
10
  #private;
9
11
  static observedAttributes: string[];
@@ -39,4 +41,3 @@ export declare abstract class YuvaDocsElement extends Base {
39
41
  protected errorText(error: unknown): string;
40
42
  protected frame(css: string, ...children: Node[]): void;
41
43
  }
42
- export {};
@@ -0,0 +1 @@
1
+ export declare function defineDocs(): void;
@@ -1,20 +1,11 @@
1
- import { type Discussion, type DiscussionPost } from "../client/api.js";
1
+ import { type Discussion } from "../client/api.js";
2
2
  import type { ReaderSession } from "../client/reader.js";
3
3
  import { YuvaDocsElement } from "./base.js";
4
- export interface DiscussionDetailEvent {
5
- page: string;
6
- discussion_id: string;
7
- state: Discussion["state"];
8
- }
9
- export interface DiscussionPostDetail {
10
- page: string;
11
- discussion_id: string;
12
- post_id: string;
13
- state: DiscussionPost["state"];
14
- }
4
+ export type { DiscussionDetailEvent, DiscussionPostDetail } from "./thread.js";
5
+ export type ThreadModule = typeof import("./thread.js");
15
6
  export declare class YuvaDiscussionsElement extends YuvaDocsElement {
16
7
  #private;
17
- constructor();
8
+ static loadThread: () => Promise<ThreadModule>;
18
9
  get discussions(): Discussion[];
19
10
  get reader(): ReaderSession | null;
20
11
  connectedCallback(): void;
@@ -0,0 +1 @@
1
+ export declare function el<K extends keyof HTMLElementTagNameMap>(tag: K, className?: string, text?: string): HTMLElementTagNameMap[K];
@@ -0,0 +1,71 @@
1
+ import type { Discussion, DiscussionAuthor, DiscussionDetail, DiscussionPost } from "../client/api.js";
2
+ import type { YuvaClient } from "../client/client.js";
3
+ import type { ReaderSession } from "../client/reader.js";
4
+ export type View = {
5
+ kind: "list";
6
+ } | {
7
+ kind: "thread";
8
+ id: string;
9
+ } | {
10
+ kind: "new";
11
+ };
12
+ export type Writer = "reader" | "contact" | null;
13
+ type Badge = "answered" | "pending" | "team" | "locked";
14
+ export interface DiscussionDetailEvent {
15
+ page: string;
16
+ discussion_id: string;
17
+ state: Discussion["state"];
18
+ }
19
+ export interface DiscussionPostDetail {
20
+ page: string;
21
+ discussion_id: string;
22
+ post_id: string;
23
+ state: DiscussionPost["state"];
24
+ }
25
+ export interface DiscussionsState {
26
+ view: View;
27
+ items: Discussion[];
28
+ thread: DiscussionDetail | null;
29
+ threadState: "loading" | "ready" | "missing" | "error";
30
+ writer: Writer;
31
+ reader: ReaderSession | null;
32
+ busy: Set<string>;
33
+ notice: string;
34
+ error: string;
35
+ confirm: string;
36
+ focus: string;
37
+ }
38
+ export interface ThreadHost {
39
+ s: DiscussionsState;
40
+ readonly root: ParentNode;
41
+ locale(): string;
42
+ direction(): "ltr" | "rtl";
43
+ page(): string;
44
+ pageTitle(): string;
45
+ mode(): string;
46
+ readonly icons: Record<"up" | "lock" | "clock", string>;
47
+ client(): YuvaClient;
48
+ render(): void;
49
+ emit(type: string, detail: unknown): void;
50
+ act<T>(key: string, action: () => Promise<T>): Promise<T | undefined>;
51
+ signIn(): Promise<void>;
52
+ open(id: string, focus: boolean): Promise<void>;
53
+ toList(): void;
54
+ forget(): void;
55
+ button(className: string, text: string, key: string, onClick: () => void, html?: string): HTMLButtonElement;
56
+ avatar(author: DiscussionAuthor, small?: boolean): HTMLElement;
57
+ badge(kind: Badge, short?: boolean): HTMLElement;
58
+ time(value: string): HTMLTimeElement;
59
+ authorName(author: DiscussionAuthor): string;
60
+ noticeBox(text: string, icon?: string): HTMLElement;
61
+ }
62
+ export interface Thread {
63
+ threadView(): Node[];
64
+ newView(): Node[];
65
+ syncSend(): void;
66
+ close(): void;
67
+ reset(): void;
68
+ }
69
+ export declare const styles = "\n.thread { display: flex; flex-direction: column; gap: 12px; }\n.thread-head { display: flex; flex-direction: column; gap: 8px; }\n.post { display: flex; gap: 12px; padding: 14px; border: 1px solid var(--yuva-border); border-radius: 12px; }\n.post.accepted { border-color: var(--yuva-success); box-shadow: inset 0 0 0 1px var(--yuva-success); }\n.post.pending { border-style: dashed; }\n.side { display: flex; flex-direction: column; align-items: center; gap: 6px; }\n.vote {\n display: inline-flex; flex-direction: column; align-items: center; gap: 0; min-inline-size: 40px; padding: 4px 6px;\n border: 1px solid var(--yuva-border); border-radius: 8px; background: none; cursor: pointer; font-size: 0.85em; font-weight: 600;\n}\n.vote:hover:not(:disabled) { border-color: var(--yuva-accent); }\n.vote[aria-pressed=\"true\"] { border-color: var(--yuva-accent); color: var(--yuva-accent); background: var(--yuva-soft); }\n.post-body { flex: 1; min-inline-size: 0; display: flex; flex-direction: column; gap: 8px; }\n.post-head { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; font-size: 0.88em; }\n.name { font-weight: 600; }\n.answer-label { display: flex; align-items: center; gap: 6px; color: var(--yuva-success); font-weight: 600; font-size: 0.85em; }\n.tools { display: flex; flex-wrap: wrap; gap: 4px 8px; align-items: center; }\n.children { display: flex; flex-direction: column; gap: 10px; margin-block-start: 4px; padding-inline-start: 14px; border-inline-start: 2px solid var(--yuva-border); }\n.children .post { padding: 10px 0; border: 0; box-shadow: none; }\n.children .post + .post { border-block-start: 1px solid var(--yuva-border); border-radius: 0; }\n.deleted { font-style: italic; opacity: 0.65; }\n.signin { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 16px; padding: 14px; border: 1px solid var(--yuva-border); border-radius: 12px; }\n.composer { display: flex; flex-direction: column; border: 1px solid var(--yuva-border); border-radius: 12px; overflow: hidden; }\n.composer:focus-within { border-color: var(--yuva-accent); }\n.composer .ctabs { display: flex; gap: 4px; padding: 0 8px; border-block-end: 1px solid var(--yuva-border); }\n.composer .ctab { padding: 7px 10px; border: 0; border-block-end: 2px solid transparent; background: none; cursor: pointer; font-size: 0.88em; opacity: 0.75; margin-block-end: -1px; }\n.composer .ctab[aria-selected=\"true\"] { border-block-end-color: var(--yuva-accent); font-weight: 600; opacity: 1; }\n.composer .ctab:focus-visible { outline: 2px solid var(--yuva-accent); outline-offset: -2px; }\n.composer textarea, .composer .preview { border: 0; border-radius: 0; min-block-size: 110px; padding: 10px 12px; }\n.composer textarea:focus-visible { outline: none; }\n.composer .preview { overflow-wrap: anywhere; }\n.composer .foot { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; justify-content: space-between; padding: 8px 10px; border-block-start: 1px solid var(--yuva-border); }\n.composer .hint { font-size: 0.8em; opacity: 0.7; }\n.composer .buttons { display: flex; gap: 8px; margin-inline-start: auto; }\n.field-title { font-size: 1.05em; font-weight: 600; }\n.form { display: flex; flex-direction: column; gap: 10px; }\n.md { overflow-wrap: anywhere; }\n.md > :first-child { margin-block-start: 0; }\n.md > :last-child { margin-block-end: 0; }\n.md p, .md ul, .md ol, .md pre, .md blockquote, .md table { margin: 0 0 0.75em; }\n.md h1, .md h2, .md h3, .md h4, .md h5, .md h6 { margin: 0.9em 0 0.4em; font-size: 1em; font-weight: 600; }\n.md h1, .md h3 { font-size: 1.1em; }\n.md ul, .md ol { padding-inline-start: 1.5em; }\n.md a { color: var(--yuva-accent); }\n.md code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.88em; padding: 1px 5px; border-radius: 5px; background: var(--yuva-soft); }\n.md pre { padding: 10px 12px; border-radius: 8px; background: var(--yuva-soft); overflow-x: auto; }\n.md pre code { padding: 0; background: none; }\n.md blockquote { padding-inline-start: 12px; border-inline-start: 3px solid var(--yuva-border); opacity: 0.85; }\n.md table { border-collapse: collapse; display: block; overflow-x: auto; }\n.md th, .md td { border: 1px solid var(--yuva-border); padding: 4px 8px; }\n.md img { max-inline-size: 100%; }\n.md hr { border: 0; border-block-start: 1px solid var(--yuva-border); }\n@media (max-width: 560px) {\n .post { padding: 12px; gap: 10px; }\n}\n";
70
+ export declare function createThread(host: ThreadHost): Thread;
71
+ export {};
@@ -1,7 +1,7 @@
1
+ import { defineDocs } from "./docs/define.js";
1
2
  import { YuvaDiscussionsElement, type DiscussionDetailEvent, type DiscussionPostDetail } from "./docs/discussions.js";
2
3
  import { YuvaPageFeedbackElement, type PageFeedbackDetail, type PageRatingDetail } from "./docs/feedback.js";
3
- export declare function defineDocs(): void;
4
- export { YuvaDiscussionsElement, YuvaPageFeedbackElement, type DiscussionDetailEvent, type DiscussionPostDetail, type PageFeedbackDetail, type PageRatingDetail, };
4
+ export { defineDocs, YuvaDiscussionsElement, YuvaPageFeedbackElement, type DiscussionDetailEvent, type DiscussionPostDetail, type PageFeedbackDetail, type PageRatingDetail, };
5
5
  export type { IdentityTokenSource } from "./client/client.js";
6
6
  export type { Discussion, DiscussionPost, PageRating, ReaderProfile } from "./client/api.js";
7
7
  export type { ReaderSession } from "./client/reader.js";
@@ -0,0 +1,2 @@
1
+ import type { Messages } from "@lingui/core";
2
+ export declare const messages: Messages;
@@ -0,0 +1,2 @@
1
+ import type { Messages } from "@lingui/core";
2
+ export declare const messages: Messages;
@@ -0,0 +1,2 @@
1
+ import type { MessageDescriptor, Messages } from "@lingui/core";
2
+ export declare function translate(messages: Messages, descriptor: MessageDescriptor, fallback: Messages): string;
@@ -0,0 +1,61 @@
1
+ var E=JSON.parse('{"2Hlmdt":["Write a reply…"],"3CApMv":["All discussions"],"3PqJQG":["Nothing to preview."],"4-S4QM":["Unmark as answer"],"5lWFkC":["Sign in"],"8wRl7c":["The opening post was deleted."],"99w-GZ":["Sign in to start a discussion. Your name is shown with your post."],"F_vGso":["Your reply"],"HkXOWm":["This reply was deleted."],"Hw3P48":["Replies: ",["0"]],"ImOQa9":["Reply"],"JfAIiv":["This discussion is locked. New replies are closed."],"Kl3TuI":["Get an e-mail when someone replies or an answer is accepted."],"Klsidc":["Delete this reply?"],"MHrjPM":["Title"],"MKEPCY":["Follow"],"NjUiZ4":["Ask a question, share an idea or describe a problem with this page."],"NrGspR":["Thanks! Your discussion will appear for everyone once the team approves it."],"OVijcR":["Remove your vote (",["0"]," votes)"],"PL0621":["Sign in to reply, vote and follow this discussion."],"PN38hZ":["Your question or idea"],"PZ_kxo":["Keep"],"Pwqkdw":["Loading…"],"RqsQKK":["Your first posts are checked by the team before they appear for everyone."],"Sad2tK":["Sending…"],"VGqKyv":["This discussion is no longer available."],"Vwy_nT":["Markdown is supported."],"YZayoP":["Thanks! Your reply will appear for everyone once the team approves it."],"cnGeoo":["Delete"],"dEgA5A":["Cancel"],"dNOvhg":["Upvote (",["0"]," votes)"],"ePK91l":["Edit"],"i4_LY_":["Write"],"jhu92n":["Mark as answer"],"k4b5_X":["edited"],"n5vqdp":["Start discussion"],"qzVesX":["Edit your post"],"rAl91-":["Delete this discussion?"],"rdUucN":["Preview"],"tfDRzk":["Save"],"y-KXxN":["Accepted answer"],"y6sq5j":["Following"],"z1qf6l":["Start a discussion"]}');var Q=JSON.parse('{"2Hlmdt":["Bir yanıt yazın…"],"3CApMv":["Tüm tartışmalar"],"3PqJQG":["Önizlenecek bir şey yok."],"4-S4QM":["Yanıt işaretini kaldır"],"5lWFkC":["Giriş yap"],"8wRl7c":["Açılış gönderisi silindi."],"99w-GZ":["Tartışma başlatmak için giriş yapın. Adınız gönderinizle birlikte gösterilir."],"F_vGso":["Yanıtınız"],"HkXOWm":["Bu yanıt silindi."],"Hw3P48":["Yanıtlar: ",["0"]],"ImOQa9":["Yanıtla"],"JfAIiv":["Bu tartışma kilitli. Yeni yanıt yazılamaz."],"Kl3TuI":["Biri yanıt yazdığında ya da bir yanıt kabul edildiğinde e-posta alın."],"Klsidc":["Bu yanıt silinsin mi?"],"MHrjPM":["Başlık"],"MKEPCY":["Takip et"],"NjUiZ4":["Bir soru sorun, bir fikir paylaşın ya da bu sayfadaki bir sorunu anlatın."],"NrGspR":["Teşekkürler! Tartışmanız ekip onayladığında herkese görünecek."],"OVijcR":["Oyunuzu geri alın (",["0"]," oy)"],"PL0621":["Bu tartışmada yanıt yazmak, oy vermek ve takip etmek için giriş yapın."],"PN38hZ":["Sorunuz ya da fikriniz"],"PZ_kxo":["Kalsın"],"Pwqkdw":["Yükleniyor…"],"RqsQKK":["İlk gönderileriniz herkese görünmeden önce ekip tarafından kontrol edilir."],"Sad2tK":["Gönderiliyor…"],"VGqKyv":["Bu tartışma artık mevcut değil."],"Vwy_nT":["Markdown desteklenir."],"YZayoP":["Teşekkürler! Yanıtınız ekip onayladığında herkese görünecek."],"cnGeoo":["Sil"],"dEgA5A":["Vazgeç"],"dNOvhg":["Oy ver (",["0"]," oy)"],"ePK91l":["Düzenle"],"i4_LY_":["Yaz"],"jhu92n":["Yanıt olarak işaretle"],"k4b5_X":["düzenlendi"],"n5vqdp":["Tartışmayı başlat"],"qzVesX":["Gönderinizi düzenleyin"],"rAl91-":["Bu tartışma silinsin mi?"],"rdUucN":["Önizleme"],"tfDRzk":["Kaydet"],"y-KXxN":["Kabul edilen yanıt"],"y6sq5j":["Takip ediliyor"],"z1qf6l":["Tartışma başlat"]}');function X(n,t,i){let f=n[t.id]??i[t.id],m=t.values??{};if(typeof f==="string")return f;if(Array.isArray(f))return f.map((p)=>typeof p==="string"?p:Array.isArray(p)?String(m[p[0]]??""):"").join("");return t.message??t.id}function o(n,t,i){let f=document.createElement(n);if(t)f.className=t;if(i!==void 0)f.textContent=i;return f}var ie=/(`[^`\n]+`)|(\*\*[^*\n]+\*\*)|(\*[^*\s][^*\n]*\*|_[^_\s][^_\n]*_)|((?:https?:\/\/|www\.)[^\s<>"]*[^\s<>".,:;'!?)\]])/g;function ae(n,t){let i=document.createElement("a");return i.href=n,i.textContent=t,i.target="_blank",i.rel="noopener noreferrer nofollow ugc",i}function C(n,t){let i=document.createElement(n);return i.append(...t),i}function z(n){let t=[],i=0;for(let f of n.matchAll(ie)){let m=f.index??0;if(m>i)t.push(document.createTextNode(n.slice(i,m)));let[p,g,u,y,h]=f;if(g)t.push(C("code",[document.createTextNode(g.slice(1,-1))]));else if(u)t.push(C("strong",z(u.slice(2,-2))));else if(y)t.push(C("em",z(y.slice(1,-1))));else if(h){let A=h.startsWith("www.")?`https://${h}`:h;try{let _=new URL(A);t.push(_.protocol==="http:"||_.protocol==="https:"?ae(_.href,h):document.createTextNode(h))}catch{t.push(document.createTextNode(h))}}i=m+p.length}if(i<n.length)t.push(document.createTextNode(n.slice(i)));return t}var re=/\[([^\]\n]+)\]\(([^)\s]+)\)/g;function U(n){let t=[],i=0;for(let f of n.matchAll(re)){let m=f.index??0;if(m>i)t.push(...z(n.slice(i,m)));let[p,g="",u=""]=f,y=null;try{y=new URL(u)}catch{}if(y&&(y.protocol==="http:"||y.protocol==="https:")){let h=document.createElement("a");h.href=y.href,h.target="_blank",h.rel="nofollow ugc noopener",h.append(...z(g)),t.push(h)}else t.push(document.createTextNode(p));i=m+p.length}if(i<n.length)t.push(...z(n.slice(i)));return t}function D(n,t){let i=document.createElement(n);return i.append(...U(t.join(" "))),i}function H(n){let t=document.createDocumentFragment(),i=n.replace(/\r\n?/g,`
2
+ `).split(`
3
+ `),f=[],m=null,p=[],g=()=>{if(f.length)t.append(D("p",f));if(p.length){let u=document.createElement("blockquote");u.append(H(p.join(`
4
+ `))),t.append(u)}f=[],p=[],m=null};for(let u=0;u<i.length;u++){let y=i[u]??"",h=/^\s*(```|~~~)/.exec(y);if(h){g();let M=[];while(++u<i.length&&!(i[u]??"").trimStart().startsWith(h[1]??"```"))M.push(i[u]??"");let T=document.createElement("pre");T.append(Object.assign(document.createElement("code"),{textContent:M.join(`
5
+ `)})),t.append(T);continue}if(/^\s*$/.test(y)){g();continue}let A=/^\s*>\s?(.*)$/.exec(y);if(A){if(f.length||m)g();p.push(A[1]??"");continue}let _=/^\s*(#{1,6})\s+(.*)$/.exec(y);if(_){g(),t.append(D(`h${Math.min(6,(_[1]?.length??1)+2)}`,[_[2]??""]));continue}let q=/^\s*(?:([-*+])|(\d+)[.)])\s+(.*)$/.exec(y);if(q){let M=q[1]?"ul":"ol";if(f.length||p.length||m&&m.tagName.toLowerCase()!==M)g();if(!m)m=document.createElement(M),t.append(m);m.append(D("li",[q[3]??""]));continue}if(p.length)g();if(m&&/^\s{2,}/.test(y)){m.lastElementChild?.append(" ",...U(y.trim()));continue}m=null,f.push(y.trim())}return g(),t}var de=1800000,se={en:E,tr:Q},G=(n)=>`<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${n}</svg>`,W=G('<circle cx="12" cy="12" r="9"/><path d="M8 12l3 3 5-6"/>'),oe=G('<path d="M19 12H5M12 19l-7-7 7-7"/>'),le=G('<path d="M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9M13.7 21a2 2 0 01-3.4 0"/>'),ke=`
6
+ .thread { display: flex; flex-direction: column; gap: 12px; }
7
+ .thread-head { display: flex; flex-direction: column; gap: 8px; }
8
+ .post { display: flex; gap: 12px; padding: 14px; border: 1px solid var(--yuva-border); border-radius: 12px; }
9
+ .post.accepted { border-color: var(--yuva-success); box-shadow: inset 0 0 0 1px var(--yuva-success); }
10
+ .post.pending { border-style: dashed; }
11
+ .side { display: flex; flex-direction: column; align-items: center; gap: 6px; }
12
+ .vote {
13
+ display: inline-flex; flex-direction: column; align-items: center; gap: 0; min-inline-size: 40px; padding: 4px 6px;
14
+ border: 1px solid var(--yuva-border); border-radius: 8px; background: none; cursor: pointer; font-size: 0.85em; font-weight: 600;
15
+ }
16
+ .vote:hover:not(:disabled) { border-color: var(--yuva-accent); }
17
+ .vote[aria-pressed="true"] { border-color: var(--yuva-accent); color: var(--yuva-accent); background: var(--yuva-soft); }
18
+ .post-body { flex: 1; min-inline-size: 0; display: flex; flex-direction: column; gap: 8px; }
19
+ .post-head { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; font-size: 0.88em; }
20
+ .name { font-weight: 600; }
21
+ .answer-label { display: flex; align-items: center; gap: 6px; color: var(--yuva-success); font-weight: 600; font-size: 0.85em; }
22
+ .tools { display: flex; flex-wrap: wrap; gap: 4px 8px; align-items: center; }
23
+ .children { display: flex; flex-direction: column; gap: 10px; margin-block-start: 4px; padding-inline-start: 14px; border-inline-start: 2px solid var(--yuva-border); }
24
+ .children .post { padding: 10px 0; border: 0; box-shadow: none; }
25
+ .children .post + .post { border-block-start: 1px solid var(--yuva-border); border-radius: 0; }
26
+ .deleted { font-style: italic; opacity: 0.65; }
27
+ .signin { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 16px; padding: 14px; border: 1px solid var(--yuva-border); border-radius: 12px; }
28
+ .composer { display: flex; flex-direction: column; border: 1px solid var(--yuva-border); border-radius: 12px; overflow: hidden; }
29
+ .composer:focus-within { border-color: var(--yuva-accent); }
30
+ .composer .ctabs { display: flex; gap: 4px; padding: 0 8px; border-block-end: 1px solid var(--yuva-border); }
31
+ .composer .ctab { padding: 7px 10px; border: 0; border-block-end: 2px solid transparent; background: none; cursor: pointer; font-size: 0.88em; opacity: 0.75; margin-block-end: -1px; }
32
+ .composer .ctab[aria-selected="true"] { border-block-end-color: var(--yuva-accent); font-weight: 600; opacity: 1; }
33
+ .composer .ctab:focus-visible { outline: 2px solid var(--yuva-accent); outline-offset: -2px; }
34
+ .composer textarea, .composer .preview { border: 0; border-radius: 0; min-block-size: 110px; padding: 10px 12px; }
35
+ .composer textarea:focus-visible { outline: none; }
36
+ .composer .preview { overflow-wrap: anywhere; }
37
+ .composer .foot { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; justify-content: space-between; padding: 8px 10px; border-block-start: 1px solid var(--yuva-border); }
38
+ .composer .hint { font-size: 0.8em; opacity: 0.7; }
39
+ .composer .buttons { display: flex; gap: 8px; margin-inline-start: auto; }
40
+ .field-title { font-size: 1.05em; font-weight: 600; }
41
+ .form { display: flex; flex-direction: column; gap: 10px; }
42
+ .md { overflow-wrap: anywhere; }
43
+ .md > :first-child { margin-block-start: 0; }
44
+ .md > :last-child { margin-block-end: 0; }
45
+ .md p, .md ul, .md ol, .md pre, .md blockquote, .md table { margin: 0 0 0.75em; }
46
+ .md h1, .md h2, .md h3, .md h4, .md h5, .md h6 { margin: 0.9em 0 0.4em; font-size: 1em; font-weight: 600; }
47
+ .md h1, .md h3 { font-size: 1.1em; }
48
+ .md ul, .md ol { padding-inline-start: 1.5em; }
49
+ .md a { color: var(--yuva-accent); }
50
+ .md code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.88em; padding: 1px 5px; border-radius: 5px; background: var(--yuva-soft); }
51
+ .md pre { padding: 10px 12px; border-radius: 8px; background: var(--yuva-soft); overflow-x: auto; }
52
+ .md pre code { padding: 0; background: none; }
53
+ .md blockquote { padding-inline-start: 12px; border-inline-start: 3px solid var(--yuva-border); opacity: 0.85; }
54
+ .md table { border-collapse: collapse; display: block; overflow-x: auto; }
55
+ .md th, .md td { border: 1px solid var(--yuva-border); padding: 4px 8px; }
56
+ .md img { max-inline-size: 100%; }
57
+ .md hr { border: 0; border-block-start: 1px solid var(--yuva-border); }
58
+ @media (max-width: 560px) {
59
+ .post { padding: 12px; gap: 10px; }
60
+ }
61
+ `;class N{area=o("textarea");previewing=!1;constructor(n){this.area.rows=n,this.area.maxLength=20000,this.area.dir="auto"}get value(){return this.area.value.trim()}clear(){this.area.value="",this.previewing=!1}}function _e(n){let t=n.s,i=(e)=>X(se[n.locale()]??E,e,E),f=new N(4),m=new N(6),p=o("input"),g=null,u=null;p.maxLength=200,p.dir="auto",p.className="field-title";for(let e of[f.area,m.area])e.addEventListener("input",()=>y());p.addEventListener("input",()=>y());function y(){for(let e of n.root.querySelectorAll("[data-requires]")){let a=e.dataset.requires,r=t.busy.has(e.dataset.busy??""),d=a==="start"?p.value.trim().length>=3&&m.value!=="":a==="reply"?f.value!=="":a==="inline"?!!g?.composer.value:a==="edit"?!!u?.composer.value&&(!!u.post||u.title.value.trim().length>=3):!0;e.disabled=r||!d}}async function h(){let e=p.value.trim(),a=m.value;if(e.length<3||!a)return;let r=n.page(),d=await n.act("start",()=>n.client().startDiscussion({page_url:r,page_title:n.pageTitle()||void 0,title:e,body:a}));if(!d)return;if(n.forget(),n.emit("yuva-discussion",{page:r,discussion_id:d.id,state:d.state}),n.page()!==r)return;p.value="",m.clear(),t.items=[d,...t.items.filter((c)=>c.id!==d.id)],t.notice=d.state==="pending"?i({id:"NrGspR"}):"",t.thread={discussion:d,posts:[]},await n.open(d.id,!0)}async function A(e,a){let r=t.thread,d=e.value;if(!r||!d)return;let c=n.page(),l=r.discussion.id,v=await n.act(a?`reply-${a}`:"reply",()=>n.client().replyToDiscussion(l,{body:d,parent_post_id:a}));if(!v)return;if(n.forget(),n.emit("yuva-post",{page:c,discussion_id:l,post_id:v.id,state:v.state}),e.clear(),a)g=null;if(t.notice=v.state==="pending"?i({id:"YZayoP"}):"",t.thread?.discussion.id===l)t.thread={...t.thread,posts:[...t.thread.posts,v]},t.focus=`post-${v.id}`,n.render(),n.open(l,!1)}async function _(e,a){if(!t.writer)return void n.signIn();let r=await n.act(`vote-${e.id}`,()=>n.client().voteDiscussionPost(e.id,!e.voted));if(!r||!t.thread)return;if(n.forget(),a){let d={...t.thread.discussion,votes:r.votes,voted:r.voted};t.thread={...t.thread,discussion:d},t.items=t.items.map((c)=>c.id===d.id?d:c)}else t.thread={...t.thread,posts:t.thread.posts.map((d)=>d.id===r.id?{...d,...r}:d)}}async function q(){let e=t.thread;if(!e)return;if(!t.writer)return void n.signIn();let a=!e.discussion.following;if(await n.act("follow",()=>n.client().followDiscussion(e.discussion.id,a).then(()=>!0))&&t.thread?.discussion.id===e.discussion.id)t.thread={...t.thread,discussion:{...t.thread.discussion,following:a}}}async function M(e){let a=t.thread;if(!a)return;let r=await n.act(`accept-${e?.id??"clear"}`,()=>n.client().acceptDiscussionAnswer(a.discussion.id,e?.id??null));if(!r)return;n.forget(),t.focus=e?`post-${e.id}`:"thread-title",await n.open(r.id,!1)}async function T(){let e=u,a=t.thread;if(!e||!a)return;let r=e.composer.value,d=!e.post,c=e.title.value.trim();if(!r||d&&c.length<3)return;let l=e.post?.id??a.discussion.opening_post_id;if(!await n.act(`edit-${l}`,()=>n.client().editDiscussionPost(l,d?{body:r,title:c}:{body:r})))return;n.forget(),u=null,t.focus=d?"thread-title":`post-${l}`,await n.open(a.discussion.id,!1)}async function J(e,a){let r=t.thread;if(!r)return;let d=await n.act(`delete-${e}`,()=>n.client().deleteDiscussionPost(e).then(()=>!0));if(t.confirm="",!d)return;if(n.forget(),a)try{await n.client().getDiscussion(r.discussion.id)}catch{return t.items=t.items.filter((c)=>c.id!==r.discussion.id),t.thread=null,n.toList()}await n.open(r.discussion.id,!1)}function R(e){let a=o("div","md");a.dir="auto",a.innerHTML=e;for(let r of a.querySelectorAll("a[href]"))r.setAttribute("target","_blank");return a}function S(e,a){let r=o("div","composer"),d=o("div","ctabs");d.setAttribute("role","tablist"),d.setAttribute("aria-label",a.label);let c=`p-${a.focusKey}`,l=n.button("ctab",i({id:"i4_LY_"}),`${a.focusKey}-write`,()=>{e.previewing=!1,t.focus=a.focusKey,n.render()}),v=n.button("ctab",i({id:"rdUucN"}),`${a.focusKey}-preview`,()=>{e.previewing=!0,n.render()});for(let[s,k]of[[l,!e.previewing],[v,e.previewing]])s.setAttribute("role","tab"),s.setAttribute("aria-selected",String(k)),s.setAttribute("aria-controls",c),s.tabIndex=k?0:-1,s.addEventListener("keydown",(K)=>{if(K.key!=="ArrowLeft"&&K.key!=="ArrowRight")return;K.preventDefault(),e.previewing=!e.previewing,t.focus=`${a.focusKey}-${e.previewing?"preview":"write"}`,n.render()});if(d.append(l,v),r.append(d),e.previewing){let s=o("div","preview md");if(s.dir="auto",s.id=c,s.setAttribute("role","tabpanel"),s.setAttribute("aria-label",i({id:"rdUucN"})),e.value)s.append(H(e.area.value));else s.append(o("p","muted",i({id:"3PqJQG"})));r.append(s)}else e.area.id=c,e.area.placeholder=a.placeholder,e.area.setAttribute("aria-label",a.label),e.area.dataset.key=a.focusKey,e.area.disabled=t.busy.has(a.busy),e.area.onkeydown=(s)=>{if(s.key==="Enter"&&(s.metaKey||s.ctrlKey))s.preventDefault(),a.onSubmit();else if(s.key==="Escape"&&a.onCancel)a.onCancel()},r.append(e.area);let x=o("div","foot");x.append(o("span","hint",i({id:"Vwy_nT"})));let w=o("div","buttons");if(a.onCancel)w.append(n.button("ghost",i({id:"dEgA5A"}),`${a.focusKey}-cancel`,a.onCancel));let b=n.button("send",t.busy.has(a.busy)?i({id:"Sad2tK"}):a.submit,`${a.focusKey}-submit`,a.onSubmit);return b.dataset.requires=a.requires,b.dataset.busy=a.busy,w.append(b),x.append(w),r.append(x),r}function Y(e){let a=o("div","signin");return a.append(o("p","",e)),a.append(n.button("send",i({id:"5lWFkC"}),"sign-in-box",()=>void n.signIn())),a}function L(){let e=n.button("plain",i({id:"3CApMv"}),"back",()=>n.toList(),oe);e.style.alignSelf="flex-start",e.style.display="inline-flex",e.style.gap="6px",e.style.alignItems="center";let a=e.querySelector("svg");if(a&&n.direction()==="rtl")a.style.transform="scaleX(-1)";return e}function ee(){let e=o("div","form");if(e.append(o("h3","",i({id:"z1qf6l"}))),!t.writer)return e.append(Y(i({id:"99w-GZ"}))),[L(),e];if(p.placeholder=i({id:"MHrjPM"}),p.setAttribute("aria-label",i({id:"MHrjPM"})),p.dataset.key="new-title",p.disabled=t.busy.has("start"),e.append(p),e.append(S(m,{label:i({id:"PN38hZ"}),placeholder:i({id:"NjUiZ4"}),submit:i({id:"n5vqdp"}),busy:"start",requires:"start",focusKey:"new-body",onSubmit:()=>void h(),onCancel:()=>n.toList()})),n.mode()==="moderated"&&t.reader)e.append(o("p","muted",i({id:"RqsQKK"})));return[L(),e]}function te(e){return!!e.mine&&!t.thread?.discussion.locked&&Date.now()-Date.parse(e.created_at)<de}function I(e,a){let r=t.thread;if(!r)return null;let d=r.discussion,c=!e,l=e?.id??d.opening_post_id,v=c?!!d.mine:!!e.mine,x=c?!!d.deleted:e.deleted,w=o("div","tools");if(x)return null;if(!c&&a&&!d.locked&&t.writer&&e.state==="published")w.append(n.button("plain",i({id:"ImOQa9"}),`reply-to-${e.id}`,()=>{g=g?.target===a.id?g:{target:a.id,composer:new N(3)},g.composer.area.oninput=()=>y(),t.focus=`inline-${a.id}`,n.render()}));if(!c&&d.mine&&!e.parent_post_id&&e.state==="published"&&!d.locked){let b=d.answer_post_id===e.id,s=n.button("plain",b?i({id:"4-S4QM"}):i({id:"jhu92n"}),`accept-${e.id}`,()=>void M(b?null:e),b?"":W);s.style.display="inline-flex",s.style.gap="4px",s.style.alignItems="center",s.disabled=t.busy.has(`accept-${e.id}`)||t.busy.has("accept-clear"),w.append(s)}if(v&&te(c?d:e))w.append(n.button("plain",i({id:"ePK91l"}),`edit-${l}`,()=>{let b=new N(c?6:4);b.area.value=c?d.body:e.body,b.area.oninput=()=>y();let s=o("input");s.className="field-title",s.maxLength=200,s.dir="auto",s.value=d.title,s.oninput=()=>y(),u={post:e,composer:b,title:s},t.focus=c?"edit-title":`edit-body-${l}`,n.render()}));if(v)if(t.confirm===l){let b=n.button("plain danger",i({id:"cnGeoo"}),`delete-yes-${l}`,()=>void J(l,c));b.disabled=t.busy.has(`delete-${l}`),w.append(o("span","muted",c?i({id:"rAl91-"}):i({id:"Klsidc"})),b,n.button("plain",i({id:"PZ_kxo"}),`delete-no-${l}`,()=>{t.confirm="",t.focus=`delete-${l}`,n.render()}))}else w.append(n.button("plain",i({id:"cnGeoo"}),`delete-${l}`,()=>{t.confirm=l,t.focus=`delete-no-${l}`,n.render()}));return w.childElementCount?w:null}function O(e,a){let r=n.button("vote",String(e.votes),`vote-${e.id}`,()=>void _(e,a),n.icons.up);return r.setAttribute("aria-pressed",String(!!e.voted)),r.setAttribute("aria-label",e.voted?i({id:"OVijcR",values:{0:e.votes}}):i({id:"dNOvhg",values:{0:e.votes}})),r.disabled=!!e.mine||!!t.thread?.discussion.locked||t.busy.has(`vote-${e.id}`),r}function B(e,a,r=[]){let c=t.thread.discussion.answer_post_id===e.id,l=o("article",`post${c?" accepted":""}${e.state==="pending"?" pending":""}`);l.dataset.key=`post-${e.id}`,l.tabIndex=-1,l.setAttribute("aria-label",n.authorName(e.author));let v=o("div","side");if(!e.deleted)v.append(O(e,!1));if(!a||a.id===e.id)l.append(v);let x=o("div","post-body");if(c){let b=o("div","answer-label");b.innerHTML=W,b.append(i({id:"y-KXxN"})),x.append(b)}if(x.append(j(e.author,e.created_at,e.edited_at,e.state,e.deleted)),u?.post?.id===e.id)x.append(F());else if(e.deleted)x.append(o("p","deleted",i({id:"HkXOWm"})));else x.append(R(e.body_html));let w=I(e,a);if(w)x.append(w);if(r.length||g?.target===e.id){let b=o("div","children");for(let s of r)b.append(B(s,e));if(g?.target===e.id){let s=g;b.append(S(s.composer,{label:i({id:"F_vGso"}),placeholder:i({id:"2Hlmdt"}),submit:i({id:"ImOQa9"}),busy:`reply-${e.id}`,requires:"inline",focusKey:`inline-${e.id}`,onSubmit:()=>void A(s.composer,e.id),onCancel:()=>{g=null,t.focus=`reply-to-${e.id}`,n.render()}}))}x.append(b)}return l.append(x),l}function j(e,a,r,d,c){let l=o("div","post-head");if(!c){if(l.append(n.avatar(e,!0),o("span","name",n.authorName(e))),e.kind==="member"&&!e.deleted)l.append(n.badge("team"))}if(l.append(n.time(a)),r&&!c)l.append(o("span","muted",i({id:"k4b5_X"})));if(d==="pending")l.append(n.badge("pending"));return l}function F(){let e=u,a=o("div","form");if(!e.post)e.title.setAttribute("aria-label",i({id:"MHrjPM"})),e.title.dataset.key="edit-title",a.append(e.title);let r=e.post?.id??t.thread.discussion.opening_post_id;return a.append(S(e.composer,{label:i({id:"qzVesX"}),placeholder:"",submit:i({id:"tfDRzk"}),busy:`edit-${r}`,requires:"edit",focusKey:`edit-body-${r}`,onSubmit:()=>void T(),onCancel:()=>{u=null,t.focus=`edit-${r}`,n.render()}})),a}function ne(){let e=[L()],a=t.thread;if(!a||t.threadState==="missing"){let s=o("div","empty");return s.append(o("p","",t.threadState==="loading"?i({id:"Pwqkdw"}):i({id:"VGqKyv"}))),e.push(s),e}let r=a.discussion,d=o("div","thread"),c=o("div","thread-head");if(u&&!u.post)c.append(j(r.author,r.created_at,r.edited_at,r.state,!1)),c.append(F()),d.append(c);else{let s=o("h3","",r.title);s.dir="auto",s.tabIndex=-1,s.dataset.key="thread-title",c.append(s);let k=o("div","meta");if(r.answer_post_id)k.append(n.badge("answered"));if(r.state==="pending")k.append(n.badge("pending"));if(r.locked)k.append(n.badge("locked"));if(k.childElementCount)c.append(k);d.append(c);let K=o("article",`post${r.state==="pending"?" pending":""}`),V=o("div","side");if(!r.deleted)V.append(O({id:r.opening_post_id,votes:r.votes,voted:r.voted,mine:r.mine},!0));let P=o("div","post-body");P.append(j(r.author,r.created_at,r.edited_at,r.state,!!r.deleted)),P.append(r.deleted?o("p","deleted",i({id:"8wRl7c"})):R(r.body_html));let Z=I(null,null);if(Z)P.append(Z);K.append(V,P),d.append(K)}let l=o("div","bar"),v=n.button("ghost",r.following?i({id:"y6sq5j"}):i({id:"MKEPCY"}),"follow",()=>void q(),le);v.setAttribute("aria-pressed",String(!!r.following)),v.title=i({id:"Kl3TuI"}),v.disabled=t.busy.has("follow");let x=o("span","muted",i({id:"Hw3P48",values:{0:r.reply_count}}));if(l.append(x,v),d.append(l),t.threadState==="loading"&&!a.posts.length&&r.reply_count>0){let s=o("div","skeleton");s.setAttribute("aria-busy","true"),s.setAttribute("aria-label",i({id:"Pwqkdw"})),d.append(s)}let w=a.posts.filter((s)=>!s.parent_post_id),b=o("div","thread");for(let s of w)b.append(B(s,s,a.posts.filter((k)=>k.parent_post_id===s.id)));if(w.length)d.append(b);if(t.notice)d.append(n.noticeBox(t.notice));if(r.locked)d.append(n.noticeBox(i({id:"JfAIiv"}),n.icons.lock));else if(!t.writer)d.append(Y(i({id:"PL0621"})));else d.append(S(f,{label:i({id:"F_vGso"}),placeholder:i({id:"2Hlmdt"}),submit:i({id:"ImOQa9"}),busy:"reply",requires:"reply",focusKey:"reply",onSubmit:()=>void A(f)}));return e.push(d),e}return{threadView:ne,newView:ee,syncSend:y,close(){g=null,u=null},reset(){g=null,u=null,f.clear()}}}export{_e as createThread,ke as styles};