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.
Files changed (150) hide show
  1. package/README.md +7 -0
  2. package/core/activate.js +27 -0
  3. package/core/adopt.js +71 -0
  4. package/core/auth-core.js +73 -0
  5. package/core/auth-fetch.js +154 -0
  6. package/core/component-mount.js +110 -0
  7. package/core/defaults.js +48 -0
  8. package/core/define.js +15 -0
  9. package/core/display-target.js +166 -0
  10. package/core/edit-placements.js +28 -0
  11. package/core/editor-self.js +127 -0
  12. package/core/editor.js +162 -0
  13. package/core/events.js +27 -0
  14. package/core/extension-points.js +189 -0
  15. package/core/form-utils.js +210 -0
  16. package/core/from-query.js +138 -0
  17. package/core/from-rdf.js +52 -0
  18. package/core/here.js +33 -0
  19. package/core/include-core.js +73 -0
  20. package/core/inrupt-global.js +18 -0
  21. package/core/menu-consumer.js +41 -0
  22. package/core/menu-rdf.js +154 -0
  23. package/core/pod-ops.js +392 -0
  24. package/core/pod-registry.js +82 -0
  25. package/core/popup-proxy.js +255 -0
  26. package/core/rdf-core.js +280 -0
  27. package/core/rdf-render.js +136 -0
  28. package/core/rdf-utils.js +411 -0
  29. package/core/rdf.js +154 -0
  30. package/core/services.js +106 -0
  31. package/core/shape-to-form.js +741 -0
  32. package/core/sparql-safety.js +20 -0
  33. package/core/utils.js +196 -0
  34. package/dist/importmap-cdn.json +49 -0
  35. package/dist/importmap-local.json +49 -0
  36. package/dist/sol-loader.manifest.json +140 -0
  37. package/dist/vendor/@comunica-query-sparql.js +137851 -0
  38. package/dist/vendor/@inrupt-solid-client-authn-browser.js +7503 -0
  39. package/dist/vendor/dompurify.js +1476 -0
  40. package/dist/vendor/ical.js.js +9739 -0
  41. package/dist/vendor/marked.js +85 -0
  42. package/dist/vendor/n3.js +14670 -0
  43. package/dist/vendor/rdf-validate-shacl.js +6970 -0
  44. package/dist/vendor/rdflib.js +35172 -0
  45. package/dist/vendor/solid-logic.js +6819 -0
  46. package/dist/vendor/solid-ui.js +21945 -0
  47. package/node/sol-form.js +133 -0
  48. package/node/sol-include.js +55 -0
  49. package/node/sol-login.js +632 -0
  50. package/node/sol-menu.js +639 -0
  51. package/node/sol-query.js +116 -0
  52. package/package.json +133 -0
  53. package/web/menu-from-rdf.js +23 -0
  54. package/web/scripts/prefs.js +25 -0
  55. package/web/sol-accordion.js +114 -0
  56. package/web/sol-basic.js +50 -0
  57. package/web/sol-breadcrumb.js +131 -0
  58. package/web/sol-button.js +244 -0
  59. package/web/sol-calendar.js +465 -0
  60. package/web/sol-default.js +118 -0
  61. package/web/sol-dropdown-button.js +222 -0
  62. package/web/sol-feed.js +1336 -0
  63. package/web/sol-form.js +949 -0
  64. package/web/sol-full.js +43 -0
  65. package/web/sol-gallery.js +303 -0
  66. package/web/sol-include.js +246 -0
  67. package/web/sol-live-edit.js +415 -0
  68. package/web/sol-login.js +856 -0
  69. package/web/sol-menu.js +593 -0
  70. package/web/sol-modal.js +377 -0
  71. package/web/sol-pod-extras.js +17 -0
  72. package/web/sol-pod-ops.js +680 -0
  73. package/web/sol-pod.js +1039 -0
  74. package/web/sol-query.js +546 -0
  75. package/web/sol-rolodex.js +95 -0
  76. package/web/sol-search.js +402 -0
  77. package/web/sol-settings.js +199 -0
  78. package/web/sol-solidos.js +93 -0
  79. package/web/sol-tabs.js +445 -0
  80. package/web/sol-time.js +194 -0
  81. package/web/sol-tree-edit.js +492 -0
  82. package/web/sol-wac.js +456 -0
  83. package/web/sol-weather.js +337 -0
  84. package/web/sol-window.js +142 -0
  85. package/web/styles/buttons-css.js +108 -0
  86. package/web/styles/help.css +242 -0
  87. package/web/styles/root.css +112 -0
  88. package/web/styles/sol-accordion-css.js +97 -0
  89. package/web/styles/sol-calendar-css.js +154 -0
  90. package/web/styles/sol-feed-css.js +475 -0
  91. package/web/styles/sol-form-css.js +471 -0
  92. package/web/styles/sol-gallery-css.js +181 -0
  93. package/web/styles/sol-include-css.js +95 -0
  94. package/web/styles/sol-live-edit-css.js +84 -0
  95. package/web/styles/sol-live-edit.css +101 -0
  96. package/web/styles/sol-login-css.js +116 -0
  97. package/web/styles/sol-menu-css.js +145 -0
  98. package/web/styles/sol-modal-css.js +134 -0
  99. package/web/styles/sol-pod-css.js +187 -0
  100. package/web/styles/sol-pod-modal-css.js +203 -0
  101. package/web/styles/sol-query-css.js +140 -0
  102. package/web/styles/sol-query-help.css +267 -0
  103. package/web/styles/sol-query-one-pager.css +67 -0
  104. package/web/styles/sol-search-css.js +157 -0
  105. package/web/styles/sol-solidos-css.js +7 -0
  106. package/web/styles/sol-tabs-css.js +114 -0
  107. package/web/styles/sol-time-css.js +30 -0
  108. package/web/styles/sol-wac-css.js +73 -0
  109. package/web/styles/sol-weather-css.js +59 -0
  110. package/web/styles/solid-logo.svg +9 -0
  111. package/web/styles/view-accordion-css.js +66 -0
  112. package/web/styles/view-anchorlist-css.js +22 -0
  113. package/web/styles/view-autocomplete-css.js +59 -0
  114. package/web/styles/view-rolodex-css.js +102 -0
  115. package/web/styles/view-select-css.js +21 -0
  116. package/web/utils/calendar-fetch.js +388 -0
  117. package/web/utils/code-mirror-editor.js +82 -0
  118. package/web/utils/commons-fetch.js +108 -0
  119. package/web/utils/feed-edit.js +159 -0
  120. package/web/utils/feed-edit.smoke.mjs +74 -0
  121. package/web/utils/feed-fetch.js +573 -0
  122. package/web/utils/live-edit-help/csv.js +64 -0
  123. package/web/utils/live-edit-help/graphviz.js +41 -0
  124. package/web/utils/live-edit-help/jsonld.js +55 -0
  125. package/web/utils/live-edit-help/markdown.js +52 -0
  126. package/web/utils/live-edit-help/mermaid.js +48 -0
  127. package/web/utils/live-edit-help/turtle.js +85 -0
  128. package/web/utils/rdf-config.js +125 -0
  129. package/web/utils/renderers/csv.js +124 -0
  130. package/web/utils/renderers/d3-force.js +82 -0
  131. package/web/utils/renderers/graphviz.js +13 -0
  132. package/web/utils/renderers/html.js +10 -0
  133. package/web/utils/renderers/jsonld.js +63 -0
  134. package/web/utils/renderers/markdown.js +19 -0
  135. package/web/utils/renderers/mermaid.js +54 -0
  136. package/web/utils/renderers/turtle.js +51 -0
  137. package/web/utils/sol-query-triple-patterns.js +151 -0
  138. package/web/utils/sol-query-ui.js +250 -0
  139. package/web/utils/sol-query-views.js +32 -0
  140. package/web/views/_helpers.js +34 -0
  141. package/web/views/accordion.js +133 -0
  142. package/web/views/anchorlist.js +59 -0
  143. package/web/views/auto-complete.js +183 -0
  144. package/web/views/dl.js +38 -0
  145. package/web/views/list.js +19 -0
  146. package/web/views/menu.js +56 -0
  147. package/web/views/rolodex.js +126 -0
  148. package/web/views/select.js +79 -0
  149. package/web/views/table.js +73 -0
  150. 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;