@crownpeak/dqm-react-component 1.0.1 → 1.2.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.
Files changed (178) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +125 -23
  3. package/dist/DQMSidebar.d.ts.map +1 -1
  4. package/dist/ErrorBoundary.d.ts.map +1 -1
  5. package/dist/__tests__/setup.d.ts +1 -0
  6. package/dist/__tests__/setup.d.ts.map +1 -0
  7. package/dist/__tests__/utils.d.ts +145 -0
  8. package/dist/__tests__/utils.d.ts.map +1 -0
  9. package/dist/auth-ui/assets/index-YKFZYENy.js +158 -0
  10. package/dist/auth-ui/index.html +1 -1
  11. package/dist/components/auth/DQMLogin.d.ts.map +1 -1
  12. package/dist/components/auth/index.d.ts +0 -1
  13. package/dist/components/auth/index.d.ts.map +1 -1
  14. package/dist/components/cards/AISummaryCard.d.ts +2 -0
  15. package/dist/components/cards/AISummaryCard.d.ts.map +1 -0
  16. package/dist/components/cards/index.d.ts +1 -0
  17. package/dist/components/cards/index.d.ts.map +1 -1
  18. package/dist/components/common/LanguageSwitch.d.ts +5 -0
  19. package/dist/components/common/LanguageSwitch.d.ts.map +1 -0
  20. package/dist/components/common/LanguageSwitchBase.d.ts +16 -0
  21. package/dist/components/common/LanguageSwitchBase.d.ts.map +1 -0
  22. package/dist/components/common/index.d.ts +1 -0
  23. package/dist/components/common/index.d.ts.map +1 -1
  24. package/dist/components/modals/AISettingsDialog.d.ts +61 -0
  25. package/dist/components/modals/AISettingsDialog.d.ts.map +1 -0
  26. package/dist/components/modals/HighlightModal.d.ts +45 -0
  27. package/dist/components/modals/HighlightModal.d.ts.map +1 -0
  28. package/dist/components/modals/LoginOverlay.d.ts +22 -0
  29. package/dist/components/modals/LoginOverlay.d.ts.map +1 -0
  30. package/dist/components/modals/index.d.ts +9 -0
  31. package/dist/components/modals/index.d.ts.map +1 -0
  32. package/dist/components/renderers/BrowserViewRenderer.d.ts.map +1 -1
  33. package/dist/components/renderers/ShadowDOMRenderer.d.ts.map +1 -1
  34. package/dist/components/sidebar/CloseButton.d.ts +6 -0
  35. package/dist/components/sidebar/CloseButton.d.ts.map +1 -0
  36. package/dist/components/sidebar/SidebarContent.d.ts.map +1 -1
  37. package/dist/components/sidebar/SidebarFooter.d.ts.map +1 -1
  38. package/dist/components/sidebar/SidebarHeader.d.ts.map +1 -1
  39. package/dist/components/sidebar/SidebarSkeleton.d.ts.map +1 -1
  40. package/dist/components/sidebar/StyledDrawer.d.ts +6 -1
  41. package/dist/components/sidebar/StyledDrawer.d.ts.map +1 -1
  42. package/dist/components/sidebar/StyledFab.d.ts +4 -1
  43. package/dist/components/sidebar/StyledFab.d.ts.map +1 -1
  44. package/dist/components/sidebar/index.d.ts +1 -0
  45. package/dist/components/sidebar/index.d.ts.map +1 -1
  46. package/dist/context/ai/AIContext.d.ts +13 -0
  47. package/dist/context/ai/AIContext.d.ts.map +1 -0
  48. package/dist/context/ai/index.d.ts +12 -0
  49. package/dist/context/ai/index.d.ts.map +1 -0
  50. package/dist/context/ai/types.d.ts +161 -0
  51. package/dist/context/ai/types.d.ts.map +1 -0
  52. package/dist/context/ai/useAIEngine.d.ts +10 -0
  53. package/dist/context/ai/useAIEngine.d.ts.map +1 -0
  54. package/dist/context/ai/useAISummary.d.ts +10 -0
  55. package/dist/context/ai/useAISummary.d.ts.map +1 -0
  56. package/dist/context/ai/useAITranslation.d.ts +10 -0
  57. package/dist/context/ai/useAITranslation.d.ts.map +1 -0
  58. package/dist/context/ai/useTranslationCache.d.ts +9 -0
  59. package/dist/context/ai/useTranslationCache.d.ts.map +1 -0
  60. package/dist/dqm-widget.d.ts +107 -0
  61. package/dist/dqm-widget.esm.js +516 -0
  62. package/dist/dqm-widget.iife.js +183 -0
  63. package/dist/hooks/index.d.ts +10 -0
  64. package/dist/hooks/index.d.ts.map +1 -0
  65. package/dist/hooks/useAnalysis.d.ts +43 -0
  66. package/dist/hooks/useAnalysis.d.ts.map +1 -0
  67. package/dist/hooks/useAuthentication.d.ts +49 -0
  68. package/dist/hooks/useAuthentication.d.ts.map +1 -0
  69. package/dist/hooks/useHighlightActions.d.ts +37 -0
  70. package/dist/hooks/useHighlightActions.d.ts.map +1 -0
  71. package/dist/hooks/useHighlights.d.ts +72 -0
  72. package/dist/hooks/useHighlights.d.ts.map +1 -0
  73. package/dist/html-pages/DQMWidget.d.ts +36 -0
  74. package/dist/html-pages/DQMWidget.d.ts.map +1 -0
  75. package/dist/html-pages/index.d.ts +32 -0
  76. package/dist/html-pages/index.d.ts.map +1 -0
  77. package/dist/i18n/auth/de.d.ts +25 -0
  78. package/dist/i18n/auth/de.d.ts.map +1 -0
  79. package/dist/i18n/auth/en.d.ts +26 -0
  80. package/dist/i18n/auth/en.d.ts.map +1 -0
  81. package/dist/i18n/auth/es.d.ts +25 -0
  82. package/dist/i18n/auth/es.d.ts.map +1 -0
  83. package/dist/i18n/auth/index.d.ts +8 -0
  84. package/dist/i18n/auth/index.d.ts.map +1 -0
  85. package/dist/i18n/common/de.d.ts +18 -0
  86. package/dist/i18n/common/de.d.ts.map +1 -0
  87. package/dist/i18n/common/en.d.ts +19 -0
  88. package/dist/i18n/common/en.d.ts.map +1 -0
  89. package/dist/i18n/common/es.d.ts +18 -0
  90. package/dist/i18n/common/es.d.ts.map +1 -0
  91. package/dist/i18n/common/index.d.ts +8 -0
  92. package/dist/i18n/common/index.d.ts.map +1 -0
  93. package/dist/i18n/demo/de.d.ts +104 -0
  94. package/dist/i18n/demo/de.d.ts.map +1 -0
  95. package/dist/i18n/demo/en.d.ts +105 -0
  96. package/dist/i18n/demo/en.d.ts.map +1 -0
  97. package/dist/i18n/demo/es.d.ts +104 -0
  98. package/dist/i18n/demo/es.d.ts.map +1 -0
  99. package/dist/i18n/demo/index.d.ts +8 -0
  100. package/dist/i18n/demo/index.d.ts.map +1 -0
  101. package/dist/i18n/index.d.ts +673 -0
  102. package/dist/i18n/index.d.ts.map +1 -0
  103. package/dist/i18n/sidebar/de.d.ts +89 -0
  104. package/dist/i18n/sidebar/de.d.ts.map +1 -0
  105. package/dist/i18n/sidebar/en.d.ts +90 -0
  106. package/dist/i18n/sidebar/en.d.ts.map +1 -0
  107. package/dist/i18n/sidebar/es.d.ts +89 -0
  108. package/dist/i18n/sidebar/es.d.ts.map +1 -0
  109. package/dist/i18n/sidebar/index.d.ts +8 -0
  110. package/dist/i18n/sidebar/index.d.ts.map +1 -0
  111. package/dist/i18n.d.ts +8 -0
  112. package/dist/i18n.d.ts.map +1 -0
  113. package/dist/index.cjs +61 -31
  114. package/dist/index.cjs.map +1 -1
  115. package/dist/index.d.ts +9 -1
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.html +498 -0
  118. package/dist/index.js +18006 -7241
  119. package/dist/index.js.map +1 -1
  120. package/dist/locale.d.ts +25 -0
  121. package/dist/locale.d.ts.map +1 -0
  122. package/dist/mocks/browser.d.ts +23 -0
  123. package/dist/mocks/browser.d.ts.map +1 -0
  124. package/dist/mocks/handlers.d.ts +32 -0
  125. package/dist/mocks/handlers.d.ts.map +1 -0
  126. package/dist/mocks/index.d.ts +7 -0
  127. package/dist/mocks/index.d.ts.map +1 -0
  128. package/dist/mocks/server.d.ts +24 -0
  129. package/dist/mocks/server.d.ts.map +1 -0
  130. package/dist/server/routes/auth.js +0 -10
  131. package/dist/server/routes/auth.js.map +1 -1
  132. package/dist/store/api/dqmApi.d.ts +1793 -0
  133. package/dist/store/api/dqmApi.d.ts.map +1 -0
  134. package/dist/store/api/index.d.ts +6 -0
  135. package/dist/store/api/index.d.ts.map +1 -0
  136. package/dist/store/index.d.ts +57 -0
  137. package/dist/store/index.d.ts.map +1 -0
  138. package/dist/store/localeSlice.d.ts +6 -0
  139. package/dist/store/localeSlice.d.ts.map +1 -0
  140. package/dist/store/slices/aiSlice.d.ts +134 -0
  141. package/dist/store/slices/aiSlice.d.ts.map +1 -0
  142. package/dist/store/slices/analysisSlice.d.ts +54 -0
  143. package/dist/store/slices/analysisSlice.d.ts.map +1 -0
  144. package/dist/store/slices/authSlice.d.ts +170 -0
  145. package/dist/store/slices/authSlice.d.ts.map +1 -0
  146. package/dist/store/slices/highlightSlice.d.ts +188 -0
  147. package/dist/store/slices/highlightSlice.d.ts.map +1 -0
  148. package/dist/store/slices/index.d.ts +12 -0
  149. package/dist/store/slices/index.d.ts.map +1 -0
  150. package/dist/types.d.ts +109 -7
  151. package/dist/types.d.ts.map +1 -1
  152. package/dist/utils/aiJsonClient.d.ts +23 -0
  153. package/dist/utils/aiJsonClient.d.ts.map +1 -0
  154. package/dist/utils/colors/GenerateCategoryColors.d.ts.map +1 -1
  155. package/dist/utils/logger.d.ts +107 -0
  156. package/dist/utils/logger.d.ts.map +1 -0
  157. package/dist/utils/openaiJsonClient.d.ts +8 -0
  158. package/dist/utils/openaiJsonClient.d.ts.map +1 -0
  159. package/dist/utils/sanitizeHtmlDocument.d.ts +4 -0
  160. package/dist/utils/sanitizeHtmlDocument.d.ts.map +1 -0
  161. package/dist/utils/secureStorage.d.ts +95 -0
  162. package/dist/utils/secureStorage.d.ts.map +1 -0
  163. package/dist/utils/storage.d.ts.map +1 -1
  164. package/dist/utils/translationCache.d.ts +45 -0
  165. package/dist/utils/translationCache.d.ts.map +1 -0
  166. package/dist/utils/translationUtils.d.ts +52 -0
  167. package/dist/utils/translationUtils.d.ts.map +1 -0
  168. package/dist/utils/useDomPresence.d.ts +210 -0
  169. package/dist/utils/useDomPresence.d.ts.map +1 -0
  170. package/package.json +59 -12
  171. package/AUTHENTICATION.md +0 -281
  172. package/BACKEND-API.md +0 -1829
  173. package/DEVELOPMENT.md +0 -339
  174. package/EXAMPLES.md +0 -194
  175. package/QUICKSTART.md +0 -200
  176. package/dist/auth-ui/assets/index-CczTRrba.js +0 -158
  177. package/dist/components/auth/OAuth2CallbackHandler.d.ts +0 -15
  178. package/dist/components/auth/OAuth2CallbackHandler.d.ts.map +0 -1
package/CHANGELOG.md CHANGED
@@ -5,6 +5,47 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.2.0] - 2026-01-07
9
+
10
+ ### Added
11
+ - **Internationalization (i18n)**: Full multi-language support using i18next
12
+ - Supported languages: English (default), German, Spanish
13
+ - Language switcher component in sidebar footer
14
+ - URL parameter override (`?dqmUiLang=de`)
15
+ - Browser language auto-detection
16
+ - LocalStorage persistence of user preference (`dqm_locale`)
17
+ - Regional variant fallbacks (e.g., `de-AT` → `de` → `en`)
18
+ - **New Exports**:
19
+ - `i18n`, `resolveLanguage` from `./i18n`
20
+ - `SUPPORTED_LOCALES`, `DEFAULT_LOCALE`, `normalizeLocale` from `./locale`
21
+ - Types: `SupportedLocale`, `AvailableLanguage`
22
+ - **Comprehensive i18n documentation** in `I18N.md`
23
+
24
+ ## [1.1.0] - 2025-12-17
25
+
26
+ ### Added
27
+ - **Overlay Configuration**: New `overlayConfig` option in `DQMConfig` for customizing overlay/toolbar detection
28
+ - `selector`: Custom CSS selector for overlay elements
29
+ - `validateIframe`: Option to validate iFrame contentWindow availability
30
+ - `pollMs`: Configurable polling interval for cross-origin iFrame detection
31
+ - `manualOffset`: Manual offset configuration for cases where auto-detection fails
32
+ - **Enhanced `useDomPresence` Hook**: Now returns comprehensive element information including:
33
+ - `rect`: Element bounding rectangle (height, width, top, bottom, left, right)
34
+ - `position`: Detected position ('top', 'bottom', 'left', 'right', 'center')
35
+ - `contentOffset`: Ready-to-use offsets for positioning UI elements
36
+ - **New Exports**:
37
+ - `useOverlayResistant` hook for advanced overlay handling
38
+ - `OverlayConfig`, `OverlayOffsetPosition`, `OverlayInfo`, `OverlayPosition` types
39
+ - **Standalone Widget Bundle**: New widget build (IIFE + ESM) with `initDQMWidget`, Shadow DOM isolation, and Emotion cache binding for safe embedding on any site.
40
+ - **Widget Tooling & Types**: Added loader utilities, TypeScript declarations, and public exports for widget consumers.
41
+ - **Integration Demos**: New demo pages for IIFE, ESM, dynamic loading, and standalone widget usage to test the bundled widget end-to-end.
42
+ - **Config Option `disableLogout`**: Allows host apps to hide the sidebar logout control when session lifecycle is managed externally.
43
+
44
+ ### Changed
45
+ - `useOverlayResistant` hook now accepts configuration options
46
+ - `OverlayInfo` interface now includes `isManualOffset` flag
47
+ - Sidebar header, content, footer, skeleton, and FAB now respect overlay offsets for consistent spacing around external toolbars.
48
+
8
49
  ## [1.0.1] - 2025-12-08
9
50
 
10
51
  ### Fixed
package/README.md CHANGED
@@ -11,13 +11,15 @@ highlighting capabilities.
11
11
 
12
12
  ## 🌟 Features
13
13
 
14
+ - **🤖 AI-Powered Translation & Summary** - Automatically translate analysis results into your language and generate intelligent summaries using OpenAI
14
15
  - **📊 Quality Analysis** - Comprehensive quality metrics and scores
15
16
  - **♿ Accessibility Checks** - WCAG compliance validation
16
17
  - **🎯 Error Highlighting** - Visual highlighting of issues in HTML
17
18
  - **🎨 Material-UI Design** - Beautiful, responsive sidebar interface
18
- - **🔐 OAuth 2.0 Authentication** - Secure Crownpeak SSO integration
19
+ - **🔐 Secure Authentication** - Backend session management with secure credential storage
19
20
  - **⚡ Real-time Analysis** - Live quality assessment as you edit
20
21
  - **📱 Responsive** - Works on desktop, tablet, and mobile
22
+ - **🌍 Internationalization** - Supports English, German, and Spanish
21
23
  - **🔧 TypeScript Support** - Full type definitions included
22
24
 
23
25
  ## 📦 Installation
@@ -63,17 +65,54 @@ function App() {
63
65
  export default App;
64
66
  ```
65
67
 
68
+ ### AI-Powered Translation & Summary (Quick Example)
69
+
70
+ ```typescript
71
+ import {DQMSidebar} from '@crownpeak/dqm-react-component';
72
+
73
+ <DQMSidebar
74
+ open={isOpen}
75
+ onClose={() => setIsOpen(false)}
76
+ onOpen={() => setIsOpen(true)}
77
+ config={{
78
+ websiteId: 'your-website-id',
79
+ apiKey: 'your-api-key',
80
+ // Enable AI Translation (API key via localStorage: dqm_openai_apiKey)
81
+ translation: {
82
+ enabledByDefault: true,
83
+ computeBudgetMs: 15000, // 15s timeout for 'fast' mode
84
+ },
85
+ // Enable AI Summary (uses same OpenAI API key)
86
+ summary: {
87
+ timeoutMs: 30000, // 30s timeout
88
+ }
89
+ }}
90
+ />
91
+ ```
92
+
93
+ See **[AI Features Guide](./docs/AI-FEATURES.md)** for complete documentation including caching strategies and performance tuning.
94
+
66
95
  ## 📖 Documentation
67
96
 
68
- - **[Quick Start Guide](./QUICKSTART.md)** - Get up and running in 5 minutes
69
- - **[Examples](./EXAMPLES.md)** - Integration examples for React, Next.js, TypeScript
70
- - **[Authentication Guide](./AUTHENTICATION.md)** - OAuth 2.0 setup and configuration
71
- - **[Backend API](./BACKEND-API.md)** - API endpoints and usage
72
- - **[Development Guide](./DEVELOPMENT.md)** - Contributing and local development
97
+ ### Core Documentation
98
+ - **[Quick Start Guide](./docs/QUICKSTART.md)** - Get up and running in 5 minutes
99
+ - **[Examples](./docs/EXAMPLES.md)** - Integration examples for React, Next.js, TypeScript
100
+ - **[Authentication Guide](./docs/AUTHENTICATION.md)** - Setup and configuration
101
+
102
+ ### AI Features
103
+ - **[AI Features Guide](./docs/AI-FEATURES.md)** - Translation & Summary with OpenAI
104
+ - **[API Reference](./docs/API-REFERENCE.md)** - Full TypeScript API documentation
105
+ - **[Migration Guide](./docs/MIGRATION-GUIDE.md)** - Upgrade from v1.1 to v1.2
106
+
107
+ ### Advanced
108
+ - **[Widget Guide](./docs/WIDGET-GUIDE.md)** - Standalone IIFE/ESM bundle usage
109
+ - **[Backend API](./docs/BACKEND-API.md)** - Backend server endpoints and usage
110
+ - **[Development Guide](./docs/DEVELOPMENT.md)** - Contributing and local development
111
+ - **[Troubleshooting](./docs/TROUBLESHOOTING.md)** - Common issues and solutions
73
112
 
74
113
  ## 🔑 Authentication Setup
75
114
 
76
- The component requires authentication with Crownpeak DQM. 3 options are available:
115
+ The component requires authentication with Crownpeak DQM. Two options are available:
77
116
 
78
117
  ```tsx
79
118
  import {DQMSidebar} from '@crownpeak/dqm-react-component';
@@ -81,22 +120,13 @@ import {DQMSidebar} from '@crownpeak/dqm-react-component';
81
120
  <DQMSidebar
82
121
  {/* ... */}
83
122
  config={{
84
- // -- Direct API Key and Website ID (not recommended for production)
123
+ // Option 1: Direct API Key and Website ID (not recommended for production)
85
124
  // websiteId: 'your-website-id',
86
125
  // apiKey: 'your-api-key',
87
126
 
88
- // -- Auth Backend for API Key management
89
- authBackendUrl: 'http://localhost:3001',
127
+ // Option 2: Auth Backend for API Key management (recommended)
128
+ authBackendUrl: '', // Dev: empty (same origin) | Prod: 'https://your-backend.com'
90
129
  useLocalStorage: true,
91
-
92
- // -- Oauth2: backend not yet implemented ...
93
- // oauth2Config: {
94
- // authUrl: 'https://dqm.crownpeak.com/oauth2/authorize',
95
- // clientId: 'crownpeak-dqm-react-component',
96
- // scope: 'dqm_api',
97
- // redirectUri: 'http://localhost:5173/',
98
- // tokenUrl: 'https://dqm.crownpeak.com/oauth2/token',
99
- // }
100
130
  }}
101
131
  ```
102
132
 
@@ -121,10 +151,10 @@ npm run dev
121
151
 
122
152
  This starts:
123
153
 
124
- - Frontend on `http://localhost:5173`
125
- - Backend on `http://localhost:3001`
154
+ - Frontend + Backend on `http://localhost:5173` (Vite dev server with integrated backend)
155
+ - Backend routes (`/auth/*`, `/dqm/*`) handled by Vite plugin
126
156
 
127
- ### Backend Requirements (Optional)
157
+ ### Standalone Server (Optional)
128
158
 
129
159
  If using the included backend server:
130
160
 
@@ -143,6 +173,71 @@ See [REDIS-SETUP.md](./REDIS-SETUP.md) for Redis installation.
143
173
  | `onClose` | `() => void` | ✅ | Callback when sidebar closes |
144
174
  | `onOpen` | `() => void` | ✅ | Callback when sidebar opens |
145
175
  | `debugHtml` | `string` | ❌ | HTML for testing (dev only) |
176
+ | `config` | `DQMConfig` | ❌ | Configuration options |
177
+
178
+ ### DQMConfig Options
179
+
180
+ | Option | Type | Default | Description |
181
+ |-------------------|-----------------|---------|------------------------------------------------|
182
+ | `apiKey` | `string` | - | Direct API key (not for production) |
183
+ | `websiteId` | `string` | - | Website ID for DQM |
184
+ | `authBackendUrl` | `string` | - | Backend URL for session management |
185
+ | `useLocalStorage` | `boolean` | `true` | Persist credentials in localStorage |
186
+ | `disabled` | `boolean` | `false` | Disable DQM completely |
187
+ | `disableLogout` | `boolean` | `false` | Hide the logout control (host manages session) |
188
+ | `shadowDomMode` | `boolean` | `false` | Enable for Shadow DOM embedding |
189
+ | `overlayConfig` | `OverlayConfig` | - | Overlay/toolbar detection config |
190
+
191
+ ### OverlayConfig (for Toolbars & Overlays)
192
+
193
+ Configure how the sidebar adapts to fixed overlays (e.g., admin toolbars):
194
+
195
+ ```tsx
196
+ <DQMSidebar
197
+ config={{
198
+ overlayConfig: {
199
+ // CSS selector for the overlay element
200
+ selector: 'iframe#MyToolbar',
201
+
202
+ // Validate iFrame has contentWindow (default: true)
203
+ validateIframe: true,
204
+
205
+ // Polling interval in ms for cross-origin iFrames (default: 1000)
206
+ pollMs: 1000,
207
+
208
+ // OR: Manual offset when auto-detection doesn't work
209
+ // (e.g., for iFrames that fill screen but have smaller internal content)
210
+ manualOffset: {
211
+ position: 'top', // 'top' | 'bottom' | 'left' | 'right'
212
+ pixels: 50
213
+ }
214
+ }
215
+ }}
216
+ />
217
+ ```
218
+
219
+ **Common overlay configurations:**
220
+
221
+ [//]: # (@formatter:off)
222
+ ```tsx
223
+ // Disable overlay detection
224
+ overlayConfig: {
225
+ selector: null
226
+ }
227
+
228
+ // Manual 50px offset from top
229
+ overlayConfig: {
230
+ manualOffset: {
231
+ position: 'top', pixels: 50
232
+ }
233
+ }
234
+
235
+ // Custom selector without iFrame validation
236
+ overlayConfig: {
237
+ selector: '.admin-toolbar', validateIframe: false
238
+ }
239
+ ```
240
+ [//]: # (@formatter:on)
146
241
 
147
242
  ### Exported Types
148
243
 
@@ -151,8 +246,15 @@ import type {
151
246
  AnalysisState,
152
247
  Checkpoint,
153
248
  AnalysisData,
154
- DQMSidebarProps
249
+ DQMSidebarProps,
250
+ DQMConfig,
251
+ OverlayConfig,
252
+ OverlayOffsetPosition
155
253
  } from '@crownpeak/dqm-react-component';
254
+
255
+ // For advanced overlay handling
256
+ import {useOverlayResistant} from '@crownpeak/dqm-react-component';
257
+ import type {OverlayInfo, OverlayPosition} from '@crownpeak/dqm-react-component';
156
258
  ```
157
259
 
158
260
  See [TypeScript examples](./EXAMPLES.md#typescript-configuration) for full type definitions.
@@ -1 +1 @@
1
- {"version":3,"file":"DQMSidebar.d.ts","sourceRoot":"","sources":["../src/DQMSidebar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAuC9D,OAAO,KAAK,EAA8B,eAAe,EAAc,MAAM,SAAS,CAAC;AAkBvF,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA4oEhD,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"DQMSidebar.d.ts","sourceRoot":"","sources":["../src/DQMSidebar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAiD,MAAM,OAAO,CAAC;AA4CtE,OAAO,KAAK,EAA8B,eAAe,EAAc,MAAM,SAAS,CAAC;AA0jFvF,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAahD,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../src/ErrorBoundary.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAW1B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD;;;;;GAKG;AAEH,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;IACnC,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,aAAc,SAAQ,KAAK,CAAC,SAAS,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IACxF,KAAK,EAAE,kBAAkB,CAMvB;IAEF,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAI1E,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;IAO1D,kBAAkB,CAAC,SAAS,EAAE,kBAAkB;IAShD,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,YAAY,CAElB;IAEF,OAAO,CAAC,mBAAmB,CAEzB;IAEF,MAAM;CAiEP;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,KAAK,CAAC,SAAS,EAAE,YAAY,OAAO,EAAE,4CAEjF,CAAC"}
1
+ {"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../src/ErrorBoundary.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAW1B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAGlD;;;;;GAKG;AAEH,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;IACnC,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,aAAc,SAAQ,KAAK,CAAC,SAAS,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IACxF,KAAK,EAAE,kBAAkB,CAMvB;IAEF,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAI1E,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;IAO1D,kBAAkB,CAAC,SAAS,EAAE,kBAAkB;IAShD,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,YAAY,CAElB;IAEF,OAAO,CAAC,mBAAmB,CAEzB;IAEF,MAAM;CAiEP;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,KAAK,CAAC,SAAS,EAAE,YAAY,OAAO,EAAE,4CAEjF,CAAC"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,kCAAkC,CAAC"}
@@ -0,0 +1,145 @@
1
+ import { ReactElement } from 'react';
2
+ import { RenderOptions, RenderResult } from '@testing-library/react';
3
+ declare const rootReducer: import('redux').Reducer<{
4
+ locale: import('../store/localeSlice').LocaleState;
5
+ analysis: import('../store').AnalysisSliceState;
6
+ highlight: import('../store').HighlightSliceState;
7
+ auth: import('immer').WritableDraft<import('../store').AuthSliceState>;
8
+ ai: import('../store').AISliceState;
9
+ dqmApi: import('@reduxjs/toolkit/query').CombinedState<{
10
+ createAsset: import('@reduxjs/toolkit/query').MutationDefinition<import('../store').CreateAssetRequest, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError, {}, import('@reduxjs/toolkit/query').FetchBaseQueryMeta>, "Highlight" | "Asset", import('../store').CreateAssetResponse, "dqmApi", unknown>;
11
+ getAsset: import('@reduxjs/toolkit/query').QueryDefinition<import('../store').GetAssetRequest, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError, {}, import('@reduxjs/toolkit/query').FetchBaseQueryMeta>, "Highlight" | "Asset", import('../store/api/dqmApi').TransformedAnalysisData, "dqmApi", unknown>;
12
+ getHighlight: import('@reduxjs/toolkit/query').QueryDefinition<import('../store').GetHighlightRequest, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError, {}, import('@reduxjs/toolkit/query').FetchBaseQueryMeta>, "Highlight" | "Asset", import('../store').HighlightResponse, "dqmApi", unknown>;
13
+ getAllHighlights: import('@reduxjs/toolkit/query').QueryDefinition<import('../store').GetAllHighlightsRequest, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError, {}, import('@reduxjs/toolkit/query').FetchBaseQueryMeta>, "Highlight" | "Asset", import('../store').HighlightResponse, "dqmApi", unknown>;
14
+ getCheckpointHighlight: import('@reduxjs/toolkit/query').QueryDefinition<import('../store').GetHighlightRequest & {
15
+ highlightSource?: boolean;
16
+ }, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError, {}, import('@reduxjs/toolkit/query').FetchBaseQueryMeta>, "Highlight" | "Asset", string, "dqmApi", unknown>;
17
+ }, "Highlight" | "Asset", "dqmApi">;
18
+ }, import('redux').UnknownAction, Partial<{
19
+ locale: import('../store/localeSlice').LocaleState;
20
+ analysis: import('../store').AnalysisSliceState;
21
+ highlight: import('../store').HighlightSliceState;
22
+ auth: import('immer').WritableDraft<import('../store').AuthSliceState>;
23
+ ai: import('../store').AISliceState;
24
+ dqmApi: import('@reduxjs/toolkit/query').CombinedState<{
25
+ createAsset: import('@reduxjs/toolkit/query').MutationDefinition<import('../store').CreateAssetRequest, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError, {}, import('@reduxjs/toolkit/query').FetchBaseQueryMeta>, "Highlight" | "Asset", import('../store').CreateAssetResponse, "dqmApi", unknown>;
26
+ getAsset: import('@reduxjs/toolkit/query').QueryDefinition<import('../store').GetAssetRequest, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError, {}, import('@reduxjs/toolkit/query').FetchBaseQueryMeta>, "Highlight" | "Asset", import('../store/api/dqmApi').TransformedAnalysisData, "dqmApi", unknown>;
27
+ getHighlight: import('@reduxjs/toolkit/query').QueryDefinition<import('../store').GetHighlightRequest, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError, {}, import('@reduxjs/toolkit/query').FetchBaseQueryMeta>, "Highlight" | "Asset", import('../store').HighlightResponse, "dqmApi", unknown>;
28
+ getAllHighlights: import('@reduxjs/toolkit/query').QueryDefinition<import('../store').GetAllHighlightsRequest, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError, {}, import('@reduxjs/toolkit/query').FetchBaseQueryMeta>, "Highlight" | "Asset", import('../store').HighlightResponse, "dqmApi", unknown>;
29
+ getCheckpointHighlight: import('@reduxjs/toolkit/query').QueryDefinition<import('../store').GetHighlightRequest & {
30
+ highlightSource?: boolean;
31
+ }, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError, {}, import('@reduxjs/toolkit/query').FetchBaseQueryMeta>, "Highlight" | "Asset", string, "dqmApi", unknown>;
32
+ }, "Highlight" | "Asset", "dqmApi">;
33
+ }>>;
34
+ export type TestRootState = ReturnType<typeof rootReducer>;
35
+ /**
36
+ * Create a test store with optional preloaded state.
37
+ * Uses same configuration as the main store.
38
+ */
39
+ export declare function createTestStore(preloadedState?: Partial<TestRootState>): import('@reduxjs/toolkit').EnhancedStore<{
40
+ locale: import('../store/localeSlice').LocaleState;
41
+ analysis: import('../store').AnalysisSliceState;
42
+ highlight: import('../store').HighlightSliceState;
43
+ auth: import('immer').WritableDraft<import('../store').AuthSliceState>;
44
+ ai: import('../store').AISliceState;
45
+ dqmApi: import('@reduxjs/toolkit/query').CombinedState<{
46
+ createAsset: import('@reduxjs/toolkit/query').MutationDefinition<import('../store').CreateAssetRequest, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError, {}, import('@reduxjs/toolkit/query').FetchBaseQueryMeta>, "Highlight" | "Asset", import('../store').CreateAssetResponse, "dqmApi", unknown>;
47
+ getAsset: import('@reduxjs/toolkit/query').QueryDefinition<import('../store').GetAssetRequest, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError, {}, import('@reduxjs/toolkit/query').FetchBaseQueryMeta>, "Highlight" | "Asset", import('../store/api/dqmApi').TransformedAnalysisData, "dqmApi", unknown>;
48
+ getHighlight: import('@reduxjs/toolkit/query').QueryDefinition<import('../store').GetHighlightRequest, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError, {}, import('@reduxjs/toolkit/query').FetchBaseQueryMeta>, "Highlight" | "Asset", import('../store').HighlightResponse, "dqmApi", unknown>;
49
+ getAllHighlights: import('@reduxjs/toolkit/query').QueryDefinition<import('../store').GetAllHighlightsRequest, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError, {}, import('@reduxjs/toolkit/query').FetchBaseQueryMeta>, "Highlight" | "Asset", import('../store').HighlightResponse, "dqmApi", unknown>;
50
+ getCheckpointHighlight: import('@reduxjs/toolkit/query').QueryDefinition<import('../store').GetHighlightRequest & {
51
+ highlightSource?: boolean;
52
+ }, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError, {}, import('@reduxjs/toolkit/query').FetchBaseQueryMeta>, "Highlight" | "Asset", string, "dqmApi", unknown>;
53
+ }, "Highlight" | "Asset", "dqmApi">;
54
+ }, import('redux').UnknownAction, import('@reduxjs/toolkit').Tuple<[import('redux').StoreEnhancer<{
55
+ dispatch: import('redux-thunk').ThunkDispatch<{
56
+ locale: import('../store/localeSlice').LocaleState;
57
+ analysis: import('../store').AnalysisSliceState;
58
+ highlight: import('../store').HighlightSliceState;
59
+ auth: import('immer').WritableDraft<import('../store').AuthSliceState>;
60
+ ai: import('../store').AISliceState;
61
+ dqmApi: import('@reduxjs/toolkit/query').CombinedState<{
62
+ createAsset: import('@reduxjs/toolkit/query').MutationDefinition<import('../store').CreateAssetRequest, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError, {}, import('@reduxjs/toolkit/query').FetchBaseQueryMeta>, "Highlight" | "Asset", import('../store').CreateAssetResponse, "dqmApi", unknown>;
63
+ getAsset: import('@reduxjs/toolkit/query').QueryDefinition<import('../store').GetAssetRequest, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError, {}, import('@reduxjs/toolkit/query').FetchBaseQueryMeta>, "Highlight" | "Asset", import('../store/api/dqmApi').TransformedAnalysisData, "dqmApi", unknown>;
64
+ getHighlight: import('@reduxjs/toolkit/query').QueryDefinition<import('../store').GetHighlightRequest, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError, {}, import('@reduxjs/toolkit/query').FetchBaseQueryMeta>, "Highlight" | "Asset", import('../store').HighlightResponse, "dqmApi", unknown>;
65
+ getAllHighlights: import('@reduxjs/toolkit/query').QueryDefinition<import('../store').GetAllHighlightsRequest, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError, {}, import('@reduxjs/toolkit/query').FetchBaseQueryMeta>, "Highlight" | "Asset", import('../store').HighlightResponse, "dqmApi", unknown>;
66
+ getCheckpointHighlight: import('@reduxjs/toolkit/query').QueryDefinition<import('../store').GetHighlightRequest & {
67
+ highlightSource?: boolean;
68
+ }, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError, {}, import('@reduxjs/toolkit/query').FetchBaseQueryMeta>, "Highlight" | "Asset", string, "dqmApi", unknown>;
69
+ }, "Highlight" | "Asset", "dqmApi">;
70
+ }, undefined, import('redux').UnknownAction>;
71
+ }>, import('redux').StoreEnhancer]>>;
72
+ export type AppStore = ReturnType<typeof createTestStore>;
73
+ /**
74
+ * Custom render that includes all providers
75
+ */
76
+ interface CustomRenderOptions extends Omit<RenderOptions, 'wrapper'> {
77
+ preloadedState?: Partial<TestRootState>;
78
+ store?: ReturnType<typeof createTestStore>;
79
+ }
80
+ export declare function renderWithProviders(ui: ReactElement, { preloadedState, store, ...renderOptions }?: CustomRenderOptions): RenderResult & {
81
+ store: ReturnType<typeof createTestStore>;
82
+ };
83
+ /**
84
+ * Create mock credentials for testing
85
+ */
86
+ export declare function createMockCredentials(overrides?: Partial<{
87
+ apiKey: string;
88
+ websiteId: string;
89
+ }>): {
90
+ apiKey: string;
91
+ websiteId: string;
92
+ };
93
+ /**
94
+ * Create mock analysis data for testing
95
+ */
96
+ export declare function createMockAnalysisData(overrides?: Partial<TestRootState['analysis']>): {
97
+ state: import('..').AnalysisState;
98
+ assetId: string | null;
99
+ data: import('..').AnalysisData | null;
100
+ error: string | null;
101
+ isAnalyzing: boolean;
102
+ startedAt: number | null;
103
+ completedAt: number | null;
104
+ };
105
+ /**
106
+ * Create mock checkpoint for testing
107
+ */
108
+ export declare function createMockCheckpoint(overrides?: Partial<import('../types').Checkpoint>): {
109
+ colors: {
110
+ bg: string;
111
+ text: string;
112
+ };
113
+ id: string;
114
+ name: string;
115
+ description: string;
116
+ reference: string;
117
+ number: number;
118
+ categoryNumber: number;
119
+ category: string;
120
+ priority: boolean;
121
+ failed: boolean;
122
+ topics: string[];
123
+ canHighlight: {
124
+ page: boolean;
125
+ source: boolean;
126
+ };
127
+ restricted: boolean;
128
+ checkpointType: {
129
+ name: string;
130
+ modifiedBy: string;
131
+ modified: string;
132
+ };
133
+ created: string;
134
+ modified: string;
135
+ };
136
+ /**
137
+ * Wait for a condition to be true
138
+ */
139
+ export declare function waitFor(condition: () => boolean, { timeout, interval }?: {
140
+ timeout?: number;
141
+ interval?: number;
142
+ }): Promise<void>;
143
+ export * from '@testing-library/react';
144
+ export { default as userEvent } from '@testing-library/user-event';
145
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/__tests__/utils.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAc,EAAE,KAAK,YAAY,EAA0B,MAAM,OAAO,CAAC;AACzE,OAAO,EAAU,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAqBvF,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAOf,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAE3D;;;GAGG;AACH,wBAAgB,eAAe,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAUtE;AAED,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAsB1D;;GAEG;AACH,UAAU,mBAAoB,SAAQ,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC;IAClE,cAAc,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACxC,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;CAC5C;AAED,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,YAAY,EAChB,EACE,cAAc,EACd,KAAuC,EACvC,GAAG,aAAa,EACjB,GAAE,mBAAwB,GAC1B,YAAY,GAAG;IAAE,KAAK,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAA;CAAE,CAM9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;YAA5B,MAAM;eAAa,MAAM;EAM5F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;;;;;;;;EAWpF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,OAAO,UAAU,EAAE,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwBtF;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,SAAS,EAAE,MAAM,OAAO,EACxB,EAAE,OAAc,EAAE,QAAc,EAAE;;;CAAK,GACtC,OAAO,CAAC,IAAI,CAAC,CAQf;AAGD,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,6BAA6B,CAAC"}