@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
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
8
|
+
Block as BlockIcon,
|
|
9
|
+
Bookmark as BookmarkIcon,
|
|
10
|
+
Edit as EditIcon,
|
|
11
|
+
Favorite as FavoriteIcon,
|
|
12
|
+
PersonAdd as FollowIcon,
|
|
13
|
+
Message as MessageIcon,
|
|
14
|
+
Report as ReportIcon,
|
|
15
|
+
Share as ShareIcon
|
|
16
16
|
} from '@mui/icons-material';
|
|
17
17
|
import { Box, Typography } from '@mui/material';
|
|
18
18
|
import { JsonDataProvider } from '@qwickapps/schema';
|
|
@@ -22,13 +22,13 @@ import PageBannerHeader from '../components/blocks/PageBannerHeader';
|
|
|
22
22
|
import QwickApp from '../components/QwickApp';
|
|
23
23
|
|
|
24
24
|
const meta: Meta<typeof PageBannerHeader> = {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
title: 'Blocks/PageBannerHeader',
|
|
26
|
+
component: PageBannerHeader,
|
|
27
|
+
parameters: {
|
|
28
|
+
layout: 'fullscreen',
|
|
29
|
+
docs: {
|
|
30
|
+
description: {
|
|
31
|
+
component: `The PageBannerHeader component provides a Facebook-style banner layout with cover image and profile overlay.
|
|
32
32
|
|
|
33
33
|
**Key Features:**
|
|
34
34
|
- **Cover Image**: Large banner background image with gradient overlay
|
|
@@ -45,70 +45,70 @@ const meta: Meta<typeof PageBannerHeader> = {
|
|
|
45
45
|
- Social media style layouts
|
|
46
46
|
- Personal brand pages and portfolios
|
|
47
47
|
- Community group headers`,
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
tags: ['autodocs'],
|
|
52
|
+
argTypes: {
|
|
53
|
+
coverImage: {
|
|
54
|
+
description: 'Cover/banner image URL',
|
|
55
|
+
control: { type: 'text' },
|
|
56
|
+
},
|
|
57
|
+
coverImageAlt: {
|
|
58
|
+
description: 'Cover image alt text',
|
|
59
|
+
control: { type: 'text' },
|
|
60
|
+
},
|
|
61
|
+
profileImage: {
|
|
62
|
+
description: 'Profile/avatar image URL or component',
|
|
63
|
+
control: { type: 'text' },
|
|
64
|
+
},
|
|
65
|
+
profileImageAlt: {
|
|
66
|
+
description: 'Profile image alt text',
|
|
67
|
+
control: { type: 'text' },
|
|
68
|
+
},
|
|
69
|
+
profileImageSize: {
|
|
70
|
+
description: 'Profile image size',
|
|
71
|
+
control: { type: 'select' },
|
|
72
|
+
options: ['small', 'medium', 'large'],
|
|
73
|
+
},
|
|
74
|
+
overline: {
|
|
75
|
+
description: 'Optional overline text',
|
|
76
|
+
control: { type: 'text' },
|
|
77
|
+
},
|
|
78
|
+
title: {
|
|
79
|
+
description: 'Main title',
|
|
80
|
+
control: { type: 'text' },
|
|
81
|
+
},
|
|
82
|
+
subtitle: {
|
|
83
|
+
description: 'Subtitle text',
|
|
84
|
+
control: { type: 'text' },
|
|
85
|
+
},
|
|
86
|
+
metadata: {
|
|
87
|
+
description: 'Array of metadata items (followers, posts, etc.)',
|
|
88
|
+
control: { type: 'object' },
|
|
89
|
+
},
|
|
90
|
+
tags: {
|
|
91
|
+
description: 'Array of tag strings or JSX elements',
|
|
92
|
+
control: { type: 'object' },
|
|
93
|
+
},
|
|
94
|
+
actions: {
|
|
95
|
+
description: 'Action buttons',
|
|
96
|
+
control: false,
|
|
97
|
+
},
|
|
98
|
+
maxVisibleActions: {
|
|
99
|
+
description: 'Maximum visible actions before overflow',
|
|
100
|
+
control: { type: 'number', min: 1, max: 5 },
|
|
101
|
+
},
|
|
102
|
+
height: {
|
|
103
|
+
description: 'Banner height in pixels',
|
|
104
|
+
control: { type: 'number', min: 120, max: 300 },
|
|
105
|
+
},
|
|
106
|
+
profilePosition: {
|
|
107
|
+
description: 'Profile position relative to banner',
|
|
108
|
+
control: { type: 'select' },
|
|
109
|
+
options: ['bottom-left', 'bottom-center', 'overlay-center'],
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
112
|
} satisfies Meta<typeof PageBannerHeader>;
|
|
113
113
|
|
|
114
114
|
export default meta;
|
|
@@ -116,834 +116,834 @@ type Story = StoryObj<typeof meta>;
|
|
|
116
116
|
|
|
117
117
|
// Sample CMS data for data binding stories
|
|
118
118
|
const sampleCmsData = {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
119
|
+
'pageBannerHeaders': {
|
|
120
|
+
'teamMember': {
|
|
121
|
+
coverImage: 'https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80',
|
|
122
|
+
coverImageAlt: 'Mountain landscape cover image',
|
|
123
|
+
profileImage: 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=200&q=80',
|
|
124
|
+
profileImageAlt: 'John Doe profile photo',
|
|
125
|
+
profileImageSize: 'large',
|
|
126
|
+
overline: 'TEAM LEAD',
|
|
127
|
+
title: 'John Doe',
|
|
128
|
+
subtitle: 'Senior Full Stack Developer & Team Leader',
|
|
129
|
+
metadata: [
|
|
130
|
+
{ label: 'projects', value: '25+' },
|
|
131
|
+
{ label: 'experience', value: '8 years' },
|
|
132
|
+
{ label: 'team size', value: 12 }
|
|
133
|
+
],
|
|
134
|
+
tags: ['React', 'Node.js', 'TypeScript', 'Team Leadership', 'Architecture'],
|
|
135
|
+
maxVisibleActions: 2,
|
|
136
|
+
height: 220,
|
|
137
|
+
profilePosition: 'bottom-left'
|
|
138
|
+
},
|
|
139
|
+
'company': {
|
|
140
|
+
coverImage: 'https://images.unsplash.com/photo-1497366216548-37526070297c?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80',
|
|
141
|
+
coverImageAlt: 'QwickApps office space',
|
|
142
|
+
profileImageSize: 'medium',
|
|
143
|
+
overline: 'TECHNOLOGY COMPANY',
|
|
144
|
+
title: 'QwickApps React Framework',
|
|
145
|
+
subtitle: 'Revolutionizing React development with intelligent components',
|
|
146
|
+
metadata: [
|
|
147
|
+
{ label: 'developers', value: '50+' },
|
|
148
|
+
{ label: 'components', value: '200+' },
|
|
149
|
+
{ label: 'downloads', value: '1M+' }
|
|
150
|
+
],
|
|
151
|
+
tags: ['React', 'TypeScript', 'Open Source', 'Developer Tools'],
|
|
152
|
+
height: 200,
|
|
153
|
+
profilePosition: 'bottom-center'
|
|
154
|
+
},
|
|
155
|
+
'project': {
|
|
156
|
+
coverImage: 'https://images.unsplash.com/photo-1460925895917-afdab827c52f?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80',
|
|
157
|
+
coverImageAlt: 'Analytics dashboard screenshot',
|
|
158
|
+
profileImage: 'https://images.unsplash.com/photo-1551288049-bebda4e38f71?ixlib=rb-4.0.3&auto=format&fit=crop&w=200&q=80',
|
|
159
|
+
profileImageAlt: 'Project logo',
|
|
160
|
+
profileImageSize: 'medium',
|
|
161
|
+
overline: 'FEATURED PROJECT',
|
|
162
|
+
title: 'Real-time Analytics Platform',
|
|
163
|
+
subtitle: 'Advanced data visualization and business intelligence dashboard',
|
|
164
|
+
metadata: [
|
|
165
|
+
{ label: 'users', value: '10K+' },
|
|
166
|
+
{ label: 'data points', value: '1B+' },
|
|
167
|
+
{ label: 'uptime', value: '99.9%' }
|
|
168
|
+
],
|
|
169
|
+
tags: ['React', 'D3.js', 'PostgreSQL', 'Real-time', 'Data Viz'],
|
|
170
|
+
height: 180,
|
|
171
|
+
profilePosition: 'overlay-center'
|
|
172
|
+
},
|
|
173
|
+
'accessibilityDemo': {
|
|
174
|
+
coverImage: 'https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80',
|
|
175
|
+
coverImageAlt: 'Scenic mountain landscape with accessible pathways',
|
|
176
|
+
profileImage: 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=200&q=80',
|
|
177
|
+
profileImageAlt: 'Profile photo of accessibility advocate Sarah Johnson',
|
|
178
|
+
profileImageSize: 'large',
|
|
179
|
+
overline: 'ACCESSIBILITY ADVOCATE',
|
|
180
|
+
title: 'Sarah Johnson',
|
|
181
|
+
subtitle: 'UX Designer specializing in accessible web experiences',
|
|
182
|
+
metadata: [
|
|
183
|
+
{ label: 'audits completed', value: '150+' },
|
|
184
|
+
{ label: 'WCAG certifications', value: 3 },
|
|
185
|
+
{ label: 'speaking engagements', value: 25 }
|
|
186
|
+
],
|
|
187
|
+
tags: ['WCAG 2.1', 'Screen Readers', 'Inclusive Design', 'ARIA', 'Color Contrast'],
|
|
188
|
+
maxVisibleActions: 2,
|
|
189
|
+
height: 200,
|
|
190
|
+
profilePosition: 'bottom-left'
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
193
|
};
|
|
194
194
|
|
|
195
195
|
const dataProvider = new JsonDataProvider({ data: sampleCmsData });
|
|
196
196
|
|
|
197
197
|
// Sample actions for demos
|
|
198
198
|
const profileActions = [
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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
|
-
|
|
199
|
+
{
|
|
200
|
+
id: 'message',
|
|
201
|
+
label: 'Message',
|
|
202
|
+
icon: <MessageIcon />,
|
|
203
|
+
onClick: () => alert('Message sent'),
|
|
204
|
+
priority: 1,
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
id: 'follow',
|
|
208
|
+
label: 'Follow',
|
|
209
|
+
icon: <FollowIcon />,
|
|
210
|
+
onClick: () => alert('Now following'),
|
|
211
|
+
priority: 2,
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
id: 'share',
|
|
215
|
+
label: 'Share',
|
|
216
|
+
icon: <ShareIcon />,
|
|
217
|
+
onClick: () => alert('Profile shared'),
|
|
218
|
+
priority: 3,
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
id: 'favorite',
|
|
222
|
+
label: 'Favorite',
|
|
223
|
+
icon: <FavoriteIcon />,
|
|
224
|
+
onClick: () => alert('Added to favorites'),
|
|
225
|
+
priority: 4,
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
id: 'bookmark',
|
|
229
|
+
label: 'Bookmark',
|
|
230
|
+
icon: <BookmarkIcon />,
|
|
231
|
+
onClick: () => alert('Bookmarked'),
|
|
232
|
+
priority: 5,
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
id: 'report',
|
|
236
|
+
label: 'Report',
|
|
237
|
+
icon: <ReportIcon />,
|
|
238
|
+
onClick: () => alert('Reported'),
|
|
239
|
+
destructive: true,
|
|
240
|
+
priority: 6,
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
id: 'block',
|
|
244
|
+
label: 'Block',
|
|
245
|
+
icon: <BlockIcon />,
|
|
246
|
+
onClick: () => alert('Blocked'),
|
|
247
|
+
destructive: true,
|
|
248
|
+
priority: 7,
|
|
249
|
+
},
|
|
250
250
|
];
|
|
251
251
|
|
|
252
252
|
export const UserProfile: Story = {
|
|
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
|
-
|
|
253
|
+
args: {
|
|
254
|
+
coverImage: 'https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80',
|
|
255
|
+
coverImageAlt: 'Scenic mountain landscape',
|
|
256
|
+
profileImage: 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=200&q=80',
|
|
257
|
+
profileImageAlt: 'Profile photo of John Doe',
|
|
258
|
+
title: 'John Doe',
|
|
259
|
+
subtitle: 'Senior Product Manager at TechCorp',
|
|
260
|
+
overline: 'TEAM MEMBER',
|
|
261
|
+
metadata: [
|
|
262
|
+
{ label: 'followers', value: '2.5K' },
|
|
263
|
+
{ label: 'following', value: 456 },
|
|
264
|
+
{ label: 'posts', value: 127 },
|
|
265
|
+
],
|
|
266
|
+
tags: ['Product Manager', 'Team Lead', 'Remote Work', 'Tech Enthusiast'],
|
|
267
|
+
actions: profileActions.slice(0, 5),
|
|
268
|
+
maxVisibleActions: 3,
|
|
269
|
+
height: 200,
|
|
270
|
+
profileImageSize: 'large',
|
|
271
|
+
profilePosition: 'bottom-left',
|
|
272
|
+
},
|
|
273
|
+
render: (args) => (
|
|
274
|
+
<QwickApp appId="banner-user-profile" appName='User Profile'>
|
|
275
|
+
<PageBannerHeader {...args} />
|
|
276
|
+
<div style={{ padding: '2rem', maxWidth: '800px', margin: '0 auto' }}>
|
|
277
|
+
<h3>About</h3>
|
|
278
|
+
<p>
|
|
279
|
+
Passionate product manager with over 5 years of experience in building user-centered products.
|
|
280
|
+
Led cross-functional teams to deliver innovative solutions that drive business growth and enhance user experience.
|
|
281
|
+
</p>
|
|
282
|
+
|
|
283
|
+
<h3>Experience</h3>
|
|
284
|
+
<div style={{ display: 'grid', gap: '1rem', marginTop: '1rem' }}>
|
|
285
|
+
<div style={{ padding: '1rem', border: '1px solid var(--theme-outline)', borderRadius: '8px' }}>
|
|
286
|
+
<strong>Senior Product Manager</strong> - TechCorp (2022 - Present)
|
|
287
|
+
</div>
|
|
288
|
+
<div style={{ padding: '1rem', border: '1px solid var(--theme-outline)', borderRadius: '8px' }}>
|
|
289
|
+
<strong>Product Manager</strong> - StartupXYZ (2020 - 2022)
|
|
290
|
+
</div>
|
|
291
|
+
</div>
|
|
292
|
+
</div>
|
|
293
|
+
</QwickApp>
|
|
294
|
+
),
|
|
295
|
+
parameters: {
|
|
296
|
+
docs: {
|
|
297
|
+
description: {
|
|
298
|
+
story: 'Complete user profile with cover image, profile photo, metadata, tags, and social actions. Perfect for team directories and social platforms.',
|
|
299
|
+
},
|
|
300
|
+
},
|
|
301
|
+
},
|
|
302
302
|
};
|
|
303
303
|
|
|
304
304
|
export const CompanyPage: Story = {
|
|
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
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
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
|
-
|
|
305
|
+
args: {
|
|
306
|
+
coverImage: 'https://images.unsplash.com/photo-1497366216548-37526070297c?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80',
|
|
307
|
+
coverImageAlt: 'Modern office space',
|
|
308
|
+
profileImage: (
|
|
309
|
+
<div style={{
|
|
310
|
+
width: '100%',
|
|
311
|
+
height: '100%',
|
|
312
|
+
backgroundColor: '#1976d2',
|
|
313
|
+
borderRadius: '16px',
|
|
314
|
+
display: 'flex',
|
|
315
|
+
alignItems: 'center',
|
|
316
|
+
justifyContent: 'center',
|
|
317
|
+
fontSize: '2rem',
|
|
318
|
+
fontWeight: 'bold',
|
|
319
|
+
color: 'white',
|
|
320
|
+
}}>
|
|
321
|
+
TC
|
|
322
|
+
</div>
|
|
323
|
+
),
|
|
324
|
+
title: 'TechCorp Solutions',
|
|
325
|
+
subtitle: 'Building the future of enterprise software',
|
|
326
|
+
overline: 'TECHNOLOGY COMPANY',
|
|
327
|
+
metadata: [
|
|
328
|
+
{ label: 'employees', value: '500+' },
|
|
329
|
+
{ label: 'founded', value: 2018 },
|
|
330
|
+
{ label: 'locations', value: 12 },
|
|
331
|
+
],
|
|
332
|
+
tags: ['Enterprise Software', 'AI/ML', 'Cloud Solutions', 'B2B'],
|
|
333
|
+
actions: [
|
|
334
|
+
{
|
|
335
|
+
id: 'contact',
|
|
336
|
+
label: 'Contact Us',
|
|
337
|
+
icon: <MessageIcon />,
|
|
338
|
+
onClick: () => alert('Contact form opened'),
|
|
339
|
+
priority: 1,
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
id: 'careers',
|
|
343
|
+
label: 'View Jobs',
|
|
344
|
+
icon: <EditIcon />,
|
|
345
|
+
onClick: () => alert('Careers page opened'),
|
|
346
|
+
priority: 2,
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
id: 'share',
|
|
350
|
+
label: 'Share',
|
|
351
|
+
icon: <ShareIcon />,
|
|
352
|
+
onClick: () => alert('Company page shared'),
|
|
353
|
+
priority: 3,
|
|
354
|
+
},
|
|
355
|
+
],
|
|
356
|
+
height: 180,
|
|
357
|
+
profileImageSize: 'medium',
|
|
358
|
+
profilePosition: 'bottom-left',
|
|
359
|
+
},
|
|
360
|
+
render: (args) => (
|
|
361
|
+
<QwickApp appId="banner-company" appName='Company Profile'>
|
|
362
|
+
<PageBannerHeader {...args} />
|
|
363
|
+
<div style={{ padding: '2rem', maxWidth: '1000px', margin: '0 auto' }}>
|
|
364
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))', gap: '2rem', marginTop: '2rem' }}>
|
|
365
|
+
<div>
|
|
366
|
+
<h3>About Us</h3>
|
|
367
|
+
<p>
|
|
368
|
+
TechCorp Solutions is a leading provider of enterprise software solutions,
|
|
369
|
+
specializing in AI-driven platforms that help businesses streamline operations
|
|
370
|
+
and drive digital transformation.
|
|
371
|
+
</p>
|
|
372
|
+
</div>
|
|
373
|
+
|
|
374
|
+
<div>
|
|
375
|
+
<h3>Our Services</h3>
|
|
376
|
+
<ul>
|
|
377
|
+
<li>Enterprise Software Development</li>
|
|
378
|
+
<li>AI & Machine Learning Solutions</li>
|
|
379
|
+
<li>Cloud Infrastructure & Migration</li>
|
|
380
|
+
<li>Digital Transformation Consulting</li>
|
|
381
|
+
</ul>
|
|
382
|
+
</div>
|
|
383
|
+
|
|
384
|
+
<div>
|
|
385
|
+
<h3>Contact Information</h3>
|
|
386
|
+
<div style={{ display: 'grid', gap: '0.5rem' }}>
|
|
387
|
+
<div>📧 hello@techcorp.com</div>
|
|
388
|
+
<div>📞 +1 (555) 123-4567</div>
|
|
389
|
+
<div>🏢 123 Innovation Drive, Tech City, TC 12345</div>
|
|
390
|
+
</div>
|
|
391
|
+
</div>
|
|
392
|
+
</div>
|
|
393
|
+
</div>
|
|
394
|
+
</QwickApp>
|
|
395
|
+
),
|
|
396
|
+
parameters: {
|
|
397
|
+
docs: {
|
|
398
|
+
description: {
|
|
399
|
+
story: 'Company page layout with custom logo component, business metadata, and corporate actions. Ideal for business profiles.',
|
|
400
|
+
},
|
|
401
|
+
},
|
|
402
|
+
},
|
|
403
403
|
};
|
|
404
404
|
|
|
405
405
|
export const ProjectShowcase: Story = {
|
|
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
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
406
|
+
args: {
|
|
407
|
+
coverImage: 'https://images.unsplash.com/photo-1460925895917-afdab827c52f?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80',
|
|
408
|
+
coverImageAlt: 'Data visualization dashboard',
|
|
409
|
+
profileImage: 'https://images.unsplash.com/photo-1551288049-bebda4e38f71?ixlib=rb-4.0.3&auto=format&fit=crop&w=200&q=80',
|
|
410
|
+
profileImageAlt: 'Project screenshot',
|
|
411
|
+
title: 'Analytics Dashboard 2.0',
|
|
412
|
+
subtitle: 'Real-time business intelligence and data visualization platform',
|
|
413
|
+
overline: 'FEATURED PROJECT',
|
|
414
|
+
metadata: [
|
|
415
|
+
{ label: 'stars', value: '1.2K' },
|
|
416
|
+
{ label: 'forks', value: 234 },
|
|
417
|
+
{ label: 'contributors', value: 18 },
|
|
418
|
+
],
|
|
419
|
+
tags: ['React', 'TypeScript', 'D3.js', 'Node.js', 'PostgreSQL'],
|
|
420
|
+
actions: [
|
|
421
|
+
{
|
|
422
|
+
id: 'demo',
|
|
423
|
+
label: 'Live Demo',
|
|
424
|
+
onClick: () => alert('Opening demo...'),
|
|
425
|
+
priority: 1,
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
id: 'github',
|
|
429
|
+
label: 'GitHub',
|
|
430
|
+
icon: <ShareIcon />,
|
|
431
|
+
onClick: () => alert('Opening GitHub...'),
|
|
432
|
+
priority: 2,
|
|
433
|
+
},
|
|
434
|
+
{
|
|
435
|
+
id: 'star',
|
|
436
|
+
label: 'Star',
|
|
437
|
+
icon: <FavoriteIcon />,
|
|
438
|
+
onClick: () => alert('Starred!'),
|
|
439
|
+
priority: 3,
|
|
440
|
+
},
|
|
441
|
+
],
|
|
442
|
+
height: 160,
|
|
443
|
+
profileImageSize: 'medium',
|
|
444
|
+
profilePosition: 'bottom-left',
|
|
445
|
+
},
|
|
446
|
+
render: (args) => (
|
|
447
|
+
<QwickApp appId="banner-project" appName='Project Showcase'>
|
|
448
|
+
<PageBannerHeader {...args} />
|
|
449
|
+
<div style={{ padding: '2rem', maxWidth: '900px', margin: '0 auto' }}>
|
|
450
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))', gap: '2rem' }}>
|
|
451
|
+
<div>
|
|
452
|
+
<h3> Project Overview</h3>
|
|
453
|
+
<p>
|
|
454
|
+
A comprehensive business intelligence platform that transforms complex data
|
|
455
|
+
into actionable insights through interactive visualizations and real-time analytics.
|
|
456
|
+
</p>
|
|
457
|
+
</div>
|
|
458
|
+
|
|
459
|
+
<div>
|
|
460
|
+
<h3> Key Features</h3>
|
|
461
|
+
<ul>
|
|
462
|
+
<li>Real-time data processing</li>
|
|
463
|
+
<li>Interactive dashboards</li>
|
|
464
|
+
<li>Custom visualization builder</li>
|
|
465
|
+
<li>Advanced filtering & querying</li>
|
|
466
|
+
<li>Export & sharing capabilities</li>
|
|
467
|
+
</ul>
|
|
468
|
+
</div>
|
|
469
|
+
|
|
470
|
+
<div>
|
|
471
|
+
<h3>🛠 Technology Stack</h3>
|
|
472
|
+
<div style={{ display: 'flex', flexWrap: 'wrap', gap: '0.5rem', marginTop: '1rem' }}>
|
|
473
|
+
{['React', 'TypeScript', 'D3.js', 'Node.js', 'PostgreSQL', 'Docker'].map(tech => (
|
|
474
|
+
<span key={tech} style={{
|
|
475
|
+
padding: '0.25rem 0.75rem',
|
|
476
|
+
backgroundColor: 'var(--theme-primary)',
|
|
477
|
+
color: 'var(--theme-on-primary)',
|
|
478
|
+
borderRadius: '12px',
|
|
479
|
+
fontSize: '0.75rem',
|
|
480
|
+
fontWeight: '500'
|
|
481
|
+
}}>
|
|
482
|
+
{tech}
|
|
483
|
+
</span>
|
|
484
|
+
))}
|
|
485
|
+
</div>
|
|
486
|
+
</div>
|
|
487
|
+
</div>
|
|
488
|
+
</div>
|
|
489
|
+
</QwickApp>
|
|
490
|
+
),
|
|
491
|
+
parameters: {
|
|
492
|
+
docs: {
|
|
493
|
+
description: {
|
|
494
|
+
story: 'Project showcase with technical metadata, technology tags, and project-specific actions. Perfect for portfolios and open source projects.',
|
|
495
|
+
},
|
|
496
|
+
},
|
|
497
|
+
},
|
|
498
498
|
};
|
|
499
499
|
|
|
500
500
|
export const ProfilePositions: Story = {
|
|
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
|
-
|
|
501
|
+
render: () => (
|
|
502
|
+
<QwickApp appId="banner-positions" appName='Profile Positions'>
|
|
503
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }}>
|
|
504
|
+
<PageBannerHeader
|
|
505
|
+
coverImage="https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80"
|
|
506
|
+
profileImage="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=150&q=80"
|
|
507
|
+
title="Bottom Left Position"
|
|
508
|
+
subtitle="Profile positioned at bottom-left of banner"
|
|
509
|
+
profilePosition="bottom-left"
|
|
510
|
+
profileImageSize="medium"
|
|
511
|
+
height={140}
|
|
512
|
+
/>
|
|
513
|
+
|
|
514
|
+
<PageBannerHeader
|
|
515
|
+
coverImage="https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80"
|
|
516
|
+
profileImage="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=150&q=80"
|
|
517
|
+
title="Bottom Center Position"
|
|
518
|
+
subtitle="Profile positioned at bottom-center of banner"
|
|
519
|
+
profilePosition="bottom-center"
|
|
520
|
+
profileImageSize="medium"
|
|
521
|
+
height={140}
|
|
522
|
+
/>
|
|
523
|
+
|
|
524
|
+
<PageBannerHeader
|
|
525
|
+
coverImage="https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80"
|
|
526
|
+
profileImage="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=150&q=80"
|
|
527
|
+
title="Overlay Center Position"
|
|
528
|
+
subtitle="Profile positioned at center of banner overlay"
|
|
529
|
+
profilePosition="overlay-center"
|
|
530
|
+
profileImageSize="medium"
|
|
531
|
+
height={140}
|
|
532
|
+
/>
|
|
533
|
+
</div>
|
|
534
|
+
</QwickApp>
|
|
535
|
+
),
|
|
536
|
+
parameters: {
|
|
537
|
+
docs: {
|
|
538
|
+
description: {
|
|
539
|
+
story: 'Comparison of different profile image positions: bottom-left (default), bottom-center, and overlay-center.',
|
|
540
|
+
},
|
|
541
|
+
},
|
|
542
|
+
},
|
|
543
543
|
};
|
|
544
544
|
|
|
545
545
|
export const ProfileSizes: Story = {
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
546
|
+
render: () => (
|
|
547
|
+
<QwickApp appId="banner-sizes" appName='Profile Sizes'>
|
|
548
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }}>
|
|
549
|
+
<PageBannerHeader
|
|
550
|
+
coverImage="https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80"
|
|
551
|
+
profileImage="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=150&q=80"
|
|
552
|
+
title="Small Profile Image"
|
|
553
|
+
subtitle="64px on mobile, 80px on desktop"
|
|
554
|
+
profileImageSize="small"
|
|
555
|
+
height={120}
|
|
556
|
+
/>
|
|
557
|
+
|
|
558
|
+
<PageBannerHeader
|
|
559
|
+
coverImage="https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80"
|
|
560
|
+
profileImage="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=150&q=80"
|
|
561
|
+
title="Medium Profile Image"
|
|
562
|
+
subtitle="80px on mobile, 100px on desktop (default)"
|
|
563
|
+
profileImageSize="medium"
|
|
564
|
+
height={140}
|
|
565
|
+
/>
|
|
566
|
+
|
|
567
|
+
<PageBannerHeader
|
|
568
|
+
coverImage="https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80"
|
|
569
|
+
profileImage="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=150&q=80"
|
|
570
|
+
title="Large Profile Image"
|
|
571
|
+
subtitle="100px on mobile, 120px on desktop"
|
|
572
|
+
profileImageSize="large"
|
|
573
|
+
height={160}
|
|
574
|
+
/>
|
|
575
|
+
</div>
|
|
576
|
+
</QwickApp>
|
|
577
|
+
),
|
|
578
|
+
parameters: {
|
|
579
|
+
docs: {
|
|
580
|
+
description: {
|
|
581
|
+
story: 'Comparison of different profile image sizes with responsive breakpoints. Sizes automatically adjust for mobile viewing.',
|
|
582
|
+
},
|
|
583
|
+
},
|
|
584
|
+
},
|
|
585
585
|
};
|
|
586
586
|
|
|
587
587
|
export const ActionOverflow: Story = {
|
|
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
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
588
|
+
args: {
|
|
589
|
+
coverImage: 'https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80',
|
|
590
|
+
profileImage: 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=150&q=80',
|
|
591
|
+
title: 'Action Overflow Demo',
|
|
592
|
+
subtitle: 'Demonstrates responsive action handling with overflow menu',
|
|
593
|
+
actions: profileActions,
|
|
594
|
+
maxVisibleActions: 2,
|
|
595
|
+
height: 160,
|
|
596
|
+
profileImageSize: 'medium',
|
|
597
|
+
},
|
|
598
|
+
render: (args) => (
|
|
599
|
+
<QwickApp appId="banner-overflow" appName='Action Overflow'>
|
|
600
|
+
<PageBannerHeader {...args} />
|
|
601
|
+
<div style={{ padding: '2rem', maxWidth: '800px', margin: '0 auto' }}>
|
|
602
|
+
<h3>Action Overflow Behavior</h3>
|
|
603
|
+
<p>
|
|
604
|
+
This demo shows how the PageBannerHeader handles multiple actions. With <code>maxVisibleActions</code> set to 2,
|
|
605
|
+
only the first 2 priority actions are shown as buttons, while the remaining actions are accessible through
|
|
606
|
+
the overflow menu (⋮ button).
|
|
607
|
+
</p>
|
|
608
|
+
|
|
609
|
+
<div style={{
|
|
610
|
+
marginTop: '2rem',
|
|
611
|
+
padding: '1rem',
|
|
612
|
+
backgroundColor: 'var(--theme-surface)',
|
|
613
|
+
borderRadius: '8px',
|
|
614
|
+
border: '1px solid var(--theme-outline)'
|
|
615
|
+
}}>
|
|
616
|
+
<h4>💡 Responsive Design:</h4>
|
|
617
|
+
<ul style={{ margin: '1rem 0' }}>
|
|
618
|
+
<li>On mobile, action button text may be hidden to save space</li>
|
|
619
|
+
<li>Actions are sorted by priority (lower numbers = higher priority)</li>
|
|
620
|
+
<li>Destructive actions are styled with warning colors</li>
|
|
621
|
+
<li>Overflow menu provides access to all additional actions</li>
|
|
622
|
+
</ul>
|
|
623
|
+
</div>
|
|
624
|
+
</div>
|
|
625
|
+
</QwickApp>
|
|
626
|
+
),
|
|
627
|
+
parameters: {
|
|
628
|
+
docs: {
|
|
629
|
+
description: {
|
|
630
|
+
story: 'Demonstrates action overflow functionality with priority-based sorting and responsive behavior.',
|
|
631
|
+
},
|
|
632
|
+
},
|
|
633
|
+
},
|
|
634
634
|
};
|
|
635
635
|
|
|
636
636
|
export const MinimalLayout: Story = {
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
637
|
+
args: {
|
|
638
|
+
coverImage: 'https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80',
|
|
639
|
+
title: 'Minimal Banner',
|
|
640
|
+
subtitle: 'Clean layout without profile image or actions',
|
|
641
|
+
height: 120,
|
|
642
|
+
},
|
|
643
|
+
render: (args) => (
|
|
644
|
+
<QwickApp appId="banner-minimal" appName='Minimal Banner'>
|
|
645
|
+
<PageBannerHeader {...args} />
|
|
646
|
+
<div style={{ padding: '2rem', maxWidth: '600px', margin: '0 auto', textAlign: 'center' }}>
|
|
647
|
+
<p>
|
|
648
|
+
Sometimes less is more. This minimal banner focuses attention on the content
|
|
649
|
+
while providing a beautiful backdrop with the cover image.
|
|
650
|
+
</p>
|
|
651
|
+
</div>
|
|
652
|
+
</QwickApp>
|
|
653
|
+
),
|
|
654
|
+
parameters: {
|
|
655
|
+
docs: {
|
|
656
|
+
description: {
|
|
657
|
+
story: 'Minimal banner with just cover image, title, and subtitle. Perfect for simple headers and landing pages.',
|
|
658
|
+
},
|
|
659
|
+
},
|
|
660
|
+
},
|
|
661
661
|
};
|
|
662
662
|
|
|
663
663
|
// Data Binding Examples
|
|
664
664
|
export const DataBindingTeamMember: Story = {
|
|
665
|
-
|
|
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
|
-
|
|
665
|
+
render: () => (
|
|
666
|
+
<QwickApp
|
|
667
|
+
appId="banner-data-team"
|
|
668
|
+
appName='Team Member Data Binding'
|
|
669
|
+
dataSource={{ dataProvider }}
|
|
670
|
+
>
|
|
671
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }}>
|
|
672
|
+
|
|
673
|
+
<Box>
|
|
674
|
+
<Typography variant="h5" gutterBottom> Data-Driven Team Member Banner</Typography>
|
|
675
|
+
<Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
|
|
676
|
+
PageBannerHeader components can be driven entirely by CMS data using the dataSource prop.
|
|
677
|
+
</Typography>
|
|
678
|
+
|
|
679
|
+
<Code title="Usage" language="tsx">{`<PageBannerHeader dataSource="pageBannerHeaders.teamMember" />`}</Code>
|
|
680
|
+
|
|
681
|
+
<Code title="Data Structure" language="json">{JSON.stringify(sampleCmsData.pageBannerHeaders.teamMember, null, 2)}</Code>
|
|
682
|
+
</Box>
|
|
683
|
+
|
|
684
|
+
<PageBannerHeader dataSource="pageBannerHeaders.teamMember" />
|
|
685
|
+
|
|
686
|
+
<div style={{ padding: '2rem', maxWidth: '800px', margin: '0 auto' }}>
|
|
687
|
+
<h3>Team Member Profile</h3>
|
|
688
|
+
<p>
|
|
689
|
+
This team member banner is completely driven by CMS data, including the cover image,
|
|
690
|
+
profile photo, metadata, tags, and actions. Perfect for team directories and professional profiles.
|
|
691
|
+
</p>
|
|
692
|
+
</div>
|
|
693
|
+
|
|
694
|
+
</div>
|
|
695
|
+
</QwickApp>
|
|
696
|
+
),
|
|
697
|
+
parameters: {
|
|
698
|
+
docs: {
|
|
699
|
+
description: {
|
|
700
|
+
story: 'Team member banner with complete data binding - all content loaded from CMS data source.',
|
|
701
|
+
},
|
|
702
|
+
},
|
|
703
|
+
},
|
|
704
704
|
};
|
|
705
705
|
|
|
706
706
|
export const DataBindingCompany: Story = {
|
|
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
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
707
|
+
render: () => (
|
|
708
|
+
<QwickApp
|
|
709
|
+
appId="banner-data-company"
|
|
710
|
+
appName='Company Data Binding'
|
|
711
|
+
dataSource={{ dataProvider }}
|
|
712
|
+
>
|
|
713
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }}>
|
|
714
|
+
|
|
715
|
+
<Box>
|
|
716
|
+
<Typography variant="h5" gutterBottom>🏢 Data-Driven Company Banner</Typography>
|
|
717
|
+
<Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
|
|
718
|
+
Company banners can pull all their content from CMS, making them perfect for dynamic business pages.
|
|
719
|
+
</Typography>
|
|
720
|
+
</Box>
|
|
721
|
+
|
|
722
|
+
<PageBannerHeader dataSource="pageBannerHeaders.company" />
|
|
723
|
+
|
|
724
|
+
<div style={{ padding: '2rem', maxWidth: '900px', margin: '0 auto' }}>
|
|
725
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))', gap: '2rem' }}>
|
|
726
|
+
<div>
|
|
727
|
+
<h3>Dynamic Content</h3>
|
|
728
|
+
<p>
|
|
729
|
+
All banner content including metrics, tags, and actions are dynamically loaded
|
|
730
|
+
from the CMS, allowing for real-time updates without code changes.
|
|
731
|
+
</p>
|
|
732
|
+
</div>
|
|
733
|
+
|
|
734
|
+
<div>
|
|
735
|
+
<h3>Flexible Layout</h3>
|
|
736
|
+
<p>
|
|
737
|
+
The banner automatically adapts to the available data, showing or hiding
|
|
738
|
+
elements based on what's provided in the data source.
|
|
739
|
+
</p>
|
|
740
|
+
</div>
|
|
741
|
+
</div>
|
|
742
|
+
</div>
|
|
743
|
+
|
|
744
|
+
</div>
|
|
745
|
+
</QwickApp>
|
|
746
|
+
),
|
|
747
|
+
parameters: {
|
|
748
|
+
docs: {
|
|
749
|
+
description: {
|
|
750
|
+
story: 'Company banner with data binding showing business metrics, technology tags, and corporate actions.',
|
|
751
|
+
},
|
|
752
|
+
},
|
|
753
|
+
},
|
|
754
754
|
};
|
|
755
755
|
|
|
756
756
|
export const DataBindingProject: Story = {
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
757
|
+
render: () => (
|
|
758
|
+
<QwickApp
|
|
759
|
+
appId="banner-data-project"
|
|
760
|
+
appName='Project Data Binding'
|
|
761
|
+
dataSource={{ dataProvider }}
|
|
762
|
+
>
|
|
763
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }}>
|
|
764
|
+
|
|
765
|
+
<Box>
|
|
766
|
+
<Typography variant="h5" gutterBottom> Data-Driven Project Banner</Typography>
|
|
767
|
+
<Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
|
|
768
|
+
Project showcases benefit from data binding by automatically displaying current metrics and status.
|
|
769
|
+
</Typography>
|
|
770
|
+
</Box>
|
|
771
|
+
|
|
772
|
+
<PageBannerHeader dataSource="pageBannerHeaders.project" />
|
|
773
|
+
|
|
774
|
+
<div style={{ padding: '2rem', maxWidth: '800px', margin: '0 auto' }}>
|
|
775
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))', gap: '2rem' }}>
|
|
776
|
+
<div>
|
|
777
|
+
<h3> Real-time Metrics</h3>
|
|
778
|
+
<p>
|
|
779
|
+
Project banners can display live statistics like user counts, data processing volumes,
|
|
780
|
+
and system uptime directly from your APIs.
|
|
781
|
+
</p>
|
|
782
|
+
</div>
|
|
783
|
+
|
|
784
|
+
<div>
|
|
785
|
+
<h3> Technology Stack</h3>
|
|
786
|
+
<p>
|
|
787
|
+
Technology tags are automatically generated from project metadata, keeping
|
|
788
|
+
documentation in sync with actual implementation.
|
|
789
|
+
</p>
|
|
790
|
+
</div>
|
|
791
|
+
|
|
792
|
+
<div>
|
|
793
|
+
<h3>🔗 Dynamic Actions</h3>
|
|
794
|
+
<p>
|
|
795
|
+
Action buttons can be configured per project, with URLs and availability
|
|
796
|
+
controlled through the CMS for maximum flexibility.
|
|
797
|
+
</p>
|
|
798
|
+
</div>
|
|
799
|
+
</div>
|
|
800
|
+
</div>
|
|
801
|
+
|
|
802
|
+
</div>
|
|
803
|
+
</QwickApp>
|
|
804
|
+
),
|
|
805
|
+
parameters: {
|
|
806
|
+
docs: {
|
|
807
|
+
description: {
|
|
808
|
+
story: 'Project showcase banner with data binding displaying real-time metrics, technology stack, and dynamic actions.',
|
|
809
|
+
},
|
|
810
|
+
},
|
|
811
|
+
},
|
|
812
812
|
};
|
|
813
813
|
|
|
814
814
|
export const DataBindingWithFallback: Story = {
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
815
|
+
render: () => (
|
|
816
|
+
<QwickApp
|
|
817
|
+
appId="banner-data-fallback"
|
|
818
|
+
appName='Data Binding with Fallback'
|
|
819
|
+
dataSource={{ dataProvider }}
|
|
820
|
+
>
|
|
821
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }}>
|
|
822
|
+
|
|
823
|
+
<Box>
|
|
824
|
+
<Typography variant="h5" gutterBottom> Fallback Support</Typography>
|
|
825
|
+
<Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
|
|
826
|
+
PageBannerHeader gracefully handles missing data sources with fallback props.
|
|
827
|
+
</Typography>
|
|
828
|
+
|
|
829
|
+
<Code title="Fallback Usage" language="tsx">{`<PageBannerHeader
|
|
830
|
+
dataSource="nonexistent.data"
|
|
831
|
+
title="Fallback Title"
|
|
832
|
+
subtitle="Shows when data source is missing"
|
|
833
|
+
coverImage="/fallback-cover.jpg"
|
|
834
834
|
/>`}</Code>
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
835
|
+
</Box>
|
|
836
|
+
|
|
837
|
+
<PageBannerHeader
|
|
838
|
+
dataSource="nonexistent.data"
|
|
839
|
+
title="Fallback Banner"
|
|
840
|
+
subtitle="This content appears when the dataSource doesn't exist"
|
|
841
|
+
coverImage="https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80"
|
|
842
|
+
height={160}
|
|
843
|
+
/>
|
|
844
|
+
|
|
845
|
+
<div style={{ padding: '2rem', maxWidth: '700px', margin: '0 auto' }}>
|
|
846
|
+
<h3>Graceful Degradation</h3>
|
|
847
|
+
<p>
|
|
848
|
+
When a data source is unavailable or empty, the component falls back to traditional props,
|
|
849
|
+
ensuring your application remains functional even when CMS data is missing.
|
|
850
|
+
</p>
|
|
851
|
+
</div>
|
|
852
|
+
|
|
853
|
+
</div>
|
|
854
|
+
</QwickApp>
|
|
855
|
+
),
|
|
856
|
+
parameters: {
|
|
857
|
+
docs: {
|
|
858
|
+
description: {
|
|
859
|
+
story: 'Banner with fallback props when dataSource is missing or unavailable, ensuring graceful degradation.',
|
|
860
|
+
},
|
|
861
|
+
},
|
|
862
|
+
},
|
|
863
863
|
};
|
|
864
864
|
|
|
865
865
|
export const AccessibilityDemo: Story = {
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
866
|
+
render: () => (
|
|
867
|
+
<QwickApp
|
|
868
|
+
appId="banner-accessibility"
|
|
869
|
+
appName='Accessibility Features Demo'
|
|
870
|
+
dataSource={{ dataProvider }}
|
|
871
|
+
>
|
|
872
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }}>
|
|
873
|
+
|
|
874
|
+
<Box>
|
|
875
|
+
<Typography variant="h5" gutterBottom>♿ Accessibility Features</Typography>
|
|
876
|
+
<Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
|
|
877
|
+
PageBannerHeader components include comprehensive accessibility features following WCAG 2.1 guidelines.
|
|
878
|
+
</Typography>
|
|
879
|
+
|
|
880
|
+
<Code title="Accessibility Features" language="tsx">{`<PageBannerHeader
|
|
881
|
+
dataSource="pageBannerHeaders.accessibilityDemo"
|
|
882
|
+
// Automatic accessibility features:
|
|
883
|
+
// - Semantic HTML (header element)
|
|
884
|
+
// - Proper heading hierarchy (h1 for title)
|
|
885
|
+
// - Alt text for all images
|
|
886
|
+
// - ARIA labels for interactive elements
|
|
887
|
+
// - Keyboard navigation support
|
|
888
|
+
// - Screen reader friendly
|
|
889
889
|
/>`}</Code>
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
890
|
+
</Box>
|
|
891
|
+
|
|
892
|
+
<PageBannerHeader dataSource="pageBannerHeaders.accessibilityDemo" />
|
|
893
|
+
|
|
894
|
+
<div style={{ padding: '2rem', maxWidth: '800px', margin: '0 auto' }}>
|
|
895
|
+
<h3> Built-in Accessibility</h3>
|
|
896
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))', gap: '2rem', marginTop: '1rem' }}>
|
|
897
|
+
<div>
|
|
898
|
+
<h4>Semantic HTML</h4>
|
|
899
|
+
<ul>
|
|
900
|
+
<li>Uses proper <code><header></code> element</li>
|
|
901
|
+
<li>Heading hierarchy with <code><h1></code></li>
|
|
902
|
+
<li>Descriptive alt text for images</li>
|
|
903
|
+
<li>ARIA labels for action buttons</li>
|
|
904
|
+
</ul>
|
|
905
|
+
</div>
|
|
906
|
+
|
|
907
|
+
<div>
|
|
908
|
+
<h4>Keyboard Navigation</h4>
|
|
909
|
+
<ul>
|
|
910
|
+
<li>All interactive elements focusable</li>
|
|
911
|
+
<li>Logical tab order maintained</li>
|
|
912
|
+
<li>Action buttons keyboard accessible</li>
|
|
913
|
+
<li>Menu items properly navigable</li>
|
|
914
|
+
</ul>
|
|
915
|
+
</div>
|
|
916
|
+
|
|
917
|
+
<div>
|
|
918
|
+
<h4>Screen Reader Support</h4>
|
|
919
|
+
<ul>
|
|
920
|
+
<li>Comprehensive image alt text</li>
|
|
921
|
+
<li>Descriptive action labels</li>
|
|
922
|
+
<li>Proper heading structure</li>
|
|
923
|
+
<li>Context-aware descriptions</li>
|
|
924
|
+
</ul>
|
|
925
|
+
</div>
|
|
926
|
+
|
|
927
|
+
<div>
|
|
928
|
+
<h4>Visual Design</h4>
|
|
929
|
+
<ul>
|
|
930
|
+
<li>High contrast text overlays</li>
|
|
931
|
+
<li>Readable typography scaling</li>
|
|
932
|
+
<li>Focus indicators on all controls</li>
|
|
933
|
+
<li>Responsive design for all devices</li>
|
|
934
|
+
</ul>
|
|
935
|
+
</div>
|
|
936
|
+
</div>
|
|
937
|
+
</div>
|
|
938
|
+
|
|
939
|
+
</div>
|
|
940
|
+
</QwickApp>
|
|
941
|
+
),
|
|
942
|
+
parameters: {
|
|
943
|
+
docs: {
|
|
944
|
+
description: {
|
|
945
|
+
story: 'Comprehensive accessibility demo showing WCAG 2.1 compliance, semantic HTML, keyboard navigation, and screen reader support.',
|
|
946
|
+
},
|
|
947
|
+
},
|
|
948
|
+
},
|
|
949
949
|
};
|