@desktalk/core 0.1.0-alpha.1
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/LICENSE +21 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +82 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/frontend/assets/frontend-B3QNYf3p.js +413 -0
- package/dist/frontend/assets/frontend-B3QNYf3p.js.map +1 -0
- package/dist/frontend/assets/frontend-B4aeXn9d.js +416 -0
- package/dist/frontend/assets/frontend-B4aeXn9d.js.map +1 -0
- package/dist/frontend/assets/frontend-BwyRSlHp.js +6513 -0
- package/dist/frontend/assets/frontend-BwyRSlHp.js.map +1 -0
- package/dist/frontend/assets/frontend-Dix2OWTT.js +229 -0
- package/dist/frontend/assets/frontend-Dix2OWTT.js.map +1 -0
- package/dist/frontend/assets/frontend-Dx41dEM9.js +407 -0
- package/dist/frontend/assets/frontend-Dx41dEM9.js.map +1 -0
- package/dist/frontend/assets/frontend-WpQng8Mt.js +1991 -0
- package/dist/frontend/assets/frontend-WpQng8Mt.js.map +1 -0
- package/dist/frontend/assets/frontend-rTwBdJbn.js +2123 -0
- package/dist/frontend/assets/frontend-rTwBdJbn.js.map +1 -0
- package/dist/frontend/assets/highlighted-body-TPN3WLV5-DD4wpkf4.js +2 -0
- package/dist/frontend/assets/highlighted-body-TPN3WLV5-DD4wpkf4.js.map +1 -0
- package/dist/frontend/assets/index-C5-XUOS7.js +1863 -0
- package/dist/frontend/assets/index-C5-XUOS7.js.map +1 -0
- package/dist/frontend/assets/index-C_e3_6yE.css +1 -0
- package/dist/frontend/index.html +22 -0
- package/dist/frontend/pcm-capture-processor.js +65 -0
- package/dist/i18n/manifest.json +34 -0
- package/dist/i18n/zh-CN.json +7 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/server/admin-routes.d.ts +14 -0
- package/dist/server/admin-routes.d.ts.map +1 -0
- package/dist/server/admin-routes.js +118 -0
- package/dist/server/admin-routes.js.map +1 -0
- package/dist/server/api-routes.d.ts +8 -0
- package/dist/server/api-routes.d.ts.map +1 -0
- package/dist/server/api-routes.js +203 -0
- package/dist/server/api-routes.js.map +1 -0
- package/dist/server/auth-routes.d.ts +19 -0
- package/dist/server/auth-routes.d.ts.map +1 -0
- package/dist/server/auth-routes.js +155 -0
- package/dist/server/auth-routes.js.map +1 -0
- package/dist/server/dtfs-routes.d.ts +3 -0
- package/dist/server/dtfs-routes.d.ts.map +1 -0
- package/dist/server/dtfs-routes.js +183 -0
- package/dist/server/dtfs-routes.js.map +1 -0
- package/dist/server/index.d.ts +15 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +158 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/monaco-routes.d.ts +3 -0
- package/dist/server/monaco-routes.d.ts.map +1 -0
- package/dist/server/monaco-routes.js +45 -0
- package/dist/server/monaco-routes.js.map +1 -0
- package/dist/server/voice-routes.d.ts +7 -0
- package/dist/server/voice-routes.d.ts.map +1 -0
- package/dist/server/voice-routes.js +142 -0
- package/dist/server/voice-routes.js.map +1 -0
- package/dist/server/ws-routes.d.ts +29 -0
- package/dist/server/ws-routes.d.ts.map +1 -0
- package/dist/server/ws-routes.js +334 -0
- package/dist/server/ws-routes.js.map +1 -0
- package/dist/services/ai/action-tool.d.ts +9 -0
- package/dist/services/ai/action-tool.d.ts.map +1 -0
- package/dist/services/ai/action-tool.js +51 -0
- package/dist/services/ai/action-tool.js.map +1 -0
- package/dist/services/ai/app-tools.d.ts +15 -0
- package/dist/services/ai/app-tools.d.ts.map +1 -0
- package/dist/services/ai/app-tools.js +119 -0
- package/dist/services/ai/app-tools.js.map +1 -0
- package/dist/services/ai/chat-service.d.ts +27 -0
- package/dist/services/ai/chat-service.d.ts.map +1 -0
- package/dist/services/ai/chat-service.js +213 -0
- package/dist/services/ai/chat-service.js.map +1 -0
- package/dist/services/ai/create-liveapp-tool.d.ts +15 -0
- package/dist/services/ai/create-liveapp-tool.d.ts.map +1 -0
- package/dist/services/ai/create-liveapp-tool.js +142 -0
- package/dist/services/ai/create-liveapp-tool.js.map +1 -0
- package/dist/services/ai/desktop-tool.d.ts +27 -0
- package/dist/services/ai/desktop-tool.d.ts.map +1 -0
- package/dist/services/ai/desktop-tool.js +106 -0
- package/dist/services/ai/desktop-tool.js.map +1 -0
- package/dist/services/ai/edit-history.d.ts +16 -0
- package/dist/services/ai/edit-history.d.ts.map +1 -0
- package/dist/services/ai/edit-history.js +137 -0
- package/dist/services/ai/edit-history.js.map +1 -0
- package/dist/services/ai/edit-tool.d.ts +9 -0
- package/dist/services/ai/edit-tool.d.ts.map +1 -0
- package/dist/services/ai/edit-tool.js +113 -0
- package/dist/services/ai/edit-tool.js.map +1 -0
- package/dist/services/ai/generate-html-tool.d.ts +15 -0
- package/dist/services/ai/generate-html-tool.d.ts.map +1 -0
- package/dist/services/ai/generate-html-tool.js +140 -0
- package/dist/services/ai/generate-html-tool.js.map +1 -0
- package/dist/services/ai/generate-icon-tool.d.ts +10 -0
- package/dist/services/ai/generate-icon-tool.d.ts.map +1 -0
- package/dist/services/ai/generate-icon-tool.js +58 -0
- package/dist/services/ai/generate-icon-tool.js.map +1 -0
- package/dist/services/ai/html-bridge-script.d.ts +2 -0
- package/dist/services/ai/html-bridge-script.d.ts.map +1 -0
- package/dist/services/ai/html-bridge-script.js +2 -0
- package/dist/services/ai/html-bridge-script.js.map +1 -0
- package/dist/services/ai/html-guidelines-tool.d.ts +3 -0
- package/dist/services/ai/html-guidelines-tool.d.ts.map +1 -0
- package/dist/services/ai/html-guidelines-tool.js +157 -0
- package/dist/services/ai/html-guidelines-tool.js.map +1 -0
- package/dist/services/ai/html-stream-coordinator.d.ts +92 -0
- package/dist/services/ai/html-stream-coordinator.d.ts.map +1 -0
- package/dist/services/ai/html-stream-coordinator.js +314 -0
- package/dist/services/ai/html-stream-coordinator.js.map +1 -0
- package/dist/services/ai/html-theme-link.d.ts +9 -0
- package/dist/services/ai/html-theme-link.d.ts.map +1 -0
- package/dist/services/ai/html-theme-link.js +12 -0
- package/dist/services/ai/html-theme-link.js.map +1 -0
- package/dist/services/ai/html-ui-script.d.ts +9 -0
- package/dist/services/ai/html-ui-script.d.ts.map +1 -0
- package/dist/services/ai/html-ui-script.js +9 -0
- package/dist/services/ai/html-ui-script.js.map +1 -0
- package/dist/services/ai/image-generation-service.d.ts +26 -0
- package/dist/services/ai/image-generation-service.d.ts.map +1 -0
- package/dist/services/ai/image-generation-service.js +205 -0
- package/dist/services/ai/image-generation-service.js.map +1 -0
- package/dist/services/ai/manual-pages/desktop-actions.md +36 -0
- package/dist/services/ai/manual-pages/desktop-windows.md +24 -0
- package/dist/services/ai/manual-pages/dt-badge.md +36 -0
- package/dist/services/ai/manual-pages/dt-button.md +38 -0
- package/dist/services/ai/manual-pages/dt-card.md +22 -0
- package/dist/services/ai/manual-pages/dt-chart.md +261 -0
- package/dist/services/ai/manual-pages/dt-divider.md +25 -0
- package/dist/services/ai/manual-pages/dt-grid.md +29 -0
- package/dist/services/ai/manual-pages/dt-list-view.md +96 -0
- package/dist/services/ai/manual-pages/dt-markdown-editor.md +90 -0
- package/dist/services/ai/manual-pages/dt-markdown.md +86 -0
- package/dist/services/ai/manual-pages/dt-select.md +21 -0
- package/dist/services/ai/manual-pages/dt-stack.md +31 -0
- package/dist/services/ai/manual-pages/dt-stat.md +43 -0
- package/dist/services/ai/manual-pages/dt-table-view.md +120 -0
- package/dist/services/ai/manual-pages/dt-tooltip.md +18 -0
- package/dist/services/ai/manual-pages/editing-preview.md +25 -0
- package/dist/services/ai/manual-pages/html-actions.md +74 -0
- package/dist/services/ai/manual-pages/html-bridge.md +187 -0
- package/dist/services/ai/manual-pages/html-components.md +66 -0
- package/dist/services/ai/manual-pages/html-examples.md +185 -0
- package/dist/services/ai/manual-pages/html-layouts.md +128 -0
- package/dist/services/ai/manual-pages/html-storage.md +153 -0
- package/dist/services/ai/manual-pages/html-tokens.md +26 -0
- package/dist/services/ai/manual-pages/index.d.ts +10 -0
- package/dist/services/ai/manual-pages/index.d.ts.map +1 -0
- package/dist/services/ai/manual-pages/index.js +186 -0
- package/dist/services/ai/manual-pages/index.js.map +1 -0
- package/dist/services/ai/manual-tool.d.ts +3 -0
- package/dist/services/ai/manual-tool.d.ts.map +1 -0
- package/dist/services/ai/manual-tool.js +104 -0
- package/dist/services/ai/manual-tool.js.map +1 -0
- package/dist/services/ai/pi-session-service.d.ts +101 -0
- package/dist/services/ai/pi-session-service.d.ts.map +1 -0
- package/dist/services/ai/pi-session-service.js +697 -0
- package/dist/services/ai/pi-session-service.js.map +1 -0
- package/dist/services/ai/providers.d.ts +21 -0
- package/dist/services/ai/providers.d.ts.map +1 -0
- package/dist/services/ai/providers.js +93 -0
- package/dist/services/ai/providers.js.map +1 -0
- package/dist/services/ai/redo-edit-tool.d.ts +9 -0
- package/dist/services/ai/redo-edit-tool.d.ts.map +1 -0
- package/dist/services/ai/redo-edit-tool.js +44 -0
- package/dist/services/ai/redo-edit-tool.js.map +1 -0
- package/dist/services/ai/system-prompt.d.ts +7 -0
- package/dist/services/ai/system-prompt.d.ts.map +1 -0
- package/dist/services/ai/system-prompt.js +72 -0
- package/dist/services/ai/system-prompt.js.map +1 -0
- package/dist/services/ai/undo-edit-tool.d.ts +9 -0
- package/dist/services/ai/undo-edit-tool.d.ts.map +1 -0
- package/dist/services/ai/undo-edit-tool.js +44 -0
- package/dist/services/ai/undo-edit-tool.js.map +1 -0
- package/dist/services/ai/window-tools.d.ts +27 -0
- package/dist/services/ai/window-tools.d.ts.map +1 -0
- package/dist/services/ai/window-tools.js +155 -0
- package/dist/services/ai/window-tools.js.map +1 -0
- package/dist/services/backend-host.d.ts +10 -0
- package/dist/services/backend-host.d.ts.map +1 -0
- package/dist/services/backend-host.js +117 -0
- package/dist/services/backend-host.js.map +1 -0
- package/dist/services/backend-ipc.d.ts +60 -0
- package/dist/services/backend-ipc.d.ts.map +1 -0
- package/dist/services/backend-ipc.js +2 -0
- package/dist/services/backend-ipc.js.map +1 -0
- package/dist/services/backend-process-manager.d.ts +60 -0
- package/dist/services/backend-process-manager.d.ts.map +1 -0
- package/dist/services/backend-process-manager.js +203 -0
- package/dist/services/backend-process-manager.js.map +1 -0
- package/dist/services/filesystem.d.ts +8 -0
- package/dist/services/filesystem.d.ts.map +1 -0
- package/dist/services/filesystem.js +94 -0
- package/dist/services/filesystem.js.map +1 -0
- package/dist/services/i18n.d.ts +28 -0
- package/dist/services/i18n.d.ts.map +1 -0
- package/dist/services/i18n.js +76 -0
- package/dist/services/i18n.js.map +1 -0
- package/dist/services/liveapp-icon.d.ts +9 -0
- package/dist/services/liveapp-icon.d.ts.map +1 -0
- package/dist/services/liveapp-icon.js +28 -0
- package/dist/services/liveapp-icon.js.map +1 -0
- package/dist/services/liveapps.d.ts +12 -0
- package/dist/services/liveapps.d.ts.map +1 -0
- package/dist/services/liveapps.js +84 -0
- package/dist/services/liveapps.js.map +1 -0
- package/dist/services/logger.d.ts +34 -0
- package/dist/services/logger.d.ts.map +1 -0
- package/dist/services/logger.js +74 -0
- package/dist/services/logger.js.map +1 -0
- package/dist/services/messaging.d.ts +14 -0
- package/dist/services/messaging.d.ts.map +1 -0
- package/dist/services/messaging.js +41 -0
- package/dist/services/messaging.js.map +1 -0
- package/dist/services/miniapp-icon.d.ts +9 -0
- package/dist/services/miniapp-icon.d.ts.map +1 -0
- package/dist/services/miniapp-icon.js +25 -0
- package/dist/services/miniapp-icon.js.map +1 -0
- package/dist/services/miniapp-registry.d.ts +73 -0
- package/dist/services/miniapp-registry.d.ts.map +1 -0
- package/dist/services/miniapp-registry.js +144 -0
- package/dist/services/miniapp-registry.js.map +1 -0
- package/dist/services/onboarding-config.d.ts +37 -0
- package/dist/services/onboarding-config.d.ts.map +1 -0
- package/dist/services/onboarding-config.js +76 -0
- package/dist/services/onboarding-config.js.map +1 -0
- package/dist/services/preferences.d.ts +10 -0
- package/dist/services/preferences.d.ts.map +1 -0
- package/dist/services/preferences.js +48 -0
- package/dist/services/preferences.js.map +1 -0
- package/dist/services/proxy-dispatcher.d.ts +18 -0
- package/dist/services/proxy-dispatcher.d.ts.map +1 -0
- package/dist/services/proxy-dispatcher.js +33 -0
- package/dist/services/proxy-dispatcher.js.map +1 -0
- package/dist/services/storage.d.ts +7 -0
- package/dist/services/storage.d.ts.map +1 -0
- package/dist/services/storage.js +55 -0
- package/dist/services/storage.js.map +1 -0
- package/dist/services/theme-css.d.ts +21 -0
- package/dist/services/theme-css.d.ts.map +1 -0
- package/dist/services/theme-css.js +213 -0
- package/dist/services/theme-css.js.map +1 -0
- package/dist/services/user-db.d.ts +69 -0
- package/dist/services/user-db.d.ts.map +1 -0
- package/dist/services/user-db.js +175 -0
- package/dist/services/user-db.js.map +1 -0
- package/dist/services/voice/audio-format.d.ts +5 -0
- package/dist/services/voice/audio-format.d.ts.map +1 -0
- package/dist/services/voice/audio-format.js +27 -0
- package/dist/services/voice/audio-format.js.map +1 -0
- package/dist/services/voice/azure-openai-whisper-adapter.d.ts +23 -0
- package/dist/services/voice/azure-openai-whisper-adapter.d.ts.map +1 -0
- package/dist/services/voice/azure-openai-whisper-adapter.js +60 -0
- package/dist/services/voice/azure-openai-whisper-adapter.js.map +1 -0
- package/dist/services/voice/openai-whisper-adapter.d.ts +22 -0
- package/dist/services/voice/openai-whisper-adapter.d.ts.map +1 -0
- package/dist/services/voice/openai-whisper-adapter.js +61 -0
- package/dist/services/voice/openai-whisper-adapter.js.map +1 -0
- package/dist/services/voice/stt-adapter.d.ts +31 -0
- package/dist/services/voice/stt-adapter.d.ts.map +1 -0
- package/dist/services/voice/stt-adapter.js +8 -0
- package/dist/services/voice/stt-adapter.js.map +1 -0
- package/dist/services/voice/vad-segmenter.d.ts +68 -0
- package/dist/services/voice/vad-segmenter.d.ts.map +1 -0
- package/dist/services/voice/vad-segmenter.js +159 -0
- package/dist/services/voice/vad-segmenter.js.map +1 -0
- package/dist/services/voice/voice-session.d.ts +54 -0
- package/dist/services/voice/voice-session.d.ts.map +1 -0
- package/dist/services/voice/voice-session.js +137 -0
- package/dist/services/voice/voice-session.js.map +1 -0
- package/dist/services/window-manager.d.ts +94 -0
- package/dist/services/window-manager.d.ts.map +1 -0
- package/dist/services/window-manager.js +282 -0
- package/dist/services/window-manager.js.map +1 -0
- package/dist/services/workspace.d.ts +51 -0
- package/dist/services/workspace.d.ts.map +1 -0
- package/dist/services/workspace.js +144 -0
- package/dist/services/workspace.js.map +1 -0
- package/package.json +89 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Desktop Actions
|
|
2
|
+
|
|
3
|
+
Use the `action` tool to call MiniApp actions by name.
|
|
4
|
+
|
|
5
|
+
## Source of Truth
|
|
6
|
+
|
|
7
|
+
Every user message starts with a `[Desktop Context]` block.
|
|
8
|
+
|
|
9
|
+
That block tells you:
|
|
10
|
+
|
|
11
|
+
- `Home` — the absolute filesystem path to the user's home directory
|
|
12
|
+
- which window is focused
|
|
13
|
+
- which actions are registered on the focused window
|
|
14
|
+
- the parameter schema for each action
|
|
15
|
+
|
|
16
|
+
Read it before invoking `action`.
|
|
17
|
+
|
|
18
|
+
## Rules
|
|
19
|
+
|
|
20
|
+
- Provide all required params as a JSON object.
|
|
21
|
+
- If `windowId` is omitted, the action runs on the focused window.
|
|
22
|
+
- If you need to target a different window, pass `windowId` explicitly or focus that window first.
|
|
23
|
+
|
|
24
|
+
## Preview Editing Pattern
|
|
25
|
+
|
|
26
|
+
For Preview edits, use `Get State` first.
|
|
27
|
+
|
|
28
|
+
The expected sequence is:
|
|
29
|
+
|
|
30
|
+
1. Call the focused Preview action `Get State`.
|
|
31
|
+
2. Read `file.path` from the action result — this is **relative to Home**.
|
|
32
|
+
3. Join `file.path` with the `Home` path from `[Desktop Context]` to form an absolute path.
|
|
33
|
+
4. Use the built-in `read` tool to inspect the file at the absolute path.
|
|
34
|
+
5. Use `edit` with an exact `oldText` match.
|
|
35
|
+
|
|
36
|
+
Do not guess Preview file paths.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Desktop Windows
|
|
2
|
+
|
|
3
|
+
Use the `desktop` tool for window-level operations.
|
|
4
|
+
|
|
5
|
+
## Actions
|
|
6
|
+
|
|
7
|
+
- `action="list"` -> get all open windows, the focused window, and available MiniApps
|
|
8
|
+
- `action="open"` with `miniAppId` -> open a MiniApp window
|
|
9
|
+
- `action="focus"` with `windowId` -> focus a window
|
|
10
|
+
- `action="maximize"` with `windowId` -> maximize a window
|
|
11
|
+
- `action="close"` with `windowId` -> close a window
|
|
12
|
+
|
|
13
|
+
## Usage Patterns
|
|
14
|
+
|
|
15
|
+
- Use `list` when you need fresh window IDs mid-conversation.
|
|
16
|
+
- Use `open` when the user wants a MiniApp launched and you do not already have a suitable window.
|
|
17
|
+
- If you need to act on a specific existing window, either focus it first or pass `windowId` explicitly.
|
|
18
|
+
- Opening a MiniApp with the same shallow-equal args may focus the existing window instead of creating a duplicate.
|
|
19
|
+
|
|
20
|
+
## Result Expectations
|
|
21
|
+
|
|
22
|
+
- `list` returns the current window set plus focused-window actions.
|
|
23
|
+
- `open` returns a `windowId` for the opened or focused window.
|
|
24
|
+
- Mutating actions fail if the target window does not exist.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# `<dt-badge>`
|
|
2
|
+
|
|
3
|
+
Inline status pill/badge.
|
|
4
|
+
|
|
5
|
+
## Attributes
|
|
6
|
+
|
|
7
|
+
- `variant` — status color: `accent` (default), `success`, `danger`, `warning`, `info`, `neutral`
|
|
8
|
+
- `size` — size: `sm`, `md` (default), `lg`
|
|
9
|
+
- `text` — badge text (alternative to slot content)
|
|
10
|
+
|
|
11
|
+
**When to use:** Use for status indicators, labels, category tags.
|
|
12
|
+
|
|
13
|
+
## Examples
|
|
14
|
+
|
|
15
|
+
```html
|
|
16
|
+
<dt-badge>New</dt-badge>
|
|
17
|
+
|
|
18
|
+
<dt-badge variant="success">Active</dt-badge>
|
|
19
|
+
|
|
20
|
+
<dt-badge variant="danger" size="lg">Error</dt-badge>
|
|
21
|
+
|
|
22
|
+
<dt-badge variant="info" size="sm">Beta</dt-badge>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Full-Page Example — Status Badges
|
|
26
|
+
|
|
27
|
+
```html
|
|
28
|
+
<dt-stack direction="row" gap="8">
|
|
29
|
+
<dt-badge>Default</dt-badge>
|
|
30
|
+
<dt-badge variant="success">Success</dt-badge>
|
|
31
|
+
<dt-badge variant="warning">Warning</dt-badge>
|
|
32
|
+
<dt-badge variant="danger">Error</dt-badge>
|
|
33
|
+
<dt-badge variant="info">Info</dt-badge>
|
|
34
|
+
<dt-badge variant="neutral">Neutral</dt-badge>
|
|
35
|
+
</dt-stack>
|
|
36
|
+
```
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# `<dt-button>`
|
|
2
|
+
|
|
3
|
+
Themed button component.
|
|
4
|
+
|
|
5
|
+
## Attributes
|
|
6
|
+
|
|
7
|
+
- `variant` — button style: `primary` (default), `secondary`, `ghost`, `danger`
|
|
8
|
+
- `size` — button size: `sm`, `md` (default), `lg`
|
|
9
|
+
- `disabled` — disables the button
|
|
10
|
+
- `fullwidth` — makes the button fill its container width
|
|
11
|
+
- `type` — HTML button type: `button` (default), `submit`, `reset`
|
|
12
|
+
|
|
13
|
+
**When to use:** Use for all clickable actions. Always prefer `<dt-button>` over `<button>` or `.btn` class.
|
|
14
|
+
|
|
15
|
+
## Examples
|
|
16
|
+
|
|
17
|
+
```html
|
|
18
|
+
<dt-button>Save</dt-button>
|
|
19
|
+
|
|
20
|
+
<dt-button variant="secondary">Cancel</dt-button>
|
|
21
|
+
|
|
22
|
+
<dt-button variant="danger" size="sm">Delete</dt-button>
|
|
23
|
+
|
|
24
|
+
<dt-button variant="ghost" disabled>Disabled</dt-button>
|
|
25
|
+
|
|
26
|
+
<dt-button fullwidth>Full Width Button</dt-button>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Full-Page Example — Action Buttons
|
|
30
|
+
|
|
31
|
+
```html
|
|
32
|
+
<dt-stack direction="row" gap="12" align="center">
|
|
33
|
+
<dt-button>Primary</dt-button>
|
|
34
|
+
<dt-button variant="secondary">Secondary</dt-button>
|
|
35
|
+
<dt-button variant="ghost">Ghost</dt-button>
|
|
36
|
+
<dt-button variant="danger">Danger</dt-button>
|
|
37
|
+
</dt-stack>
|
|
38
|
+
```
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# `<dt-card>`
|
|
2
|
+
|
|
3
|
+
Use `<dt-card>` for any visually grouped content: information panels, stat blocks, feature tiles, settings groups, and list items that need a visible container.
|
|
4
|
+
|
|
5
|
+
## Attributes
|
|
6
|
+
|
|
7
|
+
- `variant="default"` — solid surface background (default)
|
|
8
|
+
- `variant="outlined"` — transparent background with border
|
|
9
|
+
- `variant="filled"` — accent-subtle background
|
|
10
|
+
|
|
11
|
+
## Examples
|
|
12
|
+
|
|
13
|
+
```html
|
|
14
|
+
<dt-card>
|
|
15
|
+
<h3>Title</h3>
|
|
16
|
+
<p>Card content goes here.</p>
|
|
17
|
+
</dt-card>
|
|
18
|
+
|
|
19
|
+
<dt-card variant="outlined">
|
|
20
|
+
<p>Outlined card with transparent background.</p>
|
|
21
|
+
</dt-card>
|
|
22
|
+
```
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# `<dt-chart>`
|
|
2
|
+
|
|
3
|
+
Interactive chart component powered by Chart.js. Data is provided exclusively via the `.data` JS property.
|
|
4
|
+
|
|
5
|
+
## Attributes
|
|
6
|
+
|
|
7
|
+
- `type` — `bar` (default), `line`, `area`, `pie`, `doughnut`, `radar`, `scatter`, `bubble`
|
|
8
|
+
- `labels` — comma-separated category labels such as `labels="Jan,Feb,Mar"` (convenience; can also set labels inside `.data`)
|
|
9
|
+
- `legend` — `top`, `bottom`, `left`, `right`, `none` (default)
|
|
10
|
+
- `stacked` — stacks bar and line datasets
|
|
11
|
+
- `dt-chart-click` event — emitted with `{ label, datasetIndex, index, value }`
|
|
12
|
+
|
|
13
|
+
## `.data` Property (required)
|
|
14
|
+
|
|
15
|
+
All chart data **must** be set through the `.data` JS property. There is no HTML-only way to fill data.
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
interface DtChartData {
|
|
19
|
+
labels?: string[]; // category labels for the x-axis
|
|
20
|
+
datasets: DtChartDataset[];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface DtChartDataset {
|
|
24
|
+
label?: string; // legend label for this series
|
|
25
|
+
data:
|
|
26
|
+
| number[] // values for bar, line, area, pie, doughnut, radar
|
|
27
|
+
| { x: number; y: number }[] // for scatter
|
|
28
|
+
| { x: number; y: number; r: number }[]; // for bubble
|
|
29
|
+
color?: string; // optional CSS color override; auto-assigned from theme palette if omitted
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## `.options` Property (advanced, rarely needed)
|
|
34
|
+
|
|
35
|
+
Raw Chart.js options object merged under the auto-themed defaults. Only use this when you need fine-grained control over axes, tooltips, etc.
|
|
36
|
+
|
|
37
|
+
## How to Use
|
|
38
|
+
|
|
39
|
+
1. Create a `<dt-chart>` element in HTML with the desired `type`, `labels`, `legend`, and an **explicit height**.
|
|
40
|
+
2. In a `<script>` block, select the element and assign its `.data` property.
|
|
41
|
+
|
|
42
|
+
**Important:** The `<dt-chart>` element **requires an explicit height** via inline `style` or a CSS class. Without it the chart will not be visible.
|
|
43
|
+
|
|
44
|
+
**When to use:** Use for charts, graphs, trends, comparisons, and composition breakdowns. Prefer `<dt-stat>` for single KPIs.
|
|
45
|
+
|
|
46
|
+
## Examples
|
|
47
|
+
|
|
48
|
+
### Bar chart with two datasets
|
|
49
|
+
|
|
50
|
+
```html
|
|
51
|
+
<dt-chart
|
|
52
|
+
id="revenue"
|
|
53
|
+
type="bar"
|
|
54
|
+
legend="top"
|
|
55
|
+
labels="Jan,Feb,Mar,Apr"
|
|
56
|
+
style="height: 300px"
|
|
57
|
+
></dt-chart>
|
|
58
|
+
|
|
59
|
+
<script>
|
|
60
|
+
document.getElementById('revenue').data = {
|
|
61
|
+
datasets: [
|
|
62
|
+
{ label: 'Revenue', data: [12, 19, 3, 5] },
|
|
63
|
+
{ label: 'Costs', data: [7, 11, 5, 8] },
|
|
64
|
+
],
|
|
65
|
+
};
|
|
66
|
+
</script>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Doughnut chart
|
|
70
|
+
|
|
71
|
+
```html
|
|
72
|
+
<dt-chart
|
|
73
|
+
id="categories"
|
|
74
|
+
type="doughnut"
|
|
75
|
+
legend="right"
|
|
76
|
+
labels="Electronics,Clothing,Food"
|
|
77
|
+
style="height: 250px"
|
|
78
|
+
></dt-chart>
|
|
79
|
+
|
|
80
|
+
<script>
|
|
81
|
+
document.getElementById('categories').data = {
|
|
82
|
+
datasets: [{ label: 'Sales', data: [35, 25, 22] }],
|
|
83
|
+
};
|
|
84
|
+
</script>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Line chart (area fill)
|
|
88
|
+
|
|
89
|
+
```html
|
|
90
|
+
<dt-chart
|
|
91
|
+
id="growth"
|
|
92
|
+
type="area"
|
|
93
|
+
legend="none"
|
|
94
|
+
labels="Jan,Feb,Mar,Apr,May,Jun"
|
|
95
|
+
style="height: 300px"
|
|
96
|
+
></dt-chart>
|
|
97
|
+
|
|
98
|
+
<script>
|
|
99
|
+
document.getElementById('growth').data = {
|
|
100
|
+
datasets: [{ label: 'Users', data: [150, 230, 224, 318, 435, 547] }],
|
|
101
|
+
};
|
|
102
|
+
</script>
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Scatter chart
|
|
106
|
+
|
|
107
|
+
```html
|
|
108
|
+
<dt-chart id="scatter" type="scatter" legend="top" style="height: 300px"></dt-chart>
|
|
109
|
+
|
|
110
|
+
<script>
|
|
111
|
+
document.getElementById('scatter').data = {
|
|
112
|
+
datasets: [
|
|
113
|
+
{
|
|
114
|
+
label: 'Samples',
|
|
115
|
+
data: [
|
|
116
|
+
{ x: 1, y: 2 },
|
|
117
|
+
{ x: 3, y: 4 },
|
|
118
|
+
{ x: 5, y: 1 },
|
|
119
|
+
],
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
};
|
|
123
|
+
</script>
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Radar chart
|
|
127
|
+
|
|
128
|
+
```html
|
|
129
|
+
<dt-chart
|
|
130
|
+
id="radar"
|
|
131
|
+
type="radar"
|
|
132
|
+
legend="bottom"
|
|
133
|
+
labels="Speed,Reliability,Comfort,Safety,Efficiency"
|
|
134
|
+
style="height: 250px"
|
|
135
|
+
></dt-chart>
|
|
136
|
+
|
|
137
|
+
<script>
|
|
138
|
+
document.getElementById('radar').data = {
|
|
139
|
+
datasets: [
|
|
140
|
+
{ label: 'Model A', data: [65, 59, 90, 81, 56] },
|
|
141
|
+
{ label: 'Model B', data: [28, 48, 40, 19, 96] },
|
|
142
|
+
],
|
|
143
|
+
};
|
|
144
|
+
</script>
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Stacked bar chart
|
|
148
|
+
|
|
149
|
+
```html
|
|
150
|
+
<dt-chart
|
|
151
|
+
id="stacked"
|
|
152
|
+
type="bar"
|
|
153
|
+
legend="top"
|
|
154
|
+
stacked
|
|
155
|
+
labels="Jan,Feb,Mar,Apr,May,Jun"
|
|
156
|
+
style="height: 300px"
|
|
157
|
+
></dt-chart>
|
|
158
|
+
|
|
159
|
+
<script>
|
|
160
|
+
document.getElementById('stacked').data = {
|
|
161
|
+
datasets: [
|
|
162
|
+
{ label: 'Online', data: [12, 19, 3, 5, 2, 3] },
|
|
163
|
+
{ label: 'Retail', data: [7, 11, 5, 8, 3, 7] },
|
|
164
|
+
],
|
|
165
|
+
};
|
|
166
|
+
</script>
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## Full-Page Example — Sales Dashboard Charts
|
|
170
|
+
|
|
171
|
+
```html
|
|
172
|
+
<!doctype html>
|
|
173
|
+
<html>
|
|
174
|
+
<head>
|
|
175
|
+
<meta charset="utf-8" />
|
|
176
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
177
|
+
<title>Sales Dashboard</title>
|
|
178
|
+
<style>
|
|
179
|
+
body {
|
|
180
|
+
background: var(--dt-bg);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.chart-box {
|
|
184
|
+
height: 300px;
|
|
185
|
+
}
|
|
186
|
+
</style>
|
|
187
|
+
</head>
|
|
188
|
+
<body>
|
|
189
|
+
<h1>Sales Dashboard</h1>
|
|
190
|
+
<dt-grid cols="2" gap="16">
|
|
191
|
+
<dt-card>
|
|
192
|
+
<h2>Revenue by Month</h2>
|
|
193
|
+
<dt-chart
|
|
194
|
+
id="revenue-chart"
|
|
195
|
+
type="bar"
|
|
196
|
+
legend="top"
|
|
197
|
+
stacked
|
|
198
|
+
labels="Jan,Feb,Mar,Apr,May,Jun"
|
|
199
|
+
class="chart-box"
|
|
200
|
+
></dt-chart>
|
|
201
|
+
</dt-card>
|
|
202
|
+
|
|
203
|
+
<dt-card>
|
|
204
|
+
<h2>User Growth</h2>
|
|
205
|
+
<dt-chart
|
|
206
|
+
id="growth-chart"
|
|
207
|
+
type="area"
|
|
208
|
+
legend="none"
|
|
209
|
+
labels="Jan,Feb,Mar,Apr,May,Jun"
|
|
210
|
+
class="chart-box"
|
|
211
|
+
></dt-chart>
|
|
212
|
+
</dt-card>
|
|
213
|
+
</dt-grid>
|
|
214
|
+
|
|
215
|
+
<dt-card style="margin-top: 16px">
|
|
216
|
+
<h2>Category Breakdown</h2>
|
|
217
|
+
<dt-grid cols="2" gap="16">
|
|
218
|
+
<dt-chart
|
|
219
|
+
id="category-chart"
|
|
220
|
+
type="doughnut"
|
|
221
|
+
legend="right"
|
|
222
|
+
labels="Electronics,Clothing,Food,Books"
|
|
223
|
+
style="height: 250px"
|
|
224
|
+
></dt-chart>
|
|
225
|
+
|
|
226
|
+
<dt-chart
|
|
227
|
+
id="comparison-chart"
|
|
228
|
+
type="radar"
|
|
229
|
+
legend="bottom"
|
|
230
|
+
labels="Speed,Reliability,Comfort,Safety,Efficiency"
|
|
231
|
+
style="height: 250px"
|
|
232
|
+
></dt-chart>
|
|
233
|
+
</dt-grid>
|
|
234
|
+
</dt-card>
|
|
235
|
+
|
|
236
|
+
<script>
|
|
237
|
+
document.getElementById('revenue-chart').data = {
|
|
238
|
+
datasets: [
|
|
239
|
+
{ label: 'Online', data: [12, 19, 3, 5, 2, 3] },
|
|
240
|
+
{ label: 'Retail', data: [7, 11, 5, 8, 3, 7] },
|
|
241
|
+
],
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
document.getElementById('growth-chart').data = {
|
|
245
|
+
datasets: [{ label: 'Users', data: [150, 230, 224, 318, 435, 547] }],
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
document.getElementById('category-chart').data = {
|
|
249
|
+
datasets: [{ label: 'Sales', data: [35, 25, 22, 18] }],
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
document.getElementById('comparison-chart').data = {
|
|
253
|
+
datasets: [
|
|
254
|
+
{ label: 'Model A', data: [65, 59, 90, 81, 56] },
|
|
255
|
+
{ label: 'Model B', data: [28, 48, 40, 19, 96] },
|
|
256
|
+
],
|
|
257
|
+
};
|
|
258
|
+
</script>
|
|
259
|
+
</body>
|
|
260
|
+
</html>
|
|
261
|
+
```
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# `<dt-divider>`
|
|
2
|
+
|
|
3
|
+
Horizontal or vertical separator line.
|
|
4
|
+
|
|
5
|
+
## Attributes
|
|
6
|
+
|
|
7
|
+
- `direction` — orientation: `horizontal` (default) or `vertical`
|
|
8
|
+
- `style-variant` — border style: `default`, `subtle`, `strong`
|
|
9
|
+
- `spacing` — margin around divider: `sm`, `md`, `lg`
|
|
10
|
+
|
|
11
|
+
**When to use:** Use to separate sections or items in a list.
|
|
12
|
+
|
|
13
|
+
## Examples
|
|
14
|
+
|
|
15
|
+
```html
|
|
16
|
+
<!-- Horizontal divider (default) -->
|
|
17
|
+
<dt-divider></dt-divider>
|
|
18
|
+
|
|
19
|
+
<!-- Vertical divider in a row layout -->
|
|
20
|
+
<dt-stack direction="row">
|
|
21
|
+
<span>Left</span>
|
|
22
|
+
<dt-divider direction="vertical"></dt-divider>
|
|
23
|
+
<span>Right</span>
|
|
24
|
+
</dt-stack>
|
|
25
|
+
```
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# `<dt-grid>`
|
|
2
|
+
|
|
3
|
+
Auto-responsive grid layout. Columns collapse automatically in narrow views.
|
|
4
|
+
|
|
5
|
+
## Attributes
|
|
6
|
+
|
|
7
|
+
- `cols` — fixed number of columns: `1`, `2`, `3`, `4`, `5`, `6` (auto-fit responsive when omitted)
|
|
8
|
+
- `gap` — spacing between items: `0`, `4`, `8`, `12`, `16`, `20`, `24`, `32` (default: `16`)
|
|
9
|
+
- `min-width` — minimum width for auto-fit columns: `150`, `180`, `200`, `220`, `260`, `300` (default: `220`)
|
|
10
|
+
|
|
11
|
+
**When to use:** Use for any multi-column layout. Prefer omitting `cols` for auto-responsive behavior unless you need a specific number of columns.
|
|
12
|
+
|
|
13
|
+
## Examples
|
|
14
|
+
|
|
15
|
+
```html
|
|
16
|
+
<!-- Auto-responsive: columns collapse based on available space -->
|
|
17
|
+
<dt-grid>
|
|
18
|
+
<dt-card>Item 1</dt-card>
|
|
19
|
+
<dt-card>Item 2</dt-card>
|
|
20
|
+
<dt-card>Item 3</dt-card>
|
|
21
|
+
</dt-grid>
|
|
22
|
+
|
|
23
|
+
<!-- Fixed 3 columns, collapses to 1 on mobile -->
|
|
24
|
+
<dt-grid cols="3" gap="24">
|
|
25
|
+
<dt-stat label="CPU" value="42%"></dt-stat>
|
|
26
|
+
<dt-stat label="RAM" value="8GB"></dt-stat>
|
|
27
|
+
<dt-stat label="Disk" value="256GB"></dt-stat>
|
|
28
|
+
</dt-grid>
|
|
29
|
+
```
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# `<dt-list-view>`
|
|
2
|
+
|
|
3
|
+
Virtualized list for long collections. Supports fixed-height rows when `item-height` is provided and variable-height measurement mode when omitted.
|
|
4
|
+
|
|
5
|
+
## Attributes
|
|
6
|
+
|
|
7
|
+
- `item-height` — fixed row height in px; omit for variable-height measurement mode
|
|
8
|
+
- `dividers` — show dividers between rows
|
|
9
|
+
- `selectable` — `none`, `single`, or `multi`
|
|
10
|
+
- `empty-text` — empty-state text
|
|
11
|
+
- `.items` JS property — array of list item objects
|
|
12
|
+
- `dt-item-click` event — emitted when a row is clicked
|
|
13
|
+
- `dt-selection-change` event — emitted when selection changes
|
|
14
|
+
|
|
15
|
+
**When to use:** Use for task lists, logs, search results, files, and any long collection that might grow beyond a few dozen rows.
|
|
16
|
+
|
|
17
|
+
## Examples
|
|
18
|
+
|
|
19
|
+
```html
|
|
20
|
+
<dt-list-view id="task-list" item-height="72" dividers selectable="single">
|
|
21
|
+
<template>
|
|
22
|
+
<dt-stack gap="8">
|
|
23
|
+
<dt-stack direction="row" align="center" gap="8">
|
|
24
|
+
<strong data-field="title"></strong>
|
|
25
|
+
<dt-badge data-field="status" data-field-variant="statusVariant"></dt-badge>
|
|
26
|
+
</dt-stack>
|
|
27
|
+
<span class="text-muted" data-field="summary"></span>
|
|
28
|
+
</dt-stack>
|
|
29
|
+
</template>
|
|
30
|
+
</dt-list-view>
|
|
31
|
+
|
|
32
|
+
<script>
|
|
33
|
+
document.getElementById('task-list').items = [
|
|
34
|
+
{
|
|
35
|
+
title: 'Review report',
|
|
36
|
+
status: 'Queued',
|
|
37
|
+
statusVariant: 'warning',
|
|
38
|
+
summary: 'Waiting on CPU budget',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
title: 'Publish build',
|
|
42
|
+
status: 'Done',
|
|
43
|
+
statusVariant: 'success',
|
|
44
|
+
summary: 'Released 4 minutes ago',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
</script>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Full-Page Example — Virtualized Log List
|
|
51
|
+
|
|
52
|
+
```html
|
|
53
|
+
<!doctype html>
|
|
54
|
+
<html>
|
|
55
|
+
<head>
|
|
56
|
+
<meta charset="utf-8" />
|
|
57
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
58
|
+
<title>Deployment Logs</title>
|
|
59
|
+
<style>
|
|
60
|
+
body {
|
|
61
|
+
background: var(--dt-bg);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
#log-list {
|
|
65
|
+
height: 360px;
|
|
66
|
+
}
|
|
67
|
+
</style>
|
|
68
|
+
</head>
|
|
69
|
+
<body>
|
|
70
|
+
<h1>Deployment Logs</h1>
|
|
71
|
+
<dt-card>
|
|
72
|
+
<dt-list-view id="log-list" item-height="68" dividers>
|
|
73
|
+
<template>
|
|
74
|
+
<dt-stack gap="8">
|
|
75
|
+
<dt-stack direction="row" align="center" gap="8">
|
|
76
|
+
<strong data-field="service"></strong>
|
|
77
|
+
<dt-badge data-field="level" data-field-variant="variant"></dt-badge>
|
|
78
|
+
</dt-stack>
|
|
79
|
+
<span class="text-muted" data-field="message"></span>
|
|
80
|
+
</dt-stack>
|
|
81
|
+
</template>
|
|
82
|
+
</dt-list-view>
|
|
83
|
+
</dt-card>
|
|
84
|
+
|
|
85
|
+
<script>
|
|
86
|
+
const list = document.getElementById('log-list');
|
|
87
|
+
list.items = Array.from({ length: 250 }, (_, index) => ({
|
|
88
|
+
service: `agent-${(index % 8) + 1}`,
|
|
89
|
+
level: index % 5 === 0 ? 'warn' : 'info',
|
|
90
|
+
variant: index % 5 === 0 ? 'warning' : 'info',
|
|
91
|
+
message: `Processed batch ${index + 1} successfully.`,
|
|
92
|
+
}));
|
|
93
|
+
</script>
|
|
94
|
+
</body>
|
|
95
|
+
</html>
|
|
96
|
+
```
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# `<dt-markdown-editor>`
|
|
2
|
+
|
|
3
|
+
WYSIWYG markdown editor powered by Milkdown. Users edit formatted content directly, while the component stores and returns markdown.
|
|
4
|
+
|
|
5
|
+
## Attributes
|
|
6
|
+
|
|
7
|
+
- `placeholder` — empty editor hint text
|
|
8
|
+
- `readonly` — makes the editor read-only
|
|
9
|
+
- `.value` JS property — get or replace the current markdown document
|
|
10
|
+
- `dt-change` event — emitted with `{ value }` after content changes (debounced)
|
|
11
|
+
- `dt-focus` event — emitted when the editor gains focus
|
|
12
|
+
- `dt-blur` event — emitted when the editor loses focus
|
|
13
|
+
|
|
14
|
+
**When to use:** Use for notes, documentation, comments, change logs, prompts, and any workflow that needs rich text authoring without building your own editor UI.
|
|
15
|
+
|
|
16
|
+
## Examples
|
|
17
|
+
|
|
18
|
+
```html
|
|
19
|
+
<dt-markdown-editor
|
|
20
|
+
id="note-editor"
|
|
21
|
+
placeholder="Write something..."
|
|
22
|
+
style="height: 400px"
|
|
23
|
+
></dt-markdown-editor>
|
|
24
|
+
<dt-button id="save-note">Save</dt-button>
|
|
25
|
+
|
|
26
|
+
<script>
|
|
27
|
+
const editor = document.getElementById('note-editor');
|
|
28
|
+
editor.value = '# Team Notes\n\n- Review onboarding docs\n- Schedule release check';
|
|
29
|
+
|
|
30
|
+
document.getElementById('save-note').addEventListener('click', () => {
|
|
31
|
+
window.DeskTalk.storage.set('notes.latest', editor.value);
|
|
32
|
+
});
|
|
33
|
+
</script>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Full-Page Example — Markdown Note Editor
|
|
37
|
+
|
|
38
|
+
```html
|
|
39
|
+
<!doctype html>
|
|
40
|
+
<html>
|
|
41
|
+
<head>
|
|
42
|
+
<meta charset="utf-8" />
|
|
43
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
44
|
+
<title>Notes</title>
|
|
45
|
+
<style>
|
|
46
|
+
body {
|
|
47
|
+
background: var(--dt-bg);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
#editor {
|
|
51
|
+
height: 420px;
|
|
52
|
+
}
|
|
53
|
+
</style>
|
|
54
|
+
</head>
|
|
55
|
+
<body>
|
|
56
|
+
<h1>Operations Notes</h1>
|
|
57
|
+
<dt-stack gap="12">
|
|
58
|
+
<dt-stack direction="row" align="center" gap="8">
|
|
59
|
+
<dt-button id="save">Save</dt-button>
|
|
60
|
+
<dt-badge id="status" variant="neutral">Saved</dt-badge>
|
|
61
|
+
</dt-stack>
|
|
62
|
+
<dt-card>
|
|
63
|
+
<dt-markdown-editor id="editor" placeholder="Capture findings..."></dt-markdown-editor>
|
|
64
|
+
</dt-card>
|
|
65
|
+
</dt-stack>
|
|
66
|
+
|
|
67
|
+
<script>
|
|
68
|
+
const editor = document.getElementById('editor');
|
|
69
|
+
const status = document.getElementById('status');
|
|
70
|
+
const save = document.getElementById('save');
|
|
71
|
+
const saved =
|
|
72
|
+
window.DeskTalk.storage.get('ops.note') ||
|
|
73
|
+
'# Incident Review\n\n## Timeline\n\n- 09:00 Started investigation';
|
|
74
|
+
|
|
75
|
+
editor.value = saved;
|
|
76
|
+
|
|
77
|
+
editor.addEventListener('dt-change', () => {
|
|
78
|
+
status.textContent = 'Unsaved';
|
|
79
|
+
status.setAttribute('variant', 'warning');
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
save.addEventListener('click', () => {
|
|
83
|
+
window.DeskTalk.storage.set('ops.note', editor.value);
|
|
84
|
+
status.textContent = 'Saved';
|
|
85
|
+
status.setAttribute('variant', 'success');
|
|
86
|
+
});
|
|
87
|
+
</script>
|
|
88
|
+
</body>
|
|
89
|
+
</html>
|
|
90
|
+
```
|