Loading...
Loading...
Complete reference for all SGDS web components including installation and framework integration. Use when users ask about any <sgds-*> component — accordion, alert, badge, breadcrumb, button, card, checkbox, close-button, combo-box, datepicker, description-list, divider, drawer, dropdown, file-upload, footer, icon, icon-button, icon-card, icon-list, image-card, input, link, mainnav, masthead, modal, overflow-menu, pagination, progress-bar, quantity-toggle, radio, select, sidebar, sidenav, skeleton, spinner, stepper, subnav, switch, system-banner, tab, table, table-of-contents, textarea, thumbnail-card, toast, or tooltip. Also covers React 19+, React ≤18, Vue, Angular, and Next.js integration.
npx skill4agent add govtechsg/sgds-web-component sgds-components<sgds-*>npm install @govtechsg/sgds-web-component
# or
pnpm add @govtechsg/sgds-web-componentimport "@govtechsg/sgds-web-component";import "@govtechsg/sgds-web-component";
function App() {
return (
<sgds-button variant="primary" onsgds-blur={(e) => console.log(e)}>
Click Me
</sgds-button>
);
}onsgds-bluronsgds-blurUsing Next.js? Next.js is SSR-based and requires a different setup — see the Next.js section below.
import "@govtechsg/sgds-web-component";
const steps = [
{ component: <Step1 />, stepHeader: "Personal details" },
{ component: <Step2 />, stepHeader: "Contact details" },
];
function App() {
return <sgds-stepper steps={steps}></sgds-stepper>;
}import { SgdsButton } from "@govtechsg/sgds-web-component/react";
function App() {
return (
<SgdsButton variant="primary" onSgdsBlur={(e) => console.log(e)}>
Click Me
</SgdsButton>
);
}sgds-bluronSgdsBlursgds-changeonSgdsChangeonuseRefimport { useRef } from "react";
import type { SgdsStepper as SStep } from "@govtechsg/sgds-web-component/components";
import SgdsStepper from "@govtechsg/sgds-web-component/react/stepper/index.js";
function StepperComponent() {
const stepperRef = useRef<SStep>(null);
return <SgdsStepper steps={steps} ref={stepperRef} />;
}Note: The React wrappers will be phased out in a future major version. Migrate to React 19+ native usage when possible.
sgds.tsx'use client';
import { useEffect } from 'react';
const SgdsLibraryLoader = () => {
useEffect(() => {
(async () => {
await import('@govtechsg/sgds-web-component');
})();
}, []);
return null;
};
export default SgdsLibraryLoader;<head>// src/app/layout.tsx
import SgdsLibraryLoader from './sgds';
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<head>
<SgdsLibraryLoader />
</head>
<body>
{children}
</body>
</html>
);
}suppressHydrationWarning<sgds-masthead suppressHydrationWarning></sgds-masthead>types.d.tsCustomEventsgds-*.d.tstsconfigimport "@govtechsg/sgds-web-component/types/react";useEffectaddEventListener'use client';
import { useEffect, useRef } from 'react';
export default function MyInput() {
const ref = useRef<any>(null);
useEffect(() => {
const el = ref.current;
if (!el) return;
const handler = (e: Event) => console.log((e.target as any).value);
el.addEventListener('sgds-input', handler);
return () => el.removeEventListener('sgds-input', handler);
}, []);
return <sgds-input ref={ref} suppressHydrationWarning />;
}useEffectaddEventListener// components/sgds/SgdsInput.tsx
'use client';
import { useEffect, useRef, useCallback } from 'react';
interface SgdsInputProps {
label?: string;
placeholder?: string;
value?: string;
onSgdsInput?: (value: string) => void;
onSgdsChange?: (value: string) => void;
}
export default function SgdsInput({ label, placeholder, value, onSgdsInput, onSgdsChange }: SgdsInputProps) {
const ref = useRef<any>(null);
const onSgdsInputRef = useRef(onSgdsInput);
const onSgdsChangeRef = useRef(onSgdsChange);
onSgdsInputRef.current = onSgdsInput;
onSgdsChangeRef.current = onSgdsChange;
useEffect(() => {
const el = ref.current;
if (!el) return;
const handleInput = (e: Event) => onSgdsInputRef.current?.((e.target as any).value);
const handleChange = (e: Event) => onSgdsChangeRef.current?.((e.target as any).value);
el.addEventListener('sgds-input', handleInput);
el.addEventListener('sgds-change', handleChange);
return () => {
el.removeEventListener('sgds-input', handleInput);
el.removeEventListener('sgds-change', handleChange);
};
}, []);
return (
<sgds-input
ref={ref}
label={label}
placeholder={placeholder}
value={value}
suppressHydrationWarning
/>
);
}// app/contact/page.tsx
'use client';
import SgdsInput from '@/components/sgds/SgdsInput';
export default function ContactPage() {
const [name, setName] = useState('');
return <SgdsInput label="Name" placeholder="Enter name" onSgdsInput={setName} />;
}components/sgds/tag.startsWith("sgds-")CUSTOM_ELEMENTS_SCHEMAnode_modules/@govtechsg/sgds-web-componentnode_modules/@govtechsg/sgds-web-component/components/Accordion/sgds-accordion.js
node_modules/@govtechsg/sgds-web-component/components/Accordion/sgds-accordion-item.js
node_modules/@govtechsg/sgds-web-component/components/Accordion/sgds-accordion.d.tsAccordion/sgds-accordion.js.d.tsnode_modulesnpm installpnpm install<sgds-*>ononsgds-changeSgdsLibraryLoaderuseEffectaddEventListeneruseEffectonSgdsChangetag.startsWith("sgds-")widthstyle="width: ..."sgds:w-40<sgds-*>| Category | Component | Reference |
|---|---|---|
| Actions | Button | → reference/button.md |
| Actions | Icon Button | → reference/icon-button.md |
| Actions | Close Button | → reference/close-button.md |
| Actions | Link | → reference/link.md |
| Actions | Dropdown | → reference/dropdown.md |
| Actions | Overflow Menu | → reference/overflow-menu.md |
| Navigation | Masthead | → reference/masthead.md |
| Navigation | Main Nav | → reference/mainnav.md |
| Navigation | Footer | → reference/footer.md |
| Navigation | Breadcrumb | → reference/breadcrumb.md |
| Navigation | Pagination | → reference/pagination.md |
| Navigation | Sidenav | → reference/sidenav.md |
| Navigation | Sidebar | → reference/sidebar.md |
| Navigation | Subnav | → reference/subnav.md |
| Navigation | Tab | → reference/tab.md |
| Navigation | Table of Contents | → reference/table-of-contents.md |
| Layout | Accordion | → reference/accordion.md |
| Layout | Divider | → reference/divider.md |
| Layout | Drawer | → reference/drawer.md |
| Layout | Modal | → reference/modal.md |
| Content | Badge | → reference/badge.md |
| Content | Card | → reference/card.md |
| Content | Icon Card | → reference/icon-card.md |
| Content | Image Card | → reference/image-card.md |
| Content | Thumbnail Card | → reference/thumbnail-card.md |
| Content | Description List | → reference/description-list.md |
| Content | Icon | → reference/icon.md |
| Content | Icon List | → reference/icon-list.md |
| Content | Table | → reference/table.md |
| Content | Tooltip | → reference/tooltip.md |
| Forms | Input | → reference/input.md |
| Forms | Textarea | → reference/textarea.md |
| Forms | Select | → reference/select.md |
| Forms | Checkbox | → reference/checkbox.md |
| Forms | Radio | → reference/radio.md |
| Forms | Combo Box | → reference/combo-box.md |
| Forms | Datepicker | → reference/datepicker.md |
| Forms | File Upload | → reference/file-upload.md |
| Forms | Quantity Toggle | → reference/quantity-toggle.md |
| Feedback | Switch | → reference/switch.md |
| Workflow | Stepper | → reference/stepper.md |
<sgds-input><sgds-textarea><sgds-select><sgds-checkbox><sgds-checkbox-group><sgds-radio><sgds-radio-group><sgds-combo-box><sgds-datepicker><sgds-file-upload><sgds-quantity-toggle><sgds-switch><sgds-checkbox><sgds-radio-group><sgds-stepper>