@gosalesdeal/blog 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/README.md +97 -0
  2. package/dist/client/blogClient.d.ts +31 -0
  3. package/dist/client/blogClient.js +129 -0
  4. package/dist/client/blogClient.js.map +1 -0
  5. package/dist/components/BlogList.d.ts +24 -0
  6. package/dist/components/BlogList.js +60 -0
  7. package/dist/components/BlogList.js.map +1 -0
  8. package/dist/components/BlogPost.d.ts +25 -0
  9. package/dist/components/BlogPost.js +53 -0
  10. package/dist/components/BlogPost.js.map +1 -0
  11. package/dist/components/JsonLd.d.ts +6 -0
  12. package/dist/components/JsonLd.js +15 -0
  13. package/dist/components/JsonLd.js.map +1 -0
  14. package/dist/config.d.ts +16 -0
  15. package/dist/config.js +32 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/index.d.ts +9 -0
  18. package/dist/index.js +31 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/lib/format.d.ts +2 -0
  21. package/dist/lib/format.js +10 -0
  22. package/dist/lib/format.js.map +1 -0
  23. package/dist/render/BlockRenderer.d.ts +9 -0
  24. package/dist/render/BlockRenderer.js +80 -0
  25. package/dist/render/BlockRenderer.js.map +1 -0
  26. package/dist/render/RichText.d.ts +5 -0
  27. package/dist/render/RichText.js +12 -0
  28. package/dist/render/RichText.js.map +1 -0
  29. package/dist/render/blockStyle.d.ts +8 -0
  30. package/dist/render/blockStyle.js +33 -0
  31. package/dist/render/blockStyle.js.map +1 -0
  32. package/dist/render/blocks/AccordionBlock.d.ts +4 -0
  33. package/dist/render/blocks/AccordionBlock.js +39 -0
  34. package/dist/render/blocks/AccordionBlock.js.map +1 -0
  35. package/dist/render/blocks/AlertBlock.d.ts +4 -0
  36. package/dist/render/blocks/AlertBlock.js +11 -0
  37. package/dist/render/blocks/AlertBlock.js.map +1 -0
  38. package/dist/render/blocks/ButtonBlock.d.ts +4 -0
  39. package/dist/render/blocks/ButtonBlock.js +17 -0
  40. package/dist/render/blocks/ButtonBlock.js.map +1 -0
  41. package/dist/render/blocks/CodeBlock.d.ts +4 -0
  42. package/dist/render/blocks/CodeBlock.js +16 -0
  43. package/dist/render/blocks/CodeBlock.js.map +1 -0
  44. package/dist/render/blocks/ColumnsBlock.d.ts +4 -0
  45. package/dist/render/blocks/ColumnsBlock.js +19 -0
  46. package/dist/render/blocks/ColumnsBlock.js.map +1 -0
  47. package/dist/render/blocks/DividerBlock.d.ts +4 -0
  48. package/dist/render/blocks/DividerBlock.js +19 -0
  49. package/dist/render/blocks/DividerBlock.js.map +1 -0
  50. package/dist/render/blocks/EmbedBlock.d.ts +4 -0
  51. package/dist/render/blocks/EmbedBlock.js +26 -0
  52. package/dist/render/blocks/EmbedBlock.js.map +1 -0
  53. package/dist/render/blocks/GalleryBlock.d.ts +4 -0
  54. package/dist/render/blocks/GalleryBlock.js +15 -0
  55. package/dist/render/blocks/GalleryBlock.js.map +1 -0
  56. package/dist/render/blocks/HeadingBlock.d.ts +5 -0
  57. package/dist/render/blocks/HeadingBlock.js +10 -0
  58. package/dist/render/blocks/HeadingBlock.js.map +1 -0
  59. package/dist/render/blocks/ImageBlock.d.ts +4 -0
  60. package/dist/render/blocks/ImageBlock.js +33 -0
  61. package/dist/render/blocks/ImageBlock.js.map +1 -0
  62. package/dist/render/blocks/ListBlock.d.ts +5 -0
  63. package/dist/render/blocks/ListBlock.js +16 -0
  64. package/dist/render/blocks/ListBlock.js.map +1 -0
  65. package/dist/render/blocks/QuoteBlock.d.ts +4 -0
  66. package/dist/render/blocks/QuoteBlock.js +15 -0
  67. package/dist/render/blocks/QuoteBlock.js.map +1 -0
  68. package/dist/render/blocks/SpacerBlock.d.ts +4 -0
  69. package/dist/render/blocks/SpacerBlock.js +8 -0
  70. package/dist/render/blocks/SpacerBlock.js.map +1 -0
  71. package/dist/render/blocks/TableBlock.d.ts +4 -0
  72. package/dist/render/blocks/TableBlock.js +18 -0
  73. package/dist/render/blocks/TableBlock.js.map +1 -0
  74. package/dist/render/blocks/TabsBlock.d.ts +4 -0
  75. package/dist/render/blocks/TabsBlock.js +29 -0
  76. package/dist/render/blocks/TabsBlock.js.map +1 -0
  77. package/dist/render/blocks/TextBlock.d.ts +4 -0
  78. package/dist/render/blocks/TextBlock.js +12 -0
  79. package/dist/render/blocks/TextBlock.js.map +1 -0
  80. package/dist/render/blocks/VideoBlock.d.ts +4 -0
  81. package/dist/render/blocks/VideoBlock.js +63 -0
  82. package/dist/render/blocks/VideoBlock.js.map +1 -0
  83. package/dist/seo/index.d.ts +46 -0
  84. package/dist/seo/index.js +87 -0
  85. package/dist/seo/index.js.map +1 -0
  86. package/dist/styles.css +174 -0
  87. package/dist/types/blog.d.ts +260 -0
  88. package/package.json +68 -0
@@ -0,0 +1,260 @@
1
+ export type BlockType = 'text' | 'heading' | 'image' | 'video' | 'quote' | 'code' | 'list' | 'divider' | 'spacer' | 'button' | 'embed' | 'gallery' | 'table' | 'accordion' | 'tabs' | 'alert' | 'columns';
2
+ export interface BlockSettings {
3
+ alignment?: 'left' | 'center' | 'right' | 'justify';
4
+ margin?: {
5
+ top: number;
6
+ bottom: number;
7
+ left: number;
8
+ right: number;
9
+ };
10
+ padding?: {
11
+ top: number;
12
+ bottom: number;
13
+ left: number;
14
+ right: number;
15
+ };
16
+ backgroundColor?: string;
17
+ borderRadius?: number;
18
+ border?: {
19
+ width: number;
20
+ style: 'solid' | 'dashed' | 'dotted';
21
+ color: string;
22
+ };
23
+ fontSize?: number;
24
+ fontWeight?: 'normal' | 'bold' | '300' | '400' | '500' | '600' | '700' | '800';
25
+ color?: string;
26
+ lineHeight?: number;
27
+ letterSpacing?: number;
28
+ animation?: {
29
+ type: 'fadeIn' | 'slideUp' | 'slideDown' | 'slideLeft' | 'slideRight';
30
+ duration: number;
31
+ delay: number;
32
+ };
33
+ }
34
+ export interface BaseBlock {
35
+ id: string;
36
+ type: BlockType;
37
+ display_order: number;
38
+ settings?: BlockSettings;
39
+ }
40
+ export interface TextBlockContent {
41
+ text: string;
42
+ format?: 'html' | 'markdown' | 'plain';
43
+ }
44
+ export interface HeadingBlockContent {
45
+ text: string;
46
+ level: 1 | 2 | 3 | 4 | 5 | 6;
47
+ anchor?: string;
48
+ }
49
+ export interface ImageBlockContent {
50
+ url: string;
51
+ alt: string;
52
+ caption?: string;
53
+ width?: number;
54
+ height?: number;
55
+ link?: string;
56
+ openInNewTab?: boolean;
57
+ }
58
+ export interface VideoBlockContent {
59
+ url: string;
60
+ thumbnail?: string;
61
+ caption?: string;
62
+ autoplay?: boolean;
63
+ controls?: boolean;
64
+ muted?: boolean;
65
+ loop?: boolean;
66
+ provider?: 'youtube' | 'vimeo' | 'direct';
67
+ }
68
+ export interface QuoteBlockContent {
69
+ text: string;
70
+ author?: string;
71
+ source?: string;
72
+ sourceUrl?: string;
73
+ style?: 'default' | 'bordered' | 'highlighted';
74
+ }
75
+ export interface CodeBlockContent {
76
+ code: string;
77
+ language?: string;
78
+ filename?: string;
79
+ showLineNumbers?: boolean;
80
+ highlightLines?: number[];
81
+ theme?: 'light' | 'dark';
82
+ }
83
+ export interface ListBlockContent {
84
+ items: Array<{
85
+ id: string;
86
+ text: string;
87
+ checked?: boolean;
88
+ }>;
89
+ type: 'ordered' | 'unordered' | 'checklist';
90
+ style?: 'default' | 'minimal' | 'cards';
91
+ }
92
+ export interface ButtonBlockContent {
93
+ text: string;
94
+ url: string;
95
+ style: 'primary' | 'secondary' | 'outline' | 'text';
96
+ size: 'small' | 'medium' | 'large';
97
+ icon?: string;
98
+ openInNewTab?: boolean;
99
+ }
100
+ export interface EmbedBlockContent {
101
+ html: string;
102
+ url?: string;
103
+ provider?: string;
104
+ width?: number;
105
+ height?: number;
106
+ }
107
+ export interface GalleryBlockContent {
108
+ images: Array<{
109
+ id: string;
110
+ url: string;
111
+ alt: string;
112
+ caption?: string;
113
+ }>;
114
+ layout: 'grid' | 'masonry' | 'carousel' | 'justified';
115
+ columns?: number;
116
+ gap?: number;
117
+ }
118
+ export interface TableBlockContent {
119
+ headers: string[];
120
+ rows: string[][];
121
+ caption?: string;
122
+ striped?: boolean;
123
+ bordered?: boolean;
124
+ responsive?: boolean;
125
+ }
126
+ export interface AccordionBlockContent {
127
+ items: Array<{
128
+ id: string;
129
+ title: string;
130
+ content: string;
131
+ defaultOpen?: boolean;
132
+ }>;
133
+ allowMultiple?: boolean;
134
+ style?: 'default' | 'bordered' | 'minimal';
135
+ }
136
+ export interface TabsBlockContent {
137
+ tabs: Array<{
138
+ id: string;
139
+ title: string;
140
+ content: string;
141
+ icon?: string;
142
+ }>;
143
+ defaultTab?: string;
144
+ style?: 'default' | 'pills' | 'underline';
145
+ }
146
+ export interface AlertBlockContent {
147
+ text: string;
148
+ type: 'info' | 'success' | 'warning' | 'error';
149
+ title?: string;
150
+ icon?: boolean;
151
+ dismissible?: boolean;
152
+ }
153
+ export interface ColumnsBlockContent {
154
+ columns: Array<{
155
+ id: string;
156
+ width: number;
157
+ blocks: ContentBlock[];
158
+ }>;
159
+ gap?: number;
160
+ verticalAlign?: 'top' | 'center' | 'bottom';
161
+ }
162
+ export interface SpacerBlockContent {
163
+ height: number;
164
+ }
165
+ export interface DividerBlockContent {
166
+ style: 'solid' | 'dashed' | 'dotted';
167
+ color?: string;
168
+ thickness?: number;
169
+ width?: number;
170
+ }
171
+ export type BlockContent = TextBlockContent | HeadingBlockContent | ImageBlockContent | VideoBlockContent | QuoteBlockContent | CodeBlockContent | ListBlockContent | ButtonBlockContent | EmbedBlockContent | GalleryBlockContent | TableBlockContent | AccordionBlockContent | TabsBlockContent | AlertBlockContent | ColumnsBlockContent | SpacerBlockContent | DividerBlockContent;
172
+ export interface ContentBlock extends BaseBlock {
173
+ content: BlockContent;
174
+ }
175
+ export interface BlogCategory {
176
+ category_id: string;
177
+ name: string;
178
+ slug: string;
179
+ description?: string;
180
+ color?: string;
181
+ icon?: string;
182
+ parent_id?: string;
183
+ display_order: number;
184
+ is_featured: boolean;
185
+ children?: BlogCategory[];
186
+ _count?: {
187
+ posts: number;
188
+ children?: number;
189
+ };
190
+ }
191
+ export interface BlogTag {
192
+ tag_id: string;
193
+ name: string;
194
+ slug: string;
195
+ color?: string;
196
+ description?: string;
197
+ }
198
+ export interface BlogPostCategory {
199
+ post_id: string;
200
+ category_id: string;
201
+ category?: BlogCategory;
202
+ }
203
+ export interface BlogPostTag {
204
+ post_id: string;
205
+ tag_id: string;
206
+ tag?: BlogTag;
207
+ }
208
+ export interface BlogPost {
209
+ post_id: string;
210
+ title: string;
211
+ slug: string;
212
+ excerpt?: string;
213
+ featured_image?: string;
214
+ featured_image_alt?: string;
215
+ meta_title?: string;
216
+ meta_description?: string;
217
+ status: 'draft' | 'published' | 'archived';
218
+ visibility: 'public' | 'private' | 'password';
219
+ author_id?: string;
220
+ author_name: string;
221
+ author_email?: string;
222
+ published_at?: string;
223
+ scheduled_at?: string;
224
+ created_at: string;
225
+ updated_at: string;
226
+ view_count: number;
227
+ like_count: number;
228
+ comment_count: number;
229
+ reading_time?: number;
230
+ is_featured: boolean;
231
+ content_language: string;
232
+ content_summary?: string;
233
+ content_blocks: ContentBlock[];
234
+ blocks?: ContentBlock[];
235
+ categories?: BlogPostCategory[];
236
+ tags?: BlogPostTag[];
237
+ override_seo_noindex?: boolean;
238
+ override_seo_canonical_url?: string;
239
+ override_social_og_image?: string;
240
+ override_schema_json?: unknown;
241
+ }
242
+ export interface PaginationMeta {
243
+ total: number;
244
+ page: number;
245
+ limit: number;
246
+ pages: number;
247
+ hasNext: boolean;
248
+ hasPrev: boolean;
249
+ }
250
+ export interface PaginatedResponse<T> {
251
+ items: T[];
252
+ pagination: PaginationMeta;
253
+ }
254
+ /** Generic API envelope used by the BlogPosts API. */
255
+ export interface BlogApiResponse<T> {
256
+ success?: boolean;
257
+ data?: T;
258
+ error?: string;
259
+ message?: string;
260
+ }
package/package.json ADDED
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "@gosalesdeal/blog",
3
+ "version": "0.1.0",
4
+ "description": "Render GoEnterprise blog content (list + post) straight from the BlogPosts API. Server-component friendly, zero UI dependencies.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "sideEffects": [
8
+ "**/*.css"
9
+ ],
10
+ "files": [
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "main": "./dist/index.js",
15
+ "module": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js"
21
+ },
22
+ "./styles.css": "./dist/styles.css",
23
+ "./package.json": "./package.json"
24
+ },
25
+ "scripts": {
26
+ "build": "vite build && node scripts/copy-assets.mjs",
27
+ "typecheck": "tsc --noEmit",
28
+ "test": "vitest run",
29
+ "test:watch": "vitest",
30
+ "prepublishOnly": "npm run build"
31
+ },
32
+ "keywords": [
33
+ "blog",
34
+ "react",
35
+ "server-components",
36
+ "nextjs",
37
+ "cms",
38
+ "goenterprise"
39
+ ],
40
+ "peerDependencies": {
41
+ "react": ">=18",
42
+ "react-dom": ">=18"
43
+ },
44
+ "peerDependenciesMeta": {
45
+ "react-dom": {
46
+ "optional": true
47
+ }
48
+ },
49
+ "devDependencies": {
50
+ "@types/node": "^22.10.5",
51
+ "@types/react": "^19.0.7",
52
+ "@types/react-dom": "^19.0.3",
53
+ "@vitejs/plugin-react": "^4.3.4",
54
+ "react": "^19.0.0",
55
+ "react-dom": "^19.0.0",
56
+ "rollup-preserve-directives": "^1.1.3",
57
+ "typescript": "^5.7.3",
58
+ "vite": "^6.0.7",
59
+ "vite-plugin-dts": "^4.4.0",
60
+ "vitest": "^2.1.8"
61
+ },
62
+ "publishConfig": {
63
+ "access": "public"
64
+ },
65
+ "engines": {
66
+ "node": ">=18"
67
+ }
68
+ }