@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
@@ -1,26 +1,55 @@
1
1
  /**
2
- * Page Component Styles
2
+ * Page Component Styles - Clean Architecture
3
3
  *
4
- * Styles for the main page component with various layout options
5
- * and responsive behavior.
4
+ * Separation of concerns:
5
+ * - Normal view: Only content styling, no print assumptions
6
+ * - Print view: Clean print defaults with CSS variable-driven customization
7
+ * - No hardcoded colors, margins, or paddings
6
8
  */
7
9
 
10
+ /* =================== CSS VARIABLE DEFAULTS =================== */
11
+
8
12
  .page {
13
+ /* Normal view variables - theme-based */
14
+ --page-background: var(--theme-surface, #ffffff);
15
+ --page-text-color: var(--theme-on-surface, #000000);
16
+
17
+ /* Padding system - no hardcoded values */
9
18
  --page-padding-none: 0;
10
- --page-padding-small: 1rem;
11
- --page-padding-medium: 1.5rem;
12
- --page-padding-large: 2rem;
19
+ --page-padding-small: var(--theme-spacing-small, 1rem);
20
+ --page-padding-medium: var(--theme-spacing-medium, 1.5rem);
21
+ --page-padding-large: var(--theme-spacing-large, 2rem);
22
+
23
+ /* Print variables - configurable defaults */
24
+ --print-page-size: A4;
25
+ --print-page-margins: 12mm; /* Standard default */
26
+ --print-background: transparent;
27
+ --print-background-first-page: var(--print-background, transparent);
28
+ --print-header-height: 0px; /* No header by default */
29
+ --print-footer-height: 0px; /* No footer by default */
13
30
 
31
+ /* Base page setup */
14
32
  min-height: 100%;
15
33
  width: 100%;
34
+ background: var(--page-background);
35
+ color: var(--page-text-color);
16
36
  }
17
37
 
18
- /* =================== PAGE VARIANTS =================== */
38
+ /* =================== NORMAL VIEW - CONTENT ONLY =================== */
19
39
 
20
- .page-variant-default {
21
- /* Standard page layout */
40
+ .page-content {
41
+ /* Content has no default margin/padding - completely controlled by props */
42
+ margin: 0;
43
+ padding: 0;
44
+ background: transparent; /* Never assume background - inherit from page or theme */
45
+ color: inherit;
46
+ line-height: var(--theme-line-height, 1.6);
47
+ overflow-y: auto;
22
48
  }
23
49
 
50
+ /* =================== PAGE VARIANTS (NORMAL VIEW) =================== */
51
+
52
+
24
53
  .page-variant-centered {
25
54
  display: flex;
26
55
  flex-direction: column;
@@ -29,12 +58,12 @@
29
58
  }
30
59
 
31
60
  .page-variant-narrow {
32
- max-width: 600px;
61
+ max-width: var(--page-max-width-narrow, 600px);
33
62
  margin: 0 auto;
34
63
  }
35
64
 
36
65
  .page-variant-wide {
37
- max-width: 1400px;
66
+ max-width: var(--page-max-width-wide, 1400px);
38
67
  margin: 0 auto;
39
68
  }
40
69
 
@@ -43,7 +72,7 @@
43
72
  width: 100%;
44
73
  }
45
74
 
46
- /* =================== PADDING =================== */
75
+ /* =================== PADDING (CONFIGURABLE) =================== */
47
76
 
48
77
  .page-padding-none {
49
78
  padding: var(--page-padding-none);
@@ -61,7 +90,7 @@
61
90
  padding: var(--page-padding-large);
62
91
  }
63
92
 
64
- /* =================== BACKGROUND =================== */
93
+ /* =================== BACKGROUND (THEME-BASED) =================== */
65
94
 
66
95
  .page-background-default {
67
96
  background: transparent;
@@ -75,28 +104,28 @@
75
104
  background: var(--theme-surface-variant);
76
105
  }
77
106
 
78
- /* =================== MAX WIDTH =================== */
107
+ /* =================== MAX WIDTH (CONFIGURABLE) =================== */
79
108
 
80
109
  .page-max-width-small {
81
- max-width: 600px;
110
+ max-width: var(--page-max-width-small, 600px);
82
111
  margin-left: auto;
83
112
  margin-right: auto;
84
113
  }
85
114
 
86
115
  .page-max-width-medium {
87
- max-width: 800px;
116
+ max-width: var(--page-max-width-medium, 800px);
88
117
  margin-left: auto;
89
118
  margin-right: auto;
90
119
  }
91
120
 
92
121
  .page-max-width-large {
93
- max-width: 1200px;
122
+ max-width: var(--page-max-width-large, 1200px);
94
123
  margin-left: auto;
95
124
  margin-right: auto;
96
125
  }
97
126
 
98
127
  .page-max-width-extra-large {
99
- max-width: 1400px;
128
+ max-width: var(--page-max-width-extra-large, 1400px);
100
129
  margin-left: auto;
101
130
  margin-right: auto;
102
131
  }
@@ -105,356 +134,299 @@
105
134
  max-width: none;
106
135
  }
107
136
 
108
- /* =================== PAGE HEADER & FOOTER =================== */
109
-
110
- .page-header {
111
- margin-bottom: 1.5rem;
112
- }
113
-
114
- .page-footer {
115
- margin-top: 1.5rem;
116
- }
117
-
118
- .page-title {
119
- font-size: clamp(1.75rem, 4vw, 2.5rem);
120
- font-weight: 600;
121
- line-height: 1.2;
122
- margin: 0;
123
- color: var(--theme-on-background);
124
- flex: 1;
125
- transition: font-size 0.3s ease, font-weight 0.3s ease, margin 0.3s ease;
126
- }
127
-
128
- /* Title shrinking on scroll */
129
- .page-title-collapsed .page-title {
130
- font-size: clamp(1.25rem, 3vw, 1.75rem);
131
- font-weight: 500;
132
- margin-bottom: 0.5rem;
133
- }
134
-
135
- .page-title-collapsed .page-header {
136
- margin-bottom: 1rem;
137
- }
138
-
139
- .page-header-actions {
140
- display: flex;
141
- align-items: center;
142
- gap: 0.75rem;
143
- flex-wrap: wrap;
144
- }
145
-
146
- /* =================== PAGE CONTENT =================== */
147
-
148
- .page-content {
149
- color: var(--theme-on-background);
150
- line-height: 1.6;
151
- overflow-y: auto;
152
- max-height: calc(100vh - var(--page-header-height, 200px));
153
- }
154
-
155
- /* =================== LOADING STATE =================== */
156
-
157
- .page-loading {
158
- display: flex;
159
- flex-direction: column;
160
- align-items: center;
161
- justify-content: center;
162
- min-height: 200px;
163
- text-align: center;
164
- color: var(--theme-on-background);
165
- gap: 1rem;
166
- }
167
-
168
- .loading-spinner {
169
- display: flex;
170
- align-items: center;
171
- justify-content: center;
172
- }
173
-
174
- .spinner {
175
- width: 40px;
176
- height: 40px;
177
- border: 3px solid var(--theme-outline-variant);
178
- border-top: 3px solid var(--theme-primary);
179
- border-radius: 50%;
180
- animation: spin 1s linear infinite;
181
- }
182
-
183
- @keyframes spin {
184
- 0% { transform: rotate(0deg); }
185
- 100% { transform: rotate(360deg); }
186
- }
187
-
188
- /* Loading Bar Variants */
189
- .page-loading-bar {
190
- position: relative;
191
- width: 100%;
192
- height: 4px;
193
- background: var(--theme-outline-variant);
194
- overflow: hidden;
195
- }
196
-
197
- .page-loading-bar-top {
198
- position: absolute;
199
- top: 0;
200
- left: 0;
201
- right: 0;
202
- }
137
+ /* =================== PRINT STYLES - CLEAN DEFAULTS =================== */
203
138
 
204
- .page-loading-bar-bottom {
205
- position: absolute;
206
- bottom: 0;
207
- left: 0;
208
- right: 0;
209
- }
210
-
211
- .loading-bar-progress {
212
- height: 100%;
213
- background: linear-gradient(90deg, var(--theme-primary), var(--theme-secondary));
214
- width: 30%;
215
- animation: loading-bar-slide 2s ease-in-out infinite;
216
- }
217
-
218
- @keyframes loading-bar-slide {
219
- 0% { transform: translateX(-100%); }
220
- 50% { transform: translateX(350%); }
221
- 100% { transform: translateX(-100%); }
222
- }
223
-
224
- /* Loading Dots */
225
- .page-loading-dots {
226
- min-height: 120px;
227
- }
228
-
229
- .loading-dots {
230
- display: flex;
231
- gap: 8px;
232
- align-items: center;
233
- }
234
-
235
- .loading-dots span {
236
- width: 8px;
237
- height: 8px;
238
- border-radius: 50%;
239
- background: var(--theme-primary);
240
- animation: loading-dots-bounce 1.4s ease-in-out infinite both;
241
- }
242
-
243
- .loading-dots span:nth-child(1) { animation-delay: -0.32s; }
244
- .loading-dots span:nth-child(2) { animation-delay: -0.16s; }
245
-
246
- @keyframes loading-dots-bounce {
247
- 0%, 80%, 100% {
248
- transform: scale(0);
249
- opacity: 0.5;
139
+ @media print {
140
+ /* Default @page - use standard margins */
141
+ @page {
142
+ size: A4;
143
+ margin: 12mm;
250
144
  }
251
- 40% {
252
- transform: scale(1);
253
- opacity: 1;
145
+
146
+ /* Zero margins for borderless/edge-to-edge printing */
147
+ .page-print-mode.page-print-borderless {
148
+ @page {
149
+ margin: 0mm;
150
+ }
254
151
  }
255
- }
256
-
257
- .loading-message {
258
- margin-top: 1rem;
259
- font-size: 0.875rem;
260
- color: var(--theme-on-background);
261
- opacity: 0.8;
262
- }
263
-
264
- /* =================== MESSAGE STATE =================== */
265
-
266
- .page-message {
267
- display: flex;
268
- align-items: flex-start;
269
- gap: 1rem;
270
- padding: 1rem 1.5rem;
271
- margin: 1rem 0;
272
- border-radius: var(--theme-border-radius, 8px);
273
- border-left: 4px solid;
274
- color: var(--theme-on-background);
275
- background: var(--theme-surface-variant);
276
- }
277
-
278
- .page-message-error {
279
- border-left-color: var(--theme-error, #dc2626);
280
- background: rgba(220, 38, 38, 0.05);
281
- color: var(--theme-error, #dc2626);
282
- }
283
-
284
- .page-message-warning {
285
- border-left-color: var(--theme-warning, #f59e0b);
286
- background: rgba(245, 158, 11, 0.05);
287
- color: var(--theme-warning, #f59e0b);
288
- }
289
-
290
- .page-message-success {
291
- border-left-color: var(--theme-success, #10b981);
292
- background: rgba(16, 185, 129, 0.05);
293
- color: var(--theme-success, #10b981);
294
- }
295
-
296
- .page-message-info {
297
- border-left-color: var(--theme-info, #3b82f6);
298
- background: rgba(59, 130, 246, 0.05);
299
- color: var(--theme-info, #3b82f6);
300
- }
301
-
302
- .page-message-loading {
303
- border-left-color: var(--theme-primary);
304
- background: rgba(var(--theme-primary-rgb, 59, 130, 246), 0.05);
305
- color: var(--theme-primary);
306
- }
307
-
308
- .message-icon {
309
- font-size: 1.5rem;
310
- flex-shrink: 0;
311
- margin-top: 0.125rem;
312
- }
313
-
314
- .message-content {
315
- flex: 1;
316
- min-width: 0;
317
- }
318
-
319
- .message-content p {
320
- margin: 0;
321
- font-size: 0.875rem;
322
- line-height: 1.5;
323
- }
324
-
325
- .message-content h3 {
326
- margin: 0 0 0.5rem 0;
327
- font-size: 1rem;
328
- font-weight: 600;
329
- }
330
-
331
- /* Message variants for different contexts */
332
- .page-message.message-compact {
333
- padding: 0.75rem 1rem;
334
- margin: 0.5rem 0;
335
- }
336
-
337
- .page-message.message-prominent {
338
- padding: 1.5rem 2rem;
339
- margin: 1.5rem 0;
340
- text-align: center;
341
- flex-direction: column;
342
- min-height: 200px;
343
- justify-content: center;
344
- }
345
-
346
- .page-message.message-prominent .message-icon {
347
- font-size: 3rem;
348
- margin: 0 auto 1rem;
349
- }
350
-
351
- .page-message.message-prominent .message-content {
352
- text-align: center;
353
- }
354
-
355
- /* =================== RESPONSIVE ADJUSTMENTS =================== */
356
-
357
- @media (max-width: 768px) {
358
- .page-header {
359
- flex-direction: column;
360
- align-items: stretch;
361
- gap: 1rem;
152
+
153
+ /* Page margin variants with explicit values (CSS variables don't work reliably in @page) */
154
+ .page-print-mode.page-print-compact:not(.page-print-borderless) {
155
+ @page {
156
+ margin: 6mm;
157
+ }
362
158
  }
363
159
 
364
- .page-title {
365
- font-size: clamp(1.5rem, 6vw, 2rem);
160
+ .page-print-mode.page-print-large:not(.page-print-borderless) {
161
+ @page {
162
+ margin: 20mm;
163
+ }
366
164
  }
367
165
 
368
- .page-header-actions {
369
- justify-content: flex-start;
166
+ .page-print-mode.page-print-formal:not(.page-print-borderless) {
167
+ @page {
168
+ margin: 25mm;
169
+ }
370
170
  }
371
171
 
372
- .page-padding-medium {
373
- padding: var(--page-padding-small);
172
+ /* Base print page setup */
173
+ .page-print-mode {
174
+ /* Clean print defaults */
175
+ background: var(--print-background, transparent);
176
+ margin: 0;
177
+ padding: 0;
178
+ min-height: 100vh;
179
+ width: 100vw;
180
+ max-width: none !important;
181
+ box-sizing: border-box;
182
+ overflow: visible;
183
+
184
+ /* Ensure colors print */
185
+ -webkit-print-color-adjust: exact;
186
+ print-color-adjust: exact;
374
187
  }
375
188
 
376
- .page-padding-large {
377
- padding: var(--page-padding-medium);
189
+ /* Edge-to-edge background support */
190
+ .page-print-mode.has-background::before {
191
+ content: '';
192
+ position: fixed;
193
+ top: 0;
194
+ left: 0;
195
+ right: 0;
196
+ bottom: 0;
197
+ background: var(--print-background, transparent);
198
+ background-size: var(--print-background-size, cover);
199
+ background-position: var(--print-background-position, center);
200
+ background-repeat: var(--print-background-repeat, no-repeat);
201
+ z-index: -1;
202
+ -webkit-print-color-adjust: exact;
203
+ print-color-adjust: exact;
378
204
  }
379
205
 
380
- /* Adjust max widths on mobile */
381
- .page-max-width-small,
382
- .page-max-width-medium,
383
- .page-max-width-large,
384
- .page-max-width-extra-large {
385
- margin-left: 1rem;
386
- margin-right: 1rem;
387
- max-width: calc(100% - 2rem);
206
+ /* First page background override */
207
+ .page-print-mode.has-background:first-child::before {
208
+ background: var(--print-background-first-page, var(--print-background, transparent));
388
209
  }
389
- }
390
-
391
- @media (max-width: 480px) {
392
- .page-header-actions {
393
- width: 100%;
394
- justify-content: stretch;
210
+
211
+ /* =================== HEADERS AND FOOTERS - OPTIONAL =================== */
212
+
213
+ /* Headers - positioned at page top */
214
+ .page-print-header {
215
+ position: fixed;
216
+ top: 0;
217
+ left: 0;
218
+ right: 0;
219
+ z-index: 1000;
395
220
 
396
- > * {
397
- flex: 1;
398
- min-width: 0;
399
- }
221
+ /* Completely configurable dimensions */
222
+ height: var(--print-header-height, 0px);
223
+ min-height: var(--print-header-height, 0px);
224
+ max-height: var(--print-header-height, 0px);
225
+
226
+ /* Headers/footers positioned at true edges - no margin/padding */
227
+ margin: 0;
228
+ padding: 0;
229
+ background: var(--print-header-background, transparent);
230
+
231
+ /* Overflow handling */
232
+ overflow: var(--print-header-overflow, hidden);
233
+ box-sizing: border-box;
234
+
235
+ /* Layout - configurable */
236
+ display: var(--print-header-display, flex);
237
+ align-items: var(--print-header-align-items, center);
238
+ justify-content: var(--print-header-justify-content, flex-start);
239
+ }
240
+
241
+ /* First-page-only placeholder containers are hidden by default; app can override */
242
+ .page-print-header-first-page,
243
+ .page-print-footer-first-page {
244
+ display: none !important;
400
245
  }
401
246
 
402
- .retry-button {
247
+ /* Footers - positioned at page bottom */
248
+ .page-print-footer {
249
+ position: fixed;
250
+ bottom: 0;
251
+ left: 0;
252
+ right: 0;
253
+ z-index: 1000;
254
+
255
+ /* Completely configurable dimensions */
256
+ height: var(--print-footer-height, 0px);
257
+ min-height: var(--print-footer-height, 0px);
258
+ max-height: var(--print-footer-height, 0px);
259
+
260
+ /* Headers/footers positioned at true edges - no margin/padding */
261
+ margin: 0;
262
+ padding: 0;
263
+ background: var(--print-footer-background, transparent);
264
+
265
+ /* Overflow handling */
266
+ overflow: var(--print-footer-overflow, hidden);
267
+ box-sizing: border-box;
268
+
269
+ /* Layout - configurable */
270
+ display: var(--print-footer-display, flex);
271
+ align-items: var(--print-footer-align-items, center);
272
+ justify-content: var(--print-footer-justify-content, center);
273
+ }
274
+
275
+ /* Ensure header/footer content respects dimensions */
276
+ .page-print-header *,
277
+ .page-print-footer * {
278
+ box-sizing: border-box;
279
+ max-height: 100%;
280
+ -webkit-print-color-adjust: exact;
281
+ print-color-adjust: exact;
282
+ }
283
+
284
+ /* =================== CONTENT MARGINS - DYNAMIC =================== */
285
+
286
+ .page-print-mode .page-content {
287
+ /* Use box-sizing to ensure consistent behavior across all pages */
288
+ box-sizing: border-box !important;
289
+
290
+ /* Offset content for header/footer */
291
+ margin: 0 !important;
292
+ padding: 0 !important;
293
+
294
+ /* Add a repeatable top gap for header and bottom gap for footer per fragmented page */
295
+ padding-top: var(--print-header-height, 0) !important;
296
+ padding-bottom: var(--print-footer-height, 0) !important;
297
+ -webkit-box-decoration-break: clone;
298
+ box-decoration-break: clone;
299
+
300
+ /* Content has transparent background */
301
+ background: transparent !important;
302
+
303
+ /* Allow content to flow across pages */
304
+ overflow: visible;
403
305
  width: 100%;
404
- max-width: 300px;
306
+
307
+ /* Remove any debug outlines in print */
308
+ outline: none !important;
405
309
  }
406
- }
407
-
408
- /* =================== HIGH CONTRAST MODE =================== */
409
-
410
- @media (prefers-contrast: high) {
411
- .page-title {
412
- font-weight: 700;
310
+
311
+ /* Force all child elements to respect parent margins */
312
+ .page-print-mode .page-content * {
313
+ position: relative !important;
413
314
  }
414
315
 
415
- .spinner {
416
- border-width: 4px;
316
+ /* Ensure no child element has negative margins that could cause bleed */
317
+ .page-print-mode .page-content > * {
318
+ margin-top: 0 !important;
417
319
  }
418
320
 
419
- .retry-button {
420
- border: 2px solid var(--theme-on-primary);
321
+ /* Content positioning is handled above */
322
+
323
+ /* =================== CLEAN PRINT OVERRIDES =================== */
324
+
325
+ /* Remove interactive elements */
326
+ .page-print-mode .page-header-actions,
327
+ .page-print-mode button:not(.page-print-header button):not(.page-print-footer button),
328
+ .page-print-mode .page-loading,
329
+ .page-print-mode .page-error,
330
+ .page-print-mode [data-print-hide="true"] {
331
+ display: none !important;
421
332
  }
422
- }
423
-
424
- /* =================== REDUCED MOTION =================== */
425
-
426
- @media (prefers-reduced-motion: reduce) {
427
- .spinner {
428
- animation: none;
333
+
334
+ /* Remove app-level elements */
335
+ .page-print-mode ~ .app-footer,
336
+ .page-print-mode ~ footer,
337
+ .page-print-mode ~ [data-testid="footer"] {
338
+ display: none !important;
339
+ }
340
+
341
+ /* Clean link styles */
342
+ .page-print-mode a {
343
+ text-decoration: none;
344
+ color: inherit;
345
+ }
346
+
347
+ /* Ensure all content prints with colors */
348
+ .page-print-mode,
349
+ .page-print-mode * {
350
+ -webkit-print-color-adjust: exact !important;
351
+ print-color-adjust: exact !important;
352
+ }
353
+
354
+ /* Better page break handling */
355
+ .page-print-mode * {
356
+ box-sizing: border-box;
357
+ }
358
+
359
+ /* Allow controlled page breaking */
360
+ .page-break-before {
361
+ page-break-before: always;
362
+ break-before: page;
363
+ }
364
+
365
+ .page-break-after {
366
+ page-break-after: always;
367
+ break-after: page;
429
368
  }
430
369
 
431
- .retry-button {
432
- transition: none;
370
+ .page-break-inside-avoid {
371
+ page-break-inside: avoid;
372
+ break-inside: avoid;
433
373
  }
434
374
 
435
- .retry-button:hover {
436
- transform: none;
375
+ .page-break-inside-auto {
376
+ page-break-inside: auto;
377
+ break-inside: auto;
378
+ }
379
+
380
+ /* Additional content flow control for page breaks */
381
+ .page-print-mode .page-content::before {
382
+ content: '';
383
+ display: block;
384
+ }
385
+
386
+ /* Additional content flow control for page breaks */
387
+ .page-print-mode .page-content::after {
388
+ content: '';
389
+ display: block;
437
390
  }
438
391
  }
439
392
 
440
- /* =================== PRINT STYLES =================== */
393
+ /* =================== RESPONSIVE ADJUSTMENTS (NORMAL VIEW ONLY) =================== */
441
394
 
442
- @media print {
443
- .page-header-actions {
444
- display: none;
395
+ @media screen and (max-width: 768px) {
396
+ .page-padding-medium {
397
+ padding: var(--page-padding-small);
445
398
  }
446
399
 
447
- .page-loading,
448
- .page-error {
449
- display: none;
400
+ .page-padding-large {
401
+ padding: var(--page-padding-medium);
450
402
  }
451
403
 
452
- .page-title {
453
- color: black;
454
- font-size: 1.5rem;
404
+ /* Adjust max widths on mobile */
405
+ .page-max-width-small,
406
+ .page-max-width-medium,
407
+ .page-max-width-large,
408
+ .page-max-width-extra-large {
409
+ margin-left: var(--theme-spacing-small, 1rem);
410
+ margin-right: var(--theme-spacing-small, 1rem);
411
+ max-width: calc(100% - 2 * var(--theme-spacing-small, 1rem));
455
412
  }
456
-
457
- .page-content {
458
- color: black;
413
+ }
414
+
415
+ /* =================== ACCESSIBILITY =================== */
416
+
417
+ @media (prefers-contrast: high) {
418
+ .page {
419
+ /* High contrast adjustments use theme variables */
420
+ background: var(--theme-surface-high-contrast, var(--theme-surface));
421
+ color: var(--theme-on-surface-high-contrast, var(--theme-on-surface));
422
+ }
423
+ }
424
+
425
+ @media (prefers-reduced-motion: reduce) {
426
+ /* Remove animations - no hardcoded transitions to disable */
427
+ .page * {
428
+ animation-duration: 0.01ms !important;
429
+ animation-iteration-count: 1 !important;
430
+ transition-duration: 0.01ms !important;
459
431
  }
460
432
  }