{ "$schema": "https://ui.shadcn.com/schema/registry.json", "name": "@nswds/ui", "homepage": "https://github.com/digitalnsw/nswds-ui", "items": [ { "name": "theme", "type": "registry:theme", "title": "NSWDS Theme", "description": "NSW Government semantic design tokens — maps the shadcn token names onto the @nswds/tokens palette for light and dark mode.", "dependencies": ["@nswds/tokens"], "docs": "Add the @nswds/tokens token layers to your Tailwind entry CSS (after `@import \"tailwindcss\";`):\n\n@import \"@nswds/tokens/tailwind/preset.css\";\n@import \"@nswds/tokens/css/colors/global/oklch.css\";\n@import \"@nswds/tokens/css/colors/semantic/oklch.css\";\n@import \"@nswds/tokens/css/colors/semantic/oklch.dark.css\";\n@import \"@nswds/tokens/css/colors/themes/masterbrand/oklch.css\";\n@import \"@nswds/tokens/tailwind/colors/themes/masterbrand/oklch.css\";\n\n`preset.css` wires every token category (colour, radius, space, typography, motion, shadow, border) into Tailwind in a single import. Keep the oklch colour layers AFTER it so the palette stays oklch (preset bundles hex values); the masterbrand layers add the brand theme, which preset excludes. The semantic DARK layer is scoped `.dark`, so the role tokens these variables map onto flip automatically — toggle the `.dark` class on your root element for dark mode (no separate dark variable block needed).\n\nSee https://github.com/digitalnsw/nswds-ui/blob/main/docs/installing-from-the-registry.md", "css": { "@media (prefers-reduced-motion: reduce)": { "*, ::before, ::after": { "animation-duration": "0.01ms !important", "animation-iteration-count": "1 !important", "transition-duration": "0.01ms !important" } } }, "cssVars": { "theme": { "font-heading": "var(--font-sans)" }, "light": { "background": "var(--surface-default)", "foreground": "var(--text-default)", "card": "var(--surface-raised)", "card-foreground": "var(--text-default)", "popover": "var(--surface-raised)", "popover-foreground": "var(--text-default)", "primary": "var(--action-default)", "primary-foreground": "var(--text-inverse)", "secondary": "var(--surface-sunken)", "secondary-foreground": "var(--text-default)", "muted": "var(--background-subtle)", "muted-foreground": "var(--text-muted)", "accent": "var(--background-subtle)", "accent-foreground": "var(--text-default)", "destructive": "var(--danger-solid)", "border": "var(--border-default)", "input": "var(--border-default)", "ring": "var(--border-strong)", "chart-1": "var(--primary-450)", "chart-2": "var(--primary-550)", "chart-3": "var(--primary-600)", "chart-4": "var(--primary-650)", "chart-5": "var(--primary-700)", "radius": "var(--radius-md)", "sidebar": "var(--background-subtle)", "sidebar-foreground": "var(--text-default)", "sidebar-primary": "var(--action-default)", "sidebar-primary-foreground": "var(--text-inverse)", "sidebar-accent": "var(--background-subtle)", "sidebar-accent-foreground": "var(--text-default)", "sidebar-border": "var(--border-default)", "sidebar-ring": "var(--border-strong)", "input-border": "var(--border-strong)", "input-foreground": "var(--text-default)", "input-placeholder": "var(--text-muted)", "input-surface": "var(--surface-default)", "input-surface-hover": "var(--surface-sunken)", "input-ring": "var(--border-strong)", "input-invalid-border": "var(--danger-border)", "input-invalid-surface-hover": "var(--danger-surface)", "input-invalid-ring": "var(--danger-solid)" }, "dark": {} } }, { "name": "button", "type": "registry:ui", "title": "Button", "description": "A button component with variants and sizes.", "dependencies": ["@base-ui/react", "class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/link.json", "{{REGISTRY_LOCATION}}/r/spinner.json" ], "files": [ { "path": "src/components/button.tsx", "type": "registry:ui", "target": "components/button.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" }, { "path": "src/lib/button-group-context.tsx", "type": "registry:lib", "target": "lib/button-group-context.tsx" } ] }, { "name": "badge", "type": "registry:ui", "title": "Badge", "description": "A badge component with variants, colours, sizes, and interactive button/link variants.", "dependencies": ["@base-ui/react", "class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/button.json", "{{REGISTRY_LOCATION}}/r/link.json" ], "files": [ { "path": "src/components/badge.tsx", "type": "registry:ui", "target": "components/badge.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "card", "type": "registry:ui", "title": "Card", "description": "A content container with header, content, footer, action, and description slots.", "dependencies": ["clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/card.tsx", "type": "registry:ui", "target": "components/card.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "field", "type": "registry:ui", "title": "Field", "description": "Form field layout primitives — set, group, label, description, error, and separator slots.", "dependencies": ["@base-ui/react", "class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/label.json", "{{REGISTRY_LOCATION}}/r/separator.json" ], "files": [ { "path": "src/components/field.tsx", "type": "registry:ui", "target": "components/field.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "input", "type": "registry:ui", "title": "Input", "description": "A text input built on the Base UI input primitive with NSW form styling.", "dependencies": ["@base-ui/react", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/input.tsx", "type": "registry:ui", "target": "components/input.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "label", "type": "registry:ui", "title": "Label", "description": "A form label with disabled-state styling.", "dependencies": ["clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/label.tsx", "type": "registry:ui", "target": "components/label.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "labeled-separator", "type": "registry:ui", "title": "Labeled Separator", "description": "A horizontal divider broken by a centred label, such as an \"or\" rule between sign-in methods.", "dependencies": ["clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/separator.json" ], "files": [ { "path": "src/components/labeled-separator.tsx", "type": "registry:ui", "target": "components/labeled-separator.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "separator", "type": "registry:ui", "title": "Separator", "description": "A semantic or decorative divider built on the Base UI separator primitive.", "dependencies": ["@base-ui/react", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/separator.tsx", "type": "registry:ui", "target": "components/separator.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "icons", "type": "registry:ui", "title": "Icons", "description": "Curated NSWDS icon subset used by the shipped components and patterns. The full Material Symbols set is available per-icon from the @nswds/ui npm package (import { IconSearch } from '@nswds/ui/icons').", "files": [ { "path": "src/icons/types.ts", "type": "registry:ui", "target": "icons/types.ts" }, { "path": "src/icons/accessibility.tsx", "type": "registry:ui", "target": "icons/accessibility.tsx" }, { "path": "src/icons/add.tsx", "type": "registry:ui", "target": "icons/add.tsx" }, { "path": "src/icons/arrow-forward.tsx", "type": "registry:ui", "target": "icons/arrow-forward.tsx" }, { "path": "src/icons/arrow-outward.tsx", "type": "registry:ui", "target": "icons/arrow-outward.tsx" }, { "path": "src/icons/call.tsx", "type": "registry:ui", "target": "icons/call.tsx" }, { "path": "src/icons/check-circle.tsx", "type": "registry:ui", "target": "icons/check-circle.tsx" }, { "path": "src/icons/check.tsx", "type": "registry:ui", "target": "icons/check.tsx" }, { "path": "src/icons/chevron-left.tsx", "type": "registry:ui", "target": "icons/chevron-left.tsx" }, { "path": "src/icons/chevron-right.tsx", "type": "registry:ui", "target": "icons/chevron-right.tsx" }, { "path": "src/icons/close.tsx", "type": "registry:ui", "target": "icons/close.tsx" }, { "path": "src/icons/code.tsx", "type": "registry:ui", "target": "icons/code.tsx" }, { "path": "src/icons/colors.tsx", "type": "registry:ui", "target": "icons/colors.tsx" }, { "path": "src/icons/dark-mode.tsx", "type": "registry:ui", "target": "icons/dark-mode.tsx" }, { "path": "src/icons/east.tsx", "type": "registry:ui", "target": "icons/east.tsx" }, { "path": "src/icons/error.tsx", "type": "registry:ui", "target": "icons/error.tsx" }, { "path": "src/icons/expand-less.tsx", "type": "registry:ui", "target": "icons/expand-less.tsx" }, { "path": "src/icons/expand-more.tsx", "type": "registry:ui", "target": "icons/expand-more.tsx" }, { "path": "src/icons/info.tsx", "type": "registry:ui", "target": "icons/info.tsx" }, { "path": "src/icons/key.tsx", "type": "registry:ui", "target": "icons/key.tsx" }, { "path": "src/icons/keyboard-arrow-down.tsx", "type": "registry:ui", "target": "icons/keyboard-arrow-down.tsx" }, { "path": "src/icons/light-mode.tsx", "type": "registry:ui", "target": "icons/light-mode.tsx" }, { "path": "src/icons/location-on.tsx", "type": "registry:ui", "target": "icons/location-on.tsx" }, { "path": "src/icons/login.tsx", "type": "registry:ui", "target": "icons/login.tsx" }, { "path": "src/icons/mail.tsx", "type": "registry:ui", "target": "icons/mail.tsx" }, { "path": "src/icons/menu.tsx", "type": "registry:ui", "target": "icons/menu.tsx" }, { "path": "src/icons/more-horiz.tsx", "type": "registry:ui", "target": "icons/more-horiz.tsx" }, { "path": "src/icons/open-in-new.tsx", "type": "registry:ui", "target": "icons/open-in-new.tsx" }, { "path": "src/icons/package.tsx", "type": "registry:ui", "target": "icons/package.tsx" }, { "path": "src/icons/palette.tsx", "type": "registry:ui", "target": "icons/palette.tsx" }, { "path": "src/icons/person-add.tsx", "type": "registry:ui", "target": "icons/person-add.tsx" }, { "path": "src/icons/remove.tsx", "type": "registry:ui", "target": "icons/remove.tsx" }, { "path": "src/icons/search.tsx", "type": "registry:ui", "target": "icons/search.tsx" }, { "path": "src/icons/shapes.tsx", "type": "registry:ui", "target": "icons/shapes.tsx" }, { "path": "src/icons/warning.tsx", "type": "registry:ui", "target": "icons/warning.tsx" }, { "path": "src/icons/west.tsx", "type": "registry:ui", "target": "icons/west.tsx" }, { "path": "src/icons/widgets.tsx", "type": "registry:ui", "target": "icons/widgets.tsx" } ] }, { "name": "link", "type": "registry:ui", "title": "Link", "description": "A link primitive with a provider for app router link components.", "dependencies": ["class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/link.tsx", "type": "registry:ui", "target": "components/link.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "logo", "type": "registry:ui", "title": "Logo", "description": "NSW Government logo component.", "dependencies": ["clsx"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/logo.tsx", "type": "registry:ui", "target": "components/logo.tsx" } ] }, { "name": "footer", "type": "registry:ui", "title": "Footer", "description": "End-of-page contentinfo landmark with acknowledgement of Country, legal links, ownership and social channels, themeable across 13 token-based surface colours.", "dependencies": ["class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/button.json", "{{REGISTRY_LOCATION}}/r/link.json", "{{REGISTRY_LOCATION}}/r/separator.json" ], "files": [ { "path": "src/components/footer.tsx", "type": "registry:ui", "target": "components/footer.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "header", "type": "registry:ui", "title": "Header", "description": "Top-of-page banner landmark with brand lockup, site name, version badge and a slot for header controls, in four WCAG 2.2 AAA surface colours.", "dependencies": ["class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/badge.json", "{{REGISTRY_LOCATION}}/r/link.json", "{{REGISTRY_LOCATION}}/r/logo.json" ], "files": [ { "path": "src/components/header.tsx", "type": "registry:ui", "target": "components/header.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "masthead", "type": "registry:ui", "title": "Masthead", "description": "The \"A NSW Government website\" strip shown above the site header, with WCAG 2.2 AAA colour variants and fluid/contained width presets.", "dependencies": ["class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/masthead.tsx", "type": "registry:ui", "target": "components/masthead.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "skip-link", "type": "registry:ui", "title": "Skip Link", "description": "Focus-revealed bypass links (SkipLink + SkipLinks landmark) that let keyboard and screen-reader users jump past repeated blocks, with the same AAA colour variants as the Masthead.", "dependencies": ["class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/skip-link.tsx", "type": "registry:ui", "target": "components/skip-link.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "spinner", "type": "registry:ui", "title": "Spinner", "description": "An inline loading spinner with semantic colour and size variants.", "dependencies": ["clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/spinner.tsx", "type": "registry:ui", "target": "components/spinner.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "aspect-ratio", "type": "registry:ui", "title": "Aspect Ratio", "description": "Constrains its content to a given width-to-height ratio.", "dependencies": ["clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/aspect-ratio.tsx", "type": "registry:ui", "target": "components/aspect-ratio.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "collapsible", "type": "registry:ui", "title": "Collapsible", "description": "An expandable section built on the Base UI collapsible primitive.", "dependencies": ["@base-ui/react"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/collapsible.tsx", "type": "registry:ui", "target": "components/collapsible.tsx" } ] }, { "name": "drawer", "type": "registry:ui", "title": "Drawer", "description": "An edge-anchored panel that slides in from any side, built on Vaul.", "dependencies": ["vaul", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/drawer.tsx", "type": "registry:ui", "target": "components/drawer.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" }, { "path": "src/lib/button-group-context.tsx", "type": "registry:lib", "target": "lib/button-group-context.tsx" } ] }, { "name": "hover-card", "type": "registry:ui", "title": "Hover Card", "description": "A rich preview surface shown on hover or focus, built on the Base UI preview-card primitive.", "dependencies": ["@base-ui/react", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/hover-card.tsx", "type": "registry:ui", "target": "components/hover-card.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" }, { "path": "src/lib/button-group-context.tsx", "type": "registry:lib", "target": "lib/button-group-context.tsx" } ] }, { "name": "popover", "type": "registry:ui", "title": "Popover", "description": "A floating panel anchored to a trigger, built on the Base UI popover primitive.", "dependencies": ["@base-ui/react", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/popover.tsx", "type": "registry:ui", "target": "components/popover.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" }, { "path": "src/lib/button-group-context.tsx", "type": "registry:lib", "target": "lib/button-group-context.tsx" } ] }, { "name": "resizable", "type": "registry:ui", "title": "Resizable", "description": "Resizable panel groups with draggable handles, built on react-resizable-panels.", "dependencies": ["react-resizable-panels", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/resizable.tsx", "type": "registry:ui", "target": "components/resizable.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "scroll-area", "type": "registry:ui", "title": "Scroll Area", "description": "A custom scrollable region with styled scrollbars, built on the Base UI scroll-area primitive.", "dependencies": ["@base-ui/react", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/scroll-area.tsx", "type": "registry:ui", "target": "components/scroll-area.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "sheet", "type": "registry:ui", "title": "Sheet", "description": "An edge-anchored dialog that slides in from any side, built on the Base UI dialog primitive.", "dependencies": ["@base-ui/react", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/button.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/components/sheet.tsx", "type": "registry:ui", "target": "components/sheet.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" }, { "path": "src/lib/button-group-context.tsx", "type": "registry:lib", "target": "lib/button-group-context.tsx" } ] }, { "name": "sonner", "type": "registry:ui", "title": "Sonner", "description": "A toast notification surface wired to next-themes, with NSWDS status icons.", "dependencies": ["clsx", "next-themes", "sonner", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/spinner.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/components/sonner.tsx", "type": "registry:ui", "target": "components/sonner.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "tooltip", "type": "registry:ui", "title": "Tooltip", "description": "A small label shown on hover or focus, built on the Base UI tooltip primitive.", "dependencies": ["@base-ui/react", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/tooltip.tsx", "type": "registry:ui", "target": "components/tooltip.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" }, { "path": "src/lib/button-group-context.tsx", "type": "registry:lib", "target": "lib/button-group-context.tsx" } ] }, { "name": "main-nav", "type": "registry:ui", "title": "Main Navigation", "description": "The full-width NSW site navigation bar with mega-menu panels, current-page marking and 13 token-based surface colours, built on the navigation-menu component.", "dependencies": ["@base-ui/react", "class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/link.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/components/main-nav.tsx", "type": "registry:ui", "target": "components/main-nav.tsx" }, { "path": "src/components/navigation-menu.tsx", "type": "registry:ui", "target": "components/navigation-menu.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" }, { "path": "src/lib/button-group-context.tsx", "type": "registry:lib", "target": "lib/button-group-context.tsx" } ] }, { "name": "side-nav", "type": "registry:ui", "title": "Side Navigation", "description": "Vertical section navigation with arbitrary collapsible nesting, current-page marking and auto-expansion of the active branch.", "dependencies": ["class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/collapsible.json", "{{REGISTRY_LOCATION}}/r/link.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/components/side-nav.tsx", "type": "registry:ui", "target": "components/side-nav.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "tab-nav", "type": "registry:ui", "title": "Tab Navigation", "description": "Flat horizontal navigation between the pages of one section, marking the current page with aria-current=\"page\".", "dependencies": ["class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/link.json" ], "files": [ { "path": "src/components/tab-nav.tsx", "type": "registry:ui", "target": "components/tab-nav.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "step-indicator", "type": "registry:ui", "title": "Step Indicator", "description": "Ordered multi-step progress list with status markers (completed, saved, in progress, error, cannot start) and an aria-current step, plus a sectioned StepNav wrapper.", "dependencies": ["clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/link.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/components/step-indicator.tsx", "type": "registry:ui", "target": "components/step-indicator.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "expandable-search", "type": "registry:ui", "title": "Expandable Search", "description": "A 48px search button that expands into a text field on focus, with ink-derived surface colours matching the footer palette.", "dependencies": ["class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/components/expandable-search.tsx", "type": "registry:ui", "target": "components/expandable-search.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "theme-switcher", "type": "registry:ui", "title": "Theme Switcher", "description": "Light/dark toggle button with controlled and uncontrolled modes — framework-free, wire it to next-themes or any theme store.", "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/button.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/components/theme-switcher.tsx", "type": "registry:ui", "target": "components/theme-switcher.tsx" } ] }, { "name": "push-menu", "type": "registry:ui", "title": "Push Menu", "description": "Multi-level drill-down navigation menu with slide transitions, focus management and inert parked levels, for mobile drawers.", "dependencies": ["clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/button.json", "{{REGISTRY_LOCATION}}/r/link.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/components/push-menu.tsx", "type": "registry:ui", "target": "components/push-menu.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "site-search", "type": "registry:ui", "title": "Site Search", "description": "Cmd/Ctrl-K site search palette on the Base UI autocomplete and dialog primitives — grouped results, keyboard filtering and an onSelect callback for framework routing.", "dependencies": ["@base-ui/react", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/button.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/components/site-search.tsx", "type": "registry:ui", "target": "components/site-search.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" }, { "path": "src/lib/button-group-context.tsx", "type": "registry:lib", "target": "lib/button-group-context.tsx" } ] }, { "name": "container", "type": "registry:ui", "title": "Container", "description": "Page-width column carrying the same lateral rhythm the Masthead, Header, MainNav and Footer apply to their own inner wrappers.", "dependencies": ["class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/container.tsx", "type": "registry:ui", "target": "components/container.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "section", "type": "registry:ui", "title": "Section", "description": "Top-level page section with the house vertical rhythm, an optional divider, and the aria-labelledby wiring that makes it a named region landmark.", "dependencies": ["class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/section.tsx", "type": "registry:ui", "target": "components/section.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "callout", "type": "registry:ui", "title": "Callout", "description": "Bordered notice marking page content as informational, confirming, cautionary or dangerous, using the NSW semantic role tokens.", "dependencies": ["class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/components/callout.tsx", "type": "registry:ui", "target": "components/callout.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "description-list", "type": "registry:ui", "title": "Description List", "description": "Term and detail pairs in stacked, two-column or inline layouts, for metadata strips and summary rows.", "dependencies": ["class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/description-list.tsx", "type": "registry:ui", "target": "components/description-list.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "link-card", "type": "registry:ui", "title": "Link Card", "description": "A card whose entire surface is a single link, with one tab stop and one accessible name.", "dependencies": ["clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/card.json", "{{REGISTRY_LOCATION}}/r/link.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/components/link-card.tsx", "type": "registry:ui", "target": "components/link-card.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "on-this-page", "type": "registry:ui", "title": "On This Page", "description": "In-page anchor navigation that tracks which section the reader has reached and marks it aria-current=\"location\".", "dependencies": ["clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/on-this-page.tsx", "type": "registry:ui", "target": "components/on-this-page.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "slider", "type": "registry:ui", "title": "Slider", "description": "A slider for choosing a number from a range, built on the Base UI Slider primitive, with a label and live value readout.", "dependencies": ["@base-ui/react", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/slider.tsx", "type": "registry:ui", "target": "components/slider.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "use-chrome-height", "type": "registry:hook", "title": "Use Chrome Height", "description": "Measures a sticky chrome element and publishes its height as a CSS custom property, keeping it current as the element resizes.", "dependencies": [], "files": [ { "path": "src/hooks/use-chrome-height.ts", "type": "registry:hook", "target": "hooks/use-chrome-height.ts" } ] }, { "name": "icon-brands", "type": "registry:ui", "title": "Brand Icons", "description": "Third-party brand marks (Facebook, X, YouTube, LinkedIn, Instagram, GitHub) for the footer social row, which the Material Symbols set does not include.", "dependencies": [], "files": [ { "path": "src/icons/types.ts", "type": "registry:ui", "target": "icons/types.ts" }, { "path": "src/icons/brands/index.tsx", "type": "registry:ui", "target": "icons/brands/index.tsx" } ] }, { "name": "accordion", "type": "registry:ui", "title": "Accordion", "description": "Vertically stacked, collapsible content panels.", "dependencies": ["@base-ui/react", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/components/accordion.tsx", "type": "registry:ui", "target": "components/accordion.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "avatar", "type": "registry:ui", "title": "Avatar", "description": "Avatar image with a text fallback, badge, and grouping.", "dependencies": ["@base-ui/react", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/avatar.tsx", "type": "registry:ui", "target": "components/avatar.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "breadcrumb", "type": "registry:ui", "title": "Breadcrumb", "description": "Breadcrumb trail showing the current page location.", "dependencies": ["@base-ui/react", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/components/breadcrumb.tsx", "type": "registry:ui", "target": "components/breadcrumb.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "button-group", "type": "registry:ui", "title": "Button Group", "description": "Joins Buttons into one control, with Button's variant family, colour tokens and size steps.", "dependencies": ["@base-ui/react", "class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/button.json", "{{REGISTRY_LOCATION}}/r/separator.json" ], "files": [ { "path": "src/components/button-group.tsx", "type": "registry:ui", "target": "components/button-group.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" }, { "path": "src/lib/button-group-context.tsx", "type": "registry:lib", "target": "lib/button-group-context.tsx" } ] }, { "name": "carousel", "type": "registry:ui", "title": "Carousel", "description": "A swipeable carousel built on Embla.", "dependencies": ["embla-carousel-react", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/button.json", "{{REGISTRY_LOCATION}}/r/direction.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/components/carousel.tsx", "type": "registry:ui", "target": "components/carousel.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "checkbox", "type": "registry:ui", "title": "Checkbox", "description": "A checkbox for single on/off selections.", "dependencies": ["@base-ui/react", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/components/checkbox.tsx", "type": "registry:ui", "target": "components/checkbox.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "combobox", "type": "registry:ui", "title": "Combobox", "description": "A text input paired with an autocomplete list of options.", "dependencies": ["@base-ui/react", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/button.json", "{{REGISTRY_LOCATION}}/r/input-group.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/components/combobox.tsx", "type": "registry:ui", "target": "components/combobox.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" }, { "path": "src/lib/button-group-context.tsx", "type": "registry:lib", "target": "lib/button-group-context.tsx" } ] }, { "name": "direction", "type": "registry:ui", "title": "Direction Provider", "description": "Provides text direction (LTR/RTL) to descendant components.", "dependencies": ["@base-ui/react"], "files": [ { "path": "src/components/direction.tsx", "type": "registry:ui", "target": "components/direction.tsx" } ] }, { "name": "input-group", "type": "registry:ui", "title": "Input Group", "description": "Composes an input with inline addons, buttons, and text.", "dependencies": ["class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/button.json", "{{REGISTRY_LOCATION}}/r/input.json", "{{REGISTRY_LOCATION}}/r/textarea.json" ], "files": [ { "path": "src/components/input-group.tsx", "type": "registry:ui", "target": "components/input-group.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "input-otp", "type": "registry:ui", "title": "Input OTP", "description": "A one-time-password / verification code input.", "dependencies": ["input-otp", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/components/input-otp.tsx", "type": "registry:ui", "target": "components/input-otp.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "kbd", "type": "registry:ui", "title": "Kbd", "description": "Displays a keyboard key or shortcut.", "dependencies": ["clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/kbd.tsx", "type": "registry:ui", "target": "components/kbd.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "native-select", "type": "registry:ui", "title": "Native Select", "description": "A styled native HTML select control.", "dependencies": ["clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/components/native-select.tsx", "type": "registry:ui", "target": "components/native-select.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "pagination", "type": "registry:ui", "title": "Pagination", "description": "Navigation controls for paginated content.", "dependencies": ["clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/button.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/components/pagination.tsx", "type": "registry:ui", "target": "components/pagination.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "progress", "type": "registry:ui", "title": "Progress", "description": "Shows the completion progress of a task.", "dependencies": ["@base-ui/react", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/progress.tsx", "type": "registry:ui", "target": "components/progress.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "radio-group", "type": "registry:ui", "title": "Radio Group", "description": "A set of mutually exclusive radio options.", "dependencies": ["@base-ui/react", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/radio-group.tsx", "type": "registry:ui", "target": "components/radio-group.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "select", "type": "registry:ui", "title": "Select", "description": "A dropdown for selecting a single value from a list.", "dependencies": ["@base-ui/react", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/components/select.tsx", "type": "registry:ui", "target": "components/select.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" }, { "path": "src/lib/button-group-context.tsx", "type": "registry:lib", "target": "lib/button-group-context.tsx" } ] }, { "name": "switch", "type": "registry:ui", "title": "Switch", "description": "A toggle switch for an on/off state.", "dependencies": ["@base-ui/react", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/switch.tsx", "type": "registry:ui", "target": "components/switch.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "table", "type": "registry:ui", "title": "Table", "description": "Primitives for rendering tabular data.", "dependencies": ["clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/table.tsx", "type": "registry:ui", "target": "components/table.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "tabs", "type": "registry:ui", "title": "Tabs", "description": "Layered content sections shown one panel at a time.", "dependencies": ["@base-ui/react", "class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/tabs.tsx", "type": "registry:ui", "target": "components/tabs.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "textarea", "type": "registry:ui", "title": "Textarea", "description": "A multi-line text input built on the Base UI input primitive with NSW form styling.", "dependencies": ["@base-ui/react", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/textarea.tsx", "type": "registry:ui", "target": "components/textarea.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "toggle", "type": "registry:ui", "title": "Toggle", "description": "A two-state button that can be on or off.", "dependencies": ["@base-ui/react", "class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": ["{{REGISTRY_LOCATION}}/r/theme.json"], "files": [ { "path": "src/components/toggle.tsx", "type": "registry:ui", "target": "components/toggle.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "toggle-group", "type": "registry:ui", "title": "Toggle Group", "description": "A set of two-state toggle buttons.", "dependencies": ["@base-ui/react", "class-variance-authority", "clsx", "tailwind-merge"], "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/toggle.json" ], "files": [ { "path": "src/components/toggle-group.tsx", "type": "registry:ui", "target": "components/toggle-group.tsx" }, { "path": "src/lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" } ] }, { "name": "login-form", "type": "registry:block", "title": "Login Form", "description": "A login form worked example (Card + Field + Input + Button) wired with NSWDS components. Copy-and-adapt block — not a published component.", "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/button.json", "{{REGISTRY_LOCATION}}/r/card.json", "{{REGISTRY_LOCATION}}/r/field.json", "{{REGISTRY_LOCATION}}/r/input.json", "{{REGISTRY_LOCATION}}/r/labeled-separator.json", "{{REGISTRY_LOCATION}}/r/link.json", "{{REGISTRY_LOCATION}}/r/separator.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/patterns/login-form.tsx", "type": "registry:component", "target": "components/login-form.tsx" } ] }, { "name": "sign-up-form", "type": "registry:block", "title": "Sign-up Form", "description": "A sign-up form worked example (Card + Field + Input + Button) wired with NSWDS components. Copy-and-adapt block — not a published component.", "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/button.json", "{{REGISTRY_LOCATION}}/r/card.json", "{{REGISTRY_LOCATION}}/r/field.json", "{{REGISTRY_LOCATION}}/r/input.json", "{{REGISTRY_LOCATION}}/r/labeled-separator.json", "{{REGISTRY_LOCATION}}/r/link.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/patterns/sign-up-form.tsx", "type": "registry:component", "target": "components/sign-up-form.tsx" } ] }, { "name": "forgot-password-form", "type": "registry:block", "title": "Forgot Password Form", "description": "A forgot-password form worked example (Card + Field + Input + Button) wired with NSWDS components. Copy-and-adapt block — not a published component.", "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/button.json", "{{REGISTRY_LOCATION}}/r/card.json", "{{REGISTRY_LOCATION}}/r/field.json", "{{REGISTRY_LOCATION}}/r/input.json", "{{REGISTRY_LOCATION}}/r/link.json" ], "files": [ { "path": "src/patterns/forgot-password-form.tsx", "type": "registry:component", "target": "components/forgot-password-form.tsx" } ] }, { "name": "footer-simple-centred", "type": "registry:block", "title": "Footer — Simple Centred", "description": "Everything centred under the NSW Government logo: the smallest footer that still carries acknowledgement of Country, legal links and ownership.", "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/footer.json", "{{REGISTRY_LOCATION}}/r/logo.json", "{{REGISTRY_LOCATION}}/r/separator.json" ], "files": [ { "path": "src/patterns/footer-simple-centred.tsx", "type": "registry:component", "target": "components/footer-simple-centred.tsx" } ] }, { "name": "footer-compact", "type": "registry:block", "title": "Footer — Compact Bar", "description": "A single horizontal row of logo, links, ownership and social, for embedded tools and admin screens. Omits acknowledgement of Country by design.", "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/footer.json", "{{REGISTRY_LOCATION}}/r/logo.json" ], "files": [ { "path": "src/patterns/footer-compact.tsx", "type": "registry:component", "target": "components/footer-compact.tsx" } ] }, { "name": "footer-sitemap", "type": "registry:block", "title": "Footer — Site Map", "description": "Four columns of links above the standard footer. The default choice for a department or agency site.", "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/footer.json" ], "files": [ { "path": "src/patterns/footer-sitemap.tsx", "type": "registry:component", "target": "components/footer-sitemap.tsx" } ] }, { "name": "footer-sitemap-brand", "type": "registry:block", "title": "Footer — Site Map with Brand", "description": "The NSW Government mark and a one-paragraph mission beside three link columns.", "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/footer.json", "{{REGISTRY_LOCATION}}/r/logo.json" ], "files": [ { "path": "src/patterns/footer-sitemap-brand.tsx", "type": "registry:component", "target": "components/footer-sitemap-brand.tsx" } ] }, { "name": "footer-newsletter", "type": "registry:block", "title": "Footer — Newsletter", "description": "Link columns beside a labelled email subscription form built on Field, Input and Button.", "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/footer.json", "{{REGISTRY_LOCATION}}/r/button.json", "{{REGISTRY_LOCATION}}/r/field.json", "{{REGISTRY_LOCATION}}/r/input.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/patterns/footer-newsletter.tsx", "type": "registry:component", "target": "components/footer-newsletter.tsx" } ] }, { "name": "footer-contact", "type": "registry:block", "title": "Footer — Contact Details", "description": "Phone, email, street address and opening hours in an
element, beside the site map.", "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/footer.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/patterns/footer-contact.tsx", "type": "registry:component", "target": "components/footer-contact.tsx" } ] }, { "name": "footer-cta", "type": "registry:block", "title": "Footer — Call to Action", "description": "A call-to-action band above the site map, tinted with the footer ink so it works on every surface colour.", "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/footer.json", "{{REGISTRY_LOCATION}}/r/button.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/patterns/footer-cta.tsx", "type": "registry:component", "target": "components/footer-cta.tsx" } ] }, { "name": "footer-accordion", "type": "registry:block", "title": "Footer — Collapsible Site Map", "description": "A long site map that collapses into accordions below the lg breakpoint and lays out as columns above it.", "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/footer.json", "{{REGISTRY_LOCATION}}/r/collapsible.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/patterns/footer-accordion.tsx", "type": "registry:component", "target": "components/footer-accordion.tsx" } ] }, { "name": "mobile-nav", "type": "registry:block", "title": "Mobile Navigation Drawer", "description": "Hamburger trigger opening a left-side sheet containing the multi-level push menu — the mobile navigation pattern for NSW site headers.", "registryDependencies": [ "{{REGISTRY_LOCATION}}/r/theme.json", "{{REGISTRY_LOCATION}}/r/button.json", "{{REGISTRY_LOCATION}}/r/sheet.json", "{{REGISTRY_LOCATION}}/r/push-menu.json", "{{REGISTRY_LOCATION}}/r/icons.json" ], "files": [ { "path": "src/patterns/mobile-nav.tsx", "type": "registry:component", "target": "components/mobile-nav.tsx" } ] } ] }