simple-module-pagebuilder 0.0.6__tar.gz → 0.0.8__tar.gz

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 (351) hide show
  1. simple_module_pagebuilder-0.0.8/PKG-INFO +374 -0
  2. simple_module_pagebuilder-0.0.8/README.md +350 -0
  3. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/package.json +2 -2
  4. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/board.py +12 -1
  5. simple_module_pagebuilder-0.0.8/pagebuilder/boot.py +158 -0
  6. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/ConfirmDialog.tsx +14 -6
  7. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/DiffSummary.tsx +15 -6
  8. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/NewPageDialog.tsx +83 -29
  9. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/NoteDialog.tsx +12 -5
  10. simple_module_pagebuilder-0.0.8/pagebuilder/components/PageBoard.tsx +162 -0
  11. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/PageBoardCard.tsx +49 -25
  12. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/PageListFilters.tsx +52 -12
  13. simple_module_pagebuilder-0.0.8/pagebuilder/components/PageListRow.tsx +122 -0
  14. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/ScheduledBadge.tsx +6 -1
  15. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/StatusBadge.tsx +6 -4
  16. simple_module_pagebuilder-0.0.8/pagebuilder/components/TranslatePageDialog.tsx +192 -0
  17. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/blocks/Button.tsx +20 -20
  18. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/blocks/Columns.tsx +5 -4
  19. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/blocks/Heading.tsx +14 -14
  20. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/blocks/Image.test.tsx +10 -1
  21. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/blocks/Image.tsx +19 -14
  22. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/blocks/MediaPicker.tsx +16 -12
  23. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/blocks/Spacer.tsx +7 -6
  24. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/blocks/Text.tsx +12 -12
  25. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/editor/BlockOutline.tsx +5 -3
  26. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/editor/NarrowCanvas.tsx +14 -7
  27. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/editor/PageActions.tsx +12 -12
  28. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/editor/PageEditorToolbar.tsx +32 -24
  29. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/editor/PageInspectorDrawer.tsx +78 -28
  30. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/editor/PageSettingsPanel.tsx +19 -15
  31. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/editor/RevisionHistoryPanel.tsx +33 -14
  32. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/editor/SchedulePanel.tsx +9 -7
  33. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/editor/SeoPreview.tsx +8 -7
  34. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/editor/SeoSettingsPanel.tsx +24 -18
  35. simple_module_pagebuilder-0.0.8/pagebuilder/components/editor/TranslationsPanel.tsx +151 -0
  36. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/layoutPuckConfig.tsx +10 -2
  37. simple_module_pagebuilder-0.0.8/pagebuilder/components/localizeConfig.test.ts +94 -0
  38. simple_module_pagebuilder-0.0.8/pagebuilder/components/localizeConfig.ts +113 -0
  39. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/media/MediaFilters.tsx +12 -7
  40. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/media/MediaFolderSidebar.tsx +11 -6
  41. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/media/MediaGrid.tsx +12 -8
  42. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/media/MediaHeader.tsx +5 -2
  43. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/media/MediaUploadQueue.tsx +11 -5
  44. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/media/MediaUsageList.tsx +13 -5
  45. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/puckConfig.test.tsx +23 -0
  46. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/puckConfig.tsx +7 -5
  47. simple_module_pagebuilder-0.0.8/pagebuilder/components/snapshots/ImportPlanSummary.tsx +147 -0
  48. simple_module_pagebuilder-0.0.8/pagebuilder/components/snapshots/SnapshotList.tsx +111 -0
  49. simple_module_pagebuilder-0.0.8/pagebuilder/components/snapshots/UploadBundleDialog.tsx +88 -0
  50. simple_module_pagebuilder-0.0.8/pagebuilder/components/snapshots/planSummary.test.ts +133 -0
  51. simple_module_pagebuilder-0.0.8/pagebuilder/components/snapshots/planSummary.ts +140 -0
  52. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgetCatalog.ts +13 -5
  53. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/accordion-widget.tsx +8 -5
  54. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/alert-widget.tsx +9 -8
  55. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/app-store-badges-widget.tsx +29 -14
  56. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/article-cards-widget.tsx +20 -16
  57. simple_module_pagebuilder-0.0.8/pagebuilder/components/widgets/call-to-action-widget.tsx +86 -0
  58. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/carousel-widget.tsx +12 -7
  59. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/centered-hero-widget.tsx +11 -7
  60. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/colored-action-list-widget.tsx +11 -10
  61. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/column-widget.tsx +14 -13
  62. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/contact-cards-widget.tsx +16 -12
  63. simple_module_pagebuilder-0.0.8/pagebuilder/components/widgets/contact-form-widget.tsx +75 -0
  64. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/container-widget.tsx +20 -19
  65. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/definition-list-widget.tsx +31 -12
  66. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/divider-widget.tsx +16 -11
  67. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/eyebrow-section-widget.tsx +5 -4
  68. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/faq-widget.tsx +15 -15
  69. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/feature-card-widget.tsx +9 -8
  70. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/feature-cards-render.tsx +7 -3
  71. simple_module_pagebuilder-0.0.8/pagebuilder/components/widgets/feature-cards-widget.tsx +139 -0
  72. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/feature-grid-widget.tsx +18 -11
  73. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/feature-showcase-widget.tsx +16 -12
  74. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/gallery-widget.tsx +16 -15
  75. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/grid-widget.tsx +12 -11
  76. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/hero-widget.tsx +28 -28
  77. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/html-widget.tsx +6 -5
  78. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/iframe-widget.tsx +8 -7
  79. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/leaderboard-widget.tsx +22 -15
  80. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/list-widget.tsx +6 -5
  81. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/logo-cloud-widget.tsx +12 -11
  82. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/markdown-widget.tsx +9 -8
  83. simple_module_pagebuilder-0.0.8/pagebuilder/components/widgets/media-object-widget.tsx +180 -0
  84. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/newsletter-widget.tsx +11 -10
  85. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/page-header-widget.tsx +17 -16
  86. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/prose-section-widget.tsx +12 -11
  87. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/quote-widget.tsx +8 -7
  88. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/row-widget.tsx +14 -13
  89. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/section-intro-widget.tsx +13 -12
  90. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/signup-banner-widget.tsx +6 -5
  91. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/simple-action-list-widget.tsx +7 -6
  92. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/site-footer-widget.tsx +22 -12
  93. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/site-header-nav.tsx +9 -2
  94. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/site-header-widget.tsx +48 -24
  95. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/social-banner-widget.tsx +11 -7
  96. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/stats-widget.tsx +15 -11
  97. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/steps-widget.tsx +21 -20
  98. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/story-cards-widget.tsx +20 -16
  99. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/table-widget.tsx +8 -5
  100. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/tabs-widget.tsx +12 -8
  101. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/tags-widget.tsx +12 -9
  102. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/testimonial-widget.tsx +11 -7
  103. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/timeline-widget.tsx +22 -22
  104. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/under-construction-widget.tsx +3 -2
  105. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/video-widget.tsx +13 -12
  106. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/welcome-widget.tsx +5 -4
  107. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/contracts/__init__.py +6 -0
  108. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/contracts/schemas/__init__.py +20 -0
  109. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/contracts/schemas/_pages.py +89 -0
  110. simple_module_pagebuilder-0.0.8/pagebuilder/contracts/schemas/_snapshots.py +59 -0
  111. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/deps.py +8 -0
  112. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/diff.py +15 -10
  113. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/endpoints/api/__init__.py +2 -0
  114. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/endpoints/api/media_detail.py +10 -3
  115. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/endpoints/api/pages.py +53 -9
  116. simple_module_pagebuilder-0.0.8/pagebuilder/endpoints/api/snapshots.py +198 -0
  117. simple_module_pagebuilder-0.0.8/pagebuilder/endpoints/content_views.py +69 -0
  118. simple_module_pagebuilder-0.0.8/pagebuilder/endpoints/public_views.py +281 -0
  119. simple_module_pagebuilder-0.0.8/pagebuilder/endpoints/seo.py +168 -0
  120. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/endpoints/views.py +48 -8
  121. simple_module_pagebuilder-0.0.8/pagebuilder/fields/checkbox-field.tsx +57 -0
  122. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/fields/file-picker/file-gallery.tsx +12 -6
  123. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/fields/file-picker/image-picker-field.tsx +11 -7
  124. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/hooks/useAutosave.ts +4 -1
  125. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/hooks/useEditorForm.ts +17 -3
  126. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/hooks/useMediaDetail.ts +2 -1
  127. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/hooks/useMediaUploads.ts +5 -1
  128. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/hooks/usePageRevisions.ts +4 -2
  129. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/hooks/usePageSchedule.ts +8 -6
  130. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/hooks/usePageWorkflow.ts +13 -11
  131. simple_module_pagebuilder-0.0.8/pagebuilder/hooks/useSnapshots.ts +87 -0
  132. simple_module_pagebuilder-0.0.8/pagebuilder/locales/en.json +1375 -0
  133. simple_module_pagebuilder-0.0.8/pagebuilder/locales.py +101 -0
  134. simple_module_pagebuilder-0.0.8/pagebuilder/media_files.py +259 -0
  135. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/media_service.py +24 -10
  136. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/media_usage.py +14 -8
  137. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/models/__init__.py +12 -0
  138. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/models/_layout.py +3 -3
  139. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/models/_media.py +15 -4
  140. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/models/_page.py +80 -6
  141. simple_module_pagebuilder-0.0.8/pagebuilder/models/_redirect.py +51 -0
  142. simple_module_pagebuilder-0.0.8/pagebuilder/models/_snapshot.py +132 -0
  143. simple_module_pagebuilder-0.0.8/pagebuilder/module.py +278 -0
  144. simple_module_pagebuilder-0.0.8/pagebuilder/pages/ContentImportReview.tsx +117 -0
  145. simple_module_pagebuilder-0.0.8/pagebuilder/pages/ContentSnapshots.tsx +87 -0
  146. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/pages/LayoutEditor.tsx +43 -30
  147. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/pages/MediaDetail.tsx +36 -28
  148. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/pages/MediaLibrary.tsx +16 -14
  149. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/pages/PageEditor.tsx +24 -5
  150. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/pages/PageList.tsx +75 -105
  151. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/pages/PendingReview.tsx +36 -22
  152. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/pages/PublicPage.tsx +25 -0
  153. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/pages/Trash.tsx +33 -27
  154. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/public_claims.py +15 -7
  155. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/redirects.py +27 -5
  156. simple_module_pagebuilder-0.0.8/pagebuilder/scheduler.py +158 -0
  157. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/security.py +69 -30
  158. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/service/__init__.py +64 -14
  159. simple_module_pagebuilder-0.0.8/pagebuilder/service/_translations.py +215 -0
  160. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/service/_trash.py +15 -5
  161. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/service/_workflow.py +29 -14
  162. simple_module_pagebuilder-0.0.8/pagebuilder/settings.py +279 -0
  163. simple_module_pagebuilder-0.0.8/pagebuilder/snapshots/__init__.py +13 -0
  164. simple_module_pagebuilder-0.0.8/pagebuilder/snapshots/apply.py +233 -0
  165. simple_module_pagebuilder-0.0.8/pagebuilder/snapshots/archive.py +202 -0
  166. simple_module_pagebuilder-0.0.8/pagebuilder/snapshots/assets.py +88 -0
  167. simple_module_pagebuilder-0.0.8/pagebuilder/snapshots/blobs.py +131 -0
  168. simple_module_pagebuilder-0.0.8/pagebuilder/snapshots/capture.py +288 -0
  169. simple_module_pagebuilder-0.0.8/pagebuilder/snapshots/format.py +56 -0
  170. simple_module_pagebuilder-0.0.8/pagebuilder/snapshots/media_match.py +117 -0
  171. simple_module_pagebuilder-0.0.8/pagebuilder/snapshots/pages.py +150 -0
  172. simple_module_pagebuilder-0.0.8/pagebuilder/snapshots/plan.py +260 -0
  173. simple_module_pagebuilder-0.0.8/pagebuilder/snapshots/service.py +299 -0
  174. simple_module_pagebuilder-0.0.8/pagebuilder/snapshots/validate.py +194 -0
  175. simple_module_pagebuilder-0.0.8/pagebuilder/tenancy.py +172 -0
  176. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/utils/api.ts +1 -0
  177. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/utils/editorSnapshot.ts +18 -5
  178. simple_module_pagebuilder-0.0.8/pagebuilder/utils/i18n.test.ts +137 -0
  179. simple_module_pagebuilder-0.0.8/pagebuilder/utils/i18n.ts +180 -0
  180. simple_module_pagebuilder-0.0.8/pagebuilder/utils/locale.ts +41 -0
  181. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/utils/mediaApi.ts +10 -2
  182. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/utils/pagesApi.ts +31 -5
  183. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/utils/request.ts +16 -4
  184. simple_module_pagebuilder-0.0.8/pagebuilder/utils/slugify.test.ts +46 -0
  185. simple_module_pagebuilder-0.0.8/pagebuilder/utils/slugify.ts +52 -0
  186. simple_module_pagebuilder-0.0.8/pagebuilder/utils/snapshotsApi.ts +125 -0
  187. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/utils/types.ts +40 -0
  188. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pyproject.toml +15 -8
  189. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/conftest.py +45 -46
  190. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/db_fixture.py +6 -11
  191. simple_module_pagebuilder-0.0.8/tests/locale_fixture.py +48 -0
  192. simple_module_pagebuilder-0.0.8/tests/page_helpers.py +33 -0
  193. simple_module_pagebuilder-0.0.8/tests/pg_support.py +54 -0
  194. simple_module_pagebuilder-0.0.8/tests/snapshot_fixture.py +83 -0
  195. simple_module_pagebuilder-0.0.8/tests/tenant_app.py +64 -0
  196. simple_module_pagebuilder-0.0.8/tests/tenant_fixture.py +42 -0
  197. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_admin_list_view.py +31 -0
  198. simple_module_pagebuilder-0.0.8/tests/test_hreflang_and_sitemap.py +163 -0
  199. simple_module_pagebuilder-0.0.8/tests/test_i18n.py +77 -0
  200. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_image_processing.py +9 -22
  201. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_media_files.py +14 -18
  202. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_media_security.py +3 -15
  203. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_module.py +2 -2
  204. simple_module_pagebuilder-0.0.8/tests/test_multilingual.py +186 -0
  205. simple_module_pagebuilder-0.0.8/tests/test_page_translations.py +222 -0
  206. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_public_claims.py +68 -10
  207. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_public_routes.py +21 -4
  208. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_public_viewer.py +18 -0
  209. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_scheduled_publish.py +3 -11
  210. simple_module_pagebuilder-0.0.8/tests/test_scheduler_stop.py +81 -0
  211. simple_module_pagebuilder-0.0.8/tests/test_scheduler_tenancy.py +114 -0
  212. simple_module_pagebuilder-0.0.8/tests/test_settings_source.py +126 -0
  213. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_site_layout.py +2 -2
  214. simple_module_pagebuilder-0.0.8/tests/test_snapshot_apply.py +246 -0
  215. simple_module_pagebuilder-0.0.8/tests/test_snapshot_apply_media.py +107 -0
  216. simple_module_pagebuilder-0.0.8/tests/test_snapshot_archive.py +299 -0
  217. simple_module_pagebuilder-0.0.8/tests/test_snapshot_assets.py +70 -0
  218. simple_module_pagebuilder-0.0.8/tests/test_snapshot_blobs.py +64 -0
  219. simple_module_pagebuilder-0.0.8/tests/test_snapshot_capture.py +252 -0
  220. simple_module_pagebuilder-0.0.8/tests/test_snapshot_media_match.py +96 -0
  221. simple_module_pagebuilder-0.0.8/tests/test_snapshot_models.py +30 -0
  222. simple_module_pagebuilder-0.0.8/tests/test_snapshot_multilingual.py +238 -0
  223. simple_module_pagebuilder-0.0.8/tests/test_snapshot_page_payload.py +65 -0
  224. simple_module_pagebuilder-0.0.8/tests/test_snapshot_plan.py +288 -0
  225. simple_module_pagebuilder-0.0.8/tests/test_snapshot_validate.py +138 -0
  226. simple_module_pagebuilder-0.0.8/tests/test_snapshot_views.py +73 -0
  227. simple_module_pagebuilder-0.0.8/tests/test_snapshots_api.py +184 -0
  228. simple_module_pagebuilder-0.0.8/tests/test_tenancy_blobs.py +42 -0
  229. simple_module_pagebuilder-0.0.8/tests/test_tenancy_core.py +177 -0
  230. simple_module_pagebuilder-0.0.8/tests/test_tenancy_isolation.py +85 -0
  231. simple_module_pagebuilder-0.0.8/tests/test_tenancy_media.py +245 -0
  232. simple_module_pagebuilder-0.0.8/tests/test_tenancy_public.py +88 -0
  233. simple_module_pagebuilder-0.0.8/tests/test_tenancy_routes.py +64 -0
  234. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tsconfig.json +1 -0
  235. simple_module_pagebuilder-0.0.6/PKG-INFO +0 -184
  236. simple_module_pagebuilder-0.0.6/README.md +0 -162
  237. simple_module_pagebuilder-0.0.6/pagebuilder/components/PageBoard.tsx +0 -123
  238. simple_module_pagebuilder-0.0.6/pagebuilder/components/widgets/call-to-action-widget.tsx +0 -83
  239. simple_module_pagebuilder-0.0.6/pagebuilder/components/widgets/contact-form-widget.tsx +0 -69
  240. simple_module_pagebuilder-0.0.6/pagebuilder/components/widgets/feature-cards-widget.tsx +0 -133
  241. simple_module_pagebuilder-0.0.6/pagebuilder/components/widgets/media-object-widget.tsx +0 -180
  242. simple_module_pagebuilder-0.0.6/pagebuilder/endpoints/public_views.py +0 -162
  243. simple_module_pagebuilder-0.0.6/pagebuilder/endpoints/seo.py +0 -106
  244. simple_module_pagebuilder-0.0.6/pagebuilder/fields/checkbox-field.tsx +0 -22
  245. simple_module_pagebuilder-0.0.6/pagebuilder/media_files.py +0 -128
  246. simple_module_pagebuilder-0.0.6/pagebuilder/models/_redirect.py +0 -28
  247. simple_module_pagebuilder-0.0.6/pagebuilder/module.py +0 -290
  248. simple_module_pagebuilder-0.0.6/pagebuilder/settings.py +0 -164
  249. simple_module_pagebuilder-0.0.6/pagebuilder/utils/slugify.ts +0 -9
  250. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/.gitignore +0 -0
  251. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/__init__.py +0 -0
  252. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/blockRegistry.test.ts +0 -0
  253. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/blockRegistry.ts +0 -0
  254. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/lazyBlock.tsx +0 -0
  255. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/media/types.ts +0 -0
  256. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/migrateContent.test.ts +0 -0
  257. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/migrateContent.ts +0 -0
  258. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgetCatalog.test.tsx +0 -0
  259. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/_internal/accent-text.tsx +0 -0
  260. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/_internal/disclosure-chevron.tsx +0 -0
  261. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/_internal/eyebrow-split-section.tsx +0 -0
  262. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/_internal/link-arrow.tsx +0 -0
  263. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/_internal/rich-text.tsx +0 -0
  264. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/_internal/solid-icons.tsx +0 -0
  265. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/_shared/background-media.tsx +0 -0
  266. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/_shared/content-media.tsx +0 -0
  267. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/_shared/cta-button.tsx +0 -0
  268. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/_shared/empty-placeholder.tsx +0 -0
  269. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/_shared/eyebrow-text.tsx +0 -0
  270. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/_shared/heading.tsx +0 -0
  271. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/_shared/image-srcset.ts +0 -0
  272. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/_shared/index.ts +0 -0
  273. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/_shared/mask.ts +0 -0
  274. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/_shared/section.tsx +0 -0
  275. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/_shared/social-icon.tsx +0 -0
  276. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/_shared/text-link.tsx +0 -0
  277. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/article-cards-render.tsx +0 -0
  278. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/call-to-action-render.tsx +0 -0
  279. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/call-to-action-styles.ts +0 -0
  280. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/contact-form-render.tsx +0 -0
  281. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/divider-widget.test.tsx +0 -0
  282. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/faq-render.tsx +0 -0
  283. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/feature-cards-styles.ts +0 -0
  284. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/hero-widget-props.ts +0 -0
  285. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/media-object-layout.ts +0 -0
  286. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/media-object-render.tsx +0 -0
  287. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/media-object-text.tsx +0 -0
  288. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/timeline-layout.ts +0 -0
  289. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/components/widgets/timeline-render.tsx +0 -0
  290. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/contracts/events.py +0 -0
  291. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/contracts/schemas/_layout.py +0 -0
  292. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/contracts/schemas/_media.py +0 -0
  293. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/conversion/blocks-to-html.test.ts +0 -0
  294. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/conversion/blocks-to-html.ts +0 -0
  295. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/conversion/index.ts +0 -0
  296. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/conversion/types.ts +0 -0
  297. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/endpoints/__init__.py +0 -0
  298. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/endpoints/api/_deps.py +0 -0
  299. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/endpoints/api/layout.py +0 -0
  300. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/endpoints/api/revisions.py +0 -0
  301. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/endpoints/api/uploads.py +0 -0
  302. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/endpoints/api/workflow.py +0 -0
  303. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/fields/file-picker/index.ts +0 -0
  304. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/fields/file-picker/types.ts +0 -0
  305. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/fields/index.ts +0 -0
  306. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/fields/media-adapter.ts +0 -0
  307. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/hooks/useIsNarrow.ts +0 -0
  308. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/hooks/usePendingDialog.ts +0 -0
  309. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/layout_service.py +0 -0
  310. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/media_images.py +0 -0
  311. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/media_queries.py +0 -0
  312. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/models/_base.py +0 -0
  313. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/permissions.py +0 -0
  314. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/py.typed +0 -0
  315. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/service/_common.py +0 -0
  316. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/service/_revisions.py +0 -0
  317. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/services.py +0 -0
  318. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/static/widgets-base.css +0 -0
  319. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/translation/apply.ts +0 -0
  320. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/translation/extract.ts +0 -0
  321. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/translation/index.ts +0 -0
  322. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/translation/translatable-fields.ts +0 -0
  323. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/translation/translation.test.ts +0 -0
  324. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/utils/blockOutline.test.ts +0 -0
  325. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/utils/blockOutline.ts +0 -0
  326. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/utils/datetime.ts +0 -0
  327. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/utils/decorative-image.ts +0 -0
  328. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/utils/markdown.ts +0 -0
  329. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/utils/measure.ts +0 -0
  330. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/utils/mediaFormat.ts +0 -0
  331. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/utils/parse-list.ts +0 -0
  332. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/utils/request.test.ts +0 -0
  333. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/pagebuilder/utils/widgetUtils.ts +0 -0
  334. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_approval_workflow.py +0 -0
  335. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_auth_gating.py +0 -0
  336. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_csrf.py +0 -0
  337. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_draft_preview.py +0 -0
  338. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_media_detail.py +0 -0
  339. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_media_usage_escaping.py +0 -0
  340. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_page_templates.py +0 -0
  341. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_pages_api.py +0 -0
  342. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_pages_search.py +0 -0
  343. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_public_view_headers.py +0 -0
  344. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_redirects.py +0 -0
  345. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_revision_notes_and_diff.py +0 -0
  346. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_revisions_api.py +0 -0
  347. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_seo_meta.py +0 -0
  348. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_sitemap_robots.py +0 -0
  349. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_trash.py +0 -0
  350. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_trash_preconditions.py +0 -0
  351. {simple_module_pagebuilder-0.0.6 → simple_module_pagebuilder-0.0.8}/tests/test_uploads_api.py +0 -0
@@ -0,0 +1,374 @@
1
+ Metadata-Version: 2.5
2
+ Name: simple_module_pagebuilder
3
+ Version: 0.0.8
4
+ Summary: Drag-and-drop visual page builder for simple_module apps
5
+ Project-URL: Repository, https://github.com/antosubash/simple_module_python_modules
6
+ Author-email: Anto Subash <antosubash@live.com>
7
+ License-Expression: MIT
8
+ Keywords: cms,pagebuilder,puck,simple-module
9
+ Requires-Python: >=3.12
10
+ Requires-Dist: pillow>=10.0
11
+ Requires-Dist: pydantic-settings>=2.0
12
+ Requires-Dist: simple-module-core<0.1,>=0.0.35
13
+ Requires-Dist: simple-module-db<0.1,>=0.0.35
14
+ Requires-Dist: simple-module-hosting<0.1,>=0.0.35
15
+ Requires-Dist: simple-module-inertia<0.1,>=0.0.35
16
+ Requires-Dist: simple-module-settings<0.1,>=0.0.35
17
+ Requires-Dist: sqlalchemy>=2.0
18
+ Requires-Dist: sqlmodel>=0.0.21
19
+ Provides-Extra: dev
20
+ Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
21
+ Requires-Dist: pytest>=8.0; extra == 'dev'
22
+ Requires-Dist: simple-module-test<0.1,>=0.0.35; extra == 'dev'
23
+ Description-Content-Type: text/markdown
24
+
25
+ # simple_module_pagebuilder
26
+
27
+ Drag-and-drop visual page builder for [simple_module](https://github.com/antosubash/simple_module_python)
28
+ apps. Pages are composed from a reusable block library using
29
+ [Puck](https://puckeditor.com) and stored as JSON; published pages are served
30
+ at `/p/{slug}`.
31
+
32
+ ## Features
33
+
34
+ - **Visual editor** — Puck-based drag-and-drop with a block library (heading,
35
+ text, image, button, columns, spacer) and a media picker.
36
+ - **Site layout** — a shared header/footer layout, edited the same way, wrapped
37
+ around every public page.
38
+ - **Media library** — uploads with magic-byte content sniffing, folder
39
+ organisation, and server-generated WebP thumbnails.
40
+ - **Revisions** — every status transition snapshots the page, with a diff view
41
+ and restore-as-draft.
42
+ - **Approval workflow** — edit → submit for review → approve / reject, gated by
43
+ three separate permissions.
44
+ - **Scheduled publishing** — set `publish_at` / `unpublish_at`; a background
45
+ poller flips status at the due time.
46
+ - **SEO** — per-page meta description, canonical URL, OG image, JSON-LD, plus
47
+ `/sitemap.xml` and `/robots.txt`.
48
+ - **Multilingual content** — a page can exist in several languages, each with
49
+ its own slug, draft and approval state. See below.
50
+ - **Content snapshots** — capture the whole site, download or upload it as a
51
+ `.zip`, and restore behind an approval gate. See below.
52
+
53
+ ## Installation
54
+
55
+ ```bash
56
+ uv add simple_module_pagebuilder
57
+ ```
58
+
59
+ Then add it to your host's `pyproject.toml` dependencies. The module is
60
+ discovered at boot through the `simple_module` entry point — no registration
61
+ code required.
62
+
63
+ Its frontend ships inside the wheel. Pull its JS dependencies into your host's
64
+ client app and regenerate the page manifest with:
65
+
66
+ ```bash
67
+ smpy host sync-js-deps --host-client-app=host/client_app
68
+ smpy host gen-pages --host-dir=host/client_app
69
+ ```
70
+
71
+ ## Usage
72
+
73
+ Once installed and migrated, sign in and open `/pagebuilder`:
74
+
75
+ 1. **Create a page** — `/pagebuilder/new`. Give it a title; the slug is derived
76
+ from it and stays editable.
77
+ 2. **Compose it** — drag blocks from the Puck sidebar. Images come from the
78
+ media library, which uploads and thumbnails them for you.
79
+ 3. **Publish it** — publish directly with `pagebuilder.publish`, or submit for
80
+ review if your role only carries `pagebuilder.edit`. Reviewers work through
81
+ `/pagebuilder/pending`.
82
+ 4. **Schedule it** — set `publish_at` / `unpublish_at` instead of publishing
83
+ now, and the poller flips the status at the due time.
84
+ 5. **View it** — the page is live at `/p/{slug}`, wrapped in the site layout
85
+ from `/pagebuilder/layout`.
86
+
87
+ Every transition writes a revision, so `/pagebuilder/{id}/edit` can compare any
88
+ two revisions and restore either one as a draft.
89
+
90
+ ## Contributing blocks from another module
91
+
92
+ A module ships Puck blocks by calling `registerPuckBlocks` from its
93
+ `puck-blocks.ts`; the host imports every module's registration eagerly at app
94
+ start, so the registry is populated before the first render.
95
+
96
+ Because registration is eager, a block that statically imports a heavy render
97
+ component puts that component's whole dependency graph in the entry chunk —
98
+ on every page of the site, for every visitor. Measured on a consuming site, a
99
+ map block's static import put maplibre-gl (1 MB minified, 62% of the bundle)
100
+ in front of visitors who never opened the map. Register heavy blocks with
101
+ `lazyBlock` instead, which keeps fields and defaults eager but loads the
102
+ component the first time a page actually renders the block:
103
+
104
+ ```tsx
105
+ import { lazyBlock } from '@simple-module-py/pagebuilder/pagebuilder/components/lazyBlock';
106
+ import { registerPuckBlocks } from '@simple-module-py/pagebuilder/pagebuilder/components/blockRegistry';
107
+
108
+ registerPuckBlocks({
109
+ blocks: {
110
+ AtlasMap: lazyBlock(
111
+ () => import('./components/AtlasMap').then((m) => m.AtlasMapEmbed),
112
+ { label: 'Atlas map', fields: { /* … */ }, defaultProps: { /* … */ } },
113
+ (props) => <div className={heightClass[props.height]} aria-busy="true" />,
114
+ ),
115
+ },
116
+ });
117
+ ```
118
+
119
+ Light blocks (text, cards, lists) can keep their static imports — the split
120
+ only pays for itself when the component drags in something big.
121
+
122
+ ## Migrations
123
+
124
+ This module ships **no** migrations — that is the framework convention. Its
125
+ SQLModel tables are picked up by your host's `build_module_metadata()`, so
126
+ after installing it run:
127
+
128
+ ```bash
129
+ make migration msg="add pagebuilder"
130
+ make migrate
131
+ ```
132
+
133
+ Add `branch_labels = ("pagebuilder",)` to that first generated revision so the
134
+ module can later be removed on its own with
135
+ `alembic downgrade pagebuilder@base`.
136
+
137
+ ## Permissions
138
+
139
+ | Permission | Grants |
140
+ |---|---|
141
+ | `pagebuilder.edit` | Draft, save, submit for review, restore a revision |
142
+ | `pagebuilder.publish` | Publish and unpublish directly |
143
+ | `pagebuilder.approve` | Approve or reject a submitted page |
144
+
145
+ `DEFAULT_ROLE_MAP` in `pagebuilder.permissions` suggests three roles —
146
+ `pagebuilder_editor`, `pagebuilder_publisher`, `pagebuilder_approver` —
147
+ cumulatively mapped to those permissions.
148
+
149
+ ## Settings
150
+
151
+ Stored in the database and edited under **Settings → PageBuilder**. There is
152
+ no `SM_PAGEBUILDER_*` environment variable: the settings class drops every env
153
+ source, so a value can only come from the store or from the default below.
154
+ Headless deployments write them with `scripts/set_setting.py`.
155
+
156
+ Fields marked ● are read once while the app boots — they decide which routes
157
+ are mounted and what the auth layer exempts — so changing one needs a restart.
158
+ The Settings screen says so next to the input.
159
+
160
+ | Setting | Default | Purpose |
161
+ |---|---|---|
162
+ | `public_route_prefix` ● | `/p` | Where published pages are served |
163
+ | `content_locales` ● | `["en"]` | Languages a page may be authored in |
164
+ | `default_content_locale` ● | `en` | The language served at the unprefixed URL |
165
+ | `requires_auth` | `true` | Gate the admin surface behind authentication |
166
+ | `csrf_protect` | `true` | Require a CSRF token on mutating admin requests |
167
+ | `media_root` ● | `var/pagebuilder/media` | Upload storage directory |
168
+ | `media_url_prefix` ● | `/media/pagebuilder` | Public URL prefix for uploads |
169
+ | `media_max_bytes` | `10485760` | Per-upload size ceiling |
170
+ | `media_thumbnail_widths` | `320,640,1280,1920` | Widths generated as WebP |
171
+ | `media_webp_quality` | `82` | WebP encoder quality |
172
+ | `snapshot_root` | `var/pagebuilder/snapshots` | Snapshot + blob storage directory |
173
+ | `snapshot_max_upload_bytes` | `209715200` | Ceiling on an uploaded bundle (200 MB) |
174
+ | `snapshot_max_extracted_bytes` | `1073741824` | Ceiling on what a bundle may expand to (1 GB) |
175
+ | `public_csp` | see `settings.py` | CSP header on public pages |
176
+ | `public_cache_max_age` | `60` | `max-age` on public pages |
177
+ | `public_base_url` | `None` | Absolute base for canonical URLs and the sitemap |
178
+ | `site_name` | `None` | OpenGraph site name |
179
+ | `sitemap_enabled` ● | `true` | Serve `/sitemap.xml` |
180
+ | `robots_enabled` ● | `true` | Serve `/robots.txt` |
181
+ | `scheduler_enabled` ● | `true` | Run the scheduled publish/unpublish poller |
182
+ | `scheduler_interval_seconds` ● | `30` | Poll interval |
183
+
184
+ ## Routes
185
+
186
+ **Admin views** (under `/pagebuilder`): `/`, `/new`, `/{page_id}/edit`,
187
+ `/pending`, `/layout`, `/media`, `/trash`, `/content`, `/content/review`.
188
+
189
+ **Admin API** (under `/api/pagebuilder`): pages CRUD, workflow transitions,
190
+ revisions and diffs, layout and its revisions, uploads, snapshots and imports.
191
+
192
+ **Public**: `/p/{slug}`, `/{locale}/p/{slug}` (one mount per non-default
193
+ content locale), `/sitemap.xml`, `/robots.txt`.
194
+
195
+ ## Multilingual content
196
+
197
+ Off by default: with one content locale nothing changes, no locale-prefixed
198
+ route is mounted, and every existing URL is exactly what it was.
199
+
200
+ ```bash
201
+ python scripts/set_setting.py pagebuilder \
202
+ content_locales '["en","de","fr"]' default_content_locale en
203
+ ```
204
+
205
+ Or on the Settings screen, which is the same store. Either way it takes effect
206
+ at the next boot: the languages decide how many public routers are mounted.
207
+
208
+ These are *content* languages, deliberately separate from the host's
209
+ `SM_I18N_SUPPORTED_LOCALES`, which decides what language the admin console
210
+ speaks. A site can translate its content without translating its console, or
211
+ the reverse.
212
+
213
+ **A translation is an ordinary page.** It has its own row, slug, draft,
214
+ revisions, schedule and approval state; what makes two pages translations of
215
+ each other is a shared `translation_group`. Publishing one never publishes
216
+ another, and there is no "master" — deleting the English page leaves the German
217
+ one intact.
218
+
219
+ **Addresses.** The default locale keeps the bare prefix (`/p/about`) so adding
220
+ a language strands no link that already exists; every other locale is prefixed
221
+ (`/de/p/about`). `/{default}/p/{slug}` permanently redirects to the bare form,
222
+ so one document never answers at two URLs. Slugs are unique *per language*, so
223
+ `/p/about` and `/de/p/about` can both be "about".
224
+
225
+ **Discovery.** A published page emits `hreflang` links for every published
226
+ counterpart plus `x-default`, and the sitemap lists each language at its own
227
+ address with `xhtml:link` alternates — so a crawler finds a translation nothing
228
+ links to yet.
229
+
230
+ **Authoring.** Two ways in, because "we need this in German" is a thought an
231
+ author has while scanning the page list as often as while editing the page:
232
+
233
+ * the page list's **Translate** row action duplicates the page into a language
234
+ it does not have yet — it asks the server which languages are still free
235
+ (the list is paged, so a counterpart may be on a page the browser has not
236
+ loaded), offers a *Copy this page's content* choice, and opens the editor on
237
+ the result;
238
+ * the editor's **Languages** tab lists the site's locales, shows which ones the
239
+ page exists in and where each serves, and starts the ones it does not.
240
+
241
+ Both call `POST /api/pagebuilder/pages/{id}/translations`. A new translation inherits
242
+ the layout, nav membership and the source's title (untranslated, so what still
243
+ needs doing is obvious), starts as a draft, and never inherits `canonical_url`.
244
+ Its breadcrumb parent is the parent's own counterpart, so a trail never crosses
245
+ languages. A page's own language is fixed for its lifetime — moving one would
246
+ strand its slug and orphan the redirect pointing at it.
247
+
248
+ ## The editor's language
249
+
250
+ Separate from the page's. The section above is about what the *site*
251
+ publishes; this is about what the *editor* speaks, and the two are configured
252
+ in different places — `content_locales` for one, the host's
253
+ `SM_I18N_SUPPORTED_LOCALES` for the other.
254
+
255
+ Every editor string lives in `pagebuilder/locales/en.json`, registered by
256
+ `PagebuilderModule.locale_dirs()` under the `pagebuilder` namespace, so a key
257
+ reads `pagebuilder.<section>.<name>` in the merged catalogue the host ships to
258
+ the browser. Add a language by adding `pagebuilder/locales/<tag>.json` with the
259
+ same shape; the framework's `SM013`–`SM016` diagnostics report a file that has
260
+ drifted from the default.
261
+
262
+ The frontend derives its key tree from that JSON at compile time —
263
+ `pagebuilder/utils/i18n.ts` — rather than from the framework's generated
264
+ `keys`, which only carries the namespaces of modules that live in the
265
+ framework's own monorepo. The upshot is that `tsc` rejects a key the catalogue
266
+ does not define, and `pagebuilder/utils/i18n.test.ts` rejects an entry nothing
267
+ references, a plural missing a form, and a placeholder nothing fills.
268
+
269
+ **Block labels are keys, resolved at the screen.** A Puck config is a
270
+ module-scope constant — the palette is assembled before the app has rendered
271
+ anything — so a block cannot call a hook where its labels are written. What it
272
+ holds instead is the key, and `components/localizeConfig.ts` resolves the whole
273
+ assembled config once inside `PageEditor` and `LayoutEditor`: component labels,
274
+ field labels (including the ones nested in an `array` or `object` field),
275
+ select options, category titles and the viewport switcher. Because it walks the
276
+ *assembled* config, a block another module registered is localized on the same
277
+ pass, provided that module's labels are catalogue keys too.
278
+
279
+ `defaultProps` stay literal on purpose. They are the seed *content* a block is
280
+ inserted with and are then saved into the document, so translating them at
281
+ render time would rewrite what a visitor is served in whatever language the
282
+ author happened to be working in.
283
+
284
+ ## Multi-tenancy
285
+
286
+ Every pagebuilder table is tenant-owned (the framework's `MultiTenantMixin`),
287
+ so one host can run several sites. Slugs, redirects, media filenames and the
288
+ one-pending-import rule are unique **per tenant**, and each tenant has its own
289
+ site layout, media directory (`<media_root>/<tenant>/`) and snapshot blob store.
290
+
291
+ Which tenant a request acts for depends on the host:
292
+
293
+ - **Single-tenant** (`multi_tenant` off) — everything is tenant `"default"`,
294
+ where the migration also files every row that predates tenancy. A host that
295
+ pins `default_tenant` to anything else is refused at startup.
296
+ - **Multi-tenant** (`multi_tenant` on) — the tenant the framework resolved.
297
+ With the `tenants` module, anonymous visitors are resolved by subdomain
298
+ (`subdomain_base`); members by their membership. A public page, sitemap or
299
+ media request with no tenant answers 404 — the same as an unknown slug — and
300
+ an editor with no tenant gets 403. Custom domains are not supported yet.
301
+
302
+ The scheduler publishes due pages tenant by tenant, each in its own session.
303
+ Requires framework `0.0.35` or later, and the host migration that adds
304
+ `tenant_id` (`make migration` picks it up like any other model change).
305
+
306
+ ## Content snapshots
307
+
308
+ **Content › Import / Export** captures the site as a restore point. Every entry
309
+ in that list is a snapshot; they differ only in where they came from —
310
+ `manual` (you took it), `upload` (a bundle from another host), or `pre_restore`
311
+ (taken automatically before a restore).
312
+
313
+ **What a snapshot holds:** every non-trashed page including templates, page
314
+ redirects, the site layout, and the media library's files.
315
+
316
+ **What it deliberately does not hold:**
317
+
318
+ - *Branding.* `pagebuilder` has no Python dependency on the branding module,
319
+ and capture runs in-process. Bundling three fields would force every
320
+ pagebuilder host to install branding for a feature unrelated to it. Re-pick
321
+ the colour and design pack in Settings → Branding after restoring onto a
322
+ fresh host.
323
+ - *Another module's content*, news articles included, for the same reason.
324
+ - *Trashed pages, revision history and audit trails.* A snapshot is the site as
325
+ it stands, not its past; restoring history from another host would fabricate
326
+ an audit trail that never happened here.
327
+
328
+ A restore also does **not** write a `PageRevision` per page, unlike every other
329
+ mutation path. The `pre_restore` snapshot already holds the previous state of
330
+ every page, once, with media deduplicated by digest — a revision row per page
331
+ would duplicate that whole before-state and recover nothing extra. The restore
332
+ itself stays audited: who approved it, when, from which snapshot, and the plan
333
+ they were shown.
334
+
335
+ **Restoring is staged, never immediate.** Choosing Restore computes a plan —
336
+ what is created, what is overwritten, what is unchanged — and parks it for
337
+ approval. Taking a snapshot, uploading and staging need `pagebuilder.publish`;
338
+ only `pagebuilder.approve` can apply one. One import is pending at a time,
339
+ because a plan computed against content that has since changed no longer
340
+ describes what applying would do.
341
+
342
+ **Restoring is reversible and never deletes.** Applying takes a `pre_restore`
343
+ snapshot first, so the previous state is one restore away. A page live on the
344
+ site but absent from the bundle is left alone and reported in the plan.
345
+
346
+ **Portability.** Media URLs embed a host-local filename, so bundled content
347
+ stores `asset://<name>` sentinels instead and they resolve to whatever URL each
348
+ host assigns. `Page.parent_id` and `PageRedirect.page_id` travel as slugs and
349
+ are resolved in a second pass, since a parent may sort after its child and a
350
+ redirect may target a page the same restore creates.
351
+
352
+ **Languages.** A bundle identifies a page by `(locale, slug)`, not by slug
353
+ alone — the same pair the database is unique on — so a site publishing `about`
354
+ in two languages captures and restores as two pages rather than one silently
355
+ overwriting the other. Each document carries its `locale` and its
356
+ `translation_group`, so counterparts stay linked as one document after a
357
+ restore. A parent and a redirect both resolve within their own language, so a
358
+ breadcrumb or a retired address never crosses into another one.
359
+
360
+ Pages in a language the target host does not publish are restored and kept, not
361
+ discarded: nothing routes `/fr/p/…` until `fr` is added to `content_locales`,
362
+ at which point they simply start serving. Bundles written before languages
363
+ existed (`format_version` 1) still restore — every page in one is read as the
364
+ default content locale, which is what the schema guaranteed at the time.
365
+
366
+ ## Contracts
367
+
368
+ DTOs other modules may depend on are exported from `pagebuilder.contracts`.
369
+ Everything else in the package is internal and may change without a major
370
+ version bump.
371
+
372
+ ## Licence
373
+
374
+ MIT