@contentgrowth/content-widget 1.1.1 → 1.1.2

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 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EAEb,MAAM,mBAAmB,CAAC;AAG3B;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,KAAK,CAA+B;gBAEhC,MAAM,EAAE,YAAY;IAmBhC;;OAEG;IACG,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwChF;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmB3D;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmBjE;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAelD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;IAetC;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;YACW,KAAK;IAoDnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAQhB;;OAEG;IACH,OAAO,CAAC,GAAG;CAKZ"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EAEb,MAAM,mBAAmB,CAAC;AAG3B;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,KAAK,CAA+B;gBAEhC,MAAM,EAAE,YAAY;IAmBhC;;OAEG;IACG,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwChF;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmB3D;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmBjE;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAelD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;IAetC;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;YACW,KAAK;IA2CnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAQhB;;OAEG;IACH,OAAO,CAAC,GAAG;CAKZ"}
@@ -144,8 +144,6 @@ export class ContentGrowthClient {
144
144
  * Internal fetch wrapper with error handling
145
145
  */
146
146
  async fetch(url) {
147
- console.log('[ContentGrowthClient] Fetching:', url);
148
- console.log('[ContentGrowthClient] API Key:', this.config.apiKey);
149
147
  try {
150
148
  const response = await fetch(url, {
151
149
  headers: {
@@ -153,10 +151,8 @@ export class ContentGrowthClient {
153
151
  'Content-Type': 'application/json'
154
152
  }
155
153
  });
156
- console.log('[ContentGrowthClient] Response status:', response.status, response.statusText);
157
154
  if (!response.ok) {
158
155
  const errorText = await response.text();
159
- console.error('[ContentGrowthClient] Error response:', errorText);
160
156
  let errorMessage = `HTTP ${response.status}: ${response.statusText}`;
161
157
  try {
162
158
  const errorJson = JSON.parse(errorText);
@@ -168,16 +164,13 @@ export class ContentGrowthClient {
168
164
  throw new ContentGrowthError(errorMessage, response.status, errorText);
169
165
  }
170
166
  const data = await response.json();
171
- console.log('[ContentGrowthClient] Response data:', data);
172
167
  return data;
173
168
  }
174
169
  catch (error) {
175
170
  if (error instanceof ContentGrowthError) {
176
- console.error('[ContentGrowthClient] ContentGrowthError:', error);
177
171
  throw error;
178
172
  }
179
173
  // Network or parsing error
180
- console.error('[ContentGrowthClient] Network/Parse error:', error);
181
174
  throw new ContentGrowthError(`Failed to fetch from Content Growth API: ${error.message}`, undefined, error);
182
175
  }
183
176
  }
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Content Growth Widget - Standalone Bundle
3
- * Version: 1.1.1
3
+ * Version: 1.1.2
4
4
  * https://www.content-growth.com
5
5
  */
6
6
  (function(window) {
@@ -2559,12 +2559,10 @@ function debounce(func, wait) {
2559
2559
  */
2560
2560
  class ContentGrowthAPI {
2561
2561
  constructor(config) {
2562
- console.log('[ContentGrowthAPI] Constructor called with config:', config);
2563
2562
  this.apiKey = config.apiKey;
2564
2563
  this.baseUrl = config.baseUrl || 'https://api.content-growth.com';
2565
2564
  this.cache = new Map();
2566
2565
  this.cacheTTL = 5 * 60 * 1000; // 5 minutes
2567
- console.log('[ContentGrowthAPI] Initialized with baseUrl:', this.baseUrl, 'apiKey:', this.apiKey);
2568
2566
  }
2569
2567
 
2570
2568
  /**
@@ -2572,7 +2570,6 @@ class ContentGrowthAPI {
2572
2570
  */
2573
2571
  async fetchArticles(options = {}) {
2574
2572
  const { page = 1, limit = 12, tags = [], category } = options;
2575
- console.log('[ContentGrowthAPI] fetchArticles called with options:', options);
2576
2573
 
2577
2574
  const params = new URLSearchParams({
2578
2575
  page: page.toString(),
@@ -2589,19 +2586,14 @@ class ContentGrowthAPI {
2589
2586
 
2590
2587
  const url = `${this.baseUrl}/widget/articles?${params}`;
2591
2588
  const cacheKey = url;
2592
- console.log('[ContentGrowthAPI] Request URL:', url);
2593
2589
 
2594
2590
  // Check cache
2595
2591
  const cached = this.getFromCache(cacheKey);
2596
2592
  if (cached) {
2597
- console.log('[ContentGrowthAPI] Returning cached data');
2598
2593
  return cached;
2599
2594
  }
2600
2595
 
2601
2596
  try {
2602
- console.log('[ContentGrowthAPI] Making fetch request with headers:', {
2603
- 'X-API-Key': this.apiKey
2604
- });
2605
2597
 
2606
2598
  const response = await fetch(url, {
2607
2599
  headers: {
@@ -2609,7 +2601,6 @@ class ContentGrowthAPI {
2609
2601
  }
2610
2602
  });
2611
2603
 
2612
- console.log('[ContentGrowthAPI] Response status:', response.status, response.statusText);
2613
2604
 
2614
2605
  if (!response.ok) {
2615
2606
  const errorText = await response.text();
@@ -2618,7 +2609,6 @@ class ContentGrowthAPI {
2618
2609
  }
2619
2610
 
2620
2611
  const data = await response.json();
2621
- console.log('[ContentGrowthAPI] Response data:', data);
2622
2612
 
2623
2613
  // Cache the result
2624
2614
  this.setCache(cacheKey, data);
@@ -2636,20 +2626,14 @@ class ContentGrowthAPI {
2636
2626
  async fetchArticle(uuid) {
2637
2627
  const url = `${this.baseUrl}/widget/articles/${uuid}`;
2638
2628
  const cacheKey = url;
2639
- console.log('[ContentGrowthAPI] fetchArticle called for uuid:', uuid);
2640
- console.log('[ContentGrowthAPI] Request URL:', url);
2641
2629
 
2642
2630
  // Check cache
2643
2631
  const cached = this.getFromCache(cacheKey);
2644
2632
  if (cached) {
2645
- console.log('[ContentGrowthAPI] Returning cached article');
2646
2633
  return cached;
2647
2634
  }
2648
2635
 
2649
2636
  try {
2650
- console.log('[ContentGrowthAPI] Making fetch request with headers:', {
2651
- 'X-API-Key': this.apiKey
2652
- });
2653
2637
 
2654
2638
  const response = await fetch(url, {
2655
2639
  headers: {
@@ -2657,7 +2641,6 @@ class ContentGrowthAPI {
2657
2641
  }
2658
2642
  });
2659
2643
 
2660
- console.log('[ContentGrowthAPI] Response status:', response.status, response.statusText);
2661
2644
 
2662
2645
  if (!response.ok) {
2663
2646
  const errorText = await response.text();
@@ -2666,7 +2649,6 @@ class ContentGrowthAPI {
2666
2649
  }
2667
2650
 
2668
2651
  const data = await response.json();
2669
- console.log('[ContentGrowthAPI] Response data:', data);
2670
2652
 
2671
2653
  // Cache the result
2672
2654
  this.setCache(cacheKey, data);
@@ -2684,20 +2666,14 @@ class ContentGrowthAPI {
2684
2666
  async fetchArticleBySlug(slug) {
2685
2667
  const url = `${this.baseUrl}/widget/articles/slug/${slug}`;
2686
2668
  const cacheKey = url;
2687
- console.log('[ContentGrowthAPI] fetchArticleBySlug called for slug:', slug);
2688
- console.log('[ContentGrowthAPI] Request URL:', url);
2689
2669
 
2690
2670
  // Check cache
2691
2671
  const cached = this.getFromCache(cacheKey);
2692
2672
  if (cached) {
2693
- console.log('[ContentGrowthAPI] Returning cached article');
2694
2673
  return cached;
2695
2674
  }
2696
2675
 
2697
2676
  try {
2698
- console.log('[ContentGrowthAPI] Making fetch request with headers:', {
2699
- 'X-API-Key': this.apiKey
2700
- });
2701
2677
 
2702
2678
  const response = await fetch(url, {
2703
2679
  headers: {
@@ -2705,7 +2681,6 @@ class ContentGrowthAPI {
2705
2681
  }
2706
2682
  });
2707
2683
 
2708
- console.log('[ContentGrowthAPI] Response status:', response.status, response.statusText);
2709
2684
 
2710
2685
  if (!response.ok) {
2711
2686
  const errorText = await response.text();
@@ -2714,7 +2689,6 @@ class ContentGrowthAPI {
2714
2689
  }
2715
2690
 
2716
2691
  const data = await response.json();
2717
- console.log('[ContentGrowthAPI] Response data:', data);
2718
2692
 
2719
2693
  // Cache the result
2720
2694
  this.setCache(cacheKey, data);
@@ -3514,10 +3488,9 @@ class ContentViewer {
3514
3488
 
3515
3489
  class ContentGrowthWidget {
3516
3490
  // Version will be injected during build from package.json
3517
- static version = '1.1.1';
3491
+ static version = '1.1.2';
3518
3492
 
3519
3493
  constructor(container, config) {
3520
- console.log('[ContentGrowthWidget] Constructor called with config:', config);
3521
3494
 
3522
3495
  this.container = typeof container === 'string'
3523
3496
  ? document.querySelector(container)
@@ -3545,13 +3518,10 @@ class ContentGrowthWidget {
3545
3518
  slug: config.slug // Article slug for article-only mode (alternative to articleId)
3546
3519
  };
3547
3520
 
3548
- console.log('[ContentGrowthWidget] Final config:', this.config);
3549
-
3550
3521
  if (!this.config.apiKey) {
3551
3522
  throw new Error('API key is required');
3552
3523
  }
3553
3524
 
3554
- console.log('[ContentGrowthWidget] Creating API client with baseUrl:', this.config.baseUrl);
3555
3525
  this.api = new ContentGrowthAPI({
3556
3526
  apiKey: this.config.apiKey,
3557
3527
  baseUrl: this.config.baseUrl
@@ -3568,7 +3538,6 @@ class ContentGrowthWidget {
3568
3538
  * Initialize the widget
3569
3539
  */
3570
3540
  init() {
3571
- console.log('[ContentGrowthWidget] Initializing widget...');
3572
3541
  // Apply theme
3573
3542
  this.container.classList.add('cg-widget');
3574
3543
  this.container.setAttribute('data-theme', this.config.theme);
@@ -3576,24 +3545,20 @@ class ContentGrowthWidget {
3576
3545
  // Check if article-only mode
3577
3546
  if (this.config.mode === 'article-only') {
3578
3547
  if (this.config.slug) {
3579
- console.log('[ContentGrowthWidget] Article-only mode, loading article by slug:', this.config.slug);
3580
3548
  this.showPostInlineBySlug(this.config.slug);
3581
3549
  } else if (this.config.articleId) {
3582
- console.log('[ContentGrowthWidget] Article-only mode, loading article by ID:', this.config.articleId);
3583
3550
  this.showPostInline(this.config.articleId);
3584
3551
  }
3585
3552
  } else {
3586
3553
  // Create views
3587
3554
  this.showList();
3588
3555
  }
3589
- console.log('[ContentGrowthWidget] Widget initialized');
3590
3556
  }
3591
3557
 
3592
3558
  /**
3593
3559
  * Show the list view
3594
3560
  */
3595
3561
  showList() {
3596
- console.log('[ContentGrowthWidget] Showing list view...');
3597
3562
  this.currentView = 'list';
3598
3563
  this.container.innerHTML = '';
3599
3564
 
@@ -3601,15 +3566,6 @@ class ContentGrowthWidget {
3601
3566
  listContainer.className = 'cg-list-view';
3602
3567
  this.container.appendChild(listContainer);
3603
3568
 
3604
- console.log('[ContentGrowthWidget] Creating ContentList with options:', {
3605
- layoutMode: this.config.layoutMode,
3606
- displayMode: this.config.displayMode,
3607
- pageSize: this.config.pageSize,
3608
- tags: this.config.tags,
3609
- category: this.config.category,
3610
- aiSummaryMaxBytes: this.config.aiSummaryMaxBytes
3611
- });
3612
-
3613
3569
  this.contentList = new ContentList(listContainer, this.api, {
3614
3570
  layoutMode: this.config.layoutMode,
3615
3571
  displayMode: this.config.displayMode,
@@ -3796,12 +3752,9 @@ class ContentGrowthWidget {
3796
3752
 
3797
3753
  // Auto-initialize widgets
3798
3754
  function initWidgets() {
3799
- console.log('[Widget] Initializing widgets...');
3800
3755
  const containers = document.querySelectorAll('[data-cg-content]');
3801
- console.log(`[Widget] Found ${containers.length} widget container(s)`);
3802
3756
 
3803
3757
  containers.forEach((container, index) => {
3804
- console.log(`[Widget ${index}] Processing container:`, container);
3805
3758
 
3806
3759
  const config = {
3807
3760
  apiKey: container.dataset.apiKey || container.dataset.cgApiKey,
@@ -3818,13 +3771,8 @@ function initWidgets() {
3818
3771
  articleId: container.dataset.articleId || container.dataset.cgArticleId
3819
3772
  };
3820
3773
 
3821
- console.log(`[Widget ${index}] Configuration:`, config);
3822
- console.log(`[Widget ${index}] window.WIDGET_BASE_URL:`, window.WIDGET_BASE_URL);
3823
-
3824
3774
  try {
3825
- console.log(`[Widget ${index}] Creating ContentGrowthWidget instance...`);
3826
3775
  new ContentGrowthWidget(container, config);
3827
- console.log(`[Widget ${index}] Widget initialized successfully`);
3828
3776
  } catch (error) {
3829
3777
  console.error(`[Widget ${index}] Failed to initialize:`, error);
3830
3778
  container.innerHTML = `
@@ -3852,6 +3800,6 @@ window.ContentGrowthWidget = ContentGrowthWidget;
3852
3800
  // ===== Expose to window =====
3853
3801
  window.ContentGrowthWidget = ContentGrowthWidget;
3854
3802
 
3855
- console.log('[ContentGrowthWidget] Loaded successfully v1.1.1');
3803
+ console.log('[ContentGrowthWidget] Loaded successfully v1.1.2');
3856
3804
 
3857
3805
  })(window);
@@ -1 +1 @@
1
- /***Content Growth Widget-Standalone Bundle*Version:1.1.1*https:*/(function(window){'use strict';(function(global,factory){typeof exports==='object'&&typeof module!=='undefined'?factory(exports):typeof define==='function'&&define.amd?define(['exports'],factory):(global=typeof globalThis!=='undefined'?globalThis:global||self,factory(global.marked={}));})(this,(function(exports){'use strict';function _getDefaults(){return{async:false,breaks:false,extensions:null,gfm:true,hooks:null,pedantic:false,renderer:null,silent:false,tokenizer:null,walkTokens:null};}exports.defaults=_getDefaults();function changeDefaults(newDefaults){exports.defaults=newDefaults;}const escapeTest=/[&<>"']/;const escapeReplace=new RegExp(escapeTest.source,'g');const escapeTestNoEncode=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/;const escapeReplaceNoEncode=new RegExp(escapeTestNoEncode.source,'g');const escapeReplacements={'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'};const getEscapeReplacement=(ch)=>escapeReplacements[ch];function escape$1(html,encode){if (encode){if (escapeTest.test(html)){return html.replace(escapeReplace,getEscapeReplacement);}} else{if (escapeTestNoEncode.test(html)){return html.replace(escapeReplaceNoEncode,getEscapeReplacement);}}return html;}const unescapeTest=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;function unescape(html){return html.replace(unescapeTest,(_,n)=>{n=n.toLowerCase();if (n==='colon')return ':';if (n.charAt(0)==='#'){return n.charAt(1)==='x'?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1));}return '';});}const caret=/(^|[^\[])\^/g;function edit(regex,opt){let source=typeof regex==='string'?regex:regex.source;opt=opt||'';const obj={replace:(name,val)=>{let valSource=typeof val==='string'?val:val.source;valSource=valSource.replace(caret,'$1');source=source.replace(name,valSource);return obj;},getRegex:()=>{return new RegExp(source,opt);}};return obj;}function cleanUrl(href){try{href=encodeURI(href).replace(/%25/g,'%');} catch (e){return null;}return href;}const noopTest={exec:()=>null};function splitCells(tableRow,count){const row=tableRow.replace(/\|/g,(match,offset,str)=>{let escaped=false;let curr=offset;while (--curr>=0&&str[curr]==='\\')escaped=!escaped;if (escaped){return '|';} else{return '|';}}),cells=row.split(/\|/);let i=0;if (!cells[0].trim()){cells.shift();}if (cells.length>0&&!cells[cells.length-1].trim()){cells.pop();}if (count){if (cells.length>count){cells.splice(count);} else{while (cells.length<count)cells.push('');}}for (;i<cells.length;i++){cells[i]=cells[i].trim().replace(/\\\|/g,'|');}return cells;}function rtrim(str,c,invert){const l=str.length;if (l===0){return '';}let suffLen=0;while (suffLen<l){const currChar=str.charAt(l-suffLen-1);if (currChar===c&&!invert){suffLen++;} else if (currChar!==c&&invert){suffLen++;} else{break;}}return str.slice(0,l-suffLen);}function findClosingBracket(str,b){if (str.indexOf(b[1])===-1){return-1;}let level=0;for (let i=0;i<str.length;i++){if (str[i]==='\\'){i++;} else if (str[i]===b[0]){level++;} else if (str[i]===b[1]){level--;if (level<0){return i;}}}return-1;}function outputLink(cap,link,raw,lexer){const href=link.href;const title=link.title?escape$1(link.title):null;const text=cap[1].replace(/\\([\[\]])/g,'$1');if (cap[0].charAt(0)!=='!'){lexer.state.inLink=true;const token={type:'link',raw,href,title,text,tokens:lexer.inlineTokens(text)};lexer.state.inLink=false;return token;}return{type:'image',raw,href,title,text:escape$1(text)};}function indentCodeCompensation(raw,text){const matchIndentToCode=raw.match(/^(\s+)(?:```)/);if (matchIndentToCode===null){return text;}const indentToCode=matchIndentToCode[1];return text .split('\n').map(node=>{const matchIndentInNode=node.match(/^\s+/);if (matchIndentInNode===null){return node;}const [indentInNode]=matchIndentInNode;if (indentInNode.length>=indentToCode.length){return node.slice(indentToCode.length);}return node;}).join('\n');}class _Tokenizer{options;rules;lexer;constructor(options){this.options=options||exports.defaults;}space(src){const cap=this.rules.block.newline.exec(src);if (cap&&cap[0].length>0){return{type:'space',raw:cap[0]};}}code(src){const cap=this.rules.block.code.exec(src);if (cap){const text=cap[0].replace(/^{1,4}/gm,'');return{type:'code',raw:cap[0],codeBlockStyle:'indented',text:!this.options.pedantic?rtrim(text,'\n'):text};}}fences(src){const cap=this.rules.block.fences.exec(src);if (cap){const raw=cap[0];const text=indentCodeCompensation(raw,cap[3]||'');return{type:'code',raw,lang:cap[2]?cap[2].trim().replace(this.rules.inline.anyPunctuation,'$1'):cap[2],text};}}heading(src){const cap=this.rules.block.heading.exec(src);if (cap){let text=cap[2].trim();if (/#$/.test(text)){const trimmed=rtrim(text,'#');if (this.options.pedantic){text=trimmed.trim();} else if (!trimmed||/$/.test(trimmed)){text=trimmed.trim();}}return{type:'heading',raw:cap[0],depth:cap[1].length,text,tokens:this.lexer.inline(text)};}}hr(src){const cap=this.rules.block.hr.exec(src);if (cap){return{type:'hr',raw:cap[0]};}}blockquote(src){const cap=this.rules.block.blockquote.exec(src);if (cap){const text=rtrim(cap[0].replace(/^*>[ \t]?/gm,''),'\n');const top=this.lexer.state.top;this.lexer.state.top=true;const tokens=this.lexer.blockTokens(text);this.lexer.state.top=top;return{type:'blockquote',raw:cap[0],tokens,text};}}list(src){let cap=this.rules.block.list.exec(src);if (cap){let bull=cap[1].trim();const isordered=bull.length>1;const list={type:'list',raw:'',ordered:isordered,start:isordered?+bull.slice(0,-1):'',loose:false,items:[]};bull=isordered?`\\d{1,9}\\${bull.slice(-1)}`:`\\${bull}`;if (this.options.pedantic){bull=isordered?bull:'[*+-]';}const itemRegex=new RegExp(`^({0,3}${bull})((?:[\t ][^\\n]*)?(?:\\n|$))`);let raw='';let itemContents='';let endsWithBlankLine=false;while (src){let endEarly=false;if (!(cap=itemRegex.exec(src))){break;}if (this.rules.block.hr.test(src)){break;}raw=cap[0];src=src.substring(raw.length);let line=cap[2].split('\n',1)[0].replace(/^\t+/,(t)=>' '.repeat(3*t.length));let nextLine=src.split('\n',1)[0];let indent=0;if (this.options.pedantic){indent=2;itemContents=line.trimStart();} else{indent=cap[2].search(/[^ ]/);indent=indent>4?1:indent;itemContents=line.slice(indent);indent+=cap[1].length;}let blankLine=false;if (!line&&/^*$/.test(nextLine)){raw+=nextLine+'\n';src=src.substring(nextLine.length+1);endEarly=true;}if (!endEarly){const nextBulletRegex=new RegExp(`^{0,${Math.min(3,indent-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`);const hrRegex=new RegExp(`^{0,${Math.min(3,indent-1)}}((?:-*){3,}|(?:_*){3,}|(?:\\**){3,})(?:\\n+|$)`);const fencesBeginRegex=new RegExp(`^{0,${Math.min(3,indent-1)}}(?:\`\`\`|~~~)`);const headingBeginRegex=new RegExp(`^{0,${Math.min(3,indent-1)}}#`);while (src){const rawLine=src.split('\n',1)[0];nextLine=rawLine;if (this.options.pedantic){nextLine=nextLine.replace(/^{1,4}(?=({4})*[^ ])/g,' ');}if (fencesBeginRegex.test(nextLine)){break;}if (headingBeginRegex.test(nextLine)){break;}if (nextBulletRegex.test(nextLine)){break;}if (hrRegex.test(src)){break;}if (nextLine.search(/[^ ]/)>=indent||!nextLine.trim()){itemContents+='\n'+nextLine.slice(indent);} else{if (blankLine){break;}if (line.search(/[^ ]/)>=4){break;}if (fencesBeginRegex.test(line)){break;}if (headingBeginRegex.test(line)){break;}if (hrRegex.test(line)){break;}itemContents+='\n'+nextLine;}if (!blankLine&&!nextLine.trim()){blankLine=true;}raw+=rawLine+'\n';src=src.substring(rawLine.length+1);line=nextLine.slice(indent);}}if (!list.loose){if (endsWithBlankLine){list.loose=true;} else if (/\n*\n*$/.test(raw)){endsWithBlankLine=true;}}let istask=null;let ischecked;if (this.options.gfm){istask=/^\[[ xX]\]/.exec(itemContents);if (istask){ischecked=istask[0]!=='[ ] ';itemContents=itemContents.replace(/^\[[ xX]\]+/,'');}}list.items.push({type:'list_item',raw,task:!!istask,checked:ischecked,loose:false,text:itemContents,tokens:[]});list.raw+=raw;}list.items[list.items.length-1].raw=raw.trimEnd();(list.items[list.items.length-1]).text=itemContents.trimEnd();list.raw=list.raw.trimEnd();for (let i=0;i<list.items.length;i++){this.lexer.state.top=false;list.items[i].tokens=this.lexer.blockTokens(list.items[i].text,[]);if (!list.loose){const spacers=list.items[i].tokens.filter(t=>t.type==='space');const hasMultipleLineBreaks=spacers.length>0&&spacers.some(t=>/\n.*\n/.test(t.raw));list.loose=hasMultipleLineBreaks;}}if (list.loose){for (let i=0;i<list.items.length;i++){list.items[i].loose=true;}}return list;}}html(src){const cap=this.rules.block.html.exec(src);if (cap){const token={type:'html',block:true,raw:cap[0],pre:cap[1]==='pre'||cap[1]==='script'||cap[1]==='style',text:cap[0]};return token;}}def(src){const cap=this.rules.block.def.exec(src);if (cap){const tag=cap[1].toLowerCase().replace(/\s+/g,' ');const href=cap[2]?cap[2].replace(/^<(.*)>$/,'$1').replace(this.rules.inline.anyPunctuation,'$1'):'';const title=cap[3]?cap[3].substring(1,cap[3].length-1).replace(this.rules.inline.anyPunctuation,'$1'):cap[3];return{type:'def',tag,raw:cap[0],href,title};}}table(src){const cap=this.rules.block.table.exec(src);if (!cap){return;}if (!/[:|]/.test(cap[2])){return;}const headers=splitCells(cap[1]);const aligns=cap[2].replace(/^\||\|*$/g,'').split('|');const rows=cap[3]&&cap[3].trim()?cap[3].replace(/\n[ \t]*$/,'').split('\n'):[];const item={type:'table',raw:cap[0],header:[],align:[],rows:[]};if (headers.length!==aligns.length){return;}for (const align of aligns){if (/^*-+:*$/.test(align)){item.align.push('right');} else if (/^*:-+:*$/.test(align)){item.align.push('center');} else if (/^*:-+*$/.test(align)){item.align.push('left');} else{item.align.push(null);}}for (const header of headers){item.header.push({text:header,tokens:this.lexer.inline(header)});}for (const row of rows){item.rows.push(splitCells(row,item.header.length).map(cell=>{return{text:cell,tokens:this.lexer.inline(cell)};}));}return item;}lheading(src){const cap=this.rules.block.lheading.exec(src);if (cap){return{type:'heading',raw:cap[0],depth:cap[2].charAt(0)==='='?1:2,text:cap[1],tokens:this.lexer.inline(cap[1])};}}paragraph(src){const cap=this.rules.block.paragraph.exec(src);if (cap){const text=cap[1].charAt(cap[1].length-1)==='\n'?cap[1].slice(0,-1):cap[1];return{type:'paragraph',raw:cap[0],text,tokens:this.lexer.inline(text)};}}text(src){const cap=this.rules.block.text.exec(src);if (cap){return{type:'text',raw:cap[0],text:cap[0],tokens:this.lexer.inline(cap[0])};}}escape(src){const cap=this.rules.inline.escape.exec(src);if (cap){return{type:'escape',raw:cap[0],text:escape$1(cap[1])};}}tag(src){const cap=this.rules.inline.tag.exec(src);if (cap){if (!this.lexer.state.inLink&&/^<a/i.test(cap[0])){this.lexer.state.inLink=true;} else if (this.lexer.state.inLink&&/^<\/a>/i.test(cap[0])){this.lexer.state.inLink=false;}if (!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])){this.lexer.state.inRawBlock=true;} else if (this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])){this.lexer.state.inRawBlock=false;}return{type:'html',raw:cap[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:false,text:cap[0]};}}link(src){const cap=this.rules.inline.link.exec(src);if (cap){const trimmedUrl=cap[2].trim();if (!this.options.pedantic&&/^</.test(trimmedUrl)){if (!(/>$/.test(trimmedUrl))){return;}const rtrimSlash=rtrim(trimmedUrl.slice(0,-1),'\\');if ((trimmedUrl.length-rtrimSlash.length)%2===0){return;}} else{const lastParenIndex=findClosingBracket(cap[2],'()');if (lastParenIndex>-1){const start=cap[0].indexOf('!')===0?5:4;const linkLen=start+cap[1].length+lastParenIndex;cap[2]=cap[2].substring(0,lastParenIndex);cap[0]=cap[0].substring(0,linkLen).trim();cap[3]='';}}let href=cap[2];let title='';if (this.options.pedantic){const link=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);if (link){href=link[1];title=link[3];}} else{title=cap[3]?cap[3].slice(1,-1):'';}href=href.trim();if (/^</.test(href)){if (this.options.pedantic&&!(/>$/.test(trimmedUrl))){href=href.slice(1);} else{href=href.slice(1,-1);}}return outputLink(cap,{href:href?href.replace(this.rules.inline.anyPunctuation,'$1'):href,title:title?title.replace(this.rules.inline.anyPunctuation,'$1'):title},cap[0],this.lexer);}}reflink(src,links){let cap;if ((cap=this.rules.inline.reflink.exec(src))||(cap=this.rules.inline.nolink.exec(src))){const linkString=(cap[2]||cap[1]).replace(/\s+/g,' ');const link=links[linkString.toLowerCase()];if (!link){const text=cap[0].charAt(0);return{type:'text',raw:text,text};}return outputLink(cap,link,cap[0],this.lexer);}}emStrong(src,maskedSrc,prevChar=''){let match=this.rules.inline.emStrongLDelim.exec(src);if (!match)return;if (match[3]&&prevChar.match(/[\p{L}\p{N}]/u))return;const nextChar=match[1]||match[2]||'';if (!nextChar||!prevChar||this.rules.inline.punctuation.exec(prevChar)){const lLength=[...match[0]].length-1;let rDelim,rLength,delimTotal=lLength,midDelimTotal=0;const endReg=match[0][0]==='*'?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;endReg.lastIndex=0;maskedSrc=maskedSrc.slice(-1*src.length+lLength);while ((match=endReg.exec(maskedSrc))!=null){rDelim=match[1]||match[2]||match[3]||match[4]||match[5]||match[6];if (!rDelim)continue;rLength=[...rDelim].length;if (match[3]||match[4]){delimTotal+=rLength;continue;} else if (match[5]||match[6]){if (lLength%3&&!((lLength+rLength)%3)){midDelimTotal+=rLength;continue;}}delimTotal-=rLength;if (delimTotal>0)continue;rLength=Math.min(rLength,rLength+delimTotal+midDelimTotal);const lastCharLength=[...match[0]][0].length;const raw=src.slice(0,lLength+match.index+lastCharLength+rLength);if (Math.min(lLength,rLength)%2){const text=raw.slice(1,-1);return{type:'em',raw,text,tokens:this.lexer.inlineTokens(text)};}const text=raw.slice(2,-2);return{type:'strong',raw,text,tokens:this.lexer.inlineTokens(text)};}}}codespan(src){const cap=this.rules.inline.code.exec(src);if (cap){let text=cap[2].replace(/\n/g,' ');const hasNonSpaceChars=/[^ ]/.test(text);const hasSpaceCharsOnBothEnds=/^/.test(text)&&/$/.test(text);if (hasNonSpaceChars&&hasSpaceCharsOnBothEnds){text=text.substring(1,text.length-1);}text=escape$1(text,true);return{type:'codespan',raw:cap[0],text};}}br(src){const cap=this.rules.inline.br.exec(src);if (cap){return{type:'br',raw:cap[0]};}}del(src){const cap=this.rules.inline.del.exec(src);if (cap){return{type:'del',raw:cap[0],text:cap[2],tokens:this.lexer.inlineTokens(cap[2])};}}autolink(src){const cap=this.rules.inline.autolink.exec(src);if (cap){let text,href;if (cap[2]==='@'){text=escape$1(cap[1]);href='mailto:'+text;} else{text=escape$1(cap[1]);href=text;}return{type:'link',raw:cap[0],text,href,tokens:[{type:'text',raw:text,text}]};}}url(src){let cap;if (cap=this.rules.inline.url.exec(src)){let text,href;if (cap[2]==='@'){text=escape$1(cap[0]);href='mailto:'+text;} else{let prevCapZero;do{prevCapZero=cap[0];cap[0]=this.rules.inline._backpedal.exec(cap[0])?.[0]??'';}while (prevCapZero!==cap[0]);text=escape$1(cap[0]);if (cap[1]==='www.'){href='http:} else{href=cap[0];}}return{type:'link',raw:cap[0],text,href,tokens:[{type:'text',raw:text,text}]};}}inlineText(src){const cap=this.rules.inline.text.exec(src);if (cap){let text;if (this.lexer.state.inRawBlock){text=cap[0];} else{text=escape$1(cap[0]);}return{type:'text',raw:cap[0],text};}}}const newline=/^(?:*(?:\n|$))+/;const blockCode=/^({4}[^\n]+(?:\n(?:*(?:\n|$))*)?)+/;const fences=/^{0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?:{0,3}\1[~`]**(?=\n|$)|$)/;const hr=/^{0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/;const heading=/^{0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/;const bullet=/(?:[*+-]|\d{1,9}[.)])/;const lheading=edit(/^(?!bull)((?:.|\n(?!\s*?\n|bull))+?)\n{0,3}(=+|-+)*(?:\n+|$)/).replace(/bull/g,bullet).getRegex();const _paragraph=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table|+\n)[^\n]+)*)/;const blockText=/^[^\n]+/;const _blockLabel=/(?!\s*\])(?:\\.|[^\[\]\\])+/;const def=edit(/^{0,3}\[(label)\]:*(?:\n*)?([^<\s][^\s]*|<.*?>)(?:(?:+(?:\n*)?|*\n*)(title))?*(?:\n+|$)/).replace('label',_blockLabel).replace('title',/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex();const list=edit(/^({0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,bullet).getRegex();const _tag='address|article|aside|base|basefont|blockquote|body|caption'+'|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'+'|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'+'|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'+'|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'+'|track|ul';const _comment=/<!--(?!-?>)[\s\S]*?(?:-->|$)/;const html=edit('^{0,3}(?:'+'<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)'+'|comment[^\\n]*(\\n+|$)'+'|<\\?[\\s\\S]*?(?:\\?>\\n*|$)'+'|<![A-Z][\\s\\S]*?(?:>\\n*|$)'+'|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)'+'|</?(tag)(?:+|\\n|/?>)[\\s\\S]*?(?:(?:\\n*)+\\n|$)'+'|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*?*/?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n*)+\\n|$)'+'|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n*)+\\n|$)'+')','i').replace('comment',_comment).replace('tag',_tag).replace('attribute',/+[a-zA-Z:_][\w.:-]*(?:*=*"[^"\n]*"|*=*'[^'\n]*'|*=*[^\s"'=<>`]+)?/).getRegex();const paragraph=edit(_paragraph).replace('hr',hr).replace('heading','{0,3}#{1,6}(?:\\s|$)').replace('|lheading','').replace('|table','').replace('blockquote','{0,3}>').replace('fences','{0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list','{0,3}(?:[*+-]|1[.)])').replace('html','</?(?:tag)(?:+|\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag',_tag).getRegex();const blockquote=edit(/^({0,3}>?(paragraph|[^\n]*)(?:\n|$))+/).replace('paragraph',paragraph).getRegex();const blockNormal={blockquote,code:blockCode,def,fences,heading,hr,html,lheading,list,newline,paragraph,table:noopTest,text:blockText};const gfmTable=edit('^*([^\\n ].*)\\n'+'{0,3}((?:\\|*)?:?-+:?*(?:\\|*:?-+:?*)*(?:\\|*)?)'+'(?:\\n((?:(?!*\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)').replace('hr',hr).replace('heading','{0,3}#{1,6}(?:\\s|$)').replace('blockquote','{0,3}>').replace('code','{4}[^\\n]').replace('fences','{0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list','{0,3}(?:[*+-]|1[.)])').replace('html','</?(?:tag)(?:+|\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag',_tag).getRegex();const blockGfm={...blockNormal,table:gfmTable,paragraph:edit(_paragraph).replace('hr',hr).replace('heading','{0,3}#{1,6}(?:\\s|$)').replace('|lheading','').replace('table',gfmTable).replace('blockquote','{0,3}>').replace('fences','{0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list','{0,3}(?:[*+-]|1[.)])').replace('html','</?(?:tag)(?:+|\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag',_tag).getRegex()};const blockPedantic={...blockNormal,html:edit('^*(?:comment*(?:\\n|\\s*$)'+'|<(tag)[\\s\\S]+?</\\1>*(?:\\n{2,}|\\s*$)'+'|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?>*(?:\\n{2,}|\\s*$))').replace('comment',_comment).replace(/tag/g,'(?!(?:'+'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'+'|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'+'\\b)\\w+(?!:|[^\\w\\s@]*@)\\b').getRegex(),def:/^*\[([^\]]+)\]:*<?([^\s>]+)>?(?:+(["(][^\n]+[")]))?*(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:noopTest,lheading:/^(.+?)\n{0,3}(=+|-+)*(?:\n+|$)/,paragraph:edit(_paragraph).replace('hr',hr).replace('heading','*#{1,6}*[^\n]').replace('lheading',lheading).replace('|table','').replace('blockquote','{0,3}>').replace('|fences','').replace('|list','').replace('|html','').replace('|tag','').getRegex()};const escape=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/;const inlineCode=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/;const br=/^({2,}|\\)\n(?!\s*$)/;const inlineText=/^(`+|[^`])(?:(?={2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?={2,}\n)))/;const _punctuation='\\p{P}$+<=>`^|~';const punctuation=edit(/^((?![*_])[\spunctuation])/,'u').replace(/punctuation/g,_punctuation).getRegex();const blockSkip=/\[[^[\]]*?\]\([^\(\)]*?\)|`[^`]*?`|<[^<>]*?>/g;const emStrongLDelim=edit(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/,'u').replace(/punct/g,_punctuation).getRegex();const emStrongRDelimAst=edit('^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)'+'|[^*]+(?=[^*])'+'|(?!\\*)[punct](\\*+)(?=[\\s]|$)'+'|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)'+'|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])'+'|[\\s](\\*+)(?!\\*)(?=[punct])'+'|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])'+'|[^punct\\s](\\*+)(?=[^punct\\s])','gu').replace(/punct/g,_punctuation).getRegex();const emStrongRDelimUnd=edit('^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)'+'|[^_]+(?=[^_])'+'|(?!_)[punct](_+)(?=[\\s]|$)'+'|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)'+'|(?!_)[punct\\s](_+)(?=[^punct\\s])'+'|[\\s](_+)(?!_)(?=[punct])'+'|(?!_)[punct](_+)(?!_)(?=[punct])','gu').replace(/punct/g,_punctuation).getRegex();const anyPunctuation=edit(/\\([punct])/,'gu').replace(/punct/g,_punctuation).getRegex();const autolink=edit(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace('scheme',/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace('email',/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex();const _inlineComment=edit(_comment).replace('(?:-->|$)','-->').getRegex();const tag=edit('^comment'+'|^</[a-zA-Z][\\w:-]*\\s*>'+'|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>'+'|^<\\?[\\s\\S]*?\\?>'+'|^<![a-zA-Z]+\\s[\\s\\S]*?>'+'|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>').replace('comment',_inlineComment).replace('attribute',/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex();const _inlineLabel=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;const link=edit(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace('label',_inlineLabel).replace('href',/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace('title',/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex();const reflink=edit(/^!?\[(label)\]\[(ref)\]/).replace('label',_inlineLabel).replace('ref',_blockLabel).getRegex();const nolink=edit(/^!?\[(ref)\](?:\[\])?/).replace('ref',_blockLabel).getRegex();const reflinkSearch=edit('reflink|nolink(?!\\()','g').replace('reflink',reflink).replace('nolink',nolink).getRegex();const inlineNormal={_backpedal:noopTest,anyPunctuation,autolink,blockSkip,br,code:inlineCode,del:noopTest,emStrongLDelim,emStrongRDelimAst,emStrongRDelimUnd,escape,link,nolink,punctuation,reflink,reflinkSearch,tag,text:inlineText,url:noopTest};const inlinePedantic={...inlineNormal,link:edit(/^!?\[(label)\]\((.*?)\)/).replace('label',_inlineLabel).getRegex(),reflink:edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace('label',_inlineLabel).getRegex()};const inlineGfm={...inlineNormal,escape:edit(escape).replace('])','~|])').getRegex(),url:edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,'i').replace('email',/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?={2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?={2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/};const inlineBreaks={...inlineGfm,br:edit(br).replace('{2,}','*').getRegex(),text:edit(inlineGfm.text).replace('\\b_','\\b_|{2,}\\n').replace(/\{2,\}/g,'*').getRegex()};const block={normal:blockNormal,gfm:blockGfm,pedantic:blockPedantic};const inline={normal:inlineNormal,gfm:inlineGfm,breaks:inlineBreaks,pedantic:inlinePedantic};class _Lexer{tokens;options;state;tokenizer;inlineQueue;constructor(options){this.tokens=[];this.tokens.links=Object.create(null);this.options=options||exports.defaults;this.options.tokenizer=this.options.tokenizer||new _Tokenizer();this.tokenizer=this.options.tokenizer;this.tokenizer.options=this.options;this.tokenizer.lexer=this;this.inlineQueue=[];this.state={inLink:false,inRawBlock:false,top:true};const rules={block:block.normal,inline:inline.normal};if (this.options.pedantic){rules.block=block.pedantic;rules.inline=inline.pedantic;} else if (this.options.gfm){rules.block=block.gfm;if (this.options.breaks){rules.inline=inline.breaks;} else{rules.inline=inline.gfm;}}this.tokenizer.rules=rules;}static get rules(){return{block,inline};}static lex(src,options){const lexer=new _Lexer(options);return lexer.lex(src);}static lexInline(src,options){const lexer=new _Lexer(options);return lexer.inlineTokens(src);}lex(src){src=src .replace(/\r\n|\r/g,'\n');this.blockTokens(src,this.tokens);for (let i=0;i<this.inlineQueue.length;i++){const next=this.inlineQueue[i];this.inlineTokens(next.src,next.tokens);}this.inlineQueue=[];return this.tokens;}blockTokens(src,tokens=[]){if (this.options.pedantic){src=src.replace(/\t/g,' ').replace(/^+$/gm,'');} else{src=src.replace(/^(*)(\t+)/gm,(_,leading,tabs)=>{return leading+' '.repeat(tabs.length);});}let token;let lastToken;let cutSrc;let lastParagraphClipped;while (src){if (this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some((extTokenizer)=>{if (token=extTokenizer.call({lexer:this},src,tokens)){src=src.substring(token.raw.length);tokens.push(token);return true;}return false;})){continue;}if (token=this.tokenizer.space(src)){src=src.substring(token.raw.length);if (token.raw.length===1&&tokens.length>0){tokens[tokens.length-1].raw+='\n';} else{tokens.push(token);}continue;}if (token=this.tokenizer.code(src)){src=src.substring(token.raw.length);lastToken=tokens[tokens.length-1];if (lastToken&&(lastToken.type==='paragraph'||lastToken.type==='text')){lastToken.raw+='\n'+token.raw;lastToken.text+='\n'+token.text;this.inlineQueue[this.inlineQueue.length-1].src=lastToken.text;} else{tokens.push(token);}continue;}if (token=this.tokenizer.fences(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.heading(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.hr(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.blockquote(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.list(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.html(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.def(src)){src=src.substring(token.raw.length);lastToken=tokens[tokens.length-1];if (lastToken&&(lastToken.type==='paragraph'||lastToken.type==='text')){lastToken.raw+='\n'+token.raw;lastToken.text+='\n'+token.raw;this.inlineQueue[this.inlineQueue.length-1].src=lastToken.text;} else if (!this.tokens.links[token.tag]){this.tokens.links[token.tag]={href:token.href,title:token.title};}continue;}if (token=this.tokenizer.table(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.lheading(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}cutSrc=src;if (this.options.extensions&&this.options.extensions.startBlock){let startIndex=Infinity;const tempSrc=src.slice(1);let tempStart;this.options.extensions.startBlock.forEach((getStartIndex)=>{tempStart=getStartIndex.call({lexer:this},tempSrc);if (typeof tempStart==='number'&&tempStart>=0){startIndex=Math.min(startIndex,tempStart);}});if (startIndex<Infinity&&startIndex>=0){cutSrc=src.substring(0,startIndex+1);}}if (this.state.top&&(token=this.tokenizer.paragraph(cutSrc))){lastToken=tokens[tokens.length-1];if (lastParagraphClipped&&lastToken.type==='paragraph'){lastToken.raw+='\n'+token.raw;lastToken.text+='\n'+token.text;this.inlineQueue.pop();this.inlineQueue[this.inlineQueue.length-1].src=lastToken.text;} else{tokens.push(token);}lastParagraphClipped=(cutSrc.length!==src.length);src=src.substring(token.raw.length);continue;}if (token=this.tokenizer.text(src)){src=src.substring(token.raw.length);lastToken=tokens[tokens.length-1];if (lastToken&&lastToken.type==='text'){lastToken.raw+='\n'+token.raw;lastToken.text+='\n'+token.text;this.inlineQueue.pop();this.inlineQueue[this.inlineQueue.length-1].src=lastToken.text;} else{tokens.push(token);}continue;}if (src){const errMsg='Infinite loop on byte:'+src.charCodeAt(0);if (this.options.silent){console.error(errMsg);break;} else{throw new Error(errMsg);}}}this.state.top=true;return tokens;}inline(src,tokens=[]){this.inlineQueue.push({src,tokens});return tokens;}inlineTokens(src,tokens=[]){let token,lastToken,cutSrc;let maskedSrc=src;let match;let keepPrevChar,prevChar;if (this.tokens.links){const links=Object.keys(this.tokens.links);if (links.length>0){while ((match=this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc))!=null){if (links.includes(match[0].slice(match[0].lastIndexOf('[')+1,-1))){maskedSrc=maskedSrc.slice(0,match.index)+'['+'a'.repeat(match[0].length-2)+']'+maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);}}}}while ((match=this.tokenizer.rules.inline.blockSkip.exec(maskedSrc))!=null){maskedSrc=maskedSrc.slice(0,match.index)+'['+'a'.repeat(match[0].length-2)+']'+maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);}while ((match=this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc))!=null){maskedSrc=maskedSrc.slice(0,match.index)+'++'+maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);}while (src){if (!keepPrevChar){prevChar='';}keepPrevChar=false;if (this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some((extTokenizer)=>{if (token=extTokenizer.call({lexer:this},src,tokens)){src=src.substring(token.raw.length);tokens.push(token);return true;}return false;})){continue;}if (token=this.tokenizer.escape(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.tag(src)){src=src.substring(token.raw.length);lastToken=tokens[tokens.length-1];if (lastToken&&token.type==='text'&&lastToken.type==='text'){lastToken.raw+=token.raw;lastToken.text+=token.text;} else{tokens.push(token);}continue;}if (token=this.tokenizer.link(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.reflink(src,this.tokens.links)){src=src.substring(token.raw.length);lastToken=tokens[tokens.length-1];if (lastToken&&token.type==='text'&&lastToken.type==='text'){lastToken.raw+=token.raw;lastToken.text+=token.text;} else{tokens.push(token);}continue;}if (token=this.tokenizer.emStrong(src,maskedSrc,prevChar)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.codespan(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.br(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.del(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.autolink(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (!this.state.inLink&&(token=this.tokenizer.url(src))){src=src.substring(token.raw.length);tokens.push(token);continue;}cutSrc=src;if (this.options.extensions&&this.options.extensions.startInline){let startIndex=Infinity;const tempSrc=src.slice(1);let tempStart;this.options.extensions.startInline.forEach((getStartIndex)=>{tempStart=getStartIndex.call({lexer:this},tempSrc);if (typeof tempStart==='number'&&tempStart>=0){startIndex=Math.min(startIndex,tempStart);}});if (startIndex<Infinity&&startIndex>=0){cutSrc=src.substring(0,startIndex+1);}}if (token=this.tokenizer.inlineText(cutSrc)){src=src.substring(token.raw.length);if (token.raw.slice(-1)!=='_'){prevChar=token.raw.slice(-1);}keepPrevChar=true;lastToken=tokens[tokens.length-1];if (lastToken&&lastToken.type==='text'){lastToken.raw+=token.raw;lastToken.text+=token.text;} else{tokens.push(token);}continue;}if (src){const errMsg='Infinite loop on byte:'+src.charCodeAt(0);if (this.options.silent){console.error(errMsg);break;} else{throw new Error(errMsg);}}}return tokens;}}class _Renderer{options;constructor(options){this.options=options||exports.defaults;}code(code,infostring,escaped){const lang=(infostring||'').match(/^\S*/)?.[0];code=code.replace(/\n$/,'')+'\n';if (!lang){return '<pre><code>'+(escaped?code:escape$1(code,true))+'</code></pre>\n';}return '<pre><code class="language-'+escape$1(lang)+'">'+(escaped?code:escape$1(code,true))+'</code></pre>\n';}blockquote(quote){return `<blockquote>\n${quote}</blockquote>\n`;}html(html,block){return html;}heading(text,level,raw){return `<h${level}>${text}</h${level}>\n`;}hr(){return '<hr>\n';}list(body,ordered,start){const type=ordered?'ol':'ul';const startatt=(ordered&&start!==1)?(' start="'+start+'"'):'';return '<'+type+startatt+'>\n'+body+'</'+type+'>\n';}listitem(text,task,checked){return `<li>${text}</li>\n`;}checkbox(checked){return '<input '+(checked?'checked="" ':'')+'disabled="" type="checkbox">';}paragraph(text){return `<p>${text}</p>\n`;}table(header,body){if (body)body=`<tbody>${body}</tbody>`;return '<table>\n'+'<thead>\n'+header+'</thead>\n'+body+'</table>\n';}tablerow(content){return `<tr>\n${content}</tr>\n`;}tablecell(content,flags){const type=flags.header?'th':'td';const tag=flags.align?`<${type}align="${flags.align}">`:`<${type}>`;return tag+content+`</${type}>\n`;}strong(text){return `<strong>${text}</strong>`;}em(text){return `<em>${text}</em>`;}codespan(text){return `<code>${text}</code>`;}br(){return '<br>';}del(text){return `<del>${text}</del>`;}link(href,title,text){const cleanHref=cleanUrl(href);if (cleanHref===null){return text;}href=cleanHref;let out='<a href="'+href+'"';if (title){out+=' title="'+title+'"';}out+='>'+text+'</a>';return out;}image(href,title,text){const cleanHref=cleanUrl(href);if (cleanHref===null){return text;}href=cleanHref;let out=`<img src="${href}" alt="${text}"`;if (title){out+=` title="${title}"`;}out+='>';return out;}text(text){return text;}}class _TextRenderer{strong(text){return text;}em(text){return text;}codespan(text){return text;}del(text){return text;}html(text){return text;}text(text){return text;}link(href,title,text){return ''+text;}image(href,title,text){return ''+text;}br(){return '';}}class _Parser{options;renderer;textRenderer;constructor(options){this.options=options||exports.defaults;this.options.renderer=this.options.renderer||new _Renderer();this.renderer=this.options.renderer;this.renderer.options=this.options;this.textRenderer=new _TextRenderer();}static parse(tokens,options){const parser=new _Parser(options);return parser.parse(tokens);}static parseInline(tokens,options){const parser=new _Parser(options);return parser.parseInline(tokens);}parse(tokens,top=true){let out='';for (let i=0;i<tokens.length;i++){const token=tokens[i];if (this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[token.type]){const genericToken=token;const ret=this.options.extensions.renderers[genericToken.type].call({parser:this},genericToken);if (ret!==false||!['space','hr','heading','code','table','blockquote','list','html','paragraph','text'].includes(genericToken.type)){out+=ret||'';continue;}}switch (token.type){case 'space':{continue;}case 'hr':{out+=this.renderer.hr();continue;}case 'heading':{const headingToken=token;out+=this.renderer.heading(this.parseInline(headingToken.tokens),headingToken.depth,unescape(this.parseInline(headingToken.tokens,this.textRenderer)));continue;}case 'code':{const codeToken=token;out+=this.renderer.code(codeToken.text,codeToken.lang,!!codeToken.escaped);continue;}case 'table':{const tableToken=token;let header='';let cell='';for (let j=0;j<tableToken.header.length;j++){cell+=this.renderer.tablecell(this.parseInline(tableToken.header[j].tokens),{header:true,align:tableToken.align[j]});}header+=this.renderer.tablerow(cell);let body='';for (let j=0;j<tableToken.rows.length;j++){const row=tableToken.rows[j];cell='';for (let k=0;k<row.length;k++){cell+=this.renderer.tablecell(this.parseInline(row[k].tokens),{header:false,align:tableToken.align[k]});}body+=this.renderer.tablerow(cell);}out+=this.renderer.table(header,body);continue;}case 'blockquote':{const blockquoteToken=token;const body=this.parse(blockquoteToken.tokens);out+=this.renderer.blockquote(body);continue;}case 'list':{const listToken=token;const ordered=listToken.ordered;const start=listToken.start;const loose=listToken.loose;let body='';for (let j=0;j<listToken.items.length;j++){const item=listToken.items[j];const checked=item.checked;const task=item.task;let itemBody='';if (item.task){const checkbox=this.renderer.checkbox(!!checked);if (loose){if (item.tokens.length>0&&item.tokens[0].type==='paragraph'){item.tokens[0].text=checkbox+' '+item.tokens[0].text;if (item.tokens[0].tokens&&item.tokens[0].tokens.length>0&&item.tokens[0].tokens[0].type==='text'){item.tokens[0].tokens[0].text=checkbox+' '+item.tokens[0].tokens[0].text;}} else{item.tokens.unshift({type:'text',text:checkbox+' '});}} else{itemBody+=checkbox+' ';}}itemBody+=this.parse(item.tokens,loose);body+=this.renderer.listitem(itemBody,task,!!checked);}out+=this.renderer.list(body,ordered,start);continue;}case 'html':{const htmlToken=token;out+=this.renderer.html(htmlToken.text,htmlToken.block);continue;}case 'paragraph':{const paragraphToken=token;out+=this.renderer.paragraph(this.parseInline(paragraphToken.tokens));continue;}case 'text':{let textToken=token;let body=textToken.tokens?this.parseInline(textToken.tokens):textToken.text;while (i+1<tokens.length&&tokens[i+1].type==='text'){textToken=tokens[++i];body+='\n'+(textToken.tokens?this.parseInline(textToken.tokens):textToken.text);}out+=top?this.renderer.paragraph(body):body;continue;}default:{const errMsg='Token with "'+token.type+'" type was not found.';if (this.options.silent){console.error(errMsg);return '';} else{throw new Error(errMsg);}}}}return out;}parseInline(tokens,renderer){renderer=renderer||this.renderer;let out='';for (let i=0;i<tokens.length;i++){const token=tokens[i];if (this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[token.type]){const ret=this.options.extensions.renderers[token.type].call({parser:this},token);if (ret!==false||!['escape','html','link','image','strong','em','codespan','br','del','text'].includes(token.type)){out+=ret||'';continue;}}switch (token.type){case 'escape':{const escapeToken=token;out+=renderer.text(escapeToken.text);break;}case 'html':{const tagToken=token;out+=renderer.html(tagToken.text);break;}case 'link':{const linkToken=token;out+=renderer.link(linkToken.href,linkToken.title,this.parseInline(linkToken.tokens,renderer));break;}case 'image':{const imageToken=token;out+=renderer.image(imageToken.href,imageToken.title,imageToken.text);break;}case 'strong':{const strongToken=token;out+=renderer.strong(this.parseInline(strongToken.tokens,renderer));break;}case 'em':{const emToken=token;out+=renderer.em(this.parseInline(emToken.tokens,renderer));break;}case 'codespan':{const codespanToken=token;out+=renderer.codespan(codespanToken.text);break;}case 'br':{out+=renderer.br();break;}case 'del':{const delToken=token;out+=renderer.del(this.parseInline(delToken.tokens,renderer));break;}case 'text':{const textToken=token;out+=renderer.text(textToken.text);break;}default:{const errMsg='Token with "'+token.type+'" type was not found.';if (this.options.silent){console.error(errMsg);return '';} else{throw new Error(errMsg);}}}}return out;}}class _Hooks{options;constructor(options){this.options=options||exports.defaults;}static passThroughHooks=new Set([ 'preprocess','postprocess','processAllTokens' ]);preprocess(markdown){return markdown;}postprocess(html){return html;}processAllTokens(tokens){return tokens;}}class Marked{defaults=_getDefaults();options=this.setOptions;parse=this.#parseMarkdown(_Lexer.lex,_Parser.parse);parseInline=this.#parseMarkdown(_Lexer.lexInline,_Parser.parseInline);Parser=_Parser;Renderer=_Renderer;TextRenderer=_TextRenderer;Lexer=_Lexer;Tokenizer=_Tokenizer;Hooks=_Hooks;constructor(...args){this.use(...args);}walkTokens(tokens,callback){let values=[];for (const token of tokens){values=values.concat(callback.call(this,token));switch (token.type){case 'table':{const tableToken=token;for (const cell of tableToken.header){values=values.concat(this.walkTokens(cell.tokens,callback));}for (const row of tableToken.rows){for (const cell of row){values=values.concat(this.walkTokens(cell.tokens,callback));}}break;}case 'list':{const listToken=token;values=values.concat(this.walkTokens(listToken.items,callback));break;}default:{const genericToken=token;if (this.defaults.extensions?.childTokens?.[genericToken.type]){this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens)=>{const tokens=genericToken[childTokens].flat(Infinity);values=values.concat(this.walkTokens(tokens,callback));});} else if (genericToken.tokens){values=values.concat(this.walkTokens(genericToken.tokens,callback));}}}}return values;}use(...args){const extensions=this.defaults.extensions||{renderers:{},childTokens:{}};args.forEach((pack)=>{const opts={...pack};opts.async=this.defaults.async||opts.async||false;if (pack.extensions){pack.extensions.forEach((ext)=>{if (!ext.name){throw new Error('extension name required');}if ('renderer' in ext){const prevRenderer=extensions.renderers[ext.name];if (prevRenderer){extensions.renderers[ext.name]=function(...args){let ret=ext.renderer.apply(this,args);if (ret===false){ret=prevRenderer.apply(this,args);}return ret;};} else{extensions.renderers[ext.name]=ext.renderer;}}if ('tokenizer' in ext){if (!ext.level||(ext.level!=='block'&&ext.level!=='inline')){throw new Error("extension level must be 'block' or 'inline'");}const extLevel=extensions[ext.level];if (extLevel){extLevel.unshift(ext.tokenizer);} else{extensions[ext.level]=[ext.tokenizer];}if (ext.start){if (ext.level==='block'){if (extensions.startBlock){extensions.startBlock.push(ext.start);} else{extensions.startBlock=[ext.start];}} else if (ext.level==='inline'){if (extensions.startInline){extensions.startInline.push(ext.start);} else{extensions.startInline=[ext.start];}}}}if ('childTokens' in ext&&ext.childTokens){extensions.childTokens[ext.name]=ext.childTokens;}});opts.extensions=extensions;}if (pack.renderer){const renderer=this.defaults.renderer||new _Renderer(this.defaults);for (const prop in pack.renderer){if (!(prop in renderer)){throw new Error(`renderer '${prop}' does not exist`);}if (prop==='options'){continue;}const rendererProp=prop;const rendererFunc=pack.renderer[rendererProp];const prevRenderer=renderer[rendererProp];renderer[rendererProp]=(...args)=>{let ret=rendererFunc.apply(renderer,args);if (ret===false){ret=prevRenderer.apply(renderer,args);}return ret||'';};}opts.renderer=renderer;}if (pack.tokenizer){const tokenizer=this.defaults.tokenizer||new _Tokenizer(this.defaults);for (const prop in pack.tokenizer){if (!(prop in tokenizer)){throw new Error(`tokenizer '${prop}' does not exist`);}if (['options','rules','lexer'].includes(prop)){continue;}const tokenizerProp=prop;const tokenizerFunc=pack.tokenizer[tokenizerProp];const prevTokenizer=tokenizer[tokenizerProp];tokenizer[tokenizerProp]=(...args)=>{let ret=tokenizerFunc.apply(tokenizer,args);if (ret===false){ret=prevTokenizer.apply(tokenizer,args);}return ret;};}opts.tokenizer=tokenizer;}if (pack.hooks){const hooks=this.defaults.hooks||new _Hooks();for (const prop in pack.hooks){if (!(prop in hooks)){throw new Error(`hook '${prop}' does not exist`);}if (prop==='options'){continue;}const hooksProp=prop;const hooksFunc=pack.hooks[hooksProp];const prevHook=hooks[hooksProp];if (_Hooks.passThroughHooks.has(prop)){hooks[hooksProp]=(arg)=>{if (this.defaults.async){return Promise.resolve(hooksFunc.call(hooks,arg)).then(ret=>{return prevHook.call(hooks,ret);});}const ret=hooksFunc.call(hooks,arg);return prevHook.call(hooks,ret);};} else{hooks[hooksProp]=(...args)=>{let ret=hooksFunc.apply(hooks,args);if (ret===false){ret=prevHook.apply(hooks,args);}return ret;};}}opts.hooks=hooks;}if (pack.walkTokens){const walkTokens=this.defaults.walkTokens;const packWalktokens=pack.walkTokens;opts.walkTokens=function(token){let values=[];values.push(packWalktokens.call(this,token));if (walkTokens){values=values.concat(walkTokens.call(this,token));}return values;};}this.defaults={...this.defaults,...opts};});return this;}setOptions(opt){this.defaults={...this.defaults,...opt};return this;}lexer(src,options){return _Lexer.lex(src,options??this.defaults);}parser(tokens,options){return _Parser.parse(tokens,options??this.defaults);}#parseMarkdown(lexer,parser){return(src,options)=>{const origOpt={...options};const opt={...this.defaults,...origOpt};if (this.defaults.async===true&&origOpt.async===false){if (!opt.silent){console.warn('marked():The async option was set to true by an extension. The async:false option sent to parse will be ignored.');}opt.async=true;}const throwError=this.#onError(!!opt.silent,!!opt.async);if (typeof src==='undefined'||src===null){return throwError(new Error('marked():input parameter is undefined or null'));}if (typeof src!=='string'){return throwError(new Error('marked():input parameter is of type '+Object.prototype.toString.call(src)+',string expected'));}if (opt.hooks){opt.hooks.options=opt;}if (opt.async){return Promise.resolve(opt.hooks?opt.hooks.preprocess(src):src).then(src=>lexer(src,opt)).then(tokens=>opt.hooks?opt.hooks.processAllTokens(tokens):tokens).then(tokens=>opt.walkTokens?Promise.all(this.walkTokens(tokens,opt.walkTokens)).then(()=>tokens):tokens).then(tokens=>parser(tokens,opt)).then(html=>opt.hooks?opt.hooks.postprocess(html):html).catch (throwError);}try{if (opt.hooks){src=opt.hooks.preprocess(src);}let tokens=lexer(src,opt);if (opt.hooks){tokens=opt.hooks.processAllTokens(tokens);}if (opt.walkTokens){this.walkTokens(tokens,opt.walkTokens);}let html=parser(tokens,opt);if (opt.hooks){html=opt.hooks.postprocess(html);}return html;} catch (e){return throwError(e);}};}#onError(silent,async){return(e)=>{e.message+='\nPlease report this to https:if (silent){const msg='<p>An error occurred:</p><pre>'+escape$1(e.message+'',true)+'</pre>';if (async){return Promise.resolve(msg);}return msg;}if (async){return Promise.reject(e);}throw e;};}}const markedInstance=new Marked();function marked(src,opt){return markedInstance.parse(src,opt);}marked.options=marked.setOptions=function(options){markedInstance.setOptions(options);marked.defaults=markedInstance.defaults;changeDefaults(marked.defaults);return marked;};marked.getDefaults=_getDefaults;marked.defaults=exports.defaults;marked.use=function(...args){markedInstance.use(...args);marked.defaults=markedInstance.defaults;changeDefaults(marked.defaults);return marked;};marked.walkTokens=function(tokens,callback){return markedInstance.walkTokens(tokens,callback);};marked.parseInline=markedInstance.parseInline;marked.Parser=_Parser;marked.parser=_Parser.parse;marked.Renderer=_Renderer;marked.TextRenderer=_TextRenderer;marked.Lexer=_Lexer;marked.lexer=_Lexer.lex;marked.Tokenizer=_Tokenizer;marked.Hooks=_Hooks;marked.parse=marked;const options=marked.options;const setOptions=marked.setOptions;const use=marked.use;const walkTokens=marked.walkTokens;const parseInline=marked.parseInline;const parse=marked;const parser=_Parser.parse;const lexer=_Lexer.lex;exports.Hooks=_Hooks;exports.Lexer=_Lexer;exports.Marked=Marked;exports.Parser=_Parser;exports.Renderer=_Renderer;exports.TextRenderer=_TextRenderer;exports.Tokenizer=_Tokenizer;exports.getDefaults=_getDefaults;exports.lexer=lexer;exports.marked=marked;exports.options=options;exports.parse=parse;exports.parseInline=parseInline;exports.parser=parser;exports.setOptions=setOptions;exports.use=use;exports.walkTokens=walkTokens;}));function formatDate(timestamp){const date=new Date(timestamp*1000);return date.toLocaleDateString('en-US',{year:'numeric',month:'short',day:'numeric'});}function calculateReadingTime(wordCountOrContent){if (!wordCountOrContent)return 'Unknown';const wordsPerMinute=200;let words;if (typeof wordCountOrContent==='number'){words=wordCountOrContent;if (words===0)return 'Unknown';} else{words=wordCountOrContent.trim().split(/\s+/).filter(w=>w.length>0).length;}const minutes=Math.ceil(words/wordsPerMinute);return `${minutes}min read`;}function truncate(text,maxLength=150){if (!text||text.length<=maxLength)return text;return text.substring(0,maxLength).trim()+'...';}function truncateBytes(text,maxBytes){if (!text||!maxBytes||maxBytes<=0)return text||'';const encoder=new TextEncoder();const bytes=encoder.encode(text);if (bytes.length<=maxBytes)return text;let lo=0,hi=text.length;while (lo<hi){const mid=Math.floor((lo+hi+1)/2);const slice=text.slice(0,mid);const len=encoder.encode(slice).length;if (len<=maxBytes)lo=mid;else hi=mid-1;}return text.slice(0,lo).trimEnd()+'...';}function escapeHtml(text){const div=document.createElement('div');div.textContent=text;return div.innerHTML;}function debounce(func,wait){let timeout;return function executedFunction(...args){const later=()=>{clearTimeout(timeout);func(...args);};clearTimeout(timeout);timeout=setTimeout(later,wait);};}class ContentGrowthAPI{constructor(config){this.apiKey=config.apiKey;this.baseUrl=config.baseUrl||'https:this.cache=new Map();this.cacheTTL=5*60*1000;}async fetchArticles(options={}){const{page=1,limit=12,tags=[],category}=options;const params=new URLSearchParams({page:page.toString(),limit:limit.toString()});if (tags.length>0){params.set('tag',tags.join(','));}if (category){params.set('category',category);}const url=`${this.baseUrl}/widget/articles?${params}`;const cacheKey=url;const cached=this.getFromCache(cacheKey);if (cached){return cached;}try{const response=await fetch(url,{headers:{'X-API-Key':this.apiKey}});if (!response.ok){const errorText=await response.text();console.error('[ContentGrowthAPI] Error response body:',errorText);throw new Error(`API Error:${response.status}${response.statusText}`);}const data=await response.json();this.setCache(cacheKey,data);return data;} catch (error){console.error('[ContentGrowthAPI] Failed to fetch articles:',error);throw error;}}async fetchArticle(uuid){const url=`${this.baseUrl}/widget/articles/${uuid}`;const cacheKey=url;const cached=this.getFromCache(cacheKey);if (cached){return cached;}try{const response=await fetch(url,{headers:{'X-API-Key':this.apiKey}});if (!response.ok){const errorText=await response.text();console.error('[ContentGrowthAPI] Error response body:',errorText);throw new Error(`API Error:${response.status}${response.statusText}`);}const data=await response.json();this.setCache(cacheKey,data);return data;} catch (error){console.error('[ContentGrowthAPI] Failed to fetch article:',error);throw error;}}async fetchArticleBySlug(slug){const url=`${this.baseUrl}/widget/articles/slug/${slug}`;const cacheKey=url;const cached=this.getFromCache(cacheKey);if (cached){return cached;}try{const response=await fetch(url,{headers:{'X-API-Key':this.apiKey}});if (!response.ok){const errorText=await response.text();console.error('[ContentGrowthAPI] Error response body:',errorText);throw new Error(`API Error:${response.status}${response.statusText}`);}const data=await response.json();this.setCache(cacheKey,data);return data;} catch (error){console.error('[ContentGrowthAPI] Failed to fetch article by slug:',error);throw error;}}getFromCache(key){const cached=this.cache.get(key);if (!cached)return null;const now=Date.now();if (now-cached.timestamp>this.cacheTTL){this.cache.delete(key);return null;}return cached.data;}setCache(key,data){this.cache.set(key,{data,timestamp:Date.now()});}clearCache(){this.cache.clear();}}class ContentCard{constructor(article,options={}){this.article=article;this.displayMode=options.displayMode||'compact';this.viewerMode=options.viewerMode||'inline';this.externalUrlPattern=options.externalUrlPattern||'/article/{id}';this.externalTarget=options.externalTarget||'article-{id}';this.onExpand=options.onExpand||null;this.onClick=options.onClick||null;this.aiSummaryMaxBytes=options.aiSummaryMaxBytes;}render(){const layoutMode=this.displayMode==='expanded'?'expanded':'compact';if (this.viewerMode==='external'){const link=document.createElement('a');link.className=`cg-card cg-card--${this.displayMode}`;link.dataset.contentId=this.article.uuid;let url=this.externalUrlPattern .replace('{id}',this.article.uuid).replace('{slug}',this.article.slug||this.article.uuid);let target=this.externalTarget .replace('{id}',this.article.uuid).replace('{slug}',this.article.slug||this.article.uuid);link.href=url;link.target=target;link.rel='noopener';if (layoutMode==='compact'){link.innerHTML=this.renderCompact();} else{link.innerHTML=this.renderExpanded();}const expandBtn=link.querySelector('.cg-expand-btn');if (expandBtn&&this.onExpand){expandBtn.addEventListener('click',(e)=>{e.preventDefault();e.stopPropagation();this.onExpand(this.article,link);});}return link;}const card=document.createElement('article');card.className=`cg-card cg-card--${this.displayMode}`;card.dataset.contentId=this.article.uuid;if (layoutMode==='compact'){card.innerHTML=this.renderCompact();} else{card.innerHTML=this.renderExpanded();}card.addEventListener('click',(e)=>{if (e.target.closest('.cg-expand-btn'))return;if (this.onClick){this.onClick(this.article);}});const expandBtn=card.querySelector('.cg-expand-btn');if (expandBtn&&this.onExpand){expandBtn.addEventListener('click',(e)=>{e.stopPropagation();this.onExpand(this.article,card);});}return card;}renderCompact(){const readingTime=calculateReadingTime(this.article.wordCount);return `<div class="cg-card-header"><h3 class="cg-card-title">${escapeHtml(this.article.title)}</h3><button class="cg-expand-btn" aria-label="Show more" title="Show summary"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 6L8 10L12 6" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button></div><div class="cg-card-meta"><span class="cg-meta-item cg-author"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 7C8.65685 7 10 5.65685 10 4C10 2.34315 8.65685 1 7 1C5.34315 1 4 2.34315 4 4C4 5.65685 5.34315 7 7 7Z" stroke="currentColor" stroke-width="1.5"/><path d="M13 13C13 10.7909 10.3137 9 7 9C3.68629 9 1 10.7909 1 13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${escapeHtml(this.article.authorName)}</span><span class="cg-meta-item cg-date"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="1" y="2" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.5"/><path d="M4 1V3M10 1V3M1 5H13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${formatDate(this.article.publishedAt)}</span><span class="cg-meta-item cg-reading-time"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="7" cy="7" r="6" stroke="currentColor" stroke-width="1.5"/><path d="M7 3.5V7L9.5 9.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${readingTime}</span></div>`;}renderExpanded(){const readingTime=calculateReadingTime(this.article.wordCount);const summaryFull=this.article.summary||'';const summary=this.aiSummaryMaxBytes?truncateBytes(summaryFull,this.aiSummaryMaxBytes):summaryFull;const tags=this.article.tags||[];return `<div class="cg-card-header"><h3 class="cg-card-title">${escapeHtml(this.article.title)}</h3><button class="cg-expand-btn cg-expand-btn--collapse" aria-label="Show less" title="Hide summary"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M12 10L8 6L4 10" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button></div>${summary?`<div class="cg-card-summary"><p>${escapeHtml(summary)}</p></div>`:''}${tags.length>0?`<div class="cg-card-tags">${tags.map(tag=>`<span class="cg-tag">${escapeHtml(tag)}</span>`).join('')}</div>`:''}<div class="cg-card-meta"><span class="cg-meta-item cg-author"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 7C8.65685 7 10 5.65685 10 4C10 2.34315 8.65685 1 7 1C5.34315 1 4 2.34315 4 4C4 5.65685 5.34315 7 7 7Z" stroke="currentColor" stroke-width="1.5"/><path d="M13 13C13 10.7909 10.3137 9 7 9C3.68629 9 1 10.7909 1 13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${escapeHtml(this.article.authorName)}</span><span class="cg-meta-item cg-date"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="1" y="2" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.5"/><path d="M4 1V3M10 1V3M1 5H13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${formatDate(this.article.publishedAt)}</span><span class="cg-meta-item cg-reading-time"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="7" cy="7" r="6" stroke="currentColor" stroke-width="1.5"/><path d="M7 3.5V7L9.5 9.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${readingTime}</span></div>`;}}class ContentList{constructor(container,api,options={}){this.container=container;this.api=api;this.options={layoutMode:options.layoutMode||'cards',displayMode:options.displayMode||'comfortable',pageSize:parseInt(options.pageSize)||12,tags:options.tags||[],category:options.category,aiSummaryMaxBytes:options.aiSummaryMaxBytes,viewerMode:options.viewerMode||'inline',externalUrlPattern:options.externalUrlPattern||'/article/{id}',externalTarget:options.externalTarget||'article-{id}',onArticleClick:options.onArticleClick||null};this.currentPage=1;this.totalPages=1;this.articles=[];this.loading=false;this.expandedCards=new Set();}async init(){this.render();await this.loadArticles();}render(){const layoutClass=this.options.layoutMode==='rows'?'cg-content-rows':'cg-content-grid';this.container.innerHTML=`<div class="cg-content-list"><div class="cg-list-header"><button class="cg-display-toggle" title="Toggle display mode"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><rect x="2" y="2" width="16" height="4" rx="1" stroke="currentColor" stroke-width="1.5"/><rect x="2" y="8" width="16" height="4" rx="1" stroke="currentColor" stroke-width="1.5"/><rect x="2" y="14" width="16" height="4" rx="1" stroke="currentColor" stroke-width="1.5"/></svg><span>${this.options.displayMode==='compact'?'Show summaries':'Hide summaries'}</span></button></div><div class="${layoutClass}"></div><div class="cg-pagination"></div></div>`;const toggle=this.container.querySelector('.cg-display-toggle');toggle.addEventListener('click',()=>this.toggleDisplayMode());}async loadArticles(page=1){if (this.loading){return;}this.loading=true;this.showLoading();try{const data=await this.api.fetchArticles({page,limit:this.options.pageSize,tags:this.options.tags,category:this.options.category});this.articles=data.articles||[];this.currentPage=data.pagination?.page||1;this.totalPages=data.pagination?.totalPages||1;this.renderArticles();this.renderPagination();} catch (error){console.error('[ContentList] Error loading articles:',error);this.showError('Failed to load articles. Please try again.');} finally{this.loading=false;}}renderArticles(){const grid=this.container.querySelector('.cg-content-grid,.cg-content-rows');if (this.articles.length===0){grid.innerHTML=`<div class="cg-empty-state"><svg width="64" height="64" viewBox="0 0 64 64" fill="none"><rect x="8" y="12" width="48" height="40" rx="4" stroke="currentColor" stroke-width="2"/><path d="M16 24H48M16 32H48M16 40H32" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg><p>No articles found</p></div>`;return;}grid.innerHTML='';this.articles.forEach(article=>{const isExpanded=this.expandedCards.has(article.uuid);const card=new ContentCard(article,{displayMode:isExpanded?'expanded':this.options.displayMode,viewerMode:this.options.viewerMode,externalUrlPattern:this.options.externalUrlPattern,externalTarget:this.options.externalTarget,aiSummaryMaxBytes:this.options.aiSummaryMaxBytes,onExpand:(article,cardElement)=>this.handleExpand(article,cardElement),onClick:(article)=>this.handleArticleClick(article)});grid.appendChild(card.render());});}handleExpand(article,cardElement){const isExpanded=this.expandedCards.has(article.uuid);if (isExpanded){this.expandedCards.delete(article.uuid);} else{this.expandedCards.add(article.uuid);}const newCard=new ContentCard(article,{displayMode:isExpanded?this.options.displayMode:'expanded',viewerMode:this.options.viewerMode,externalUrlPattern:this.options.externalUrlPattern,externalTarget:this.options.externalTarget,onExpand:(article,cardElement)=>this.handleExpand(article,cardElement),onClick:(article)=>this.handleArticleClick(article)});cardElement.replaceWith(newCard.render());}handleArticleClick(article){if (this.options.onArticleClick){this.options.onArticleClick(article);}}toggleDisplayMode(){this.options.displayMode=this.options.displayMode==='compact'?'expanded':'compact';this.expandedCards.clear();this.renderArticles();const toggle=this.container.querySelector('.cg-display-toggle span');toggle.textContent=this.options.displayMode==='compact'?'Show summaries':'Hide summaries';}renderPagination(){const pagination=this.container.querySelector('.cg-pagination');if (this.totalPages<=1){pagination.innerHTML='';return;}const prevDisabled=this.currentPage===1;const nextDisabled=this.currentPage===this.totalPages;pagination.innerHTML=`<button class="cg-btn-prev" ${prevDisabled?'disabled':''}><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M10 12L6 8L10 4" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>Previous</button><span class="cg-page-info">Page ${this.currentPage}of ${this.totalPages}</span><button class="cg-btn-next" ${nextDisabled?'disabled':''}>Next<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M6 4L10 8L6 12" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button>`;const prevBtn=pagination.querySelector('.cg-btn-prev');const nextBtn=pagination.querySelector('.cg-btn-next');prevBtn.addEventListener('click',()=>{if (this.currentPage>1){this.loadArticles(this.currentPage-1);this.scrollToTop();}});nextBtn.addEventListener('click',()=>{if (this.currentPage<this.totalPages){this.loadArticles(this.currentPage+1);this.scrollToTop();}});}showLoading(){const grid=this.container.querySelector('.cg-content-grid,.cg-content-rows');if (grid){grid.innerHTML=`<div class="cg-loading"><div class="cg-spinner"></div><p>Loading articles...</p></div>`;}}showError(message){const grid=this.container.querySelector('.cg-content-grid,.cg-content-rows');if (grid){grid.innerHTML=`<div class="cg-error"><svg width="48" height="48" viewBox="0 0 48 48" fill="none"><circle cx="24" cy="24" r="20" stroke="currentColor" stroke-width="2"/><path d="M24 16V26M24 32V32.5" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg><p>${message}</p><button class="cg-retry-btn">Try Again</button></div>`;const retryBtn=grid.querySelector('.cg-retry-btn');retryBtn.addEventListener('click',()=>this.loadArticles(this.currentPage));}}scrollToTop(){this.container.scrollIntoView({behavior:'smooth',block:'start'});}}class ContentViewer{constructor(container,api,options={}){this.container=container;this.api=api;this.options={displayMode:options.displayMode||'inline',showBackButton:options.showBackButton!==false,showSummary:options.showSummary!==false,onBack:options.onBack||null};this.article=null;this.loading=false;this.summaryExpanded=true;}async loadArticle(uuid){if (this.loading)return;this.loading=true;this.showLoading();try{this.article=await this.api.fetchArticle(uuid);this.render();} catch (error){this.showError('Failed to load article. Please try again.');console.error(error);} finally{this.loading=false;}}async loadArticleBySlug(slug){if (this.loading)return;this.loading=true;this.showLoading();try{this.article=await this.api.fetchArticleBySlug(slug);this.render();} catch (error){this.showError('Failed to load article. Please try again.');console.error(error);} finally{this.loading=false;}}render(){if (!this.article)return;const readingTime=calculateReadingTime(this.article.wordCount||this.article.content);const content=this.renderMarkdown(this.article.content||'');this.container.innerHTML=`<div class="cg-content-viewer">${this.options.showBackButton?`<div class="cg-viewer-header"><button class="cg-back-btn"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M12 16L6 10L12 4" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>Back to list</button></div>`:''}<article class="cg-viewer-content"><header class="cg-content-header"><h1 class="cg-content-title">${escapeHtml(this.article.title)}</h1>${this.options.showSummary&&this.article.summary&&this.article.category!=='announce'?`<div class="cg-ai-summary ${this.summaryExpanded?'expanded':'collapsed'}"><div class="cg-ai-summary-header"><div class="cg-ai-summary-label"><svg class="cg-ai-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"/></svg><span>AI Generated Summary</span></div><button class="cg-summary-toggle" aria-label="Toggle summary"><svg class="cg-chevron" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6l4 4 4-4"/></svg></button></div><div class="cg-ai-summary-content"><p>${escapeHtml(this.article.summary)}</p></div></div>`:''}<div class="cg-content-meta"><span class="cg-meta-item"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 8C9.65685 8 11 6.65685 11 5C11 3.34315 9.65685 2 8 2C6.34315 2 5 3.34315 5 5C5 6.65685 6.34315 8 8 8Z" stroke="currentColor" stroke-width="1.5"/><path d="M14 14C14 11.7909 11.3137 10 8 10C4.68629 10 2 11.7909 2 14" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${escapeHtml(this.article.authorName)}</span><span class="cg-meta-item"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="2" y="3" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.5"/><path d="M5 2V4M11 2V4M2 6H14" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${formatDate(this.article.publishedAt)}</span><span class="cg-meta-item"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><circle cx="8" cy="8" r="6" stroke="currentColor" stroke-width="1.5"/><path d="M8 4V8L10.5 10.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${readingTime}</span></div></header><div class="cg-content-body">${content}</div></article></div>`;if (this.options.showBackButton){const backBtn=this.container.querySelector('.cg-back-btn');if (backBtn){backBtn.addEventListener('click',()=>this.handleBack());}}const summaryToggle=this.container.querySelector('.cg-summary-toggle');if (summaryToggle){summaryToggle.addEventListener('click',()=>this.toggleSummary());}}toggleSummary(){this.summaryExpanded=!this.summaryExpanded;const summaryEl=this.container.querySelector('.cg-ai-summary');if (summaryEl){if (this.summaryExpanded){summaryEl.classList.add('expanded');summaryEl.classList.remove('collapsed');} else{summaryEl.classList.add('collapsed');summaryEl.classList.remove('expanded');}}}renderMarkdown(markdown){marked.setOptions({breaks:true,gfm:true,headerIds:true,mangle:false});try{return marked.parse(markdown);} catch (error){console.error('Markdown parsing error:',error);return `<p>${escapeHtml(markdown)}</p>`;}}handleBack(){if (this.options.onBack){this.options.onBack();}}showLoading(){this.container.innerHTML=`<div class="cg-content-viewer"><div class="cg-viewer-loading"><div class="cg-spinner"></div><p>Loading article...</p></div></div>`;}showError(message){this.container.innerHTML=`<div class="cg-content-viewer"><div class="cg-viewer-error"><svg width="48" height="48" viewBox="0 0 48 48" fill="none"><circle cx="24" cy="24" r="20" stroke="currentColor" stroke-width="2"/><path d="M24 16V26M24 32V32.5" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg><p>${message}</p>${this.options.showBackButton?'<button class="cg-back-btn">Back to articles</button>':''}</div></div>`;if (this.options.showBackButton){const backBtn=this.container.querySelector('.cg-back-btn');if (backBtn){backBtn.addEventListener('click',()=>this.handleBack());}}}clear(){this.container.innerHTML='';this.article=null;}}class ContentGrowthWidget{static version='1.1.1';constructor(container,config){this.container=typeof container==='string'?document.querySelector(container):container;if (!this.container){throw new Error('Container not found');}this.config={apiKey:config.apiKey||config['api-key'],baseUrl:config.baseUrl||'https:tags:this.parseTags(config.tags),category:config.category,theme:config.theme||'light',layoutMode:config.layoutMode||config['layout-mode']||'cards',displayMode:config.displayMode||config['display-mode']||'comfortable',aiSummaryMaxBytes:config.aiSummaryMaxBytes||config['ai-summary-max-bytes'],viewerMode:config.viewerMode||config['viewer-mode']||'inline',externalUrlPattern:config.externalUrlPattern||config['external-url-pattern']||'/article/{id}',externalTarget:config.externalTarget||config['external-target']||'article-{id}',pageSize:config.pageSize||config['page-size']||12,mode:config.mode||'list',articleId:config.articleId||config['article-id'],slug:config.slug};if (!this.config.apiKey){throw new Error('API key is required');}this.api=new ContentGrowthAPI({apiKey:this.config.apiKey,baseUrl:this.config.baseUrl});this.currentView='list';this.contentList=null;this.contentViewer=null;this.init();}init(){this.container.classList.add('cg-widget');this.container.setAttribute('data-theme',this.config.theme);if (this.config.mode==='article-only'){if (this.config.slug){this.showPostInlineBySlug(this.config.slug);} else if (this.config.articleId){this.showPostInline(this.config.articleId);}} else{this.showList();}}showList(){this.currentView='list';this.container.innerHTML='';const listContainer=document.createElement('div');listContainer.className='cg-list-view';this.container.appendChild(listContainer);this.contentList=new ContentList(listContainer,this.api,{layoutMode:this.config.layoutMode,displayMode:this.config.displayMode,pageSize:this.config.pageSize,tags:this.config.tags,category:this.config.category,aiSummaryMaxBytes:this.config.aiSummaryMaxBytes,viewerMode:this.config.viewerMode,externalUrlPattern:this.config.externalUrlPattern,externalTarget:this.config.externalTarget,onArticleClick:(article)=>this.showPost(article.uuid)});this.contentList.init();}showPost(uuid){this.currentView='viewer';if (this.config.viewerMode==='modal'){this.showPostModal(uuid);} else{this.showPostInline(uuid);}}showPostInline(uuid){this.container.innerHTML='';const viewerContainer=document.createElement('div');viewerContainer.className='cg-viewer-view';this.container.appendChild(viewerContainer);const showBackButton=this.config.mode!=='article-only';this.contentViewer=new ContentViewer(viewerContainer,this.api,{displayMode:'inline',showBackButton:showBackButton,onBack:showBackButton?()=>this.showList():null});this.contentViewer.loadArticle(uuid);}showPostInlineBySlug(slug){this.container.innerHTML='';const viewerContainer=document.createElement('div');viewerContainer.className='cg-viewer-view';this.container.appendChild(viewerContainer);const showBackButton=this.config.mode!=='article-only';this.contentViewer=new ContentViewer(viewerContainer,this.api,{displayMode:'inline',showBackButton:showBackButton,onBack:showBackButton?()=>this.showList():null});this.contentViewer.loadArticleBySlug(slug);}showPostModal(uuid){const modal=document.createElement('div');modal.className='cg-modal';if (this.config.theme){modal.setAttribute('data-theme',this.config.theme);}modal.innerHTML=`<div class="cg-modal-overlay"></div><div class="cg-modal-content"><button class="cg-modal-close" aria-label="Close"><svg width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M18 6L6 18M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button><div class="cg-modal-body"></div></div>`;document.body.appendChild(modal);document.body.style.overflow='hidden';const modalBody=modal.querySelector('.cg-modal-body');this.contentViewer=new ContentViewer(modalBody,this.api,{displayMode:'modal',onBack:()=>this.closeModal(modal)});this.contentViewer.loadArticle(uuid);const closeBtn=modal.querySelector('.cg-modal-close');const overlay=modal.querySelector('.cg-modal-overlay');const closeModal=()=>this.closeModal(modal);closeBtn.addEventListener('click',closeModal);overlay.addEventListener('click',closeModal);const handleEsc=(e)=>{if (e.key==='Escape'){closeModal();document.removeEventListener('keydown',handleEsc);}};document.addEventListener('keydown',handleEsc);requestAnimationFrame(()=>{modal.classList.add('cg-modal--active');});}closeModal(modal){modal.classList.remove('cg-modal--active');setTimeout(()=>{modal.remove();document.body.style.overflow='';},300);}parseTags(tags){if (!tags)return [];if (Array.isArray(tags))return tags;return tags.split(',').map(t=>t.trim()).filter(Boolean);}updateConfig(newConfig){Object.assign(this.config,newConfig);this.init();}destroy(){this.container.innerHTML='';this.container.classList.remove('cg-widget');this.container.removeAttribute('data-theme');}}function initWidgets(){const containers=document.querySelectorAll('[data-cg-content]');`);containers.forEach((container,index)=>{const config={apiKey:container.dataset.apiKey||container.dataset.cgApiKey,baseUrl:window.WIDGET_BASE_URL||container.dataset.baseUrl||container.dataset.cgBaseUrl,tags:container.dataset.tags||container.dataset.cgTags,theme:container.dataset.theme||container.dataset.cgTheme||'light',layoutMode:container.dataset.layoutMode||container.dataset.cgLayoutMode||'cards',displayMode:container.dataset.displayMode||container.dataset.cgDisplayMode||'comfortable',viewerMode:container.dataset.viewerMode||container.dataset.cgViewerMode||'inline',externalUrlPattern:container.dataset.externalUrlPattern||container.dataset.cgExternalUrlPattern,externalTarget:container.dataset.externalTarget||container.dataset.cgExternalTarget,pageSize:container.dataset.pageSize||container.dataset.cgPageSize||12,mode:container.dataset.mode||container.dataset.cgMode||'list',articleId:container.dataset.articleId||container.dataset.cgArticleId};try{new ContentGrowthWidget(container,config);} catch (error){console.error(`[Widget ${index}] Failed to initialize:`,error);container.innerHTML=`<div style="padding:2rem;text-align:center;color:#ef4444;"><p>Failed to load widget:${error.message}</p><p style="font-size:0.875rem;margin-top:0.5rem;">Check console for details</p></div>`;}});}if (document.readyState==='loading'){document.addEventListener('DOMContentLoaded',initWidgets);} else{initWidgets();}window.ContentGrowthWidget=ContentGrowthWidget;{ContentGrowthWidget};window.ContentGrowthWidget=ContentGrowthWidget;console.log('[ContentGrowthWidget] Loaded successfully v1.1.1');})(window);
1
+ /***Content Growth Widget-Standalone Bundle*Version:1.1.2*https:*/(function(window){'use strict';(function(global,factory){typeof exports==='object'&&typeof module!=='undefined'?factory(exports):typeof define==='function'&&define.amd?define(['exports'],factory):(global=typeof globalThis!=='undefined'?globalThis:global||self,factory(global.marked={}));})(this,(function(exports){'use strict';function _getDefaults(){return{async:false,breaks:false,extensions:null,gfm:true,hooks:null,pedantic:false,renderer:null,silent:false,tokenizer:null,walkTokens:null};}exports.defaults=_getDefaults();function changeDefaults(newDefaults){exports.defaults=newDefaults;}const escapeTest=/[&<>"']/;const escapeReplace=new RegExp(escapeTest.source,'g');const escapeTestNoEncode=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/;const escapeReplaceNoEncode=new RegExp(escapeTestNoEncode.source,'g');const escapeReplacements={'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'};const getEscapeReplacement=(ch)=>escapeReplacements[ch];function escape$1(html,encode){if (encode){if (escapeTest.test(html)){return html.replace(escapeReplace,getEscapeReplacement);}} else{if (escapeTestNoEncode.test(html)){return html.replace(escapeReplaceNoEncode,getEscapeReplacement);}}return html;}const unescapeTest=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;function unescape(html){return html.replace(unescapeTest,(_,n)=>{n=n.toLowerCase();if (n==='colon')return ':';if (n.charAt(0)==='#'){return n.charAt(1)==='x'?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1));}return '';});}const caret=/(^|[^\[])\^/g;function edit(regex,opt){let source=typeof regex==='string'?regex:regex.source;opt=opt||'';const obj={replace:(name,val)=>{let valSource=typeof val==='string'?val:val.source;valSource=valSource.replace(caret,'$1');source=source.replace(name,valSource);return obj;},getRegex:()=>{return new RegExp(source,opt);}};return obj;}function cleanUrl(href){try{href=encodeURI(href).replace(/%25/g,'%');} catch (e){return null;}return href;}const noopTest={exec:()=>null};function splitCells(tableRow,count){const row=tableRow.replace(/\|/g,(match,offset,str)=>{let escaped=false;let curr=offset;while (--curr>=0&&str[curr]==='\\')escaped=!escaped;if (escaped){return '|';} else{return '|';}}),cells=row.split(/\|/);let i=0;if (!cells[0].trim()){cells.shift();}if (cells.length>0&&!cells[cells.length-1].trim()){cells.pop();}if (count){if (cells.length>count){cells.splice(count);} else{while (cells.length<count)cells.push('');}}for (;i<cells.length;i++){cells[i]=cells[i].trim().replace(/\\\|/g,'|');}return cells;}function rtrim(str,c,invert){const l=str.length;if (l===0){return '';}let suffLen=0;while (suffLen<l){const currChar=str.charAt(l-suffLen-1);if (currChar===c&&!invert){suffLen++;} else if (currChar!==c&&invert){suffLen++;} else{break;}}return str.slice(0,l-suffLen);}function findClosingBracket(str,b){if (str.indexOf(b[1])===-1){return-1;}let level=0;for (let i=0;i<str.length;i++){if (str[i]==='\\'){i++;} else if (str[i]===b[0]){level++;} else if (str[i]===b[1]){level--;if (level<0){return i;}}}return-1;}function outputLink(cap,link,raw,lexer){const href=link.href;const title=link.title?escape$1(link.title):null;const text=cap[1].replace(/\\([\[\]])/g,'$1');if (cap[0].charAt(0)!=='!'){lexer.state.inLink=true;const token={type:'link',raw,href,title,text,tokens:lexer.inlineTokens(text)};lexer.state.inLink=false;return token;}return{type:'image',raw,href,title,text:escape$1(text)};}function indentCodeCompensation(raw,text){const matchIndentToCode=raw.match(/^(\s+)(?:```)/);if (matchIndentToCode===null){return text;}const indentToCode=matchIndentToCode[1];return text .split('\n').map(node=>{const matchIndentInNode=node.match(/^\s+/);if (matchIndentInNode===null){return node;}const [indentInNode]=matchIndentInNode;if (indentInNode.length>=indentToCode.length){return node.slice(indentToCode.length);}return node;}).join('\n');}class _Tokenizer{options;rules;lexer;constructor(options){this.options=options||exports.defaults;}space(src){const cap=this.rules.block.newline.exec(src);if (cap&&cap[0].length>0){return{type:'space',raw:cap[0]};}}code(src){const cap=this.rules.block.code.exec(src);if (cap){const text=cap[0].replace(/^{1,4}/gm,'');return{type:'code',raw:cap[0],codeBlockStyle:'indented',text:!this.options.pedantic?rtrim(text,'\n'):text};}}fences(src){const cap=this.rules.block.fences.exec(src);if (cap){const raw=cap[0];const text=indentCodeCompensation(raw,cap[3]||'');return{type:'code',raw,lang:cap[2]?cap[2].trim().replace(this.rules.inline.anyPunctuation,'$1'):cap[2],text};}}heading(src){const cap=this.rules.block.heading.exec(src);if (cap){let text=cap[2].trim();if (/#$/.test(text)){const trimmed=rtrim(text,'#');if (this.options.pedantic){text=trimmed.trim();} else if (!trimmed||/$/.test(trimmed)){text=trimmed.trim();}}return{type:'heading',raw:cap[0],depth:cap[1].length,text,tokens:this.lexer.inline(text)};}}hr(src){const cap=this.rules.block.hr.exec(src);if (cap){return{type:'hr',raw:cap[0]};}}blockquote(src){const cap=this.rules.block.blockquote.exec(src);if (cap){const text=rtrim(cap[0].replace(/^*>[ \t]?/gm,''),'\n');const top=this.lexer.state.top;this.lexer.state.top=true;const tokens=this.lexer.blockTokens(text);this.lexer.state.top=top;return{type:'blockquote',raw:cap[0],tokens,text};}}list(src){let cap=this.rules.block.list.exec(src);if (cap){let bull=cap[1].trim();const isordered=bull.length>1;const list={type:'list',raw:'',ordered:isordered,start:isordered?+bull.slice(0,-1):'',loose:false,items:[]};bull=isordered?`\\d{1,9}\\${bull.slice(-1)}`:`\\${bull}`;if (this.options.pedantic){bull=isordered?bull:'[*+-]';}const itemRegex=new RegExp(`^({0,3}${bull})((?:[\t ][^\\n]*)?(?:\\n|$))`);let raw='';let itemContents='';let endsWithBlankLine=false;while (src){let endEarly=false;if (!(cap=itemRegex.exec(src))){break;}if (this.rules.block.hr.test(src)){break;}raw=cap[0];src=src.substring(raw.length);let line=cap[2].split('\n',1)[0].replace(/^\t+/,(t)=>' '.repeat(3*t.length));let nextLine=src.split('\n',1)[0];let indent=0;if (this.options.pedantic){indent=2;itemContents=line.trimStart();} else{indent=cap[2].search(/[^ ]/);indent=indent>4?1:indent;itemContents=line.slice(indent);indent+=cap[1].length;}let blankLine=false;if (!line&&/^*$/.test(nextLine)){raw+=nextLine+'\n';src=src.substring(nextLine.length+1);endEarly=true;}if (!endEarly){const nextBulletRegex=new RegExp(`^{0,${Math.min(3,indent-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`);const hrRegex=new RegExp(`^{0,${Math.min(3,indent-1)}}((?:-*){3,}|(?:_*){3,}|(?:\\**){3,})(?:\\n+|$)`);const fencesBeginRegex=new RegExp(`^{0,${Math.min(3,indent-1)}}(?:\`\`\`|~~~)`);const headingBeginRegex=new RegExp(`^{0,${Math.min(3,indent-1)}}#`);while (src){const rawLine=src.split('\n',1)[0];nextLine=rawLine;if (this.options.pedantic){nextLine=nextLine.replace(/^{1,4}(?=({4})*[^ ])/g,' ');}if (fencesBeginRegex.test(nextLine)){break;}if (headingBeginRegex.test(nextLine)){break;}if (nextBulletRegex.test(nextLine)){break;}if (hrRegex.test(src)){break;}if (nextLine.search(/[^ ]/)>=indent||!nextLine.trim()){itemContents+='\n'+nextLine.slice(indent);} else{if (blankLine){break;}if (line.search(/[^ ]/)>=4){break;}if (fencesBeginRegex.test(line)){break;}if (headingBeginRegex.test(line)){break;}if (hrRegex.test(line)){break;}itemContents+='\n'+nextLine;}if (!blankLine&&!nextLine.trim()){blankLine=true;}raw+=rawLine+'\n';src=src.substring(rawLine.length+1);line=nextLine.slice(indent);}}if (!list.loose){if (endsWithBlankLine){list.loose=true;} else if (/\n*\n*$/.test(raw)){endsWithBlankLine=true;}}let istask=null;let ischecked;if (this.options.gfm){istask=/^\[[ xX]\]/.exec(itemContents);if (istask){ischecked=istask[0]!=='[ ] ';itemContents=itemContents.replace(/^\[[ xX]\]+/,'');}}list.items.push({type:'list_item',raw,task:!!istask,checked:ischecked,loose:false,text:itemContents,tokens:[]});list.raw+=raw;}list.items[list.items.length-1].raw=raw.trimEnd();(list.items[list.items.length-1]).text=itemContents.trimEnd();list.raw=list.raw.trimEnd();for (let i=0;i<list.items.length;i++){this.lexer.state.top=false;list.items[i].tokens=this.lexer.blockTokens(list.items[i].text,[]);if (!list.loose){const spacers=list.items[i].tokens.filter(t=>t.type==='space');const hasMultipleLineBreaks=spacers.length>0&&spacers.some(t=>/\n.*\n/.test(t.raw));list.loose=hasMultipleLineBreaks;}}if (list.loose){for (let i=0;i<list.items.length;i++){list.items[i].loose=true;}}return list;}}html(src){const cap=this.rules.block.html.exec(src);if (cap){const token={type:'html',block:true,raw:cap[0],pre:cap[1]==='pre'||cap[1]==='script'||cap[1]==='style',text:cap[0]};return token;}}def(src){const cap=this.rules.block.def.exec(src);if (cap){const tag=cap[1].toLowerCase().replace(/\s+/g,' ');const href=cap[2]?cap[2].replace(/^<(.*)>$/,'$1').replace(this.rules.inline.anyPunctuation,'$1'):'';const title=cap[3]?cap[3].substring(1,cap[3].length-1).replace(this.rules.inline.anyPunctuation,'$1'):cap[3];return{type:'def',tag,raw:cap[0],href,title};}}table(src){const cap=this.rules.block.table.exec(src);if (!cap){return;}if (!/[:|]/.test(cap[2])){return;}const headers=splitCells(cap[1]);const aligns=cap[2].replace(/^\||\|*$/g,'').split('|');const rows=cap[3]&&cap[3].trim()?cap[3].replace(/\n[ \t]*$/,'').split('\n'):[];const item={type:'table',raw:cap[0],header:[],align:[],rows:[]};if (headers.length!==aligns.length){return;}for (const align of aligns){if (/^*-+:*$/.test(align)){item.align.push('right');} else if (/^*:-+:*$/.test(align)){item.align.push('center');} else if (/^*:-+*$/.test(align)){item.align.push('left');} else{item.align.push(null);}}for (const header of headers){item.header.push({text:header,tokens:this.lexer.inline(header)});}for (const row of rows){item.rows.push(splitCells(row,item.header.length).map(cell=>{return{text:cell,tokens:this.lexer.inline(cell)};}));}return item;}lheading(src){const cap=this.rules.block.lheading.exec(src);if (cap){return{type:'heading',raw:cap[0],depth:cap[2].charAt(0)==='='?1:2,text:cap[1],tokens:this.lexer.inline(cap[1])};}}paragraph(src){const cap=this.rules.block.paragraph.exec(src);if (cap){const text=cap[1].charAt(cap[1].length-1)==='\n'?cap[1].slice(0,-1):cap[1];return{type:'paragraph',raw:cap[0],text,tokens:this.lexer.inline(text)};}}text(src){const cap=this.rules.block.text.exec(src);if (cap){return{type:'text',raw:cap[0],text:cap[0],tokens:this.lexer.inline(cap[0])};}}escape(src){const cap=this.rules.inline.escape.exec(src);if (cap){return{type:'escape',raw:cap[0],text:escape$1(cap[1])};}}tag(src){const cap=this.rules.inline.tag.exec(src);if (cap){if (!this.lexer.state.inLink&&/^<a/i.test(cap[0])){this.lexer.state.inLink=true;} else if (this.lexer.state.inLink&&/^<\/a>/i.test(cap[0])){this.lexer.state.inLink=false;}if (!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])){this.lexer.state.inRawBlock=true;} else if (this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])){this.lexer.state.inRawBlock=false;}return{type:'html',raw:cap[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:false,text:cap[0]};}}link(src){const cap=this.rules.inline.link.exec(src);if (cap){const trimmedUrl=cap[2].trim();if (!this.options.pedantic&&/^</.test(trimmedUrl)){if (!(/>$/.test(trimmedUrl))){return;}const rtrimSlash=rtrim(trimmedUrl.slice(0,-1),'\\');if ((trimmedUrl.length-rtrimSlash.length)%2===0){return;}} else{const lastParenIndex=findClosingBracket(cap[2],'()');if (lastParenIndex>-1){const start=cap[0].indexOf('!')===0?5:4;const linkLen=start+cap[1].length+lastParenIndex;cap[2]=cap[2].substring(0,lastParenIndex);cap[0]=cap[0].substring(0,linkLen).trim();cap[3]='';}}let href=cap[2];let title='';if (this.options.pedantic){const link=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);if (link){href=link[1];title=link[3];}} else{title=cap[3]?cap[3].slice(1,-1):'';}href=href.trim();if (/^</.test(href)){if (this.options.pedantic&&!(/>$/.test(trimmedUrl))){href=href.slice(1);} else{href=href.slice(1,-1);}}return outputLink(cap,{href:href?href.replace(this.rules.inline.anyPunctuation,'$1'):href,title:title?title.replace(this.rules.inline.anyPunctuation,'$1'):title},cap[0],this.lexer);}}reflink(src,links){let cap;if ((cap=this.rules.inline.reflink.exec(src))||(cap=this.rules.inline.nolink.exec(src))){const linkString=(cap[2]||cap[1]).replace(/\s+/g,' ');const link=links[linkString.toLowerCase()];if (!link){const text=cap[0].charAt(0);return{type:'text',raw:text,text};}return outputLink(cap,link,cap[0],this.lexer);}}emStrong(src,maskedSrc,prevChar=''){let match=this.rules.inline.emStrongLDelim.exec(src);if (!match)return;if (match[3]&&prevChar.match(/[\p{L}\p{N}]/u))return;const nextChar=match[1]||match[2]||'';if (!nextChar||!prevChar||this.rules.inline.punctuation.exec(prevChar)){const lLength=[...match[0]].length-1;let rDelim,rLength,delimTotal=lLength,midDelimTotal=0;const endReg=match[0][0]==='*'?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;endReg.lastIndex=0;maskedSrc=maskedSrc.slice(-1*src.length+lLength);while ((match=endReg.exec(maskedSrc))!=null){rDelim=match[1]||match[2]||match[3]||match[4]||match[5]||match[6];if (!rDelim)continue;rLength=[...rDelim].length;if (match[3]||match[4]){delimTotal+=rLength;continue;} else if (match[5]||match[6]){if (lLength%3&&!((lLength+rLength)%3)){midDelimTotal+=rLength;continue;}}delimTotal-=rLength;if (delimTotal>0)continue;rLength=Math.min(rLength,rLength+delimTotal+midDelimTotal);const lastCharLength=[...match[0]][0].length;const raw=src.slice(0,lLength+match.index+lastCharLength+rLength);if (Math.min(lLength,rLength)%2){const text=raw.slice(1,-1);return{type:'em',raw,text,tokens:this.lexer.inlineTokens(text)};}const text=raw.slice(2,-2);return{type:'strong',raw,text,tokens:this.lexer.inlineTokens(text)};}}}codespan(src){const cap=this.rules.inline.code.exec(src);if (cap){let text=cap[2].replace(/\n/g,' ');const hasNonSpaceChars=/[^ ]/.test(text);const hasSpaceCharsOnBothEnds=/^/.test(text)&&/$/.test(text);if (hasNonSpaceChars&&hasSpaceCharsOnBothEnds){text=text.substring(1,text.length-1);}text=escape$1(text,true);return{type:'codespan',raw:cap[0],text};}}br(src){const cap=this.rules.inline.br.exec(src);if (cap){return{type:'br',raw:cap[0]};}}del(src){const cap=this.rules.inline.del.exec(src);if (cap){return{type:'del',raw:cap[0],text:cap[2],tokens:this.lexer.inlineTokens(cap[2])};}}autolink(src){const cap=this.rules.inline.autolink.exec(src);if (cap){let text,href;if (cap[2]==='@'){text=escape$1(cap[1]);href='mailto:'+text;} else{text=escape$1(cap[1]);href=text;}return{type:'link',raw:cap[0],text,href,tokens:[{type:'text',raw:text,text}]};}}url(src){let cap;if (cap=this.rules.inline.url.exec(src)){let text,href;if (cap[2]==='@'){text=escape$1(cap[0]);href='mailto:'+text;} else{let prevCapZero;do{prevCapZero=cap[0];cap[0]=this.rules.inline._backpedal.exec(cap[0])?.[0]??'';}while (prevCapZero!==cap[0]);text=escape$1(cap[0]);if (cap[1]==='www.'){href='http:} else{href=cap[0];}}return{type:'link',raw:cap[0],text,href,tokens:[{type:'text',raw:text,text}]};}}inlineText(src){const cap=this.rules.inline.text.exec(src);if (cap){let text;if (this.lexer.state.inRawBlock){text=cap[0];} else{text=escape$1(cap[0]);}return{type:'text',raw:cap[0],text};}}}const newline=/^(?:*(?:\n|$))+/;const blockCode=/^({4}[^\n]+(?:\n(?:*(?:\n|$))*)?)+/;const fences=/^{0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?:{0,3}\1[~`]**(?=\n|$)|$)/;const hr=/^{0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/;const heading=/^{0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/;const bullet=/(?:[*+-]|\d{1,9}[.)])/;const lheading=edit(/^(?!bull)((?:.|\n(?!\s*?\n|bull))+?)\n{0,3}(=+|-+)*(?:\n+|$)/).replace(/bull/g,bullet).getRegex();const _paragraph=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table|+\n)[^\n]+)*)/;const blockText=/^[^\n]+/;const _blockLabel=/(?!\s*\])(?:\\.|[^\[\]\\])+/;const def=edit(/^{0,3}\[(label)\]:*(?:\n*)?([^<\s][^\s]*|<.*?>)(?:(?:+(?:\n*)?|*\n*)(title))?*(?:\n+|$)/).replace('label',_blockLabel).replace('title',/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex();const list=edit(/^({0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,bullet).getRegex();const _tag='address|article|aside|base|basefont|blockquote|body|caption'+'|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'+'|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'+'|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'+'|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'+'|track|ul';const _comment=/<!--(?!-?>)[\s\S]*?(?:-->|$)/;const html=edit('^{0,3}(?:'+'<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)'+'|comment[^\\n]*(\\n+|$)'+'|<\\?[\\s\\S]*?(?:\\?>\\n*|$)'+'|<![A-Z][\\s\\S]*?(?:>\\n*|$)'+'|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)'+'|</?(tag)(?:+|\\n|/?>)[\\s\\S]*?(?:(?:\\n*)+\\n|$)'+'|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*?*/?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n*)+\\n|$)'+'|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n*)+\\n|$)'+')','i').replace('comment',_comment).replace('tag',_tag).replace('attribute',/+[a-zA-Z:_][\w.:-]*(?:*=*"[^"\n]*"|*=*'[^'\n]*'|*=*[^\s"'=<>`]+)?/).getRegex();const paragraph=edit(_paragraph).replace('hr',hr).replace('heading','{0,3}#{1,6}(?:\\s|$)').replace('|lheading','').replace('|table','').replace('blockquote','{0,3}>').replace('fences','{0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list','{0,3}(?:[*+-]|1[.)])').replace('html','</?(?:tag)(?:+|\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag',_tag).getRegex();const blockquote=edit(/^({0,3}>?(paragraph|[^\n]*)(?:\n|$))+/).replace('paragraph',paragraph).getRegex();const blockNormal={blockquote,code:blockCode,def,fences,heading,hr,html,lheading,list,newline,paragraph,table:noopTest,text:blockText};const gfmTable=edit('^*([^\\n ].*)\\n'+'{0,3}((?:\\|*)?:?-+:?*(?:\\|*:?-+:?*)*(?:\\|*)?)'+'(?:\\n((?:(?!*\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)').replace('hr',hr).replace('heading','{0,3}#{1,6}(?:\\s|$)').replace('blockquote','{0,3}>').replace('code','{4}[^\\n]').replace('fences','{0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list','{0,3}(?:[*+-]|1[.)])').replace('html','</?(?:tag)(?:+|\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag',_tag).getRegex();const blockGfm={...blockNormal,table:gfmTable,paragraph:edit(_paragraph).replace('hr',hr).replace('heading','{0,3}#{1,6}(?:\\s|$)').replace('|lheading','').replace('table',gfmTable).replace('blockquote','{0,3}>').replace('fences','{0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list','{0,3}(?:[*+-]|1[.)])').replace('html','</?(?:tag)(?:+|\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag',_tag).getRegex()};const blockPedantic={...blockNormal,html:edit('^*(?:comment*(?:\\n|\\s*$)'+'|<(tag)[\\s\\S]+?</\\1>*(?:\\n{2,}|\\s*$)'+'|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?>*(?:\\n{2,}|\\s*$))').replace('comment',_comment).replace(/tag/g,'(?!(?:'+'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'+'|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'+'\\b)\\w+(?!:|[^\\w\\s@]*@)\\b').getRegex(),def:/^*\[([^\]]+)\]:*<?([^\s>]+)>?(?:+(["(][^\n]+[")]))?*(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:noopTest,lheading:/^(.+?)\n{0,3}(=+|-+)*(?:\n+|$)/,paragraph:edit(_paragraph).replace('hr',hr).replace('heading','*#{1,6}*[^\n]').replace('lheading',lheading).replace('|table','').replace('blockquote','{0,3}>').replace('|fences','').replace('|list','').replace('|html','').replace('|tag','').getRegex()};const escape=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/;const inlineCode=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/;const br=/^({2,}|\\)\n(?!\s*$)/;const inlineText=/^(`+|[^`])(?:(?={2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?={2,}\n)))/;const _punctuation='\\p{P}$+<=>`^|~';const punctuation=edit(/^((?![*_])[\spunctuation])/,'u').replace(/punctuation/g,_punctuation).getRegex();const blockSkip=/\[[^[\]]*?\]\([^\(\)]*?\)|`[^`]*?`|<[^<>]*?>/g;const emStrongLDelim=edit(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/,'u').replace(/punct/g,_punctuation).getRegex();const emStrongRDelimAst=edit('^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)'+'|[^*]+(?=[^*])'+'|(?!\\*)[punct](\\*+)(?=[\\s]|$)'+'|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)'+'|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])'+'|[\\s](\\*+)(?!\\*)(?=[punct])'+'|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])'+'|[^punct\\s](\\*+)(?=[^punct\\s])','gu').replace(/punct/g,_punctuation).getRegex();const emStrongRDelimUnd=edit('^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)'+'|[^_]+(?=[^_])'+'|(?!_)[punct](_+)(?=[\\s]|$)'+'|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)'+'|(?!_)[punct\\s](_+)(?=[^punct\\s])'+'|[\\s](_+)(?!_)(?=[punct])'+'|(?!_)[punct](_+)(?!_)(?=[punct])','gu').replace(/punct/g,_punctuation).getRegex();const anyPunctuation=edit(/\\([punct])/,'gu').replace(/punct/g,_punctuation).getRegex();const autolink=edit(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace('scheme',/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace('email',/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex();const _inlineComment=edit(_comment).replace('(?:-->|$)','-->').getRegex();const tag=edit('^comment'+'|^</[a-zA-Z][\\w:-]*\\s*>'+'|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>'+'|^<\\?[\\s\\S]*?\\?>'+'|^<![a-zA-Z]+\\s[\\s\\S]*?>'+'|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>').replace('comment',_inlineComment).replace('attribute',/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex();const _inlineLabel=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;const link=edit(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace('label',_inlineLabel).replace('href',/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace('title',/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex();const reflink=edit(/^!?\[(label)\]\[(ref)\]/).replace('label',_inlineLabel).replace('ref',_blockLabel).getRegex();const nolink=edit(/^!?\[(ref)\](?:\[\])?/).replace('ref',_blockLabel).getRegex();const reflinkSearch=edit('reflink|nolink(?!\\()','g').replace('reflink',reflink).replace('nolink',nolink).getRegex();const inlineNormal={_backpedal:noopTest,anyPunctuation,autolink,blockSkip,br,code:inlineCode,del:noopTest,emStrongLDelim,emStrongRDelimAst,emStrongRDelimUnd,escape,link,nolink,punctuation,reflink,reflinkSearch,tag,text:inlineText,url:noopTest};const inlinePedantic={...inlineNormal,link:edit(/^!?\[(label)\]\((.*?)\)/).replace('label',_inlineLabel).getRegex(),reflink:edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace('label',_inlineLabel).getRegex()};const inlineGfm={...inlineNormal,escape:edit(escape).replace('])','~|])').getRegex(),url:edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,'i').replace('email',/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?={2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?={2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/};const inlineBreaks={...inlineGfm,br:edit(br).replace('{2,}','*').getRegex(),text:edit(inlineGfm.text).replace('\\b_','\\b_|{2,}\\n').replace(/\{2,\}/g,'*').getRegex()};const block={normal:blockNormal,gfm:blockGfm,pedantic:blockPedantic};const inline={normal:inlineNormal,gfm:inlineGfm,breaks:inlineBreaks,pedantic:inlinePedantic};class _Lexer{tokens;options;state;tokenizer;inlineQueue;constructor(options){this.tokens=[];this.tokens.links=Object.create(null);this.options=options||exports.defaults;this.options.tokenizer=this.options.tokenizer||new _Tokenizer();this.tokenizer=this.options.tokenizer;this.tokenizer.options=this.options;this.tokenizer.lexer=this;this.inlineQueue=[];this.state={inLink:false,inRawBlock:false,top:true};const rules={block:block.normal,inline:inline.normal};if (this.options.pedantic){rules.block=block.pedantic;rules.inline=inline.pedantic;} else if (this.options.gfm){rules.block=block.gfm;if (this.options.breaks){rules.inline=inline.breaks;} else{rules.inline=inline.gfm;}}this.tokenizer.rules=rules;}static get rules(){return{block,inline};}static lex(src,options){const lexer=new _Lexer(options);return lexer.lex(src);}static lexInline(src,options){const lexer=new _Lexer(options);return lexer.inlineTokens(src);}lex(src){src=src .replace(/\r\n|\r/g,'\n');this.blockTokens(src,this.tokens);for (let i=0;i<this.inlineQueue.length;i++){const next=this.inlineQueue[i];this.inlineTokens(next.src,next.tokens);}this.inlineQueue=[];return this.tokens;}blockTokens(src,tokens=[]){if (this.options.pedantic){src=src.replace(/\t/g,' ').replace(/^+$/gm,'');} else{src=src.replace(/^(*)(\t+)/gm,(_,leading,tabs)=>{return leading+' '.repeat(tabs.length);});}let token;let lastToken;let cutSrc;let lastParagraphClipped;while (src){if (this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some((extTokenizer)=>{if (token=extTokenizer.call({lexer:this},src,tokens)){src=src.substring(token.raw.length);tokens.push(token);return true;}return false;})){continue;}if (token=this.tokenizer.space(src)){src=src.substring(token.raw.length);if (token.raw.length===1&&tokens.length>0){tokens[tokens.length-1].raw+='\n';} else{tokens.push(token);}continue;}if (token=this.tokenizer.code(src)){src=src.substring(token.raw.length);lastToken=tokens[tokens.length-1];if (lastToken&&(lastToken.type==='paragraph'||lastToken.type==='text')){lastToken.raw+='\n'+token.raw;lastToken.text+='\n'+token.text;this.inlineQueue[this.inlineQueue.length-1].src=lastToken.text;} else{tokens.push(token);}continue;}if (token=this.tokenizer.fences(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.heading(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.hr(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.blockquote(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.list(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.html(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.def(src)){src=src.substring(token.raw.length);lastToken=tokens[tokens.length-1];if (lastToken&&(lastToken.type==='paragraph'||lastToken.type==='text')){lastToken.raw+='\n'+token.raw;lastToken.text+='\n'+token.raw;this.inlineQueue[this.inlineQueue.length-1].src=lastToken.text;} else if (!this.tokens.links[token.tag]){this.tokens.links[token.tag]={href:token.href,title:token.title};}continue;}if (token=this.tokenizer.table(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.lheading(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}cutSrc=src;if (this.options.extensions&&this.options.extensions.startBlock){let startIndex=Infinity;const tempSrc=src.slice(1);let tempStart;this.options.extensions.startBlock.forEach((getStartIndex)=>{tempStart=getStartIndex.call({lexer:this},tempSrc);if (typeof tempStart==='number'&&tempStart>=0){startIndex=Math.min(startIndex,tempStart);}});if (startIndex<Infinity&&startIndex>=0){cutSrc=src.substring(0,startIndex+1);}}if (this.state.top&&(token=this.tokenizer.paragraph(cutSrc))){lastToken=tokens[tokens.length-1];if (lastParagraphClipped&&lastToken.type==='paragraph'){lastToken.raw+='\n'+token.raw;lastToken.text+='\n'+token.text;this.inlineQueue.pop();this.inlineQueue[this.inlineQueue.length-1].src=lastToken.text;} else{tokens.push(token);}lastParagraphClipped=(cutSrc.length!==src.length);src=src.substring(token.raw.length);continue;}if (token=this.tokenizer.text(src)){src=src.substring(token.raw.length);lastToken=tokens[tokens.length-1];if (lastToken&&lastToken.type==='text'){lastToken.raw+='\n'+token.raw;lastToken.text+='\n'+token.text;this.inlineQueue.pop();this.inlineQueue[this.inlineQueue.length-1].src=lastToken.text;} else{tokens.push(token);}continue;}if (src){const errMsg='Infinite loop on byte:'+src.charCodeAt(0);if (this.options.silent){console.error(errMsg);break;} else{throw new Error(errMsg);}}}this.state.top=true;return tokens;}inline(src,tokens=[]){this.inlineQueue.push({src,tokens});return tokens;}inlineTokens(src,tokens=[]){let token,lastToken,cutSrc;let maskedSrc=src;let match;let keepPrevChar,prevChar;if (this.tokens.links){const links=Object.keys(this.tokens.links);if (links.length>0){while ((match=this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc))!=null){if (links.includes(match[0].slice(match[0].lastIndexOf('[')+1,-1))){maskedSrc=maskedSrc.slice(0,match.index)+'['+'a'.repeat(match[0].length-2)+']'+maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);}}}}while ((match=this.tokenizer.rules.inline.blockSkip.exec(maskedSrc))!=null){maskedSrc=maskedSrc.slice(0,match.index)+'['+'a'.repeat(match[0].length-2)+']'+maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);}while ((match=this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc))!=null){maskedSrc=maskedSrc.slice(0,match.index)+'++'+maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);}while (src){if (!keepPrevChar){prevChar='';}keepPrevChar=false;if (this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some((extTokenizer)=>{if (token=extTokenizer.call({lexer:this},src,tokens)){src=src.substring(token.raw.length);tokens.push(token);return true;}return false;})){continue;}if (token=this.tokenizer.escape(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.tag(src)){src=src.substring(token.raw.length);lastToken=tokens[tokens.length-1];if (lastToken&&token.type==='text'&&lastToken.type==='text'){lastToken.raw+=token.raw;lastToken.text+=token.text;} else{tokens.push(token);}continue;}if (token=this.tokenizer.link(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.reflink(src,this.tokens.links)){src=src.substring(token.raw.length);lastToken=tokens[tokens.length-1];if (lastToken&&token.type==='text'&&lastToken.type==='text'){lastToken.raw+=token.raw;lastToken.text+=token.text;} else{tokens.push(token);}continue;}if (token=this.tokenizer.emStrong(src,maskedSrc,prevChar)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.codespan(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.br(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.del(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.autolink(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (!this.state.inLink&&(token=this.tokenizer.url(src))){src=src.substring(token.raw.length);tokens.push(token);continue;}cutSrc=src;if (this.options.extensions&&this.options.extensions.startInline){let startIndex=Infinity;const tempSrc=src.slice(1);let tempStart;this.options.extensions.startInline.forEach((getStartIndex)=>{tempStart=getStartIndex.call({lexer:this},tempSrc);if (typeof tempStart==='number'&&tempStart>=0){startIndex=Math.min(startIndex,tempStart);}});if (startIndex<Infinity&&startIndex>=0){cutSrc=src.substring(0,startIndex+1);}}if (token=this.tokenizer.inlineText(cutSrc)){src=src.substring(token.raw.length);if (token.raw.slice(-1)!=='_'){prevChar=token.raw.slice(-1);}keepPrevChar=true;lastToken=tokens[tokens.length-1];if (lastToken&&lastToken.type==='text'){lastToken.raw+=token.raw;lastToken.text+=token.text;} else{tokens.push(token);}continue;}if (src){const errMsg='Infinite loop on byte:'+src.charCodeAt(0);if (this.options.silent){console.error(errMsg);break;} else{throw new Error(errMsg);}}}return tokens;}}class _Renderer{options;constructor(options){this.options=options||exports.defaults;}code(code,infostring,escaped){const lang=(infostring||'').match(/^\S*/)?.[0];code=code.replace(/\n$/,'')+'\n';if (!lang){return '<pre><code>'+(escaped?code:escape$1(code,true))+'</code></pre>\n';}return '<pre><code class="language-'+escape$1(lang)+'">'+(escaped?code:escape$1(code,true))+'</code></pre>\n';}blockquote(quote){return `<blockquote>\n${quote}</blockquote>\n`;}html(html,block){return html;}heading(text,level,raw){return `<h${level}>${text}</h${level}>\n`;}hr(){return '<hr>\n';}list(body,ordered,start){const type=ordered?'ol':'ul';const startatt=(ordered&&start!==1)?(' start="'+start+'"'):'';return '<'+type+startatt+'>\n'+body+'</'+type+'>\n';}listitem(text,task,checked){return `<li>${text}</li>\n`;}checkbox(checked){return '<input '+(checked?'checked="" ':'')+'disabled="" type="checkbox">';}paragraph(text){return `<p>${text}</p>\n`;}table(header,body){if (body)body=`<tbody>${body}</tbody>`;return '<table>\n'+'<thead>\n'+header+'</thead>\n'+body+'</table>\n';}tablerow(content){return `<tr>\n${content}</tr>\n`;}tablecell(content,flags){const type=flags.header?'th':'td';const tag=flags.align?`<${type}align="${flags.align}">`:`<${type}>`;return tag+content+`</${type}>\n`;}strong(text){return `<strong>${text}</strong>`;}em(text){return `<em>${text}</em>`;}codespan(text){return `<code>${text}</code>`;}br(){return '<br>';}del(text){return `<del>${text}</del>`;}link(href,title,text){const cleanHref=cleanUrl(href);if (cleanHref===null){return text;}href=cleanHref;let out='<a href="'+href+'"';if (title){out+=' title="'+title+'"';}out+='>'+text+'</a>';return out;}image(href,title,text){const cleanHref=cleanUrl(href);if (cleanHref===null){return text;}href=cleanHref;let out=`<img src="${href}" alt="${text}"`;if (title){out+=` title="${title}"`;}out+='>';return out;}text(text){return text;}}class _TextRenderer{strong(text){return text;}em(text){return text;}codespan(text){return text;}del(text){return text;}html(text){return text;}text(text){return text;}link(href,title,text){return ''+text;}image(href,title,text){return ''+text;}br(){return '';}}class _Parser{options;renderer;textRenderer;constructor(options){this.options=options||exports.defaults;this.options.renderer=this.options.renderer||new _Renderer();this.renderer=this.options.renderer;this.renderer.options=this.options;this.textRenderer=new _TextRenderer();}static parse(tokens,options){const parser=new _Parser(options);return parser.parse(tokens);}static parseInline(tokens,options){const parser=new _Parser(options);return parser.parseInline(tokens);}parse(tokens,top=true){let out='';for (let i=0;i<tokens.length;i++){const token=tokens[i];if (this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[token.type]){const genericToken=token;const ret=this.options.extensions.renderers[genericToken.type].call({parser:this},genericToken);if (ret!==false||!['space','hr','heading','code','table','blockquote','list','html','paragraph','text'].includes(genericToken.type)){out+=ret||'';continue;}}switch (token.type){case 'space':{continue;}case 'hr':{out+=this.renderer.hr();continue;}case 'heading':{const headingToken=token;out+=this.renderer.heading(this.parseInline(headingToken.tokens),headingToken.depth,unescape(this.parseInline(headingToken.tokens,this.textRenderer)));continue;}case 'code':{const codeToken=token;out+=this.renderer.code(codeToken.text,codeToken.lang,!!codeToken.escaped);continue;}case 'table':{const tableToken=token;let header='';let cell='';for (let j=0;j<tableToken.header.length;j++){cell+=this.renderer.tablecell(this.parseInline(tableToken.header[j].tokens),{header:true,align:tableToken.align[j]});}header+=this.renderer.tablerow(cell);let body='';for (let j=0;j<tableToken.rows.length;j++){const row=tableToken.rows[j];cell='';for (let k=0;k<row.length;k++){cell+=this.renderer.tablecell(this.parseInline(row[k].tokens),{header:false,align:tableToken.align[k]});}body+=this.renderer.tablerow(cell);}out+=this.renderer.table(header,body);continue;}case 'blockquote':{const blockquoteToken=token;const body=this.parse(blockquoteToken.tokens);out+=this.renderer.blockquote(body);continue;}case 'list':{const listToken=token;const ordered=listToken.ordered;const start=listToken.start;const loose=listToken.loose;let body='';for (let j=0;j<listToken.items.length;j++){const item=listToken.items[j];const checked=item.checked;const task=item.task;let itemBody='';if (item.task){const checkbox=this.renderer.checkbox(!!checked);if (loose){if (item.tokens.length>0&&item.tokens[0].type==='paragraph'){item.tokens[0].text=checkbox+' '+item.tokens[0].text;if (item.tokens[0].tokens&&item.tokens[0].tokens.length>0&&item.tokens[0].tokens[0].type==='text'){item.tokens[0].tokens[0].text=checkbox+' '+item.tokens[0].tokens[0].text;}} else{item.tokens.unshift({type:'text',text:checkbox+' '});}} else{itemBody+=checkbox+' ';}}itemBody+=this.parse(item.tokens,loose);body+=this.renderer.listitem(itemBody,task,!!checked);}out+=this.renderer.list(body,ordered,start);continue;}case 'html':{const htmlToken=token;out+=this.renderer.html(htmlToken.text,htmlToken.block);continue;}case 'paragraph':{const paragraphToken=token;out+=this.renderer.paragraph(this.parseInline(paragraphToken.tokens));continue;}case 'text':{let textToken=token;let body=textToken.tokens?this.parseInline(textToken.tokens):textToken.text;while (i+1<tokens.length&&tokens[i+1].type==='text'){textToken=tokens[++i];body+='\n'+(textToken.tokens?this.parseInline(textToken.tokens):textToken.text);}out+=top?this.renderer.paragraph(body):body;continue;}default:{const errMsg='Token with "'+token.type+'" type was not found.';if (this.options.silent){console.error(errMsg);return '';} else{throw new Error(errMsg);}}}}return out;}parseInline(tokens,renderer){renderer=renderer||this.renderer;let out='';for (let i=0;i<tokens.length;i++){const token=tokens[i];if (this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[token.type]){const ret=this.options.extensions.renderers[token.type].call({parser:this},token);if (ret!==false||!['escape','html','link','image','strong','em','codespan','br','del','text'].includes(token.type)){out+=ret||'';continue;}}switch (token.type){case 'escape':{const escapeToken=token;out+=renderer.text(escapeToken.text);break;}case 'html':{const tagToken=token;out+=renderer.html(tagToken.text);break;}case 'link':{const linkToken=token;out+=renderer.link(linkToken.href,linkToken.title,this.parseInline(linkToken.tokens,renderer));break;}case 'image':{const imageToken=token;out+=renderer.image(imageToken.href,imageToken.title,imageToken.text);break;}case 'strong':{const strongToken=token;out+=renderer.strong(this.parseInline(strongToken.tokens,renderer));break;}case 'em':{const emToken=token;out+=renderer.em(this.parseInline(emToken.tokens,renderer));break;}case 'codespan':{const codespanToken=token;out+=renderer.codespan(codespanToken.text);break;}case 'br':{out+=renderer.br();break;}case 'del':{const delToken=token;out+=renderer.del(this.parseInline(delToken.tokens,renderer));break;}case 'text':{const textToken=token;out+=renderer.text(textToken.text);break;}default:{const errMsg='Token with "'+token.type+'" type was not found.';if (this.options.silent){console.error(errMsg);return '';} else{throw new Error(errMsg);}}}}return out;}}class _Hooks{options;constructor(options){this.options=options||exports.defaults;}static passThroughHooks=new Set([ 'preprocess','postprocess','processAllTokens' ]);preprocess(markdown){return markdown;}postprocess(html){return html;}processAllTokens(tokens){return tokens;}}class Marked{defaults=_getDefaults();options=this.setOptions;parse=this.#parseMarkdown(_Lexer.lex,_Parser.parse);parseInline=this.#parseMarkdown(_Lexer.lexInline,_Parser.parseInline);Parser=_Parser;Renderer=_Renderer;TextRenderer=_TextRenderer;Lexer=_Lexer;Tokenizer=_Tokenizer;Hooks=_Hooks;constructor(...args){this.use(...args);}walkTokens(tokens,callback){let values=[];for (const token of tokens){values=values.concat(callback.call(this,token));switch (token.type){case 'table':{const tableToken=token;for (const cell of tableToken.header){values=values.concat(this.walkTokens(cell.tokens,callback));}for (const row of tableToken.rows){for (const cell of row){values=values.concat(this.walkTokens(cell.tokens,callback));}}break;}case 'list':{const listToken=token;values=values.concat(this.walkTokens(listToken.items,callback));break;}default:{const genericToken=token;if (this.defaults.extensions?.childTokens?.[genericToken.type]){this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens)=>{const tokens=genericToken[childTokens].flat(Infinity);values=values.concat(this.walkTokens(tokens,callback));});} else if (genericToken.tokens){values=values.concat(this.walkTokens(genericToken.tokens,callback));}}}}return values;}use(...args){const extensions=this.defaults.extensions||{renderers:{},childTokens:{}};args.forEach((pack)=>{const opts={...pack};opts.async=this.defaults.async||opts.async||false;if (pack.extensions){pack.extensions.forEach((ext)=>{if (!ext.name){throw new Error('extension name required');}if ('renderer' in ext){const prevRenderer=extensions.renderers[ext.name];if (prevRenderer){extensions.renderers[ext.name]=function(...args){let ret=ext.renderer.apply(this,args);if (ret===false){ret=prevRenderer.apply(this,args);}return ret;};} else{extensions.renderers[ext.name]=ext.renderer;}}if ('tokenizer' in ext){if (!ext.level||(ext.level!=='block'&&ext.level!=='inline')){throw new Error("extension level must be 'block' or 'inline'");}const extLevel=extensions[ext.level];if (extLevel){extLevel.unshift(ext.tokenizer);} else{extensions[ext.level]=[ext.tokenizer];}if (ext.start){if (ext.level==='block'){if (extensions.startBlock){extensions.startBlock.push(ext.start);} else{extensions.startBlock=[ext.start];}} else if (ext.level==='inline'){if (extensions.startInline){extensions.startInline.push(ext.start);} else{extensions.startInline=[ext.start];}}}}if ('childTokens' in ext&&ext.childTokens){extensions.childTokens[ext.name]=ext.childTokens;}});opts.extensions=extensions;}if (pack.renderer){const renderer=this.defaults.renderer||new _Renderer(this.defaults);for (const prop in pack.renderer){if (!(prop in renderer)){throw new Error(`renderer '${prop}' does not exist`);}if (prop==='options'){continue;}const rendererProp=prop;const rendererFunc=pack.renderer[rendererProp];const prevRenderer=renderer[rendererProp];renderer[rendererProp]=(...args)=>{let ret=rendererFunc.apply(renderer,args);if (ret===false){ret=prevRenderer.apply(renderer,args);}return ret||'';};}opts.renderer=renderer;}if (pack.tokenizer){const tokenizer=this.defaults.tokenizer||new _Tokenizer(this.defaults);for (const prop in pack.tokenizer){if (!(prop in tokenizer)){throw new Error(`tokenizer '${prop}' does not exist`);}if (['options','rules','lexer'].includes(prop)){continue;}const tokenizerProp=prop;const tokenizerFunc=pack.tokenizer[tokenizerProp];const prevTokenizer=tokenizer[tokenizerProp];tokenizer[tokenizerProp]=(...args)=>{let ret=tokenizerFunc.apply(tokenizer,args);if (ret===false){ret=prevTokenizer.apply(tokenizer,args);}return ret;};}opts.tokenizer=tokenizer;}if (pack.hooks){const hooks=this.defaults.hooks||new _Hooks();for (const prop in pack.hooks){if (!(prop in hooks)){throw new Error(`hook '${prop}' does not exist`);}if (prop==='options'){continue;}const hooksProp=prop;const hooksFunc=pack.hooks[hooksProp];const prevHook=hooks[hooksProp];if (_Hooks.passThroughHooks.has(prop)){hooks[hooksProp]=(arg)=>{if (this.defaults.async){return Promise.resolve(hooksFunc.call(hooks,arg)).then(ret=>{return prevHook.call(hooks,ret);});}const ret=hooksFunc.call(hooks,arg);return prevHook.call(hooks,ret);};} else{hooks[hooksProp]=(...args)=>{let ret=hooksFunc.apply(hooks,args);if (ret===false){ret=prevHook.apply(hooks,args);}return ret;};}}opts.hooks=hooks;}if (pack.walkTokens){const walkTokens=this.defaults.walkTokens;const packWalktokens=pack.walkTokens;opts.walkTokens=function(token){let values=[];values.push(packWalktokens.call(this,token));if (walkTokens){values=values.concat(walkTokens.call(this,token));}return values;};}this.defaults={...this.defaults,...opts};});return this;}setOptions(opt){this.defaults={...this.defaults,...opt};return this;}lexer(src,options){return _Lexer.lex(src,options??this.defaults);}parser(tokens,options){return _Parser.parse(tokens,options??this.defaults);}#parseMarkdown(lexer,parser){return(src,options)=>{const origOpt={...options};const opt={...this.defaults,...origOpt};if (this.defaults.async===true&&origOpt.async===false){if (!opt.silent){console.warn('marked():The async option was set to true by an extension. The async:false option sent to parse will be ignored.');}opt.async=true;}const throwError=this.#onError(!!opt.silent,!!opt.async);if (typeof src==='undefined'||src===null){return throwError(new Error('marked():input parameter is undefined or null'));}if (typeof src!=='string'){return throwError(new Error('marked():input parameter is of type '+Object.prototype.toString.call(src)+',string expected'));}if (opt.hooks){opt.hooks.options=opt;}if (opt.async){return Promise.resolve(opt.hooks?opt.hooks.preprocess(src):src).then(src=>lexer(src,opt)).then(tokens=>opt.hooks?opt.hooks.processAllTokens(tokens):tokens).then(tokens=>opt.walkTokens?Promise.all(this.walkTokens(tokens,opt.walkTokens)).then(()=>tokens):tokens).then(tokens=>parser(tokens,opt)).then(html=>opt.hooks?opt.hooks.postprocess(html):html).catch (throwError);}try{if (opt.hooks){src=opt.hooks.preprocess(src);}let tokens=lexer(src,opt);if (opt.hooks){tokens=opt.hooks.processAllTokens(tokens);}if (opt.walkTokens){this.walkTokens(tokens,opt.walkTokens);}let html=parser(tokens,opt);if (opt.hooks){html=opt.hooks.postprocess(html);}return html;} catch (e){return throwError(e);}};}#onError(silent,async){return(e)=>{e.message+='\nPlease report this to https:if (silent){const msg='<p>An error occurred:</p><pre>'+escape$1(e.message+'',true)+'</pre>';if (async){return Promise.resolve(msg);}return msg;}if (async){return Promise.reject(e);}throw e;};}}const markedInstance=new Marked();function marked(src,opt){return markedInstance.parse(src,opt);}marked.options=marked.setOptions=function(options){markedInstance.setOptions(options);marked.defaults=markedInstance.defaults;changeDefaults(marked.defaults);return marked;};marked.getDefaults=_getDefaults;marked.defaults=exports.defaults;marked.use=function(...args){markedInstance.use(...args);marked.defaults=markedInstance.defaults;changeDefaults(marked.defaults);return marked;};marked.walkTokens=function(tokens,callback){return markedInstance.walkTokens(tokens,callback);};marked.parseInline=markedInstance.parseInline;marked.Parser=_Parser;marked.parser=_Parser.parse;marked.Renderer=_Renderer;marked.TextRenderer=_TextRenderer;marked.Lexer=_Lexer;marked.lexer=_Lexer.lex;marked.Tokenizer=_Tokenizer;marked.Hooks=_Hooks;marked.parse=marked;const options=marked.options;const setOptions=marked.setOptions;const use=marked.use;const walkTokens=marked.walkTokens;const parseInline=marked.parseInline;const parse=marked;const parser=_Parser.parse;const lexer=_Lexer.lex;exports.Hooks=_Hooks;exports.Lexer=_Lexer;exports.Marked=Marked;exports.Parser=_Parser;exports.Renderer=_Renderer;exports.TextRenderer=_TextRenderer;exports.Tokenizer=_Tokenizer;exports.getDefaults=_getDefaults;exports.lexer=lexer;exports.marked=marked;exports.options=options;exports.parse=parse;exports.parseInline=parseInline;exports.parser=parser;exports.setOptions=setOptions;exports.use=use;exports.walkTokens=walkTokens;}));function formatDate(timestamp){const date=new Date(timestamp*1000);return date.toLocaleDateString('en-US',{year:'numeric',month:'short',day:'numeric'});}function calculateReadingTime(wordCountOrContent){if (!wordCountOrContent)return 'Unknown';const wordsPerMinute=200;let words;if (typeof wordCountOrContent==='number'){words=wordCountOrContent;if (words===0)return 'Unknown';} else{words=wordCountOrContent.trim().split(/\s+/).filter(w=>w.length>0).length;}const minutes=Math.ceil(words/wordsPerMinute);return `${minutes}min read`;}function truncate(text,maxLength=150){if (!text||text.length<=maxLength)return text;return text.substring(0,maxLength).trim()+'...';}function truncateBytes(text,maxBytes){if (!text||!maxBytes||maxBytes<=0)return text||'';const encoder=new TextEncoder();const bytes=encoder.encode(text);if (bytes.length<=maxBytes)return text;let lo=0,hi=text.length;while (lo<hi){const mid=Math.floor((lo+hi+1)/2);const slice=text.slice(0,mid);const len=encoder.encode(slice).length;if (len<=maxBytes)lo=mid;else hi=mid-1;}return text.slice(0,lo).trimEnd()+'...';}function escapeHtml(text){const div=document.createElement('div');div.textContent=text;return div.innerHTML;}function debounce(func,wait){let timeout;return function executedFunction(...args){const later=()=>{clearTimeout(timeout);func(...args);};clearTimeout(timeout);timeout=setTimeout(later,wait);};}class ContentGrowthAPI{constructor(config){this.apiKey=config.apiKey;this.baseUrl=config.baseUrl||'https:this.cache=new Map();this.cacheTTL=5*60*1000;}async fetchArticles(options={}){const{page=1,limit=12,tags=[],category}=options;const params=new URLSearchParams({page:page.toString(),limit:limit.toString()});if (tags.length>0){params.set('tag',tags.join(','));}if (category){params.set('category',category);}const url=`${this.baseUrl}/widget/articles?${params}`;const cacheKey=url;const cached=this.getFromCache(cacheKey);if (cached){return cached;}try{const response=await fetch(url,{headers:{'X-API-Key':this.apiKey}});if (!response.ok){const errorText=await response.text();console.error('[ContentGrowthAPI] Error response body:',errorText);throw new Error(`API Error:${response.status}${response.statusText}`);}const data=await response.json();this.setCache(cacheKey,data);return data;} catch (error){console.error('[ContentGrowthAPI] Failed to fetch articles:',error);throw error;}}async fetchArticle(uuid){const url=`${this.baseUrl}/widget/articles/${uuid}`;const cacheKey=url;const cached=this.getFromCache(cacheKey);if (cached){return cached;}try{const response=await fetch(url,{headers:{'X-API-Key':this.apiKey}});if (!response.ok){const errorText=await response.text();console.error('[ContentGrowthAPI] Error response body:',errorText);throw new Error(`API Error:${response.status}${response.statusText}`);}const data=await response.json();this.setCache(cacheKey,data);return data;} catch (error){console.error('[ContentGrowthAPI] Failed to fetch article:',error);throw error;}}async fetchArticleBySlug(slug){const url=`${this.baseUrl}/widget/articles/slug/${slug}`;const cacheKey=url;const cached=this.getFromCache(cacheKey);if (cached){return cached;}try{const response=await fetch(url,{headers:{'X-API-Key':this.apiKey}});if (!response.ok){const errorText=await response.text();console.error('[ContentGrowthAPI] Error response body:',errorText);throw new Error(`API Error:${response.status}${response.statusText}`);}const data=await response.json();this.setCache(cacheKey,data);return data;} catch (error){console.error('[ContentGrowthAPI] Failed to fetch article by slug:',error);throw error;}}getFromCache(key){const cached=this.cache.get(key);if (!cached)return null;const now=Date.now();if (now-cached.timestamp>this.cacheTTL){this.cache.delete(key);return null;}return cached.data;}setCache(key,data){this.cache.set(key,{data,timestamp:Date.now()});}clearCache(){this.cache.clear();}}class ContentCard{constructor(article,options={}){this.article=article;this.displayMode=options.displayMode||'compact';this.viewerMode=options.viewerMode||'inline';this.externalUrlPattern=options.externalUrlPattern||'/article/{id}';this.externalTarget=options.externalTarget||'article-{id}';this.onExpand=options.onExpand||null;this.onClick=options.onClick||null;this.aiSummaryMaxBytes=options.aiSummaryMaxBytes;}render(){const layoutMode=this.displayMode==='expanded'?'expanded':'compact';if (this.viewerMode==='external'){const link=document.createElement('a');link.className=`cg-card cg-card--${this.displayMode}`;link.dataset.contentId=this.article.uuid;let url=this.externalUrlPattern .replace('{id}',this.article.uuid).replace('{slug}',this.article.slug||this.article.uuid);let target=this.externalTarget .replace('{id}',this.article.uuid).replace('{slug}',this.article.slug||this.article.uuid);link.href=url;link.target=target;link.rel='noopener';if (layoutMode==='compact'){link.innerHTML=this.renderCompact();} else{link.innerHTML=this.renderExpanded();}const expandBtn=link.querySelector('.cg-expand-btn');if (expandBtn&&this.onExpand){expandBtn.addEventListener('click',(e)=>{e.preventDefault();e.stopPropagation();this.onExpand(this.article,link);});}return link;}const card=document.createElement('article');card.className=`cg-card cg-card--${this.displayMode}`;card.dataset.contentId=this.article.uuid;if (layoutMode==='compact'){card.innerHTML=this.renderCompact();} else{card.innerHTML=this.renderExpanded();}card.addEventListener('click',(e)=>{if (e.target.closest('.cg-expand-btn'))return;if (this.onClick){this.onClick(this.article);}});const expandBtn=card.querySelector('.cg-expand-btn');if (expandBtn&&this.onExpand){expandBtn.addEventListener('click',(e)=>{e.stopPropagation();this.onExpand(this.article,card);});}return card;}renderCompact(){const readingTime=calculateReadingTime(this.article.wordCount);return `<div class="cg-card-header"><h3 class="cg-card-title">${escapeHtml(this.article.title)}</h3><button class="cg-expand-btn" aria-label="Show more" title="Show summary"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 6L8 10L12 6" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button></div><div class="cg-card-meta"><span class="cg-meta-item cg-author"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 7C8.65685 7 10 5.65685 10 4C10 2.34315 8.65685 1 7 1C5.34315 1 4 2.34315 4 4C4 5.65685 5.34315 7 7 7Z" stroke="currentColor" stroke-width="1.5"/><path d="M13 13C13 10.7909 10.3137 9 7 9C3.68629 9 1 10.7909 1 13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${escapeHtml(this.article.authorName)}</span><span class="cg-meta-item cg-date"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="1" y="2" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.5"/><path d="M4 1V3M10 1V3M1 5H13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${formatDate(this.article.publishedAt)}</span><span class="cg-meta-item cg-reading-time"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="7" cy="7" r="6" stroke="currentColor" stroke-width="1.5"/><path d="M7 3.5V7L9.5 9.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${readingTime}</span></div>`;}renderExpanded(){const readingTime=calculateReadingTime(this.article.wordCount);const summaryFull=this.article.summary||'';const summary=this.aiSummaryMaxBytes?truncateBytes(summaryFull,this.aiSummaryMaxBytes):summaryFull;const tags=this.article.tags||[];return `<div class="cg-card-header"><h3 class="cg-card-title">${escapeHtml(this.article.title)}</h3><button class="cg-expand-btn cg-expand-btn--collapse" aria-label="Show less" title="Hide summary"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M12 10L8 6L4 10" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button></div>${summary?`<div class="cg-card-summary"><p>${escapeHtml(summary)}</p></div>`:''}${tags.length>0?`<div class="cg-card-tags">${tags.map(tag=>`<span class="cg-tag">${escapeHtml(tag)}</span>`).join('')}</div>`:''}<div class="cg-card-meta"><span class="cg-meta-item cg-author"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 7C8.65685 7 10 5.65685 10 4C10 2.34315 8.65685 1 7 1C5.34315 1 4 2.34315 4 4C4 5.65685 5.34315 7 7 7Z" stroke="currentColor" stroke-width="1.5"/><path d="M13 13C13 10.7909 10.3137 9 7 9C3.68629 9 1 10.7909 1 13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${escapeHtml(this.article.authorName)}</span><span class="cg-meta-item cg-date"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="1" y="2" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.5"/><path d="M4 1V3M10 1V3M1 5H13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${formatDate(this.article.publishedAt)}</span><span class="cg-meta-item cg-reading-time"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="7" cy="7" r="6" stroke="currentColor" stroke-width="1.5"/><path d="M7 3.5V7L9.5 9.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${readingTime}</span></div>`;}}class ContentList{constructor(container,api,options={}){this.container=container;this.api=api;this.options={layoutMode:options.layoutMode||'cards',displayMode:options.displayMode||'comfortable',pageSize:parseInt(options.pageSize)||12,tags:options.tags||[],category:options.category,aiSummaryMaxBytes:options.aiSummaryMaxBytes,viewerMode:options.viewerMode||'inline',externalUrlPattern:options.externalUrlPattern||'/article/{id}',externalTarget:options.externalTarget||'article-{id}',onArticleClick:options.onArticleClick||null};this.currentPage=1;this.totalPages=1;this.articles=[];this.loading=false;this.expandedCards=new Set();}async init(){this.render();await this.loadArticles();}render(){const layoutClass=this.options.layoutMode==='rows'?'cg-content-rows':'cg-content-grid';this.container.innerHTML=`<div class="cg-content-list"><div class="cg-list-header"><button class="cg-display-toggle" title="Toggle display mode"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><rect x="2" y="2" width="16" height="4" rx="1" stroke="currentColor" stroke-width="1.5"/><rect x="2" y="8" width="16" height="4" rx="1" stroke="currentColor" stroke-width="1.5"/><rect x="2" y="14" width="16" height="4" rx="1" stroke="currentColor" stroke-width="1.5"/></svg><span>${this.options.displayMode==='compact'?'Show summaries':'Hide summaries'}</span></button></div><div class="${layoutClass}"></div><div class="cg-pagination"></div></div>`;const toggle=this.container.querySelector('.cg-display-toggle');toggle.addEventListener('click',()=>this.toggleDisplayMode());}async loadArticles(page=1){if (this.loading){return;}this.loading=true;this.showLoading();try{const data=await this.api.fetchArticles({page,limit:this.options.pageSize,tags:this.options.tags,category:this.options.category});this.articles=data.articles||[];this.currentPage=data.pagination?.page||1;this.totalPages=data.pagination?.totalPages||1;this.renderArticles();this.renderPagination();} catch (error){console.error('[ContentList] Error loading articles:',error);this.showError('Failed to load articles. Please try again.');} finally{this.loading=false;}}renderArticles(){const grid=this.container.querySelector('.cg-content-grid,.cg-content-rows');if (this.articles.length===0){grid.innerHTML=`<div class="cg-empty-state"><svg width="64" height="64" viewBox="0 0 64 64" fill="none"><rect x="8" y="12" width="48" height="40" rx="4" stroke="currentColor" stroke-width="2"/><path d="M16 24H48M16 32H48M16 40H32" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg><p>No articles found</p></div>`;return;}grid.innerHTML='';this.articles.forEach(article=>{const isExpanded=this.expandedCards.has(article.uuid);const card=new ContentCard(article,{displayMode:isExpanded?'expanded':this.options.displayMode,viewerMode:this.options.viewerMode,externalUrlPattern:this.options.externalUrlPattern,externalTarget:this.options.externalTarget,aiSummaryMaxBytes:this.options.aiSummaryMaxBytes,onExpand:(article,cardElement)=>this.handleExpand(article,cardElement),onClick:(article)=>this.handleArticleClick(article)});grid.appendChild(card.render());});}handleExpand(article,cardElement){const isExpanded=this.expandedCards.has(article.uuid);if (isExpanded){this.expandedCards.delete(article.uuid);} else{this.expandedCards.add(article.uuid);}const newCard=new ContentCard(article,{displayMode:isExpanded?this.options.displayMode:'expanded',viewerMode:this.options.viewerMode,externalUrlPattern:this.options.externalUrlPattern,externalTarget:this.options.externalTarget,onExpand:(article,cardElement)=>this.handleExpand(article,cardElement),onClick:(article)=>this.handleArticleClick(article)});cardElement.replaceWith(newCard.render());}handleArticleClick(article){if (this.options.onArticleClick){this.options.onArticleClick(article);}}toggleDisplayMode(){this.options.displayMode=this.options.displayMode==='compact'?'expanded':'compact';this.expandedCards.clear();this.renderArticles();const toggle=this.container.querySelector('.cg-display-toggle span');toggle.textContent=this.options.displayMode==='compact'?'Show summaries':'Hide summaries';}renderPagination(){const pagination=this.container.querySelector('.cg-pagination');if (this.totalPages<=1){pagination.innerHTML='';return;}const prevDisabled=this.currentPage===1;const nextDisabled=this.currentPage===this.totalPages;pagination.innerHTML=`<button class="cg-btn-prev" ${prevDisabled?'disabled':''}><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M10 12L6 8L10 4" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>Previous</button><span class="cg-page-info">Page ${this.currentPage}of ${this.totalPages}</span><button class="cg-btn-next" ${nextDisabled?'disabled':''}>Next<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M6 4L10 8L6 12" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button>`;const prevBtn=pagination.querySelector('.cg-btn-prev');const nextBtn=pagination.querySelector('.cg-btn-next');prevBtn.addEventListener('click',()=>{if (this.currentPage>1){this.loadArticles(this.currentPage-1);this.scrollToTop();}});nextBtn.addEventListener('click',()=>{if (this.currentPage<this.totalPages){this.loadArticles(this.currentPage+1);this.scrollToTop();}});}showLoading(){const grid=this.container.querySelector('.cg-content-grid,.cg-content-rows');if (grid){grid.innerHTML=`<div class="cg-loading"><div class="cg-spinner"></div><p>Loading articles...</p></div>`;}}showError(message){const grid=this.container.querySelector('.cg-content-grid,.cg-content-rows');if (grid){grid.innerHTML=`<div class="cg-error"><svg width="48" height="48" viewBox="0 0 48 48" fill="none"><circle cx="24" cy="24" r="20" stroke="currentColor" stroke-width="2"/><path d="M24 16V26M24 32V32.5" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg><p>${message}</p><button class="cg-retry-btn">Try Again</button></div>`;const retryBtn=grid.querySelector('.cg-retry-btn');retryBtn.addEventListener('click',()=>this.loadArticles(this.currentPage));}}scrollToTop(){this.container.scrollIntoView({behavior:'smooth',block:'start'});}}class ContentViewer{constructor(container,api,options={}){this.container=container;this.api=api;this.options={displayMode:options.displayMode||'inline',showBackButton:options.showBackButton!==false,showSummary:options.showSummary!==false,onBack:options.onBack||null};this.article=null;this.loading=false;this.summaryExpanded=true;}async loadArticle(uuid){if (this.loading)return;this.loading=true;this.showLoading();try{this.article=await this.api.fetchArticle(uuid);this.render();} catch (error){this.showError('Failed to load article. Please try again.');console.error(error);} finally{this.loading=false;}}async loadArticleBySlug(slug){if (this.loading)return;this.loading=true;this.showLoading();try{this.article=await this.api.fetchArticleBySlug(slug);this.render();} catch (error){this.showError('Failed to load article. Please try again.');console.error(error);} finally{this.loading=false;}}render(){if (!this.article)return;const readingTime=calculateReadingTime(this.article.wordCount||this.article.content);const content=this.renderMarkdown(this.article.content||'');this.container.innerHTML=`<div class="cg-content-viewer">${this.options.showBackButton?`<div class="cg-viewer-header"><button class="cg-back-btn"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M12 16L6 10L12 4" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>Back to list</button></div>`:''}<article class="cg-viewer-content"><header class="cg-content-header"><h1 class="cg-content-title">${escapeHtml(this.article.title)}</h1>${this.options.showSummary&&this.article.summary&&this.article.category!=='announce'?`<div class="cg-ai-summary ${this.summaryExpanded?'expanded':'collapsed'}"><div class="cg-ai-summary-header"><div class="cg-ai-summary-label"><svg class="cg-ai-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"/></svg><span>AI Generated Summary</span></div><button class="cg-summary-toggle" aria-label="Toggle summary"><svg class="cg-chevron" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6l4 4 4-4"/></svg></button></div><div class="cg-ai-summary-content"><p>${escapeHtml(this.article.summary)}</p></div></div>`:''}<div class="cg-content-meta"><span class="cg-meta-item"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 8C9.65685 8 11 6.65685 11 5C11 3.34315 9.65685 2 8 2C6.34315 2 5 3.34315 5 5C5 6.65685 6.34315 8 8 8Z" stroke="currentColor" stroke-width="1.5"/><path d="M14 14C14 11.7909 11.3137 10 8 10C4.68629 10 2 11.7909 2 14" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${escapeHtml(this.article.authorName)}</span><span class="cg-meta-item"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="2" y="3" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.5"/><path d="M5 2V4M11 2V4M2 6H14" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${formatDate(this.article.publishedAt)}</span><span class="cg-meta-item"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><circle cx="8" cy="8" r="6" stroke="currentColor" stroke-width="1.5"/><path d="M8 4V8L10.5 10.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${readingTime}</span></div></header><div class="cg-content-body">${content}</div></article></div>`;if (this.options.showBackButton){const backBtn=this.container.querySelector('.cg-back-btn');if (backBtn){backBtn.addEventListener('click',()=>this.handleBack());}}const summaryToggle=this.container.querySelector('.cg-summary-toggle');if (summaryToggle){summaryToggle.addEventListener('click',()=>this.toggleSummary());}}toggleSummary(){this.summaryExpanded=!this.summaryExpanded;const summaryEl=this.container.querySelector('.cg-ai-summary');if (summaryEl){if (this.summaryExpanded){summaryEl.classList.add('expanded');summaryEl.classList.remove('collapsed');} else{summaryEl.classList.add('collapsed');summaryEl.classList.remove('expanded');}}}renderMarkdown(markdown){marked.setOptions({breaks:true,gfm:true,headerIds:true,mangle:false});try{return marked.parse(markdown);} catch (error){console.error('Markdown parsing error:',error);return `<p>${escapeHtml(markdown)}</p>`;}}handleBack(){if (this.options.onBack){this.options.onBack();}}showLoading(){this.container.innerHTML=`<div class="cg-content-viewer"><div class="cg-viewer-loading"><div class="cg-spinner"></div><p>Loading article...</p></div></div>`;}showError(message){this.container.innerHTML=`<div class="cg-content-viewer"><div class="cg-viewer-error"><svg width="48" height="48" viewBox="0 0 48 48" fill="none"><circle cx="24" cy="24" r="20" stroke="currentColor" stroke-width="2"/><path d="M24 16V26M24 32V32.5" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg><p>${message}</p>${this.options.showBackButton?'<button class="cg-back-btn">Back to articles</button>':''}</div></div>`;if (this.options.showBackButton){const backBtn=this.container.querySelector('.cg-back-btn');if (backBtn){backBtn.addEventListener('click',()=>this.handleBack());}}}clear(){this.container.innerHTML='';this.article=null;}}class ContentGrowthWidget{static version='1.1.2';constructor(container,config){this.container=typeof container==='string'?document.querySelector(container):container;if (!this.container){throw new Error('Container not found');}this.config={apiKey:config.apiKey||config['api-key'],baseUrl:config.baseUrl||'https:tags:this.parseTags(config.tags),category:config.category,theme:config.theme||'light',layoutMode:config.layoutMode||config['layout-mode']||'cards',displayMode:config.displayMode||config['display-mode']||'comfortable',aiSummaryMaxBytes:config.aiSummaryMaxBytes||config['ai-summary-max-bytes'],viewerMode:config.viewerMode||config['viewer-mode']||'inline',externalUrlPattern:config.externalUrlPattern||config['external-url-pattern']||'/article/{id}',externalTarget:config.externalTarget||config['external-target']||'article-{id}',pageSize:config.pageSize||config['page-size']||12,mode:config.mode||'list',articleId:config.articleId||config['article-id'],slug:config.slug};if (!this.config.apiKey){throw new Error('API key is required');}this.api=new ContentGrowthAPI({apiKey:this.config.apiKey,baseUrl:this.config.baseUrl});this.currentView='list';this.contentList=null;this.contentViewer=null;this.init();}init(){this.container.classList.add('cg-widget');this.container.setAttribute('data-theme',this.config.theme);if (this.config.mode==='article-only'){if (this.config.slug){this.showPostInlineBySlug(this.config.slug);} else if (this.config.articleId){this.showPostInline(this.config.articleId);}} else{this.showList();}}showList(){this.currentView='list';this.container.innerHTML='';const listContainer=document.createElement('div');listContainer.className='cg-list-view';this.container.appendChild(listContainer);this.contentList=new ContentList(listContainer,this.api,{layoutMode:this.config.layoutMode,displayMode:this.config.displayMode,pageSize:this.config.pageSize,tags:this.config.tags,category:this.config.category,aiSummaryMaxBytes:this.config.aiSummaryMaxBytes,viewerMode:this.config.viewerMode,externalUrlPattern:this.config.externalUrlPattern,externalTarget:this.config.externalTarget,onArticleClick:(article)=>this.showPost(article.uuid)});this.contentList.init();}showPost(uuid){this.currentView='viewer';if (this.config.viewerMode==='modal'){this.showPostModal(uuid);} else{this.showPostInline(uuid);}}showPostInline(uuid){this.container.innerHTML='';const viewerContainer=document.createElement('div');viewerContainer.className='cg-viewer-view';this.container.appendChild(viewerContainer);const showBackButton=this.config.mode!=='article-only';this.contentViewer=new ContentViewer(viewerContainer,this.api,{displayMode:'inline',showBackButton:showBackButton,onBack:showBackButton?()=>this.showList():null});this.contentViewer.loadArticle(uuid);}showPostInlineBySlug(slug){this.container.innerHTML='';const viewerContainer=document.createElement('div');viewerContainer.className='cg-viewer-view';this.container.appendChild(viewerContainer);const showBackButton=this.config.mode!=='article-only';this.contentViewer=new ContentViewer(viewerContainer,this.api,{displayMode:'inline',showBackButton:showBackButton,onBack:showBackButton?()=>this.showList():null});this.contentViewer.loadArticleBySlug(slug);}showPostModal(uuid){const modal=document.createElement('div');modal.className='cg-modal';if (this.config.theme){modal.setAttribute('data-theme',this.config.theme);}modal.innerHTML=`<div class="cg-modal-overlay"></div><div class="cg-modal-content"><button class="cg-modal-close" aria-label="Close"><svg width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M18 6L6 18M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button><div class="cg-modal-body"></div></div>`;document.body.appendChild(modal);document.body.style.overflow='hidden';const modalBody=modal.querySelector('.cg-modal-body');this.contentViewer=new ContentViewer(modalBody,this.api,{displayMode:'modal',onBack:()=>this.closeModal(modal)});this.contentViewer.loadArticle(uuid);const closeBtn=modal.querySelector('.cg-modal-close');const overlay=modal.querySelector('.cg-modal-overlay');const closeModal=()=>this.closeModal(modal);closeBtn.addEventListener('click',closeModal);overlay.addEventListener('click',closeModal);const handleEsc=(e)=>{if (e.key==='Escape'){closeModal();document.removeEventListener('keydown',handleEsc);}};document.addEventListener('keydown',handleEsc);requestAnimationFrame(()=>{modal.classList.add('cg-modal--active');});}closeModal(modal){modal.classList.remove('cg-modal--active');setTimeout(()=>{modal.remove();document.body.style.overflow='';},300);}parseTags(tags){if (!tags)return [];if (Array.isArray(tags))return tags;return tags.split(',').map(t=>t.trim()).filter(Boolean);}updateConfig(newConfig){Object.assign(this.config,newConfig);this.init();}destroy(){this.container.innerHTML='';this.container.classList.remove('cg-widget');this.container.removeAttribute('data-theme');}}function initWidgets(){const containers=document.querySelectorAll('[data-cg-content]');containers.forEach((container,index)=>{const config={apiKey:container.dataset.apiKey||container.dataset.cgApiKey,baseUrl:window.WIDGET_BASE_URL||container.dataset.baseUrl||container.dataset.cgBaseUrl,tags:container.dataset.tags||container.dataset.cgTags,theme:container.dataset.theme||container.dataset.cgTheme||'light',layoutMode:container.dataset.layoutMode||container.dataset.cgLayoutMode||'cards',displayMode:container.dataset.displayMode||container.dataset.cgDisplayMode||'comfortable',viewerMode:container.dataset.viewerMode||container.dataset.cgViewerMode||'inline',externalUrlPattern:container.dataset.externalUrlPattern||container.dataset.cgExternalUrlPattern,externalTarget:container.dataset.externalTarget||container.dataset.cgExternalTarget,pageSize:container.dataset.pageSize||container.dataset.cgPageSize||12,mode:container.dataset.mode||container.dataset.cgMode||'list',articleId:container.dataset.articleId||container.dataset.cgArticleId};try{new ContentGrowthWidget(container,config);} catch (error){console.error(`[Widget ${index}] Failed to initialize:`,error);container.innerHTML=`<div style="padding:2rem;text-align:center;color:#ef4444;"><p>Failed to load widget:${error.message}</p><p style="font-size:0.875rem;margin-top:0.5rem;">Check console for details</p></div>`;}});}if (document.readyState==='loading'){document.addEventListener('DOMContentLoaded',initWidgets);} else{initWidgets();}window.ContentGrowthWidget=ContentGrowthWidget;{ContentGrowthWidget};window.ContentGrowthWidget=ContentGrowthWidget;console.log('[ContentGrowthWidget] Loaded successfully v1.1.2');})(window);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contentgrowth/content-widget",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "description": "Embed your Content Growth articles anywhere with beautiful, customizable components",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",