@konce-pt/react 0.9.1 → 0.10.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/dist/accordion/accordion.js +7 -1
- package/dist/accordion/llms.txt +8 -4
- package/dist/alert/alert.d.ts +10 -4
- package/dist/alert/alert.js +13 -6
- package/dist/alert/llms.txt +8 -6
- package/dist/app-shell/app-shell.js +28 -2
- package/dist/app-shell/llms.txt +3 -0
- package/dist/autocomplete/autocomplete.d.ts +7 -2
- package/dist/autocomplete/autocomplete.js +46 -9
- package/dist/autocomplete/llms.txt +12 -0
- package/dist/avatar/avatar.d.ts +4 -2
- package/dist/avatar/avatar.js +8 -3
- package/dist/avatar/llms.txt +9 -5
- package/dist/avatar-group/avatar-group.d.ts +5 -2
- package/dist/avatar-group/avatar-group.js +10 -2
- package/dist/avatar-group/llms.txt +7 -4
- package/dist/badge/badge.d.ts +8 -1
- package/dist/badge/badge.js +3 -2
- package/dist/badge/llms.txt +11 -5
- package/dist/bottom-sheet/bottom-sheet.d.ts +1 -1
- package/dist/bottom-sheet/bottom-sheet.js +8 -2
- package/dist/bottom-sheet/llms.txt +8 -2
- package/dist/breadcrumb/breadcrumb.js +4 -4
- package/dist/breadcrumb/llms.txt +12 -5
- package/dist/card/card.d.ts +9 -1
- package/dist/card/card.js +2 -2
- package/dist/card/llms.txt +6 -2
- package/dist/carousel/carousel.d.ts +8 -1
- package/dist/carousel/carousel.js +9 -2
- package/dist/carousel/llms.txt +24 -10
- package/dist/checkbox/checkbox.d.ts +6 -1
- package/dist/checkbox/checkbox.js +11 -3
- package/dist/checkbox/llms.txt +11 -0
- package/dist/chip/chip.js +10 -1
- package/dist/chip/llms.txt +7 -4
- package/dist/chips-input/chips-input.d.ts +7 -1
- package/dist/chips-input/chips-input.js +21 -5
- package/dist/chips-input/llms.txt +12 -0
- package/dist/color-picker/color-picker.d.ts +18 -5
- package/dist/color-picker/color-picker.js +48 -14
- package/dist/color-picker/llms.txt +14 -0
- package/dist/confirm/confirm-container.d.ts +5 -1
- package/dist/confirm/confirm-container.js +15 -1
- package/dist/confirm/llms.txt +4 -2
- package/dist/context-menu/context-menu.d.ts +5 -0
- package/dist/context-menu/context-menu.js +48 -4
- package/dist/context-menu/llms.txt +11 -4
- package/dist/date-range/date-range.d.ts +14 -1
- package/dist/date-range/date-range.js +133 -17
- package/dist/date-range/llms.txt +26 -3
- package/dist/datepicker/datepicker.d.ts +10 -1
- package/dist/datepicker/datepicker.js +147 -14
- package/dist/datepicker/llms.txt +27 -3
- package/dist/dialog/dialog.d.ts +4 -0
- package/dist/dialog/dialog.js +7 -1
- package/dist/dialog/llms.txt +2 -0
- package/dist/drawer/drawer.js +7 -2
- package/dist/drawer/llms.txt +10 -5
- package/dist/empty/empty.d.ts +6 -1
- package/dist/empty/empty.js +2 -2
- package/dist/empty/llms.txt +4 -3
- package/dist/fab/llms.txt +2 -1
- package/dist/file-upload/file-upload.d.ts +5 -0
- package/dist/file-upload/file-upload.js +24 -3
- package/dist/file-upload/llms.txt +15 -4
- package/dist/form-field/form-field-context.d.ts +30 -1
- package/dist/form-field/form-field-context.js +27 -0
- package/dist/form-field/form-field.js +16 -2
- package/dist/form-field/llms.txt +10 -1
- package/dist/galleria/galleria.d.ts +6 -1
- package/dist/galleria/galleria.js +40 -1
- package/dist/galleria/llms.txt +17 -8
- package/dist/icon/icon.d.ts +7 -1
- package/dist/icon/icon.js +18 -4
- package/dist/icon/llms.txt +5 -2
- package/dist/image/image.d.ts +5 -0
- package/dist/image/image.js +38 -2
- package/dist/image/llms.txt +24 -17
- package/dist/input/input.d.ts +1 -1
- package/dist/input/input.js +4 -6
- package/dist/input/llms.txt +5 -0
- package/dist/input-mask/input-mask.d.ts +1 -1
- package/dist/input-mask/input-mask.js +8 -6
- package/dist/input-mask/llms.txt +11 -0
- package/dist/input-number/input-number.d.ts +13 -1
- package/dist/input-number/input-number.js +49 -9
- package/dist/input-number/llms.txt +21 -3
- package/dist/input-otp/input-otp.d.ts +7 -2
- package/dist/input-otp/input-otp.js +36 -7
- package/dist/input-otp/llms.txt +14 -0
- package/dist/internal/calendar-focus.d.ts +8 -0
- package/dist/internal/calendar-focus.js +38 -0
- package/dist/internal/option-nav.d.ts +24 -0
- package/dist/internal/option-nav.js +80 -0
- package/dist/internal/roving.d.ts +9 -0
- package/dist/internal/roving.js +43 -0
- package/dist/internal/use-modal-focus.d.ts +10 -0
- package/dist/internal/use-modal-focus.js +57 -0
- package/dist/knob/knob.d.ts +5 -1
- package/dist/knob/knob.js +4 -2
- package/dist/knob/llms.txt +8 -0
- package/dist/listbox/listbox.d.ts +13 -1
- package/dist/listbox/listbox.js +89 -6
- package/dist/listbox/llms.txt +21 -5
- package/dist/megamenu/llms.txt +28 -10
- package/dist/megamenu/megamenu.d.ts +10 -1
- package/dist/megamenu/megamenu.js +116 -5
- package/dist/menu/llms.txt +12 -1
- package/dist/menu/menu-keys.d.ts +15 -0
- package/dist/menu/menu-keys.js +53 -0
- package/dist/menu/menu-rows.js +1 -1
- package/dist/menu/menu.js +52 -4
- package/dist/menubar/llms.txt +24 -7
- package/dist/menubar/menubar.d.ts +8 -1
- package/dist/menubar/menubar.js +92 -6
- package/dist/meter-group/llms.txt +10 -3
- package/dist/meter-group/meter-group.d.ts +9 -2
- package/dist/meter-group/meter-group.js +8 -2
- package/dist/order-list/llms.txt +11 -3
- package/dist/order-list/order-list.d.ts +5 -1
- package/dist/order-list/order-list.js +46 -8
- package/dist/panel/llms.txt +9 -6
- package/dist/panel/panel.js +3 -1
- package/dist/password/llms.txt +8 -0
- package/dist/password/password.d.ts +6 -1
- package/dist/password/password.js +6 -5
- package/dist/pick-list/llms.txt +12 -3
- package/dist/pick-list/pick-list.d.ts +5 -1
- package/dist/pick-list/pick-list.js +52 -5
- package/dist/popover/llms.txt +9 -2
- package/dist/popover/popover.d.ts +9 -3
- package/dist/popover/popover.js +41 -6
- package/dist/public-api.d.ts +6 -6
- package/dist/public-api.js +1 -1
- package/dist/radio-group/llms.txt +11 -0
- package/dist/radio-group/radio-group.d.ts +9 -1
- package/dist/radio-group/radio-group.js +5 -2
- package/dist/rating/llms.txt +18 -5
- package/dist/rating/rating.d.ts +21 -3
- package/dist/rating/rating.js +87 -12
- package/dist/rich-text/llms.txt +20 -0
- package/dist/rich-text/rich-text.d.ts +7 -1
- package/dist/rich-text/rich-text.js +155 -28
- package/dist/scroll-top/llms.txt +5 -1
- package/dist/scroll-top/scroll-top.js +3 -1
- package/dist/select/llms.txt +21 -7
- package/dist/select/select.d.ts +12 -1
- package/dist/select/select.js +110 -38
- package/dist/sidenav/llms.txt +6 -0
- package/dist/skeleton/llms.txt +3 -2
- package/dist/skeleton/skeleton.d.ts +1 -1
- package/dist/skeleton/skeleton.js +2 -2
- package/dist/slider/llms.txt +14 -1
- package/dist/slider/slider.d.ts +11 -2
- package/dist/slider/slider.js +15 -2
- package/dist/speed-dial/llms.txt +6 -2
- package/dist/speed-dial/speed-dial.d.ts +1 -1
- package/dist/speed-dial/speed-dial.js +14 -3
- package/dist/spinner/llms.txt +12 -8
- package/dist/spinner/spinner.d.ts +5 -1
- package/dist/spinner/spinner.js +12 -2
- package/dist/split-button/llms.txt +11 -3
- package/dist/split-button/split-button.d.ts +3 -1
- package/dist/split-button/split-button.js +43 -3
- package/dist/splitter/llms.txt +14 -4
- package/dist/splitter/splitter.d.ts +9 -2
- package/dist/splitter/splitter.js +15 -2
- package/dist/stepper/llms.txt +8 -4
- package/dist/stepper/stepper.d.ts +3 -2
- package/dist/stepper/stepper.js +7 -2
- package/dist/switch/llms.txt +10 -0
- package/dist/switch/switch.d.ts +1 -1
- package/dist/switch/switch.js +4 -2
- package/dist/switch-group/llms.txt +11 -0
- package/dist/switch-group/switch-group.d.ts +5 -1
- package/dist/switch-group/switch-group.js +7 -2
- package/dist/tabs/llms.txt +10 -4
- package/dist/tabs/tabs.d.ts +4 -0
- package/dist/tabs/tabs.js +21 -2
- package/dist/textarea/llms.txt +10 -0
- package/dist/textarea/textarea.d.ts +3 -1
- package/dist/textarea/textarea.js +13 -8
- package/dist/toast/llms.txt +21 -7
- package/dist/toast/toast-container.d.ts +6 -1
- package/dist/toast/toast-container.js +52 -1
- package/dist/toast/toast-store.d.ts +12 -0
- package/dist/toast/toast-store.js +46 -7
- package/dist/tooltip/llms.txt +10 -3
- package/dist/tooltip/tooltip.d.ts +5 -0
- package/dist/tooltip/tooltip.js +80 -7
- package/dist/tree/llms.txt +20 -8
- package/dist/tree/tree-keys.d.ts +27 -0
- package/dist/tree/tree-keys.js +39 -0
- package/dist/tree/tree.d.ts +12 -5
- package/dist/tree/tree.js +75 -29
- package/package.json +12 -12
package/dist/tree/tree.js
CHANGED
|
@@ -1,51 +1,75 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useState } from 'react';
|
|
2
|
+
import { useEffect, useMemo, useRef, useState, } from 'react';
|
|
3
3
|
import { cn } from "../internal/cn.js";
|
|
4
4
|
import { useControllableState } from "../internal/use-controllable-state.js";
|
|
5
|
-
import { useKptMessages } from "../i18n/i18n-context.js";
|
|
6
5
|
import { KptIcon } from "../icon/icon.js";
|
|
6
|
+
import { treeKeyAction } from "./tree-keys.js";
|
|
7
7
|
/**
|
|
8
8
|
* Drzewo hierarchiczne: rozwijanie, zaznaczanie, ikony.
|
|
9
9
|
*
|
|
10
|
-
* Stan rozwinięcia trzyma komponent
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* Stan rozwinięcia trzyma komponent, a nie pole `expanded` w danych: mutowanie cudzej tablicy
|
|
11
|
+
* przy każdym kliknięciu byłoby w Reakcie efektem ubocznym renderu, a `expanded` z danych zostaje
|
|
12
|
+
* tym, czym powinno być — stanem początkowym.
|
|
13
|
+
*
|
|
14
|
+
* Klawiatura według wzorca WAI-ARIA „tree view”: jeden przystanek Tab na całe drzewo (roving
|
|
15
|
+
* tabindex), strzałki po widocznych wierszach, → / ← rozwijają i zwijają, `Enter` / spacja
|
|
16
|
+
* działają jak kliknięcie. Logika klawiszy siedzi w czystej funkcji `treeKeyAction`.
|
|
17
|
+
*
|
|
18
|
+
* `locale` i `dictionary` są przyjmowane dla zgodności — drzewo nie ma już własnych etykiet:
|
|
19
|
+
* przełącznik gałęzi jest tylko dla myszy, a z klawiatury rozwija się strzałkami.
|
|
13
20
|
*
|
|
14
21
|
* @example
|
|
15
22
|
* <KptTree nodes={tree} selectable selected={node} onSelectedChange={setNode} />
|
|
16
23
|
*/
|
|
17
|
-
export function KptTree({ nodes = [], selectable = false, selected, defaultSelected = null, onSelectedChange, onNodeClick, locale, dictionary, className, ...rest }) {
|
|
18
|
-
const { t } = useKptMessages({ locale, dictionary });
|
|
24
|
+
export function KptTree({ nodes = [], selectable = false, selected, defaultSelected = null, onSelectedChange, onNodeClick, locale: _locale, dictionary: _dictionary, className, ...rest }) {
|
|
19
25
|
const [active, setActive] = useControllableState({
|
|
20
26
|
value: selected,
|
|
21
27
|
defaultValue: defaultSelected,
|
|
22
28
|
onChange: onSelectedChange,
|
|
23
29
|
});
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
30
|
+
// Gałęzie przełączone przez użytkownika (węzeł → otwarta?). Węzeł spoza mapy ma stan z `expanded`
|
|
31
|
+
// w danych — dzięki temu nowa tablica `nodes` przychodzi z własnym stanem początkowym.
|
|
32
|
+
const [toggled, setToggled] = useState(() => new Map());
|
|
33
|
+
/** Wiersz, który ostatnio miał fokus — on jest przystankiem Tab. */
|
|
34
|
+
const [focused, setFocused] = useState(null);
|
|
35
|
+
/** Węzeł, na który po renderze trzeba przenieść fokus DOM (klawiatura). */
|
|
36
|
+
const [focusRequest, setFocusRequest] = useState(null);
|
|
37
|
+
const treeRef = useRef(null);
|
|
38
|
+
const hasChildren = (node) => !!node.children?.length;
|
|
39
|
+
const isOpen = (node) => toggled.get(node) ?? !!node.expanded;
|
|
40
|
+
// Widoczne wiersze w kolejności DOM — tyle widzi klawiatura.
|
|
41
|
+
const rows = useMemo(() => {
|
|
42
|
+
const out = [];
|
|
43
|
+
const walk = (list, level, parent) => {
|
|
28
44
|
for (const node of list) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
45
|
+
const index = out.length;
|
|
46
|
+
const expandable = !!node.children?.length;
|
|
47
|
+
const open = expandable && (toggled.get(node) ?? !!node.expanded);
|
|
48
|
+
out.push({ node, level, parent, expandable, open });
|
|
49
|
+
if (open)
|
|
50
|
+
walk(node.children, level + 1, index);
|
|
33
51
|
}
|
|
34
52
|
};
|
|
35
|
-
walk(nodes);
|
|
36
|
-
return
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
const
|
|
53
|
+
walk(nodes, 0, -1);
|
|
54
|
+
return out;
|
|
55
|
+
}, [nodes, toggled]);
|
|
56
|
+
// Jedyny wiersz z `tabIndex=0`: ostatnio skupiony, a gdy go nie widać — zaznaczony albo pierwszy.
|
|
57
|
+
const visible = rows.map((r) => r.node);
|
|
58
|
+
const tabStop = focused && visible.includes(focused) ? focused : active && visible.includes(active) ? active : (visible[0] ?? null);
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
if (!focusRequest)
|
|
61
|
+
return;
|
|
62
|
+
const index = rows.findIndex((r) => r.node === focusRequest);
|
|
63
|
+
treeRef.current?.querySelectorAll('[role="treeitem"]')[index]?.focus();
|
|
64
|
+
setFocusRequest(null);
|
|
65
|
+
}, [focusRequest, rows]);
|
|
40
66
|
const toggle = (node) => {
|
|
41
|
-
const next = new
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
else
|
|
45
|
-
next.add(node);
|
|
46
|
-
setOpen(next);
|
|
67
|
+
const next = new Map(toggled);
|
|
68
|
+
next.set(node, !isOpen(node));
|
|
69
|
+
setToggled(next);
|
|
47
70
|
};
|
|
48
71
|
const onRow = (node) => {
|
|
72
|
+
setFocused(node);
|
|
49
73
|
if (node.disabled)
|
|
50
74
|
return;
|
|
51
75
|
if (selectable)
|
|
@@ -54,9 +78,31 @@ export function KptTree({ nodes = [], selectable = false, selected, defaultSelec
|
|
|
54
78
|
toggle(node);
|
|
55
79
|
onNodeClick?.(node);
|
|
56
80
|
};
|
|
57
|
-
const
|
|
81
|
+
const onKeyDown = (node, event) => {
|
|
82
|
+
// Zagnieżdżone `<li>` przepuszczają zdarzenie w górę — obsługuje je tylko wiersz z fokusem.
|
|
83
|
+
if (event.target !== event.currentTarget)
|
|
84
|
+
return;
|
|
85
|
+
const current = rows.findIndex((r) => r.node === node);
|
|
86
|
+
const action = treeKeyAction(rows, current, event.key);
|
|
87
|
+
if (!action)
|
|
88
|
+
return;
|
|
89
|
+
event.preventDefault();
|
|
90
|
+
const target = rows[action.index].node;
|
|
91
|
+
if (action.type === 'toggle')
|
|
92
|
+
toggle(target);
|
|
93
|
+
else if (action.type === 'activate')
|
|
94
|
+
onRow(target);
|
|
95
|
+
else {
|
|
96
|
+
setFocused(target);
|
|
97
|
+
setFocusRequest(target);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
const renderList = (list, level) => list.map((node, index) => (_jsxs("li", { className: "kpt-tree__node", role: "treeitem", "aria-level": level + 1, "aria-expanded": hasChildren(node) ? isOpen(node) : undefined, "aria-selected": selectable ? active === node : undefined, "aria-disabled": node.disabled ? true : undefined, tabIndex: node === tabStop ? 0 : -1, onFocus: (event) => {
|
|
101
|
+
if (event.target === event.currentTarget)
|
|
102
|
+
setFocused(node);
|
|
103
|
+
}, onKeyDown: (event) => onKeyDown(node, event), children: [_jsxs("div", { className: cn('kpt-tree__row', active === node && 'is-selected', node.disabled && 'is-disabled'), style: { paddingInlineStart: `${0.5 + level * 1.1}rem` }, onClick: () => onRow(node), children: [hasChildren(node) ? (_jsx("span", { className: "kpt-tree__toggle", "aria-hidden": "true", onClick: (event) => {
|
|
58
104
|
event.stopPropagation();
|
|
59
105
|
toggle(node);
|
|
60
|
-
}, children: _jsx(KptIcon, { name: "chevron-right", className: cn('kpt-tree__chevron', isOpen(node) && 'is-open') }) })) : (_jsx("span", { className: "kpt-tree__spacer" })), node.icon ? _jsx(KptIcon, { name: node.icon, className: "kpt-tree__icon" }) : null, _jsx("span", { className: "kpt-tree__label", children: node.label })] }), hasChildren(node) && isOpen(node) ?
|
|
61
|
-
return (_jsx("div", { className: cn('kpt-tree-host', className), ...rest, children: _jsx("ul", { className: "kpt-tree", role: "tree", children: renderList(nodes, 0) }) }));
|
|
106
|
+
}, children: _jsx(KptIcon, { name: "chevron-right", className: cn('kpt-tree__chevron', isOpen(node) && 'is-open') }) })) : (_jsx("span", { className: "kpt-tree__spacer" })), node.icon ? _jsx(KptIcon, { name: node.icon, className: "kpt-tree__icon" }) : null, _jsx("span", { className: "kpt-tree__label", children: node.label })] }), hasChildren(node) && isOpen(node) ? _jsx("ul", { role: "group", children: renderList(node.children, level + 1) }) : null] }, index)));
|
|
107
|
+
return (_jsx("div", { className: cn('kpt-tree-host', className), ...rest, children: _jsx("ul", { ref: treeRef, className: "kpt-tree", role: "tree", children: renderList(nodes, 0) }) }));
|
|
62
108
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@konce-pt/react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "Open-source React 19 component library on the Koncept UI design system — the same kpt-* CSS layer and --kpt-* tokens as the Angular port. Zero runtime dependencies.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "konce.pt",
|
|
@@ -65,17 +65,17 @@
|
|
|
65
65
|
"leaflet": "^1.9.0"
|
|
66
66
|
},
|
|
67
67
|
"dependencies": {
|
|
68
|
-
"@konce-pt/
|
|
69
|
-
"@konce-pt/
|
|
70
|
-
"@konce-pt/
|
|
71
|
-
"@konce-pt/
|
|
72
|
-
"@konce-pt/
|
|
73
|
-
"@konce-pt/
|
|
74
|
-
"@konce-pt/tokens": "0.
|
|
75
|
-
"@konce-pt/table": "0.
|
|
76
|
-
"@konce-pt/
|
|
77
|
-
"@konce-pt/
|
|
78
|
-
"@konce-pt/
|
|
68
|
+
"@konce-pt/chat": "0.10.0",
|
|
69
|
+
"@konce-pt/chart": "0.10.0",
|
|
70
|
+
"@konce-pt/backdrop": "0.10.0",
|
|
71
|
+
"@konce-pt/i18n": "0.10.0",
|
|
72
|
+
"@konce-pt/datetime": "0.10.0",
|
|
73
|
+
"@konce-pt/mention": "0.10.0",
|
|
74
|
+
"@konce-pt/tokens": "0.10.0",
|
|
75
|
+
"@konce-pt/table": "0.10.0",
|
|
76
|
+
"@konce-pt/roadmap": "0.10.0",
|
|
77
|
+
"@konce-pt/map": "0.10.0",
|
|
78
|
+
"@konce-pt/icons": "0.10.0"
|
|
79
79
|
},
|
|
80
80
|
"devDependencies": {
|
|
81
81
|
"@types/react": "^19.2.0",
|