anentrypoint-design 0.0.425 → 0.0.426
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/app-shell.css +5 -0
- package/chat.css +41 -0
- package/colors_and_type.css +86 -42
- package/dist/247420.css +544 -82
- package/dist/247420.js +34 -28
- package/package.json +1 -1
- package/src/components/calendar/calendar.js +144 -0
- package/src/components/calendar/date-picker.js +106 -0
- package/src/components/calendar/grid.js +79 -0
- package/src/components/calendar.js +15 -0
- package/src/components/carousel.js +53 -0
- package/src/components/collab/cursors.js +68 -0
- package/src/components/collab/presence.js +29 -0
- package/src/components/collab.js +11 -0
- package/src/components/content/otp-input.js +91 -0
- package/src/components/content.js +2 -1
- package/src/components/context-pane/meter.js +42 -0
- package/src/components/context-pane/pane.js +127 -0
- package/src/components/context-pane/treemap.js +81 -0
- package/src/components/context-pane/xray.js +30 -0
- package/src/components/context-pane.js +12 -127
- package/src/components/data-density/progress.js +20 -0
- package/src/components/data-density.js +3 -0
- package/src/components/editor-primitives/layout.js +12 -0
- package/src/components/editor-primitives.js +2 -2
- package/src/components/overlay-primitives/hover-card.js +60 -0
- package/src/components/overlay-primitives/menubar.js +65 -0
- package/src/components/overlay-primitives.js +4 -0
- package/src/components/shell/icons.js +4 -1
- package/src/components/slider.js +66 -0
- package/src/components.js +21 -5
- package/src/css/app-shell/base.css +16 -0
- package/src/css/app-shell/calendar.css +131 -0
- package/src/css/app-shell/carousel.css +44 -0
- package/src/css/app-shell/chat-polish.css +1 -1
- package/src/css/app-shell/collab.css +106 -0
- package/src/css/app-shell/hero-content.css +34 -38
- package/src/css/app-shell/kits-appended.css +1 -1
- package/src/css/app-shell/otp-input.css +31 -0
- package/src/css/app-shell/slider.css +53 -0
- package/src/page-html/page-styles.js +7 -1
- package/types/components.d.ts +299 -1
|
@@ -86,7 +86,10 @@ export const ICON_PATHS = {
|
|
|
86
86
|
// clipboard/copy — for the per-block code copy + message copy action, so the
|
|
87
87
|
// copy affordance reads as copy, not the lined-document `page` glyph.
|
|
88
88
|
copy: '<rect x="9" y="9" width="11" height="11" rx="2"/><path d="M5 15V5a2 2 0 0 1 2-2h8"/>',
|
|
89
|
-
clipboard: '<rect x="8" y="4" width="8" height="4" rx="1"/><path d="M8 6H6a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-2"/>'
|
|
89
|
+
clipboard: '<rect x="8" y="4" width="8" height="4" rx="1"/><path d="M8 6H6a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-2"/>',
|
|
90
|
+
// Live-cursor pointer arrow — collab.js's LiveCursorOverlay renders one
|
|
91
|
+
// per remote collaborator, filled with that collaborator's color.
|
|
92
|
+
cursor: '<path d="M5 3l14 8-6.5 1.5L11 20z"/>'
|
|
90
93
|
};
|
|
91
94
|
|
|
92
95
|
// The single SVG attribute contract (viewBox/stroke/linecap…) shared by both
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Slider — generic single-value range-input wrapper. Styling approach is
|
|
2
|
+
// extracted from voice/capture.js's VadMeter (the original purpose-built
|
|
3
|
+
// range-input precedent): a real <input type="range"> is layered invisible
|
|
4
|
+
// (opacity:0, position:absolute, inset:0) directly over a custom track/fill
|
|
5
|
+
// so the notoriously inconsistent native thumb/track chrome never renders,
|
|
6
|
+
// while keyboard/pointer/a11y semantics stay on the real input.
|
|
7
|
+
|
|
8
|
+
import * as webjsx from '../../vendor/webjsx/index.js';
|
|
9
|
+
const h = webjsx.createElement;
|
|
10
|
+
|
|
11
|
+
let _uid = 0;
|
|
12
|
+
function uid(prefix) { _uid += 1; return prefix + '-' + _uid; }
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* A single-value range slider (track + fill + thumb) built on a real,
|
|
16
|
+
* invisible native `<input type="range">` for keyboard/pointer/a11y
|
|
17
|
+
* semantics, matching the overlay approach voice/capture.js's VadMeter
|
|
18
|
+
* pioneered for its threshold handle.
|
|
19
|
+
*
|
|
20
|
+
* @param {Object} [props]
|
|
21
|
+
* @param {number} [props.value=0]
|
|
22
|
+
* @param {number} [props.min=0]
|
|
23
|
+
* @param {number} [props.max=100]
|
|
24
|
+
* @param {number} [props.step=1]
|
|
25
|
+
* @param {Function} [props.onChange] - called with (value:number, event) on input.
|
|
26
|
+
* @param {string} [props.label] - accessible name; also rendered visibly when given.
|
|
27
|
+
* @param {boolean} [props.disabled]
|
|
28
|
+
* @param {string} [props.hint]
|
|
29
|
+
* @param {*} [props.key]
|
|
30
|
+
* @returns {*} webjsx vnode
|
|
31
|
+
*/
|
|
32
|
+
export function Slider({ value = 0, min = 0, max = 100, step = 1, onChange, label, disabled, hint, key } = {}) {
|
|
33
|
+
const lo = Number(min);
|
|
34
|
+
const hi = Number(max);
|
|
35
|
+
const v = Math.max(lo, Math.min(hi, Number(value) || 0));
|
|
36
|
+
const pct = hi > lo ? ((v - lo) / (hi - lo)) * 100 : 0;
|
|
37
|
+
const inputId = uid('ds-slider');
|
|
38
|
+
const hintId = hint != null ? inputId + '-hint' : null;
|
|
39
|
+
const range = h('input', {
|
|
40
|
+
key: 'i',
|
|
41
|
+
id: inputId,
|
|
42
|
+
type: 'range',
|
|
43
|
+
class: 'ds-slider-range',
|
|
44
|
+
min: String(lo), max: String(hi), step: String(step),
|
|
45
|
+
value: String(v),
|
|
46
|
+
disabled: disabled ? true : null,
|
|
47
|
+
'aria-label': label || null,
|
|
48
|
+
'aria-describedby': hintId,
|
|
49
|
+
oninput: onChange ? (e) => onChange(parseFloat(e.target.value), e) : null
|
|
50
|
+
});
|
|
51
|
+
// Position is written as a custom-property (--ds-slider-pct), not a raw
|
|
52
|
+
// width:/left: layout string, so this stays a whitelisted dynamic
|
|
53
|
+
// non-layout style per lint-inline-styles.mjs — the % math itself lives
|
|
54
|
+
// in slider.css via calc(var(--ds-slider-pct) * 1%).
|
|
55
|
+
const pctVar = '--ds-slider-pct:' + pct.toFixed(2);
|
|
56
|
+
const track = h('div', { key: 't', class: 'ds-slider-track', style: pctVar },
|
|
57
|
+
h('div', { key: 'f', class: 'ds-slider-fill' }),
|
|
58
|
+
h('div', { key: 'th', class: 'ds-slider-thumb', 'aria-hidden': 'true' }),
|
|
59
|
+
range
|
|
60
|
+
);
|
|
61
|
+
return h('div', { key, class: 'ds-slider' + (disabled ? ' is-disabled' : '') },
|
|
62
|
+
label != null ? h('label', { key: 'l', class: 'ds-field-label', for: inputId }, label) : null,
|
|
63
|
+
track,
|
|
64
|
+
hint != null ? h('span', { key: 'h', id: hintId, class: 'ds-field-hint' }, hint) : null
|
|
65
|
+
);
|
|
66
|
+
}
|
package/src/components.js
CHANGED
|
@@ -15,7 +15,7 @@ export {
|
|
|
15
15
|
Hero, HeroFromPageData, Marquee, Install, CliBlock, Receipt, Changelog,
|
|
16
16
|
WorksList, WritingList, Manifesto, Section, PageHeader,
|
|
17
17
|
Kpi, Sparkline, BarChart, Table, HealthTable, ProcessRegistryTable, SearchInput, TextField, Select, EventList,
|
|
18
|
-
HomeView, ProjectView, Form,
|
|
18
|
+
HomeView, ProjectView, Form, InputOTP,
|
|
19
19
|
Spinner, Skeleton, Alert, FilterPills, Avatar, avatarInitial
|
|
20
20
|
} from './components/content.js';
|
|
21
21
|
|
|
@@ -33,7 +33,7 @@ export {
|
|
|
33
33
|
ConversationList, SessionCard, SessionDashboard, SessionMeta, fmtDuration, fmtTime, fmtAgo, AgentListSkeleton
|
|
34
34
|
} from './components/sessions.js';
|
|
35
35
|
|
|
36
|
-
export { ContextPane } from './components/context-pane.js';
|
|
36
|
+
export { ContextPane, ContextMeter, ContextTreemap, ContextXRayPanel } from './components/context-pane.js';
|
|
37
37
|
|
|
38
38
|
export { SpreadsheetPreview } from './components/spreadsheet-preview.js';
|
|
39
39
|
|
|
@@ -49,7 +49,8 @@ export { ModelsConfig } from './components/models-config.js';
|
|
|
49
49
|
|
|
50
50
|
export {
|
|
51
51
|
DEFAULT_PHASES, PhaseWalk, TreeNode, BarRow, RateCell,
|
|
52
|
-
StatTile, StatsGrid, SubGrid, SessionRow, DevRow, LiveLogEntry, LiveLog
|
|
52
|
+
StatTile, StatsGrid, SubGrid, SessionRow, DevRow, LiveLogEntry, LiveLog,
|
|
53
|
+
Progress
|
|
53
54
|
} from './components/data-density.js';
|
|
54
55
|
|
|
55
56
|
export {
|
|
@@ -78,12 +79,21 @@ export {
|
|
|
78
79
|
playCompletionCue
|
|
79
80
|
} from './components/voice.js';
|
|
80
81
|
|
|
82
|
+
export {
|
|
83
|
+
LiveCursorOverlay, RemoteSelectionRings, RecentEditHighlightFlash,
|
|
84
|
+
AgentPresenceChip, PresenceBar
|
|
85
|
+
} from './components/collab.js';
|
|
86
|
+
|
|
81
87
|
export { ThemeToggle } from './components/theme-toggle.js';
|
|
82
88
|
|
|
83
89
|
export {
|
|
84
90
|
Checkbox, Radio, RadioGroup, Toggle, Field, useFormValidation, focusFirstInvalidField
|
|
85
91
|
} from './components/form-primitives.js';
|
|
86
92
|
|
|
93
|
+
export { Slider } from './components/slider.js';
|
|
94
|
+
|
|
95
|
+
export { Carousel } from './components/carousel.js';
|
|
96
|
+
|
|
87
97
|
export {
|
|
88
98
|
useDraggable, useDropTarget, useNumberScrub, usePointerDrag, Reorderable,
|
|
89
99
|
useKeyboardShortcut, formatShortcut, ShortcutHint, ShortcutList,
|
|
@@ -103,7 +113,7 @@ export {
|
|
|
103
113
|
Pager, JsonViewer,
|
|
104
114
|
Grid, GridItem,
|
|
105
115
|
Collapse, CollapseGroup,
|
|
106
|
-
Divider,
|
|
116
|
+
Divider, AspectRatio,
|
|
107
117
|
useMediaQuery,
|
|
108
118
|
BP_SM, BP_MD, BP_LG, BP_XL,
|
|
109
119
|
InfoRow, InfoSection, DiagnosticsPanel,
|
|
@@ -114,7 +124,8 @@ export {
|
|
|
114
124
|
Tooltip, Popover, Dropdown, useLongPress, useFloating,
|
|
115
125
|
CommandPalette, EmojiPicker, BootOverlay, SettingsPopover,
|
|
116
126
|
AuthModal, VideoLightbox, PermissionMenu, ApprovalPrompt, withBusy,
|
|
117
|
-
MenuButton
|
|
127
|
+
MenuButton,
|
|
128
|
+
HoverCard, Menubar
|
|
118
129
|
} from './components/overlay-primitives.js';
|
|
119
130
|
|
|
120
131
|
export {
|
|
@@ -129,3 +140,8 @@ export {
|
|
|
129
140
|
} from './components/freddie/runtime.js';
|
|
130
141
|
|
|
131
142
|
export { mountCommunityApp } from './community-app.js';
|
|
143
|
+
|
|
144
|
+
export {
|
|
145
|
+
Calendar, DatePicker, DateRangePicker,
|
|
146
|
+
WEEKDAY_LABELS, buildMonthGrid, formatDate, monthLabel
|
|
147
|
+
} from './components/calendar.js';
|
|
@@ -74,6 +74,22 @@ button, input, select, textarea { font: inherit; }
|
|
|
74
74
|
white-space: nowrap;
|
|
75
75
|
border: 0;
|
|
76
76
|
}
|
|
77
|
+
|
|
78
|
+
/* .ds-aspect — generic aspect-ratio utility. Native `aspect-ratio` property
|
|
79
|
+
(broadly supported for years) rather than the padding-bottom hack: no
|
|
80
|
+
extra wrapper markup, no absolutely-positioned inner layer needed just to
|
|
81
|
+
fill the box. `--aspect` defaults to 16/9; a caller overrides it inline
|
|
82
|
+
(e.g. style="--aspect:1/1") or via a ratio-named modifier class below. */
|
|
83
|
+
.ds-aspect {
|
|
84
|
+
aspect-ratio: var(--aspect, 16 / 9);
|
|
85
|
+
width: 100%;
|
|
86
|
+
overflow: hidden;
|
|
87
|
+
}
|
|
88
|
+
.ds-aspect > * { width: 100%; height: 100%; object-fit: cover; display: block; }
|
|
89
|
+
.ds-aspect-square { --aspect: 1 / 1; }
|
|
90
|
+
.ds-aspect-video { --aspect: 16 / 9; }
|
|
91
|
+
.ds-aspect-portrait { --aspect: 3 / 4; }
|
|
92
|
+
|
|
77
93
|
body {
|
|
78
94
|
background: var(--bg);
|
|
79
95
|
color: var(--fg);
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/* ============================================================
|
|
2
|
+
Calendar / DatePicker / DateRangePicker — month date-grid
|
|
3
|
+
primitive plus its trigger+popover shells. Tokens only: no raw
|
|
4
|
+
color/radius/z-index literal anywhere below (lint-tokens /
|
|
5
|
+
lint-radius / lint-zindex hard gates).
|
|
6
|
+
============================================================ */
|
|
7
|
+
.ds-cal {
|
|
8
|
+
display: flex;
|
|
9
|
+
flex-direction: column;
|
|
10
|
+
gap: var(--space-2);
|
|
11
|
+
padding: var(--space-2);
|
|
12
|
+
width: max-content;
|
|
13
|
+
min-width: 264px;
|
|
14
|
+
}
|
|
15
|
+
.ds-cal-head {
|
|
16
|
+
display: flex;
|
|
17
|
+
align-items: center;
|
|
18
|
+
justify-content: space-between;
|
|
19
|
+
gap: var(--space-2);
|
|
20
|
+
}
|
|
21
|
+
.ds-cal-title {
|
|
22
|
+
font-size: var(--fs-sm);
|
|
23
|
+
font-weight: 600;
|
|
24
|
+
color: var(--fg);
|
|
25
|
+
text-align: center;
|
|
26
|
+
flex: 1;
|
|
27
|
+
}
|
|
28
|
+
.ds-cal-nav {
|
|
29
|
+
display: inline-flex;
|
|
30
|
+
align-items: center;
|
|
31
|
+
justify-content: center;
|
|
32
|
+
width: 28px;
|
|
33
|
+
height: 28px;
|
|
34
|
+
border: 0;
|
|
35
|
+
border-radius: var(--r-1);
|
|
36
|
+
background: transparent;
|
|
37
|
+
color: var(--fg-3);
|
|
38
|
+
cursor: pointer;
|
|
39
|
+
transition: background-color var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
|
|
40
|
+
}
|
|
41
|
+
.ds-cal-nav:hover { background: var(--bg-2); color: var(--fg); }
|
|
42
|
+
.ds-cal-nav:focus-visible { box-shadow: var(--focus-ring-inset); outline: none; }
|
|
43
|
+
.ds-cal-nav:active { transform: translateY(1px); }
|
|
44
|
+
|
|
45
|
+
.ds-cal-weekdays {
|
|
46
|
+
display: grid;
|
|
47
|
+
grid-template-columns: repeat(7, 1fr);
|
|
48
|
+
gap: var(--space-1);
|
|
49
|
+
}
|
|
50
|
+
.ds-cal-weekday-label {
|
|
51
|
+
font-size: var(--fs-micro);
|
|
52
|
+
font-weight: 600;
|
|
53
|
+
letter-spacing: var(--tr-caps);
|
|
54
|
+
text-transform: uppercase;
|
|
55
|
+
color: var(--fg-3);
|
|
56
|
+
text-align: center;
|
|
57
|
+
padding-block: var(--space-1);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.ds-cal-grid {
|
|
61
|
+
display: grid;
|
|
62
|
+
grid-template-columns: repeat(7, 1fr);
|
|
63
|
+
gap: var(--space-1);
|
|
64
|
+
}
|
|
65
|
+
.ds-cal-day {
|
|
66
|
+
position: relative;
|
|
67
|
+
display: inline-flex;
|
|
68
|
+
align-items: center;
|
|
69
|
+
justify-content: center;
|
|
70
|
+
width: 32px;
|
|
71
|
+
height: 32px;
|
|
72
|
+
border: 0;
|
|
73
|
+
border-radius: var(--r-1);
|
|
74
|
+
background: transparent;
|
|
75
|
+
color: var(--fg);
|
|
76
|
+
font-size: var(--fs-sm);
|
|
77
|
+
font-variant-numeric: tabular-nums;
|
|
78
|
+
cursor: pointer;
|
|
79
|
+
transition: background-color var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
|
|
80
|
+
}
|
|
81
|
+
.ds-cal-day:hover { background: var(--bg-2); }
|
|
82
|
+
.ds-cal-day:focus-visible { box-shadow: var(--focus-ring-inset); outline: none; }
|
|
83
|
+
.ds-cal-day-outside { color: var(--fg-3); opacity: 0.55; }
|
|
84
|
+
.ds-cal-day-today { font-weight: 700; box-shadow: inset 0 0 0 var(--bw-hair) var(--rule-strong); }
|
|
85
|
+
.ds-cal-day-selected {
|
|
86
|
+
background: var(--accent);
|
|
87
|
+
color: var(--accent-fg);
|
|
88
|
+
font-weight: 600;
|
|
89
|
+
}
|
|
90
|
+
.ds-cal-day-selected:hover { background: var(--accent); }
|
|
91
|
+
.ds-cal-day-in-range {
|
|
92
|
+
background: var(--accent-tint);
|
|
93
|
+
border-radius: var(--r-0);
|
|
94
|
+
}
|
|
95
|
+
.ds-cal-day-range-start { border-radius: var(--r-1) var(--r-0) var(--r-0) var(--r-1); }
|
|
96
|
+
.ds-cal-day-range-end { border-radius: var(--r-0) var(--r-1) var(--r-1) var(--r-0); }
|
|
97
|
+
.ds-cal-day-disabled {
|
|
98
|
+
color: var(--fg-3);
|
|
99
|
+
opacity: 0.35;
|
|
100
|
+
cursor: not-allowed;
|
|
101
|
+
pointer-events: none;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@media (prefers-reduced-motion: reduce) {
|
|
105
|
+
.ds-cal-nav, .ds-cal-day { transition: none; }
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* -- DatePicker / DateRangePicker trigger -------------------------------- */
|
|
109
|
+
.ds-dp { display: inline-flex; position: relative; }
|
|
110
|
+
.ds-dp-trigger {
|
|
111
|
+
display: inline-flex;
|
|
112
|
+
align-items: center;
|
|
113
|
+
gap: var(--space-1-5);
|
|
114
|
+
min-height: 32px;
|
|
115
|
+
padding: var(--space-1-5) var(--space-2-5);
|
|
116
|
+
border: 0;
|
|
117
|
+
border-radius: var(--r-2);
|
|
118
|
+
background: var(--bg-2);
|
|
119
|
+
color: var(--fg);
|
|
120
|
+
font-family: inherit;
|
|
121
|
+
font-size: var(--fs-sm);
|
|
122
|
+
cursor: pointer;
|
|
123
|
+
transition: background-color var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
|
|
124
|
+
}
|
|
125
|
+
.ds-dp-trigger:hover { background: var(--bg-3); }
|
|
126
|
+
.ds-dp-trigger:focus-visible { box-shadow: var(--focus-ring-inset); outline: none; }
|
|
127
|
+
.ds-dp-trigger-label { white-space: nowrap; }
|
|
128
|
+
|
|
129
|
+
@media (prefers-reduced-motion: reduce) {
|
|
130
|
+
.ds-dp-trigger { transition: none; }
|
|
131
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/* ============================================================
|
|
2
|
+
Carousel — horizontal (or vertical) scroll-snap content carousel
|
|
3
|
+
============================================================ */
|
|
4
|
+
.ds-carousel {
|
|
5
|
+
display: flex;
|
|
6
|
+
align-items: center;
|
|
7
|
+
gap: var(--space-2);
|
|
8
|
+
}
|
|
9
|
+
.ds-carousel--vertical { flex-direction: column; }
|
|
10
|
+
|
|
11
|
+
.ds-carousel-track {
|
|
12
|
+
display: flex;
|
|
13
|
+
flex: 1 1 auto;
|
|
14
|
+
gap: var(--space-3);
|
|
15
|
+
overflow-x: auto;
|
|
16
|
+
overflow-y: hidden;
|
|
17
|
+
scroll-snap-type: x mandatory;
|
|
18
|
+
scroll-behavior: smooth;
|
|
19
|
+
-webkit-overflow-scrolling: touch;
|
|
20
|
+
}
|
|
21
|
+
.ds-carousel-track--vertical {
|
|
22
|
+
flex-direction: column;
|
|
23
|
+
overflow-x: hidden;
|
|
24
|
+
overflow-y: auto;
|
|
25
|
+
scroll-snap-type: y mandatory;
|
|
26
|
+
max-height: 480px;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.ds-carousel-item {
|
|
30
|
+
flex: 0 0 auto;
|
|
31
|
+
scroll-snap-align: start;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.ds-carousel-prev,
|
|
35
|
+
.ds-carousel-next {
|
|
36
|
+
flex: 0 0 auto;
|
|
37
|
+
border-radius: var(--r-pill);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@media (prefers-reduced-motion: reduce) {
|
|
41
|
+
.ds-carousel-track {
|
|
42
|
+
scroll-behavior: auto;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
pointer-events: none;
|
|
45
45
|
}
|
|
46
46
|
.chat-empty-title { font-size: var(--fs-sm); margin: 0 0 var(--space-1); }
|
|
47
|
-
.chat-empty-sub { font-size: var(--fs-tiny); margin: 0; opacity: .7;
|
|
47
|
+
.chat-empty-sub { font-size: var(--fs-tiny); margin: 0; opacity: .82; } /* WCAG-verified 2026 restyle: .7 blended --fg-3 to 3.72:1 on dark --bg (#1a1a1a); .82 clears 4.53:1 */
|
|
48
48
|
|
|
49
49
|
.chat-msg { display: flex; gap: var(--space-2-75); align-items: flex-start; padding: var(--space-1-75) 0; position: relative; min-width: 0; }
|
|
50
50
|
.chat-msg.you { flex-direction: row-reverse; }
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/* collab.css — LiveCursorOverlay / RemoteSelectionRings /
|
|
2
|
+
RecentEditHighlightFlash / AgentPresenceChip / PresenceBar. Real-time
|
|
3
|
+
multiplayer co-editing UI: remote pointers, selection rings, edit flashes,
|
|
4
|
+
and a generalized collaborator presence chip row. `ds-collab-*` prefix,
|
|
5
|
+
distinct from community.js's `cm-*` voice/member chips even though the
|
|
6
|
+
presence chip visual language matches. */
|
|
7
|
+
|
|
8
|
+
.ds-collab-cursor-overlay,
|
|
9
|
+
.ds-collab-selection-overlay,
|
|
10
|
+
.ds-collab-flash-overlay {
|
|
11
|
+
position: absolute;
|
|
12
|
+
inset: 0;
|
|
13
|
+
pointer-events: none;
|
|
14
|
+
z-index: var(--z-raised);
|
|
15
|
+
overflow: hidden;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* ---- LiveCursorOverlay -------------------------------------------------- */
|
|
19
|
+
.ds-collab-cursor {
|
|
20
|
+
position: absolute;
|
|
21
|
+
display: flex;
|
|
22
|
+
align-items: flex-start;
|
|
23
|
+
gap: var(--space-1);
|
|
24
|
+
transform: translate(-2px, -2px);
|
|
25
|
+
}
|
|
26
|
+
.ds-collab-cursor svg { filter: drop-shadow(0 1px 1px color-mix(in oklab, var(--ink) 30%, transparent)); }
|
|
27
|
+
.ds-collab-cursor-label {
|
|
28
|
+
font-size: var(--fs-pico);
|
|
29
|
+
font-weight: 600;
|
|
30
|
+
line-height: 1.6;
|
|
31
|
+
padding: 0 var(--space-1);
|
|
32
|
+
border-radius: var(--r-hair);
|
|
33
|
+
color: var(--on-color);
|
|
34
|
+
white-space: nowrap;
|
|
35
|
+
transform: translateY(2px);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* ---- RemoteSelectionRings ------------------------------------------------ */
|
|
39
|
+
.ds-collab-selection-ring {
|
|
40
|
+
position: absolute;
|
|
41
|
+
border: var(--bw-hair) solid var(--ring-color, var(--accent));
|
|
42
|
+
background: color-mix(in oklab, var(--ring-color, var(--accent)) 14%, transparent);
|
|
43
|
+
border-radius: var(--r-hair);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* ---- RecentEditHighlightFlash -------------------------------------------
|
|
47
|
+
Reduced-motion users get an instant flash with no animation (the fade-out
|
|
48
|
+
keyframe lives only inside the no-preference query) rather than a fade. */
|
|
49
|
+
.ds-collab-flash {
|
|
50
|
+
position: absolute;
|
|
51
|
+
background: color-mix(in oklab, var(--flash-color, var(--accent)) 35%, transparent);
|
|
52
|
+
border-radius: var(--r-hair);
|
|
53
|
+
}
|
|
54
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
55
|
+
.ds-collab-flash { animation: ds-collab-flash-fade var(--dur-reveal) var(--ease-exit) forwards; }
|
|
56
|
+
@keyframes ds-collab-flash-fade {
|
|
57
|
+
from { opacity: 1; }
|
|
58
|
+
to { opacity: 0; }
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
@media (prefers-reduced-motion: reduce) {
|
|
62
|
+
.ds-collab-flash { opacity: 1; }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/* ---- AgentPresenceChip / PresenceBar -------------------------------------
|
|
66
|
+
Visual language matches community.js's cm-voice-user/cm-member-item chips
|
|
67
|
+
(avatar circle + --avatar-bg custom property + initial + name), reused
|
|
68
|
+
here under a distinct prefix since this is a different feature. */
|
|
69
|
+
.ds-collab-bar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); }
|
|
70
|
+
.ds-collab-bar-empty { color: var(--fg-3); font-size: var(--fs-sm); padding: var(--space-2) 0; }
|
|
71
|
+
.ds-collab-chip {
|
|
72
|
+
display: inline-flex;
|
|
73
|
+
align-items: center;
|
|
74
|
+
gap: var(--space-1-75);
|
|
75
|
+
padding: var(--space-1) var(--space-2-5) var(--space-1) var(--space-1);
|
|
76
|
+
border-radius: var(--r-pill);
|
|
77
|
+
background: var(--bg-2);
|
|
78
|
+
}
|
|
79
|
+
.ds-collab-chip-avatar {
|
|
80
|
+
position: relative;
|
|
81
|
+
width: 24px;
|
|
82
|
+
height: 24px;
|
|
83
|
+
border-radius: 50%;
|
|
84
|
+
background: var(--avatar-bg, var(--bg-3));
|
|
85
|
+
color: var(--fg-2);
|
|
86
|
+
display: inline-flex;
|
|
87
|
+
align-items: center;
|
|
88
|
+
justify-content: center;
|
|
89
|
+
font-size: var(--fs-pico);
|
|
90
|
+
font-weight: 600;
|
|
91
|
+
flex-shrink: 0;
|
|
92
|
+
}
|
|
93
|
+
.ds-collab-chip-status {
|
|
94
|
+
position: absolute;
|
|
95
|
+
right: -1px;
|
|
96
|
+
bottom: -1px;
|
|
97
|
+
width: 8px;
|
|
98
|
+
height: 8px;
|
|
99
|
+
border-radius: 50%;
|
|
100
|
+
border: var(--bw-hair) solid var(--bg-2);
|
|
101
|
+
background: var(--fg-3);
|
|
102
|
+
}
|
|
103
|
+
.ds-collab-chip-status-active { background: var(--green-2); }
|
|
104
|
+
.ds-collab-chip-status-idle { background: var(--sun); }
|
|
105
|
+
.ds-collab-chip-status-offline { background: var(--fg-3); }
|
|
106
|
+
.ds-collab-chip-name { font-size: var(--fs-tiny); color: var(--fg-2); white-space: nowrap; }
|
|
@@ -1,36 +1,42 @@
|
|
|
1
1
|
/* ============================================================
|
|
2
2
|
Hero
|
|
3
3
|
============================================================ */
|
|
4
|
-
/*
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
/* RESTYLED 2026 (webjsx-toolkit look): centered-stack hero, replacing the
|
|
5
|
+
prior asymmetric two-column editorial grid (title-wide / body+aside-offset)
|
|
6
|
+
per a deliberate house-rule reversal -- shadcn/webjsx-toolkit itself has no
|
|
7
|
+
asymmetric-grid opinion, and the prior "no centered stack, ever" rule was
|
|
8
|
+
specific to the retired Acid Editorial identity. All child classes/markup
|
|
9
|
+
are UNCHANGED (no JS component edit needed) -- only the grid arrangement
|
|
10
|
+
and each part's own layout (aside becomes a full-width card below the body
|
|
11
|
+
instead of a right-column card) changed. Centered text, capped measure. */
|
|
7
12
|
.ds-hero {
|
|
8
13
|
padding: var(--space-9) 0 var(--space-8);
|
|
9
|
-
display:
|
|
10
|
-
|
|
11
|
-
grid-template-areas: 'title title' 'body aside';
|
|
12
|
-
align-items: start;
|
|
14
|
+
display: flex; flex-direction: column; align-items: center;
|
|
15
|
+
gap: var(--space-5);
|
|
13
16
|
max-width: var(--stage-wide);
|
|
17
|
+
text-align: center;
|
|
14
18
|
position: relative; isolation: isolate;
|
|
15
19
|
}
|
|
16
|
-
.ds-hero-head {
|
|
17
|
-
.ds-hero-body {
|
|
18
|
-
/* The
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
.ds-hero-head { display: grid; gap: var(--space-3); justify-items: center; }
|
|
21
|
+
.ds-hero-body { margin-inline: auto; }
|
|
22
|
+
/* The stat/badge/CTA cluster now sits as a full-width card BELOW the body
|
|
23
|
+
copy, centered, rather than a right-offset column -- still carries its own
|
|
24
|
+
visual weight via the top accent bar (rotated from the former left spine)
|
|
25
|
+
so it still reads as a deliberate block, not an afterthought. */
|
|
22
26
|
.ds-hero-aside {
|
|
23
|
-
|
|
24
|
-
|
|
27
|
+
position: relative; isolation: isolate;
|
|
28
|
+
width: 100%; max-width: 46ch;
|
|
29
|
+
display: flex; flex-direction: column;
|
|
25
30
|
justify-content: space-between; gap: var(--space-5);
|
|
26
31
|
background: var(--bg-2);
|
|
27
|
-
border-radius:
|
|
28
|
-
padding: var(--space-
|
|
32
|
+
border-radius: var(--r-2);
|
|
33
|
+
padding: calc(var(--space-4) + var(--bw-chunk)) var(--space-5) var(--space-5);
|
|
34
|
+
text-align: left;
|
|
29
35
|
}
|
|
30
36
|
.ds-hero-aside::before {
|
|
31
|
-
content: ''; position: absolute; left: 0;
|
|
32
|
-
|
|
33
|
-
border-radius: var(--bw-chunk)
|
|
37
|
+
content: ''; position: absolute; left: 0; right: 0; top: 0;
|
|
38
|
+
height: var(--bw-chunk); background: var(--accent);
|
|
39
|
+
border-radius: var(--bw-chunk) var(--bw-chunk) 0 0;
|
|
34
40
|
}
|
|
35
41
|
.ds-hero-stats { display: flex; flex-direction: column; gap: var(--space-2); }
|
|
36
42
|
.ds-hero-stat {
|
|
@@ -48,35 +54,25 @@
|
|
|
48
54
|
Snapping to either changes the hero's whole optical weight. */
|
|
49
55
|
font-size: clamp(40px, 9cqi, 116px);
|
|
50
56
|
line-height: 0.96; letter-spacing: var(--tr-tighter);
|
|
51
|
-
margin: 0; max-width:
|
|
57
|
+
margin: 0 auto; max-width: 20ch; text-wrap: balance;
|
|
52
58
|
}
|
|
53
59
|
.ds-hero-body {
|
|
54
60
|
font-family: var(--ff-body); font-size: var(--fs-xl);
|
|
55
|
-
line-height: 1.45; margin: 0; max-width: 46ch;
|
|
61
|
+
line-height: 1.45; margin: 0 auto; max-width: 46ch;
|
|
56
62
|
color: var(--fg-2);
|
|
57
63
|
}
|
|
58
64
|
/* The lead phrase in the title — printed in the electric lead, not glowing. */
|
|
59
65
|
.ds-hero-accent { color: var(--accent-ink); font-weight: 700; }
|
|
60
66
|
.ds-hero-actions {
|
|
61
67
|
display: flex; gap: var(--space-2, 10px); flex-wrap: wrap;
|
|
62
|
-
|
|
68
|
+
justify-content: center; margin-top: var(--space-hair, 4px);
|
|
63
69
|
}
|
|
64
|
-
/*
|
|
65
|
-
|
|
66
|
-
no
|
|
70
|
+
/* Below this width the aside card's own internal rhythm (stat rows still
|
|
71
|
+
stacked vertically at full width) is already correct for a narrow column —
|
|
72
|
+
no separate breakpoint override needed now that .ds-hero is always a
|
|
73
|
+
single-column centered stack at every width. */
|
|
67
74
|
@container (max-width: 900px) {
|
|
68
|
-
.ds-hero {
|
|
69
|
-
grid-template-columns: minmax(0, 1fr);
|
|
70
|
-
grid-template-areas: 'title' 'body' 'aside';
|
|
71
|
-
align-items: start;
|
|
72
|
-
padding: var(--space-7) 0 var(--space-6);
|
|
73
|
-
}
|
|
74
|
-
.ds-hero-aside {
|
|
75
|
-
border-radius: var(--r-2); flex-direction: row; flex-wrap: wrap;
|
|
76
|
-
justify-content: flex-start; align-items: center;
|
|
77
|
-
}
|
|
78
|
-
.ds-hero-stats { flex-direction: row; flex-wrap: wrap; }
|
|
79
|
-
.ds-hero-stat { border-bottom: 0; padding-bottom: 0; }
|
|
75
|
+
.ds-hero { padding: var(--space-7) 0 var(--space-6); }
|
|
80
76
|
}
|
|
81
77
|
.ds-chat-title { margin: 0; font-size: inherit; }
|
|
82
78
|
|
|
@@ -549,7 +549,7 @@
|
|
|
549
549
|
draws, applied to a surface that never follows the theme. */
|
|
550
550
|
.ds-cli-cmt .cmd { color: var(--paper-3-dark); }
|
|
551
551
|
.ds-cli-out .cmd { color: var(--paper-2); }
|
|
552
|
-
.ds-cli-ok .prompt, .ds-cli-ok .cmd { color: var(--
|
|
552
|
+
.ds-cli-ok .prompt, .ds-cli-ok .cmd { color: var(--success-on-ink); } /* WCAG-verified 2026 restyle: --acid alone is now a dark neutral and fails on this always-dark .cli surface (npm run a11y) */
|
|
553
553
|
.ds-cli-warn .prompt, .ds-cli-warn .cmd { color: var(--mascot-on-ink); }
|
|
554
554
|
.ds-cli-log .prompt { color: var(--paper-3-dark); }
|
|
555
555
|
.ds-cli-log .cmd { color: var(--paper-2); font-family: var(--ff-mono); }
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/* ============================================================
|
|
2
|
+
InputOTP — segmented PIN / one-time-code entry
|
|
3
|
+
============================================================ */
|
|
4
|
+
.ds-otp { display: inline-flex; gap: var(--space-2); }
|
|
5
|
+
.ds-otp-box {
|
|
6
|
+
width: var(--ctl-md); height: var(--ctl-md);
|
|
7
|
+
text-align: center;
|
|
8
|
+
font-family: var(--ff-mono);
|
|
9
|
+
font-size: var(--fs-lg);
|
|
10
|
+
font-weight: 600;
|
|
11
|
+
color: var(--fg);
|
|
12
|
+
background: var(--bg-2);
|
|
13
|
+
border: var(--bw-rule) solid var(--rule);
|
|
14
|
+
border-radius: var(--r-1);
|
|
15
|
+
transition: border-color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease), box-shadow var(--dur-snap) var(--ease);
|
|
16
|
+
}
|
|
17
|
+
.ds-otp-box:focus-visible {
|
|
18
|
+
outline: none;
|
|
19
|
+
border-color: var(--accent);
|
|
20
|
+
box-shadow: 0 0 0 3px color-mix(in oklab, var(--accent) 40%, transparent);
|
|
21
|
+
}
|
|
22
|
+
.ds-otp-box-filled { border-color: var(--rule-strong); background: var(--bg-3); }
|
|
23
|
+
.ds-otp-box-error { border-color: var(--red); }
|
|
24
|
+
.ds-otp-box-error:focus-visible { box-shadow: 0 0 0 3px color-mix(in oklab, var(--red) 40%, transparent); }
|
|
25
|
+
.ds-otp-box:disabled { opacity: 0.5; cursor: default; }
|
|
26
|
+
|
|
27
|
+
@media (prefers-reduced-motion: reduce) {
|
|
28
|
+
.ds-otp-box {
|
|
29
|
+
transition: none !important;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/* ============================================================
|
|
2
|
+
Slider — generic single-value range input
|
|
3
|
+
Same overlay approach as .vx-vad-range (community.css): a real, fully
|
|
4
|
+
transparent <input type="range"> sits on top of a custom track/fill/thumb
|
|
5
|
+
so no browser's native thumb chrome ever paints, while pointer/keyboard/
|
|
6
|
+
a11y semantics stay on the real input underneath.
|
|
7
|
+
============================================================ */
|
|
8
|
+
.ds-slider { display: flex; flex-direction: column; gap: var(--space-1); width: 100%; }
|
|
9
|
+
.ds-slider.is-disabled { opacity: 0.5; pointer-events: none; }
|
|
10
|
+
.ds-slider-track {
|
|
11
|
+
position: relative;
|
|
12
|
+
height: 12px;
|
|
13
|
+
margin: var(--space-2) 0;
|
|
14
|
+
border-radius: var(--r-pill);
|
|
15
|
+
background: var(--bg-3);
|
|
16
|
+
overflow: visible;
|
|
17
|
+
}
|
|
18
|
+
.ds-slider-fill {
|
|
19
|
+
position: absolute; left: 0; top: 0; bottom: 0;
|
|
20
|
+
width: calc(var(--ds-slider-pct, 0) * 1%);
|
|
21
|
+
border-radius: var(--r-pill);
|
|
22
|
+
background: var(--accent);
|
|
23
|
+
transition: width var(--dur-snap) linear;
|
|
24
|
+
}
|
|
25
|
+
.ds-slider-thumb {
|
|
26
|
+
position: absolute; top: 50%; left: calc(var(--ds-slider-pct, 0) * 1%);
|
|
27
|
+
width: 18px; height: 18px;
|
|
28
|
+
border-radius: var(--r-pill);
|
|
29
|
+
background: var(--bg-1);
|
|
30
|
+
border: var(--bw-rule) solid var(--accent);
|
|
31
|
+
box-shadow: var(--shadow-1);
|
|
32
|
+
transform: translate(-50%, -50%);
|
|
33
|
+
pointer-events: none;
|
|
34
|
+
transition: box-shadow var(--dur-snap) var(--ease);
|
|
35
|
+
}
|
|
36
|
+
.ds-slider-range {
|
|
37
|
+
position: absolute; inset: 0;
|
|
38
|
+
width: 100%; height: 100%;
|
|
39
|
+
margin: 0; opacity: 0;
|
|
40
|
+
cursor: pointer;
|
|
41
|
+
}
|
|
42
|
+
.ds-slider-range:focus-visible ~ .ds-slider-thumb,
|
|
43
|
+
.ds-slider-track:has(.ds-slider-range:focus-visible) .ds-slider-thumb {
|
|
44
|
+
box-shadow: 0 0 0 3px color-mix(in oklab, var(--accent) 40%, transparent), var(--shadow-1);
|
|
45
|
+
}
|
|
46
|
+
.ds-slider-range:disabled { cursor: default; }
|
|
47
|
+
|
|
48
|
+
@media (prefers-reduced-motion: reduce) {
|
|
49
|
+
.ds-slider-fill,
|
|
50
|
+
.ds-slider-thumb {
|
|
51
|
+
transition: none !important;
|
|
52
|
+
}
|
|
53
|
+
}
|