llms-py 3.0.0b7__py3-none-any.whl → 3.0.0b9__py3-none-any.whl
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.
- llms/__pycache__/main.cpython-314.pyc +0 -0
- llms/extensions/analytics/ui/index.mjs +51 -162
- llms/extensions/app/__init__.py +519 -0
- llms/extensions/app/__pycache__/__init__.cpython-314.pyc +0 -0
- llms/extensions/app/__pycache__/db.cpython-314.pyc +0 -0
- llms/extensions/app/__pycache__/db_manager.cpython-314.pyc +0 -0
- llms/extensions/app/db.py +643 -0
- llms/extensions/app/db_manager.py +195 -0
- llms/extensions/app/requests.json +9073 -0
- llms/extensions/app/threads.json +15290 -0
- llms/{ui/modules/threads → extensions/app/ui}/Recents.mjs +82 -55
- llms/{ui/modules/threads → extensions/app/ui}/index.mjs +78 -9
- llms/extensions/app/ui/threadStore.mjs +407 -0
- llms/extensions/core_tools/__init__.py +272 -32
- llms/extensions/core_tools/__pycache__/__init__.cpython-314.pyc +0 -0
- llms/extensions/core_tools/ui/codemirror/addon/edit/closebrackets.js +201 -0
- llms/extensions/core_tools/ui/codemirror/addon/edit/closetag.js +185 -0
- llms/extensions/core_tools/ui/codemirror/addon/edit/continuelist.js +101 -0
- llms/extensions/core_tools/ui/codemirror/addon/edit/matchbrackets.js +160 -0
- llms/extensions/core_tools/ui/codemirror/addon/edit/matchtags.js +66 -0
- llms/extensions/core_tools/ui/codemirror/addon/edit/trailingspace.js +27 -0
- llms/extensions/core_tools/ui/codemirror/addon/selection/active-line.js +72 -0
- llms/extensions/core_tools/ui/codemirror/addon/selection/mark-selection.js +119 -0
- llms/extensions/core_tools/ui/codemirror/addon/selection/selection-pointer.js +98 -0
- llms/extensions/core_tools/ui/codemirror/doc/docs.css +225 -0
- llms/extensions/core_tools/ui/codemirror/doc/source_sans.woff +0 -0
- llms/extensions/core_tools/ui/codemirror/lib/codemirror.css +344 -0
- llms/extensions/core_tools/ui/codemirror/lib/codemirror.js +9884 -0
- llms/extensions/core_tools/ui/codemirror/mode/clike/clike.js +942 -0
- llms/extensions/core_tools/ui/codemirror/mode/javascript/index.html +118 -0
- llms/extensions/core_tools/ui/codemirror/mode/javascript/javascript.js +962 -0
- llms/extensions/core_tools/ui/codemirror/mode/javascript/typescript.html +62 -0
- llms/extensions/core_tools/ui/codemirror/mode/python/python.js +402 -0
- llms/extensions/core_tools/ui/codemirror/theme/dracula.css +40 -0
- llms/extensions/core_tools/ui/codemirror/theme/mocha.css +135 -0
- llms/extensions/core_tools/ui/index.mjs +650 -0
- llms/extensions/gallery/__pycache__/db.cpython-314.pyc +0 -0
- llms/extensions/gallery/db.py +4 -4
- llms/extensions/gallery/ui/index.mjs +2 -1
- llms/extensions/katex/__init__.py +6 -0
- llms/extensions/katex/__pycache__/__init__.cpython-314.pyc +0 -0
- llms/extensions/katex/ui/README.md +125 -0
- llms/extensions/katex/ui/contrib/auto-render.js +338 -0
- llms/extensions/katex/ui/contrib/auto-render.min.js +1 -0
- llms/extensions/katex/ui/contrib/auto-render.mjs +244 -0
- llms/extensions/katex/ui/contrib/copy-tex.js +127 -0
- llms/extensions/katex/ui/contrib/copy-tex.min.js +1 -0
- llms/extensions/katex/ui/contrib/copy-tex.mjs +105 -0
- llms/extensions/katex/ui/contrib/mathtex-script-type.js +109 -0
- llms/extensions/katex/ui/contrib/mathtex-script-type.min.js +1 -0
- llms/extensions/katex/ui/contrib/mathtex-script-type.mjs +24 -0
- llms/extensions/katex/ui/contrib/mhchem.js +3213 -0
- llms/extensions/katex/ui/contrib/mhchem.min.js +1 -0
- llms/extensions/katex/ui/contrib/mhchem.mjs +3109 -0
- llms/extensions/katex/ui/contrib/render-a11y-string.js +887 -0
- llms/extensions/katex/ui/contrib/render-a11y-string.min.js +1 -0
- llms/extensions/katex/ui/contrib/render-a11y-string.mjs +800 -0
- llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- llms/extensions/katex/ui/index.mjs +92 -0
- llms/extensions/katex/ui/katex-swap.css +1230 -0
- llms/extensions/katex/ui/katex-swap.min.css +1 -0
- llms/extensions/katex/ui/katex.css +1230 -0
- llms/extensions/katex/ui/katex.js +19080 -0
- llms/extensions/katex/ui/katex.min.css +1 -0
- llms/extensions/katex/ui/katex.min.js +1 -0
- llms/extensions/katex/ui/katex.min.mjs +1 -0
- llms/extensions/katex/ui/katex.mjs +18547 -0
- llms/extensions/providers/__pycache__/anthropic.cpython-314.pyc +0 -0
- llms/extensions/providers/anthropic.py +44 -1
- llms/extensions/system_prompts/ui/index.mjs +2 -1
- llms/extensions/tools/__init__.py +5 -0
- llms/extensions/tools/__pycache__/__init__.cpython-314.pyc +0 -0
- llms/extensions/tools/ui/index.mjs +8 -8
- llms/index.html +26 -38
- llms/llms.json +4 -1
- llms/main.py +492 -103
- llms/ui/App.mjs +2 -3
- llms/ui/ai.mjs +29 -13
- llms/ui/app.css +255 -289
- llms/ui/ctx.mjs +84 -6
- llms/ui/index.mjs +4 -6
- llms/ui/lib/vue.min.mjs +10 -9
- llms/ui/lib/vue.mjs +1796 -1635
- llms/ui/markdown.mjs +4 -2
- llms/ui/modules/chat/ChatBody.mjs +90 -86
- llms/ui/modules/chat/HomeTools.mjs +0 -242
- llms/ui/modules/chat/index.mjs +103 -170
- llms/ui/modules/model-selector.mjs +2 -2
- llms/ui/tailwind.input.css +35 -1
- llms/ui/utils.mjs +12 -0
- {llms_py-3.0.0b7.dist-info → llms_py-3.0.0b9.dist-info}/METADATA +1 -1
- llms_py-3.0.0b9.dist-info/RECORD +198 -0
- llms/ui/modules/threads/threadStore.mjs +0 -640
- llms_py-3.0.0b7.dist-info/RECORD +0 -80
- {llms_py-3.0.0b7.dist-info → llms_py-3.0.0b9.dist-info}/WHEEL +0 -0
- {llms_py-3.0.0b7.dist-info → llms_py-3.0.0b9.dist-info}/entry_points.txt +0 -0
- {llms_py-3.0.0b7.dist-info → llms_py-3.0.0b9.dist-info}/licenses/LICENSE +0 -0
- {llms_py-3.0.0b7.dist-info → llms_py-3.0.0b9.dist-info}/top_level.txt +0 -0
|
Binary file
|
|
@@ -58,6 +58,23 @@ def install_anthropic(ctx):
|
|
|
58
58
|
if message.get("role") == "system":
|
|
59
59
|
continue
|
|
60
60
|
|
|
61
|
+
if message.get("role") == "tool":
|
|
62
|
+
# Convert OpenAI tool response to Anthropic tool_result
|
|
63
|
+
tool_call_id = message.get("tool_call_id")
|
|
64
|
+
content = ctx.to_content(message.get("content", ""))
|
|
65
|
+
if not isinstance(content, (str, list)):
|
|
66
|
+
content = str(content)
|
|
67
|
+
|
|
68
|
+
tool_result = {"type": "tool_result", "tool_use_id": tool_call_id, "content": content}
|
|
69
|
+
|
|
70
|
+
# Anthropic requires tool results to be in a user message
|
|
71
|
+
# Check if the last message was a user message, if so append to it
|
|
72
|
+
if anthropic_request["messages"] and anthropic_request["messages"][-1]["role"] == "user":
|
|
73
|
+
anthropic_request["messages"][-1]["content"].append(tool_result)
|
|
74
|
+
else:
|
|
75
|
+
anthropic_request["messages"].append({"role": "user", "content": [tool_result]})
|
|
76
|
+
continue
|
|
77
|
+
|
|
61
78
|
anthropic_message = {"role": message.get("role"), "content": []}
|
|
62
79
|
|
|
63
80
|
content = message.get("content", "")
|
|
@@ -106,7 +123,18 @@ def install_anthropic(ctx):
|
|
|
106
123
|
if "stream" in chat:
|
|
107
124
|
anthropic_request["stream"] = chat["stream"]
|
|
108
125
|
if "tools" in chat:
|
|
109
|
-
|
|
126
|
+
anthropic_tools = []
|
|
127
|
+
for tool in chat["tools"]:
|
|
128
|
+
if tool.get("type") == "function":
|
|
129
|
+
function = tool.get("function", {})
|
|
130
|
+
anthropic_tool = {
|
|
131
|
+
"name": function.get("name"),
|
|
132
|
+
"description": function.get("description"),
|
|
133
|
+
"input_schema": function.get("parameters"),
|
|
134
|
+
}
|
|
135
|
+
anthropic_tools.append(anthropic_tool)
|
|
136
|
+
if anthropic_tools:
|
|
137
|
+
anthropic_request["tools"] = anthropic_tools
|
|
110
138
|
if "tool_choice" in chat:
|
|
111
139
|
anthropic_request["tool_choice"] = chat["tool_choice"]
|
|
112
140
|
|
|
@@ -138,6 +166,7 @@ def install_anthropic(ctx):
|
|
|
138
166
|
# Transform content blocks to message content
|
|
139
167
|
content_parts = []
|
|
140
168
|
thinking_parts = []
|
|
169
|
+
tool_calls = []
|
|
141
170
|
|
|
142
171
|
for block in response.get("content", []):
|
|
143
172
|
if block.get("type") == "text":
|
|
@@ -145,6 +174,16 @@ def install_anthropic(ctx):
|
|
|
145
174
|
elif block.get("type") == "thinking":
|
|
146
175
|
# Store thinking blocks separately (some models include reasoning)
|
|
147
176
|
thinking_parts.append(block.get("thinking", ""))
|
|
177
|
+
elif block.get("type") == "tool_use":
|
|
178
|
+
tool_call = {
|
|
179
|
+
"id": block.get("id"),
|
|
180
|
+
"type": "function",
|
|
181
|
+
"function": {
|
|
182
|
+
"name": block.get("name"),
|
|
183
|
+
"arguments": json.dumps(block.get("input", {})),
|
|
184
|
+
},
|
|
185
|
+
}
|
|
186
|
+
tool_calls.append(tool_call)
|
|
148
187
|
|
|
149
188
|
# Combine all text content
|
|
150
189
|
message_content = "\n".join(content_parts) if content_parts else ""
|
|
@@ -160,6 +199,10 @@ def install_anthropic(ctx):
|
|
|
160
199
|
if thinking_parts:
|
|
161
200
|
choice["message"]["thinking"] = "\n".join(thinking_parts)
|
|
162
201
|
|
|
202
|
+
# Add tool_calls if present
|
|
203
|
+
if tool_calls:
|
|
204
|
+
choice["message"]["tool_calls"] = tool_calls
|
|
205
|
+
|
|
163
206
|
ret["choices"].append(choice)
|
|
164
207
|
|
|
165
208
|
# Transform usage
|
|
Binary file
|
|
@@ -11,7 +11,7 @@ const Tools = {
|
|
|
11
11
|
</div>
|
|
12
12
|
|
|
13
13
|
<div class="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4">
|
|
14
|
-
<div v-for="tool in ($state.tools
|
|
14
|
+
<div v-for="tool in (Array.isArray($state.tools) ? $state.tools : []).filter(x => x.function)" :key="tool.function.name"
|
|
15
15
|
class="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col">
|
|
16
16
|
|
|
17
17
|
<div class="p-4 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800/50">
|
|
@@ -100,7 +100,7 @@ const ToolSelector = {
|
|
|
100
100
|
setup() {
|
|
101
101
|
const ctx = inject('ctx')
|
|
102
102
|
|
|
103
|
-
const availableTools = computed(() => ctx.state.tools
|
|
103
|
+
const availableTools = computed(() => (Array.isArray(ctx.state.tools) ? ctx.state.tools : []).filter(x => x.function))
|
|
104
104
|
|
|
105
105
|
function isToolActive(name) {
|
|
106
106
|
const only = ctx.prefs.onlyTools
|
|
@@ -145,12 +145,12 @@ export default {
|
|
|
145
145
|
ToolSelector,
|
|
146
146
|
})
|
|
147
147
|
|
|
148
|
-
const svg = (attrs, title) => `<svg ${attrs} xmlns="http://www.w4.org/2000/svg" viewBox="0 0 24 24">${title ? "<title>" + title + "</title>" : ''}<path fill="currentColor" d="M5.33 3.272a3.5 3.5 0 0 1 4.472 4.473L20.647 18.59l-2.122 2.122L7.68 9.867a3.5 3.5 0 0 1-4.472-4.474L5.444 7.63a1.5 1.5 0 0 0 2.121-2.121zm10.367 1.883l3.182-1.768l1.414 1.415l-1.768 3.182l-1.768.353l-2.12 2.121l-1.415-1.414l2.121-2.121zm-7.071 7.778l2.121 2.122l-4.95 4.95A1.5 1.5 0 0 1 3.58 17.99l.097-.107z"/></svg>`
|
|
148
|
+
const svg = (attrs, title) => `<svg ${attrs} xmlns="http://www.w4.org/2000/svg" viewBox="0 0 24 24">${title ? "<title>" + title + "</title>" : ''}<path fill="currentColor" d="M5.33 3.272a3.5 3.5 0 0 1 4.472 4.473L20.647 18.59l-2.122 2.122L7.68 9.867a3.5 3.5 0 0 1-4.472-4.474L5.444 7.63a1.5 1.5 0 0 0 2.121-2.121zm10.367 1.883l3.182-1.768l1.414 1.415l-1.768 3.182l-1.768.353l-2.12 2.121l-1.415-1.414l2.121-2.121zm-7.071 7.778l2.121 2.122l-4.95 4.95A1.5 1.5 0 0 1 3.58 17.99l.097-.107z" /></svg>`
|
|
149
149
|
|
|
150
150
|
ctx.setLeftIcons({
|
|
151
151
|
tools: {
|
|
152
152
|
component: {
|
|
153
|
-
template: svg(
|
|
153
|
+
template: svg(`@click="$ctx.togglePath('/tools')"`),
|
|
154
154
|
},
|
|
155
155
|
isActive({ path }) {
|
|
156
156
|
return path === '/tools'
|
|
@@ -162,7 +162,7 @@ export default {
|
|
|
162
162
|
tools: {
|
|
163
163
|
component: {
|
|
164
164
|
template: svg([
|
|
165
|
-
`@click
|
|
165
|
+
`@click="$ctx.toggleTop('ToolSelector')"`,
|
|
166
166
|
`:class="$prefs.onlyTools == null ? 'text-green-600 dark:text-green-300' : $prefs.onlyTools.length ? 'text-blue-600! dark:text-blue-300!' : ''"`
|
|
167
167
|
].join(' ')),
|
|
168
168
|
// , "{{$prefs.onlyTools == null ? 'Include All Tools' : $prefs.onlyTools.length ? 'Include Selected Tools' : 'All Tools Excluded'}}"
|
|
@@ -185,12 +185,12 @@ export default {
|
|
|
185
185
|
const prefs = ctx.prefs
|
|
186
186
|
if (prefs.onlyTools != null) {
|
|
187
187
|
if (Array.isArray(prefs.onlyTools)) {
|
|
188
|
-
request.metadata.
|
|
188
|
+
request.metadata.tools = prefs.onlyTools.length > 0
|
|
189
189
|
? prefs.onlyTools.join(',')
|
|
190
190
|
: 'none'
|
|
191
191
|
}
|
|
192
192
|
} else {
|
|
193
|
-
request.metadata.
|
|
193
|
+
request.metadata.tools = 'all'
|
|
194
194
|
}
|
|
195
195
|
})
|
|
196
196
|
|
|
@@ -199,6 +199,6 @@ export default {
|
|
|
199
199
|
|
|
200
200
|
async load(ctx) {
|
|
201
201
|
const ext = ctx.scope('tools')
|
|
202
|
-
ctx.state.tools = await ext.getJson('/')
|
|
202
|
+
ctx.state.tools = (await ext.getJson('/')).response || []
|
|
203
203
|
}
|
|
204
204
|
}
|
llms/index.html
CHANGED
|
@@ -23,48 +23,36 @@
|
|
|
23
23
|
cursor: pointer;
|
|
24
24
|
}
|
|
25
25
|
</style>
|
|
26
|
+
<script type="importmap"></script>
|
|
27
|
+
|
|
26
28
|
</head>
|
|
27
|
-
<script type="importmap">
|
|
28
|
-
{
|
|
29
|
-
"imports": {
|
|
30
|
-
"vue": "/ui/lib/vue.min.mjs",
|
|
31
|
-
"vue-router": "/ui/lib/vue-router.min.mjs",
|
|
32
|
-
"@servicestack/client": "/ui/lib/servicestack-client.mjs",
|
|
33
|
-
"@servicestack/vue": "/ui/lib/servicestack-vue.mjs",
|
|
34
|
-
"idb": "/ui/lib/idb.min.mjs",
|
|
35
|
-
"marked": "/ui/lib/marked.min.mjs",
|
|
36
|
-
"highlight.js": "/ui/lib/highlight.min.mjs",
|
|
37
|
-
"chart.js": "/ui/lib/chart.js",
|
|
38
|
-
"color.js": "/ui/lib/color.js",
|
|
39
|
-
"ctx.mjs": "/ui/ctx.mjs"
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
</script>
|
|
43
29
|
|
|
44
30
|
<body>
|
|
45
31
|
<div id="app"></div>
|
|
46
|
-
</body>
|
|
47
|
-
<script>
|
|
48
|
-
let colorScheme = location.search === "?dark"
|
|
49
|
-
? "dark"
|
|
50
|
-
: location.search === "?light"
|
|
51
|
-
? "light"
|
|
52
|
-
: localStorage.getItem('color-scheme')
|
|
53
|
-
let darkMode = colorScheme != null
|
|
54
|
-
? colorScheme === 'dark'
|
|
55
|
-
: window.matchMedia('(prefers-color-scheme: dark)').matches
|
|
56
|
-
let html = document.documentElement
|
|
57
|
-
html.classList.toggle('dark', darkMode)
|
|
58
|
-
html.style.setProperty('color-scheme', darkMode ? 'dark' : null)
|
|
59
|
-
if (localStorage.getItem('color-scheme') === null) {
|
|
60
|
-
localStorage.setItem('color-scheme', darkMode ? 'dark' : 'light')
|
|
61
|
-
}
|
|
62
|
-
</script>
|
|
63
|
-
<script type="module">
|
|
64
|
-
import { createContext } from '/ui/index.mjs'
|
|
65
32
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
33
|
+
<script>
|
|
34
|
+
let colorScheme = location.search === "?dark"
|
|
35
|
+
? "dark"
|
|
36
|
+
: location.search === "?light"
|
|
37
|
+
? "light"
|
|
38
|
+
: localStorage.getItem('color-scheme')
|
|
39
|
+
let darkMode = colorScheme != null
|
|
40
|
+
? colorScheme === 'dark'
|
|
41
|
+
: window.matchMedia('(prefers-color-scheme: dark)').matches
|
|
42
|
+
let html = document.documentElement
|
|
43
|
+
html.classList.toggle('dark', darkMode)
|
|
44
|
+
html.style.setProperty('color-scheme', darkMode ? 'dark' : null)
|
|
45
|
+
if (localStorage.getItem('color-scheme') === null) {
|
|
46
|
+
localStorage.setItem('color-scheme', darkMode ? 'dark' : 'light')
|
|
47
|
+
}
|
|
48
|
+
</script>
|
|
49
|
+
<script type="module">
|
|
50
|
+
import { createContext } from '/ui/index.mjs'
|
|
51
|
+
|
|
52
|
+
const context = await createContext()
|
|
53
|
+
context.app.mount('#app')
|
|
54
|
+
</script>
|
|
55
|
+
|
|
56
|
+
</body>
|
|
69
57
|
|
|
70
58
|
</html>
|