@qoretechnologies/reqraft 0.10.20 → 0.10.26

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 (139) hide show
  1. package/.claude/CLAUDE.md +11 -8
  2. package/dist/components/composer/Composer.d.ts +108 -0
  3. package/dist/components/composer/Composer.d.ts.map +1 -0
  4. package/dist/components/composer/Composer.js +238 -0
  5. package/dist/components/composer/Composer.js.map +1 -0
  6. package/dist/components/composer/helpers.d.ts +21 -0
  7. package/dist/components/composer/helpers.d.ts.map +1 -0
  8. package/dist/components/composer/helpers.js +75 -0
  9. package/dist/components/composer/helpers.js.map +1 -0
  10. package/dist/components/composer/index.d.ts +3 -0
  11. package/dist/components/composer/index.d.ts.map +1 -0
  12. package/dist/components/composer/index.js +19 -0
  13. package/dist/components/composer/index.js.map +1 -0
  14. package/dist/components/form/engine/FormEngine.d.ts +1 -1
  15. package/dist/components/imageLightbox/ImageLightbox.d.ts +21 -0
  16. package/dist/components/imageLightbox/ImageLightbox.d.ts.map +1 -0
  17. package/dist/components/imageLightbox/ImageLightbox.js +169 -0
  18. package/dist/components/imageLightbox/ImageLightbox.js.map +1 -0
  19. package/dist/components/imageLightbox/index.d.ts +2 -0
  20. package/dist/components/imageLightbox/index.d.ts.map +1 -0
  21. package/dist/components/imageLightbox/index.js +18 -0
  22. package/dist/components/imageLightbox/index.js.map +1 -0
  23. package/dist/components/searchFilterBar/SearchFilterBar.d.ts +33 -0
  24. package/dist/components/searchFilterBar/SearchFilterBar.d.ts.map +1 -0
  25. package/dist/components/searchFilterBar/SearchFilterBar.js +76 -0
  26. package/dist/components/searchFilterBar/SearchFilterBar.js.map +1 -0
  27. package/dist/components/searchFilterBar/index.d.ts +2 -0
  28. package/dist/components/searchFilterBar/index.d.ts.map +1 -0
  29. package/dist/components/searchFilterBar/index.js +18 -0
  30. package/dist/components/searchFilterBar/index.js.map +1 -0
  31. package/dist/components/supportTicket/AttachmentChips.d.ts +10 -0
  32. package/dist/components/supportTicket/AttachmentChips.d.ts.map +1 -0
  33. package/dist/components/supportTicket/AttachmentChips.js +122 -0
  34. package/dist/components/supportTicket/AttachmentChips.js.map +1 -0
  35. package/dist/components/supportTicket/InterfaceReferenceTags.d.ts +43 -0
  36. package/dist/components/supportTicket/InterfaceReferenceTags.d.ts.map +1 -0
  37. package/dist/components/supportTicket/InterfaceReferenceTags.js +31 -0
  38. package/dist/components/supportTicket/InterfaceReferenceTags.js.map +1 -0
  39. package/dist/components/supportTicket/ReferencePicker.d.ts +87 -0
  40. package/dist/components/supportTicket/ReferencePicker.d.ts.map +1 -0
  41. package/dist/components/supportTicket/ReferencePicker.js +295 -0
  42. package/dist/components/supportTicket/ReferencePicker.js.map +1 -0
  43. package/dist/components/supportTicket/TicketHeader.d.ts +86 -0
  44. package/dist/components/supportTicket/TicketHeader.d.ts.map +1 -0
  45. package/dist/components/supportTicket/TicketHeader.js +149 -0
  46. package/dist/components/supportTicket/TicketHeader.js.map +1 -0
  47. package/dist/components/supportTicket/TicketMetaTags.d.ts +32 -0
  48. package/dist/components/supportTicket/TicketMetaTags.d.ts.map +1 -0
  49. package/dist/components/supportTicket/TicketMetaTags.js +21 -0
  50. package/dist/components/supportTicket/TicketMetaTags.js.map +1 -0
  51. package/dist/components/supportTicket/TicketReplyBox.d.ts +63 -0
  52. package/dist/components/supportTicket/TicketReplyBox.d.ts.map +1 -0
  53. package/dist/components/supportTicket/TicketReplyBox.js +115 -0
  54. package/dist/components/supportTicket/TicketReplyBox.js.map +1 -0
  55. package/dist/components/supportTicket/attachmentAccess.d.ts +37 -0
  56. package/dist/components/supportTicket/attachmentAccess.d.ts.map +1 -0
  57. package/dist/components/supportTicket/attachmentAccess.js +132 -0
  58. package/dist/components/supportTicket/attachmentAccess.js.map +1 -0
  59. package/dist/components/supportTicket/fileToAttachment.d.ts +9 -0
  60. package/dist/components/supportTicket/fileToAttachment.d.ts.map +1 -0
  61. package/dist/components/supportTicket/fileToAttachment.js +28 -0
  62. package/dist/components/supportTicket/fileToAttachment.js.map +1 -0
  63. package/dist/components/supportTicket/index.d.ts +11 -0
  64. package/dist/components/supportTicket/index.d.ts.map +1 -0
  65. package/dist/components/supportTicket/index.js +27 -0
  66. package/dist/components/supportTicket/index.js.map +1 -0
  67. package/dist/components/supportTicket/meta.d.ts +71 -0
  68. package/dist/components/supportTicket/meta.d.ts.map +1 -0
  69. package/dist/components/supportTicket/meta.js +115 -0
  70. package/dist/components/supportTicket/meta.js.map +1 -0
  71. package/dist/components/supportTicket/ticketModel.d.ts +102 -0
  72. package/dist/components/supportTicket/ticketModel.d.ts.map +1 -0
  73. package/dist/components/supportTicket/ticketModel.js +3 -0
  74. package/dist/components/supportTicket/ticketModel.js.map +1 -0
  75. package/dist/components/ticketReferences/TicketReferences.d.ts +52 -0
  76. package/dist/components/ticketReferences/TicketReferences.d.ts.map +1 -0
  77. package/dist/components/ticketReferences/TicketReferences.js +492 -0
  78. package/dist/components/ticketReferences/TicketReferences.js.map +1 -0
  79. package/dist/components/ticketReferences/index.d.ts +3 -0
  80. package/dist/components/ticketReferences/index.d.ts.map +1 -0
  81. package/dist/components/ticketReferences/index.js +6 -0
  82. package/dist/components/ticketReferences/index.js.map +1 -0
  83. package/dist/components/ticketThread/TicketThread.d.ts +57 -0
  84. package/dist/components/ticketThread/TicketThread.d.ts.map +1 -0
  85. package/dist/components/ticketThread/TicketThread.js +299 -0
  86. package/dist/components/ticketThread/TicketThread.js.map +1 -0
  87. package/dist/components/ticketThread/index.d.ts +3 -0
  88. package/dist/components/ticketThread/index.d.ts.map +1 -0
  89. package/dist/components/ticketThread/index.js +7 -0
  90. package/dist/components/ticketThread/index.js.map +1 -0
  91. package/dist/helpers/common.d.ts +5 -0
  92. package/dist/helpers/common.d.ts.map +1 -1
  93. package/dist/helpers/common.js +20 -1
  94. package/dist/helpers/common.js.map +1 -1
  95. package/dist/helpers/scrollbar.d.ts +2 -0
  96. package/dist/helpers/scrollbar.d.ts.map +1 -0
  97. package/dist/helpers/scrollbar.js +25 -0
  98. package/dist/helpers/scrollbar.js.map +1 -0
  99. package/dist/index.d.ts +8 -1
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +10 -1
  102. package/dist/index.js.map +1 -1
  103. package/package.json +1 -1
  104. package/src/components/composer/Composer.stories.tsx +238 -0
  105. package/src/components/composer/Composer.tsx +545 -0
  106. package/src/components/composer/helpers.ts +74 -0
  107. package/src/components/composer/index.ts +2 -0
  108. package/src/components/imageLightbox/ImageLightbox.stories.tsx +238 -0
  109. package/src/components/imageLightbox/ImageLightbox.tsx +236 -0
  110. package/src/components/imageLightbox/index.ts +1 -0
  111. package/src/components/searchFilterBar/SearchFilterBar.tsx +131 -0
  112. package/src/components/searchFilterBar/index.ts +1 -0
  113. package/src/components/supportTicket/AttachmentChips.stories.tsx +171 -0
  114. package/src/components/supportTicket/AttachmentChips.tsx +147 -0
  115. package/src/components/supportTicket/InterfaceReferenceTags.stories.tsx +171 -0
  116. package/src/components/supportTicket/InterfaceReferenceTags.tsx +96 -0
  117. package/src/components/supportTicket/ReferencePicker.stories.tsx +519 -0
  118. package/src/components/supportTicket/ReferencePicker.tsx +563 -0
  119. package/src/components/supportTicket/TicketConversation.stories.tsx +121 -0
  120. package/src/components/supportTicket/TicketHeader.stories.tsx +183 -0
  121. package/src/components/supportTicket/TicketHeader.tsx +247 -0
  122. package/src/components/supportTicket/TicketMetaTags.stories.tsx +103 -0
  123. package/src/components/supportTicket/TicketMetaTags.tsx +85 -0
  124. package/src/components/supportTicket/TicketReplyBox.stories.tsx +351 -0
  125. package/src/components/supportTicket/TicketReplyBox.tsx +146 -0
  126. package/src/components/supportTicket/attachmentAccess.ts +97 -0
  127. package/src/components/supportTicket/fileToAttachment.ts +24 -0
  128. package/src/components/supportTicket/index.ts +10 -0
  129. package/src/components/supportTicket/meta.ts +185 -0
  130. package/src/components/supportTicket/ticketModel.ts +131 -0
  131. package/src/components/ticketReferences/TicketReferences.stories.tsx +315 -0
  132. package/src/components/ticketReferences/TicketReferences.tsx +886 -0
  133. package/src/components/ticketReferences/index.ts +2 -0
  134. package/src/components/ticketThread/TicketThread.stories.tsx +828 -0
  135. package/src/components/ticketThread/TicketThread.tsx +704 -0
  136. package/src/components/ticketThread/index.ts +6 -0
  137. package/src/helpers/common.ts +19 -0
  138. package/src/helpers/scrollbar.ts +32 -0
  139. package/src/index.tsx +8 -1
package/.claude/CLAUDE.md CHANGED
@@ -44,7 +44,7 @@ ReQraft (`@qoretechnologies/reqraft`) is a **React hooks and components toolkit*
44
44
  - **Styling:** styled-components (inherited from ReQore); no CSS modules
45
45
  - **State Management:** zustand (stores) + React Context (`use-context-selector`)
46
46
  - **Data Fetching:** `@tanstack/react-query` v4 (via `query()` util + `useFetch` hook)
47
- - **Testing:** Jest + React Testing Library (tests in `__tests__/`)
47
+ - **Testing:** Vitest a `unit` project (jsdom, tests in `__tests__/`) + a `storybook` project (every story run in a real Chromium browser via Playwright); React Testing Library for component assertions
48
48
  - **Documentation:** Storybook (stories co-located in `src/` with `.stories.tsx` suffix)
49
49
  - **Storybook port:** `6008` (not 6007 — that's reqore)
50
50
 
@@ -155,7 +155,9 @@ A generic `<Field>` component dispatches to the appropriate field by type.
155
155
  ```bash
156
156
  yarn install
157
157
  yarn storybook # Dev mode on http://localhost:6008
158
- yarn test:watch # Jest watch mode
158
+ yarn test # Vitest unit tests (jsdom)
159
+ yarn test:watch # Vitest unit watch mode
160
+ yarn test:stories # Story / interaction tests in a real browser (+ Qlip capture)
159
161
  yarn lint # ESLint check
160
162
  yarn build # TypeScript compilation (tsconfig.prod.json)
161
163
  yarn build:test # Type-check without emit
@@ -177,16 +179,17 @@ yarn build:test # Type-check without emit
177
179
 
178
180
  ### Testing Patterns
179
181
 
180
- - Tests live in `__tests__/` (mirror `src/` structure)
181
- - Wrap tests with `ReqraftProvider` (or at minimum `QueryClientProvider`)
182
+ - Two Vitest projects (see `vitest.config.ts`): **unit** (jsdom; tests in `__tests__/`, mirroring `src/`) and **storybook** (every `*.stories.tsx` run in a real Chromium browser via Playwright). There is no Jest.
183
+ - Wrap unit tests with `ReqraftProvider` (or at minimum `QueryClientProvider`)
182
184
  - Use `mock-socket` for WebSocket testing
183
- - Run: `./node_modules/.bin/jest --passWithNoTests`
185
+ - Run: `yarn test` (unit) · `yarn test:stories [file-substring]` (stories) · `yarn precheck` (lint + unit + `build:test:prod`)
184
186
 
185
- ### Storybook Stories
187
+ ### Storybook Stories & visual testing
186
188
 
187
189
  - Stories are co-located alongside source: `src/hooks/useFetch/useFetch.stories.tsx`
188
190
  - Storybook port: **6008**
189
- - Visual testing via Chromatic (`yarn chromatic`)
191
+ - Story + interaction tests run on **Vitest browser mode** (Playwright/Chromium): `yarn test:stories [file-substring]`. Run `yarn install-playwright` once first.
192
+ - **Visual regression via Qlip** (not Chromatic): the story run captures snapshots through the `qlip` Vitest plugin. Upload is gated on `QLIP_UPLOAD_TOKEN` (`vitest.config.ts`), so **local runs capture but never upload** — PNGs land in `qlip/screenshots/<ts>/stories/auto/<StoryId>.png` (gitignored); read the PNG to verify a visual change. CI (`.github/workflows/tests.yml`) sets the token and uploads a build for dashboard review. The full visual-change flow + the `qlip` MCP review skill live in the imported `stacks/frontend/FRONTEND.md`.
190
193
 
191
194
  ## Code Patterns & Conventions
192
195
 
@@ -268,7 +271,7 @@ yarn build:test # Type-check without emit
268
271
  | `src/components/log/` | Log display component |
269
272
  | `src/components/menu/` | Navigation menu component |
270
273
  | `src/types/` | Shared TypeScript types |
271
- | `__tests__/` | Jest tests |
274
+ | `__tests__/` | Vitest unit tests (jsdom) |
272
275
 
273
276
  ## Other
274
277
 
@@ -0,0 +1,108 @@
1
+ import { ReqoreButton, ReqoreDropdown, ReqoreTextarea } from '@qoretechnologies/reqore';
2
+ import { StyledEffect } from '@qoretechnologies/reqore/dist/components/Effect';
3
+ import type { IReqoreIconName } from '@qoretechnologies/reqore/dist/types/icons';
4
+ import { ComponentProps, KeyboardEvent as ReactKeyboardEvent, ReactNode } from 'react';
5
+ /** Reqore's intent / effect / theme unions, without guessing import paths. */
6
+ type TIntent = ComponentProps<typeof ReqoreButton>['intent'];
7
+ type TEffect = ComponentProps<typeof StyledEffect>['effect'];
8
+ type TCustomTheme = ComponentProps<typeof ReqoreButton>['customTheme'];
9
+ /** The exact `items` shape ReqoreDropdown accepts. */
10
+ type TDropdownItems = NonNullable<ComponentProps<typeof ReqoreDropdown>['items']>;
11
+ /** Which editor the composer renders. */
12
+ export type TComposerEditor = 'rich' | 'plain';
13
+ /** One send action. With more than one, the send button splits into a primary
14
+ * button (the first action) + a caret dropdown listing them all. `id` is echoed
15
+ * back to `onSend` so the caller knows which action fired. */
16
+ export interface IComposerSendAction {
17
+ id?: string;
18
+ /** button label; omit for an icon-only button (like the Qonsole send). */
19
+ label?: string;
20
+ icon?: IReqoreIconName;
21
+ intent?: TIntent;
22
+ /** per-button Reqore theme (e.g. `{ main: 'custom1' }` for the Qonsole accent). */
23
+ customTheme?: TCustomTheme;
24
+ /** render the button minimal (subtle, blends into the bar — the Qonsole style). */
25
+ minimal?: boolean;
26
+ }
27
+ /** Imperative handle for consumers that drive the editor externally (e.g. the
28
+ * Qonsole input inserting a completion or navigating history). */
29
+ export interface IComposerHandle {
30
+ focus: () => void;
31
+ clear: () => void;
32
+ setText: (text: string) => void;
33
+ getText: () => string;
34
+ }
35
+ export interface IComposerProps {
36
+ /** Editor flavour. `rich` = ReqoreRichTextEditor (default), `plain` = ReqoreTextarea. */
37
+ editor?: TComposerEditor;
38
+ /** Initial draft text (also seeds the editor for a restored draft / a story). */
39
+ defaultText?: string;
40
+ /** Initial staged files (a restored draft's attachments, or a demo). */
41
+ defaultFiles?: File[];
42
+ placeholder?: string;
43
+ /**
44
+ * Submit the composed message. `text` is the plain-string body; `files` are the
45
+ * staged attachments (raw `File`s — the caller converts to its own upload shape);
46
+ * `action` is the chosen send action's `id` (undefined for the default button).
47
+ */
48
+ onSend: (text: string, options: {
49
+ files: File[];
50
+ action?: string;
51
+ }) => void | Promise<void>;
52
+ /** Single-button label / icon / intent (ignored when `sendActions` is set). */
53
+ sendLabel?: string;
54
+ sendIcon?: IReqoreIconName;
55
+ sendIntent?: TIntent;
56
+ /** Default send button: minimal (subtle, Qonsole-style). Default `true`. */
57
+ sendMinimal?: boolean;
58
+ /** Default send button accent (Reqore `customTheme`). Default `{ main: 'custom1' }`
59
+ * — the Qorus accent, which each app's theme colours (gray in a bare reqore theme). */
60
+ sendCustomTheme?: TCustomTheme;
61
+ /** Multiple send actions → a split send button. The first is the primary. */
62
+ sendActions?: IComposerSendAction[];
63
+ /** className on the split-send caret dropdown (keeps consumer test hooks, e.g.
64
+ * the helpdesk `ticket-send-more`). */
65
+ sendMenuClassName?: string;
66
+ /** the send round-trip is in flight */
67
+ sending?: boolean;
68
+ /** disabled → renders a muted notice with `disabledReason` instead of the composer */
69
+ disabled?: boolean;
70
+ disabledReason?: string;
71
+ /** submit on plain Enter (Shift/Ctrl/Alt/Meta+Enter insert a newline). Default true. */
72
+ submitOnEnter?: boolean;
73
+ /** clear the editor + staged files after a resolved send. Default true. */
74
+ clearOnSend?: boolean;
75
+ /** allow sending with empty text (e.g. attachments only). Default false. */
76
+ allowEmptySend?: boolean;
77
+ /** Extra attach-menu entries beyond "Upload files" (receives `addFiles`). With any
78
+ * entry the attach control becomes a dropdown; otherwise a plain button. */
79
+ attachMenuItems?: (addFiles: (files: File[]) => void) => TDropdownItems;
80
+ /** the attach control icon (Qonsole uses `AddLine`). */
81
+ attachIcon?: IReqoreIconName;
82
+ /** hide the attach control entirely. */
83
+ hideAttach?: boolean;
84
+ /** Slots: `toolbarStart` sits after attach on the left (e.g. the Qonsole slash
85
+ * dropdown), `footerActions` after it (e.g. a reference toggle), `rightActions`
86
+ * left of send (e.g. the Qonsole design button), `aboveInput` on top of the
87
+ * editor inside the bar (e.g. reference chips), and `belowInput` under the bar. */
88
+ toolbarStart?: ReactNode;
89
+ footerActions?: ReactNode;
90
+ rightActions?: ReactNode;
91
+ aboveInput?: ReactNode;
92
+ belowInput?: ReactNode;
93
+ /** Hooks for consumers layering behaviour on the editor (completions, history). */
94
+ onChange?: (text: string) => void;
95
+ onEditorKeyDown?: (e: ReactKeyboardEvent) => void;
96
+ onFocus?: () => void;
97
+ onBlur?: () => void;
98
+ /** editor sizing */
99
+ size?: ComponentProps<typeof ReqoreTextarea>['size'];
100
+ /** drop the composer's outer margin (for tight embeds). */
101
+ minimal?: boolean;
102
+ /** override the bar's gradient / effect (qorus-ide passes its `custom1` accent to
103
+ * match the Qonsole floating bar exactly). */
104
+ effect?: TEffect;
105
+ }
106
+ export declare const Composer: import("react").ForwardRefExoticComponent<IComposerProps & import("react").RefAttributes<IComposerHandle>>;
107
+ export {};
108
+ //# sourceMappingURL=Composer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../../../src/components/composer/Composer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,238 @@
1
+ "use strict";
2
+ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
3
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
4
+ return cooked;
5
+ };
6
+ var __assign = (this && this.__assign) || function () {
7
+ __assign = Object.assign || function(t) {
8
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
9
+ s = arguments[i];
10
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
11
+ t[p] = s[p];
12
+ }
13
+ return t;
14
+ };
15
+ return __assign.apply(this, arguments);
16
+ };
17
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
18
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19
+ return new (P || (P = Promise))(function (resolve, reject) {
20
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
21
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
22
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
23
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
24
+ });
25
+ };
26
+ var __generator = (this && this.__generator) || function (thisArg, body) {
27
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
28
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
29
+ function verb(n) { return function (v) { return step([n, v]); }; }
30
+ function step(op) {
31
+ if (f) throw new TypeError("Generator is already executing.");
32
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
33
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
34
+ if (y = 0, t) op = [op[0] & 2, t.value];
35
+ switch (op[0]) {
36
+ case 0: case 1: t = op; break;
37
+ case 4: _.label++; return { value: op[1], done: false };
38
+ case 5: _.label++; y = op[1]; op = [0]; continue;
39
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
40
+ default:
41
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
42
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
43
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
44
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
45
+ if (t[2]) _.ops.pop();
46
+ _.trys.pop(); continue;
47
+ }
48
+ op = body.call(thisArg, _);
49
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
50
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
51
+ }
52
+ };
53
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
54
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
55
+ if (ar || !(i in from)) {
56
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
57
+ ar[i] = from[i];
58
+ }
59
+ }
60
+ return to.concat(ar || Array.prototype.slice.call(from));
61
+ };
62
+ var __importDefault = (this && this.__importDefault) || function (mod) {
63
+ return (mod && mod.__esModule) ? mod : { "default": mod };
64
+ };
65
+ Object.defineProperty(exports, "__esModule", { value: true });
66
+ exports.Composer = void 0;
67
+ var jsx_runtime_1 = require("react/jsx-runtime");
68
+ // Copyright 2026 Qore Technologies, s.r.o.
69
+ // <Composer> — the shared Qorus message composer, a faithful lift of qorus-ide's
70
+ // Qonsole chat input: the same gradient-bordered `StyledEffect` bar, transparent
71
+ // editor, attachment preview strip, and control row (attach + toolbar on the left,
72
+ // actions + send on the right). Everything Qonsole-specific (slash completions,
73
+ // command history, design-mode, sendCommand) is replaced by slots + props, so the
74
+ // exact same input can back the Qonsole, the helpdesk reply box, and anything else.
75
+ var reqore_1 = require("@qoretechnologies/reqore");
76
+ var Effect_1 = require("@qoretechnologies/reqore/dist/components/Effect");
77
+ var react_1 = require("react");
78
+ var styled_components_1 = __importDefault(require("styled-components"));
79
+ var helpers_1 = require("./helpers");
80
+ // The Qonsole input chrome, lifted verbatim from qorus-ide's StyledInputWrapper.
81
+ // The border is 1px *transparent* — it only reserves the border-box so the
82
+ // `effect` gradient can paint the edge (that's how the Qonsole bar's accent glow
83
+ // is drawn — a gradient border, not a border-color). All colour comes from
84
+ // `effect` (+ the ambient theme), so the bar takes on whatever accent the app /
85
+ // story supplies.
86
+ var StyledComposer = (0, styled_components_1.default)(Effect_1.StyledEffect)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n margin: ", ";\n padding: 4px;\n border: 1px solid transparent;\n border-radius: 6px;\n"], ["\n margin: ", ";\n padding: 4px;\n border: 1px solid transparent;\n border-radius: 6px;\n"])), function (_a) {
87
+ var $minimal = _a.$minimal;
88
+ return ($minimal ? '0' : '2px');
89
+ });
90
+ // Layout-neutral ref holder: `display: contents` generates no box, so it gives the
91
+ // composer a wrapper element to target paste/drop against without perturbing flow.
92
+ var StyledContentsWrapper = styled_components_1.default.div(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n display: contents;\n"], ["\n display: contents;\n"])));
93
+ var StyledAttachmentList = styled_components_1.default.div(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n // 8px left inset (as in the IDE) so it lines up with the editor text; the 10px\n // bottom gives space before whatever follows (references / editor).\n padding: 8px 8px 10px;\n"], ["\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n // 8px left inset (as in the IDE) so it lines up with the editor text; the 10px\n // bottom gives space before whatever follows (references / editor).\n padding: 8px 8px 10px;\n"])));
94
+ // Content shown on top of the editor (e.g. reference chips) gets the same 8px left
95
+ // inset as the attachment strip so both line up with the editor text, not the bar edge.
96
+ var StyledAboveInput = styled_components_1.default.div(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n padding-left: 8px;\n"], ["\n padding-left: 8px;\n"])));
97
+ var StyledAttachment = styled_components_1.default.div(templateObject_5 || (templateObject_5 = __makeTemplateObject(["\n position: relative;\n display: inline-block;\n"], ["\n position: relative;\n display: inline-block;\n"])));
98
+ var StyledAttachmentImage = styled_components_1.default.img(templateObject_6 || (templateObject_6 = __makeTemplateObject(["\n display: block;\n max-height: 80px;\n border-radius: 4px;\n border: 1px solid rgba(123, 104, 238, 0.3);\n"], ["\n display: block;\n max-height: 80px;\n border-radius: 4px;\n border: 1px solid rgba(123, 104, 238, 0.3);\n"])));
99
+ var StyledAttachmentFile = styled_components_1.default.div(templateObject_7 || (templateObject_7 = __makeTemplateObject(["\n display: flex;\n align-items: center;\n gap: 6px;\n height: 40px;\n padding: 0 12px;\n border-radius: 4px;\n border: 1px solid rgba(123, 104, 238, 0.3);\n background: rgba(123, 104, 238, 0.08);\n max-width: 220px;\n"], ["\n display: flex;\n align-items: center;\n gap: 6px;\n height: 40px;\n padding: 0 12px;\n border-radius: 4px;\n border: 1px solid rgba(123, 104, 238, 0.3);\n background: rgba(123, 104, 238, 0.08);\n max-width: 220px;\n"])));
100
+ var StyledAttachmentFilename = (0, styled_components_1.default)(reqore_1.ReqoreSpan)(templateObject_8 || (templateObject_8 = __makeTemplateObject(["\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n"], ["\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n"])));
101
+ var StyledAttachmentRemoveWrapper = styled_components_1.default.div(templateObject_9 || (templateObject_9 = __makeTemplateObject(["\n position: absolute;\n top: -8px;\n right: -8px;\n"], ["\n position: absolute;\n top: -8px;\n right: -8px;\n"])));
102
+ /** The Qonsole bar effect — a `custom1` gradient border over a transparent fill,
103
+ * exactly like qorus-ide's QonsoleInput. `custom1` resolves per app theme (Qorus
104
+ * purple in qorus-ide / admin-portal, gray in a bare reqore theme). Override via
105
+ * the `effect` prop. */
106
+ var DEFAULT_EFFECT = {
107
+ gradient: { direction: 'to bottom right', colors: 'custom1:darken:1:0.9' },
108
+ };
109
+ exports.Composer = (0, react_1.forwardRef)(function Composer(_a, ref) {
110
+ var _this = this;
111
+ var _b = _a.editor, editor = _b === void 0 ? 'rich' : _b, defaultText = _a.defaultText, defaultFiles = _a.defaultFiles, _c = _a.placeholder, placeholder = _c === void 0 ? 'Write a message…' : _c, onSend = _a.onSend, _d = _a.sendLabel, sendLabel = _d === void 0 ? 'Send' : _d, _e = _a.sendIcon, sendIcon = _e === void 0 ? 'SendPlane2Line' : _e, sendIntent = _a.sendIntent, _f = _a.sendMinimal, sendMinimal = _f === void 0 ? true : _f, _g = _a.sendCustomTheme, sendCustomTheme = _g === void 0 ? { main: 'custom1' } : _g, sendActions = _a.sendActions, sendMenuClassName = _a.sendMenuClassName, sending = _a.sending, disabled = _a.disabled, _h = _a.disabledReason, disabledReason = _h === void 0 ? '' : _h, _j = _a.submitOnEnter, submitOnEnter = _j === void 0 ? true : _j, _k = _a.clearOnSend, clearOnSend = _k === void 0 ? true : _k, _l = _a.allowEmptySend, allowEmptySend = _l === void 0 ? false : _l, attachMenuItems = _a.attachMenuItems, _m = _a.attachIcon, attachIcon = _m === void 0 ? 'AddLine' : _m, hideAttach = _a.hideAttach, toolbarStart = _a.toolbarStart, footerActions = _a.footerActions, rightActions = _a.rightActions, aboveInput = _a.aboveInput, belowInput = _a.belowInput, onChange = _a.onChange, onEditorKeyDown = _a.onEditorKeyDown, onFocus = _a.onFocus, onBlur = _a.onBlur, _o = _a.size, size = _o === void 0 ? 'small' : _o, minimal = _a.minimal, _p = _a.effect, effect = _p === void 0 ? DEFAULT_EFFECT : _p;
112
+ var theme = (0, reqore_1.useReqoreTheme)();
113
+ var _q = (0, react_1.useState)(function () {
114
+ return defaultText ? (0, helpers_1.richValueFromString)(defaultText) : helpers_1.EMPTY_RICH_VALUE;
115
+ }), richValue = _q[0], setRichValue = _q[1];
116
+ var _r = (0, react_1.useState)(defaultText !== null && defaultText !== void 0 ? defaultText : ''), plainValue = _r[0], setPlainValue = _r[1];
117
+ var _s = (0, react_1.useState)(function () { return defaultFiles !== null && defaultFiles !== void 0 ? defaultFiles : []; }), files = _s[0], setFiles = _s[1];
118
+ var _t = (0, react_1.useState)([]), previews = _t[0], setPreviews = _t[1];
119
+ var fileInput = (0, react_1.useRef)(null);
120
+ var wrapperRef = (0, react_1.useRef)(null);
121
+ // Image thumbnails for the preview strip; object URLs revoked on change/unmount.
122
+ (0, react_1.useEffect)(function () {
123
+ var urls = files.map(function (f) { return (f.type.startsWith('image/') ? URL.createObjectURL(f) : ''); });
124
+ setPreviews(urls);
125
+ return function () { return urls.forEach(function (u) { return u && URL.revokeObjectURL(u); }); };
126
+ }, [files]);
127
+ var getText = function () {
128
+ return editor === 'rich' ? (0, helpers_1.richValueToString)(richValue) : plainValue;
129
+ };
130
+ var setText = function (text) {
131
+ if (editor === 'rich') {
132
+ setRichValue((0, helpers_1.richValueFromString)(text));
133
+ }
134
+ else {
135
+ setPlainValue(text);
136
+ }
137
+ };
138
+ (0, react_1.useImperativeHandle)(ref, function () { return ({
139
+ focus: function () {
140
+ var _a, _b;
141
+ return (_b = (_a = wrapperRef.current) === null || _a === void 0 ? void 0 : _a.querySelector('[contenteditable="true"], textarea')) === null || _b === void 0 ? void 0 : _b.focus();
142
+ },
143
+ clear: function () { return setText(''); },
144
+ setText: setText,
145
+ getText: getText,
146
+ }); }, [editor, richValue, plainValue]);
147
+ // Every send action inherits the composer's send style (the Qonsole look by
148
+ // default) so a split-send stays visually of a piece with the single button —
149
+ // unless the action picks its own. The accent is only defaulted when the action
150
+ // hasn't chosen an `intent`, since in Reqore an intent owns the colour and would
151
+ // otherwise fight the `customTheme`.
152
+ var withSendStyle = function (action) { return (__assign(__assign({ minimal: sendMinimal }, (action.intent ? undefined : { customTheme: sendCustomTheme })), action)); };
153
+ var actions = (sendActions === null || sendActions === void 0 ? void 0 : sendActions.length)
154
+ ? sendActions.map(withSendStyle)
155
+ : [withSendStyle({ id: undefined, label: sendLabel, icon: sendIcon, intent: sendIntent })];
156
+ var primary = actions[0];
157
+ var isSplit = actions.length > 1;
158
+ var addFiles = function (incoming) {
159
+ if (incoming.length) {
160
+ setFiles(function (prev) { return __spreadArray(__spreadArray([], prev, true), incoming, true); });
161
+ }
162
+ };
163
+ var removeFile = function (index) {
164
+ return setFiles(function (prev) { return prev.filter(function (_, j) { return j !== index; }); });
165
+ };
166
+ var handlePaste = function (event) {
167
+ var images = (0, helpers_1.clipboardImages)(event);
168
+ if (images.length) {
169
+ event.preventDefault();
170
+ addFiles(images);
171
+ }
172
+ };
173
+ var text = getText();
174
+ var canSend = (allowEmptySend || !!text.trim() || files.length > 0) && !sending;
175
+ var handleSend = function (actionId) { return __awaiter(_this, void 0, void 0, function () {
176
+ var body;
177
+ return __generator(this, function (_a) {
178
+ switch (_a.label) {
179
+ case 0:
180
+ body = getText();
181
+ if (!canSend) {
182
+ return [2 /*return*/];
183
+ }
184
+ return [4 /*yield*/, onSend(clearOnSend ? body.trim() : body, { files: files, action: actionId })];
185
+ case 1:
186
+ _a.sent();
187
+ if (clearOnSend) {
188
+ setText('');
189
+ setFiles([]);
190
+ }
191
+ return [2 /*return*/];
192
+ }
193
+ });
194
+ }); };
195
+ var handleKeyDown = function (e) {
196
+ onEditorKeyDown === null || onEditorKeyDown === void 0 ? void 0 : onEditorKeyDown(e);
197
+ if (submitOnEnter && (0, helpers_1.isPlainSubmitEnter)(e)) {
198
+ e.preventDefault();
199
+ void handleSend(primary.id);
200
+ }
201
+ };
202
+ if (disabled) {
203
+ return ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreMessage, { intent: 'muted', icon: 'LockLine', size: 'small', flat: true, children: disabledReason }));
204
+ }
205
+ var extraAttachItems = attachMenuItems ? attachMenuItems(addFiles) : [];
206
+ // Icon-only when `label` is omitted; `customTheme`/`minimal` let a caller match
207
+ // the Qonsole accent send (minimal, custom1-themed) or any other look.
208
+ var sendButton = function (action) { return ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { icon: action.icon, intent: action.intent, customTheme: action.customTheme, minimal: action.minimal, size: size, disabled: !canSend, loading: sending, flat: true, onClick: function () { return handleSend(action.id); }, fixed: !isSplit, children: action.label })); };
209
+ return ((0, jsx_runtime_1.jsxs)(StyledContentsWrapper, { ref: wrapperRef, children: [(0, jsx_runtime_1.jsxs)(StyledComposer, { as: 'div', theme: theme, "$minimal": minimal,
210
+ // transparent fill (like QonsoleInput) → the page shows through and only
211
+ // the effect's gradient *border* glows; `minimal` opts into a solid fill.
212
+ transparent: !minimal, effect: effect, onPaste: handlePaste, children: [(0, jsx_runtime_1.jsx)("input", { ref: fileInput, type: 'file', multiple: true, style: { display: 'none' }, onChange: function (e) {
213
+ if (e.target.files) {
214
+ addFiles(Array.from(e.target.files));
215
+ }
216
+ e.target.value = '';
217
+ } }), files.length > 0 && ((0, jsx_runtime_1.jsx)(StyledAttachmentList, { children: files.map(function (file, index) { return ((0, jsx_runtime_1.jsxs)(StyledAttachment, { children: [previews[index] ? ((0, jsx_runtime_1.jsx)(StyledAttachmentImage, { src: previews[index], alt: file.name })) : ((0, jsx_runtime_1.jsxs)(StyledAttachmentFile, { title: file.name, children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreIcon, { icon: 'FileLine', size: 'small' }), (0, jsx_runtime_1.jsx)(StyledAttachmentFilename, { size: 'small', children: file.name })] })), (0, jsx_runtime_1.jsx)(StyledAttachmentRemoveWrapper, { children: (0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { icon: 'CloseLine', size: 'micro', leftIconProps: { size: 'tiny' }, circle: true, onClick: function () { return removeFile(index); }, tooltip: 'Remove attachment' }) })] }, "".concat(file.name, "-").concat(index))); }) })), (0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { vertical: true, fluid: true, children: [aboveInput && (0, jsx_runtime_1.jsx)(StyledAboveInput, { children: aboveInput }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreControlGroup, { fluid: true, verticalAlign: 'center', size: 'small', children: editor === 'rich' ? ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreRichTextEditor, { value: richValue, panelProps: { fluid: true }, onChange: function (value) {
218
+ setRichValue(value);
219
+ onChange === null || onChange === void 0 ? void 0 : onChange((0, helpers_1.richValueToString)(value));
220
+ }, onKeyDown: handleKeyDown, onFocus: onFocus, onBlur: onBlur, placeholder: placeholder, disabled: sending, transparent: true, flat: true, fluid: true, size: size, actions: { styling: false, undo: false, redo: false }, onClearClick: text ? function () { return setText(''); } : undefined })) : ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreTextarea, { value: plainValue, scaleWithContent: true, fluid: true, transparent: true, flat: true, size: size, placeholder: placeholder, disabled: sending, onChange: function (e) {
221
+ setPlainValue(e.target.value);
222
+ onChange === null || onChange === void 0 ? void 0 : onChange(e.target.value);
223
+ }, onKeyDown: handleKeyDown, onFocus: onFocus, onBlur: onBlur })) }), (0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { fluid: true, size: 'small', spaceBetween: true, verticalAlign: 'center', children: [(0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { stack: true, fluid: false, size: 'small', verticalAlign: 'center', children: [!hideAttach &&
224
+ (extraAttachItems.length ? ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreDropdown, { icon: attachIcon, flat: true, transparent: true, disabled: sending, tooltip: 'Attach', items: __spreadArray([
225
+ {
226
+ label: 'Upload files',
227
+ icon: 'Upload2Line',
228
+ onClick: function () { var _a; return (_a = fileInput.current) === null || _a === void 0 ? void 0 : _a.click(); },
229
+ }
230
+ ], extraAttachItems, true) })) : ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { icon: attachIcon, flat: true, transparent: true, disabled: sending, tooltip: 'Attach files', onClick: function () { var _a; return (_a = fileInput.current) === null || _a === void 0 ? void 0 : _a.click(); } }))), toolbarStart, footerActions] }), (0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { stack: true, fluid: false, size: 'small', children: [rightActions, isSplit ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [sendButton(primary), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreDropdown, { className: sendMenuClassName, icon: 'ArrowDownSLine', intent: primary.intent, customTheme: primary.customTheme, minimal: primary.minimal, disabled: !canSend, tooltip: 'More send options', items: actions.map(function (action) { return ({
231
+ label: action.label,
232
+ icon: action.icon,
233
+ intent: action.intent,
234
+ onClick: function () { return handleSend(action.id); },
235
+ }); }) })] })) : (sendButton(primary))] })] })] })] }), belowInput] }));
236
+ });
237
+ var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6, templateObject_7, templateObject_8, templateObject_9;
238
+ //# sourceMappingURL=Composer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Composer.js","sourceRoot":"","sources":["../../../src/components/composer/Composer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ClipboardEvent, KeyboardEvent } from 'react';
2
+ import type { IReqoreRichTextEditorProps } from '@qoretechnologies/reqore/dist/components/RichTextEditor';
3
+ /** The Slate value for an empty rich editor — a single empty paragraph. */
4
+ export declare const EMPTY_RICH_VALUE: IReqoreRichTextEditorProps['value'];
5
+ /**
6
+ * Rich editor value → plain string. Top-level blocks join with `\n` so a
7
+ * multi-paragraph message (a support reply, a pasted log) survives as real
8
+ * newlines; within a block, text leaves and `tag` values concatenate. Mirrors
9
+ * qorus-ide's `richtextToString` but newline-preserving for multi-line composers.
10
+ */
11
+ export declare const richValueToString: (value: IReqoreRichTextEditorProps['value']) => string;
12
+ /** Plain string → rich editor value: one paragraph per line, so `setText`
13
+ * round-trips with `richValueToString`. */
14
+ export declare const richValueFromString: (text: string) => IReqoreRichTextEditorProps['value'];
15
+ /** Image files present on a clipboard paste (a screenshot, a copied image), so
16
+ * pasting-to-attach works on any composer without an IDE dependency. */
17
+ export declare const clipboardImages: (event: ClipboardEvent) => File[];
18
+ /** Enter with no modifier — the "submit" chord (Shift/Ctrl/Alt/Meta+Enter insert
19
+ * a newline instead). */
20
+ export declare const isPlainSubmitEnter: (e: Pick<KeyboardEvent, 'key' | 'shiftKey' | 'ctrlKey' | 'altKey' | 'metaKey'>) => boolean;
21
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/components/composer/helpers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yDAAyD,CAAC;AAE1G,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,EAAE,0BAA0B,CAAC,OAAO,CAEhE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,UAAW,0BAA0B,CAAC,OAAO,CAAC,KAAG,MAuB9E,CAAC;AAEF;4CAC4C;AAC5C,eAAO,MAAM,mBAAmB,SAAU,MAAM,KAAG,0BAA0B,CAAC,OAAO,CAQpF,CAAC;AAEF;yEACyE;AACzE,eAAO,MAAM,eAAe,UAAW,cAAc,KAAG,IAAI,EAW3D,CAAC;AAEF;0BAC0B;AAC1B,eAAO,MAAM,kBAAkB,MAC1B,KAAK,aAAa,EAAE,KAAK,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC,KAC5E,OAAoF,CAAC"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ // Copyright 2026 Qore Technologies, s.r.o.
3
+ // Pure helpers for the shared <Composer>. No DOM/app coupling — safe on any surface.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.isPlainSubmitEnter = exports.clipboardImages = exports.richValueFromString = exports.richValueToString = exports.EMPTY_RICH_VALUE = void 0;
6
+ /** The Slate value for an empty rich editor — a single empty paragraph. */
7
+ exports.EMPTY_RICH_VALUE = [
8
+ { type: 'paragraph', children: [{ text: '' }] },
9
+ ];
10
+ /**
11
+ * Rich editor value → plain string. Top-level blocks join with `\n` so a
12
+ * multi-paragraph message (a support reply, a pasted log) survives as real
13
+ * newlines; within a block, text leaves and `tag` values concatenate. Mirrors
14
+ * qorus-ide's `richtextToString` but newline-preserving for multi-line composers.
15
+ */
16
+ var richValueToString = function (value) {
17
+ if (!value) {
18
+ return '';
19
+ }
20
+ if (typeof value === 'string') {
21
+ return value;
22
+ }
23
+ var nodeText = function (node) {
24
+ var _a, _b;
25
+ if (node == null) {
26
+ return '';
27
+ }
28
+ if (typeof node.text === 'string') {
29
+ return node.text;
30
+ }
31
+ if (node.type === 'tag') {
32
+ return (_b = (_a = node.value) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '';
33
+ }
34
+ if (Array.isArray(node.children)) {
35
+ return node.children.map(nodeText).join('');
36
+ }
37
+ return '';
38
+ };
39
+ return value.map(nodeText).join('\n');
40
+ };
41
+ exports.richValueToString = richValueToString;
42
+ /** Plain string → rich editor value: one paragraph per line, so `setText`
43
+ * round-trips with `richValueToString`. */
44
+ var richValueFromString = function (text) {
45
+ if (!text) {
46
+ return exports.EMPTY_RICH_VALUE;
47
+ }
48
+ return text.split('\n').map(function (line) { return ({
49
+ type: 'paragraph',
50
+ children: [{ text: line }],
51
+ }); });
52
+ };
53
+ exports.richValueFromString = richValueFromString;
54
+ /** Image files present on a clipboard paste (a screenshot, a copied image), so
55
+ * pasting-to-attach works on any composer without an IDE dependency. */
56
+ var clipboardImages = function (event) {
57
+ var _a, _b;
58
+ var images = [];
59
+ for (var _i = 0, _c = Array.from((_b = (_a = event.clipboardData) === null || _a === void 0 ? void 0 : _a.items) !== null && _b !== void 0 ? _b : []); _i < _c.length; _i++) {
60
+ var item = _c[_i];
61
+ if (item.kind === 'file' && item.type.startsWith('image/')) {
62
+ var file = item.getAsFile();
63
+ if (file) {
64
+ images.push(file);
65
+ }
66
+ }
67
+ }
68
+ return images;
69
+ };
70
+ exports.clipboardImages = clipboardImages;
71
+ /** Enter with no modifier — the "submit" chord (Shift/Ctrl/Alt/Meta+Enter insert
72
+ * a newline instead). */
73
+ var isPlainSubmitEnter = function (e) { return e.key === 'Enter' && !e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey; };
74
+ exports.isPlainSubmitEnter = isPlainSubmitEnter;
75
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/components/composer/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './Composer';
2
+ export * from './helpers';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/composer/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./Composer"), exports);
18
+ __exportStar(require("./helpers"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/composer/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,4CAA0B"}
@@ -53,7 +53,7 @@ export declare const flattenOptions: (options: TQorusForm) => TQorusFlatForm;
53
53
  export declare const getTypeAndCanBeNull: (type?: TQorusType | TQorusType[], allowed_values?: any[], operatorData?: TOperatorValue, operators?: IOperatorsSchema) => {
54
54
  type: TQorusType;
55
55
  defaultType: TQorusType;
56
- defaultInternalType: "string" | "number" | "boolean" | "function" | "url" | "data" | "richtext" | "type" | "group" | "list" | "fsm" | "errors" | "step" | "class" | "code-editor" | "processor-mappings" | "tool-catalog" | "mapper" | "workflow" | "service" | "job" | "connection" | "constant" | "mapper-code" | "queue" | "pipeline" | "sla" | "value-map" | "qog" | "ai-collection" | "ai-endpoint" | "ai-guardrail" | "binary" | "date" | "email" | "long-string" | "enum" | "int" | "integer" | "float" | "range" | "free-list" | "hash" | "rgbcolor" | "free-hash" | "null" | "nothing" | "bool" | "data-provider" | "context" | "file";
56
+ defaultInternalType: "string" | "number" | "boolean" | "function" | "type" | "file" | "data" | "date" | "email" | "range" | "url" | "group" | "list" | "step" | "richtext" | "fsm" | "errors" | "class" | "code-editor" | "processor-mappings" | "tool-catalog" | "mapper" | "workflow" | "service" | "job" | "connection" | "constant" | "mapper-code" | "queue" | "pipeline" | "sla" | "value-map" | "qog" | "ai-collection" | "ai-endpoint" | "ai-guardrail" | "binary" | "long-string" | "enum" | "int" | "integer" | "float" | "free-list" | "hash" | "rgbcolor" | "free-hash" | "null" | "nothing" | "bool" | "data-provider" | "context";
57
57
  canBeNull: boolean;
58
58
  };
59
59
  /** Display metadata for a read-first group, keyed by the raw `group` string;
@@ -0,0 +1,21 @@
1
+ export interface IImageLightboxImage {
2
+ attachment_id: string;
3
+ filename: string;
4
+ }
5
+ export interface IImageLightboxProps {
6
+ /** the set the viewer pages across — one image is a set of one (no paging chrome) */
7
+ images: IImageLightboxImage[];
8
+ /** which image is shown */
9
+ index: number;
10
+ onIndex: (index: number) => void;
11
+ onClose: () => void;
12
+ /** resolve an image's bytes as an object URL (the consumer's authed endpoint) */
13
+ fetchAttachmentUrl: (attachmentId: string) => Promise<string>;
14
+ onDownload?: (attachmentId: string, filename: string) => void;
15
+ /** Rename the shown image. Presence of the callback IS the permission — a staged
16
+ * (composer) set passes it, server-side attachment sets simply don't, so the
17
+ * thread / References viewers stay rename-free without any extra flag. */
18
+ onRename?: (attachmentId: string, newName: string) => void;
19
+ }
20
+ export declare const ImageLightbox: ({ images, index, onIndex, onClose, fetchAttachmentUrl, onDownload, onRename, }: IImageLightboxProps) => import("react/jsx-runtime").JSX.Element;
21
+ //# sourceMappingURL=ImageLightbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageLightbox.d.ts","sourceRoot":"","sources":["../../../src/components/imageLightbox/ImageLightbox.tsx"],"names":[],"mappings":"AAiDA,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,qFAAqF;IACrF,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,iFAAiF;IACjF,kBAAkB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9D,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D;;+EAE2E;IAC3E,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5D;AAED,eAAO,MAAM,aAAa,mFAQvB,mBAAmB,4CA6JrB,CAAC"}