enjanga-components-library 1.0.4
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 +159 -0
- package/dist/index.d.mts +208 -0
- package/dist/index.d.ts +208 -0
- package/dist/index.js +21604 -0
- package/dist/index.mjs +21626 -0
- package/dist/styles.css +1 -0
- package/package.json +169 -0
package/README.md
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# enjanga-components-library
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/enjanga-components-library)
|
|
4
|
+
|
|
5
|
+
A reusable React component library built for Next.js 13+ applications, implementing the IBM Carbon Design System. This library is designed for **consumption only** β JavaScript and CSS files are pre-built, minified, and optimized for production use.
|
|
6
|
+
|
|
7
|
+
> β οΈ **Important:** This library is built on top of the [IBM Carbon Design System](https://carbondesignsystem.com/). To function correctly, **Carbon must be installed and configured** in the consuming project.
|
|
8
|
+
|
|
9
|
+
## π Live Storybook
|
|
10
|
+
|
|
11
|
+
Explore the interactive documentation and try all components in Storybook, hosted on Chromatic:
|
|
12
|
+
**[https://6856ac512f4faa67a7d9c5c2-ijmvkylkad.chromatic.com/](https://6856ac512f4faa67a7d9c5c2-ijmvkylkad.chromatic.com/)**
|
|
13
|
+
|
|
14
|
+
## π Stack & Features
|
|
15
|
+
|
|
16
|
+
- **Framework:** Next.js 13+ (App Router), React 18+
|
|
17
|
+
- **Language:** TypeScript
|
|
18
|
+
- **Design System:** IBM Carbon Design System
|
|
19
|
+
- **Styling:** SASS
|
|
20
|
+
- **Development & Testing:** Storybook, Chromatic, React Testing Library, Vitest
|
|
21
|
+
- **Build Tool:** Tsup
|
|
22
|
+
|
|
23
|
+
## π¦ Installation
|
|
24
|
+
|
|
25
|
+
1. **Install the library and peer dependencies:**
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm install enjanga-components-library next@^15.0.0 react@^18.0.0 react-dom@^18.0.0
|
|
29
|
+
# or
|
|
30
|
+
yarn add enjanga-components-library next@^15.0.0 react@^18.0.0 react-dom@^18.0.0
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
2. **Install and configure IBM Carbon:**
|
|
34
|
+
Follow the [official Carbon React setup guide](https://carbondesignsystem.com/developing/frameworks/react#install).
|
|
35
|
+
```bash
|
|
36
|
+
npm install @carbon/react @carbon/styles
|
|
37
|
+
# or
|
|
38
|
+
yarn add @carbon/react @carbon/styles
|
|
39
|
+
```
|
|
40
|
+
Import Carbonβs global styles (e.g., in `app/layout.tsx`):
|
|
41
|
+
```tsx
|
|
42
|
+
import '@carbon/styles/css/index.css';
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## π§ Usage
|
|
46
|
+
|
|
47
|
+
Import components directly from the package. Only components listed in the public API (`src/components/index.ts`) are exposed.
|
|
48
|
+
|
|
49
|
+
```tsx
|
|
50
|
+
// Example: Using the ContactButton component
|
|
51
|
+
import { ContactButton } from 'enjanga-components-library';
|
|
52
|
+
|
|
53
|
+
export default function MyPage() {
|
|
54
|
+
return <ContactButton text="Get in Touch" />;
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
β
**Note:** Component CSS is automatically included β no manual CSS imports needed.
|
|
59
|
+
|
|
60
|
+
## π§ͺ Testing
|
|
61
|
+
|
|
62
|
+
This library is tested for quality and reliability:
|
|
63
|
+
|
|
64
|
+
- **Unit Tests**: React Testing Library + Vitest
|
|
65
|
+
- **Interaction Tests**: Covers complex user flows
|
|
66
|
+
- **Accessibility (a11y)**: Validated via Storybookβs a11y addon
|
|
67
|
+
- **Visual Regression**: Chromatic snapshots prevent UI regressions
|
|
68
|
+
|
|
69
|
+
Run tests locally:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
yarn test
|
|
73
|
+
# or in watch mode
|
|
74
|
+
yarn test:watch
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## π Development
|
|
78
|
+
|
|
79
|
+
For contributors and maintainers.
|
|
80
|
+
|
|
81
|
+
### Prerequisites
|
|
82
|
+
|
|
83
|
+
- Node.js (LTS recommended)
|
|
84
|
+
- Yarn
|
|
85
|
+
|
|
86
|
+
### Local Setup
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
git clone https://github.com/ericnjanga/enjanga-components-library.git
|
|
90
|
+
cd enjanga-components-library
|
|
91
|
+
yarn install
|
|
92
|
+
yarn storybook
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Visit **http://localhost:6006** to start developing components.
|
|
96
|
+
|
|
97
|
+
### Key Scripts
|
|
98
|
+
|
|
99
|
+
| Command | Description |
|
|
100
|
+
| ---------------------- | ------------------------------------ |
|
|
101
|
+
| `yarn storybook` | Start Storybook dev server |
|
|
102
|
+
| `yarn build` | Build the library (TypeScript + CSS) |
|
|
103
|
+
| `yarn build-storybook` | Export static Storybook site |
|
|
104
|
+
| `yarn chromatic` | Publish Storybook to Chromatic |
|
|
105
|
+
| `yarn lint` | Run ESLint + TypeScript checks |
|
|
106
|
+
| `yarn format` | Format code with Prettier |
|
|
107
|
+
|
|
108
|
+
### Project Structure
|
|
109
|
+
|
|
110
|
+
```txt
|
|
111
|
+
enjanga-components-library/
|
|
112
|
+
βββ .storybook/ # Storybook config
|
|
113
|
+
βββ src/
|
|
114
|
+
β βββ app/ # Next.js App Router setup
|
|
115
|
+
β βββ components/ # React components
|
|
116
|
+
β β βββ ContactButton/
|
|
117
|
+
β β β βββ ContactButton.tsx
|
|
118
|
+
β β β βββ _ContactButton.scss
|
|
119
|
+
β β β βββ index.ts
|
|
120
|
+
β β βββ index.ts # Public API (exports components)
|
|
121
|
+
β βββ stories/ # Storybook stories
|
|
122
|
+
β βββ tests/ # Component tests
|
|
123
|
+
β βββ styles/ # Global styles + SASS utilities
|
|
124
|
+
β βββ utils/ # Shared utilities
|
|
125
|
+
βββ package.json
|
|
126
|
+
βββ tsconfig.json
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## π§ Philosophy
|
|
130
|
+
|
|
131
|
+
### Carbon as Foundation
|
|
132
|
+
|
|
133
|
+
This library builds on [Carbon](https://carbondesignsystem.com/) to create opinionated, purpose-driven components.
|
|
134
|
+
For example, `ContactButton` wraps Carbonβs `Button`, exposing only a simplified prop API for consistency.
|
|
135
|
+
|
|
136
|
+
### Design Principles
|
|
137
|
+
|
|
138
|
+
- **Modularity** β Components built in isolation, easily extended
|
|
139
|
+
- **Reusability** β Single-purpose, but broadly applicable
|
|
140
|
+
- **Robustness** β Strong typing & validated props
|
|
141
|
+
- **Performance** β Memoized components minimize re-renders
|
|
142
|
+
- **Flexibility** β Smart defaults, minimal configuration needed
|
|
143
|
+
|
|
144
|
+
### Component Types
|
|
145
|
+
|
|
146
|
+
- **Public Components** β Exported via `src/components/index.ts` (documented, tested, stable)
|
|
147
|
+
- **Internal Components** β Used only inside the library (not exported)
|
|
148
|
+
|
|
149
|
+
## π License
|
|
150
|
+
|
|
151
|
+
Licensed under the **Apache License 2.0**. See [LICENSE](./LICENSE).
|
|
152
|
+
|
|
153
|
+
## π€ Contributing
|
|
154
|
+
|
|
155
|
+
This is primarily a personal portfolio/project library. Contributions are welcome β open an issue before major changes.
|
|
156
|
+
|
|
157
|
+
## π Reporting Issues
|
|
158
|
+
|
|
159
|
+
Please report bugs or request features via [GitHub Issues](https://github.com/ericnjanga/enjanga-components-library/issues).
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { Node } from '@contentful/rich-text-types';
|
|
3
|
+
import { ComponentType, SVGProps } from 'react';
|
|
4
|
+
|
|
5
|
+
interface AH_propsType {
|
|
6
|
+
brandLabel: string;
|
|
7
|
+
brandRoute: string;
|
|
8
|
+
brand: React.ReactNode;
|
|
9
|
+
navigation: React.ReactNode;
|
|
10
|
+
globalBarItems: React.ReactNode;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
declare const AppHeader: ({ brand, brandLabel, brandRoute, navigation, }: AH_propsType) => react_jsx_runtime.JSX.Element;
|
|
14
|
+
|
|
15
|
+
declare const BL_roleOpt: readonly ["img", "presentation", "none"];
|
|
16
|
+
type BL_roleOptPropsType = (typeof BL_roleOpt)[number];
|
|
17
|
+
interface BL_propsType {
|
|
18
|
+
value: string | React.ReactNode | React.ReactElement;
|
|
19
|
+
className?: string;
|
|
20
|
+
style?: React.CSSProperties;
|
|
21
|
+
alt?: string;
|
|
22
|
+
role?: BL_roleOptPropsType;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
declare const BrandLogo: ({ value, className, style, alt, role, }: BL_propsType) => react_jsx_runtime.JSX.Element;
|
|
26
|
+
|
|
27
|
+
declare const HDG_levelOpt: readonly [1, 2, 3, 4, 5, 6];
|
|
28
|
+
type HDG_levelPropsType = (typeof HDG_levelOpt)[number];
|
|
29
|
+
type HDG_propsType = {
|
|
30
|
+
className?: string;
|
|
31
|
+
level?: HDG_levelPropsType;
|
|
32
|
+
children?: React.ReactNode;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
interface SMT_propsType {
|
|
36
|
+
className?: string;
|
|
37
|
+
plainText?: string;
|
|
38
|
+
richText?: {
|
|
39
|
+
json: {
|
|
40
|
+
content: Node[];
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
interface FTX_propsType {
|
|
46
|
+
className?: string;
|
|
47
|
+
heading: HDG_propsType;
|
|
48
|
+
smartText: SMT_propsType;
|
|
49
|
+
headingMaxLength?: number;
|
|
50
|
+
plainTextMaxLength?: number;
|
|
51
|
+
isHidden?: 'heading' | 'smartText';
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
declare const BNN_roleOpt: readonly ["banner", "presentation", "none"];
|
|
55
|
+
type BNN_roleOptPropsType = (typeof BNN_roleOpt)[number];
|
|
56
|
+
interface BNN_propsType {
|
|
57
|
+
className?: string;
|
|
58
|
+
featuredText: FTX_propsType;
|
|
59
|
+
isHuge?: boolean;
|
|
60
|
+
role?: BNN_roleOptPropsType;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
declare const Banner: ({ className, featuredText, isHuge, role, }: BNN_propsType) => react_jsx_runtime.JSX.Element;
|
|
64
|
+
|
|
65
|
+
interface CBNN_propsType {
|
|
66
|
+
btnText: string;
|
|
67
|
+
btnIcon?: 'Email' | 'Chat' | 'CustomerService' | 'CommunicationUnified';
|
|
68
|
+
btnKind?: 'primary' | 'secondary';
|
|
69
|
+
btnSize?: 'sm' | 'md';
|
|
70
|
+
modalLabel: string;
|
|
71
|
+
modalHeading: string;
|
|
72
|
+
modalSubHeading: string;
|
|
73
|
+
modalPrimaryButtonText: string;
|
|
74
|
+
modalSecondaryButtonText: string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
declare const ContactButton: ({ btnText, btnIcon, btnKind, btnSize, modalLabel, modalHeading, modalSubHeading, modalPrimaryButtonText, modalSecondaryButtonText, }: CBNN_propsType) => react_jsx_runtime.JSX.Element;
|
|
78
|
+
|
|
79
|
+
declare const CP_nameOpt: readonly ["Hills", "App Developer", "Leadership", "DevicePairing", "CodeExplanation", "MagicWand", "Question", "User", "UserInterface", "Collaboration", "Presentation", "Transform_01", "Networking_04", "Goals", "TransactionalTrust", "Teacher", "Carbon", "Multitask", "PoughkeepsieBridge", "AssetManagement", "Presenter"];
|
|
80
|
+
declare const CP_sizeOpt: readonly ["sm", "md", "lg", "xl"];
|
|
81
|
+
type CP_nameType = (typeof CP_nameOpt)[number];
|
|
82
|
+
type CP_sizeType = (typeof CP_sizeOpt)[number];
|
|
83
|
+
interface CP_propsType {
|
|
84
|
+
name: CP_nameType;
|
|
85
|
+
size?: CP_sizeType;
|
|
86
|
+
className?: string;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
declare const CustomPictogram: ({ name, size, className }: CP_propsType) => react_jsx_runtime.JSX.Element;
|
|
90
|
+
|
|
91
|
+
declare const CP_pictogramMap: Record<CP_nameType, // CP_propsType['name'],
|
|
92
|
+
ComponentType<SVGProps<SVGSVGElement>>>;
|
|
93
|
+
declare const CP_getPictogram: ({ name, }: {
|
|
94
|
+
name: string;
|
|
95
|
+
}) => ComponentType<SVGProps<SVGSVGElement>>;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Props validations rules
|
|
99
|
+
* ----------
|
|
100
|
+
* CustomTile must be either:
|
|
101
|
+
* - A link (provide 'linksTo' and optionally 'linkTarget')
|
|
102
|
+
* - A modal trigger (provide 'modalIsAvailable')
|
|
103
|
+
* But cannot be both at the same time
|
|
104
|
+
*/
|
|
105
|
+
type ErrorMessage<T extends string> = `π¨ Prop Validation Error: ${T}`;
|
|
106
|
+
/** Normal link props (default case, modalIsAvailable omitted or false) */
|
|
107
|
+
interface LinkProps {
|
|
108
|
+
linksTo?: CTL_valid_linkTo;
|
|
109
|
+
linkTarget?: CTL_LinkTargetType;
|
|
110
|
+
modalIsAvailable?: false;
|
|
111
|
+
}
|
|
112
|
+
/** Strict modal props (only when true) */
|
|
113
|
+
interface ModalProps {
|
|
114
|
+
modalIsAvailable: true;
|
|
115
|
+
linksTo?: ErrorMessage<"Modal version cannot have 'linksTo' - remove this prop">;
|
|
116
|
+
linkTarget?: ErrorMessage<"Modal version cannot have 'linkTarget' - remove this prop">;
|
|
117
|
+
}
|
|
118
|
+
type CTL_propsType1Validation = LinkProps | ModalProps;
|
|
119
|
+
|
|
120
|
+
declare const CTL_LayoutStyleOpt: readonly ["card", "banner"];
|
|
121
|
+
declare const CTL_LinkTargetOpt: readonly ["_blank", "_self"];
|
|
122
|
+
declare const CTL_MediaOpt: readonly ["pictogram", "image"];
|
|
123
|
+
type CTL_LayoutStyleType = (typeof CTL_LayoutStyleOpt)[number];
|
|
124
|
+
type CTL_LinkTargetType = (typeof CTL_LinkTargetOpt)[number];
|
|
125
|
+
type CTL_MediaType = (typeof CTL_MediaOpt)[number];
|
|
126
|
+
|
|
127
|
+
type ValidRoute = `/${string}`;
|
|
128
|
+
type ExternalLink = `https://${string}` | `http://${string}`;
|
|
129
|
+
type CTL_valid_linkTo = ValidRoute | ExternalLink;
|
|
130
|
+
type CTL_propsType = {
|
|
131
|
+
className?: string;
|
|
132
|
+
featuredText: FTX_propsType;
|
|
133
|
+
layoutStyle?: CTL_LayoutStyleType;
|
|
134
|
+
media?: CTL_MediaType;
|
|
135
|
+
mediaPictogram?: CP_nameType;
|
|
136
|
+
mediaImage?: string;
|
|
137
|
+
modalIsAvailable?: boolean;
|
|
138
|
+
modalPlainDescription?: string;
|
|
139
|
+
modalRichDescription?: {
|
|
140
|
+
json: {
|
|
141
|
+
content: Node[];
|
|
142
|
+
};
|
|
143
|
+
};
|
|
144
|
+
linksTo?: CTL_valid_linkTo;
|
|
145
|
+
linkTarget?: CTL_LinkTargetType;
|
|
146
|
+
} & CTL_propsType1Validation;
|
|
147
|
+
|
|
148
|
+
declare const CustomTile: ({ className, featuredText, layoutStyle, media, mediaPictogram, mediaImage, modalIsAvailable, modalPlainDescription, modalRichDescription, linksTo, linkTarget, }: CTL_propsType) => react_jsx_runtime.JSX.Element;
|
|
149
|
+
|
|
150
|
+
interface LIT_propsType {
|
|
151
|
+
content?: string;
|
|
152
|
+
href?: string;
|
|
153
|
+
id?: string;
|
|
154
|
+
className?: string;
|
|
155
|
+
children?: React.ReactNode;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
declare const LST_typeOpt: readonly ["unordered", "ordered"];
|
|
159
|
+
type LST_typePropsType = (typeof LST_typeOpt)[number];
|
|
160
|
+
interface LST_propsType {
|
|
161
|
+
type?: LST_typePropsType;
|
|
162
|
+
className?: string;
|
|
163
|
+
content?: LIT_propsType[];
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
declare const HDL_tagOpt: readonly ["div", "section"];
|
|
167
|
+
type HDL_tagPropsType = (typeof HDL_tagOpt)[number];
|
|
168
|
+
interface HDL_propsType {
|
|
169
|
+
wrapper?: {
|
|
170
|
+
tag: HDL_tagPropsType;
|
|
171
|
+
cssClass?: string;
|
|
172
|
+
};
|
|
173
|
+
heading: HDG_propsType;
|
|
174
|
+
list?: LST_propsType;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
declare const HeadlinedList: ({ wrapper, heading, list, }: HDL_propsType) => react_jsx_runtime.JSX.Element;
|
|
178
|
+
|
|
179
|
+
declare const List: ({ type, className, content }: LST_propsType) => react_jsx_runtime.JSX.Element;
|
|
180
|
+
|
|
181
|
+
declare const SmartText: ({ className, plainText, richText }: SMT_propsType) => react_jsx_runtime.JSX.Element;
|
|
182
|
+
|
|
183
|
+
declare const FeatureText: ({ className, heading, smartText, headingMaxLength, plainTextMaxLength, isHidden, }: FTX_propsType) => react_jsx_runtime.JSX.Element;
|
|
184
|
+
|
|
185
|
+
interface CRT_propsType {
|
|
186
|
+
className?: string;
|
|
187
|
+
data?: {
|
|
188
|
+
json: {
|
|
189
|
+
content: Node[];
|
|
190
|
+
};
|
|
191
|
+
links?: {
|
|
192
|
+
assets: {
|
|
193
|
+
block: {
|
|
194
|
+
sys: {
|
|
195
|
+
id: string;
|
|
196
|
+
};
|
|
197
|
+
url: string;
|
|
198
|
+
title: string;
|
|
199
|
+
description?: string;
|
|
200
|
+
}[];
|
|
201
|
+
};
|
|
202
|
+
};
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
declare const CMSRichText: ({ data, className }: CRT_propsType) => react_jsx_runtime.JSX.Element;
|
|
207
|
+
|
|
208
|
+
export { AppHeader, Banner, BrandLogo, CMSRichText, CP_getPictogram, type CP_nameType, CP_pictogramMap, type CTL_valid_linkTo, ContactButton, CustomPictogram, CustomTile, FeatureText, HeadlinedList, List, SmartText };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { Node } from '@contentful/rich-text-types';
|
|
3
|
+
import { ComponentType, SVGProps } from 'react';
|
|
4
|
+
|
|
5
|
+
interface AH_propsType {
|
|
6
|
+
brandLabel: string;
|
|
7
|
+
brandRoute: string;
|
|
8
|
+
brand: React.ReactNode;
|
|
9
|
+
navigation: React.ReactNode;
|
|
10
|
+
globalBarItems: React.ReactNode;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
declare const AppHeader: ({ brand, brandLabel, brandRoute, navigation, }: AH_propsType) => react_jsx_runtime.JSX.Element;
|
|
14
|
+
|
|
15
|
+
declare const BL_roleOpt: readonly ["img", "presentation", "none"];
|
|
16
|
+
type BL_roleOptPropsType = (typeof BL_roleOpt)[number];
|
|
17
|
+
interface BL_propsType {
|
|
18
|
+
value: string | React.ReactNode | React.ReactElement;
|
|
19
|
+
className?: string;
|
|
20
|
+
style?: React.CSSProperties;
|
|
21
|
+
alt?: string;
|
|
22
|
+
role?: BL_roleOptPropsType;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
declare const BrandLogo: ({ value, className, style, alt, role, }: BL_propsType) => react_jsx_runtime.JSX.Element;
|
|
26
|
+
|
|
27
|
+
declare const HDG_levelOpt: readonly [1, 2, 3, 4, 5, 6];
|
|
28
|
+
type HDG_levelPropsType = (typeof HDG_levelOpt)[number];
|
|
29
|
+
type HDG_propsType = {
|
|
30
|
+
className?: string;
|
|
31
|
+
level?: HDG_levelPropsType;
|
|
32
|
+
children?: React.ReactNode;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
interface SMT_propsType {
|
|
36
|
+
className?: string;
|
|
37
|
+
plainText?: string;
|
|
38
|
+
richText?: {
|
|
39
|
+
json: {
|
|
40
|
+
content: Node[];
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
interface FTX_propsType {
|
|
46
|
+
className?: string;
|
|
47
|
+
heading: HDG_propsType;
|
|
48
|
+
smartText: SMT_propsType;
|
|
49
|
+
headingMaxLength?: number;
|
|
50
|
+
plainTextMaxLength?: number;
|
|
51
|
+
isHidden?: 'heading' | 'smartText';
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
declare const BNN_roleOpt: readonly ["banner", "presentation", "none"];
|
|
55
|
+
type BNN_roleOptPropsType = (typeof BNN_roleOpt)[number];
|
|
56
|
+
interface BNN_propsType {
|
|
57
|
+
className?: string;
|
|
58
|
+
featuredText: FTX_propsType;
|
|
59
|
+
isHuge?: boolean;
|
|
60
|
+
role?: BNN_roleOptPropsType;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
declare const Banner: ({ className, featuredText, isHuge, role, }: BNN_propsType) => react_jsx_runtime.JSX.Element;
|
|
64
|
+
|
|
65
|
+
interface CBNN_propsType {
|
|
66
|
+
btnText: string;
|
|
67
|
+
btnIcon?: 'Email' | 'Chat' | 'CustomerService' | 'CommunicationUnified';
|
|
68
|
+
btnKind?: 'primary' | 'secondary';
|
|
69
|
+
btnSize?: 'sm' | 'md';
|
|
70
|
+
modalLabel: string;
|
|
71
|
+
modalHeading: string;
|
|
72
|
+
modalSubHeading: string;
|
|
73
|
+
modalPrimaryButtonText: string;
|
|
74
|
+
modalSecondaryButtonText: string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
declare const ContactButton: ({ btnText, btnIcon, btnKind, btnSize, modalLabel, modalHeading, modalSubHeading, modalPrimaryButtonText, modalSecondaryButtonText, }: CBNN_propsType) => react_jsx_runtime.JSX.Element;
|
|
78
|
+
|
|
79
|
+
declare const CP_nameOpt: readonly ["Hills", "App Developer", "Leadership", "DevicePairing", "CodeExplanation", "MagicWand", "Question", "User", "UserInterface", "Collaboration", "Presentation", "Transform_01", "Networking_04", "Goals", "TransactionalTrust", "Teacher", "Carbon", "Multitask", "PoughkeepsieBridge", "AssetManagement", "Presenter"];
|
|
80
|
+
declare const CP_sizeOpt: readonly ["sm", "md", "lg", "xl"];
|
|
81
|
+
type CP_nameType = (typeof CP_nameOpt)[number];
|
|
82
|
+
type CP_sizeType = (typeof CP_sizeOpt)[number];
|
|
83
|
+
interface CP_propsType {
|
|
84
|
+
name: CP_nameType;
|
|
85
|
+
size?: CP_sizeType;
|
|
86
|
+
className?: string;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
declare const CustomPictogram: ({ name, size, className }: CP_propsType) => react_jsx_runtime.JSX.Element;
|
|
90
|
+
|
|
91
|
+
declare const CP_pictogramMap: Record<CP_nameType, // CP_propsType['name'],
|
|
92
|
+
ComponentType<SVGProps<SVGSVGElement>>>;
|
|
93
|
+
declare const CP_getPictogram: ({ name, }: {
|
|
94
|
+
name: string;
|
|
95
|
+
}) => ComponentType<SVGProps<SVGSVGElement>>;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Props validations rules
|
|
99
|
+
* ----------
|
|
100
|
+
* CustomTile must be either:
|
|
101
|
+
* - A link (provide 'linksTo' and optionally 'linkTarget')
|
|
102
|
+
* - A modal trigger (provide 'modalIsAvailable')
|
|
103
|
+
* But cannot be both at the same time
|
|
104
|
+
*/
|
|
105
|
+
type ErrorMessage<T extends string> = `π¨ Prop Validation Error: ${T}`;
|
|
106
|
+
/** Normal link props (default case, modalIsAvailable omitted or false) */
|
|
107
|
+
interface LinkProps {
|
|
108
|
+
linksTo?: CTL_valid_linkTo;
|
|
109
|
+
linkTarget?: CTL_LinkTargetType;
|
|
110
|
+
modalIsAvailable?: false;
|
|
111
|
+
}
|
|
112
|
+
/** Strict modal props (only when true) */
|
|
113
|
+
interface ModalProps {
|
|
114
|
+
modalIsAvailable: true;
|
|
115
|
+
linksTo?: ErrorMessage<"Modal version cannot have 'linksTo' - remove this prop">;
|
|
116
|
+
linkTarget?: ErrorMessage<"Modal version cannot have 'linkTarget' - remove this prop">;
|
|
117
|
+
}
|
|
118
|
+
type CTL_propsType1Validation = LinkProps | ModalProps;
|
|
119
|
+
|
|
120
|
+
declare const CTL_LayoutStyleOpt: readonly ["card", "banner"];
|
|
121
|
+
declare const CTL_LinkTargetOpt: readonly ["_blank", "_self"];
|
|
122
|
+
declare const CTL_MediaOpt: readonly ["pictogram", "image"];
|
|
123
|
+
type CTL_LayoutStyleType = (typeof CTL_LayoutStyleOpt)[number];
|
|
124
|
+
type CTL_LinkTargetType = (typeof CTL_LinkTargetOpt)[number];
|
|
125
|
+
type CTL_MediaType = (typeof CTL_MediaOpt)[number];
|
|
126
|
+
|
|
127
|
+
type ValidRoute = `/${string}`;
|
|
128
|
+
type ExternalLink = `https://${string}` | `http://${string}`;
|
|
129
|
+
type CTL_valid_linkTo = ValidRoute | ExternalLink;
|
|
130
|
+
type CTL_propsType = {
|
|
131
|
+
className?: string;
|
|
132
|
+
featuredText: FTX_propsType;
|
|
133
|
+
layoutStyle?: CTL_LayoutStyleType;
|
|
134
|
+
media?: CTL_MediaType;
|
|
135
|
+
mediaPictogram?: CP_nameType;
|
|
136
|
+
mediaImage?: string;
|
|
137
|
+
modalIsAvailable?: boolean;
|
|
138
|
+
modalPlainDescription?: string;
|
|
139
|
+
modalRichDescription?: {
|
|
140
|
+
json: {
|
|
141
|
+
content: Node[];
|
|
142
|
+
};
|
|
143
|
+
};
|
|
144
|
+
linksTo?: CTL_valid_linkTo;
|
|
145
|
+
linkTarget?: CTL_LinkTargetType;
|
|
146
|
+
} & CTL_propsType1Validation;
|
|
147
|
+
|
|
148
|
+
declare const CustomTile: ({ className, featuredText, layoutStyle, media, mediaPictogram, mediaImage, modalIsAvailable, modalPlainDescription, modalRichDescription, linksTo, linkTarget, }: CTL_propsType) => react_jsx_runtime.JSX.Element;
|
|
149
|
+
|
|
150
|
+
interface LIT_propsType {
|
|
151
|
+
content?: string;
|
|
152
|
+
href?: string;
|
|
153
|
+
id?: string;
|
|
154
|
+
className?: string;
|
|
155
|
+
children?: React.ReactNode;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
declare const LST_typeOpt: readonly ["unordered", "ordered"];
|
|
159
|
+
type LST_typePropsType = (typeof LST_typeOpt)[number];
|
|
160
|
+
interface LST_propsType {
|
|
161
|
+
type?: LST_typePropsType;
|
|
162
|
+
className?: string;
|
|
163
|
+
content?: LIT_propsType[];
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
declare const HDL_tagOpt: readonly ["div", "section"];
|
|
167
|
+
type HDL_tagPropsType = (typeof HDL_tagOpt)[number];
|
|
168
|
+
interface HDL_propsType {
|
|
169
|
+
wrapper?: {
|
|
170
|
+
tag: HDL_tagPropsType;
|
|
171
|
+
cssClass?: string;
|
|
172
|
+
};
|
|
173
|
+
heading: HDG_propsType;
|
|
174
|
+
list?: LST_propsType;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
declare const HeadlinedList: ({ wrapper, heading, list, }: HDL_propsType) => react_jsx_runtime.JSX.Element;
|
|
178
|
+
|
|
179
|
+
declare const List: ({ type, className, content }: LST_propsType) => react_jsx_runtime.JSX.Element;
|
|
180
|
+
|
|
181
|
+
declare const SmartText: ({ className, plainText, richText }: SMT_propsType) => react_jsx_runtime.JSX.Element;
|
|
182
|
+
|
|
183
|
+
declare const FeatureText: ({ className, heading, smartText, headingMaxLength, plainTextMaxLength, isHidden, }: FTX_propsType) => react_jsx_runtime.JSX.Element;
|
|
184
|
+
|
|
185
|
+
interface CRT_propsType {
|
|
186
|
+
className?: string;
|
|
187
|
+
data?: {
|
|
188
|
+
json: {
|
|
189
|
+
content: Node[];
|
|
190
|
+
};
|
|
191
|
+
links?: {
|
|
192
|
+
assets: {
|
|
193
|
+
block: {
|
|
194
|
+
sys: {
|
|
195
|
+
id: string;
|
|
196
|
+
};
|
|
197
|
+
url: string;
|
|
198
|
+
title: string;
|
|
199
|
+
description?: string;
|
|
200
|
+
}[];
|
|
201
|
+
};
|
|
202
|
+
};
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
declare const CMSRichText: ({ data, className }: CRT_propsType) => react_jsx_runtime.JSX.Element;
|
|
207
|
+
|
|
208
|
+
export { AppHeader, Banner, BrandLogo, CMSRichText, CP_getPictogram, type CP_nameType, CP_pictogramMap, type CTL_valid_linkTo, ContactButton, CustomPictogram, CustomTile, FeatureText, HeadlinedList, List, SmartText };
|