@rightkit/document-workspace 0.0.0-stage → 0.1.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 (262) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE-APACHE +201 -0
  3. package/LICENSE-MIT +21 -0
  4. package/README.md +51 -2
  5. package/dist/app/App.d.ts +1 -0
  6. package/dist/app/App.js +6 -0
  7. package/dist/app/AppDialogs.d.ts +52 -0
  8. package/dist/app/AppDialogs.js +23 -0
  9. package/dist/app/AppDialogsHost.d.ts +31 -0
  10. package/dist/app/AppDialogsHost.js +30 -0
  11. package/dist/app/AppLifecycle.d.ts +19 -0
  12. package/dist/app/AppLifecycle.js +87 -0
  13. package/dist/app/AppProvider.d.ts +317 -0
  14. package/dist/app/AppProvider.js +217 -0
  15. package/dist/app/AppRoot.d.ts +8 -0
  16. package/dist/app/AppRoot.js +159 -0
  17. package/dist/app/AppShell.d.ts +2 -0
  18. package/dist/app/AppShell.js +81 -0
  19. package/dist/app/CommandPalette.d.ts +13 -0
  20. package/dist/app/CommandPalette.js +47 -0
  21. package/dist/app/DocActionBar.d.ts +36 -0
  22. package/dist/app/DocActionBar.js +300 -0
  23. package/dist/app/DocumentContextMenu.d.ts +29 -0
  24. package/dist/app/DocumentContextMenu.js +122 -0
  25. package/dist/app/DocumentPane.d.ts +52 -0
  26. package/dist/app/DocumentPane.js +30 -0
  27. package/dist/app/DocumentRouterTable.d.ts +58 -0
  28. package/dist/app/DocumentRouterTable.js +143 -0
  29. package/dist/app/ErrorBoundary.d.ts +12 -0
  30. package/dist/app/ErrorBoundary.js +16 -0
  31. package/dist/app/FindBar.d.ts +12 -0
  32. package/dist/app/FindBar.js +199 -0
  33. package/dist/app/LiveTitle.d.ts +14 -0
  34. package/dist/app/LiveTitle.js +14 -0
  35. package/dist/app/OpeningProgress.d.ts +13 -0
  36. package/dist/app/OpeningProgress.js +21 -0
  37. package/dist/app/PrintPreviewWindow.d.ts +2 -0
  38. package/dist/app/PrintPreviewWindow.js +57 -0
  39. package/dist/app/ShortcutHelp.d.ts +3 -0
  40. package/dist/app/ShortcutHelp.js +99 -0
  41. package/dist/app/Sidebar.d.ts +36 -0
  42. package/dist/app/Sidebar.js +121 -0
  43. package/dist/app/ToastViewport.d.ts +1 -0
  44. package/dist/app/ToastViewport.js +31 -0
  45. package/dist/app/Toolbar.d.ts +26 -0
  46. package/dist/app/Toolbar.js +63 -0
  47. package/dist/app/activeFormatSavers.d.ts +7 -0
  48. package/dist/app/activeFormatSavers.js +4 -0
  49. package/dist/app/clipboardPaths.d.ts +1 -0
  50. package/dist/app/clipboardPaths.js +31 -0
  51. package/dist/app/documentDrafts.d.ts +17 -0
  52. package/dist/app/documentDrafts.js +104 -0
  53. package/dist/app/draftResolution.d.ts +5 -0
  54. package/dist/app/draftResolution.js +25 -0
  55. package/dist/app/markdownPaletteActions.d.ts +8 -0
  56. package/dist/app/markdownPaletteActions.js +107 -0
  57. package/dist/app/resourceCensusDev.d.ts +41 -0
  58. package/dist/app/resourceCensusDev.js +518 -0
  59. package/dist/app/setupRecovery.d.ts +34 -0
  60. package/dist/app/setupRecovery.js +70 -0
  61. package/dist/app/shell/DocStatsPill.d.ts +18 -0
  62. package/dist/app/shell/DocStatsPill.js +32 -0
  63. package/dist/app/shell/DocumentTools.d.ts +9 -0
  64. package/dist/app/shell/DocumentTools.js +73 -0
  65. package/dist/app/shell/InfoInspector.d.ts +9 -0
  66. package/dist/app/shell/InfoInspector.js +67 -0
  67. package/dist/app/shell/StartPage.d.ts +9 -0
  68. package/dist/app/shell/StartPage.js +49 -0
  69. package/dist/app/shell/readEdit.d.ts +6 -0
  70. package/dist/app/shell/readEdit.js +6 -0
  71. package/dist/app/sidebar/SidebarDocumentMenu.d.ts +20 -0
  72. package/dist/app/sidebar/SidebarDocumentMenu.js +56 -0
  73. package/dist/app/sidebar/SidebarExpandedPanel.d.ts +9 -0
  74. package/dist/app/sidebar/SidebarExpandedPanel.js +78 -0
  75. package/dist/app/sidebar/SidebarIcons.d.ts +3 -0
  76. package/dist/app/sidebar/SidebarIcons.js +18 -0
  77. package/dist/app/sidebar/SidebarMenus.d.ts +19 -0
  78. package/dist/app/sidebar/SidebarMenus.js +64 -0
  79. package/dist/app/sidebar/SidebarPathUtils.d.ts +10 -0
  80. package/dist/app/sidebar/SidebarPathUtils.js +55 -0
  81. package/dist/app/sidebar/SidebarPrimitives.d.ts +12 -0
  82. package/dist/app/sidebar/SidebarPrimitives.js +45 -0
  83. package/dist/app/sidebar/SidebarRail.d.ts +5 -0
  84. package/dist/app/sidebar/SidebarRail.js +37 -0
  85. package/dist/app/sidebar/explorer/ExplorerRowMenu.d.ts +21 -0
  86. package/dist/app/sidebar/explorer/ExplorerRowMenu.js +37 -0
  87. package/dist/app/sidebar/explorer/ExplorerSections.d.ts +16 -0
  88. package/dist/app/sidebar/explorer/ExplorerSections.js +259 -0
  89. package/dist/app/sidebar/explorer/ExplorerTree.d.ts +46 -0
  90. package/dist/app/sidebar/explorer/ExplorerTree.js +387 -0
  91. package/dist/app/sidebar/explorer/explorerState.d.ts +37 -0
  92. package/dist/app/sidebar/explorer/explorerState.js +135 -0
  93. package/dist/app/tabMountPolicy.d.ts +45 -0
  94. package/dist/app/tabMountPolicy.js +104 -0
  95. package/dist/app/tabWarmOrder.d.ts +7 -0
  96. package/dist/app/tabWarmOrder.js +48 -0
  97. package/dist/app/tabs/TabFuseCurves.d.ts +3 -0
  98. package/dist/app/tabs/TabFuseCurves.js +15 -0
  99. package/dist/app/tabs/TabOverview.d.ts +24 -0
  100. package/dist/app/tabs/TabOverview.js +121 -0
  101. package/dist/app/tabs/TabStrip.d.ts +42 -0
  102. package/dist/app/tabs/TabStrip.js +380 -0
  103. package/dist/app/tabs/tabIds.d.ts +5 -0
  104. package/dist/app/tabs/tabIds.js +7 -0
  105. package/dist/app/tabs/useTabDirty.d.ts +3 -0
  106. package/dist/app/tabs/useTabDirty.js +11 -0
  107. package/dist/app/useAppChromeState.d.ts +21 -0
  108. package/dist/app/useAppChromeState.js +48 -0
  109. package/dist/app/useAppCommands.d.ts +66 -0
  110. package/dist/app/useAppCommands.js +71 -0
  111. package/dist/app/useAppDocumentCore.d.ts +210 -0
  112. package/dist/app/useAppDocumentCore.js +40 -0
  113. package/dist/app/useAppEffects.d.ts +18 -0
  114. package/dist/app/useAppEffects.js +52 -0
  115. package/dist/app/useAppPaneSearch.d.ts +37 -0
  116. package/dist/app/useAppPaneSearch.js +74 -0
  117. package/dist/app/useAppShellSetup.d.ts +40 -0
  118. package/dist/app/useAppShellSetup.js +52 -0
  119. package/dist/app/useAppSlots.d.ts +28 -0
  120. package/dist/app/useAppSlots.js +40 -0
  121. package/dist/app/useAppTabChrome.d.ts +51 -0
  122. package/dist/app/useAppTabChrome.js +66 -0
  123. package/dist/app/useAutoSave.d.ts +34 -0
  124. package/dist/app/useAutoSave.js +116 -0
  125. package/dist/app/useCloseAll.d.ts +52 -0
  126. package/dist/app/useCloseAll.js +295 -0
  127. package/dist/app/useClosedTabEviction.d.ts +10 -0
  128. package/dist/app/useClosedTabEviction.js +38 -0
  129. package/dist/app/useCommandPalette.d.ts +44 -0
  130. package/dist/app/useCommandPalette.js +254 -0
  131. package/dist/app/useCrossDocSearch.d.ts +7 -0
  132. package/dist/app/useCrossDocSearch.js +94 -0
  133. package/dist/app/useDistractionFree.d.ts +21 -0
  134. package/dist/app/useDistractionFree.js +73 -0
  135. package/dist/app/useDocumentCreation.d.ts +18 -0
  136. package/dist/app/useDocumentCreation.js +63 -0
  137. package/dist/app/useDocumentDirty.d.ts +31 -0
  138. package/dist/app/useDocumentDirty.js +46 -0
  139. package/dist/app/useDocumentLoader.d.ts +55 -0
  140. package/dist/app/useDocumentLoader.js +267 -0
  141. package/dist/app/useDocumentOutputActions.d.ts +6 -0
  142. package/dist/app/useDocumentOutputActions.js +45 -0
  143. package/dist/app/useDocumentRuntimeEffects.d.ts +36 -0
  144. package/dist/app/useDocumentRuntimeEffects.js +458 -0
  145. package/dist/app/useDocumentSaver.d.ts +58 -0
  146. package/dist/app/useDocumentSaver.js +511 -0
  147. package/dist/app/useDocumentTabs.d.ts +41 -0
  148. package/dist/app/useDocumentTabs.js +207 -0
  149. package/dist/app/useDocumentWatcher.d.ts +83 -0
  150. package/dist/app/useDocumentWatcher.js +393 -0
  151. package/dist/app/useDocumentZoom.d.ts +24 -0
  152. package/dist/app/useDocumentZoom.js +104 -0
  153. package/dist/app/useDocuments.d.ts +169 -0
  154. package/dist/app/useDocuments.js +455 -0
  155. package/dist/app/useDraftConfirmGate.d.ts +27 -0
  156. package/dist/app/useDraftConfirmGate.js +47 -0
  157. package/dist/app/useFileDragOverlay.d.ts +12 -0
  158. package/dist/app/useFileDragOverlay.js +49 -0
  159. package/dist/app/useFormatApis.d.ts +13 -0
  160. package/dist/app/useFormatApis.js +62 -0
  161. package/dist/app/useFormatDirtyState.d.ts +29 -0
  162. package/dist/app/useFormatDirtyState.js +81 -0
  163. package/dist/app/useGlobalShortcuts.d.ts +47 -0
  164. package/dist/app/useGlobalShortcuts.js +359 -0
  165. package/dist/app/useHtmlSession.d.ts +68 -0
  166. package/dist/app/useHtmlSession.js +463 -0
  167. package/dist/app/useHtmlSessionProps.d.ts +33 -0
  168. package/dist/app/useHtmlSessionProps.js +57 -0
  169. package/dist/app/useLibrary.d.ts +21 -0
  170. package/dist/app/useLibrary.js +81 -0
  171. package/dist/app/useOpenFromClipboard.d.ts +7 -0
  172. package/dist/app/useOpenFromClipboard.js +44 -0
  173. package/dist/app/usePaneLiveness.d.ts +29 -0
  174. package/dist/app/usePaneLiveness.js +199 -0
  175. package/dist/app/usePendingSavePaths.d.ts +19 -0
  176. package/dist/app/usePendingSavePaths.js +67 -0
  177. package/dist/app/useReadyShow.d.ts +12 -0
  178. package/dist/app/useReadyShow.js +142 -0
  179. package/dist/app/useSearchController.d.ts +22 -0
  180. package/dist/app/useSearchController.js +114 -0
  181. package/dist/app/useSetupRecovery.d.ts +41 -0
  182. package/dist/app/useSetupRecovery.js +153 -0
  183. package/dist/app/useTabChrome.d.ts +40 -0
  184. package/dist/app/useTabChrome.js +115 -0
  185. package/dist/app/useViewState.d.ts +27 -0
  186. package/dist/app/useViewState.js +160 -0
  187. package/dist/appName.d.ts +2 -0
  188. package/dist/appName.js +8 -0
  189. package/dist/documents/DocumentRouter.d.ts +102 -0
  190. package/dist/documents/DocumentRouter.js +153 -0
  191. package/dist/documents/FileTypeIcon.d.ts +6 -0
  192. package/dist/documents/FileTypeIcon.js +93 -0
  193. package/dist/documents/ImageDocument.d.ts +14 -0
  194. package/dist/documents/ImageDocument.js +61 -0
  195. package/dist/documents/capabilities.d.ts +17 -0
  196. package/dist/documents/capabilities.js +18 -0
  197. package/dist/documents/html/HtmlDocument.d.ts +15 -0
  198. package/dist/documents/html/HtmlDocument.js +584 -0
  199. package/dist/documents/html/HtmlDocumentLayout.d.ts +87 -0
  200. package/dist/documents/html/HtmlDocumentLayout.js +25 -0
  201. package/dist/documents/html/HtmlDocumentProps.d.ts +60 -0
  202. package/dist/documents/html/HtmlDocumentProps.js +1 -0
  203. package/dist/documents/html/HtmlDocumentSource.d.ts +34 -0
  204. package/dist/documents/html/HtmlDocumentSource.js +28 -0
  205. package/dist/documents/markdown/MarkdownSplitPane.d.ts +115 -0
  206. package/dist/documents/markdown/MarkdownSplitPane.js +352 -0
  207. package/dist/documents/mdx/MdxSplitPane.d.ts +32 -0
  208. package/dist/documents/mdx/MdxSplitPane.js +60 -0
  209. package/dist/documents/txt/LinkDialog.d.ts +8 -0
  210. package/dist/documents/txt/LinkDialog.js +34 -0
  211. package/dist/documents/txt/MarkdownSourceToolbar.d.ts +8 -0
  212. package/dist/documents/txt/MarkdownSourceToolbar.js +25 -0
  213. package/dist/documents/txt/SourceEditorToolbar.d.ts +12 -0
  214. package/dist/documents/txt/SourceEditorToolbar.js +4 -0
  215. package/dist/documents/txt/TxtEditor.d.ts +39 -0
  216. package/dist/documents/txt/TxtEditor.js +186 -0
  217. package/dist/documents/txt/sourceEditorTypes.d.ts +49 -0
  218. package/dist/documents/txt/sourceEditorTypes.js +1 -0
  219. package/dist/documents/txt/sourceExtensions.d.ts +38 -0
  220. package/dist/documents/txt/sourceExtensions.js +444 -0
  221. package/dist/documents/txt/sourceFormatting.d.ts +18 -0
  222. package/dist/documents/txt/sourceFormatting.js +183 -0
  223. package/dist/documents/txt/sourceTheme.d.ts +5 -0
  224. package/dist/documents/txt/sourceTheme.js +220 -0
  225. package/dist/documents/txt/useCodeMirrorSourceEditor.d.ts +69 -0
  226. package/dist/documents/txt/useCodeMirrorSourceEditor.js +546 -0
  227. package/dist/documents/txt/useSourceSearch.d.ts +39 -0
  228. package/dist/documents/txt/useSourceSearch.js +122 -0
  229. package/dist/documents/txt/useTextEditorCommands.d.ts +26 -0
  230. package/dist/documents/txt/useTextEditorCommands.js +151 -0
  231. package/dist/documents/web/LivePreviewPane.d.ts +11 -0
  232. package/dist/documents/web/LivePreviewPane.js +58 -0
  233. package/dist/env.d.ts +66 -0
  234. package/dist/index.d.ts +121 -0
  235. package/dist/index.js +123 -0
  236. package/dist/settings/AppearanceMenu.d.ts +9 -0
  237. package/dist/settings/AppearanceMenu.js +54 -0
  238. package/dist/settings/SettingsPanel.d.ts +7 -0
  239. package/dist/settings/SettingsPanel.js +104 -0
  240. package/dist/settings/publishedSections.d.ts +22 -0
  241. package/dist/settings/publishedSections.js +79 -0
  242. package/dist/settings/sections/AboutSection.d.ts +1 -0
  243. package/dist/settings/sections/AboutSection.js +13 -0
  244. package/dist/settings/sections/DiagnosticsSection.d.ts +1 -0
  245. package/dist/settings/sections/DiagnosticsSection.js +42 -0
  246. package/dist/settings/sections/PrivacySection.d.ts +3 -0
  247. package/dist/settings/sections/PrivacySection.js +51 -0
  248. package/dist/settings/sections/UpdateLicenseBlock.d.ts +10 -0
  249. package/dist/settings/sections/UpdateLicenseBlock.js +158 -0
  250. package/dist/state/explorer.d.ts +32 -0
  251. package/dist/state/explorer.js +111 -0
  252. package/dist/state/legal.d.ts +51 -0
  253. package/dist/state/legal.js +130 -0
  254. package/dist/state/library.d.ts +33 -0
  255. package/dist/state/library.js +110 -0
  256. package/dist/state/updateLicense.d.ts +31 -0
  257. package/dist/state/updateLicense.js +340 -0
  258. package/dist/styles/explorer.css +219 -0
  259. package/dist/styles/index.css +1477 -0
  260. package/dist/styles/tabs.css +467 -0
  261. package/dist/styles.css +6 -0
  262. package/package.json +88 -3
@@ -0,0 +1,467 @@
1
+ /* Titlebar tab strip (src/app/tabs/) — horizontal open-document tabs fused into the
2
+ titlebar chrome. Rendered inside the Toolbar's .vr-chrome header, so the shared tokens
3
+ already map to the CHROME palette (index.css .vr-chrome: --panel = --chrome,
4
+ --panel-2 = --chrome-2, --ink = --chrome-hover, --paper = --chrome-paper,
5
+ --muted = --chrome-muted, --line = --chrome-line; --copper = accent). The ACTIVE tab
6
+ takes --reader-surface/--reader-text instead so it reads as the top edge of the page.
7
+ Visual reference: docs/design/viewright-tabs-explorer.html (.tabbar/.tabs/.tab/.newtab/
8
+ .overview/.pop); the brief's behaviour notes win where they differ. */
9
+
10
+ /* Strip root: fills the Toolbar's middle stretch, bottom-aligned so tabs end flush with
11
+ the header's bottom edge (the active tab visually fuses into the page). Empty regions
12
+ carry data-tauri-drag-region so they still drag the window. */
13
+ .vr-tabstrip {
14
+ position: relative;
15
+ display: flex;
16
+ align-items: flex-end;
17
+ height: 100%;
18
+ min-width: 0;
19
+ }
20
+
21
+ /* Collapsed sidebar on macOS: the 52px rail is narrower than the traffic lights, so this
22
+ spacer keeps the first strip control clear of them. */
23
+ .vr-tabstrip-lead-lights {
24
+ flex: none;
25
+ width: 30px;
26
+ align-self: stretch;
27
+ }
28
+
29
+ /* Horizontal scroller holding the tablist (a display:contents inner div carries the
30
+ role). It shrinks to its tabs, so the "+" after it follows the last tab, and caps at the
31
+ room available, scrolling beyond that. Edges with hidden tabs fade (data attributes
32
+ set by TabStrip), so no tab is ever sliced against a neighbouring control. */
33
+ .vr-tabs {
34
+ display: flex;
35
+ align-items: flex-end;
36
+ flex: 0 1 auto;
37
+ min-width: 0;
38
+ height: 100%;
39
+ overflow-x: auto;
40
+ overflow-y: hidden;
41
+ scrollbar-width: none;
42
+ /* 12px each side holds the active tab's fuse curves, which extend 12px past the tab, so
43
+ they never count as overflow. */
44
+ padding: 0 12px;
45
+ --vr-fade-start: #000;
46
+ --vr-fade-end: #000;
47
+ -webkit-mask-image: linear-gradient(
48
+ 90deg,
49
+ var(--vr-fade-start) 0,
50
+ #000 28px,
51
+ #000 calc(100% - 28px),
52
+ var(--vr-fade-end) 100%
53
+ );
54
+ mask-image: linear-gradient(
55
+ 90deg,
56
+ var(--vr-fade-start) 0,
57
+ #000 28px,
58
+ #000 calc(100% - 28px),
59
+ var(--vr-fade-end) 100%
60
+ );
61
+ }
62
+ .vr-tabs[data-vr-scrolled] {
63
+ --vr-fade-start: transparent;
64
+ }
65
+ .vr-tabs[data-vr-more-end] {
66
+ --vr-fade-end: transparent;
67
+ }
68
+ .vr-tabs::-webkit-scrollbar {
69
+ display: none;
70
+ }
71
+ /* The ARIA tablist is display:contents — the scroller stays the flex container. */
72
+ .vr-tabs-list {
73
+ display: contents;
74
+ }
75
+
76
+ /* ── Tab ────────────────────────────────────────────────────────────────── */
77
+ .vr-tab {
78
+ position: relative;
79
+ /* An explicit width (not just flex-basis) so the shrink-to-fit scroller sizes itself from
80
+ 220px tabs rather than from each tab's text. */
81
+ flex: 0 1 auto;
82
+ width: 220px;
83
+ min-width: 104px;
84
+ height: 40px;
85
+ display: flex;
86
+ align-items: center;
87
+ gap: 7px;
88
+ padding: 0 10px 0 11px;
89
+ border-radius: 10px 10px 0 0;
90
+ /* Muted but readable: a step toward --paper from the raw chrome-muted token. */
91
+ color: color-mix(in srgb, var(--muted) 72%, var(--paper));
92
+ white-space: nowrap;
93
+ font-family: var(--app-font);
94
+ font-size: var(--vr-text-sm);
95
+ user-select: none;
96
+ -webkit-user-select: none;
97
+ }
98
+ /* Hover lifts an inactive tab into a floating chip (mockup .tab:not(.active):hover). */
99
+ .vr-tab:not(.vr-tab-active):hover {
100
+ background: var(--ink);
101
+ border-radius: 9px;
102
+ height: 34px;
103
+ margin-bottom: 3px;
104
+ color: var(--paper);
105
+ }
106
+ /* Quiet hairline between adjacent inactive tabs, hidden next to the active or a
107
+ hovered tab (mockup .tab + .tab::before). */
108
+ .vr-tab + .vr-tab:not(.vr-tab-active)::before {
109
+ content: "";
110
+ position: absolute;
111
+ left: -1px;
112
+ top: 11px;
113
+ bottom: 11px;
114
+ width: 1px;
115
+ /* The chrome line token is nearly invisible on dark chrome; derive the divider from the
116
+ muted text colour so adjacent tabs read as separate in every theme. */
117
+ background: color-mix(in srgb, var(--muted) 62%, transparent);
118
+ }
119
+ .vr-tab-active + .vr-tab::before,
120
+ .vr-tab:hover::before,
121
+ .vr-tab:hover + .vr-tab::before {
122
+ opacity: 0;
123
+ }
124
+ /* The active tab is reader-surface (fuses into the page — the concave corner curves
125
+ are the TabFuseCurves SVG children). Its min-width relaxes so it can still shrink
126
+ on very narrow windows (mockup .tab.active). */
127
+ .vr-tab-active {
128
+ background: var(--reader-surface);
129
+ color: var(--reader-text);
130
+ z-index: 2;
131
+ min-width: min(170px, 30%);
132
+ }
133
+ .vr-tab:focus-visible {
134
+ outline: none;
135
+ box-shadow: inset 0 0 0 2px var(--copper);
136
+ }
137
+ .vr-tab-dragging {
138
+ opacity: 0.55;
139
+ transform: scale(0.99);
140
+ }
141
+
142
+ /* Format badge tile (FileTypeIcon paints the badge itself; the span just keeps it
143
+ from shrinking under pressure). */
144
+ .vr-tab-ficon {
145
+ flex: none;
146
+ display: grid;
147
+ place-items: center;
148
+ }
149
+
150
+ /* The name fades at its right edge (mask), never ellipsis — the fade leaves room for
151
+ the overlaid close affordance on inactive tabs. */
152
+ .vr-tab-name {
153
+ overflow: hidden;
154
+ text-overflow: clip;
155
+ flex: 1;
156
+ min-width: 0;
157
+ -webkit-mask-image: linear-gradient(90deg, #000 calc(100% - 18px), transparent);
158
+ mask-image: linear-gradient(90deg, #000 calc(100% - 18px), transparent);
159
+ }
160
+
161
+ /* Dirty marker — the copper dot (mockup .dot / sidebar data-vr-tab-dirty-indicator). */
162
+ .vr-tab-dot {
163
+ width: 7px;
164
+ height: 7px;
165
+ border-radius: 50%;
166
+ background: var(--copper);
167
+ flex: none;
168
+ }
169
+ /* On inactive tabs the dot overlays the name's faded end instead of reserving width;
170
+ right:14px centers it where the 24px hover × will appear. */
171
+ .vr-tab:not(.vr-tab-active) .vr-tab-dot {
172
+ position: absolute;
173
+ right: 14px;
174
+ }
175
+ .vr-tab:not(.vr-tab-dirty) .vr-tab-dot,
176
+ .vr-tab-dirty:hover .vr-tab-dot {
177
+ display: none;
178
+ }
179
+
180
+ /* Close ×: always visible (in flow) on the active tab; on inactive tabs it overlays the
181
+ name end on hover only, so names keep the full width. */
182
+ .vr-tab-x {
183
+ /* 24px square — the brief's minimum hit target (icon inside stays 12px). */
184
+ width: 24px;
185
+ height: 24px;
186
+ border-radius: 999px;
187
+ display: grid;
188
+ place-items: center;
189
+ color: inherit;
190
+ flex: none;
191
+ opacity: 0;
192
+ }
193
+ .vr-tab:hover .vr-tab-x,
194
+ .vr-tab-active .vr-tab-x {
195
+ opacity: 1;
196
+ }
197
+ .vr-tab-x:hover {
198
+ background: var(--ink);
199
+ }
200
+ .vr-tab-active .vr-tab-x:hover {
201
+ /* The active tab sits on the reader surface, so the hover ring is the reader line. */
202
+ background: var(--reader-line);
203
+ }
204
+ .vr-tab:not(.vr-tab-active) .vr-tab-x {
205
+ position: absolute;
206
+ right: 6px;
207
+ display: none;
208
+ background: var(--ink);
209
+ }
210
+ .vr-tab:not(.vr-tab-active):hover .vr-tab-x,
211
+ .vr-tab:not(.vr-tab-active):focus-within .vr-tab-x {
212
+ display: grid;
213
+ }
214
+ /* Dirty tabs show the dot instead of × until hovered (mockup .tab.dirty). */
215
+ .vr-tab-dirty:not(:hover):not(:focus-within) .vr-tab-x {
216
+ display: none;
217
+ }
218
+
219
+ /* 2px copper insertion marker shown on the drop-target tab while drag-reordering. */
220
+ .vr-tab-dropbar {
221
+ position: absolute;
222
+ top: 7px;
223
+ bottom: 7px;
224
+ width: 2px;
225
+ border-radius: 1px;
226
+ background: var(--copper);
227
+ pointer-events: none;
228
+ z-index: 4;
229
+ }
230
+ .vr-tab-dropbar[data-pos="before"] {
231
+ left: -2px;
232
+ }
233
+ .vr-tab-dropbar[data-pos="after"] {
234
+ right: -2px;
235
+ }
236
+
237
+ /* ── Strip buttons (overview) ──────────────────── */
238
+ .vr-ov-btn {
239
+ flex: none;
240
+ min-width: 28px;
241
+ height: 28px;
242
+ display: inline-flex;
243
+ align-items: center;
244
+ justify-content: center;
245
+ border-radius: 999px;
246
+ color: var(--muted);
247
+ }
248
+ .vr-ov-btn:hover {
249
+ background: var(--ink);
250
+ color: var(--paper);
251
+ }
252
+
253
+ /* Empty titlebar space after the tabs: a window-drag region. */
254
+ .vr-tabstrip-fill {
255
+ flex: 1 1 0;
256
+ min-width: 12px;
257
+ align-self: stretch;
258
+ }
259
+
260
+ /* Tab overview cluster at the strip start, beside the sidebar control. */
261
+ .vr-tabstrip-ov {
262
+ position: relative;
263
+ display: flex;
264
+ align-items: center;
265
+ gap: 2px;
266
+ flex: none;
267
+ align-self: center;
268
+ padding: 0 8px 0 4px;
269
+ }
270
+ .vr-ov-btn {
271
+ width: auto;
272
+ padding: 0 8px;
273
+ gap: 3px;
274
+ }
275
+ .vr-ov-btn[aria-expanded="true"] {
276
+ background: var(--ink);
277
+ color: var(--paper);
278
+ }
279
+ .vr-ov-count {
280
+ font-size: var(--vr-text-xs);
281
+ font-weight: 600;
282
+ }
283
+
284
+ /* ── Tab overview popover (⌘⇧A) — brief Part A item 8; mockup .pop ─────────
285
+ The panel chrome (glass, open/exit animation, Escape + click-outside, focus
286
+ restore) comes from the shared Popover primitive (.vr-pop); these rules own
287
+ the popover's contents only. Positioned off .vr-tabstrip (position:relative),
288
+ dropped just below the header and right-aligned under the overview button. */
289
+ .vr-ov-pop {
290
+ top: calc(100% + 6px);
291
+ left: 8px;
292
+ width: min(380px, calc(100vw - 24px));
293
+ max-height: min(62vh, 460px);
294
+ display: flex;
295
+ flex-direction: column;
296
+ gap: 0;
297
+ padding: 8px;
298
+ }
299
+
300
+ /* Search field — focused on open; narrows by filename AND parent folder. */
301
+ .vr-ov-q {
302
+ width: 100%;
303
+ height: 30px;
304
+ flex: none;
305
+ border-radius: 999px;
306
+ border: 1px solid var(--line);
307
+ background: var(--panel);
308
+ padding: 0 12px;
309
+ color: var(--paper);
310
+ font-family: var(--app-font);
311
+ font-size: var(--vr-text-sm);
312
+ }
313
+ .vr-ov-q::placeholder {
314
+ color: var(--muted);
315
+ }
316
+ .vr-ov-q:focus-visible {
317
+ outline: none;
318
+ border-color: var(--copper);
319
+ }
320
+
321
+ /* Type chips with counts; zero-count chips aren't rendered. */
322
+ .vr-ov-chips {
323
+ display: flex;
324
+ flex-wrap: wrap;
325
+ gap: 4px;
326
+ flex: none;
327
+ margin: 8px 0;
328
+ }
329
+ .vr-ov-chip {
330
+ height: 24px;
331
+ padding: 0 10px;
332
+ border-radius: 999px;
333
+ font-size: var(--vr-text-sm);
334
+ background: var(--panel);
335
+ color: var(--muted);
336
+ }
337
+ .vr-ov-chip:hover {
338
+ background: var(--ink);
339
+ color: var(--paper);
340
+ }
341
+ .vr-ov-chip[aria-pressed="true"] {
342
+ background: var(--paper);
343
+ color: var(--panel);
344
+ }
345
+
346
+ /* Scrollable row list — one real focusable <button> per matching tab. */
347
+ .vr-ov-list {
348
+ flex: 1;
349
+ min-height: 0;
350
+ overflow-y: auto;
351
+ }
352
+ .vr-ov-empty {
353
+ padding: 12px 4px;
354
+ color: var(--muted);
355
+ font-size: var(--vr-text-sm);
356
+ }
357
+ .vr-ov-row {
358
+ display: flex;
359
+ align-items: center;
360
+ gap: 9px;
361
+ width: 100%;
362
+ min-height: 40px;
363
+ padding: 4px 8px;
364
+ border-radius: 8px;
365
+ text-align: left;
366
+ color: var(--paper);
367
+ }
368
+ .vr-ov-row:hover {
369
+ background: var(--ink);
370
+ }
371
+ .vr-ov-row:focus-visible {
372
+ outline: none;
373
+ box-shadow: inset 0 0 0 2px var(--copper);
374
+ }
375
+ .vr-ov-row-active {
376
+ background: var(--ink);
377
+ font-weight: 600;
378
+ }
379
+ .vr-ov-row-ficon {
380
+ flex: none;
381
+ display: grid;
382
+ place-items: center;
383
+ }
384
+ .vr-ov-row-text {
385
+ display: flex;
386
+ flex-direction: column;
387
+ min-width: 0;
388
+ line-height: 1.25;
389
+ }
390
+ .vr-ov-row-name {
391
+ overflow: hidden;
392
+ text-overflow: ellipsis;
393
+ white-space: nowrap;
394
+ font-size: var(--vr-text-sm);
395
+ }
396
+ .vr-ov-row-meta {
397
+ overflow: hidden;
398
+ text-overflow: ellipsis;
399
+ white-space: nowrap;
400
+ font-size: var(--vr-text-xs);
401
+ color: var(--muted);
402
+ }
403
+ .vr-ov-row-unsaved {
404
+ margin-left: auto;
405
+ flex: none;
406
+ font-size: var(--vr-text-xs);
407
+ color: var(--copper);
408
+ white-space: nowrap;
409
+ }
410
+
411
+ /* Footer — "N of M tabs" always; the bulk Close only while a filter or search
412
+ narrows the set (label names type + count, "· X unsaved, will ask" when dirty). */
413
+ .vr-ov-foot {
414
+ display: flex;
415
+ justify-content: space-between;
416
+ align-items: center;
417
+ gap: 8px;
418
+ flex: none;
419
+ border-top: 1px solid var(--line);
420
+ margin-top: 6px;
421
+ padding: 8px 4px 2px;
422
+ font-size: var(--vr-text-sm);
423
+ color: var(--muted);
424
+ }
425
+ .vr-ov-sum {
426
+ overflow: hidden;
427
+ text-overflow: ellipsis;
428
+ white-space: nowrap;
429
+ }
430
+ .vr-ov-close {
431
+ padding: 4px 10px;
432
+ border-radius: 999px;
433
+ color: var(--paper);
434
+ font-size: var(--vr-text-sm);
435
+ white-space: nowrap;
436
+ }
437
+ .vr-ov-close:hover {
438
+ background: var(--ink);
439
+ }
440
+
441
+ /* ‹ › paging buttons: shown only while tabs overflow; the one with nothing further that way
442
+ dims. Visibility keys off the scroller's edge flags (set by TabStrip on scroll/resize). */
443
+ .vr-tab-arrow {
444
+ display: none;
445
+ flex: none;
446
+ align-self: center;
447
+ width: 24px;
448
+ height: 28px;
449
+ margin-bottom: 4px;
450
+ align-items: center;
451
+ justify-content: center;
452
+ border-radius: 999px;
453
+ color: var(--muted);
454
+ }
455
+ .vr-tab-arrow:hover {
456
+ background: var(--ink);
457
+ color: var(--paper);
458
+ }
459
+ .vr-tabstrip:has(.vr-tabs[data-vr-scrolled]) .vr-tab-arrow,
460
+ .vr-tabstrip:has(.vr-tabs[data-vr-more-end]) .vr-tab-arrow {
461
+ display: inline-flex;
462
+ }
463
+ .vr-tabstrip:not(:has(.vr-tabs[data-vr-scrolled])) .vr-tab-arrow-start,
464
+ .vr-tabstrip:not(:has(.vr-tabs[data-vr-more-end])) .vr-tab-arrow-end {
465
+ opacity: 0.35;
466
+ pointer-events: none;
467
+ }
@@ -0,0 +1,6 @@
1
+ /* Every stylesheet this package's components use. Hosts import "<package>/styles.css" once (Node cannot import CSS from JS). */
2
+ @import "@rightkit/onboarding/onboarding.css";
3
+ @import "./styles/explorer.css";
4
+ @import "./styles/tabs.css";
5
+ @import "@rightkit/media-ui/styles.css";
6
+ @import "@rightkit/document-core/settings/rk-settings.css";
package/package.json CHANGED
@@ -1,6 +1,91 @@
1
1
  {
2
2
  "name": "@rightkit/document-workspace",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "description": "Multi-format document workspace shell: tabs, sidebar, document router, loaders, savers and actions.",
5
+ "license": "MIT OR Apache-2.0",
6
+ "type": "module",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./styles.css": "./dist/styles.css",
15
+ "./package.json": "./package.json"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "README.md",
20
+ "CHANGELOG.md",
21
+ "LICENSE-MIT",
22
+ "LICENSE-APACHE"
23
+ ],
24
+ "sideEffects": [
25
+ "*.css"
26
+ ],
27
+ "dependencies": {
28
+ "@codemirror/autocomplete": "^6.20.3",
29
+ "@codemirror/commands": "^6.11.1",
30
+ "@codemirror/lang-html": "^6.4.12",
31
+ "@codemirror/lang-javascript": "^6.2.5",
32
+ "@codemirror/lang-markdown": "^6.5.2",
33
+ "@codemirror/language": "^6.13.1",
34
+ "@codemirror/lint": "^6.9.7",
35
+ "@codemirror/search": "^6.7.2",
36
+ "@codemirror/state": "^6.7.6",
37
+ "@codemirror/view": "^6.43.14",
38
+ "@lezer/highlight": "^1.2.5",
39
+ "@phosphor-icons/react": "^2.1.10",
40
+ "@rightkit/app-update": "^0.4.2",
41
+ "@rightkit/document-core": "^0.1.0",
42
+ "@rightkit/docx-editor": "^0.1.0",
43
+ "@rightkit/html-editor": "^0.1.0",
44
+ "@rightkit/legal": "^0.6.3",
45
+ "@rightkit/legal-ui": "^0.4.1",
46
+ "@rightkit/license": "^0.3.0",
47
+ "@rightkit/markdown-editor": "^0.1.0",
48
+ "@rightkit/media-ui": "^0.3.4",
49
+ "@rightkit/onboarding": "^0.6.3",
50
+ "@rightkit/platform-ui": "^0.4.0",
51
+ "@rightkit/react-shell": "^0.7.2",
52
+ "@rightkit/settings-ui": "^0.7.0",
53
+ "@tauri-apps/api": "^2.12.2",
54
+ "@tauri-apps/plugin-process": "^2.4.0",
55
+ "prosemirror-state": "^1.4.4",
56
+ "prosemirror-view": "1.42.6",
57
+ "tailwindcss": "^4.3.3"
58
+ },
59
+ "peerDependencies": {
60
+ "react": ">=18 <21",
61
+ "react-dom": ">=18 <21"
62
+ },
63
+ "devDependencies": {
64
+ "@testing-library/dom": "^10.4.2",
65
+ "@testing-library/jest-dom": "^7.0.1",
66
+ "@testing-library/react": "^16.3.3",
67
+ "@types/node": "^26.6.6",
68
+ "@types/react": "^19.3.0",
69
+ "@types/react-dom": "^19.3.0",
70
+ "jsdom": "^30.1.3",
71
+ "react": "^19.3.1",
72
+ "react-dom": "^19.3.1",
73
+ "typescript": "^7.0.2",
74
+ "vite": "^8.3.4",
75
+ "vitest": "^5.0.5"
76
+ },
77
+ "publishConfig": {
78
+ "registry": "https://registry.npmjs.org",
79
+ "access": "public"
80
+ },
81
+ "repository": {
82
+ "type": "git",
83
+ "url": "git+https://github.com/bogusyogi/rightkit.git",
84
+ "directory": "packages/document-workspace"
85
+ },
86
+ "scripts": {
87
+ "build": "tsc -p tsconfig.json && node scripts/copy-assets.mjs",
88
+ "typecheck": "tsc -p tsconfig.json --noEmit",
89
+ "test": "pnpm --filter \"@rightkit/document-workspace^...\" run build && vitest run"
90
+ }
6
91
  }