--- name: punkt-components description: Using Punkt design system components (React and Elements/Web Components). Covers component APIs, props, events, slots, and usage patterns for all Punkt UI components. Use when building UIs with Punkt components. --- # Punkt Components Skill for using Punkt design system components. Covers both React (`@oslokommune/punkt-react`) and Elements/Web Components (`@oslokommune/punkt-elements`). For CSS classes, colors, typography, spacing, grid, and layout, see the **punkt-css** skill. ## Getting started All usage patterns require Punkt CSS. See the punkt-css skill for setup instructions. ### React (NPM) ```sh npm add @oslokommune/punkt-react ``` ```jsx import { PktButton } from '@oslokommune/punkt-react'; Click me ``` Punkt components load icons, SVGs, and other resources from the CDN. If your project uses a Content Security Policy (CSP), you must configure it to allow resources from `https://punkt-cdn.oslo.kommune.no/`. See the [CSP section](#content-security-policy-csp) below. If you have unit tests, components that wrap Elements may need special setup — see individual component docs. ### Elements (NPM) ```sh npm add @oslokommune/punkt-elements ``` ```js import '@oslokommune/punkt-elements/dist/pkt-button.js'; ``` ```html Click me ``` For reactive slot content (content that changes programmatically), wrap it in a container element like `` or `
`. ### Elements (CDN) No build step required. Include CSS and component scripts directly: ```html ``` If using CSP, see the [CSP section](#content-security-policy-csp) below. ## Content Security Policy (CSP) Punkt components load fonts, icons (SVG), and other resources from `https://punkt-cdn.oslo.kommune.no/`. If the application uses a Content Security Policy, the CSP must allow this origin. This applies to all setup methods (NPM and CDN). **Required CSP directives:** ``` Content-Security-Policy: default-src 'self'; font-src 'self' https://punkt-cdn.oslo.kommune.no/; img-src 'self' https://punkt-cdn.oslo.kommune.no/; script-src 'self' https://punkt-cdn.oslo.kommune.no/; style-src 'self' 'unsafe-inline' https://punkt-cdn.oslo.kommune.no/; connect-src 'self' https://punkt-cdn.oslo.kommune.no/; ``` **Why `'unsafe-inline'` in `style-src`?** Because of the intricacies of SVG styling and certain web component features, Punkt requires `'unsafe-inline'` in the `style-src` directive. Without it, some styles will be blocked by the browser. CSP nonces can be used as an alternative but require server-side configuration. > **Important:** Always instruct users to configure CSP when setting up Punkt components. Missing CSP configuration is a common cause of broken fonts, missing icons, and invisible components. ## Components 1. [Accordion](accordion.md) 2. [Alert](alert.md) 3. [Backlink](backlink.md) 4. [Breadcrumbs](breadcrumbs.md) 5. [Button](button.md) 6. [Card](card.md) 7. [Checkbox](checkbox.md) 8. [Combobox](combobox.md) 9. [Consent](consent.md) 10. [Datepicker](datepicker.md) 11. [Footer](footer.md) 12. [Header](header.md) 13. [Icon](icon.md) 14. [Input Wrapper](input-wrapper.md) 15. [Link](link.md) 16. [LinkCard](linkcard.md) 17. [Loader](loader.md) 18. [Messagebox](messagebox.md) 19. [Modal](modal.md) 20. [Progressbar](progressbar.md) 21. [Radio Button](radiobutton.md) 22. [Search Input](searchinput.md) 23. [Select](select.md) 24. [Steps](steps.md) 25. [Switch](switch.md) 26. [Table](table.md) 27. [Tabs](tabs.md) 28. [Tag](tag.md) 29. [Textarea](textarea.md) 30. [Text Input](textinput.md)