@endora-commerce/mod-blog 0.100.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 (171) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +62 -0
  3. package/dist/admin/api/blog-client.d.ts +70 -0
  4. package/dist/admin/api/blog-client.d.ts.map +1 -0
  5. package/dist/admin/api/blog-client.js +137 -0
  6. package/dist/admin/api/blog-client.js.map +1 -0
  7. package/dist/admin/components/CategoryTreeNode.d.ts +25 -0
  8. package/dist/admin/components/CategoryTreeNode.d.ts.map +1 -0
  9. package/dist/admin/components/CategoryTreeNode.js +14 -0
  10. package/dist/admin/components/CategoryTreeNode.js.map +1 -0
  11. package/dist/admin/components/PostStatusBadge.d.ts +7 -0
  12. package/dist/admin/components/PostStatusBadge.d.ts.map +1 -0
  13. package/dist/admin/components/PostStatusBadge.js +16 -0
  14. package/dist/admin/components/PostStatusBadge.js.map +1 -0
  15. package/dist/admin/components/RelatedPostsPicker.d.ts +11 -0
  16. package/dist/admin/components/RelatedPostsPicker.d.ts.map +1 -0
  17. package/dist/admin/components/RelatedPostsPicker.js +77 -0
  18. package/dist/admin/components/RelatedPostsPicker.js.map +1 -0
  19. package/dist/admin/components/RelatedProductsPicker.d.ts +9 -0
  20. package/dist/admin/components/RelatedProductsPicker.d.ts.map +1 -0
  21. package/dist/admin/components/RelatedProductsPicker.js +66 -0
  22. package/dist/admin/components/RelatedProductsPicker.js.map +1 -0
  23. package/dist/admin/components/TagPicker.d.ts +9 -0
  24. package/dist/admin/components/TagPicker.d.ts.map +1 -0
  25. package/dist/admin/components/TagPicker.js +66 -0
  26. package/dist/admin/components/TagPicker.js.map +1 -0
  27. package/dist/admin/index.d.ts +33 -0
  28. package/dist/admin/index.d.ts.map +1 -0
  29. package/dist/admin/index.js +114 -0
  30. package/dist/admin/index.js.map +1 -0
  31. package/dist/admin/pages/BlogCategoryEditor.d.ts +9 -0
  32. package/dist/admin/pages/BlogCategoryEditor.d.ts.map +1 -0
  33. package/dist/admin/pages/BlogCategoryEditor.js +196 -0
  34. package/dist/admin/pages/BlogCategoryEditor.js.map +1 -0
  35. package/dist/admin/pages/BlogCategoryTreePage.d.ts +9 -0
  36. package/dist/admin/pages/BlogCategoryTreePage.d.ts.map +1 -0
  37. package/dist/admin/pages/BlogCategoryTreePage.js +122 -0
  38. package/dist/admin/pages/BlogCategoryTreePage.js.map +1 -0
  39. package/dist/admin/pages/BlogPostEditor.d.ts +9 -0
  40. package/dist/admin/pages/BlogPostEditor.d.ts.map +1 -0
  41. package/dist/admin/pages/BlogPostEditor.js +314 -0
  42. package/dist/admin/pages/BlogPostEditor.js.map +1 -0
  43. package/dist/admin/pages/BlogPostListPage.d.ts +9 -0
  44. package/dist/admin/pages/BlogPostListPage.d.ts.map +1 -0
  45. package/dist/admin/pages/BlogPostListPage.js +75 -0
  46. package/dist/admin/pages/BlogPostListPage.js.map +1 -0
  47. package/dist/admin/pages/BlogTagListPage.d.ts +9 -0
  48. package/dist/admin/pages/BlogTagListPage.d.ts.map +1 -0
  49. package/dist/admin/pages/BlogTagListPage.js +145 -0
  50. package/dist/admin/pages/BlogTagListPage.js.map +1 -0
  51. package/dist/backend/entities/blog-category-language.entity.d.ts +11 -0
  52. package/dist/backend/entities/blog-category-language.entity.d.ts.map +1 -0
  53. package/dist/backend/entities/blog-category-language.entity.js +35 -0
  54. package/dist/backend/entities/blog-category-language.entity.js.map +1 -0
  55. package/dist/backend/entities/blog-category-sales-channel.entity.d.ts +17 -0
  56. package/dist/backend/entities/blog-category-sales-channel.entity.d.ts.map +1 -0
  57. package/dist/backend/entities/blog-category-sales-channel.entity.js +48 -0
  58. package/dist/backend/entities/blog-category-sales-channel.entity.js.map +1 -0
  59. package/dist/backend/entities/blog-category.entity.d.ts +32 -0
  60. package/dist/backend/entities/blog-category.entity.d.ts.map +1 -0
  61. package/dist/backend/entities/blog-category.entity.js +113 -0
  62. package/dist/backend/entities/blog-category.entity.js.map +1 -0
  63. package/dist/backend/entities/blog-post-category.entity.d.ts +10 -0
  64. package/dist/backend/entities/blog-post-category.entity.d.ts.map +1 -0
  65. package/dist/backend/entities/blog-post-category.entity.js +34 -0
  66. package/dist/backend/entities/blog-post-category.entity.js.map +1 -0
  67. package/dist/backend/entities/blog-post-language.entity.d.ts +9 -0
  68. package/dist/backend/entities/blog-post-language.entity.d.ts.map +1 -0
  69. package/dist/backend/entities/blog-post-language.entity.js +33 -0
  70. package/dist/backend/entities/blog-post-language.entity.js.map +1 -0
  71. package/dist/backend/entities/blog-post-related-post.entity.d.ts +15 -0
  72. package/dist/backend/entities/blog-post-related-post.entity.d.ts.map +1 -0
  73. package/dist/backend/entities/blog-post-related-post.entity.js +42 -0
  74. package/dist/backend/entities/blog-post-related-post.entity.js.map +1 -0
  75. package/dist/backend/entities/blog-post-related-product.entity.d.ts +14 -0
  76. package/dist/backend/entities/blog-post-related-product.entity.d.ts.map +1 -0
  77. package/dist/backend/entities/blog-post-related-product.entity.js +41 -0
  78. package/dist/backend/entities/blog-post-related-product.entity.js.map +1 -0
  79. package/dist/backend/entities/blog-post-sales-channel.entity.d.ts +16 -0
  80. package/dist/backend/entities/blog-post-sales-channel.entity.d.ts.map +1 -0
  81. package/dist/backend/entities/blog-post-sales-channel.entity.js +47 -0
  82. package/dist/backend/entities/blog-post-sales-channel.entity.js.map +1 -0
  83. package/dist/backend/entities/blog-post-tag.entity.d.ts +14 -0
  84. package/dist/backend/entities/blog-post-tag.entity.d.ts.map +1 -0
  85. package/dist/backend/entities/blog-post-tag.entity.js +41 -0
  86. package/dist/backend/entities/blog-post-tag.entity.js.map +1 -0
  87. package/dist/backend/entities/blog-post.entity.d.ts +31 -0
  88. package/dist/backend/entities/blog-post.entity.d.ts.map +1 -0
  89. package/dist/backend/entities/blog-post.entity.js +106 -0
  90. package/dist/backend/entities/blog-post.entity.js.map +1 -0
  91. package/dist/backend/entities/blog-tag.entity.d.ts +18 -0
  92. package/dist/backend/entities/blog-tag.entity.d.ts.map +1 -0
  93. package/dist/backend/entities/blog-tag.entity.js +66 -0
  94. package/dist/backend/entities/blog-tag.entity.js.map +1 -0
  95. package/dist/backend/index.d.ts +100 -0
  96. package/dist/backend/index.d.ts.map +1 -0
  97. package/dist/backend/index.js +182 -0
  98. package/dist/backend/index.js.map +1 -0
  99. package/dist/backend/routes.admin.d.ts +12 -0
  100. package/dist/backend/routes.admin.d.ts.map +1 -0
  101. package/dist/backend/routes.admin.js +148 -0
  102. package/dist/backend/routes.admin.js.map +1 -0
  103. package/dist/backend/routes.storefront.d.ts +6 -0
  104. package/dist/backend/routes.storefront.d.ts.map +1 -0
  105. package/dist/backend/routes.storefront.js +72 -0
  106. package/dist/backend/routes.storefront.js.map +1 -0
  107. package/dist/backend/services/blog-asset-references.d.ts +4 -0
  108. package/dist/backend/services/blog-asset-references.d.ts.map +1 -0
  109. package/dist/backend/services/blog-asset-references.js +79 -0
  110. package/dist/backend/services/blog-asset-references.js.map +1 -0
  111. package/dist/backend/services/blog-cache.d.ts +55 -0
  112. package/dist/backend/services/blog-cache.d.ts.map +1 -0
  113. package/dist/backend/services/blog-cache.js +111 -0
  114. package/dist/backend/services/blog-cache.js.map +1 -0
  115. package/dist/backend/services/blog-category-service.d.ts +53 -0
  116. package/dist/backend/services/blog-category-service.d.ts.map +1 -0
  117. package/dist/backend/services/blog-category-service.js +446 -0
  118. package/dist/backend/services/blog-category-service.js.map +1 -0
  119. package/dist/backend/services/blog-language-reference.d.ts +18 -0
  120. package/dist/backend/services/blog-language-reference.d.ts.map +1 -0
  121. package/dist/backend/services/blog-language-reference.js +43 -0
  122. package/dist/backend/services/blog-language-reference.js.map +1 -0
  123. package/dist/backend/services/blog-post-service.d.ts +79 -0
  124. package/dist/backend/services/blog-post-service.d.ts.map +1 -0
  125. package/dist/backend/services/blog-post-service.js +539 -0
  126. package/dist/backend/services/blog-post-service.js.map +1 -0
  127. package/dist/backend/services/blog-settings-resolver.d.ts +36 -0
  128. package/dist/backend/services/blog-settings-resolver.d.ts.map +1 -0
  129. package/dist/backend/services/blog-settings-resolver.js +68 -0
  130. package/dist/backend/services/blog-settings-resolver.js.map +1 -0
  131. package/dist/backend/services/blog-slug-collision.d.ts +35 -0
  132. package/dist/backend/services/blog-slug-collision.d.ts.map +1 -0
  133. package/dist/backend/services/blog-slug-collision.js +84 -0
  134. package/dist/backend/services/blog-slug-collision.js.map +1 -0
  135. package/dist/backend/services/blog-storefront-resolver.d.ts +107 -0
  136. package/dist/backend/services/blog-storefront-resolver.d.ts.map +1 -0
  137. package/dist/backend/services/blog-storefront-resolver.js +492 -0
  138. package/dist/backend/services/blog-storefront-resolver.js.map +1 -0
  139. package/dist/backend/services/blog-tag-service.d.ts +45 -0
  140. package/dist/backend/services/blog-tag-service.d.ts.map +1 -0
  141. package/dist/backend/services/blog-tag-service.js +198 -0
  142. package/dist/backend/services/blog-tag-service.js.map +1 -0
  143. package/dist/backend/services/seed-default-category.d.ts +25 -0
  144. package/dist/backend/services/seed-default-category.d.ts.map +1 -0
  145. package/dist/backend/services/seed-default-category.js +48 -0
  146. package/dist/backend/services/seed-default-category.js.map +1 -0
  147. package/dist/backend/services/seed-roles.d.ts +41 -0
  148. package/dist/backend/services/seed-roles.d.ts.map +1 -0
  149. package/dist/backend/services/seed-roles.js +98 -0
  150. package/dist/backend/services/seed-roles.js.map +1 -0
  151. package/dist/manifest.d.ts +226 -0
  152. package/dist/manifest.d.ts.map +1 -0
  153. package/dist/manifest.js +236 -0
  154. package/dist/manifest.js.map +1 -0
  155. package/dist/migrations/20260506T081055_blog_init.d.ts +33 -0
  156. package/dist/migrations/20260506T081055_blog_init.d.ts.map +1 -0
  157. package/dist/migrations/20260506T081055_blog_init.js +260 -0
  158. package/dist/migrations/20260506T081055_blog_init.js.map +1 -0
  159. package/dist/migrations/20260903T101744_blog_namespace_block_names.d.ts +6 -0
  160. package/dist/migrations/20260903T101744_blog_namespace_block_names.d.ts.map +1 -0
  161. package/dist/migrations/20260903T101744_blog_namespace_block_names.js +58 -0
  162. package/dist/migrations/20260903T101744_blog_namespace_block_names.js.map +1 -0
  163. package/dist/migrations/index.d.ts +34 -0
  164. package/dist/migrations/index.d.ts.map +1 -0
  165. package/dist/migrations/index.js +37 -0
  166. package/dist/migrations/index.js.map +1 -0
  167. package/docs/blog/index.md +199 -0
  168. package/i18n/en.json +166 -0
  169. package/i18n/pl.json +166 -0
  170. package/package.json +108 -0
  171. package/tailwind.css +14 -0
package/i18n/en.json ADDED
@@ -0,0 +1,166 @@
1
+ {
2
+ "common.archive": "Archive",
3
+ "common.cancel": "Cancel",
4
+ "common.create": "Create",
5
+ "common.delete": "Delete",
6
+ "common.edit": "Edit",
7
+ "common.loading": "Loading...",
8
+ "common.loadingInline": "(loading...)",
9
+ "common.moveDown": "Move down",
10
+ "common.moveUp": "Move up",
11
+ "common.publish": "Publish",
12
+ "common.saveContent": "Save content",
13
+ "common.saveDescription": "Save description",
14
+ "common.saveMetadata": "Save metadata",
15
+ "common.saving": "Saving...",
16
+ "common.search": "Search",
17
+ "common.unknown": "(unknown)",
18
+ "common.unpublish": "Unpublish",
19
+ "columns.actions": "Actions",
20
+ "columns.code": "Code",
21
+ "columns.languages": "Languages",
22
+ "columns.name": "Name",
23
+ "columns.slug": "Slug",
24
+ "columns.status": "Status",
25
+ "columns.version": "Version",
26
+ "fields.activeWhenPublished": "Active (storefront-visible when published)",
27
+ "fields.enabledStorefrontVisible": "Enabled (storefront-visible)",
28
+ "fields.mainImageAssetId": "Main image asset id (UUID, optional)",
29
+ "fields.metaDescriptionPerLanguage": "Meta description (per language)",
30
+ "fields.editingLanguage": "Editing language",
31
+ "fields.metaKeywordsPerLanguage": "Meta keywords (per language)",
32
+ "fields.metaTitlePerLanguage": "Meta title (per language)",
33
+ "fields.namePerLanguage": "Name (per language)",
34
+ "fields.slug": "Slug",
35
+ "pagination.next": "Next",
36
+ "pagination.page": "Page {page} / {totalPages}",
37
+ "pagination.previous": "Previous",
38
+ "productStatus.active": "active",
39
+ "productStatus.archived": "archived",
40
+ "productStatus.draft": "draft",
41
+ "sections.lifecycle": "Lifecycle",
42
+ "sections.metadata": "Metadata",
43
+ "sections.relatedPosts": "Related posts",
44
+ "sections.relatedProducts": "Related products",
45
+ "sections.tags": "Tags",
46
+ "state.disabled": "disabled",
47
+ "state.missing": "missing",
48
+ "state.system": "system",
49
+ "status.archived": "archived",
50
+ "status.inactive": "inactive",
51
+ "status.draft": "draft",
52
+ "status.published": "published",
53
+ "categoryEditor.assetPlaceholder": "00000000-0000-...",
54
+ "categoryEditor.backToTree": "Back to tree",
55
+ "categoryEditor.description.default": "Tree node + per-language metadata + optional Page Builder description.",
56
+ "categoryEditor.description.system": "System-protected category. You can edit fields but cannot delete it.",
57
+ "categoryEditor.descriptionTitle": "Description - {language}",
58
+ "categoryEditor.namePlaceholder": "Guides",
59
+ "categoryEditor.slugPlaceholder": "guides",
60
+ "categoryEditor.title.edit": "Edit blog category",
61
+ "categoryEditor.title.new": "New blog category",
62
+ "categoryTree.addChild": "+ Child",
63
+ "categoryTree.cardTitle": "Tree",
64
+ "categoryTree.deleteConfirm": "Delete category \"{slug}\"?",
65
+ "categoryTree.description": "Tree-structured taxonomy. The seeded Default category is system-protected.",
66
+ "categoryTree.empty": "No categories yet.",
67
+ "categoryTree.newCategory": "New category",
68
+ "categoryTree.title": "Blog categories",
69
+ "messages.contentSaved": "Content saved.",
70
+ "messages.descriptionSaved": "Description saved.",
71
+ "messages.relatedPostsUpdated": "Related posts updated ({count} attached).",
72
+ "messages.relatedProductsUpdated": "Related products updated ({count} attached).",
73
+ "messages.saved": "Saved.",
74
+ "messages.statusUpdated": "Status: {status}.",
75
+ "messages.tagsUpdated": "Tags updated ({count} attached).",
76
+ "postEditor.backToList": "Back to list",
77
+ "postEditor.contentTitle": "Content - {language}",
78
+ "postEditor.description.edit": "Author content per language; publish, unpublish, or archive when ready.",
79
+ "postEditor.description.new": "Create the post shell. Page Builder content + lifecycle controls open after the first save.",
80
+ "postEditor.namePlaceholder": "Best cordless trimmers in 2026",
81
+ "postEditor.notPublished": "Not yet published.",
82
+ "postEditor.publishedAt": "Published at: {date}",
83
+ "postEditor.title.edit": "Edit blog post",
84
+ "postEditor.title.new": "New blog post",
85
+ "postList.allStatuses": "All statuses",
86
+ "postList.cardTitle": "Posts",
87
+ "postList.description": "Author and publish editorial content with the same Page Builder used for CMS pages.",
88
+ "postList.empty": "No posts found.",
89
+ "postList.loading": "Loading blog posts...",
90
+ "postList.newPost": "New post",
91
+ "postList.searchPlaceholder": "Search name or slug...",
92
+ "postList.title": "Blog posts",
93
+ "postList.total": "({total} total)",
94
+ "relatedPosts.add": "Add post",
95
+ "relatedPosts.empty": "No related posts.",
96
+ "relatedPosts.loading": "Loading posts...",
97
+ "relatedPosts.moveDown": "Move related post down",
98
+ "relatedPosts.moveUp": "Move related post up",
99
+ "relatedPosts.noCandidates": "No more candidates (all visible posts are either this one or already attached).",
100
+ "relatedPosts.noMatches": "No matching posts.",
101
+ "relatedPosts.searchPlaceholder": "Search name or slug...",
102
+ "relatedPosts.title": "Related posts ({count})",
103
+ "relatedProducts.add": "Add product",
104
+ "relatedProducts.empty": "No related products.",
105
+ "relatedProducts.loading": "Loading catalog products...",
106
+ "relatedProducts.moveDown": "Move related product down",
107
+ "relatedProducts.moveUp": "Move related product up",
108
+ "relatedProducts.noCandidates": "All catalog products are already attached.",
109
+ "relatedProducts.noMatches": "No matching products in the catalog.",
110
+ "relatedProducts.searchPlaceholder": "Search name, slug, or SKU...",
111
+ "relatedProducts.title": "Related products ({count})",
112
+ "relatedProducts.unknown": "(unknown product)",
113
+ "tagList.cardTitle": "Tags",
114
+ "tagList.codeLabel": "Code (URL-safe, globally unique)",
115
+ "tagList.codePlaceholder": "comparison",
116
+ "tagList.createTag": "Create tag",
117
+ "tagList.deleteConfirm.default": "Delete tag \"{code}\"?",
118
+ "tagList.deleteConfirm.inUse": "Tag \"{code}\" is attached to {count} post(s) ({slugs}). The DELETE will be refused; detach first. Proceed anyway to see the error?",
119
+ "tagList.description": "Globally-unique codes used in tag URLs and chip strips. Block-on-delete.",
120
+ "tagList.descriptionLabel": "Description (en-US, optional)",
121
+ "tagList.editTag": "Edit tag",
122
+ "tagList.empty": "No tags yet.",
123
+ "tagList.messages.created": "Created tag \"{code}\".",
124
+ "tagList.messages.deleted": "Deleted tag \"{code}\".",
125
+ "tagList.messages.updated": "Updated tag \"{code}\".",
126
+ "tagList.nameLabel": "Name (en-US)",
127
+ "tagList.newTag": "New tag",
128
+ "tagList.saveTag": "Save tag",
129
+ "tagList.searchPlaceholder": "Search name or code...",
130
+ "tagList.title": "Blog tags",
131
+ "tagList.validation.invalidForm": "Name is required; code must match ^[a-z0-9-]+$ (1-64 chars).",
132
+ "tagList.validation.missingTag": "Tag vanished from the list - reload and try again.",
133
+ "tagPicker.add": "Add tag",
134
+ "tagPicker.empty": "No tags attached yet.",
135
+ "tagPicker.loading": "Loading tags...",
136
+ "tagPicker.moveDown": "Move tag down",
137
+ "tagPicker.moveUp": "Move tag up",
138
+ "tagPicker.noCandidates": "All available tags are already attached.",
139
+ "tagPicker.noMatches": "No matching tags. Create one on the Tags page.",
140
+ "tagPicker.searchPlaceholder": "Search name or code...",
141
+ "tagPicker.title": "Attached tags ({count})",
142
+ "actions.newPost.label": "New blog post",
143
+ "actions.newPost.description": "Write a new blog post",
144
+ "errors.BLOG_SLUG_INVALID": "Blog Slug Invalid.",
145
+ "errors.BLOG_SLUG_TAKEN": "Blog Slug Taken.",
146
+ "errors.BLOG_POST_NOT_FOUND": "Blog Post Not Found.",
147
+ "errors.BLOG_POST_NO_CHANNEL": "Blog Post No Channel.",
148
+ "errors.BLOG_POST_NO_LANGUAGE": "Blog Post No Language.",
149
+ "errors.BLOG_CATEGORY_NOT_FOUND": "Blog Category Not Found.",
150
+ "errors.BLOG_CATEGORY_NO_CHANNEL": "Blog Category No Channel.",
151
+ "errors.BLOG_CATEGORY_CYCLE": "Blog Category Cycle.",
152
+ "errors.BLOG_CATEGORY_PROTECTED": "Blog Category Protected.",
153
+ "errors.BLOG_CATEGORY_IN_USE": "Blog Category In Use.",
154
+ "errors.BLOG_CATEGORY_HAS_CHILDREN": "Blog Category Has Children.",
155
+ "errors.BLOG_TAG_NOT_FOUND": "Blog Tag Not Found.",
156
+ "errors.BLOG_TAG_CODE_TAKEN": "Blog Tag Code Taken.",
157
+ "errors.BLOG_TAG_IN_USE": "Blog Tag In Use.",
158
+ "errors.BLOG_URL_PREFIX_INVALID": "Blog Url Prefix Invalid.",
159
+ "errors.BLOG_URL_PREFIX_RESERVED": "Blog Url Prefix Reserved.",
160
+ "errors.BLOG_DISABLED": "Blog Disabled.",
161
+ "errors.BLOG_ASSET_KIND_MISMATCH": "Blog Asset Kind Mismatch.",
162
+ "errors.BLOG_RELATED_POST_SELF_REFERENCE": "Blog Related Post Self Reference.",
163
+ "nav.blogPosts.label": "Blog Posts",
164
+ "nav.blogCategories.label": "Blog Categories",
165
+ "nav.blogTags.label": "Blog Tags"
166
+ }
package/i18n/pl.json ADDED
@@ -0,0 +1,166 @@
1
+ {
2
+ "common.archive": "Archiwizuj",
3
+ "common.cancel": "Anuluj",
4
+ "common.create": "Utwórz",
5
+ "common.delete": "Usuń",
6
+ "common.edit": "Edytuj",
7
+ "common.loading": "Ładowanie...",
8
+ "common.loadingInline": "(ładowanie...)",
9
+ "common.moveDown": "Przesuń w dół",
10
+ "common.moveUp": "Przesuń w górę",
11
+ "common.publish": "Opublikuj",
12
+ "common.saveContent": "Zapisz treść",
13
+ "common.saveDescription": "Zapisz opis",
14
+ "common.saveMetadata": "Zapisz metadane",
15
+ "common.saving": "Zapisywanie...",
16
+ "common.search": "Szukaj",
17
+ "common.unknown": "(nieznany)",
18
+ "common.unpublish": "Cofnij publikację",
19
+ "columns.actions": "Akcje",
20
+ "columns.code": "Kod",
21
+ "columns.languages": "Języki",
22
+ "columns.name": "Nazwa",
23
+ "columns.slug": "Slug",
24
+ "columns.status": "Status",
25
+ "columns.version": "Wersja",
26
+ "fields.activeWhenPublished": "Aktywny (widoczny w sklepie po publikacji)",
27
+ "fields.enabledStorefrontVisible": "Włączona (widoczna w sklepie)",
28
+ "fields.mainImageAssetId": "ID zasobu obrazu głównego (UUID, opcjonalnie)",
29
+ "fields.editingLanguage": "Język edycji",
30
+ "fields.metaDescriptionPerLanguage": "Opis meta (na język)",
31
+ "fields.metaKeywordsPerLanguage": "Słowa kluczowe meta (na język)",
32
+ "fields.metaTitlePerLanguage": "Tytuł meta (na język)",
33
+ "fields.namePerLanguage": "Nazwa (na język)",
34
+ "fields.slug": "Slug",
35
+ "pagination.next": "Następna",
36
+ "pagination.page": "Strona {page} / {totalPages}",
37
+ "pagination.previous": "Poprzednia",
38
+ "productStatus.active": "aktywny",
39
+ "productStatus.archived": "zarchiwizowany",
40
+ "productStatus.draft": "szkic",
41
+ "sections.lifecycle": "Cykl życia",
42
+ "sections.metadata": "Metadane",
43
+ "sections.relatedPosts": "Powiązane wpisy",
44
+ "sections.relatedProducts": "Powiązane produkty",
45
+ "sections.tags": "Tagi",
46
+ "state.disabled": "wyłączona",
47
+ "state.missing": "brak",
48
+ "state.system": "systemowa",
49
+ "status.archived": "zarchiwizowany",
50
+ "status.inactive": "nieaktywny",
51
+ "status.draft": "szkic",
52
+ "status.published": "opublikowany",
53
+ "categoryEditor.assetPlaceholder": "00000000-0000-...",
54
+ "categoryEditor.backToTree": "Wróć do drzewa",
55
+ "categoryEditor.description.default": "Węzeł drzewa, metadane na język i opcjonalny opis Page Builder.",
56
+ "categoryEditor.description.system": "Kategoria systemowa. Możesz edytować pola, ale nie możesz jej usunąć.",
57
+ "categoryEditor.descriptionTitle": "Opis - {language}",
58
+ "categoryEditor.namePlaceholder": "Poradniki",
59
+ "categoryEditor.slugPlaceholder": "poradniki",
60
+ "categoryEditor.title.edit": "Edytuj kategorię bloga",
61
+ "categoryEditor.title.new": "Nowa kategoria bloga",
62
+ "categoryTree.addChild": "+ Podkategoria",
63
+ "categoryTree.cardTitle": "Drzewo",
64
+ "categoryTree.deleteConfirm": "Usunąć kategorię \"{slug}\"?",
65
+ "categoryTree.description": "Taksonomia w strukturze drzewa. Zasiana kategoria Default jest chroniona systemowo.",
66
+ "categoryTree.empty": "Brak kategorii.",
67
+ "categoryTree.newCategory": "Nowa kategoria",
68
+ "categoryTree.title": "Kategorie bloga",
69
+ "messages.contentSaved": "Treść zapisana.",
70
+ "messages.descriptionSaved": "Opis zapisany.",
71
+ "messages.relatedPostsUpdated": "Powiązane wpisy zaktualizowane ({count} podłączonych).",
72
+ "messages.relatedProductsUpdated": "Powiązane produkty zaktualizowane ({count} podłączonych).",
73
+ "messages.saved": "Zapisano.",
74
+ "messages.statusUpdated": "Status: {status}.",
75
+ "messages.tagsUpdated": "Tagi zaktualizowane ({count} podłączonych).",
76
+ "postEditor.backToList": "Wróć do listy",
77
+ "postEditor.contentTitle": "Treść - {language}",
78
+ "postEditor.description.edit": "Twórz treść na język; publikuj, cofaj publikację lub archiwizuj, gdy będzie gotowa.",
79
+ "postEditor.description.new": "Utwórz szkielet wpisu. Treść Page Builder i kontrolki cyklu życia będą dostępne po pierwszym zapisie.",
80
+ "postEditor.namePlaceholder": "Najlepsze trymery akumulatorowe w 2026",
81
+ "postEditor.notPublished": "Jeszcze nie opublikowano.",
82
+ "postEditor.publishedAt": "Opublikowano: {date}",
83
+ "postEditor.title.edit": "Edytuj wpis na blogu",
84
+ "postEditor.title.new": "Nowy wpis na blogu",
85
+ "postList.allStatuses": "Wszystkie statusy",
86
+ "postList.cardTitle": "Wpisy",
87
+ "postList.description": "Twórz i publikuj treści redakcyjne w tym samym Page Builderze co strony CMS.",
88
+ "postList.empty": "Nie znaleziono wpisów.",
89
+ "postList.loading": "Ładowanie wpisów bloga...",
90
+ "postList.newPost": "Nowy wpis",
91
+ "postList.searchPlaceholder": "Szukaj nazwy lub sluga...",
92
+ "postList.title": "Wpisy bloga",
93
+ "postList.total": "({total} razem)",
94
+ "relatedPosts.add": "Dodaj wpis",
95
+ "relatedPosts.empty": "Brak powiązanych wpisów.",
96
+ "relatedPosts.loading": "Ładowanie wpisów...",
97
+ "relatedPosts.moveDown": "Przesuń powiązany wpis w dół",
98
+ "relatedPosts.moveUp": "Przesuń powiązany wpis w górę",
99
+ "relatedPosts.noCandidates": "Brak kolejnych kandydatów (wszystkie widoczne wpisy to ten wpis albo są już podłączone).",
100
+ "relatedPosts.noMatches": "Brak pasujących wpisów.",
101
+ "relatedPosts.searchPlaceholder": "Szukaj nazwy lub sluga...",
102
+ "relatedPosts.title": "Powiązane wpisy ({count})",
103
+ "relatedProducts.add": "Dodaj produkt",
104
+ "relatedProducts.empty": "Brak powiązanych produktów.",
105
+ "relatedProducts.loading": "Ładowanie produktów katalogu...",
106
+ "relatedProducts.moveDown": "Przesuń powiązany produkt w dół",
107
+ "relatedProducts.moveUp": "Przesuń powiązany produkt w górę",
108
+ "relatedProducts.noCandidates": "Wszystkie produkty katalogu są już podłączone.",
109
+ "relatedProducts.noMatches": "Brak pasujących produktów w katalogu.",
110
+ "relatedProducts.searchPlaceholder": "Szukaj nazwy, sluga lub SKU...",
111
+ "relatedProducts.title": "Powiązane produkty ({count})",
112
+ "relatedProducts.unknown": "(nieznany produkt)",
113
+ "tagList.cardTitle": "Tagi",
114
+ "tagList.codeLabel": "Kod (bezpieczny dla URL, globalnie unikalny)",
115
+ "tagList.codePlaceholder": "porownanie",
116
+ "tagList.createTag": "Utwórz tag",
117
+ "tagList.deleteConfirm.default": "Usunąć tag \"{code}\"?",
118
+ "tagList.deleteConfirm.inUse": "Tag \"{code}\" jest podłączony do {count} wpisów ({slugs}). DELETE zostanie odrzucony; najpierw odłącz tag. Kontynuować, aby zobaczyć błąd?",
119
+ "tagList.description": "Globalnie unikalne kody używane w adresach URL tagów i paskach etykiet. Usuwanie blokowane przy użyciu.",
120
+ "tagList.descriptionLabel": "Opis (en-US, opcjonalnie)",
121
+ "tagList.editTag": "Edytuj tag",
122
+ "tagList.empty": "Brak tagów.",
123
+ "tagList.messages.created": "Utworzono tag \"{code}\".",
124
+ "tagList.messages.deleted": "Usunięto tag \"{code}\".",
125
+ "tagList.messages.updated": "Zaktualizowano tag \"{code}\".",
126
+ "tagList.nameLabel": "Nazwa (en-US)",
127
+ "tagList.newTag": "Nowy tag",
128
+ "tagList.saveTag": "Zapisz tag",
129
+ "tagList.searchPlaceholder": "Szukaj nazwy lub kodu...",
130
+ "tagList.title": "Tagi bloga",
131
+ "tagList.validation.invalidForm": "Nazwa jest wymagana; kod musi pasować do ^[a-z0-9-]+$ (1-64 znaki).",
132
+ "tagList.validation.missingTag": "Tag zniknął z listy - odśwież i spróbuj ponownie.",
133
+ "tagPicker.add": "Dodaj tag",
134
+ "tagPicker.empty": "Nie podłączono jeszcze tagów.",
135
+ "tagPicker.loading": "Ładowanie tagów...",
136
+ "tagPicker.moveDown": "Przesuń tag w dół",
137
+ "tagPicker.moveUp": "Przesuń tag w górę",
138
+ "tagPicker.noCandidates": "Wszystkie dostępne tagi są już podłączone.",
139
+ "tagPicker.noMatches": "Brak pasujących tagów. Utwórz tag na stronie Tagów.",
140
+ "tagPicker.searchPlaceholder": "Szukaj nazwy lub kodu...",
141
+ "tagPicker.title": "Podłączone tagi ({count})",
142
+ "actions.newPost.label": "Nowy wpis na blog",
143
+ "actions.newPost.description": "Napisz nowy wpis na blogu",
144
+ "errors.BLOG_SLUG_INVALID": "Błąd: blog slug invalid.",
145
+ "errors.BLOG_SLUG_TAKEN": "Błąd: blog slug taken.",
146
+ "errors.BLOG_POST_NOT_FOUND": "Błąd: blog post not found.",
147
+ "errors.BLOG_POST_NO_CHANNEL": "Błąd: blog post no channel.",
148
+ "errors.BLOG_POST_NO_LANGUAGE": "Błąd: blog post no language.",
149
+ "errors.BLOG_CATEGORY_NOT_FOUND": "Błąd: blog category not found.",
150
+ "errors.BLOG_CATEGORY_NO_CHANNEL": "Błąd: blog category no channel.",
151
+ "errors.BLOG_CATEGORY_CYCLE": "Błąd: blog category cycle.",
152
+ "errors.BLOG_CATEGORY_PROTECTED": "Błąd: blog category protected.",
153
+ "errors.BLOG_CATEGORY_IN_USE": "Błąd: blog category in use.",
154
+ "errors.BLOG_CATEGORY_HAS_CHILDREN": "Błąd: blog category has children.",
155
+ "errors.BLOG_TAG_NOT_FOUND": "Błąd: blog tag not found.",
156
+ "errors.BLOG_TAG_CODE_TAKEN": "Błąd: blog tag code taken.",
157
+ "errors.BLOG_TAG_IN_USE": "Błąd: blog tag in use.",
158
+ "errors.BLOG_URL_PREFIX_INVALID": "Błąd: blog url prefix invalid.",
159
+ "errors.BLOG_URL_PREFIX_RESERVED": "Błąd: blog url prefix reserved.",
160
+ "errors.BLOG_DISABLED": "Błąd: blog disabled.",
161
+ "errors.BLOG_ASSET_KIND_MISMATCH": "Błąd: blog asset kind mismatch.",
162
+ "errors.BLOG_RELATED_POST_SELF_REFERENCE": "Błąd: blog related post self reference.",
163
+ "nav.blogPosts.label": "Wpisy na blogu",
164
+ "nav.blogCategories.label": "Kategorie bloga",
165
+ "nav.blogTags.label": "Tagi bloga"
166
+ }
package/package.json ADDED
@@ -0,0 +1,108 @@
1
+ {
2
+ "name": "@endora-commerce/mod-blog",
3
+ "version": "0.100.0",
4
+ "type": "module",
5
+ "sideEffects": false,
6
+ "description": "Multi-channel, multi-language blog with categories, tags, and Page Builder posts.",
7
+ "license": "MIT",
8
+ "endora": {
9
+ "type": "module",
10
+ "id": "blog"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/endora-commerce/endora-commerce.git",
15
+ "directory": "packages/modules/blog"
16
+ },
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/manifest.d.ts",
23
+ "default": "./dist/manifest.js"
24
+ },
25
+ "./backend": {
26
+ "types": "./dist/backend/index.d.ts",
27
+ "default": "./dist/backend/index.js"
28
+ },
29
+ "./migrations": {
30
+ "types": "./dist/migrations/index.d.ts",
31
+ "default": "./dist/migrations/index.js"
32
+ },
33
+ "./admin": {
34
+ "types": "./dist/admin/index.d.ts",
35
+ "default": "./dist/admin/index.js"
36
+ },
37
+ "./tailwind.css": "./tailwind.css",
38
+ "./package.json": "./package.json"
39
+ },
40
+ "files": [
41
+ "dist",
42
+ "i18n",
43
+ "docs",
44
+ "tailwind.css"
45
+ ],
46
+ "engines": {
47
+ "node": ">=22.18.0"
48
+ },
49
+ "peerDependencies": {
50
+ "@measured/puck": "^0",
51
+ "@mikro-orm/core": "^6",
52
+ "@mikro-orm/migrations": "^6",
53
+ "@mikro-orm/postgresql": "^6",
54
+ "fastify": "^5",
55
+ "ioredis": "^5",
56
+ "react": "^19",
57
+ "react-router-dom": "^7",
58
+ "zod": "^4",
59
+ "@endora-commerce/contracts": "0.100.0",
60
+ "@endora-commerce/mod-cms": "0.100.0",
61
+ "@endora-commerce/page-builder-core": "0.100.0",
62
+ "@endora-commerce/platform": "0.100.0",
63
+ "@endora-commerce/admin-kit": "0.100.0"
64
+ },
65
+ "peerDependenciesMeta": {
66
+ "@endora-commerce/admin-kit": {
67
+ "optional": true
68
+ },
69
+ "@endora-commerce/mod-cms": {
70
+ "optional": true
71
+ },
72
+ "@measured/puck": {
73
+ "optional": true
74
+ },
75
+ "react": {
76
+ "optional": true
77
+ },
78
+ "react-router-dom": {
79
+ "optional": true
80
+ }
81
+ },
82
+ "devDependencies": {
83
+ "@measured/puck": "^0.20.2",
84
+ "@mikro-orm/core": "^6.6.13",
85
+ "@mikro-orm/migrations": "^6.6.13",
86
+ "@mikro-orm/postgresql": "^6.6.13",
87
+ "@types/node": "^22.9.0",
88
+ "@types/react": "^19.2.14",
89
+ "fastify": "^5.12.5",
90
+ "ioredis": "^5.10.1",
91
+ "react": "^19.2.5",
92
+ "react-router-dom": "^7.18.2",
93
+ "typescript": "^5.9.3",
94
+ "vitest": "^4.1.11",
95
+ "zod": "^4.2.0",
96
+ "@endora-commerce/admin-kit": "0.100.0",
97
+ "@endora-commerce/mod-cms": "0.100.0",
98
+ "@endora-commerce/platform": "0.100.0",
99
+ "@endora-commerce/contracts": "0.100.0",
100
+ "@endora-commerce/page-builder-core": "0.100.0"
101
+ },
102
+ "scripts": {
103
+ "build": "tsc -p tsconfig.build.json && tsc -p tsconfig.ui.json",
104
+ "typecheck": "tsc -p tsconfig.json && tsc -p tsconfig.ui.json --noEmit",
105
+ "lint": "eslint src",
106
+ "test": "vitest run"
107
+ }
108
+ }
package/tailwind.css ADDED
@@ -0,0 +1,14 @@
1
+ /* @endora-commerce/mod-blog — AUTO-GENERATED by `pnpm --filter backend run manifests:generate`.
2
+ *
3
+ * The `@source` directives this package asks its host to scan
4
+ * (`specs/110-instance-repository/contracts/admin-stylesheet-composition.md` R1).
5
+ * They resolve relative to **this file**, so they hold wherever the package is
6
+ * installed — a workspace link here, `node_modules` in a client's instance.
7
+ *
8
+ * The `dist` line is what a published tarball ships and is what an instance
9
+ * scans; the `src` line is inert there and is what keeps `pnpm --filter admin
10
+ * run dev` reading source in this repository. Do not edit: run
11
+ * `pnpm --filter backend run manifests:generate`.
12
+ */
13
+ @source "./dist/admin";
14
+ @source "./src/admin";