@starlove/orbit 1.4.0 → 2.0.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.
- package/Dockerfile +10 -8
- package/README.md +146 -164
- package/dist/full/csp.txt +1 -0
- package/dist/full/fonts/JetBrains_Mono/JetBrainsMono-subset.woff2 +0 -0
- package/dist/full/fonts/JetBrains_Mono/README.txt +5 -0
- package/dist/full/fonts/Mona_Sans/MonaSans-subset.woff2 +0 -0
- package/{public/fonts/Open_Sans → dist/full/fonts/Mona_Sans}/OFL.txt +93 -93
- package/dist/full/fonts/Mona_Sans/README.txt +10 -0
- package/{public/fonts/JetBrains_Mono → dist/full/fonts/Newsreader}/OFL.txt +93 -93
- package/dist/full/fonts/Newsreader/README.txt +8 -0
- package/dist/full/fonts/Newsreader/newsreader.woff2 +0 -0
- package/dist/full/index.html +36 -653
- package/dist/full/js/app.BmuponPJ.js +32 -0
- package/dist/full/js/app.BmuponPJ.js.map +1 -0
- package/dist/full/js/chunk.1fJGQGbW.js +2 -0
- package/dist/full/js/chunk.1fJGQGbW.js.map +1 -0
- package/dist/full/js/chunk.5D7JO2zp.js +2 -0
- package/dist/full/js/chunk.5D7JO2zp.js.map +1 -0
- package/dist/full/js/chunk.BrNn_D79.js +2 -0
- package/dist/full/js/chunk.BrNn_D79.js.map +1 -0
- package/dist/full/js/chunk.CokJXIqM.js +2 -0
- package/dist/full/js/chunk.CokJXIqM.js.map +1 -0
- package/dist/full/js/chunk.D_Haqy6R.js +2 -0
- package/dist/full/js/chunk.D_Haqy6R.js.map +1 -0
- package/dist/full/js/chunk.RO0jsH6I.js +15 -0
- package/dist/full/js/chunk.RO0jsH6I.js.map +1 -0
- package/dist/full/js/chunk.dqWOEtBM.js +2 -0
- package/dist/full/js/chunk.dqWOEtBM.js.map +1 -0
- package/dist/full/js/warm.f260bbbc.js +15 -0
- package/dist/full/orbits-favicon.png +0 -0
- package/dist/full/orbits-logo-bg-wide.png +0 -0
- package/dist/full/orbits-logo-bg.png +0 -0
- package/dist/full/orbits-logo.png +0 -0
- package/dist/full/styles.2b154ffe.css +1 -0
- package/dist/full/vendor/starlove-ui/theme-init.js +66 -0
- package/dist/full/version.json +2 -2
- package/docs/AGENT_GUIDE.md +114 -0
- package/docs/UPDATING.md +249 -64
- package/lib/adapters/indexeddb/blobs.d.ts +3 -0
- package/lib/adapters/indexeddb/blobs.js +54 -0
- package/lib/adapters/indexeddb/database.d.ts +60 -0
- package/lib/adapters/indexeddb/database.js +126 -0
- package/lib/adapters/indexeddb/index.d.ts +5 -0
- package/lib/adapters/indexeddb/index.js +3 -0
- package/lib/adapters/indexeddb/locks.d.ts +14 -0
- package/lib/adapters/indexeddb/locks.js +40 -0
- package/lib/adapters/indexeddb/store.d.ts +40 -0
- package/lib/adapters/indexeddb/store.js +424 -0
- package/lib/adapters/indexeddb/tables.d.ts +43 -0
- package/lib/adapters/indexeddb/tables.js +127 -0
- package/lib/adapters/memory/blobs.d.ts +3 -0
- package/lib/adapters/memory/blobs.js +44 -0
- package/lib/adapters/memory/board.d.ts +41 -0
- package/lib/adapters/memory/board.js +521 -0
- package/lib/adapters/memory/index.d.ts +2 -0
- package/lib/adapters/memory/index.js +2 -0
- package/lib/adapters/memory/search.d.ts +6 -0
- package/lib/adapters/memory/search.js +30 -0
- package/lib/adapters/memory/store.d.ts +34 -0
- package/lib/adapters/memory/store.js +266 -0
- package/lib/adapters/sqlite/backups.d.ts +53 -0
- package/lib/adapters/sqlite/backups.js +232 -0
- package/lib/adapters/sqlite/blobs.d.ts +14 -0
- package/lib/adapters/sqlite/blobs.js +109 -0
- package/lib/adapters/sqlite/board.d.ts +77 -0
- package/lib/adapters/sqlite/board.js +328 -0
- package/lib/adapters/sqlite/database.d.ts +67 -0
- package/lib/adapters/sqlite/database.js +285 -0
- package/lib/adapters/sqlite/index.d.ts +3 -0
- package/lib/adapters/sqlite/index.js +2 -0
- package/lib/adapters/sqlite/lock.d.ts +11 -0
- package/lib/adapters/sqlite/lock.js +34 -0
- package/lib/adapters/sqlite/records.d.ts +54 -0
- package/lib/adapters/sqlite/records.js +546 -0
- package/lib/adapters/sqlite/schema.d.ts +54 -0
- package/lib/adapters/sqlite/schema.js +276 -0
- package/lib/adapters/sqlite/store.d.ts +39 -0
- package/lib/adapters/sqlite/store.js +385 -0
- package/lib/browser/in-page.d.ts +31 -0
- package/lib/browser/in-page.js +46 -0
- package/lib/browser/old-preview.d.ts +13 -0
- package/lib/browser/old-preview.js +80 -0
- package/lib/browser/preview-board.d.ts +8 -0
- package/lib/browser/preview-board.js +69 -0
- package/lib/cli/main.d.ts +7 -0
- package/lib/cli/main.js +343 -0
- package/lib/cli/orbit.d.ts +8 -0
- package/lib/cli/orbit.js +25 -0
- package/lib/client/http.d.ts +38 -0
- package/lib/client/http.js +334 -0
- package/lib/client/local.d.ts +26 -0
- package/lib/client/local.js +190 -0
- package/lib/client/object-url.d.ts +8 -0
- package/lib/client/object-url.js +21 -0
- package/lib/client/types.d.ts +268 -0
- package/lib/client/types.js +8 -0
- package/lib/commands/agent-tools.d.ts +31 -0
- package/lib/commands/agent-tools.js +100 -0
- package/lib/commands/index.d.ts +56 -0
- package/lib/commands/index.js +298 -0
- package/lib/commands/parse.d.ts +73 -0
- package/lib/commands/parse.js +231 -0
- package/lib/commands/present.d.ts +134 -0
- package/lib/commands/present.js +198 -0
- package/lib/commands/session.d.ts +85 -0
- package/lib/commands/session.js +138 -0
- package/lib/commands/verbs.d.ts +35 -0
- package/lib/commands/verbs.js +842 -0
- package/lib/core/actors.d.ts +18 -0
- package/lib/core/actors.js +45 -0
- package/lib/core/agent.d.ts +128 -0
- package/lib/core/agent.js +323 -0
- package/lib/core/boards.d.ts +113 -0
- package/lib/core/boards.js +288 -0
- package/lib/core/bootstrap.d.ts +47 -0
- package/lib/core/bootstrap.js +100 -0
- package/lib/core/bytes.d.ts +10 -0
- package/lib/core/bytes.js +52 -0
- package/lib/core/card-paths.d.ts +25 -0
- package/lib/core/card-paths.js +44 -0
- package/lib/core/context.d.ts +60 -0
- package/lib/core/context.js +42 -0
- package/lib/core/cross-board.d.ts +81 -0
- package/lib/core/cross-board.js +228 -0
- package/lib/core/describe.d.ts +21 -0
- package/lib/core/describe.js +81 -0
- package/lib/core/errors.d.ts +159 -0
- package/lib/core/errors.js +160 -0
- package/lib/core/files.d.ts +79 -0
- package/lib/core/files.js +262 -0
- package/lib/core/history.d.ts +20 -0
- package/lib/core/history.js +53 -0
- package/lib/core/image-types.d.ts +16 -0
- package/lib/core/image-types.js +36 -0
- package/lib/core/model.d.ts +263 -0
- package/lib/core/model.js +34 -0
- package/lib/core/nebula-link.d.ts +14 -0
- package/lib/core/nebula-link.js +39 -0
- package/lib/core/relations.d.ts +58 -0
- package/lib/core/relations.js +112 -0
- package/lib/core/search.d.ts +38 -0
- package/lib/core/search.js +92 -0
- package/lib/core/sessions.d.ts +44 -0
- package/lib/core/sessions.js +158 -0
- package/lib/core/snapshot-schema.d.ts +295 -0
- package/lib/core/snapshot-schema.js +82 -0
- package/lib/core/snapshots.d.ts +75 -0
- package/lib/core/snapshots.js +409 -0
- package/lib/core/states.d.ts +25 -0
- package/lib/core/states.js +126 -0
- package/lib/core/text.d.ts +40 -0
- package/lib/core/text.js +113 -0
- package/lib/core/tickets.d.ts +69 -0
- package/lib/core/tickets.js +311 -0
- package/lib/core/trello.d.ts +17 -0
- package/lib/core/trello.js +269 -0
- package/lib/core/verdicts.d.ts +28 -0
- package/lib/core/verdicts.js +92 -0
- package/lib/core/views.d.ts +95 -0
- package/lib/core/views.js +186 -0
- package/lib/http/app.d.ts +46 -0
- package/lib/http/app.js +491 -0
- package/lib/mcp-server.d.ts +10 -0
- package/lib/mcp-server.js +120 -0
- package/lib/node/assets.d.ts +7 -0
- package/lib/node/assets.js +68 -0
- package/lib/node/data-folder.d.ts +21 -0
- package/lib/node/data-folder.js +34 -0
- package/lib/node/env.d.ts +38 -0
- package/lib/node/env.js +49 -0
- package/lib/node/host-check.d.ts +24 -0
- package/lib/node/host-check.js +53 -0
- package/lib/node/host-services.d.ts +9 -0
- package/lib/node/host-services.js +150 -0
- package/lib/node/local.d.ts +22 -0
- package/lib/node/local.js +61 -0
- package/lib/node/migrate.d.ts +53 -0
- package/lib/node/migrate.js +635 -0
- package/lib/node/package.d.ts +7 -0
- package/lib/node/package.js +14 -0
- package/lib/node/repo-board.d.ts +49 -0
- package/lib/node/repo-board.js +245 -0
- package/lib/node/serve.d.ts +8 -0
- package/lib/node/serve.js +106 -0
- package/lib/orbit.d.ts +47 -0
- package/lib/orbit.js +44 -0
- package/lib/quiet-sqlite-warning.d.ts +1 -0
- package/lib/quiet-sqlite-warning.js +18 -0
- package/lib/store/blob-path.d.ts +6 -0
- package/lib/store/blob-path.js +12 -0
- package/lib/store/conformance.d.ts +52 -0
- package/lib/store/conformance.js +1449 -0
- package/lib/store/search-words.d.ts +10 -0
- package/lib/store/search-words.js +19 -0
- package/lib/store/types.d.ts +452 -0
- package/lib/store/types.js +34 -0
- package/llms.txt +63 -0
- package/package.json +109 -25
- package/src/cli/orbit.js +11 -658
- package/src/mcp-server.js +16 -876
- package/SKILL-ORBIT.md +0 -151
- package/build.mjs +0 -210
- package/dist/full/js/app.62905fcb.js +0 -952
- package/dist/full/js/app.62905fcb.js.map +0 -7
- package/dist/full/styles.4e60d824.css +0 -1
- package/docs/AGENT_PROTOCOL.md +0 -424
- package/docs/MCP_SETUP.md +0 -54
- package/docs/ORBIT_DISPATCH.md +0 -280
- package/docs/SS-Orbit-Dark.png +0 -0
- package/docs/SS-Orbit-Light.png +0 -0
- package/docs/mcp-client.example.json +0 -13
- package/docs/setup/orbit-init-wizard.md +0 -174
- package/public/apple-touch-icon.png +0 -0
- package/public/cursors/live_arrow.cur +0 -0
- package/public/cursors/live_link.cur +0 -0
- package/public/cursors/live_move.cur +0 -0
- package/public/cursors/live_select.cur +0 -0
- package/public/cursors/live_unavail.cur +0 -0
- package/public/favicon-32x32.png +0 -0
- package/public/fonts/Chakra_Petch/ChakraPetch-Bold.ttf +0 -0
- package/public/fonts/Chakra_Petch/ChakraPetch-BoldItalic.ttf +0 -0
- package/public/fonts/Chakra_Petch/ChakraPetch-Italic.ttf +0 -0
- package/public/fonts/Chakra_Petch/ChakraPetch-Light.ttf +0 -0
- package/public/fonts/Chakra_Petch/ChakraPetch-LightItalic.ttf +0 -0
- package/public/fonts/Chakra_Petch/ChakraPetch-Medium.ttf +0 -0
- package/public/fonts/Chakra_Petch/ChakraPetch-MediumItalic.ttf +0 -0
- package/public/fonts/Chakra_Petch/ChakraPetch-Regular.ttf +0 -0
- package/public/fonts/Chakra_Petch/ChakraPetch-SemiBold.ttf +0 -0
- package/public/fonts/Chakra_Petch/ChakraPetch-SemiBoldItalic.ttf +0 -0
- package/public/fonts/Chakra_Petch/OFL.txt +0 -93
- package/public/fonts/Inter/Inter-Italic-VariableFont_opsz,wght.ttf +0 -0
- package/public/fonts/Inter/Inter-VariableFont_opsz,wght.ttf +0 -0
- package/public/fonts/Inter/OFL.txt +0 -93
- package/public/fonts/Inter/README.txt +0 -118
- package/public/fonts/JetBrains_Mono/JetBrainsMono-Italic-VariableFont_wght.ttf +0 -0
- package/public/fonts/JetBrains_Mono/JetBrainsMono-VariableFont_wght.ttf +0 -0
- package/public/fonts/JetBrains_Mono/README.txt +0 -79
- package/public/fonts/OpenRing-Regular.ttf +0 -0
- package/public/fonts/Open_Sans/OpenSans-Italic-VariableFont_wdth,wght.ttf +0 -0
- package/public/fonts/Open_Sans/OpenSans-VariableFont_wdth,wght.ttf +0 -0
- package/public/fonts/Open_Sans/README.txt +0 -100
- package/public/fonts/Orbitron/OFL.txt +0 -93
- package/public/fonts/Orbitron/Orbitron-VariableFont_wght.ttf +0 -0
- package/public/fonts/Orbitron/README.txt +0 -68
- package/public/fonts/Rajdhani/OFL.txt +0 -93
- package/public/fonts/Rajdhani/Rajdhani-Bold.ttf +0 -0
- package/public/fonts/Rajdhani/Rajdhani-Light.ttf +0 -0
- package/public/fonts/Rajdhani/Rajdhani-Medium.ttf +0 -0
- package/public/fonts/Rajdhani/Rajdhani-Regular.ttf +0 -0
- package/public/fonts/Rajdhani/Rajdhani-SemiBold.ttf +0 -0
- package/public/fonts/runescape-uf.ttf +0 -0
- package/public/index.html +0 -769
- package/public/js/actor-labels.js +0 -65
- package/public/js/api.js +0 -39
- package/public/js/app.js +0 -45
- package/public/js/artifact-drawer.js +0 -79
- package/public/js/board-export.js +0 -161
- package/public/js/board-menu.js +0 -374
- package/public/js/card-actions.js +0 -545
- package/public/js/config.js +0 -20
- package/public/js/create-card.js +0 -190
- package/public/js/dom.js +0 -19
- package/public/js/drawer.js +0 -273
- package/public/js/font-preference.js +0 -229
- package/public/js/format.js +0 -433
- package/public/js/help-menu.js +0 -31
- package/public/js/icons.js +0 -16
- package/public/js/kanban.js +0 -694
- package/public/js/local-backend.js +0 -1015
- package/public/js/main.js +0 -161
- package/public/js/modal.js +0 -33
- package/public/js/motion-preference.js +0 -64
- package/public/js/panel.js +0 -58
- package/public/js/router.js +0 -134
- package/public/js/search.js +0 -56
- package/public/js/settings-tabs.js +0 -7
- package/public/js/settings.js +0 -1634
- package/public/js/sse.js +0 -159
- package/public/js/starscape.js +0 -332
- package/public/js/state.js +0 -129
- package/public/js/text-editing.js +0 -128
- package/public/js/theme-preference.js +0 -95
- package/public/js/ticket-detail.js +0 -1516
- package/public/js/ticket-typeahead.js +0 -49
- package/public/js/toast.js +0 -89
- package/public/js/topbar-notes.js +0 -155
- package/public/js/transport.js +0 -22
- package/public/js/typeahead.js +0 -206
- package/public/js/unread.js +0 -121
- package/public/js/update-check.js +0 -58
- package/public/js/url-routes.js +0 -94
- package/public/orbits-favicon.png +0 -0
- package/public/orbits-logo-bg-wide.png +0 -0
- package/public/orbits-logo-bg.png +0 -0
- package/public/orbits-logo.png +0 -0
- package/public/styles.css +0 -7709
- package/src/core/agent.js +0 -387
- package/src/core/agents-md.js +0 -109
- package/src/core/artifacts.js +0 -149
- package/src/core/attachments.js +0 -238
- package/src/core/auth.js +0 -85
- package/src/core/backups.js +0 -142
- package/src/core/board.js +0 -148
- package/src/core/boards.js +0 -409
- package/src/core/bootstrap.js +0 -170
- package/src/core/css-bundle.js +0 -30
- package/src/core/db.js +0 -315
- package/src/core/delete-board.js +0 -163
- package/src/core/dispatch.js +0 -1007
- package/src/core/events.js +0 -314
- package/src/core/http.js +0 -115
- package/src/core/migrate.js +0 -198
- package/src/core/paths.js +0 -55
- package/src/core/provision-repo-board.js +0 -119
- package/src/core/queries.js +0 -246
- package/src/core/registry.js +0 -211
- package/src/core/relations.js +0 -163
- package/src/core/review-verdicts.js +0 -138
- package/src/core/router.js +0 -556
- package/src/core/search.js +0 -183
- package/src/core/seed.js +0 -234
- package/src/core/snapshots.js +0 -692
- package/src/core/states.js +0 -167
- package/src/core/system-picker.js +0 -109
- package/src/core/tickets.js +0 -400
- package/src/core/util.js +0 -106
- package/src/core/version-check.js +0 -154
- package/src/mcp/orbit-client.js +0 -287
- package/src/server.js +0 -115
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
// Shared textarea editing helpers. These stay DOM-light so node:test can cover
|
|
2
|
-
// editor behavior without booting the browser app.
|
|
3
|
-
|
|
4
|
-
const DEFAULT_INDENT = "\t";
|
|
5
|
-
|
|
6
|
-
function clampIndex(value, index) {
|
|
7
|
-
const n = Number(index);
|
|
8
|
-
if (!Number.isFinite(n)) return 0;
|
|
9
|
-
return Math.max(0, Math.min(value.length, n));
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function lineStartFor(value, index) {
|
|
13
|
-
return value.lastIndexOf("\n", Math.max(0, index - 1)) + 1;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
function selectedLineRange(value, selectionStart, selectionEnd) {
|
|
17
|
-
const lineStart = lineStartFor(value, selectionStart);
|
|
18
|
-
const effectiveEnd =
|
|
19
|
-
selectionEnd > selectionStart && value[selectionEnd - 1] === "\n"
|
|
20
|
-
? selectionEnd - 1
|
|
21
|
-
: selectionEnd;
|
|
22
|
-
const nextBreak = value.indexOf("\n", Math.max(lineStart, effectiveEnd));
|
|
23
|
-
return {
|
|
24
|
-
lineStart,
|
|
25
|
-
lineEnd: nextBreak === -1 ? value.length : nextBreak,
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function lineStartsForBlock(block, lineStart) {
|
|
30
|
-
const starts = [];
|
|
31
|
-
let cursor = lineStart;
|
|
32
|
-
for (const line of block.split("\n")) {
|
|
33
|
-
starts.push(cursor);
|
|
34
|
-
cursor += line.length + 1;
|
|
35
|
-
}
|
|
36
|
-
return starts;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function leadingOutdentWidth(line) {
|
|
40
|
-
if (line.startsWith("\t")) return 1;
|
|
41
|
-
const spaces = line.match(/^ {1,2}/)?.[0] || "";
|
|
42
|
-
return spaces.length;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
function adjustmentBeforePosition(position, lineStarts, widths) {
|
|
46
|
-
let total = 0;
|
|
47
|
-
for (let i = 0; i < lineStarts.length; i += 1) {
|
|
48
|
-
if (position <= lineStarts[i]) continue;
|
|
49
|
-
total += Math.min(widths[i], position - lineStarts[i]);
|
|
50
|
-
}
|
|
51
|
-
return total;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export function applyTextareaIndentation({
|
|
55
|
-
value = "",
|
|
56
|
-
selectionStart = 0,
|
|
57
|
-
selectionEnd = selectionStart,
|
|
58
|
-
shiftKey = false,
|
|
59
|
-
indent = DEFAULT_INDENT,
|
|
60
|
-
} = {}) {
|
|
61
|
-
const source = String(value);
|
|
62
|
-
const start = clampIndex(source, selectionStart);
|
|
63
|
-
const end = clampIndex(source, selectionEnd);
|
|
64
|
-
const first = Math.min(start, end);
|
|
65
|
-
const last = Math.max(start, end);
|
|
66
|
-
const indentText = String(indent || DEFAULT_INDENT);
|
|
67
|
-
|
|
68
|
-
if (!shiftKey && first === last) {
|
|
69
|
-
const nextValue = `${source.slice(0, first)}${indentText}${source.slice(last)}`;
|
|
70
|
-
const nextCaret = first + indentText.length;
|
|
71
|
-
return {
|
|
72
|
-
value: nextValue,
|
|
73
|
-
selectionStart: nextCaret,
|
|
74
|
-
selectionEnd: nextCaret,
|
|
75
|
-
handled: true,
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const { lineStart, lineEnd } = selectedLineRange(source, first, last);
|
|
80
|
-
const block = source.slice(lineStart, lineEnd);
|
|
81
|
-
const lines = block.split("\n");
|
|
82
|
-
const lineStarts = lineStartsForBlock(block, lineStart);
|
|
83
|
-
|
|
84
|
-
if (!shiftKey) {
|
|
85
|
-
const widths = lines.map(() => indentText.length);
|
|
86
|
-
const nextBlock = lines.map((line) => `${indentText}${line}`).join("\n");
|
|
87
|
-
const selectionStartDelta = adjustmentBeforePosition(first, lineStarts, widths);
|
|
88
|
-
const selectionEndDelta = adjustmentBeforePosition(last, lineStarts, widths);
|
|
89
|
-
return {
|
|
90
|
-
value: `${source.slice(0, lineStart)}${nextBlock}${source.slice(lineEnd)}`,
|
|
91
|
-
selectionStart: first + selectionStartDelta,
|
|
92
|
-
selectionEnd: last + selectionEndDelta,
|
|
93
|
-
handled: true,
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const widths = lines.map(leadingOutdentWidth);
|
|
98
|
-
const nextBlock = lines
|
|
99
|
-
.map((line, index) => line.slice(widths[index]))
|
|
100
|
-
.join("\n");
|
|
101
|
-
const selectionStartDelta = adjustmentBeforePosition(first, lineStarts, widths);
|
|
102
|
-
const selectionEndDelta = adjustmentBeforePosition(last, lineStarts, widths);
|
|
103
|
-
return {
|
|
104
|
-
value: `${source.slice(0, lineStart)}${nextBlock}${source.slice(lineEnd)}`,
|
|
105
|
-
selectionStart: first - selectionStartDelta,
|
|
106
|
-
selectionEnd: last - selectionEndDelta,
|
|
107
|
-
handled: true,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export function handleTextareaIndentationKeydown(event, textarea = event?.currentTarget) {
|
|
112
|
-
if (!event || event.key !== "Tab") return false;
|
|
113
|
-
if (event.altKey || event.ctrlKey || event.metaKey) return false;
|
|
114
|
-
if (!textarea || textarea.tagName !== "TEXTAREA") return false;
|
|
115
|
-
|
|
116
|
-
event.preventDefault();
|
|
117
|
-
const next = applyTextareaIndentation({
|
|
118
|
-
value: textarea.value,
|
|
119
|
-
selectionStart: textarea.selectionStart,
|
|
120
|
-
selectionEnd: textarea.selectionEnd,
|
|
121
|
-
shiftKey: event.shiftKey,
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
textarea.value = next.value;
|
|
125
|
-
textarea.setSelectionRange(next.selectionStart, next.selectionEnd);
|
|
126
|
-
textarea.dispatchEvent(new Event("input", { bubbles: true }));
|
|
127
|
-
return next.handled;
|
|
128
|
-
}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
export const THEME_STORAGE_KEY = "mab_theme";
|
|
2
|
-
export const THEME_CHANGE_EVENT = "orbit:theme-change";
|
|
3
|
-
|
|
4
|
-
const THEMES = new Set(["light", "dark"]);
|
|
5
|
-
|
|
6
|
-
function safeStorage(storage) {
|
|
7
|
-
try {
|
|
8
|
-
return storage ?? globalThis.localStorage ?? null;
|
|
9
|
-
} catch {
|
|
10
|
-
return null;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
function safeDocument(doc) {
|
|
15
|
-
try {
|
|
16
|
-
return doc ?? globalThis.document ?? null;
|
|
17
|
-
} catch {
|
|
18
|
-
return null;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function safeEventTarget(eventTarget) {
|
|
23
|
-
try {
|
|
24
|
-
return eventTarget ?? globalThis.window ?? null;
|
|
25
|
-
} catch {
|
|
26
|
-
return null;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export function normalizeTheme(theme) {
|
|
31
|
-
return THEMES.has(theme) ? theme : "light";
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function storedThemePreference(storage = safeStorage()) {
|
|
35
|
-
const store = safeStorage(storage);
|
|
36
|
-
const value = store?.getItem?.(THEME_STORAGE_KEY);
|
|
37
|
-
return THEMES.has(value) ? value : null;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
function systemTheme() {
|
|
41
|
-
try {
|
|
42
|
-
return globalThis.matchMedia?.("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
|
43
|
-
} catch {
|
|
44
|
-
return "light";
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export function currentTheme({ doc = safeDocument(), storage = safeStorage() } = {}) {
|
|
49
|
-
const rootTheme = safeDocument(doc)?.documentElement?.getAttribute?.("data-theme");
|
|
50
|
-
if (THEMES.has(rootTheme)) return rootTheme;
|
|
51
|
-
return storedThemePreference(storage) ?? systemTheme();
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export function applyStoredThemePreference({
|
|
55
|
-
doc = safeDocument(),
|
|
56
|
-
storage = safeStorage()
|
|
57
|
-
} = {}) {
|
|
58
|
-
const theme = storedThemePreference(storage) ?? systemTheme();
|
|
59
|
-
safeDocument(doc)?.documentElement?.setAttribute?.("data-theme", theme);
|
|
60
|
-
return theme;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export function setThemePreference(theme, {
|
|
64
|
-
doc = safeDocument(),
|
|
65
|
-
storage = safeStorage(),
|
|
66
|
-
eventTarget = safeEventTarget(),
|
|
67
|
-
notify = true
|
|
68
|
-
} = {}) {
|
|
69
|
-
const next = normalizeTheme(theme);
|
|
70
|
-
safeDocument(doc)?.documentElement?.setAttribute?.("data-theme", next);
|
|
71
|
-
safeStorage(storage)?.setItem?.(THEME_STORAGE_KEY, next);
|
|
72
|
-
|
|
73
|
-
if (notify) {
|
|
74
|
-
dispatchThemeChange(next, eventTarget);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return next;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export function toggleThemePreference(options = {}) {
|
|
81
|
-
const next = currentTheme(options) === "dark" ? "light" : "dark";
|
|
82
|
-
return setThemePreference(next, options);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
function dispatchThemeChange(theme, eventTarget = safeEventTarget()) {
|
|
86
|
-
const target = safeEventTarget(eventTarget);
|
|
87
|
-
if (typeof target?.dispatchEvent !== "function") return;
|
|
88
|
-
|
|
89
|
-
if (typeof CustomEvent === "function") {
|
|
90
|
-
target.dispatchEvent(new CustomEvent(THEME_CHANGE_EVENT, { detail: { theme } }));
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
target.dispatchEvent({ type: THEME_CHANGE_EVENT, detail: { theme } });
|
|
95
|
-
}
|