sol-components 2.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.
- package/README.md +7 -0
- package/core/activate.js +27 -0
- package/core/adopt.js +71 -0
- package/core/auth-core.js +73 -0
- package/core/auth-fetch.js +154 -0
- package/core/component-mount.js +110 -0
- package/core/defaults.js +48 -0
- package/core/define.js +15 -0
- package/core/display-target.js +166 -0
- package/core/edit-placements.js +28 -0
- package/core/editor-self.js +127 -0
- package/core/editor.js +162 -0
- package/core/events.js +27 -0
- package/core/extension-points.js +189 -0
- package/core/form-utils.js +210 -0
- package/core/from-query.js +138 -0
- package/core/from-rdf.js +52 -0
- package/core/here.js +33 -0
- package/core/include-core.js +73 -0
- package/core/inrupt-global.js +18 -0
- package/core/menu-consumer.js +41 -0
- package/core/menu-rdf.js +154 -0
- package/core/pod-ops.js +392 -0
- package/core/pod-registry.js +82 -0
- package/core/popup-proxy.js +255 -0
- package/core/rdf-core.js +280 -0
- package/core/rdf-render.js +136 -0
- package/core/rdf-utils.js +411 -0
- package/core/rdf.js +154 -0
- package/core/services.js +106 -0
- package/core/shape-to-form.js +741 -0
- package/core/sparql-safety.js +20 -0
- package/core/utils.js +196 -0
- package/dist/importmap-cdn.json +49 -0
- package/dist/importmap-local.json +49 -0
- package/dist/sol-loader.manifest.json +140 -0
- package/dist/vendor/@comunica-query-sparql.js +137851 -0
- package/dist/vendor/@inrupt-solid-client-authn-browser.js +7503 -0
- package/dist/vendor/dompurify.js +1476 -0
- package/dist/vendor/ical.js.js +9739 -0
- package/dist/vendor/marked.js +85 -0
- package/dist/vendor/n3.js +14670 -0
- package/dist/vendor/rdf-validate-shacl.js +6970 -0
- package/dist/vendor/rdflib.js +35172 -0
- package/dist/vendor/solid-logic.js +6819 -0
- package/dist/vendor/solid-ui.js +21945 -0
- package/node/sol-form.js +133 -0
- package/node/sol-include.js +55 -0
- package/node/sol-login.js +632 -0
- package/node/sol-menu.js +639 -0
- package/node/sol-query.js +116 -0
- package/package.json +133 -0
- package/web/menu-from-rdf.js +23 -0
- package/web/scripts/prefs.js +25 -0
- package/web/sol-accordion.js +114 -0
- package/web/sol-basic.js +50 -0
- package/web/sol-breadcrumb.js +131 -0
- package/web/sol-button.js +244 -0
- package/web/sol-calendar.js +465 -0
- package/web/sol-default.js +118 -0
- package/web/sol-dropdown-button.js +222 -0
- package/web/sol-feed.js +1336 -0
- package/web/sol-form.js +949 -0
- package/web/sol-full.js +43 -0
- package/web/sol-gallery.js +303 -0
- package/web/sol-include.js +246 -0
- package/web/sol-live-edit.js +415 -0
- package/web/sol-login.js +856 -0
- package/web/sol-menu.js +593 -0
- package/web/sol-modal.js +377 -0
- package/web/sol-pod-extras.js +17 -0
- package/web/sol-pod-ops.js +680 -0
- package/web/sol-pod.js +1039 -0
- package/web/sol-query.js +546 -0
- package/web/sol-rolodex.js +95 -0
- package/web/sol-search.js +402 -0
- package/web/sol-settings.js +199 -0
- package/web/sol-solidos.js +93 -0
- package/web/sol-tabs.js +445 -0
- package/web/sol-time.js +194 -0
- package/web/sol-tree-edit.js +492 -0
- package/web/sol-wac.js +456 -0
- package/web/sol-weather.js +337 -0
- package/web/sol-window.js +142 -0
- package/web/styles/buttons-css.js +108 -0
- package/web/styles/help.css +242 -0
- package/web/styles/root.css +112 -0
- package/web/styles/sol-accordion-css.js +97 -0
- package/web/styles/sol-calendar-css.js +154 -0
- package/web/styles/sol-feed-css.js +475 -0
- package/web/styles/sol-form-css.js +471 -0
- package/web/styles/sol-gallery-css.js +181 -0
- package/web/styles/sol-include-css.js +95 -0
- package/web/styles/sol-live-edit-css.js +84 -0
- package/web/styles/sol-live-edit.css +101 -0
- package/web/styles/sol-login-css.js +116 -0
- package/web/styles/sol-menu-css.js +145 -0
- package/web/styles/sol-modal-css.js +134 -0
- package/web/styles/sol-pod-css.js +187 -0
- package/web/styles/sol-pod-modal-css.js +203 -0
- package/web/styles/sol-query-css.js +140 -0
- package/web/styles/sol-query-help.css +267 -0
- package/web/styles/sol-query-one-pager.css +67 -0
- package/web/styles/sol-search-css.js +157 -0
- package/web/styles/sol-solidos-css.js +7 -0
- package/web/styles/sol-tabs-css.js +114 -0
- package/web/styles/sol-time-css.js +30 -0
- package/web/styles/sol-wac-css.js +73 -0
- package/web/styles/sol-weather-css.js +59 -0
- package/web/styles/solid-logo.svg +9 -0
- package/web/styles/view-accordion-css.js +66 -0
- package/web/styles/view-anchorlist-css.js +22 -0
- package/web/styles/view-autocomplete-css.js +59 -0
- package/web/styles/view-rolodex-css.js +102 -0
- package/web/styles/view-select-css.js +21 -0
- package/web/utils/calendar-fetch.js +388 -0
- package/web/utils/code-mirror-editor.js +82 -0
- package/web/utils/commons-fetch.js +108 -0
- package/web/utils/feed-edit.js +159 -0
- package/web/utils/feed-edit.smoke.mjs +74 -0
- package/web/utils/feed-fetch.js +573 -0
- package/web/utils/live-edit-help/csv.js +64 -0
- package/web/utils/live-edit-help/graphviz.js +41 -0
- package/web/utils/live-edit-help/jsonld.js +55 -0
- package/web/utils/live-edit-help/markdown.js +52 -0
- package/web/utils/live-edit-help/mermaid.js +48 -0
- package/web/utils/live-edit-help/turtle.js +85 -0
- package/web/utils/rdf-config.js +125 -0
- package/web/utils/renderers/csv.js +124 -0
- package/web/utils/renderers/d3-force.js +82 -0
- package/web/utils/renderers/graphviz.js +13 -0
- package/web/utils/renderers/html.js +10 -0
- package/web/utils/renderers/jsonld.js +63 -0
- package/web/utils/renderers/markdown.js +19 -0
- package/web/utils/renderers/mermaid.js +54 -0
- package/web/utils/renderers/turtle.js +51 -0
- package/web/utils/sol-query-triple-patterns.js +151 -0
- package/web/utils/sol-query-ui.js +250 -0
- package/web/utils/sol-query-views.js +32 -0
- package/web/views/_helpers.js +34 -0
- package/web/views/accordion.js +133 -0
- package/web/views/anchorlist.js +59 -0
- package/web/views/auto-complete.js +183 -0
- package/web/views/dl.js +38 -0
- package/web/views/list.js +19 -0
- package/web/views/menu.js +56 -0
- package/web/views/rolodex.js +126 -0
- package/web/views/select.js +79 -0
- package/web/views/table.js +73 -0
- package/web/views/tabs.js +57 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
// Styles for <sol-pod>'s own shadow root — the pod header, breadcrumb,
|
|
2
|
+
// tree, and status toast. Rules rendered inside sol-modal's shadow root
|
|
3
|
+
// live in sol-pod-modal-css.js instead.
|
|
4
|
+
import { sheetFrom } from '../../core/adopt.js';
|
|
5
|
+
import { BTN_CSS } from './buttons-css.js';
|
|
6
|
+
|
|
7
|
+
export const CSS = BTN_CSS + `
|
|
8
|
+
:host {
|
|
9
|
+
display: flex;
|
|
10
|
+
flex-direction: column;
|
|
11
|
+
height: 100%;
|
|
12
|
+
overflow: hidden;
|
|
13
|
+
background: var(--surface, #fff);
|
|
14
|
+
border-radius: 8px;
|
|
15
|
+
box-shadow: 0 2px 8px var(--shadow, rgba(0,0,0,0.1));
|
|
16
|
+
font-family: system-ui, -apple-system, sans-serif;
|
|
17
|
+
/* Anchor the component to the theme's font token (not the host page's
|
|
18
|
+
inherited size) so the whole UI — header row included — scales. */
|
|
19
|
+
font-size: var(--font-size, 20px);
|
|
20
|
+
color: var(--text, #212121);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
24
|
+
|
|
25
|
+
.pod-header {
|
|
26
|
+
padding: 10px 14px;
|
|
27
|
+
border-bottom: 1px solid var(--border, #e0e0e0);
|
|
28
|
+
flex-shrink: 0;
|
|
29
|
+
display: flex; flex-direction: column; gap: 6px;
|
|
30
|
+
}
|
|
31
|
+
.pod-header-row {
|
|
32
|
+
display: flex; align-items: center; gap: 6px;
|
|
33
|
+
}
|
|
34
|
+
.pod-header select {
|
|
35
|
+
flex: 1; padding: 6px 10px;
|
|
36
|
+
/* Without min-width:0 a flex <select> reserves the width of its
|
|
37
|
+
widest option, pushing the login + settings buttons out of the
|
|
38
|
+
sidebar in narrow panels. */
|
|
39
|
+
min-width: 0;
|
|
40
|
+
border: 1px solid var(--border, #e0e0e0); border-radius: 4px;
|
|
41
|
+
font-size: 0.9em;
|
|
42
|
+
background: var(--surface, #fff); color: var(--text, #212121);
|
|
43
|
+
font-family: inherit;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.pod-login { flex-shrink: 0; }
|
|
47
|
+
|
|
48
|
+
.pod-settings-btn {
|
|
49
|
+
flex-shrink: 0;
|
|
50
|
+
background: var(--surface, #fff);
|
|
51
|
+
border: 1px solid var(--border, #e0e0e0); border-radius: 4px;
|
|
52
|
+
padding: 5px 9px; cursor: pointer;
|
|
53
|
+
color: var(--text-muted, #666); font-size: 0.95em;
|
|
54
|
+
}
|
|
55
|
+
.pod-settings-btn:hover { background: var(--hover, #f0f0f0); }
|
|
56
|
+
|
|
57
|
+
.pod-settings { display: none; flex-direction: column; gap: 5px; }
|
|
58
|
+
.pod-settings.open {
|
|
59
|
+
display: flex;
|
|
60
|
+
align-self: flex-end; /* fit-width, tucked under the gear button */
|
|
61
|
+
padding: 8px 10px;
|
|
62
|
+
border: 1px solid var(--border, #e0e0e0); border-radius: 4px;
|
|
63
|
+
background: var(--surface-2, #f9f9f9);
|
|
64
|
+
font-size: 0.85em;
|
|
65
|
+
}
|
|
66
|
+
.pod-settings label {
|
|
67
|
+
display: flex; align-items: center; gap: 6px;
|
|
68
|
+
cursor: pointer; color: var(--text, #212121);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.breadcrumb {
|
|
72
|
+
padding: 10px 20px;
|
|
73
|
+
background: var(--surface-2, #f9f9f9);
|
|
74
|
+
border-bottom: 1px solid var(--border, #e0e0e0);
|
|
75
|
+
font-size: 0.9em; color: var(--text-muted, #666);
|
|
76
|
+
flex-shrink: 0;
|
|
77
|
+
display: flex; align-items: center;
|
|
78
|
+
}
|
|
79
|
+
.breadcrumb button {
|
|
80
|
+
padding: 4px 8px; font-size: 0.9em; margin-right: 5px;
|
|
81
|
+
background: var(--surface-2, #f9f9f9); border: none;
|
|
82
|
+
color: var(--text-muted, #666); cursor: pointer;
|
|
83
|
+
border-radius: 4px; font-family: inherit;
|
|
84
|
+
}
|
|
85
|
+
.breadcrumb button:hover { background: var(--hover, #f0f0f0); color: var(--accent, #2196f3); }
|
|
86
|
+
.breadcrumb .crumb-gear { margin-left: auto; margin-right: 0; font-size: 1.05em; line-height: 1; }
|
|
87
|
+
.breadcrumb .crumb-gear img { display: block; width: 1.1em; height: 1.1em; pointer-events: none; }
|
|
88
|
+
|
|
89
|
+
.pod-filter-row {
|
|
90
|
+
padding: 6px 14px;
|
|
91
|
+
border-bottom: 1px solid var(--border-soft, var(--border, #e0e0e0));
|
|
92
|
+
background: var(--surface, #fff);
|
|
93
|
+
flex-shrink: 0;
|
|
94
|
+
}
|
|
95
|
+
.pod-filter {
|
|
96
|
+
width: 100%;
|
|
97
|
+
padding: 5px 8px;
|
|
98
|
+
border: 1px solid var(--border, #e0e0e0);
|
|
99
|
+
border-radius: 4px;
|
|
100
|
+
background: var(--surface, #fff);
|
|
101
|
+
color: var(--text, #212121);
|
|
102
|
+
font-family: inherit; font-size: 0.85em;
|
|
103
|
+
box-sizing: border-box;
|
|
104
|
+
}
|
|
105
|
+
.pod-filter::placeholder { color: var(--text-faint, #999); }
|
|
106
|
+
.pod-filter:focus {
|
|
107
|
+
outline: none;
|
|
108
|
+
border-color: var(--accent, #2196f3);
|
|
109
|
+
box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent, #2196f3) 22%, transparent);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.tree-wrapper {
|
|
113
|
+
flex: 1; overflow-y: auto; overflow-x: hidden; padding: 10px;
|
|
114
|
+
outline: none;
|
|
115
|
+
}
|
|
116
|
+
.tree-wrapper:focus-visible {
|
|
117
|
+
box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--accent, #2196f3) 35%, transparent);
|
|
118
|
+
}
|
|
119
|
+
.file-tree { list-style: none; }
|
|
120
|
+
.file-tree li {
|
|
121
|
+
display: flex; align-items: center;
|
|
122
|
+
padding: 6px 12px; margin: 4px 0;
|
|
123
|
+
border-radius: 4px; cursor: pointer;
|
|
124
|
+
transition: background 0.2s; outline: none;
|
|
125
|
+
}
|
|
126
|
+
.file-tree li:hover { background: var(--hover, #f0f0f0); }
|
|
127
|
+
.file-tree li:focus { background: var(--focus-bg, #e3f2fd); box-shadow: 0 0 0 2px var(--accent, #2196f3); }
|
|
128
|
+
|
|
129
|
+
.item-label { flex: 1; word-break: break-word; min-width: 0; }
|
|
130
|
+
|
|
131
|
+
.item-gear {
|
|
132
|
+
flex-shrink: 0; background: none; border: none;
|
|
133
|
+
padding: 2px 6px; font-size: 1em;
|
|
134
|
+
color: var(--text-faint, #999); cursor: pointer;
|
|
135
|
+
border-radius: 4px; margin-left: 6px;
|
|
136
|
+
transition: color 0.15s;
|
|
137
|
+
}
|
|
138
|
+
.item-gear:hover { color: var(--accent-dark, #1976d2); background: var(--focus-bg, #e3f2fd); }
|
|
139
|
+
/* When gear-icon attribute is a URL, the button holds an <img>. */
|
|
140
|
+
.item-gear img { display: block; width: 1.1em; height: 1.1em; pointer-events: none; }
|
|
141
|
+
|
|
142
|
+
.file-tree .folder { font-weight: 500; color: var(--folder-color, var(--accent-dark, #1976d2)); }
|
|
143
|
+
.file-tree .file { color: var(--file-color, #424242); }
|
|
144
|
+
.file-tree li[draggable="true"] { cursor: grab; }
|
|
145
|
+
.file-tree li.dragging { opacity: 0.5; cursor: grabbing; }
|
|
146
|
+
.file-tree li.selected {
|
|
147
|
+
background: var(--selected-bg, #c8e6f5);
|
|
148
|
+
box-shadow: 0 0 0 1px var(--accent, #2196f3) inset;
|
|
149
|
+
}
|
|
150
|
+
.file-tree li.selected:hover { background: var(--selected-hover, #b0d8ef); }
|
|
151
|
+
|
|
152
|
+
.drag-over .tree-wrapper {
|
|
153
|
+
background: var(--focus-bg, #e3f2fd);
|
|
154
|
+
outline: 2px dashed #4caf50; outline-offset: -2px;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.loading { padding: 20px; text-align: center; color: var(--text-faint, #999); }
|
|
158
|
+
.empty { padding: 20px; text-align: center; color: var(--text-faint, #999); font-style: italic; }
|
|
159
|
+
|
|
160
|
+
.status-toast {
|
|
161
|
+
position: fixed; top: 52px; left: 50%; transform: translateX(-50%);
|
|
162
|
+
z-index: 9998; display: none;
|
|
163
|
+
align-items: center; gap: 10px;
|
|
164
|
+
background: var(--surface, #fff);
|
|
165
|
+
border: 1px solid var(--border, #e0e0e0);
|
|
166
|
+
border-radius: 6px; padding: 8px 10px 8px 14px;
|
|
167
|
+
font-size: 0.85em;
|
|
168
|
+
box-shadow: 0 3px 14px var(--shadow, rgba(0,0,0,0.1));
|
|
169
|
+
max-width: 420px; min-width: 160px;
|
|
170
|
+
transition: opacity 0.4s ease;
|
|
171
|
+
}
|
|
172
|
+
.status-toast.error { background: #fff0f0; border-color: #f5c6cb; color: #c0392b; }
|
|
173
|
+
.status-toast.success { color: var(--success, #388e3c); }
|
|
174
|
+
.status-toast-close {
|
|
175
|
+
background: none; border: none; cursor: pointer;
|
|
176
|
+
font-size: 1.1em; color: inherit; opacity: 0.55;
|
|
177
|
+
padding: 0 4px; line-height: 1; flex-shrink: 0;
|
|
178
|
+
}
|
|
179
|
+
.status-toast-close:hover { opacity: 1; }
|
|
180
|
+
|
|
181
|
+
button { font-family: inherit; }
|
|
182
|
+
button:focus { outline: 2px solid var(--accent, #2196f3); outline-offset: 2px; }
|
|
183
|
+
/* Breadcrumb buttons use .sol-btn .sol-btn-sm .sol-btn-ghost. */
|
|
184
|
+
`;
|
|
185
|
+
|
|
186
|
+
export const sheet = sheetFrom(CSS);
|
|
187
|
+
export default sheet;
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
// Styles that <sol-pod> renders *inside* <sol-modal>'s shadow root.
|
|
2
|
+
// Passed to a modal instance via `modal.styles = [sheet]` so the rules
|
|
3
|
+
// reach the modal's shadow scope — sol-pod's own sheet can't cross the
|
|
4
|
+
// boundary.
|
|
5
|
+
import { sheetFrom } from '../../core/adopt.js';
|
|
6
|
+
import { BTN_CSS } from './buttons-css.js';
|
|
7
|
+
import { CSS as WAC_CSS } from './sol-wac-css.js';
|
|
8
|
+
|
|
9
|
+
export const CSS = BTN_CSS + WAC_CSS + `
|
|
10
|
+
.modal-preview {
|
|
11
|
+
font-family: var(--font-mono, 'JetBrains Mono', 'Cascadia Code', 'SF Mono', Menlo, Consolas, ui-monospace, monospace);
|
|
12
|
+
font-size: 0.85em; white-space: pre-wrap; word-break: break-all;
|
|
13
|
+
background: var(--surface-2, #f9f9f9);
|
|
14
|
+
border: 1px solid var(--border, #e0e0e0);
|
|
15
|
+
border-radius: 4px; padding: 12px; flex: 1;
|
|
16
|
+
}
|
|
17
|
+
.modal-editor {
|
|
18
|
+
font-family: var(--font-mono, 'JetBrains Mono', 'Cascadia Code', 'SF Mono', Menlo, Consolas, ui-monospace, monospace);
|
|
19
|
+
font-size: 0.85em; flex: 1; min-height: 300px;
|
|
20
|
+
border: 1px solid var(--border-soft, var(--border, #e0e0e0));
|
|
21
|
+
border-radius: 6px; padding: 10px;
|
|
22
|
+
resize: vertical;
|
|
23
|
+
/* width: 100% with box-sizing: border-box so border + padding are
|
|
24
|
+
part of the width and the textarea can't overflow its container. */
|
|
25
|
+
width: 100%;
|
|
26
|
+
max-width: 100%;
|
|
27
|
+
box-sizing: border-box;
|
|
28
|
+
background: var(--surface, #fff); color: var(--text, #212121);
|
|
29
|
+
}
|
|
30
|
+
.modal-editor:focus {
|
|
31
|
+
outline: none;
|
|
32
|
+
border-color: var(--accent, #0f4ea0);
|
|
33
|
+
box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent, #0f4ea0) 22%, transparent);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.modal-media { max-width: 100%; max-height: 55vh; display: block; margin: 0 auto; border-radius: 4px; }
|
|
37
|
+
.modal-audio { width: 100%; margin-top: 12px; }
|
|
38
|
+
.modal-pdf { width: 100%; height: 55vh; border: none; border-radius: 4px; flex: 1; }
|
|
39
|
+
|
|
40
|
+
.upload-progress { font-size: 0.88em; color: var(--text-muted, #666); min-height: 1.4em; padding: 4px 0; }
|
|
41
|
+
|
|
42
|
+
.cm-editor-wrap {
|
|
43
|
+
flex: 1; min-height: 0; overflow: hidden;
|
|
44
|
+
border: 1px solid var(--border, #e0e0e0); border-radius: 4px;
|
|
45
|
+
display: flex; flex-direction: column; position: relative;
|
|
46
|
+
}
|
|
47
|
+
.cm-editor-wrap .cm-editor { flex: 1; height: 100%; font-size: 0.85em; }
|
|
48
|
+
.cm-editor-wrap .cm-scroller { font-family: var(--font-mono, 'JetBrains Mono', 'Cascadia Code', 'SF Mono', Menlo, Consolas, ui-monospace, monospace); overflow: auto; }
|
|
49
|
+
|
|
50
|
+
.graph-wrap {
|
|
51
|
+
width: 100%; flex: 1; min-height: 0; overflow: hidden;
|
|
52
|
+
border-radius: 6px; border: 1px solid var(--border, #e0e0e0);
|
|
53
|
+
cursor: grab;
|
|
54
|
+
}
|
|
55
|
+
.graph-wrap:active { cursor: grabbing; }
|
|
56
|
+
.graph-legend { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; padding: 8px 4px 0; font-size: 0.8em; }
|
|
57
|
+
.graph-legend-item { font-weight: 600; }
|
|
58
|
+
.graph-legend-note { color: var(--text-muted, #666); margin-left: auto; }
|
|
59
|
+
|
|
60
|
+
.markdown-preview { padding: 16px 24px; line-height: 1.7; font-size: 0.95em; overflow-y: auto; flex: 1; }
|
|
61
|
+
.markdown-preview h1,.markdown-preview h2,.markdown-preview h3,.markdown-preview h4 {
|
|
62
|
+
margin: 1em 0 0.4em; font-weight: 700; border-bottom: 1px solid var(--border, #e0e0e0); padding-bottom: 4px;
|
|
63
|
+
}
|
|
64
|
+
.markdown-preview p { margin: 0.6em 0; }
|
|
65
|
+
.markdown-preview code {
|
|
66
|
+
font-family: var(--font-mono, 'JetBrains Mono', 'Cascadia Code', 'SF Mono', Menlo, Consolas, ui-monospace, monospace); font-size: 0.88em;
|
|
67
|
+
background: var(--surface-2, #f9f9f9); border: 1px solid var(--border, #e0e0e0);
|
|
68
|
+
border-radius: 3px; padding: 1px 5px;
|
|
69
|
+
}
|
|
70
|
+
.markdown-preview pre {
|
|
71
|
+
background: var(--surface-2, #f9f9f9); border: 1px solid var(--border, #e0e0e0);
|
|
72
|
+
border-radius: 6px; padding: 12px 16px; overflow-x: auto; margin: 0.8em 0;
|
|
73
|
+
}
|
|
74
|
+
.markdown-preview pre code { background: none; border: none; padding: 0; }
|
|
75
|
+
.markdown-preview a { color: var(--accent, #2196f3); text-decoration: underline; }
|
|
76
|
+
.markdown-preview table { border-collapse: collapse; width: 100%; margin: 0.8em 0; }
|
|
77
|
+
.markdown-preview th,.markdown-preview td { border: 1px solid var(--border, #e0e0e0); padding: 6px 12px; text-align: left; }
|
|
78
|
+
.markdown-preview th { background: var(--surface-2, #f9f9f9); font-weight: 600; }
|
|
79
|
+
|
|
80
|
+
.html-preview-pane { flex: 1; min-height: 0; border: 1px solid var(--border, #e0e0e0); border-radius: 6px 6px 0 0; overflow: hidden; }
|
|
81
|
+
.html-preview-iframe { width: 100%; height: 100%; border: none; background: #fff; }
|
|
82
|
+
.html-preview-divider {
|
|
83
|
+
flex-shrink: 0; padding: 4px 12px; font-size: 0.75em;
|
|
84
|
+
color: var(--text-muted, #666); text-align: center;
|
|
85
|
+
background: var(--surface-2, #f9f9f9);
|
|
86
|
+
border-left: 1px solid var(--border, #e0e0e0);
|
|
87
|
+
border-right: 1px solid var(--border, #e0e0e0);
|
|
88
|
+
}
|
|
89
|
+
.html-editor-pane {
|
|
90
|
+
flex: 1; min-height: 0; display: flex; flex-direction: column;
|
|
91
|
+
border: 1px solid var(--border, #e0e0e0); border-radius: 0 0 6px 6px; overflow: hidden;
|
|
92
|
+
}
|
|
93
|
+
.html-editor-pane .cm-editor-wrap { flex: 1; border: none; border-radius: 0; }
|
|
94
|
+
|
|
95
|
+
/* Triple table (raw-view) */
|
|
96
|
+
.triple-table { width: 100%; border-collapse: collapse; font-size: 0.85em; }
|
|
97
|
+
.triple-table th {
|
|
98
|
+
text-align: left; padding: 6px;
|
|
99
|
+
border-bottom: 2px solid var(--border, #e0e0e0);
|
|
100
|
+
}
|
|
101
|
+
.triple-table td {
|
|
102
|
+
padding: 4px 6px;
|
|
103
|
+
border-bottom: 1px solid var(--border, #e0e0e0);
|
|
104
|
+
word-break: break-all;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/* Modal separator line */
|
|
108
|
+
.modal-hr {
|
|
109
|
+
border: none;
|
|
110
|
+
border-top: 1px solid var(--border, #e0e0e0);
|
|
111
|
+
margin: 8px 0;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* .modal-input — sol-pod-ops has its OWN shadow root that adopts this
|
|
115
|
+
sheet (sol-pod-modal-css.js), NOT sol-modal-css.js. So the rule
|
|
116
|
+
needs to live here too, otherwise rename/new-file/new-folder/upload
|
|
117
|
+
inputs render with bare UA styles. */
|
|
118
|
+
.modal-input {
|
|
119
|
+
width: min(100%, 50ch);
|
|
120
|
+
min-width: 18ch;
|
|
121
|
+
max-width: 50ch;
|
|
122
|
+
box-sizing: border-box;
|
|
123
|
+
appearance: none;
|
|
124
|
+
-webkit-appearance: none;
|
|
125
|
+
font: inherit;
|
|
126
|
+
line-height: 1.2;
|
|
127
|
+
padding: 0.4em 0.7em;
|
|
128
|
+
border: 1px solid var(--border-soft, var(--border, #d6dae2));
|
|
129
|
+
border-radius: 6px;
|
|
130
|
+
/* Same explicit height as .modal-row > .sol-btn below. */
|
|
131
|
+
height: calc(1.2em + 0.8em + 2px);
|
|
132
|
+
background: var(--surface, #fff);
|
|
133
|
+
color: var(--text, #0f1115);
|
|
134
|
+
transition: border-color 0.12s, box-shadow 0.12s;
|
|
135
|
+
}
|
|
136
|
+
.modal-input:focus {
|
|
137
|
+
outline: none;
|
|
138
|
+
border-color: var(--accent, #0f4ea0);
|
|
139
|
+
box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent, #0f4ea0) 22%, transparent);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* Inline input+button row inside modal body — input is fit-width with
|
|
143
|
+
a max-width; button sits right next to it. Input and button share
|
|
144
|
+
font + vertical padding + line-height + explicit height so their
|
|
145
|
+
box heights match pixel-for-pixel. */
|
|
146
|
+
.modal-row {
|
|
147
|
+
display: flex; align-items: center; gap: 10px;
|
|
148
|
+
flex-wrap: wrap;
|
|
149
|
+
}
|
|
150
|
+
.modal-row > .modal-input,
|
|
151
|
+
.modal-row > input[type="text"],
|
|
152
|
+
.modal-row > input[type="file"] { flex: 0 1 auto; }
|
|
153
|
+
.modal-row > .sol-btn {
|
|
154
|
+
flex-shrink: 0;
|
|
155
|
+
font: inherit;
|
|
156
|
+
line-height: 1.2;
|
|
157
|
+
padding: 0.4em 0.9em;
|
|
158
|
+
border-radius: 6px;
|
|
159
|
+
height: calc(1.2em + 0.8em + 2px);
|
|
160
|
+
box-sizing: border-box;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/* File input: the UA renders both a button ("Choose Files") and a
|
|
164
|
+
label ("No file chosen") at its own default font size. Force both
|
|
165
|
+
to the body font so they don't read small next to body text. The
|
|
166
|
+
button is style-able via ::file-selector-button on modern browsers. */
|
|
167
|
+
input[type="file"] {
|
|
168
|
+
font: inherit;
|
|
169
|
+
line-height: 1.2;
|
|
170
|
+
color: var(--text, #0f1115);
|
|
171
|
+
max-width: 100%;
|
|
172
|
+
}
|
|
173
|
+
input[type="file"]::file-selector-button {
|
|
174
|
+
font: inherit;
|
|
175
|
+
line-height: 1.2;
|
|
176
|
+
padding: 0.4em 0.9em;
|
|
177
|
+
margin-right: 10px;
|
|
178
|
+
border: 1px solid var(--border-soft, var(--border, #d6dae2));
|
|
179
|
+
border-radius: 6px;
|
|
180
|
+
background: var(--surface-2, #f5f6f9);
|
|
181
|
+
color: var(--text, #0f1115);
|
|
182
|
+
cursor: pointer;
|
|
183
|
+
height: calc(1.2em + 0.8em + 2px);
|
|
184
|
+
box-sizing: border-box;
|
|
185
|
+
transition: background 0.12s, border-color 0.12s, color 0.12s;
|
|
186
|
+
}
|
|
187
|
+
input[type="file"]::file-selector-button:hover {
|
|
188
|
+
background: var(--hover, #eef0f4);
|
|
189
|
+
border-color: var(--accent, #0f4ea0);
|
|
190
|
+
color: var(--accent, #0f4ea0);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/* Embedded sol-live-edit inside the pod modal */
|
|
194
|
+
.pod-live-edit {
|
|
195
|
+
display: flex;
|
|
196
|
+
flex-direction: column;
|
|
197
|
+
width: 100%;
|
|
198
|
+
height: 100%;
|
|
199
|
+
}
|
|
200
|
+
`;
|
|
201
|
+
|
|
202
|
+
export const sheet = sheetFrom(CSS);
|
|
203
|
+
export default sheet;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { sheetFrom } from '../../core/adopt.js';
|
|
2
|
+
import { BTN_CSS } from './buttons-css.js';
|
|
3
|
+
|
|
4
|
+
export const CSS = BTN_CSS + `
|
|
5
|
+
:host {
|
|
6
|
+
display: block;
|
|
7
|
+
font-family: var(--font-ui, system-ui, sans-serif);
|
|
8
|
+
font-size: var(--font-size, var(--medium-font, 20px));
|
|
9
|
+
color: var(--text, #212121);
|
|
10
|
+
}
|
|
11
|
+
.container { overflow-x: auto; }
|
|
12
|
+
|
|
13
|
+
/* ── table ── */
|
|
14
|
+
table { border-collapse: collapse; margin: 0 0 .5rem; font-size: var(--medium-font, 20px); }
|
|
15
|
+
th, td {
|
|
16
|
+
padding: var(--query-cell-padding, var(--space-md, 8px) var(--space-lg, 12px));
|
|
17
|
+
text-align: left;
|
|
18
|
+
border: 1px solid var(--border, #ddd);
|
|
19
|
+
overflow-wrap: break-word;
|
|
20
|
+
word-break: break-word;
|
|
21
|
+
}
|
|
22
|
+
th {
|
|
23
|
+
background-color: var(--query-th-bg, var(--th-color, var(--accent-dark, #2C3E51)));
|
|
24
|
+
color: var(--query-th-color, var(--th-text-color, #fff));
|
|
25
|
+
font-weight: var(--font-weight-bold, 600);
|
|
26
|
+
cursor: pointer;
|
|
27
|
+
user-select: none;
|
|
28
|
+
white-space: nowrap;
|
|
29
|
+
}
|
|
30
|
+
th::after { content: '⇅'; margin-left: var(--space-sm, 4px); font-size: var(--small-font, 16px); opacity: .55; }
|
|
31
|
+
th:focus-visible {
|
|
32
|
+
outline: 2px solid var(--accent, #4a9eff);
|
|
33
|
+
outline-offset: -2px;
|
|
34
|
+
}
|
|
35
|
+
a:focus-visible,
|
|
36
|
+
.bnode-modal-close:focus-visible {
|
|
37
|
+
outline: 2px solid var(--accent, #4a9eff);
|
|
38
|
+
outline-offset: 2px;
|
|
39
|
+
}
|
|
40
|
+
th[data-sort="asc"]::after { content: '▲'; opacity: 1; }
|
|
41
|
+
th[data-sort="desc"]::after { content: '▼'; opacity: 1; }
|
|
42
|
+
tr:nth-child(even) { background-color: var(--query-row-alt-bg, var(--even-color, var(--hover, #fafafa))); }
|
|
43
|
+
|
|
44
|
+
/* ── dl ── */
|
|
45
|
+
dl { margin: 0 0 .5rem; }
|
|
46
|
+
dt { font-weight: var(--font-weight-bold, 600); margin-top: .75rem; color: var(--text, #000); }
|
|
47
|
+
dt:first-child { margin-top: 0; }
|
|
48
|
+
dd { margin: .1rem 0 .2rem 1rem; }
|
|
49
|
+
dd .dl-field { font-size: var(--small-font, 16px); color: var(--text-muted, #666); font-weight: var(--font-weight-bold, 600); }
|
|
50
|
+
.dl-value { color: var(--text, #000); }
|
|
51
|
+
|
|
52
|
+
/* ── list ── */
|
|
53
|
+
ul.result-list { margin: .5rem 0 .5rem 1.5rem; }
|
|
54
|
+
ul.result-list li { margin: .2rem 0; }
|
|
55
|
+
|
|
56
|
+
/* ── meta ── */
|
|
57
|
+
.single-value { display: block; padding: var(--space-xl, 16px); font-size: var(--medium-font, 20px); }
|
|
58
|
+
.sol-subject-header {
|
|
59
|
+
margin: 0 0 .5rem;
|
|
60
|
+
padding: 0 0 .35rem;
|
|
61
|
+
font-size: var(--large-font, 24px);
|
|
62
|
+
color: var(--text, #222);
|
|
63
|
+
border-bottom: 1px solid var(--border, #e4e4e4);
|
|
64
|
+
}
|
|
65
|
+
.loading { padding: var(--space-xl, 16px); color: var(--text-muted, #666); }
|
|
66
|
+
.error {
|
|
67
|
+
padding: var(--space-xl, 16px);
|
|
68
|
+
color: var(--error, #c00);
|
|
69
|
+
background-color: color-mix(in srgb, var(--error, #e74c3c) 12%, transparent);
|
|
70
|
+
border: 1px solid var(--error, #fcc);
|
|
71
|
+
border-radius: var(--radius-sm, 4px);
|
|
72
|
+
}
|
|
73
|
+
a { color: var(--query-link-color, var(--accent, #0066cc)); text-decoration: none; }
|
|
74
|
+
a:hover { text-decoration: underline; }
|
|
75
|
+
a.bnode-link { font-style: italic; color: var(--query-bnode-link-color, var(--text-muted, #777)); }
|
|
76
|
+
a.bnode-link:hover { color: var(--query-link-color, var(--accent, #0066cc)); }
|
|
77
|
+
|
|
78
|
+
/* ── subject nav + sections (multi-subject pivot) ── */
|
|
79
|
+
.subject-nav {
|
|
80
|
+
display: flex; flex-wrap: wrap; gap: var(--space-md, 8px);
|
|
81
|
+
padding: var(--space-md, 8px) 0 var(--space-lg, 12px);
|
|
82
|
+
border-bottom: 1px solid var(--border, #ddd);
|
|
83
|
+
margin-bottom: var(--space-lg, 12px);
|
|
84
|
+
}
|
|
85
|
+
.subject-nav a {
|
|
86
|
+
display: inline-block;
|
|
87
|
+
padding: var(--space-sm, 4px) var(--space-md, 8px);
|
|
88
|
+
border-radius: var(--radius-sm, 4px);
|
|
89
|
+
border: 1px solid var(--border, #ccc);
|
|
90
|
+
font-size: var(--small-font, 16px);
|
|
91
|
+
background: var(--surface, #f5f5f5);
|
|
92
|
+
}
|
|
93
|
+
.subject-nav a:hover {
|
|
94
|
+
background: var(--hover, #e8f0fe);
|
|
95
|
+
border-color: var(--accent, #4a9eff);
|
|
96
|
+
}
|
|
97
|
+
.subject-section { margin-bottom: 1.5rem; }
|
|
98
|
+
.subject-heading {
|
|
99
|
+
font-size: var(--medium-font, 20px);
|
|
100
|
+
font-weight: var(--font-weight-bold, 600);
|
|
101
|
+
margin: 0 0 .35rem;
|
|
102
|
+
padding-bottom: .25rem;
|
|
103
|
+
border-bottom: 1px solid var(--border, #eee);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/* ── blank-node modal ── */
|
|
107
|
+
.bnode-modal {
|
|
108
|
+
display: none;
|
|
109
|
+
position: fixed;
|
|
110
|
+
inset: 0;
|
|
111
|
+
background: var(--scrim, rgba(0,0,0,0.4));
|
|
112
|
+
z-index: 9999;
|
|
113
|
+
align-items: center;
|
|
114
|
+
justify-content: center;
|
|
115
|
+
}
|
|
116
|
+
.bnode-modal.active { display: flex; }
|
|
117
|
+
.bnode-modal-inner {
|
|
118
|
+
background: var(--surface, #fff);
|
|
119
|
+
color: var(--text, #212121);
|
|
120
|
+
border-radius: var(--radius-md, 6px);
|
|
121
|
+
padding: var(--space-xl, 16px) var(--space-2xl, 24px) var(--space-2xl, 24px);
|
|
122
|
+
max-width: var(--bnode-modal-max-width, min(90vw, 700px));
|
|
123
|
+
max-height: var(--bnode-modal-max-height, 80vh);
|
|
124
|
+
overflow: auto;
|
|
125
|
+
position: relative;
|
|
126
|
+
box-shadow: var(--shadow-modal, 0 8px 24px rgba(0,0,0,0.25));
|
|
127
|
+
}
|
|
128
|
+
.bnode-modal-body { overflow-x: auto; margin-top: var(--space-md, 8px); }
|
|
129
|
+
.bnode-modal-close {
|
|
130
|
+
position: absolute;
|
|
131
|
+
top: var(--space-md, 8px); right: var(--space-md, 8px);
|
|
132
|
+
border-radius: 50%;
|
|
133
|
+
width: 1.6rem; height: 1.6rem;
|
|
134
|
+
padding: 0;
|
|
135
|
+
font-size: var(--small-font, 16px); line-height: 1;
|
|
136
|
+
}
|
|
137
|
+
`;
|
|
138
|
+
|
|
139
|
+
export const sheet = sheetFrom(CSS);
|
|
140
|
+
export default sheet;
|