@attabot/complaint-app 1.0.2 → 1.0.4

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.
package/dist/index.d.ts CHANGED
@@ -1,211 +1,214 @@
1
- import type { ReactNode, CSSProperties, ChangeEvent, KeyboardEvent, MouseEvent } from 'react';
2
- import type { EnhancedStore } from '@reduxjs/toolkit';
3
-
4
- export interface SystemItem {
5
- id?: string | number;
6
- title?: string;
7
- name?: string;
8
- status?: 'active' | 'inactive' | string;
9
- statusLabel?: string;
10
- description?: string;
11
- descriptionHref?: string;
12
- departments?: number;
13
- workflows?: number;
14
- fields?: number;
15
- formsFilled?: number;
16
- updatedOn?: string;
17
- titleAsLink?: boolean;
18
- [key: string]: unknown;
19
- }
20
-
21
- export interface ComplaintAppProps {
22
- apiUrl?: string;
23
- authToken?: string;
24
- /** Optional host-owned Redux store. Defaults to the package complaint store. */
25
- store?: EnhancedStore;
26
- basePath?: string;
27
- /** Static theme file `{ light, dark }` or flat token overrides. */
28
- theme?: ThemeFile | ThemeTokens;
29
- /** Parent-controlled dark mode. */
30
- darkMode?: boolean;
31
- title?: string;
32
- description?: string;
33
- systems?: SystemItem[];
34
- systemsEndpoint?: string;
35
- useDemoData?: boolean;
36
- createLabel?: string;
37
- onCreateForm?: () => void;
38
- onConfigure?: (system: SystemItem) => void;
39
- onTitleClick?: (system: Pick<SystemItem, 'id' | 'title'>) => void;
40
- onDescriptionClick?: (payload: {
41
- id?: string | number;
42
- title?: string;
43
- descriptionHref?: string;
44
- }) => void;
45
- onSearch?: (query: string) => void;
46
- onPublish?: (payload: { systemId?: string; step?: number }) => void;
47
- onStepChange?: (payload: {
48
- systemId?: string;
49
- step: number;
50
- substep?: number;
51
- }) => void;
52
- children?: ReactNode;
53
- }
54
-
55
- export interface ThemeTokens {
56
- mode?: 'light' | 'dark';
57
- colors?: Record<string, string>;
58
- radii?: Record<string, string>;
59
- spacing?: Record<string, string>;
60
- typography?: Record<string, string>;
61
- shadow?: Record<string, string>;
62
- }
63
-
64
- export interface ThemeFile {
65
- light?: ThemeTokens;
66
- dark?: ThemeTokens;
67
- }
68
-
69
- export declare const lightTheme: ThemeTokens;
70
- export declare const darkTheme: ThemeTokens;
71
- export declare const defaultThemeFile: ThemeFile;
72
- export declare function ThemeProvider(props: {
73
- theme?: ThemeFile | ThemeTokens;
74
- darkMode?: boolean;
75
- children: ReactNode;
76
- }): JSX.Element;
77
- export declare function useTheme(): {
78
- darkMode: boolean;
79
- mode: 'light' | 'dark';
80
- theme: ThemeTokens;
81
- themeFile: ThemeFile;
82
- cssVars: Record<string, string>;
83
- };
84
-
85
- export interface ApiProviderProps {
86
- children: ReactNode;
87
- apiUrl?: string;
88
- authToken?: string | null;
89
- }
90
-
91
- export declare const ComplaintApp: (props: ComplaintAppProps) => JSX.Element;
92
- export default ComplaintApp;
93
-
94
- export declare const ApiProvider: (props: ApiProviderProps) => JSX.Element;
95
- export declare function setBaseUrl(url: string): void;
96
- export declare function setAuthToken(token: string | null): void;
97
- export declare const api: import('axios').AxiosInstance;
98
- export declare const store: EnhancedStore;
99
- export declare function createComplaintStore(preloadedState?: unknown): EnhancedStore;
100
-
101
- export interface ComplaintResourceState<T = Record<string, unknown>> {
102
- data: T[];
103
- selected: T | null;
104
- pagination: Record<string, unknown> | null;
105
- isLoading: boolean;
106
- isMutating: boolean;
107
- error: string | null;
108
- }
109
-
110
- export interface ComplaintReduxState {
111
- complaintAppComplaint: {
112
- types: ComplaintResourceState;
113
- departments: ComplaintResourceState;
114
- priorities: ComplaintResourceState;
115
- workflows: ComplaintResourceState;
116
- statuses: ComplaintResourceState;
117
- departmentTree: Record<string, unknown>[];
118
- workflowSteps: Record<string, unknown>;
119
- isLoadingDepartmentTree: boolean;
120
- isLoadingWorkflowSteps: boolean;
121
- error: string | null;
122
- };
123
- }
124
-
125
- export declare const COMPLAINT_ENDPOINTS: Readonly<Record<string, string>>;
126
- export declare const complaintTypeActions: Record<string, unknown>;
127
- export declare const complaintDepartmentActions: Record<string, unknown>;
128
- export declare const complaintPriorityActions: Record<string, unknown>;
129
- export declare const complaintWorkflowActions: Record<string, unknown>;
130
- export declare const complaintStatusActions: Record<string, unknown>;
131
-
132
- export declare const DEMO_SYSTEMS: SystemItem[];
133
- export declare const DEFAULT_PAGE_DESCRIPTION: string;
134
-
135
- export declare const colors: Record<string, string>;
136
- export declare const radii: Record<string, string>;
137
- export declare const spacing: Record<string, string>;
138
- export declare const typography: Record<string, CSSProperties | string>;
139
-
140
- export declare function Button(props: {
141
- children?: ReactNode;
142
- variant?: 'primary' | 'secondary' | 'outline' | 'ghost' | 'link';
143
- size?: 'md' | 'sm' | 'lg';
144
- startIcon?: ReactNode;
145
- endIcon?: ReactNode;
146
- className?: string;
147
- type?: 'button' | 'submit' | 'reset';
148
- disabled?: boolean;
149
- onClick?: (e: MouseEvent<HTMLButtonElement>) => void;
150
- [key: string]: unknown;
151
- }): JSX.Element;
152
-
153
- export declare function Input(props: {
154
- value?: string;
155
- onChange?: (e: ChangeEvent<HTMLInputElement>) => void;
156
- onKeyDown?: (e: KeyboardEvent<HTMLInputElement>) => void;
157
- placeholder?: string;
158
- type?: string;
159
- icon?: ReactNode;
160
- className?: string;
161
- inputClassName?: string;
162
- [key: string]: unknown;
163
- }): JSX.Element;
164
-
165
- export declare function StatusBadge(props: {
166
- status?: string;
167
- label?: string;
168
- className?: string;
169
- }): JSX.Element;
170
-
171
- export declare function SearchBar(props: {
172
- value?: string;
173
- onChange?: (e: ChangeEvent<HTMLInputElement>) => void;
174
- onSearch?: (value?: string) => void;
175
- placeholder?: string;
176
- className?: string;
177
- }): JSX.Element;
178
-
179
- export declare function SystemCard(props: SystemItem & {
180
- onConfigure?: (system: SystemItem) => void;
181
- onTitleClick?: (system: Pick<SystemItem, 'id' | 'title'>) => void;
182
- onDescriptionClick?: (payload: {
183
- id?: string | number;
184
- title?: string;
185
- descriptionHref?: string;
186
- }) => void;
187
- className?: string;
188
- }): JSX.Element;
189
-
190
- export declare function PageHeader(props: {
191
- title?: string;
192
- description?: string;
193
- actionLabel?: string;
194
- onAction?: () => void;
195
- className?: string;
196
- }): JSX.Element;
197
-
198
- export declare function SystemCardGrid(props: {
199
- systems?: SystemItem[];
200
- onConfigure?: (system: SystemItem) => void;
201
- onTitleClick?: (system: Pick<SystemItem, 'id' | 'title'>) => void;
202
- onDescriptionClick?: (payload: {
203
- id?: string | number;
204
- title?: string;
205
- descriptionHref?: string;
206
- }) => void;
207
- emptyMessage?: string;
208
- className?: string;
209
- }): JSX.Element;
210
-
211
- export declare function ComplaintManagementPage(props: Omit<ComplaintAppProps, 'apiUrl' | 'authToken' | 'basePath' | 'children'>): JSX.Element;
1
+ import type { ReactNode, CSSProperties, ChangeEvent, KeyboardEvent, MouseEvent } from 'react';
2
+ import type { EnhancedStore } from '@reduxjs/toolkit';
3
+
4
+ export interface SystemItem {
5
+ id?: string | number;
6
+ title?: string;
7
+ name?: string;
8
+ status?: 'active' | 'inactive' | string;
9
+ statusLabel?: string;
10
+ description?: string;
11
+ descriptionHref?: string;
12
+ departments?: number;
13
+ workflows?: number;
14
+ fields?: number;
15
+ formsFilled?: number;
16
+ updatedOn?: string;
17
+ titleAsLink?: boolean;
18
+ [key: string]: unknown;
19
+ }
20
+
21
+ export interface ComplaintAppProps {
22
+ apiUrl?: string;
23
+ authToken?: string;
24
+ /** Optional isolated Redux store. When omitted, the package reuses a parent Provider, or creates its standalone store if none exists. */
25
+ store?: EnhancedStore;
26
+ basePath?: string;
27
+ /** Static theme file `{ light, dark }` or flat token overrides. */
28
+ theme?: ThemeFile | ThemeTokens;
29
+ /** Parent-controlled dark mode. */
30
+ darkMode?: boolean;
31
+ title?: string;
32
+ description?: string;
33
+ systems?: SystemItem[];
34
+ systemsEndpoint?: string;
35
+ useDemoData?: boolean;
36
+ createLabel?: string;
37
+ onCreateForm?: () => void;
38
+ onConfigure?: (system: SystemItem) => void;
39
+ onOpen?: (system: Pick<SystemItem, 'id' | 'title'>) => void;
40
+ onTitleClick?: (system: Pick<SystemItem, 'id' | 'title'>) => void;
41
+ onDescriptionClick?: (payload: {
42
+ id?: string | number;
43
+ title?: string;
44
+ descriptionHref?: string;
45
+ }) => void;
46
+ onSearch?: (query: string) => void;
47
+ onPublish?: (payload: { systemId?: string; step?: number }) => void;
48
+ onStepChange?: (payload: {
49
+ systemId?: string;
50
+ step: number;
51
+ substep?: number;
52
+ }) => void;
53
+ children?: ReactNode;
54
+ }
55
+
56
+ export interface ThemeTokens {
57
+ mode?: 'light' | 'dark';
58
+ colors?: Record<string, string>;
59
+ radii?: Record<string, string>;
60
+ spacing?: Record<string, string>;
61
+ typography?: Record<string, string>;
62
+ shadow?: Record<string, string>;
63
+ }
64
+
65
+ export interface ThemeFile {
66
+ light?: ThemeTokens;
67
+ dark?: ThemeTokens;
68
+ }
69
+
70
+ export declare const lightTheme: ThemeTokens;
71
+ export declare const darkTheme: ThemeTokens;
72
+ export declare const defaultThemeFile: ThemeFile;
73
+ export declare function ThemeProvider(props: {
74
+ theme?: ThemeFile | ThemeTokens;
75
+ darkMode?: boolean;
76
+ children: ReactNode;
77
+ }): JSX.Element;
78
+ export declare function useTheme(): {
79
+ darkMode: boolean;
80
+ mode: 'light' | 'dark';
81
+ theme: ThemeTokens;
82
+ themeFile: ThemeFile;
83
+ cssVars: Record<string, string>;
84
+ };
85
+
86
+ export interface ApiProviderProps {
87
+ children: ReactNode;
88
+ apiUrl?: string;
89
+ authToken?: string | null;
90
+ }
91
+
92
+ export declare const ComplaintApp: (props: ComplaintAppProps) => JSX.Element;
93
+ export default ComplaintApp;
94
+
95
+ export declare const ApiProvider: (props: ApiProviderProps) => JSX.Element;
96
+ export declare function setBaseUrl(url: string): void;
97
+ export declare function setAuthToken(token: string | null): void;
98
+ export declare const api: import('axios').AxiosInstance;
99
+ export declare const store: EnhancedStore;
100
+ export declare function createComplaintStore(preloadedState?: unknown): EnhancedStore;
101
+
102
+ export interface ComplaintResourceState<T = Record<string, unknown>> {
103
+ data: T[];
104
+ selected: T | null;
105
+ pagination: Record<string, unknown> | null;
106
+ isLoading: boolean;
107
+ isMutating: boolean;
108
+ error: string | null;
109
+ }
110
+
111
+ export interface ComplaintReduxState {
112
+ complaintAppComplaint: {
113
+ types: ComplaintResourceState;
114
+ departments: ComplaintResourceState;
115
+ priorities: ComplaintResourceState;
116
+ workflows: ComplaintResourceState;
117
+ statuses: ComplaintResourceState;
118
+ departmentTree: Record<string, unknown>[];
119
+ workflowSteps: Record<string, unknown>;
120
+ isLoadingDepartmentTree: boolean;
121
+ isLoadingWorkflowSteps: boolean;
122
+ error: string | null;
123
+ };
124
+ }
125
+
126
+ export declare const COMPLAINT_ENDPOINTS: Readonly<Record<string, string>>;
127
+ export declare const complaintTypeActions: Record<string, unknown>;
128
+ export declare const complaintDepartmentActions: Record<string, unknown>;
129
+ export declare const complaintPriorityActions: Record<string, unknown>;
130
+ export declare const complaintWorkflowActions: Record<string, unknown>;
131
+ export declare const complaintStatusActions: Record<string, unknown>;
132
+
133
+ export declare const DEMO_SYSTEMS: SystemItem[];
134
+ export declare const DEFAULT_PAGE_DESCRIPTION: string;
135
+
136
+ export declare const colors: Record<string, string>;
137
+ export declare const radii: Record<string, string>;
138
+ export declare const spacing: Record<string, string>;
139
+ export declare const typography: Record<string, CSSProperties | string>;
140
+
141
+ export declare function Button(props: {
142
+ children?: ReactNode;
143
+ variant?: 'primary' | 'secondary' | 'outline' | 'ghost' | 'link';
144
+ size?: 'md' | 'sm' | 'lg';
145
+ startIcon?: ReactNode;
146
+ endIcon?: ReactNode;
147
+ className?: string;
148
+ type?: 'button' | 'submit' | 'reset';
149
+ disabled?: boolean;
150
+ onClick?: (e: MouseEvent<HTMLButtonElement>) => void;
151
+ [key: string]: unknown;
152
+ }): JSX.Element;
153
+
154
+ export declare function Input(props: {
155
+ value?: string;
156
+ onChange?: (e: ChangeEvent<HTMLInputElement>) => void;
157
+ onKeyDown?: (e: KeyboardEvent<HTMLInputElement>) => void;
158
+ placeholder?: string;
159
+ type?: string;
160
+ icon?: ReactNode;
161
+ className?: string;
162
+ inputClassName?: string;
163
+ [key: string]: unknown;
164
+ }): JSX.Element;
165
+
166
+ export declare function StatusBadge(props: {
167
+ status?: string;
168
+ label?: string;
169
+ className?: string;
170
+ }): JSX.Element;
171
+
172
+ export declare function SearchBar(props: {
173
+ value?: string;
174
+ onChange?: (e: ChangeEvent<HTMLInputElement>) => void;
175
+ onSearch?: (value?: string) => void;
176
+ placeholder?: string;
177
+ className?: string;
178
+ }): JSX.Element;
179
+
180
+ export declare function SystemCard(props: SystemItem & {
181
+ onConfigure?: (system: SystemItem) => void;
182
+ onOpen?: (system: Pick<SystemItem, 'id' | 'title'>) => void;
183
+ onTitleClick?: (system: Pick<SystemItem, 'id' | 'title'>) => void;
184
+ onDescriptionClick?: (payload: {
185
+ id?: string | number;
186
+ title?: string;
187
+ descriptionHref?: string;
188
+ }) => void;
189
+ className?: string;
190
+ }): JSX.Element;
191
+
192
+ export declare function PageHeader(props: {
193
+ title?: string;
194
+ description?: string;
195
+ actionLabel?: string;
196
+ onAction?: () => void;
197
+ className?: string;
198
+ }): JSX.Element;
199
+
200
+ export declare function SystemCardGrid(props: {
201
+ systems?: SystemItem[];
202
+ onConfigure?: (system: SystemItem) => void;
203
+ onOpen?: (system: Pick<SystemItem, 'id' | 'title'>) => void;
204
+ onTitleClick?: (system: Pick<SystemItem, 'id' | 'title'>) => void;
205
+ onDescriptionClick?: (payload: {
206
+ id?: string | number;
207
+ title?: string;
208
+ descriptionHref?: string;
209
+ }) => void;
210
+ emptyMessage?: string;
211
+ className?: string;
212
+ }): JSX.Element;
213
+
214
+ export declare function ComplaintManagementPage(props: Omit<ComplaintAppProps, 'apiUrl' | 'authToken' | 'basePath' | 'children'>): JSX.Element;
package/dist/style.css CHANGED
@@ -1 +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}}
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 CHANGED
@@ -1,64 +1,65 @@
1
- {
2
- "name": "@attabot/complaint-app",
3
- "version": "1.0.2",
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
- "@reduxjs/toolkit": ">=1.9",
38
- "react": "^18.0.0 || ^19.0.0",
39
- "react-dom": "^18.0.0 || ^19.0.0",
40
- "react-redux": ">=8"
41
- },
42
- "dependencies": {
43
- "axios": "^1.13.2",
44
- "js-cookie": "^3.0.5",
45
- "react-router-dom": "^6.30.2"
46
- },
47
- "devDependencies": {
48
- "@reduxjs/toolkit": "^2.8.2",
49
- "@eslint/js": "^9.39.1",
50
- "@types/react": "^19.2.5",
51
- "@types/react-dom": "^19.2.3",
52
- "@vitejs/plugin-react": "^5.1.1",
53
- "eslint": "^9.39.1",
54
- "eslint-plugin-react-hooks": "^7.0.1",
55
- "eslint-plugin-react-refresh": "^0.4.24",
56
- "globals": "^16.5.0",
57
- "prettier": "^3.7.4",
58
- "react": "^19.0.0",
59
- "react-dom": "^19.0.0",
60
- "react-redux": "^9.2.0",
61
- "typescript": "^7.0.2",
62
- "vite": "^7.2.4"
63
- }
64
- }
1
+ {
2
+ "name": "@attabot/complaint-app",
3
+ "version": "1.0.4",
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
+ "@reduxjs/toolkit": ">=1.9",
38
+ "react": "^18.0.0 || ^19.0.0",
39
+ "react-dom": "^18.0.0 || ^19.0.0",
40
+ "react-redux": ">=8"
41
+ },
42
+ "dependencies": {
43
+ "axios": "^1.13.2",
44
+ "js-cookie": "^3.0.5",
45
+ "lucide-react": "^1.32.0",
46
+ "react-router-dom": "^6.30.2"
47
+ },
48
+ "devDependencies": {
49
+ "@eslint/js": "^9.39.1",
50
+ "@reduxjs/toolkit": "^2.8.2",
51
+ "@types/react": "^19.2.5",
52
+ "@types/react-dom": "^19.2.3",
53
+ "@vitejs/plugin-react": "^5.1.1",
54
+ "eslint": "^9.39.1",
55
+ "eslint-plugin-react-hooks": "^7.0.1",
56
+ "eslint-plugin-react-refresh": "^0.4.24",
57
+ "globals": "^16.5.0",
58
+ "prettier": "^3.7.4",
59
+ "react": "^19.0.0",
60
+ "react-dom": "^19.0.0",
61
+ "react-redux": "^9.2.0",
62
+ "typescript": "^7.0.2",
63
+ "vite": "^7.2.4"
64
+ }
65
+ }