@clearlaunch/sdk 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +136 -0
- package/dist/bundled.d.ts +2 -0
- package/dist/clearlaunch.cjs.js +6 -38
- package/dist/clearlaunch.cjs.js.map +4 -4
- package/dist/clearlaunch.esm.js +6 -38
- package/dist/clearlaunch.esm.js.map +4 -4
- package/dist/clearlaunch.js +551 -9
- package/dist/clearlaunch.js.map +4 -4
- package/dist/index.d.ts +128 -0
- package/package.json +41 -5
package/dist/clearlaunch.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var ClearLaunch=(()=>{var
|
|
1
|
+
"use strict";var ClearLaunch=(()=>{var te=Object.defineProperty;var qe=Object.getOwnPropertyDescriptor;var Ue=Object.getOwnPropertyNames;var De=Object.prototype.hasOwnProperty;var re=(e=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(e,{get:(t,i)=>(typeof require!="undefined"?require:t)[i]}):e)(function(e){if(typeof require!="undefined")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var X=(e,t)=>{for(var i in t)te(e,i,{get:t[i],enumerable:!0})},Oe=(e,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Ue(t))!De.call(e,n)&&n!==i&&te(e,n,{get:()=>t[n],enumerable:!(r=qe(t,n))||r.enumerable});return e};var Be=e=>Oe(te({},"__esModule",{value:!0}),e);var st={};X(st,{ClearLaunch:()=>ze,clearSDK:()=>ce,default:()=>Re,init:()=>Pe,register:()=>H});var ne={};X(ne,{createVersions:()=>Ke});var Ne="https://api.clearlaunch.ai";function ie(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function ye(e,t){if(document.getElementById(e))return;let i=document.createElement("style");i.id=e,i.textContent=t,document.head.appendChild(i)}function we(e){return typeof e=="string"?document.querySelector(e):e}function Te(e){if(!(e!=null&&e.projectKey))throw new Error("ClearLaunch: projectKey is required");let i=`${(e.apiUrl||Ne).replace(/\/$/,"")}/api/v1/public/sdk/${encodeURIComponent(e.projectKey)}`,r=null;async function n(l){let c=await fetch(`${i}/${l.replace(/^\//,"")}`);if(!c.ok)throw new Error(`ClearLaunch: request to ${l} failed (${c.status})`);return c.json()}function o(){return r||(r=n("config").catch(()=>({projectName:"",widgets:{versions:!0}}))),r}return{projectKey:e.projectKey,sdkBase:i,get:n,config:o}}var Ce=`
|
|
2
2
|
.cl-vw { --cl-vw-accent: #6366f1; --cl-vw-radius: 12px;
|
|
3
3
|
font-family: var(--cl-vw-font, inherit); color: #1f2430; }
|
|
4
4
|
.cl-vw * { box-sizing: border-box; }
|
|
@@ -25,16 +25,558 @@
|
|
|
25
25
|
.cl-vw__date, .cl-vw__group-label { color: #9aa3b2; }
|
|
26
26
|
.cl-vw__list li { color: #cbd2de; }
|
|
27
27
|
}
|
|
28
|
-
`;function
|
|
28
|
+
`;function We(e){if(!e)return"";let t=new Date(e);return isNaN(t.getTime())?"":t.toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}function Y(e,t,i=""){if(!(t!=null&&t.length))return"";let r=t.map(n=>`<li>${ie(n)}</li>`).join("");return`<div class="cl-vw__group ${i}"><div class="cl-vw__group-label">${e}</div><ul class="cl-vw__list">${r}</ul></div>`}function Ge(e,t){if(!t.length){e.innerHTML='<div class="cl-vw"><div class="cl-vw__empty">No releases yet.</div></div>';return}let i=t.map(r=>`
|
|
29
29
|
<div class="cl-vw__release">
|
|
30
30
|
<div class="cl-vw__head">
|
|
31
|
-
<span class="cl-vw__ver">v${
|
|
32
|
-
<span class="cl-vw__date">${
|
|
31
|
+
<span class="cl-vw__ver">v${ie(r.version)}</span>
|
|
32
|
+
<span class="cl-vw__date">${We(r.publishedAt)}</span>
|
|
33
33
|
</div>
|
|
34
|
-
${
|
|
35
|
-
${
|
|
36
|
-
${
|
|
37
|
-
${
|
|
38
|
-
</div>`).join("");e.innerHTML=`<div class="cl-vw">${
|
|
34
|
+
${Y("Breaking changes",r.notes.breaking,"cl-vw__group--breaking")}
|
|
35
|
+
${Y("New features",r.notes.features)}
|
|
36
|
+
${Y("Enhancements",r.notes.enhancements)}
|
|
37
|
+
${Y("Fixes",r.notes.bugFixes)}
|
|
38
|
+
</div>`).join("");e.innerHTML=`<div class="cl-vw">${i}</div>`}function Ke(e){async function t(){return(await e.get("releases")).releases||[]}return{list:t,async mount(i){let r=we(i);if(!r)throw new Error(`ClearLaunch versions: mount target not found: ${String(i)}`);ye("cl-vw-styles",Ce);try{Ge(r,await t())}catch{r.innerHTML=`<div class="cl-vw"><div class="cl-vw__empty">Couldn't load release notes.</div></div>`}}}}var le={};X(le,{default:()=>tt,mountFeedback:()=>_e});var Ee=`
|
|
39
|
+
.clf-root {
|
|
40
|
+
--clf-primary: #6366f1;
|
|
41
|
+
--clf-radius: 12px;
|
|
42
|
+
--clf-font: inherit;
|
|
43
|
+
--clf-z: 2147483000;
|
|
44
|
+
|
|
45
|
+
--clf-bg: #ffffff;
|
|
46
|
+
--clf-fg: #0f172a;
|
|
47
|
+
--clf-muted: #64748b;
|
|
48
|
+
--clf-border: rgba(15, 23, 42, 0.12);
|
|
49
|
+
--clf-input-bg: #ffffff;
|
|
50
|
+
--clf-overlay: rgba(15, 23, 42, 0.45);
|
|
51
|
+
}
|
|
52
|
+
.clf-root[data-scheme="dark"] {
|
|
53
|
+
--clf-bg: #12141f;
|
|
54
|
+
--clf-fg: #f5f6fa;
|
|
55
|
+
--clf-muted: #94a3b8;
|
|
56
|
+
--clf-border: rgba(255, 255, 255, 0.14);
|
|
57
|
+
--clf-input-bg: #191c29;
|
|
58
|
+
--clf-overlay: rgba(0, 0, 0, 0.6);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.clf-root *, .clf-root *::before, .clf-root *::after { box-sizing: border-box; }
|
|
62
|
+
|
|
63
|
+
/* \u2500\u2500 Trigger \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
|
|
64
|
+
.clf-trigger {
|
|
65
|
+
position: fixed;
|
|
66
|
+
z-index: var(--clf-z);
|
|
67
|
+
border: none;
|
|
68
|
+
background: var(--clf-primary);
|
|
69
|
+
color: #fff;
|
|
70
|
+
font-family: var(--clf-font);
|
|
71
|
+
font-size: 13px;
|
|
72
|
+
font-weight: 600;
|
|
73
|
+
cursor: pointer;
|
|
74
|
+
display: inline-flex;
|
|
75
|
+
align-items: center;
|
|
76
|
+
gap: 7px;
|
|
77
|
+
box-shadow: 0 4px 14px rgba(0, 0, 0, 0.18);
|
|
78
|
+
transition: filter 0.15s ease, transform 0.15s ease;
|
|
79
|
+
}
|
|
80
|
+
.clf-trigger:hover { filter: brightness(1.08); }
|
|
81
|
+
.clf-trigger:focus-visible { outline: 2px solid var(--clf-primary); outline-offset: 3px; }
|
|
82
|
+
|
|
83
|
+
/* Sticky edge tabs rotate so the text runs along the edge. */
|
|
84
|
+
.clf-trigger--sticky { padding: 9px 16px; }
|
|
85
|
+
.clf-trigger--left { left: 0; transform-origin: left center; transform: rotate(-90deg) translateX(-50%); border-radius: 0 0 var(--clf-radius) var(--clf-radius); }
|
|
86
|
+
.clf-trigger--right { right: 0; transform-origin: right center; transform: rotate(90deg) translateX(50%); border-radius: 0 0 var(--clf-radius) var(--clf-radius); }
|
|
87
|
+
.clf-trigger--top { top: 0; border-radius: 0 0 var(--clf-radius) var(--clf-radius); }
|
|
88
|
+
.clf-trigger--bottom { bottom: 0; border-radius: var(--clf-radius) var(--clf-radius) 0 0; }
|
|
89
|
+
.clf-trigger--left:hover { transform: rotate(-90deg) translateX(-50%) translateY(-2px); }
|
|
90
|
+
.clf-trigger--right:hover { transform: rotate(90deg) translateX(50%) translateY(-2px); }
|
|
91
|
+
|
|
92
|
+
.clf-trigger--floating {
|
|
93
|
+
border-radius: 999px;
|
|
94
|
+
padding: 13px 18px;
|
|
95
|
+
}
|
|
96
|
+
.clf-trigger--floating:hover { transform: translateY(-2px); }
|
|
97
|
+
|
|
98
|
+
/* \u2500\u2500 Dialog \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
|
|
99
|
+
.clf-overlay {
|
|
100
|
+
position: fixed; inset: 0;
|
|
101
|
+
z-index: calc(var(--clf-z) + 1);
|
|
102
|
+
background: var(--clf-overlay);
|
|
103
|
+
display: flex; align-items: center; justify-content: center;
|
|
104
|
+
padding: 20px;
|
|
105
|
+
animation: clf-fade 0.15s ease-out;
|
|
106
|
+
}
|
|
107
|
+
@keyframes clf-fade { from { opacity: 0 } to { opacity: 1 } }
|
|
108
|
+
|
|
109
|
+
.clf-dialog {
|
|
110
|
+
width: 100%; max-width: 460px; max-height: 90vh;
|
|
111
|
+
display: flex; flex-direction: column;
|
|
112
|
+
background: var(--clf-bg);
|
|
113
|
+
color: var(--clf-fg);
|
|
114
|
+
font-family: var(--clf-font);
|
|
115
|
+
border-radius: var(--clf-radius);
|
|
116
|
+
border: 1px solid var(--clf-border);
|
|
117
|
+
box-shadow: 0 24px 60px rgba(0, 0, 0, 0.28);
|
|
118
|
+
overflow: hidden;
|
|
119
|
+
}
|
|
120
|
+
.clf-head {
|
|
121
|
+
display: flex; align-items: center; gap: 10px;
|
|
122
|
+
padding: 16px 18px; border-bottom: 1px solid var(--clf-border);
|
|
123
|
+
}
|
|
124
|
+
.clf-head h2 { margin: 0; font-size: 15px; font-weight: 700; flex: 1; color: var(--clf-fg); }
|
|
125
|
+
.clf-x {
|
|
126
|
+
background: none; border: none; cursor: pointer; padding: 4px;
|
|
127
|
+
color: var(--clf-muted); font-size: 20px; line-height: 1; border-radius: 6px;
|
|
128
|
+
}
|
|
129
|
+
.clf-x:hover { color: var(--clf-fg); }
|
|
130
|
+
|
|
131
|
+
.clf-body { padding: 16px 18px; overflow-y: auto; display: flex; flex-direction: column; gap: 14px; }
|
|
132
|
+
.clf-field { display: flex; flex-direction: column; gap: 6px; }
|
|
133
|
+
.clf-label { font-size: 12px; font-weight: 600; color: var(--clf-muted); }
|
|
134
|
+
.clf-input, .clf-textarea {
|
|
135
|
+
width: 100%; padding: 9px 11px;
|
|
136
|
+
font-family: var(--clf-font); font-size: 14px;
|
|
137
|
+
color: var(--clf-fg); background: var(--clf-input-bg);
|
|
138
|
+
border: 1px solid var(--clf-border); border-radius: 8px;
|
|
139
|
+
outline: none; transition: border-color 0.15s ease;
|
|
140
|
+
}
|
|
141
|
+
.clf-input:focus, .clf-textarea:focus { border-color: var(--clf-primary); }
|
|
142
|
+
.clf-textarea { min-height: 110px; resize: vertical; line-height: 1.5; }
|
|
143
|
+
|
|
144
|
+
/* Type chooser \u2014 pills, active one carries the brand colour. */
|
|
145
|
+
.clf-types { display: flex; flex-wrap: wrap; gap: 6px; }
|
|
146
|
+
.clf-type {
|
|
147
|
+
padding: 6px 13px; border-radius: 999px; cursor: pointer;
|
|
148
|
+
font-family: var(--clf-font); font-size: 12.5px; font-weight: 600;
|
|
149
|
+
background: transparent; color: var(--clf-muted);
|
|
150
|
+
border: 1px solid var(--clf-border);
|
|
151
|
+
transition: color 0.15s, border-color 0.15s, background 0.15s;
|
|
152
|
+
}
|
|
153
|
+
.clf-type:hover { color: var(--clf-fg); }
|
|
154
|
+
.clf-type[aria-pressed="true"] {
|
|
155
|
+
background: var(--clf-primary); border-color: var(--clf-primary); color: #fff;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/* Attachments */
|
|
159
|
+
.clf-attach-hint { font-size: 11.5px; color: var(--clf-muted); }
|
|
160
|
+
.clf-toolbar {
|
|
161
|
+
display: flex;
|
|
162
|
+
gap: 2px;
|
|
163
|
+
margin-bottom: 4px;
|
|
164
|
+
}
|
|
165
|
+
.clf-fmt {
|
|
166
|
+
min-width: 28px;
|
|
167
|
+
height: 26px;
|
|
168
|
+
padding: 0 6px;
|
|
169
|
+
border: 1px solid transparent;
|
|
170
|
+
border-radius: 4px;
|
|
171
|
+
background: transparent;
|
|
172
|
+
color: var(--clf-muted);
|
|
173
|
+
font: inherit;
|
|
174
|
+
font-size: 12px;
|
|
175
|
+
line-height: 1;
|
|
176
|
+
cursor: pointer;
|
|
177
|
+
}
|
|
178
|
+
.clf-fmt:hover { background: var(--clf-input-bg); color: var(--clf-fg); border-color: var(--clf-border); }
|
|
179
|
+
.clf-fmt:focus-visible { outline: 2px solid var(--clf-primary); outline-offset: 1px; }
|
|
180
|
+
.clf-fmt code { font-size: 11px; }
|
|
181
|
+
.clf-thumbs { display: flex; flex-wrap: wrap; gap: 8px; }
|
|
182
|
+
.clf-thumb { position: relative; width: 56px; height: 56px; border-radius: 8px; overflow: hidden; border: 1px solid var(--clf-border); }
|
|
183
|
+
.clf-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
|
|
184
|
+
.clf-thumb button {
|
|
185
|
+
position: absolute; top: 2px; right: 2px;
|
|
186
|
+
width: 18px; height: 18px; border-radius: 999px; border: none;
|
|
187
|
+
background: rgba(0,0,0,0.65); color: #fff; cursor: pointer;
|
|
188
|
+
font-size: 12px; line-height: 1; padding: 0;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.clf-foot {
|
|
192
|
+
display: flex; align-items: center; gap: 8px;
|
|
193
|
+
padding: 14px 18px; border-top: 1px solid var(--clf-border);
|
|
194
|
+
}
|
|
195
|
+
.clf-spacer { flex: 1; }
|
|
196
|
+
.clf-btn {
|
|
197
|
+
padding: 9px 18px; border-radius: 8px; cursor: pointer;
|
|
198
|
+
font-family: var(--clf-font); font-size: 13.5px; font-weight: 600;
|
|
199
|
+
border: 1px solid transparent; transition: filter 0.15s ease;
|
|
200
|
+
}
|
|
201
|
+
.clf-btn--primary { background: var(--clf-primary); color: #fff; }
|
|
202
|
+
.clf-btn--primary:hover:not(:disabled) { filter: brightness(1.08); }
|
|
203
|
+
.clf-btn--ghost { background: transparent; color: var(--clf-muted); border-color: var(--clf-border); }
|
|
204
|
+
.clf-btn--ghost:hover { color: var(--clf-fg); }
|
|
205
|
+
.clf-btn:disabled { opacity: 0.55; cursor: not-allowed; }
|
|
206
|
+
|
|
207
|
+
.clf-error { font-size: 12.5px; color: #ef4444; }
|
|
208
|
+
|
|
209
|
+
/* Success */
|
|
210
|
+
.clf-success { padding: 30px 20px; text-align: center; }
|
|
211
|
+
.clf-success__tick {
|
|
212
|
+
width: 46px; height: 46px; border-radius: 999px; margin: 0 auto 14px;
|
|
213
|
+
background: var(--clf-primary); color: #fff;
|
|
214
|
+
display: flex; align-items: center; justify-content: center; font-size: 22px;
|
|
215
|
+
}
|
|
216
|
+
.clf-success__title { font-size: 15px; font-weight: 700; margin-bottom: 5px; }
|
|
217
|
+
.clf-success__body { font-size: 13px; color: var(--clf-muted); }
|
|
218
|
+
|
|
219
|
+
@media (max-width: 520px) {
|
|
220
|
+
.clf-dialog { max-width: none; }
|
|
221
|
+
.clf-trigger--sticky { font-size: 12px; padding: 8px 13px; }
|
|
222
|
+
}
|
|
223
|
+
`;var Ve="https://api.clearlaunch.ai",Le="clearlaunch-feedback-styles",Se=5,Xe=5*1024*1024,Ye={bug:"Bug",feature:"Feature",enhancement:"Improvement",feedback:"Feedback"},Je={triggerLabel:"Feedback",dialogTitle:"Send feedback",titleLabel:"Summary",titlePlaceholder:"Briefly, what is it?",descriptionLabel:"Details",descriptionPlaceholder:"What happened, and what did you expect?",typeLabel:"Type",serviceLabel:"Which area?",formattingLabel:"Formatting",servicePlaceholder:"Select\u2026",emailLabel:"Your email (optional)",submit:"Send",submitting:"Sending\u2026",cancel:"Cancel",successTitle:"Thanks \u2014 we got it",successBody:"Your report has been raised with the team.",attachHint:"Paste a screenshot, or drop images here.",required:"Add a summary and some details.",failed:"Could not send that. Please try again."};function d(e){return String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function Qe(){if(typeof document=="undefined"||document.getElementById(Le))return;let e=document.createElement("style");e.id=Le,e.textContent=Ee,document.head.appendChild(e)}function Ze(e){return new Promise((t,i)=>{let r=new FileReader;r.onerror=()=>i(new Error("Could not read that file")),r.onload=()=>{let n=String(r.result||"");t({data:n.split(",")[1]||"",mimeType:e.type||"image/png",filename:e.name})},r.readAsDataURL(e)})}var $e=[{id:"bold",title:"Bold",icon:"<b>B</b>",wrap:"**",placeholder:"bold text"},{id:"italic",title:"Italic",icon:"<i>I</i>",wrap:"_",placeholder:"italic text"},{id:"code",title:"Inline code",icon:"<code><></code>",wrap:"`",placeholder:"code"},{id:"list",title:"Bulleted list",icon:"•—",prefix:"- ",placeholder:"list item"},{id:"link",title:"Link",icon:"🔗",wrap:"",placeholder:"text"}];function et(e,t){let i=e.selectionStart,r=e.selectionEnd,o=e.value.slice(i,r)||t.placeholder,l,c,h;if(t.id==="link")l=`[${o}](url)`,c=i+o.length+3,h=c+3;else if(t.prefix)l=o.split(`
|
|
224
|
+
`).map(m=>m.startsWith(t.prefix)?m:t.prefix+m).join(`
|
|
225
|
+
`),c=i,h=i+l.length;else{let m=t.wrap;l=`${m}${o}${m}`,c=i+m.length,h=c+o.length}e.focus(),e.setSelectionRange(i,r),typeof document.execCommand=="function"&&document.execCommand("insertText",!1,l)||(e.value=e.value.slice(0,i)+l+e.value.slice(r)),e.setSelectionRange(c,h)}function _e(e){var j,F,I,q,U,D,p,b,C,W,de,pe,fe,ue,ge;if(typeof document=="undefined")return{open(){},close(){},destroy(){}};if(!(e!=null&&e.token))throw new Error("[clearlaunch/feedback] `token` is required \u2014 find it in ClearLaunch \u2192 project \u2192 Feedback.");if(e.service&&((j=e.services)!=null&&j.length))throw new Error("[clearlaunch/feedback] Pass either `service` (fixed touchpoint) or `services` (let the submitter choose) \u2014 not both.");let t={...Je,...e.text||{}},i=(F=e.types)!=null&&F.length?e.types:["bug","feature","enhancement","feedback"],n=`${(e.apiUrl||Ve).replace(/\/$/,"")}/api/v1/feedback/submit/${encodeURIComponent(e.token)}`,o=(I=e.trigger)!=null?I:{kind:"floating"};Qe();let l=document.createElement("div");l.className="clf-root";let c=(U=(q=e.theme)==null?void 0:q.colorScheme)!=null?U:"auto";l.dataset.scheme=c==="auto"?(D=window.matchMedia)!=null&&D.call(window,"(prefers-color-scheme: dark)").matches?"dark":"light":c,(p=e.theme)!=null&&p.primaryColor&&l.style.setProperty("--clf-primary",e.theme.primaryColor),(b=e.theme)!=null&&b.fontFamily&&l.style.setProperty("--clf-font",e.theme.fontFamily),(C=e.theme)!=null&&C.borderRadius&&l.style.setProperty("--clf-radius",e.theme.borderRadius),(W=e.theme)!=null&&W.zIndex&&l.style.setProperty("--clf-z",String(e.theme.zIndex)),document.body.appendChild(l);let h=e.defaultType&&i.includes(e.defaultType)?e.defaultType:i[0],L=e.service?[]:e.services||[],m=e.service,y=[],f=null,S=null,P=!1,g=null;if(o.kind!=="none"){if(g=document.createElement("button"),g.type="button",g.className="clf-trigger",g.textContent=(de=o.label)!=null?de:t.triggerLabel,g.setAttribute("aria-haspopup","dialog"),o.kind==="sticky"){let u=(pe=o.edge)!=null?pe:"right";g.classList.add("clf-trigger--sticky",`clf-trigger--${u}`);let s=(fe=o.offset)!=null?fe:"50%",x=typeof s=="number"?`${s}px`:s;u==="left"||u==="right"?g.style.top=x:g.style.left=x}else{let u=(ue=o.corner)!=null?ue:"bottom-right",s=`${(ge=o.inset)!=null?ge:20}px`;g.classList.add("clf-trigger--floating"),u.startsWith("bottom")?g.style.bottom=s:g.style.top=s,u.endsWith("right")?g.style.right=s:g.style.left=s}g.addEventListener("click",()=>w()),l.appendChild(g)}function z(u){u.innerHTML=y.map((s,x)=>`<div class="clf-thumb"><img src="${d(s.preview)}" alt=""><button type="button" data-i="${x}" aria-label="Remove attachment">\xD7</button></div>`).join(""),u.querySelectorAll("button[data-i]").forEach(s=>{s.addEventListener("click",()=>{y.splice(Number(s.dataset.i),1),z(u)})})}async function R(u,s,x){for(let E of Array.from(u))if(E.type.startsWith("image/")){if(y.length>=Se){x(`Up to ${Se} images.`);break}if(E.size>Xe){x(`"${E.name}" is over 5MB.`);continue}try{let O=await Ze(E);y.push({...O,preview:URL.createObjectURL(E)})}catch{x("Could not read that image.")}}z(s)}function w(u){var be,ve;if(P||f)return;u&&i.includes(u)&&(h=u),S=document.activeElement,f=document.createElement("div"),f.className="clf-overlay",f.innerHTML=`
|
|
226
|
+
<div class="clf-dialog" role="dialog" aria-modal="true" aria-label="${d(t.dialogTitle)}">
|
|
227
|
+
<div class="clf-head">
|
|
228
|
+
<h2>${d(t.dialogTitle)}</h2>
|
|
229
|
+
<button type="button" class="clf-x" aria-label="${d(t.cancel)}">\xD7</button>
|
|
230
|
+
</div>
|
|
231
|
+
<div class="clf-body">
|
|
232
|
+
<div class="clf-field">
|
|
233
|
+
<span class="clf-label">${d(t.typeLabel)}</span>
|
|
234
|
+
<div class="clf-types">
|
|
235
|
+
${i.map(a=>`<button type="button" class="clf-type" data-type="${d(a)}" aria-pressed="${a===h}">${d(Ye[a]||a)}</button>`).join("")}
|
|
236
|
+
</div>
|
|
237
|
+
</div>
|
|
238
|
+
${L.length?`
|
|
239
|
+
<div class="clf-field">
|
|
240
|
+
<label class="clf-label" for="clf-service">${d(e.serviceLabel||t.serviceLabel)}</label>
|
|
241
|
+
<select class="clf-input" id="clf-service">
|
|
242
|
+
<option value="">${d(t.servicePlaceholder)}</option>
|
|
243
|
+
${L.map(a=>`<option value="${d(a)}">${d(a)}</option>`).join("")}
|
|
244
|
+
</select>
|
|
245
|
+
</div>`:""}
|
|
246
|
+
<div class="clf-field">
|
|
247
|
+
<label class="clf-label" for="clf-title">${d(t.titleLabel)}</label>
|
|
248
|
+
<input class="clf-input" id="clf-title" type="text" placeholder="${d(t.titlePlaceholder)}" maxlength="200">
|
|
249
|
+
</div>
|
|
250
|
+
<div class="clf-field">
|
|
251
|
+
<label class="clf-label" for="clf-desc">${d(t.descriptionLabel)}</label>
|
|
252
|
+
${e.formatting===!1?"":`
|
|
253
|
+
<div class="clf-toolbar" role="group" aria-label="${d(t.formattingLabel)}">
|
|
254
|
+
${$e.map(a=>`<button type="button" class="clf-fmt" data-fmt="${d(a.id)}" title="${d(a.title)}" aria-label="${d(a.title)}">${a.icon}</button>`).join("")}
|
|
255
|
+
</div>`}
|
|
256
|
+
<textarea class="clf-textarea" id="clf-desc" placeholder="${d(t.descriptionPlaceholder)}"></textarea>
|
|
257
|
+
<span class="clf-attach-hint">${d(t.attachHint)}</span>
|
|
258
|
+
<div class="clf-thumbs"></div>
|
|
259
|
+
</div>
|
|
260
|
+
${(be=e.user)!=null&&be.email?"":`
|
|
261
|
+
<div class="clf-field">
|
|
262
|
+
<label class="clf-label" for="clf-email">${d(t.emailLabel)}</label>
|
|
263
|
+
<input class="clf-input" id="clf-email" type="email" placeholder="you@example.com">
|
|
264
|
+
</div>`}
|
|
265
|
+
<div class="clf-error" hidden></div>
|
|
266
|
+
</div>
|
|
267
|
+
<div class="clf-foot">
|
|
268
|
+
<span class="clf-spacer"></span>
|
|
269
|
+
<button type="button" class="clf-btn clf-btn--ghost">${d(t.cancel)}</button>
|
|
270
|
+
<button type="button" class="clf-btn clf-btn--primary">${d(t.submit)}</button>
|
|
271
|
+
</div>
|
|
272
|
+
</div>`,l.appendChild(f);let s=a=>f.querySelector(a),x=s("#clf-title"),E=s("#clf-desc"),O=f.querySelector("#clf-email"),Q=s(".clf-error");f.querySelectorAll(".clf-fmt").forEach(a=>{a.addEventListener("mousedown",v=>{v.preventDefault();let $=$e.find(V=>V.id===a.dataset.fmt);$&&et(E,$)})});let G=f.querySelector("#clf-service");G==null||G.addEventListener("change",()=>{m=G.value||void 0});let he=s(".clf-thumbs"),B=s(".clf-btn--primary"),K=a=>{Q.textContent=a,Q.hidden=!1},je=()=>{Q.hidden=!0};f.querySelectorAll(".clf-type").forEach(a=>{a.addEventListener("click",()=>{h=a.dataset.type,f.querySelectorAll(".clf-type").forEach(v=>v.setAttribute("aria-pressed",String(v.dataset.type===h)))})}),E.addEventListener("paste",a=>{var $;let v=Array.from((($=a.clipboardData)==null?void 0:$.files)||[]);v.length&&(a.preventDefault(),R(v,he,K))});let me=a=>{a.preventDefault(),a.stopPropagation()};f.addEventListener("dragover",me),f.addEventListener("drop",a=>{var v;me(a),(v=a.dataTransfer)!=null&&v.files.length&&R(a.dataTransfer.files,he,K)}),s(".clf-x").addEventListener("click",()=>T()),s(".clf-btn--ghost").addEventListener("click",()=>T()),f.addEventListener("mousedown",a=>{a.target===f&&T()}),B.addEventListener("click",async()=>{var $,V,xe,ke;let a=x.value.trim(),v=E.value.trim();if(!a||!v){K(t.required);return}je(),B.disabled=!0,B.textContent=t.submitting;try{let M=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({type:h==="feedback"?"other":h,title:a,description:e.metadata&&Object.keys(e.metadata).length?`${v}
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
${Object.entries(e.metadata).map(([Z,ee])=>`**${Z}:** ${ee}`).join(`
|
|
276
|
+
`)}`:v,submitterEmail:(($=e.user)==null?void 0:$.email)||(O==null?void 0:O.value.trim())||void 0,submitterName:((V=e.user)==null?void 0:V.name)||void 0,url:location.href,userAgent:navigator.userAgent,source:e.source||"feedback",...m?{service:m}:{},attachments:y.map(({data:Z,mimeType:ee,filename:Ie})=>({data:Z,mimeType:ee,filename:Ie}))})});if(!M.ok)throw new Error(`HTTP ${M.status}`);let Fe=await M.json().catch(()=>({}));k(),(xe=e.onSubmit)==null||xe.call(e,{submissionId:Fe.submissionId})}catch(M){B.disabled=!1,B.textContent=t.submit,K(t.failed),(ke=e.onError)==null||ke.call(e,M instanceof Error?M:new Error(String(M)))}}),document.addEventListener("keydown",_),x.focus(),(ve=e.onOpen)==null||ve.call(e)}function k(){if(!f)return;let u=f.querySelector(".clf-dialog");u.innerHTML=`
|
|
277
|
+
<div class="clf-success">
|
|
278
|
+
<div class="clf-success__tick">\u2713</div>
|
|
279
|
+
<div class="clf-success__title">${d(t.successTitle)}</div>
|
|
280
|
+
<div class="clf-success__body">${d(t.successBody)}</div>
|
|
281
|
+
</div>`,setTimeout(()=>T(),1800)}function _(u){u.key==="Escape"&&T()}function T(){var u,s;f&&(document.removeEventListener("keydown",_),y.forEach(x=>URL.revokeObjectURL(x.preview)),y=[],f.remove(),f=null,(u=S==null?void 0:S.focus)==null||u.call(S),(s=e.onClose)==null||s.call(e))}function A(){T(),P=!0,g==null||g.remove(),l.remove()}return{open:w,close:T,destroy:A}}var tt=_e;var oe={};X(oe,{init:()=>lt});var J=class{constructor(t,i){this.base=t.replace(/\/$/,""),this.slug=i}async req(t,i){let r=await fetch(`${this.base}/api/v1/public/guides/${this.slug}${t}`,{headers:{"Content-Type":"application/json"},...i});if(!r.ok)throw new Error(`GuideSDK: ${r.status} ${t}`);return r.json()}async getCategories(){return this.req("/categories")}async getArticle(t){return this.req(`/articles/${t}`)}async search(t,i){return(await this.req("/search",{method:"POST",body:JSON.stringify({query:t,topK:i})})).results}};var N=class{constructor(t,i,r,n,o="two-col",l,c){this.categories=[];this.searchTimer=null;this.client=t,this.guideTitle=i,this.logoUrl=r,this.hero=l,this.container=n,this.layout=o,this.buildShell(c),this.loadCategories()}buildShell(t){this.container.innerHTML=`
|
|
282
|
+
<div class="cl-sdk-wrap layout-${this.layout}">
|
|
283
|
+
<div class="cl-sdk-header">
|
|
284
|
+
${this.logoUrl?`<img class="cl-sdk-logo" src="${this.logoUrl}" alt="logo" />`:""}
|
|
285
|
+
<span class="cl-sdk-title">${this.guideTitle}</span>
|
|
286
|
+
${t?'<button class="cl-sdk-close" aria-label="Close">✕</button>':""}
|
|
287
|
+
</div>
|
|
288
|
+
<div class="cl-sdk-search">
|
|
289
|
+
<input type="search" placeholder="Search articles\u2026" autocomplete="off" spellcheck="false" />
|
|
290
|
+
</div>
|
|
291
|
+
<div class="cl-sdk-body">
|
|
292
|
+
<div class="cl-sdk-loading">Loading\u2026</div>
|
|
293
|
+
</div>
|
|
294
|
+
</div>
|
|
295
|
+
`,this.bodyEl=this.container.querySelector(".cl-sdk-body"),this.searchInput=this.container.querySelector('input[type="search"]');let i=this.container.querySelector(".cl-sdk-close");i&&t&&i.addEventListener("click",t),this.searchInput.addEventListener("input",()=>this.onSearchInput())}async loadCategories(){this.categories=await this.client.getCategories(),this.renderIndex()}renderIndex(){if(!this.categories.length){this.bodyEl.innerHTML='<div class="cl-sdk-empty">No articles published yet.</div>';return}let t=this.categories.map(r=>({label:this.formatCatLabel(r.category),articles:r.articles})),i=this.buildHeroHtml();if(this.layout==="two-col"){let{left:r,right:n}=this.splitColumns(t);this.bodyEl.innerHTML=`
|
|
296
|
+
${i}
|
|
297
|
+
<div class="cl-sdk-index">
|
|
298
|
+
<div class="cl-sdk-index-col">${this.renderIndexCol(r)}</div>
|
|
299
|
+
<div class="cl-sdk-index-col">${this.renderIndexCol(n)}</div>
|
|
300
|
+
</div>
|
|
301
|
+
`}else this.bodyEl.innerHTML=`
|
|
302
|
+
${i}
|
|
303
|
+
<div class="cl-sdk-index cl-sdk-index--one-col">
|
|
304
|
+
<div class="cl-sdk-index-col">${this.renderIndexCol(t)}</div>
|
|
305
|
+
</div>
|
|
306
|
+
`;this.bodyEl.querySelectorAll(".cl-sdk-index-item").forEach(r=>{r.addEventListener("click",()=>{this.openArticle(r.dataset.slug)})}),this.bodyEl.querySelectorAll("[data-hero-slug]").forEach(r=>{r.addEventListener("click",()=>{this.openArticle(r.dataset.heroSlug)})})}buildHeroHtml(){var i;if(!this.hero)return"";let t=(i=this.hero.links)!=null&&i.length?'<div class="cl-sdk-hero-links">'+this.hero.links.map(r=>`<button class="cl-sdk-hero-link" data-hero-slug="${r.slug}">${r.label}</button>`).join("")+"</div>":"";return`
|
|
307
|
+
<div class="cl-sdk-hero" style="${this.hero.bg?`background:${this.hero.bg};`:""}${this.hero.color?`color:${this.hero.color};`:""}">
|
|
308
|
+
${this.hero.heading?`<div class="cl-sdk-hero-heading">${this.hero.heading}</div>`:""}
|
|
309
|
+
${this.hero.body?`<div class="cl-sdk-hero-body">${this.hero.body}</div>`:""}
|
|
310
|
+
${t}
|
|
311
|
+
</div>
|
|
312
|
+
`}renderIndexCol(t){return t.map(i=>`<div class="cl-sdk-idx-cat">${i.label}</div>`+i.articles.map(r=>`<button class="cl-sdk-index-item" data-slug="${r.slug}">
|
|
313
|
+
<span class="cl-sdk-index-item-title">${r.title}</span>
|
|
314
|
+
<span class="cl-sdk-index-item-chevron">\u203A</span>
|
|
315
|
+
</button>`).join("")).join("")}splitColumns(t){let i=t.reduce((l,c)=>l+c.articles.length,0),r=[],n=[],o=0;for(let l of t)o<Math.ceil(i/2)?(r.push(l),o+=l.articles.length):n.push(l);return{left:r,right:n}}async showArticle(t){this.openArticle(t)}async openArticle(t){this.bodyEl.innerHTML=`
|
|
316
|
+
<div class="cl-sdk-article-view">
|
|
317
|
+
<button class="cl-sdk-back">\u2039 All articles</button>
|
|
318
|
+
<div class="cl-sdk-article-content"><div class="cl-sdk-loading">Loading\u2026</div></div>
|
|
319
|
+
</div>
|
|
320
|
+
`,this.bodyEl.querySelector(".cl-sdk-back").addEventListener("click",()=>this.renderIndex());let i=this.bodyEl.querySelector(".cl-sdk-article-content");try{let r=await this.client.getArticle(t);i.innerHTML=r.html,i.scrollTop=0,this.bodyEl.scrollTop=0}catch{i.innerHTML='<div class="cl-sdk-empty">Article not found.</div>'}}onSearchInput(){this.searchTimer&&clearTimeout(this.searchTimer);let t=this.searchInput.value.trim();if(!t){this.renderIndex();return}this.searchTimer=setTimeout(()=>{this.runSearch(t)},300)}async runSearch(t){this.bodyEl.innerHTML='<div class="cl-sdk-loading">Searching\u2026</div>';try{let i=await this.client.search(t,8);if(!i.length){this.bodyEl.innerHTML='<div class="cl-sdk-empty">No results found.</div>';return}this.bodyEl.innerHTML='<div class="cl-sdk-search-results">'+i.map(r=>`<div class="cl-sdk-sr-item" data-id="${r.articleId}">
|
|
321
|
+
<div class="cl-sdk-sr-title">${r.articleTitle}</div>
|
|
322
|
+
<div class="cl-sdk-sr-snippet">${r.snippet}</div>
|
|
323
|
+
</div>`).join("")+"</div>",this.bodyEl.querySelectorAll(".cl-sdk-sr-item").forEach(r=>{let n=this.categories.flatMap(o=>o.articles).find(o=>o.id===r.dataset.id);n&&r.addEventListener("click",()=>{this.openArticle(n.slug)})})}catch{this.bodyEl.innerHTML='<div class="cl-sdk-empty">Search failed.</div>'}}formatCatLabel(t){return t.replace(/-/g," ")}};function Me(e={}){let t=e.primaryColor||"#6366f1",i=e.fontFamily||"system-ui, sans-serif",r=e.borderRadius||"10px";return`
|
|
324
|
+
--cl-sdk-primary: ${t};
|
|
325
|
+
--cl-sdk-primary-muted: ${t}22;
|
|
326
|
+
--cl-sdk-font: ${i};
|
|
327
|
+
--cl-sdk-radius: ${r};
|
|
328
|
+
--cl-sdk-bg: #13141f;
|
|
329
|
+
--cl-sdk-surface: #1c1d2e;
|
|
330
|
+
--cl-sdk-surface-2: #23243a;
|
|
331
|
+
--cl-sdk-border: rgba(255,255,255,0.08);
|
|
332
|
+
--cl-sdk-text: #e8eaf0;
|
|
333
|
+
--cl-sdk-text-muted: #7b809a;
|
|
334
|
+
--cl-sdk-text-secondary: #b0b4c8;
|
|
335
|
+
`}var Ae=`
|
|
336
|
+
.cl-sdk-wrap *, .cl-sdk-wrap *::before, .cl-sdk-wrap *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
337
|
+
|
|
338
|
+
/* \u2500\u2500 Shell \u2500\u2500 */
|
|
339
|
+
.cl-sdk-wrap {
|
|
340
|
+
font-family: var(--cl-sdk-font);
|
|
341
|
+
font-size: 14px;
|
|
342
|
+
color: var(--cl-sdk-text);
|
|
343
|
+
background: var(--cl-sdk-bg);
|
|
344
|
+
border-radius: var(--cl-sdk-wrap-radius, 0);
|
|
345
|
+
display: flex;
|
|
346
|
+
flex-direction: column;
|
|
347
|
+
height: 100%;
|
|
348
|
+
max-height: 100%;
|
|
349
|
+
overflow: hidden;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/* \u2500\u2500 Header \u2500\u2500 */
|
|
353
|
+
.cl-sdk-header {
|
|
354
|
+
display: flex; align-items: center; gap: 12px;
|
|
355
|
+
padding: 16px 20px;
|
|
356
|
+
border-bottom: 1px solid var(--cl-sdk-border);
|
|
357
|
+
background: var(--cl-sdk-surface);
|
|
358
|
+
flex-shrink: 0; min-height: 56px;
|
|
359
|
+
}
|
|
360
|
+
.cl-sdk-logo { height: 26px; object-fit: contain; }
|
|
361
|
+
.cl-sdk-title { font-size: 15px; font-weight: 700; flex: 1; letter-spacing: -0.2px; }
|
|
362
|
+
.cl-sdk-close {
|
|
363
|
+
background: none; border: none; cursor: pointer;
|
|
364
|
+
color: var(--cl-sdk-text-muted); font-size: 18px; line-height: 1;
|
|
365
|
+
padding: 4px 8px; border-radius: 6px; transition: all 0.15s;
|
|
366
|
+
}
|
|
367
|
+
.cl-sdk-close:hover { background: rgba(255,255,255,0.08); color: var(--cl-sdk-text); }
|
|
368
|
+
|
|
369
|
+
/* \u2500\u2500 Search \u2500\u2500 */
|
|
370
|
+
.cl-sdk-search {
|
|
371
|
+
padding: 12px 16px;
|
|
372
|
+
border-bottom: 1px solid var(--cl-sdk-border);
|
|
373
|
+
background: var(--cl-sdk-surface);
|
|
374
|
+
flex-shrink: 0;
|
|
375
|
+
}
|
|
376
|
+
.cl-sdk-search input {
|
|
377
|
+
width: 100%; padding: 8px 12px;
|
|
378
|
+
background: var(--cl-sdk-bg); border: 1px solid var(--cl-sdk-border);
|
|
379
|
+
border-radius: 8px; color: var(--cl-sdk-text); font-size: 13px; outline: none;
|
|
380
|
+
transition: border-color 0.15s;
|
|
381
|
+
}
|
|
382
|
+
.cl-sdk-search input::placeholder { color: var(--cl-sdk-text-muted); }
|
|
383
|
+
.cl-sdk-search input:focus { border-color: var(--cl-sdk-primary); }
|
|
384
|
+
|
|
385
|
+
/* \u2500\u2500 Body \u2014 scrollable container \u2500\u2500 */
|
|
386
|
+
.cl-sdk-body { flex: 1; overflow-y: auto; min-height: 0; overscroll-behavior: contain; }
|
|
387
|
+
.cl-sdk-body::-webkit-scrollbar { width: 4px; }
|
|
388
|
+
.cl-sdk-body::-webkit-scrollbar-thumb { background: var(--cl-sdk-border); border-radius: 4px; }
|
|
389
|
+
|
|
390
|
+
/* \u2500\u2500 Hero banner \u2500\u2500 */
|
|
391
|
+
.cl-sdk-hero {
|
|
392
|
+
padding: 20px 20px 18px;
|
|
393
|
+
background: var(--cl-sdk-surface-2);
|
|
394
|
+
border-bottom: 1px solid var(--cl-sdk-border);
|
|
395
|
+
}
|
|
396
|
+
.cl-sdk-hero-heading {
|
|
397
|
+
font-size: 16px; font-weight: 700; margin-bottom: 6px;
|
|
398
|
+
color: inherit; letter-spacing: -0.2px;
|
|
399
|
+
}
|
|
400
|
+
.cl-sdk-hero-body {
|
|
401
|
+
font-size: 13px; line-height: 1.55; color: inherit; opacity: 0.8; margin-bottom: 14px;
|
|
402
|
+
}
|
|
403
|
+
.cl-sdk-hero-links { display: flex; flex-wrap: wrap; gap: 8px; }
|
|
404
|
+
.cl-sdk-hero-link {
|
|
405
|
+
padding: 6px 14px;
|
|
406
|
+
background: rgba(255,255,255,0.12); border: 1px solid rgba(255,255,255,0.2);
|
|
407
|
+
border-radius: 20px; color: inherit; font-size: 12px; font-weight: 600;
|
|
408
|
+
cursor: pointer; transition: background 0.15s;
|
|
409
|
+
white-space: nowrap;
|
|
410
|
+
}
|
|
411
|
+
.cl-sdk-hero-link:hover { background: rgba(255,255,255,0.2); }
|
|
412
|
+
|
|
413
|
+
/* \u2500\u2500 Article index grid \u2500\u2500 */
|
|
414
|
+
.cl-sdk-index {
|
|
415
|
+
display: grid;
|
|
416
|
+
grid-template-columns: 1fr 1fr;
|
|
417
|
+
gap: 0;
|
|
418
|
+
padding: 8px 0 24px;
|
|
419
|
+
}
|
|
420
|
+
.cl-sdk-index--one-col { grid-template-columns: 1fr; }
|
|
421
|
+
.cl-sdk-index-col { padding: 0; }
|
|
422
|
+
|
|
423
|
+
/* Category label */
|
|
424
|
+
.cl-sdk-idx-cat {
|
|
425
|
+
padding: 20px 20px 6px;
|
|
426
|
+
font-size: 10px; font-weight: 800;
|
|
427
|
+
text-transform: uppercase; letter-spacing: 0.1em;
|
|
428
|
+
color: var(--cl-sdk-text-muted);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/* Article row */
|
|
432
|
+
.cl-sdk-index-item {
|
|
433
|
+
display: flex; align-items: center; justify-content: space-between; gap: 8px;
|
|
434
|
+
width: 100%; text-align: left; background: none;
|
|
435
|
+
border: none; border-bottom: 1px solid var(--cl-sdk-border);
|
|
436
|
+
padding: 11px 20px;
|
|
437
|
+
cursor: pointer; transition: background 0.12s;
|
|
438
|
+
}
|
|
439
|
+
.cl-sdk-index-item:hover { background: var(--cl-sdk-surface-2); }
|
|
440
|
+
.cl-sdk-index-item-title {
|
|
441
|
+
font-size: 13px; color: var(--cl-sdk-text-secondary);
|
|
442
|
+
line-height: 1.4; flex: 1;
|
|
443
|
+
transition: color 0.12s;
|
|
444
|
+
}
|
|
445
|
+
.cl-sdk-index-item:hover .cl-sdk-index-item-title { color: var(--cl-sdk-text); }
|
|
446
|
+
.cl-sdk-index-item-chevron {
|
|
447
|
+
color: var(--cl-sdk-text-muted); font-size: 16px; flex-shrink: 0; opacity: 0.5;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/* \u2500\u2500 Article view \u2500\u2500 */
|
|
451
|
+
.cl-sdk-article-view { display: flex; flex-direction: column; min-height: min-content; }
|
|
452
|
+
.cl-sdk-back {
|
|
453
|
+
display: flex; align-items: center; gap: 6px;
|
|
454
|
+
padding: 12px 20px;
|
|
455
|
+
border: none; border-bottom: 1px solid var(--cl-sdk-border);
|
|
456
|
+
background: var(--cl-sdk-surface);
|
|
457
|
+
color: var(--cl-sdk-primary); font-size: 13px; font-weight: 600;
|
|
458
|
+
cursor: pointer; width: 100%; text-align: left;
|
|
459
|
+
transition: opacity 0.15s; flex-shrink: 0;
|
|
460
|
+
}
|
|
461
|
+
.cl-sdk-back:hover { opacity: 0.75; }
|
|
462
|
+
.cl-sdk-article-content { padding: 24px 24px 40px; flex: 1; }
|
|
463
|
+
|
|
464
|
+
/* \u2500\u2500 Article typography \u2500\u2500 */
|
|
465
|
+
.cl-sdk-article-content h1 {
|
|
466
|
+
font-size: 20px; font-weight: 700; margin-bottom: 16px;
|
|
467
|
+
color: var(--cl-sdk-text); letter-spacing: -0.3px; line-height: 1.3;
|
|
468
|
+
}
|
|
469
|
+
.cl-sdk-article-content h2 {
|
|
470
|
+
font-size: 15px; font-weight: 700; margin: 24px 0 8px;
|
|
471
|
+
color: var(--cl-sdk-text);
|
|
472
|
+
}
|
|
473
|
+
.cl-sdk-article-content h3 {
|
|
474
|
+
font-size: 12px; font-weight: 800; margin: 18px 0 6px;
|
|
475
|
+
color: var(--cl-sdk-text-muted); text-transform: uppercase; letter-spacing: 0.07em;
|
|
476
|
+
}
|
|
477
|
+
.cl-sdk-article-content p {
|
|
478
|
+
line-height: 1.7; margin-bottom: 14px; color: var(--cl-sdk-text-secondary);
|
|
479
|
+
}
|
|
480
|
+
.cl-sdk-article-content ul, .cl-sdk-article-content ol {
|
|
481
|
+
padding-left: 22px; margin-bottom: 14px;
|
|
482
|
+
}
|
|
483
|
+
.cl-sdk-article-content li {
|
|
484
|
+
line-height: 1.65; color: var(--cl-sdk-text-secondary); margin-bottom: 4px;
|
|
485
|
+
}
|
|
486
|
+
.cl-sdk-article-content strong { color: var(--cl-sdk-text); }
|
|
487
|
+
.cl-sdk-article-content code {
|
|
488
|
+
background: rgba(255,255,255,0.07); padding: 2px 6px;
|
|
489
|
+
border-radius: 4px; font-size: 12px; font-family: monospace; color: var(--cl-sdk-text);
|
|
490
|
+
}
|
|
491
|
+
.cl-sdk-article-content pre {
|
|
492
|
+
background: rgba(0,0,0,0.4); border-radius: 8px;
|
|
493
|
+
padding: 14px 16px; overflow-x: auto; margin-bottom: 14px;
|
|
494
|
+
border: 1px solid var(--cl-sdk-border);
|
|
495
|
+
}
|
|
496
|
+
.cl-sdk-article-content pre code { background: none; padding: 0; }
|
|
497
|
+
.cl-sdk-article-content a { color: var(--cl-sdk-primary); }
|
|
498
|
+
.cl-sdk-article-content hr { border: none; border-top: 1px solid var(--cl-sdk-border); margin: 20px 0; }
|
|
499
|
+
.cl-sdk-article-content table {
|
|
500
|
+
width: 100%; border-collapse: collapse; margin-bottom: 16px; font-size: 13px;
|
|
501
|
+
}
|
|
502
|
+
.cl-sdk-article-content th {
|
|
503
|
+
text-align: left; padding: 8px 12px;
|
|
504
|
+
background: var(--cl-sdk-surface-2); color: var(--cl-sdk-text);
|
|
505
|
+
font-weight: 700; font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em;
|
|
506
|
+
border-bottom: 2px solid var(--cl-sdk-border);
|
|
507
|
+
}
|
|
508
|
+
.cl-sdk-article-content td {
|
|
509
|
+
padding: 8px 12px; color: var(--cl-sdk-text-secondary);
|
|
510
|
+
border-bottom: 1px solid var(--cl-sdk-border); vertical-align: top;
|
|
511
|
+
line-height: 1.5;
|
|
512
|
+
}
|
|
513
|
+
.cl-sdk-article-content tr:last-child td { border-bottom: none; }
|
|
514
|
+
.cl-sdk-article-content tr:hover td { background: var(--cl-sdk-surface-2); }
|
|
515
|
+
|
|
516
|
+
/* \u2500\u2500 Search results \u2500\u2500 */
|
|
517
|
+
.cl-sdk-search-results { padding: 8px 0; }
|
|
518
|
+
.cl-sdk-sr-item {
|
|
519
|
+
padding: 12px 20px; cursor: pointer;
|
|
520
|
+
border-bottom: 1px solid var(--cl-sdk-border); transition: background 0.12s;
|
|
521
|
+
}
|
|
522
|
+
.cl-sdk-sr-item:hover { background: var(--cl-sdk-surface-2); }
|
|
523
|
+
.cl-sdk-sr-title { font-size: 13px; font-weight: 600; color: var(--cl-sdk-text); }
|
|
524
|
+
.cl-sdk-sr-snippet { font-size: 12px; color: var(--cl-sdk-text-muted); margin-top: 3px; line-height: 1.45; }
|
|
525
|
+
|
|
526
|
+
/* \u2500\u2500 States \u2500\u2500 */
|
|
527
|
+
.cl-sdk-empty { padding: 48px 20px; text-align: center; color: var(--cl-sdk-text-muted); font-size: 13px; }
|
|
528
|
+
.cl-sdk-loading { padding: 48px 20px; text-align: center; color: var(--cl-sdk-text-muted); font-size: 13px; }
|
|
529
|
+
|
|
530
|
+
/* \u2500\u2500 Overlay \u2500\u2500 */
|
|
531
|
+
.cl-sdk-overlay {
|
|
532
|
+
position: fixed; inset: 0; background: rgba(0,0,0,0.5);
|
|
533
|
+
z-index: 99998; opacity: 0; transition: opacity 0.25s; pointer-events: none;
|
|
534
|
+
}
|
|
535
|
+
.cl-sdk-overlay.open { opacity: 1; pointer-events: auto; }
|
|
536
|
+
|
|
537
|
+
/* \u2500\u2500 Drawer \u2500\u2500 */
|
|
538
|
+
.cl-sdk-drawer {
|
|
539
|
+
position: fixed;
|
|
540
|
+
width: min(560px, 96vw);
|
|
541
|
+
z-index: 99999;
|
|
542
|
+
background: var(--cl-sdk-bg);
|
|
543
|
+
box-shadow: -4px 0 40px rgba(0,0,0,0.5);
|
|
544
|
+
transition: transform 0.3s cubic-bezier(.4,0,.2,1);
|
|
545
|
+
display: flex; flex-direction: column;
|
|
546
|
+
overflow: hidden;
|
|
547
|
+
/* Explicit height so child flex items can scroll */
|
|
548
|
+
height: 100dvh;
|
|
549
|
+
}
|
|
550
|
+
.cl-sdk-drawer.right {
|
|
551
|
+
right: var(--cl-sdk-drawer-margin, 0);
|
|
552
|
+
top: var(--cl-sdk-drawer-margin, 0);
|
|
553
|
+
left: auto;
|
|
554
|
+
height: calc(100dvh - var(--cl-sdk-drawer-margin, 0px) - var(--cl-sdk-drawer-margin, 0px));
|
|
555
|
+
transform: translateX(calc(100% + var(--cl-sdk-drawer-margin, 0px)));
|
|
556
|
+
border-radius: var(--cl-sdk-drawer-radius, 0) 0 0 var(--cl-sdk-drawer-radius, 0);
|
|
557
|
+
}
|
|
558
|
+
.cl-sdk-drawer.right.has-margin {
|
|
559
|
+
border-radius: var(--cl-sdk-drawer-radius, 12px);
|
|
560
|
+
box-shadow: 0 8px 48px rgba(0,0,0,0.6);
|
|
561
|
+
}
|
|
562
|
+
.cl-sdk-drawer.left {
|
|
563
|
+
left: var(--cl-sdk-drawer-margin, 0);
|
|
564
|
+
top: var(--cl-sdk-drawer-margin, 0);
|
|
565
|
+
right: auto;
|
|
566
|
+
height: calc(100dvh - var(--cl-sdk-drawer-margin, 0px) - var(--cl-sdk-drawer-margin, 0px));
|
|
567
|
+
transform: translateX(calc(-100% - var(--cl-sdk-drawer-margin, 0px)));
|
|
568
|
+
border-radius: 0 var(--cl-sdk-drawer-radius, 0) var(--cl-sdk-drawer-radius, 0) 0;
|
|
569
|
+
}
|
|
570
|
+
.cl-sdk-drawer.left.has-margin {
|
|
571
|
+
border-radius: var(--cl-sdk-drawer-radius, 12px);
|
|
572
|
+
box-shadow: 0 8px 48px rgba(0,0,0,0.6);
|
|
573
|
+
}
|
|
574
|
+
.cl-sdk-drawer.open { transform: translateX(0); }
|
|
575
|
+
`;var rt="https://api.clearlaunch.ai";function it(e){let t="cl-sdk-styles";if(document.getElementById(t))return;let i=document.createElement("style");i.id=t,i.textContent=Ae+`:root { ${e} }`,document.head.appendChild(i)}function nt(e){return e?typeof e=="string"?document.querySelector(e):e:null}async function lt(e){var j,F,I,q,U,D;let t=e.apiUrl||rt,i=new J(t,e.guide),r=e.guide,n="inpage",o="right",l="two-col",c={};try{let p=await fetch(`${t}/api/v1/public/guides/${e.guide}/config`);if(p.ok){let b=await p.json();r=b.guideTitle||r,n=((j=b.sdkConfig)==null?void 0:j.renderMode)||n,o=((F=b.sdkConfig)==null?void 0:F.slideoutSide)||o,l=((I=b.sdkConfig)==null?void 0:I.layout)||l,c=((q=b.sdkConfig)==null?void 0:q.theme)||{}}}catch{}let h=e.mode||n,L=e.side||o,m=e.layout||l,y=e.hero,f={...c,...e.theme},S=Me(f),P=f.logoUrl;if(h==="api")return{getCategories:()=>i.getCategories(),getArticle:p=>i.getArticle(p),search:(p,b)=>i.search(p,b),open:()=>{},close:()=>{},destroy:()=>{}};if(it(S),h==="inpage"){let p=nt(e.target);if(!p)throw new Error("GuideSDK inpage mode requires a valid `target` element");p.style.setProperty("height",p.style.height||"100%");let b=new N(i,r,P,p,m,y);return{getCategories:()=>i.getCategories(),getArticle:C=>i.getArticle(C),search:(C,W)=>i.search(C,W),open:C=>{C&&b.showArticle(C)},close:()=>{},destroy:()=>{p.innerHTML=""}}}let g=(U=e.drawerMargin)!=null?U:"0",z=g!=="0"&&g!=="0px",R=(D=e.drawerRadius)!=null?D:z?"12px":"0",w=document.createElement("div");w.className="cl-sdk-overlay";let k=document.createElement("div");k.className=`cl-sdk-drawer ${L}${z?" has-margin":""}`,k.style.setProperty("--cl-sdk-drawer-margin",g),k.style.setProperty("--cl-sdk-drawer-radius",R),k.style.setProperty("--cl-sdk-wrap-radius",R);let _=null;function T(p){document.body.contains(w)||(document.body.appendChild(w),document.body.appendChild(k)),_||(_=new N(i,r,P,k,m,y,A)),requestAnimationFrame(()=>{w.classList.add("open"),k.classList.add("open")}),p&&_.showArticle(p),w.addEventListener("click",A,{once:!0})}function A(){w.classList.remove("open"),k.classList.remove("open")}return{getCategories:()=>i.getCategories(),getArticle:p=>i.getArticle(p),search:(p,b)=>i.search(p,b),open:p=>T(p),close:()=>A(),destroy:()=>{A(),w.remove(),k.remove(),_=null}}}var He=new Map;function H(e,t){He.set(e,t)}function ae(e,t){throw new Error(`[clearlaunch] The "${t}" capability needs ${e}, which isn't installed.
|
|
576
|
+
Install it: npm install ${e}
|
|
577
|
+
Or, if your bundler can't resolve optional peers, register it yourself:
|
|
578
|
+
import * as mod from '${e}';
|
|
579
|
+
import { register } from '@clearlaunch/sdk';
|
|
580
|
+
register('${e}', mod);`)}function se(e){let t=He.get(e);if(t)return t;try{let i=typeof module!="undefined"&&typeof re=="function"?re:void 0;if(i)return i(e)}catch{}return null}function ot(e,t){async function i(){let r=await e.config();return r.feedback&&r.feedback.enabled?r.feedback:null}return{async enabled(){return!!await i()},async services(){var n;let r=await i();return(n=r==null?void 0:r.services)!=null?n:[]},async mount(r={}){var h,L;let n=await i();if(!n)throw new Error("[clearlaunch] Feedback is not enabled for this project. Turn it on in ClearLaunch \u2192 project \u2192 Feedback.");let o=se("@clearlaunch/feedback");if(o!=null&&o.mountFeedback||ae("@clearlaunch/feedback","ticketing"),r.service&&((h=n.services)!=null&&h.length)&&!n.services.includes(r.service))throw new Error(`[clearlaunch] service "${r.service}" is not declared on this project. Declared: ${n.services.join(", ")}. Add it in ClearLaunch \u2192 project \u2192 Feedback.`);let{service:l,...c}=r;return o.mountFeedback({...c,...l?{service:l}:(L=n.services)!=null&&L.length?{services:n.services}:{},token:n.token,...t?{apiUrl:t}:{}})}}}function at(e,t){async function i(){var n;return(n=(await e.config()).guides)!=null?n:{slugs:[],default:void 0}}return{async slugs(){var r;return(r=(await i()).slugs)!=null?r:[]},async defaultSlug(){return(await i()).default},async mount(r={}){var c,h;let n=await i(),o=(c=r.slug)!=null?c:n.default;if(!o)throw new Error("[clearlaunch] This project has no published guide. Publish one in ClearLaunch \u2192 project \u2192 Guides, or pass an explicit `slug`.");if(r.slug&&((h=n.slugs)!=null&&h.length)&&!n.slugs.includes(r.slug))throw new Error(`[clearlaunch] guide "${r.slug}" is not published on this project. Published: ${n.slugs.join(", ")}.`);let l=se("@clearlaunch/guide-sdk");return l!=null&&l.init||ae("@clearlaunch/guide-sdk","guides"),l.init({slug:o,...r.target?{target:r.target}:{},...t?{apiUrl:t}:{}})}}}function ce(e){let t=Te(e),i=null,r=null,n=null;return{projectKey:t.projectKey,core:t,config:()=>t.config(),get versions(){if(!i){let l=se("@clearlaunch/versions");l!=null&&l.createVersions||ae("@clearlaunch/versions","versions"),i=l.createVersions(t)}return i},get guides(){return r||(r=at(t,e.apiUrl)),r},get ticketing(){return n||(n=ot(t,e.apiUrl)),n},get feedback(){return this.ticketing}}}var Pe=ce,ze={init:Pe,clearSDK:ce,register:H},Re=ze;H("@clearlaunch/versions",ne);H("@clearlaunch/feedback",le);H("@clearlaunch/guide-sdk",oe);return Be(st);})();
|
|
39
581
|
ClearLaunch=ClearLaunch.default||ClearLaunch;
|
|
40
582
|
//# sourceMappingURL=clearlaunch.js.map
|