@attabot/complaint-app 1.0.0

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,"file":"complaint-app.umd.js","sources":["../src/utils/api.js","../src/context/ApiContext.jsx","../src/theme/defaultTheme.js","../src/theme/resolveTheme.js","../src/context/ThemeContext.jsx","../src/components/atoms/Button.jsx","../src/components/atoms/PlusIcon.jsx","../src/components/atoms/Typography.jsx","../src/components/organisms/PageHeader.jsx","../src/components/atoms/StatusBadge.jsx","../src/components/molecules/CardHeader.jsx","../src/components/atoms/ChevronRightIcon.jsx","../src/components/molecules/CardFooter.jsx","../src/components/molecules/DataPoint.jsx","../src/components/atoms/Divider.jsx","../src/components/organisms/SystemCard.jsx","../src/components/organisms/SystemCardGrid.jsx","../src/components/atoms/Input.jsx","../src/components/atoms/SearchIcon.jsx","../src/components/molecules/SearchBar.jsx","../src/components/atoms/Loading.jsx","../src/data/demoSystems.js","../src/pages/ComplaintManagementPage.jsx","../src/components/organisms/Stepper.jsx","../src/context/SettingsWizardContext.jsx","../src/data/settingsSteps.js","../src/components/atoms/LayersIcon.jsx","../src/components/molecules/SettingsCardHeader.jsx","../src/components/organisms/SettingsCard.jsx","../src/components/atoms/FieldLabel.jsx","../src/components/atoms/ChevronDownIcon.jsx","../src/components/atoms/Select.jsx","../src/components/atoms/Textarea.jsx","../src/components/molecules/FormField.jsx","../src/components/atoms/Toggle.jsx","../src/components/molecules/ToggleField.jsx","../src/components/atoms/CloseIcon.jsx","../src/components/atoms/Tag.jsx","../src/components/molecules/RoleMultiSelect.jsx","../src/components/organisms/settings-steps/CategoryTypeStep.jsx","../src/components/organisms/settings-steps/DepartmentsStep.jsx","../src/components/atoms/Chip.jsx","../src/components/atoms/Radio.jsx","../src/components/atoms/DragHandleIcon.jsx","../src/components/organisms/settings-steps/PrioritiesStep.jsx","../src/components/organisms/settings-steps/WorkflowStep.jsx","../src/components/atoms/TrashIcon.jsx","../src/components/organisms/settings-steps/FormFieldsStep.jsx","../src/components/organisms/settings-steps/ReviewPublishStep.jsx","../src/pages/ComplaintSettingsPage.jsx","../src/ComplaintApp.jsx","../src/theme/tokens.js"],"sourcesContent":["import axios from 'axios';\nimport Cookies from 'js-cookie';\n\nlet BASE_URL_VALUE = '';\n\ntry {\n if (typeof import.meta !== 'undefined' && import.meta.env?.VITE_API_URL) {\n BASE_URL_VALUE = import.meta.env.VITE_API_URL;\n } else {\n // eslint-disable-next-line no-undef\n const nodeProcess = typeof process !== 'undefined' ? process : null;\n if (nodeProcess?.env?.VITE_API_URL) {\n BASE_URL_VALUE = nodeProcess.env.VITE_API_URL;\n }\n }\n} catch {\n // Ignore env resolution errors in non-Vite hosts\n}\n\n/** Runtime override for API host; updates the shared axios instance baseURL. */\nexport const setBaseUrl = (url) => {\n BASE_URL_VALUE = url || '';\n instance.defaults.baseURL = BASE_URL_VALUE;\n};\n\nexport const setAuthToken = (token) => {\n if (token) {\n Cookies.set('token', token, { secure: true, sameSite: 'Strict' });\n } else {\n Cookies.remove('token');\n }\n};\n\nconst getAccessToken = () => Cookies.get('token') || null;\n\nconst instance = axios.create({\n baseURL: BASE_URL_VALUE,\n transformRequest: [\n function (data, headers) {\n const accessToken = getAccessToken();\n if (accessToken) {\n headers.Authorization = `Bearer ${accessToken}`;\n } else {\n delete headers.Authorization;\n }\n if (data === undefined || data === null) return data;\n if (typeof data === 'string') return data;\n return JSON.stringify(data);\n },\n ],\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n});\n\nlet isRefreshing = false;\nlet refreshTokenPromise = null;\n\ninstance.interceptors.response.use(\n (response) => response,\n async (error) => {\n const originalRequest = error.config;\n const response = error.response;\n\n if (response && (response.status === 401 || response.status === 402)) {\n const refreshToken = Cookies.get('refreshToken');\n\n if (refreshToken) {\n try {\n if (!isRefreshing) {\n isRefreshing = true;\n refreshTokenPromise = axios.post(\n `${BASE_URL_VALUE}/api/v1/auth/refresh`,\n {},\n {\n headers: {\n Authorization: `Bearer ${refreshToken}`,\n },\n },\n );\n }\n\n const refreshResponse = await refreshTokenPromise;\n const { token: newToken, refreshToken: newRefreshToken } =\n refreshResponse.data;\n\n Cookies.set('token', newToken, { secure: true, sameSite: 'Strict' });\n if (newRefreshToken) {\n Cookies.set('refreshToken', newRefreshToken);\n }\n\n originalRequest.headers.Authorization = `Bearer ${newToken}`;\n return instance(originalRequest);\n } catch {\n Cookies.remove('token');\n Cookies.remove('refreshToken');\n } finally {\n isRefreshing = false;\n refreshTokenPromise = null;\n }\n }\n }\n\n return Promise.reject(error);\n },\n);\n\n/** Shared axios client used by package pages/hooks. Parent sets base URL + token via ApiProvider. */\nexport default instance;\n","import React, { createContext, useEffect } from 'react';\nimport { setBaseUrl, setAuthToken } from '../utils/api';\n\nconst ApiContext = createContext(null);\n\n/**\n * Provides runtime API base URL + auth token from the parent app.\n * All package requests go through `utils/api` (axios) so the parent owns auth.\n */\nexport const ApiProvider = ({ children, apiUrl, authToken }) => {\n useEffect(() => {\n if (apiUrl) {\n setBaseUrl(apiUrl);\n }\n }, [apiUrl]);\n\n useEffect(() => {\n setAuthToken(authToken || null);\n }, [authToken]);\n\n return (\n <ApiContext.Provider value={{ apiUrl, authToken }}>\n {children}\n </ApiContext.Provider>\n );\n};\n\nexport default ApiContext;\n","/**\n * Default light theme tokens.\n * Parent apps can import, extend, or replace via the `theme` prop.\n */\nexport const lightTheme = {\n mode: 'light',\n colors: {\n primary: '#2D64B8',\n primaryHover: '#2557A3',\n text: '#111827',\n textSecondary: '#6B7280',\n textMuted: '#9CA3AF',\n border: '#E5E7EB',\n borderLight: '#F3F4F6',\n background: '#F5F5F5',\n surface: '#FFFFFF',\n white: '#FFFFFF',\n onPrimary: '#FFFFFF',\n activeBg: '#ECFDF5',\n activeBorder: '#A7F3D0',\n activeText: '#059669',\n inactiveBg: '#F3F4F6',\n inactiveBorder: '#D1D5DB',\n inactiveText: '#6B7280',\n link: '#2D64B8',\n divider: '#E5E7EB',\n accentBorder: '#C5D7F0',\n accentBg: '#EEF4FB',\n stepDone: '#D6E4F7',\n success: '#22C55E',\n danger: '#EF4444',\n secondaryBtn: '#D1D5DB',\n secondaryBtnHover: '#C4C9D1',\n inputBg: '#FFFFFF',\n tableHeadBg: '#EEF4FB',\n sidebarBg: '#FAFBFD',\n overlay: 'rgba(16, 24, 40, 0.06)',\n },\n radii: {\n sm: '6px',\n md: '8px',\n lg: '12px',\n xl: '16px',\n pill: '999px',\n },\n spacing: {\n xs: '4px',\n sm: '8px',\n md: '12px',\n lg: '16px',\n xl: '24px',\n xxl: '32px',\n },\n typography: {\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n h1Size: '28px',\n h2Size: '16px',\n bodySize: '14px',\n labelSize: '13px',\n valueSize: '22px',\n smallSize: '13px',\n },\n shadow: {\n card: '0 1px 2px rgba(16, 24, 40, 0.04)',\n settings: '0 1px 3px rgba(16, 24, 40, 0.06)',\n },\n};\n\n/**\n * Default dark theme tokens.\n */\nexport const darkTheme = {\n mode: 'dark',\n colors: {\n primary: '#5B8DEF',\n primaryHover: '#7BA3F3',\n text: '#F3F4F6',\n textSecondary: '#A1A1AA',\n textMuted: '#71717A',\n border: '#3F3F46',\n borderLight: '#27272A',\n background: '#0F1115',\n surface: '#18181B',\n white: '#FFFFFF',\n onPrimary: '#FFFFFF',\n activeBg: '#052E1C',\n activeBorder: '#166534',\n activeText: '#4ADE80',\n inactiveBg: '#27272A',\n inactiveBorder: '#3F3F46',\n inactiveText: '#A1A1AA',\n link: '#7BA3F3',\n divider: '#3F3F46',\n accentBorder: '#2A3A55',\n accentBg: '#1A2333',\n stepDone: '#1E3A5F',\n success: '#22C55E',\n danger: '#F87171',\n secondaryBtn: '#3F3F46',\n secondaryBtnHover: '#52525B',\n inputBg: '#18181B',\n tableHeadBg: '#1A2333',\n sidebarBg: '#12141A',\n overlay: 'rgba(0, 0, 0, 0.35)',\n },\n radii: {\n sm: '6px',\n md: '8px',\n lg: '12px',\n xl: '16px',\n pill: '999px',\n },\n spacing: {\n xs: '4px',\n sm: '8px',\n md: '12px',\n lg: '16px',\n xl: '24px',\n xxl: '32px',\n },\n typography: {\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n h1Size: '28px',\n h2Size: '16px',\n bodySize: '14px',\n labelSize: '13px',\n valueSize: '22px',\n smallSize: '13px',\n },\n shadow: {\n card: '0 1px 2px rgba(0, 0, 0, 0.35)',\n settings: '0 1px 3px rgba(0, 0, 0, 0.4)',\n },\n};\n\n/** Bundled theme file shape parents can mirror / extend. */\nexport const defaultThemeFile = {\n light: lightTheme,\n dark: darkTheme,\n};\n","import { lightTheme, darkTheme } from './defaultTheme';\n\nfunction isObject(value) {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/** Deep-merge plain objects (arrays / primitives replaced). */\nexport function deepMerge(base, override) {\n if (!isObject(override)) return base;\n const result = { ...base };\n Object.keys(override).forEach((key) => {\n const next = override[key];\n if (isObject(next) && isObject(base[key])) {\n result[key] = deepMerge(base[key], next);\n } else if (next !== undefined) {\n result[key] = next;\n }\n });\n return result;\n}\n\n/**\n * Normalize parent `theme` prop into { light, dark } packs.\n *\n * Supported shapes:\n * 1. Full theme file: `{ light: {...}, dark: {...} }`\n * 2. Flat tokens: `{ colors, radii, ... }` → applied to both modes (merged over defaults)\n * 3. Mode-specific partial: `{ light: { colors: { primary } } }`\n */\nexport function normalizeThemeFile(themeProp) {\n if (!themeProp || !isObject(themeProp)) {\n return { light: lightTheme, dark: darkTheme };\n }\n\n const hasModes = isObject(themeProp.light) || isObject(themeProp.dark);\n\n if (hasModes) {\n return {\n light: deepMerge(lightTheme, themeProp.light || {}),\n dark: deepMerge(darkTheme, themeProp.dark || {}),\n };\n }\n\n // Flat token object — treat as overrides for both modes\n return {\n light: deepMerge(lightTheme, themeProp),\n dark: deepMerge(darkTheme, themeProp),\n };\n}\n\n/**\n * Pick active theme for current mode and ensure mode flag is set.\n */\nexport function resolveActiveTheme(themeFile, darkMode = false) {\n const pack = normalizeThemeFile(themeFile);\n const active = darkMode ? pack.dark : pack.light;\n return {\n ...active,\n mode: darkMode ? 'dark' : 'light',\n __pack: pack,\n };\n}\n\n/** camelCase / nested keys → CSS custom property map for .ca-root */\nconst COLOR_VAR_MAP = {\n primary: '--ca-primary',\n primaryHover: '--ca-primary-hover',\n text: '--ca-text',\n textSecondary: '--ca-text-secondary',\n textMuted: '--ca-text-muted',\n border: '--ca-border',\n borderLight: '--ca-border-light',\n background: '--ca-bg',\n surface: '--ca-surface',\n white: '--ca-white',\n onPrimary: '--ca-on-primary',\n activeBg: '--ca-active-bg',\n activeBorder: '--ca-active-border',\n activeText: '--ca-active-text',\n inactiveBg: '--ca-inactive-bg',\n inactiveBorder: '--ca-inactive-border',\n inactiveText: '--ca-inactive-text',\n link: '--ca-link',\n divider: '--ca-divider',\n accentBorder: '--ca-accent-border',\n accentBg: '--ca-accent-bg',\n stepDone: '--ca-step-done',\n success: '--ca-success',\n danger: '--ca-danger',\n secondaryBtn: '--ca-secondary-btn',\n secondaryBtnHover: '--ca-secondary-btn-hover',\n inputBg: '--ca-input-bg',\n tableHeadBg: '--ca-table-head-bg',\n sidebarBg: '--ca-sidebar-bg',\n overlay: '--ca-overlay',\n};\n\nconst RADIUS_VAR_MAP = {\n sm: '--ca-radius-sm',\n md: '--ca-radius-md',\n lg: '--ca-radius-lg',\n xl: '--ca-radius-xl',\n pill: '--ca-radius-pill',\n};\n\nconst TYPE_VAR_MAP = {\n fontFamily: '--ca-font',\n h1Size: '--ca-h1-size',\n h2Size: '--ca-h2-size',\n bodySize: '--ca-body-size',\n labelSize: '--ca-label-size',\n valueSize: '--ca-value-size',\n smallSize: '--ca-small-size',\n};\n\nconst SHADOW_VAR_MAP = {\n card: '--ca-shadow-card',\n settings: '--ca-shadow-settings',\n};\n\n/**\n * Convert a resolved theme object into inline CSS variable styles.\n */\nexport function themeToCssVars(theme) {\n const vars = {};\n\n if (theme?.colors) {\n Object.entries(COLOR_VAR_MAP).forEach(([key, cssVar]) => {\n if (theme.colors[key] != null) vars[cssVar] = theme.colors[key];\n });\n }\n\n if (theme?.radii) {\n Object.entries(RADIUS_VAR_MAP).forEach(([key, cssVar]) => {\n if (theme.radii[key] != null) vars[cssVar] = theme.radii[key];\n });\n }\n\n if (theme?.typography) {\n Object.entries(TYPE_VAR_MAP).forEach(([key, cssVar]) => {\n if (theme.typography[key] != null) vars[cssVar] = theme.typography[key];\n });\n }\n\n if (theme?.shadow) {\n Object.entries(SHADOW_VAR_MAP).forEach(([key, cssVar]) => {\n if (theme.shadow[key] != null) vars[cssVar] = theme.shadow[key];\n });\n }\n\n // Ensure primary button text stays readable\n if (vars['--ca-on-primary'] && !vars['--ca-white']) {\n vars['--ca-white'] = vars['--ca-on-primary'];\n }\n\n return vars;\n}\n","import React, { createContext, useContext, useMemo } from 'react';\nimport { resolveActiveTheme, themeToCssVars } from '../theme/resolveTheme';\nimport { defaultThemeFile } from '../theme/defaultTheme';\n\nconst ThemeContext = createContext({\n darkMode: false,\n theme: null,\n themeFile: defaultThemeFile,\n cssVars: {},\n});\n\n/**\n * Applies parent theme + darkMode to the whole package via CSS variables on `.ca-root`.\n *\n * @param {object} [theme] - Static theme file / tokens from parent\n * @param {boolean} [darkMode=false] - Parent-controlled dark mode flag\n */\nexport function ThemeProvider({ theme, darkMode = false, children }) {\n const value = useMemo(() => {\n const active = resolveActiveTheme(theme, Boolean(darkMode));\n const cssVars = themeToCssVars(active);\n return {\n darkMode: Boolean(darkMode),\n theme: active,\n themeFile: active.__pack,\n cssVars,\n mode: active.mode,\n };\n }, [theme, darkMode]);\n\n return (\n <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n );\n}\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport function useTheme() {\n return useContext(ThemeContext);\n}\n\nexport default ThemeContext;\n","import React from 'react';\n\n/**\n * Button atom — primary | secondary | outline | ghost | link.\n */\nexport default function Button({\n children,\n variant = 'primary',\n size = 'md',\n startIcon,\n endIcon,\n className = '',\n type = 'button',\n disabled = false,\n onClick,\n ...props\n}) {\n const classes = [\n 'ca-btn',\n `ca-btn--${variant}`,\n size === 'sm' ? 'ca-btn--sm' : '',\n size === 'lg' ? 'ca-btn--lg' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n type={type}\n className={classes}\n disabled={disabled}\n onClick={onClick}\n {...props}\n >\n {startIcon ? <span className=\"ca-btn__icon\">{startIcon}</span> : null}\n {children}\n {endIcon ? <span className=\"ca-btn__icon\">{endIcon}</span> : null}\n </button>\n );\n}\n","import React from 'react';\n\n/** Plus icon for create actions. */\nexport default function PlusIcon({ size = 16, color = 'currentColor', ...props }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n {...props}\n >\n <path\n d=\"M12 5v14M5 12h14\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import React from 'react';\n\nconst VARIANT_CLASS = {\n h1: 'ca-h1',\n h2: 'ca-h2',\n body: 'ca-body',\n label: 'ca-label',\n value: 'ca-value',\n small: 'ca-small',\n link: 'ca-link',\n};\n\nconst VARIANT_TAG = {\n h1: 'h1',\n h2: 'h2',\n body: 'p',\n label: 'span',\n value: 'span',\n small: 'span',\n link: 'button',\n};\n\n/**\n * Typography atom — shared text styles across the package.\n */\nexport default function Typography({\n variant = 'body',\n as,\n className = '',\n children,\n ...props\n}) {\n const Tag = as || VARIANT_TAG[variant] || 'p';\n const baseClass = VARIANT_CLASS[variant] || VARIANT_CLASS.body;\n\n return (\n <Tag className={`${baseClass} ${className}`.trim()} {...props}>\n {children}\n </Tag>\n );\n}\n\nexport function Heading1(props) {\n return <Typography variant=\"h1\" {...props} />;\n}\n\nexport function Heading2(props) {\n return <Typography variant=\"h2\" {...props} />;\n}\n\nexport function BodyText(props) {\n return <Typography variant=\"body\" {...props} />;\n}\n\nexport function LabelText(props) {\n return <Typography variant=\"label\" {...props} />;\n}\n\nexport function ValueText(props) {\n return <Typography variant=\"value\" {...props} />;\n}\n\nexport function LinkText(props) {\n return <Typography variant=\"link\" type=\"button\" {...props} />;\n}\n","import React from 'react';\nimport Button from '../atoms/Button';\nimport PlusIcon from '../atoms/PlusIcon';\nimport { Heading1, BodyText } from '../atoms/Typography';\n\n/**\n * Page header organism — title, description, primary CTA.\n */\nexport default function PageHeader({\n title = 'Complaint Management',\n description,\n actionLabel = 'Create New Form',\n onAction,\n className = '',\n}) {\n return (\n <header className={`ca-page-header ${className}`.trim()}>\n <div className=\"ca-page-header__text\">\n <Heading1>{title}</Heading1>\n {description ? <BodyText>{description}</BodyText> : null}\n </div>\n <div className=\"ca-page-header__actions\">\n <Button startIcon={<PlusIcon />} onClick={onAction}>\n {actionLabel}\n </Button>\n </div>\n </header>\n );\n}\n","import React from 'react';\n\n/**\n * Pill-style status badge atom.\n * @param {'active' | 'inactive' | string} status\n */\nexport default function StatusBadge({ status = 'inactive', label, className = '' }) {\n const normalized = String(status).toLowerCase();\n const isActive = normalized === 'active';\n const text = label ?? (isActive ? 'Active' : 'Inactive');\n\n return (\n <span\n className={`ca-badge ca-badge--${isActive ? 'active' : 'inactive'} ${className}`.trim()}\n >\n {text}\n </span>\n );\n}\n","import React from 'react';\nimport { Heading2 } from '../atoms/Typography';\nimport StatusBadge from '../atoms/StatusBadge';\n\n/**\n * Card header molecule — system title + status badge.\n */\nexport default function CardHeader({\n title,\n status,\n statusLabel,\n titleAsLink = false,\n onTitleClick,\n className = '',\n}) {\n return (\n <div className={`ca-system-card__header ${className}`.trim()}>\n <div className=\"ca-system-card__title-wrap\">\n {titleAsLink ? (\n <button\n type=\"button\"\n className=\"ca-h2 ca-h2--link\"\n onClick={onTitleClick}\n >\n {title}\n </button>\n ) : (\n <Heading2>{title}</Heading2>\n )}\n </div>\n <StatusBadge status={status} label={statusLabel} />\n </div>\n );\n}\n","import React from 'react';\n\n/** Chevron-right icon (reused pattern from Icons/ChevronRightIcon). */\nexport default function ChevronRightIcon({ size = 16, color = 'currentColor', ...props }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n {...props}\n >\n <path\n d=\"M9 6l6 6-6 6\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import React from 'react';\nimport Typography from '../atoms/Typography';\nimport Button from '../atoms/Button';\nimport ChevronRightIcon from '../atoms/ChevronRightIcon';\n\n/**\n * Card footer molecule — \"Updated on…\" text + Configure button.\n */\nexport default function CardFooter({\n updatedOn,\n configureLabel = 'Configure',\n onConfigure,\n className = '',\n}) {\n return (\n <div className={`ca-system-card__footer ${className}`.trim()}>\n <Typography variant=\"small\" as=\"span\">\n {updatedOn ? `Updated on ${updatedOn}` : ''}\n </Typography>\n <Button\n size=\"sm\"\n onClick={onConfigure}\n endIcon={<ChevronRightIcon size={14} color=\"#fff\" />}\n >\n {configureLabel}\n </Button>\n </div>\n );\n}\n","import React from 'react';\nimport { LabelText, ValueText } from '../atoms/Typography';\n\n/**\n * Data point molecule — label above value (e.g. Departments / 03).\n */\nexport default function DataPoint({ label, value, className = '' }) {\n const display =\n value === null || value === undefined\n ? '—'\n : typeof value === 'number'\n ? String(value).padStart(2, '0')\n : value;\n\n return (\n <div className={`ca-data-point ${className}`.trim()}>\n <LabelText>{label}</LabelText>\n <ValueText>{display}</ValueText>\n </div>\n );\n}\n","import React from 'react';\n\n/** Vertical divider used between data points in system cards. */\nexport default function Divider({ className = '' }) {\n return <div className={`ca-divider ${className}`.trim()} role=\"separator\" aria-orientation=\"vertical\" />;\n}\n","import React from 'react';\nimport CardHeader from '../molecules/CardHeader';\nimport CardFooter from '../molecules/CardFooter';\nimport DataPoint from '../molecules/DataPoint';\nimport Divider from '../atoms/Divider';\nimport { LinkText } from '../atoms/Typography';\n\n/**\n * System / template card organism.\n *\n * Props are data-only so the parent app owns API & auth.\n */\nexport default function SystemCard({\n id,\n title,\n status = 'inactive',\n statusLabel,\n description,\n descriptionHref,\n departments,\n workflows,\n fields,\n formsFilled,\n updatedOn,\n titleAsLink = false,\n onTitleClick,\n onDescriptionClick,\n onConfigure,\n className = '',\n}) {\n const handleConfigure = () => {\n onConfigure?.({\n id,\n title,\n status,\n departments,\n workflows,\n fields,\n formsFilled,\n updatedOn,\n });\n };\n\n const handleDescription = () => {\n if (onDescriptionClick) {\n onDescriptionClick({ id, title, descriptionHref });\n return;\n }\n if (descriptionHref && typeof window !== 'undefined') {\n window.open(descriptionHref, '_blank', 'noopener,noreferrer');\n }\n };\n\n const stats = [\n { label: 'Departments', value: departments },\n { label: 'Workflows', value: workflows },\n { label: 'Fields', value: fields },\n { label: 'Forms Filled', value: formsFilled },\n ];\n\n return (\n <article className={`ca-system-card ${className}`.trim()}>\n <CardHeader\n title={title}\n status={status}\n statusLabel={statusLabel}\n titleAsLink={titleAsLink}\n onTitleClick={() => onTitleClick?.({ id, title })}\n />\n\n {description ? (\n <LinkText onClick={handleDescription}>{description}</LinkText>\n ) : null}\n\n <div className=\"ca-system-card__stats\">\n {stats.map((stat, index) => (\n <React.Fragment key={stat.label}>\n {index > 0 ? <Divider /> : null}\n <DataPoint label={stat.label} value={stat.value} />\n </React.Fragment>\n ))}\n </div>\n\n <CardFooter updatedOn={updatedOn} onConfigure={handleConfigure} />\n </article>\n );\n}\n","import React from 'react';\nimport SystemCard from './SystemCard';\nimport { BodyText } from '../atoms/Typography';\n\n/**\n * Responsive grid of system cards.\n */\nexport default function SystemCardGrid({\n systems = [],\n onConfigure,\n onTitleClick,\n onDescriptionClick,\n emptyMessage = 'No systems found.',\n className = '',\n}) {\n if (!systems.length) {\n return (\n <div className={`ca-system-grid ${className}`.trim()}>\n <div className=\"ca-empty\">\n <BodyText>{emptyMessage}</BodyText>\n </div>\n </div>\n );\n }\n\n return (\n <div className={`ca-system-grid ${className}`.trim()}>\n {systems.map((system) => (\n <SystemCard\n key={system.id ?? system.title}\n {...system}\n onConfigure={onConfigure}\n onTitleClick={onTitleClick}\n onDescriptionClick={onDescriptionClick}\n />\n ))}\n </div>\n );\n}\n","import React from 'react';\n\n/**\n * Text input atom. Supports an optional leading icon (e.g. search).\n */\nexport default function Input({\n value,\n onChange,\n placeholder,\n type = 'text',\n icon,\n className = '',\n inputClassName = '',\n ...props\n}) {\n return (\n <div className={`ca-input-wrap ${className}`.trim()}>\n {icon ? <span className=\"ca-input-wrap__icon\">{icon}</span> : null}\n <input\n type={type}\n className={`ca-input ${icon ? 'ca-input--with-icon' : ''} ${inputClassName}`.trim()}\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n {...props}\n />\n </div>\n );\n}\n","import React from 'react';\n\n/** Magnifying-glass icon for search inputs. */\nexport default function SearchIcon({ size = 18, color = 'currentColor', ...props }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n {...props}\n >\n <path\n d=\"M10.5 18a7.5 7.5 0 1 1 0-15 7.5 7.5 0 0 1 0 15Z\"\n stroke={color}\n strokeWidth=\"1.75\"\n />\n <path\n d=\"M16.5 16.5 21 21\"\n stroke={color}\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import React from 'react';\nimport Input from '../atoms/Input';\nimport SearchIcon from '../atoms/SearchIcon';\n\n/**\n * Search bar molecule — Input + search icon.\n */\nexport default function SearchBar({\n value,\n onChange,\n onSearch,\n placeholder = 'Search',\n className = '',\n}) {\n const handleKeyDown = (e) => {\n if (e.key === 'Enter' && onSearch) {\n onSearch(value);\n }\n };\n\n return (\n <div className={`ca-search ${className}`.trim()}>\n <Input\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n icon={<SearchIcon />}\n aria-label={placeholder}\n />\n </div>\n );\n}\n","import React from 'react';\n\n/**\n * Generic loading atom (reused from previous package pattern).\n */\nexport default function Loading({ text = 'Loading', fullScreen = false }) {\n return (\n <div\n className=\"ca-loading\"\n style={fullScreen ? { minHeight: 'calc(100vh - 80px)' } : undefined}\n role=\"status\"\n aria-live=\"polite\"\n >\n <span className=\"ca-loading__spinner\" />\n <span>{text}…</span>\n </div>\n );\n}\n","/** Demo systems matching the Complaint Management design (used when no data is passed). */\nexport const DEMO_SYSTEMS = [\n {\n id: 'qms',\n title: 'QMS - Query Management System',\n status: 'active',\n description: 'Description of the template',\n departments: 3,\n workflows: 12,\n fields: 55,\n formsFilled: 234,\n updatedOn: '12 Mar 2024',\n titleAsLink: true,\n },\n {\n id: 'cms',\n title: 'CMS - Complaint Management System',\n status: 'active',\n description: 'Description of the template',\n departments: 5,\n workflows: 8,\n fields: 42,\n formsFilled: 189,\n updatedOn: '08 Mar 2024',\n },\n {\n id: 'fms',\n title: 'FMS - Feedback Management System',\n status: 'inactive',\n description: 'Description of the template',\n departments: 2,\n workflows: 4,\n fields: 28,\n formsFilled: 56,\n updatedOn: '01 Feb 2024',\n },\n {\n id: 'rms',\n title: 'RMS - Request Management System',\n status: 'active',\n description: 'Description of the template',\n departments: 4,\n workflows: 10,\n fields: 61,\n formsFilled: 312,\n updatedOn: '20 Mar 2024',\n },\n];\n\nexport const DEFAULT_PAGE_DESCRIPTION =\n 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi.';\n","import React, { useMemo, useState, useEffect } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport PageHeader from '../components/organisms/PageHeader';\nimport SystemCardGrid from '../components/organisms/SystemCardGrid';\nimport SearchBar from '../components/molecules/SearchBar';\nimport Loading from '../components/atoms/Loading';\nimport { DEMO_SYSTEMS, DEFAULT_PAGE_DESCRIPTION } from '../data/demoSystems';\nimport api from '../utils/api';\n\n/**\n * Normalize API / parent payloads into SystemCard props.\n */\nfunction normalizeSystems(list = []) {\n return list.map((item, index) => ({\n id: item.id ?? item._id ?? `system-${index}`,\n title: item.title ?? item.name ?? 'Untitled',\n status: item.status ?? 'inactive',\n statusLabel: item.statusLabel,\n description: item.description ?? item.templateDescription,\n descriptionHref: item.descriptionHref ?? item.url,\n departments: item.departments ?? item.departmentCount ?? 0,\n workflows: item.workflows ?? item.workflowCount ?? 0,\n fields: item.fields ?? item.fieldCount ?? 0,\n formsFilled: item.formsFilled ?? item.formFilledCount ?? item.forms_filled ?? 0,\n updatedOn: item.updatedOn ?? item.updatedAt ?? item.updated_on,\n titleAsLink: Boolean(item.titleAsLink ?? item.isLink),\n }));\n}\n\n/**\n * Complaint Management page — composes header, search, and system cards.\n *\n * Data comes from:\n * 1. `systems` prop (parent-controlled), or\n * 2. `systemsEndpoint` fetched via shared api client (parent auth/base URL), or\n * 3. demo data (dev / design preview).\n */\nexport default function ComplaintManagementPage({\n title = 'Complaint Management',\n description = DEFAULT_PAGE_DESCRIPTION,\n systems: systemsProp,\n systemsEndpoint,\n useDemoData = true,\n createLabel = 'Create New Form',\n onCreateForm,\n onConfigure,\n onTitleClick,\n onDescriptionClick,\n onSearch,\n}) {\n const navigate = useNavigate();\n const [search, setSearch] = useState('');\n const [fetchedSystems, setFetchedSystems] = useState(null);\n const [fetchError, setFetchError] = useState(null);\n const [fetchStatus, setFetchStatus] = useState(\n systemsEndpoint && !systemsProp ? 'loading' : 'idle',\n );\n\n useEffect(() => {\n if (!systemsEndpoint || systemsProp) {\n return undefined;\n }\n\n const controller = new AbortController();\n\n api\n .get(systemsEndpoint, { signal: controller.signal })\n .then((response) => {\n const payload = response?.data;\n const list = Array.isArray(payload)\n ? payload\n : payload?.data ?? payload?.systems ?? payload?.results ?? [];\n setFetchedSystems(normalizeSystems(list));\n setFetchError(null);\n setFetchStatus('success');\n })\n .catch((err) => {\n if (controller.signal.aborted) return;\n setFetchError(err?.message || 'Failed to load systems');\n setFetchedSystems([]);\n setFetchStatus('error');\n });\n\n return () => controller.abort();\n }, [systemsEndpoint, systemsProp]);\n\n const sourceSystems = useMemo(() => {\n if (systemsProp) return normalizeSystems(systemsProp);\n if (fetchedSystems) return fetchedSystems;\n if (useDemoData) return DEMO_SYSTEMS;\n return [];\n }, [systemsProp, fetchedSystems, useDemoData]);\n\n const filteredSystems = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return sourceSystems;\n return sourceSystems.filter((s) => {\n const haystack = `${s.title} ${s.description ?? ''} ${s.status ?? ''}`.toLowerCase();\n return haystack.includes(q);\n });\n }, [sourceSystems, search]);\n\n const handleSearchChange = (e) => {\n const next = e.target.value;\n setSearch(next);\n onSearch?.(next);\n };\n\n const handleConfigure = (system) => {\n onConfigure?.(system);\n navigate(`/settings/${system.id ?? 'new'}?step=1`);\n };\n\n const loading = fetchStatus === 'loading';\n\n return (\n <>\n <PageHeader\n title={title}\n description={description}\n actionLabel={createLabel}\n onAction={onCreateForm}\n />\n\n <SearchBar value={search} onChange={handleSearchChange} placeholder=\"Search\" />\n\n {loading ? (\n <Loading text=\"Loading systems\" />\n ) : fetchError ? (\n <div className=\"ca-empty\">\n <p className=\"ca-body\">{fetchError}</p>\n </div>\n ) : (\n <SystemCardGrid\n systems={filteredSystems}\n onConfigure={handleConfigure}\n onTitleClick={onTitleClick}\n onDescriptionClick={onDescriptionClick}\n emptyMessage={search ? 'No systems match your search.' : 'No systems found.'}\n />\n )}\n </>\n );\n}\n","import React from 'react';\n\n/**\n * Horizontal stepper organism.\n * Reflects URL-driven step (1-indexed).\n */\nexport default function Stepper({\n steps = [],\n currentStep = 1,\n onStepClick,\n className = '',\n size = 'md',\n}) {\n return (\n <nav\n className={`ca-stepper ca-stepper--${size} ${className}`.trim()}\n aria-label=\"Progress\"\n >\n {steps.map((step, index) => {\n const stepId = step.id ?? index + 1;\n const isActive = stepId === currentStep;\n const isDone = stepId < currentStep;\n const clickable = Boolean(onStepClick) && (isDone || isActive);\n\n return (\n <React.Fragment key={stepId}>\n {index > 0 ? (\n <div\n className={`ca-stepper__line ${isDone || isActive ? 'ca-stepper__line--active' : ''}`}\n />\n ) : null}\n <button\n type=\"button\"\n className={[\n 'ca-stepper__item',\n isActive ? 'ca-stepper__item--active' : '',\n isDone ? 'ca-stepper__item--done' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => clickable && onStepClick?.(stepId)}\n disabled={!clickable}\n aria-current={isActive ? 'step' : undefined}\n >\n <span className=\"ca-stepper__circle\">{stepId}</span>\n <span className=\"ca-stepper__label\">{step.label}</span>\n </button>\n </React.Fragment>\n );\n })}\n </nav>\n );\n}\n","import React, { createContext, useContext, useMemo, useState, useCallback } from 'react';\n\nconst SettingsWizardContext = createContext(null);\n\nconst initialState = {\n categoryType: 'qms',\n active: true,\n description: '',\n roles: ['Store Staff', 'HR Executive', 'HR Manager'],\n departmentRows: [\n { id: '1', department: '', subDepartment: '', roles: '' },\n ],\n priorityDraft: '',\n priorities: [],\n defaultPriorityId: null,\n selectedDeptNode: 'payroll',\n workflow: {\n name: '',\n tatMinutes: '',\n description: '',\n statuses: [],\n steps: [],\n },\n fieldDraft: { name: '', type: '' },\n formFields: [],\n};\n\nexport function SettingsWizardProvider({ children, initialValues }) {\n const [state, setState] = useState({ ...initialState, ...initialValues });\n\n const update = useCallback((patch) => {\n setState((prev) => ({ ...prev, ...patch }));\n }, []);\n\n const updateWorkflow = useCallback((patch) => {\n setState((prev) => ({\n ...prev,\n workflow: { ...prev.workflow, ...patch },\n }));\n }, []);\n\n const value = useMemo(\n () => ({ state, setState, update, updateWorkflow }),\n [state, update, updateWorkflow],\n );\n\n return (\n <SettingsWizardContext.Provider value={value}>\n {children}\n </SettingsWizardContext.Provider>\n );\n}\n\n// Context hook co-located with provider (standard React pattern).\n// eslint-disable-next-line react-refresh/only-export-components\nexport function useSettingsWizard() {\n const ctx = useContext(SettingsWizardContext);\n if (!ctx) {\n throw new Error('useSettingsWizard must be used within SettingsWizardProvider');\n }\n return ctx;\n}\n\nexport default SettingsWizardContext;\n","/** Settings wizard step definitions (1-indexed for URL ?step=). */\nexport const SETTINGS_STEPS = [\n {\n id: 1,\n key: 'category',\n label: 'Category Type',\n title: 'Category Type',\n description: 'Define the type and basic details for this category type.',\n },\n {\n id: 2,\n key: 'departments',\n label: 'Departments',\n title: 'Departments',\n description: '----',\n },\n {\n id: 3,\n key: 'priorities',\n label: 'Priorities',\n title: 'Priorities',\n description: '----',\n },\n {\n id: 4,\n key: 'workflow',\n label: 'Workflow',\n title: 'Workflow',\n description: '----',\n },\n {\n id: 5,\n key: 'formFields',\n label: 'Form Fields',\n title: 'Form Fields',\n description: '----',\n },\n {\n id: 6,\n key: 'review',\n label: 'Review & Publish',\n title: 'Review & Publish',\n description: 'Review your configuration and publish.',\n },\n];\n\nexport const WORKFLOW_SUBSTEPS = [\n { id: 1, label: 'Create Workflow' },\n { id: 2, label: 'Statuses' },\n { id: 3, label: 'Workflow Steps' },\n];\n\nexport const QUICK_PRIORITIES = ['Urgent', 'High', 'Medium', 'Low'];\n\nexport const FIELD_LIBRARY = [\n { id: 'short', label: 'Textfield / Short Answer', icon: 'text' },\n { id: 'long', label: 'Description / Long Answer', icon: 'doc' },\n { id: 'date', label: 'Date', icon: 'calendar' },\n { id: 'time', label: 'Time', icon: 'clock' },\n { id: 'single', label: 'Dropdown - Single Select', icon: 'chevron' },\n { id: 'multi', label: 'Dropdown - Multiple Select', icon: 'chevron' },\n];\n\nexport const DEMO_ROLES = [\n 'Store Staff',\n 'HR Executive',\n 'HR Manager',\n 'Store Manager',\n 'Admin',\n];\n\nexport const DEMO_CATEGORY_TYPES = [\n { value: 'qms', label: 'QMS - Query Management System' },\n { value: 'cms', label: 'CMS - Complaint Management System' },\n { value: 'fms', label: 'FMS - Feedback Management System' },\n { value: 'rms', label: 'RMS - Request Management System' },\n];\n\nexport const DEMO_DEPARTMENTS_TREE = [\n {\n id: 'hr',\n name: 'HR',\n children: [\n { id: 'payroll', name: 'Payroll' },\n { id: 'recruitment', name: 'Recruitment' },\n ],\n },\n {\n id: 'finance',\n name: 'Finance',\n children: [{ id: 'ap', name: 'Accounts Payable' }],\n },\n {\n id: 'it',\n name: 'IT',\n children: [],\n },\n];\n\nexport const PRIORITY_COLORS = [\n { value: '#EF4444', label: 'Red' },\n { value: '#F59E0B', label: 'Orange' },\n { value: '#EAB308', label: 'Yellow' },\n { value: '#22C55E', label: 'Green' },\n { value: '#3B82F6', label: 'Blue' },\n { value: '#8B5CF6', label: 'Purple' },\n];\n","import React from 'react';\n\n/** Stacked-layers icon used in settings card headers. */\nexport default function LayersIcon({ size = 28, color = 'currentColor', ...props }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n style={{ color: 'var(--ca-primary)' }}\n {...props}\n >\n <path\n d=\"M12 3 3 8l9 5 9-5-9-5Z\"\n stroke={color}\n strokeWidth=\"1.6\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3 12.5 12 17.5l9-5\"\n stroke={color}\n strokeWidth=\"1.6\"\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M3 16.5 12 21.5l9-5\"\n stroke={color}\n strokeWidth=\"1.6\"\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import React from 'react';\nimport LayersIcon from '../atoms/LayersIcon';\nimport Button from '../atoms/Button';\nimport ChevronRightIcon from '../atoms/ChevronRightIcon';\nimport { Heading2, BodyText } from '../atoms/Typography';\n\n/**\n * Settings card header — icon, title, description, Next button.\n */\nexport default function SettingsCardHeader({\n title,\n description,\n nextLabel = 'Next',\n onNext,\n showNext = true,\n nextDisabled = false,\n nextVariant = 'primary',\n className = '',\n}) {\n return (\n <div className={`ca-settings-card__header ${className}`.trim()}>\n <div className=\"ca-settings-card__heading\">\n <LayersIcon />\n <div>\n <Heading2>{title}</Heading2>\n {description ? <BodyText className=\"ca-settings-card__desc\">{description}</BodyText> : null}\n </div>\n </div>\n {showNext ? (\n <Button\n variant={nextVariant}\n disabled={nextDisabled}\n onClick={onNext}\n endIcon={<ChevronRightIcon size={14} color=\"currentColor\" />}\n >\n {nextLabel}\n </Button>\n ) : null}\n </div>\n );\n}\n","import React from 'react';\nimport SettingsCardHeader from '../molecules/SettingsCardHeader';\n\n/**\n * White bordered card shell for settings step content.\n */\nexport default function SettingsCard({\n title,\n description,\n onNext,\n nextLabel,\n showNext = true,\n nextDisabled,\n nextVariant,\n children,\n footer,\n className = '',\n}) {\n return (\n <section className={`ca-settings-card ${className}`.trim()}>\n <SettingsCardHeader\n title={title}\n description={description}\n onNext={onNext}\n nextLabel={nextLabel}\n showNext={showNext}\n nextDisabled={nextDisabled}\n nextVariant={nextVariant}\n />\n <div className=\"ca-settings-card__divider\" />\n <div className=\"ca-settings-card__body\">{children}</div>\n {footer ? <div className=\"ca-settings-card__footer\">{footer}</div> : null}\n </section>\n );\n}\n","import React from 'react';\n\n/**\n * Field label atom with optional trailing hint (e.g. character count).\n */\nexport default function FieldLabel({ children, hint, htmlFor, className = '' }) {\n return (\n <div className={`ca-field-label ${className}`.trim()}>\n <label className=\"ca-label\" htmlFor={htmlFor}>\n {children}\n </label>\n {hint != null ? <span className=\"ca-field-label__hint\">{hint}</span> : null}\n </div>\n );\n}\n","import React from 'react';\n\nexport default function ChevronDownIcon({ size = 16, color = 'currentColor', ...props }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <path\n d=\"M6 9l6 6 6-6\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import React from 'react';\nimport ChevronDownIcon from './ChevronDownIcon';\n\n/**\n * Select / dropdown atom.\n */\nexport default function Select({\n value,\n onChange,\n options = [],\n placeholder = 'Select',\n className = '',\n disabled = false,\n ...props\n}) {\n return (\n <div className={`ca-select ${className}`.trim()}>\n <select\n className=\"ca-select__control\"\n value={value ?? ''}\n onChange={onChange}\n disabled={disabled}\n {...props}\n >\n <option value=\"\" disabled>\n {placeholder}\n </option>\n {options.map((opt) => {\n const val = typeof opt === 'string' ? opt : opt.value;\n const label = typeof opt === 'string' ? opt : opt.label;\n return (\n <option key={val} value={val}>\n {label}\n </option>\n );\n })}\n </select>\n <span className=\"ca-select__chevron\">\n <ChevronDownIcon size={16} />\n </span>\n </div>\n );\n}\n","import React from 'react';\n\n/**\n * Multi-line text input atom.\n */\nexport default function Textarea({\n value,\n onChange,\n placeholder,\n maxLength,\n rows = 4,\n className = '',\n ...props\n}) {\n return (\n <textarea\n className={`ca-textarea ${className}`.trim()}\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n maxLength={maxLength}\n rows={rows}\n {...props}\n />\n );\n}\n","import React from 'react';\nimport FieldLabel from '../atoms/FieldLabel';\nimport Input from '../atoms/Input';\nimport Select from '../atoms/Select';\nimport Textarea from '../atoms/Textarea';\n\n/**\n * Labeled form control molecule.\n */\nexport default function FormField({\n label,\n hint,\n children,\n className = '',\n htmlFor,\n}) {\n return (\n <div className={`ca-form-field ${className}`.trim()}>\n {label != null ? (\n <FieldLabel htmlFor={htmlFor} hint={hint}>\n {label}\n </FieldLabel>\n ) : null}\n {children}\n </div>\n );\n}\n\nexport function FormInput({ label, hint, ...inputProps }) {\n return (\n <FormField label={label} hint={hint} htmlFor={inputProps.id}>\n <Input {...inputProps} />\n </FormField>\n );\n}\n\nexport function FormSelect({ label, hint, ...selectProps }) {\n return (\n <FormField label={label} hint={hint} htmlFor={selectProps.id}>\n <Select {...selectProps} />\n </FormField>\n );\n}\n\nexport function FormTextarea({ label, hint, maxLength, value = '', ...textareaProps }) {\n const computedHint =\n hint ??\n (maxLength != null ? `${String(value).length}/${maxLength}` : undefined);\n\n return (\n <FormField label={label} hint={computedHint} htmlFor={textareaProps.id}>\n <Textarea value={value} maxLength={maxLength} {...textareaProps} />\n </FormField>\n );\n}\n","import React from 'react';\n\n/**\n * Toggle switch atom.\n */\nexport default function Toggle({\n checked = false,\n onChange,\n disabled = false,\n 'aria-label': ariaLabel = 'Toggle',\n className = '',\n}) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={ariaLabel}\n disabled={disabled}\n className={`ca-toggle ${checked ? 'ca-toggle--on' : ''} ${className}`.trim()}\n onClick={() => onChange?.(!checked)}\n >\n <span className=\"ca-toggle__thumb\" />\n </button>\n );\n}\n","import React from 'react';\nimport Toggle from '../atoms/Toggle';\nimport { LabelText } from '../atoms/Typography';\n\n/** Label + toggle molecule. */\nexport default function ToggleField({\n label = 'Active',\n checked,\n onChange,\n className = '',\n}) {\n return (\n <div className={`ca-toggle-field ${className}`.trim()}>\n <LabelText>{label}</LabelText>\n <Toggle checked={checked} onChange={onChange} aria-label={label} />\n </div>\n );\n}\n","import React from 'react';\n\nexport default function CloseIcon({ size = 12, color = 'currentColor', ...props }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <path\n d=\"M6 6l12 12M18 6L6 18\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import React from 'react';\nimport CloseIcon from './CloseIcon';\n\n/**\n * Removable tag / pill atom.\n */\nexport default function Tag({ label, onRemove, className = '' }) {\n return (\n <span className={`ca-tag ${className}`.trim()}>\n {label}\n {onRemove ? (\n <button\n type=\"button\"\n className=\"ca-tag__remove\"\n onClick={onRemove}\n aria-label={`Remove ${label}`}\n >\n <CloseIcon size={10} />\n </button>\n ) : null}\n </span>\n );\n}\n","import React, { useState } from 'react';\nimport Select from '../atoms/Select';\nimport Tag from '../atoms/Tag';\nimport FieldLabel from '../atoms/FieldLabel';\n\n/**\n * Multi-select via dropdown + removable tags.\n */\nexport default function RoleMultiSelect({\n label = 'Select Roles',\n options = [],\n value = [],\n onChange,\n placeholder = 'Select roles',\n className = '',\n}) {\n const [openValue, setOpenValue] = useState('');\n\n const available = options.filter((opt) => {\n const val = typeof opt === 'string' ? opt : opt.value;\n return !value.includes(val);\n });\n\n const handleSelect = (e) => {\n const next = e.target.value;\n if (!next) return;\n onChange?.([...value, next]);\n setOpenValue('');\n };\n\n const handleRemove = (role) => {\n onChange?.(value.filter((r) => r !== role));\n };\n\n return (\n <div className={`ca-role-select ${className}`.trim()}>\n <FieldLabel>{label}</FieldLabel>\n <Select\n value={openValue}\n onChange={handleSelect}\n options={available}\n placeholder={placeholder}\n />\n {value.length > 0 ? (\n <div className=\"ca-tag-list\">\n {value.map((role) => (\n <Tag key={role} label={role} onRemove={() => handleRemove(role)} />\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n","import React from 'react';\nimport SettingsCard from '../../organisms/SettingsCard';\nimport { FormSelect, FormTextarea } from '../../molecules/FormField';\nimport ToggleField from '../../molecules/ToggleField';\nimport RoleMultiSelect from '../../molecules/RoleMultiSelect';\nimport { useSettingsWizard } from '../../../context/SettingsWizardContext';\nimport { DEMO_CATEGORY_TYPES, DEMO_ROLES } from '../../../data/settingsSteps';\n\nexport default function CategoryTypeStep({ onNext, stepMeta }) {\n const { state, update } = useSettingsWizard();\n\n return (\n <SettingsCard\n title={stepMeta.title}\n description={stepMeta.description}\n onNext={onNext}\n >\n <div className=\"ca-step-section\">\n <div className=\"ca-step-row ca-step-row--category\">\n <FormSelect\n label=\"Category Type\"\n className=\"ca-step-row__grow\"\n value={state.categoryType}\n onChange={(e) => update({ categoryType: e.target.value })}\n options={DEMO_CATEGORY_TYPES}\n placeholder=\"Select category type\"\n />\n <ToggleField\n checked={state.active}\n onChange={(active) => update({ active })}\n />\n </div>\n </div>\n\n <div className=\"ca-step-section\">\n <FormTextarea\n label=\"Description\"\n placeholder=\"Enter description\"\n maxLength={500}\n value={state.description}\n onChange={(e) => update({ description: e.target.value })}\n rows={5}\n />\n </div>\n\n <div className=\"ca-step-section ca-step-section--last\">\n <RoleMultiSelect\n options={DEMO_ROLES}\n value={state.roles}\n onChange={(roles) => update({ roles })}\n />\n </div>\n </SettingsCard>\n );\n}\n","import React from 'react';\nimport SettingsCard from '../../organisms/SettingsCard';\nimport Select from '../../atoms/Select';\nimport Input from '../../atoms/Input';\nimport Button from '../../atoms/Button';\nimport PlusIcon from '../../atoms/PlusIcon';\nimport { useSettingsWizard } from '../../../context/SettingsWizardContext';\nimport { DEMO_ROLES } from '../../../data/settingsSteps';\n\nconst DEPARTMENT_OPTIONS = ['HR', 'Finance', 'IT', 'Operations', 'Sales'];\n\nfunction newRow() {\n return {\n id: `${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,\n department: '',\n subDepartment: '',\n roles: '',\n };\n}\n\nexport default function DepartmentsStep({ onNext, stepMeta }) {\n const { state, update } = useSettingsWizard();\n const rows = state.departmentRows;\n\n const patchRow = (id, patch) => {\n update({\n departmentRows: rows.map((r) => (r.id === id ? { ...r, ...patch } : r)),\n });\n };\n\n const addRow = () => {\n update({ departmentRows: [...rows, newRow()] });\n };\n\n return (\n <SettingsCard title={stepMeta.title} description={stepMeta.description} onNext={onNext}>\n <div className=\"ca-dept-table\">\n <div className=\"ca-dept-table__head\">\n <div>Department</div>\n <div>Sub-department</div>\n <div>Roles</div>\n <div />\n </div>\n {rows.map((row) => (\n <div className=\"ca-dept-table__row\" key={row.id}>\n <Select\n value={row.department}\n onChange={(e) => patchRow(row.id, { department: e.target.value })}\n options={DEPARTMENT_OPTIONS}\n placeholder=\"Select or add department\"\n />\n <div className=\"ca-input-with-action\">\n <Input\n value={row.subDepartment}\n onChange={(e) => patchRow(row.id, { subDepartment: e.target.value })}\n placeholder=\"Add sub-department\"\n />\n <button\n type=\"button\"\n className=\"ca-input-with-action__btn\"\n aria-label=\"Add sub-department\"\n onClick={() => {\n if (!row.subDepartment.trim()) return;\n }}\n >\n <PlusIcon size={14} color=\"currentColor\" />\n </button>\n </div>\n <Select\n value={row.roles}\n onChange={(e) => patchRow(row.id, { roles: e.target.value })}\n options={DEMO_ROLES}\n placeholder=\"Select roles\"\n />\n <Button variant=\"link\" size=\"sm\" onClick={addRow}>\n + Add\n </Button>\n </div>\n ))}\n </div>\n </SettingsCard>\n );\n}\n","import React from 'react';\n\n/**\n * Chip / quick-add pill atom.\n */\nexport default function Chip({ children, onClick, className = '', active = false }) {\n return (\n <button\n type=\"button\"\n className={`ca-chip ${active ? 'ca-chip--active' : ''} ${className}`.trim()}\n onClick={onClick}\n >\n {children}\n </button>\n );\n}\n","import React from 'react';\n\n/**\n * Radio button atom.\n */\nexport default function Radio({\n checked = false,\n onChange,\n name,\n value,\n 'aria-label': ariaLabel,\n className = '',\n}) {\n return (\n <label className={`ca-radio ${className}`.trim()}>\n <input\n type=\"radio\"\n className=\"ca-radio__input\"\n name={name}\n value={value}\n checked={checked}\n onChange={onChange}\n aria-label={ariaLabel}\n />\n <span className=\"ca-radio__mark\" />\n </label>\n );\n}\n","import React from 'react';\n\nexport default function DragHandleIcon({ size = 16, color = '#9CA3AF', ...props }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <circle cx=\"5\" cy=\"4\" r=\"1.2\" fill={color} />\n <circle cx=\"11\" cy=\"4\" r=\"1.2\" fill={color} />\n <circle cx=\"5\" cy=\"8\" r=\"1.2\" fill={color} />\n <circle cx=\"11\" cy=\"8\" r=\"1.2\" fill={color} />\n <circle cx=\"5\" cy=\"12\" r=\"1.2\" fill={color} />\n <circle cx=\"11\" cy=\"12\" r=\"1.2\" fill={color} />\n </svg>\n );\n}\n","import React from 'react';\nimport SettingsCard from '../../organisms/SettingsCard';\nimport Input from '../../atoms/Input';\nimport Button from '../../atoms/Button';\nimport Chip from '../../atoms/Chip';\nimport Select from '../../atoms/Select';\nimport Radio from '../../atoms/Radio';\nimport DragHandleIcon from '../../atoms/DragHandleIcon';\nimport FieldLabel from '../../atoms/FieldLabel';\nimport { useSettingsWizard } from '../../../context/SettingsWizardContext';\nimport { QUICK_PRIORITIES, PRIORITY_COLORS } from '../../../data/settingsSteps';\n\nfunction makePriority(name) {\n return {\n id: `${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,\n name,\n color: '',\n };\n}\n\nexport default function PrioritiesStep({ onNext, stepMeta }) {\n const { state, update } = useSettingsWizard();\n const { priorityDraft, priorities, defaultPriorityId } = state;\n\n const addPriority = (name) => {\n const trimmed = (name ?? priorityDraft).trim();\n if (!trimmed) return;\n if (priorities.some((p) => p.name.toLowerCase() === trimmed.toLowerCase())) {\n update({ priorityDraft: '' });\n return;\n }\n const next = [...priorities, makePriority(trimmed)];\n update({\n priorities: next,\n priorityDraft: '',\n defaultPriorityId: defaultPriorityId ?? next[0].id,\n });\n };\n\n const patchPriority = (id, patch) => {\n update({\n priorities: priorities.map((p) => (p.id === id ? { ...p, ...patch } : p)),\n });\n };\n\n const colorOptions = PRIORITY_COLORS.map((c) => ({\n value: c.value,\n label: c.label,\n }));\n\n return (\n <SettingsCard title={stepMeta.title} description={stepMeta.description} onNext={onNext}>\n <div className=\"ca-priority-add\">\n <FieldLabel>Priorities</FieldLabel>\n <div className=\"ca-priority-add__row\">\n <Input\n value={priorityDraft}\n onChange={(e) => update({ priorityDraft: e.target.value })}\n placeholder=\"Add priority\"\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n addPriority();\n }\n }}\n />\n <Button variant=\"outline\" onClick={() => addPriority()}>\n + Add\n </Button>\n </div>\n <div className=\"ca-chip-row\">\n {QUICK_PRIORITIES.map((p) => (\n <Chip key={p} onClick={() => addPriority(p)}>\n + {p}\n </Chip>\n ))}\n </div>\n </div>\n\n <div className=\"ca-priority-table\">\n <div className=\"ca-priority-table__head\">\n <div>Priority</div>\n <div>Color</div>\n <div>Default</div>\n </div>\n {(priorities.length ? priorities : [makePriority('')]).map((row, index) => {\n const isPlaceholder = !priorities.length;\n return (\n <div className=\"ca-priority-table__row\" key={row.id || index}>\n <div className=\"ca-priority-table__name\">\n <DragHandleIcon />\n <Input\n value={isPlaceholder ? priorityDraft : row.name}\n onChange={(e) => {\n if (isPlaceholder) {\n update({ priorityDraft: e.target.value });\n } else {\n patchPriority(row.id, { name: e.target.value });\n }\n }}\n placeholder=\"Add priority\"\n />\n </div>\n <Select\n value={row.color}\n onChange={(e) => {\n if (!isPlaceholder) patchPriority(row.id, { color: e.target.value });\n }}\n options={colorOptions}\n placeholder=\"Select color\"\n />\n <Radio\n name=\"default-priority\"\n value={row.id}\n checked={!isPlaceholder && defaultPriorityId === row.id}\n onChange={() => !isPlaceholder && update({ defaultPriorityId: row.id })}\n aria-label=\"Default priority\"\n />\n </div>\n );\n })}\n </div>\n </SettingsCard>\n );\n}\n","import React from 'react';\nimport SettingsCard from '../../organisms/SettingsCard';\nimport Stepper from '../../organisms/Stepper';\nimport { FormInput, FormTextarea } from '../../molecules/FormField';\nimport Button from '../../atoms/Button';\nimport ChevronRightIcon from '../../atoms/ChevronRightIcon';\nimport { useSettingsWizard } from '../../../context/SettingsWizardContext';\nimport { DEMO_DEPARTMENTS_TREE, WORKFLOW_SUBSTEPS } from '../../../data/settingsSteps';\n\nexport default function WorkflowStep({\n onNext,\n stepMeta,\n substep = 1,\n onSubstepChange,\n}) {\n const { state, update, updateWorkflow } = useSettingsWizard();\n const { selectedDeptNode, workflow } = state;\n\n const handleNextSubstep = () => {\n if (substep < WORKFLOW_SUBSTEPS.length) {\n onSubstepChange?.(substep + 1);\n return;\n }\n onNext?.();\n };\n\n return (\n <SettingsCard\n title={stepMeta.title}\n description={stepMeta.description}\n onNext={onNext}\n nextVariant=\"secondary\"\n >\n <div className=\"ca-workflow\">\n <aside className=\"ca-workflow__sidebar\">\n <h3 className=\"ca-workflow__sidebar-title\">Select Department</h3>\n <p className=\"ca-small\">Add workflow for selected department</p>\n <ul className=\"ca-dept-tree\">\n {DEMO_DEPARTMENTS_TREE.map((dept) => (\n <li key={dept.id} className=\"ca-dept-tree__group\">\n <button\n type=\"button\"\n className={`ca-dept-tree__item ${\n selectedDeptNode === dept.id ? 'ca-dept-tree__item--active' : ''\n }`}\n onClick={() => update({ selectedDeptNode: dept.id })}\n >\n {dept.name}\n </button>\n {dept.children?.length ? (\n <ul className=\"ca-dept-tree__children\">\n {dept.children.map((child) => (\n <li key={child.id}>\n <button\n type=\"button\"\n className={`ca-dept-tree__item ca-dept-tree__item--child ${\n selectedDeptNode === child.id\n ? 'ca-dept-tree__item--active'\n : ''\n }`}\n onClick={() => update({ selectedDeptNode: child.id })}\n >\n <span className=\"ca-dept-tree__branch\" aria-hidden=\"true\">\n └\n </span>\n {child.name}\n </button>\n </li>\n ))}\n </ul>\n ) : null}\n </li>\n ))}\n </ul>\n </aside>\n\n <div className=\"ca-workflow__main\">\n <Stepper\n steps={WORKFLOW_SUBSTEPS}\n currentStep={substep}\n onStepClick={onSubstepChange}\n size=\"sm\"\n className=\"ca-workflow__substepper\"\n />\n\n {substep === 1 ? (\n <div className=\"ca-workflow__form\">\n <div className=\"ca-step-row\">\n <FormInput\n className=\"ca-step-row__grow\"\n label=\"Name\"\n placeholder=\"Enter name\"\n value={workflow.name}\n onChange={(e) => updateWorkflow({ name: e.target.value })}\n />\n <FormInput\n className=\"ca-step-row__grow\"\n label=\"TAT Minutes\"\n placeholder=\"Enter here\"\n value={workflow.tatMinutes}\n onChange={(e) => updateWorkflow({ tatMinutes: e.target.value })}\n />\n </div>\n <FormTextarea\n label=\"Description\"\n placeholder=\"Enter description\"\n value={workflow.description}\n onChange={(e) => updateWorkflow({ description: e.target.value })}\n rows={5}\n />\n </div>\n ) : null}\n\n {substep === 2 ? (\n <div className=\"ca-workflow__placeholder\">\n <p className=\"ca-body\">\n Configure workflow statuses for the selected department.\n </p>\n </div>\n ) : null}\n\n {substep === 3 ? (\n <div className=\"ca-workflow__placeholder\">\n <p className=\"ca-body\">Define ordered workflow steps and assignees.</p>\n </div>\n ) : null}\n\n <div className=\"ca-workflow__actions\">\n <Button\n onClick={handleNextSubstep}\n endIcon={<ChevronRightIcon size={14} color=\"#fff\" />}\n >\n Next Step\n </Button>\n </div>\n </div>\n </div>\n </SettingsCard>\n );\n}\n","import React from 'react';\n\nexport default function TrashIcon({ size = 16, color = '#9CA3AF', ...props }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <path\n d=\"M4 7h16M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2m2 0v12a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2V7h12Z\"\n stroke={color}\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import React from 'react';\nimport SettingsCard from '../../organisms/SettingsCard';\nimport Input from '../../atoms/Input';\nimport Select from '../../atoms/Select';\nimport Button from '../../atoms/Button';\nimport Toggle from '../../atoms/Toggle';\nimport DragHandleIcon from '../../atoms/DragHandleIcon';\nimport TrashIcon from '../../atoms/TrashIcon';\nimport FieldLabel from '../../atoms/FieldLabel';\nimport ChevronRightIcon from '../../atoms/ChevronRightIcon';\nimport { useSettingsWizard } from '../../../context/SettingsWizardContext';\nimport { FIELD_LIBRARY } from '../../../data/settingsSteps';\n\nconst FIELD_TYPE_OPTIONS = FIELD_LIBRARY.map((f) => ({\n value: f.id,\n label: f.label,\n}));\n\nfunction FieldLibraryIcon({ type }) {\n const map = {\n text: 'A',\n doc: '¶',\n calendar: '口',\n clock: '◷',\n chevron: '▾',\n };\n return <span className=\"ca-field-lib__glyph\">{map[type] || '▾'}</span>;\n}\n\nexport default function FormFieldsStep({ onNext, stepMeta }) {\n const { state, update } = useSettingsWizard();\n const { fieldDraft, formFields } = state;\n\n const setDraft = (patch) => update({ fieldDraft: { ...fieldDraft, ...patch } });\n\n const addField = () => {\n if (!fieldDraft.name.trim() || !fieldDraft.type) return;\n const typeLabel =\n FIELD_TYPE_OPTIONS.find((o) => o.value === fieldDraft.type)?.label || fieldDraft.type;\n update({\n formFields: [\n ...formFields,\n {\n id: `${Date.now()}`,\n name: fieldDraft.name.trim(),\n type: fieldDraft.type,\n typeLabel,\n required: false,\n },\n ],\n fieldDraft: { name: '', type: '' },\n });\n };\n\n const patchField = (id, patch) => {\n update({\n formFields: formFields.map((f) => (f.id === id ? { ...f, ...patch } : f)),\n });\n };\n\n const removeField = (id) => {\n update({ formFields: formFields.filter((f) => f.id !== id) });\n };\n\n const applyLibraryType = (item) => {\n setDraft({ type: item.id });\n };\n\n return (\n <SettingsCard\n title={stepMeta.title}\n description={stepMeta.description}\n showNext={false}\n footer={\n <Button\n onClick={onNext}\n endIcon={<ChevronRightIcon size={14} color=\"#fff\" />}\n >\n Next\n </Button>\n }\n >\n <div className=\"ca-form-fields\">\n <aside className=\"ca-field-lib\">\n <h3 className=\"ca-field-lib__title\">Field Library</h3>\n <p className=\"ca-small\">Drag and drop the fields to add.</p>\n <ul className=\"ca-field-lib__list\">\n {FIELD_LIBRARY.map((item) => (\n <li key={item.id}>\n <button\n type=\"button\"\n className=\"ca-field-lib__item\"\n draggable\n onDragStart={(e) => {\n e.dataTransfer.setData('text/plain', item.id);\n }}\n onClick={() => applyLibraryType(item)}\n >\n <FieldLibraryIcon type={item.icon} />\n <span>{item.label}</span>\n </button>\n </li>\n ))}\n </ul>\n </aside>\n\n <div className=\"ca-form-fields__main\">\n <div\n className=\"ca-add-fields\"\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => {\n e.preventDefault();\n const type = e.dataTransfer.getData('text/plain');\n if (type) setDraft({ type });\n }}\n >\n <div className=\"ca-add-fields__top\">\n <h3 className=\"ca-add-fields__title\">Add Fields</h3>\n <Button onClick={addField}>Add Field</Button>\n </div>\n <div className=\"ca-step-row\">\n <div className=\"ca-step-row__grow\">\n <FieldLabel>Name of Field</FieldLabel>\n <Input\n value={fieldDraft.name}\n onChange={(e) => setDraft({ name: e.target.value })}\n placeholder=\"Enter name of the field.\"\n />\n </div>\n <div className=\"ca-step-row__grow\">\n <FieldLabel>Type of Field</FieldLabel>\n <Select\n value={fieldDraft.type}\n onChange={(e) => setDraft({ type: e.target.value })}\n options={FIELD_TYPE_OPTIONS}\n placeholder=\"Select type of the field.\"\n />\n </div>\n </div>\n </div>\n\n <div className=\"ca-fields-table\">\n <div className=\"ca-fields-table__head\">\n <div>Field Name</div>\n <div>Field Type</div>\n <div>Required</div>\n <div />\n </div>\n {formFields.length === 0 ? (\n <div className=\"ca-fields-table__empty\">\n <p className=\"ca-small\">No fields added yet.</p>\n </div>\n ) : (\n formFields.map((field) => (\n <div className=\"ca-fields-table__row\" key={field.id}>\n <div className=\"ca-fields-table__name\">\n <DragHandleIcon />\n <Input\n value={field.name}\n onChange={(e) => patchField(field.id, { name: e.target.value })}\n />\n </div>\n <Select\n value={field.type}\n onChange={(e) => {\n const type = e.target.value;\n const typeLabel =\n FIELD_TYPE_OPTIONS.find((o) => o.value === type)?.label || type;\n patchField(field.id, { type, typeLabel });\n }}\n options={FIELD_TYPE_OPTIONS}\n placeholder=\"Select type\"\n />\n <Toggle\n checked={field.required}\n onChange={(required) => patchField(field.id, { required })}\n aria-label=\"Required\"\n />\n <button\n type=\"button\"\n className=\"ca-icon-btn\"\n aria-label=\"Delete field\"\n onClick={() => removeField(field.id)}\n >\n <TrashIcon />\n </button>\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n </SettingsCard>\n );\n}\n","import React from 'react';\nimport SettingsCard from '../../organisms/SettingsCard';\nimport Button from '../../atoms/Button';\nimport { BodyText, LabelText, Heading2 } from '../../atoms/Typography';\nimport StatusBadge from '../../atoms/StatusBadge';\nimport { useSettingsWizard } from '../../../context/SettingsWizardContext';\nimport { DEMO_CATEGORY_TYPES } from '../../../data/settingsSteps';\n\nexport default function ReviewPublishStep({ onPublish, stepMeta }) {\n const { state } = useSettingsWizard();\n const categoryLabel =\n DEMO_CATEGORY_TYPES.find((c) => c.value === state.categoryType)?.label ||\n state.categoryType;\n\n return (\n <SettingsCard\n title={stepMeta.title}\n description={stepMeta.description}\n nextLabel=\"Publish\"\n onNext={onPublish}\n >\n <div className=\"ca-review\">\n <section className=\"ca-review__block\">\n <Heading2>Category Type</Heading2>\n <div className=\"ca-review__row\">\n <LabelText>{categoryLabel}</LabelText>\n <StatusBadge status={state.active ? 'active' : 'inactive'} />\n </div>\n {state.description ? <BodyText>{state.description}</BodyText> : null}\n {state.roles.length ? (\n <BodyText>Roles: {state.roles.join(', ')}</BodyText>\n ) : null}\n </section>\n\n <section className=\"ca-review__block\">\n <Heading2>Departments</Heading2>\n <BodyText>\n {state.departmentRows.filter((r) => r.department).length} department row(s)\n configured\n </BodyText>\n </section>\n\n <section className=\"ca-review__block\">\n <Heading2>Priorities</Heading2>\n <BodyText>\n {state.priorities.length\n ? state.priorities.map((p) => p.name).join(', ')\n : 'No priorities added'}\n </BodyText>\n </section>\n\n <section className=\"ca-review__block\">\n <Heading2>Workflow</Heading2>\n <BodyText>\n {state.workflow.name\n ? `${state.workflow.name} (TAT: ${state.workflow.tatMinutes || '—'} min)`\n : 'No workflow created yet'}\n </BodyText>\n </section>\n\n <section className=\"ca-review__block ca-review__block--last\">\n <Heading2>Form Fields</Heading2>\n <BodyText>\n {state.formFields.length\n ? state.formFields.map((f) => f.name).join(', ')\n : 'No form fields added'}\n </BodyText>\n </section>\n\n <div className=\"ca-workflow__actions\">\n <Button onClick={onPublish}>Publish</Button>\n </div>\n </div>\n </SettingsCard>\n );\n}\n","import React, { useMemo, useCallback, useEffect } from 'react';\nimport { useNavigate, useParams, useSearchParams } from 'react-router-dom';\nimport { Heading1 } from '../components/atoms/Typography';\nimport Stepper from '../components/organisms/Stepper';\nimport { SettingsWizardProvider } from '../context/SettingsWizardContext';\nimport { SETTINGS_STEPS } from '../data/settingsSteps';\nimport CategoryTypeStep from '../components/organisms/settings-steps/CategoryTypeStep';\nimport DepartmentsStep from '../components/organisms/settings-steps/DepartmentsStep';\nimport PrioritiesStep from '../components/organisms/settings-steps/PrioritiesStep';\nimport WorkflowStep from '../components/organisms/settings-steps/WorkflowStep';\nimport FormFieldsStep from '../components/organisms/settings-steps/FormFieldsStep';\nimport ReviewPublishStep from '../components/organisms/settings-steps/ReviewPublishStep';\n\nfunction clampStep(value) {\n const n = Number(value);\n if (!Number.isFinite(n) || n < 1) return 1;\n if (n > SETTINGS_STEPS.length) return SETTINGS_STEPS.length;\n return Math.floor(n);\n}\n\nfunction clampSubstep(value) {\n const n = Number(value);\n if (!Number.isFinite(n) || n < 1) return 1;\n if (n > 3) return 3;\n return Math.floor(n);\n}\n\n/**\n * Complaint Management Settings wizard.\n * Step navigation is driven by URL search params: ?step=2&substep=1\n */\nexport default function ComplaintSettingsPage({\n title = 'Complaint Management Settings',\n onPublish,\n onStepChange,\n}) {\n const navigate = useNavigate();\n const { systemId } = useParams();\n const [searchParams, setSearchParams] = useSearchParams();\n\n const step = clampStep(searchParams.get('step') || 1);\n const substep = clampSubstep(searchParams.get('substep') || 1);\n\n // Keep URL in sync when step param is missing (e.g. /settings/qms → ?step=1)\n useEffect(() => {\n if (!searchParams.get('step')) {\n const params = new URLSearchParams(searchParams);\n params.set('step', '1');\n setSearchParams(params, { replace: true });\n }\n }, [searchParams, setSearchParams]);\n\n const stepMeta = useMemo(\n () => SETTINGS_STEPS.find((s) => s.id === step) || SETTINGS_STEPS[0],\n [step],\n );\n\n const setStep = useCallback(\n (nextStep, nextSubstep) => {\n const params = new URLSearchParams(searchParams);\n params.set('step', String(nextStep));\n if (nextStep === 4) {\n params.set('substep', String(nextSubstep ?? (nextStep === step ? substep : 1)));\n } else {\n params.delete('substep');\n }\n setSearchParams(params, { replace: false });\n onStepChange?.({ systemId, step: nextStep, substep: nextSubstep });\n },\n [searchParams, setSearchParams, onStepChange, systemId, step, substep],\n );\n\n const goNext = () => {\n if (step < SETTINGS_STEPS.length) {\n setStep(step + 1, 1);\n }\n };\n\n const handleSubstepChange = (next) => {\n setStep(4, next);\n };\n\n const handlePublish = () => {\n onPublish?.({ systemId, step });\n };\n\n return (\n <SettingsWizardProvider>\n <div className=\"ca-settings-page\">\n <Heading1>{title}</Heading1>\n\n <Stepper\n steps={SETTINGS_STEPS}\n currentStep={step}\n onStepClick={(id) => setStep(id, id === 4 ? 1 : undefined)}\n className=\"ca-settings-page__stepper\"\n />\n\n {step === 1 ? (\n <CategoryTypeStep onNext={goNext} stepMeta={stepMeta} />\n ) : null}\n {step === 2 ? (\n <DepartmentsStep onNext={goNext} stepMeta={stepMeta} />\n ) : null}\n {step === 3 ? (\n <PrioritiesStep onNext={goNext} stepMeta={stepMeta} />\n ) : null}\n {step === 4 ? (\n <WorkflowStep\n onNext={goNext}\n stepMeta={stepMeta}\n substep={substep}\n onSubstepChange={handleSubstepChange}\n />\n ) : null}\n {step === 5 ? (\n <FormFieldsStep onNext={goNext} stepMeta={stepMeta} />\n ) : null}\n {step === 6 ? (\n <ReviewPublishStep onPublish={handlePublish} stepMeta={stepMeta} />\n ) : null}\n\n <button\n type=\"button\"\n className=\"ca-back-link\"\n onClick={() => navigate('/')}\n >\n ← Back to Complaint Management\n </button>\n </div>\n </SettingsWizardProvider>\n );\n}\n","import React from 'react';\nimport { BrowserRouter, Routes, Route } from 'react-router-dom';\nimport { ApiProvider } from './context/ApiContext';\nimport { ThemeProvider, useTheme } from './context/ThemeContext';\nimport ComplaintManagementPage from './pages/ComplaintManagementPage';\nimport ComplaintSettingsPage from './pages/ComplaintSettingsPage';\nimport './styles/index.css';\n\nfunction ThemedShell({ children }) {\n const { cssVars, darkMode, mode } = useTheme();\n\n return (\n <div\n className={`ca-root ${darkMode ? 'ca-root--dark' : 'ca-root--light'}`}\n data-ca-theme={mode}\n style={cssVars}\n >\n {children}\n </div>\n );\n}\n\n/**\n * Root package component — mount inside the parent app.\n *\n * Theme & dark mode are parent-controlled:\n * <ComplaintApp theme={brandTheme} darkMode={parentIsDark} />\n */\nconst ComplaintApp = ({\n apiUrl,\n authToken,\n basePath = '/',\n theme,\n darkMode = false,\n title,\n description,\n systems,\n systemsEndpoint,\n useDemoData = true,\n createLabel,\n onCreateForm,\n onConfigure,\n onTitleClick,\n onDescriptionClick,\n onSearch,\n onPublish,\n onStepChange,\n children,\n}) => {\n const pageProps = {\n title,\n description,\n systems,\n systemsEndpoint,\n useDemoData,\n createLabel,\n onCreateForm,\n onConfigure,\n onTitleClick,\n onDescriptionClick,\n onSearch,\n };\n\n return (\n <ThemeProvider theme={theme} darkMode={darkMode}>\n <ThemedShell>\n <ApiProvider apiUrl={apiUrl} authToken={authToken}>\n <BrowserRouter basename={basePath}>\n <Routes>\n <Route\n path=\"/\"\n element={children ?? <ComplaintManagementPage {...pageProps} />}\n />\n <Route\n path=\"/settings/:systemId\"\n element={\n <ComplaintSettingsPage\n onPublish={onPublish}\n onStepChange={onStepChange}\n />\n }\n />\n <Route\n path=\"*\"\n element={children ?? <ComplaintManagementPage {...pageProps} />}\n />\n </Routes>\n </BrowserRouter>\n </ApiProvider>\n </ThemedShell>\n </ThemeProvider>\n );\n};\n\nexport default ComplaintApp;\n","import { lightTheme } from './defaultTheme';\n\n/** @deprecated Prefer `lightTheme` / `darkTheme` from `./defaultTheme`. */\nexport const colors = lightTheme.colors;\nexport const radii = lightTheme.radii;\nexport const spacing = lightTheme.spacing;\nexport const typography = lightTheme.typography;\n"],"names":["BASE_URL_VALUE","_documentCurrentScript","__vite_import_meta_env__","nodeProcess","setBaseUrl","url","instance","setAuthToken","token","Cookies","getAccessToken","axios","data","headers","accessToken","isRefreshing","refreshTokenPromise","response","error","originalRequest","refreshToken","refreshResponse","newToken","newRefreshToken","ApiContext","createContext","ApiProvider","children","apiUrl","authToken","useEffect","jsx","lightTheme","darkTheme","defaultThemeFile","isObject","value","deepMerge","base","override","result","key","next","normalizeThemeFile","themeProp","resolveActiveTheme","themeFile","darkMode","pack","COLOR_VAR_MAP","RADIUS_VAR_MAP","TYPE_VAR_MAP","SHADOW_VAR_MAP","themeToCssVars","theme","vars","cssVar","ThemeContext","ThemeProvider","useMemo","active","cssVars","useTheme","useContext","Button","variant","size","startIcon","endIcon","className","type","disabled","onClick","props","classes","jsxs","PlusIcon","color","VARIANT_CLASS","VARIANT_TAG","Typography","as","Tag","baseClass","Heading1","Heading2","BodyText","LabelText","ValueText","LinkText","PageHeader","title","description","actionLabel","onAction","StatusBadge","status","label","isActive","text","CardHeader","statusLabel","titleAsLink","onTitleClick","ChevronRightIcon","CardFooter","updatedOn","configureLabel","onConfigure","DataPoint","display","Divider","SystemCard","id","descriptionHref","departments","workflows","fields","formsFilled","onDescriptionClick","handleConfigure","handleDescription","stats","stat","index","React","SystemCardGrid","systems","emptyMessage","system","Input","onChange","placeholder","icon","inputClassName","SearchIcon","SearchBar","onSearch","handleKeyDown","e","Loading","fullScreen","DEMO_SYSTEMS","DEFAULT_PAGE_DESCRIPTION","normalizeSystems","list","item","ComplaintManagementPage","systemsProp","systemsEndpoint","useDemoData","createLabel","onCreateForm","navigate","useNavigate","search","setSearch","useState","fetchedSystems","setFetchedSystems","fetchError","setFetchError","fetchStatus","setFetchStatus","controller","api","payload","err","sourceSystems","filteredSystems","q","s","handleSearchChange","loading","Fragment","Stepper","steps","currentStep","onStepClick","step","stepId","isDone","clickable","SettingsWizardContext","initialState","SettingsWizardProvider","initialValues","state","setState","update","useCallback","patch","prev","updateWorkflow","useSettingsWizard","ctx","SETTINGS_STEPS","WORKFLOW_SUBSTEPS","QUICK_PRIORITIES","FIELD_LIBRARY","DEMO_ROLES","DEMO_CATEGORY_TYPES","DEMO_DEPARTMENTS_TREE","PRIORITY_COLORS","LayersIcon","SettingsCardHeader","nextLabel","onNext","showNext","nextDisabled","nextVariant","SettingsCard","footer","FieldLabel","hint","htmlFor","ChevronDownIcon","Select","options","opt","val","Textarea","maxLength","rows","FormField","FormInput","inputProps","FormSelect","selectProps","FormTextarea","textareaProps","computedHint","Toggle","checked","ariaLabel","ToggleField","CloseIcon","onRemove","RoleMultiSelect","openValue","setOpenValue","available","handleSelect","handleRemove","role","r","CategoryTypeStep","stepMeta","roles","DEPARTMENT_OPTIONS","newRow","DepartmentsStep","patchRow","addRow","row","Chip","Radio","name","DragHandleIcon","makePriority","PrioritiesStep","priorityDraft","priorities","defaultPriorityId","addPriority","trimmed","p","patchPriority","colorOptions","c","isPlaceholder","WorkflowStep","substep","onSubstepChange","selectedDeptNode","workflow","handleNextSubstep","dept","child","TrashIcon","FIELD_TYPE_OPTIONS","f","FieldLibraryIcon","map","FormFieldsStep","fieldDraft","formFields","setDraft","addField","typeLabel","o","patchField","removeField","applyLibraryType","field","required","ReviewPublishStep","onPublish","categoryLabel","clampStep","n","clampSubstep","ComplaintSettingsPage","onStepChange","systemId","useParams","searchParams","setSearchParams","useSearchParams","params","setStep","nextStep","nextSubstep","goNext","handleSubstepChange","handlePublish","ThemedShell","mode","ComplaintApp","basePath","pageProps","BrowserRouter","Routes","Route","colors","radii","spacing","typography"],"mappings":"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"}
@@ -0,0 +1,175 @@
1
+ import type { ReactNode, CSSProperties, ChangeEvent, KeyboardEvent, MouseEvent } from 'react';
2
+
3
+ export interface SystemItem {
4
+ id?: string | number;
5
+ title?: string;
6
+ name?: string;
7
+ status?: 'active' | 'inactive' | string;
8
+ statusLabel?: string;
9
+ description?: string;
10
+ descriptionHref?: string;
11
+ departments?: number;
12
+ workflows?: number;
13
+ fields?: number;
14
+ formsFilled?: number;
15
+ updatedOn?: string;
16
+ titleAsLink?: boolean;
17
+ [key: string]: unknown;
18
+ }
19
+
20
+ export interface ComplaintAppProps {
21
+ apiUrl?: string;
22
+ authToken?: string;
23
+ basePath?: string;
24
+ /** Static theme file `{ light, dark }` or flat token overrides. */
25
+ theme?: ThemeFile | ThemeTokens;
26
+ /** Parent-controlled dark mode. */
27
+ darkMode?: boolean;
28
+ title?: string;
29
+ description?: string;
30
+ systems?: SystemItem[];
31
+ systemsEndpoint?: string;
32
+ useDemoData?: boolean;
33
+ createLabel?: string;
34
+ onCreateForm?: () => void;
35
+ onConfigure?: (system: SystemItem) => void;
36
+ onTitleClick?: (system: Pick<SystemItem, 'id' | 'title'>) => void;
37
+ onDescriptionClick?: (payload: {
38
+ id?: string | number;
39
+ title?: string;
40
+ descriptionHref?: string;
41
+ }) => void;
42
+ onSearch?: (query: string) => void;
43
+ onPublish?: (payload: { systemId?: string; step?: number }) => void;
44
+ onStepChange?: (payload: {
45
+ systemId?: string;
46
+ step: number;
47
+ substep?: number;
48
+ }) => void;
49
+ children?: ReactNode;
50
+ }
51
+
52
+ export interface ThemeTokens {
53
+ mode?: 'light' | 'dark';
54
+ colors?: Record<string, string>;
55
+ radii?: Record<string, string>;
56
+ spacing?: Record<string, string>;
57
+ typography?: Record<string, string>;
58
+ shadow?: Record<string, string>;
59
+ }
60
+
61
+ export interface ThemeFile {
62
+ light?: ThemeTokens;
63
+ dark?: ThemeTokens;
64
+ }
65
+
66
+ export declare const lightTheme: ThemeTokens;
67
+ export declare const darkTheme: ThemeTokens;
68
+ export declare const defaultThemeFile: ThemeFile;
69
+ export declare function ThemeProvider(props: {
70
+ theme?: ThemeFile | ThemeTokens;
71
+ darkMode?: boolean;
72
+ children: ReactNode;
73
+ }): JSX.Element;
74
+ export declare function useTheme(): {
75
+ darkMode: boolean;
76
+ mode: 'light' | 'dark';
77
+ theme: ThemeTokens;
78
+ themeFile: ThemeFile;
79
+ cssVars: Record<string, string>;
80
+ };
81
+
82
+ export interface ApiProviderProps {
83
+ children: ReactNode;
84
+ apiUrl?: string;
85
+ authToken?: string | null;
86
+ }
87
+
88
+ export declare const ComplaintApp: (props: ComplaintAppProps) => JSX.Element;
89
+ export default ComplaintApp;
90
+
91
+ export declare const ApiProvider: (props: ApiProviderProps) => JSX.Element;
92
+ export declare function setBaseUrl(url: string): void;
93
+ export declare function setAuthToken(token: string | null): void;
94
+ export declare const api: import('axios').AxiosInstance;
95
+
96
+ export declare const DEMO_SYSTEMS: SystemItem[];
97
+ export declare const DEFAULT_PAGE_DESCRIPTION: string;
98
+
99
+ export declare const colors: Record<string, string>;
100
+ export declare const radii: Record<string, string>;
101
+ export declare const spacing: Record<string, string>;
102
+ export declare const typography: Record<string, CSSProperties | string>;
103
+
104
+ export declare function Button(props: {
105
+ children?: ReactNode;
106
+ variant?: 'primary' | 'secondary' | 'outline' | 'ghost' | 'link';
107
+ size?: 'md' | 'sm' | 'lg';
108
+ startIcon?: ReactNode;
109
+ endIcon?: ReactNode;
110
+ className?: string;
111
+ type?: 'button' | 'submit' | 'reset';
112
+ disabled?: boolean;
113
+ onClick?: (e: MouseEvent<HTMLButtonElement>) => void;
114
+ [key: string]: unknown;
115
+ }): JSX.Element;
116
+
117
+ export declare function Input(props: {
118
+ value?: string;
119
+ onChange?: (e: ChangeEvent<HTMLInputElement>) => void;
120
+ onKeyDown?: (e: KeyboardEvent<HTMLInputElement>) => void;
121
+ placeholder?: string;
122
+ type?: string;
123
+ icon?: ReactNode;
124
+ className?: string;
125
+ inputClassName?: string;
126
+ [key: string]: unknown;
127
+ }): JSX.Element;
128
+
129
+ export declare function StatusBadge(props: {
130
+ status?: string;
131
+ label?: string;
132
+ className?: string;
133
+ }): JSX.Element;
134
+
135
+ export declare function SearchBar(props: {
136
+ value?: string;
137
+ onChange?: (e: ChangeEvent<HTMLInputElement>) => void;
138
+ onSearch?: (value?: string) => void;
139
+ placeholder?: string;
140
+ className?: string;
141
+ }): JSX.Element;
142
+
143
+ export declare function SystemCard(props: SystemItem & {
144
+ onConfigure?: (system: SystemItem) => void;
145
+ onTitleClick?: (system: Pick<SystemItem, 'id' | 'title'>) => void;
146
+ onDescriptionClick?: (payload: {
147
+ id?: string | number;
148
+ title?: string;
149
+ descriptionHref?: string;
150
+ }) => void;
151
+ className?: string;
152
+ }): JSX.Element;
153
+
154
+ export declare function PageHeader(props: {
155
+ title?: string;
156
+ description?: string;
157
+ actionLabel?: string;
158
+ onAction?: () => void;
159
+ className?: string;
160
+ }): JSX.Element;
161
+
162
+ export declare function SystemCardGrid(props: {
163
+ systems?: SystemItem[];
164
+ onConfigure?: (system: SystemItem) => void;
165
+ onTitleClick?: (system: Pick<SystemItem, 'id' | 'title'>) => void;
166
+ onDescriptionClick?: (payload: {
167
+ id?: string | number;
168
+ title?: string;
169
+ descriptionHref?: string;
170
+ }) => void;
171
+ emptyMessage?: string;
172
+ className?: string;
173
+ }): JSX.Element;
174
+
175
+ export declare function ComplaintManagementPage(props: Omit<ComplaintAppProps, 'apiUrl' | 'authToken' | 'basePath' | 'children'>): JSX.Element;
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ .ca-root{--ca-primary: #2d64b8;--ca-primary-hover: #2557a3;--ca-text: #111827;--ca-text-secondary: #6b7280;--ca-text-muted: #9ca3af;--ca-border: #e5e7eb;--ca-border-light: #f3f4f6;--ca-bg: #f5f5f5;--ca-surface: #ffffff;--ca-white: #ffffff;--ca-on-primary: #ffffff;--ca-active-bg: #ecfdf5;--ca-active-border: #a7f3d0;--ca-active-text: #059669;--ca-inactive-bg: #f3f4f6;--ca-inactive-border: #d1d5db;--ca-inactive-text: #6b7280;--ca-link: #2d64b8;--ca-divider: #e5e7eb;--ca-accent-border: #c5d7f0;--ca-accent-bg: #eef4fb;--ca-step-done: #d6e4f7;--ca-success: #22c55e;--ca-danger: #ef4444;--ca-secondary-btn: #d1d5db;--ca-secondary-btn-hover: #c4c9d1;--ca-input-bg: #ffffff;--ca-table-head-bg: #eef4fb;--ca-sidebar-bg: #fafbfd;--ca-overlay: rgba(16, 24, 40, .06);--ca-radius-sm: 6px;--ca-radius-md: 8px;--ca-radius-lg: 12px;--ca-radius-xl: 16px;--ca-radius-pill: 999px;--ca-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--ca-h1-size: 28px;--ca-h2-size: 16px;--ca-body-size: 14px;--ca-label-size: 13px;--ca-value-size: 22px;--ca-small-size: 13px;--ca-shadow-card: 0 1px 2px rgba(16, 24, 40, .04);--ca-shadow-settings: 0 1px 3px rgba(16, 24, 40, .06);box-sizing:border-box;width:100%;min-height:100%;margin:0;padding:24px 28px 40px;font-family:var(--ca-font);color:var(--ca-text);background:var(--ca-bg);color-scheme:light;transition:background-color .2s ease,color .2s ease}.ca-root--dark{color-scheme:dark}.ca-root *,.ca-root *:before,.ca-root *:after{box-sizing:border-box}.ca-h1{margin:0;font-size:var(--ca-h1-size);font-weight:700;line-height:1.3;color:var(--ca-text)}.ca-h2{margin:0;font-size:var(--ca-h2-size);font-weight:700;line-height:1.4;color:var(--ca-text)}.ca-h2--link{color:var(--ca-link);text-decoration:underline;text-underline-offset:3px;cursor:pointer;background:none;border:none;padding:0;font:inherit;font-size:16px;font-weight:700}.ca-h2--link:hover{color:var(--ca-primary-hover)}.ca-body{margin:0;font-size:var(--ca-body-size);font-weight:400;line-height:1.5;color:var(--ca-text-secondary)}.ca-label{margin:0;font-size:var(--ca-label-size);font-weight:600;line-height:1.4;color:var(--ca-text)}.ca-value{margin:0;font-size:var(--ca-value-size);font-weight:700;line-height:1.2;color:var(--ca-text)}.ca-small{margin:0;font-size:var(--ca-small-size);font-weight:400;line-height:1.4;color:var(--ca-text-secondary)}.ca-link{margin:0;font-size:14px;font-weight:400;line-height:1.5;color:var(--ca-link);text-decoration:underline;text-underline-offset:2px;cursor:pointer;background:none;border:none;padding:0;font-family:inherit}.ca-link:hover{color:var(--ca-primary-hover)}.ca-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;margin:0;padding:10px 18px;border:none;border-radius:var(--ca-radius-md);font-family:inherit;font-size:14px;font-weight:600;line-height:1.2;cursor:pointer;transition:background-color .15s ease,opacity .15s ease;white-space:nowrap}.ca-btn:disabled{opacity:.55;cursor:not-allowed}.ca-btn--primary{background:var(--ca-primary);color:var(--ca-on-primary, var(--ca-white))}.ca-btn--primary:hover:not(:disabled){background:var(--ca-primary-hover)}.ca-btn--secondary{background:var(--ca-secondary-btn);color:var(--ca-text)}.ca-btn--secondary:hover:not(:disabled){background:var(--ca-secondary-btn-hover)}.ca-btn--outline{background:var(--ca-white);color:var(--ca-primary);border:1px solid var(--ca-accent-border)}.ca-btn--outline:hover:not(:disabled){background:var(--ca-accent-bg)}.ca-btn--ghost{background:transparent;color:var(--ca-text);border:1px solid var(--ca-border)}.ca-btn--link{background:transparent;color:var(--ca-primary);padding:8px 10px;box-shadow:none}.ca-btn--link:hover:not(:disabled){text-decoration:underline}.ca-btn--sm{padding:8px 14px;font-size:13px}.ca-btn--lg{padding:12px 28px;font-size:15px}.ca-btn__icon{display:inline-flex;align-items:center;line-height:0}.ca-input-wrap{position:relative;display:flex;align-items:center;width:100%}.ca-input-wrap__icon{position:absolute;left:14px;display:flex;align-items:center;color:var(--ca-text-muted);pointer-events:none}.ca-input{width:100%;margin:0;padding:12px 14px;border:1px solid var(--ca-border);border-radius:var(--ca-radius-md);background:var(--ca-input-bg);font-family:inherit;font-size:var(--ca-body-size);color:var(--ca-text);outline:none;transition:border-color .15s ease,box-shadow .15s ease}.ca-input--with-icon{padding-left:42px}.ca-input::placeholder{color:var(--ca-text-muted)}.ca-input:focus{border-color:var(--ca-primary);box-shadow:0 0 0 3px #2d64b81f}.ca-badge{display:inline-flex;align-items:center;padding:4px 12px;border:1px solid;border-radius:var(--ca-radius-sm);font-size:12px;font-weight:600;line-height:1.3;white-space:nowrap}.ca-badge--active{background:var(--ca-active-bg);border-color:var(--ca-active-border);color:var(--ca-active-text)}.ca-badge--inactive{background:var(--ca-inactive-bg);border-color:var(--ca-inactive-border);color:var(--ca-inactive-text)}.ca-divider{width:1px;align-self:stretch;background:var(--ca-divider);flex-shrink:0}.ca-data-point{display:flex;flex-direction:column;gap:6px;flex:1;min-width:0}.ca-search{width:100%;margin:0 0 24px}.ca-page-header{display:flex;align-items:flex-start;justify-content:space-between;gap:24px;margin-bottom:28px}.ca-page-header__text{display:flex;flex-direction:column;gap:8px;max-width:720px;min-width:0}.ca-page-header__actions{flex-shrink:0;padding-top:4px}.ca-system-card{display:flex;flex-direction:column;gap:14px;padding:20px 22px;background:var(--ca-surface);border:1px solid var(--ca-border);border-radius:var(--ca-radius-lg);box-shadow:var(--ca-shadow-card)}.ca-system-card__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.ca-system-card__title-wrap{min-width:0;flex:1}.ca-system-card__stats{display:flex;align-items:stretch;gap:0;padding:4px 0 8px}.ca-system-card__stats>.ca-data-point{padding:0 16px}.ca-system-card__stats>.ca-data-point:first-child{padding-left:0}.ca-system-card__stats>.ca-data-point:last-child{padding-right:0}.ca-system-card__footer{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:4px}.ca-system-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.ca-empty{grid-column:1 / -1;padding:48px 24px;text-align:center;color:var(--ca-text-secondary);background:var(--ca-surface);border:1px dashed var(--ca-border);border-radius:var(--ca-radius-lg)}.ca-loading{display:flex;align-items:center;justify-content:center;gap:10px;min-height:240px;color:var(--ca-text-secondary);font-size:14px}.ca-loading__spinner{width:22px;height:22px;border:2px solid var(--ca-border);border-top-color:var(--ca-primary);border-radius:50%;animation:ca-spin .7s linear infinite}@keyframes ca-spin{to{transform:rotate(360deg)}}@media(max-width:900px){.ca-system-grid{grid-template-columns:1fr}.ca-page-header{flex-direction:column;align-items:stretch}.ca-page-header__actions{align-self:flex-start}.ca-system-card__stats{flex-wrap:wrap;row-gap:16px}.ca-system-card__stats>.ca-data-point{flex:1 1 40%;padding:0 12px}.ca-divider{display:none}}@media(max-width:600px){.ca-root{padding:16px}.ca-h1{font-size:22px}.ca-system-card__footer{flex-direction:column;align-items:flex-start}}.ca-select{position:relative;width:100%}.ca-select__control{width:100%;appearance:none;margin:0;padding:12px 40px 12px 14px;border:1px solid var(--ca-border);border-radius:var(--ca-radius-md);background:var(--ca-input-bg);font-family:inherit;font-size:var(--ca-body-size);color:var(--ca-text);outline:none;cursor:pointer}.ca-select__control:focus{border-color:var(--ca-primary);box-shadow:0 0 0 3px #2d64b81f}.ca-select__chevron{position:absolute;right:12px;top:50%;transform:translateY(-50%);color:var(--ca-text-muted);pointer-events:none;display:flex}.ca-textarea{width:100%;margin:0;padding:12px 14px;border:1px solid var(--ca-border);border-radius:var(--ca-radius-md);background:var(--ca-input-bg);font-family:inherit;font-size:var(--ca-body-size);color:var(--ca-text);outline:none;resize:vertical;min-height:110px}.ca-textarea:focus{border-color:var(--ca-primary);box-shadow:0 0 0 3px #2d64b81f}.ca-textarea::placeholder{color:var(--ca-text-muted)}.ca-toggle{position:relative;width:44px;height:24px;padding:0;border:none;border-radius:var(--ca-radius-pill);background:var(--ca-secondary-btn);cursor:pointer;transition:background .15s ease;flex-shrink:0}.ca-toggle--on{background:var(--ca-success)}.ca-toggle__thumb{position:absolute;top:2px;left:2px;width:20px;height:20px;border-radius:50%;background:var(--ca-surface);box-shadow:0 1px 2px var(--ca-overlay);transition:transform .15s ease}.ca-toggle--on .ca-toggle__thumb{transform:translate(20px)}.ca-toggle-field{display:flex;align-items:center;gap:10px;padding-top:22px;flex-shrink:0}.ca-tag{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:var(--ca-radius-sm);background:var(--ca-inactive-bg);border:1px solid var(--ca-border);font-size:13px;color:var(--ca-text)}.ca-tag__remove{display:inline-flex;align-items:center;justify-content:center;margin:0;padding:0;border:none;background:transparent;color:var(--ca-text-muted);cursor:pointer}.ca-tag-list{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.ca-chip{display:inline-flex;align-items:center;padding:8px 14px;border-radius:var(--ca-radius-md);border:1px solid var(--ca-border);background:var(--ca-white);font-family:inherit;font-size:13px;font-weight:500;color:var(--ca-text);cursor:pointer}.ca-chip:hover{border-color:var(--ca-primary);color:var(--ca-primary)}.ca-chip-row{display:flex;flex-wrap:wrap;gap:10px;margin-top:12px}.ca-radio{display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.ca-radio__input{position:absolute;opacity:0;pointer-events:none}.ca-radio__mark{width:18px;height:18px;border-radius:50%;border:2px solid var(--ca-border);background:var(--ca-surface);position:relative}.ca-radio__input:checked+.ca-radio__mark{border-color:var(--ca-primary)}.ca-radio__input:checked+.ca-radio__mark:after{content:"";position:absolute;inset:3px;border-radius:50%;background:var(--ca-primary)}.ca-field-label{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:8px}.ca-field-label__hint{font-size:12px;color:var(--ca-text-muted)}.ca-form-field,.ca-role-select{width:100%}.ca-stepper{display:flex;align-items:flex-start;justify-content:space-between;gap:0;width:100%;margin:28px 0 32px}.ca-stepper__item{display:flex;flex-direction:column;align-items:center;gap:8px;min-width:72px;padding:0;border:none;background:transparent;cursor:pointer;font-family:inherit}.ca-stepper__item:disabled{cursor:default}.ca-stepper__circle{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:50%;background:var(--ca-inactive-bg);color:var(--ca-text);font-size:13px;font-weight:700}.ca-stepper__label{font-size:13px;font-weight:500;color:var(--ca-text);text-align:center;white-space:nowrap}.ca-stepper__item--active .ca-stepper__circle{background:var(--ca-primary);color:#fff}.ca-stepper__item--active .ca-stepper__label{color:var(--ca-primary);font-weight:700}.ca-stepper__item--done .ca-stepper__circle{background:var(--ca-step-done);color:var(--ca-primary)}.ca-stepper__item--done .ca-stepper__label{color:var(--ca-primary)}.ca-stepper__line{flex:1;height:2px;margin-top:15px;background:var(--ca-border);min-width:12px}.ca-stepper__line--active{background:var(--ca-primary)}.ca-stepper--sm{margin:0 0 24px}.ca-stepper--sm .ca-stepper__circle{width:26px;height:26px;font-size:12px}.ca-stepper--sm .ca-stepper__label{font-size:12px}.ca-stepper--sm .ca-stepper__line{margin-top:12px}.ca-settings-page{width:100%}.ca-settings-page__stepper{overflow-x:auto;padding-bottom:4px}.ca-settings-card{background:var(--ca-surface);border:1px solid var(--ca-accent-border);border-radius:var(--ca-radius-xl);box-shadow:var(--ca-shadow-settings);padding:22px 24px 28px}.ca-settings-card__header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.ca-settings-card__heading{display:flex;align-items:flex-start;gap:12px}.ca-settings-card__desc{margin-top:4px}.ca-settings-card__divider{height:0;border:none;border-top:1px dashed var(--ca-accent-border);margin:18px 0 20px}.ca-settings-card__body{display:flex;flex-direction:column}.ca-settings-card__footer{display:flex;justify-content:center;margin-top:28px}.ca-step-section{padding-bottom:20px;margin-bottom:20px;border-bottom:1px dashed var(--ca-accent-border)}.ca-step-section--last{border-bottom:none;margin-bottom:0;padding-bottom:0}.ca-step-row{display:flex;align-items:flex-start;gap:16px}.ca-step-row__grow{flex:1;min-width:0}.ca-step-row--category{align-items:flex-start}.ca-back-link{display:inline-flex;margin-top:20px;padding:0;border:none;background:transparent;color:var(--ca-primary);font-family:inherit;font-size:14px;cursor:pointer}.ca-back-link:hover{text-decoration:underline}.ca-dept-table{border:1px solid var(--ca-accent-border);border-radius:12px;overflow:hidden}.ca-dept-table__head,.ca-dept-table__row{display:grid;grid-template-columns:1.2fr 1.2fr 1.2fr auto;gap:12px;align-items:center;padding:12px 14px}.ca-dept-table__head{background:var(--ca-table-head-bg);font-size:13px;font-weight:600;color:var(--ca-text)}.ca-dept-table__row{border-top:1px solid var(--ca-border);background:var(--ca-surface)}.ca-input-with-action{position:relative}.ca-input-with-action .ca-input{padding-right:36px}.ca-input-with-action__btn{position:absolute;right:8px;top:50%;transform:translateY(-50%);display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;color:var(--ca-primary);cursor:pointer;padding:0}.ca-priority-add{margin-bottom:20px}.ca-priority-add__row{display:flex;gap:12px;align-items:center}.ca-priority-add__row .ca-input-wrap{flex:1}.ca-priority-table{border:1px solid var(--ca-accent-border);border-radius:12px;overflow:hidden}.ca-priority-table__head,.ca-priority-table__row{display:grid;grid-template-columns:1.6fr 1fr 80px;gap:12px;align-items:center;padding:12px 14px}.ca-priority-table__head{background:var(--ca-table-head-bg);font-size:13px;font-weight:600}.ca-priority-table__row{border-top:1px solid var(--ca-border)}.ca-priority-table__name{display:flex;align-items:center;gap:10px}.ca-workflow{display:grid;grid-template-columns:260px 1fr;gap:20px;min-height:360px}.ca-workflow__sidebar{border:1px solid var(--ca-accent-border);border-radius:12px;padding:16px;background:var(--ca-sidebar-bg)}.ca-workflow__sidebar-title{margin:0 0 4px;font-size:15px;font-weight:700}.ca-dept-tree{list-style:none;margin:16px 0 0;padding:0;display:flex;flex-direction:column;gap:8px}.ca-dept-tree__children{list-style:none;margin:6px 0 0;padding:0 0 0 8px;display:flex;flex-direction:column;gap:6px}.ca-dept-tree__item{width:100%;text-align:left;padding:10px 12px;border:1px solid transparent;border-radius:8px;background:transparent;font-family:inherit;font-size:14px;font-weight:600;color:var(--ca-text);cursor:pointer}.ca-dept-tree__item--child{font-weight:500}.ca-dept-tree__item--active{background:var(--ca-accent-bg);border-color:var(--ca-primary);color:var(--ca-primary)}.ca-dept-tree__branch{margin-right:6px;color:var(--ca-text-muted)}.ca-workflow__main{border:1px solid var(--ca-accent-border);border-radius:12px;padding:18px 20px 24px}.ca-workflow__form{display:flex;flex-direction:column;gap:16px}.ca-workflow__placeholder{padding:24px 0}.ca-workflow__actions{display:flex;justify-content:center;margin-top:28px}.ca-form-fields{display:grid;grid-template-columns:260px 1fr;gap:20px}.ca-field-lib{border:1px solid var(--ca-accent-border);border-radius:12px;padding:16px;background:var(--ca-sidebar-bg)}.ca-field-lib__title{margin:0 0 4px;font-size:15px;font-weight:700}.ca-field-lib__list{list-style:none;margin:14px 0 0;padding:0;display:flex;flex-direction:column;gap:8px}.ca-field-lib__item{display:flex;align-items:center;gap:10px;width:100%;padding:10px 12px;border:1px solid var(--ca-border);border-radius:8px;background:var(--ca-surface);font-family:inherit;font-size:13px;color:var(--ca-text);cursor:grab;text-align:left}.ca-field-lib__item:hover{border-color:var(--ca-primary)}.ca-field-lib__glyph{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:4px;background:var(--ca-accent-bg);color:var(--ca-primary);font-size:12px;font-weight:700;flex-shrink:0}.ca-add-fields{border:1px solid var(--ca-accent-border);border-radius:12px;padding:16px;margin-bottom:16px}.ca-add-fields__top{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}.ca-add-fields__title{margin:0;font-size:15px;font-weight:700}.ca-fields-table{border:1px solid var(--ca-accent-border);border-radius:12px;overflow:hidden}.ca-fields-table__head,.ca-fields-table__row{display:grid;grid-template-columns:1.4fr 1.2fr 90px 40px;gap:12px;align-items:center;padding:12px 14px}.ca-fields-table__head{background:var(--ca-table-head-bg);font-size:13px;font-weight:600}.ca-fields-table__row{border-top:1px solid var(--ca-border)}.ca-fields-table__name{display:flex;align-items:center;gap:10px}.ca-fields-table__empty{padding:24px;text-align:center}.ca-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:transparent;cursor:pointer;border-radius:6px}.ca-icon-btn:hover{background:var(--ca-inactive-bg)}.ca-review{display:flex;flex-direction:column;gap:0}.ca-review__block{padding:16px 0;border-bottom:1px dashed var(--ca-accent-border);display:flex;flex-direction:column;gap:8px}.ca-review__block--last{border-bottom:none}.ca-review__row{display:flex;align-items:center;gap:12px}@media(max-width:1000px){.ca-workflow,.ca-form-fields{grid-template-columns:1fr}.ca-stepper__label{font-size:11px;white-space:normal;max-width:72px}.ca-dept-table__head,.ca-dept-table__row,.ca-priority-table__head,.ca-priority-table__row,.ca-fields-table__head,.ca-fields-table__row{grid-template-columns:1fr}.ca-step-row{flex-direction:column}.ca-toggle-field{padding-top:0}}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@attabot/complaint-app",
3
+ "version": "1.0.0",
4
+ "description": "Complaint Management UI package — atomic React components that run on the parent app's auth and API",
5
+ "type": "module",
6
+ "main": "./dist/complaint-app.umd.js",
7
+ "module": "./dist/complaint-app.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/complaint-app.js",
13
+ "require": "./dist/complaint-app.umd.js"
14
+ },
15
+ "./style.css": "./dist/style.css"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "README.md"
20
+ ],
21
+ "scripts": {
22
+ "dev": "vite",
23
+ "build": "vite build",
24
+ "lint": "eslint .",
25
+ "preview": "vite preview"
26
+ },
27
+ "keywords": [
28
+ "react",
29
+ "complaint",
30
+ "component",
31
+ "library",
32
+ "atomic-design"
33
+ ],
34
+ "author": "",
35
+ "license": "MIT",
36
+ "peerDependencies": {
37
+ "react": "^18.0.0 || ^19.0.0",
38
+ "react-dom": "^18.0.0 || ^19.0.0"
39
+ },
40
+ "dependencies": {
41
+ "axios": "^1.13.2",
42
+ "js-cookie": "^3.0.5",
43
+ "react-router-dom": "^6.30.2"
44
+ },
45
+ "devDependencies": {
46
+ "@eslint/js": "^9.39.1",
47
+ "@types/react": "^19.2.5",
48
+ "@types/react-dom": "^19.2.3",
49
+ "@vitejs/plugin-react": "^5.1.1",
50
+ "eslint": "^9.39.1",
51
+ "eslint-plugin-react-hooks": "^7.0.1",
52
+ "eslint-plugin-react-refresh": "^0.4.24",
53
+ "globals": "^16.5.0",
54
+ "prettier": "^3.7.4",
55
+ "react": "^19.0.0",
56
+ "react-dom": "^19.0.0",
57
+ "typescript": "^7.0.2",
58
+ "vite": "^7.2.4"
59
+ }
60
+ }