@qwickapps/react-framework 1.3.5 → 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.
- package/README.md +1681 -2
- package/dist/__tests__/schemas/transformers/MockSerializableComponent.d.ts +66 -0
- package/dist/__tests__/schemas/transformers/MockSerializableComponent.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.d.ts +7 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -1
- package/dist/components/Html.d.ts +28 -18
- package/dist/components/Html.d.ts.map +1 -1
- package/dist/components/Logo.d.ts +12 -35
- package/dist/components/Logo.d.ts.map +1 -1
- package/dist/components/Markdown.d.ts +18 -13
- package/dist/components/Markdown.d.ts.map +1 -1
- package/dist/components/QwickApp.d.ts +16 -3
- package/dist/components/QwickApp.d.ts.map +1 -1
- package/dist/components/QwickIcon.d.ts +23 -0
- package/dist/components/QwickIcon.d.ts.map +1 -0
- package/dist/components/SafeSpan.d.ts +12 -5
- package/dist/components/SafeSpan.d.ts.map +1 -1
- package/dist/components/Scaffold.d.ts.map +1 -1
- package/dist/components/base/ModelView.d.ts +101 -0
- package/dist/components/base/ModelView.d.ts.map +1 -0
- package/dist/components/base/index.d.ts +11 -0
- package/dist/components/base/index.d.ts.map +1 -0
- package/dist/components/blocks/Article.d.ts +12 -2
- package/dist/components/blocks/Article.d.ts.map +1 -1
- package/dist/components/blocks/Code.d.ts +13 -2
- package/dist/components/blocks/Code.d.ts.map +1 -1
- package/dist/components/blocks/CoverImageHeader.d.ts.map +1 -1
- package/dist/components/blocks/FeatureCard.d.ts.map +1 -1
- package/dist/components/blocks/FeatureGrid.d.ts.map +1 -1
- package/dist/components/blocks/Footer.d.ts.map +1 -1
- package/dist/components/blocks/HeroBlock.d.ts +27 -13
- package/dist/components/blocks/HeroBlock.d.ts.map +1 -1
- package/dist/components/blocks/Image.d.ts +41 -0
- package/dist/components/blocks/Image.d.ts.map +1 -0
- package/dist/components/blocks/PageBannerHeader.d.ts.map +1 -1
- package/dist/components/blocks/Section.d.ts +16 -2
- package/dist/components/blocks/Section.d.ts.map +1 -1
- package/dist/components/blocks/Text.d.ts +41 -0
- package/dist/components/blocks/Text.d.ts.map +1 -0
- package/dist/components/blocks/index.d.ts +4 -0
- package/dist/components/blocks/index.d.ts.map +1 -1
- package/dist/components/buttons/Button.d.ts +23 -7
- package/dist/components/buttons/Button.d.ts.map +1 -1
- package/dist/components/forms/FormBlock.d.ts +19 -13
- package/dist/components/forms/FormBlock.d.ts.map +1 -1
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/input/ChoiceInputField.d.ts +17 -11
- package/dist/components/input/ChoiceInputField.d.ts.map +1 -1
- package/dist/components/input/HtmlInputField.d.ts +17 -11
- package/dist/components/input/HtmlInputField.d.ts.map +1 -1
- package/dist/components/input/SelectInputField.d.ts +16 -10
- package/dist/components/input/SelectInputField.d.ts.map +1 -1
- package/dist/components/input/SwitchInputField.d.ts +16 -10
- package/dist/components/input/SwitchInputField.d.ts.map +1 -1
- package/dist/components/input/TextField.d.ts.map +1 -1
- package/dist/components/input/TextInputField.d.ts +16 -11
- package/dist/components/input/TextInputField.d.ts.map +1 -1
- package/dist/components/layout/GridCell.d.ts +23 -6
- package/dist/components/layout/GridCell.d.ts.map +1 -1
- package/dist/components/layout/GridLayout.d.ts +24 -23
- package/dist/components/layout/GridLayout.d.ts.map +1 -1
- package/dist/components/pages/FormPage.d.ts.map +1 -1
- package/dist/components/pages/Page.d.ts +49 -87
- package/dist/components/pages/Page.d.ts.map +1 -1
- package/dist/components/pages/index.d.ts +2 -2
- package/dist/components/pages/index.d.ts.map +1 -1
- package/dist/config/AppConfig.d.ts +49 -0
- package/dist/config/AppConfig.d.ts.map +1 -0
- package/dist/config/AppConfigBuilder.d.ts +75 -0
- package/dist/config/AppConfigBuilder.d.ts.map +1 -0
- package/dist/config/index.d.ts +13 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/types.d.ts +130 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.esm.js +451 -0
- package/dist/config.js +455 -0
- package/dist/contexts/PrintModeContext.d.ts +27 -0
- package/dist/contexts/PrintModeContext.d.ts.map +1 -0
- package/dist/contexts/QwickAppContext.d.ts +2 -2
- package/dist/contexts/QwickAppContext.d.ts.map +1 -1
- package/dist/contexts/index.d.ts +2 -0
- package/dist/contexts/index.d.ts.map +1 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/usePrintMode.d.ts +39 -0
- package/dist/hooks/usePrintMode.d.ts.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.css +1 -1
- package/dist/index.esm.js +10951 -6238
- package/dist/index.js +11014 -6287
- package/dist/schemas/CodeSchema.d.ts +2 -1
- package/dist/schemas/CodeSchema.d.ts.map +1 -1
- package/dist/schemas/CollapsibleLayoutSchema.d.ts +2 -1
- package/dist/schemas/CollapsibleLayoutSchema.d.ts.map +1 -1
- package/dist/schemas/ContentSchema.d.ts +2 -1
- package/dist/schemas/ContentSchema.d.ts.map +1 -1
- package/dist/schemas/GridCellSchema.d.ts +25 -0
- package/dist/schemas/GridCellSchema.d.ts.map +1 -0
- package/dist/schemas/GridLayoutSchema.d.ts +23 -0
- package/dist/schemas/GridLayoutSchema.d.ts.map +1 -0
- package/dist/schemas/HtmlSchema.d.ts +14 -0
- package/dist/schemas/HtmlSchema.d.ts.map +1 -0
- package/dist/schemas/ImageSchema.d.ts +32 -0
- package/dist/schemas/ImageSchema.d.ts.map +1 -0
- package/dist/schemas/LogoSchema.d.ts +35 -0
- package/dist/schemas/LogoSchema.d.ts.map +1 -0
- package/dist/schemas/MarkdownSchema.d.ts +14 -0
- package/dist/schemas/MarkdownSchema.d.ts.map +1 -0
- package/dist/schemas/PageTemplateSchema.d.ts +31 -0
- package/dist/schemas/PageTemplateSchema.d.ts.map +1 -0
- package/dist/schemas/PrintConfigSchema.d.ts +31 -0
- package/dist/schemas/PrintConfigSchema.d.ts.map +1 -0
- package/dist/schemas/SectionSchema.d.ts +2 -1
- package/dist/schemas/SectionSchema.d.ts.map +1 -1
- package/dist/schemas/TextSchema.d.ts +37 -0
- package/dist/schemas/TextSchema.d.ts.map +1 -0
- package/dist/schemas/ViewModelSchema.d.ts +23 -0
- package/dist/schemas/ViewModelSchema.d.ts.map +1 -0
- package/dist/schemas/index.d.ts +15 -1
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/transformers/ComponentTransformer.d.ts +116 -0
- package/dist/schemas/transformers/ComponentTransformer.d.ts.map +1 -0
- package/dist/schemas/transformers/ReactNodeTransformer.d.ts +53 -0
- package/dist/schemas/transformers/ReactNodeTransformer.d.ts.map +1 -0
- package/dist/schemas/transformers/__tests__/MockSerializableComponent.d.ts +66 -0
- package/dist/schemas/transformers/__tests__/MockSerializableComponent.d.ts.map +1 -0
- package/dist/schemas/transformers/registry.d.ts +15 -0
- package/dist/schemas/transformers/registry.d.ts.map +1 -0
- package/dist/schemas/types/Serializable.d.ts +46 -0
- package/dist/schemas/types/Serializable.d.ts.map +1 -0
- package/dist/utils/htmlTransform.d.ts.map +1 -1
- package/dist/utils/reactUtils.d.ts +12 -3
- package/dist/utils/reactUtils.d.ts.map +1 -1
- package/package.json +17 -3
- package/src/{components/__tests__ → __tests__/components}/AccessibilityProvider.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Article.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Breadcrumbs.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Button.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/CardListGrid.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/ChoiceInputField.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Code.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Content.integration.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Content.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/CoverImageHeader.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/ErrorBoundary.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/FeatureCard.integration.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/FeatureGrid.integration.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/FeatureGrid.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/Footer.test.tsx +4 -4
- package/src/{components/__tests__ → __tests__/components}/FormBlock.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/HeroBlock.integration.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/HeroBlock.test.tsx +233 -7
- package/src/{components/__tests__ → __tests__/components}/Html.test.tsx +11 -2
- package/src/{components/__tests__ → __tests__/components}/HtmlInputField.test.tsx +3 -3
- package/src/__tests__/components/Logo.test.js +3 -3
- package/src/{components/__tests__ → __tests__/components}/Markdown.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/PageBannerHeader.test.tsx +3 -3
- package/src/{components/__tests__ → __tests__/components}/PaletteSwitcher.test.tsx +3 -3
- package/src/{components/__tests__ → __tests__/components}/ProductCard.test.tsx +4 -4
- package/src/{components/__tests__ → __tests__/components}/SafeSpan.integration.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/SafeSpan.simple.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/SafeSpan.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Section.integration.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Section.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/SelectInputField.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/TextInputField.test.tsx +3 -3
- package/src/{components/__tests__ → __tests__/components}/ThemeSwitcher.test.tsx +3 -3
- package/src/__tests__/components/base/ModelView.test.tsx +220 -0
- package/src/__tests__/components/blocks/Code.performance.test.tsx +625 -0
- package/src/__tests__/components/blocks/Code.serialization.test.tsx +507 -0
- package/src/__tests__/components/blocks/HeroBlock.serialization.test.tsx +414 -0
- package/src/__tests__/components/blocks/Image.serialization.test.tsx +257 -0
- package/src/__tests__/components/blocks/Section.serialization.test.tsx +553 -0
- package/src/__tests__/components/blocks/Text.performance.test.tsx +442 -0
- package/src/__tests__/components/blocks/Text.serialization.test.tsx +491 -0
- package/src/__tests__/components/buttons/Button.serialization.test.tsx +443 -0
- package/src/__tests__/components/input/FormComponents.serialization.test.tsx +482 -0
- package/src/__tests__/components/input/SelectInputField.serialization.test.tsx +439 -0
- package/src/__tests__/components/input/TextInputField.serialization.test.tsx +359 -0
- package/src/{components/layout/CollapsibleLayout/__tests__ → __tests__/components/layout}/CollapsibleLayout.test.tsx +4 -4
- package/src/__tests__/components/layout/GridCell.serialization.test.tsx +403 -0
- package/src/__tests__/components/layout/GridLayout.serialization.test.tsx +311 -0
- package/src/__tests__/hooks/usePrintMode.test.ts +89 -0
- package/src/__tests__/schemas/PageTemplateSchema.test.ts +161 -0
- package/src/__tests__/schemas/PrintConfigSchema.test.ts +127 -0
- package/src/__tests__/schemas/ViewModelSchema.test.ts +80 -0
- package/src/__tests__/schemas/transformers/ComponentSerializationPatterns.test.tsx +602 -0
- package/src/__tests__/schemas/transformers/ComponentTransformer.htmlPatterns.test.ts +301 -0
- package/src/__tests__/schemas/transformers/ComponentTransformer.test.ts +521 -0
- package/src/__tests__/schemas/transformers/CrossBrowserCompatibility.test.ts +586 -0
- package/src/__tests__/schemas/transformers/MockSerializableComponent.ts +103 -0
- package/src/__tests__/schemas/transformers/RealWorldScenarios.test.tsx +1165 -0
- package/src/__tests__/schemas/transformers/SerializationErrorHandling.test.ts +602 -0
- package/src/__tests__/schemas/transformers/SerializationIntegration.test.tsx +691 -0
- package/src/__tests__/schemas/transformers/SerializationPerformance.test.ts +460 -0
- package/src/__tests__/schemas/transformers/TestAutomation.test.ts +597 -0
- package/src/{utils/__tests__ → __tests__/utils}/nested-dom-fix.test.tsx +1 -1
- package/src/components/ErrorBoundary.tsx +8 -8
- package/src/components/Html.tsx +147 -44
- package/src/components/Logo.tsx +198 -100
- package/src/components/Markdown.tsx +125 -16
- package/src/components/QwickApp.tsx +64 -31
- package/src/components/QwickIcon.tsx +59 -0
- package/src/components/SafeSpan.tsx +65 -10
- package/src/components/Scaffold.tsx +2 -8
- package/src/components/base/ModelView.tsx +199 -0
- package/src/components/base/index.ts +11 -0
- package/src/components/blocks/Article.tsx +57 -18
- package/src/components/blocks/Code.md +529 -0
- package/src/components/blocks/Code.tsx +102 -15
- package/src/components/blocks/CoverImageHeader.tsx +9 -4
- package/src/components/blocks/FeatureCard.tsx +1 -2
- package/src/components/blocks/FeatureGrid.tsx +19 -1
- package/src/components/blocks/Footer.tsx +13 -1
- package/src/components/blocks/HeroBlock.tsx +87 -20
- package/src/components/blocks/Image.tsx +395 -0
- package/src/components/blocks/PageBannerHeader.tsx +14 -12
- package/src/components/blocks/ProductCard.tsx +1 -1
- package/src/components/blocks/Section.tsx +113 -8
- package/src/components/blocks/Text.tsx +285 -0
- package/src/components/blocks/index.ts +4 -0
- package/src/components/buttons/Button.tsx +184 -15
- package/src/components/forms/FormBlock.tsx +70 -17
- package/src/components/index.ts +5 -0
- package/src/components/input/ChoiceInputField.tsx +48 -18
- package/src/components/input/HtmlInputField.tsx +48 -18
- package/src/components/input/SelectInputField.tsx +48 -16
- package/src/components/input/SwitchInputField.tsx +48 -17
- package/src/components/input/TextField.tsx +41 -1
- package/src/components/input/TextInputField.tsx +52 -18
- package/src/components/layout/GridCell.tsx +118 -9
- package/src/components/layout/GridLayout.tsx +125 -24
- package/src/components/pages/FormPage.tsx +0 -1
- package/src/components/pages/Page.css +304 -332
- package/src/components/pages/Page.tsx +307 -255
- package/src/components/pages/index.ts +2 -2
- package/src/config/AppConfig.ts +133 -0
- package/src/config/AppConfigBuilder.ts +421 -0
- package/src/config/__tests__/AppConfig.test.ts +385 -0
- package/src/config/__tests__/AppConfigBuilder.test.ts +432 -0
- package/src/config/index.ts +24 -0
- package/src/config/types.ts +170 -0
- package/src/config.ts +25 -0
- package/src/contexts/PrintModeContext.tsx +332 -0
- package/src/contexts/QwickAppContext.tsx +2 -2
- package/src/contexts/index.ts +2 -0
- package/src/hooks/index.ts +5 -1
- package/src/hooks/usePrintMode.ts +73 -0
- package/src/index.ts +3 -0
- package/src/schemas/CodeSchema.ts +3 -3
- package/src/schemas/CollapsibleLayoutSchema.ts +2 -1
- package/src/schemas/ContentSchema.ts +2 -1
- package/src/schemas/GridCellSchema.ts +164 -0
- package/src/schemas/GridLayoutSchema.ts +133 -0
- package/src/schemas/HtmlSchema.ts +47 -0
- package/src/schemas/ImageSchema.ts +235 -0
- package/src/schemas/LogoSchema.ts +241 -0
- package/src/schemas/MarkdownSchema.ts +47 -0
- package/src/schemas/PageTemplateSchema.ts +186 -0
- package/src/schemas/PrintConfigSchema.ts +207 -0
- package/src/schemas/README.md +661 -0
- package/src/schemas/SectionSchema.ts +2 -1
- package/src/schemas/TextSchema.ts +329 -0
- package/src/schemas/ViewModelSchema.ts +115 -0
- package/src/schemas/index.ts +21 -2
- package/src/schemas/transformers/ComponentTransformer.ts +403 -0
- package/src/schemas/transformers/ReactNodeTransformer.ts +236 -0
- package/src/schemas/transformers/registry.ts +72 -0
- package/src/schemas/types/Serializable.ts +51 -0
- package/src/stories/AccessibilityProvider.stories.tsx +253 -253
- package/src/stories/Article.stories.tsx +433 -433
- package/src/stories/Button.stories.tsx +1 -1
- package/src/stories/CardListGrid.stories.tsx +451 -451
- package/src/stories/ChoiceInputField.stories.tsx +503 -503
- package/src/stories/Code.stories.tsx +1 -1
- package/src/stories/CollapsibleLayout.stories.tsx +1414 -1414
- package/src/stories/Content.stories.tsx +393 -393
- package/src/stories/CoverImageHeader.stories.tsx +701 -701
- package/src/stories/DataBinding.advanced.stories.tsx +432 -432
- package/src/stories/DataProvider.stories.tsx +1192 -1192
- package/src/stories/FeatureCard.stories.tsx +557 -557
- package/src/stories/FeatureGrid.stories.tsx +594 -594
- package/src/stories/Footer.stories.tsx +640 -640
- package/src/stories/FormBlock.stories.tsx +760 -760
- package/src/stories/FormComponents.stories.tsx +349 -541
- package/src/stories/GridCell.stories.tsx +417 -0
- package/src/stories/GridLayout.stories.tsx +353 -0
- package/src/stories/HeroBlock.stories.tsx +862 -373
- package/src/stories/HtmlInputField.stories.tsx +474 -474
- package/src/stories/Image.stories.tsx +819 -0
- package/src/stories/Introduction.stories.tsx +667 -667
- package/src/stories/LayoutBlocks.stories.tsx +324 -324
- package/src/stories/Logo.stories.tsx +165 -6
- package/src/stories/Markdown.stories.tsx +137 -137
- package/src/stories/ModelView.stories.tsx +477 -0
- package/src/stories/Page.stories.tsx +688 -688
- package/src/stories/PageBannerHeader.stories.tsx +864 -864
- package/src/stories/PaletteSwitcher.stories.tsx +119 -119
- package/src/stories/ProductCard.stories.tsx +424 -424
- package/src/stories/QwickApp.stories.tsx +368 -368
- package/src/stories/ResponsiveMenu.stories.tsx +249 -249
- package/src/stories/SafeSpan.stories.tsx +531 -531
- package/src/stories/Section.stories.tsx +90 -2
- package/src/stories/SelectInputField.stories.tsx +524 -524
- package/src/stories/Text.stories.tsx +560 -0
- package/src/stories/TextInputField.stories.tsx +443 -443
- package/src/stories/ThemeSwitcher.stories.tsx +123 -123
- package/src/utils/htmlTransform.tsx +74 -53
- package/src/utils/reactUtils.tsx +57 -6
- package/dist/index.bundled.css +0 -12
- /package/src/{hooks/__tests__ → __tests__/hooks}/useDataBinding.test.tsx.disabled +0 -0
- /package/src/{schemas/__tests__ → __tests__/schemas}/builders.test.ts +0 -0
- /package/src/{utils/__tests__ → __tests__/utils}/createDataDrivenComponent.test.tsx.disabled +0 -0
- /package/src/{utils/__tests__ → __tests__/utils}/htmlTransform.test.tsx +0 -0
- /package/src/{utils/__tests__ → __tests__/utils}/optional-logging.test.ts +0 -0
|
@@ -18,13 +18,13 @@ import { Edit as EditIcon, Share as ShareIcon, MoreVert as MoreIcon, Add as AddI
|
|
|
18
18
|
import { Button } from '../components/buttons/Button';
|
|
19
19
|
|
|
20
20
|
const meta: Meta<typeof Page> = {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
21
|
+
title: 'Framework/Page',
|
|
22
|
+
component: Page,
|
|
23
|
+
parameters: {
|
|
24
|
+
layout: 'fullscreen',
|
|
25
|
+
docs: {
|
|
26
|
+
description: {
|
|
27
|
+
component: `The Page component provides a flexible layout wrapper with optional header and footer components, loading states, and message handling.
|
|
28
28
|
|
|
29
29
|
**Key Features:**
|
|
30
30
|
- **Header & Footer**: Optional header and footer components for consistent page structure
|
|
@@ -41,47 +41,47 @@ const meta: Meta<typeof Page> = {
|
|
|
41
41
|
- Dashboard and admin interface layouts
|
|
42
42
|
- Documentation and help pages
|
|
43
43
|
- Landing pages with structured content`,
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
tags: ['autodocs'],
|
|
48
|
+
argTypes: {
|
|
49
|
+
route: {
|
|
50
|
+
description: 'Current route/path (auto-detected when using React Router)',
|
|
51
|
+
control: { type: 'text' },
|
|
52
|
+
},
|
|
53
|
+
header: {
|
|
54
|
+
description: 'Optional header component',
|
|
55
|
+
control: false,
|
|
56
|
+
},
|
|
57
|
+
footer: {
|
|
58
|
+
description: 'Optional footer component',
|
|
59
|
+
control: false,
|
|
60
|
+
},
|
|
61
|
+
variant: {
|
|
62
|
+
description: 'Page layout variant',
|
|
63
|
+
control: { type: 'select' },
|
|
64
|
+
options: ['default', 'centered', 'narrow', 'wide', 'fullwidth'],
|
|
65
|
+
},
|
|
66
|
+
padding: {
|
|
67
|
+
description: 'Padding around page content',
|
|
68
|
+
control: { type: 'select' },
|
|
69
|
+
options: ['none', 'small', 'medium', 'large'],
|
|
70
|
+
},
|
|
71
|
+
background: {
|
|
72
|
+
description: 'Background variant',
|
|
73
|
+
control: { type: 'select' },
|
|
74
|
+
options: ['default', 'surface', 'alternate'],
|
|
75
|
+
},
|
|
76
|
+
loading: {
|
|
77
|
+
description: 'Loading state',
|
|
78
|
+
control: { type: 'boolean' },
|
|
79
|
+
},
|
|
80
|
+
message: {
|
|
81
|
+
description: 'Message state for displaying info/warning/error/success messages',
|
|
82
|
+
control: false,
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
85
|
} satisfies Meta<typeof Page>;
|
|
86
86
|
|
|
87
87
|
export default meta;
|
|
@@ -89,674 +89,674 @@ type Story = StoryObj<typeof meta>;
|
|
|
89
89
|
|
|
90
90
|
// Sample navigation items for routing demos
|
|
91
91
|
const navigationItems = [
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
92
|
+
{
|
|
93
|
+
id: 'home',
|
|
94
|
+
label: 'Home',
|
|
95
|
+
icon: <span>🏠</span>,
|
|
96
|
+
priority: 1,
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
id: 'products',
|
|
100
|
+
label: 'Products',
|
|
101
|
+
icon: <span></span>,
|
|
102
|
+
priority: 2,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
id: 'about',
|
|
106
|
+
label: 'About',
|
|
107
|
+
icon: <span>ℹ</span>,
|
|
108
|
+
priority: 3,
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
id: 'contact',
|
|
112
|
+
label: 'Contact',
|
|
113
|
+
icon: <span>📧</span>,
|
|
114
|
+
priority: 4,
|
|
115
|
+
},
|
|
116
116
|
];
|
|
117
117
|
|
|
118
118
|
// Router-based navigation wrapper
|
|
119
119
|
function RouterNavigationWrapper({ children }: { children: React.ReactNode }) {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
120
|
+
const navigate = useNavigate();
|
|
121
|
+
|
|
122
|
+
const navItemsWithNavigation = navigationItems.map(item => ({
|
|
123
|
+
...item,
|
|
124
|
+
onClick: () => navigate(item.id === 'home' ? '/' : `/${item.id}`),
|
|
125
|
+
}));
|
|
126
126
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
127
|
+
return (
|
|
128
|
+
<Scaffold
|
|
129
|
+
appName="Page Demo App"
|
|
130
|
+
navigationItems={navItemsWithNavigation}
|
|
131
|
+
showAppBar={true}
|
|
132
|
+
>
|
|
133
|
+
{children}
|
|
134
|
+
</Scaffold>
|
|
135
|
+
);
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
export const BasicPage: Story = {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
139
|
+
args: {
|
|
140
|
+
variant: 'default',
|
|
141
|
+
padding: 'medium',
|
|
142
|
+
},
|
|
143
|
+
render: (args) => (
|
|
144
|
+
<Page {...args}>
|
|
145
|
+
<Section padding="large">
|
|
146
|
+
<Content title="Simple Page Content" centered maxWidth="large">
|
|
147
|
+
<p>This is a basic page example without router integration. The route and canonical URL are handled manually.</p>
|
|
148
148
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
149
|
+
<GridLayout columns={2} spacing="large">
|
|
150
|
+
<GridCell>
|
|
151
|
+
<Content variant="outlined">
|
|
152
|
+
<h3>Manual Configuration</h3>
|
|
153
|
+
<ul>
|
|
154
|
+
<li>Route prop specified manually</li>
|
|
155
|
+
<li>Canonical URL set via meta prop</li>
|
|
156
|
+
<li>Works without any router dependency</li>
|
|
157
|
+
</ul>
|
|
158
|
+
</Content>
|
|
159
|
+
</GridCell>
|
|
160
|
+
|
|
161
|
+
<GridCell>
|
|
162
|
+
<Content variant="elevated">
|
|
163
|
+
<h3>Use Cases</h3>
|
|
164
|
+
<ul>
|
|
165
|
+
<li>Static pages and documentation</li>
|
|
166
|
+
<li>Single page applications</li>
|
|
167
|
+
<li>Non-React Router setups</li>
|
|
168
|
+
</ul>
|
|
169
|
+
</Content>
|
|
170
|
+
</GridCell>
|
|
171
|
+
</GridLayout>
|
|
172
|
+
</Content>
|
|
173
|
+
</Section>
|
|
174
|
+
</Page>
|
|
175
|
+
),
|
|
176
|
+
parameters: {
|
|
177
|
+
docs: {
|
|
178
|
+
description: {
|
|
179
|
+
story: 'Basic page usage with simple content. Clean layout without header or footer components.',
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
183
|
};
|
|
184
184
|
|
|
185
185
|
export const WithRouterIntegration: Story = {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
186
|
+
args: {
|
|
187
|
+
},
|
|
188
|
+
render: (args) => (
|
|
189
|
+
<QwickApp appId="page-router-demo" appName='Page Router Demo'>
|
|
190
|
+
<BrowserRouter>
|
|
191
|
+
<RouterNavigationWrapper>
|
|
192
|
+
<Routes>
|
|
193
|
+
<Route path="/" element={
|
|
194
|
+
<Page {...args}>
|
|
195
|
+
<Section padding="large">
|
|
196
|
+
<Content title="Router Integration Demo" centered maxWidth="large">
|
|
197
|
+
<p> <strong>Route automatically detected!</strong> No need to specify the route prop when using React Router.</p>
|
|
198
|
+
|
|
199
|
+
<FeatureGrid
|
|
200
|
+
columns={3}
|
|
201
|
+
gap="medium"
|
|
202
|
+
features={[
|
|
203
|
+
{
|
|
204
|
+
id: 'auto-route',
|
|
205
|
+
icon: <span style={{ fontSize: '2rem' }}></span>,
|
|
206
|
+
title: 'Auto-Detection',
|
|
207
|
+
description: 'Current route is automatically detected using useLocation() hook.',
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
id: 'canonical',
|
|
211
|
+
icon: <span style={{ fontSize: '2rem' }}>🔗</span>,
|
|
212
|
+
title: 'SEO Optimization',
|
|
213
|
+
description: 'Canonical URLs are automatically generated for better SEO.',
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
id: 'integration',
|
|
217
|
+
icon: <span style={{ fontSize: '2rem' }}>⚙</span>,
|
|
218
|
+
title: 'Seamless Integration',
|
|
219
|
+
description: 'Works perfectly with Scaffold navigation and app bar.',
|
|
220
|
+
},
|
|
221
|
+
]}
|
|
222
|
+
/>
|
|
223
223
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
224
|
+
<div style={{ marginTop: '2rem', padding: '1rem', backgroundColor: 'var(--theme-surface)', borderRadius: '8px', border: '1px solid var(--theme-outline)' }}>
|
|
225
|
+
<h4>Try Navigation:</h4>
|
|
226
|
+
<div style={{ display: 'flex', gap: '1rem', flexWrap: 'wrap', marginTop: '1rem' }}>
|
|
227
|
+
<Link to="/products" style={{ padding: '0.5rem 1rem', backgroundColor: 'var(--theme-primary)', color: 'var(--theme-on-primary)', borderRadius: '4px', textDecoration: 'none' }}>
|
|
228
|
+
Products
|
|
229
|
+
</Link>
|
|
230
|
+
<Link to="/about" style={{ padding: '0.5rem 1rem', backgroundColor: 'var(--theme-primary)', color: 'var(--theme-on-primary)', borderRadius: '4px', textDecoration: 'none' }}>
|
|
231
|
+
About
|
|
232
|
+
</Link>
|
|
233
|
+
<Link to="/contact" style={{ padding: '0.5rem 1rem', backgroundColor: 'var(--theme-primary)', color: 'var(--theme-on-primary)', borderRadius: '4px', textDecoration: 'none' }}>
|
|
234
|
+
Contact
|
|
235
|
+
</Link>
|
|
236
|
+
</div>
|
|
237
|
+
</div>
|
|
238
|
+
</Content>
|
|
239
|
+
</Section>
|
|
240
|
+
</Page>
|
|
241
|
+
} />
|
|
242
|
+
|
|
243
|
+
<Route path="/products" element={
|
|
244
|
+
<Page>
|
|
245
|
+
<Section padding="large">
|
|
246
|
+
<Content title="Products Page" centered maxWidth="large">
|
|
247
|
+
<p>This is the products page. Notice how the route is automatically detected and the page title updates in both the browser tab and app bar.</p>
|
|
248
|
+
|
|
249
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))', gap: '1rem', marginTop: '2rem' }}>
|
|
250
|
+
{['Product A', 'Product B', 'Product C'].map(product => (
|
|
251
|
+
<div key={product} style={{
|
|
252
|
+
padding: '1.5rem',
|
|
253
|
+
border: '1px solid var(--theme-outline)',
|
|
254
|
+
borderRadius: '8px',
|
|
255
|
+
backgroundColor: 'var(--theme-surface)',
|
|
256
|
+
textAlign: 'center'
|
|
257
|
+
}}>
|
|
258
|
+
<h4>{product}</h4>
|
|
259
|
+
<p>Sample product description</p>
|
|
260
|
+
</div>
|
|
261
|
+
))}
|
|
262
|
+
</div>
|
|
263
|
+
|
|
264
|
+
<div style={{ marginTop: '2rem' }}>
|
|
265
|
+
<Link to="/" style={{ color: 'var(--theme-primary)' }}>← Back to Home</Link>
|
|
266
|
+
</div>
|
|
267
|
+
</Content>
|
|
268
|
+
</Section>
|
|
269
|
+
</Page>
|
|
270
|
+
} />
|
|
271
|
+
|
|
272
|
+
<Route path="/about" element={
|
|
273
|
+
<Page>
|
|
274
|
+
<Section padding="large" background="alternate">
|
|
275
|
+
<Content title="About Our Company" centered maxWidth="large">
|
|
276
|
+
<p>Learn about our mission and values. This page demonstrates different layout options.</p>
|
|
277
|
+
|
|
278
|
+
<GridLayout columns={2} spacing="large">
|
|
279
|
+
<GridCell>
|
|
280
|
+
<Content variant="elevated">
|
|
281
|
+
<h3>Our Mission</h3>
|
|
282
|
+
<p>To build amazing React applications with powerful, reusable components that follow best practices.</p>
|
|
283
|
+
</Content>
|
|
284
|
+
</GridCell>
|
|
285
|
+
|
|
286
|
+
<GridCell>
|
|
287
|
+
<Content variant="outlined">
|
|
288
|
+
<h3>Our Values</h3>
|
|
289
|
+
<ul>
|
|
290
|
+
<li>Developer Experience</li>
|
|
291
|
+
<li>Accessibility First</li>
|
|
292
|
+
<li>Performance Optimized</li>
|
|
293
|
+
<li>Type Safety</li>
|
|
294
|
+
</ul>
|
|
295
|
+
</Content>
|
|
296
|
+
</GridCell>
|
|
297
|
+
</GridLayout>
|
|
298
|
+
|
|
299
|
+
<div style={{ marginTop: '2rem' }}>
|
|
300
|
+
<Link to="/" style={{ color: 'var(--theme-primary)' }}>← Back to Home</Link>
|
|
301
|
+
</div>
|
|
302
|
+
</Content>
|
|
303
|
+
</Section>
|
|
304
|
+
</Page>
|
|
305
|
+
} />
|
|
306
|
+
|
|
307
|
+
<Route path="/contact" element={
|
|
308
|
+
<Page>
|
|
309
|
+
<Section padding="large">
|
|
310
|
+
<Content title="Get In Touch" centered maxWidth="medium">
|
|
311
|
+
<p>This page demonstrates page-specific actions in the app bar.</p>
|
|
312
|
+
|
|
313
|
+
<div style={{
|
|
314
|
+
padding: '2rem',
|
|
315
|
+
backgroundColor: 'var(--theme-surface)',
|
|
316
|
+
borderRadius: '8px',
|
|
317
|
+
border: '1px solid var(--theme-outline)',
|
|
318
|
+
marginTop: '2rem'
|
|
319
|
+
}}>
|
|
320
|
+
<h4>Contact Information</h4>
|
|
321
|
+
<div style={{ display: 'grid', gap: '1rem', marginTop: '1rem' }}>
|
|
322
|
+
<div>📧 contact@example.com</div>
|
|
323
|
+
<div>📞 (555) 123-4567</div>
|
|
324
|
+
<div>🏢 123 Main Street, City, State 12345</div>
|
|
325
|
+
</div>
|
|
326
|
+
<hr style={{ margin: '1.5rem 0', borderColor: 'var(--theme-outline)' }} />
|
|
327
|
+
<Button label='Send Message' onClick={() => alert('Message sent!')} />
|
|
328
|
+
</div>
|
|
329
|
+
|
|
330
|
+
<div style={{ marginTop: '2rem' }}>
|
|
331
|
+
<Link to="/" style={{ color: 'var(--theme-primary)' }}>← Back to Home</Link>
|
|
332
|
+
</div>
|
|
333
|
+
</Content>
|
|
334
|
+
</Section>
|
|
335
|
+
</Page>
|
|
336
|
+
} />
|
|
337
|
+
</Routes>
|
|
338
|
+
</RouterNavigationWrapper>
|
|
339
|
+
</BrowserRouter>
|
|
340
|
+
</QwickApp>
|
|
341
|
+
),
|
|
342
|
+
parameters: {
|
|
343
|
+
docs: {
|
|
344
|
+
description: {
|
|
345
|
+
story: 'Complete routing integration demo with React Router. Shows automatic route detection, navigation, and page-specific actions.',
|
|
346
|
+
},
|
|
347
|
+
},
|
|
348
|
+
},
|
|
349
349
|
};
|
|
350
350
|
|
|
351
351
|
export const PageVariants: Story = {
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
352
|
+
args: {
|
|
353
|
+
variant: 'default',
|
|
354
|
+
},
|
|
355
|
+
render: (args) => (
|
|
356
|
+
<QwickApp appId="page-variants-demo" appName='Page Variants Demo'>
|
|
357
|
+
<BrowserRouter>
|
|
358
|
+
<Scaffold appName="Page Variants" navigationItems={navigationItems} showAppBar={true}>
|
|
359
|
+
<Routes>
|
|
360
|
+
<Route path="/" element={
|
|
361
|
+
<Page {...args} variant="centered">
|
|
362
|
+
<Section padding="large">
|
|
363
|
+
<Content title="Page Layout Variants" centered>
|
|
364
|
+
<p>The Page component supports multiple layout variants for different content types.</p>
|
|
365
|
+
|
|
366
|
+
<div style={{ display: 'flex', gap: '1rem', justifyContent: 'center', flexWrap: 'wrap', marginTop: '2rem' }}>
|
|
367
|
+
<Link to="/narrow" style={{ padding: '0.5rem 1rem', backgroundColor: 'var(--theme-primary)', color: 'var(--theme-on-primary)', borderRadius: '4px', textDecoration: 'none' }}>
|
|
368
|
+
Narrow
|
|
369
|
+
</Link>
|
|
370
|
+
<Link to="/wide" style={{ padding: '0.5rem 1rem', backgroundColor: 'var(--theme-primary)', color: 'var(--theme-on-primary)', borderRadius: '4px', textDecoration: 'none' }}>
|
|
371
|
+
Wide
|
|
372
|
+
</Link>
|
|
373
|
+
<Link to="/fullwidth" style={{ padding: '0.5rem 1rem', backgroundColor: 'var(--theme-primary)', color: 'var(--theme-on-primary)', borderRadius: '4px', textDecoration: 'none' }}>
|
|
374
|
+
Full Width
|
|
375
|
+
</Link>
|
|
376
|
+
</div>
|
|
377
|
+
</Content>
|
|
378
|
+
</Section>
|
|
379
|
+
</Page>
|
|
380
|
+
} />
|
|
381
|
+
|
|
382
|
+
<Route path="/narrow" element={
|
|
383
|
+
<Page variant="narrow" padding="large">
|
|
384
|
+
<Content title="Narrow Content Layout" centered>
|
|
385
|
+
<p>Perfect for blog posts, articles, and focused content. The narrow layout provides optimal reading width for text-heavy content.</p>
|
|
386
|
+
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.</p>
|
|
387
|
+
<div style={{ marginTop: '2rem' }}>
|
|
388
|
+
<Link to="/" style={{ color: 'var(--theme-primary)' }}>← Back</Link>
|
|
389
|
+
</div>
|
|
390
|
+
</Content>
|
|
391
|
+
</Page>
|
|
392
|
+
} />
|
|
393
|
+
|
|
394
|
+
<Route path="/wide" element={
|
|
395
|
+
<Page variant="wide" padding="large">
|
|
396
|
+
<Content title="Wide Content Layout">
|
|
397
|
+
<p>Great for dashboards, data tables, and content that needs more horizontal space.</p>
|
|
398
|
+
|
|
399
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: '1rem', marginTop: '2rem' }}>
|
|
400
|
+
{[1, 2, 3, 4, 5, 6, 7, 8].map(i => (
|
|
401
|
+
<div key={i} style={{
|
|
402
|
+
padding: '1rem',
|
|
403
|
+
backgroundColor: 'var(--theme-surface)',
|
|
404
|
+
border: '1px solid var(--theme-outline)',
|
|
405
|
+
borderRadius: '4px',
|
|
406
|
+
textAlign: 'center'
|
|
407
|
+
}}>
|
|
408
|
+
Card {i}
|
|
409
|
+
</div>
|
|
410
|
+
))}
|
|
411
|
+
</div>
|
|
412
|
+
|
|
413
|
+
<div style={{ marginTop: '2rem' }}>
|
|
414
|
+
<Link to="/" style={{ color: 'var(--theme-primary)' }}>← Back</Link>
|
|
415
|
+
</div>
|
|
416
|
+
</Content>
|
|
417
|
+
</Page>
|
|
418
|
+
} />
|
|
419
|
+
|
|
420
|
+
<Route path="/fullwidth" element={
|
|
421
|
+
<Page variant="fullwidth" padding="none">
|
|
422
|
+
<div style={{
|
|
423
|
+
height: '400px',
|
|
424
|
+
background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
|
|
425
|
+
display: 'flex',
|
|
426
|
+
alignItems: 'center',
|
|
427
|
+
justifyContent: 'center',
|
|
428
|
+
color: 'white',
|
|
429
|
+
marginBottom: '2rem'
|
|
430
|
+
}}>
|
|
431
|
+
<div style={{ textAlign: 'center' }}>
|
|
432
|
+
<h2>Full Width Hero Section</h2>
|
|
433
|
+
<p>Perfect for landing pages and immersive content</p>
|
|
434
|
+
</div>
|
|
435
|
+
</div>
|
|
436
|
+
|
|
437
|
+
<Section padding="large">
|
|
438
|
+
<Content centered maxWidth="large">
|
|
439
|
+
<p>Full width layout removes all default padding and constraints, giving you complete control over the content layout.</p>
|
|
440
|
+
<div style={{ marginTop: '2rem' }}>
|
|
441
|
+
<Link to="/" style={{ color: 'var(--theme-primary)' }}>← Back</Link>
|
|
442
|
+
</div>
|
|
443
|
+
</Content>
|
|
444
|
+
</Section>
|
|
445
|
+
</Page>
|
|
446
|
+
} />
|
|
447
|
+
</Routes>
|
|
448
|
+
</Scaffold>
|
|
449
|
+
</BrowserRouter>
|
|
450
|
+
</QwickApp>
|
|
451
|
+
),
|
|
452
|
+
parameters: {
|
|
453
|
+
docs: {
|
|
454
|
+
description: {
|
|
455
|
+
story: 'Demonstrates different page layout variants: narrow, wide, and fullwidth options for different content types.',
|
|
456
|
+
},
|
|
457
|
+
},
|
|
458
|
+
},
|
|
459
459
|
};
|
|
460
460
|
|
|
461
461
|
export const LoadingAndErrorStates: Story = {
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
462
|
+
args: {
|
|
463
|
+
loading: true,
|
|
464
|
+
},
|
|
465
|
+
render: (args) => (
|
|
466
|
+
<Page {...args}>
|
|
467
|
+
<Section padding="large">
|
|
468
|
+
<Content>
|
|
469
|
+
<p>This content won't be visible in loading state.</p>
|
|
470
|
+
</Content>
|
|
471
|
+
</Section>
|
|
472
|
+
</Page>
|
|
473
|
+
),
|
|
474
|
+
parameters: {
|
|
475
|
+
docs: {
|
|
476
|
+
description: {
|
|
477
|
+
story: 'Demonstrates loading and error states. Toggle the loading and error controls to see different states.',
|
|
478
|
+
},
|
|
479
|
+
},
|
|
480
|
+
},
|
|
481
481
|
};
|
|
482
482
|
|
|
483
483
|
export const WithCoverImageHeader: Story = {
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
484
|
+
args: {
|
|
485
|
+
variant: 'default',
|
|
486
|
+
padding: 'medium',
|
|
487
|
+
header: (
|
|
488
|
+
<CoverImageHeader
|
|
489
|
+
image="https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=300&q=80"
|
|
490
|
+
imageAlt="Team collaboration"
|
|
491
|
+
title="Project Dashboard"
|
|
492
|
+
subtitle="Manage your projects efficiently with powerful tools"
|
|
493
|
+
overline="WORKSPACE"
|
|
494
|
+
tags={['Active', 'Team Project', 'Due Soon']}
|
|
495
|
+
actions={[
|
|
496
|
+
{
|
|
497
|
+
id: 'edit',
|
|
498
|
+
label: 'Edit',
|
|
499
|
+
icon: <EditIcon />,
|
|
500
|
+
onClick: () => alert('Edit clicked'),
|
|
501
|
+
priority: 1,
|
|
502
|
+
},
|
|
503
|
+
{
|
|
504
|
+
id: 'share',
|
|
505
|
+
label: 'Share',
|
|
506
|
+
icon: <ShareIcon />,
|
|
507
|
+
onClick: () => alert('Share clicked'),
|
|
508
|
+
priority: 2,
|
|
509
|
+
},
|
|
510
|
+
{
|
|
511
|
+
id: 'settings',
|
|
512
|
+
label: 'Settings',
|
|
513
|
+
icon: <SettingsIcon />,
|
|
514
|
+
onClick: () => alert('Settings clicked'),
|
|
515
|
+
priority: 3,
|
|
516
|
+
},
|
|
517
|
+
{
|
|
518
|
+
id: 'archive',
|
|
519
|
+
label: 'Archive',
|
|
520
|
+
onClick: () => alert('Archive clicked'),
|
|
521
|
+
destructive: true,
|
|
522
|
+
priority: 4,
|
|
523
|
+
},
|
|
524
|
+
]}
|
|
525
|
+
maxVisibleActions={2}
|
|
526
|
+
/>
|
|
527
|
+
),
|
|
528
|
+
},
|
|
529
|
+
render: (args) => (
|
|
530
|
+
<Page {...args}>
|
|
531
|
+
<Section padding="large">
|
|
532
|
+
<Content title="Page with CoverImageHeader" maxWidth="large">
|
|
533
|
+
<p>This example shows how to use the CoverImageHeader component as a page header. It provides a clean layout with image, title, subtitle, tags, and actions.</p>
|
|
534
|
+
|
|
535
|
+
<FeatureGrid
|
|
536
|
+
columns={3}
|
|
537
|
+
gap="medium"
|
|
538
|
+
features={[
|
|
539
|
+
{
|
|
540
|
+
id: 'header-image',
|
|
541
|
+
icon: <span style={{ fontSize: '2rem' }}>🖼</span>,
|
|
542
|
+
title: 'Header Image',
|
|
543
|
+
description: 'Optional image or avatar with configurable size and shape.',
|
|
544
|
+
},
|
|
545
|
+
{
|
|
546
|
+
id: 'contextual-actions',
|
|
547
|
+
icon: <span style={{ fontSize: '2rem' }}></span>,
|
|
548
|
+
title: 'Contextual Actions',
|
|
549
|
+
description: 'Priority-based actions with overflow menu for additional options.',
|
|
550
|
+
},
|
|
551
|
+
{
|
|
552
|
+
id: 'flexible-content',
|
|
553
|
+
icon: <span style={{ fontSize: '2rem' }}></span>,
|
|
554
|
+
title: 'Flexible Content',
|
|
555
|
+
description: 'Overline, title, subtitle, and tags for comprehensive information display.',
|
|
556
|
+
},
|
|
557
|
+
]}
|
|
558
|
+
/>
|
|
559
|
+
</Content>
|
|
560
|
+
</Section>
|
|
561
|
+
</Page>
|
|
562
|
+
),
|
|
563
|
+
parameters: {
|
|
564
|
+
docs: {
|
|
565
|
+
description: {
|
|
566
|
+
story: 'Demonstrates using CoverImageHeader as a page header with image, title, subtitle, tags, and contextual actions.',
|
|
567
|
+
},
|
|
568
|
+
},
|
|
569
|
+
},
|
|
570
570
|
};
|
|
571
571
|
|
|
572
572
|
export const WithPageBannerHeader: Story = {
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
573
|
+
args: {
|
|
574
|
+
variant: 'default',
|
|
575
|
+
padding: 'none',
|
|
576
|
+
header: (
|
|
577
|
+
<PageBannerHeader
|
|
578
|
+
coverImage="https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80"
|
|
579
|
+
coverImageAlt="Team workspace"
|
|
580
|
+
profileImage="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=150&q=80"
|
|
581
|
+
profileImageAlt="User avatar"
|
|
582
|
+
title="John Doe"
|
|
583
|
+
subtitle="Senior Product Manager"
|
|
584
|
+
overline="TEAM MEMBER"
|
|
585
|
+
metadata={[
|
|
586
|
+
{ label: 'Projects', value: 12 },
|
|
587
|
+
{ label: 'Team Size', value: 8 },
|
|
588
|
+
{ label: 'Years', value: '3+' },
|
|
589
|
+
]}
|
|
590
|
+
tags={['Product Manager', 'Team Lead', 'Remote']}
|
|
591
|
+
actions={[
|
|
592
|
+
{
|
|
593
|
+
id: 'message',
|
|
594
|
+
label: 'Message',
|
|
595
|
+
icon: <ShareIcon />,
|
|
596
|
+
onClick: () => alert('Message sent'),
|
|
597
|
+
priority: 1,
|
|
598
|
+
},
|
|
599
|
+
{
|
|
600
|
+
id: 'follow',
|
|
601
|
+
label: 'Follow',
|
|
602
|
+
icon: <AddIcon />,
|
|
603
|
+
onClick: () => alert('Following'),
|
|
604
|
+
priority: 2,
|
|
605
|
+
},
|
|
606
|
+
{
|
|
607
|
+
id: 'more',
|
|
608
|
+
label: 'More',
|
|
609
|
+
icon: <MoreIcon />,
|
|
610
|
+
onClick: () => alert('More options'),
|
|
611
|
+
priority: 3,
|
|
612
|
+
},
|
|
613
|
+
]}
|
|
614
|
+
height={180}
|
|
615
|
+
profilePosition="overlay-center"
|
|
616
|
+
/>
|
|
617
|
+
),
|
|
618
|
+
},
|
|
619
|
+
render: (args) => (
|
|
620
|
+
<Page {...args}>
|
|
621
|
+
<Section padding="large">
|
|
622
|
+
<Content title="Page with PageBannerHeader" maxWidth="large">
|
|
623
|
+
<p>This example demonstrates the Facebook-style PageBannerHeader with cover image, profile overlay, metadata, and responsive actions.</p>
|
|
624
624
|
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
625
|
+
<GridLayout columns={2} spacing="large">
|
|
626
|
+
<GridCell>
|
|
627
|
+
<Content variant="outlined">
|
|
628
|
+
<h3>Banner Features</h3>
|
|
629
|
+
<ul>
|
|
630
|
+
<li>Cover image with gradient overlay</li>
|
|
631
|
+
<li>Profile image with configurable position</li>
|
|
632
|
+
<li>Metadata display (followers, posts, etc.)</li>
|
|
633
|
+
<li>Tag system for categorization</li>
|
|
634
|
+
<li>Responsive action buttons</li>
|
|
635
|
+
</ul>
|
|
636
|
+
</Content>
|
|
637
|
+
</GridCell>
|
|
638
|
+
|
|
639
|
+
<GridCell>
|
|
640
|
+
<Content variant="elevated">
|
|
641
|
+
<h3>Use Cases</h3>
|
|
642
|
+
<ul>
|
|
643
|
+
<li>User profiles and team pages</li>
|
|
644
|
+
<li>Project showcases</li>
|
|
645
|
+
<li>Company pages</li>
|
|
646
|
+
<li>Social media style layouts</li>
|
|
647
|
+
<li>Portfolio headers</li>
|
|
648
|
+
</ul>
|
|
649
|
+
</Content>
|
|
650
|
+
</GridCell>
|
|
651
|
+
</GridLayout>
|
|
652
|
+
</Content>
|
|
653
|
+
</Section>
|
|
654
|
+
</Page>
|
|
655
|
+
),
|
|
656
|
+
parameters: {
|
|
657
|
+
docs: {
|
|
658
|
+
description: {
|
|
659
|
+
story: 'Shows PageBannerHeader with Facebook-style banner, profile overlay, metadata display, and responsive actions.',
|
|
660
|
+
},
|
|
661
|
+
},
|
|
662
|
+
},
|
|
663
663
|
};
|
|
664
664
|
|
|
665
665
|
export const WithFooter: Story = {
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
666
|
+
args: {
|
|
667
|
+
variant: 'default',
|
|
668
|
+
padding: 'medium',
|
|
669
|
+
footer: (
|
|
670
|
+
<Footer
|
|
671
|
+
logo={<div style={{ fontWeight: 'bold', fontSize: '1.2rem', color: 'var(--theme-primary)' }}>QwickApps</div>}
|
|
672
|
+
sections={[
|
|
673
|
+
{
|
|
674
|
+
id: 'product',
|
|
675
|
+
title: 'Product',
|
|
676
|
+
items: [
|
|
677
|
+
{ id: 'features', label: 'Features', href: '#features' },
|
|
678
|
+
{ id: 'pricing', label: 'Pricing', href: '#pricing' },
|
|
679
|
+
{ id: 'documentation', label: 'Documentation', href: '#docs' },
|
|
680
|
+
{ id: 'api', label: 'API Reference', href: '#api' },
|
|
681
|
+
],
|
|
682
|
+
},
|
|
683
|
+
{
|
|
684
|
+
id: 'company',
|
|
685
|
+
title: 'Company',
|
|
686
|
+
items: [
|
|
687
|
+
{ id: 'about', label: 'About', href: '#about' },
|
|
688
|
+
{ id: 'careers', label: 'Careers', href: '#careers' },
|
|
689
|
+
{ id: 'blog', label: 'Blog', href: '#blog' },
|
|
690
|
+
{ id: 'contact', label: 'Contact', href: '#contact' },
|
|
691
|
+
],
|
|
692
|
+
},
|
|
693
|
+
{
|
|
694
|
+
id: 'support',
|
|
695
|
+
title: 'Support',
|
|
696
|
+
items: [
|
|
697
|
+
{ id: 'help', label: 'Help Center', href: '#help' },
|
|
698
|
+
{ id: 'community', label: 'Community', href: '#community' },
|
|
699
|
+
{ id: 'status', label: 'Status', href: '#status', external: true },
|
|
700
|
+
],
|
|
701
|
+
},
|
|
702
|
+
]}
|
|
703
|
+
copyright="© 2025 QwickApps. All rights reserved."
|
|
704
|
+
legalText="Privacy Policy • Terms of Service"
|
|
705
|
+
orientation="horizontal"
|
|
706
|
+
variant="contained"
|
|
707
|
+
/>
|
|
708
|
+
),
|
|
709
|
+
},
|
|
710
|
+
render: (args) => (
|
|
711
|
+
<Page {...args}>
|
|
712
|
+
<Section padding="large">
|
|
713
|
+
<Content title="Page with Footer Component" centered maxWidth="large">
|
|
714
|
+
<p>This example shows how to add a comprehensive footer to your pages with multiple sections, links, and legal information.</p>
|
|
715
|
+
|
|
716
|
+
<FeatureGrid
|
|
717
|
+
columns={3}
|
|
718
|
+
gap="medium"
|
|
719
|
+
features={[
|
|
720
|
+
{
|
|
721
|
+
id: 'sections',
|
|
722
|
+
icon: <span style={{ fontSize: '2rem' }}>📂</span>,
|
|
723
|
+
title: 'Organized Sections',
|
|
724
|
+
description: 'Group related links into titled sections for better organization.',
|
|
725
|
+
},
|
|
726
|
+
{
|
|
727
|
+
id: 'responsive',
|
|
728
|
+
icon: <span style={{ fontSize: '2rem' }}></span>,
|
|
729
|
+
title: 'Responsive Design',
|
|
730
|
+
description: 'Automatically adapts layout for mobile and desktop viewing.',
|
|
731
|
+
},
|
|
732
|
+
{
|
|
733
|
+
id: 'legal',
|
|
734
|
+
icon: <span style={{ fontSize: '2rem' }}>⚖</span>,
|
|
735
|
+
title: 'Legal Information',
|
|
736
|
+
description: 'Built-in support for copyright, privacy policy, and terms.',
|
|
737
|
+
},
|
|
738
|
+
]}
|
|
739
|
+
/>
|
|
740
740
|
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
741
|
+
<div style={{ marginTop: '3rem', padding: '2rem', backgroundColor: 'var(--theme-surface)', borderRadius: '8px', border: '1px solid var(--theme-outline)' }}>
|
|
742
|
+
<h4>Footer Configuration Options:</h4>
|
|
743
|
+
<ul style={{ textAlign: 'left', margin: '1rem 0' }}>
|
|
744
|
+
<li><strong>Sections:</strong> Organize links into logical groups</li>
|
|
745
|
+
<li><strong>Orientation:</strong> Vertical (default) or horizontal layout</li>
|
|
746
|
+
<li><strong>Variants:</strong> Default, contained, or outlined styling</li>
|
|
747
|
+
<li><strong>Logo/Branding:</strong> Optional logo or brand element</li>
|
|
748
|
+
<li><strong>Legal Text:</strong> Copyright and policy links</li>
|
|
749
|
+
</ul>
|
|
750
|
+
</div>
|
|
751
|
+
</Content>
|
|
752
|
+
</Section>
|
|
753
|
+
</Page>
|
|
754
|
+
),
|
|
755
|
+
parameters: {
|
|
756
|
+
docs: {
|
|
757
|
+
description: {
|
|
758
|
+
story: 'Demonstrates comprehensive footer implementation with sections, legal information, and responsive design.',
|
|
759
|
+
},
|
|
760
|
+
},
|
|
761
|
+
},
|
|
762
762
|
};
|