@qwickapps/react-framework 1.3.4 → 1.4.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 (325) hide show
  1. package/README.md +1688 -2
  2. package/dist/__tests__/schemas/transformers/MockSerializableComponent.d.ts +66 -0
  3. package/dist/__tests__/schemas/transformers/MockSerializableComponent.d.ts.map +1 -0
  4. package/dist/components/ErrorBoundary.d.ts +7 -0
  5. package/dist/components/ErrorBoundary.d.ts.map +1 -1
  6. package/dist/components/Html.d.ts +28 -18
  7. package/dist/components/Html.d.ts.map +1 -1
  8. package/dist/components/Logo.d.ts +12 -35
  9. package/dist/components/Logo.d.ts.map +1 -1
  10. package/dist/components/Markdown.d.ts +18 -13
  11. package/dist/components/Markdown.d.ts.map +1 -1
  12. package/dist/components/QwickApp.d.ts +16 -3
  13. package/dist/components/QwickApp.d.ts.map +1 -1
  14. package/dist/components/QwickIcon.d.ts +23 -0
  15. package/dist/components/QwickIcon.d.ts.map +1 -0
  16. package/dist/components/SafeSpan.d.ts +12 -5
  17. package/dist/components/SafeSpan.d.ts.map +1 -1
  18. package/dist/components/Scaffold.d.ts.map +1 -1
  19. package/dist/components/base/ModelView.d.ts +101 -0
  20. package/dist/components/base/ModelView.d.ts.map +1 -0
  21. package/dist/components/base/index.d.ts +11 -0
  22. package/dist/components/base/index.d.ts.map +1 -0
  23. package/dist/components/blocks/Article.d.ts +12 -2
  24. package/dist/components/blocks/Article.d.ts.map +1 -1
  25. package/dist/components/blocks/Code.d.ts +13 -2
  26. package/dist/components/blocks/Code.d.ts.map +1 -1
  27. package/dist/components/blocks/Content.d.ts.map +1 -1
  28. package/dist/components/blocks/CoverImageHeader.d.ts.map +1 -1
  29. package/dist/components/blocks/FeatureCard.d.ts.map +1 -1
  30. package/dist/components/blocks/FeatureGrid.d.ts.map +1 -1
  31. package/dist/components/blocks/Footer.d.ts.map +1 -1
  32. package/dist/components/blocks/HeroBlock.d.ts +27 -13
  33. package/dist/components/blocks/HeroBlock.d.ts.map +1 -1
  34. package/dist/components/blocks/Image.d.ts +41 -0
  35. package/dist/components/blocks/Image.d.ts.map +1 -0
  36. package/dist/components/blocks/PageBannerHeader.d.ts.map +1 -1
  37. package/dist/components/blocks/ProductCard.d.ts.map +1 -1
  38. package/dist/components/blocks/Section.d.ts +16 -2
  39. package/dist/components/blocks/Section.d.ts.map +1 -1
  40. package/dist/components/blocks/Text.d.ts +41 -0
  41. package/dist/components/blocks/Text.d.ts.map +1 -0
  42. package/dist/components/blocks/index.d.ts +4 -0
  43. package/dist/components/blocks/index.d.ts.map +1 -1
  44. package/dist/components/buttons/Button.d.ts +23 -7
  45. package/dist/components/buttons/Button.d.ts.map +1 -1
  46. package/dist/components/forms/FormBlock.d.ts +19 -13
  47. package/dist/components/forms/FormBlock.d.ts.map +1 -1
  48. package/dist/components/index.d.ts +4 -0
  49. package/dist/components/index.d.ts.map +1 -1
  50. package/dist/components/input/ChoiceInputField.d.ts +17 -11
  51. package/dist/components/input/ChoiceInputField.d.ts.map +1 -1
  52. package/dist/components/input/HtmlInputField.d.ts +17 -11
  53. package/dist/components/input/HtmlInputField.d.ts.map +1 -1
  54. package/dist/components/input/SelectInputField.d.ts +16 -10
  55. package/dist/components/input/SelectInputField.d.ts.map +1 -1
  56. package/dist/components/input/SwitchInputField.d.ts +16 -10
  57. package/dist/components/input/SwitchInputField.d.ts.map +1 -1
  58. package/dist/components/input/TextField.d.ts.map +1 -1
  59. package/dist/components/input/TextInputField.d.ts +16 -11
  60. package/dist/components/input/TextInputField.d.ts.map +1 -1
  61. package/dist/components/layout/GridCell.d.ts +23 -6
  62. package/dist/components/layout/GridCell.d.ts.map +1 -1
  63. package/dist/components/layout/GridLayout.d.ts +24 -23
  64. package/dist/components/layout/GridLayout.d.ts.map +1 -1
  65. package/dist/components/pages/FormPage.d.ts.map +1 -1
  66. package/dist/components/pages/Page.d.ts +49 -87
  67. package/dist/components/pages/Page.d.ts.map +1 -1
  68. package/dist/components/pages/index.d.ts +2 -2
  69. package/dist/components/pages/index.d.ts.map +1 -1
  70. package/dist/config/AppConfig.d.ts +49 -0
  71. package/dist/config/AppConfig.d.ts.map +1 -0
  72. package/dist/config/AppConfigBuilder.d.ts +75 -0
  73. package/dist/config/AppConfigBuilder.d.ts.map +1 -0
  74. package/dist/config/index.d.ts +13 -0
  75. package/dist/config/index.d.ts.map +1 -0
  76. package/dist/config/types.d.ts +130 -0
  77. package/dist/config/types.d.ts.map +1 -0
  78. package/dist/config.d.ts +15 -0
  79. package/dist/config.d.ts.map +1 -0
  80. package/dist/config.esm.js +451 -0
  81. package/dist/config.js +455 -0
  82. package/dist/contexts/PrintModeContext.d.ts +27 -0
  83. package/dist/contexts/PrintModeContext.d.ts.map +1 -0
  84. package/dist/contexts/QwickAppContext.d.ts +2 -2
  85. package/dist/contexts/QwickAppContext.d.ts.map +1 -1
  86. package/dist/contexts/ThemeContext.d.ts.map +1 -1
  87. package/dist/contexts/index.d.ts +2 -0
  88. package/dist/contexts/index.d.ts.map +1 -1
  89. package/dist/hooks/index.d.ts +2 -0
  90. package/dist/hooks/index.d.ts.map +1 -1
  91. package/dist/hooks/usePrintMode.d.ts +39 -0
  92. package/dist/hooks/usePrintMode.d.ts.map +1 -0
  93. package/dist/index.css +1 -1
  94. package/dist/index.d.ts +1 -0
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.esm.css +1 -1
  97. package/dist/index.esm.js +20722 -16021
  98. package/dist/index.js +20725 -16010
  99. package/dist/schemas/CodeSchema.d.ts +2 -1
  100. package/dist/schemas/CodeSchema.d.ts.map +1 -1
  101. package/dist/schemas/CollapsibleLayoutSchema.d.ts +2 -1
  102. package/dist/schemas/CollapsibleLayoutSchema.d.ts.map +1 -1
  103. package/dist/schemas/ContentSchema.d.ts +2 -1
  104. package/dist/schemas/ContentSchema.d.ts.map +1 -1
  105. package/dist/schemas/GridCellSchema.d.ts +25 -0
  106. package/dist/schemas/GridCellSchema.d.ts.map +1 -0
  107. package/dist/schemas/GridLayoutSchema.d.ts +23 -0
  108. package/dist/schemas/GridLayoutSchema.d.ts.map +1 -0
  109. package/dist/schemas/HtmlSchema.d.ts +14 -0
  110. package/dist/schemas/HtmlSchema.d.ts.map +1 -0
  111. package/dist/schemas/ImageSchema.d.ts +32 -0
  112. package/dist/schemas/ImageSchema.d.ts.map +1 -0
  113. package/dist/schemas/LogoSchema.d.ts +35 -0
  114. package/dist/schemas/LogoSchema.d.ts.map +1 -0
  115. package/dist/schemas/MarkdownSchema.d.ts +14 -0
  116. package/dist/schemas/MarkdownSchema.d.ts.map +1 -0
  117. package/dist/schemas/PageTemplateSchema.d.ts +31 -0
  118. package/dist/schemas/PageTemplateSchema.d.ts.map +1 -0
  119. package/dist/schemas/PrintConfigSchema.d.ts +31 -0
  120. package/dist/schemas/PrintConfigSchema.d.ts.map +1 -0
  121. package/dist/schemas/SectionSchema.d.ts +2 -1
  122. package/dist/schemas/SectionSchema.d.ts.map +1 -1
  123. package/dist/schemas/TextSchema.d.ts +37 -0
  124. package/dist/schemas/TextSchema.d.ts.map +1 -0
  125. package/dist/schemas/ViewModelSchema.d.ts +23 -0
  126. package/dist/schemas/ViewModelSchema.d.ts.map +1 -0
  127. package/dist/schemas/index.d.ts +15 -1
  128. package/dist/schemas/index.d.ts.map +1 -1
  129. package/dist/schemas/transformers/ComponentTransformer.d.ts +116 -0
  130. package/dist/schemas/transformers/ComponentTransformer.d.ts.map +1 -0
  131. package/dist/schemas/transformers/ReactNodeTransformer.d.ts +53 -0
  132. package/dist/schemas/transformers/ReactNodeTransformer.d.ts.map +1 -0
  133. package/dist/schemas/transformers/__tests__/MockSerializableComponent.d.ts +66 -0
  134. package/dist/schemas/transformers/__tests__/MockSerializableComponent.d.ts.map +1 -0
  135. package/dist/schemas/transformers/registry.d.ts +15 -0
  136. package/dist/schemas/transformers/registry.d.ts.map +1 -0
  137. package/dist/schemas/types/Serializable.d.ts +46 -0
  138. package/dist/schemas/types/Serializable.d.ts.map +1 -0
  139. package/dist/utils/htmlTransform.d.ts.map +1 -1
  140. package/dist/utils/reactUtils.d.ts +12 -3
  141. package/dist/utils/reactUtils.d.ts.map +1 -1
  142. package/package.json +17 -3
  143. package/src/{components/__tests__ → __tests__/components}/AccessibilityProvider.test.tsx +1 -1
  144. package/src/{components/__tests__ → __tests__/components}/Article.test.tsx +1 -1
  145. package/src/{components/__tests__ → __tests__/components}/Breadcrumbs.test.tsx +1 -1
  146. package/src/{components/__tests__ → __tests__/components}/Button.test.tsx +1 -1
  147. package/src/{components/__tests__ → __tests__/components}/CardListGrid.test.tsx +2 -2
  148. package/src/{components/__tests__ → __tests__/components}/ChoiceInputField.test.tsx +1 -1
  149. package/src/{components/__tests__ → __tests__/components}/Code.test.tsx +1 -1
  150. package/src/{components/__tests__ → __tests__/components}/Content.integration.test.tsx +1 -1
  151. package/src/{components/__tests__ → __tests__/components}/Content.test.tsx +1 -1
  152. package/src/{components/__tests__ → __tests__/components}/CoverImageHeader.test.tsx +2 -2
  153. package/src/{components/__tests__ → __tests__/components}/ErrorBoundary.test.tsx +1 -1
  154. package/src/{components/__tests__ → __tests__/components}/FeatureCard.integration.test.tsx +2 -2
  155. package/src/{components/__tests__ → __tests__/components}/FeatureGrid.integration.test.tsx +2 -2
  156. package/src/{components/__tests__ → __tests__/components}/FeatureGrid.test.tsx +2 -2
  157. package/src/{components/__tests__ → __tests__/components}/Footer.test.tsx +4 -4
  158. package/src/{components/__tests__ → __tests__/components}/FormBlock.test.tsx +1 -1
  159. package/src/{components/__tests__ → __tests__/components}/HeroBlock.integration.test.tsx +2 -2
  160. package/src/{components/__tests__ → __tests__/components}/HeroBlock.test.tsx +233 -7
  161. package/src/{components/__tests__ → __tests__/components}/Html.test.tsx +11 -2
  162. package/src/{components/__tests__ → __tests__/components}/HtmlInputField.test.tsx +3 -3
  163. package/src/__tests__/components/Logo.test.js +3 -3
  164. package/src/{components/__tests__ → __tests__/components}/Markdown.test.tsx +1 -1
  165. package/src/{components/__tests__ → __tests__/components}/PageBannerHeader.test.tsx +3 -3
  166. package/src/{components/__tests__ → __tests__/components}/PaletteSwitcher.test.tsx +3 -3
  167. package/src/{components/__tests__ → __tests__/components}/ProductCard.test.tsx +4 -4
  168. package/src/{components/__tests__ → __tests__/components}/SafeSpan.integration.test.tsx +2 -2
  169. package/src/{components/__tests__ → __tests__/components}/SafeSpan.simple.test.tsx +1 -1
  170. package/src/{components/__tests__ → __tests__/components}/SafeSpan.test.tsx +1 -1
  171. package/src/{components/__tests__ → __tests__/components}/Section.integration.test.tsx +1 -1
  172. package/src/{components/__tests__ → __tests__/components}/Section.test.tsx +1 -1
  173. package/src/{components/__tests__ → __tests__/components}/SelectInputField.test.tsx +1 -1
  174. package/src/{components/__tests__ → __tests__/components}/TextInputField.test.tsx +3 -3
  175. package/src/{components/__tests__ → __tests__/components}/ThemeSwitcher.test.tsx +3 -3
  176. package/src/__tests__/components/base/ModelView.test.tsx +220 -0
  177. package/src/__tests__/components/blocks/Code.performance.test.tsx +625 -0
  178. package/src/__tests__/components/blocks/Code.serialization.test.tsx +507 -0
  179. package/src/__tests__/components/blocks/HeroBlock.serialization.test.tsx +414 -0
  180. package/src/__tests__/components/blocks/Image.serialization.test.tsx +257 -0
  181. package/src/__tests__/components/blocks/Section.serialization.test.tsx +553 -0
  182. package/src/__tests__/components/blocks/Text.performance.test.tsx +442 -0
  183. package/src/__tests__/components/blocks/Text.serialization.test.tsx +491 -0
  184. package/src/__tests__/components/buttons/Button.serialization.test.tsx +443 -0
  185. package/src/__tests__/components/input/FormComponents.serialization.test.tsx +482 -0
  186. package/src/__tests__/components/input/SelectInputField.serialization.test.tsx +439 -0
  187. package/src/__tests__/components/input/TextInputField.serialization.test.tsx +359 -0
  188. package/src/{components/layout/CollapsibleLayout/__tests__ → __tests__/components/layout}/CollapsibleLayout.test.tsx +4 -4
  189. package/src/__tests__/components/layout/GridCell.serialization.test.tsx +403 -0
  190. package/src/__tests__/components/layout/GridLayout.serialization.test.tsx +311 -0
  191. package/src/__tests__/hooks/usePrintMode.test.ts +89 -0
  192. package/src/__tests__/schemas/PageTemplateSchema.test.ts +161 -0
  193. package/src/__tests__/schemas/PrintConfigSchema.test.ts +127 -0
  194. package/src/__tests__/schemas/ViewModelSchema.test.ts +80 -0
  195. package/src/__tests__/schemas/transformers/ComponentSerializationPatterns.test.tsx +602 -0
  196. package/src/__tests__/schemas/transformers/ComponentTransformer.htmlPatterns.test.ts +301 -0
  197. package/src/__tests__/schemas/transformers/ComponentTransformer.test.ts +521 -0
  198. package/src/__tests__/schemas/transformers/CrossBrowserCompatibility.test.ts +586 -0
  199. package/src/__tests__/schemas/transformers/MockSerializableComponent.ts +103 -0
  200. package/src/__tests__/schemas/transformers/RealWorldScenarios.test.tsx +1165 -0
  201. package/src/__tests__/schemas/transformers/SerializationErrorHandling.test.ts +602 -0
  202. package/src/__tests__/schemas/transformers/SerializationIntegration.test.tsx +691 -0
  203. package/src/__tests__/schemas/transformers/SerializationPerformance.test.ts +460 -0
  204. package/src/__tests__/schemas/transformers/TestAutomation.test.ts +597 -0
  205. package/src/{utils/__tests__ → __tests__/utils}/nested-dom-fix.test.tsx +1 -1
  206. package/src/components/ErrorBoundary.tsx +8 -8
  207. package/src/components/Html.tsx +147 -44
  208. package/src/components/Logo.tsx +198 -100
  209. package/src/components/Markdown.tsx +125 -16
  210. package/src/components/QwickApp.tsx +64 -31
  211. package/src/components/QwickIcon.tsx +59 -0
  212. package/src/components/SafeSpan.tsx +65 -10
  213. package/src/components/Scaffold.tsx +2 -8
  214. package/src/components/base/ModelView.tsx +199 -0
  215. package/src/components/base/index.ts +11 -0
  216. package/src/components/blocks/Article.tsx +57 -18
  217. package/src/components/blocks/Code.md +529 -0
  218. package/src/components/blocks/Code.tsx +102 -15
  219. package/src/components/blocks/Content.tsx +25 -77
  220. package/src/components/blocks/CoverImageHeader.tsx +9 -4
  221. package/src/components/blocks/FeatureCard.tsx +1 -2
  222. package/src/components/blocks/FeatureGrid.tsx +19 -1
  223. package/src/components/blocks/Footer.tsx +13 -1
  224. package/src/components/blocks/HeroBlock.tsx +87 -20
  225. package/src/components/blocks/Image.tsx +395 -0
  226. package/src/components/blocks/PageBannerHeader.tsx +14 -12
  227. package/src/components/blocks/ProductCard.tsx +51 -52
  228. package/src/components/blocks/Section.tsx +113 -8
  229. package/src/components/blocks/Text.tsx +285 -0
  230. package/src/components/blocks/index.ts +4 -0
  231. package/src/components/buttons/Button.tsx +184 -15
  232. package/src/components/forms/FormBlock.tsx +70 -17
  233. package/src/components/index.ts +5 -0
  234. package/src/components/input/ChoiceInputField.tsx +48 -18
  235. package/src/components/input/HtmlInputField.tsx +48 -18
  236. package/src/components/input/SelectInputField.tsx +48 -16
  237. package/src/components/input/SwitchInputField.tsx +48 -17
  238. package/src/components/input/TextField.tsx +41 -1
  239. package/src/components/input/TextInputField.tsx +52 -18
  240. package/src/components/layout/GridCell.tsx +118 -9
  241. package/src/components/layout/GridLayout.tsx +125 -24
  242. package/src/components/pages/FormPage.tsx +0 -1
  243. package/src/components/pages/Page.css +304 -332
  244. package/src/components/pages/Page.tsx +307 -255
  245. package/src/components/pages/index.ts +2 -2
  246. package/src/config/AppConfig.ts +133 -0
  247. package/src/config/AppConfigBuilder.ts +421 -0
  248. package/src/config/__tests__/AppConfig.test.ts +385 -0
  249. package/src/config/__tests__/AppConfigBuilder.test.ts +432 -0
  250. package/src/config/index.ts +24 -0
  251. package/src/config/types.ts +170 -0
  252. package/src/config.ts +25 -0
  253. package/src/contexts/PrintModeContext.tsx +332 -0
  254. package/src/contexts/QwickAppContext.tsx +2 -2
  255. package/src/contexts/ThemeContext.tsx +1 -2
  256. package/src/contexts/index.ts +2 -0
  257. package/src/hooks/index.ts +5 -1
  258. package/src/hooks/usePrintMode.ts +73 -0
  259. package/src/index.ts +3 -0
  260. package/src/schemas/CodeSchema.ts +3 -3
  261. package/src/schemas/CollapsibleLayoutSchema.ts +2 -1
  262. package/src/schemas/ContentSchema.ts +2 -1
  263. package/src/schemas/GridCellSchema.ts +164 -0
  264. package/src/schemas/GridLayoutSchema.ts +133 -0
  265. package/src/schemas/HtmlSchema.ts +47 -0
  266. package/src/schemas/ImageSchema.ts +235 -0
  267. package/src/schemas/LogoSchema.ts +241 -0
  268. package/src/schemas/MarkdownSchema.ts +47 -0
  269. package/src/schemas/PageTemplateSchema.ts +186 -0
  270. package/src/schemas/PrintConfigSchema.ts +207 -0
  271. package/src/schemas/README.md +661 -0
  272. package/src/schemas/SectionSchema.ts +2 -1
  273. package/src/schemas/TextSchema.ts +329 -0
  274. package/src/schemas/ViewModelSchema.ts +115 -0
  275. package/src/schemas/index.ts +21 -2
  276. package/src/schemas/transformers/ComponentTransformer.ts +403 -0
  277. package/src/schemas/transformers/ReactNodeTransformer.ts +236 -0
  278. package/src/schemas/transformers/registry.ts +72 -0
  279. package/src/schemas/types/Serializable.ts +51 -0
  280. package/src/stories/AccessibilityProvider.stories.tsx +253 -253
  281. package/src/stories/Article.stories.tsx +433 -433
  282. package/src/stories/Button.stories.tsx +1 -1
  283. package/src/stories/CardListGrid.stories.tsx +451 -451
  284. package/src/stories/ChoiceInputField.stories.tsx +503 -503
  285. package/src/stories/Code.stories.tsx +1 -1
  286. package/src/stories/CollapsibleLayout.stories.tsx +1414 -1414
  287. package/src/stories/Content.stories.tsx +393 -393
  288. package/src/stories/CoverImageHeader.stories.tsx +701 -701
  289. package/src/stories/DataBinding.advanced.stories.tsx +432 -432
  290. package/src/stories/DataProvider.stories.tsx +1192 -1192
  291. package/src/stories/FeatureCard.stories.tsx +557 -557
  292. package/src/stories/FeatureGrid.stories.tsx +594 -594
  293. package/src/stories/Footer.stories.tsx +640 -640
  294. package/src/stories/FormBlock.stories.tsx +760 -760
  295. package/src/stories/FormComponents.stories.tsx +349 -541
  296. package/src/stories/GridCell.stories.tsx +417 -0
  297. package/src/stories/GridLayout.stories.tsx +353 -0
  298. package/src/stories/HeroBlock.stories.tsx +862 -373
  299. package/src/stories/HtmlInputField.stories.tsx +474 -474
  300. package/src/stories/Image.stories.tsx +819 -0
  301. package/src/stories/Introduction.stories.tsx +667 -667
  302. package/src/stories/LayoutBlocks.stories.tsx +324 -324
  303. package/src/stories/Logo.stories.tsx +165 -6
  304. package/src/stories/Markdown.stories.tsx +137 -137
  305. package/src/stories/ModelView.stories.tsx +477 -0
  306. package/src/stories/Page.stories.tsx +688 -688
  307. package/src/stories/PageBannerHeader.stories.tsx +864 -864
  308. package/src/stories/PaletteSwitcher.stories.tsx +119 -119
  309. package/src/stories/ProductCard.stories.tsx +424 -424
  310. package/src/stories/QwickApp.stories.tsx +368 -368
  311. package/src/stories/ResponsiveMenu.stories.tsx +249 -249
  312. package/src/stories/SafeSpan.stories.tsx +531 -531
  313. package/src/stories/Section.stories.tsx +90 -2
  314. package/src/stories/SelectInputField.stories.tsx +524 -524
  315. package/src/stories/Text.stories.tsx +560 -0
  316. package/src/stories/TextInputField.stories.tsx +443 -443
  317. package/src/stories/ThemeSwitcher.stories.tsx +123 -123
  318. package/src/utils/htmlTransform.tsx +74 -53
  319. package/src/utils/reactUtils.tsx +57 -6
  320. package/dist/index.bundled.css +0 -12
  321. /package/src/{hooks/__tests__ → __tests__/hooks}/useDataBinding.test.tsx.disabled +0 -0
  322. /package/src/{schemas/__tests__ → __tests__/schemas}/builders.test.ts +0 -0
  323. /package/src/{utils/__tests__ → __tests__/utils}/createDataDrivenComponent.test.tsx.disabled +0 -0
  324. /package/src/{utils/__tests__ → __tests__/utils}/htmlTransform.test.tsx +0 -0
  325. /package/src/{utils/__tests__ → __tests__/utils}/optional-logging.test.ts +0 -0
@@ -0,0 +1,186 @@
1
+ /**
2
+ * PageTemplate Schema - Complete page template configuration
3
+ *
4
+ * Extends ViewModel to provide comprehensive page-level configuration
5
+ * including metadata, print settings, and content structure.
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+
10
+ import { IsOptional, IsString, ValidateNested } from 'class-validator';
11
+ import { Type } from 'class-transformer';
12
+ import 'reflect-metadata';
13
+ import { Editor, Field, FieldType, Model, Schema, DataType } from '@qwickapps/schema';
14
+ import { ViewModelSchema } from './ViewModelSchema';
15
+ import { PrintConfigSchema } from './PrintConfigSchema';
16
+
17
+ @Schema('PageTemplate', '1.0.0')
18
+ export class PageTemplateSchema extends ViewModelSchema {
19
+ @Field()
20
+ @Editor({
21
+ field_type: FieldType.TEXT,
22
+ label: 'Page Slug',
23
+ description: 'URL-friendly page identifier (e.g., "about-us")',
24
+ placeholder: 'page-slug'
25
+ })
26
+ @IsOptional()
27
+ @IsString()
28
+ slug?: string;
29
+
30
+ @Field()
31
+ @Editor({
32
+ field_type: FieldType.TEXT,
33
+ label: 'Page Name',
34
+ description: 'Human-readable page name',
35
+ placeholder: 'About Us'
36
+ })
37
+ @IsOptional()
38
+ @IsString()
39
+ name?: string;
40
+
41
+ @Field()
42
+ @Editor({
43
+ field_type: FieldType.TEXTAREA,
44
+ label: 'Page Description',
45
+ description: 'Description of the page content (used for SEO)',
46
+ placeholder: 'Brief description of this page...'
47
+ })
48
+ @IsOptional()
49
+ @IsString()
50
+ description?: string;
51
+
52
+ @Field()
53
+ @Editor({
54
+ field_type: FieldType.TEXT,
55
+ label: 'Page Title',
56
+ description: 'HTML title tag content (defaults to name if not provided)',
57
+ placeholder: 'Page Title | Site Name'
58
+ })
59
+ @IsOptional()
60
+ @IsString()
61
+ title?: string;
62
+
63
+ @Field()
64
+ @Editor({
65
+ field_type: FieldType.TEXTAREA,
66
+ label: 'Meta Keywords',
67
+ description: 'SEO keywords (comma-separated)',
68
+ placeholder: 'keyword1, keyword2, keyword3'
69
+ })
70
+ @IsOptional()
71
+ @IsString()
72
+ metaKeywords?: string;
73
+
74
+ @Field()
75
+ @Editor({
76
+ field_type: FieldType.TEXT,
77
+ label: 'Meta Author',
78
+ description: 'Page author information',
79
+ placeholder: 'Author Name'
80
+ })
81
+ @IsOptional()
82
+ @IsString()
83
+ metaAuthor?: string;
84
+
85
+ @Field()
86
+ @Editor({
87
+ field_type: FieldType.URL,
88
+ label: 'Canonical URL',
89
+ description: 'Canonical URL for SEO (optional)',
90
+ placeholder: 'https://example.com/page'
91
+ })
92
+ @IsOptional()
93
+ @IsString()
94
+ canonicalUrl?: string;
95
+
96
+ @Field()
97
+ @Editor({
98
+ field_type: FieldType.TEXTAREA,
99
+ label: 'Page Content',
100
+ description: 'Main page content - can include React components and HTML'
101
+ })
102
+ @IsOptional()
103
+ children?: React.ReactNode | string;
104
+
105
+ @Field()
106
+ @Editor({
107
+ field_type: FieldType.FORM,
108
+ label: 'Print Configuration',
109
+ description: 'Configuration for print mode behavior'
110
+ })
111
+ @IsOptional()
112
+ @ValidateNested()
113
+ @Type(() => PrintConfigSchema)
114
+ printConfig?: PrintConfigSchema;
115
+
116
+ @Field()
117
+ @Editor({
118
+ field_type: FieldType.TEXT,
119
+ label: 'Layout Template',
120
+ description: 'Layout template identifier to use for this page',
121
+ placeholder: 'default, fullwidth, sidebar, etc.'
122
+ })
123
+ @IsOptional()
124
+ @IsString()
125
+ layout?: string;
126
+
127
+ @Field()
128
+ @Editor({
129
+ field_type: FieldType.TEXT,
130
+ label: 'Page Icon',
131
+ description: 'Icon identifier for page (used in navigation)',
132
+ placeholder: 'home, about, contact'
133
+ })
134
+ @IsOptional()
135
+ @IsString()
136
+ icon?: string;
137
+
138
+ @Field({ defaultValue: false })
139
+ @Editor({
140
+ field_type: FieldType.BOOLEAN,
141
+ label: 'Requires Authentication',
142
+ description: 'Whether this page requires user authentication'
143
+ })
144
+ @IsOptional()
145
+ requiresAuth?: boolean;
146
+
147
+ @Field()
148
+ @Editor({
149
+ field_type: FieldType.TEXT,
150
+ label: 'Required Roles',
151
+ description: 'Comma-separated list of roles required to access this page',
152
+ placeholder: 'admin, user, moderator'
153
+ })
154
+ @IsOptional()
155
+ @IsString()
156
+ requiredRoles?: string;
157
+
158
+ @Field({ defaultValue: true })
159
+ @Editor({
160
+ field_type: FieldType.BOOLEAN,
161
+ label: 'Show in Navigation',
162
+ description: 'Whether to include this page in navigation menus'
163
+ })
164
+ @IsOptional()
165
+ showInNavigation?: boolean;
166
+
167
+ @Field({ defaultValue: 0 })
168
+ @Editor({
169
+ field_type: FieldType.NUMBER,
170
+ label: 'Navigation Priority',
171
+ description: 'Priority in navigation (lower numbers appear first)'
172
+ })
173
+ @IsOptional()
174
+ navigationPriority?: number;
175
+
176
+ @Field({ defaultValue: true })
177
+ @Editor({
178
+ field_type: FieldType.BOOLEAN,
179
+ label: 'Indexable',
180
+ description: 'Whether search engines should index this page'
181
+ })
182
+ @IsOptional()
183
+ indexable?: boolean;
184
+ }
185
+
186
+ export default PageTemplateSchema;
@@ -0,0 +1,207 @@
1
+ /**
2
+ * PrintConfig Schema - Configuration for print mode rendering
3
+ *
4
+ * Defines how components should behave and appear when printed,
5
+ * including theme settings and layout modifications for print media.
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+
10
+ import { IsOptional, IsString, IsBoolean, IsIn } from 'class-validator';
11
+ import 'reflect-metadata';
12
+ import { Editor, Field, FieldType, Model, Schema } from '@qwickapps/schema';
13
+ import { ReactNode } from 'react';
14
+
15
+ @Schema('PrintConfig', '1.0.0')
16
+ export class PrintConfigSchema extends Model {
17
+ @Field({ defaultValue: 'light' })
18
+ @Editor({
19
+ field_type: FieldType.SELECT,
20
+ label: 'Print Theme',
21
+ description: 'Theme mode to use when printing',
22
+ validation: {
23
+ options: [
24
+ { label: 'Light', value: 'light' },
25
+ { label: 'Dark', value: 'dark' }
26
+ ]
27
+ }
28
+ })
29
+ @IsOptional()
30
+ @IsIn(['light', 'dark'])
31
+ theme?: 'light' | 'dark';
32
+
33
+ @Field({ defaultValue: 'default' })
34
+ @Editor({
35
+ field_type: FieldType.SELECT,
36
+ label: 'Print Palette',
37
+ description: 'Color palette to use for print output',
38
+ validation: {
39
+ options: [
40
+ { label: 'Default', value: 'default' },
41
+ { label: 'Autumn', value: 'autumn' },
42
+ { label: 'Cosmic', value: 'cosmic' },
43
+ { label: 'Ocean', value: 'ocean' },
44
+ { label: 'Spring', value: 'spring' },
45
+ { label: 'Winter', value: 'winter' }
46
+ ]
47
+ }
48
+ })
49
+ @IsOptional()
50
+ @IsString()
51
+ palette?: string;
52
+
53
+ @Field({ defaultValue: true })
54
+ @Editor({
55
+ field_type: FieldType.BOOLEAN,
56
+ label: 'Hide Scaffolding',
57
+ description: 'Hide app scaffolding (navigation, headers) when printing'
58
+ })
59
+ @IsOptional()
60
+ @IsBoolean()
61
+ hideScaffolding?: boolean;
62
+
63
+ @Field({ defaultValue: false })
64
+ @Editor({
65
+ field_type: FieldType.BOOLEAN,
66
+ label: 'Hide Interactive Elements',
67
+ description: 'Hide buttons and interactive elements when printing'
68
+ })
69
+ @IsOptional()
70
+ @IsBoolean()
71
+ hideInteractiveElements?: boolean;
72
+
73
+ @Field({ defaultValue: false })
74
+ @Editor({
75
+ field_type: FieldType.BOOLEAN,
76
+ label: 'Optimize For Monochrome',
77
+ description: 'Optimize design for black and white printing'
78
+ })
79
+ @IsOptional()
80
+ @IsBoolean()
81
+ optimizeForMonochrome?: boolean;
82
+
83
+ @Field()
84
+ @Editor({
85
+ field_type: FieldType.TEXT,
86
+ label: 'Print Title',
87
+ description: 'Custom title to show when printing (optional)',
88
+ placeholder: 'Document Title'
89
+ })
90
+ @IsOptional()
91
+ @IsString()
92
+ printTitle?: string;
93
+
94
+ @Field({ defaultValue: true })
95
+ @Editor({
96
+ field_type: FieldType.BOOLEAN,
97
+ label: 'Show Print Date',
98
+ description: 'Include print date and time in printed output'
99
+ })
100
+ @IsOptional()
101
+ @IsBoolean()
102
+ showPrintDate?: boolean;
103
+
104
+ @Field()
105
+ @Editor({
106
+ field_type: FieldType.TEXT,
107
+ label: 'Print Header',
108
+ description: 'Custom header content for printed pages (HTML string or React component)',
109
+ placeholder: '<div>Custom header content...</div>'
110
+ })
111
+ @IsOptional()
112
+ printHeader?: string | ReactNode;
113
+
114
+ @Field()
115
+ @Editor({
116
+ field_type: FieldType.TEXT,
117
+ label: 'Print Header (First Page)',
118
+ description: 'Different header for the first page only (overrides main header on page 1)',
119
+ placeholder: '<div>First page header...</div>'
120
+ })
121
+ @IsOptional()
122
+ printHeaderFirstPage?: string | ReactNode;
123
+
124
+ @Field()
125
+ @Editor({
126
+ field_type: FieldType.TEXT,
127
+ label: 'Print Footer',
128
+ description: 'Custom footer content for printed pages (HTML string or React component)',
129
+ placeholder: '<div>Custom footer content...</div>'
130
+ })
131
+ @IsOptional()
132
+ printFooter?: string | ReactNode;
133
+
134
+ @Field()
135
+ @Editor({
136
+ field_type: FieldType.TEXT,
137
+ label: 'Print Footer (First Page)',
138
+ description: 'Different footer for the first page only (overrides main footer on page 1)',
139
+ placeholder: '<div>First page footer...</div>'
140
+ })
141
+ @IsOptional()
142
+ printFooterFirstPage?: string | ReactNode;
143
+
144
+ @Field({ defaultValue: '12mm' })
145
+ @Editor({
146
+ field_type: FieldType.SELECT,
147
+ label: 'Page Margins',
148
+ description: 'Print page margins',
149
+ validation: {
150
+ options: [
151
+ { label: 'Compact (6mm)', value: '6mm' },
152
+ { label: 'Standard (12mm)', value: '12mm' },
153
+ { label: 'Large (20mm)', value: '20mm' },
154
+ { label: 'Formal (25mm)', value: '25mm' }
155
+ ]
156
+ }
157
+ })
158
+ @IsOptional()
159
+ @IsString()
160
+ pageMargins?: string;
161
+
162
+ @Field({ defaultValue: '60px' })
163
+ @Editor({
164
+ field_type: FieldType.TEXT,
165
+ label: 'Print Header Height',
166
+ description: 'Height allocated for print header (CSS units: px, mm, etc.)',
167
+ placeholder: '60px'
168
+ })
169
+ @IsOptional()
170
+ @IsString()
171
+ printHeaderHeight?: string;
172
+
173
+ @Field({ defaultValue: '40px' })
174
+ @Editor({
175
+ field_type: FieldType.TEXT,
176
+ label: 'Print Footer Height',
177
+ description: 'Height allocated for print footer (CSS units: px, mm, etc.)',
178
+ placeholder: '40px'
179
+ })
180
+ @IsOptional()
181
+ @IsString()
182
+ printFooterHeight?: string;
183
+
184
+ @Field()
185
+ @Editor({
186
+ field_type: FieldType.TEXT,
187
+ label: 'Print Background',
188
+ description: 'CSS background for all printed pages (color, gradient, or image)',
189
+ placeholder: 'linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%)'
190
+ })
191
+ @IsOptional()
192
+ @IsString()
193
+ printBackground?: string;
194
+
195
+ @Field()
196
+ @Editor({
197
+ field_type: FieldType.TEXT,
198
+ label: 'Print Background (First Page)',
199
+ description: 'Different background for the first page only',
200
+ placeholder: 'url(/logo-watermark.png) no-repeat center, #ffffff'
201
+ })
202
+ @IsOptional()
203
+ @IsString()
204
+ printBackgroundFirstPage?: string;
205
+ }
206
+
207
+ export default PrintConfigSchema;