@moto-nrw/design-system 0.2.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Accordion/Accordion.tsx","../src/components/Accordion/Accordion.module.css","../src/components/Alert/Alert.module.css","../src/components/Alert/Alert.tsx","../src/components/Avatar/Avatar.module.css","../src/components/Avatar/Avatar.tsx","../src/components/Badge/Badge.module.css","../src/components/Badge/Badge.tsx","../src/components/Button/Button.module.css","../src/components/Button/Button.tsx","../src/components/Card/Card.module.css","../src/components/Card/Card.tsx","../src/components/Checkbox/Checkbox.module.css","../src/components/Checkbox/Checkbox.tsx","../src/components/Divider/Divider.module.css","../src/components/Divider/Divider.tsx","../src/components/DropdownMenu/DropdownMenu.tsx","../src/components/DropdownMenu/DropdownMenu.module.css","../src/components/FilterChips/FilterChips.module.css","../src/components/FilterChips/FilterChips.tsx","../src/components/Input/Input.tsx","../src/components/Input/Input.module.css","../src/components/Logo/Logo.tsx","../src/components/Modal/Modal.tsx","../src/components/Modal/Modal.module.css","../src/components/Pill/Pill.module.css","../src/components/Pill/Pill.tsx","../src/components/Radio/Radio.module.css","../src/components/Radio/Radio.tsx","../src/components/SearchBar/SearchBar.module.css","../src/components/SearchBar/SearchBar.tsx","../src/components/Select/Select.module.css","../src/components/Select/Select.tsx","../src/components/Skeleton/Skeleton.module.css","../src/components/Skeleton/Skeleton.tsx","../src/components/Spinner/Spinner.module.css","../src/components/Spinner/Spinner.tsx","../src/components/StatusDot/StatusDot.module.css","../src/components/StatusDot/StatusDot.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Tabs/Tabs.module.css","../src/components/Textarea/Textarea.module.css","../src/components/Textarea/Textarea.tsx","../src/components/Toast/Toast.tsx","../src/components/Toast/Toast.module.css","../src/components/Toggle/Toggle.module.css","../src/components/Toggle/Toggle.tsx"],"sourcesContent":["import { type ReactNode, useState } from \"react\";\nimport styles from \"./Accordion.module.css\";\n\nexport interface AccordionProps {\n\tlabel: string;\n\tbadge?: ReactNode;\n\tdefaultOpen?: boolean;\n\tchildren: ReactNode;\n\tclassName?: string;\n}\n\nexport function Accordion({\n\tlabel,\n\tbadge,\n\tdefaultOpen = false,\n\tchildren,\n\tclassName,\n}: AccordionProps) {\n\tconst [isOpen, setIsOpen] = useState(defaultOpen);\n\n\treturn (\n\t\t<div className={[styles.accordion, className].filter(Boolean).join(\" \")}>\n\t\t\t<button type=\"button\" onClick={() => setIsOpen((prev) => !prev)} className={styles.trigger}>\n\t\t\t\t<span className={styles.label}>\n\t\t\t\t\t{label}\n\t\t\t\t\t{badge && <span className={styles.badge}>{badge}</span>}\n\t\t\t\t</span>\n\t\t\t\t<svg\n\t\t\t\t\tclassName={[styles.chevron, isOpen && styles.chevronOpen].filter(Boolean).join(\" \")}\n\t\t\t\t\twidth=\"16\"\n\t\t\t\t\theight=\"16\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t>\n\t\t\t\t\t<path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n\t\t\t\t</svg>\n\t\t\t</button>\n\n\t\t\t<div\n\t\t\t\tclassName={[styles.content, isOpen ? styles.contentOpen : styles.contentClosed].join(\" \")}\n\t\t\t>\n\t\t\t\t<div className={styles.contentInner}>{children}</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n",".accordion {\n\tborder-top: 1px solid var(--semantic-color-border-default);\n}\n\n.trigger {\n\tdisplay: flex;\n\twidth: 100%;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding: 12px 20px;\n\tborder: none;\n\tbackground: none;\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-sm);\n\tfont-weight: var(--font-weight-medium);\n\tcolor: var(--semantic-color-text-secondary);\n\tcursor: pointer;\n\ttransition: color 150ms ease;\n}\n\n.trigger:hover {\n\tcolor: var(--semantic-color-text-default);\n}\n\n.label {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n}\n\n.badge {\n\tdisplay: inline-flex;\n}\n\n.chevron {\n\tflex-shrink: 0;\n\tcolor: var(--semantic-color-text-muted);\n\ttransition: transform 200ms ease;\n}\n\n.chevronOpen {\n\ttransform: rotate(180deg);\n}\n\n/* Grid-based collapse animation (matches Phoenix) */\n.content {\n\tdisplay: grid;\n\ttransition: grid-template-rows 200ms ease;\n}\n\n.contentOpen {\n\tgrid-template-rows: 1fr;\n}\n\n.contentClosed {\n\tgrid-template-rows: 0fr;\n}\n\n.contentInner {\n\toverflow: hidden;\n}\n",".alert {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--spacing-2);\n\tpadding: var(--spacing-3) var(--spacing-4);\n\tborder-radius: var(--radius-md);\n\tborder: 1px solid transparent;\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-sm);\n\tbox-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n}\n\n.icon {\n\tflex-shrink: 0;\n\tdisplay: flex;\n}\n\n/* ─── Types ─── */\n\n.error {\n\tbackground-color: var(--semantic-color-feedback-error-light);\n\tcolor: var(--color-red-600);\n\tborder-color: var(--color-red-400);\n}\n\n.success {\n\tbackground-color: var(--semantic-color-brand-primary-light);\n\tcolor: var(--color-sage-700);\n\tborder-color: var(--color-sage-300);\n}\n\n.warning {\n\tbackground-color: var(--semantic-color-brand-secondary-light);\n\tcolor: var(--color-warm-700);\n\tborder-color: var(--color-warm-300);\n}\n\n.info {\n\tbackground-color: var(--semantic-color-bg-muted);\n\tcolor: var(--color-steel-700);\n\tborder-color: var(--color-steel-300);\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport styles from \"./Alert.module.css\";\n\nexport type AlertType = \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport interface AlertProps extends HTMLAttributes<HTMLDivElement> {\n\ttype: AlertType;\n\tmessage: string;\n}\n\nconst icons: Record<AlertType, ReactNode> = {\n\terror: (\n\t\t<svg width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\td=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t/>\n\t\t</svg>\n\t),\n\tsuccess: (\n\t\t<svg width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\td=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t/>\n\t\t</svg>\n\t),\n\twarning: (\n\t\t<svg width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\td=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t/>\n\t\t</svg>\n\t),\n\tinfo: (\n\t\t<svg width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\td=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t/>\n\t\t</svg>\n\t),\n};\n\nexport function Alert({ type, message, className, ...props }: AlertProps) {\n\tif (!message) return null;\n\n\treturn (\n\t\t<div\n\t\t\trole=\"alert\"\n\t\t\tclassName={[styles.alert, styles[type], className].filter(Boolean).join(\" \")}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className={styles.icon}>{icons[type]}</span>\n\t\t\t<span>{message}</span>\n\t\t</div>\n\t);\n}\n",".avatar {\n\tposition: relative;\n\tdisplay: flex;\n\tflex-shrink: 0;\n\talign-items: center;\n\tjustify-content: center;\n\toverflow: hidden;\n\tborder-radius: 9999px;\n\tbackground: linear-gradient(135deg, var(--color-steel-800), var(--color-steel-500));\n\tcolor: var(--semantic-color-text-inverse);\n\tfont-family: var(--font-family-sans);\n\tfont-weight: var(--font-weight-semibold);\n}\n\n.sm {\n\twidth: 32px;\n\theight: 32px;\n\tfont-size: var(--font-size-sm);\n\tbox-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n\toutline: 2px solid white;\n\toutline-offset: -2px;\n}\n\n.md {\n\twidth: 44px;\n\theight: 44px;\n\tfont-size: var(--font-size-base);\n\tbox-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1);\n}\n\n.lg {\n\twidth: 64px;\n\theight: 64px;\n\tfont-size: var(--font-size-xl);\n\tbox-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1);\n}\n\n.image {\n\twidth: 100%;\n\theight: 100%;\n\tobject-fit: cover;\n}\n\n.initials {\n\tuser-select: none;\n}\n","import type { HTMLAttributes } from \"react\";\nimport styles from \"./Avatar.module.css\";\n\nexport interface AvatarProps extends HTMLAttributes<HTMLDivElement> {\n\tname: string;\n\tsrc?: string | null;\n\tsize?: \"sm\" | \"md\" | \"lg\";\n}\n\nfunction getInitials(name: string): string {\n\tconst parts = name.split(\" \").filter(Boolean);\n\tif (parts.length === 0) return \"?\";\n\tif (parts.length === 1) return (parts[0]?.[0] ?? \"?\").toUpperCase();\n\treturn ((parts[0]?.[0] ?? \"\") + (parts.at(-1)?.[0] ?? \"\")).toUpperCase();\n}\n\nexport function Avatar({ name, src, size = \"sm\", className, ...props }: AvatarProps) {\n\tconst initials = getInitials(name);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={[styles.avatar, styles[size], className].filter(Boolean).join(\" \")}\n\t\t\ttitle={name}\n\t\t\t{...props}\n\t\t>\n\t\t\t{src ? (\n\t\t\t\t<img src={src} alt={name} className={styles.image} />\n\t\t\t) : (\n\t\t\t\t<span className={styles.initials}>{initials}</span>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",".badge {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tborder-radius: 9999px;\n\tborder: 1px solid var(--semantic-color-border-default);\n\tbackground-color: var(--semantic-color-bg-subtle);\n\tfont-family: var(--font-family-sans);\n}\n\n.sm {\n\tpadding: 6px 8px;\n\tgap: 6px;\n}\n\n.md {\n\tpadding: 6px 12px;\n\tgap: 8px;\n}\n\n.icon {\n\tdisplay: flex;\n\tcolor: var(--semantic-color-text-muted);\n}\n\n.count {\n\tfont-size: var(--font-size-sm);\n\tfont-weight: var(--font-weight-semibold);\n\tcolor: var(--semantic-color-text-default);\n}\n\n.label {\n\tfont-size: var(--font-size-xs);\n\tcolor: var(--semantic-color-text-muted);\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport styles from \"./Badge.module.css\";\n\nexport interface BadgeProps extends HTMLAttributes<HTMLDivElement> {\n\tcount: number | string;\n\tlabel?: string;\n\ticon?: ReactNode;\n\tshowLabel?: boolean;\n\tsize?: \"sm\" | \"md\";\n}\n\nexport function Badge({\n\tcount,\n\tlabel,\n\ticon,\n\tshowLabel = true,\n\tsize = \"md\",\n\tclassName,\n\t...props\n}: BadgeProps) {\n\treturn (\n\t\t<div className={[styles.badge, styles[size], className].filter(Boolean).join(\" \")} {...props}>\n\t\t\t{icon && <span className={styles.icon}>{icon}</span>}\n\t\t\t<span className={styles.count}>{count}</span>\n\t\t\t{showLabel && label && <span className={styles.label}>{label}</span>}\n\t\t</div>\n\t);\n}\n\nexport function BadgeCompact({\n\tcount,\n\ticon,\n\tclassName,\n\t...props\n}: Omit<BadgeProps, \"label\" | \"showLabel\">) {\n\treturn (\n\t\t<div className={[styles.badge, styles.sm, className].filter(Boolean).join(\" \")} {...props}>\n\t\t\t{icon && <span className={styles.icon}>{icon}</span>}\n\t\t\t<span className={styles.count}>{count}</span>\n\t\t</div>\n\t);\n}\n",".button {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tgap: var(--spacing-2);\n\tborder: 1px solid transparent;\n\tborder-radius: var(--radius-md);\n\tfont-family: var(--font-family-sans);\n\tfont-weight: var(--font-weight-medium);\n\tcursor: pointer;\n\ttransition:\n\t\tbackground-color 150ms ease,\n\t\tborder-color 150ms ease,\n\t\tbox-shadow 150ms ease,\n\t\tcolor 150ms ease,\n\t\ttransform 150ms ease;\n}\n\n.button:focus-visible {\n\toutline: none;\n}\n\n.button:disabled {\n\topacity: 0.5;\n\tcursor: not-allowed;\n}\n\n/* ─── Variants ─── */\n\n.primary {\n\tbackground-color: var(--color-steel-900);\n\tcolor: var(--semantic-color-text-inverse);\n\tbox-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1);\n}\n\n.primary:hover:not(:disabled) {\n\tbackground-color: var(--color-steel-700);\n\tbox-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1);\n}\n\n.secondary {\n\tbackground-color: var(--color-steel-200);\n\tcolor: var(--color-steel-800);\n\tbox-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1);\n}\n\n.secondary:hover:not(:disabled) {\n\tbackground-color: var(--color-steel-300);\n\tbox-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1);\n}\n\n.outline {\n\tbackground-color: transparent;\n\tcolor: var(--color-steel-700);\n\tborder-color: var(--semantic-color-border-strong);\n}\n\n.outline:hover:not(:disabled) {\n\tbackground-color: var(--semantic-color-bg-subtle);\n\tborder-color: var(--color-steel-400);\n}\n\n.outline_danger {\n\tbackground-color: var(--color-red-50);\n\tcolor: var(--color-red-600);\n\tborder-color: var(--color-red-400);\n}\n\n.outline_danger:hover:not(:disabled) {\n\tbackground-color: var(--semantic-color-feedback-error-light);\n\tborder-color: var(--color-red-500);\n}\n\n.danger {\n\tbackground-color: var(--color-red-600);\n\tcolor: var(--semantic-color-text-inverse);\n\tbox-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1);\n}\n\n.danger:hover:not(:disabled) {\n\tbackground-color: var(--color-red-500);\n\tbox-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1);\n}\n\n.success {\n\tbackground-color: var(--semantic-color-brand-primary);\n\tcolor: var(--semantic-color-text-inverse);\n\tbox-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1);\n}\n\n.success:hover:not(:disabled) {\n\tbackground-color: var(--semantic-color-brand-primary-hover);\n\tbox-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1);\n}\n\n.success:active:not(:disabled) {\n\ttransform: scale(0.95);\n}\n\n.ghost {\n\tbackground-color: transparent;\n\tcolor: var(--semantic-color-text-default);\n}\n\n.ghost:hover:not(:disabled) {\n\tbackground-color: var(--semantic-color-bg-muted);\n}\n\n/* ─── Sizes ─── */\n\n.sm {\n\tpadding: var(--spacing-1) var(--spacing-3);\n\tfont-size: var(--font-size-sm);\n\tline-height: var(--font-line-height-normal);\n}\n\n.md {\n\tpadding: var(--spacing-2) var(--spacing-5);\n\tfont-size: var(--font-size-base);\n\tline-height: var(--font-line-height-normal);\n}\n\n.lg {\n\tpadding: var(--spacing-3) var(--spacing-5);\n\tfont-size: var(--font-size-lg);\n\tline-height: var(--font-line-height-normal);\n}\n\n.xl {\n\tpadding: var(--spacing-3) var(--spacing-6);\n\tfont-size: var(--font-size-xl);\n\tline-height: var(--font-line-height-normal);\n}\n","import type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport styles from \"./Button.module.css\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n\tvariant?: \"primary\" | \"secondary\" | \"outline\" | \"outline_danger\" | \"danger\" | \"success\" | \"ghost\";\n\tsize?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n\tisLoading?: boolean;\n\tloadingText?: string;\n\tchildren: ReactNode;\n}\n\nexport function Button({\n\tvariant = \"primary\",\n\tsize = \"md\",\n\tisLoading = false,\n\tloadingText = \"Laden...\",\n\tclassName,\n\tchildren,\n\tdisabled,\n\ttype = \"submit\",\n\t...props\n}: ButtonProps) {\n\tconst classNames = [styles.button, styles[variant], styles[size], className]\n\t\t.filter(Boolean)\n\t\t.join(\" \");\n\n\treturn (\n\t\t<button\n\t\t\ttype={type}\n\t\t\tclassName={classNames}\n\t\t\tdisabled={disabled || isLoading}\n\t\t\taria-busy={isLoading || undefined}\n\t\t\t{...props}\n\t\t>\n\t\t\t{isLoading ? loadingText : children}\n\t\t</button>\n\t);\n}\n",".card {\n\tposition: relative;\n\toverflow: hidden;\n\tborder-radius: 24px;\n\tbackground-color: var(--semantic-color-bg-default);\n\ttransition:\n\t\ttransform 150ms ease,\n\t\tbox-shadow 150ms ease,\n\t\tborder-color 150ms ease,\n\t\tbackground-color 150ms ease;\n}\n\n/* ─── Variants ─── */\n\n.default {\n\tborder: 1px solid var(--semantic-color-border-default);\n}\n\n.elevated {\n\tborder: 1px solid rgb(0 0 0 / 0.05);\n\tbackground-color: rgb(255 255 255 / 0.9);\n\tbox-shadow: 0 8px 30px rgb(0 0 0 / 0.12);\n\tbackdrop-filter: blur(12px);\n}\n\n.glass {\n\tbackground-color: rgb(255 255 255 / 0.8);\n\tbox-shadow:\n\t\t0 10px 15px -3px rgb(0 0 0 / 0.1),\n\t\t0 4px 6px -4px rgb(0 0 0 / 0.1);\n\tbackdrop-filter: blur(12px);\n}\n\n/* ─── Hoverable (matches Phoenix StudentCard) ─── */\n\n.hoverable {\n\tcursor: pointer;\n\tborder: 1px solid rgb(0 0 0 / 0.05);\n\tbackground-color: rgb(255 255 255 / 0.9);\n\tbox-shadow: 0 8px 30px rgb(0 0 0 / 0.12);\n\tbackdrop-filter: blur(12px);\n}\n\n.hoverable:hover {\n\ttransform: translateY(-2px);\n\tborder-color: rgb(148 163 184 / 0.5);\n\tbackground-color: rgb(255 255 255);\n\tbox-shadow: 0 12px 40px rgb(0 0 0 / 0.18);\n}\n\n.hoverable:active {\n\ttransform: scale(0.98);\n}\n\n/* ─── Hoverable Layers (gradient overlay, inner glow, ring, glow border) ─── */\n\n.gradientOverlay {\n\tposition: absolute;\n\tinset: 0;\n\tborder-radius: 24px;\n\tbackground: linear-gradient(to bottom right, rgb(248 250 252 / 0.8), rgb(241 245 249 / 0.8));\n\topacity: 0.03;\n\tpointer-events: none;\n}\n\n.innerGlow {\n\tposition: absolute;\n\tinset: 1px;\n\tborder-radius: 24px;\n\tbackground: linear-gradient(to bottom right, rgb(255 255 255 / 0.8), rgb(255 255 255 / 0.2));\n\tpointer-events: none;\n}\n\n.ringHighlight {\n\tposition: absolute;\n\tinset: 0;\n\tborder-radius: 24px;\n\tbox-shadow: inset 0 0 0 1px rgb(255 255 255 / 0.2);\n\ttransition: box-shadow 150ms ease;\n\tpointer-events: none;\n}\n\n.hoverable:hover .ringHighlight {\n\tbox-shadow: inset 0 0 0 1px rgb(148 163 184 / 0.4);\n}\n\n.glowBorder {\n\tposition: absolute;\n\tinset: 0;\n\tborder-radius: 24px;\n\tbackground: linear-gradient(to right, transparent, rgb(148 163 184 / 0.2), transparent);\n\topacity: 0;\n\ttransition: opacity 150ms ease;\n\tpointer-events: none;\n}\n\n.hoverable:hover .glowBorder {\n\topacity: 1;\n}\n\n/* ─── Content ─── */\n\n.cardContent {\n\tposition: relative;\n}\n\n/* ─── Padding ─── */\n\n.padding-sm {\n\tpadding: var(--spacing-4);\n}\n\n.padding-md {\n\tpadding: var(--spacing-6);\n}\n\n.padding-lg {\n\tpadding: var(--spacing-10);\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport styles from \"./Card.module.css\";\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n\tvariant?: \"default\" | \"elevated\" | \"glass\";\n\tpadding?: \"none\" | \"sm\" | \"md\" | \"lg\";\n\thoverable?: boolean;\n\tchildren: ReactNode;\n}\n\nexport function Card({\n\tvariant = \"default\",\n\tpadding = \"md\",\n\thoverable = false,\n\tclassName,\n\tchildren,\n\t...props\n}: CardProps) {\n\tconst classNames = [\n\t\tstyles.card,\n\t\t!hoverable && styles[variant],\n\t\thoverable && styles.hoverable,\n\t\tclassName,\n\t]\n\t\t.filter(Boolean)\n\t\t.join(\" \");\n\n\tconst contentClass = [styles.cardContent, padding !== \"none\" && styles[`padding-${padding}`]]\n\t\t.filter(Boolean)\n\t\t.join(\" \");\n\n\tif (hoverable) {\n\t\treturn (\n\t\t\t<div className={classNames} {...props}>\n\t\t\t\t<div className={styles.gradientOverlay} />\n\t\t\t\t<div className={styles.innerGlow} />\n\t\t\t\t<div className={styles.ringHighlight} />\n\t\t\t\t<div className={contentClass}>{children}</div>\n\t\t\t\t<div className={styles.glowBorder} />\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={classNames} {...props}>\n\t\t\t<div className={contentClass}>{children}</div>\n\t\t</div>\n\t);\n}\n",".wrapper {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 12px;\n\tpadding: 6px 8px;\n\tborder-radius: var(--radius-md);\n\tcursor: pointer;\n\ttransition: background-color 150ms ease;\n}\n\n.wrapper:hover {\n\tbackground-color: var(--semantic-color-bg-subtle);\n}\n\n.input {\n\twidth: 16px;\n\theight: 16px;\n\tborder-radius: var(--radius-sm);\n\tborder: 1px solid var(--semantic-color-border-strong);\n\taccent-color: var(--color-steel-900);\n\tcursor: pointer;\n}\n\n.input:disabled {\n\topacity: 0.5;\n\tcursor: not-allowed;\n}\n\n.label {\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-sm);\n\tcolor: var(--semantic-color-text-default);\n\tuser-select: none;\n}\n","import type { InputHTMLAttributes } from \"react\";\nimport styles from \"./Checkbox.module.css\";\n\nexport interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n\tlabel: string;\n}\n\nexport function Checkbox({ label, id, name, className, ...props }: CheckboxProps) {\n\tconst inputId = id || name || label.toLowerCase().replace(/\\s+/g, \"-\");\n\n\treturn (\n\t\t<label htmlFor={inputId} className={[styles.wrapper, className].filter(Boolean).join(\" \")}>\n\t\t\t<input type=\"checkbox\" id={inputId} name={name} className={styles.input} {...props} />\n\t\t\t<span className={styles.label}>{label}</span>\n\t\t</label>\n\t);\n}\n",".divider {\n\tborder: none;\n\tborder-top: 1px solid var(--semantic-color-border-default);\n}\n\n.labeled {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 16px;\n}\n\n.line {\n\tflex: 1;\n\tborder: none;\n\tborder-top: 1px solid var(--semantic-color-border-default);\n}\n\n.label {\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-xs);\n\tfont-weight: var(--font-weight-medium);\n\tcolor: var(--semantic-color-text-muted);\n\twhite-space: nowrap;\n}\n\n/* ─── Spacing ─── */\n\n.sm {\n\tmargin: var(--spacing-2) 0;\n}\n\n.md {\n\tmargin: var(--spacing-4) 0;\n}\n\n.lg {\n\tmargin: var(--spacing-8) 0;\n}\n","import type { HTMLAttributes } from \"react\";\nimport styles from \"./Divider.module.css\";\n\nexport interface DividerProps extends HTMLAttributes<HTMLHRElement> {\n\tspacing?: \"sm\" | \"md\" | \"lg\";\n\tlabel?: string;\n}\n\nexport function Divider({ spacing = \"md\", label, className, ...props }: DividerProps) {\n\tif (label) {\n\t\treturn (\n\t\t\t<div className={[styles.labeled, styles[spacing], className].filter(Boolean).join(\" \")}>\n\t\t\t\t<hr className={styles.line} {...props} />\n\t\t\t\t<span className={styles.label}>{label}</span>\n\t\t\t\t<hr className={styles.line} {...props} />\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<hr\n\t\t\tclassName={[styles.divider, styles[spacing], className].filter(Boolean).join(\" \")}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n","import { type ReactNode, useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport styles from \"./DropdownMenu.module.css\";\n\nexport interface DropdownMenuItem {\n\tid: string;\n\tlabel: string;\n\tonClick: () => void;\n\tvariant?: \"default\" | \"danger\";\n}\n\nexport interface DropdownMenuProps {\n\titems: DropdownMenuItem[];\n\ttrigger?: ReactNode;\n\tclassName?: string;\n}\n\nexport function DropdownMenu({ items, trigger, className }: DropdownMenuProps) {\n\tconst [isOpen, setIsOpen] = useState(false);\n\tconst [position, setPosition] = useState({ top: 0, right: 0 });\n\tconst buttonRef = useRef<HTMLButtonElement>(null);\n\tconst menuRef = useRef<HTMLDivElement>(null);\n\n\tconst close = useCallback(() => setIsOpen(false), []);\n\n\tuseEffect(() => {\n\t\tif (!isOpen) return;\n\n\t\tfunction handleClickOutside(event: MouseEvent) {\n\t\t\tconst target = event.target as Node;\n\t\t\tif (!buttonRef.current?.contains(target) && !menuRef.current?.contains(target)) {\n\t\t\t\tclose();\n\t\t\t}\n\t\t}\n\n\t\tfunction handleScroll() {\n\t\t\tclose();\n\t\t}\n\n\t\tfunction handleEscape(e: KeyboardEvent) {\n\t\t\tif (e.key === \"Escape\") close();\n\t\t}\n\n\t\tdocument.addEventListener(\"mousedown\", handleClickOutside);\n\t\twindow.addEventListener(\"scroll\", handleScroll, true);\n\t\tdocument.addEventListener(\"keydown\", handleEscape);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"mousedown\", handleClickOutside);\n\t\t\twindow.removeEventListener(\"scroll\", handleScroll, true);\n\t\t\tdocument.removeEventListener(\"keydown\", handleEscape);\n\t\t};\n\t}, [isOpen, close]);\n\n\tconst handleToggle = () => {\n\t\tif (!isOpen && buttonRef.current) {\n\t\t\tconst rect = buttonRef.current.getBoundingClientRect();\n\t\t\tsetPosition({\n\t\t\t\ttop: rect.bottom + 4,\n\t\t\t\tright: window.innerWidth - rect.right,\n\t\t\t});\n\t\t}\n\t\tsetIsOpen((prev) => !prev);\n\t};\n\n\tconst menu = isOpen && typeof document !== \"undefined\" && (\n\t\t<div\n\t\t\tref={menuRef}\n\t\t\tclassName={styles.menu}\n\t\t\tstyle={{ top: position.top, right: position.right }}\n\t\t\trole=\"menu\"\n\t\t>\n\t\t\t{items.map((item) => (\n\t\t\t\t<button\n\t\t\t\t\tkey={item.id}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tclose();\n\t\t\t\t\t\titem.onClick();\n\t\t\t\t\t}}\n\t\t\t\t\tclassName={[styles.menuItem, item.variant === \"danger\" && styles.menuItemDanger]\n\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t.join(\" \")}\n\t\t\t\t>\n\t\t\t\t\t{item.label}\n\t\t\t\t</button>\n\t\t\t))}\n\t\t</div>\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t<button\n\t\t\t\tref={buttonRef}\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={handleToggle}\n\t\t\t\tclassName={[styles.trigger, className].filter(Boolean).join(\" \")}\n\t\t\t\taria-label=\"Aktionen\"\n\t\t\t\taria-expanded={isOpen}\n\t\t\t\taria-haspopup=\"menu\"\n\t\t\t>\n\t\t\t\t{trigger || (\n\t\t\t\t\t<svg className={styles.dotsIcon} fill=\"currentColor\" viewBox=\"0 0 20 20\">\n\t\t\t\t\t\t<path d=\"M10 6a2 2 0 110-4 2 2 0 010 4zM10 12a2 2 0 110-4 2 2 0 010 4zM10 18a2 2 0 110-4 2 2 0 010 4z\" />\n\t\t\t\t\t</svg>\n\t\t\t\t)}\n\t\t\t</button>\n\t\t\t{menu && createPortal(menu, document.body)}\n\t\t</>\n\t);\n}\n",".trigger {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: 4px;\n\tborder: none;\n\tborder-radius: var(--radius-md);\n\tbackground: none;\n\tcolor: var(--semantic-color-text-muted);\n\tcursor: pointer;\n\ttransition:\n\t\tbackground-color 150ms ease,\n\t\tcolor 150ms ease;\n}\n\n.trigger:hover {\n\tbackground-color: var(--semantic-color-bg-muted);\n\tcolor: var(--semantic-color-text-secondary);\n}\n\n.dotsIcon {\n\twidth: 20px;\n\theight: 20px;\n}\n\n.menu {\n\tposition: fixed;\n\tz-index: 9999;\n\twidth: 144px;\n\tpadding: 4px;\n\tborder: 1px solid var(--semantic-color-border-default);\n\tborder-radius: var(--radius-md);\n\tbackground-color: var(--semantic-color-bg-default);\n\tbox-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1);\n}\n\n.menuItem {\n\tdisplay: flex;\n\twidth: 100%;\n\talign-items: center;\n\tpadding: 6px 12px;\n\tborder: none;\n\tborder-radius: var(--radius-sm);\n\tbackground: none;\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-sm);\n\tcolor: var(--color-steel-700);\n\ttext-align: left;\n\tcursor: pointer;\n\ttransition: background-color 150ms ease;\n}\n\n.menuItem:hover {\n\tbackground-color: var(--semantic-color-bg-muted);\n}\n\n.menuItemDanger {\n\tcolor: var(--color-red-600);\n}\n\n.menuItemDanger:hover {\n\tbackground-color: var(--semantic-color-feedback-error-light);\n}\n",".wrapper {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n}\n\n.chips {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 8px;\n}\n\n.chip {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 4px;\n\tpadding: 4px 12px;\n\tborder-radius: 9999px;\n\tbackground-color: var(--semantic-color-brand-primary-light);\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-xs);\n\tfont-weight: var(--font-weight-medium);\n\tcolor: var(--color-sage-900);\n}\n\n.removeButton {\n\tdisplay: flex;\n\tpadding: 0;\n\tborder: none;\n\tbackground: none;\n\tcolor: inherit;\n\tcursor: pointer;\n\ttransition: color 150ms ease;\n}\n\n.removeButton:hover {\n\tcolor: var(--color-sage-700);\n}\n\n.clearAll {\n\tpadding: 0;\n\tborder: none;\n\tbackground: none;\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-xs);\n\tfont-weight: var(--font-weight-medium);\n\tcolor: var(--semantic-color-brand-primary);\n\tcursor: pointer;\n\twhite-space: nowrap;\n\ttransition: color 150ms ease;\n}\n\n.clearAll:hover {\n\tcolor: var(--semantic-color-brand-primary-hover);\n}\n","import type { HTMLAttributes } from \"react\";\nimport styles from \"./FilterChips.module.css\";\n\nexport interface ActiveFilter {\n\tid: string;\n\tlabel: string;\n\tonRemove: () => void;\n}\n\nexport interface FilterChipsProps extends HTMLAttributes<HTMLDivElement> {\n\tfilters: ActiveFilter[];\n\tonClearAll?: () => void;\n}\n\nexport function FilterChips({ filters, onClearAll, className, ...props }: FilterChipsProps) {\n\tif (filters.length === 0) return null;\n\n\treturn (\n\t\t<div className={[styles.wrapper, className].filter(Boolean).join(\" \")} {...props}>\n\t\t\t<div className={styles.chips}>\n\t\t\t\t{filters.map((filter) => (\n\t\t\t\t\t<span key={filter.id} className={styles.chip}>\n\t\t\t\t\t\t{filter.label}\n\t\t\t\t\t\t<button type=\"button\" onClick={filter.onRemove} className={styles.removeButton}>\n\t\t\t\t\t\t\t<svg width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\td=\"M6 18L18 6M6 6l12 12\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</span>\n\t\t\t\t))}\n\t\t\t</div>\n\n\t\t\t{onClearAll && filters.length > 1 && (\n\t\t\t\t<button type=\"button\" onClick={onClearAll} className={styles.clearAll}>\n\t\t\t\t\tAlle löschen\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { type InputHTMLAttributes, useState } from \"react\";\nimport styles from \"./Input.module.css\";\n\nexport interface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n\tlabel?: string;\n\terror?: string;\n}\n\nexport function Input({ label, error, id, name, type = \"text\", className, ...props }: InputProps) {\n\tconst [showPassword, setShowPassword] = useState(false);\n\tconst inputId = id || name;\n\tconst isPassword = type === \"password\";\n\tconst resolvedType = isPassword && showPassword ? \"text\" : type;\n\n\treturn (\n\t\t<div className={styles.wrapper}>\n\t\t\t{label && (\n\t\t\t\t<label htmlFor={inputId} className={styles.label}>\n\t\t\t\t\t{label}\n\t\t\t\t</label>\n\t\t\t)}\n\t\t\t<div className={styles.container}>\n\t\t\t\t<input\n\t\t\t\t\tid={inputId}\n\t\t\t\t\tname={name}\n\t\t\t\t\ttype={resolvedType}\n\t\t\t\t\tclassName={[\n\t\t\t\t\t\tstyles.input,\n\t\t\t\t\t\tisPassword && styles.hasToggle,\n\t\t\t\t\t\terror && styles.error,\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t]\n\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t.join(\" \")}\n\t\t\t\t\taria-invalid={error ? \"true\" : undefined}\n\t\t\t\t\taria-describedby={error ? `${inputId}-error` : undefined}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t\t{isPassword && (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => setShowPassword((prev) => !prev)}\n\t\t\t\t\t\tclassName={styles.toggle}\n\t\t\t\t\t\taria-label={showPassword ? \"Passwort verbergen\" : \"Passwort anzeigen\"}\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t>\n\t\t\t\t\t\t{showPassword ? (\n\t\t\t\t\t\t\t<svg width=\"20\" height=\"20\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\td=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<svg width=\"20\" height=\"20\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\td=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\td=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{error && (\n\t\t\t\t<p id={`${inputId}-error`} className={styles.errorText}>\n\t\t\t\t\t{error}\n\t\t\t\t</p>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",".wrapper {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--spacing-2);\n}\n\n.label {\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-sm);\n\tfont-weight: var(--font-weight-medium);\n\tcolor: var(--semantic-color-text-default);\n}\n\n.container {\n\tposition: relative;\n}\n\n.input {\n\tdisplay: block;\n\twidth: 100%;\n\tborder: 1px solid var(--semantic-color-border-default);\n\tborder-radius: var(--radius-md);\n\tbackground-color: var(--semantic-color-bg-default);\n\tpadding: var(--spacing-3) var(--spacing-4);\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-base);\n\tcolor: var(--semantic-color-text-default);\n\tbox-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n\ttransition:\n\t\tborder-color 150ms ease,\n\t\tbox-shadow 150ms ease;\n}\n\n.input::placeholder {\n\tcolor: var(--semantic-color-text-muted);\n}\n\n.input:focus {\n\toutline: none;\n\tborder-color: var(--semantic-color-border-strong);\n}\n\n.input:disabled {\n\topacity: 0.5;\n\tcursor: not-allowed;\n\tbackground-color: var(--semantic-color-bg-subtle);\n}\n\n.input.hasToggle {\n\tpadding-right: var(--spacing-10);\n}\n\n.input.error {\n\tborder-color: var(--color-red-500);\n}\n\n.toggle {\n\tposition: absolute;\n\ttop: 50%;\n\tright: var(--spacing-3);\n\ttransform: translateY(-50%);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: 0;\n\tborder: none;\n\tbackground: none;\n\tcolor: var(--semantic-color-text-muted);\n\tcursor: pointer;\n\ttransition: color 150ms ease;\n}\n\n.toggle:hover {\n\tcolor: var(--semantic-color-text-default);\n}\n\n.errorText {\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-xs);\n\tcolor: var(--color-red-600);\n\tmargin: 0;\n}\n","import type { SVGProps } from \"react\";\n\nexport interface LogoProps extends SVGProps<SVGSVGElement> {\n\tsize?: number | string;\n}\n\nexport function Logo({ size = 48, ...props }: LogoProps) {\n\treturn (\n\t\t<svg\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tviewBox=\"0 0 1000 1000\"\n\t\t\tfill=\"none\"\n\t\t\taria-label=\"Ganztagshelden Logo\"\n\t\t\t{...props}\n\t\t>\n\t\t\t<g transform=\"matrix(1.62384,0,0,1.62384,-670.097018,-377.993255)\">\n\t\t\t\t{/* Cape: Steel 800 */}\n\t\t\t\t<path\n\t\t\t\t\td=\"M659.306,666.563C647.321,692.452 643.608,697.805 636.105,707.186C597.15,755.887 537.182,756.845 535.652,756.159C520.635,749.432 541.639,734.294 543.087,720.432C546.681,686.029 515.354,694.397 490.973,657.204C474.084,631.441 470.729,569.063 491.533,580.44C566.83,621.619 610.108,565.941 697.497,581.514C795.809,599.034 828.378,545.138 873.613,499.611C886.943,486.194 921.218,489.412 905.57,533.525C884.114,594.015 824.679,638.112 824.916,640.467C825.254,643.83 825.708,647.181 826.036,650.545C841.184,805.69 775.341,869.784 748.516,842.485C733.986,827.697 766.215,763.869 753.18,746.69C742.331,732.393 727.791,767.884 690.115,801.076C617.879,864.714 605.932,819.074 607.847,805.541C609.887,791.128 663.09,752.991 674.077,688.423C677.562,667.944 669.794,667.148 667.332,663.505C665.729,661.133 659.929,665.972 659.306,666.563Z\"\n\t\t\t\t\tfill=\"var(--color-steel-800, #1E293B)\"\n\t\t\t\t/>\n\t\t\t\t{/* Body: Steel 500 */}\n\t\t\t\t<path\n\t\t\t\t\td=\"M675.584,684.76C676.835,613.868 598.89,738.438 567.488,699.03C544.801,670.559 676.869,576.383 715.532,582.995C744.492,587.948 775.313,577.886 789.684,572.171C791.809,570.862 793.873,569.676 795.866,568.627C814.646,558.742 857.526,515.802 873.613,499.611C886.943,486.194 921.218,489.412 905.57,533.525C884.114,594.015 824.679,638.112 824.916,640.467C825.254,643.83 825.708,647.181 826.036,650.545C841.184,805.69 775.341,869.784 748.516,842.485C733.986,827.697 766.215,763.869 753.18,746.69C742.331,732.393 727.791,767.884 690.115,801.076C617.879,864.714 605.932,819.074 607.847,805.541C609.887,791.128 663.09,752.991 674.077,688.423C674.245,687.434 674.757,686.206 675.584,684.76Z\"\n\t\t\t\t\tfill=\"var(--color-steel-500, #64748B)\"\n\t\t\t\t/>\n\t\t\t\t{/* Roof: Steel 600 */}\n\t\t\t\t<path\n\t\t\t\t\td=\"M460.76,425.665C465.048,418.094 676.602,255.297 689.716,245.799C722.985,221.705 734.948,230.838 791.173,274.938C956.769,404.821 957.228,404.054 971.138,415.929C994.202,435.618 980.079,457.145 973.404,463.396C950.46,484.884 936.954,468.134 867.775,414.13C729.691,306.338 729.459,303.94 718.557,304.907C707.569,305.88 567.819,420.024 512.203,461.094C468.741,493.188 448.741,446.89 460.76,425.665Z\"\n\t\t\t\t\tfill=\"var(--color-steel-600, #475569)\"\n\t\t\t\t/>\n\t\t\t\t{/* Head: Steel 400 */}\n\t\t\t\t<path\n\t\t\t\t\td=\"M706.539,565.374C599.871,517.702 661.839,386.507 747.483,403.592C856.658,425.371 827.324,597.116 706.539,565.374Z\"\n\t\t\t\t\tfill=\"var(--color-steel-400, #94A3B8)\"\n\t\t\t\t/>\n\t\t\t</g>\n\t\t</svg>\n\t);\n}\n","import { type ReactNode, useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport styles from \"./Modal.module.css\";\n\nexport interface ModalProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\ttitle?: string;\n\tchildren: ReactNode;\n\tfooter?: ReactNode;\n}\n\nexport function Modal({ isOpen, onClose, title, children, footer }: ModalProps) {\n\tconst [isAnimating, setIsAnimating] = useState(false);\n\tconst [isExiting, setIsExiting] = useState(false);\n\tconst onCloseRef = useRef(onClose);\n\tonCloseRef.current = onClose;\n\n\tconst handleClose = useCallback(() => {\n\t\tsetIsExiting(true);\n\t\tsetIsAnimating(false);\n\t\tsetTimeout(() => {\n\t\t\tonCloseRef.current();\n\t\t}, 250);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!isOpen) {\n\t\t\tsetIsAnimating(false);\n\t\t\tsetIsExiting(false);\n\t\t\treturn;\n\t\t}\n\n\t\tconst handleEscape = (e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") handleClose();\n\t\t};\n\n\t\tdocument.addEventListener(\"keydown\", handleEscape);\n\t\tdocument.body.style.overflow = \"hidden\";\n\n\t\tconst timer = setTimeout(() => setIsAnimating(true), 10);\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"keydown\", handleEscape);\n\t\t\tdocument.body.style.overflow = \"\";\n\t\t\tclearTimeout(timer);\n\t\t};\n\t}, [isOpen, handleClose]);\n\n\tif (!isOpen) return null;\n\n\tconst entering = isAnimating && !isExiting;\n\n\tconst modalContent = (\n\t\t<div className={styles.overlay}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={handleClose}\n\t\t\t\tclassName={[styles.backdrop, entering && styles.backdropVisible].filter(Boolean).join(\" \")}\n\t\t\t\taria-label=\"Hintergrund - Klicken zum Schließen\"\n\t\t\t/>\n\t\t\t<div\n\t\t\t\tclassName={[styles.dialog, entering ? styles.dialogEnter : styles.dialogExit].join(\" \")}\n\t\t\t\trole=\"dialog\"\n\t\t\t\taria-modal=\"true\"\n\t\t\t\taria-label={title || undefined}\n\t\t\t>\n\t\t\t\t{title ? (\n\t\t\t\t\t<div className={styles.header}>\n\t\t\t\t\t\t<h3 className={styles.title}>{title}</h3>\n\t\t\t\t\t\t<CloseButton onClick={handleClose} />\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<div className={styles.closeAbsolute}>\n\t\t\t\t\t\t<CloseButton onClick={handleClose} />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<div\n\t\t\t\t\tclassName={[styles.content, entering && styles.contentVisible].filter(Boolean).join(\" \")}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\n\t\t\t\t{footer && <div className={styles.footer}>{footer}</div>}\n\t\t\t</div>\n\t\t</div>\n\t);\n\n\tif (typeof document !== \"undefined\") {\n\t\treturn createPortal(modalContent, document.body);\n\t}\n\n\treturn modalContent;\n}\n\nexport interface ConfirmationModalProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tonConfirm: () => void;\n\ttitle: string;\n\tchildren: ReactNode;\n\tconfirmText?: string;\n\tcancelText?: string;\n\tisConfirmLoading?: boolean;\n\tisConfirmDisabled?: boolean;\n\tvariant?: \"danger\" | \"primary\";\n}\n\nexport function ConfirmationModal({\n\tisOpen,\n\tonClose,\n\tonConfirm,\n\ttitle,\n\tchildren,\n\tconfirmText = \"Bestätigen\",\n\tcancelText = \"Abbrechen\",\n\tisConfirmLoading = false,\n\tisConfirmDisabled = false,\n\tvariant = \"primary\",\n}: ConfirmationModalProps) {\n\tconst confirmClass = variant === \"danger\" ? styles.confirmDanger : styles.confirmPrimary;\n\n\tconst footer = (\n\t\t<>\n\t\t\t<button type=\"button\" onClick={onClose} className={styles.cancelButton}>\n\t\t\t\t{cancelText}\n\t\t\t</button>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={onConfirm}\n\t\t\t\tdisabled={isConfirmLoading || isConfirmDisabled}\n\t\t\t\tclassName={[styles.confirmButton, confirmClass].join(\" \")}\n\t\t\t>\n\t\t\t\t{isConfirmLoading ? (\n\t\t\t\t\t<span className={styles.confirmLoading}>\n\t\t\t\t\t\t<svg className={styles.confirmSpinner} fill=\"none\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t\t\t<circle opacity={0.25} cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\topacity={0.75}\n\t\t\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t\t\t\td=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\tWird geladen...\n\t\t\t\t\t</span>\n\t\t\t\t) : (\n\t\t\t\t\tconfirmText\n\t\t\t\t)}\n\t\t\t</button>\n\t\t</>\n\t);\n\n\treturn (\n\t\t<Modal isOpen={isOpen} onClose={onClose} title={title} footer={footer}>\n\t\t\t{children}\n\t\t</Modal>\n\t);\n}\n\nfunction CloseButton({ onClick }: { onClick: () => void }) {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={onClick}\n\t\t\tclassName={styles.closeButton}\n\t\t\taria-label=\"Modal schließen\"\n\t\t>\n\t\t\t<svg\n\t\t\t\tclassName={styles.closeIcon}\n\t\t\t\twidth=\"20\"\n\t\t\t\theight=\"20\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth={2}\n\t\t\t>\n\t\t\t\t<path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n\t\t\t</svg>\n\t\t</button>\n\t);\n}\n",".overlay {\n\tposition: fixed;\n\tinset: 0;\n\tz-index: 9999;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.backdrop {\n\tposition: absolute;\n\tinset: 0;\n\tborder: none;\n\tpadding: 0;\n\tcursor: default;\n\tbackground-color: rgb(0 0 0 / 0);\n\ttransition: background-color 150ms ease-out;\n}\n\n.backdropVisible {\n\tbackground-color: rgb(0 0 0 / 0.4);\n}\n\n.dialog {\n\tposition: relative;\n\twidth: calc(100% - 2rem);\n\tmax-width: 32rem;\n\tmax-height: calc(100vh - 4rem);\n\tmargin: 0 1rem;\n\toverflow: hidden;\n\tborder-radius: var(--radius-xl);\n\tborder: 1px solid var(--semantic-color-border-default);\n\tbackground: linear-gradient(135deg, rgb(255 255 255 / 0.95) 0%, rgb(248 250 252 / 0.98) 100%);\n\tbackdrop-filter: blur(20px);\n\tbox-shadow:\n\t\t0 25px 50px -12px rgb(0 0 0 / 0.25),\n\t\t0 8px 16px -8px rgb(0 0 0 / 0.1);\n}\n\n.dialogEnter {\n\tanimation: modalEnter 250ms ease-out both;\n}\n\n.dialogExit {\n\tanimation: modalExit 200ms ease-in both;\n}\n\n@keyframes modalEnter {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: scale(0.95) translateY(8px);\n\t}\n\n\tto {\n\t\topacity: 1;\n\t\ttransform: scale(1) translateY(0);\n\t}\n}\n\n@keyframes modalExit {\n\tfrom {\n\t\topacity: 1;\n\t\ttransform: scale(1) translateY(0);\n\t}\n\n\tto {\n\t\topacity: 0;\n\t\ttransform: scale(0.95) translateY(8px);\n\t}\n}\n\n/* ─── Header ─── */\n\n.header {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding: var(--spacing-4) var(--spacing-6);\n\tborder-bottom: 1px solid var(--color-steel-100);\n}\n\n.title {\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-lg);\n\tfont-weight: var(--font-weight-semibold);\n\tcolor: var(--semantic-color-text-default);\n\tmargin: 0;\n\tpadding-right: var(--spacing-4);\n}\n\n/* ─── Close Button ─── */\n\n.closeAbsolute {\n\tposition: absolute;\n\ttop: var(--spacing-4);\n\tright: var(--spacing-4);\n\tz-index: 10;\n}\n\n.closeButton {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-shrink: 0;\n\twidth: 36px;\n\theight: 36px;\n\tpadding: 0;\n\tborder: none;\n\tborder-radius: var(--radius-lg);\n\tbackground: none;\n\tcolor: var(--semantic-color-text-muted);\n\tcursor: pointer;\n\ttransition:\n\t\tbackground-color 150ms ease,\n\t\tcolor 150ms ease,\n\t\ttransform 150ms ease;\n}\n\n.closeButton:hover {\n\tbackground-color: var(--semantic-color-bg-muted);\n\tcolor: var(--semantic-color-text-default);\n\ttransform: scale(1.05);\n}\n\n.closeButton:active {\n\ttransform: scale(0.95);\n}\n\n.closeIcon {\n\ttransition: transform 150ms ease;\n}\n\n.closeButton:hover .closeIcon {\n\ttransform: rotate(90deg);\n}\n\n/* ─── Content ─── */\n\n.content {\n\tpadding: var(--spacing-4) var(--spacing-6);\n\toverflow-y: auto;\n\tmax-height: calc(100vh - 8rem);\n\tcolor: var(--semantic-color-text-default);\n\tfont-family: var(--font-family-sans);\n\tline-height: 1.6;\n\topacity: 0;\n}\n\n.contentVisible {\n\tanimation: contentReveal 300ms ease-out 50ms both;\n}\n\n@keyframes contentReveal {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(4px);\n\t}\n\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n\n/* ─── Footer ─── */\n\n.footer {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\tgap: var(--spacing-3);\n\tpadding: var(--spacing-4) var(--spacing-6);\n\tborder-top: 1px solid var(--color-steel-100);\n\tbackground-color: rgb(249 250 251 / 0.5);\n}\n\n/* ─── Confirmation Modal Buttons ─── */\n\n.cancelButton {\n\tflex: 1;\n\tpadding: var(--spacing-2) var(--spacing-4);\n\tborder: 1px solid var(--semantic-color-border-strong);\n\tborder-radius: var(--radius-md);\n\tbackground: none;\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-sm);\n\tfont-weight: var(--font-weight-medium);\n\tcolor: var(--color-steel-700);\n\twhite-space: nowrap;\n\tcursor: pointer;\n\ttransition:\n\t\tbackground-color 150ms ease,\n\t\tborder-color 150ms ease,\n\t\ttransform 150ms ease,\n\t\tbox-shadow 150ms ease;\n}\n\n.cancelButton:hover {\n\tbackground-color: var(--semantic-color-bg-subtle);\n\tborder-color: var(--color-steel-400);\n\ttransform: scale(1.05);\n\tbox-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1);\n}\n\n.cancelButton:active {\n\ttransform: scale(1);\n}\n\n.confirmButton {\n\tflex: 1;\n\tpadding: var(--spacing-2) var(--spacing-4);\n\tborder: none;\n\tborder-radius: var(--radius-md);\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-sm);\n\tfont-weight: var(--font-weight-medium);\n\tcolor: var(--semantic-color-text-inverse);\n\twhite-space: nowrap;\n\tcursor: pointer;\n\ttransition:\n\t\ttransform 150ms ease,\n\t\tbox-shadow 150ms ease;\n}\n\n.confirmButton:hover:not(:disabled) {\n\ttransform: scale(1.05);\n\tbox-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1);\n}\n\n.confirmButton:active:not(:disabled) {\n\ttransform: scale(1);\n}\n\n.confirmButton:disabled {\n\topacity: 0.5;\n\tcursor: not-allowed;\n}\n\n.confirmButton:disabled:hover {\n\ttransform: none;\n}\n\n.confirmPrimary {\n\tbackground-color: var(--color-steel-900);\n}\n\n.confirmDanger {\n\tbackground-color: var(--color-red-600);\n}\n\n.confirmLoading {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tgap: var(--spacing-2);\n}\n\n.confirmSpinner {\n\twidth: 16px;\n\theight: 16px;\n\tanimation: spin 0.7s linear infinite;\n}\n\n@keyframes spin {\n\tto {\n\t\ttransform: rotate(360deg);\n\t}\n}\n",".pill {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tborder-radius: 9999px;\n\tfont-family: var(--font-family-sans);\n\tfont-weight: var(--font-weight-bold);\n\twhite-space: nowrap;\n}\n\n/* ─── Sizes ─── */\n\n.sm {\n\tpadding: 2px 8px;\n\tfont-size: 11px;\n}\n\n.md {\n\tpadding: 6px 12px;\n\tfont-size: var(--font-size-xs);\n}\n\n.lg {\n\tpadding: 8px 16px;\n\tfont-size: var(--font-size-sm);\n}\n\n/* ─── Dot ─── */\n\n.dot {\n\tborder-radius: 9999px;\n\tbackground-color: currentColor;\n\topacity: 0.8;\n}\n\n.dot-sm {\n\twidth: 4px;\n\theight: 4px;\n\tmargin-right: 6px;\n}\n\n.dot-md {\n\twidth: 6px;\n\theight: 6px;\n\tmargin-right: 8px;\n}\n\n.dot-lg {\n\twidth: 8px;\n\theight: 8px;\n\tmargin-right: 10px;\n}\n\n/* ─── Solid Variants ─── */\n\n.solid-red {\n\tbackground-color: var(--color-red-450);\n\tcolor: var(--semantic-color-text-inverse);\n}\n\n.solid-green {\n\tbackground-color: var(--semantic-color-brand-primary);\n\tcolor: var(--semantic-color-text-inverse);\n}\n\n.solid-blue {\n\tbackground-color: var(--color-steel-600);\n\tcolor: var(--semantic-color-text-inverse);\n}\n\n.solid-orange {\n\tbackground-color: var(--color-warm-400);\n\tcolor: var(--semantic-color-text-inverse);\n}\n\n.solid-purple {\n\tbackground-color: var(--color-steel-500);\n\tcolor: var(--semantic-color-text-inverse);\n}\n\n.solid-gray {\n\tbackground-color: var(--color-steel-400);\n\tcolor: var(--semantic-color-text-inverse);\n}\n\n/* ─── Subtle Variants ─── */\n\n.subtle-red {\n\tbackground-color: var(--semantic-color-feedback-error-light);\n\tcolor: var(--color-red-600);\n}\n\n.subtle-green {\n\tbackground-color: var(--semantic-color-brand-primary-light);\n\tcolor: var(--color-sage-700);\n}\n\n.subtle-blue {\n\tbackground-color: var(--semantic-color-bg-muted);\n\tcolor: var(--color-steel-700);\n}\n\n.subtle-orange {\n\tbackground-color: var(--semantic-color-brand-secondary-light);\n\tcolor: var(--color-warm-700);\n}\n\n.subtle-purple {\n\tbackground-color: var(--semantic-color-bg-muted);\n\tcolor: var(--color-steel-600);\n}\n\n.subtle-gray {\n\tbackground-color: var(--semantic-color-bg-muted);\n\tcolor: var(--semantic-color-text-secondary);\n}\n","import type { HTMLAttributes } from \"react\";\nimport styles from \"./Pill.module.css\";\n\nexport type PillColor = \"red\" | \"green\" | \"blue\" | \"orange\" | \"purple\" | \"gray\";\n\nexport interface PillProps extends HTMLAttributes<HTMLSpanElement> {\n\tlabel: string;\n\tcolor?: PillColor;\n\tvariant?: \"solid\" | \"subtle\";\n\tsize?: \"sm\" | \"md\" | \"lg\";\n\tdot?: boolean;\n}\n\nexport function Pill({\n\tlabel,\n\tcolor = \"gray\",\n\tvariant = \"solid\",\n\tsize = \"md\",\n\tdot = true,\n\tclassName,\n\t...props\n}: PillProps) {\n\treturn (\n\t\t<span\n\t\t\tclassName={[styles.pill, styles[`${variant}-${color}`], styles[size], className]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\" \")}\n\t\t\t{...props}\n\t\t>\n\t\t\t{dot && <span className={[styles.dot, styles[`dot-${size}`]].join(\" \")} />}\n\t\t\t{label}\n\t\t</span>\n\t);\n}\n",".wrapper {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\tpadding: 6px 8px;\n\tborder-radius: var(--radius-md);\n\tcursor: pointer;\n\ttransition: background-color 150ms ease;\n}\n\n.wrapper:hover {\n\tbackground-color: var(--semantic-color-bg-subtle);\n}\n\n.input {\n\twidth: 16px;\n\theight: 16px;\n\tborder-radius: 9999px;\n\tborder: 1px solid var(--semantic-color-border-strong);\n\taccent-color: var(--color-steel-900);\n\tcursor: pointer;\n}\n\n.input:disabled {\n\topacity: 0.5;\n\tcursor: not-allowed;\n}\n\n.label {\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-sm);\n\tcolor: var(--semantic-color-text-default);\n\tuser-select: none;\n}\n","import type { InputHTMLAttributes } from \"react\";\nimport styles from \"./Radio.module.css\";\n\nexport interface RadioProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n\tlabel: string;\n}\n\nexport function Radio({ label, id, name, className, ...props }: RadioProps) {\n\tconst inputId = id || `${name}-${label.toLowerCase().replace(/\\s+/g, \"-\")}`;\n\n\treturn (\n\t\t<label htmlFor={inputId} className={[styles.wrapper, className].filter(Boolean).join(\" \")}>\n\t\t\t<input type=\"radio\" id={inputId} name={name} className={styles.input} {...props} />\n\t\t\t<span className={styles.label}>{label}</span>\n\t\t</label>\n\t);\n}\n",".wrapper {\n\tposition: relative;\n}\n\n.searchIcon {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 12px;\n\ttransform: translateY(-50%);\n\tcolor: var(--semantic-color-text-muted);\n}\n\n.icon-sm {\n\twidth: 16px;\n\theight: 16px;\n}\n\n.icon-md {\n\twidth: 16px;\n\theight: 16px;\n}\n\n.icon-lg {\n\twidth: 20px;\n\theight: 20px;\n}\n\n.input {\n\twidth: 100%;\n\tborder: 1px solid var(--semantic-color-border-default);\n\tborder-radius: 16px;\n\tbackground-color: var(--semantic-color-bg-default);\n\tcolor: var(--semantic-color-text-default);\n\tfont-family: var(--font-family-sans);\n\ttransition: border-color 150ms ease;\n}\n\n.input::placeholder {\n\tcolor: var(--semantic-color-text-muted);\n}\n\n.input:focus {\n\toutline: none;\n\tborder-color: var(--semantic-color-border-strong);\n}\n\n.sm {\n\tpadding: 8px 12px 8px 36px;\n\tfont-size: var(--font-size-sm);\n}\n\n.md {\n\tpadding: 10px 40px 10px 36px;\n\tfont-size: var(--font-size-sm);\n}\n\n.lg {\n\tpadding: 12px 40px 12px 40px;\n\tfont-size: var(--font-size-base);\n}\n\n.clearButton {\n\tposition: absolute;\n\ttop: 50%;\n\tright: 8px;\n\ttransform: translateY(-50%);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: 4px;\n\tborder: none;\n\tborder-radius: 9999px;\n\tbackground: none;\n\tcursor: pointer;\n\ttransition: background-color 150ms ease;\n}\n\n.clearButton:hover {\n\tbackground-color: var(--semantic-color-bg-muted);\n}\n\n.clearIcon {\n\tcolor: var(--semantic-color-text-muted);\n}\n","import type { InputHTMLAttributes } from \"react\";\nimport styles from \"./SearchBar.module.css\";\n\nexport interface SearchBarProps\n\textends Omit<InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"size\"> {\n\tvalue: string;\n\tonChange: (value: string) => void;\n\tonClear?: () => void;\n\tsize?: \"sm\" | \"md\" | \"lg\";\n}\n\nexport function SearchBar({\n\tvalue,\n\tonChange,\n\tonClear,\n\tplaceholder = \"Name suchen...\",\n\tsize = \"md\",\n\tclassName,\n\t...props\n}: SearchBarProps) {\n\treturn (\n\t\t<div className={[styles.wrapper, className].filter(Boolean).join(\" \")}>\n\t\t\t<svg\n\t\t\t\tclassName={[styles.searchIcon, styles[`icon-${size}`]].join(\" \")}\n\t\t\t\tfill=\"none\"\n\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t>\n\t\t\t\t<path\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\td=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n\t\t\t\t/>\n\t\t\t</svg>\n\n\t\t\t<input\n\t\t\t\ttype=\"text\"\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tvalue={value}\n\t\t\t\tonChange={(e) => onChange(e.target.value)}\n\t\t\t\tclassName={[styles.input, styles[size]].join(\" \")}\n\t\t\t\t{...props}\n\t\t\t/>\n\n\t\t\t{value && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tonChange(\"\");\n\t\t\t\t\t\tonClear?.();\n\t\t\t\t\t}}\n\t\t\t\t\tclassName={styles.clearButton}\n\t\t\t\t>\n\t\t\t\t\t<svg\n\t\t\t\t\t\tclassName={[styles.clearIcon, styles[`icon-${size}`]].join(\" \")}\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\td=\"M6 18L18 6M6 6l12 12\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",".wrapper {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--spacing-1);\n}\n\n.label {\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-sm);\n\tfont-weight: var(--font-weight-medium);\n\tcolor: var(--semantic-color-text-default);\n}\n\n.container {\n\tposition: relative;\n}\n\n.select {\n\twidth: 100%;\n\tappearance: none;\n\tborder: 1px solid var(--semantic-color-border-default);\n\tborder-radius: var(--radius-md);\n\tbackground-color: var(--semantic-color-bg-default);\n\tpadding: var(--spacing-2) var(--spacing-10) var(--spacing-2) var(--spacing-3);\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-base);\n\tcolor: var(--semantic-color-text-default);\n\tcursor: pointer;\n\ttransition:\n\t\tborder-color 150ms ease,\n\t\tbox-shadow 150ms ease;\n}\n\n.select:focus {\n\toutline: none;\n\tborder-color: var(--semantic-color-border-strong);\n}\n\n.select:disabled {\n\topacity: 0.5;\n\tcursor: not-allowed;\n}\n\n.chevron {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tdisplay: flex;\n\talign-items: center;\n\tpadding-right: var(--spacing-3);\n\tcolor: var(--semantic-color-text-muted);\n\tpointer-events: none;\n}\n","import type { SelectHTMLAttributes } from \"react\";\nimport styles from \"./Select.module.css\";\n\nexport interface SelectOption {\n\tvalue: string;\n\tlabel: string;\n\tdisabled?: boolean;\n}\n\nexport interface SelectProps extends SelectHTMLAttributes<HTMLSelectElement> {\n\tlabel?: string;\n\tplaceholder?: string;\n\toptions: SelectOption[];\n}\n\nexport function Select({ label, placeholder, options, id, className, ...props }: SelectProps) {\n\tconst selectId = id || (label ? label.toLowerCase().replace(/\\s+/g, \"-\") : undefined);\n\n\treturn (\n\t\t<div className={styles.wrapper}>\n\t\t\t{label && (\n\t\t\t\t<label htmlFor={selectId} className={styles.label}>\n\t\t\t\t\t{label}\n\t\t\t\t</label>\n\t\t\t)}\n\t\t\t<div className={styles.container}>\n\t\t\t\t<select\n\t\t\t\t\tid={selectId}\n\t\t\t\t\tclassName={[styles.select, className].filter(Boolean).join(\" \")}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t{placeholder && (\n\t\t\t\t\t\t<option value=\"\" disabled={props.required}>\n\t\t\t\t\t\t\t{placeholder}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t)}\n\t\t\t\t\t{options.map((option) => (\n\t\t\t\t\t\t<option key={option.value} value={option.value} disabled={option.disabled}>\n\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t))}\n\t\t\t\t</select>\n\t\t\t\t<div className={styles.chevron} aria-hidden=\"true\">\n\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n\t\t\t\t\t\t<path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n",".skeleton {\n\tbackground: linear-gradient(\n\t\t90deg,\n\t\tvar(--semantic-color-bg-muted) 25%,\n\t\tvar(--semantic-color-bg-subtle) 50%,\n\t\tvar(--semantic-color-bg-muted) 75%\n\t);\n\tbackground-size: 200% 100%;\n\tanimation: wave 1.5s ease-in-out infinite;\n}\n\n.group {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n@keyframes wave {\n\t0% {\n\t\tbackground-position: 200% 0;\n\t}\n\n\t100% {\n\t\tbackground-position: -200% 0;\n\t}\n}\n","import type { CSSProperties, HTMLAttributes } from \"react\";\nimport styles from \"./Skeleton.module.css\";\n\nexport interface SkeletonProps extends HTMLAttributes<HTMLDivElement> {\n\twidth?: number | string;\n\theight?: number | string;\n\tcircle?: boolean;\n\tborderRadius?: number | string;\n\tcount?: number;\n\tgap?: number;\n}\n\nexport function Skeleton({\n\twidth,\n\theight = 16,\n\tcircle = false,\n\tborderRadius,\n\tcount = 1,\n\tgap = 8,\n\tclassName,\n\tstyle,\n\t...props\n}: SkeletonProps) {\n\tconst resolvedRadius = circle\n\t\t? \"9999px\"\n\t\t: borderRadius != null\n\t\t\t? typeof borderRadius === \"number\"\n\t\t\t\t? `${borderRadius}px`\n\t\t\t\t: borderRadius\n\t\t\t: \"var(--radius-md)\";\n\n\tconst itemStyle: CSSProperties = {\n\t\twidth: circle ? height : width,\n\t\theight,\n\t\tborderRadius: resolvedRadius,\n\t\t...style,\n\t};\n\n\tif (count === 1) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={[styles.skeleton, className].filter(Boolean).join(\" \")}\n\t\t\t\tstyle={itemStyle}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={styles.group} style={{ gap }} aria-hidden=\"true\" {...props}>\n\t\t\t{Array.from({ length: count }, (_, i) => (\n\t\t\t\t<div\n\t\t\t\t\tkey={`skeleton-${i}`}\n\t\t\t\t\tclassName={[styles.skeleton, className].filter(Boolean).join(\" \")}\n\t\t\t\t\tstyle={itemStyle}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n",".wrapper {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tgap: var(--spacing-3);\n}\n\n.svg {\n\tanimation: spin 0.8s cubic-bezier(0.4, 0, 0.2, 1) infinite;\n}\n\n.label {\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-sm);\n\tcolor: var(--semantic-color-text-muted);\n\tmargin: 0;\n}\n\n.srOnly {\n\tposition: absolute;\n\twidth: 1px;\n\theight: 1px;\n\tpadding: 0;\n\tmargin: -1px;\n\toverflow: hidden;\n\tclip: rect(0, 0, 0, 0);\n\twhite-space: nowrap;\n\tborder: 0;\n}\n\n@keyframes spin {\n\tto {\n\t\ttransform: rotate(360deg);\n\t}\n}\n","import type { HTMLAttributes } from \"react\";\nimport styles from \"./Spinner.module.css\";\n\nexport interface SpinnerProps extends HTMLAttributes<HTMLDivElement> {\n\tsize?: \"sm\" | \"md\" | \"lg\";\n\tlabel?: string;\n}\n\nconst sizes = { sm: 20, md: 32, lg: 48 };\nconst strokes = { sm: 2.5, md: 3, lg: 3.5 };\n\nexport function Spinner({ size = \"md\", label, className, ...props }: SpinnerProps) {\n\tconst s = sizes[size];\n\tconst stroke = strokes[size];\n\tconst r = (s - stroke) / 2;\n\tconst circumference = 2 * Math.PI * r;\n\n\treturn (\n\t\t<div className={[styles.wrapper, className].filter(Boolean).join(\" \")} role=\"status\" {...props}>\n\t\t\t<svg width={s} height={s} viewBox={`0 0 ${s} ${s}`} className={styles.svg}>\n\t\t\t\t{/* Track */}\n\t\t\t\t<circle\n\t\t\t\t\tcx={s / 2}\n\t\t\t\t\tcy={s / 2}\n\t\t\t\t\tr={r}\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"var(--semantic-color-border-default)\"\n\t\t\t\t\tstrokeWidth={stroke}\n\t\t\t\t/>\n\t\t\t\t{/* Arc */}\n\t\t\t\t<circle\n\t\t\t\t\tcx={s / 2}\n\t\t\t\t\tcy={s / 2}\n\t\t\t\t\tr={r}\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"var(--semantic-color-brand-primary)\"\n\t\t\t\t\tstrokeWidth={stroke}\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tstrokeDasharray={`${circumference * 0.3} ${circumference * 0.7}`}\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t\t{label && <p className={styles.label}>{label}</p>}\n\t\t\t<span className={styles.srOnly}>Laden...</span>\n\t\t</div>\n\t);\n}\n",".dot {\n\tflex-shrink: 0;\n\tborder-radius: 9999px;\n}\n\n.sm {\n\twidth: 10px;\n\theight: 10px;\n}\n\n.md {\n\twidth: 12px;\n\theight: 12px;\n}\n\n.green {\n\tbackground-color: var(--semantic-color-brand-primary);\n}\n\n.yellow {\n\tbackground-color: var(--color-warm-400);\n}\n\n.red {\n\tbackground-color: var(--color-red-500);\n}\n\n.gray {\n\tbackground-color: var(--color-steel-400);\n}\n\n.pulse {\n\tanimation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n\n@keyframes pulse {\n\t0%,\n\t100% {\n\t\topacity: 1;\n\t}\n\n\t50% {\n\t\topacity: 0.5;\n\t}\n}\n","import type { HTMLAttributes } from \"react\";\nimport styles from \"./StatusDot.module.css\";\n\nexport type StatusDotColor = \"green\" | \"yellow\" | \"red\" | \"gray\";\n\nexport interface StatusDotProps extends HTMLAttributes<HTMLDivElement> {\n\tcolor: StatusDotColor;\n\ttooltip?: string;\n\tsize?: \"sm\" | \"md\";\n\tpulse?: boolean;\n}\n\nexport function StatusDot({\n\tcolor,\n\ttooltip,\n\tsize = \"sm\",\n\tpulse,\n\tclassName,\n\t...props\n}: StatusDotProps) {\n\tconst shouldPulse = pulse ?? color === \"green\";\n\n\treturn (\n\t\t<div\n\t\t\tclassName={[styles.dot, styles[color], styles[size], shouldPulse && styles.pulse, className]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\" \")}\n\t\t\ttitle={tooltip}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport styles from \"./Tabs.module.css\";\n\nexport interface TabItem {\n\tid: string;\n\tlabel: string;\n\tcount?: number;\n}\n\nexport interface TabsProps {\n\titems: TabItem[];\n\tactiveTab: string;\n\tonTabChange: (tabId: string) => void;\n\tclassName?: string;\n}\n\nexport function Tabs({ items, activeTab, onTabChange, className }: TabsProps) {\n\tconst tabRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\tconst scrollRef = useRef<HTMLDivElement>(null);\n\tconst [indicatorStyle, setIndicatorStyle] = useState({ width: 0, left: 0 });\n\tconst [canScrollLeft, setCanScrollLeft] = useState(false);\n\tconst [canScrollRight, setCanScrollRight] = useState(false);\n\n\tconst showMobileDropdown = items.length >= 2;\n\n\tconst activeIndex = useMemo(\n\t\t() => items.findIndex((item) => item.id === activeTab),\n\t\t[items, activeTab],\n\t);\n\n\tconst activeLabel = items[activeIndex]?.label ?? \"\";\n\n\tconst updateScrollState = useCallback(() => {\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\t\tsetCanScrollLeft(el.scrollLeft > 0);\n\t\tsetCanScrollRight(el.scrollLeft + el.clientWidth < el.scrollWidth - 1);\n\t}, []);\n\n\tconst updateIndicator = useCallback(() => {\n\t\tconst activeTabElement = tabRefs.current[activeIndex];\n\t\tif (activeTabElement && activeTabElement.offsetWidth > 0) {\n\t\t\tsetIndicatorStyle({\n\t\t\t\tleft: activeTabElement.offsetLeft,\n\t\t\t\twidth: activeTabElement.offsetWidth,\n\t\t\t});\n\t\t}\n\t}, [activeIndex]);\n\n\tuseEffect(() => {\n\t\tupdateIndicator();\n\t\tconst activeTabElement = tabRefs.current[activeIndex];\n\t\tif (activeTabElement && scrollRef.current) {\n\t\t\tconst container = scrollRef.current;\n\t\t\tconst tabLeft = activeTabElement.offsetLeft;\n\t\t\tconst tabRight = tabLeft + activeTabElement.offsetWidth;\n\t\t\tconst containerLeft = container.scrollLeft;\n\t\t\tconst containerRight = containerLeft + container.clientWidth;\n\n\t\t\tif (tabLeft < containerLeft) {\n\t\t\t\tcontainer.scrollTo({ left: tabLeft - 16, behavior: \"smooth\" });\n\t\t\t} else if (tabRight > containerRight) {\n\t\t\t\tcontainer.scrollTo({\n\t\t\t\t\tleft: tabRight - container.clientWidth + 16,\n\t\t\t\t\tbehavior: \"smooth\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}, [activeIndex, updateIndicator]);\n\n\tuseEffect(() => {\n\t\tupdateScrollState();\n\t\tupdateIndicator();\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\t\tel.addEventListener(\"scroll\", updateScrollState, { passive: true });\n\t\tconst observer = new ResizeObserver(() => {\n\t\t\tupdateScrollState();\n\t\t\tupdateIndicator();\n\t\t});\n\t\tobserver.observe(el);\n\t\treturn () => {\n\t\t\tel.removeEventListener(\"scroll\", updateScrollState);\n\t\t\tobserver.disconnect();\n\t\t};\n\t}, [updateScrollState, updateIndicator]);\n\n\treturn (\n\t\t<div className={[styles.wrapper, className].filter(Boolean).join(\" \")}>\n\t\t\t{showMobileDropdown && (\n\t\t\t\t<MobileTabDropdown\n\t\t\t\t\titems={items}\n\t\t\t\t\tactiveTab={activeTab}\n\t\t\t\t\tactiveLabel={activeLabel}\n\t\t\t\t\tonTabChange={onTabChange}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t<div\n\t\t\t\tclassName={[styles.tabsContainer, showMobileDropdown && styles.hiddenMobile]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.join(\" \")}\n\t\t\t>\n\t\t\t\t{canScrollLeft && <div className={styles.fadeLeft} />}\n\n\t\t\t\t<div ref={scrollRef} className={styles.scrollable}>\n\t\t\t\t\t{items.map((tab, index) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={tab.id}\n\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\ttabRefs.current[index] = el;\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => onTabChange(tab.id)}\n\t\t\t\t\t\t\tclassName={[\n\t\t\t\t\t\t\t\tstyles.tab,\n\t\t\t\t\t\t\t\tactiveTab === tab.id ? styles.tabActive : styles.tabInactive,\n\t\t\t\t\t\t\t].join(\" \")}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className={styles.tabLabel}>{tab.label}</span>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={styles.indicator}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tleft: `${indicatorStyle.left}px`,\n\t\t\t\t\t\t\twidth: `${indicatorStyle.width}px`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t{canScrollRight && <div className={styles.fadeRight} />}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nfunction MobileTabDropdown({\n\titems,\n\tactiveTab,\n\tactiveLabel,\n\tonTabChange,\n}: {\n\titems: TabItem[];\n\tactiveTab: string;\n\tactiveLabel: string;\n\tonTabChange: (id: string) => void;\n}) {\n\tconst [isOpen, setIsOpen] = useState(false);\n\tconst dropdownRef = useRef<HTMLDivElement>(null);\n\n\tuseEffect(() => {\n\t\tfunction handleClickOutside(event: MouseEvent) {\n\t\t\tif (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n\t\t\t\tsetIsOpen(false);\n\t\t\t}\n\t\t}\n\t\tdocument.addEventListener(\"mousedown\", handleClickOutside);\n\t\treturn () => document.removeEventListener(\"mousedown\", handleClickOutside);\n\t}, []);\n\n\treturn (\n\t\t<div className={styles.mobileDropdown} ref={dropdownRef}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => setIsOpen(!isOpen)}\n\t\t\t\tclassName={[styles.mobileToggle, isOpen && styles.mobileToggleOpen]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.join(\" \")}\n\t\t\t>\n\t\t\t\t<span>{activeLabel}</span>\n\t\t\t\t<svg\n\t\t\t\t\tclassName={[styles.mobileChevron, isOpen && styles.mobileChevronOpen]\n\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t.join(\" \")}\n\t\t\t\t\twidth=\"20\"\n\t\t\t\t\theight=\"20\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t>\n\t\t\t\t\t<path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n\t\t\t\t</svg>\n\t\t\t</button>\n\n\t\t\t{isOpen && (\n\t\t\t\t<div className={styles.mobileMenu}>\n\t\t\t\t\t{items.map((item) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tonTabChange(item.id);\n\t\t\t\t\t\t\t\tsetIsOpen(false);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName={[\n\t\t\t\t\t\t\t\tstyles.mobileMenuItem,\n\t\t\t\t\t\t\t\titem.id === activeTab && styles.mobileMenuItemActive,\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t.join(\" \")}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",".wrapper {\n\tposition: relative;\n}\n\n.tabsContainer {\n\tposition: relative;\n}\n\n.hiddenMobile {\n\tdisplay: none;\n}\n\n@media (min-width: 768px) {\n\t.hiddenMobile {\n\t\tdisplay: block;\n\t}\n}\n\n.scrollable {\n\tposition: relative;\n\tdisplay: flex;\n\tgap: 32px;\n\toverflow-x: auto;\n\tscrollbar-width: none;\n}\n\n.scrollable::-webkit-scrollbar {\n\tdisplay: none;\n}\n\n.tab {\n\tposition: relative;\n\tpadding: 0 0 12px;\n\tborder: none;\n\tbackground: none;\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-sm);\n\tfont-weight: var(--font-weight-medium);\n\tcursor: pointer;\n\ttransition: color 150ms ease;\n\twhite-space: nowrap;\n}\n\n.tabActive {\n\tcolor: var(--semantic-color-text-default);\n\tfont-weight: var(--font-weight-semibold);\n}\n\n.tabInactive {\n\tcolor: var(--semantic-color-text-muted);\n}\n\n.tabInactive:hover {\n\tcolor: var(--color-steel-700);\n}\n\n.tabLabel {\n\twhite-space: nowrap;\n}\n\n.indicator {\n\tposition: absolute;\n\tbottom: 0;\n\theight: 2px;\n\tborder-radius: 9999px;\n\tbackground-color: var(--color-steel-900);\n\ttransition:\n\t\tleft 300ms ease-out,\n\t\twidth 300ms ease-out;\n}\n\n.fadeLeft {\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 10;\n\twidth: 24px;\n\tbackground: linear-gradient(to right, white, transparent);\n\tpointer-events: none;\n}\n\n.fadeRight {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tz-index: 10;\n\twidth: 24px;\n\tbackground: linear-gradient(to left, white, transparent);\n\tpointer-events: none;\n}\n\n/* ─── Mobile Dropdown ─── */\n\n.mobileDropdown {\n\tposition: relative;\n}\n\n@media (min-width: 768px) {\n\t.mobileDropdown {\n\t\tdisplay: none;\n\t}\n}\n\n.mobileToggle {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 10px 16px;\n\tborder: none;\n\tborder-radius: var(--radius-lg);\n\tbackground-color: var(--semantic-color-bg-default);\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-base);\n\tfont-weight: var(--font-weight-semibold);\n\tcolor: var(--semantic-color-text-default);\n\tbox-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n\tcursor: pointer;\n\ttransition: background-color 150ms ease;\n}\n\n.mobileToggleOpen {\n\tbackground-color: var(--semantic-color-bg-subtle);\n}\n\n.mobileChevron {\n\tflex-shrink: 0;\n\tcolor: var(--semantic-color-text-muted);\n\ttransition: transform 150ms ease;\n}\n\n.mobileChevronOpen {\n\ttransform: rotate(180deg);\n}\n\n.mobileMenu {\n\tposition: absolute;\n\ttop: 100%;\n\tleft: 0;\n\tz-index: 50;\n\tmargin-top: 4px;\n\tmin-width: 192px;\n\tborder: 1px solid var(--semantic-color-border-default);\n\tborder-radius: var(--radius-lg);\n\tbackground-color: var(--semantic-color-bg-default);\n\tpadding: 4px 0;\n\tbox-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1);\n}\n\n.mobileMenuItem {\n\tdisplay: block;\n\twidth: 100%;\n\tpadding: 10px 16px;\n\tborder: none;\n\tbackground: none;\n\ttext-align: left;\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-base);\n\tcolor: var(--semantic-color-text-secondary);\n\tcursor: pointer;\n\ttransition: background-color 150ms ease;\n}\n\n.mobileMenuItem:hover {\n\tbackground-color: var(--semantic-color-bg-subtle);\n}\n\n.mobileMenuItemActive {\n\tbackground-color: var(--semantic-color-bg-subtle);\n\tfont-weight: var(--font-weight-semibold);\n\tcolor: var(--semantic-color-text-default);\n}\n",".wrapper {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--spacing-2);\n}\n\n.label {\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-sm);\n\tfont-weight: var(--font-weight-medium);\n\tcolor: var(--semantic-color-text-default);\n}\n\n.textarea {\n\tdisplay: block;\n\twidth: 100%;\n\tresize: vertical;\n\tborder: 1px solid var(--semantic-color-border-default);\n\tborder-radius: var(--radius-md);\n\tbackground-color: var(--semantic-color-bg-default);\n\tpadding: var(--spacing-2) var(--spacing-3);\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-sm);\n\tcolor: var(--semantic-color-text-default);\n\ttransition: border-color 150ms ease;\n}\n\n.textarea::placeholder {\n\tcolor: var(--semantic-color-text-muted);\n}\n\n.textarea:focus {\n\toutline: none;\n\tborder-color: var(--semantic-color-border-strong);\n}\n\n.textarea:disabled {\n\topacity: 0.5;\n\tcursor: not-allowed;\n\tbackground-color: var(--semantic-color-bg-subtle);\n}\n\n.textarea.error {\n\tborder-color: var(--color-red-500);\n}\n\n.errorText {\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-xs);\n\tcolor: var(--color-red-600);\n\tmargin: 0;\n}\n","import type { TextareaHTMLAttributes } from \"react\";\nimport styles from \"./Textarea.module.css\";\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n\tlabel?: string;\n\terror?: string;\n}\n\nexport function Textarea({ label, error, id, name, rows = 4, className, ...props }: TextareaProps) {\n\tconst textareaId = id || name;\n\n\treturn (\n\t\t<div className={styles.wrapper}>\n\t\t\t{label && (\n\t\t\t\t<label htmlFor={textareaId} className={styles.label}>\n\t\t\t\t\t{label}\n\t\t\t\t</label>\n\t\t\t)}\n\t\t\t<textarea\n\t\t\t\tid={textareaId}\n\t\t\t\tname={name}\n\t\t\t\trows={rows}\n\t\t\t\tclassName={[styles.textarea, error && styles.error, className].filter(Boolean).join(\" \")}\n\t\t\t\taria-invalid={error ? \"true\" : undefined}\n\t\t\t\taria-describedby={error ? `${textareaId}-error` : undefined}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t\t{error && (\n\t\t\t\t<p id={`${textareaId}-error`} className={styles.errorText}>\n\t\t\t\t\t{error}\n\t\t\t\t</p>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { type ReactNode, useCallback, useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport styles from \"./Toast.module.css\";\n\nexport type ToastType = \"success\" | \"error\" | \"warning\" | \"info\";\n\nexport interface ToastProps {\n\ttype?: ToastType;\n\tmessage: string;\n\tduration?: number;\n\tonClose: () => void;\n}\n\nconst icons: Record<ToastType, ReactNode> = {\n\tsuccess: (\n\t\t<svg\n\t\t\twidth=\"18\"\n\t\t\theight=\"18\"\n\t\t\tfill=\"none\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth={2}\n\t\t>\n\t\t\t<path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n\t\t</svg>\n\t),\n\terror: (\n\t\t<svg\n\t\t\twidth=\"18\"\n\t\t\theight=\"18\"\n\t\t\tfill=\"none\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth={2}\n\t\t>\n\t\t\t<path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n\t\t</svg>\n\t),\n\twarning: (\n\t\t<svg\n\t\t\twidth=\"18\"\n\t\t\theight=\"18\"\n\t\t\tfill=\"none\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth={2}\n\t\t>\n\t\t\t<path\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\td=\"M12 9v2m0 4h.01M10.29 3.86l-8.58 14.57A1 1 0 002.57 20h18.86a1 1 0 00.86-1.57L13.71 3.86a1 1 0 00-1.72 0z\"\n\t\t\t/>\n\t\t</svg>\n\t),\n\tinfo: (\n\t\t<svg\n\t\t\twidth=\"18\"\n\t\t\theight=\"18\"\n\t\t\tfill=\"none\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth={2}\n\t\t>\n\t\t\t<path\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\td=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n\t\t\t/>\n\t\t</svg>\n\t),\n};\n\nexport function Toast({ type = \"info\", message, duration = 4000, onClose }: ToastProps) {\n\tconst [isVisible, setIsVisible] = useState(false);\n\tconst [isExiting, setIsExiting] = useState(false);\n\n\tconst dismiss = useCallback(() => {\n\t\tsetIsExiting(true);\n\t\tsetTimeout(onClose, 200);\n\t}, [onClose]);\n\n\tuseEffect(() => {\n\t\tconst enterTimer = setTimeout(() => setIsVisible(true), 10);\n\t\tconst exitTimer = duration > 0 ? setTimeout(dismiss, duration) : undefined;\n\t\treturn () => {\n\t\t\tclearTimeout(enterTimer);\n\t\t\tif (exitTimer) clearTimeout(exitTimer);\n\t\t};\n\t}, [duration, dismiss]);\n\n\tconst content = (\n\t\t<div className={styles.container}>\n\t\t\t<div\n\t\t\t\tclassName={[\n\t\t\t\t\tstyles.toast,\n\t\t\t\t\tstyles[type],\n\t\t\t\t\tisVisible && !isExiting ? styles.enter : styles.exit,\n\t\t\t\t]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.join(\" \")}\n\t\t\t>\n\t\t\t\t<span className={styles.icon}>{icons[type]}</span>\n\t\t\t\t<span className={styles.message}>{message}</span>\n\t\t\t\t<button type=\"button\" onClick={dismiss} className={styles.close} aria-label=\"Schließen\">\n\t\t\t\t\t<svg\n\t\t\t\t\t\twidth=\"14\"\n\t\t\t\t\t\theight=\"14\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t>\n\t\t\t\t\t\t<path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t);\n\n\tif (typeof document !== \"undefined\") {\n\t\treturn createPortal(content, document.body);\n\t}\n\treturn content;\n}\n",".container {\n\tposition: fixed;\n\ttop: 24px;\n\tright: 24px;\n\tz-index: 99999;\n\tpointer-events: none;\n}\n\n.toast {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\tpadding: 12px 16px;\n\tborder-radius: var(--radius-lg);\n\tbackground-color: var(--semantic-color-bg-default);\n\tborder: 1px solid var(--semantic-color-border-default);\n\tbox-shadow: 0 10px 25px -5px rgb(0 0 0 / 0.15);\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-sm);\n\tcolor: var(--semantic-color-text-default);\n\tpointer-events: auto;\n\tmax-width: 400px;\n}\n\n.enter {\n\tanimation: slideIn 200ms ease-out both;\n}\n\n.exit {\n\tanimation: slideOut 200ms ease-in both;\n}\n\n@keyframes slideIn {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateX(100%);\n\t}\n\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateX(0);\n\t}\n}\n\n@keyframes slideOut {\n\tfrom {\n\t\topacity: 1;\n\t\ttransform: translateX(0);\n\t}\n\n\tto {\n\t\topacity: 0;\n\t\ttransform: translateX(100%);\n\t}\n}\n\n.icon {\n\tdisplay: flex;\n\tflex-shrink: 0;\n}\n\n.message {\n\tflex: 1;\n\tline-height: 1.4;\n}\n\n.close {\n\tdisplay: flex;\n\tflex-shrink: 0;\n\tpadding: 2px;\n\tborder: none;\n\tborder-radius: var(--radius-sm);\n\tbackground: none;\n\tcolor: var(--semantic-color-text-muted);\n\tcursor: pointer;\n\ttransition: color 150ms ease;\n}\n\n.close:hover {\n\tcolor: var(--semantic-color-text-default);\n}\n\n/* ─── Types ─── */\n\n.success {\n\tborder-left: 3px solid var(--semantic-color-brand-primary);\n}\n\n.success .icon {\n\tcolor: var(--semantic-color-brand-primary);\n}\n\n.error {\n\tborder-left: 3px solid var(--color-red-500);\n}\n\n.error .icon {\n\tcolor: var(--color-red-500);\n}\n\n.warning {\n\tborder-left: 3px solid var(--color-warm-400);\n}\n\n.warning .icon {\n\tcolor: var(--color-warm-400);\n}\n\n.info {\n\tborder-left: 3px solid var(--color-steel-400);\n}\n\n.info .icon {\n\tcolor: var(--color-steel-400);\n}\n",".wrapper {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 10px;\n\tcursor: pointer;\n}\n\n.input {\n\tposition: absolute;\n\twidth: 1px;\n\theight: 1px;\n\toverflow: hidden;\n\tclip: rect(0, 0, 0, 0);\n}\n\n.track {\n\tposition: relative;\n\tborder-radius: 9999px;\n\tbackground-color: var(--color-steel-300);\n\ttransition: background-color 150ms ease;\n}\n\n.sm {\n\twidth: 36px;\n\theight: 20px;\n}\n\n.md {\n\twidth: 44px;\n\theight: 24px;\n}\n\n.thumb {\n\tposition: absolute;\n\ttop: 2px;\n\tleft: 2px;\n\tborder-radius: 9999px;\n\tbackground-color: var(--semantic-color-bg-default);\n\tbox-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1);\n\ttransition:\n\t\ttransform 150ms ease,\n\t\twidth 150ms ease;\n}\n\n.sm .thumb {\n\twidth: 16px;\n\theight: 16px;\n}\n\n.md .thumb {\n\twidth: 20px;\n\theight: 20px;\n}\n\n.input:checked + .track {\n\tbackground-color: var(--semantic-color-brand-primary);\n}\n\n.input:checked + .sm .thumb {\n\ttransform: translateX(16px);\n}\n\n.input:checked + .md .thumb {\n\ttransform: translateX(20px);\n}\n\n.input:disabled + .track {\n\topacity: 0.5;\n\tcursor: not-allowed;\n}\n\n.label {\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-sm);\n\tcolor: var(--semantic-color-text-default);\n\tuser-select: none;\n}\n","import type { InputHTMLAttributes } from \"react\";\nimport styles from \"./Toggle.module.css\";\n\nexport interface ToggleProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\"> {\n\tlabel?: string;\n\tsize?: \"sm\" | \"md\";\n}\n\nexport function Toggle({ label, size = \"md\", id, name, className, ...props }: ToggleProps) {\n\tconst inputId = id || name || (label ? label.toLowerCase().replace(/\\s+/g, \"-\") : undefined);\n\n\treturn (\n\t\t<label htmlFor={inputId} className={[styles.wrapper, className].filter(Boolean).join(\" \")}>\n\t\t\t<input type=\"checkbox\" id={inputId} name={name} className={styles.input} {...props} />\n\t\t\t<div className={[styles.track, styles[size]].join(\" \")}>\n\t\t\t\t<div className={styles.thumb} />\n\t\t\t</div>\n\t\t\t{label && <span className={styles.label}>{label}</span>}\n\t\t</label>\n\t);\n}\n"],"mappings":"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","names":["jsx","jsxs","jsx","jsx","jsxs","jsx","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","useCallback","useEffect","useRef","useState","createPortal","Fragment","jsx","jsxs","useState","useRef","useCallback","useEffect","createPortal","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsx","jsxs","jsx","useCallback","useEffect","useRef","useState","jsx","jsxs","useRef","useState","useCallback","useEffect","jsx","jsxs","useCallback","useEffect","useState","createPortal","jsx","jsxs","icons","useState","useCallback","useEffect","createPortal","jsx","jsxs"]}
@@ -0,0 +1,99 @@
1
+ /*
2
+ * Ganztagshelden Design System — Tailwind v4 Theme
3
+ *
4
+ * Usage in consumer repos:
5
+ * @import "tailwindcss";
6
+ * @import "@moto-nrw/design-system/tailwind";
7
+ */
8
+
9
+ @theme {
10
+ /* ─── Steel (Logo, Text, Borders, Backgrounds) ─── */
11
+ --color-steel-50: #f8fafc;
12
+ --color-steel-100: #f1f5f9;
13
+ --color-steel-200: #e2e8f0;
14
+ --color-steel-300: #cbd5e1;
15
+ --color-steel-400: #94a3b8;
16
+ --color-steel-500: #64748b;
17
+ --color-steel-600: #475569;
18
+ --color-steel-700: #334155;
19
+ --color-steel-800: #1e293b;
20
+ --color-steel-900: #0f172a;
21
+
22
+ /* ─── Sage / Primary Accent (Buttons, CTAs, Links, Success) ─── */
23
+ --color-sage-100: #d4e4c8;
24
+ --color-sage-300: #a3c48a;
25
+ --color-sage-500: #7ba05b;
26
+ --color-sage-700: #577b42;
27
+ --color-sage-900: #3b4f2a;
28
+
29
+ /* ─── Warm / Secondary Accent (Warnings, Highlights, Badges) ─── */
30
+ --color-warm-50: #fef3c7;
31
+ --color-warm-100: #fde68a;
32
+ --color-warm-200: #fcd34d;
33
+ --color-warm-300: #fbbf24;
34
+ --color-warm-400: #f59e0b;
35
+ --color-warm-500: #d97706;
36
+ --color-warm-600: #b45309;
37
+ --color-warm-700: #92400e;
38
+ --color-warm-800: #78350f;
39
+ --color-warm-900: #451a03;
40
+
41
+ /* ─── Red / Terracotta (Error, Destructive) ─── */
42
+ --color-red-50: #fdf0ee;
43
+ --color-red-100: #fad5cd;
44
+ --color-red-400: #d4654e;
45
+ --color-red-450: #dc4440;
46
+ --color-red-500: #c45040;
47
+ --color-red-600: #a33d30;
48
+
49
+ /* ─── Semantic Colors ─── */
50
+ --color-brand-primary: #7ba05b;
51
+ --color-brand-primary-hover: #577b42;
52
+ --color-brand-primary-light: #d4e4c8;
53
+ --color-brand-secondary: #f59e0b;
54
+ --color-brand-secondary-hover: #d97706;
55
+ --color-brand-secondary-light: #fef3c7;
56
+
57
+ /* ─── Spacing ─── */
58
+ --spacing-0: 0px;
59
+ --spacing-1: 4px;
60
+ --spacing-2: 8px;
61
+ --spacing-3: 12px;
62
+ --spacing-4: 16px;
63
+ --spacing-5: 20px;
64
+ --spacing-6: 24px;
65
+ --spacing-8: 32px;
66
+ --spacing-10: 40px;
67
+ --spacing-12: 48px;
68
+ --spacing-16: 64px;
69
+
70
+ /* ─── Border Radius ─── */
71
+ --radius-none: 0px;
72
+ --radius-sm: 4px;
73
+ --radius-md: 8px;
74
+ --radius-lg: 12px;
75
+ --radius-xl: 16px;
76
+ --radius-full: 9999px;
77
+
78
+ /* ─── Typography ─── */
79
+ --font-family-sans: "Inter", system-ui, -apple-system, sans-serif;
80
+ --font-family-mono: "JetBrains Mono", "Fira Code", monospace;
81
+
82
+ --font-size-xs: 0.75rem;
83
+ --font-size-sm: 0.875rem;
84
+ --font-size-base: 1rem;
85
+ --font-size-lg: 1.125rem;
86
+ --font-size-xl: 1.25rem;
87
+ --font-size-2xl: 1.5rem;
88
+ --font-size-3xl: 1.875rem;
89
+ --font-size-4xl: 2.25rem;
90
+
91
+ --font-weight-regular: 400;
92
+ --font-weight-medium: 500;
93
+ --font-weight-semibold: 600;
94
+ --font-weight-bold: 700;
95
+
96
+ --line-height-tight: 1.25;
97
+ --line-height-normal: 1.5;
98
+ --line-height-relaxed: 1.75;
99
+ }
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Do not edit directly, this file was auto-generated.
3
+ */
4
+
5
+ :root {
6
+ --color-white: #ffffff;
7
+ --color-black: #000000;
8
+ --color-steel-50: #f8fafc;
9
+ --color-steel-100: #f1f5f9;
10
+ --color-steel-200: #e2e8f0;
11
+ --color-steel-300: #cbd5e1;
12
+ --color-steel-400: #94a3b8;
13
+ --color-steel-500: #64748b;
14
+ --color-steel-600: #475569;
15
+ --color-steel-700: #334155;
16
+ --color-steel-800: #1e293b;
17
+ --color-steel-900: #0f172a;
18
+ --color-sage-100: #d4e4c8;
19
+ --color-sage-300: #a3c48a;
20
+ --color-sage-500: #7ba05b;
21
+ --color-sage-700: #577b42;
22
+ --color-sage-900: #3b4f2a;
23
+ --color-warm-50: #fef3c7;
24
+ --color-warm-100: #fde68a;
25
+ --color-warm-200: #fcd34d;
26
+ --color-warm-300: #fbbf24;
27
+ --color-warm-400: #f59e0b;
28
+ --color-warm-500: #d97706;
29
+ --color-warm-600: #b45309;
30
+ --color-warm-700: #92400e;
31
+ --color-warm-800: #78350f;
32
+ --color-warm-900: #451a03;
33
+ --color-red-50: #fdf0ee;
34
+ --color-red-100: #fad5cd;
35
+ --color-red-400: #d4654e;
36
+ --color-red-450: #dc4440;
37
+ --color-red-500: #c45040;
38
+ --color-red-600: #a33d30;
39
+ --radius-none: 0;
40
+ --radius-sm: 4px;
41
+ --radius-md: 8px;
42
+ --radius-lg: 12px;
43
+ --radius-xl: 16px;
44
+ --radius-full: 9999px;
45
+ --spacing-0: 0;
46
+ --spacing-1: 4px;
47
+ --spacing-2: 8px;
48
+ --spacing-3: 12px;
49
+ --spacing-4: 16px;
50
+ --spacing-5: 20px;
51
+ --spacing-6: 24px;
52
+ --spacing-8: 32px;
53
+ --spacing-10: 40px;
54
+ --spacing-12: 48px;
55
+ --spacing-16: 64px;
56
+ --font-family-sans: Inter, system-ui, -apple-system, sans-serif;
57
+ --font-family-mono: 'JetBrains Mono', 'Fira Code', monospace;
58
+ --font-size-xs: 12px;
59
+ --font-size-sm: 14px;
60
+ --font-size-base: 16px;
61
+ --font-size-lg: 18px;
62
+ --font-size-xl: 20px;
63
+ --font-size-2xl: 24px;
64
+ --font-size-3xl: 30px;
65
+ --font-size-4xl: 36px;
66
+ --font-weight-regular: 400;
67
+ --font-weight-medium: 500;
68
+ --font-weight-semibold: 600;
69
+ --font-weight-bold: 700;
70
+ --font-line-height-tight: 1.25rem;
71
+ --font-line-height-normal: 1.5rem;
72
+ --font-line-height-relaxed: 1.75rem;
73
+ --semantic-color-brand-primary: var(--color-sage-500);
74
+ --semantic-color-brand-primary-hover: var(--color-sage-700);
75
+ --semantic-color-brand-primary-light: var(--color-sage-100);
76
+ --semantic-color-brand-secondary: var(--color-warm-400);
77
+ --semantic-color-brand-secondary-hover: var(--color-warm-500);
78
+ --semantic-color-brand-secondary-light: var(--color-warm-50);
79
+ --semantic-color-bg-default: var(--color-white);
80
+ --semantic-color-bg-subtle: var(--color-steel-50);
81
+ --semantic-color-bg-muted: var(--color-steel-100);
82
+ --semantic-color-text-default: var(--color-steel-900);
83
+ --semantic-color-text-secondary: var(--color-steel-600);
84
+ --semantic-color-text-muted: var(--color-steel-500);
85
+ --semantic-color-text-inverse: var(--color-white);
86
+ --semantic-color-border-default: var(--color-steel-200);
87
+ --semantic-color-border-strong: var(--color-steel-300);
88
+ --semantic-color-feedback-success: var(--color-sage-500);
89
+ --semantic-color-feedback-warning: var(--color-warm-400);
90
+ --semantic-color-feedback-error: var(--color-red-500);
91
+ --semantic-color-feedback-error-light: var(--color-red-50);
92
+ }
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "@moto-nrw/design-system",
3
+ "version": "0.2.1",
4
+ "description": "Ganztagshelden Design System - shared components and design tokens",
5
+ "main": "dist/index.cjs",
6
+ "module": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": {
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.js"
13
+ },
14
+ "require": {
15
+ "types": "./dist/index.d.cts",
16
+ "default": "./dist/index.cjs"
17
+ }
18
+ },
19
+ "./tokens": "./dist/tokens.css",
20
+ "./tailwind": "./dist/tailwind.css"
21
+ },
22
+ "files": [
23
+ "dist"
24
+ ],
25
+ "sideEffects": [
26
+ "**/*.css"
27
+ ],
28
+ "peerDependencies": {
29
+ "lucide-react": ">=0.400.0",
30
+ "react": ">=18",
31
+ "react-dom": ">=18"
32
+ },
33
+ "devDependencies": {
34
+ "@arethetypeswrong/cli": "^0.18.2",
35
+ "@biomejs/biome": "^2.4.9",
36
+ "@changesets/changelog-github": "^0.6.0",
37
+ "@changesets/cli": "^2.30.0",
38
+ "@storybook/addon-a11y": "^10.3.3",
39
+ "@storybook/react": "^10.3.3",
40
+ "@storybook/react-vite": "^10.3.3",
41
+ "@testing-library/jest-dom": "^6.9.1",
42
+ "@testing-library/react": "^16.3.2",
43
+ "@testing-library/user-event": "^14.6.1",
44
+ "@types/react": "^19.2.14",
45
+ "@types/react-dom": "^19.2.3",
46
+ "jsdom": "^29.0.1",
47
+ "knip": "^6.0.6",
48
+ "lefthook": "^2.1.4",
49
+ "publint": "^0.3.18",
50
+ "react": "^19.2.4",
51
+ "react-dom": "^19.2.4",
52
+ "storybook": "^10.3.3",
53
+ "style-dictionary": "^5.4.0",
54
+ "tsup": "^8.5.1",
55
+ "typescript": "^6.0.2",
56
+ "vitest": "^4.1.2"
57
+ },
58
+ "publishConfig": {
59
+ "access": "public"
60
+ },
61
+ "type": "module",
62
+ "license": "MIT",
63
+ "private": false,
64
+ "scripts": {
65
+ "tokens": "NODE_OPTIONS='--experimental-strip-types' style-dictionary build --config src/tokens/style-dictionary.config.ts",
66
+ "build": "pnpm tokens && tsup && cp src/tokens/build/variables.css dist/tokens.css && cp src/tailwind-theme.css dist/tailwind.css",
67
+ "postbuild": "attw --pack --exclude-entrypoints ./tokens ./tailwind && publint",
68
+ "dev": "tsup --watch",
69
+ "test": "vitest",
70
+ "test:run": "vitest run",
71
+ "storybook": "storybook dev -p 6006",
72
+ "build-storybook": "storybook build",
73
+ "lint": "biome check .",
74
+ "lint:fix": "biome check --write .",
75
+ "format": "biome format --write .",
76
+ "knip": "knip",
77
+ "changeset": "changeset",
78
+ "release": "changeset publish",
79
+ "version": "changeset version"
80
+ }
81
+ }