documentation-hub 5.7.2

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 (271) hide show
  1. package/.eslintrc.json +43 -0
  2. package/.github/workflows/build.yml +64 -0
  3. package/.github/workflows/ci.yml +39 -0
  4. package/.vscode/extensions.json +3 -0
  5. package/Current.md +97 -0
  6. package/DocHub_Image.png +0 -0
  7. package/README.md +666 -0
  8. package/USER_GUIDE.md +1173 -0
  9. package/Updater.md +311 -0
  10. package/build/256x256.png +0 -0
  11. package/build/512x512.png +0 -0
  12. package/build/app-update.yml +4 -0
  13. package/build/create-icon.js +208 -0
  14. package/build/icon.ico +0 -0
  15. package/build/icon.png +0 -0
  16. package/build/icon_1024x1024.png +0 -0
  17. package/dist/assets/Analytics-BpsG9895.js +1 -0
  18. package/dist/assets/Card-IAZin8kp.js +1 -0
  19. package/dist/assets/CurrentSession-B-rFkHvf.js +12 -0
  20. package/dist/assets/Dashboard-C_5gMb0q.js +1 -0
  21. package/dist/assets/Documents-CqZ25axS.js +1 -0
  22. package/dist/assets/Input-l89xwXBi.js +1 -0
  23. package/dist/assets/Reporting-DqdHJY_a.js +1 -0
  24. package/dist/assets/Search-XNbu5z_3.js +1 -0
  25. package/dist/assets/SessionManager-lH9hZfzH.js +1 -0
  26. package/dist/assets/Sessions-ClZOPYNc.js +1 -0
  27. package/dist/assets/Settings-DUEHGURa.js +11 -0
  28. package/dist/assets/index-8xUe8ptc.js +24 -0
  29. package/dist/assets/index-RYyJqF7O.css +1 -0
  30. package/dist/assets/path-BkOl0AGO.js +1 -0
  31. package/dist/assets/promises-ID_B9S-h.js +1 -0
  32. package/dist/assets/urlHelpers-TvgahX0r.js +1 -0
  33. package/dist/assets/useToast-yRSO1dkm.js +1 -0
  34. package/dist/assets/vendor-charts-RkGK5ROP.js +36 -0
  35. package/dist/assets/vendor-db-l0sNRNKZ.js +1 -0
  36. package/dist/assets/vendor-react-BVZ_anCF.js +4 -0
  37. package/dist/assets/vendor-search-Dw8P0qyA.js +1 -0
  38. package/dist/assets/vendor-ui-BU7NfluV.js +53 -0
  39. package/dist/electron/PowerAutomateApiService-LfW09ZGr.js +147 -0
  40. package/dist/electron/main-CXkNtyv-.js +19789 -0
  41. package/dist/electron/main.js +5 -0
  42. package/dist/electron/preload.js +1 -0
  43. package/dist/icon.png +0 -0
  44. package/dist/index.html +27 -0
  45. package/docs/CODEBASE_ANALYSIS_REPORT.md +309 -0
  46. package/docs/DEBUG_LOGGING_GUIDE.md +244 -0
  47. package/docs/README.md +115 -0
  48. package/docs/TOC_WIRING_GUIDE.md +344 -0
  49. package/docs/analysis/Bullet_Symbol_Bug_Analysis.md +136 -0
  50. package/docs/analysis/DOCXMLATER_ANALYSIS_SUMMARY.txt +169 -0
  51. package/docs/analysis/Document_Processing_Issues_Analysis.md +704 -0
  52. package/docs/analysis/FIELD_PRESERVATION_ANALYSIS.md +1200 -0
  53. package/docs/analysis/INDENTATION_PRESERVE_ANALYSIS.md +181 -0
  54. package/docs/analysis/INDENTATION_PRESERVE_IMPLEMENTATION.md +207 -0
  55. package/docs/analysis/List_Implementation.md +206 -0
  56. package/docs/analysis/List_Implementation_Accuracy_Report.md +366 -0
  57. package/docs/analysis/PROCESSING_OPTIONS_UI_UPDATES.md +220 -0
  58. package/docs/analysis/RefactorStyles.md +852 -0
  59. package/docs/analysis/STYLE_PARAMETER_ENHANCEMENT.md +143 -0
  60. package/docs/analysis/docxmlater-comparison-todo-2025-11-13.md +636 -0
  61. package/docs/analysis/docxmlater-implementation-analysis-2025-11-13.md +340 -0
  62. package/docs/analysis/docxmlater-template_ui-integration-analysis.md +263 -0
  63. package/docs/analysis/github-issues-to-create.md +237 -0
  64. package/docs/api/API_README.md +538 -0
  65. package/docs/api/API_REFERENCE.md +751 -0
  66. package/docs/api/TYPE_DEFINITIONS.md +869 -0
  67. package/docs/architecture/FONT_EMBEDDING_GUIDE.md +318 -0
  68. package/docs/architecture/docxmlater-functions-and-structure.md +726 -0
  69. package/docs/docxmlater-readme.md +1341 -0
  70. package/docs/fixes/EXECUTION_LOG_TEST_BASE.md +573 -0
  71. package/docs/fixes/HYPERLINK_TEXT_SANITIZATION.md +253 -0
  72. package/docs/fixes/README.md +37 -0
  73. package/docs/github-issues/issue-1-body.md +125 -0
  74. package/docs/github-issues/issue-10-body.md +850 -0
  75. package/docs/github-issues/issue-2-body.md +200 -0
  76. package/docs/github-issues/issue-3-body.md +270 -0
  77. package/docs/github-issues/issue-4-body.md +169 -0
  78. package/docs/github-issues/issue-5-body.md +173 -0
  79. package/docs/github-issues/issue-6-body.md +158 -0
  80. package/docs/github-issues/issue-7-body.md +171 -0
  81. package/docs/github-issues/issue-8-body.md +407 -0
  82. package/docs/github-issues/issue-9-body.md +515 -0
  83. package/docs/github-issues/issue-tracker.md +274 -0
  84. package/docs/github-issues/predictive-analysis-2025-10-18.md +2131 -0
  85. package/docs/implementation/List_Framework_Refactor_Plan.md +336 -0
  86. package/docs/implementation/PRIMARY_TEXT_COLOR_FEATURE.md +217 -0
  87. package/docs/implementation/RELEASE_PLAN_v2.1.0.md +362 -0
  88. package/docs/implementation/RefactorStyles.md +588 -0
  89. package/docs/implementation/implement-plan.md +489 -0
  90. package/docs/implementation/missing-helpers-implementation.md +391 -0
  91. package/docs/implementation/refactor-plan.md +520 -0
  92. package/docs/implementation/session-implementation-complete.md +233 -0
  93. package/docs/implementation/session-management-plan.md +250 -0
  94. package/docs/setup-checklist.md +77 -0
  95. package/docs/versions/changelog.md +345 -0
  96. package/electron/customUpdater.ts +656 -0
  97. package/electron/main.ts +2441 -0
  98. package/electron/memoryConfig.ts +187 -0
  99. package/electron/preload.ts +394 -0
  100. package/electron/proxyConfig.ts +340 -0
  101. package/electron/services/BackupService.ts +452 -0
  102. package/electron/services/DictionaryService.ts +402 -0
  103. package/electron/services/LocalDictionaryLookupService.ts +147 -0
  104. package/electron/services/PowerAutomateApiService.ts +231 -0
  105. package/electron/services/SharePointSyncService.ts +474 -0
  106. package/electron/windowsCertStore.ts +427 -0
  107. package/electron/zscalerConfig.ts +381 -0
  108. package/eslint.config.js +92 -0
  109. package/jest.config.js +52 -0
  110. package/package.json +214 -0
  111. package/postcss.config.mjs +6 -0
  112. package/public/icon.png +0 -0
  113. package/publish-release.ps1 +5 -0
  114. package/renovate.json +30 -0
  115. package/src/App.tsx +216 -0
  116. package/src/__mocks__/p-limit.js +12 -0
  117. package/src/__mocks__/styleMock.js +1 -0
  118. package/src/components/common/BugReportButton.tsx +44 -0
  119. package/src/components/common/BugReportDialog.tsx +193 -0
  120. package/src/components/common/Button.tsx +153 -0
  121. package/src/components/common/Card.tsx +86 -0
  122. package/src/components/common/ColorPickerDialog.tsx +177 -0
  123. package/src/components/common/ConfirmDialog.tsx +96 -0
  124. package/src/components/common/DebugConsole.tsx +275 -0
  125. package/src/components/common/EmptyState.tsx +183 -0
  126. package/src/components/common/ErrorBoundary.tsx +98 -0
  127. package/src/components/common/ErrorDetailsDialog.tsx +153 -0
  128. package/src/components/common/ErrorFallback.tsx +218 -0
  129. package/src/components/common/Input.tsx +109 -0
  130. package/src/components/common/Skeleton.tsx +184 -0
  131. package/src/components/common/SplashScreen.tsx +81 -0
  132. package/src/components/common/Toast.tsx +155 -0
  133. package/src/components/common/Tooltip.tsx +79 -0
  134. package/src/components/common/UpdateNotification.tsx +320 -0
  135. package/src/components/comparison/ComparisonWindow.tsx +374 -0
  136. package/src/components/comparison/SideBySideDiff.tsx +486 -0
  137. package/src/components/comparison/index.ts +8 -0
  138. package/src/components/document/DocumentUploader.tsx +288 -0
  139. package/src/components/document/HyperlinkPreview.tsx +430 -0
  140. package/src/components/document/HyperlinkService.md +1484 -0
  141. package/src/components/document/Hyperlink_Technical_Documentation.md +496 -0
  142. package/src/components/document/InlineChangesView.tsx +707 -0
  143. package/src/components/document/ProcessingProgress.tsx +303 -0
  144. package/src/components/document/ProcessingResults.tsx +256 -0
  145. package/src/components/document/TrackedChangesDetail.tsx +530 -0
  146. package/src/components/document/TrackedChangesPanel.tsx +546 -0
  147. package/src/components/document/VirtualDocumentList.tsx +240 -0
  148. package/src/components/editor/DocumentEditor.tsx +723 -0
  149. package/src/components/editor/DocumentEditorModal.tsx +640 -0
  150. package/src/components/editor/EditorQuickActions.tsx +502 -0
  151. package/src/components/editor/EditorToolbar.tsx +312 -0
  152. package/src/components/editor/TableEditor.tsx +926 -0
  153. package/src/components/editor/index.ts +18 -0
  154. package/src/components/layout/Header.tsx +190 -0
  155. package/src/components/layout/Sidebar.tsx +313 -0
  156. package/src/components/layout/TitleBar.tsx +190 -0
  157. package/src/components/navigation/CommandPalette.tsx +233 -0
  158. package/src/components/navigation/KeyboardShortcutsModal.tsx +173 -0
  159. package/src/components/sessions/ChangeItem.tsx +408 -0
  160. package/src/components/sessions/ChangeViewer.tsx +1155 -0
  161. package/src/components/sessions/DocumentComparisonModal.tsx +314 -0
  162. package/src/components/sessions/ProcessingOptions.tsx +297 -0
  163. package/src/components/sessions/ReplacementsTab.tsx +438 -0
  164. package/src/components/sessions/RevisionHandlingOptions.tsx +87 -0
  165. package/src/components/sessions/SessionManager.tsx +188 -0
  166. package/src/components/sessions/StylesEditor.tsx +1335 -0
  167. package/src/components/sessions/TabContainer.tsx +151 -0
  168. package/src/components/sessions/VirtualSessionList.tsx +157 -0
  169. package/src/components/sessions/sessionToProcessorManager.tsx +420 -0
  170. package/src/components/settings/CertificateManager.tsx +410 -0
  171. package/src/components/settings/SegmentedControl.tsx +88 -0
  172. package/src/components/settings/SettingRow.tsx +52 -0
  173. package/src/contexts/GlobalStatsContext.tsx +396 -0
  174. package/src/contexts/SessionContext.tsx +2129 -0
  175. package/src/contexts/ThemeContext.tsx +428 -0
  176. package/src/contexts/UserSettingsContext.tsx +290 -0
  177. package/src/contexts/__tests__/GlobalStatsContext.test.tsx +390 -0
  178. package/src/global.d.ts +273 -0
  179. package/src/hooks/useDocumentQueue.tsx +210 -0
  180. package/src/hooks/useToast.tsx +55 -0
  181. package/src/main.tsx +10 -0
  182. package/src/pages/Analytics.tsx +386 -0
  183. package/src/pages/CurrentSession.tsx +1174 -0
  184. package/src/pages/Dashboard.tsx +319 -0
  185. package/src/pages/Documents.tsx +317 -0
  186. package/src/pages/Projects.tsx +250 -0
  187. package/src/pages/Reporting.tsx +386 -0
  188. package/src/pages/Search.tsx +349 -0
  189. package/src/pages/Sessions.tsx +285 -0
  190. package/src/pages/Settings.tsx +2662 -0
  191. package/src/services/HyperlinkService.ts +1085 -0
  192. package/src/services/document/DocXMLaterProcessor.ts +617 -0
  193. package/src/services/document/DocumentProcessingComparison.ts +856 -0
  194. package/src/services/document/DocumentSnapshotService.ts +575 -0
  195. package/src/services/document/WordDocumentProcessor.ts +10509 -0
  196. package/src/services/document/__tests__/DocXMLaterProcessor.hyperlinks.test.md +311 -0
  197. package/src/services/document/__tests__/WordDocumentProcessor.integration.test.ts +515 -0
  198. package/src/services/document/__tests__/WordDocumentProcessor.test.ts +812 -0
  199. package/src/services/document/blanklines/BlankLineManager.ts +658 -0
  200. package/src/services/document/blanklines/__tests__/paragraphChecks.test.ts +281 -0
  201. package/src/services/document/blanklines/helpers/blankLineInsertion.ts +87 -0
  202. package/src/services/document/blanklines/helpers/blankLineSnapshot.ts +251 -0
  203. package/src/services/document/blanklines/helpers/clearCustom.ts +121 -0
  204. package/src/services/document/blanklines/helpers/contextChecks.ts +117 -0
  205. package/src/services/document/blanklines/helpers/imageChecks.ts +51 -0
  206. package/src/services/document/blanklines/helpers/paragraphChecks.ts +236 -0
  207. package/src/services/document/blanklines/helpers/removeBlanksBetweenListItems.ts +91 -0
  208. package/src/services/document/blanklines/helpers/removeTrailingBlanks.ts +35 -0
  209. package/src/services/document/blanklines/helpers/tableGuards.ts +21 -0
  210. package/src/services/document/blanklines/index.ts +67 -0
  211. package/src/services/document/blanklines/rules/additionRules.ts +337 -0
  212. package/src/services/document/blanklines/rules/indentationRules.ts +317 -0
  213. package/src/services/document/blanklines/rules/removalRules.ts +362 -0
  214. package/src/services/document/blanklines/rules/ruleTypes.ts +92 -0
  215. package/src/services/document/blanklines/types.ts +29 -0
  216. package/src/services/document/helpers/ImageBorderCropper.ts +377 -0
  217. package/src/services/document/helpers/__tests__/whitespace.test.ts +272 -0
  218. package/src/services/document/helpers/whitespace.ts +117 -0
  219. package/src/services/document/list/ListNormalizer.ts +947 -0
  220. package/src/services/document/list/index.ts +45 -0
  221. package/src/services/document/list/list-detection.ts +275 -0
  222. package/src/services/document/list/list-types.ts +162 -0
  223. package/src/services/document/processors/HyperlinkProcessor.ts +370 -0
  224. package/src/services/document/processors/ListProcessor.ts +257 -0
  225. package/src/services/document/processors/StructureProcessor.ts +176 -0
  226. package/src/services/document/processors/StyleProcessor.ts +389 -0
  227. package/src/services/document/processors/TableProcessor.ts +2238 -0
  228. package/src/services/document/processors/__tests__/HyperlinkProcessor.test.ts +314 -0
  229. package/src/services/document/processors/__tests__/ListProcessor.test.ts +291 -0
  230. package/src/services/document/processors/__tests__/StructureProcessor.test.ts +257 -0
  231. package/src/services/document/processors/__tests__/TableProcessor.hlp-tips-bullets.test.ts +459 -0
  232. package/src/services/document/processors/__tests__/TableProcessor.test.ts +1604 -0
  233. package/src/services/document/processors/index.ts +28 -0
  234. package/src/services/document/types/docx-processing.ts +310 -0
  235. package/src/services/editor/EditorActionHandlers.ts +901 -0
  236. package/src/services/editor/index.ts +13 -0
  237. package/src/setupTests.ts +47 -0
  238. package/src/styles/global.css +782 -0
  239. package/src/types/backup.ts +132 -0
  240. package/src/types/dictionary.ts +125 -0
  241. package/src/types/document-processing.ts +331 -0
  242. package/src/types/docxmlater-augments.d.ts +142 -0
  243. package/src/types/editor.ts +280 -0
  244. package/src/types/electron.ts +340 -0
  245. package/src/types/globalStats.ts +155 -0
  246. package/src/types/hyperlink.ts +471 -0
  247. package/src/types/operations.ts +354 -0
  248. package/src/types/session.ts +427 -0
  249. package/src/types/settings.ts +112 -0
  250. package/src/utils/MemoryMonitor.ts +248 -0
  251. package/src/utils/cn.ts +6 -0
  252. package/src/utils/colorConvert.ts +306 -0
  253. package/src/utils/diffUtils.ts +347 -0
  254. package/src/utils/documentUtils.ts +202 -0
  255. package/src/utils/electronGuard.ts +62 -0
  256. package/src/utils/indexedDB.ts +915 -0
  257. package/src/utils/logger.ts +717 -0
  258. package/src/utils/pathSecurity.ts +232 -0
  259. package/src/utils/pathValidator.ts +236 -0
  260. package/src/utils/processingTimeEstimator.ts +153 -0
  261. package/src/utils/safeJsonParse.ts +62 -0
  262. package/src/utils/textSanitizer.ts +162 -0
  263. package/src/utils/urlHelpers.ts +304 -0
  264. package/src/utils/urlPatterns.ts +198 -0
  265. package/src/utils/urlSanitizer.ts +152 -0
  266. package/src/vite-env.d.ts +11 -0
  267. package/tsconfig.electron.json +19 -0
  268. package/tsconfig.json +36 -0
  269. package/tsconfig.node.json +12 -0
  270. package/typedoc.json +45 -0
  271. package/vite.config.ts +152 -0
@@ -0,0 +1,502 @@
1
+ /**
2
+ * EditorQuickActions - Sidebar panel with quick action buttons
3
+ *
4
+ * Contains categorized quick actions for:
5
+ * - Text formatting (bold, italic, underline, etc.)
6
+ * - Paragraph styles (Heading 1, Heading 2, Normal)
7
+ * - Table shading (Header 2 shading, Other shading)
8
+ * - Table operations (add/remove rows/columns, merge, etc.)
9
+ * - Tracked changes (accept all, reject all)
10
+ */
11
+
12
+ import { useState, useCallback } from 'react';
13
+ import { motion, AnimatePresence } from 'framer-motion';
14
+ import {
15
+ ChevronDown,
16
+ ChevronRight,
17
+ Bold,
18
+ Italic,
19
+ Underline,
20
+ RemoveFormatting,
21
+ Link2,
22
+ Unlink,
23
+ FileText,
24
+ ListOrdered,
25
+ Table2,
26
+ Plus,
27
+ Minus,
28
+ ArrowUp,
29
+ ArrowDown,
30
+ ArrowLeft,
31
+ ArrowRight,
32
+ Merge,
33
+ Split,
34
+ Paintbrush,
35
+ Grid3X3,
36
+ AlignVerticalJustifyCenter,
37
+ AlignVerticalJustifyStart,
38
+ AlignVerticalJustifyEnd,
39
+ Check,
40
+ XCircle,
41
+ Search,
42
+ SeparatorHorizontal,
43
+ } from 'lucide-react';
44
+ import { cn } from '@/utils/cn';
45
+ import type { QuickActionId, CellSelection } from '@/types/editor';
46
+
47
+ interface EditorQuickActionsProps {
48
+ /** Handler for quick action clicks */
49
+ onAction: (actionId: QuickActionId) => void;
50
+ /** Whether a table is currently selected */
51
+ hasTableSelection: boolean;
52
+ /** Whether text is currently selected */
53
+ hasTextSelection: boolean;
54
+ /** Current cell selection (if any) */
55
+ cellSelection?: CellSelection | null;
56
+ /** Table shading settings from session */
57
+ tableShadingSettings?: {
58
+ header2Shading: string;
59
+ otherShading: string;
60
+ };
61
+ /** Whether actions are disabled */
62
+ disabled?: boolean;
63
+ }
64
+
65
+ interface ActionButton {
66
+ id: QuickActionId;
67
+ icon: React.ElementType;
68
+ label: string;
69
+ description?: string;
70
+ requiresTable?: boolean;
71
+ requiresSelection?: boolean;
72
+ }
73
+
74
+ interface ActionGroup {
75
+ label: string;
76
+ icon: React.ElementType;
77
+ defaultOpen?: boolean;
78
+ actions: ActionButton[];
79
+ }
80
+
81
+ /**
82
+ * Single action button
83
+ */
84
+ function QuickActionButton({
85
+ action,
86
+ onClick,
87
+ disabled,
88
+ }: {
89
+ action: ActionButton;
90
+ onClick: () => void;
91
+ disabled: boolean;
92
+ }) {
93
+ return (
94
+ <button
95
+ onClick={onClick}
96
+ disabled={disabled}
97
+ className={cn(
98
+ 'w-full flex items-center gap-2 px-3 py-2 text-sm rounded-lg transition-colors',
99
+ 'hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed',
100
+ 'text-left'
101
+ )}
102
+ title={action.description || action.label}
103
+ >
104
+ <action.icon className="w-4 h-4 flex-shrink-0" />
105
+ <span className="truncate">{action.label}</span>
106
+ </button>
107
+ );
108
+ }
109
+
110
+ /**
111
+ * Collapsible action group
112
+ */
113
+ function ActionGroupSection({
114
+ group,
115
+ isOpen,
116
+ onToggle,
117
+ onAction,
118
+ disabled,
119
+ hasTableSelection,
120
+ hasTextSelection,
121
+ }: {
122
+ group: ActionGroup;
123
+ isOpen: boolean;
124
+ onToggle: () => void;
125
+ onAction: (actionId: QuickActionId) => void;
126
+ disabled: boolean;
127
+ hasTableSelection: boolean;
128
+ hasTextSelection: boolean;
129
+ }) {
130
+ return (
131
+ <div className="border-b border-border/50 last:border-b-0">
132
+ <button
133
+ onClick={onToggle}
134
+ className="w-full flex items-center gap-2 px-3 py-2.5 text-sm font-medium hover:bg-muted/50 transition-colors"
135
+ >
136
+ {isOpen ? (
137
+ <ChevronDown className="w-4 h-4" />
138
+ ) : (
139
+ <ChevronRight className="w-4 h-4" />
140
+ )}
141
+ <group.icon className="w-4 h-4" />
142
+ <span className="flex-1 text-left">{group.label}</span>
143
+ </button>
144
+
145
+ <AnimatePresence>
146
+ {isOpen && (
147
+ <motion.div
148
+ initial={{ height: 0, opacity: 0 }}
149
+ animate={{ height: 'auto', opacity: 1 }}
150
+ exit={{ height: 0, opacity: 0 }}
151
+ transition={{ duration: 0.15 }}
152
+ className="overflow-hidden"
153
+ >
154
+ <div className="pb-2 px-2 space-y-0.5">
155
+ {group.actions.map((action) => {
156
+ const isDisabled =
157
+ disabled ||
158
+ (action.requiresTable === true && !hasTableSelection) ||
159
+ (action.requiresSelection === true && !hasTextSelection);
160
+
161
+ return (
162
+ <QuickActionButton
163
+ key={action.id}
164
+ action={action}
165
+ onClick={() => onAction(action.id)}
166
+ disabled={isDisabled}
167
+ />
168
+ );
169
+ })}
170
+ </div>
171
+ </motion.div>
172
+ )}
173
+ </AnimatePresence>
174
+ </div>
175
+ );
176
+ }
177
+
178
+ /**
179
+ * Main EditorQuickActions component
180
+ */
181
+ export function EditorQuickActions({
182
+ onAction,
183
+ hasTableSelection,
184
+ hasTextSelection,
185
+ cellSelection,
186
+ tableShadingSettings,
187
+ disabled = false,
188
+ }: EditorQuickActionsProps) {
189
+ const [openGroups, setOpenGroups] = useState<Set<string>>(
190
+ new Set(['Text Formatting', 'Table Shading'])
191
+ );
192
+
193
+ const toggleGroup = useCallback((label: string) => {
194
+ setOpenGroups((prev) => {
195
+ const next = new Set(prev);
196
+ if (next.has(label)) {
197
+ next.delete(label);
198
+ } else {
199
+ next.add(label);
200
+ }
201
+ return next;
202
+ });
203
+ }, []);
204
+
205
+ // Define action groups
206
+ const actionGroups: ActionGroup[] = [
207
+ {
208
+ label: 'Table Shading',
209
+ icon: Paintbrush,
210
+ defaultOpen: true,
211
+ actions: [
212
+ {
213
+ id: 'apply-h2-shading',
214
+ icon: Paintbrush,
215
+ label: 'Apply Header 2 Shading',
216
+ description: `Apply ${tableShadingSettings?.header2Shading || '#BFBFBF'} shading`,
217
+ requiresTable: true,
218
+ },
219
+ {
220
+ id: 'apply-other-shading',
221
+ icon: Paintbrush,
222
+ label: 'Apply Other Shading',
223
+ description: `Apply ${tableShadingSettings?.otherShading || '#DFDFDF'} shading`,
224
+ requiresTable: true,
225
+ },
226
+ ],
227
+ },
228
+ {
229
+ label: 'Text Formatting',
230
+ icon: Bold,
231
+ defaultOpen: true,
232
+ actions: [
233
+ {
234
+ id: 'bold',
235
+ icon: Bold,
236
+ label: 'Bold',
237
+ description: 'Toggle bold (Ctrl+B)',
238
+ requiresSelection: true,
239
+ },
240
+ {
241
+ id: 'italic',
242
+ icon: Italic,
243
+ label: 'Italic',
244
+ description: 'Toggle italic (Ctrl+I)',
245
+ requiresSelection: true,
246
+ },
247
+ {
248
+ id: 'underline',
249
+ icon: Underline,
250
+ label: 'Underline',
251
+ description: 'Toggle underline (Ctrl+U)',
252
+ requiresSelection: true,
253
+ },
254
+ {
255
+ id: 'clear-formatting',
256
+ icon: RemoveFormatting,
257
+ label: 'Clear Formatting',
258
+ description: 'Remove all formatting',
259
+ requiresSelection: true,
260
+ },
261
+ ],
262
+ },
263
+ {
264
+ label: 'Hyperlinks',
265
+ icon: Link2,
266
+ actions: [
267
+ {
268
+ id: 'insert-hyperlink',
269
+ icon: Link2,
270
+ label: 'Insert Hyperlink',
271
+ description: 'Add hyperlink to selection',
272
+ requiresSelection: true,
273
+ },
274
+ {
275
+ id: 'remove-hyperlink',
276
+ icon: Unlink,
277
+ label: 'Remove Hyperlink',
278
+ description: 'Convert hyperlink to plain text',
279
+ requiresSelection: true,
280
+ },
281
+ ],
282
+ },
283
+ {
284
+ label: 'Paragraph Styles',
285
+ icon: FileText,
286
+ actions: [
287
+ {
288
+ id: 'style-heading1',
289
+ icon: FileText,
290
+ label: 'Heading 1',
291
+ description: 'Apply Heading 1 style',
292
+ },
293
+ {
294
+ id: 'style-heading2',
295
+ icon: FileText,
296
+ label: 'Heading 2',
297
+ description: 'Apply Heading 2 style',
298
+ },
299
+ {
300
+ id: 'style-normal',
301
+ icon: FileText,
302
+ label: 'Normal',
303
+ description: 'Apply Normal style',
304
+ },
305
+ {
306
+ id: 'style-list-paragraph',
307
+ icon: ListOrdered,
308
+ label: 'List Paragraph',
309
+ description: 'Apply List Paragraph style',
310
+ },
311
+ ],
312
+ },
313
+ {
314
+ label: 'Table Rows',
315
+ icon: ArrowUp,
316
+ actions: [
317
+ {
318
+ id: 'table-add-row-above',
319
+ icon: ArrowUp,
320
+ label: 'Add Row Above',
321
+ description: 'Insert row above selection',
322
+ requiresTable: true,
323
+ },
324
+ {
325
+ id: 'table-add-row-below',
326
+ icon: ArrowDown,
327
+ label: 'Add Row Below',
328
+ description: 'Insert row below selection',
329
+ requiresTable: true,
330
+ },
331
+ {
332
+ id: 'table-delete-row',
333
+ icon: Minus,
334
+ label: 'Delete Row',
335
+ description: 'Delete selected row',
336
+ requiresTable: true,
337
+ },
338
+ ],
339
+ },
340
+ {
341
+ label: 'Table Columns',
342
+ icon: ArrowLeft,
343
+ actions: [
344
+ {
345
+ id: 'table-add-col-left',
346
+ icon: ArrowLeft,
347
+ label: 'Add Column Left',
348
+ description: 'Insert column to the left',
349
+ requiresTable: true,
350
+ },
351
+ {
352
+ id: 'table-add-col-right',
353
+ icon: ArrowRight,
354
+ label: 'Add Column Right',
355
+ description: 'Insert column to the right',
356
+ requiresTable: true,
357
+ },
358
+ {
359
+ id: 'table-delete-col',
360
+ icon: Minus,
361
+ label: 'Delete Column',
362
+ description: 'Delete selected column',
363
+ requiresTable: true,
364
+ },
365
+ ],
366
+ },
367
+ {
368
+ label: 'Table Cells',
369
+ icon: Grid3X3,
370
+ actions: [
371
+ {
372
+ id: 'table-merge-cells',
373
+ icon: Merge,
374
+ label: 'Merge Cells',
375
+ description: 'Merge selected cells',
376
+ requiresTable: true,
377
+ },
378
+ {
379
+ id: 'table-split-cell',
380
+ icon: Split,
381
+ label: 'Split Cell',
382
+ description: 'Split merged cell',
383
+ requiresTable: true,
384
+ },
385
+ {
386
+ id: 'table-cell-shading',
387
+ icon: Paintbrush,
388
+ label: 'Cell Shading',
389
+ description: 'Set cell background color',
390
+ requiresTable: true,
391
+ },
392
+ {
393
+ id: 'table-cell-borders',
394
+ icon: Grid3X3,
395
+ label: 'Cell Borders',
396
+ description: 'Configure cell borders',
397
+ requiresTable: true,
398
+ },
399
+ {
400
+ id: 'table-vertical-align',
401
+ icon: AlignVerticalJustifyCenter,
402
+ label: 'Vertical Alignment',
403
+ description: 'Set cell vertical alignment',
404
+ requiresTable: true,
405
+ },
406
+ ],
407
+ },
408
+ {
409
+ label: 'Structure',
410
+ icon: SeparatorHorizontal,
411
+ actions: [
412
+ {
413
+ id: 'page-break',
414
+ icon: SeparatorHorizontal,
415
+ label: 'Insert Page Break',
416
+ description: 'Add page break before paragraph',
417
+ },
418
+ {
419
+ id: 'find-replace',
420
+ icon: Search,
421
+ label: 'Find & Replace',
422
+ description: 'Search and replace text',
423
+ },
424
+ ],
425
+ },
426
+ {
427
+ label: 'Tracked Changes',
428
+ icon: Check,
429
+ actions: [
430
+ {
431
+ id: 'accept-all-changes',
432
+ icon: Check,
433
+ label: 'Accept All Changes',
434
+ description: 'Accept all tracked changes',
435
+ },
436
+ {
437
+ id: 'reject-all-changes',
438
+ icon: XCircle,
439
+ label: 'Reject All Changes',
440
+ description: 'Reject all tracked changes',
441
+ },
442
+ ],
443
+ },
444
+ ];
445
+
446
+ return (
447
+ <div className="flex flex-col h-full bg-card border-l border-border">
448
+ {/* Header */}
449
+ <div className="px-4 py-3 border-b border-border">
450
+ <h3 className="font-medium">Quick Actions</h3>
451
+ <p className="text-xs text-muted-foreground mt-0.5">
452
+ {hasTableSelection
453
+ ? 'Table cell selected'
454
+ : hasTextSelection
455
+ ? 'Text selected'
456
+ : 'Click to select content'}
457
+ </p>
458
+ </div>
459
+
460
+ {/* Action groups */}
461
+ <div className="flex-1 overflow-y-auto">
462
+ {actionGroups.map((group) => (
463
+ <ActionGroupSection
464
+ key={group.label}
465
+ group={group}
466
+ isOpen={openGroups.has(group.label)}
467
+ onToggle={() => toggleGroup(group.label)}
468
+ onAction={onAction}
469
+ disabled={disabled}
470
+ hasTableSelection={hasTableSelection}
471
+ hasTextSelection={hasTextSelection}
472
+ />
473
+ ))}
474
+ </div>
475
+
476
+ {/* Shading preview */}
477
+ {tableShadingSettings && (
478
+ <div className="px-4 py-3 border-t border-border">
479
+ <p className="text-xs text-muted-foreground mb-2">Session Shading Colors</p>
480
+ <div className="flex gap-2">
481
+ <div className="flex items-center gap-1.5">
482
+ <div
483
+ className="w-4 h-4 rounded border border-border"
484
+ style={{ backgroundColor: tableShadingSettings.header2Shading }}
485
+ />
486
+ <span className="text-xs">H2</span>
487
+ </div>
488
+ <div className="flex items-center gap-1.5">
489
+ <div
490
+ className="w-4 h-4 rounded border border-border"
491
+ style={{ backgroundColor: tableShadingSettings.otherShading }}
492
+ />
493
+ <span className="text-xs">Other</span>
494
+ </div>
495
+ </div>
496
+ </div>
497
+ )}
498
+ </div>
499
+ );
500
+ }
501
+
502
+ export default EditorQuickActions;