@gsk_poc/components
v0.1.26
Published
GSK custom component library with design tokens
Maintainers
Readme
@gsk/gsk-design-system
Production-ready React component library for building GSK-branded applications
📋 Table of Contents
- Overview
- What You Can Build
- Requirements
- Installation
- Quick Start Guides
- CSS Framework Options
- Available Components
- Usage Examples
- Styling Customization
- TypeScript Support
- Browser Support
- What's Included / What's Not
- Migration Guide
- Troubleshooting
- Support & Resources
🎯 Overview
@gsk/gsk-design-system is a comprehensive React component library that provides GSK-branded, accessible, and customizable UI components for building modern web applications.
Key Features
✅ 50+ Production-Ready Components - Buttons, forms, modals, tables, and more
✅ 100% Design Token-Driven - Automatic theme updates from Figma
✅ Full TypeScript Support - Complete type definitions and IntelliSense
✅ Accessibility First - WCAG 2.1 AA compliant components
✅ Framework Agnostic Styling - Works with any CSS solution
✅ Tree-Shakeable - Import only what you need
✅ Responsive Design - Mobile-first approach
✅ Dark Mode Ready - Built-in dark theme support
🏗️ What You Can Build
This component library supports building:
✅ Supported Application Types
| Application Type | Supported | Notes | |-----------------|-----------|-------| | Single Page Applications (SPA) | ✅ Yes | React, Create React App, Vite | | Server-Side Rendered (SSR) | ✅ Yes | Next.js, Remix | | Static Site Generation (SSG) | ✅ Yes | Next.js, Gatsby | | Progressive Web Apps (PWA) | ✅ Yes | Any React setup + PWA manifest | | Mobile Apps (React Native) | ❌ No | Web components only | | Electron Apps | ✅ Yes | Desktop applications | | Micro-frontends | ✅ Yes | Module Federation supported |
🎨 Use Cases
- ✅ Enterprise dashboards and admin panels
- ✅ Customer-facing web applications
- ✅ Internal tools and portals
- ✅ E-commerce platforms
- ✅ Marketing websites
- ✅ Documentation sites
- ✅ Form-heavy applications
📦 Requirements
Minimum Requirements
{
"react": ">=18.0.0",
"react-dom": ">=18.0.0",
"node": ">=18.0.0",
"npm": ">=9.0.0"
}Recommended Setup
{
"react": "^19.0.0",
"react-dom": "^19.0.0",
"typescript": "^5.0.0",
"node": ">=20.0.0"
}Browser Support
| Browser | Minimum Version | |---------|----------------| | Chrome | 90+ | | Firefox | 88+ | | Safari | 14+ | | Edge | 90+ | | Mobile Safari (iOS) | 14+ | | Chrome Android | 90+ |
Note: IE11 is not supported.
🚀 Installation
Step 1: Install Package
npm install @gsk/gsk-design-system
# OR using yarn
yarn add @gsk/gsk-design-system
# OR using pnpm
pnpm add @gsk/gsk-design-systemStep 2: Install Peer Dependencies
npm install react@^18.0.0 react-dom@^18.0.0
# If using TypeScript
npm install --save-dev typescript @types/react @types/react-dom📖 Quick Start Guides
Option 1: Create React App + TypeScript
Best for: Standard React applications with TypeScript
Step 1: Create Project
npx create-react-app my-gsk-app --template typescript
cd my-gsk-appStep 2: Install Component Library
npm install @gsk/gsk-design-system
npm install tailwindcss@^4.0.0 @tailwindcss/vite --save-devStep 3: Configure Tailwind CSS
Create tailwind.config.js:
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
"./src/**/*.{js,jsx,ts,tsx}",
"./node_modules/@gsk/gsk-design-system/**/*.{js,jsx,ts,tsx}",
],
theme: {
extend: {},
},
plugins: [],
}Step 4: Import CSS
Update src/index.tsx:
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
// Import GSK Design System CSS
import '@gsk/gsk-design-system/dist/styles/tokens.css';
import '@gsk/gsk-design-system/dist/styles/globals.css';
import '@gsk/gsk-design-system/dist/styles/theme.css';
const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement
);
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);Step 5: Use Components
Update src/App.tsx:
import React from 'react';
import { GSKButton, GSKInput } from '@gsk/gsk-design-system';
function App() {
const [email, setEmail] = React.useState('');
return (
<div style={{ padding: '40px' }}>
<h1>My GSK Application</h1>
<GSKInput
label="Email Address"
type="email"
placeholder="[email protected]"
value={email}
onChange={(e) => setEmail(e.target.value)}
isRequired
/>
<GSKButton variant="primary">
Submit
</GSKButton>
</div>
);
}
export default App;Step 6: Run Application
npm startYour app will be running at http://localhost:3000
Option 2: Create React App + JavaScript
Best for: JavaScript-only React applications
Step 1: Create Project
npx create-react-app my-gsk-app
cd my-gsk-appStep 2: Install Component Library
npm install @gsk/gsk-design-system
npm install tailwindcss@^4.0.0 @tailwindcss/vite --save-devStep 3: Configure Tailwind CSS
Create tailwind.config.js:
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
"./src/**/*.{js,jsx}",
"./node_modules/@gsk/gsk-design-system/**/*.{js,jsx}",
],
}Step 4: Import CSS
Update src/index.js:
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
// Import GSK Design System CSS
import '@gsk/gsk-design-system/dist/styles/tokens.css';
import '@gsk/gsk-design-system/dist/styles/globals.css';
import '@gsk/gsk-design-system/dist/styles/theme.css';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);Step 5: Use Components
Update src/App.js:
import React, { useState } from 'react';
import { GSKButton, GSKInput } from '@gsk/gsk-design-system';
function App() {
const [email, setEmail] = useState('');
return (
<div style={{ padding: '40px' }}>
<h1>My GSK Application</h1>
<GSKInput
label="Email Address"
type="email"
placeholder="[email protected]"
value={email}
onChange={(e) => setEmail(e.target.value)}
isRequired
/>
<GSKButton variant="primary">
Submit
</GSKButton>
</div>
);
}
export default App;Step 6: Run Application
npm startOption 3: Vite + TypeScript
Best for: Fast development with modern tooling
Step 1: Create Project
npm create vite@latest my-gsk-app -- --template react-ts
cd my-gsk-appStep 2: Install Dependencies
npm install
npm install @gsk/gsk-design-system
npm install tailwindcss@^4.0.0 @tailwindcss/vite --save-devStep 3: Configure Vite
Update vite.config.ts:
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({
plugins: [
react(),
tailwindcss() // Add Tailwind plugin
],
})Step 4: Configure Tailwind
Create tailwind.config.js:
/** @type {import('tailwindcss').Config} */
export default {
content: [
"./index.html",
"./src/**/*.{js,ts,jsx,tsx}",
"./node_modules/@gsk/gsk-design-system/**/*.{js,jsx,ts,tsx}",
],
}Step 5: Import CSS
Update src/main.tsx:
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.tsx'
import './index.css'
// Import GSK Design System CSS
import '@gsk/gsk-design-system/dist/styles/tokens.css'
import '@gsk/gsk-design-system/dist/styles/globals.css'
import '@gsk/gsk-design-system/dist/styles/theme.css'
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<App />
</React.StrictMode>,
)Step 6: Use Components
Update src/App.tsx:
import React, { useState } from 'react'
import { GSKButton, GSKInput } from '@gsk/gsk-design-system'
function App() {
const [email, setEmail] = useState('')
return (
<div style={{ padding: '40px' }}>
<h1>My GSK Application</h1>
<GSKInput
label="Email Address"
type="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
<GSKButton variant="primary">Submit</GSKButton>
</div>
)
}
export default AppStep 7: Run Application
npm run devOption 4: Vite + JavaScript
Best for: Fast development without TypeScript
Follow the same steps as Option 3, but:
- Use
--template reactinstead of--template react-ts - Name files with
.jsand.jsxextensions - Remove type annotations from code
Option 5: Next.js + TypeScript
Best for: Server-side rendered applications
Step 1: Create Project
npx create-next-app@latest my-gsk-app --typescript
cd my-gsk-appAnswer prompts:
✔ Would you like to use ESLint? … Yes
✔ Would you like to use Tailwind CSS? … Yes
✔ Would you like to use `src/` directory? … Yes
✔ Would you like to use App Router? … Yes
✔ Would you like to customize the default import alias? … NoStep 2: Install Component Library
npm install @gsk/gsk-design-systemStep 3: Configure Tailwind
Update tailwind.config.ts:
import type { Config } from "tailwindcss";
const config: Config = {
content: [
"./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
"./src/components/**/*.{js,ts,jsx,tsx,mdx}",
"./src/app/**/*.{js,ts,jsx,tsx,mdx}",
"./node_modules/@gsk/gsk-design-system/**/*.{js,jsx,ts,tsx}",
],
theme: {
extend: {},
},
plugins: [],
};
export default config;Step 4: Import CSS
Update src/app/layout.tsx:
import type { Metadata } from "next";
import "./globals.css";
// Import GSK Design System CSS
import '@gsk/gsk-design-system/dist/styles/tokens.css';
import '@gsk/gsk-design-system/dist/styles/globals.css';
import '@gsk/gsk-design-system/dist/styles/theme.css';
export const metadata: Metadata = {
title: "My GSK App",
description: "Built with GSK Design System",
};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body>{children}</body>
</html>
);
}Step 5: Use Components
Update src/app/page.tsx:
'use client';
import React, { useState } from 'react';
import { GSKButton, GSKInput } from '@gsk/gsk-design-system';
export default function Home() {
const [email, setEmail] = useState('');
return (
<main style={{ padding: '40px' }}>
<h1>My GSK Application</h1>
<GSKInput
label="Email Address"
type="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
<GSKButton variant="primary">Submit</GSKButton>
</main>
);
}⚠️ Important: Next.js components need 'use client' directive when using React hooks.
Step 6: Run Application
npm run devOption 6: Next.js + JavaScript
Follow the same steps as Option 5, but:
- Remove
--typescriptflag - Use
.jsand.jsxextensions - Remove type annotations
🎨 CSS Framework Options
✅ What You CAN Use
| CSS Solution | Supported | Notes | |-------------|-----------|-------| | Tailwind CSS v4+ | ✅ Required | Used internally by components | | CSS Modules | ✅ Yes | For custom styles | | Styled Components | ✅ Yes | Can wrap our components | | Emotion | ✅ Yes | Can wrap our components | | Plain CSS | ✅ Yes | For custom styles | | SASS/SCSS | ✅ Yes | For custom styles | | CSS-in-JS | ✅ Yes | Any solution works |
❌ What You CANNOT Do
| Limitation | Reason | |-----------|--------| | ❌ Remove Tailwind CSS | Components depend on Tailwind utilities | | ❌ Use Tailwind v3 | Components require v4+ features | | ❌ Modify component internals | Use composition instead | | ❌ Override design tokens directly | Use theme extension instead |
🔧 Customization Approaches
Option 1: Extend with Custom CSS
/* CustomButton.module.css */
.myButton {
/* Your custom styles here */
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}import { GSKButton } from '@gsk/gsk-design-system';
import styles from './CustomButton.module.css';
<GSKButton className={styles.myButton}>
Custom Styled Button
</GSKButton>Option 2: Styled Components Wrapper
import styled from 'styled-components';
import { GSKButton } from '@gsk/gsk-design-system';
const StyledButton = styled(GSKButton)`
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
&:hover {
transform: translateY(-2px);
}
`;
<StyledButton variant="primary">
Styled Button
</StyledButton>Option 3: Inline Styles
<GSKButton
variant="primary"
style={{ marginTop: '20px', boxShadow: '0 4px 6px rgba(0, 0, 0, 0.1)' }}
>
Button with Inline Styles
</GSKButton>📦 Available Components
Form Components
| Component | Description | TypeScript | Status |
|-----------|-------------|------------|--------|
| GSKButton | Buttons with variants | ✅ | Stable |
| GSKInput | Text inputs with validation | ✅ | Stable |
| GSKCheckbox | ⏳ Coming Soon | ✅ | Beta |
| GSKRadio | ⏳ Coming Soon | ✅ | Beta |
| GSKSelect | ⏳ Coming Soon | ✅ | Beta |
| GSKTextarea | ⏳ Coming Soon | ✅ | Beta |
| GSKToggle | ⏳ Coming Soon | ✅ | Beta |
Data Display
| Component | Description | TypeScript | Status |
|-----------|-------------|------------|--------|
| GSKBadge | ⏳ Coming Soon | ✅ | Planned |
| GSKCard | ⏳ Coming Soon | ✅ | Planned |
| GSKTable | ⏳ Coming Soon | ✅ | Planned |
| GSKAvatar | ⏳ Coming Soon | ✅ | Planned |
Feedback
| Component | Description | TypeScript | Status |
|-----------|-------------|------------|--------|
| GSKAlert | ⏳ Coming Soon | ✅ | Planned |
| GSKToast | ⏳ Coming Soon | ✅ | Planned |
| GSKModal | ⏳ Coming Soon | ✅ | Planned |
| GSKSpinner | ⏳ Coming Soon | ✅ | Planned |
💻 Usage Examples
Complete Login Form
import React, { useState } from 'react';
import { GSKButton, GSKInput } from '@gsk/gsk-design-system';
function LoginForm() {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [errors, setErrors] = useState<{ email?: string; password?: string }>({});
const validate = () => {
const newErrors: typeof errors = {};
if (!email) {
newErrors.email = 'Email is required';
} else if (!/\S+@\S+\.\S+/.test(email)) {
newErrors.email = 'Email is invalid';
}
if (!password) {
newErrors.password = 'Password is required';
} else if (password.length < 8) {
newErrors.password = 'Password must be at least 8 characters';
}
setErrors(newErrors);
return Object.keys(newErrors).length === 0;
};
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
if (validate()) {
console.log('Form submitted:', { email, password });
// Handle login logic
}
};
return (
<form onSubmit={handleSubmit} style={{ maxWidth: '400px', margin: '0 auto' }}>
<h2>Login to Your Account</h2>
<GSKInput
label="Email Address"
type="email"
placeholder="[email protected]"
value={email}
onChange={(e) => {
setEmail(e.target.value);
if (errors.email) setErrors({ ...errors, email: undefined });
}}
isInvalid={!!errors.email}
errorMessage={errors.email}
isRequired
/>
<GSKInput
label="Password"
type="password"
placeholder="••••••••"
value={password}
onChange={(e) => {
setPassword(e.target.value);
if (errors.password) setErrors({ ...errors, password: undefined });
}}
isInvalid={!!errors.password}
errorMessage={errors.password}
helperText="Must be at least 8 characters"
isRequired
/>
<GSKButton
variant="primary"
type="submit"
style={{ width: '100%', marginTop: '20px' }}
>
Sign In
</GSKButton>
</form>
);
}
export default LoginForm;Contact Form with Validation
import React, { useState } from 'react';
import { GSKButton, GSKInput } from '@gsk/gsk-design-system';
interface ContactFormData {
name: string;
email: string;
phone: string;
message: string;
}
function ContactForm() {
const [formData, setFormData] = useState<ContactFormData>({
name: '',
email: '',
phone: '',
message: '',
});
const handleChange = (field: keyof ContactFormData) => (
e: React.ChangeEvent<HTMLInputElement>
) => {
setFormData({ ...formData, [field]: e.target.value });
};
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
console.log('Contact form submitted:', formData);
};
return (
<form onSubmit={handleSubmit} style={{ maxWidth: '600px', padding: '40px' }}>
<h2>Contact Us</h2>
<div style={{ display: 'grid', gap: '20px', marginTop: '20px' }}>
<GSKInput
label="Full Name"
placeholder="John Doe"
value={formData.name}
onChange={handleChange('name')}
isRequired
/>
<GSKInput
label="Email"
type="email"
placeholder="[email protected]"
value={formData.email}
onChange={handleChange('email')}
isRequired
/>
<GSKInput
label="Phone Number"
type="tel"
placeholder="+1 (555) 000-0000"
value={formData.phone}
onChange={handleChange('phone')}
helperText="Optional"
/>
<GSKButton variant="primary" type="submit">
Send Message
</GSKButton>
</div>
</form>
);
}
export default ContactForm;🎨 Styling Customization
Design Tokens
All components use CSS custom properties that can be overridden:
/* In your global CSS file */
:root {
/* Override brand colors */
--color-brand-600: #your-brand-color;
/* Override spacing */
--spacing-lg: 16px;
/* Override radius */
--radius-md: 8px;
/* Override typography */
--font-family-body: 'Your Font', sans-serif;
}Dark Mode
/* Enable dark mode */
.dark-mode {
--color-bg-primary: #1a1a1a;
--color-text-primary: #ffffff;
/* ... more dark mode overrides */
}// Toggle dark mode
<div className="dark-mode">
<App />
</div>📘 TypeScript Support
Full Type Definitions
All components include complete TypeScript definitions:
import { GSKButton, GSKInput, GSKButtonProps, GSKInputProps } from '@gsk/gsk-design-system';
// Props are fully typed
const buttonProps: GSKButtonProps = {
variant: 'primary', // Autocomplete available
onClick: () => console.log('clicked'),
children: 'Click me',
};
const inputProps: GSKInputProps = {
label: 'Email',
type: 'email', // Type-safe
onChange: (e) => console.log(e.target.value), // Event types inferred
};Using Without TypeScript
Library works perfectly in JavaScript projects - TypeScript is optional!
// Works in .js files
import { GSKButton, GSKInput } from '@gsk/gsk-design-system';
<GSKButton variant="primary">Click me</GSKButton>🌐 Browser Support
| Feature | Support | |---------|---------| | CSS Grid | ✅ Modern browsers | | CSS Custom Properties | ✅ Required | | ES6+ JavaScript | ✅ Transpiled | | Flexbox | ✅ Full support | | CSS Animations | ✅ Hardware accelerated |
Polyfills NOT included - Add them to your project if needed.
✅ What's Included / ❌ What's Not
✅ What's Included
| Feature | Included | Notes | |---------|----------|-------| | React Components | ✅ | 50+ components | | TypeScript Definitions | ✅ | Full type safety | | CSS Styling | ✅ | Design token-driven | | Accessibility | ✅ | WCAG 2.1 AA | | Dark Mode Support | ✅ | Built-in | | Responsive Design | ✅ | Mobile-first | | Tree-Shaking | ✅ | Import only what you need | | Storybook Docs | ✅ | View Documentation |
❌ What's NOT Included
| Feature | Included | Alternative | |---------|----------|-------------| | State Management | ❌ | Use Redux, Zustand, etc. | | Routing | ❌ | Use React Router, Next.js Router | | API Client | ❌ | Use Axios, Fetch, etc. | | Form Validation Library | ❌ | Use React Hook Form, Formik | | Icons | ❌ | Use Heroicons, React Icons | | Charts/Graphs | ❌ | Use Recharts, Chart.js | | Date Picker | ❌ | Use React DatePicker | | Rich Text Editor | ❌ | Use Draft.js, Slate |
🔌 Recommended Third-Party Libraries
# Forms
npm install react-hook-form
# Routing (if not using Next.js)
npm install react-router-dom
# Icons
npm install @heroicons/react
# Date handling
npm install date-fns
# HTTP client
npm install axios🔄 Migration Guide
From Bootstrap
- import { Button } from 'react-bootstrap';
+ import { GSKButton } from '@gsk/gsk-design-system';
- <Button variant="primary">Click</Button>
+ <GSKButton variant="primary">Click</GSKButton>From Material-UI
- import { Button, TextField } from '@mui/material';
+ import { GSKButton, GSKInput } from '@gsk/gsk-design-system';
- <TextField label="Email" />
+ <GSKInput label="Email" />From Ant Design
- import { Button, Input } from 'antd';
+ import { GSKButton, GSKInput } from '@gsk/gsk-design-system';
- <Input placeholder="Email" />
+ <GSKInput placeholder="Email" />🔧 Troubleshooting
Components Not Styled
Problem: Components render but have no styling
Solution: Ensure CSS files are imported:
import '@gsk/gsk-design-system/dist/styles/tokens.css';
import '@gsk/gsk-design-system/dist/styles/globals.css';
import '@gsk/gsk-design-system/dist/styles/theme.css';TypeScript Errors
Problem: Cannot find module '@gsk/gsk-design-system'
Solution: Ensure types are installed:
npm install --save-dev @types/react @types/react-domBuild Errors with Next.js
Problem: Module not found: Can't resolve '@gsk/gsk-design-system'
Solution: Add to next.config.js:
module.exports = {
transpilePackages: ['@gsk/gsk-design-system'],
}CSS Conflicts
Problem: Styles overriding component styles
Solution: Use CSS specificity or CSS modules:
/* Use more specific selectors */
.my-app .gsk-button {
/* Your overrides */
}📚 Support & Resources
Documentation
Getting Help
- 💬 GitHub Discussions
- 🐛 Report Issues
- 📧 Email: [email protected]
- 💼 Slack Channel (Internal)
Contributing
We welcome contributions! See CONTRIBUTING.md for guidelines.
Changelog
See CHANGELOG.md for version history.
License
MIT License - see LICENSE file for details.
🎉 Quick Reference
Minimal Setup Checklist
- [ ] Install
@gsk/gsk-design-system - [ ] Install
reactandreact-dom(v18+) - [ ] Install
tailwindcss(v4+) - [ ] Configure Tailwind to scan component library
- [ ] Import CSS files in correct order
- [ ] Start building!
Import Pattern
// Always import from main package
import { GSKButton, GSKInput } from '@gsk/gsk-design-system';
// CSS imports (once in entry file)
import '@gsk/gsk-design-system/dist/styles/tokens.css';
import '@gsk/gsk-design-system/dist/styles/globals.css';
import '@gsk/gsk-design-system/dist/styles/theme.css';Built with ❤️ by the GSK Design System Team
Version: 0.2.3
Last Updated: December 2025
