@xenosystem/blocks 0.11.2 → 0.11.4
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/dist/edit/index.d.ts +10 -3
- package/dist/edit/index.js +262 -886
- package/package.json +3 -3
package/dist/edit/index.js
CHANGED
|
@@ -3038,270 +3038,7 @@ var InspectorPanelController = class {
|
|
|
3038
3038
|
|
|
3039
3039
|
// src/edit/inspector/react/InspectorPanelView.tsx
|
|
3040
3040
|
import { useCallback as useCallback3, useSyncExternalStore as useSyncExternalStore2 } from "react";
|
|
3041
|
-
|
|
3042
|
-
// src/edit/inspector/react/styles.ts
|
|
3043
|
-
var S2 = {
|
|
3044
|
-
// ── Shell ──────────────────────────────────────────────────────────────────
|
|
3045
|
-
root: {
|
|
3046
|
-
display: "flex",
|
|
3047
|
-
flexDirection: "column",
|
|
3048
|
-
height: "100%",
|
|
3049
|
-
minHeight: 0,
|
|
3050
|
-
fontSize: 11,
|
|
3051
|
-
color: "var(--xeno-text)",
|
|
3052
|
-
background: "var(--xeno-canvas)"
|
|
3053
|
-
},
|
|
3054
|
-
header: {
|
|
3055
|
-
display: "flex",
|
|
3056
|
-
alignItems: "center",
|
|
3057
|
-
gap: 6,
|
|
3058
|
-
padding: "4px 6px",
|
|
3059
|
-
background: "var(--xeno-panel-header)",
|
|
3060
|
-
flex: "0 0 auto"
|
|
3061
|
-
},
|
|
3062
|
-
search: {
|
|
3063
|
-
flex: "1 1 auto",
|
|
3064
|
-
minWidth: 0,
|
|
3065
|
-
height: 18,
|
|
3066
|
-
background: "var(--xeno-canvas)",
|
|
3067
|
-
color: "inherit",
|
|
3068
|
-
border: "1px solid var(--xeno-border)",
|
|
3069
|
-
borderRadius: 2,
|
|
3070
|
-
fontSize: 11,
|
|
3071
|
-
padding: "0 6px",
|
|
3072
|
-
outline: "none"
|
|
3073
|
-
},
|
|
3074
|
-
targetChip: {
|
|
3075
|
-
fontSize: 9,
|
|
3076
|
-
color: "var(--xeno-muted)",
|
|
3077
|
-
whiteSpace: "nowrap",
|
|
3078
|
-
flex: "0 0 auto"
|
|
3079
|
-
},
|
|
3080
|
-
banner: {
|
|
3081
|
-
padding: "3px 6px",
|
|
3082
|
-
fontSize: 9,
|
|
3083
|
-
color: "var(--xeno-muted)",
|
|
3084
|
-
background: "var(--xeno-border-subtle)",
|
|
3085
|
-
flex: "0 0 auto"
|
|
3086
|
-
},
|
|
3087
|
-
scroll: { flex: "1 1 auto", minHeight: 0, overflowY: "auto", overflowX: "hidden", outline: "none" },
|
|
3088
|
-
empty: { padding: 12, fontSize: 10, opacity: 0.4, textTransform: "uppercase", letterSpacing: "0.08em" },
|
|
3089
|
-
// ── Section ────────────────────────────────────────────────────────────────
|
|
3090
|
-
sectionHeader: {
|
|
3091
|
-
display: "flex",
|
|
3092
|
-
alignItems: "center",
|
|
3093
|
-
gap: 4,
|
|
3094
|
-
height: 20,
|
|
3095
|
-
padding: "0 6px",
|
|
3096
|
-
background: "var(--xeno-border-subtle)",
|
|
3097
|
-
cursor: "default",
|
|
3098
|
-
userSelect: "none"
|
|
3099
|
-
},
|
|
3100
|
-
sectionTitle: {
|
|
3101
|
-
fontSize: 9,
|
|
3102
|
-
fontWeight: 600,
|
|
3103
|
-
letterSpacing: "0.06em",
|
|
3104
|
-
textTransform: "uppercase",
|
|
3105
|
-
color: "var(--xeno-muted)",
|
|
3106
|
-
flex: "1 1 auto",
|
|
3107
|
-
minWidth: 0,
|
|
3108
|
-
overflow: "hidden",
|
|
3109
|
-
textOverflow: "ellipsis",
|
|
3110
|
-
whiteSpace: "nowrap"
|
|
3111
|
-
},
|
|
3112
|
-
sectionBadge: {
|
|
3113
|
-
fontSize: 8,
|
|
3114
|
-
padding: "0 3px",
|
|
3115
|
-
height: 12,
|
|
3116
|
-
lineHeight: "12px",
|
|
3117
|
-
borderRadius: 2,
|
|
3118
|
-
background: "var(--xeno-border)",
|
|
3119
|
-
color: "var(--xeno-muted)",
|
|
3120
|
-
flex: "0 0 auto"
|
|
3121
|
-
},
|
|
3122
|
-
sectionBody: { padding: "3px 0" },
|
|
3123
|
-
sectionBodyOff: { opacity: 0.4, pointerEvents: "none" },
|
|
3124
|
-
emptyHint: { padding: "4px 8px", fontSize: 10, color: "var(--xeno-muted)" },
|
|
3125
|
-
// ── Field row ──────────────────────────────────────────────────────────────
|
|
3126
|
-
fieldRow: {
|
|
3127
|
-
display: "flex",
|
|
3128
|
-
alignItems: "center",
|
|
3129
|
-
gap: 4,
|
|
3130
|
-
minHeight: 20,
|
|
3131
|
-
padding: "1px 6px",
|
|
3132
|
-
boxSizing: "border-box"
|
|
3133
|
-
},
|
|
3134
|
-
fieldRowFocused: { background: "var(--xeno-border-subtle)" },
|
|
3135
|
-
fieldLabel: {
|
|
3136
|
-
fontSize: 10,
|
|
3137
|
-
color: "var(--xeno-muted)",
|
|
3138
|
-
flex: "0 0 auto",
|
|
3139
|
-
overflow: "hidden",
|
|
3140
|
-
textOverflow: "ellipsis",
|
|
3141
|
-
whiteSpace: "nowrap"
|
|
3142
|
-
},
|
|
3143
|
-
fieldControl: { flex: "1 1 auto", minWidth: 0, display: "flex", alignItems: "center", gap: 3 },
|
|
3144
|
-
description: { fontSize: 9, color: "var(--xeno-muted)", opacity: 0.8, padding: "0 6px 3px" },
|
|
3145
|
-
// ── Inputs ─────────────────────────────────────────────────────────────────
|
|
3146
|
-
input: {
|
|
3147
|
-
width: "100%",
|
|
3148
|
-
minWidth: 0,
|
|
3149
|
-
height: 18,
|
|
3150
|
-
background: "var(--xeno-canvas)",
|
|
3151
|
-
color: "inherit",
|
|
3152
|
-
border: "1px solid var(--xeno-border)",
|
|
3153
|
-
borderRadius: 2,
|
|
3154
|
-
fontSize: 11,
|
|
3155
|
-
padding: "0 4px",
|
|
3156
|
-
outline: "none",
|
|
3157
|
-
fontVariantNumeric: "tabular-nums",
|
|
3158
|
-
boxSizing: "border-box"
|
|
3159
|
-
},
|
|
3160
|
-
mixedInput: { fontStyle: "italic", color: "var(--xeno-muted)" },
|
|
3161
|
-
readOnlyInput: { background: "transparent", border: "1px solid transparent", cursor: "default" },
|
|
3162
|
-
textarea: { height: "auto", minHeight: 34, padding: "3px 4px", resize: "vertical", lineHeight: 1.4 },
|
|
3163
|
-
mono: { fontFamily: "var(--xeno-font-mono)", fontSize: 10 },
|
|
3164
|
-
numberCell: { display: "flex", alignItems: "center", gap: 2, flex: "1 1 0", minWidth: 0, position: "relative" },
|
|
3165
|
-
axisLabel: {
|
|
3166
|
-
fontSize: 9,
|
|
3167
|
-
color: "var(--xeno-muted)",
|
|
3168
|
-
width: 9,
|
|
3169
|
-
textAlign: "center",
|
|
3170
|
-
flex: "0 0 auto",
|
|
3171
|
-
userSelect: "none"
|
|
3172
|
-
},
|
|
3173
|
-
sliderTrack: {
|
|
3174
|
-
position: "absolute",
|
|
3175
|
-
left: 0,
|
|
3176
|
-
right: 0,
|
|
3177
|
-
bottom: 0,
|
|
3178
|
-
height: 1,
|
|
3179
|
-
background: "var(--xeno-border)",
|
|
3180
|
-
pointerEvents: "none"
|
|
3181
|
-
},
|
|
3182
|
-
sliderFill: { display: "block", height: "100%", background: "var(--xeno-active)" },
|
|
3183
|
-
vectorRow: { display: "flex", alignItems: "center", gap: 3, flex: "1 1 auto", minWidth: 0 },
|
|
3184
|
-
// ── Toggle (rectangle track + square knob) ─────────────────────────────────
|
|
3185
|
-
toggleTrack: {
|
|
3186
|
-
width: 22,
|
|
3187
|
-
height: 12,
|
|
3188
|
-
borderRadius: 2,
|
|
3189
|
-
border: "none",
|
|
3190
|
-
padding: 1,
|
|
3191
|
-
cursor: "pointer",
|
|
3192
|
-
flex: "0 0 auto",
|
|
3193
|
-
display: "flex",
|
|
3194
|
-
alignItems: "center"
|
|
3195
|
-
},
|
|
3196
|
-
toggleKnob: {
|
|
3197
|
-
width: 10,
|
|
3198
|
-
height: 10,
|
|
3199
|
-
background: "var(--xeno-text)",
|
|
3200
|
-
display: "block",
|
|
3201
|
-
transition: "transform 80ms ease, border-radius 80ms ease"
|
|
3202
|
-
},
|
|
3203
|
-
// ── Segmented ──────────────────────────────────────────────────────────────
|
|
3204
|
-
segmented: { display: "flex", gap: 1, flex: "1 1 auto", minWidth: 0 },
|
|
3205
|
-
segment: {
|
|
3206
|
-
flex: "1 1 0",
|
|
3207
|
-
minWidth: 0,
|
|
3208
|
-
height: 18,
|
|
3209
|
-
background: "var(--xeno-border-subtle)",
|
|
3210
|
-
color: "inherit",
|
|
3211
|
-
border: "none",
|
|
3212
|
-
borderRadius: 2,
|
|
3213
|
-
fontSize: 10,
|
|
3214
|
-
cursor: "pointer",
|
|
3215
|
-
padding: "0 4px",
|
|
3216
|
-
overflow: "hidden",
|
|
3217
|
-
textOverflow: "ellipsis",
|
|
3218
|
-
whiteSpace: "nowrap"
|
|
3219
|
-
},
|
|
3220
|
-
segmentActive: { background: "var(--xeno-control)" },
|
|
3221
|
-
// ── Color ──────────────────────────────────────────────────────────────────
|
|
3222
|
-
colorCell: {
|
|
3223
|
-
display: "flex",
|
|
3224
|
-
alignItems: "center",
|
|
3225
|
-
gap: 4,
|
|
3226
|
-
flex: "1 1 auto",
|
|
3227
|
-
minWidth: 0,
|
|
3228
|
-
height: 18,
|
|
3229
|
-
background: "var(--xeno-canvas)",
|
|
3230
|
-
border: "1px solid var(--xeno-border)",
|
|
3231
|
-
borderRadius: 2,
|
|
3232
|
-
padding: "0 4px",
|
|
3233
|
-
color: "inherit",
|
|
3234
|
-
cursor: "pointer"
|
|
3235
|
-
},
|
|
3236
|
-
swatch: { width: 10, height: 10, borderRadius: 2, flex: "0 0 auto" },
|
|
3237
|
-
colorText: { fontSize: 10, fontVariantNumeric: "tabular-nums", overflow: "hidden", textOverflow: "ellipsis" },
|
|
3238
|
-
// ── List ───────────────────────────────────────────────────────────────────
|
|
3239
|
-
list: { display: "flex", flexDirection: "column", gap: 2, flex: "1 1 auto", minWidth: 0 },
|
|
3240
|
-
listRow: { display: "flex", alignItems: "center", gap: 2 },
|
|
3241
|
-
listLabel: { flex: "1 1 auto", minWidth: 0, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", fontSize: 10 },
|
|
3242
|
-
infoValue: { fontSize: 10, color: "var(--xeno-text)", overflow: "hidden", textOverflow: "ellipsis" },
|
|
3243
|
-
// ── Chrome ─────────────────────────────────────────────────────────────────
|
|
3244
|
-
iconBtn: {
|
|
3245
|
-
display: "flex",
|
|
3246
|
-
alignItems: "center",
|
|
3247
|
-
justifyContent: "center",
|
|
3248
|
-
width: 14,
|
|
3249
|
-
height: 14,
|
|
3250
|
-
padding: 0,
|
|
3251
|
-
border: "none",
|
|
3252
|
-
borderRadius: 2,
|
|
3253
|
-
background: "transparent",
|
|
3254
|
-
color: "inherit",
|
|
3255
|
-
cursor: "pointer",
|
|
3256
|
-
flex: "0 0 auto"
|
|
3257
|
-
},
|
|
3258
|
-
miniBtn: {
|
|
3259
|
-
width: 14,
|
|
3260
|
-
height: 14,
|
|
3261
|
-
padding: 0,
|
|
3262
|
-
border: "none",
|
|
3263
|
-
borderRadius: 2,
|
|
3264
|
-
background: "var(--xeno-border-subtle)",
|
|
3265
|
-
color: "inherit",
|
|
3266
|
-
cursor: "pointer",
|
|
3267
|
-
fontSize: 9,
|
|
3268
|
-
flex: "0 0 auto"
|
|
3269
|
-
},
|
|
3270
|
-
textBtn: {
|
|
3271
|
-
background: "transparent",
|
|
3272
|
-
border: "none",
|
|
3273
|
-
color: "var(--xeno-muted)",
|
|
3274
|
-
cursor: "pointer",
|
|
3275
|
-
fontSize: 10,
|
|
3276
|
-
padding: 0,
|
|
3277
|
-
textAlign: "left"
|
|
3278
|
-
},
|
|
3279
|
-
chip: {
|
|
3280
|
-
fontSize: 8,
|
|
3281
|
-
padding: "0 3px",
|
|
3282
|
-
height: 12,
|
|
3283
|
-
lineHeight: "12px",
|
|
3284
|
-
borderRadius: 2,
|
|
3285
|
-
background: "var(--xeno-border-subtle)",
|
|
3286
|
-
color: "var(--xeno-muted)",
|
|
3287
|
-
flex: "0 0 auto"
|
|
3288
|
-
},
|
|
3289
|
-
tokenChip: {
|
|
3290
|
-
fontSize: 9,
|
|
3291
|
-
padding: "0 4px",
|
|
3292
|
-
height: 16,
|
|
3293
|
-
lineHeight: "16px",
|
|
3294
|
-
borderRadius: 2,
|
|
3295
|
-
background: "var(--xeno-border)",
|
|
3296
|
-
color: "inherit",
|
|
3297
|
-
flex: "1 1 auto",
|
|
3298
|
-
minWidth: 0,
|
|
3299
|
-
overflow: "hidden",
|
|
3300
|
-
textOverflow: "ellipsis",
|
|
3301
|
-
whiteSpace: "nowrap"
|
|
3302
|
-
},
|
|
3303
|
-
keyframeRow: { display: "flex", alignItems: "center", gap: 1, flex: "0 0 auto" }
|
|
3304
|
-
};
|
|
3041
|
+
import { Badge, Column, EmptyState, Field, FieldGroup, IconButton as IconButton2, ScrollArea, SearchField, Section, Select as Select2, Stack as Stack2, Text as Text2 } from "@xenosystem/components/chrome";
|
|
3305
3042
|
|
|
3306
3043
|
// src/edit/inspector/react/icons.tsx
|
|
3307
3044
|
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
@@ -3316,9 +3053,6 @@ var base2 = (size) => ({
|
|
|
3316
3053
|
strokeLinejoin: "round",
|
|
3317
3054
|
"aria-hidden": true
|
|
3318
3055
|
});
|
|
3319
|
-
function ChevronIcon2({ size = 11 }) {
|
|
3320
|
-
return /* @__PURE__ */ jsx4("svg", { ...base2(size), children: /* @__PURE__ */ jsx4("path", { d: "m9 18 6-6-6-6" }) });
|
|
3321
|
-
}
|
|
3322
3056
|
function StopwatchIcon({ size = 11 }) {
|
|
3323
3057
|
return /* @__PURE__ */ jsxs3("svg", { ...base2(size), children: [
|
|
3324
3058
|
/* @__PURE__ */ jsx4("path", { d: "M10 2h4" }),
|
|
@@ -3687,243 +3421,81 @@ function InspectorPanelView({ controller }) {
|
|
|
3687
3421
|
);
|
|
3688
3422
|
const multi = targets.length > 1;
|
|
3689
3423
|
const blocked = multi && !controller.canEditTargets();
|
|
3690
|
-
return /* @__PURE__ */ jsxs5(
|
|
3691
|
-
controller.isSearchShown()
|
|
3692
|
-
/* @__PURE__ */ jsx6(
|
|
3693
|
-
|
|
3694
|
-
|
|
3695
|
-
|
|
3696
|
-
|
|
3697
|
-
placeholder: "Search properties",
|
|
3698
|
-
onChange: (e) => controller.setFilter(e.target.value),
|
|
3699
|
-
style: S2.search,
|
|
3700
|
-
"aria-label": "Search properties",
|
|
3701
|
-
spellCheck: false
|
|
3702
|
-
}
|
|
3703
|
-
),
|
|
3704
|
-
targets.length > 0 && /* @__PURE__ */ jsx6("span", { style: S2.targetChip, children: multi ? `${targets.length} selected` : targets[0]?.label ?? targets[0]?.id })
|
|
3705
|
-
] }),
|
|
3706
|
-
multi && /* @__PURE__ */ jsx6("div", { style: S2.banner, children: blocked ? `${targets.length} selected \u2014 multi-editing is disabled` : `${targets.length} selected \xB7 shared values shown` }),
|
|
3707
|
-
/* @__PURE__ */ jsxs5("div", { style: S2.scroll, onKeyDown, tabIndex: 0, role: "group", "aria-label": "Properties", children: [
|
|
3424
|
+
return /* @__PURE__ */ jsxs5(Column, { className: "xeno-inspector-panel", children: [
|
|
3425
|
+
controller.isSearchShown() ? /* @__PURE__ */ jsxs5(Stack2, { direction: "row", gap: 6, children: [
|
|
3426
|
+
/* @__PURE__ */ jsx6(SearchField, { value: controller.getFilter(), onChange: (v) => controller.setFilter(v), placeholder: "Search properties", label: "Search properties" }),
|
|
3427
|
+
targets.length > 0 ? /* @__PURE__ */ jsx6(Badge, { children: multi ? `${targets.length} selected` : targets[0]?.label ?? targets[0]?.id }) : null
|
|
3428
|
+
] }) : null,
|
|
3429
|
+
multi ? /* @__PURE__ */ jsx6(Stack2, { pad: "inset", children: /* @__PURE__ */ jsx6(Text2, { role: "caption", children: blocked ? `${targets.length} selected \u2014 multi-editing is disabled` : `${targets.length} selected \xB7 shared values shown` }) }) : null,
|
|
3430
|
+
/* @__PURE__ */ jsx6(ScrollArea, { children: /* @__PURE__ */ jsxs5("div", { onKeyDown, tabIndex: 0, role: "group", "aria-label": "Properties", className: "xeno-inspector-properties", children: [
|
|
3708
3431
|
sections.map((projected) => /* @__PURE__ */ jsx6(SectionView, { projected, controller }, projected.section.id)),
|
|
3709
|
-
sections.length === 0
|
|
3710
|
-
] })
|
|
3432
|
+
sections.length === 0 ? /* @__PURE__ */ jsx6(EmptyState, { title: targets.length === 0 ? "Nothing selected" : "No properties" }) : null
|
|
3433
|
+
] }) })
|
|
3711
3434
|
] });
|
|
3712
3435
|
}
|
|
3713
|
-
function SectionView({
|
|
3714
|
-
projected
|
|
3715
|
-
controller
|
|
3716
|
-
}) {
|
|
3717
|
-
const { section, fields, collapsed, disabledByToggle, empty } = projected;
|
|
3718
|
-
return /* @__PURE__ */ jsxs5("div", { children: [
|
|
3719
|
-
/* @__PURE__ */ jsxs5("div", { style: S2.sectionHeader, children: [
|
|
3720
|
-
section.collapsible && /* @__PURE__ */ jsx6(
|
|
3721
|
-
"button",
|
|
3722
|
-
{
|
|
3723
|
-
type: "button",
|
|
3724
|
-
style: { ...S2.iconBtn, transform: collapsed ? "none" : "rotate(90deg)" },
|
|
3725
|
-
onClick: () => controller.toggleSectionCollapsed(section.id),
|
|
3726
|
-
"aria-label": collapsed ? "Expand section" : "Collapse section",
|
|
3727
|
-
"aria-expanded": !collapsed,
|
|
3728
|
-
children: /* @__PURE__ */ jsx6(ChevronIcon2, {})
|
|
3729
|
-
}
|
|
3730
|
-
),
|
|
3731
|
-
section.enabled && /* @__PURE__ */ jsx6(
|
|
3732
|
-
"button",
|
|
3733
|
-
{
|
|
3734
|
-
type: "button",
|
|
3735
|
-
role: "switch",
|
|
3736
|
-
"aria-checked": section.enabled.value,
|
|
3737
|
-
"aria-label": `${section.title} enabled`,
|
|
3738
|
-
onClick: () => controller.toggleSectionEnabled(section.id),
|
|
3739
|
-
style: {
|
|
3740
|
-
...S2.toggleTrack,
|
|
3741
|
-
width: 16,
|
|
3742
|
-
height: 10,
|
|
3743
|
-
background: section.enabled.value ? "var(--xeno-active)" : "var(--xeno-border)"
|
|
3744
|
-
},
|
|
3745
|
-
children: /* @__PURE__ */ jsx6(
|
|
3746
|
-
"span",
|
|
3747
|
-
{
|
|
3748
|
-
style: {
|
|
3749
|
-
...S2.toggleKnob,
|
|
3750
|
-
width: 8,
|
|
3751
|
-
height: 8,
|
|
3752
|
-
transform: section.enabled.value ? "translateX(6px)" : "translateX(0)"
|
|
3753
|
-
}
|
|
3754
|
-
}
|
|
3755
|
-
)
|
|
3756
|
-
}
|
|
3757
|
-
),
|
|
3758
|
-
/* @__PURE__ */ jsx6("span", { style: S2.sectionTitle, children: section.title }),
|
|
3759
|
-
section.badge && /* @__PURE__ */ jsx6("span", { style: S2.sectionBadge, children: section.badge }),
|
|
3760
|
-
section.actions?.map((action) => /* @__PURE__ */ jsx6(
|
|
3761
|
-
"button",
|
|
3762
|
-
{
|
|
3763
|
-
type: "button",
|
|
3764
|
-
style: S2.miniBtn,
|
|
3765
|
-
disabled: action.disabled,
|
|
3766
|
-
onClick: () => controller.runAction(section.id, action.id),
|
|
3767
|
-
title: action.label,
|
|
3768
|
-
"aria-label": action.label,
|
|
3769
|
-
children: action.label.slice(0, 1)
|
|
3770
|
-
},
|
|
3771
|
-
action.id
|
|
3772
|
-
)),
|
|
3773
|
-
section.addMenu && section.addMenu.length > 0 && /* @__PURE__ */ jsx6(AddMenu, { section, controller })
|
|
3774
|
-
] }),
|
|
3775
|
-
!collapsed && /* @__PURE__ */ jsxs5("div", { style: { ...S2.sectionBody, ...disabledByToggle ? S2.sectionBodyOff : null }, children: [
|
|
3776
|
-
empty && section.emptyHint && /* @__PURE__ */ jsx6("div", { style: S2.emptyHint, children: section.emptyHint }),
|
|
3777
|
-
fields.map((field) => /* @__PURE__ */ jsx6(FieldRow, { field, controller }, field.id))
|
|
3778
|
-
] })
|
|
3779
|
-
] });
|
|
3780
|
-
}
|
|
3781
|
-
function AddMenu({
|
|
3782
|
-
section,
|
|
3783
|
-
controller
|
|
3784
|
-
}) {
|
|
3436
|
+
function SectionView({ projected, controller }) {
|
|
3437
|
+
const { section, fields, collapsed, empty } = projected;
|
|
3785
3438
|
return /* @__PURE__ */ jsxs5(
|
|
3786
|
-
|
|
3439
|
+
Section,
|
|
3787
3440
|
{
|
|
3788
|
-
|
|
3789
|
-
|
|
3790
|
-
|
|
3791
|
-
|
|
3792
|
-
|
|
3793
|
-
|
|
3794
|
-
|
|
3441
|
+
title: section.title,
|
|
3442
|
+
flush: true,
|
|
3443
|
+
collapsible: section.collapsible,
|
|
3444
|
+
collapsed,
|
|
3445
|
+
onCollapsedChange: () => controller.toggleSectionCollapsed(section.id),
|
|
3446
|
+
enabled: section.enabled?.value,
|
|
3447
|
+
onEnabledChange: section.enabled ? () => controller.toggleSectionEnabled(section.id) : void 0,
|
|
3448
|
+
badge: section.badge ? /* @__PURE__ */ jsx6(Badge, { children: section.badge }) : null,
|
|
3449
|
+
actions: /* @__PURE__ */ jsxs5(Fragment2, { children: [
|
|
3450
|
+
section.actions?.map((action) => /* @__PURE__ */ jsx6(IconButton2, { size: "sm", icon: /* @__PURE__ */ jsx6("span", { "aria-hidden": true, children: action.label.slice(0, 1) }), label: action.label, disabled: action.disabled, onClick: () => controller.runAction(section.id, action.id) }, action.id)),
|
|
3451
|
+
section.addMenu && section.addMenu.length > 0 ? /* @__PURE__ */ jsx6(AddMenu, { section, controller }) : null
|
|
3452
|
+
] }),
|
|
3795
3453
|
children: [
|
|
3796
|
-
/* @__PURE__ */ jsx6(
|
|
3797
|
-
|
|
3798
|
-
(section.addMenu ?? []).reduce((groups, item) => {
|
|
3799
|
-
const key = item.group ?? "";
|
|
3800
|
-
(groups[key] ??= []).push(item);
|
|
3801
|
-
return groups;
|
|
3802
|
-
}, {})
|
|
3803
|
-
).map(
|
|
3804
|
-
([group, items]) => group ? /* @__PURE__ */ jsx6("optgroup", { label: group, children: (items ?? []).map((i) => /* @__PURE__ */ jsx6("option", { value: i.id, disabled: i.disabled, children: i.label }, i.id)) }, group) : (items ?? []).map((i) => /* @__PURE__ */ jsx6("option", { value: i.id, disabled: i.disabled, children: i.label }, i.id))
|
|
3805
|
-
)
|
|
3454
|
+
empty && section.emptyHint ? /* @__PURE__ */ jsx6(Stack2, { pad: "inset", children: /* @__PURE__ */ jsx6(Text2, { role: "caption", children: section.emptyHint }) }) : null,
|
|
3455
|
+
/* @__PURE__ */ jsx6(FieldGroup, { labelWidth: controller.getLabelWidth(), children: fields.map((field) => /* @__PURE__ */ jsx6(FieldRow, { field, controller }, field.id)) })
|
|
3806
3456
|
]
|
|
3807
3457
|
}
|
|
3808
3458
|
);
|
|
3809
3459
|
}
|
|
3810
|
-
function
|
|
3811
|
-
|
|
3812
|
-
controller
|
|
3813
|
-
}
|
|
3460
|
+
function AddMenu({ section, controller }) {
|
|
3461
|
+
const options = (section.addMenu ?? []).map((i) => ({ value: i.id, label: i.label, disabled: i.disabled, group: i.group }));
|
|
3462
|
+
return /* @__PURE__ */ jsx6(Select2, { size: "sm", placeholder: "\uFF0B", options, value: "", label: `Add to ${section.title}`, onChange: (id) => controller.addItem(section.id, id) });
|
|
3463
|
+
}
|
|
3464
|
+
function FieldRow({ field, controller }) {
|
|
3814
3465
|
const focused = controller.getFocused() === field.id;
|
|
3815
3466
|
const bound = !!field.token?.tokenId;
|
|
3816
3467
|
const anim = field.anim;
|
|
3817
3468
|
const showKeyframes = controller.areKeyframesShown() && !!anim;
|
|
3469
|
+
const easingOptions = anim?.easingOptions ?? [];
|
|
3470
|
+
const easing = anim?.easing ?? "";
|
|
3471
|
+
const easingAll = easingOptions.some((o) => o.value === easing) ? easingOptions : [{ value: easing, label: easing || "\u2014" }, ...easingOptions];
|
|
3818
3472
|
return /* @__PURE__ */ jsxs5(Fragment2, { children: [
|
|
3819
|
-
/* @__PURE__ */
|
|
3820
|
-
|
|
3473
|
+
/* @__PURE__ */ jsx6(
|
|
3474
|
+
Field,
|
|
3821
3475
|
{
|
|
3822
|
-
|
|
3823
|
-
|
|
3824
|
-
|
|
3825
|
-
|
|
3826
|
-
|
|
3827
|
-
children: [
|
|
3828
|
-
|
|
3829
|
-
|
|
3830
|
-
|
|
3831
|
-
|
|
3832
|
-
|
|
3833
|
-
|
|
3834
|
-
|
|
3835
|
-
|
|
3836
|
-
|
|
3837
|
-
|
|
3838
|
-
|
|
3839
|
-
|
|
3840
|
-
|
|
3841
|
-
|
|
3842
|
-
/* @__PURE__ */ jsx6(
|
|
3843
|
-
"button",
|
|
3844
|
-
{
|
|
3845
|
-
type: "button",
|
|
3846
|
-
style: { ...S2.iconBtn, width: 11, opacity: anim.canPrev === false ? 0.3 : 0.8 },
|
|
3847
|
-
disabled: anim.canPrev === false,
|
|
3848
|
-
onClick: () => controller.keyframe(field.id, "prev"),
|
|
3849
|
-
"aria-label": "Previous keyframe",
|
|
3850
|
-
children: /* @__PURE__ */ jsx6(PrevIcon, {})
|
|
3851
|
-
}
|
|
3852
|
-
),
|
|
3853
|
-
/* @__PURE__ */ jsx6(
|
|
3854
|
-
"button",
|
|
3855
|
-
{
|
|
3856
|
-
type: "button",
|
|
3857
|
-
style: S2.iconBtn,
|
|
3858
|
-
onClick: () => controller.keyframe(field.id, anim.onKeyframe ? "remove" : "add"),
|
|
3859
|
-
title: anim.onKeyframe ? "Remove keyframe" : "Add keyframe",
|
|
3860
|
-
"aria-label": anim.onKeyframe ? "Remove keyframe" : "Add keyframe",
|
|
3861
|
-
children: /* @__PURE__ */ jsx6(DiamondIcon, { filled: !!anim.onKeyframe })
|
|
3862
|
-
}
|
|
3863
|
-
),
|
|
3864
|
-
/* @__PURE__ */ jsx6(
|
|
3865
|
-
"button",
|
|
3866
|
-
{
|
|
3867
|
-
type: "button",
|
|
3868
|
-
style: { ...S2.iconBtn, width: 11, opacity: anim.canNext === false ? 0.3 : 0.8 },
|
|
3869
|
-
disabled: anim.canNext === false,
|
|
3870
|
-
onClick: () => controller.keyframe(field.id, "next"),
|
|
3871
|
-
"aria-label": "Next keyframe",
|
|
3872
|
-
children: /* @__PURE__ */ jsx6(NextIcon, {})
|
|
3873
|
-
}
|
|
3874
|
-
)
|
|
3875
|
-
] })
|
|
3876
|
-
] }),
|
|
3877
|
-
/* @__PURE__ */ jsx6(
|
|
3878
|
-
"span",
|
|
3879
|
-
{
|
|
3880
|
-
style: { ...S2.fieldLabel, width: controller.getLabelWidth() },
|
|
3881
|
-
onClick: () => controller.focusField(field.id),
|
|
3882
|
-
title: field.description ?? field.label,
|
|
3883
|
-
children: field.label
|
|
3884
|
-
}
|
|
3885
|
-
),
|
|
3886
|
-
/* @__PURE__ */ jsx6("span", { style: S2.fieldControl, children: bound ? /* @__PURE__ */ jsx6("span", { style: S2.tokenChip, title: `Bound to ${field.token?.tokenName ?? field.token?.tokenId}`, children: field.token?.tokenName ?? field.token?.tokenId }) : /* @__PURE__ */ jsx6(FieldWidget, { field, controller }) }),
|
|
3887
|
-
showKeyframes && anim.animated && anim.onKeyframe && /* @__PURE__ */ jsxs5(
|
|
3888
|
-
"select",
|
|
3889
|
-
{
|
|
3890
|
-
value: anim.easing ?? "",
|
|
3891
|
-
onChange: (e) => controller.keyframe(field.id, "setEasing", e.target.value),
|
|
3892
|
-
style: { ...S2.miniBtn, width: "auto" },
|
|
3893
|
-
"aria-label": "Easing",
|
|
3894
|
-
children: [
|
|
3895
|
-
!anim.easingOptions?.some((o) => o.value === (anim.easing ?? "")) && /* @__PURE__ */ jsx6("option", { value: anim.easing ?? "", children: anim.easing || "\u2014" }),
|
|
3896
|
-
(anim.easingOptions ?? []).map((o) => /* @__PURE__ */ jsx6("option", { value: o.value, children: o.label }, o.value))
|
|
3897
|
-
]
|
|
3898
|
-
}
|
|
3899
|
-
),
|
|
3900
|
-
showKeyframes && /* @__PURE__ */ jsx6("span", { style: S2.chip, children: controller.keyframeChip(field.id) }),
|
|
3901
|
-
controller.areTokensShown() && field.token?.bindable !== false && /* @__PURE__ */ jsx6(
|
|
3902
|
-
"button",
|
|
3903
|
-
{
|
|
3904
|
-
type: "button",
|
|
3905
|
-
style: { ...S2.iconBtn, opacity: bound ? 0.9 : 0.4 },
|
|
3906
|
-
onClick: () => controller.bindToken(field.id, bound ? null : controller.getTokens()[0]?.id ?? null),
|
|
3907
|
-
title: bound ? "Unbind token" : "Bind a design token",
|
|
3908
|
-
"aria-label": bound ? "Unbind token" : "Bind token",
|
|
3909
|
-
children: /* @__PURE__ */ jsx6(LinkIcon, {})
|
|
3910
|
-
}
|
|
3911
|
-
),
|
|
3912
|
-
field.defaultValue !== void 0 && isFieldEditable(field) && /* @__PURE__ */ jsx6(
|
|
3913
|
-
"button",
|
|
3914
|
-
{
|
|
3915
|
-
type: "button",
|
|
3916
|
-
style: { ...S2.iconBtn, opacity: 0.35 },
|
|
3917
|
-
onClick: () => controller.resetField(field.id),
|
|
3918
|
-
title: "Reset to default",
|
|
3919
|
-
"aria-label": "Reset to default",
|
|
3920
|
-
children: /* @__PURE__ */ jsx6(ResetIcon, {})
|
|
3921
|
-
}
|
|
3922
|
-
)
|
|
3923
|
-
]
|
|
3476
|
+
label: field.label,
|
|
3477
|
+
title: field.description ?? field.label,
|
|
3478
|
+
focused,
|
|
3479
|
+
onLabelClick: () => controller.focusField(field.id),
|
|
3480
|
+
onContextMenu: (x, y) => controller.requestContextMenu(field.id, x, y),
|
|
3481
|
+
leading: showKeyframes ? /* @__PURE__ */ jsxs5(Fragment2, { children: [
|
|
3482
|
+
/* @__PURE__ */ jsx6(IconButton2, { size: "sm", icon: /* @__PURE__ */ jsx6(StopwatchIcon, {}), label: "Toggle animation", active: anim.animated, onClick: () => controller.keyframe(field.id, "toggleAnim") }),
|
|
3483
|
+
anim.animated ? /* @__PURE__ */ jsxs5(Fragment2, { children: [
|
|
3484
|
+
/* @__PURE__ */ jsx6(IconButton2, { size: "sm", icon: /* @__PURE__ */ jsx6(PrevIcon, {}), label: "Previous keyframe", disabled: anim.canPrev === false, onClick: () => controller.keyframe(field.id, "prev") }),
|
|
3485
|
+
/* @__PURE__ */ jsx6(IconButton2, { size: "sm", icon: /* @__PURE__ */ jsx6(DiamondIcon, { filled: !!anim.onKeyframe }), label: anim.onKeyframe ? "Remove keyframe" : "Add keyframe", onClick: () => controller.keyframe(field.id, anim.onKeyframe ? "remove" : "add") }),
|
|
3486
|
+
/* @__PURE__ */ jsx6(IconButton2, { size: "sm", icon: /* @__PURE__ */ jsx6(NextIcon, {}), label: "Next keyframe", disabled: anim.canNext === false, onClick: () => controller.keyframe(field.id, "next") })
|
|
3487
|
+
] }) : null
|
|
3488
|
+
] }) : null,
|
|
3489
|
+
trailing: /* @__PURE__ */ jsxs5(Fragment2, { children: [
|
|
3490
|
+
showKeyframes && anim.animated && anim.onKeyframe ? /* @__PURE__ */ jsx6(Select2, { size: "sm", options: easingAll, value: easing, label: "Easing", onChange: (v) => controller.keyframe(field.id, "setEasing", v) }) : null,
|
|
3491
|
+
showKeyframes ? /* @__PURE__ */ jsx6(Badge, { size: "sm", children: controller.keyframeChip(field.id) }) : null,
|
|
3492
|
+
controller.areTokensShown() && field.token?.bindable !== false ? /* @__PURE__ */ jsx6(IconButton2, { size: "sm", icon: /* @__PURE__ */ jsx6(LinkIcon, {}), label: bound ? "Unbind token" : "Bind token", active: bound, onClick: () => controller.bindToken(field.id, bound ? null : controller.getTokens()[0]?.id ?? null) }) : null,
|
|
3493
|
+
field.defaultValue !== void 0 && isFieldEditable(field) ? /* @__PURE__ */ jsx6(IconButton2, { size: "sm", icon: /* @__PURE__ */ jsx6(ResetIcon, {}), label: "Reset to default", onClick: () => controller.resetField(field.id) }) : null
|
|
3494
|
+
] }),
|
|
3495
|
+
children: bound ? /* @__PURE__ */ jsx6(Badge, { title: `Bound to ${field.token?.tokenName ?? field.token?.tokenId}`, children: field.token?.tokenName ?? field.token?.tokenId }) : /* @__PURE__ */ jsx6(FieldWidget, { field, controller })
|
|
3924
3496
|
}
|
|
3925
3497
|
),
|
|
3926
|
-
field.description && field.type === "info"
|
|
3498
|
+
field.description && field.type === "info" ? /* @__PURE__ */ jsx6(Stack2, { pad: "inset", children: /* @__PURE__ */ jsx6(Text2, { role: "caption", children: field.description }) }) : null
|
|
3927
3499
|
] });
|
|
3928
3500
|
}
|
|
3929
3501
|
function FieldWidget({
|
|
@@ -4911,6 +4483,7 @@ var HistoryPanelController = class {
|
|
|
4911
4483
|
|
|
4912
4484
|
// src/edit/history/react/HistoryPanelView.tsx
|
|
4913
4485
|
import { useCallback as useCallback4, useEffect as useEffect3, useRef as useRef4, useSyncExternalStore as useSyncExternalStore3 } from "react";
|
|
4486
|
+
import { Badge as Badge2, Column as Column2, EmptyState as EmptyState2, IconButton as IconButton3, InlineConfirm, RowList, Row, ScrollArea as ScrollArea2, SearchField as SearchField2, StatusBar, Text as Text3, Toolbar, VirtualWindow } from "@xenosystem/components/chrome";
|
|
4914
4487
|
|
|
4915
4488
|
// src/edit/history/react/icons.tsx
|
|
4916
4489
|
import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
@@ -5006,7 +4579,7 @@ function PendingGlyph({ size = 9 }) {
|
|
|
5006
4579
|
}
|
|
5007
4580
|
|
|
5008
4581
|
// src/edit/history/react/HistoryPanelView.tsx
|
|
5009
|
-
import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
4582
|
+
import { Fragment as Fragment3, jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
5010
4583
|
function HistoryPanelView({ controller }) {
|
|
5011
4584
|
const subscribe = useCallback4((cb) => controller.subscribe(cb), [controller]);
|
|
5012
4585
|
const getSnapshot = useCallback4(() => controller.getRevision(), [controller]);
|
|
@@ -5055,106 +4628,54 @@ function HistoryPanelView({ controller }) {
|
|
|
5055
4628
|
},
|
|
5056
4629
|
[controller]
|
|
5057
4630
|
);
|
|
5058
|
-
return /* @__PURE__ */ jsxs7(
|
|
5059
|
-
/* @__PURE__ */
|
|
5060
|
-
|
|
5061
|
-
|
|
5062
|
-
{
|
|
5063
|
-
|
|
5064
|
-
|
|
5065
|
-
|
|
5066
|
-
|
|
5067
|
-
|
|
5068
|
-
|
|
5069
|
-
|
|
5070
|
-
|
|
5071
|
-
|
|
5072
|
-
|
|
5073
|
-
|
|
5074
|
-
{
|
|
5075
|
-
|
|
5076
|
-
|
|
5077
|
-
|
|
5078
|
-
|
|
5079
|
-
|
|
5080
|
-
|
|
5081
|
-
|
|
5082
|
-
}
|
|
5083
|
-
),
|
|
5084
|
-
controller.isSearchShown() && /* @__PURE__ */ jsx8(
|
|
5085
|
-
"input",
|
|
5086
|
-
{
|
|
5087
|
-
type: "search",
|
|
5088
|
-
value: controller.getFilter(),
|
|
5089
|
-
placeholder: "Search history",
|
|
5090
|
-
onChange: (e) => controller.setFilter(e.target.value),
|
|
5091
|
-
style: S3.search,
|
|
5092
|
-
"aria-label": "Search history",
|
|
5093
|
-
spellCheck: false
|
|
5094
|
-
}
|
|
5095
|
-
),
|
|
5096
|
-
/* @__PURE__ */ jsxs7("span", { style: S3.counter, children: [
|
|
5097
|
-
controller.getAppliedCount(),
|
|
5098
|
-
" / ",
|
|
5099
|
-
controller.getTotalCount()
|
|
5100
|
-
] }),
|
|
5101
|
-
controller.isClearAllowed() && /* @__PURE__ */ jsx8(
|
|
5102
|
-
"button",
|
|
4631
|
+
return /* @__PURE__ */ jsxs7(Column2, { className: "xeno-history-panel", children: [
|
|
4632
|
+
/* @__PURE__ */ jsx8(
|
|
4633
|
+
Toolbar,
|
|
4634
|
+
{
|
|
4635
|
+
left: /* @__PURE__ */ jsxs7(Fragment3, { children: [
|
|
4636
|
+
/* @__PURE__ */ jsx8(IconButton3, { size: "sm", icon: /* @__PURE__ */ jsx8(UndoIcon, {}), label: "Undo", disabled: !controller.canUndo(), onClick: () => controller.undo() }),
|
|
4637
|
+
/* @__PURE__ */ jsx8(IconButton3, { size: "sm", icon: /* @__PURE__ */ jsx8(RedoIcon, {}), label: "Redo", disabled: !controller.canRedo(), onClick: () => controller.redo() })
|
|
4638
|
+
] }),
|
|
4639
|
+
right: /* @__PURE__ */ jsxs7(Fragment3, { children: [
|
|
4640
|
+
/* @__PURE__ */ jsxs7(Text3, { role: "number", children: [
|
|
4641
|
+
controller.getAppliedCount(),
|
|
4642
|
+
" / ",
|
|
4643
|
+
controller.getTotalCount()
|
|
4644
|
+
] }),
|
|
4645
|
+
controller.isClearAllowed() ? /* @__PURE__ */ jsx8(IconButton3, { size: "sm", icon: /* @__PURE__ */ jsx8(TrashIcon, {}), label: "Clear history", onClick: () => controller.requestClear() }) : null
|
|
4646
|
+
] }),
|
|
4647
|
+
children: controller.isSearchShown() ? /* @__PURE__ */ jsx8(SearchField2, { value: controller.getFilter(), onChange: (v) => controller.setFilter(v), placeholder: "Search history", label: "Search history" }) : null
|
|
4648
|
+
}
|
|
4649
|
+
),
|
|
4650
|
+
controller.isConfirmingClear() ? /* @__PURE__ */ jsx8(InlineConfirm, { message: "Clear all history?", label: "Confirm clear history", confirmLabel: "Clear", onConfirm: () => controller.confirmClearNow(), onCancel: () => controller.cancelClear() }) : null,
|
|
4651
|
+
controller.isPruned() ? /* @__PURE__ */ jsx8(Text3, { role: "caption", children: "Earlier history discarded (limit reached)" }) : null,
|
|
4652
|
+
/* @__PURE__ */ jsxs7(ScrollArea2, { ref: scrollRef, onScroll, onKeyDown, onMouseLeave: () => controller.setHovered(null), tabIndex: 0, children: [
|
|
4653
|
+
/* @__PURE__ */ jsx8(RowList, { role: "listbox", "aria-label": "History", children: /* @__PURE__ */ jsx8(VirtualWindow, { totalHeight: window_.totalHeight, offsetTop: window_.offsetTop, children: windowRows.map((row) => /* @__PURE__ */ jsx8(
|
|
4654
|
+
HistoryRowView,
|
|
5103
4655
|
{
|
|
5104
|
-
|
|
5105
|
-
|
|
5106
|
-
|
|
5107
|
-
|
|
5108
|
-
|
|
5109
|
-
|
|
5110
|
-
|
|
5111
|
-
)
|
|
5112
|
-
] }),
|
|
5113
|
-
controller.isConfirmingClear() && /* @__PURE__ */ jsxs7("div", { style: S3.confirmBar, role: "alertdialog", "aria-label": "Confirm clear history", children: [
|
|
5114
|
-
/* @__PURE__ */ jsx8("span", { children: "Clear all history?" }),
|
|
5115
|
-
/* @__PURE__ */ jsxs7("span", { style: S3.confirmActions, children: [
|
|
5116
|
-
/* @__PURE__ */ jsx8("button", { type: "button", style: S3.textBtn, onClick: () => controller.confirmClearNow(), children: "Clear" }),
|
|
5117
|
-
/* @__PURE__ */ jsx8("button", { type: "button", style: S3.textBtnDim, onClick: () => controller.cancelClear(), children: "Cancel" })
|
|
5118
|
-
] })
|
|
4656
|
+
row,
|
|
4657
|
+
controller,
|
|
4658
|
+
rowHeight,
|
|
4659
|
+
focused: controller.getFocused() === row.entryId
|
|
4660
|
+
},
|
|
4661
|
+
row.entryId ?? "__original__"
|
|
4662
|
+
)) }) }),
|
|
4663
|
+
rows.length === 0 ? /* @__PURE__ */ jsx8(EmptyState2, { title: "No history" }) : null
|
|
5119
4664
|
] }),
|
|
5120
|
-
|
|
5121
|
-
|
|
5122
|
-
"div",
|
|
4665
|
+
memory ? /* @__PURE__ */ jsx8(
|
|
4666
|
+
StatusBar,
|
|
5123
4667
|
{
|
|
5124
|
-
|
|
5125
|
-
|
|
5126
|
-
|
|
5127
|
-
|
|
5128
|
-
|
|
5129
|
-
|
|
5130
|
-
|
|
5131
|
-
|
|
5132
|
-
|
|
5133
|
-
/* @__PURE__ */ jsx8("div", { style: { height: window_.totalHeight, position: "relative" }, children: /* @__PURE__ */ jsx8("div", { style: { transform: `translateY(${window_.offsetTop}px)` }, children: windowRows.map((row) => /* @__PURE__ */ jsx8(
|
|
5134
|
-
HistoryRowView,
|
|
5135
|
-
{
|
|
5136
|
-
row,
|
|
5137
|
-
controller,
|
|
5138
|
-
rowHeight,
|
|
5139
|
-
focused: controller.getFocused() === row.entryId
|
|
5140
|
-
},
|
|
5141
|
-
row.entryId ?? "__original__"
|
|
5142
|
-
)) }) }),
|
|
5143
|
-
rows.length === 0 && /* @__PURE__ */ jsx8("div", { style: S3.empty, children: "No history" })
|
|
5144
|
-
]
|
|
4668
|
+
left: /* @__PURE__ */ jsxs7(Text3, { role: "number", children: [
|
|
4669
|
+
memory.usedMB.toFixed(1),
|
|
4670
|
+
" MB",
|
|
4671
|
+
memory.limitMB ? ` / ${memory.limitMB} MB` : ""
|
|
4672
|
+
] }),
|
|
4673
|
+
right: memory.onDiskCount !== void 0 ? /* @__PURE__ */ jsxs7(Text3, { role: "meta", children: [
|
|
4674
|
+
memory.onDiskCount,
|
|
4675
|
+
" on disk"
|
|
4676
|
+
] }) : null
|
|
5145
4677
|
}
|
|
5146
|
-
)
|
|
5147
|
-
memory && /* @__PURE__ */ jsxs7("div", { style: S3.footer, children: [
|
|
5148
|
-
/* @__PURE__ */ jsxs7("span", { children: [
|
|
5149
|
-
memory.usedMB.toFixed(1),
|
|
5150
|
-
" MB",
|
|
5151
|
-
memory.limitMB ? ` / ${memory.limitMB} MB` : ""
|
|
5152
|
-
] }),
|
|
5153
|
-
memory.onDiskCount !== void 0 && /* @__PURE__ */ jsxs7("span", { style: S3.dim, children: [
|
|
5154
|
-
memory.onDiskCount,
|
|
5155
|
-
" on disk"
|
|
5156
|
-
] })
|
|
5157
|
-
] })
|
|
4678
|
+
) : null
|
|
5158
4679
|
] });
|
|
5159
4680
|
}
|
|
5160
4681
|
function HistoryRowView({ row, controller, rowHeight, focused }) {
|
|
@@ -5162,57 +4683,47 @@ function HistoryRowView({ row, controller, rowHeight, focused }) {
|
|
|
5162
4683
|
const pending = entry?.status === "pending";
|
|
5163
4684
|
const failed = entry?.status === "failed";
|
|
5164
4685
|
const jumpable = controller.isJumpAllowed() && entry?.caps?.jumpable !== false;
|
|
5165
|
-
|
|
5166
|
-
|
|
5167
|
-
height: rowHeight,
|
|
5168
|
-
background: row.current ? "var(--xeno-border)" : "transparent",
|
|
5169
|
-
// FUTURE rows (after the cursor) are dimmed + struck through — the redoable region.
|
|
5170
|
-
opacity: row.future ? 0.4 : 1,
|
|
5171
|
-
textDecoration: row.future ? "line-through" : "none",
|
|
5172
|
-
boxShadow: focused ? "inset 0 0 0 1px var(--xeno-control)" : void 0,
|
|
5173
|
-
cursor: jumpable ? "pointer" : "default"
|
|
5174
|
-
};
|
|
5175
|
-
return /* @__PURE__ */ jsxs7(
|
|
5176
|
-
"div",
|
|
4686
|
+
return /* @__PURE__ */ jsx8(
|
|
4687
|
+
Row,
|
|
5177
4688
|
{
|
|
5178
|
-
|
|
5179
|
-
|
|
5180
|
-
|
|
4689
|
+
height: rowHeight,
|
|
4690
|
+
selected: row.current,
|
|
4691
|
+
focused,
|
|
4692
|
+
struck: row.future,
|
|
4693
|
+
noIcon: !controller.areIconsShown(),
|
|
4694
|
+
icon: /* @__PURE__ */ jsx8(EntryIcon, { name: row.kind === "original" ? "original" : controller.getIconName(entry?.kind) }),
|
|
4695
|
+
label: row.label,
|
|
4696
|
+
meta: row.kind === "entry" ? row.ordinal : void 0,
|
|
5181
4697
|
"data-history-row": row.entryId ?? "__original__",
|
|
5182
|
-
onClick: () => controller.jumpTo(row.entryId),
|
|
4698
|
+
onClick: jumpable ? () => controller.jumpTo(row.entryId) : void 0,
|
|
5183
4699
|
onMouseEnter: () => controller.setHovered(row.entryId),
|
|
5184
4700
|
onContextMenu: (e) => {
|
|
5185
4701
|
e.preventDefault();
|
|
5186
4702
|
controller.requestContextMenu(row.entryId, e.clientX, e.clientY);
|
|
5187
4703
|
},
|
|
5188
4704
|
title: row.label,
|
|
5189
|
-
children: [
|
|
5190
|
-
|
|
5191
|
-
/* @__PURE__ */ jsx8(
|
|
5192
|
-
/* @__PURE__ */ jsx8("
|
|
5193
|
-
|
|
5194
|
-
failed && /* @__PURE__ */ jsx8("span", { style: S3.failed, children: "failed" }),
|
|
5195
|
-
controller.isSourceShown() && entry?.source && entry.source !== "user" && /* @__PURE__ */ jsx8("span", { style: S3.badge, title: `Source: ${entry.source}`, children: entry.source === "agent" ? "AI" : "S" }),
|
|
5196
|
-
entry?.coalesced && entry.coalesced > 1 && /* @__PURE__ */ jsxs7("span", { style: S3.badge, title: `${entry.coalesced} actions coalesced`, children: [
|
|
4705
|
+
trailing: /* @__PURE__ */ jsxs7(Fragment3, { children: [
|
|
4706
|
+
pending ? /* @__PURE__ */ jsx8(PendingGlyph, {}) : null,
|
|
4707
|
+
failed ? /* @__PURE__ */ jsx8(Badge2, { size: "sm", tone: "error", children: "failed" }) : null,
|
|
4708
|
+
controller.isSourceShown() && entry?.source && entry.source !== "user" ? /* @__PURE__ */ jsx8(Badge2, { size: "sm", title: `Source: ${entry.source}`, children: entry.source === "agent" ? "AI" : "S" }) : null,
|
|
4709
|
+
entry?.coalesced && entry.coalesced > 1 ? /* @__PURE__ */ jsxs7(Badge2, { size: "sm", title: `${entry.coalesced} actions coalesced`, children: [
|
|
5197
4710
|
"\xD7",
|
|
5198
4711
|
entry.coalesced
|
|
5199
|
-
] }),
|
|
5200
|
-
controller.areTimestampsShown() && entry?.at !== void 0
|
|
5201
|
-
pending
|
|
5202
|
-
|
|
4712
|
+
] }) : null,
|
|
4713
|
+
controller.areTimestampsShown() && entry?.at !== void 0 ? /* @__PURE__ */ jsx8(Text3, { role: "meta", children: formatTime(entry.at) }) : null,
|
|
4714
|
+
pending ? /* @__PURE__ */ jsx8(
|
|
4715
|
+
IconButton3,
|
|
5203
4716
|
{
|
|
5204
|
-
|
|
5205
|
-
|
|
4717
|
+
size: "sm",
|
|
4718
|
+
icon: /* @__PURE__ */ jsx8(XIcon2, {}),
|
|
4719
|
+
label: "Cancel operation",
|
|
5206
4720
|
onClick: (e) => {
|
|
5207
4721
|
e.stopPropagation();
|
|
5208
4722
|
controller.cancelPending(entry?.id);
|
|
5209
|
-
}
|
|
5210
|
-
title: "Cancel operation",
|
|
5211
|
-
"aria-label": "Cancel operation",
|
|
5212
|
-
children: /* @__PURE__ */ jsx8(XIcon2, {})
|
|
4723
|
+
}
|
|
5213
4724
|
}
|
|
5214
|
-
)
|
|
5215
|
-
]
|
|
4725
|
+
) : null
|
|
4726
|
+
] })
|
|
5216
4727
|
}
|
|
5217
4728
|
);
|
|
5218
4729
|
}
|
|
@@ -5221,141 +4732,6 @@ function formatTime(at) {
|
|
|
5221
4732
|
if (Number.isNaN(date.getTime())) return typeof at === "string" ? at : "";
|
|
5222
4733
|
return date.toLocaleTimeString(void 0, { hour: "2-digit", minute: "2-digit" });
|
|
5223
4734
|
}
|
|
5224
|
-
var S3 = {
|
|
5225
|
-
root: {
|
|
5226
|
-
display: "flex",
|
|
5227
|
-
flexDirection: "column",
|
|
5228
|
-
height: "100%",
|
|
5229
|
-
minHeight: 0,
|
|
5230
|
-
fontSize: 11,
|
|
5231
|
-
color: "var(--xeno-text)",
|
|
5232
|
-
background: "var(--xeno-canvas)",
|
|
5233
|
-
userSelect: "none"
|
|
5234
|
-
},
|
|
5235
|
-
header: {
|
|
5236
|
-
display: "flex",
|
|
5237
|
-
alignItems: "center",
|
|
5238
|
-
gap: 4,
|
|
5239
|
-
padding: "4px 6px",
|
|
5240
|
-
background: "var(--xeno-panel-header)",
|
|
5241
|
-
flex: "0 0 auto"
|
|
5242
|
-
},
|
|
5243
|
-
search: {
|
|
5244
|
-
flex: "1 1 auto",
|
|
5245
|
-
minWidth: 0,
|
|
5246
|
-
height: 18,
|
|
5247
|
-
background: "var(--xeno-canvas)",
|
|
5248
|
-
color: "inherit",
|
|
5249
|
-
border: "1px solid var(--xeno-border)",
|
|
5250
|
-
borderRadius: 2,
|
|
5251
|
-
fontSize: 11,
|
|
5252
|
-
padding: "0 6px",
|
|
5253
|
-
outline: "none"
|
|
5254
|
-
},
|
|
5255
|
-
counter: {
|
|
5256
|
-
fontSize: 9,
|
|
5257
|
-
color: "var(--xeno-muted)",
|
|
5258
|
-
fontVariantNumeric: "tabular-nums",
|
|
5259
|
-
flex: "0 0 auto"
|
|
5260
|
-
},
|
|
5261
|
-
iconBtn: {
|
|
5262
|
-
display: "flex",
|
|
5263
|
-
alignItems: "center",
|
|
5264
|
-
justifyContent: "center",
|
|
5265
|
-
width: 16,
|
|
5266
|
-
height: 16,
|
|
5267
|
-
padding: 0,
|
|
5268
|
-
border: "none",
|
|
5269
|
-
borderRadius: 2,
|
|
5270
|
-
background: "transparent",
|
|
5271
|
-
color: "inherit",
|
|
5272
|
-
cursor: "pointer",
|
|
5273
|
-
flex: "0 0 auto"
|
|
5274
|
-
},
|
|
5275
|
-
confirmBar: {
|
|
5276
|
-
display: "flex",
|
|
5277
|
-
alignItems: "center",
|
|
5278
|
-
justifyContent: "space-between",
|
|
5279
|
-
gap: 8,
|
|
5280
|
-
padding: "3px 6px",
|
|
5281
|
-
fontSize: 10,
|
|
5282
|
-
background: "var(--xeno-border-subtle)",
|
|
5283
|
-
flex: "0 0 auto"
|
|
5284
|
-
},
|
|
5285
|
-
confirmActions: { display: "flex", gap: 8 },
|
|
5286
|
-
textBtn: {
|
|
5287
|
-
background: "transparent",
|
|
5288
|
-
border: "none",
|
|
5289
|
-
color: "inherit",
|
|
5290
|
-
cursor: "pointer",
|
|
5291
|
-
fontSize: 10,
|
|
5292
|
-
padding: 0
|
|
5293
|
-
},
|
|
5294
|
-
textBtnDim: {
|
|
5295
|
-
background: "transparent",
|
|
5296
|
-
border: "none",
|
|
5297
|
-
color: "var(--xeno-muted)",
|
|
5298
|
-
cursor: "pointer",
|
|
5299
|
-
fontSize: 10,
|
|
5300
|
-
padding: 0
|
|
5301
|
-
},
|
|
5302
|
-
prunedNote: {
|
|
5303
|
-
padding: "2px 6px",
|
|
5304
|
-
fontSize: 9,
|
|
5305
|
-
color: "var(--xeno-muted)",
|
|
5306
|
-
flex: "0 0 auto"
|
|
5307
|
-
},
|
|
5308
|
-
scroll: { flex: "1 1 auto", minHeight: 0, overflowY: "auto", overflowX: "hidden", outline: "none" },
|
|
5309
|
-
row: {
|
|
5310
|
-
display: "flex",
|
|
5311
|
-
alignItems: "center",
|
|
5312
|
-
gap: 5,
|
|
5313
|
-
padding: "0 6px",
|
|
5314
|
-
boxSizing: "border-box",
|
|
5315
|
-
overflow: "hidden"
|
|
5316
|
-
},
|
|
5317
|
-
iconCell: { display: "flex", alignItems: "center", width: 11, flex: "0 0 auto", opacity: 0.75 },
|
|
5318
|
-
ordinal: {
|
|
5319
|
-
fontSize: 9,
|
|
5320
|
-
color: "var(--xeno-muted)",
|
|
5321
|
-
fontVariantNumeric: "tabular-nums",
|
|
5322
|
-
minWidth: 14,
|
|
5323
|
-
textAlign: "right",
|
|
5324
|
-
flex: "0 0 auto"
|
|
5325
|
-
},
|
|
5326
|
-
label: { flex: "1 1 auto", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", minWidth: 0 },
|
|
5327
|
-
badge: {
|
|
5328
|
-
fontSize: 8,
|
|
5329
|
-
padding: "0 3px",
|
|
5330
|
-
height: 12,
|
|
5331
|
-
lineHeight: "12px",
|
|
5332
|
-
borderRadius: 2,
|
|
5333
|
-
background: "var(--xeno-border)",
|
|
5334
|
-
color: "var(--xeno-muted)",
|
|
5335
|
-
flex: "0 0 auto"
|
|
5336
|
-
},
|
|
5337
|
-
failed: { fontSize: 9, color: "var(--xeno-danger)", flex: "0 0 auto" },
|
|
5338
|
-
time: {
|
|
5339
|
-
fontSize: 9,
|
|
5340
|
-
color: "var(--xeno-muted)",
|
|
5341
|
-
fontVariantNumeric: "tabular-nums",
|
|
5342
|
-
flex: "0 0 auto"
|
|
5343
|
-
},
|
|
5344
|
-
empty: { padding: 12, fontSize: 10, opacity: 0.4, textTransform: "uppercase", letterSpacing: "0.08em" },
|
|
5345
|
-
footer: {
|
|
5346
|
-
display: "flex",
|
|
5347
|
-
alignItems: "center",
|
|
5348
|
-
justifyContent: "space-between",
|
|
5349
|
-
gap: 8,
|
|
5350
|
-
padding: "2px 6px",
|
|
5351
|
-
fontSize: 9,
|
|
5352
|
-
color: "var(--xeno-muted)",
|
|
5353
|
-
background: "var(--xeno-panel-header)",
|
|
5354
|
-
flex: "0 0 auto",
|
|
5355
|
-
fontVariantNumeric: "tabular-nums"
|
|
5356
|
-
},
|
|
5357
|
-
dim: { opacity: 0.7 }
|
|
5358
|
-
};
|
|
5359
4735
|
|
|
5360
4736
|
// src/edit/history/panel.ts
|
|
5361
4737
|
function createHistoryPanel(options = {}) {
|
|
@@ -6438,7 +5814,7 @@ function drawAlphaStrip(ctx, w, h, hsv) {
|
|
|
6438
5814
|
}
|
|
6439
5815
|
|
|
6440
5816
|
// src/edit/color/react/ColorPanelView.tsx
|
|
6441
|
-
import { Fragment as
|
|
5817
|
+
import { Fragment as Fragment4, jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
6442
5818
|
var SPACE_LABEL = {
|
|
6443
5819
|
hex: "HEX",
|
|
6444
5820
|
rgb: "RGB",
|
|
@@ -6543,14 +5919,14 @@ function ColorPanelView({ controller }) {
|
|
|
6543
5919
|
);
|
|
6544
5920
|
const componentLabels = COMPONENT_LABELS[space];
|
|
6545
5921
|
const comps = value.components ?? [];
|
|
6546
|
-
return /* @__PURE__ */ jsxs8("div", { style:
|
|
6547
|
-
controller.getChannelsMode() === "fg-bg" && /* @__PURE__ */ jsxs8("div", { style:
|
|
5922
|
+
return /* @__PURE__ */ jsxs8("div", { style: S2.root, className: "xeno-color-panel", children: [
|
|
5923
|
+
controller.getChannelsMode() === "fg-bg" && /* @__PURE__ */ jsxs8("div", { style: S2.channels, children: [
|
|
6548
5924
|
/* @__PURE__ */ jsx9(
|
|
6549
5925
|
"button",
|
|
6550
5926
|
{
|
|
6551
5927
|
type: "button",
|
|
6552
5928
|
"aria-pressed": controller.getActiveChannel() === "fg",
|
|
6553
|
-
style: { ...
|
|
5929
|
+
style: { ...S2.chip, ...controller.getActiveChannel() === "fg" ? S2.chipActive : null, background: value.hex },
|
|
6554
5930
|
onClick: () => controller.setChannel("fg"),
|
|
6555
5931
|
title: "Foreground"
|
|
6556
5932
|
}
|
|
@@ -6559,7 +5935,7 @@ function ColorPanelView({ controller }) {
|
|
|
6559
5935
|
"button",
|
|
6560
5936
|
{
|
|
6561
5937
|
type: "button",
|
|
6562
|
-
style:
|
|
5938
|
+
style: S2.swap,
|
|
6563
5939
|
onClick: () => controller.swapChannels(),
|
|
6564
5940
|
title: "Swap FG/BG (X)",
|
|
6565
5941
|
children: "\u21C4"
|
|
@@ -6570,20 +5946,20 @@ function ColorPanelView({ controller }) {
|
|
|
6570
5946
|
{
|
|
6571
5947
|
type: "button",
|
|
6572
5948
|
"aria-pressed": controller.getActiveChannel() === "bg",
|
|
6573
|
-
style: { ...
|
|
5949
|
+
style: { ...S2.chip, ...controller.getActiveChannel() === "bg" ? S2.chipActive : null },
|
|
6574
5950
|
onClick: () => controller.setChannel("bg"),
|
|
6575
5951
|
title: "Background"
|
|
6576
5952
|
}
|
|
6577
5953
|
)
|
|
6578
5954
|
] }),
|
|
6579
|
-
/* @__PURE__ */ jsxs8("div", { style:
|
|
5955
|
+
/* @__PURE__ */ jsxs8("div", { style: S2.pickerRow, children: [
|
|
6580
5956
|
/* @__PURE__ */ jsx9(
|
|
6581
5957
|
"canvas",
|
|
6582
5958
|
{
|
|
6583
5959
|
ref: spectrumRef,
|
|
6584
5960
|
width: 200,
|
|
6585
5961
|
height: 140,
|
|
6586
|
-
style: { ...
|
|
5962
|
+
style: { ...S2.spectrum, ...bound ? S2.disabled : null },
|
|
6587
5963
|
onPointerDown: (e) => onSpectrumPointer(e, true),
|
|
6588
5964
|
onPointerMove: (e) => onSpectrumPointer(e, false),
|
|
6589
5965
|
onPointerUp: endDrag
|
|
@@ -6595,7 +5971,7 @@ function ColorPanelView({ controller }) {
|
|
|
6595
5971
|
ref: hueRef,
|
|
6596
5972
|
width: 14,
|
|
6597
5973
|
height: 140,
|
|
6598
|
-
style: { ...
|
|
5974
|
+
style: { ...S2.strip, ...bound ? S2.disabled : null },
|
|
6599
5975
|
onPointerDown: (e) => onHuePointer(e, true),
|
|
6600
5976
|
onPointerMove: (e) => onHuePointer(e, false),
|
|
6601
5977
|
onPointerUp: endDrag
|
|
@@ -6607,20 +5983,20 @@ function ColorPanelView({ controller }) {
|
|
|
6607
5983
|
ref: alphaRef,
|
|
6608
5984
|
width: 14,
|
|
6609
5985
|
height: 140,
|
|
6610
|
-
style: { ...
|
|
5986
|
+
style: { ...S2.strip, ...bound ? S2.disabled : null },
|
|
6611
5987
|
onPointerDown: (e) => onAlphaPointer(e, true),
|
|
6612
5988
|
onPointerMove: (e) => onAlphaPointer(e, false),
|
|
6613
5989
|
onPointerUp: endDrag
|
|
6614
5990
|
}
|
|
6615
5991
|
)
|
|
6616
5992
|
] }),
|
|
6617
|
-
/* @__PURE__ */ jsxs8("div", { style:
|
|
5993
|
+
/* @__PURE__ */ jsxs8("div", { style: S2.controls, children: [
|
|
6618
5994
|
/* @__PURE__ */ jsx9(
|
|
6619
5995
|
"select",
|
|
6620
5996
|
{
|
|
6621
5997
|
value: space,
|
|
6622
5998
|
onChange: (e) => controller.setSpace(e.target.value),
|
|
6623
|
-
style:
|
|
5999
|
+
style: S2.select,
|
|
6624
6000
|
"aria-label": "Color model",
|
|
6625
6001
|
children: EDIT_SPACES.map((s) => /* @__PURE__ */ jsx9("option", { value: s, children: SPACE_LABEL[s] }, s))
|
|
6626
6002
|
}
|
|
@@ -6632,12 +6008,12 @@ function ColorPanelView({ controller }) {
|
|
|
6632
6008
|
value: value.hex,
|
|
6633
6009
|
onChange: onHexInput,
|
|
6634
6010
|
disabled: bound,
|
|
6635
|
-
style:
|
|
6011
|
+
style: S2.hexInput,
|
|
6636
6012
|
"aria-label": "Hex",
|
|
6637
6013
|
spellCheck: false
|
|
6638
6014
|
}
|
|
6639
|
-
) : /* @__PURE__ */ jsx9("div", { style:
|
|
6640
|
-
/* @__PURE__ */ jsx9("span", { style:
|
|
6015
|
+
) : /* @__PURE__ */ jsx9("div", { style: S2.componentRow, children: (componentLabels ?? []).map((label, i) => /* @__PURE__ */ jsxs8("label", { style: S2.componentField, children: [
|
|
6016
|
+
/* @__PURE__ */ jsx9("span", { style: S2.componentLabel, children: label }),
|
|
6641
6017
|
/* @__PURE__ */ jsx9(
|
|
6642
6018
|
"input",
|
|
6643
6019
|
{
|
|
@@ -6645,12 +6021,12 @@ function ColorPanelView({ controller }) {
|
|
|
6645
6021
|
value: roundForSpace(space, i, comps[i] ?? 0),
|
|
6646
6022
|
onChange: (e) => onComponentInput(i, e.target.value),
|
|
6647
6023
|
disabled: bound,
|
|
6648
|
-
style:
|
|
6024
|
+
style: S2.numInput
|
|
6649
6025
|
}
|
|
6650
6026
|
)
|
|
6651
6027
|
] }, label)) }),
|
|
6652
|
-
controller.isAlphaShown() && /* @__PURE__ */ jsxs8("label", { style:
|
|
6653
|
-
/* @__PURE__ */ jsx9("span", { style:
|
|
6028
|
+
controller.isAlphaShown() && /* @__PURE__ */ jsxs8("label", { style: S2.alphaField, children: [
|
|
6029
|
+
/* @__PURE__ */ jsx9("span", { style: S2.componentLabel, children: "A" }),
|
|
6654
6030
|
/* @__PURE__ */ jsx9(
|
|
6655
6031
|
"input",
|
|
6656
6032
|
{
|
|
@@ -6660,20 +6036,20 @@ function ColorPanelView({ controller }) {
|
|
|
6660
6036
|
value: Math.round(value.alpha * 100),
|
|
6661
6037
|
onChange: (e) => controller.setAlpha(Number(e.target.value) / 100, { commit: true }),
|
|
6662
6038
|
disabled: bound,
|
|
6663
|
-
style:
|
|
6039
|
+
style: S2.numInput
|
|
6664
6040
|
}
|
|
6665
6041
|
)
|
|
6666
6042
|
] }),
|
|
6667
|
-
/* @__PURE__ */ jsx9("button", { type: "button", style:
|
|
6043
|
+
/* @__PURE__ */ jsx9("button", { type: "button", style: S2.iconBtn, title: "Pick from screen", onClick: () => controller.requestEyedropper(), children: "\u29BF" })
|
|
6668
6044
|
] }),
|
|
6669
|
-
controller.hasTokens() && /* @__PURE__ */ jsxs8("div", { style:
|
|
6670
|
-
/* @__PURE__ */ jsx9("span", { style:
|
|
6045
|
+
controller.hasTokens() && /* @__PURE__ */ jsxs8("div", { style: S2.tokenRow, children: [
|
|
6046
|
+
/* @__PURE__ */ jsx9("span", { style: S2.componentLabel, children: "Token" }),
|
|
6671
6047
|
/* @__PURE__ */ jsxs8(
|
|
6672
6048
|
"select",
|
|
6673
6049
|
{
|
|
6674
6050
|
value: controller.getBoundTokenId() ?? "",
|
|
6675
6051
|
onChange: (e) => e.target.value ? controller.bindToken(e.target.value) : controller.unbindToken(),
|
|
6676
|
-
style:
|
|
6052
|
+
style: S2.select,
|
|
6677
6053
|
"aria-label": "Bind token",
|
|
6678
6054
|
children: [
|
|
6679
6055
|
/* @__PURE__ */ jsx9("option", { value: "", children: "\u2014 raw \u2014" }),
|
|
@@ -6681,17 +6057,17 @@ function ColorPanelView({ controller }) {
|
|
|
6681
6057
|
]
|
|
6682
6058
|
}
|
|
6683
6059
|
),
|
|
6684
|
-
bound && /* @__PURE__ */ jsx9("button", { type: "button", style:
|
|
6060
|
+
bound && /* @__PURE__ */ jsx9("button", { type: "button", style: S2.textBtn, onClick: () => controller.unbindToken(), children: "Unbind" })
|
|
6685
6061
|
] }),
|
|
6686
|
-
/* @__PURE__ */ jsxs8("div", { style:
|
|
6687
|
-
/* @__PURE__ */ jsx9("span", { style:
|
|
6688
|
-
/* @__PURE__ */ jsx9("button", { type: "button", style:
|
|
6062
|
+
/* @__PURE__ */ jsxs8("div", { style: S2.swatchHeader, children: [
|
|
6063
|
+
/* @__PURE__ */ jsx9("span", { style: S2.sectionLabel, children: "Swatches" }),
|
|
6064
|
+
/* @__PURE__ */ jsx9("button", { type: "button", style: S2.textBtn, onClick: () => void controller.addSwatch(), children: "+ Save" })
|
|
6689
6065
|
] }),
|
|
6690
|
-
/* @__PURE__ */ jsx9("div", { style:
|
|
6066
|
+
/* @__PURE__ */ jsx9("div", { style: S2.swatchGrid, children: controller.getSwatches().map((hex) => /* @__PURE__ */ jsx9(
|
|
6691
6067
|
"button",
|
|
6692
6068
|
{
|
|
6693
6069
|
type: "button",
|
|
6694
|
-
style: { ...
|
|
6070
|
+
style: { ...S2.swatch, background: hex },
|
|
6695
6071
|
title: hex,
|
|
6696
6072
|
onClick: () => controller.selectColor(hex),
|
|
6697
6073
|
onContextMenu: (e) => {
|
|
@@ -6701,13 +6077,13 @@ function ColorPanelView({ controller }) {
|
|
|
6701
6077
|
},
|
|
6702
6078
|
hex
|
|
6703
6079
|
)) }),
|
|
6704
|
-
controller.getRecent().length > 0 && /* @__PURE__ */ jsxs8(
|
|
6705
|
-
/* @__PURE__ */ jsx9("div", { style:
|
|
6706
|
-
/* @__PURE__ */ jsx9("div", { style:
|
|
6080
|
+
controller.getRecent().length > 0 && /* @__PURE__ */ jsxs8(Fragment4, { children: [
|
|
6081
|
+
/* @__PURE__ */ jsx9("div", { style: S2.sectionLabel, children: "Recent" }),
|
|
6082
|
+
/* @__PURE__ */ jsx9("div", { style: S2.swatchGrid, children: controller.getRecent().map((hex, i) => /* @__PURE__ */ jsx9(
|
|
6707
6083
|
"button",
|
|
6708
6084
|
{
|
|
6709
6085
|
type: "button",
|
|
6710
|
-
style: { ...
|
|
6086
|
+
style: { ...S2.swatch, background: hex },
|
|
6711
6087
|
title: hex,
|
|
6712
6088
|
onClick: () => controller.selectColor(hex)
|
|
6713
6089
|
},
|
|
@@ -6723,7 +6099,7 @@ function roundForSpace(space, index, v) {
|
|
|
6723
6099
|
if (space === "oklch") return Math.round(v * 10) / 10;
|
|
6724
6100
|
return Math.round(v);
|
|
6725
6101
|
}
|
|
6726
|
-
var
|
|
6102
|
+
var S2 = {
|
|
6727
6103
|
root: { display: "flex", flexDirection: "column", gap: 8, padding: 8, fontSize: 11, color: "var(--xeno-text)", background: "var(--xeno-canvas)", minWidth: 232, userSelect: "none" },
|
|
6728
6104
|
channels: { display: "flex", alignItems: "center", gap: 6 },
|
|
6729
6105
|
chip: { width: 28, height: 20, borderRadius: 2, border: "1px solid var(--xeno-control)", background: "var(--xeno-canvas)", cursor: "pointer", padding: 0 },
|
|
@@ -8020,9 +7396,9 @@ var curveManifest = {
|
|
|
8020
7396
|
|
|
8021
7397
|
// src/edit/curve/react/CurvePanelView.tsx
|
|
8022
7398
|
import { useCallback as useCallback6, useEffect as useEffect5, useRef as useRef6, useSyncExternalStore as useSyncExternalStore5 } from "react";
|
|
8023
|
-
import { EmptyState, StatusBar, Toolbar, ToolbarGroup } from "@xenosystem/components/chrome";
|
|
7399
|
+
import { EmptyState as EmptyState3, StatusBar as StatusBar2, Toolbar as Toolbar2, ToolbarGroup } from "@xenosystem/components/chrome";
|
|
8024
7400
|
import { formatTick } from "@xenosystem/time-core";
|
|
8025
|
-
import { Fragment as
|
|
7401
|
+
import { Fragment as Fragment5, jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
8026
7402
|
var DASHES = ["none", "4 2", "1 2", "6 2 1 2"];
|
|
8027
7403
|
function CurvePanelView({ controller, showPresets = true }) {
|
|
8028
7404
|
const state = useSyncExternalStore5(controller.subscribe, controller.getState, controller.getState);
|
|
@@ -8103,7 +7479,7 @@ function CurvePanelView({ controller, showPresets = true }) {
|
|
|
8103
7479
|
const channels = state.curves?.channels ?? [];
|
|
8104
7480
|
return /* @__PURE__ */ jsxs9("div", { style: SHELL, children: [
|
|
8105
7481
|
/* @__PURE__ */ jsx10(
|
|
8106
|
-
|
|
7482
|
+
Toolbar2,
|
|
8107
7483
|
{
|
|
8108
7484
|
left: /* @__PURE__ */ jsx10(ToolbarGroup, { children: ["linear", "bezier", "hold", "step"].map((mode) => /* @__PURE__ */ jsx10("button", { type: "button", style: button(), onClick: () => controller.setInterpolation(mode), children: mode }, mode)) }),
|
|
8109
7485
|
right: /* @__PURE__ */ jsxs9(ToolbarGroup, { end: true, children: [
|
|
@@ -8113,7 +7489,7 @@ function CurvePanelView({ controller, showPresets = true }) {
|
|
|
8113
7489
|
}
|
|
8114
7490
|
),
|
|
8115
7491
|
showPresets ? /* @__PURE__ */ jsx10(
|
|
8116
|
-
|
|
7492
|
+
Toolbar2,
|
|
8117
7493
|
{
|
|
8118
7494
|
left: /* @__PURE__ */ jsx10(ToolbarGroup, { children: EASING_PRESETS.slice(0, 6).map((preset) => /* @__PURE__ */ jsx10(
|
|
8119
7495
|
"button",
|
|
@@ -8128,7 +7504,7 @@ function CurvePanelView({ controller, showPresets = true }) {
|
|
|
8128
7504
|
)) })
|
|
8129
7505
|
}
|
|
8130
7506
|
) : null,
|
|
8131
|
-
channels.length === 0 ? /* @__PURE__ */ jsx10(
|
|
7507
|
+
channels.length === 0 ? /* @__PURE__ */ jsx10(EmptyState3, { title: "No curves", hint: "Wire an animated property into this panel's input." }) : /* @__PURE__ */ jsx10(
|
|
8132
7508
|
"div",
|
|
8133
7509
|
{
|
|
8134
7510
|
ref: containerRef,
|
|
@@ -8242,7 +7618,7 @@ function CurvePanelView({ controller, showPresets = true }) {
|
|
|
8242
7618
|
}
|
|
8243
7619
|
),
|
|
8244
7620
|
/* @__PURE__ */ jsx10(
|
|
8245
|
-
|
|
7621
|
+
StatusBar2,
|
|
8246
7622
|
{
|
|
8247
7623
|
left: `${channels.length} channel${channels.length === 1 ? "" : "s"}`,
|
|
8248
7624
|
right: /* @__PURE__ */ jsx10("span", { className: "tabular-nums", children: state.playheadTick !== null ? formatTick(state.playheadTick, state.timebase) : "" })
|
|
@@ -8257,7 +7633,7 @@ function Handles({
|
|
|
8257
7633
|
scale
|
|
8258
7634
|
}) {
|
|
8259
7635
|
const sides = ["in", "out"];
|
|
8260
|
-
return /* @__PURE__ */ jsx10(
|
|
7636
|
+
return /* @__PURE__ */ jsx10(Fragment5, { children: sides.map((side) => {
|
|
8261
7637
|
const tangent = side === "in" ? keyframe.tangentIn : keyframe.tangentOut;
|
|
8262
7638
|
if (!tangent) return null;
|
|
8263
7639
|
const hx = scale.tickToX(keyframe.tick + tangent.x);
|
|
@@ -8897,7 +8273,7 @@ var viewportManifest = {
|
|
|
8897
8273
|
|
|
8898
8274
|
// src/edit/viewport/react/ViewportPanelView.tsx
|
|
8899
8275
|
import { useEffect as useEffect6, useRef as useRef7, useSyncExternalStore as useSyncExternalStore6 } from "react";
|
|
8900
|
-
import { Badge, StatusBar as
|
|
8276
|
+
import { Badge as Badge3, StatusBar as StatusBar3 } from "@xenosystem/components/chrome";
|
|
8901
8277
|
import { jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
8902
8278
|
var SLOT_STYLE = {
|
|
8903
8279
|
"top-left": { top: 8, left: 8 },
|
|
@@ -9007,11 +8383,11 @@ function ViewportPanelView({
|
|
|
9007
8383
|
fontSize: 11,
|
|
9008
8384
|
zIndex: 20
|
|
9009
8385
|
},
|
|
9010
|
-
children: /* @__PURE__ */ jsx11(
|
|
8386
|
+
children: /* @__PURE__ */ jsx11(Badge3, { tone: "error", children: "graphics context lost \u2014 restoring" })
|
|
9011
8387
|
}
|
|
9012
8388
|
) : null,
|
|
9013
8389
|
showStats && state.stats ? /* @__PURE__ */ jsx11("div", { style: { position: "absolute", left: 0, right: 0, bottom: 0, zIndex: 10 }, children: /* @__PURE__ */ jsx11(
|
|
9014
|
-
|
|
8390
|
+
StatusBar3,
|
|
9015
8391
|
{
|
|
9016
8392
|
left: state.stats.fps !== void 0 ? `${Math.round(state.stats.fps)} fps` : void 0,
|
|
9017
8393
|
right: state.surface ? `${state.surface.cssWidth}\xD7${state.surface.cssHeight} @${state.surface.dpr}\xD7` : void 0
|
|
@@ -9664,17 +9040,17 @@ var findManifest = {
|
|
|
9664
9040
|
// src/edit/find/react/FindPanelView.tsx
|
|
9665
9041
|
import { useSyncExternalStore as useSyncExternalStore7 } from "react";
|
|
9666
9042
|
import {
|
|
9667
|
-
Badge as
|
|
9668
|
-
EmptyState as
|
|
9669
|
-
IconButton as
|
|
9670
|
-
Row,
|
|
9671
|
-
RowList,
|
|
9672
|
-
ScrollArea,
|
|
9673
|
-
SearchField,
|
|
9674
|
-
Section,
|
|
9675
|
-
StatusBar as
|
|
9043
|
+
Badge as Badge4,
|
|
9044
|
+
EmptyState as EmptyState4,
|
|
9045
|
+
IconButton as IconButton4,
|
|
9046
|
+
Row as Row2,
|
|
9047
|
+
RowList as RowList2,
|
|
9048
|
+
ScrollArea as ScrollArea3,
|
|
9049
|
+
SearchField as SearchField3,
|
|
9050
|
+
Section as Section2,
|
|
9051
|
+
StatusBar as StatusBar4,
|
|
9676
9052
|
TextButton as TextButton2,
|
|
9677
|
-
Toolbar as
|
|
9053
|
+
Toolbar as Toolbar3,
|
|
9678
9054
|
ToolbarGroup as ToolbarGroup2
|
|
9679
9055
|
} from "@xenosystem/components/chrome";
|
|
9680
9056
|
import { jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
@@ -9716,12 +9092,12 @@ function StatusLine({
|
|
|
9716
9092
|
hasText
|
|
9717
9093
|
}) {
|
|
9718
9094
|
if (status === "invalidPattern") {
|
|
9719
|
-
return /* @__PURE__ */ jsx12(
|
|
9095
|
+
return /* @__PURE__ */ jsx12(Badge4, { tone: "error", title: message ?? void 0, children: "invalid pattern" });
|
|
9720
9096
|
}
|
|
9721
9097
|
if (status === "failed") {
|
|
9722
|
-
return /* @__PURE__ */ jsx12(
|
|
9098
|
+
return /* @__PURE__ */ jsx12(Badge4, { tone: "error", title: message ?? void 0, children: "search failed" });
|
|
9723
9099
|
}
|
|
9724
|
-
if (status === "searching") return /* @__PURE__ */ jsx12(
|
|
9100
|
+
if (status === "searching") return /* @__PURE__ */ jsx12(Badge4, { children: "searching\u2026" });
|
|
9725
9101
|
if (!hasText || status === "idle") return null;
|
|
9726
9102
|
return /* @__PURE__ */ jsxs11("span", { style: { fontVariantNumeric: "tabular-nums", fontSize: 10, opacity: 0.55 }, children: [
|
|
9727
9103
|
displayIndex,
|
|
@@ -9747,7 +9123,7 @@ function FindPanelView({
|
|
|
9747
9123
|
}
|
|
9748
9124
|
};
|
|
9749
9125
|
const renderMatch = (match, index) => /* @__PURE__ */ jsx12(
|
|
9750
|
-
|
|
9126
|
+
Row2,
|
|
9751
9127
|
{
|
|
9752
9128
|
noIcon: true,
|
|
9753
9129
|
selected: index === state.index,
|
|
@@ -9771,10 +9147,10 @@ function FindPanelView({
|
|
|
9771
9147
|
let flatIndex = -1;
|
|
9772
9148
|
return /* @__PURE__ */ jsxs11("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, onKeyDown, children: [
|
|
9773
9149
|
/* @__PURE__ */ jsx12(
|
|
9774
|
-
|
|
9150
|
+
Toolbar3,
|
|
9775
9151
|
{
|
|
9776
9152
|
left: /* @__PURE__ */ jsx12(
|
|
9777
|
-
|
|
9153
|
+
SearchField3,
|
|
9778
9154
|
{
|
|
9779
9155
|
value: state.text,
|
|
9780
9156
|
onChange: (value) => controller.setText(value),
|
|
@@ -9783,7 +9159,7 @@ function FindPanelView({
|
|
|
9783
9159
|
),
|
|
9784
9160
|
right: /* @__PURE__ */ jsxs11(ToolbarGroup2, { end: true, children: [
|
|
9785
9161
|
/* @__PURE__ */ jsx12(
|
|
9786
|
-
|
|
9162
|
+
IconButton4,
|
|
9787
9163
|
{
|
|
9788
9164
|
label: "Match case",
|
|
9789
9165
|
active: state.options.caseSensitive,
|
|
@@ -9792,7 +9168,7 @@ function FindPanelView({
|
|
|
9792
9168
|
}
|
|
9793
9169
|
),
|
|
9794
9170
|
/* @__PURE__ */ jsx12(
|
|
9795
|
-
|
|
9171
|
+
IconButton4,
|
|
9796
9172
|
{
|
|
9797
9173
|
label: "Whole word",
|
|
9798
9174
|
active: state.options.wholeWord,
|
|
@@ -9801,7 +9177,7 @@ function FindPanelView({
|
|
|
9801
9177
|
}
|
|
9802
9178
|
),
|
|
9803
9179
|
/* @__PURE__ */ jsx12(
|
|
9804
|
-
|
|
9180
|
+
IconButton4,
|
|
9805
9181
|
{
|
|
9806
9182
|
label: "Regular expression",
|
|
9807
9183
|
active: state.options.regex,
|
|
@@ -9813,7 +9189,7 @@ function FindPanelView({
|
|
|
9813
9189
|
}
|
|
9814
9190
|
),
|
|
9815
9191
|
/* @__PURE__ */ jsx12(
|
|
9816
|
-
|
|
9192
|
+
Toolbar3,
|
|
9817
9193
|
{
|
|
9818
9194
|
divided: false,
|
|
9819
9195
|
left: /* @__PURE__ */ jsx12(
|
|
@@ -9829,7 +9205,7 @@ function FindPanelView({
|
|
|
9829
9205
|
),
|
|
9830
9206
|
right: /* @__PURE__ */ jsxs11(ToolbarGroup2, { end: true, children: [
|
|
9831
9207
|
/* @__PURE__ */ jsx12(
|
|
9832
|
-
|
|
9208
|
+
IconButton4,
|
|
9833
9209
|
{
|
|
9834
9210
|
label: "Previous match",
|
|
9835
9211
|
disabled: state.matches.length === 0,
|
|
@@ -9838,7 +9214,7 @@ function FindPanelView({
|
|
|
9838
9214
|
}
|
|
9839
9215
|
),
|
|
9840
9216
|
/* @__PURE__ */ jsx12(
|
|
9841
|
-
|
|
9217
|
+
IconButton4,
|
|
9842
9218
|
{
|
|
9843
9219
|
label: "Next match",
|
|
9844
9220
|
disabled: state.matches.length === 0,
|
|
@@ -9852,10 +9228,10 @@ function FindPanelView({
|
|
|
9852
9228
|
),
|
|
9853
9229
|
state.message && state.status === "invalidPattern" ? /* @__PURE__ */ jsx12("div", { style: { padding: "2px 8px 4px", fontSize: 9, opacity: 0.6 }, children: state.message }) : null,
|
|
9854
9230
|
state.replaceVisible ? /* @__PURE__ */ jsx12(
|
|
9855
|
-
|
|
9231
|
+
Toolbar3,
|
|
9856
9232
|
{
|
|
9857
9233
|
left: /* @__PURE__ */ jsx12(
|
|
9858
|
-
|
|
9234
|
+
SearchField3,
|
|
9859
9235
|
{
|
|
9860
9236
|
value: state.replaceText,
|
|
9861
9237
|
onChange: (value) => controller.setReplaceText(value),
|
|
@@ -9872,24 +9248,24 @@ function FindPanelView({
|
|
|
9872
9248
|
] })
|
|
9873
9249
|
}
|
|
9874
9250
|
) : null,
|
|
9875
|
-
showResults ? /* @__PURE__ */ jsx12(
|
|
9876
|
-
|
|
9251
|
+
showResults ? /* @__PURE__ */ jsx12(ScrollArea3, { children: state.status === "idle" ? /* @__PURE__ */ jsx12(EmptyState4, { title: "Find", hint: "Type to search. Enter goes to the next match." }) : state.status === "invalidPattern" ? /* @__PURE__ */ jsx12(
|
|
9252
|
+
EmptyState4,
|
|
9877
9253
|
{
|
|
9878
9254
|
title: "Invalid pattern",
|
|
9879
9255
|
hint: state.message ?? "The expression could not be read. Fix it to search."
|
|
9880
9256
|
}
|
|
9881
|
-
) : state.status === "failed" ? /* @__PURE__ */ jsx12(
|
|
9882
|
-
|
|
9257
|
+
) : state.status === "failed" ? /* @__PURE__ */ jsx12(EmptyState4, { title: "Search failed", hint: state.message ?? "The host could not complete the search." }) : state.noResults ? /* @__PURE__ */ jsx12(EmptyState4, { title: "No matches", hint: `Nothing in scope matches \u201C${state.text}\u201D.` }) : state.groups.length === 1 && state.groups[0].id === "" ? /* @__PURE__ */ jsx12(RowList2, { children: state.matches.map((m) => renderMatch(m, ++flatIndex)) }) : state.groups.map((group) => /* @__PURE__ */ jsx12(
|
|
9258
|
+
Section2,
|
|
9883
9259
|
{
|
|
9884
9260
|
title: group.label || "Results",
|
|
9885
9261
|
flush: true,
|
|
9886
|
-
badge: /* @__PURE__ */ jsx12(
|
|
9887
|
-
children: /* @__PURE__ */ jsx12(
|
|
9262
|
+
badge: /* @__PURE__ */ jsx12(Badge4, { children: group.matches.length }),
|
|
9263
|
+
children: /* @__PURE__ */ jsx12(RowList2, { children: group.matches.map((m) => renderMatch(m, ++flatIndex)) })
|
|
9888
9264
|
},
|
|
9889
9265
|
group.id
|
|
9890
9266
|
)) }) : null,
|
|
9891
9267
|
/* @__PURE__ */ jsx12(
|
|
9892
|
-
|
|
9268
|
+
StatusBar4,
|
|
9893
9269
|
{
|
|
9894
9270
|
left: state.truncated ? `showing first ${state.matches.length}` : void 0,
|
|
9895
9271
|
right: state.options.scope
|
|
@@ -10539,17 +9915,17 @@ var commentsManifest = {
|
|
|
10539
9915
|
// src/edit/comments/react/CommentsPanelView.tsx
|
|
10540
9916
|
import { useSyncExternalStore as useSyncExternalStore8 } from "react";
|
|
10541
9917
|
import {
|
|
10542
|
-
Badge as
|
|
10543
|
-
EmptyState as
|
|
10544
|
-
ScrollArea as
|
|
10545
|
-
Section as
|
|
9918
|
+
Badge as Badge5,
|
|
9919
|
+
EmptyState as EmptyState5,
|
|
9920
|
+
ScrollArea as ScrollArea4,
|
|
9921
|
+
Section as Section3,
|
|
10546
9922
|
SegmentedControl as SegmentedControl2,
|
|
10547
|
-
StatusBar as
|
|
9923
|
+
StatusBar as StatusBar5,
|
|
10548
9924
|
TextButton as TextButton3,
|
|
10549
|
-
Toolbar as
|
|
9925
|
+
Toolbar as Toolbar4,
|
|
10550
9926
|
ToolbarGroup as ToolbarGroup3
|
|
10551
9927
|
} from "@xenosystem/components/chrome";
|
|
10552
|
-
import { Fragment as
|
|
9928
|
+
import { Fragment as Fragment6, jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
10553
9929
|
var ANCHOR_BADGE = {
|
|
10554
9930
|
live: null,
|
|
10555
9931
|
stale: {
|
|
@@ -10589,8 +9965,8 @@ function ThreadCard({
|
|
|
10589
9965
|
},
|
|
10590
9966
|
children: /* @__PURE__ */ jsxs12("div", { style: { padding: "6px 8px", display: "flex", flexDirection: "column", gap: 4 }, children: [
|
|
10591
9967
|
/* @__PURE__ */ jsxs12("div", { style: { display: "flex", alignItems: "center", gap: 4 }, children: [
|
|
10592
|
-
badge ? /* @__PURE__ */ jsx13(
|
|
10593
|
-
thread.resolved ? /* @__PURE__ */ jsx13(
|
|
9968
|
+
badge ? /* @__PURE__ */ jsx13(Badge5, { tone: badge.tone, title: badge.title, children: badge.label }) : null,
|
|
9969
|
+
thread.resolved ? /* @__PURE__ */ jsx13(Badge5, { children: "resolved" }) : null,
|
|
10594
9970
|
/* @__PURE__ */ jsx13("span", { style: { marginLeft: "auto", fontSize: 9, opacity: 0.4 }, children: formatAge(thread.createdAt, now) })
|
|
10595
9971
|
] }),
|
|
10596
9972
|
thread.anchorLabel ? /* @__PURE__ */ jsx13(
|
|
@@ -10690,7 +10066,7 @@ function CommentsPanelView({
|
|
|
10690
10066
|
const resolved = state.threads.filter((t) => t.thread.resolved);
|
|
10691
10067
|
return /* @__PURE__ */ jsxs12("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, children: [
|
|
10692
10068
|
/* @__PURE__ */ jsx13(
|
|
10693
|
-
|
|
10069
|
+
Toolbar4,
|
|
10694
10070
|
{
|
|
10695
10071
|
left: /* @__PURE__ */ jsx13(
|
|
10696
10072
|
SegmentedControl2,
|
|
@@ -10729,23 +10105,23 @@ function CommentsPanelView({
|
|
|
10729
10105
|
" about.",
|
|
10730
10106
|
state.filter.includeOrphaned === false ? /* @__PURE__ */ jsx13(TextButton3, { onClick: () => controller.setFilter({ includeOrphaned: true }), children: "Show" }) : null
|
|
10731
10107
|
] }) : null,
|
|
10732
|
-
/* @__PURE__ */ jsx13(
|
|
10108
|
+
/* @__PURE__ */ jsx13(ScrollArea4, { children: state.threads.length === 0 ? state.filteredEmpty ? (
|
|
10733
10109
|
// NOT "no comments". There are comments; this filter hides them, and telling a
|
|
10734
10110
|
// reviewer their feedback is gone is worse than telling them nothing.
|
|
10735
10111
|
/* @__PURE__ */ jsx13(
|
|
10736
|
-
|
|
10112
|
+
EmptyState5,
|
|
10737
10113
|
{
|
|
10738
10114
|
title: "Nothing matches this filter",
|
|
10739
10115
|
hint: `${state.totals.all} comment${state.totals.all === 1 ? "" : "s"} on this document.`
|
|
10740
10116
|
}
|
|
10741
10117
|
)
|
|
10742
10118
|
) : /* @__PURE__ */ jsx13(
|
|
10743
|
-
|
|
10119
|
+
EmptyState5,
|
|
10744
10120
|
{
|
|
10745
10121
|
title: "No comments",
|
|
10746
10122
|
hint: emptyHint ?? "Select something and add a comment."
|
|
10747
10123
|
}
|
|
10748
|
-
) : /* @__PURE__ */ jsxs12(
|
|
10124
|
+
) : /* @__PURE__ */ jsxs12(Fragment6, { children: [
|
|
10749
10125
|
open.map((view) => /* @__PURE__ */ jsx13(
|
|
10750
10126
|
ThreadCard,
|
|
10751
10127
|
{
|
|
@@ -10756,7 +10132,7 @@ function CommentsPanelView({
|
|
|
10756
10132
|
},
|
|
10757
10133
|
view.thread.id
|
|
10758
10134
|
)),
|
|
10759
|
-
showResolved && resolved.length > 0 ? /* @__PURE__ */ jsx13(
|
|
10135
|
+
showResolved && resolved.length > 0 ? /* @__PURE__ */ jsx13(Section3, { title: `Resolved (${resolved.length})`, flush: true, children: resolved.map((view) => /* @__PURE__ */ jsx13(
|
|
10760
10136
|
ThreadCard,
|
|
10761
10137
|
{
|
|
10762
10138
|
view,
|
|
@@ -10807,7 +10183,7 @@ function CommentsPanelView({
|
|
|
10807
10183
|
) })
|
|
10808
10184
|
] }),
|
|
10809
10185
|
/* @__PURE__ */ jsx13(
|
|
10810
|
-
|
|
10186
|
+
StatusBar5,
|
|
10811
10187
|
{
|
|
10812
10188
|
left: `${state.totals.open} open`,
|
|
10813
10189
|
right: state.totals.stale > 0 ? `${state.totals.stale} edited` : void 0
|
|
@@ -11979,8 +11355,8 @@ var nodegraphManifest = {
|
|
|
11979
11355
|
|
|
11980
11356
|
// src/edit/nodegraph/react/NodeGraphPanelView.tsx
|
|
11981
11357
|
import { useCallback as useCallback7, useEffect as useEffect7, useRef as useRef8, useSyncExternalStore as useSyncExternalStore9 } from "react";
|
|
11982
|
-
import { EmptyState as
|
|
11983
|
-
import { Fragment as
|
|
11358
|
+
import { EmptyState as EmptyState6, StatusBar as StatusBar6, Toolbar as Toolbar5, ToolbarGroup as ToolbarGroup4 } from "@xenosystem/components/chrome";
|
|
11359
|
+
import { Fragment as Fragment7, jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
11984
11360
|
var HEADER_H2 = 24;
|
|
11985
11361
|
var PORT_ROW_H2 = 18;
|
|
11986
11362
|
function NodeGraphPanelView({ controller }) {
|
|
@@ -12061,7 +11437,7 @@ function NodeGraphPanelView({ controller }) {
|
|
|
12061
11437
|
const total = state.graph?.nodes.length ?? 0;
|
|
12062
11438
|
return /* @__PURE__ */ jsxs13("div", { style: SHELL2, children: [
|
|
12063
11439
|
/* @__PURE__ */ jsx14(
|
|
12064
|
-
|
|
11440
|
+
Toolbar5,
|
|
12065
11441
|
{
|
|
12066
11442
|
right: /* @__PURE__ */ jsxs13(ToolbarGroup4, { end: true, children: [
|
|
12067
11443
|
/* @__PURE__ */ jsx14("button", { type: "button", style: button2(), onClick: () => controller.fit(false), children: "Fit" }),
|
|
@@ -12069,7 +11445,7 @@ function NodeGraphPanelView({ controller }) {
|
|
|
12069
11445
|
] })
|
|
12070
11446
|
}
|
|
12071
11447
|
),
|
|
12072
|
-
total === 0 ? /* @__PURE__ */ jsx14(
|
|
11448
|
+
total === 0 ? /* @__PURE__ */ jsx14(EmptyState6, { title: "Empty graph", hint: "Wire a host graph into this panel's input." }) : /* @__PURE__ */ jsxs13(
|
|
12073
11449
|
"div",
|
|
12074
11450
|
{
|
|
12075
11451
|
ref: containerRef,
|
|
@@ -12133,7 +11509,7 @@ function NodeGraphPanelView({ controller }) {
|
|
|
12133
11509
|
}
|
|
12134
11510
|
),
|
|
12135
11511
|
/* @__PURE__ */ jsx14(
|
|
12136
|
-
|
|
11512
|
+
StatusBar6,
|
|
12137
11513
|
{
|
|
12138
11514
|
left: `${total} node${total === 1 ? "" : "s"}`,
|
|
12139
11515
|
right: /* @__PURE__ */ jsxs13("span", { className: "tabular-nums", children: [
|
|
@@ -12203,7 +11579,7 @@ function NodeRect({ node, selected, zoom }) {
|
|
|
12203
11579
|
children: node.title
|
|
12204
11580
|
}
|
|
12205
11581
|
),
|
|
12206
|
-
node.collapsed ? null : /* @__PURE__ */ jsxs13(
|
|
11582
|
+
node.collapsed ? null : /* @__PURE__ */ jsxs13(Fragment7, { children: [
|
|
12207
11583
|
node.inputs.map((port, i) => /* @__PURE__ */ jsx14(
|
|
12208
11584
|
Port,
|
|
12209
11585
|
{
|
|
@@ -13508,22 +12884,22 @@ var treeManifest = {
|
|
|
13508
12884
|
// src/edit/tree/react/TreePanelView.tsx
|
|
13509
12885
|
import { useCallback as useCallback8, useEffect as useEffect8, useRef as useRef9, useState as useState2, useSyncExternalStore as useSyncExternalStore10 } from "react";
|
|
13510
12886
|
import {
|
|
13511
|
-
Badge as
|
|
13512
|
-
EmptyState as
|
|
12887
|
+
Badge as Badge6,
|
|
12888
|
+
EmptyState as EmptyState7,
|
|
13513
12889
|
ErrorState,
|
|
13514
|
-
IconButton as
|
|
12890
|
+
IconButton as IconButton5,
|
|
13515
12891
|
LoadingState,
|
|
13516
|
-
Row as
|
|
13517
|
-
ScrollArea as
|
|
13518
|
-
SearchField as
|
|
13519
|
-
StatusBar as
|
|
13520
|
-
Toolbar as
|
|
12892
|
+
Row as Row3,
|
|
12893
|
+
ScrollArea as ScrollArea5,
|
|
12894
|
+
SearchField as SearchField4,
|
|
12895
|
+
StatusBar as StatusBar7,
|
|
12896
|
+
Toolbar as Toolbar6,
|
|
13521
12897
|
ToolbarGroup as ToolbarGroup5
|
|
13522
12898
|
} from "@xenosystem/components/chrome";
|
|
13523
12899
|
import { computeWindow as computeWindow3 } from "@xenosystem/tree-core";
|
|
13524
12900
|
|
|
13525
12901
|
// src/edit/tree/react/icons.tsx
|
|
13526
|
-
import { Fragment as
|
|
12902
|
+
import { Fragment as Fragment8, jsx as jsx15, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
13527
12903
|
function Svg({ children, size = 11 }) {
|
|
13528
12904
|
return /* @__PURE__ */ jsx15(
|
|
13529
12905
|
"svg",
|
|
@@ -13576,37 +12952,37 @@ function RefreshGlyph() {
|
|
|
13576
12952
|
}
|
|
13577
12953
|
var PATHS = {
|
|
13578
12954
|
folder: /* @__PURE__ */ jsx15("path", { d: "M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z" }),
|
|
13579
|
-
file: /* @__PURE__ */ jsxs14(
|
|
12955
|
+
file: /* @__PURE__ */ jsxs14(Fragment8, { children: [
|
|
13580
12956
|
/* @__PURE__ */ jsx15("path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" }),
|
|
13581
12957
|
/* @__PURE__ */ jsx15("path", { d: "M14 2v4a2 2 0 0 0 2 2h4" })
|
|
13582
12958
|
] }),
|
|
13583
|
-
"folder-tree": /* @__PURE__ */ jsxs14(
|
|
12959
|
+
"folder-tree": /* @__PURE__ */ jsxs14(Fragment8, { children: [
|
|
13584
12960
|
/* @__PURE__ */ jsx15("path", { d: "M20 10a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2.5a1 1 0 0 1-.8-.4l-.9-1.2A1 1 0 0 0 15 3h-2a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z" }),
|
|
13585
12961
|
/* @__PURE__ */ jsx15("path", { d: "M20 21a1 1 0 0 0 1-1v-3a1 1 0 0 0-1-1h-2.5a1 1 0 0 1-.8-.4l-.9-1.2a1 1 0 0 0-.8-.4h-2a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z" }),
|
|
13586
12962
|
/* @__PURE__ */ jsx15("path", { d: "M3 5a2 2 0 0 0 2 2h3" }),
|
|
13587
12963
|
/* @__PURE__ */ jsx15("path", { d: "M3 3v13a2 2 0 0 0 2 2h3" })
|
|
13588
12964
|
] }),
|
|
13589
|
-
box: /* @__PURE__ */ jsxs14(
|
|
12965
|
+
box: /* @__PURE__ */ jsxs14(Fragment8, { children: [
|
|
13590
12966
|
/* @__PURE__ */ jsx15("path", { d: "M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z" }),
|
|
13591
12967
|
/* @__PURE__ */ jsx15("path", { d: "m3.3 7 8.7 5 8.7-5" }),
|
|
13592
12968
|
/* @__PURE__ */ jsx15("path", { d: "M12 22V12" })
|
|
13593
12969
|
] }),
|
|
13594
12970
|
component: /* @__PURE__ */ jsx15("path", { d: "m12 2 4 4-4 4-4-4Zm0 12 4 4-4 4-4-4ZM2 12l4-4 4 4-4 4Zm12 0 4-4 4 4-4 4Z" }),
|
|
13595
|
-
"file-text": /* @__PURE__ */ jsxs14(
|
|
12971
|
+
"file-text": /* @__PURE__ */ jsxs14(Fragment8, { children: [
|
|
13596
12972
|
/* @__PURE__ */ jsx15("path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" }),
|
|
13597
12973
|
/* @__PURE__ */ jsx15("path", { d: "M14 2v4a2 2 0 0 0 2 2h4" }),
|
|
13598
12974
|
/* @__PURE__ */ jsx15("path", { d: "M8 13h8M8 17h5" })
|
|
13599
12975
|
] }),
|
|
13600
|
-
heading: /* @__PURE__ */ jsx15(
|
|
13601
|
-
bot: /* @__PURE__ */ jsxs14(
|
|
12976
|
+
heading: /* @__PURE__ */ jsx15(Fragment8, { children: /* @__PURE__ */ jsx15("path", { d: "M6 4v16M18 4v16M6 12h12" }) }),
|
|
12977
|
+
bot: /* @__PURE__ */ jsxs14(Fragment8, { children: [
|
|
13602
12978
|
/* @__PURE__ */ jsx15("rect", { x: "3", y: "8", width: "18", height: "12", rx: "2" }),
|
|
13603
12979
|
/* @__PURE__ */ jsx15("path", { d: "M12 4v4M8 14h.01M16 14h.01" })
|
|
13604
12980
|
] }),
|
|
13605
|
-
link: /* @__PURE__ */ jsxs14(
|
|
12981
|
+
link: /* @__PURE__ */ jsxs14(Fragment8, { children: [
|
|
13606
12982
|
/* @__PURE__ */ jsx15("path", { d: "M10 13a5 5 0 0 0 7.5.5l3-3a5 5 0 0 0-7-7l-1.8 1.7" }),
|
|
13607
12983
|
/* @__PURE__ */ jsx15("path", { d: "M14 11a5 5 0 0 0-7.5-.5l-3 3a5 5 0 0 0 7 7l1.8-1.7" })
|
|
13608
12984
|
] }),
|
|
13609
|
-
"link-2-off": /* @__PURE__ */ jsxs14(
|
|
12985
|
+
"link-2-off": /* @__PURE__ */ jsxs14(Fragment8, { children: [
|
|
13610
12986
|
/* @__PURE__ */ jsx15("path", { d: "M9 17H7A5 5 0 0 1 7 7" }),
|
|
13611
12987
|
/* @__PURE__ */ jsx15("path", { d: "M15 7h2a5 5 0 0 1 4 8" }),
|
|
13612
12988
|
/* @__PURE__ */ jsx15("path", { d: "M8 12h4" }),
|
|
@@ -13619,7 +12995,7 @@ function TreeIcon({ name, size = 11 }) {
|
|
|
13619
12995
|
}
|
|
13620
12996
|
|
|
13621
12997
|
// src/edit/tree/react/TreePanelView.tsx
|
|
13622
|
-
import { Fragment as
|
|
12998
|
+
import { Fragment as Fragment9, jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
13623
12999
|
function TreePanelView({
|
|
13624
13000
|
controller,
|
|
13625
13001
|
rowHeight = 24,
|
|
@@ -13651,7 +13027,7 @@ function TreePanelView({
|
|
|
13651
13027
|
const sourceState = source?.sourceState ?? "idle";
|
|
13652
13028
|
const body = (() => {
|
|
13653
13029
|
if (!source || sourceState === "idle") {
|
|
13654
|
-
return /* @__PURE__ */ jsx16(
|
|
13030
|
+
return /* @__PURE__ */ jsx16(EmptyState7, { title: "No source", hint: emptyHint ?? "Connect a source to browse it." });
|
|
13655
13031
|
}
|
|
13656
13032
|
if (sourceState === "loading" && state.rows.length === 0) {
|
|
13657
13033
|
return /* @__PURE__ */ jsx16(LoadingState, { label: source.sourceMessage ?? "Loading\u2026" });
|
|
@@ -13668,8 +13044,8 @@ function TreePanelView({
|
|
|
13668
13044
|
);
|
|
13669
13045
|
}
|
|
13670
13046
|
if (state.rows.length === 0) {
|
|
13671
|
-
return state.filter ? /* @__PURE__ */ jsx16(
|
|
13672
|
-
|
|
13047
|
+
return state.filter ? /* @__PURE__ */ jsx16(EmptyState7, { title: "No matches", hint: `Nothing matches \u201C${state.filter}\u201D.` }) : /* @__PURE__ */ jsx16(
|
|
13048
|
+
EmptyState7,
|
|
13673
13049
|
{
|
|
13674
13050
|
title: "Nothing here",
|
|
13675
13051
|
hint: emptyHint ?? source.sourceMessage ?? "This source has no items yet."
|
|
@@ -13684,7 +13060,7 @@ function TreePanelView({
|
|
|
13684
13060
|
overscan
|
|
13685
13061
|
});
|
|
13686
13062
|
const slice = state.rows.slice(window2.startIndex, window2.endIndex);
|
|
13687
|
-
return /* @__PURE__ */ jsx16(
|
|
13063
|
+
return /* @__PURE__ */ jsx16(ScrollArea5, { children: /* @__PURE__ */ jsx16(
|
|
13688
13064
|
"div",
|
|
13689
13065
|
{
|
|
13690
13066
|
ref: scrollRef,
|
|
@@ -13716,10 +13092,10 @@ function TreePanelView({
|
|
|
13716
13092
|
})();
|
|
13717
13093
|
return /* @__PURE__ */ jsxs15("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, children: [
|
|
13718
13094
|
/* @__PURE__ */ jsx16(
|
|
13719
|
-
|
|
13095
|
+
Toolbar6,
|
|
13720
13096
|
{
|
|
13721
13097
|
left: showSearch ? /* @__PURE__ */ jsx16(
|
|
13722
|
-
|
|
13098
|
+
SearchField4,
|
|
13723
13099
|
{
|
|
13724
13100
|
value: state.filter,
|
|
13725
13101
|
onChange: (term) => controller.setFilter(term),
|
|
@@ -13727,22 +13103,22 @@ function TreePanelView({
|
|
|
13727
13103
|
}
|
|
13728
13104
|
) : void 0,
|
|
13729
13105
|
right: /* @__PURE__ */ jsxs15(ToolbarGroup5, { end: true, children: [
|
|
13730
|
-
/* @__PURE__ */ jsx16(
|
|
13106
|
+
/* @__PURE__ */ jsx16(IconButton5, { icon: /* @__PURE__ */ jsx16(ExpandGlyph, {}), label: "Expand all", onClick: () => controller.expandAll() }),
|
|
13731
13107
|
/* @__PURE__ */ jsx16(
|
|
13732
|
-
|
|
13108
|
+
IconButton5,
|
|
13733
13109
|
{
|
|
13734
13110
|
icon: /* @__PURE__ */ jsx16(CollapseGlyph, {}),
|
|
13735
13111
|
label: "Collapse all",
|
|
13736
13112
|
onClick: () => controller.collapseAll()
|
|
13737
13113
|
}
|
|
13738
13114
|
),
|
|
13739
|
-
/* @__PURE__ */ jsx16(
|
|
13115
|
+
/* @__PURE__ */ jsx16(IconButton5, { icon: /* @__PURE__ */ jsx16(RefreshGlyph, {}), label: "Refresh", onClick: () => controller.refresh() })
|
|
13740
13116
|
] })
|
|
13741
13117
|
}
|
|
13742
13118
|
),
|
|
13743
13119
|
body,
|
|
13744
13120
|
/* @__PURE__ */ jsx16(
|
|
13745
|
-
|
|
13121
|
+
StatusBar7,
|
|
13746
13122
|
{
|
|
13747
13123
|
left: `${state.rows.length} item${state.rows.length === 1 ? "" : "s"}`,
|
|
13748
13124
|
right: state.selection.length > 0 ? `${state.selection.length} selected` : void 0
|
|
@@ -13801,7 +13177,7 @@ function TreeRowView({
|
|
|
13801
13177
|
},
|
|
13802
13178
|
title: drop?.reason,
|
|
13803
13179
|
children: /* @__PURE__ */ jsx16(
|
|
13804
|
-
|
|
13180
|
+
Row3,
|
|
13805
13181
|
{
|
|
13806
13182
|
role: "treeitem",
|
|
13807
13183
|
"aria-expanded": row.container ? row.expanded : void 0,
|
|
@@ -13836,7 +13212,7 @@ function TreeRowView({
|
|
|
13836
13212
|
onPointerUp: () => {
|
|
13837
13213
|
if (state.drag) controller.endDrag();
|
|
13838
13214
|
},
|
|
13839
|
-
icon: /* @__PURE__ */ jsxs15(
|
|
13215
|
+
icon: /* @__PURE__ */ jsxs15(Fragment9, { children: [
|
|
13840
13216
|
twisty,
|
|
13841
13217
|
/* @__PURE__ */ jsx16(NodeIcon, { icon: node.icon ?? defaultIconFor(node.kind) })
|
|
13842
13218
|
] }),
|
|
@@ -13866,15 +13242,15 @@ function TreeRowView({
|
|
|
13866
13242
|
}
|
|
13867
13243
|
) : node.label,
|
|
13868
13244
|
meta: /* @__PURE__ */ jsx16(ChildStateChip, { row, controller }),
|
|
13869
|
-
trailing: /* @__PURE__ */ jsxs15(
|
|
13245
|
+
trailing: /* @__PURE__ */ jsxs15(Fragment9, { children: [
|
|
13870
13246
|
columns?.map((columnId) => /* @__PURE__ */ jsx16("span", { style: { opacity: 0.7, fontVariantNumeric: "tabular-nums" }, children: node.columns?.[columnId] ?? "" }, columnId)),
|
|
13871
13247
|
node.glyphs?.map((glyph) => /* @__PURE__ */ jsx16("span", { title: glyph.title, style: { display: "flex", opacity: 0.7 }, children: /* @__PURE__ */ jsx16(NodeIcon, { icon: glyph.icon }) }, glyph.id)),
|
|
13872
13248
|
node.badges?.map((badge) => (
|
|
13873
13249
|
// Opaque: the host formatted the text, the panel only places it.
|
|
13874
|
-
/* @__PURE__ */ jsx16(
|
|
13250
|
+
/* @__PURE__ */ jsx16(Badge6, { tone: badge.tone, className: badge.title ? void 0 : void 0, children: badge.text }, badge.id)
|
|
13875
13251
|
)),
|
|
13876
13252
|
node.actions?.map((action) => /* @__PURE__ */ jsx16(
|
|
13877
|
-
|
|
13253
|
+
IconButton5,
|
|
13878
13254
|
{
|
|
13879
13255
|
size: "sm",
|
|
13880
13256
|
icon: /* @__PURE__ */ jsx16(NodeIcon, { icon: action.icon }),
|
|
@@ -13900,7 +13276,7 @@ function ChildStateChip({
|
|
|
13900
13276
|
}
|
|
13901
13277
|
if (row.childState === "error") {
|
|
13902
13278
|
const error = row.node.error;
|
|
13903
|
-
return /* @__PURE__ */ jsx16(
|
|
13279
|
+
return /* @__PURE__ */ jsx16(Badge6, { tone: "error", children: error?.code === "denied" ? "no access" : error?.code ?? "failed" });
|
|
13904
13280
|
}
|
|
13905
13281
|
if (row.node.hasMore && row.expanded) {
|
|
13906
13282
|
return /* @__PURE__ */ jsx16(
|
|
@@ -13917,7 +13293,7 @@ function ChildStateChip({
|
|
|
13917
13293
|
);
|
|
13918
13294
|
}
|
|
13919
13295
|
if (row.node.truncatedAt !== void 0) {
|
|
13920
|
-
return /* @__PURE__ */ jsx16(
|
|
13296
|
+
return /* @__PURE__ */ jsx16(Badge6, { tone: "warning", children: `first ${row.node.truncatedAt}` });
|
|
13921
13297
|
}
|
|
13922
13298
|
if (row.expanded && isEmptyContainer(row.node)) {
|
|
13923
13299
|
return /* @__PURE__ */ jsx16("span", { style: { opacity: 0.4, fontSize: 9 }, children: "empty" });
|