@hachej/boring-ui-kit 0.4.56 → 0.4.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/chat-react-conversations.d.ts +9 -7
- package/dist/chat-react-conversations.js +117 -13
- package/dist/markdown-conflict-choices.d.ts +17 -0
- package/dist/markdown-conflict-choices.js +47 -0
- package/dist/markdown-editor-labels.d.ts +15 -0
- package/dist/markdown-editor-labels.js +16 -2
- package/dist/markdown-editor.d.ts +5 -1
- package/dist/markdown-editor.js +23 -7
- package/dist/markdown-proposal-diff.d.ts +3 -2
- package/dist/markdown-proposal-diff.js +2 -2
- package/dist/markdown-safety.d.ts +7 -1
- package/dist/markdown-safety.js +17 -1
- package/dist/markdown-tab-poke.d.ts +7 -0
- package/dist/markdown-tab-poke.js +57 -0
- package/dist/markdown.d.ts +6 -0
- package/dist/markdown.js +1 -1
- package/dist/text-buffer.d.ts +12 -0
- package/dist/text-buffer.js +83 -1
- package/package.json +2 -2
- package/r/agent-target.json +4 -4
- package/r/app-shell.json +9 -9
- package/r/board-viewer.json +6 -6
- package/r/button.json +1 -1
- package/r/dock.json +1 -1
- package/r/documents.json +12 -12
- package/r/drawing-viewer.json +1 -1
- package/r/feedback.json +6 -6
- package/r/file-tree.json +4 -4
- package/r/highlights.json +3 -3
- package/r/html-viewer.json +3 -3
- package/r/looks-viewer.json +2 -2
- package/r/maquette-viewer.json +1 -1
- package/r/markdown-editor.json +3 -3
- package/r/mockup-viewer.json +1 -1
- package/r/pi-ambient.json +9 -9
- package/r/pi-app-kinds.json +10 -10
- package/r/pi-app.json +11 -11
- package/r/pi-artifacts.json +2 -2
- package/r/pi-chat-approval.json +2 -2
- package/r/pi-chat-attachments.json +1 -1
- package/r/pi-chat-markdown.json +2 -2
- package/r/pi-chat-mentions.json +1 -1
- package/r/pi-chat-pickers.json +1 -1
- package/r/pi-chat-plugins.json +11 -11
- package/r/pi-chat-question.json +1 -1
- package/r/pi-chat-slash.json +2 -2
- package/r/pi-chat-subagent.json +1 -1
- package/r/pi-chat-voice.json +3 -3
- package/r/pi-chat.json +11 -11
- package/r/pi-workspace.json +3 -3
- package/r/placed-agent.json +4 -4
- package/r/provider-setup.json +1 -1
- package/r/registry.json +162 -162
- package/r/shared-chat.json +6 -6
- package/r/spaces.json +1 -1
- package/r/task-list-viewer.json +2 -2
- package/r/version-history.json +2 -2
- package/r/viewer-code.json +2 -2
- package/r/viewer-frame.json +4 -4
- package/r/viewer-html.json +4 -4
- package/r/viewer-image.json +2 -2
- package/r/viewer-markdown.json +5 -5
- package/r/viewer-pdf.json +3 -3
- package/r/viewers.json +6 -6
- package/r/windows.json +1 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
function channelName({ base: { target: { resource, view } }, identity }) {
|
|
3
|
+
return `boring-markdown:${JSON.stringify([identity.scopeId, resource.providerId, resource.path, view.kind, view.kind === 'working' ? view.viewId : null])}`;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Optional nudge between tabs of one note in one browser. A saved revision goes out and the receiver only runs its existing refresh,
|
|
7
|
+
* which never overwrites unsaved text and never saves, so a poke cannot start another one. No document text crosses the channel.
|
|
8
|
+
*/
|
|
9
|
+
export function useMarkdownTabPoke(controller, enabled) {
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
const Channel = globalThis.BroadcastChannel;
|
|
12
|
+
if (!enabled || typeof Channel !== 'function')
|
|
13
|
+
return;
|
|
14
|
+
const opening = controller.getSnapshot();
|
|
15
|
+
if (opening.lifecycle !== 'active')
|
|
16
|
+
return;
|
|
17
|
+
let channel;
|
|
18
|
+
try {
|
|
19
|
+
channel = new Channel(channelName(opening));
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
// A listening channel must not hold a server-side process open.
|
|
25
|
+
channel.unref?.();
|
|
26
|
+
const receive = (event) => {
|
|
27
|
+
const revision = event.data?.revision;
|
|
28
|
+
const state = controller.getSnapshot();
|
|
29
|
+
if (typeof revision !== 'string' || state.lifecycle !== 'active')
|
|
30
|
+
return;
|
|
31
|
+
const known = (expectation) => expectation?.kind === 'revision' && expectation.target.revision === revision;
|
|
32
|
+
if (known(state.base) || known(state.remote))
|
|
33
|
+
return;
|
|
34
|
+
void controller.actions.refresh().catch(() => { });
|
|
35
|
+
};
|
|
36
|
+
channel.addEventListener('message', receive);
|
|
37
|
+
let announced = opening.save;
|
|
38
|
+
const stop = controller.subscribe(() => {
|
|
39
|
+
const { save } = controller.getSnapshot();
|
|
40
|
+
if (save === announced || save.kind !== 'settled' || save.result.kind !== 'saved')
|
|
41
|
+
return;
|
|
42
|
+
announced = save;
|
|
43
|
+
try {
|
|
44
|
+
channel.postMessage({ revision: save.result.ref.revision });
|
|
45
|
+
}
|
|
46
|
+
catch { /* A tab that cannot tell the others still saved. */ }
|
|
47
|
+
});
|
|
48
|
+
return () => {
|
|
49
|
+
stop();
|
|
50
|
+
channel.removeEventListener('message', receive);
|
|
51
|
+
try {
|
|
52
|
+
channel.close();
|
|
53
|
+
}
|
|
54
|
+
catch { /* Nothing is left to stop. */ }
|
|
55
|
+
};
|
|
56
|
+
}, [controller, enabled]);
|
|
57
|
+
}
|
package/dist/markdown.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ReadResult, ResourceAccess, ResourceClient, ResourceExpectation, ResourceLocator, ResourceSnapshot } from '@hachej/boring-files';
|
|
2
2
|
import { type TextEdit } from '@hachej/boring-files/text';
|
|
3
3
|
import type { PresentationCommand, PresentationResult } from './contracts.js';
|
|
4
|
+
import { type TextBufferRemote } from './text-buffer.js';
|
|
4
5
|
import type { EditableViewerController, SaveResult, SaveSelection } from './resources.js';
|
|
5
6
|
import type { TextDraftActions, TextDraftOptions, TextDraftRecoveryState } from './text-draft-types.js';
|
|
6
7
|
export type MarkdownSource = {
|
|
@@ -68,7 +69,12 @@ export interface MarkdownActions extends TextDraftActions {
|
|
|
68
69
|
/** For an unconfirmed save: stop reconciling and refresh, keeping the draft. The save is never reported committed or replayed. */
|
|
69
70
|
readonly abandon: () => Promise<ReadResult>;
|
|
70
71
|
readonly discardToRemote: () => Promise<ReadResult>;
|
|
72
|
+
/** Keeps the local text over the remote revision already shown and saves it conditionally. A remote that moved since is a new conflict, never an overwrite. */
|
|
73
|
+
readonly keepLocal: () => Promise<SaveResult>;
|
|
74
|
+
/** Reads the current saved text for review. The local text and base stay; what the editor knows of the remote moves to the revision returned, so `keepLocal` acts on it. */
|
|
75
|
+
readonly readRemote: () => Promise<MarkdownRemote>;
|
|
71
76
|
}
|
|
77
|
+
export type MarkdownRemote = TextBufferRemote;
|
|
72
78
|
export interface MarkdownOptions {
|
|
73
79
|
readonly drafts?: TextDraftOptions;
|
|
74
80
|
/** Expected authenticated identity is comparison metadata, never a grant. */
|
package/dist/markdown.js
CHANGED
|
@@ -113,7 +113,7 @@ export function createMarkdownController(options) {
|
|
|
113
113
|
propose, accept, reject: proposalId => { if (state.lifecycle !== 'disposed')
|
|
114
114
|
update({ ...state, proposals: state.proposals.filter(value => value.id !== proposalId) }); },
|
|
115
115
|
checkDrafts: buffer.checkDrafts, checkpointDraft: buffer.checkpointDraft, restoreDraft: buffer.restoreDraft, discardDraft: buffer.discardDraft,
|
|
116
|
-
selection, refresh: () => buffer.refresh(false), discardToRemote: () => buffer.refresh(true), reconcile: buffer.reconcile, abandon: buffer.abandon,
|
|
116
|
+
selection, refresh: () => buffer.refresh(false), discardToRemote: () => buffer.refresh(true), keepLocal: buffer.rebaseOntoRemote, readRemote: buffer.readRemote, reconcile: buffer.reconcile, abandon: buffer.abandon,
|
|
117
117
|
},
|
|
118
118
|
tools: Object.freeze(tools), flush: buffer.flush,
|
|
119
119
|
dispose: () => { buffer.dispose(); unsubscribe(); listeners.clear(); },
|
package/dist/text-buffer.d.ts
CHANGED
|
@@ -26,6 +26,16 @@ export interface TextBufferOptions {
|
|
|
26
26
|
readonly sync?: () => void;
|
|
27
27
|
readonly readText: (snapshot: ResourceSnapshot) => string;
|
|
28
28
|
}
|
|
29
|
+
export type TextBufferRemote = {
|
|
30
|
+
readonly kind: 'available';
|
|
31
|
+
readonly text: string;
|
|
32
|
+
readonly revision: string;
|
|
33
|
+
} | {
|
|
34
|
+
readonly kind: 'missing';
|
|
35
|
+
} | {
|
|
36
|
+
readonly kind: 'denied' | 'unavailable';
|
|
37
|
+
readonly reason: string;
|
|
38
|
+
};
|
|
29
39
|
export declare function freeze<Value>(value: Value): Value;
|
|
30
40
|
export declare function sameBase(left: ResourceExpectation, right: ResourceExpectation): boolean;
|
|
31
41
|
export declare function createTextBuffer(options: TextBufferOptions): {
|
|
@@ -35,6 +45,8 @@ export declare function createTextBuffer(options: TextBufferOptions): {
|
|
|
35
45
|
observe: (text: string, force?: boolean) => void;
|
|
36
46
|
selection: () => SaveSelection;
|
|
37
47
|
refresh: (discard: boolean) => Promise<ReadResult>;
|
|
48
|
+
rebaseOntoRemote: () => Promise<SaveResult>;
|
|
49
|
+
readRemote: () => Promise<TextBufferRemote>;
|
|
38
50
|
abandon: () => Promise<ReadResult>;
|
|
39
51
|
reconcile: () => Promise<SaveResult>;
|
|
40
52
|
flush: (value: SaveSelection, signal?: AbortSignal) => Promise<SaveResult>;
|
package/dist/text-buffer.js
CHANGED
|
@@ -261,6 +261,88 @@ export function createTextBuffer(options) {
|
|
|
261
261
|
drafts?.remove(discardedDraft);
|
|
262
262
|
return read;
|
|
263
263
|
}
|
|
264
|
+
/** The remote revision the person was last shown: what refresh found, else what the refused save reported. */
|
|
265
|
+
function knownRemote() {
|
|
266
|
+
if (state.remote)
|
|
267
|
+
return state.remote;
|
|
268
|
+
if (state.save.kind !== 'settled' || state.save.result.kind !== 'conflict')
|
|
269
|
+
return undefined;
|
|
270
|
+
const current = state.save.result.current.find(ref => sameLocator(ref, state.base.target));
|
|
271
|
+
return current ? { kind: 'revision', target: current } : undefined;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Keep the local text over a remote revision the person has seen: move the base there and save through the same conditional write.
|
|
275
|
+
* A remote that is no longer that revision is reported as a new conflict without writing, and a write landing after this read is
|
|
276
|
+
* refused by the provider, so nothing is ever overwritten unseen.
|
|
277
|
+
*/
|
|
278
|
+
async function rebaseOntoRemote() {
|
|
279
|
+
if (disposed())
|
|
280
|
+
return { kind: 'unavailable', reason: 'Viewer is disposed' };
|
|
281
|
+
if (state.readOnly)
|
|
282
|
+
return { kind: 'denied', reason: 'Viewer is read-only' };
|
|
283
|
+
if (attempt)
|
|
284
|
+
return unknown(attempt, 'Reconcile or await the earlier save before keeping local text');
|
|
285
|
+
const seen = knownRemote();
|
|
286
|
+
const previousBase = state.base;
|
|
287
|
+
const read = await client.read({ target: previousBase.target, revision: { kind: 'latest' } });
|
|
288
|
+
if (!disposed())
|
|
289
|
+
options.sync?.();
|
|
290
|
+
if (disposed())
|
|
291
|
+
return { kind: 'unavailable', reason: 'Viewer is disposed' };
|
|
292
|
+
if (attempt)
|
|
293
|
+
return unknown(attempt, 'Reconcile or await the earlier save before keeping local text');
|
|
294
|
+
if (read.kind === 'denied' || read.kind === 'unavailable')
|
|
295
|
+
return read;
|
|
296
|
+
if (read.kind === 'available' && !sameLocator(read.snapshot.ref, previousBase.target))
|
|
297
|
+
return { kind: 'unavailable', reason: 'Read returned a different resource' };
|
|
298
|
+
const latest = read.kind === 'available' ? { kind: 'revision', target: structuredClone(read.snapshot.ref) } : { kind: 'absent', target: previousBase.target };
|
|
299
|
+
const conflict = () => ({ kind: 'conflict', current: latest.kind === 'revision' ? [latest.target] : [], reason: 'The remote document changed again' });
|
|
300
|
+
if (!sameBase(previousBase, state.base))
|
|
301
|
+
return conflict();
|
|
302
|
+
if (!seen || !sameBase(seen, latest)) {
|
|
303
|
+
update({ ...state, remote: latest });
|
|
304
|
+
return conflict();
|
|
305
|
+
}
|
|
306
|
+
let decoded;
|
|
307
|
+
try {
|
|
308
|
+
decoded = read.kind === 'available' ? options.readText(read.snapshot) : options.emptyText ?? '';
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
return { kind: 'unavailable', reason: 'Remote document could not be decoded or validated' };
|
|
312
|
+
}
|
|
313
|
+
savedText = decoded;
|
|
314
|
+
update({ ...state, base: latest, bufferVersion: state.bufferVersion + 1, dirty: latest.kind === 'absent' || state.text !== savedText, remote: null, save: { kind: 'idle' } });
|
|
315
|
+
return flush(selection());
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* The saved text for a person to review, from one read, so what they see is what Keep mine then acts on. Only what the editor knows of
|
|
319
|
+
* the remote moves. Unlike refresh, this never replaces the text, even in a clean buffer.
|
|
320
|
+
*/
|
|
321
|
+
async function readRemote() {
|
|
322
|
+
if (disposed())
|
|
323
|
+
return { kind: 'unavailable', reason: 'Viewer is disposed' };
|
|
324
|
+
const previousBase = state.base;
|
|
325
|
+
const read = await client.read({ target: previousBase.target, revision: { kind: 'latest' } });
|
|
326
|
+
if (disposed())
|
|
327
|
+
return { kind: 'unavailable', reason: 'Viewer is disposed' };
|
|
328
|
+
if (read.kind === 'denied' || read.kind === 'unavailable')
|
|
329
|
+
return read;
|
|
330
|
+
if (read.kind === 'available' && !sameLocator(read.snapshot.ref, previousBase.target))
|
|
331
|
+
return { kind: 'unavailable', reason: 'Read returned a different resource' };
|
|
332
|
+
let remote;
|
|
333
|
+
try {
|
|
334
|
+
remote = read.kind === 'available' ? { kind: 'available', text: options.readText(read.snapshot), revision: read.snapshot.ref.revision } : { kind: 'missing' };
|
|
335
|
+
}
|
|
336
|
+
catch {
|
|
337
|
+
return { kind: 'unavailable', reason: 'Remote document could not be decoded or validated' };
|
|
338
|
+
}
|
|
339
|
+
const latest = read.kind === 'available' ? { kind: 'revision', target: structuredClone(read.snapshot.ref) } : { kind: 'absent', target: previousBase.target };
|
|
340
|
+
const inConflict = state.remote !== null || (state.save.kind === 'settled' && state.save.result.kind === 'conflict');
|
|
341
|
+
const news = !(state.remote && sameBase(state.remote, latest)) && (inConflict || !sameBase(latest, state.base));
|
|
342
|
+
if (news && !attempt && sameBase(previousBase, state.base))
|
|
343
|
+
update({ ...state, remote: latest });
|
|
344
|
+
return remote;
|
|
345
|
+
}
|
|
264
346
|
/** Give up waiting for an unknown save and refresh, keeping the draft. The save is never reported committed and never replayed. */
|
|
265
347
|
const abandon = async () => {
|
|
266
348
|
const current = attempt;
|
|
@@ -306,7 +388,7 @@ export function createTextBuffer(options) {
|
|
|
306
388
|
throw new Error('Viewer is read-only');
|
|
307
389
|
observe(text, force);
|
|
308
390
|
},
|
|
309
|
-
observe, selection, refresh, abandon, reconcile, flush,
|
|
391
|
+
observe, selection, refresh, rebaseOntoRemote, readRemote, abandon, reconcile, flush,
|
|
310
392
|
dispose: () => { if (!disposed()) {
|
|
311
393
|
drafts?.dispose();
|
|
312
394
|
update({ ...state, lifecycle: 'disposed' });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hachej/boring-ui-kit",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.58",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -154,7 +154,7 @@
|
|
|
154
154
|
}
|
|
155
155
|
},
|
|
156
156
|
"peerDependencies": {
|
|
157
|
-
"@hachej/boring-files": "^0.4.
|
|
157
|
+
"@hachej/boring-files": "^0.4.58",
|
|
158
158
|
"@earendil-works/pi-durable": "~1.4.0",
|
|
159
159
|
"react": "^19.0.0",
|
|
160
160
|
"react-dom": "^19.0.0",
|
package/r/agent-target.json
CHANGED
|
@@ -4,15 +4,15 @@
|
|
|
4
4
|
"title": "Point and dictate on app data",
|
|
5
5
|
"description": "Tap explicitly marked JSON app context, dictate once and show the same app agent’s native reply without opening chat. Host-controlled presentation; no feedback report or second controller.",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-ui-kit@^0.4.
|
|
8
|
-
"@hachej/boring-feedback@^0.4.
|
|
7
|
+
"@hachej/boring-ui-kit@^0.4.58",
|
|
8
|
+
"@hachej/boring-feedback@^0.4.58",
|
|
9
9
|
"@earendil-works/pi-durable@~1.4.0",
|
|
10
10
|
"react@^19.0.0",
|
|
11
11
|
"react-dom@^19.0.0"
|
|
12
12
|
],
|
|
13
13
|
"registryDependencies": [
|
|
14
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
15
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
14
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/app-shell.json",
|
|
15
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/pi-chat.json"
|
|
16
16
|
],
|
|
17
17
|
"files": [
|
|
18
18
|
{
|
package/r/app-shell.json
CHANGED
|
@@ -4,21 +4,21 @@
|
|
|
4
4
|
"title": "App shell: layouts, list/detail and agent layer",
|
|
5
5
|
"description": "AppShell with three layouts. B \"workspace\" puts a ListDetail on a screen (phone: the list, then the detail as a stack step with Back; wide: a 20rem list and the detail side by side, sidebar as an icon rail). C \"chat\" wraps the app's own AgentWorkspace (untouched, passed as the nav item's render; install the pi-app item yourself) in the same sidebar, account menu and header; it takes no shell agent. A \"screen\": one screen at a time, every screen kept mounted. On a phone bottom tabs (at most four; more give three plus a « Plus » sheet) and an avatar button that opens the account sheet; on a wide screen the shadcn sidebar (icon rail, NavUser). One header per screen through useScreenHeader (title, subtitle, back, up to two actions, the rest behind « … »). The account menu holds « Améliorer l'app » (the improve agent), the app's own entries and sign out. AppSheet is the one bottom sheet (one open at a time, Back closes it). It mounts the AgentLayer: one agent's PiChat above the app (phone: a drawer with peek, half and full snap points; wide: a right panel), the improve agent in the same layer, optional push-to-talk and point mode. Also useAgentContext and readAgentContext (the screen on show travels as `context` with each submit) and useBackLayer, the one Back manager. Built on explicitly pinned Base UI drawer and dropdown-menu recipes, plus the sidebar and avatar of the host's own shadcn style.",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-feedback@^0.4.
|
|
8
|
-
"@hachej/boring-ui-kit@^0.4.
|
|
7
|
+
"@hachej/boring-feedback@^0.4.58",
|
|
8
|
+
"@hachej/boring-ui-kit@^0.4.58",
|
|
9
9
|
"@base-ui/react@^1.9.0",
|
|
10
10
|
"react@^19.0.0",
|
|
11
11
|
"react-dom@^19.0.0",
|
|
12
12
|
"lucide-react@^1.51.0"
|
|
13
13
|
],
|
|
14
14
|
"registryDependencies": [
|
|
15
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
16
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
17
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
18
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
19
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
20
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
21
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
15
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/pi-chat.json",
|
|
16
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/pi-chat-plugins.json",
|
|
17
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/pi-chat-voice.json",
|
|
18
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/dock.json",
|
|
19
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/feedback.json",
|
|
20
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/utils.json",
|
|
21
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/button.json"
|
|
22
22
|
],
|
|
23
23
|
"files": [
|
|
24
24
|
{
|
package/r/board-viewer.json
CHANGED
|
@@ -4,17 +4,17 @@
|
|
|
4
4
|
"title": "Board viewer",
|
|
5
5
|
"description": "A board@1 artifact kind for *.board.json. Lazy native tldraw projection of maquette screens, sandboxed HTML mock-ups, goto arrows and notes. Conditional board-file autosave; phone viewing without accidental frame edits. Hosts supply their resource client, asset URLs and license key.",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-ui-kit@^0.4.
|
|
8
|
-
"@hachej/boring-files@^0.4.
|
|
7
|
+
"@hachej/boring-ui-kit@^0.4.58",
|
|
8
|
+
"@hachej/boring-files@^0.4.58",
|
|
9
9
|
"react@^19.0.0",
|
|
10
10
|
"lucide-react@1.51.0",
|
|
11
11
|
"tldraw@5.5.2"
|
|
12
12
|
],
|
|
13
13
|
"registryDependencies": [
|
|
14
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
15
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
16
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
17
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
14
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/maquette-viewer.json",
|
|
15
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/mockup-viewer.json",
|
|
16
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/pi-artifacts.json",
|
|
17
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/utils.json"
|
|
18
18
|
],
|
|
19
19
|
"files": [
|
|
20
20
|
{
|
package/r/button.json
CHANGED
package/r/dock.json
CHANGED
package/r/documents.json
CHANGED
|
@@ -4,22 +4,22 @@
|
|
|
4
4
|
"title": "Documents: the Library, a file and its revisions",
|
|
5
5
|
"description": "The workspace's Library as the list, the chosen file in its viewer and its retained revisions beside it (an older one opens read-only). DocumentSheet opens one document over the app for a host's « Voir la fiche », with an optional « Toutes les fiches ». Every read goes through one revisionProvider binding.",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-ui-kit@^0.4.
|
|
8
|
-
"@hachej/boring-files@^0.4.
|
|
7
|
+
"@hachej/boring-ui-kit@^0.4.58",
|
|
8
|
+
"@hachej/boring-files@^0.4.58",
|
|
9
9
|
"react@^19.0.0",
|
|
10
10
|
"lucide-react@^1.51.0"
|
|
11
11
|
],
|
|
12
12
|
"registryDependencies": [
|
|
13
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
14
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
15
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
16
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
17
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
18
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
19
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
20
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
21
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
22
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
13
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/utils.json",
|
|
14
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/button.json",
|
|
15
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/pi-artifacts.json",
|
|
16
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/pi-app.json",
|
|
17
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/pi-app-kinds.json",
|
|
18
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/app-shell.json",
|
|
19
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/file-tree.json",
|
|
20
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/viewer-frame.json",
|
|
21
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/viewer-image.json",
|
|
22
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/viewer-pdf.json"
|
|
23
23
|
],
|
|
24
24
|
"files": [
|
|
25
25
|
{
|
package/r/drawing-viewer.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"title": "Drawing viewer",
|
|
5
5
|
"description": "DrawingViewer, drawingKind and describeDrawing: an Excalidraw (.excalidraw) or draw.io (.drawio) file, read-only, drawn by the tool's own renderer on a white page fitted to the shapes: Excalidraw's exportToSvg (its fonts served by the app, never its CDN) and the official diagrams.net viewer, vendored in the kit (@hachej/boring-ui-kit/drawio-viewer), in a sandboxed frame without network. Shown as an image, so nothing in the file runs; an unreadable file shows an inline error. onRead hands the shapes and arrows the renderer read (kind, place, size, label, colours, from and to). Each renderer loads the first time a drawing of its format opens; the kind is not in the pi-app-kinds default list, so apps without drawings install nothing.",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-ui-kit@^0.4.
|
|
7
|
+
"@hachej/boring-ui-kit@^0.4.58",
|
|
8
8
|
"react@^19.0.0",
|
|
9
9
|
"lucide-react@^1.51.0",
|
|
10
10
|
"@excalidraw/excalidraw@0.18.1"
|
package/r/feedback.json
CHANGED
|
@@ -4,17 +4,17 @@
|
|
|
4
4
|
"title": "Feedback",
|
|
5
5
|
"description": "Feedback from the chat composer: one Feedback button starts feedback mode on the application page (hover, click to pin a numbered note, hold ⌥ to use the app, optional voice), and one chip carries the notes to the next message. FeedbackBar, NoteBubble, FeedbackChip with its review, useComposerFeedback for the pi-chat composer, and PickerOverlay styles. Optional, not mounted by default: PointButton, AnnotateSheet, FeedbackList and FeedbackReport. Picking, masking, anchoring and placement stay in @hachej/boring-feedback/page and /ui, so restyling cannot weaken them.",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-feedback@^0.4.
|
|
8
|
-
"@hachej/boring-ui-kit@^0.4.
|
|
9
|
-
"@hachej/boring-files@^0.4.
|
|
7
|
+
"@hachej/boring-feedback@^0.4.58",
|
|
8
|
+
"@hachej/boring-ui-kit@^0.4.58",
|
|
9
|
+
"@hachej/boring-files@^0.4.58",
|
|
10
10
|
"react@^19.0.0",
|
|
11
11
|
"react-dom@^19.0.0",
|
|
12
12
|
"lucide-react@^1.51.0"
|
|
13
13
|
],
|
|
14
14
|
"registryDependencies": [
|
|
15
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
16
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
17
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
15
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/pi-chat.json",
|
|
16
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/pi-chat-voice.json",
|
|
17
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/utils.json"
|
|
18
18
|
],
|
|
19
19
|
"files": [
|
|
20
20
|
{
|
package/r/file-tree.json
CHANGED
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"title": "File tree",
|
|
5
5
|
"description": "Browse, search, upload, rename, move, delete and inspect retained versions through one revisionProvider binding. Uses the consumer's shadcn Button, dropdown-menu and dialog with shared version-history rows; Base UI style only.",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-ui-kit@^0.4.
|
|
8
|
-
"@hachej/boring-files@^0.4.
|
|
7
|
+
"@hachej/boring-ui-kit@^0.4.58",
|
|
8
|
+
"@hachej/boring-files@^0.4.58",
|
|
9
9
|
"react@^19.0.0",
|
|
10
10
|
"lucide-react@^1.51.0"
|
|
11
11
|
],
|
|
12
12
|
"registryDependencies": [
|
|
13
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
14
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
13
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/utils.json",
|
|
14
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/version-history.json"
|
|
15
15
|
],
|
|
16
16
|
"files": [
|
|
17
17
|
{
|
package/r/highlights.json
CHANGED
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
"title": "Anchored highlights",
|
|
5
5
|
"description": "Exact Markdown highlights and comments in a conditional workspace sidecar.",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-ui-kit@^0.4.
|
|
8
|
-
"@hachej/boring-files@^0.4.
|
|
7
|
+
"@hachej/boring-ui-kit@^0.4.58",
|
|
8
|
+
"@hachej/boring-files@^0.4.58",
|
|
9
9
|
"react@^19.0.0",
|
|
10
10
|
"react-dom@^19.0.0"
|
|
11
11
|
],
|
|
12
12
|
"registryDependencies": [
|
|
13
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
13
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/markdown-editor.json"
|
|
14
14
|
],
|
|
15
15
|
"files": [
|
|
16
16
|
{
|
package/r/html-viewer.json
CHANGED
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
"title": "HTML source and passive preview",
|
|
5
5
|
"description": "Exact HTML source editing with a reconstructed passive preview and borrowed controller. Browser security qualification remains separate.",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-ui-kit@^0.4.
|
|
8
|
-
"@hachej/boring-files@^0.4.
|
|
7
|
+
"@hachej/boring-ui-kit@^0.4.58",
|
|
8
|
+
"@hachej/boring-files@^0.4.58",
|
|
9
9
|
"react@^19.0.0",
|
|
10
10
|
"react-dom@^19.0.0"
|
|
11
11
|
],
|
|
12
12
|
"registryDependencies": [
|
|
13
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
13
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/button.json"
|
|
14
14
|
],
|
|
15
15
|
"files": [
|
|
16
16
|
{
|
package/r/looks-viewer.json
CHANGED
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
"lucide-react@^1.51.0"
|
|
9
9
|
],
|
|
10
10
|
"registryDependencies": [
|
|
11
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
12
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
11
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/mockup-viewer.json",
|
|
12
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/utils.json"
|
|
13
13
|
],
|
|
14
14
|
"files": [
|
|
15
15
|
{
|
package/r/maquette-viewer.json
CHANGED
package/r/markdown-editor.json
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
"title": "Markdown editor",
|
|
5
5
|
"description": "A host-owned styled wrapper over the concrete borrowed Markdown controller.",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-ui-kit@^0.4.
|
|
8
|
-
"@hachej/boring-files@^0.4.
|
|
7
|
+
"@hachej/boring-ui-kit@^0.4.58",
|
|
8
|
+
"@hachej/boring-files@^0.4.58",
|
|
9
9
|
"react@^19.0.0",
|
|
10
10
|
"react-dom@^19.0.0",
|
|
11
11
|
"marked@^17.0.6",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"lucide-react@^1.51.0"
|
|
25
25
|
],
|
|
26
26
|
"registryDependencies": [
|
|
27
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
27
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.58/r/button.json"
|
|
28
28
|
],
|
|
29
29
|
"files": [
|
|
30
30
|
{
|
package/r/mockup-viewer.json
CHANGED