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.
Files changed (53) hide show
  1. package/README.md +101 -0
  2. package/chat.css +4 -4
  3. package/colors_and_type.css +33 -3
  4. package/community.css +22 -8
  5. package/dist/247420.css +324 -49
  6. package/dist/247420.js +123 -55
  7. package/dist/index.html +109 -32
  8. package/package.json +1 -1
  9. package/src/community-app.js +4 -2
  10. package/src/components/community/navigation.js +2 -2
  11. package/src/components/community/presence.js +10 -4
  12. package/src/components/community/views.js +8 -2
  13. package/src/components/content/avatar.js +30 -0
  14. package/src/components/content/hero.js +9 -2
  15. package/src/components/content.js +2 -2
  16. package/src/components/freddie/pages-missing.js +1 -1
  17. package/src/components/overlay-primitives/emoji-picker.js +15 -3
  18. package/src/components/shell/app-shell.js +15 -4
  19. package/src/components/shell/workspace-shell.js +1 -1
  20. package/src/components/theme-toggle.js +8 -3
  21. package/src/copy-code.js +103 -0
  22. package/src/css/app-shell/base.css +18 -0
  23. package/src/css/app-shell/catalog-theme.css +20 -2
  24. package/src/css/app-shell/chat-polish.css +12 -0
  25. package/src/css/app-shell/collab.css +5 -0
  26. package/src/css/app-shell/data-density.css +4 -0
  27. package/src/css/app-shell/files.css +7 -1
  28. package/src/css/app-shell/hero-content.css +14 -1
  29. package/src/css/app-shell/kits-appended.css +13 -0
  30. package/src/css/app-shell/loading-alerts.css +14 -12
  31. package/src/css/app-shell/otp-input.css +2 -2
  32. package/src/css/app-shell/panel-row.css +15 -0
  33. package/src/css/app-shell/plugins-config.css +3 -0
  34. package/src/css/app-shell/primitives.css +13 -4
  35. package/src/css/app-shell/responsive.css +13 -0
  36. package/src/css/app-shell/responsive2-workspace.css +4 -1
  37. package/src/css/app-shell/row-print.css +34 -0
  38. package/src/css/app-shell/states-interactions.css +62 -4
  39. package/src/css/app-shell/topbar.css +1 -0
  40. package/src/kits/os/app-panes.css +3 -2
  41. package/src/kits/os/icons.js +16 -0
  42. package/src/kits/os/shell-geometry.js +2 -2
  43. package/src/kits/os/shell.js +24 -3
  44. package/src/kits/os/theme.css +272 -78
  45. package/src/kits/os/wm.css +19 -6
  46. package/src/kits/os/wm.js +38 -1
  47. package/src/kits/spoint/host-join-lobby.css +3 -3
  48. package/src/page-html/client-script.js +96 -28
  49. package/src/page-html.js +3 -2
  50. package/src/theme.js +6 -2
  51. package/src/web-components/ds-chat.js +9 -0
  52. package/src/web-components/freddie-chat.js +2 -2
  53. 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.45;
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, #fff);
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: .55;
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-fg-3);
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-0);
47
+ background: var(--os-bg-1);
47
48
  position: relative;
48
49
  }
49
50
  .terminal-app-slot > * { width: 100%; height: 100%; }
@@ -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 * 28) % 240, vw - w));
41
- const y = Math.max(0, Math.min(80 + (openCount * 22) % 180, vh - h));
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
 
@@ -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.textContent = 'loading…';
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