anentrypoint-design 0.0.477 → 0.0.480
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 +101 -0
- package/chat.css +4 -4
- package/colors_and_type.css +33 -3
- package/community.css +22 -8
- package/dist/247420.css +324 -49
- package/dist/247420.js +123 -55
- package/dist/index.html +109 -32
- package/package.json +1 -1
- package/src/community-app.js +4 -2
- package/src/components/community/navigation.js +2 -2
- package/src/components/community/presence.js +10 -4
- package/src/components/community/views.js +8 -2
- package/src/components/content/avatar.js +30 -0
- package/src/components/content/hero.js +9 -2
- package/src/components/content.js +2 -2
- package/src/components/freddie/pages-missing.js +1 -1
- package/src/components/overlay-primitives/emoji-picker.js +15 -3
- package/src/components/shell/app-shell.js +15 -4
- package/src/components/shell/workspace-shell.js +1 -1
- package/src/components/theme-toggle.js +8 -3
- package/src/copy-code.js +103 -0
- package/src/css/app-shell/base.css +18 -0
- package/src/css/app-shell/catalog-theme.css +20 -2
- package/src/css/app-shell/chat-polish.css +12 -0
- package/src/css/app-shell/collab.css +5 -0
- package/src/css/app-shell/data-density.css +4 -0
- package/src/css/app-shell/files.css +7 -1
- package/src/css/app-shell/hero-content.css +14 -1
- package/src/css/app-shell/kits-appended.css +13 -0
- package/src/css/app-shell/loading-alerts.css +14 -12
- package/src/css/app-shell/otp-input.css +2 -2
- package/src/css/app-shell/panel-row.css +15 -0
- package/src/css/app-shell/plugins-config.css +3 -0
- package/src/css/app-shell/primitives.css +13 -4
- package/src/css/app-shell/responsive.css +13 -0
- package/src/css/app-shell/responsive2-workspace.css +4 -1
- package/src/css/app-shell/row-print.css +34 -0
- package/src/css/app-shell/states-interactions.css +62 -4
- package/src/css/app-shell/topbar.css +1 -0
- package/src/kits/os/app-panes.css +3 -2
- package/src/kits/os/icons.js +16 -0
- package/src/kits/os/shell-geometry.js +2 -2
- package/src/kits/os/shell.js +24 -3
- package/src/kits/os/theme.css +272 -78
- package/src/kits/os/wm.css +19 -6
- package/src/kits/os/wm.js +38 -1
- package/src/kits/spoint/host-join-lobby.css +3 -3
- package/src/page-html/client-script.js +96 -28
- package/src/page-html.js +3 -2
- package/src/theme.js +6 -2
- package/src/web-components/ds-chat.js +9 -0
- package/src/web-components/freddie-chat.js +2 -2
- package/types/components.d.ts +6 -0
|
@@ -34,12 +34,26 @@ tr.clickable:focus-visible {
|
|
|
34
34
|
.btn:disabled, .btn-primary:disabled, .btn-ghost:disabled,
|
|
35
35
|
.btn.is-disabled, .btn-primary.is-disabled, .btn-ghost.is-disabled,
|
|
36
36
|
button:disabled, [disabled] {
|
|
37
|
-
opacity: 0.
|
|
37
|
+
opacity: 0.5;
|
|
38
38
|
filter: grayscale(60%);
|
|
39
39
|
cursor: not-allowed;
|
|
40
40
|
pointer-events: none;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
/* Systemic hover fallback — button-like elements with no design-system class
|
|
44
|
+
(a bare <button>, [role="button"], or a generic .row/.chip usage) get a
|
|
45
|
+
`transition` declared above (line ~106) but nothing to transition to, so
|
|
46
|
+
they look inert until clicked. This is a low-specificity (0,0,1)/(0,1,1)
|
|
47
|
+
catch-all: any element that also carries `.btn`/`.btn-primary`/`.btn-ghost`/
|
|
48
|
+
`.ds-icon-btn`/etc. keeps its own component `:hover` (those selectors are
|
|
49
|
+
equal-or-higher specificity and, for the shared ones, declared later in
|
|
50
|
+
the cascade), so this never overrides a deliberate per-component hover —
|
|
51
|
+
it only fills the gap for elements that don't have one. */
|
|
52
|
+
button:not(:disabled):hover,
|
|
53
|
+
[role="button"]:not([aria-disabled="true"]):hover {
|
|
54
|
+
background-color: var(--panel-hover, var(--bg-3));
|
|
55
|
+
}
|
|
56
|
+
|
|
43
57
|
/* Loading state — spinning indicator */
|
|
44
58
|
@keyframes spinner-rotate {
|
|
45
59
|
from { transform: rotate(0deg); }
|
|
@@ -47,10 +61,12 @@ button:disabled, [disabled] {
|
|
|
47
61
|
}
|
|
48
62
|
/* Reusable spin utility: rotates the element (e.g. a refresh Icon used as a
|
|
49
63
|
busy indicator) via the shared spinner-rotate keyframe. Respects reduced
|
|
50
|
-
motion. Use instead of a decorative rotation glyph.
|
|
64
|
+
motion. Use instead of a decorative rotation glyph.
|
|
65
|
+
Ring spinner — use for larger blocking/full-region loading states. */
|
|
51
66
|
.ds-spin { animation: spinner-rotate 0.8s linear infinite; transform-origin: center; }
|
|
52
67
|
@media (prefers-reduced-motion: reduce) { .ds-spin { animation: none; } }
|
|
53
68
|
|
|
69
|
+
/* Ring spinner — use for larger blocking/full-region loading states. */
|
|
54
70
|
.loading { position: relative; }
|
|
55
71
|
.loading::after {
|
|
56
72
|
content: '';
|
|
@@ -477,7 +493,7 @@ hr.rule-dotted { border-top: 2px dotted var(--rule-strong); }
|
|
|
477
493
|
background: var(--accent-ink); border-color: var(--accent-ink);
|
|
478
494
|
}
|
|
479
495
|
.ds-toggle[aria-checked="true"] .ds-toggle-knob {
|
|
480
|
-
background: var(--panel-0,
|
|
496
|
+
background: var(--panel-0, var(--bg));
|
|
481
497
|
transform: translateX(18px);
|
|
482
498
|
}
|
|
483
499
|
.ds-toggle:disabled { opacity: 0.5; cursor: not-allowed; }
|
|
@@ -611,7 +627,7 @@ hr.rule-dotted { border-top: 2px dotted var(--rule-strong); }
|
|
|
611
627
|
.ds-field input:not(.input):disabled,
|
|
612
628
|
.ds-field textarea:not(.input):disabled,
|
|
613
629
|
.ds-field .ds-select:disabled {
|
|
614
|
-
opacity: .
|
|
630
|
+
opacity: 0.5;
|
|
615
631
|
cursor: not-allowed;
|
|
616
632
|
}
|
|
617
633
|
.ds-field input:not(.input)[aria-invalid="true"],
|
|
@@ -825,3 +841,45 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
|
|
|
825
841
|
max-width: none;
|
|
826
842
|
}
|
|
827
843
|
}
|
|
844
|
+
|
|
845
|
+
/* Stacking host for the imperative toast()/<Toast> component
|
|
846
|
+
(src/components/editor-primitives/toast.js). One fixed-position column;
|
|
847
|
+
individual toasts are appended/removed as siblings inside it rather than
|
|
848
|
+
each toast fixed-positioning itself, so more than one toast in flight
|
|
849
|
+
stacks instead of overlapping at the same bottom-right point. */
|
|
850
|
+
.ds-ep-toast-host {
|
|
851
|
+
position: fixed; z-index: var(--z-toast);
|
|
852
|
+
bottom: 24px; right: 24px;
|
|
853
|
+
display: flex; flex-direction: column-reverse; gap: var(--space-2);
|
|
854
|
+
pointer-events: none;
|
|
855
|
+
}
|
|
856
|
+
.ds-ep-toast {
|
|
857
|
+
pointer-events: auto;
|
|
858
|
+
display: flex; align-items: center; gap: var(--space-3);
|
|
859
|
+
background: var(--bg-2); color: var(--fg);
|
|
860
|
+
border: 1px solid var(--rule);
|
|
861
|
+
border-radius: var(--r-2);
|
|
862
|
+
padding: var(--space-3) var(--space-4);
|
|
863
|
+
max-width: 320px;
|
|
864
|
+
box-shadow: var(--shadow-overlay);
|
|
865
|
+
font-size: var(--fs-sm);
|
|
866
|
+
}
|
|
867
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
868
|
+
.ds-ep-toast { animation: toast-slide-in 0.3s ease-out; }
|
|
869
|
+
.ds-ep-toast.leaving { animation: toast-slide-in 0.2s ease-in reverse; }
|
|
870
|
+
}
|
|
871
|
+
.ds-ep-toast.kind-error { border-color: var(--danger, var(--warn)); }
|
|
872
|
+
.ds-ep-toast.kind-success { border-color: var(--green-2); }
|
|
873
|
+
.ds-ep-toast.kind-warning { border-color: var(--amber); }
|
|
874
|
+
.ds-ep-toast-msg { flex: 1; }
|
|
875
|
+
.ds-ep-toast-action {
|
|
876
|
+
flex-shrink: 0;
|
|
877
|
+
background: transparent; border: 0; color: var(--accent-ink);
|
|
878
|
+
font: inherit; font-weight: 600; cursor: pointer; padding: 0;
|
|
879
|
+
}
|
|
880
|
+
.ds-ep-toast-action:hover { text-decoration: underline; }
|
|
881
|
+
|
|
882
|
+
@media (max-width: 480px) {
|
|
883
|
+
.ds-ep-toast-host { bottom: 16px; right: 16px; left: 16px; }
|
|
884
|
+
.ds-ep-toast { max-width: none; }
|
|
885
|
+
}
|
|
@@ -80,6 +80,7 @@ body.canvas-host { background: transparent !important; }
|
|
|
80
80
|
.app-topbar > .brand { flex: 0 0 auto; }
|
|
81
81
|
.app-topbar > .app-search { flex: 1 1 auto; }
|
|
82
82
|
.app-topbar > nav { margin-left: auto; }
|
|
83
|
+
.app-topbar > .app-topbar-theme { flex: 0 0 auto; }
|
|
83
84
|
.app-topbar nav { display: flex; gap: 4px; font-size: var(--fs-sm); flex-wrap: wrap; }
|
|
84
85
|
.app-topbar nav a { flex: 0 0 auto; }
|
|
85
86
|
.app-topbar nav a {
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
gap: var(--space-2);
|
|
18
18
|
padding: var(--space-1) var(--space-2);
|
|
19
19
|
background: var(--os-bg-2);
|
|
20
|
+
border-bottom: 1px solid color-mix(in oklab, var(--os-accent) 35%, transparent);
|
|
20
21
|
font-family: var(--os-mono);
|
|
21
22
|
font-size: 11px;
|
|
22
23
|
color: var(--os-fg-2);
|
|
@@ -32,7 +33,7 @@
|
|
|
32
33
|
}
|
|
33
34
|
.terminal-app-status {
|
|
34
35
|
font-family: var(--os-mono);
|
|
35
|
-
color: var(--os-
|
|
36
|
+
color: var(--os-accent);
|
|
36
37
|
flex: 0 0 auto;
|
|
37
38
|
overflow: hidden;
|
|
38
39
|
text-overflow: ellipsis;
|
|
@@ -43,7 +44,7 @@
|
|
|
43
44
|
min-width: 0;
|
|
44
45
|
min-height: 0;
|
|
45
46
|
overflow: hidden;
|
|
46
|
-
background: var(--os-bg-
|
|
47
|
+
background: var(--os-bg-1);
|
|
47
48
|
position: relative;
|
|
48
49
|
}
|
|
49
50
|
.terminal-app-slot > * { width: 100%; height: 100%; }
|
package/src/kits/os/icons.js
CHANGED
|
@@ -29,6 +29,22 @@ const OS_PATHS = {
|
|
|
29
29
|
// other icon in this kit instead of raw ASCII glyph text (-/+/x).
|
|
30
30
|
minimize: '<path d="M5 12h14"/>',
|
|
31
31
|
maximize: '<rect x="5" y="5" width="14" height="14" rx="1"/>',
|
|
32
|
+
// Remaining os-app glyphs, added so every app-menu entry in the shared
|
|
33
|
+
// registry (thebird's apps.js) resolves a real icon instead of falling
|
|
34
|
+
// through buildAppEntries()'s `icons[app.id] || ''` empty-span case.
|
|
35
|
+
// Concepts that already exist in ICON_PATHS are reused directly; the rest
|
|
36
|
+
// get their own path data following this module's own house style.
|
|
37
|
+
workspaces: ICON_PATHS.grid,
|
|
38
|
+
gm: ICON_PATHS.activity,
|
|
39
|
+
todo: ICON_PATHS['check-check'],
|
|
40
|
+
config: ICON_PATHS.settings,
|
|
41
|
+
notes: ICON_PATHS['file-text'],
|
|
42
|
+
counter: ICON_PATHS.plus,
|
|
43
|
+
snake: '<path d="M4 6c0 4 3 2 3 6s-3 2-3 6M17 6a3 3 0 0 1 0 6h-6a3 3 0 0 0 0 6h6"/>',
|
|
44
|
+
'snake-ecs': '<path d="M4 6c0 4 3 2 3 6s-3 2-3 6M17 6a3 3 0 0 1 0 6h-6a3 3 0 0 0 0 6h6"/><circle cx="19" cy="6" r="1.5" fill="currentColor"/>',
|
|
45
|
+
boids: '<path d="M12 4l4 8-4-2-4 2z"/><path d="M5 15l3 5-3-1-2 1z"/><path d="M19 15l-3 5 3-1 2 1z"/>',
|
|
46
|
+
'level-editor': '<rect x="3" y="3" width="18" height="18" rx="2"/><path d="M9 3v18M3 9h18"/>',
|
|
47
|
+
'game-player': '<rect x="2" y="7" width="20" height="10" rx="4"/><path d="M8 10v4M6 12h4"/><circle cx="16" cy="10.5" r="1"/><circle cx="18.5" cy="13" r="1"/>',
|
|
32
48
|
};
|
|
33
49
|
|
|
34
50
|
// iconMarkup() only resolves names already registered in the shared
|
|
@@ -37,8 +37,8 @@ export function computeSpawnRect(sz, openCount) {
|
|
|
37
37
|
const scaled = small ? sz : scaleSpawnSize(sz, vw, vh);
|
|
38
38
|
const w = Math.min(scaled.w, vw);
|
|
39
39
|
const h = Math.min(scaled.h, vh);
|
|
40
|
-
const x = Math.max(0, Math.min(100 + (openCount *
|
|
41
|
-
const y = Math.max(0, Math.min(80 + (openCount *
|
|
40
|
+
const x = Math.max(0, Math.min(100 + (openCount * 36) % 288, vw - w));
|
|
41
|
+
const y = Math.max(0, Math.min(80 + (openCount * 28) % 224, vh - h));
|
|
42
42
|
return { w, h, x, y, maximized: small };
|
|
43
43
|
}
|
|
44
44
|
|
package/src/kits/os/shell.js
CHANGED
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
|
|
7
7
|
import {
|
|
8
8
|
ensureCss, buildMenubar, buildAppsMenu, buildSideRail, buildDrawer,
|
|
9
|
-
buildTaskbar, buildAppEntries,
|
|
9
|
+
buildTaskbar, buildAppEntries, ic,
|
|
10
10
|
} from './shell-chrome.js';
|
|
11
|
+
import { icons } from './icons.js';
|
|
11
12
|
import { computeSpawnRect, reflowWindows } from './shell-geometry.js';
|
|
12
13
|
|
|
13
14
|
export function createDesktopShell({ root = document.body, wm, registry, brand = 'desktop', themeUrl, onNewInstance, autoBoot = false } = {}) {
|
|
@@ -171,8 +172,15 @@ export function createDesktopShell({ root = document.body, wm, registry, brand =
|
|
|
171
172
|
const t = document.createElement('button');
|
|
172
173
|
t.className = 'os-task' + (w.focused ? ' focused' : '');
|
|
173
174
|
t.type = 'button';
|
|
174
|
-
t.textContent = w.title;
|
|
175
175
|
t.dataset.winId = w.id;
|
|
176
|
+
// Same icon-resolution order as buildAppEntries (menu/rail/drawer):
|
|
177
|
+
// the registered app's own icon, falling back to the id-keyed
|
|
178
|
+
// default set — so a taskbar entry always matches its apps-menu
|
|
179
|
+
// counterpart instead of reading as unrelated text-only chrome.
|
|
180
|
+
const app = w.appId && (typeof registry.get === 'function' ? registry.get(w.appId) : registry[w.appId]);
|
|
181
|
+
const iconSvg = (app && app.icon) || icons[w.appId] || '';
|
|
182
|
+
if (iconSvg) t.append(ic(iconSvg));
|
|
183
|
+
t.append(Object.assign(document.createElement('span'), { className: 'os-task-label', textContent: w.title }));
|
|
176
184
|
// aria-current announces which window is the active one; a
|
|
177
185
|
// sighted user reads this from the .focused visual state alone.
|
|
178
186
|
if (w.focused) t.setAttribute('aria-current', 'true');
|
|
@@ -194,7 +202,20 @@ export function createDesktopShell({ root = document.body, wm, registry, brand =
|
|
|
194
202
|
function makeLoadingNode() {
|
|
195
203
|
const n = document.createElement('div');
|
|
196
204
|
n.className = 'app-pane os-app-loading';
|
|
197
|
-
n.
|
|
205
|
+
n.setAttribute('role', 'status');
|
|
206
|
+
n.setAttribute('aria-live', 'polite');
|
|
207
|
+
n.setAttribute('aria-label', 'loading');
|
|
208
|
+
const spinner = document.createElement('div');
|
|
209
|
+
spinner.className = 'ds-spinner';
|
|
210
|
+
spinner.setAttribute('aria-hidden', 'true');
|
|
211
|
+
spinner.appendChild(document.createElement('span'));
|
|
212
|
+
spinner.appendChild(document.createElement('span'));
|
|
213
|
+
spinner.appendChild(document.createElement('span'));
|
|
214
|
+
const label = document.createElement('span');
|
|
215
|
+
label.className = 'os-app-loading-label';
|
|
216
|
+
label.textContent = 'loading…';
|
|
217
|
+
n.appendChild(spinner);
|
|
218
|
+
n.appendChild(label);
|
|
198
219
|
return n;
|
|
199
220
|
}
|
|
200
221
|
|