@contentgrowth/content-widget 1.1.0 → 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.
@@ -75,7 +75,7 @@ const readingTime = calculateReadingTime(article.wordCount);
75
75
  data-cg-widget="post"
76
76
  >
77
77
  {showBackButton && (
78
- <div class="cg-post-header">
78
+ <div class="cg-content-header-back">
79
79
  <a href={backUrl} class="cg-back-btn">
80
80
  <svg width="20" height="20" viewBox="0 0 20 20" fill="none">
81
81
  <path d="M12 16L6 10L12 4" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
@@ -85,14 +85,14 @@ const readingTime = calculateReadingTime(article.wordCount);
85
85
  </div>
86
86
  )}
87
87
 
88
- <header class="cg-post-meta">
88
+ <header class="cg-content-header">
89
89
  {article.category && (
90
- <div class="cg-post-category">
90
+ <div class="cg-content-category">
91
91
  <span class="cg-category-badge">{article.category}</span>
92
92
  </div>
93
93
  )}
94
94
 
95
- <h1 class="cg-post-title">{article.title}</h1>
95
+ <h1 class="cg-content-title">{article.title}</h1>
96
96
 
97
97
  {showAiSummary && article.summary && (
98
98
  <div class="cg-ai-summary">
@@ -106,7 +106,7 @@ const readingTime = calculateReadingTime(article.wordCount);
106
106
  </div>
107
107
  )}
108
108
 
109
- <div class="cg-post-info">
109
+ <div class="cg-content-meta">
110
110
  <span class="cg-info-author">{article.authorName}</span>
111
111
  <span class="cg-info-separator">•</span>
112
112
  <time class="cg-info-date" datetime={new Date(article.publishedAt * 1000).toISOString()}>
@@ -117,7 +117,7 @@ const readingTime = calculateReadingTime(article.wordCount);
117
117
  </div>
118
118
 
119
119
  {article.tags.length > 0 && (
120
- <div class="cg-post-tags">
120
+ <div class="cg-content-tags">
121
121
  {article.tags.map((tag) => (
122
122
  <span class="cg-tag">{tag}</span>
123
123
  ))}
@@ -125,56 +125,56 @@ const readingTime = calculateReadingTime(article.wordCount);
125
125
  )}
126
126
  </header>
127
127
 
128
- <div class="cg-post-content" set:html={contentHtml} />
128
+ <div class="cg-content-body" set:html={contentHtml} />
129
129
  </article>
130
130
 
131
131
  <style is:global>
132
132
  /* Markdown content styling */
133
- .cg-post-content {
133
+ .cg-content-body {
134
134
  line-height: 1.7;
135
135
  }
136
136
 
137
- .cg-post-content h1,
138
- .cg-post-content h2,
139
- .cg-post-content h3,
140
- .cg-post-content h4,
141
- .cg-post-content h5,
142
- .cg-post-content h6 {
137
+ .cg-content-body h1,
138
+ .cg-content-body h2,
139
+ .cg-content-body h3,
140
+ .cg-content-body h4,
141
+ .cg-content-body h5,
142
+ .cg-content-body h6 {
143
143
  margin-top: 2em;
144
144
  margin-bottom: 0.5em;
145
145
  font-weight: 600;
146
146
  line-height: 1.3;
147
147
  }
148
148
 
149
- .cg-post-content h1 { font-size: 2em; }
150
- .cg-post-content h2 { font-size: 1.5em; }
151
- .cg-post-content h3 { font-size: 1.25em; }
152
- .cg-post-content h4 { font-size: 1.1em; }
149
+ .cg-content-body h1 { font-size: 2em; }
150
+ .cg-content-body h2 { font-size: 1.5em; }
151
+ .cg-content-body h3 { font-size: 1.25em; }
152
+ .cg-content-body h4 { font-size: 1.1em; }
153
153
 
154
- .cg-post-content p {
154
+ .cg-content-body p {
155
155
  margin-bottom: 1.5em;
156
156
  }
157
157
 
158
- .cg-post-content a {
158
+ .cg-content-body a {
159
159
  color: #2563eb;
160
160
  text-decoration: underline;
161
161
  }
162
162
 
163
- .cg-post-content a:hover {
163
+ .cg-content-body a:hover {
164
164
  color: #1d4ed8;
165
165
  }
166
166
 
167
- .cg-post-content ul,
168
- .cg-post-content ol {
167
+ .cg-content-body ul,
168
+ .cg-content-body ol {
169
169
  margin-bottom: 1.5em;
170
170
  padding-left: 2em;
171
171
  }
172
172
 
173
- .cg-post-content li {
173
+ .cg-content-body li {
174
174
  margin-bottom: 0.5em;
175
175
  }
176
176
 
177
- .cg-post-content code {
177
+ .cg-content-body code {
178
178
  background: #f3f4f6;
179
179
  padding: 0.2em 0.4em;
180
180
  border-radius: 3px;
@@ -182,7 +182,7 @@ const readingTime = calculateReadingTime(article.wordCount);
182
182
  font-family: 'Courier New', monospace;
183
183
  }
184
184
 
185
- .cg-post-content pre {
185
+ .cg-content-body pre {
186
186
  background: #1f2937;
187
187
  color: #f9fafb;
188
188
  padding: 1.5em;
@@ -191,13 +191,13 @@ const readingTime = calculateReadingTime(article.wordCount);
191
191
  margin-bottom: 1.5em;
192
192
  }
193
193
 
194
- .cg-post-content pre code {
194
+ .cg-content-body pre code {
195
195
  background: none;
196
196
  padding: 0;
197
197
  color: inherit;
198
198
  }
199
199
 
200
- .cg-post-content blockquote {
200
+ .cg-content-body blockquote {
201
201
  border-left: 4px solid #e5e7eb;
202
202
  padding-left: 1.5em;
203
203
  margin: 1.5em 0;
@@ -205,48 +205,48 @@ const readingTime = calculateReadingTime(article.wordCount);
205
205
  color: #6b7280;
206
206
  }
207
207
 
208
- .cg-post-content img {
208
+ .cg-content-body img {
209
209
  max-width: 100%;
210
210
  height: auto;
211
211
  border-radius: 8px;
212
212
  margin: 1.5em 0;
213
213
  }
214
214
 
215
- .cg-post-content table {
215
+ .cg-content-body table {
216
216
  width: 100%;
217
217
  border-collapse: collapse;
218
218
  margin-bottom: 1.5em;
219
219
  }
220
220
 
221
- .cg-post-content th,
222
- .cg-post-content td {
221
+ .cg-content-body th,
222
+ .cg-content-body td {
223
223
  border: 1px solid #e5e7eb;
224
224
  padding: 0.75em;
225
225
  text-align: left;
226
226
  }
227
227
 
228
- .cg-post-content th {
228
+ .cg-content-body th {
229
229
  background: #f9fafb;
230
230
  font-weight: 600;
231
231
  }
232
232
 
233
233
  /* Dark theme overrides */
234
- .cg-theme-dark .cg-post-content code {
234
+ .cg-theme-dark .cg-content-body code {
235
235
  background: #374151;
236
236
  color: #f9fafb;
237
237
  }
238
238
 
239
- .cg-theme-dark .cg-post-content blockquote {
239
+ .cg-theme-dark .cg-content-body blockquote {
240
240
  border-left-color: #4b5563;
241
241
  color: #9ca3af;
242
242
  }
243
243
 
244
- .cg-theme-dark .cg-post-content th {
244
+ .cg-theme-dark .cg-content-body th {
245
245
  background: #1f2937;
246
246
  }
247
247
 
248
- .cg-theme-dark .cg-post-content th,
249
- .cg-theme-dark .cg-post-content td {
248
+ .cg-theme-dark .cg-content-body th,
249
+ .cg-theme-dark .cg-content-body td {
250
250
  border-color: #374151;
251
251
  }
252
252
  </style>
@@ -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
  }
@@ -70,28 +70,28 @@ export const ContentViewer = ({ apiKey, uuid, slug, baseUrl, theme = 'light', sh
70
70
  const publishedDate = formatDate(article.publishedAt);
71
71
  const readingTime = calculateReadingTime(article.wordCount);
72
72
  return (React.createElement("article", { className: `cg-content-viewer cg-theme-${theme} ${className}`, "data-cg-widget": "post" },
73
- showBackButton && (React.createElement("div", { className: "cg-post-header" },
73
+ showBackButton && (React.createElement("div", { className: "cg-content-header-back" },
74
74
  React.createElement("a", { href: backUrl, className: "cg-back-btn" },
75
75
  React.createElement("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none" },
76
76
  React.createElement("path", { d: "M12 16L6 10L12 4", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" })),
77
77
  "Back to articles"))),
78
- React.createElement("header", { className: "cg-post-meta" },
79
- article.category && (React.createElement("div", { className: "cg-post-category" },
78
+ React.createElement("header", { className: "cg-content-header" },
79
+ article.category && (React.createElement("div", { className: "cg-content-category" },
80
80
  React.createElement("span", { className: "cg-category-badge" }, article.category))),
81
- React.createElement("h1", { className: "cg-post-title" }, article.title),
81
+ React.createElement("h1", { className: "cg-content-title" }, article.title),
82
82
  showAiSummary && article.summary && (React.createElement("div", { className: "cg-ai-summary" },
83
83
  React.createElement("div", { className: "cg-ai-summary-header" },
84
84
  React.createElement("svg", { className: "cg-ai-summary-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" },
85
85
  React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M13 10V3L4 14h7v7l9-11h-7z" })),
86
86
  React.createElement("span", { className: "cg-ai-summary-label" }, "AI Generated Summary")),
87
87
  React.createElement("p", { className: "cg-ai-summary-text" }, article.summary))),
88
- React.createElement("div", { className: "cg-post-info" },
88
+ React.createElement("div", { className: "cg-content-meta" },
89
89
  React.createElement("span", { className: "cg-info-author" }, article.authorName),
90
90
  React.createElement("span", { className: "cg-info-separator" }, "\u2022"),
91
91
  React.createElement("time", { className: "cg-info-date", dateTime: new Date(article.publishedAt * 1000).toISOString() }, publishedDate),
92
92
  React.createElement("span", { className: "cg-info-separator" }, "\u2022"),
93
93
  React.createElement("span", { className: "cg-info-reading-time" }, readingTime)),
94
- article.tags.length > 0 && (React.createElement("div", { className: "cg-post-tags" }, article.tags.map((tag) => (React.createElement("span", { key: tag, className: "cg-tag" }, tag)))))),
95
- React.createElement("div", { className: "cg-post-content", dangerouslySetInnerHTML: { __html: contentHtml } })));
94
+ article.tags.length > 0 && (React.createElement("div", { className: "cg-content-tags" }, article.tags.map((tag) => (React.createElement("span", { key: tag, className: "cg-tag" }, tag)))))),
95
+ React.createElement("div", { className: "cg-content-body", dangerouslySetInnerHTML: { __html: contentHtml } })));
96
96
  };
97
97
  export default ContentViewer;
package/dist/styles.css CHANGED
@@ -404,27 +404,27 @@ a.cg-card {
404
404
  padding: 1rem;
405
405
  }
406
406
 
407
- .cg-post-title-section {
407
+ .cg-content-header {
408
408
  margin-bottom: 2rem;
409
409
  padding-bottom: 2rem;
410
410
  border-bottom: 1px solid var(--cg-border);
411
411
  }
412
412
 
413
- .cg-post-title {
413
+ .cg-content-title {
414
414
  font-size: 2.5rem;
415
415
  font-weight: 700;
416
416
  line-height: 1.2;
417
- margin-bottom: 1rem;
417
+ margin-bottom: 1.5rem;
418
418
  color: var(--cg-text);
419
419
  }
420
420
 
421
421
  @media (max-width: 768px) {
422
- .cg-post-title {
422
+ .cg-content-title {
423
423
  font-size: 2rem;
424
424
  }
425
425
  }
426
426
 
427
- .cg-post-meta {
427
+ .cg-content-meta {
428
428
  display: flex;
429
429
  flex-wrap: wrap;
430
430
  gap: 1.5rem;
@@ -432,50 +432,50 @@ a.cg-card {
432
432
  font-size: 0.9375rem;
433
433
  }
434
434
 
435
- .cg-post-body {
435
+ .cg-content-body {
436
436
  color: var(--cg-text);
437
437
  line-height: 1.75;
438
438
  }
439
439
 
440
440
  /* Markdown content styling */
441
- .cg-post-body h2 {
441
+ .cg-content-body h2 {
442
442
  font-size: 1.875rem;
443
443
  font-weight: 700;
444
444
  margin: 2rem 0 1rem;
445
445
  color: var(--cg-text);
446
446
  }
447
447
 
448
- .cg-post-body h3 {
448
+ .cg-content-body h3 {
449
449
  font-size: 1.5rem;
450
450
  font-weight: 600;
451
451
  margin: 1.5rem 0 0.75rem;
452
452
  color: var(--cg-text);
453
453
  }
454
454
 
455
- .cg-post-body p {
455
+ .cg-content-body p {
456
456
  margin-bottom: 1.25rem;
457
457
  }
458
458
 
459
- .cg-post-body ul,
460
- .cg-post-body ol {
459
+ .cg-content-body ul,
460
+ .cg-content-body ol {
461
461
  margin-bottom: 1.25rem;
462
462
  padding-left: 1.5rem;
463
463
  }
464
464
 
465
- .cg-post-body li {
465
+ .cg-content-body li {
466
466
  margin-bottom: 0.5rem;
467
467
  }
468
468
 
469
- .cg-post-body a {
469
+ .cg-content-body a {
470
470
  color: var(--cg-primary);
471
471
  text-decoration: underline;
472
472
  }
473
473
 
474
- .cg-post-body a:hover {
474
+ .cg-content-body a:hover {
475
475
  color: var(--cg-primary-hover);
476
476
  }
477
477
 
478
- .cg-post-body code {
478
+ .cg-content-body code {
479
479
  padding: 0.125rem 0.375rem;
480
480
  background: var(--cg-bg-secondary);
481
481
  border: 1px solid var(--cg-border);
@@ -484,7 +484,7 @@ a.cg-card {
484
484
  font-family: 'Courier New', monospace;
485
485
  }
486
486
 
487
- .cg-post-body pre {
487
+ .cg-content-body pre {
488
488
  padding: 1rem;
489
489
  background: var(--cg-bg-secondary);
490
490
  border: 1px solid var(--cg-border);
@@ -493,13 +493,13 @@ a.cg-card {
493
493
  margin-bottom: 1.25rem;
494
494
  }
495
495
 
496
- .cg-post-body pre code {
496
+ .cg-content-body pre code {
497
497
  padding: 0;
498
498
  background: none;
499
499
  border: none;
500
500
  }
501
501
 
502
- .cg-post-body blockquote {
502
+ .cg-content-body blockquote {
503
503
  padding-left: 1rem;
504
504
  border-left: 4px solid var(--cg-primary);
505
505
  margin: 1.25rem 0;
@@ -507,7 +507,7 @@ a.cg-card {
507
507
  color: var(--cg-text-secondary);
508
508
  }
509
509
 
510
- .cg-post-body img {
510
+ .cg-content-body img {
511
511
  max-width: 100%;
512
512
  height: auto;
513
513
  border-radius: 8px;
@@ -825,7 +825,7 @@ a.cg-card {
825
825
  }
826
826
 
827
827
  /* ContentViewer Styles */
828
- .cg-post-header {
828
+ .cg-content-header-back {
829
829
  margin-bottom: 2rem;
830
830
  }
831
831
 
@@ -854,17 +854,17 @@ a.cg-card {
854
854
  height: 20px;
855
855
  }
856
856
 
857
- .cg-post-meta {
857
+ .cg-content-header {
858
858
  margin-bottom: 3rem;
859
859
  padding-bottom: 2rem;
860
860
  border-bottom: 1px solid var(--cg-border);
861
861
  }
862
862
 
863
- .cg-post-category {
863
+ .cg-content-category {
864
864
  margin-bottom: 1rem;
865
865
  }
866
866
 
867
- .cg-post-title {
867
+ .cg-content-title {
868
868
  font-size: 2.5rem;
869
869
  font-weight: 700;
870
870
  line-height: 1.2;
@@ -873,12 +873,12 @@ a.cg-card {
873
873
  }
874
874
 
875
875
  @media (max-width: 768px) {
876
- .cg-post-title {
876
+ .cg-content-title {
877
877
  font-size: 2rem;
878
878
  }
879
879
  }
880
880
 
881
- .cg-post-summary {
881
+ .cg-content-summary {
882
882
  font-size: 1.125rem;
883
883
  line-height: 1.6;
884
884
  color: var(--cg-text-secondary);
@@ -939,27 +939,27 @@ a.cg-card {
939
939
  color: #d1d5db;
940
940
  }
941
941
 
942
- .cg-post-info {
942
+ .cg-content-meta {
943
943
  display: flex;
944
944
  align-items: center;
945
945
  gap: 0.5rem;
946
+ flex-wrap: wrap;
946
947
  font-size: 0.875rem;
947
948
  color: var(--cg-text-secondary);
948
- margin-bottom: 1rem;
949
949
  }
950
950
 
951
951
  .cg-info-separator {
952
952
  color: var(--cg-border);
953
953
  }
954
954
 
955
- .cg-post-tags {
955
+ .cg-content-tags {
956
956
  display: flex;
957
957
  flex-wrap: wrap;
958
958
  gap: 0.5rem;
959
959
  margin-top: 1rem;
960
960
  }
961
961
 
962
- .cg-post-content {
962
+ .cg-content-body {
963
963
  max-width: 100%;
964
964
  color: var(--cg-text);
965
965
  }
@@ -10,7 +10,7 @@
10
10
  <p>{{ error || 'Article not found' }}</p>
11
11
  </div>
12
12
  <article v-else>
13
- <div v-if="showBackButton" class="cg-post-header">
13
+ <div v-if="showBackButton" class="cg-content-header-back">
14
14
  <a :href="backUrl" class="cg-back-btn">
15
15
  <svg width="20" height="20" viewBox="0 0 20 20" fill="none">
16
16
  <path d="M12 16L6 10L12 4" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
@@ -19,12 +19,12 @@
19
19
  </a>
20
20
  </div>
21
21
 
22
- <header class="cg-post-meta">
23
- <div v-if="article.category" class="cg-post-category">
22
+ <header class="cg-content-header">
23
+ <div v-if="article.category" class="cg-content-category">
24
24
  <span class="cg-category-badge">{{ article.category }}</span>
25
25
  </div>
26
26
 
27
- <h1 class="cg-post-title">{{ article.title }}</h1>
27
+ <h1 class="cg-content-title">{{ article.title }}</h1>
28
28
 
29
29
  <div v-if="showAiSummary && article.summary" class="cg-ai-summary">
30
30
  <div class="cg-ai-summary-header">
@@ -36,7 +36,7 @@
36
36
  <p class="cg-ai-summary-text">{{ article.summary }}</p>
37
37
  </div>
38
38
 
39
- <div class="cg-post-info">
39
+ <div class="cg-content-meta">
40
40
  <span class="cg-info-author">{{ article.authorName }}</span>
41
41
  <span class="cg-info-separator">•</span>
42
42
  <time class="cg-info-date" :datetime="new Date(article.publishedAt * 1000).toISOString()">
@@ -46,12 +46,12 @@
46
46
  <span class="cg-info-reading-time">{{ calculateReadingTime(article.wordCount) }}</span>
47
47
  </div>
48
48
 
49
- <div v-if="article.tags.length > 0" class="cg-post-tags">
49
+ <div v-if="article.tags.length > 0" class="cg-content-tags">
50
50
  <span v-for="tag in article.tags" :key="tag" class="cg-tag">{{ tag }}</span>
51
51
  </div>
52
52
  </header>
53
53
 
54
- <div class="cg-post-content" v-html="contentHtml"></div>
54
+ <div class="cg-content-body" v-html="contentHtml"></div>
55
55
  </article>
56
56
  </div>
57
57
  </template>
@@ -0,0 +1 @@
1
+ .cg-content-list,.cg-content-viewer,.cg-widget{--cg-primary:#3b82f6;--cg-primary-hover:#2563eb;--cg-bg:#ffffff;--cg-bg-secondary:#f9fafb;--cg-text:#1f2937;--cg-text-secondary:#6b7280;--cg-border:#e5e7eb;--cg-shadow:0 1px 3px rgba(0,0,0,0.1);--cg-shadow-lg:0 10px 15px -3px rgba(0,0,0,0.1);--cg-radius:12px;--cg-transition:all 0.2s ease;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;font-size:16px;line-height:1.5;color:var(--cg-text)}.cg-content-list.cg-theme-dark,.cg-content-viewer.cg-theme-dark,.cg-widget[data-theme="dark"]{--cg-primary:#60a5fa;--cg-primary-hover:#3b82f6;--cg-bg:#1f2937;--cg-bg-secondary:#111827;--cg-text:#f9fafb;--cg-text-secondary:#9ca3af;--cg-border:#374151;--cg-shadow:0 1px 3px rgba(0,0,0,0.3);--cg-shadow-lg:0 10px 15px -3px rgba(0,0,0,0.5)}.cg-content-list *,.cg-content-viewer *,.cg-widget *{box-sizing:border-box;margin:0;padding:0}.cg-content-list,.cg-content-viewer,.cg-widget{width:100%;max-width:100%}.cg-content-list{width:100%}.cg-list-header{display:flex;justify-content:flex-end;margin-bottom:1.5rem}.cg-display-toggle{display:flex;align-items:center;gap:0.5rem;padding:0.5rem 1rem;background:var(--cg-bg-secondary);border:1px solid var(--cg-border);border-radius:var(--cg-radius);color:var(--cg-text);cursor:pointer;transition:var(--cg-transition);font-size:0.875rem}.cg-display-toggle:hover{background:var(--cg-bg);border-color:var(--cg-primary)}.cg-display-toggle svg{width:20px;height:20px}.cg-content-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:1.5rem;margin-bottom:2rem}@media (max-width:768px){.cg-content-grid{grid-template-columns:1fr}}.cg-content-rows{display:flex;flex-direction:column;gap:1rem;margin-bottom:2rem}.cg-content-rows .cg-card{display:grid;grid-template-columns:1fr auto;grid-template-rows:auto auto;gap:0.75rem 1.5rem;align-items:start}.cg-content-rows .cg-card-header{grid-column:1 / 2;grid-row:1;display:flex;justify-content:space-between;align-items:flex-start;gap:1rem;margin-bottom:0}.cg-content-rows .cg-card-meta{grid-column:1 / 2;grid-row:2;margin-top:0}.cg-content-rows .cg-expand-btn{grid-column:2 / 3;grid-row:1;flex-shrink:0}.cg-content-rows .cg-card-title{margin:0;flex:1}.cg-content-rows .cg-card--compact,.cg-content-rows .cg-card--comfortable,.cg-content-rows .cg-card--spacious{width:100%}@media (max-width:768px){.cg-content-rows .cg-card{grid-template-columns:1fr;grid-template-rows:auto auto}.cg-content-rows .cg-expand-btn{grid-column:1;grid-row:1;justify-self:end}}.cg-card{background:var(--cg-bg);border:1px solid var(--cg-border);border-radius:var(--cg-radius);padding:1.5rem;cursor:pointer;transition:var(--cg-transition);display:block}a.cg-card{text-decoration:none;color:inherit}.cg-card--compact{padding:1rem}.cg-card--compact .cg-card-title{font-size:1rem;line-height:1.4}.cg-card--compact .cg-card-meta{font-size:0.75rem}.cg-card--comfortable{padding:1.5rem}.cg-card--comfortable .cg-card-title{font-size:1.125rem;line-height:1.5}.cg-card--comfortable .cg-card-meta{font-size:0.875rem}.cg-card--spacious{padding:2rem}.cg-card--spacious .cg-card-title{font-size:1.25rem;line-height:1.6}.cg-card--spacious .cg-card-meta{font-size:0.875rem;margin-top:0.75rem}.cg-card:hover{box-shadow:var(--cg-shadow-lg);border-color:var(--cg-primary)}.cg-card-header{display:flex;justify-content:space-between;align-items:flex-start;gap:1rem;margin-bottom:1rem}.cg-card-title{font-size:1.25rem;font-weight:600;color:var(--cg-text);line-height:1.4;flex:1}.cg-expand-btn{flex-shrink:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:var(--cg-bg-secondary);border:1px solid var(--cg-border);border-radius:8px;color:var(--cg-text-secondary);cursor:pointer;transition:var(--cg-transition)}.cg-expand-btn:hover{background:var(--cg-primary);color:white;border-color:var(--cg-primary)}.cg-card-summary{margin-bottom:1rem;padding:1rem;background:var(--cg-bg-secondary);border-radius:8px}.cg-card-summary p{color:var(--cg-text-secondary);font-size:0.9375rem;line-height:1.6}.cg-card-tags{display:flex;flex-wrap:wrap;gap:0.5rem;margin-bottom:1rem}.cg-tag{display:inline-block;padding:0.25rem 0.75rem;background:var(--cg-primary);color:white;border-radius:999px;font-size:0.75rem;font-weight:500}.cg-card-meta{display:flex;flex-wrap:wrap;gap:1rem;font-size:0.875rem;color:var(--cg-text-secondary)}.cg-meta-item{display:flex;align-items:center;gap:0.375rem}.cg-meta-item svg{width:14px;height:14px;flex-shrink:0}.cg-pagination{display:flex;align-items:center;justify-content:center;gap:1rem;padding:1.5rem 0}.cg-btn-prev,.cg-btn-next{display:flex;align-items:center;gap:0.5rem;padding:0.75rem 1.5rem;background:var(--cg-primary);color:white;border:none;border-radius:var(--cg-radius);font-weight:500;cursor:pointer;transition:var(--cg-transition)}.cg-btn-prev:hover:not(:disabled),.cg-btn-next:hover:not(:disabled){background:var(--cg-primary-hover);box-shadow:var(--cg-shadow-lg)}.cg-btn-prev:disabled,.cg-btn-next:disabled{opacity:0.5;cursor:not-allowed}.cg-page-info{color:var(--cg-text-secondary);font-size:0.875rem}.cg-content-viewer{width:100%;background:var(--cg-bg);min-height:400px}.cg-viewer-header{margin-bottom:2rem;background:var(--cg-bg)}.cg-back-btn{display:flex;align-items:center;gap:0.5rem;padding:0.75rem 1.5rem;background:var(--cg-bg-secondary);border:1px solid var(--cg-border);border-radius:var(--cg-radius);color:var(--cg-text);font-weight:500;cursor:pointer;transition:var(--cg-transition)}.cg-back-btn:hover{background:var(--cg-bg);border-color:var(--cg-primary);color:var(--cg-primary)}.cg-viewer-content{max-width:800px;margin:0 auto;background:var(--cg-bg);padding:1rem}.cg-content-header{margin-bottom:2rem;padding-bottom:2rem;border-bottom:1px solid var(--cg-border)}.cg-content-title{font-size:2.5rem;font-weight:700;line-height:1.2;margin-bottom:1.5rem;color:var(--cg-text)}@media (max-width:768px){.cg-content-title{font-size:2rem}}.cg-content-meta{display:flex;flex-wrap:wrap;gap:1.5rem;color:var(--cg-text-secondary);font-size:0.9375rem}.cg-content-body{color:var(--cg-text);line-height:1.75}.cg-content-body h2{font-size:1.875rem;font-weight:700;margin:2rem 0 1rem;color:var(--cg-text)}.cg-content-body h3{font-size:1.5rem;font-weight:600;margin:1.5rem 0 0.75rem;color:var(--cg-text)}.cg-content-body p{margin-bottom:1.25rem}.cg-content-body ul,.cg-content-body ol{margin-bottom:1.25rem;padding-left:1.5rem}.cg-content-body li{margin-bottom:0.5rem}.cg-content-body a{color:var(--cg-primary);text-decoration:underline}.cg-content-body a:hover{color:var(--cg-primary-hover)}.cg-content-body code{padding:0.125rem 0.375rem;background:var(--cg-bg-secondary);border:1px solid var(--cg-border);border-radius:4px;font-size:0.875em;font-family:'Courier New',monospace}.cg-content-body pre{padding:1rem;background:var(--cg-bg-secondary);border:1px solid var(--cg-border);border-radius:8px;overflow-x:auto;margin-bottom:1.25rem}.cg-content-body pre code{padding:0;background:none;border:none}.cg-content-body blockquote{padding-left:1rem;border-left:4px solid var(--cg-primary);margin:1.25rem 0;font-style:italic;color:var(--cg-text-secondary)}.cg-content-body img{max-width:100%;height:auto;border-radius:8px;margin:1.25rem 0}.cg-modal{position:fixed;top:0;left:0;right:0;bottom:0;z-index:9999;opacity:0;pointer-events:none;transition:opacity 0.3s ease;--cg-primary:#3b82f6;--cg-primary-hover:#2563eb;--cg-bg:#ffffff;--cg-bg-secondary:#f9fafb;--cg-text:#1f2937;--cg-text-secondary:#6b7280;--cg-border:#e5e7eb;--cg-shadow:0 1px 3px rgba(0,0,0,0.1);--cg-shadow-lg:0 10px 15px -3px rgba(0,0,0,0.1);--cg-radius:12px;--cg-transition:all 0.2s ease;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif}.cg-modal--active{opacity:1;pointer-events:auto}.cg-modal[data-theme="dark"]{--cg-primary:#60a5fa;--cg-primary-hover:#3b82f6;--cg-bg:#1f2937;--cg-bg-secondary:#111827;--cg-text:#f9fafb;--cg-text-secondary:#9ca3af;--cg-border:#374151;--cg-shadow:0 1px 3px rgba(0,0,0,0.3);--cg-shadow-lg:0 10px 15px -3px rgba(0,0,0,0.5)}.cg-modal-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.8);cursor:pointer}.cg-modal-content{position:relative;max-width:900px;max-height:90vh;margin:5vh auto;background:var(--cg-bg);border-radius:var(--cg-radius);overflow-y:auto;box-shadow:0 25px 50px -12px rgba(0,0,0,0.5);z-index:10;opacity:1 !important}.cg-modal-close{position:sticky;top:1rem;right:1rem;float:right;width:40px;height:40px;display:flex;align-items:center;justify-content:center;background:var(--cg-bg);border:1px solid var(--cg-border);border-radius:50%;color:var(--cg-text);cursor:pointer;transition:var(--cg-transition);z-index:10}.cg-modal-close:hover{background:var(--cg-primary);color:white;border-color:var(--cg-primary)}.cg-modal-body{padding:2rem;background:var(--cg-bg);min-height:200px}.cg-loading,.cg-viewer-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:4rem 2rem;text-align:center}.cg-spinner{width:48px;height:48px;border:4px solid var(--cg-border);border-top-color:var(--cg-primary);border-radius:50%;animation:cg-spin 0.8s linear infinite;margin-bottom:1rem}@keyframes cg-spin{to{transform:rotate(360deg)}}.cg-loading p,.cg-viewer-loading p{color:var(--cg-text-secondary)}.cg-error,.cg-viewer-error{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:4rem 2rem;text-align:center}.cg-error svg,.cg-viewer-error svg{color:#ef4444;margin-bottom:1rem}.cg-error p,.cg-viewer-error p{color:var(--cg-text);margin-bottom:1.5rem}.cg-retry-btn{padding:0.75rem 1.5rem;background:var(--cg-primary);color:white;border:none;border-radius:var(--cg-radius);font-weight:500;cursor:pointer;transition:var(--cg-transition)}.cg-retry-btn:hover{background:var(--cg-primary-hover)}.cg-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:4rem 2rem;text-align:center}.cg-empty-state svg{color:var(--cg-text-secondary);margin-bottom:1rem}.cg-empty-state p{color:var(--cg-text-secondary);margin-top:1rem}.cg-articles-grid.cg-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:1.5rem;margin-bottom:2rem}.cg-articles-grid.cg-list{display:flex;flex-direction:column;gap:1rem;margin-bottom:2rem}@media (max-width:768px){.cg-articles-grid.cg-grid{grid-template-columns:1fr}}.cg-article-card{background:var(--cg-bg);border:1px solid var(--cg-border);border-radius:var(--cg-radius);overflow:hidden;transition:var(--cg-transition)}.cg-article-card:hover{box-shadow:var(--cg-shadow-lg);transform:translateY(-2px)}.cg-card-link{display:block;text-decoration:none;color:inherit}.cg-card-content{padding:1.5rem}.cg-display-compact .cg-card-content{padding:1rem}.cg-display-spacious .cg-card-content{padding:2rem}.cg-card-category{margin-bottom:0.75rem}.cg-category-badge{display:inline-block;padding:0.25rem 0.75rem;background:var(--cg-primary);color:white;border-radius:9999px;font-size:0.75rem;font-weight:500;text-transform:uppercase;letter-spacing:0.05em}.cg-card-title{font-size:1.25rem;font-weight:600;line-height:1.4;margin-bottom:0.75rem;color:var(--cg-text)}.cg-display-compact .cg-card-title{font-size:1.1rem}.cg-display-spacious .cg-card-title{font-size:1.5rem}.cg-card-summary{color:var(--cg-text-secondary);line-height:1.6;margin-bottom:1rem;font-size:0.95rem}.cg-card-meta{display:flex;align-items:center;gap:0.5rem;font-size:0.875rem;color:var(--cg-text-secondary);margin-bottom:1rem}.cg-meta-separator{color:var(--cg-border)}.cg-card-tags{display:flex;flex-wrap:wrap;gap:0.5rem}.cg-tag{padding:0.25rem 0.75rem;background:var(--cg-bg-secondary);border:1px solid var(--cg-border);border-radius:9999px;font-size:0.75rem;color:var(--cg-text-secondary)}.cg-content-header-back{margin-bottom:2rem}.cg-back-btn{display:inline-flex;align-items:center;gap:0.5rem;padding:0.5rem 1rem;background:var(--cg-bg-secondary);border:1px solid var(--cg-border);border-radius:var(--cg-radius);color:var(--cg-text);text-decoration:none;font-size:0.875rem;transition:var(--cg-transition)}.cg-back-btn:hover{background:var(--cg-bg);border-color:var(--cg-primary);color:var(--cg-primary)}.cg-back-btn svg{width:20px;height:20px}.cg-content-header{margin-bottom:3rem;padding-bottom:2rem;border-bottom:1px solid var(--cg-border)}.cg-content-category{margin-bottom:1rem}.cg-content-title{font-size:2.5rem;font-weight:700;line-height:1.2;margin-bottom:1rem;color:var(--cg-text)}@media (max-width:768px){.cg-content-title{font-size:2rem}}.cg-content-summary{font-size:1.125rem;line-height:1.6;color:var(--cg-text-secondary);margin-bottom:1.5rem}.cg-ai-summary{background:linear-gradient(to right,#eff6ff,#dbeafe);border-left:4px solid #3b82f6;border-radius:0 var(--cg-radius) var(--cg-radius) 0;padding:1rem 1.25rem;margin-bottom:1.5rem}.cg-theme-dark .cg-ai-summary{background:linear-gradient(to right,#1e3a5f,#1e40af);border-left-color:#60a5fa}.cg-ai-summary-header{display:flex;align-items:center;gap:0.5rem;margin-bottom:0.5rem}.cg-ai-summary-icon{width:1rem;height:1rem;color:#2563eb}.cg-theme-dark .cg-ai-summary-icon{color:#60a5fa}.cg-ai-summary-label{font-size:0.75rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#1d4ed8}.cg-theme-dark .cg-ai-summary-label{color:#93c5fd}.cg-ai-summary-text{font-size:0.875rem;font-style:italic;line-height:1.6;color:#374151}.cg-theme-dark .cg-ai-summary-text{color:#d1d5db}.cg-content-meta{display:flex;align-items:center;gap:0.5rem;flex-wrap:wrap;font-size:0.875rem;color:var(--cg-text-secondary)}.cg-info-separator{color:var(--cg-border)}.cg-content-tags{display:flex;flex-wrap:wrap;gap:0.5rem;margin-top:1rem}.cg-content-body{max-width:100%;color:var(--cg-text)}.cg-empty-state p{color:var(--cg-text-secondary);font-size:1.125rem}