@godxjp/ui 31.13.0 → 31.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent/START-HERE.md +4 -4
- package/agent/components/Image.json +18 -2
- package/agent/components/Timeline.json +4 -3
- package/agent/components/Tree.json +22 -1
- package/agent/components-index.json +2 -2
- package/agent/components.json +44 -6
- package/agent/index.json +4 -4
- package/agent/llms.txt +5 -5
- package/agent/tokens.json +18 -0
- package/dist/components/data-display/image.d.ts +6 -1
- package/dist/components/data-display/image.js +90 -49
- package/dist/components/data-display/index.d.ts +1 -1
- package/dist/components/data-display/timeline.d.ts +12 -2
- package/dist/components/data-display/timeline.js +6 -2
- package/dist/components/data-display/tree.d.ts +1 -1
- package/dist/components/data-display/tree.js +147 -0
- package/dist/contracts/measurement.json +1 -1
- package/dist/i18n/messages/en.json +6 -1
- package/dist/i18n/messages/ja.json +6 -1
- package/dist/i18n/messages/vi.json +6 -1
- package/dist/props/components/data-display.prop.d.ts +67 -1
- package/dist/props/registry.d.ts +69 -0
- package/dist/props/registry.js +71 -0
- package/dist/styles/data-display-layout.css +92 -1
- package/dist/styles/layers.json +1 -1
- package/dist/tokens/components/data-display.css +1 -0
- package/dist/tokens/components/tree.css +3 -0
- package/docs/DESIGN-AUTHORITY.md +6 -0
- package/docs/FRAME-COVERAGE-REPORT.md +1 -1
- package/docs/data-display/image.tsx +40 -0
- package/docs/data-display/timeline.tsx +28 -0
- package/docs/data-display/tree.tsx +82 -0
- package/docs/i18n/messages/en.json +24 -0
- package/docs/i18n/messages/ja.json +24 -0
- package/docs/i18n/messages/vi.json +24 -0
- package/package.json +2 -2
|
@@ -5,7 +5,9 @@ import { Check, CheckCircle2, Plane } from "lucide-react";
|
|
|
5
5
|
const SR_PREFIX_KEY = {
|
|
6
6
|
done: "dataDisplay.timeline.statusDone",
|
|
7
7
|
current: "dataDisplay.timeline.statusCurrent",
|
|
8
|
-
pending: "dataDisplay.timeline.statusPending"
|
|
8
|
+
pending: "dataDisplay.timeline.statusPending",
|
|
9
|
+
// A log entry carries no status semantics (antd's items have no prefix at all), gh#1092.
|
|
10
|
+
log: null
|
|
9
11
|
};
|
|
10
12
|
function resolveStatus(item) {
|
|
11
13
|
if (item.status) {
|
|
@@ -27,6 +29,8 @@ function Timeline({ items, variant = "icon", density = "default" }) {
|
|
|
27
29
|
if (item.icon) {
|
|
28
30
|
const Icon = item.icon;
|
|
29
31
|
glyph = /* @__PURE__ */ jsx(Icon, { "aria-hidden": "true" });
|
|
32
|
+
} else if (status === "log" && variant !== "ordinal") {
|
|
33
|
+
glyph = /* @__PURE__ */ jsx("span", { className: "ui-timeline-pip", "aria-hidden": "true" });
|
|
30
34
|
} else if (variant === "ordinal") {
|
|
31
35
|
glyph = /* @__PURE__ */ jsx("span", { className: "ui-timeline-ordinal", children: ordinal });
|
|
32
36
|
} else if (variant === "status") {
|
|
@@ -69,7 +73,7 @@ function Timeline({ items, variant = "icon", density = "default" }) {
|
|
|
69
73
|
/* @__PURE__ */ jsxs("div", { className: "ui-timeline-body", children: [
|
|
70
74
|
/* @__PURE__ */ jsxs("div", { className: "ui-timeline-head", children: [
|
|
71
75
|
/* @__PURE__ */ jsxs("span", { className: "ui-timeline-title", "data-current": isCurrent ? "true" : void 0, children: [
|
|
72
|
-
/* @__PURE__ */ jsx("span", { className: "sr-only", children: t(SR_PREFIX_KEY[status]) }),
|
|
76
|
+
SR_PREFIX_KEY[status] ? /* @__PURE__ */ jsx("span", { className: "sr-only", children: t(SR_PREFIX_KEY[status]) }) : null,
|
|
73
77
|
item.title
|
|
74
78
|
] }),
|
|
75
79
|
item.time ? /* @__PURE__ */ jsx("span", { className: "ui-timeline-time", children: item.time }) : null
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import type { TreeProp } from "../../props/components/data-display.prop.js";
|
|
3
|
-
export type { TreeNodeProp, TreeProp, TreeProp as TreeProps, } from "../../props/components/data-display.prop.js";
|
|
3
|
+
export type { TreeAllowDropInfoProp, TreeDropInfoProp, TreeDropPositionProp, TreeNodeProp, TreeProp, TreeProp as TreeProps, } from "../../props/components/data-display.prop.js";
|
|
4
4
|
/**
|
|
5
5
|
* `ref` reaches the `role="tree"` container — the element a page scrolls to, measures, or
|
|
6
6
|
* focus-manages. Every unknown prop (`aria-*`, `data-*`) rides `...ariaProps` onto the same node.
|
|
@@ -71,6 +71,10 @@ function TreeRoot({
|
|
|
71
71
|
showLine = false,
|
|
72
72
|
showIcon = false,
|
|
73
73
|
divided = false,
|
|
74
|
+
draggable = false,
|
|
75
|
+
allowDrag,
|
|
76
|
+
allowDrop,
|
|
77
|
+
onDrop,
|
|
74
78
|
variant = "default",
|
|
75
79
|
size = "md",
|
|
76
80
|
disabled = false,
|
|
@@ -82,6 +86,7 @@ function TreeRoot({
|
|
|
82
86
|
const { t } = useTranslation();
|
|
83
87
|
const reactId = React.useId();
|
|
84
88
|
const treeId = id ?? `${reactId}-tree`;
|
|
89
|
+
const dragHintId = `${treeId}-drag-hint`;
|
|
85
90
|
const options = React.useMemo(
|
|
86
91
|
() => normalizeTreeOptions(treeData, fieldNames),
|
|
87
92
|
[treeData, fieldNames]
|
|
@@ -166,6 +171,92 @@ function TreeRoot({
|
|
|
166
171
|
if (node) requestLoadRef.current(node);
|
|
167
172
|
}
|
|
168
173
|
}, [expandedSet, loadData, nodesByValue, requestLoadRef]);
|
|
174
|
+
const parentOf = React.useMemo(() => {
|
|
175
|
+
const map = /* @__PURE__ */ new Map();
|
|
176
|
+
const walk = (list, parent) => {
|
|
177
|
+
for (const node of list) {
|
|
178
|
+
map.set(node.value, parent);
|
|
179
|
+
if (node.children?.length) walk(node.children, node);
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
walk(options, null);
|
|
183
|
+
return map;
|
|
184
|
+
}, [options]);
|
|
185
|
+
const isDraggable = draggable && !disabled;
|
|
186
|
+
const canDrag = (node) => isDraggable && !node.disabled && (allowDrag ? allowDrag(node) : true);
|
|
187
|
+
const canDrop = (dragNode, dropNode, dropPosition) => {
|
|
188
|
+
for (let cursor = dropNode; cursor; ) {
|
|
189
|
+
if (cursor.value === dragNode.value) return false;
|
|
190
|
+
cursor = parentOf.get(cursor.value);
|
|
191
|
+
}
|
|
192
|
+
return allowDrop ? allowDrop({
|
|
193
|
+
dragNode,
|
|
194
|
+
dropNode,
|
|
195
|
+
dropPosition
|
|
196
|
+
}) : true;
|
|
197
|
+
};
|
|
198
|
+
const dragRef = React.useRef(null);
|
|
199
|
+
const [dragValue, setDragValue] = React.useState(null);
|
|
200
|
+
const [dropTarget, setDropTarget] = React.useState(null);
|
|
201
|
+
const [moveAnnouncement, setMoveAnnouncement] = React.useState("");
|
|
202
|
+
const commitDrop = (dragNode, dropNode, dropPosition) => {
|
|
203
|
+
onDrop?.({
|
|
204
|
+
dragNode,
|
|
205
|
+
node: dropNode,
|
|
206
|
+
dropPosition,
|
|
207
|
+
dropToGap: dropPosition !== 0
|
|
208
|
+
});
|
|
209
|
+
const key = dropPosition === -1 ? "dataDisplay.tree.movedBefore" : dropPosition === 1 ? "dataDisplay.tree.movedAfter" : "dataDisplay.tree.movedInside";
|
|
210
|
+
setMoveAnnouncement(
|
|
211
|
+
t(key, { node: reactNodeText(dragNode.label), target: reactNodeText(dropNode.label) })
|
|
212
|
+
);
|
|
213
|
+
};
|
|
214
|
+
const dropPositionAt = (event) => {
|
|
215
|
+
const rect = event.currentTarget.getBoundingClientRect();
|
|
216
|
+
if (rect.height <= 0) return 0;
|
|
217
|
+
const offset = (event.clientY - rect.top) / rect.height;
|
|
218
|
+
if (offset < 0.25) return -1;
|
|
219
|
+
if (offset > 0.75) return 1;
|
|
220
|
+
return 0;
|
|
221
|
+
};
|
|
222
|
+
const clearDrag = () => {
|
|
223
|
+
dragRef.current = null;
|
|
224
|
+
setDragValue(null);
|
|
225
|
+
setDropTarget(null);
|
|
226
|
+
};
|
|
227
|
+
const keyboardMove = (node, direction) => {
|
|
228
|
+
const parent = parentOf.get(node.value) ?? null;
|
|
229
|
+
const siblings = parent ? parent.children ?? [] : options;
|
|
230
|
+
const position = siblings.findIndex((entry) => entry.value === node.value);
|
|
231
|
+
let target;
|
|
232
|
+
let dropPosition;
|
|
233
|
+
if (direction === "up") {
|
|
234
|
+
target = siblings[position - 1];
|
|
235
|
+
dropPosition = -1;
|
|
236
|
+
} else if (direction === "down") {
|
|
237
|
+
target = siblings[position + 1];
|
|
238
|
+
dropPosition = 1;
|
|
239
|
+
} else if (direction === "out") {
|
|
240
|
+
target = parent;
|
|
241
|
+
dropPosition = 1;
|
|
242
|
+
} else {
|
|
243
|
+
const previous = siblings[position - 1];
|
|
244
|
+
const lastChild = previous?.children?.[previous.children.length - 1];
|
|
245
|
+
target = lastChild ?? previous;
|
|
246
|
+
dropPosition = lastChild ? 1 : 0;
|
|
247
|
+
}
|
|
248
|
+
if (!target || !canDrag(node) || !canDrop(node, target, dropPosition)) {
|
|
249
|
+
setMoveAnnouncement(t("dataDisplay.tree.moveRefused", { node: reactNodeText(node.label) }));
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
if (direction === "in") {
|
|
253
|
+
const host = dropPosition === 0 ? target : siblings[position - 1];
|
|
254
|
+
if (host && !expandedSet.has(host.value)) commitExpanded([...expanded, host.value]);
|
|
255
|
+
}
|
|
256
|
+
commitDrop(node, target, dropPosition);
|
|
257
|
+
setActiveValue(node.value);
|
|
258
|
+
pendingFocus.current = node.value;
|
|
259
|
+
};
|
|
169
260
|
const visible = flattenVisibleTree(options, expandedSet);
|
|
170
261
|
const visibleIndex = new Map(visible.map((entry, index) => [entry.node.value, index]));
|
|
171
262
|
const [activeValue, setActiveValue] = React.useState(null);
|
|
@@ -300,6 +391,14 @@ function TreeRoot({
|
|
|
300
391
|
const rtl = isRtl(event.currentTarget);
|
|
301
392
|
const inward = rtl ? "ArrowLeft" : "ArrowRight";
|
|
302
393
|
const outward = rtl ? "ArrowRight" : "ArrowLeft";
|
|
394
|
+
if (isDraggable && event.altKey && (event.key === "ArrowUp" || event.key === "ArrowDown" || event.key === inward || event.key === outward)) {
|
|
395
|
+
event.preventDefault();
|
|
396
|
+
keyboardMove(
|
|
397
|
+
node,
|
|
398
|
+
event.key === "ArrowUp" ? "up" : event.key === "ArrowDown" ? "down" : event.key === inward ? "in" : "out"
|
|
399
|
+
);
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
303
402
|
if (event.key === "ArrowDown") {
|
|
304
403
|
event.preventDefault();
|
|
305
404
|
moveTo(index + 1);
|
|
@@ -366,6 +465,8 @@ function TreeRoot({
|
|
|
366
465
|
const checkState = checkableProp ? checkStateOf(node) : "unchecked";
|
|
367
466
|
const nodeDisabled = disabled || Boolean(node.disabled);
|
|
368
467
|
const labelId = `${treeId}-${node.value}-label`;
|
|
468
|
+
const nodeDraggable = canDrag(node);
|
|
469
|
+
const dropHere = dropTarget?.value === node.value ? dropTarget.position : void 0;
|
|
369
470
|
const glyph = node.icon ?? (variant === "directory" ? hasChildren ? isOpen ? /* @__PURE__ */ jsx(FolderOpen, {}) : /* @__PURE__ */ jsx(Folder, {}) : /* @__PURE__ */ jsx(FileIcon, {}) : null);
|
|
370
471
|
return /* @__PURE__ */ jsxs(
|
|
371
472
|
"div",
|
|
@@ -395,6 +496,47 @@ function TreeRoot({
|
|
|
395
496
|
"data-selected": isSelected ? "true" : void 0,
|
|
396
497
|
"data-disabled": nodeDisabled ? "" : void 0,
|
|
397
498
|
"data-filter-node": isFilterMatch ? "true" : void 0,
|
|
499
|
+
draggable: nodeDraggable || void 0,
|
|
500
|
+
"data-dragging": dragValue === node.value ? "true" : void 0,
|
|
501
|
+
"data-drop-position": dropHere === void 0 ? void 0 : dropHere === -1 ? "before" : dropHere === 1 ? "after" : "inside",
|
|
502
|
+
onDragStart: isDraggable ? (event) => {
|
|
503
|
+
if (!nodeDraggable) {
|
|
504
|
+
event.preventDefault();
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
507
|
+
event.dataTransfer.effectAllowed = "move";
|
|
508
|
+
event.dataTransfer.setData("text/plain", node.value);
|
|
509
|
+
dragRef.current = node.value;
|
|
510
|
+
setDragValue(node.value);
|
|
511
|
+
} : void 0,
|
|
512
|
+
onDragOver: isDraggable ? (event) => {
|
|
513
|
+
const dragged = dragRef.current === null ? void 0 : nodesByValue.get(dragRef.current);
|
|
514
|
+
if (!dragged) return;
|
|
515
|
+
const position = dropPositionAt(event);
|
|
516
|
+
if (!canDrop(dragged, node, position)) {
|
|
517
|
+
if (dropTarget) setDropTarget(null);
|
|
518
|
+
return;
|
|
519
|
+
}
|
|
520
|
+
event.preventDefault();
|
|
521
|
+
event.dataTransfer.dropEffect = "move";
|
|
522
|
+
if (dropTarget?.value !== node.value || dropTarget.position !== position) {
|
|
523
|
+
setDropTarget({ value: node.value, position });
|
|
524
|
+
}
|
|
525
|
+
} : void 0,
|
|
526
|
+
onDragLeave: isDraggable ? (event) => {
|
|
527
|
+
if (event.currentTarget.contains(event.relatedTarget)) return;
|
|
528
|
+
if (dropTarget?.value === node.value) setDropTarget(null);
|
|
529
|
+
} : void 0,
|
|
530
|
+
onDrop: isDraggable ? (event) => {
|
|
531
|
+
event.preventDefault();
|
|
532
|
+
const dragged = dragRef.current === null ? void 0 : nodesByValue.get(dragRef.current);
|
|
533
|
+
const position = dropPositionAt(event);
|
|
534
|
+
if (dragged && canDrop(dragged, node, position)) {
|
|
535
|
+
commitDrop(dragged, node, position);
|
|
536
|
+
}
|
|
537
|
+
clearDrag();
|
|
538
|
+
} : void 0,
|
|
539
|
+
onDragEnd: isDraggable ? clearDrag : void 0,
|
|
398
540
|
className: "ui-tree-node ui-focus-ring",
|
|
399
541
|
style: { "--tree-node-level": depth },
|
|
400
542
|
children: [
|
|
@@ -549,6 +691,7 @@ function TreeRoot({
|
|
|
549
691
|
"div",
|
|
550
692
|
{
|
|
551
693
|
...ariaProps,
|
|
694
|
+
"aria-describedby": isDraggable ? [ariaProps["aria-describedby"], dragHintId].filter(Boolean).join(" ") : ariaProps["aria-describedby"],
|
|
552
695
|
ref: mergeRefs(forwardedRef, treeRef),
|
|
553
696
|
id: treeId,
|
|
554
697
|
role: "tree",
|
|
@@ -602,6 +745,10 @@ function TreeRoot({
|
|
|
602
745
|
]
|
|
603
746
|
}
|
|
604
747
|
),
|
|
748
|
+
isDraggable ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
749
|
+
/* @__PURE__ */ jsx("span", { id: dragHintId, className: "sr-only", children: t("dataDisplay.tree.dragHint") }),
|
|
750
|
+
/* @__PURE__ */ jsx("span", { role: "status", "aria-live": "polite", className: "sr-only", children: moveAnnouncement })
|
|
751
|
+
] }) : null,
|
|
605
752
|
isEmpty ? /* @__PURE__ */ jsx("p", { role: "status", className: "ui-tree-empty", children: t("dataDisplay.tree.empty") }) : null
|
|
606
753
|
] });
|
|
607
754
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$comment": "AUTO-GENERATED by scripts/gen-measurement-contract.mjs — do not edit. Read this instead of guessing: docs/MEASUREMENT-CONTRACT.md.",
|
|
3
|
-
"version": "31.
|
|
3
|
+
"version": "31.15.0",
|
|
4
4
|
"targetSize": {
|
|
5
5
|
"standard": "WCAG 2.2 SC 2.5.8 Target Size (Minimum), level AA — 24×24 CSS px",
|
|
6
6
|
"min": 24,
|
|
@@ -364,7 +364,12 @@
|
|
|
364
364
|
"loading": "Loading child nodes…",
|
|
365
365
|
"empty": "Nothing to show",
|
|
366
366
|
"selected": "Selected",
|
|
367
|
-
"filterMatch": "Matches the filter"
|
|
367
|
+
"filterMatch": "Matches the filter",
|
|
368
|
+
"dragHint": "Alt plus arrow keys move the focused item: up and down past a sibling, left to outdent, right to indent.",
|
|
369
|
+
"movedBefore": "{node} moved before {target}",
|
|
370
|
+
"movedAfter": "{node} moved after {target}",
|
|
371
|
+
"movedInside": "{node} moved into {target}",
|
|
372
|
+
"moveRefused": "{node} cannot move there"
|
|
368
373
|
},
|
|
369
374
|
"thoughtChain": {
|
|
370
375
|
"label": "Reasoning steps",
|
|
@@ -357,7 +357,12 @@
|
|
|
357
357
|
"loading": "子ノードを読み込み中…",
|
|
358
358
|
"empty": "表示する項目がありません",
|
|
359
359
|
"selected": "選択中",
|
|
360
|
-
"filterMatch": "フィルターに一致"
|
|
360
|
+
"filterMatch": "フィルターに一致",
|
|
361
|
+
"dragHint": "Alt キーと矢印キーでフォーカス中の項目を移動します。上下で兄弟の前後へ、左で階層を上げ、右で階層を下げます。",
|
|
362
|
+
"movedBefore": "{node} を {target} の前に移動しました",
|
|
363
|
+
"movedAfter": "{node} を {target} の後に移動しました",
|
|
364
|
+
"movedInside": "{node} を {target} の中に移動しました",
|
|
365
|
+
"moveRefused": "{node} はそこへ移動できません"
|
|
361
366
|
},
|
|
362
367
|
"thoughtChain": {
|
|
363
368
|
"label": "思考の手順",
|
|
@@ -358,7 +358,12 @@
|
|
|
358
358
|
"loading": "Đang tải nút con…",
|
|
359
359
|
"empty": "Không có gì để hiển thị",
|
|
360
360
|
"selected": "Đã chọn",
|
|
361
|
-
"filterMatch": "Khớp bộ lọc"
|
|
361
|
+
"filterMatch": "Khớp bộ lọc",
|
|
362
|
+
"dragHint": "Alt cùng phím mũi tên di chuyển mục đang chọn: lên và xuống qua mục ngang hàng, trái để lùi cấp, phải để thụt cấp.",
|
|
363
|
+
"movedBefore": "Đã chuyển {node} lên trước {target}",
|
|
364
|
+
"movedAfter": "Đã chuyển {node} xuống sau {target}",
|
|
365
|
+
"movedInside": "Đã chuyển {node} vào trong {target}",
|
|
366
|
+
"moveRefused": "Không thể chuyển {node} tới đó"
|
|
362
367
|
},
|
|
363
368
|
"thoughtChain": {
|
|
364
369
|
"label": "Các bước suy luận",
|
|
@@ -711,6 +711,29 @@ export type TreeNodeProp = TreeOptionProp & {
|
|
|
711
711
|
* `checkedValues`/`defaultCheckedValues`/`onCheckedValuesChange`.
|
|
712
712
|
* @see docs/roadmap/tree-components.md §3
|
|
713
713
|
*/
|
|
714
|
+
/**
|
|
715
|
+
* Where a drop lands relative to `node` (gh#1093): `-1` in the gap BEFORE it, `0` INSIDE it (the
|
|
716
|
+
* dragged node becomes its child), `1` in the gap AFTER it. antd's `onDrop` reports an absolute
|
|
717
|
+
* index and every antd demo subtracts the node's position back out to get exactly this number, so
|
|
718
|
+
* the relative form is what a consumer needs.
|
|
719
|
+
*/
|
|
720
|
+
export type TreeDropPositionProp = -1 | 0 | 1;
|
|
721
|
+
/** `allowDrop` argument (antd `allowDrop({ dragNode, dropNode, dropPosition })`). */
|
|
722
|
+
export type TreeAllowDropInfoProp = {
|
|
723
|
+
dragNode: TreeNodeProp;
|
|
724
|
+
dropNode: TreeNodeProp;
|
|
725
|
+
dropPosition: TreeDropPositionProp;
|
|
726
|
+
};
|
|
727
|
+
/** `onDrop` argument (antd `onDrop({ dragNode, node, dropPosition, dropToGap })`). */
|
|
728
|
+
export type TreeDropInfoProp = {
|
|
729
|
+
/** The node being moved. */
|
|
730
|
+
dragNode: TreeNodeProp;
|
|
731
|
+
/** The node it was dropped on or beside. */
|
|
732
|
+
node: TreeNodeProp;
|
|
733
|
+
dropPosition: TreeDropPositionProp;
|
|
734
|
+
/** `true` when it lands in a gap (becomes a SIBLING of `node`), `false` when it lands inside. */
|
|
735
|
+
dropToGap: boolean;
|
|
736
|
+
};
|
|
714
737
|
export type TreeProp = {
|
|
715
738
|
/** The hierarchy (antd `treeData`). Use `fieldNames` to remap keys off an API response. */
|
|
716
739
|
treeData: readonly TreeNodeProp[];
|
|
@@ -781,6 +804,21 @@ export type TreeProp = {
|
|
|
781
804
|
* capability; see docs/DESIGN-AUTHORITY.md.
|
|
782
805
|
*/
|
|
783
806
|
divided?: boolean;
|
|
807
|
+
/**
|
|
808
|
+
* Let the reader move nodes by dragging (antd `draggable`, gh#1093): drop on the upper or lower
|
|
809
|
+
* quarter of a row to land in the gap before / after it, on the middle to file it inside. The
|
|
810
|
+
* tree never mutates `treeData` — it reports the move through `onDrop` and the consumer persists
|
|
811
|
+
* it. Keyboard equivalent (WCAG 2.5.7): Alt+↑ / Alt+↓ move past the previous / next sibling,
|
|
812
|
+
* Alt+← outdents (after its parent), Alt+→ indents (into the previous sibling); each move is
|
|
813
|
+
* announced through a live region. A node is never dropped into itself or its own subtree.
|
|
814
|
+
*/
|
|
815
|
+
draggable?: boolean;
|
|
816
|
+
/** Per-node drag gate (antd `draggable.nodeDraggable`). Disabled nodes never drag. */
|
|
817
|
+
allowDrag?: (node: TreeNodeProp) => boolean;
|
|
818
|
+
/** Per-target drop gate (antd `allowDrop`). Asked for pointer AND keyboard moves. */
|
|
819
|
+
allowDrop?: (info: TreeAllowDropInfoProp) => boolean;
|
|
820
|
+
/** A move the reader committed (antd `onDrop`). Update `treeData` here. */
|
|
821
|
+
onDrop?: (info: TreeDropInfoProp) => void;
|
|
784
822
|
/** Draw each node's `icon` (antd `showIcon`). `variant="directory"` supplies folder/file glyphs. */
|
|
785
823
|
showIcon?: boolean;
|
|
786
824
|
/** `directory` is antd's `<DirectoryTree>`: folder/file glyphs and a full-row selected band. */
|
|
@@ -793,7 +831,8 @@ export type TreeProp = {
|
|
|
793
831
|
id?: IdProp;
|
|
794
832
|
/** Accessible name of the `role="tree"` container. Required unless `aria-labelledby` is given. */
|
|
795
833
|
"aria-label"?: string;
|
|
796
|
-
"aria-labelledby"?: string;
|
|
834
|
+
"aria-labelledby"?: string; /** Extra description ids; a `draggable` tree appends its own keyboard-move hint. */
|
|
835
|
+
"aria-describedby"?: string;
|
|
797
836
|
};
|
|
798
837
|
/**
|
|
799
838
|
* @see ChatBubble — which side of the conversation the message sits on. LOGICAL, not physical:
|
|
@@ -1251,8 +1290,35 @@ export type ImageProp = Omit<React.ImgHTMLAttributes<HTMLImageElement>, "alt" |
|
|
|
1251
1290
|
placeholder?: React.ReactNode | boolean;
|
|
1252
1291
|
/** `false` = a plain picture, not clickable, not in its group. Default `true`. */
|
|
1253
1292
|
preview?: boolean | ImagePreviewConfigProp;
|
|
1293
|
+
/**
|
|
1294
|
+
* antd Image `width`: the frame's inline size (number = px, or any CSS length). The picture
|
|
1295
|
+
* fills it; with no `height` its block size follows the picture's ratio. Also set on the `<img>`.
|
|
1296
|
+
*/
|
|
1297
|
+
width?: number | string;
|
|
1298
|
+
/**
|
|
1299
|
+
* antd Image `height`: the frame's block size (number = px, or any CSS length). A fixed height
|
|
1300
|
+
* crops the picture to fill (`fit` defaults to `cover`). Also set on the `<img>`.
|
|
1301
|
+
*/
|
|
1302
|
+
height?: number | string;
|
|
1303
|
+
/**
|
|
1304
|
+
* A thumbnail frame on the `Thumbnail` height scale (`--thumbnail-block-size-sm`, `…-size`,
|
|
1305
|
+
* `…-size-lg`: 64 / 96 / 160px) at `--thumbnail-width-ratio` (4 / 3). godx extension — antd has only
|
|
1306
|
+
* `width`/`height`, which override the preset's side they name.
|
|
1307
|
+
*/
|
|
1308
|
+
size?: ImageSizeProp;
|
|
1309
|
+
/** How the picture fills a fixed frame (`object-fit`). Default `cover` once the height is fixed. */
|
|
1310
|
+
fit?: ImageFitProp;
|
|
1311
|
+
/**
|
|
1312
|
+
* Text under the picture, held to the picture's width, so a long file name truncates instead of
|
|
1313
|
+
* widening the tile. Renders a `<figure>` with a `<figcaption>`. godx extension.
|
|
1314
|
+
*/
|
|
1315
|
+
caption?: React.ReactNode;
|
|
1254
1316
|
className?: ClassNameProp;
|
|
1255
1317
|
};
|
|
1318
|
+
/** `Image` thumbnail frame preset — the `Thumbnail` height scale. */
|
|
1319
|
+
export type ImageSizeProp = Extract<SizeProp, "sm" | "md" | "lg">;
|
|
1320
|
+
/** `Image` `fit` — the picture's `object-fit` inside a fixed frame. */
|
|
1321
|
+
export type ImageFitProp = "cover" | "contain";
|
|
1256
1322
|
/**
|
|
1257
1323
|
* @see ImagePreviewGroup — pages the preview across a set of pictures (antd `Image.PreviewGroup`).
|
|
1258
1324
|
*
|
package/dist/props/registry.d.ts
CHANGED
|
@@ -3165,6 +3165,49 @@ export declare const COMPONENT_PROP_REGISTRY: {
|
|
|
3165
3165
|
readonly reason: "The node's own child nodes — the hierarchy itself, not a slot.";
|
|
3166
3166
|
}];
|
|
3167
3167
|
};
|
|
3168
|
+
readonly TreeDropPositionProp: {
|
|
3169
|
+
readonly group: "data-display";
|
|
3170
|
+
readonly file: "components/data-display.prop.ts";
|
|
3171
|
+
readonly vocabulary: readonly [];
|
|
3172
|
+
};
|
|
3173
|
+
readonly TreeAllowDropInfoProp: {
|
|
3174
|
+
readonly group: "data-display";
|
|
3175
|
+
readonly file: "components/data-display.prop.ts";
|
|
3176
|
+
readonly vocabulary: readonly [{
|
|
3177
|
+
readonly field: "dragNode";
|
|
3178
|
+
readonly local: true;
|
|
3179
|
+
readonly reason: "antd `allowDrop` argument: the node being moved (gh#1093).";
|
|
3180
|
+
}, {
|
|
3181
|
+
readonly field: "dropNode";
|
|
3182
|
+
readonly local: true;
|
|
3183
|
+
readonly reason: "antd `allowDrop` argument: the node it would land on or beside.";
|
|
3184
|
+
}, {
|
|
3185
|
+
readonly field: "dropPosition";
|
|
3186
|
+
readonly local: true;
|
|
3187
|
+
readonly reason: "antd `allowDrop` argument: -1 before, 0 inside, 1 after.";
|
|
3188
|
+
}];
|
|
3189
|
+
};
|
|
3190
|
+
readonly TreeDropInfoProp: {
|
|
3191
|
+
readonly group: "data-display";
|
|
3192
|
+
readonly file: "components/data-display.prop.ts";
|
|
3193
|
+
readonly vocabulary: readonly [{
|
|
3194
|
+
readonly field: "dragNode";
|
|
3195
|
+
readonly local: true;
|
|
3196
|
+
readonly reason: "antd `onDrop` info: the node being moved (gh#1093).";
|
|
3197
|
+
}, {
|
|
3198
|
+
readonly field: "node";
|
|
3199
|
+
readonly local: true;
|
|
3200
|
+
readonly reason: "antd `onDrop` info: the node it landed on or beside.";
|
|
3201
|
+
}, {
|
|
3202
|
+
readonly field: "dropPosition";
|
|
3203
|
+
readonly local: true;
|
|
3204
|
+
readonly reason: "antd `onDrop` info, relative: -1 before, 0 inside, 1 after.";
|
|
3205
|
+
}, {
|
|
3206
|
+
readonly field: "dropToGap";
|
|
3207
|
+
readonly local: true;
|
|
3208
|
+
readonly reason: "antd `onDrop` info: true when it lands as a sibling, false inside.";
|
|
3209
|
+
}];
|
|
3210
|
+
};
|
|
3168
3211
|
readonly TreeProp: {
|
|
3169
3212
|
readonly group: "data-display";
|
|
3170
3213
|
readonly file: "components/data-display.prop.ts";
|
|
@@ -4065,6 +4108,16 @@ export declare const COMPONENT_PROP_REGISTRY: {
|
|
|
4065
4108
|
readonly reason: "antd PreviewGroup `preview.onChange(current, prevCurrent)`, kept verbatim.";
|
|
4066
4109
|
}];
|
|
4067
4110
|
};
|
|
4111
|
+
readonly ImageSizeProp: {
|
|
4112
|
+
readonly group: "data-display";
|
|
4113
|
+
readonly file: "components/data-display.prop.ts";
|
|
4114
|
+
readonly vocabulary: readonly ["SizeProp"];
|
|
4115
|
+
};
|
|
4116
|
+
readonly ImageFitProp: {
|
|
4117
|
+
readonly group: "data-display";
|
|
4118
|
+
readonly file: "components/data-display.prop.ts";
|
|
4119
|
+
readonly vocabulary: readonly [];
|
|
4120
|
+
};
|
|
4068
4121
|
readonly ImageProp: {
|
|
4069
4122
|
readonly group: "data-display";
|
|
4070
4123
|
readonly file: "components/data-display.prop.ts";
|
|
@@ -4084,6 +4137,22 @@ export declare const COMPONENT_PROP_REGISTRY: {
|
|
|
4084
4137
|
readonly field: "preview";
|
|
4085
4138
|
readonly local: true;
|
|
4086
4139
|
readonly reason: "antd Image `preview: boolean | PreviewType` — opt-out or configure the preview.";
|
|
4140
|
+
}, "SizeProp", {
|
|
4141
|
+
readonly field: "width";
|
|
4142
|
+
readonly local: true;
|
|
4143
|
+
readonly reason: "antd Image `width` — the frame's inline size.";
|
|
4144
|
+
}, {
|
|
4145
|
+
readonly field: "height";
|
|
4146
|
+
readonly local: true;
|
|
4147
|
+
readonly reason: "antd Image `height` — the frame's block size.";
|
|
4148
|
+
}, {
|
|
4149
|
+
readonly field: "fit";
|
|
4150
|
+
readonly local: true;
|
|
4151
|
+
readonly reason: "CSS `object-fit` of the picture in a fixed frame.";
|
|
4152
|
+
}, {
|
|
4153
|
+
readonly field: "caption";
|
|
4154
|
+
readonly local: true;
|
|
4155
|
+
readonly reason: "A figcaption held to the picture's width (godx extension).";
|
|
4087
4156
|
}];
|
|
4088
4157
|
};
|
|
4089
4158
|
readonly ImagePreviewGroupProp: {
|
package/dist/props/registry.js
CHANGED
|
@@ -3751,6 +3751,58 @@ const COMPONENT_PROP_REGISTRY = {
|
|
|
3751
3751
|
}
|
|
3752
3752
|
]
|
|
3753
3753
|
},
|
|
3754
|
+
TreeDropPositionProp: {
|
|
3755
|
+
group: "data-display",
|
|
3756
|
+
file: "components/data-display.prop.ts",
|
|
3757
|
+
vocabulary: []
|
|
3758
|
+
},
|
|
3759
|
+
TreeAllowDropInfoProp: {
|
|
3760
|
+
group: "data-display",
|
|
3761
|
+
file: "components/data-display.prop.ts",
|
|
3762
|
+
vocabulary: [
|
|
3763
|
+
{
|
|
3764
|
+
field: "dragNode",
|
|
3765
|
+
local: true,
|
|
3766
|
+
reason: "antd `allowDrop` argument: the node being moved (gh#1093)."
|
|
3767
|
+
},
|
|
3768
|
+
{
|
|
3769
|
+
field: "dropNode",
|
|
3770
|
+
local: true,
|
|
3771
|
+
reason: "antd `allowDrop` argument: the node it would land on or beside."
|
|
3772
|
+
},
|
|
3773
|
+
{
|
|
3774
|
+
field: "dropPosition",
|
|
3775
|
+
local: true,
|
|
3776
|
+
reason: "antd `allowDrop` argument: -1 before, 0 inside, 1 after."
|
|
3777
|
+
}
|
|
3778
|
+
]
|
|
3779
|
+
},
|
|
3780
|
+
TreeDropInfoProp: {
|
|
3781
|
+
group: "data-display",
|
|
3782
|
+
file: "components/data-display.prop.ts",
|
|
3783
|
+
vocabulary: [
|
|
3784
|
+
{
|
|
3785
|
+
field: "dragNode",
|
|
3786
|
+
local: true,
|
|
3787
|
+
reason: "antd `onDrop` info: the node being moved (gh#1093)."
|
|
3788
|
+
},
|
|
3789
|
+
{
|
|
3790
|
+
field: "node",
|
|
3791
|
+
local: true,
|
|
3792
|
+
reason: "antd `onDrop` info: the node it landed on or beside."
|
|
3793
|
+
},
|
|
3794
|
+
{
|
|
3795
|
+
field: "dropPosition",
|
|
3796
|
+
local: true,
|
|
3797
|
+
reason: "antd `onDrop` info, relative: -1 before, 0 inside, 1 after."
|
|
3798
|
+
},
|
|
3799
|
+
{
|
|
3800
|
+
field: "dropToGap",
|
|
3801
|
+
local: true,
|
|
3802
|
+
reason: "antd `onDrop` info: true when it lands as a sibling, false inside."
|
|
3803
|
+
}
|
|
3804
|
+
]
|
|
3805
|
+
},
|
|
3754
3806
|
TreeProp: {
|
|
3755
3807
|
group: "data-display",
|
|
3756
3808
|
file: "components/data-display.prop.ts",
|
|
@@ -4920,6 +4972,16 @@ const COMPONENT_PROP_REGISTRY = {
|
|
|
4920
4972
|
}
|
|
4921
4973
|
]
|
|
4922
4974
|
},
|
|
4975
|
+
ImageSizeProp: {
|
|
4976
|
+
group: "data-display",
|
|
4977
|
+
file: "components/data-display.prop.ts",
|
|
4978
|
+
vocabulary: ["SizeProp"]
|
|
4979
|
+
},
|
|
4980
|
+
ImageFitProp: {
|
|
4981
|
+
group: "data-display",
|
|
4982
|
+
file: "components/data-display.prop.ts",
|
|
4983
|
+
vocabulary: []
|
|
4984
|
+
},
|
|
4923
4985
|
ImageProp: {
|
|
4924
4986
|
group: "data-display",
|
|
4925
4987
|
file: "components/data-display.prop.ts",
|
|
@@ -4937,6 +4999,15 @@ const COMPONENT_PROP_REGISTRY = {
|
|
|
4937
4999
|
field: "preview",
|
|
4938
5000
|
local: true,
|
|
4939
5001
|
reason: "antd Image `preview: boolean | PreviewType` \u2014 opt-out or configure the preview."
|
|
5002
|
+
},
|
|
5003
|
+
"SizeProp",
|
|
5004
|
+
{ field: "width", local: true, reason: "antd Image `width` \u2014 the frame's inline size." },
|
|
5005
|
+
{ field: "height", local: true, reason: "antd Image `height` \u2014 the frame's block size." },
|
|
5006
|
+
{ field: "fit", local: true, reason: "CSS `object-fit` of the picture in a fixed frame." },
|
|
5007
|
+
{
|
|
5008
|
+
field: "caption",
|
|
5009
|
+
local: true,
|
|
5010
|
+
reason: "A figcaption held to the picture's width (godx extension)."
|
|
4940
5011
|
}
|
|
4941
5012
|
]
|
|
4942
5013
|
},
|