pith-ui 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 (126) hide show
  1. package/AI.md +67 -0
  2. package/API.md +3281 -0
  3. package/LICENSE +661 -0
  4. package/README.md +80 -2
  5. package/dist/composer.d.ts +38 -0
  6. package/dist/composer.d.ts.map +1 -0
  7. package/dist/composer.js +114 -0
  8. package/dist/composer.js.map +1 -0
  9. package/dist/content/conversation-reader.d.ts +19 -0
  10. package/dist/content/conversation-reader.d.ts.map +1 -0
  11. package/dist/content/conversation-reader.js +280 -0
  12. package/dist/content/conversation-reader.js.map +1 -0
  13. package/dist/content/conversation-view.d.ts +48 -0
  14. package/dist/content/conversation-view.d.ts.map +1 -0
  15. package/dist/content/conversation-view.js +107 -0
  16. package/dist/content/conversation-view.js.map +1 -0
  17. package/dist/content/image-viewer.d.ts +23 -0
  18. package/dist/content/image-viewer.d.ts.map +1 -0
  19. package/dist/content/image-viewer.js +101 -0
  20. package/dist/content/image-viewer.js.map +1 -0
  21. package/dist/content/markdown.d.ts +12 -0
  22. package/dist/content/markdown.d.ts.map +1 -0
  23. package/dist/content/markdown.js +68 -0
  24. package/dist/content/markdown.js.map +1 -0
  25. package/dist/content/paged-preview.d.ts +15 -0
  26. package/dist/content/paged-preview.d.ts.map +1 -0
  27. package/dist/content/paged-preview.js +105 -0
  28. package/dist/content/paged-preview.js.map +1 -0
  29. package/dist/content/views.d.ts +9 -0
  30. package/dist/content/views.d.ts.map +1 -0
  31. package/dist/content/views.js +53 -0
  32. package/dist/content/views.js.map +1 -0
  33. package/dist/content/welcome.d.ts +18 -0
  34. package/dist/content/welcome.d.ts.map +1 -0
  35. package/dist/content/welcome.js +45 -0
  36. package/dist/content/welcome.js.map +1 -0
  37. package/dist/core.d.ts +36 -0
  38. package/dist/core.d.ts.map +1 -0
  39. package/dist/core.js +44 -0
  40. package/dist/core.js.map +1 -0
  41. package/dist/dom.d.ts +14 -0
  42. package/dist/dom.d.ts.map +1 -0
  43. package/dist/dom.js +69 -0
  44. package/dist/dom.js.map +1 -0
  45. package/dist/files/panels.d.ts +95 -0
  46. package/dist/files/panels.d.ts.map +1 -0
  47. package/dist/files/panels.js +245 -0
  48. package/dist/files/panels.js.map +1 -0
  49. package/dist/files/systems.d.ts +91 -0
  50. package/dist/files/systems.d.ts.map +1 -0
  51. package/dist/files/systems.js +256 -0
  52. package/dist/files/systems.js.map +1 -0
  53. package/dist/forms/actions.d.ts +27 -0
  54. package/dist/forms/actions.d.ts.map +1 -0
  55. package/dist/forms/actions.js +19 -0
  56. package/dist/forms/actions.js.map +1 -0
  57. package/dist/forms/custom-connection.d.ts +61 -0
  58. package/dist/forms/custom-connection.d.ts.map +1 -0
  59. package/dist/forms/custom-connection.js +65 -0
  60. package/dist/forms/custom-connection.js.map +1 -0
  61. package/dist/forms/dialog-frame.d.ts +39 -0
  62. package/dist/forms/dialog-frame.d.ts.map +1 -0
  63. package/dist/forms/dialog-frame.js +75 -0
  64. package/dist/forms/dialog-frame.js.map +1 -0
  65. package/dist/forms/history.d.ts +16 -0
  66. package/dist/forms/history.d.ts.map +1 -0
  67. package/dist/forms/history.js +21 -0
  68. package/dist/forms/history.js.map +1 -0
  69. package/dist/forms/identity.d.ts +4 -0
  70. package/dist/forms/identity.d.ts.map +1 -0
  71. package/dist/forms/identity.js +21 -0
  72. package/dist/forms/identity.js.map +1 -0
  73. package/dist/forms/model-editor.d.ts +35 -0
  74. package/dist/forms/model-editor.d.ts.map +1 -0
  75. package/dist/forms/model-editor.js +78 -0
  76. package/dist/forms/model-editor.js.map +1 -0
  77. package/dist/forms/panels.d.ts +57 -0
  78. package/dist/forms/panels.d.ts.map +1 -0
  79. package/dist/forms/panels.js +224 -0
  80. package/dist/forms/panels.js.map +1 -0
  81. package/dist/forms/provider-login.d.ts +22 -0
  82. package/dist/forms/provider-login.d.ts.map +1 -0
  83. package/dist/forms/provider-login.js +114 -0
  84. package/dist/forms/provider-login.js.map +1 -0
  85. package/dist/forms/resource-editor.d.ts +23 -0
  86. package/dist/forms/resource-editor.d.ts.map +1 -0
  87. package/dist/forms/resource-editor.js +24 -0
  88. package/dist/forms/resource-editor.js.map +1 -0
  89. package/dist/index.d.ts +28 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +28 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/navigation/context-menu.d.ts +25 -0
  94. package/dist/navigation/context-menu.d.ts.map +1 -0
  95. package/dist/navigation/context-menu.js +67 -0
  96. package/dist/navigation/context-menu.js.map +1 -0
  97. package/dist/navigation/navigation.d.ts +57 -0
  98. package/dist/navigation/navigation.d.ts.map +1 -0
  99. package/dist/navigation/navigation.js +185 -0
  100. package/dist/navigation/navigation.js.map +1 -0
  101. package/dist/primitives.d.ts +307 -0
  102. package/dist/primitives.d.ts.map +1 -0
  103. package/dist/primitives.js +741 -0
  104. package/dist/primitives.js.map +1 -0
  105. package/dist/styles.css +849 -0
  106. package/dist/tasks/approval.d.ts +25 -0
  107. package/dist/tasks/approval.d.ts.map +1 -0
  108. package/dist/tasks/approval.js +61 -0
  109. package/dist/tasks/approval.js.map +1 -0
  110. package/dist/tasks/permission.d.ts +35 -0
  111. package/dist/tasks/permission.d.ts.map +1 -0
  112. package/dist/tasks/permission.js +67 -0
  113. package/dist/tasks/permission.js.map +1 -0
  114. package/dist/tasks/runtime.d.ts +31 -0
  115. package/dist/tasks/runtime.d.ts.map +1 -0
  116. package/dist/tasks/runtime.js +34 -0
  117. package/dist/tasks/runtime.js.map +1 -0
  118. package/dist/theme.d.ts +4 -0
  119. package/dist/theme.d.ts.map +1 -0
  120. package/dist/theme.js +6 -0
  121. package/dist/theme.js.map +1 -0
  122. package/dist/workspace.d.ts +38 -0
  123. package/dist/workspace.d.ts.map +1 -0
  124. package/dist/workspace.js +183 -0
  125. package/dist/workspace.js.map +1 -0
  126. package/package.json +27 -4
@@ -0,0 +1,9 @@
1
+ export type View = {
2
+ key: string;
3
+ signature: string;
4
+ html: () => string;
5
+ children?: View[];
6
+ };
7
+ export declare function reconcileViews(parent: HTMLElement, views: View[]): void;
8
+ export declare function clearViews(parent: HTMLElement): void;
9
+ //# sourceMappingURL=views.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/content/views.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,IAAI,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAA;CAAE,CAAC;AAO7F,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAsCvE;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAsD"}
@@ -0,0 +1,53 @@
1
+ let version = 0;
2
+ const entries = new WeakMap();
3
+ // Reuse unchanged nodes: selection, focus, decoded images, feedback and code
4
+ // scrolling belong to the reader, and must survive another message's updates.
5
+ export function reconcileViews(parent, views) {
6
+ const previous = entries.get(parent) || new Map();
7
+ const current = new Map();
8
+ let cursor = parent.firstElementChild;
9
+ for (const view of views) {
10
+ let entry = previous.get(view.key);
11
+ let scroll;
12
+ if (!entry || entry.signature !== view.signature) {
13
+ const template = document.createElement('template');
14
+ template.innerHTML = view.html();
15
+ const element = template.content.firstElementChild;
16
+ element.dataset.renderVersion = String(++version);
17
+ if (entry && view.children) {
18
+ // Group summaries may change while completed tool results stay intact.
19
+ entry.element.querySelector('summary').replaceWith(element.querySelector('summary'));
20
+ entry.signature = view.signature;
21
+ }
22
+ else {
23
+ if (entry) {
24
+ const images = new Map(Array.from(entry.element.querySelectorAll('[data-image-key]'), (image) => [image.dataset.imageKey, image]));
25
+ for (const image of element.querySelectorAll('[data-image-key]')) {
26
+ const saved = images.get(image.dataset.imageKey);
27
+ if (saved)
28
+ image.replaceWith(saved);
29
+ }
30
+ scroll = Array.from(entry.element.querySelectorAll('pre'), (pre) => pre.scrollLeft);
31
+ entry.element.replaceWith(element);
32
+ if (cursor === entry.element)
33
+ cursor = element;
34
+ }
35
+ entry = { element, signature: view.signature };
36
+ }
37
+ }
38
+ if (entry.element !== cursor)
39
+ parent.insertBefore(entry.element, cursor);
40
+ if (scroll)
41
+ entry.element.querySelectorAll('pre').forEach((pre, index) => { pre.scrollLeft = scroll[index] || 0; });
42
+ cursor = entry.element.nextElementSibling;
43
+ if (view.children)
44
+ reconcileViews(entry.element.querySelector('[data-view-children]'), view.children);
45
+ current.set(view.key, entry);
46
+ }
47
+ for (const [key, entry] of previous)
48
+ if (!current.has(key))
49
+ entry.element.remove();
50
+ entries.set(parent, current);
51
+ }
52
+ export function clearViews(parent) { parent.replaceChildren(); entries.delete(parent); }
53
+ //# sourceMappingURL=views.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"views.js","sourceRoot":"","sources":["../../src/content/views.ts"],"names":[],"mappings":"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","sourcesContent":["export type View = { key: string; signature: string; html: () => string; children?: View[] };\ntype Entry = { element: HTMLElement; signature: string };\nlet version = 0;\nconst entries = new WeakMap<HTMLElement, Map<string, Entry>>();\n\n// Reuse unchanged nodes: selection, focus, decoded images, feedback and code\n// scrolling belong to the reader, and must survive another message's updates.\nexport function reconcileViews(parent: HTMLElement, views: View[]): void {\n const previous = entries.get(parent) || new Map<string, Entry>();\n const current = new Map<string, Entry>();\n let cursor = parent.firstElementChild;\n for (const view of views) {\n let entry = previous.get(view.key);\n let scroll: number[] | undefined;\n if (!entry || entry.signature !== view.signature) {\n const template = document.createElement('template');\n template.innerHTML = view.html();\n const element = template.content.firstElementChild as HTMLElement;\n element.dataset.renderVersion = String(++version);\n if (entry && view.children) {\n // Group summaries may change while completed tool results stay intact.\n entry.element.querySelector('summary')!.replaceWith(element.querySelector('summary')!);\n entry.signature = view.signature;\n } else {\n if (entry) {\n const images = new Map(Array.from(entry.element.querySelectorAll<HTMLImageElement>('[data-image-key]'), (image) => [image.dataset.imageKey, image]));\n for (const image of element.querySelectorAll<HTMLImageElement>('[data-image-key]')) {\n const saved = images.get(image.dataset.imageKey);\n if (saved) image.replaceWith(saved);\n }\n scroll = Array.from(entry.element.querySelectorAll('pre'), (pre) => pre.scrollLeft);\n entry.element.replaceWith(element);\n if (cursor === entry.element) cursor = element;\n }\n entry = { element, signature: view.signature };\n }\n }\n if (entry.element !== cursor) parent.insertBefore(entry.element, cursor);\n if (scroll) entry.element.querySelectorAll('pre').forEach((pre, index) => { pre.scrollLeft = scroll![index] || 0; });\n cursor = entry.element.nextElementSibling;\n if (view.children) reconcileViews(entry.element.querySelector<HTMLElement>('[data-view-children]')!, view.children);\n current.set(view.key, entry);\n }\n for (const [key, entry] of previous) if (!current.has(key)) entry.element.remove();\n entries.set(parent, current);\n}\n\nexport function clearViews(parent: HTMLElement): void { parent.replaceChildren(); entries.delete(parent); }\n"]}
@@ -0,0 +1,18 @@
1
+ import type { UIBlock } from '../core.js';
2
+ export interface WelcomeState {
3
+ workspace?: {
4
+ name: string;
5
+ path: string;
6
+ };
7
+ hasApiKey: boolean;
8
+ hasConnections: boolean;
9
+ modelName: string;
10
+ }
11
+ export interface WelcomeOptions {
12
+ container?: HTMLElement;
13
+ logo?: Node;
14
+ onAction?: (action: 'model' | 'settings' | 'workspace') => void;
15
+ onPrompt?: (text: string) => void;
16
+ }
17
+ export declare function createWelcomeView(options?: WelcomeOptions): UIBlock<WelcomeState>;
18
+ //# sourceMappingURL=welcome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"welcome.d.ts","sourceRoot":"","sources":["../../src/content/welcome.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,KAAK,IAAI,CAAC;IAChE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CAoCrF"}
@@ -0,0 +1,45 @@
1
+ import { escape, icon } from '../dom.js';
2
+ export function createWelcomeView(options = {}) {
3
+ const element = options.container || document.createElement('div');
4
+ let destroyed = false;
5
+ const click = (event) => {
6
+ const action = event.target.closest('[data-welcome-action], [data-prompt]');
7
+ if (!action || !element.contains(action))
8
+ return;
9
+ if (action.dataset.prompt)
10
+ options.onPrompt?.(action.dataset.prompt);
11
+ else
12
+ options.onAction?.(action.dataset.welcomeAction);
13
+ };
14
+ element.addEventListener('click', click);
15
+ return {
16
+ element,
17
+ update(state) {
18
+ if (destroyed)
19
+ return;
20
+ const workspace = state.workspace;
21
+ const ready = !!workspace && state.hasApiKey;
22
+ element.innerHTML = `<div class="pui-welcome-mark"></div>
23
+ <p class="pui-eyebrow">YOUR LOCAL WORK COMPANION</p>
24
+ <h1>${ready ? 'What are we working on?' : 'Your work. A little more possible.'}</h1>
25
+ <p class="pui-welcome-description">An agent that works alongside you, with your files<br class="pui-desktop-break"> and the tools you choose.</p>
26
+ ${!ready ? `<div class="pui-setup-card">
27
+ <div class="pui-setup-card-heading">Make yourself at home <span>Two quick steps</span></div>
28
+ <button type="button" class="pui-setup-step" data-welcome-action="${state.hasConnections ? 'model' : 'settings'}"><span class="pui-step-number ${state.hasApiKey ? 'pui-complete' : ''}">${state.hasApiKey ? icon('check') : '1'}</span><span><strong>${state.hasApiKey ? 'Model selected' : state.hasConnections ? 'Choose a model' : 'Connect a provider'}</strong><small>${state.hasApiKey ? escape(state.modelName) : state.hasConnections ? 'Your provider connection is ready' : 'Bring your provider API key'}</small></span>${icon('chevron')}</button>
29
+ <button type="button" class="pui-setup-step" data-welcome-action="workspace"><span class="pui-step-number ${workspace ? 'pui-complete' : ''}">${workspace ? icon('check') : '2'}</span><span><strong>${workspace ? escape(workspace.name) : 'Choose a workspace'}</strong><small>${workspace ? escape(workspace.path) : 'A folder Pith can help you work in'}</small></span>${icon('chevron')}</button>
30
+ </div>` : `<div class="pui-welcome-workspace">${icon('folder')}<span>Working in <strong>${escape(workspace.name)}</strong></span><button class="pui-secondary-button" type="button" data-welcome-action="workspace">Change</button></div>
31
+ <div class="pui-suggestions"><button type="button" data-prompt="Explore this workspace and give me a concise overview of its files.">${icon('file')}Explore my workspace</button><button type="button" data-prompt="Help me plan a task. Start by asking what I want to accomplish.">${icon('chat')}Think through a task</button><button type="button" data-prompt="I'd like help creating a document in this workspace. Ask me what it should cover.">${icon('plus')}Create something</button></div>`}
32
+ <div class="pui-welcome-footnote">${icon('shield')}Local workspace. Your choice of model.</div>`;
33
+ if (options.logo)
34
+ element.querySelector('.pui-welcome-mark').append(options.logo.cloneNode(true));
35
+ },
36
+ destroy() {
37
+ if (destroyed)
38
+ return;
39
+ destroyed = true;
40
+ element.removeEventListener('click', click);
41
+ element.replaceChildren();
42
+ },
43
+ };
44
+ }
45
+ //# sourceMappingURL=welcome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/content/welcome.ts"],"names":[],"mappings":"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","sourcesContent":["import { escape, icon } from '../dom.js';\nimport type { UIBlock } from '../core.js';\n\nexport interface WelcomeState {\n workspace?: { name: string; path: string };\n hasApiKey: boolean;\n hasConnections: boolean;\n modelName: string;\n}\nexport interface WelcomeOptions {\n container?: HTMLElement;\n logo?: Node;\n onAction?: (action: 'model' | 'settings' | 'workspace') => void;\n onPrompt?: (text: string) => void;\n}\n\nexport function createWelcomeView(options: WelcomeOptions = {}): UIBlock<WelcomeState> {\n const element = options.container || document.createElement('div');\n let destroyed = false;\n const click = (event: Event) => {\n const action = (event.target as Element).closest<HTMLElement>('[data-welcome-action], [data-prompt]');\n if (!action || !element.contains(action)) return;\n if (action.dataset.prompt) options.onPrompt?.(action.dataset.prompt);\n else options.onAction?.(action.dataset.welcomeAction as 'model' | 'settings' | 'workspace');\n };\n element.addEventListener('click', click);\n return {\n element,\n update(state): void {\n if (destroyed) return;\n const workspace = state.workspace;\n const ready = !!workspace && state.hasApiKey;\n element.innerHTML = `<div class=\"pui-welcome-mark\"></div>\n <p class=\"pui-eyebrow\">YOUR LOCAL WORK COMPANION</p>\n <h1>${ready ? 'What are we working on?' : 'Your work. A little more possible.'}</h1>\n <p class=\"pui-welcome-description\">An agent that works alongside you, with your files<br class=\"pui-desktop-break\"> and the tools you choose.</p>\n ${!ready ? `<div class=\"pui-setup-card\">\n <div class=\"pui-setup-card-heading\">Make yourself at home <span>Two quick steps</span></div>\n <button type=\"button\" class=\"pui-setup-step\" data-welcome-action=\"${state.hasConnections ? 'model' : 'settings'}\"><span class=\"pui-step-number ${state.hasApiKey ? 'pui-complete' : ''}\">${state.hasApiKey ? icon('check') : '1'}</span><span><strong>${state.hasApiKey ? 'Model selected' : state.hasConnections ? 'Choose a model' : 'Connect a provider'}</strong><small>${state.hasApiKey ? escape(state.modelName) : state.hasConnections ? 'Your provider connection is ready' : 'Bring your provider API key'}</small></span>${icon('chevron')}</button>\n <button type=\"button\" class=\"pui-setup-step\" data-welcome-action=\"workspace\"><span class=\"pui-step-number ${workspace ? 'pui-complete' : ''}\">${workspace ? icon('check') : '2'}</span><span><strong>${workspace ? escape(workspace.name) : 'Choose a workspace'}</strong><small>${workspace ? escape(workspace.path) : 'A folder Pith can help you work in'}</small></span>${icon('chevron')}</button>\n </div>` : `<div class=\"pui-welcome-workspace\">${icon('folder')}<span>Working in <strong>${escape(workspace.name)}</strong></span><button class=\"pui-secondary-button\" type=\"button\" data-welcome-action=\"workspace\">Change</button></div>\n <div class=\"pui-suggestions\"><button type=\"button\" data-prompt=\"Explore this workspace and give me a concise overview of its files.\">${icon('file')}Explore my workspace</button><button type=\"button\" data-prompt=\"Help me plan a task. Start by asking what I want to accomplish.\">${icon('chat')}Think through a task</button><button type=\"button\" data-prompt=\"I'd like help creating a document in this workspace. Ask me what it should cover.\">${icon('plus')}Create something</button></div>`}\n <div class=\"pui-welcome-footnote\">${icon('shield')}Local workspace. Your choice of model.</div>`;\n if (options.logo) element.querySelector('.pui-welcome-mark')!.append(options.logo.cloneNode(true));\n },\n destroy(): void {\n if (destroyed) return;\n destroyed = true;\n element.removeEventListener('click', click);\n element.replaceChildren();\n },\n };\n}\n"]}
package/dist/core.d.ts ADDED
@@ -0,0 +1,36 @@
1
+ /** An owned DOM instance. Call destroy before releasing or replacing its host. */
2
+ export interface UIBlock<State> {
3
+ readonly element: HTMLElement;
4
+ update(state: Readonly<State>): void;
5
+ destroy(): void;
6
+ }
7
+ export type ActionResult = {
8
+ ok: true;
9
+ } | {
10
+ ok: false;
11
+ error: string;
12
+ };
13
+ export type UIAction = () => void | ActionResult | Promise<void | ActionResult>;
14
+ export type Density = 'normal' | 'compact';
15
+ export type Intent = 'neutral' | 'primary' | 'danger';
16
+ /** Invalidates UI responses without cancelling an already-started business write. */
17
+ export declare class Generation {
18
+ private revision;
19
+ private disposed;
20
+ next(): number;
21
+ current(revision: number): boolean;
22
+ invalidate(): void;
23
+ destroy(): void;
24
+ }
25
+ /** All listeners and observers belong to the instance, including document listeners. */
26
+ export declare class Lifetime {
27
+ private cleanups;
28
+ private disposed;
29
+ add(cleanup: () => void): void;
30
+ listen(target: EventTarget, type: string, listener: EventListenerOrEventListenerObject, options?: AddEventListenerOptions): void;
31
+ destroy(): void;
32
+ }
33
+ /** Combine business availability with pending state owned by the control. */
34
+ export declare function controlDisabled(button: Pick<HTMLButtonElement, 'dataset'>, unavailable: boolean): boolean;
35
+ export declare function setControlPending(button: HTMLButtonElement, pending: boolean): void;
36
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,WAAW,OAAO,CAAC,KAAK;IAC5B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,MAAM,YAAY,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AACvE,MAAM,MAAM,QAAQ,GAAG,MAAM,IAAI,GAAG,YAAY,GAAG,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC;AAChF,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;AAC3C,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEtD,qFAAqF;AACrF,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAS;IACzB,IAAI,IAAI,MAAM;IACd,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAClC,UAAU,IAAI,IAAI;IAClB,OAAO,IAAI,IAAI;CAChB;AAED,wFAAwF;AACxF,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,QAAQ,CAAS;IACzB,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAG9B,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,kCAAkC,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,IAAI;IAIhI,OAAO,IAAI,IAAI;CAKhB;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAEzG;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAGnF"}
package/dist/core.js ADDED
@@ -0,0 +1,44 @@
1
+ /** Invalidates UI responses without cancelling an already-started business write. */
2
+ export class Generation {
3
+ revision = 0;
4
+ disposed = false;
5
+ next() { return ++this.revision; }
6
+ current(revision) { return !this.disposed && revision === this.revision; }
7
+ invalidate() { this.revision++; }
8
+ destroy() { this.disposed = true; this.invalidate(); }
9
+ }
10
+ /** All listeners and observers belong to the instance, including document listeners. */
11
+ export class Lifetime {
12
+ cleanups = [];
13
+ disposed = false;
14
+ add(cleanup) {
15
+ if (this.disposed)
16
+ cleanup();
17
+ else
18
+ this.cleanups.push(cleanup);
19
+ }
20
+ listen(target, type, listener, options) {
21
+ target.addEventListener(type, listener, options);
22
+ this.add(() => target.removeEventListener(type, listener, options));
23
+ }
24
+ destroy() {
25
+ if (this.disposed)
26
+ return;
27
+ this.disposed = true;
28
+ for (const cleanup of this.cleanups.splice(0).reverse())
29
+ cleanup();
30
+ }
31
+ }
32
+ /** Combine business availability with pending state owned by the control. */
33
+ export function controlDisabled(button, unavailable) {
34
+ return unavailable || !!button.dataset.controlPending || !!button.dataset.copyPending;
35
+ }
36
+ export function setControlPending(button, pending) {
37
+ if (pending) {
38
+ button.dataset.controlPending = 'true';
39
+ button.disabled = true;
40
+ }
41
+ else
42
+ delete button.dataset.controlPending;
43
+ }
44
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAYA,qFAAqF;AACrF,MAAM,OAAO,UAAU;IACb,QAAQ,GAAG,CAAC,CAAC;IACb,QAAQ,GAAG,KAAK,CAAC;IACzB,IAAI,KAAa,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,QAAgB,IAAa,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3F,UAAU,KAAW,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACvC,OAAO,KAAW,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;CAC7D;AAED,wFAAwF;AACxF,MAAM,OAAO,QAAQ;IACX,QAAQ,GAAsB,EAAE,CAAC;IACjC,QAAQ,GAAG,KAAK,CAAC;IACzB,GAAG,CAAC,OAAmB;QACrB,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;;YAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,CAAC,MAAmB,EAAE,IAAY,EAAE,QAA4C,EAAE,OAAiC;QACvH,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO;QACL,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;YAAE,OAAO,EAAE,CAAC;IACrE,CAAC;CACF;AAED,6EAA6E;AAC7E,MAAM,UAAU,eAAe,CAAC,MAA0C,EAAE,WAAoB;IAC9F,OAAO,WAAW,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAyB,EAAE,OAAgB;IAC3E,IAAI,OAAO,EAAE,CAAC;QAAC,MAAM,CAAC,OAAO,CAAC,cAAc,GAAG,MAAM,CAAC;QAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;IAAC,CAAC;;QAC3E,OAAO,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;AAC5C,CAAC","sourcesContent":["/** An owned DOM instance. Call destroy before releasing or replacing its host. */\nexport interface UIBlock<State> {\n readonly element: HTMLElement;\n update(state: Readonly<State>): void;\n destroy(): void;\n}\n\nexport type ActionResult = { ok: true } | { ok: false; error: string };\nexport type UIAction = () => void | ActionResult | Promise<void | ActionResult>;\nexport type Density = 'normal' | 'compact';\nexport type Intent = 'neutral' | 'primary' | 'danger';\n\n/** Invalidates UI responses without cancelling an already-started business write. */\nexport class Generation {\n private revision = 0;\n private disposed = false;\n next(): number { return ++this.revision; }\n current(revision: number): boolean { return !this.disposed && revision === this.revision; }\n invalidate(): void { this.revision++; }\n destroy(): void { this.disposed = true; this.invalidate(); }\n}\n\n/** All listeners and observers belong to the instance, including document listeners. */\nexport class Lifetime {\n private cleanups: Array<() => void> = [];\n private disposed = false;\n add(cleanup: () => void): void {\n if (this.disposed) cleanup(); else this.cleanups.push(cleanup);\n }\n listen(target: EventTarget, type: string, listener: EventListenerOrEventListenerObject, options?: AddEventListenerOptions): void {\n target.addEventListener(type, listener, options);\n this.add(() => target.removeEventListener(type, listener, options));\n }\n destroy(): void {\n if (this.disposed) return;\n this.disposed = true;\n for (const cleanup of this.cleanups.splice(0).reverse()) cleanup();\n }\n}\n\n/** Combine business availability with pending state owned by the control. */\nexport function controlDisabled(button: Pick<HTMLButtonElement, 'dataset'>, unavailable: boolean): boolean {\n return unavailable || !!button.dataset.controlPending || !!button.dataset.copyPending;\n}\n\nexport function setControlPending(button: HTMLButtonElement, pending: boolean): void {\n if (pending) { button.dataset.controlPending = 'true'; button.disabled = true; }\n else delete button.dataset.controlPending;\n}\n"]}
package/dist/dom.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ export declare const escape: (value: unknown) => string;
2
+ export declare const escapeHTML: (value: unknown) => string;
3
+ /** Compatibility markup from a closed, trusted icon registry. */
4
+ export declare const icon: (name: string, className?: string) => string;
5
+ export declare function dialogHeading(title: string, id: string, dialogId: string, eyebrow?: string): string;
6
+ export type DOMChild = Node | string | null | undefined;
7
+ /** Safe DOM construction; strings are always text nodes. */
8
+ export declare function element<K extends keyof HTMLElementTagNameMap>(tag: K, className?: string, ...children: DOMChild[]): HTMLElementTagNameMap[K];
9
+ export declare function iconElement(name: string): SVGSVGElement;
10
+ export declare function setText(node: HTMLElement, value: unknown): void;
11
+ export declare function focusableElements(owner: HTMLElement): HTMLElement[];
12
+ export declare function uniqueId(prefix?: string): string;
13
+ export declare function showDialogError(owner: HTMLElement, message: string): void;
14
+ //# sourceMappingURL=dom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../src/dom.ts"],"names":[],"mappings":"AA4BA,eAAO,MAAM,MAAM,GAAI,OAAO,OAAO,KAAG,MAA6I,CAAC;AACtL,eAAO,MAAM,UAAU,UADO,OAAO,KAAG,MACR,CAAC;AACjC,iEAAiE;AACjE,eAAO,MAAM,IAAI,GAAI,MAAM,MAAM,EAAE,kBAAc,WAA+N,CAAC;AAEjR,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,SAAK,GAAG,MAAM,CAE/F;AAED,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AACxD,4DAA4D;AAC5D,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,qBAAqB,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,SAAK,EAAE,GAAG,QAAQ,EAAE,QAAQ,EAAE,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAKxI;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAIvD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAG/D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,EAAE,CAGnE;AAGD,wBAAgB,QAAQ,CAAC,MAAM,SAAQ,GAAG,MAAM,CAAoC;AAEpF,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGzE"}
package/dist/dom.js ADDED
@@ -0,0 +1,69 @@
1
+ const paths = {
2
+ steer: '<path d="M4 5v7a3 3 0 0 0 3 3h13m-5-5 5 5-5 5"/>',
3
+ edit: '<path d="m16 3 5 5-12 12-6 1 1-6Z M14 5l5 5"/>',
4
+ trash: '<path d="M3 6h18M9 6V3h6v3M5 6l1 15h12l1-15M10 10v7M14 10v7"/>',
5
+ branch: '<path d="M4 12h7M11 12l9-9M14 3h6v6M11 12l9 9M14 21h6v-6"/>',
6
+ compress: '<path d="M7 3h10M12 3v6m-3-3 3 3 3-3M5 12h14M12 21v-6m-3 3 3-3 3 3M7 21h10"/>',
7
+ image: '<rect x="3" y="3" width="18" height="18" rx="3"/><circle cx="8" cy="8" r="1.5"/><path d="m3 17 6-6 4 4 3-3 5 5"/>',
8
+ plus: '<path d="M12 5v14M5 12h14"/>',
9
+ chat: '<path d="M21 11.5a8.4 8.4 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.4 8.4 0 0 1-3.8-.9L3 21l1.9-5.7A8.4 8.4 0 0 1 4 11.5a8.5 8.5 0 0 1 4.7-7.6 8.4 8.4 0 0 1 3.8-.9h.5a8.5 8.5 0 0 1 8 8v.5Z"/>',
10
+ folder: '<path d="M3 7a2 2 0 0 1 2-2h5l2 2h7a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z"/>',
11
+ settings: '<path d="m9.5 3-.7 2.2-2.1 1.2-2.3-.5-2.5 4.2 1.6 1.7v2.4l-1.6 1.7 2.5 4.2 2.3-.5 2.1 1.2.7 2.2h5l.7-2.2 2.1-1.2 2.3.5 2.5-4.2-1.6-1.7v-2.4l1.6-1.7-2.5-4.2-2.3.5-2.1-1.2-.7-2.2Z"/><circle cx="12" cy="12" r="3"/>',
12
+ arrow: '<path d="M12 19V5m-6 6 6-6 6 6"/>',
13
+ stop: '<rect x="6" y="6" width="12" height="12" rx="2"/>',
14
+ chevron: '<path d="m9 5 7 7-7 7"/>',
15
+ down: '<path d="m6 9 6 6 6-6"/>',
16
+ close: '<path d="m6 6 12 12M18 6 6 18"/>',
17
+ check: '<path d="m5 12 4 4L19 6"/>',
18
+ shield: '<path d="m12 3 8 4v5c0 5-8 9-8 9s-8-4-8-9V7Z"/><path d="m8 12 3 3 5-6"/>',
19
+ file: '<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8Z"/><path d="M14 2v6h6M8 13h8M8 17h5"/>',
20
+ terminal: '<path d="m4 7 5 5-5 5M12 17h8"/>',
21
+ copy: '<rect x="8" y="8" width="12" height="12" rx="2"/><path d="M16 8V4a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h4"/>',
22
+ menu: '<path d="M4 6h16M4 12h16M4 18h16"/>',
23
+ globe: '<circle cx="12" cy="12" r="9"/><path d="M3 12h18M12 3a17 17 0 0 1 0 18 17 17 0 0 1 0-18Z"/>',
24
+ search: '<circle cx="10.5" cy="10.5" r="6.5"/><path d="m16 16 5 5"/>',
25
+ more: '<circle cx="5" cy="12" r="1"/><circle cx="12" cy="12" r="1"/><circle cx="19" cy="12" r="1"/>',
26
+ compose: '<path d="M12 4H5a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h13a2 2 0 0 0 2-2v-7"/><path d="m16 3 5 5-10 10-5 1 1-5Z"/>',
27
+ plug: '<path d="M8 3v5M16 3v5M6 8h12v3a6 6 0 0 1-6 6v4M8 8V5M16 8V5"/>',
28
+ };
29
+ export const escape = (value) => String(value ?? '').replace(/[&<>"']/g, (char) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[char]));
30
+ export const escapeHTML = escape;
31
+ /** Compatibility markup from a closed, trusted icon registry. */
32
+ export const icon = (name, className = '') => `<svg class="pui-icon ${escape(className)}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${paths[name] ?? paths.chat}</svg>`;
33
+ export function dialogHeading(title, id, dialogId, eyebrow = '') {
34
+ return `<div class="pui-dialog-heading pui-modal-heading"><div>${eyebrow ? `<span class="pui-eyebrow">${escape(eyebrow)}</span>` : ''}<h2 id="${escape(id)}">${escape(title)}</h2></div><button type="button" class="pui-icon-button pui-quiet-icon" data-close="${escape(dialogId)}" aria-label="Close ${escape(title.toLowerCase())}">${icon('close')}</button></div>`;
35
+ }
36
+ /** Safe DOM construction; strings are always text nodes. */
37
+ export function element(tag, className = '', ...children) {
38
+ const node = document.createElement(tag);
39
+ if (className)
40
+ node.className = className;
41
+ for (const child of children)
42
+ if (child != null)
43
+ node.append(typeof child === 'string' ? document.createTextNode(child) : child);
44
+ return node;
45
+ }
46
+ export function iconElement(name) {
47
+ const holder = document.createElement('span');
48
+ holder.innerHTML = icon(name);
49
+ return holder.firstElementChild;
50
+ }
51
+ export function setText(node, value) {
52
+ const text = String(value ?? '');
53
+ if (node.textContent !== text)
54
+ node.textContent = text;
55
+ }
56
+ export function focusableElements(owner) {
57
+ return [...owner.querySelectorAll('button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), a[href], [tabindex="0"]')]
58
+ .filter(node => !node.hidden && !node.closest('[hidden], [inert]'));
59
+ }
60
+ let nextId = 0;
61
+ export function uniqueId(prefix = 'pui') { return `${prefix}-${++nextId}`; }
62
+ export function showDialogError(owner, message) {
63
+ const error = owner.querySelector('[data-dialog-error]') || owner.querySelector('.pui-form-error[role="alert"]');
64
+ if (error) {
65
+ error.textContent = message;
66
+ error.scrollIntoView({ block: 'nearest' });
67
+ }
68
+ }
69
+ //# sourceMappingURL=dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.js","sourceRoot":"","sources":["../src/dom.ts"],"names":[],"mappings":"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","sourcesContent":["const paths: Record<string, string> = {\n steer: '<path d=\"M4 5v7a3 3 0 0 0 3 3h13m-5-5 5 5-5 5\"/>',\n edit: '<path d=\"m16 3 5 5-12 12-6 1 1-6Z M14 5l5 5\"/>',\n trash: '<path d=\"M3 6h18M9 6V3h6v3M5 6l1 15h12l1-15M10 10v7M14 10v7\"/>',\n branch: '<path d=\"M4 12h7M11 12l9-9M14 3h6v6M11 12l9 9M14 21h6v-6\"/>',\n compress: '<path d=\"M7 3h10M12 3v6m-3-3 3 3 3-3M5 12h14M12 21v-6m-3 3 3-3 3 3M7 21h10\"/>',\n image: '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"3\"/><circle cx=\"8\" cy=\"8\" r=\"1.5\"/><path d=\"m3 17 6-6 4 4 3-3 5 5\"/>',\n plus: '<path d=\"M12 5v14M5 12h14\"/>',\n chat: '<path d=\"M21 11.5a8.4 8.4 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.4 8.4 0 0 1-3.8-.9L3 21l1.9-5.7A8.4 8.4 0 0 1 4 11.5a8.5 8.5 0 0 1 4.7-7.6 8.4 8.4 0 0 1 3.8-.9h.5a8.5 8.5 0 0 1 8 8v.5Z\"/>',\n folder: '<path d=\"M3 7a2 2 0 0 1 2-2h5l2 2h7a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z\"/>',\n settings: '<path d=\"m9.5 3-.7 2.2-2.1 1.2-2.3-.5-2.5 4.2 1.6 1.7v2.4l-1.6 1.7 2.5 4.2 2.3-.5 2.1 1.2.7 2.2h5l.7-2.2 2.1-1.2 2.3.5 2.5-4.2-1.6-1.7v-2.4l1.6-1.7-2.5-4.2-2.3.5-2.1-1.2-.7-2.2Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>',\n arrow: '<path d=\"M12 19V5m-6 6 6-6 6 6\"/>',\n stop: '<rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\"/>',\n chevron: '<path d=\"m9 5 7 7-7 7\"/>',\n down: '<path d=\"m6 9 6 6 6-6\"/>',\n close: '<path d=\"m6 6 12 12M18 6 6 18\"/>',\n check: '<path d=\"m5 12 4 4L19 6\"/>',\n shield: '<path d=\"m12 3 8 4v5c0 5-8 9-8 9s-8-4-8-9V7Z\"/><path d=\"m8 12 3 3 5-6\"/>',\n file: '<path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8Z\"/><path d=\"M14 2v6h6M8 13h8M8 17h5\"/>',\n terminal: '<path d=\"m4 7 5 5-5 5M12 17h8\"/>',\n copy: '<rect x=\"8\" y=\"8\" width=\"12\" height=\"12\" rx=\"2\"/><path d=\"M16 8V4a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h4\"/>',\n menu: '<path d=\"M4 6h16M4 12h16M4 18h16\"/>',\n globe: '<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M3 12h18M12 3a17 17 0 0 1 0 18 17 17 0 0 1 0-18Z\"/>',\n search: '<circle cx=\"10.5\" cy=\"10.5\" r=\"6.5\"/><path d=\"m16 16 5 5\"/>',\n more: '<circle cx=\"5\" cy=\"12\" r=\"1\"/><circle cx=\"12\" cy=\"12\" r=\"1\"/><circle cx=\"19\" cy=\"12\" r=\"1\"/>',\n compose: '<path d=\"M12 4H5a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h13a2 2 0 0 0 2-2v-7\"/><path d=\"m16 3 5 5-10 10-5 1 1-5Z\"/>',\n plug: '<path d=\"M8 3v5M16 3v5M6 8h12v3a6 6 0 0 1-6 6v4M8 8V5M16 8V5\"/>',\n};\nexport const escape = (value: unknown): string => String(value ?? '').replace(/[&<>\"']/g, (char) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[char]!));\nexport const escapeHTML = escape;\n/** Compatibility markup from a closed, trusted icon registry. */\nexport const icon = (name: string, className = '') => `<svg class=\"pui-icon ${escape(className)}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">${paths[name] ?? paths.chat}</svg>`;\n\nexport function dialogHeading(title: string, id: string, dialogId: string, eyebrow = ''): string {\n return `<div class=\"pui-dialog-heading pui-modal-heading\"><div>${eyebrow ? `<span class=\"pui-eyebrow\">${escape(eyebrow)}</span>` : ''}<h2 id=\"${escape(id)}\">${escape(title)}</h2></div><button type=\"button\" class=\"pui-icon-button pui-quiet-icon\" data-close=\"${escape(dialogId)}\" aria-label=\"Close ${escape(title.toLowerCase())}\">${icon('close')}</button></div>`;\n}\n\nexport type DOMChild = Node | string | null | undefined;\n/** Safe DOM construction; strings are always text nodes. */\nexport function element<K extends keyof HTMLElementTagNameMap>(tag: K, className = '', ...children: DOMChild[]): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n if (className) node.className = className;\n for (const child of children) if (child != null) node.append(typeof child === 'string' ? document.createTextNode(child) : child);\n return node;\n}\n\nexport function iconElement(name: string): SVGSVGElement {\n const holder = document.createElement('span');\n holder.innerHTML = icon(name);\n return holder.firstElementChild as SVGSVGElement;\n}\n\nexport function setText(node: HTMLElement, value: unknown): void {\n const text = String(value ?? '');\n if (node.textContent !== text) node.textContent = text;\n}\n\nexport function focusableElements(owner: HTMLElement): HTMLElement[] {\n return [...owner.querySelectorAll<HTMLElement>('button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), a[href], [tabindex=\"0\"]')]\n .filter(node => !node.hidden && !node.closest('[hidden], [inert]'));\n}\n\nlet nextId = 0;\nexport function uniqueId(prefix = 'pui'): string { return `${prefix}-${++nextId}`; }\n\nexport function showDialogError(owner: HTMLElement, message: string): void {\n const error = owner.querySelector<HTMLElement>('[data-dialog-error]') || owner.querySelector<HTMLElement>('.pui-form-error[role=\"alert\"]');\n if (error) { error.textContent = message; error.scrollIntoView({ block: 'nearest' }); }\n}\n"]}
@@ -0,0 +1,95 @@
1
+ import { type PreviewKind } from '../content/paged-preview.js';
2
+ export interface FileActionOptions {
3
+ kind: string;
4
+ ownerId: string;
5
+ path: string;
6
+ preview?: boolean;
7
+ copyMode?: 'file' | 'path' | 'none';
8
+ onAction?: (action: 'preview' | 'open' | 'reveal' | 'copy' | 'copy-path') => void;
9
+ }
10
+ export declare function fileActionsMarkup(options: FileActionOptions): string;
11
+ export declare function createFileActions(options: FileActionOptions): {
12
+ element: HTMLElement;
13
+ destroy(): void;
14
+ };
15
+ export interface ArtifactPanelState {
16
+ ownerId: string;
17
+ files: readonly {
18
+ name: string;
19
+ path: string;
20
+ }[];
21
+ loading: boolean;
22
+ error: string;
23
+ copyMode: 'file' | 'path';
24
+ }
25
+ export interface ArtifactPanelOptions {
26
+ container: HTMLElement;
27
+ control: HTMLElement;
28
+ toggle: HTMLElement;
29
+ count: HTMLElement;
30
+ headingId?: string;
31
+ }
32
+ export declare function createArtifactPanel(options: ArtifactPanelOptions): {
33
+ element: HTMLElement;
34
+ setOpen: (value: boolean, restoreFocus?: boolean) => void;
35
+ readonly open: boolean;
36
+ update(state: Readonly<ArtifactPanelState>): void;
37
+ destroy(): void;
38
+ };
39
+ export interface ResourceDisplayEntry {
40
+ name: string;
41
+ path: string;
42
+ description?: string;
43
+ content?: string;
44
+ fileActions?: Node;
45
+ actions?: Node;
46
+ }
47
+ export interface ResourcesPanelState {
48
+ instructions: readonly ResourceDisplayEntry[];
49
+ skills: readonly ResourceDisplayEntry[];
50
+ templates: readonly ResourceDisplayEntry[];
51
+ diagnostics: readonly string[];
52
+ createInstructions?: Node;
53
+ }
54
+ export interface ResourcesPanelOptions {
55
+ container?: HTMLElement;
56
+ titleId?: string;
57
+ dialogId?: string;
58
+ listId?: string;
59
+ errorId?: string;
60
+ onClose?: () => void;
61
+ }
62
+ export declare function createResourcesPanel(options?: ResourcesPanelOptions): {
63
+ element: HTMLElement;
64
+ open(workspaceName: string, toolbar: Node): void;
65
+ setError(message: string): void;
66
+ update(state: Readonly<ResourcesPanelState>): void;
67
+ destroy(): void;
68
+ };
69
+ export interface FilePreviewState {
70
+ kind: PreviewKind | 'image';
71
+ text?: string;
72
+ imageSrc?: string;
73
+ imageAlt?: string;
74
+ truncated?: boolean;
75
+ error?: string;
76
+ }
77
+ export interface FilePreviewOptions {
78
+ container?: HTMLElement;
79
+ titleId?: string;
80
+ dialogId?: string;
81
+ bodyId?: string;
82
+ onClose?: () => void;
83
+ }
84
+ export declare function createFilePreview(options?: FilePreviewOptions): {
85
+ element: HTMLElement;
86
+ clear: () => void;
87
+ open(input: {
88
+ name: string;
89
+ path: string;
90
+ actions: Node;
91
+ }): void;
92
+ update(state: Readonly<FilePreviewState>): void;
93
+ destroy(): void;
94
+ };
95
+ //# sourceMappingURL=panels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panels.d.ts","sourceRoot":"","sources":["../../src/files/panels.ts"],"names":[],"mappings":"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"}