@tedi-design-system/react 16.1.0-rc.1 → 16.1.0-rc.3
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/bundle-stats.html +1 -1
- package/index.css +1 -1
- package/package.json +2 -1
- package/src/tedi/components/overlays/dropdown/dropdown-content/dropdown-content.cjs.js +1 -0
- package/src/tedi/components/overlays/dropdown/dropdown-content/dropdown-content.d.ts +4 -0
- package/src/tedi/components/overlays/dropdown/dropdown-content/dropdown-content.es.js +9 -0
- package/src/tedi/components/overlays/dropdown/dropdown-context.cjs.js +1 -0
- package/src/tedi/components/overlays/dropdown/dropdown-context.d.ts +20 -0
- package/src/tedi/components/overlays/dropdown/dropdown-context.es.js +11 -0
- package/src/tedi/components/overlays/dropdown/dropdown-helpers.cjs.js +1 -0
- package/src/tedi/components/overlays/dropdown/dropdown-helpers.d.ts +1 -0
- package/src/tedi/components/overlays/dropdown/dropdown-helpers.es.js +9 -0
- package/src/tedi/components/overlays/dropdown/dropdown-item/dropdown-item.cjs.js +1 -0
- package/src/tedi/components/overlays/dropdown/dropdown-item/dropdown-item.d.ts +67 -0
- package/src/tedi/components/overlays/dropdown/dropdown-item/dropdown-item.es.js +64 -0
- package/src/tedi/components/overlays/dropdown/dropdown-item/dropdown-item.module.scss.cjs.js +1 -0
- package/src/tedi/components/overlays/dropdown/dropdown-item/dropdown-item.module.scss.es.js +12 -0
- package/src/tedi/components/overlays/dropdown/dropdown-separator/dropdown-separator.cjs.js +1 -0
- package/src/tedi/components/overlays/dropdown/dropdown-separator/dropdown-separator.d.ts +1 -0
- package/src/tedi/components/overlays/dropdown/dropdown-separator/dropdown-separator.es.js +6 -0
- package/src/tedi/components/overlays/dropdown/dropdown-trigger/dropdown-trigger.cjs.js +1 -0
- package/src/tedi/components/overlays/dropdown/dropdown-trigger/dropdown-trigger.d.ts +8 -0
- package/src/tedi/components/overlays/dropdown/dropdown-trigger/dropdown-trigger.es.js +14 -0
- package/src/tedi/components/overlays/dropdown/dropdown.cjs.js +1 -0
- package/src/tedi/components/overlays/dropdown/dropdown.d.ts +75 -0
- package/src/tedi/components/overlays/dropdown/dropdown.es.js +114 -0
- package/src/tedi/components/overlays/dropdown/dropdown.module.scss.cjs.js +1 -0
- package/src/tedi/components/overlays/dropdown/dropdown.module.scss.es.js +8 -0
- package/src/tedi/components/overlays/dropdown/index.d.ts +5 -0
- package/src/tedi/index.d.ts +1 -0
- package/tedi.cjs.js +1 -1
- package/tedi.es.js +94 -83
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tedi-design-system/react",
|
|
3
|
-
"version": "16.1.0-rc.
|
|
3
|
+
"version": "16.1.0-rc.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"exports": {
|
|
@@ -107,6 +107,7 @@
|
|
|
107
107
|
"@typescript-eslint/eslint-plugin": "^6.21.0",
|
|
108
108
|
"@typescript-eslint/parser": "^6.21.0",
|
|
109
109
|
"@vitejs/plugin-react": "^4.3.4",
|
|
110
|
+
"baseline-browser-mapping": "^2.10.0",
|
|
110
111
|
"chromatic": "^13.3.4",
|
|
111
112
|
"cross-env": "^7.0.3",
|
|
112
113
|
"dompurify": "^3.3.0",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react"),o=require("../dropdown-context.cjs.js"),r=({children:e})=>{const{setContent:t}=o.useDropdownContext();return n.useEffect(()=>(t(e),()=>t(null)),[e,t]),null};exports.DropdownContent=r;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { useEffect as n } from "react";
|
|
2
|
+
import { useDropdownContext as r } from "../dropdown-context.es.js";
|
|
3
|
+
const p = ({ children: o }) => {
|
|
4
|
+
const { setContent: t } = r();
|
|
5
|
+
return n(() => (t(o), () => t(null)), [o, t]), null;
|
|
6
|
+
};
|
|
7
|
+
export {
|
|
8
|
+
p as DropdownContent
|
|
9
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),e=t.createContext(null),n=()=>{const o=t.useContext(e);if(!o)throw new Error("Dropdown components must be used within <Dropdown />");return o};exports.DropdownContext=e;exports.useDropdownContext=n;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { useFloating, useInteractions } from '@floating-ui/react';
|
|
2
|
+
import { default as React } from 'react';
|
|
3
|
+
export type DropdownContextValue = {
|
|
4
|
+
open: boolean;
|
|
5
|
+
setOpen: (open: boolean) => void;
|
|
6
|
+
refs: ReturnType<typeof useFloating>['refs'];
|
|
7
|
+
getReferenceProps: ReturnType<typeof useInteractions>['getReferenceProps'];
|
|
8
|
+
getFloatingProps: ReturnType<typeof useInteractions>['getFloatingProps'];
|
|
9
|
+
getItemProps: ReturnType<typeof useInteractions>['getItemProps'];
|
|
10
|
+
listItemsRef: React.MutableRefObject<Array<HTMLButtonElement | null>>;
|
|
11
|
+
activeIndex: number | null;
|
|
12
|
+
setActiveIndex: (index: number | null) => void;
|
|
13
|
+
placement?: string;
|
|
14
|
+
content: React.ReactNode;
|
|
15
|
+
setContent: (content: React.ReactNode) => void;
|
|
16
|
+
divided?: boolean;
|
|
17
|
+
variant?: 'default' | 'tree';
|
|
18
|
+
};
|
|
19
|
+
export declare const DropdownContext: React.Context<DropdownContextValue | null>;
|
|
20
|
+
export declare const useDropdownContext: () => DropdownContextValue;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import t, { useContext as n } from "react";
|
|
2
|
+
const e = t.createContext(null), s = () => {
|
|
3
|
+
const o = n(e);
|
|
4
|
+
if (!o)
|
|
5
|
+
throw new Error("Dropdown components must be used within <Dropdown />");
|
|
6
|
+
return o;
|
|
7
|
+
};
|
|
8
|
+
export {
|
|
9
|
+
e as DropdownContext,
|
|
10
|
+
s as useDropdownContext
|
|
11
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=(r,e,o)=>{if(r==="full")return o;if(r==="trigger")return e;if(r!=="auto")return typeof r=="number"?`${r}px`:r};exports.resolveDropdownWidth=t;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const resolveDropdownWidth: (width: "auto" | "trigger" | "full" | number | string, triggerWidth?: number, containerWidth?: number) => string | number | undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const P=require("react/jsx-runtime"),j=require("../../../../../../external/classnames/index.cjs.js"),T=require("../dropdown-context.cjs.js"),r=require("./dropdown-item.module.scss.cjs.js"),K=({children:m,onClick:t,disabled:n,active:c,index:u,indent:i,asChild:o=!1,closeOnSelect:p=!0,isParent:w=!1,className:y})=>{const{getItemProps:_,listItemsRef:l,setOpen:s,activeIndex:v,divided:b,variant:f}=T.useDropdownContext(),x=o?"div":"button",I=e=>typeof e!="number"?{}:{"--dropdown-indent-level":e,"--dropdown-indent":`${e}rem`},g=e=>{if(n)return;const d=e.currentTarget.querySelector('input[type="checkbox"], input[type="radio"]');if(d){d.click();return}o?t==null||t(e):(t==null||t(e),p&&s(!1))},q=e=>{if(!n&&(e.key==="Enter"||e.key===" ")){e.preventDefault();const d=e.currentTarget.querySelector('input[type="checkbox"], input[type="radio"]');d?d.click():t==null||t(e),!o&&p&&s(!1)}},a={ref(e){typeof u=="number"&&(l.current[u]=e)},tabIndex:v===u?0:-1,className:j.default(r.default["tedi-dropdown__item"],{[r.default["tedi-dropdown__item--active"]]:c,[r.default["tedi-dropdown__item--disabled"]]:n,[r.default["tedi-dropdown__item--divided"]]:b,[r.default["tedi-dropdown__item--indent"]]:i,[r.default["tedi-dropdown__item--tree-item"]]:f==="tree"&&i,[r.default["tedi-dropdown__item--tree-parent"]]:f==="tree"&&w,className:y}),style:I(i),onClick:g,onKeyDown:q},D=o&&p===!1?a:_({role:"menuitem",disabled:o?void 0:n,...a});return P.jsx(x,{...D,children:m})};exports.DropdownItem=K;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export type DropdownItemProps = {
|
|
2
|
+
/**
|
|
3
|
+
* The content of the menu item (text, icons, checkbox, etc.)
|
|
4
|
+
*/
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
/**
|
|
7
|
+
* Called when the item is activated (mouse click or Enter/Space key).
|
|
8
|
+
* Receives either a MouseEvent or KeyboardEvent.
|
|
9
|
+
*/
|
|
10
|
+
onClick?: (e: React.MouseEvent | React.KeyboardEvent) => void;
|
|
11
|
+
/**
|
|
12
|
+
* Disables the item — prevents interaction and applies disabled styling.
|
|
13
|
+
* @default false
|
|
14
|
+
*/
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Highlights the item visually (e.g. selected language, current sort option).
|
|
18
|
+
* Does **not** affect behavior — only styling.
|
|
19
|
+
*
|
|
20
|
+
* @default false
|
|
21
|
+
*/
|
|
22
|
+
active?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Required when using keyboard navigation (ArrowUp/ArrowDown).
|
|
25
|
+
* Must be a unique, sequential number (0, 1, 2, ...) for each item in the list.
|
|
26
|
+
* When omitted, the item won't be keyboard-focusable.
|
|
27
|
+
*/
|
|
28
|
+
index?: number;
|
|
29
|
+
/**
|
|
30
|
+
* Indentation level (in rem units). Useful for nested / hierarchical menus.
|
|
31
|
+
* Example: `indent={1}` → adds ~1rem left padding
|
|
32
|
+
*
|
|
33
|
+
* @default 0
|
|
34
|
+
*/
|
|
35
|
+
indent?: number;
|
|
36
|
+
/**
|
|
37
|
+
* When `true`, renders a plain `<div>` instead of a `<button>`.
|
|
38
|
+
* Useful when wrapping form controls like `<Checkbox>` or `<Radio>` that already handle their own events.
|
|
39
|
+
* **Warning:** When `asChild={true}`, the item is no longer focusable via keyboard navigation
|
|
40
|
+
* unless the child element itself is focusable.
|
|
41
|
+
*
|
|
42
|
+
* @default false
|
|
43
|
+
*/
|
|
44
|
+
asChild?: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Controls whether the dropdown should close after this item is selected.
|
|
47
|
+
* - Set to `false` for multi-select menus, toggles, or when selection should persist
|
|
48
|
+
* - Set to `true` for action menus (delete, download, navigate, etc.)
|
|
49
|
+
*
|
|
50
|
+
* @default true
|
|
51
|
+
*/
|
|
52
|
+
closeOnSelect?: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Marks this item as a tree parent node when the Dropdown is in `variant="tree"` mode.
|
|
55
|
+
* - Renders a visual parent indicator (bullet) aligned to the tree trunk
|
|
56
|
+
* - Starts the tree trunk at the vertical center of this item
|
|
57
|
+
* - Does **not** apply tree indentation — parent items remain aligned with normal items
|
|
58
|
+
*
|
|
59
|
+
* This prop is **purely visual** and does not affect behavior or hierarchy.
|
|
60
|
+
* Child items must still use `indent` to participate in the tree.
|
|
61
|
+
* Ignored when `variant !== 'tree'`.
|
|
62
|
+
* @default false
|
|
63
|
+
*/
|
|
64
|
+
isParent?: boolean;
|
|
65
|
+
className?: string;
|
|
66
|
+
};
|
|
67
|
+
export declare const DropdownItem: ({ children, onClick, disabled, active, index, indent, asChild, closeOnSelect, isParent, className, }: DropdownItemProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { jsx as K } from "react/jsx-runtime";
|
|
2
|
+
import N from "../../../../../../external/classnames/index.es.js";
|
|
3
|
+
import { useDropdownContext as T } from "../dropdown-context.es.js";
|
|
4
|
+
import r from "./dropdown-item.module.scss.es.js";
|
|
5
|
+
const V = ({
|
|
6
|
+
children: a,
|
|
7
|
+
onClick: t,
|
|
8
|
+
disabled: p,
|
|
9
|
+
active: y,
|
|
10
|
+
index: d,
|
|
11
|
+
indent: i,
|
|
12
|
+
asChild: o = !1,
|
|
13
|
+
closeOnSelect: s = !0,
|
|
14
|
+
isParent: _ = !1,
|
|
15
|
+
className: w
|
|
16
|
+
}) => {
|
|
17
|
+
const { getItemProps: c, listItemsRef: v, setOpen: m, activeIndex: b, divided: x, variant: f } = T(), D = o ? "div" : "button", I = (e) => typeof e != "number" ? {} : {
|
|
18
|
+
"--dropdown-indent-level": e,
|
|
19
|
+
"--dropdown-indent": `${e}rem`
|
|
20
|
+
}, g = (e) => {
|
|
21
|
+
if (p) return;
|
|
22
|
+
const n = e.currentTarget.querySelector(
|
|
23
|
+
'input[type="checkbox"], input[type="radio"]'
|
|
24
|
+
);
|
|
25
|
+
if (n) {
|
|
26
|
+
n.click();
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
o ? t == null || t(e) : (t == null || t(e), s && m(!1));
|
|
30
|
+
}, P = (e) => {
|
|
31
|
+
if (!p && (e.key === "Enter" || e.key === " ")) {
|
|
32
|
+
e.preventDefault();
|
|
33
|
+
const n = e.currentTarget.querySelector(
|
|
34
|
+
'input[type="checkbox"], input[type="radio"]'
|
|
35
|
+
);
|
|
36
|
+
n ? n.click() : t == null || t(e), !o && s && m(!1);
|
|
37
|
+
}
|
|
38
|
+
}, u = {
|
|
39
|
+
ref(e) {
|
|
40
|
+
typeof d == "number" && (v.current[d] = e);
|
|
41
|
+
},
|
|
42
|
+
tabIndex: b === d ? 0 : -1,
|
|
43
|
+
className: N(r["tedi-dropdown__item"], {
|
|
44
|
+
[r["tedi-dropdown__item--active"]]: y,
|
|
45
|
+
[r["tedi-dropdown__item--disabled"]]: p,
|
|
46
|
+
[r["tedi-dropdown__item--divided"]]: x,
|
|
47
|
+
[r["tedi-dropdown__item--indent"]]: i,
|
|
48
|
+
[r["tedi-dropdown__item--tree-item"]]: f === "tree" && i,
|
|
49
|
+
[r["tedi-dropdown__item--tree-parent"]]: f === "tree" && _,
|
|
50
|
+
className: w
|
|
51
|
+
}),
|
|
52
|
+
style: I(i),
|
|
53
|
+
onClick: g,
|
|
54
|
+
onKeyDown: P
|
|
55
|
+
}, q = o && s === !1 ? u : c({
|
|
56
|
+
role: "menuitem",
|
|
57
|
+
disabled: o ? void 0 : p,
|
|
58
|
+
...u
|
|
59
|
+
});
|
|
60
|
+
return /* @__PURE__ */ K(D, { ...q, children: a });
|
|
61
|
+
};
|
|
62
|
+
export {
|
|
63
|
+
V as DropdownItem
|
|
64
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const d={"tedi-dropdown__item":"tedi-dropdown__item-ae4d9841","tedi-dropdown__item--active":"tedi-dropdown__item--active-f11cbd7a","tedi-dropdown__item--disabled":"tedi-dropdown__item--disabled-c9b893eb","tedi-dropdown__item--divided":"tedi-dropdown__item--divided-33d2a373","tedi-dropdown__item--tree-item":"tedi-dropdown__item--tree-item-d863644f","tedi-dropdown__item--tree-parent":"tedi-dropdown__item--tree-parent-06dbdab2","tedi-dropdown__item--indent":"tedi-dropdown__item--indent-53c2ed01"};exports.default=d;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const d = {
|
|
2
|
+
"tedi-dropdown__item": "tedi-dropdown__item-ae4d9841",
|
|
3
|
+
"tedi-dropdown__item--active": "tedi-dropdown__item--active-f11cbd7a",
|
|
4
|
+
"tedi-dropdown__item--disabled": "tedi-dropdown__item--disabled-c9b893eb",
|
|
5
|
+
"tedi-dropdown__item--divided": "tedi-dropdown__item--divided-33d2a373",
|
|
6
|
+
"tedi-dropdown__item--tree-item": "tedi-dropdown__item--tree-item-d863644f",
|
|
7
|
+
"tedi-dropdown__item--tree-parent": "tedi-dropdown__item--tree-parent-06dbdab2",
|
|
8
|
+
"tedi-dropdown__item--indent": "tedi-dropdown__item--indent-53c2ed01"
|
|
9
|
+
};
|
|
10
|
+
export {
|
|
11
|
+
d as default
|
|
12
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),e=require("../../../misc/separator/separator.cjs.js"),o=()=>r.jsx(e.Separator,{axis:"horizontal"});exports.DropdownSeparator=o;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const DropdownSeparator: () => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),n=require("../dropdown-context.cjs.js"),c=({children:e})=>{const{refs:r,getReferenceProps:o}=n.useDropdownContext();return t.cloneElement(e,o({ref:r.setReference}))};exports.DropdownTrigger=c;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ReactElement } from 'react';
|
|
2
|
+
export type DropdownTriggerProps = {
|
|
3
|
+
/**
|
|
4
|
+
* The content of the trigger item (button, icon, etc)
|
|
5
|
+
*/
|
|
6
|
+
children: ReactElement;
|
|
7
|
+
};
|
|
8
|
+
export declare const DropdownTrigger: ({ children }: DropdownTriggerProps) => ReactElement<any, string | import('react').JSXElementConstructor<any>>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { cloneElement as t } from "react";
|
|
2
|
+
import { useDropdownContext as n } from "../dropdown-context.es.js";
|
|
3
|
+
const s = ({ children: e }) => {
|
|
4
|
+
const { refs: r, getReferenceProps: o } = n();
|
|
5
|
+
return t(
|
|
6
|
+
e,
|
|
7
|
+
o({
|
|
8
|
+
ref: r.setReference
|
|
9
|
+
})
|
|
10
|
+
);
|
|
11
|
+
};
|
|
12
|
+
export {
|
|
13
|
+
s as DropdownTrigger
|
|
14
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react/jsx-runtime"),e=require("../../../../../external/@floating-ui/react/dist/floating-ui.react.cjs.js"),H=require("../../../../../external/classnames/index.cjs.js"),t=require("react"),S=require("./dropdown.module.scss.cjs.js"),$=require("./dropdown-content/dropdown-content.cjs.js"),A=require("./dropdown-context.cjs.js"),z=require("./dropdown-helpers.cjs.js"),G=require("./dropdown-item/dropdown-item.cjs.js"),J=require("./dropdown-separator/dropdown-separator.cjs.js"),K=require("./dropdown-trigger/dropdown-trigger.cjs.js"),Q=require("../../../../../external/@floating-ui/dom/dist/floating-ui.dom.cjs.js"),f=require("../../../../../external/@floating-ui/react-dom/dist/floating-ui.react-dom.cjs.js"),V=require("../../../helpers/hooks/use-breakpoint-props.cjs.js"),X=require("../../../providers/label-provider/use-labels.cjs.js"),Y=4,s=g=>{var x;const{getCurrentBreakpointProps:F}=V.useBreakpointProps(g.defaultServerBreakpoint),{children:I,modal:w=!1,divided:O=!1,width:P="auto",variant:l="default",open:u,defaultOpen:R=!1,onOpenChange:i,placement:p="bottom-start",className:b}=F(g),{getLabel:j}=X.useLabels(),k=e.useFloatingNodeId(),m=t.useRef([]),[a,v]=t.useState(null),[q,y]=t.useState(null),[B,N]=t.useState(R),d=u??B,h=t.useCallback(r=>{u===void 0&&N(r),i==null||i(r)},[u,i]),T=e.useFloating({nodeId:k,open:d,placement:p,onOpenChange:h,middleware:[f.offset(Y),f.flip(),f.shift()],whileElementsMounted:Q.autoUpdate}),{context:o,refs:n,x:U,y:_,strategy:L}=T,D=e.useInteractions([e.useClick(o),e.useRole(o,{role:"menu"}),e.useDismiss(o),e.useListNavigation(o,{listRef:m,activeIndex:a,onNavigate:v,loop:!0})]),M={open:d,setOpen:h,refs:n,listItemsRef:m,activeIndex:a,setActiveIndex:v,placement:p,content:q,setContent:y,divided:O,variant:l,...D},W=(x=n.reference.current)==null?void 0:x.getBoundingClientRect().width,E=t.useMemo(()=>{const r=n.reference.current;if(!r)return;const C=r.offsetParent;if(C)return C.getBoundingClientRect().width},[n.reference.current]);return c.jsxs(A.DropdownContext.Provider,{value:M,children:[I,c.jsx(e.FloatingPortal,{children:d&&c.jsx(e.FloatingFocusManager,{context:o,modal:w,visuallyHiddenDismiss:w?j("close"):!1,children:c.jsx("div",{...D.getFloatingProps({ref:n.setFloating,className:H.default(S.default["tedi-dropdown"],{[S.default[`tedi-dropdown--${l}`]]:l==="tree"},b),style:{position:L,left:U??0,top:_??0,width:z.resolveDropdownWidth(P,W,E)},role:"menu","aria-orientation":"vertical","aria-activedescendant":a!==null?`dropdown-item-${a}`:void 0}),"data-placement":p,"data-state":d?"open":"closed",children:q})})})]})};s.Trigger=K.DropdownTrigger;s.Content=$.DropdownContent;s.Item=G.DropdownItem;s.Separator=J.DropdownSeparator;exports.Dropdown=s;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Placement } from '@floating-ui/react';
|
|
2
|
+
import { default as React } from 'react';
|
|
3
|
+
import { BreakpointSupport } from '../../../helpers';
|
|
4
|
+
type DropdownBreakpointProps = {
|
|
5
|
+
/**
|
|
6
|
+
* When `true` there is a border between the dropdown items
|
|
7
|
+
* @default false
|
|
8
|
+
*/
|
|
9
|
+
divided?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Controls the width of the dropdown menu.
|
|
12
|
+
* - `'auto'` – width is determined by content (default)
|
|
13
|
+
* - `'trigger'` – matches the width of the trigger element
|
|
14
|
+
* - `'full'` – spans the full width of the containing block
|
|
15
|
+
* - `number` – fixed width in pixels
|
|
16
|
+
* - `string` – any valid CSS width value (e.g. `'16rem'`, `'100%'`)
|
|
17
|
+
* @default auto
|
|
18
|
+
*/
|
|
19
|
+
width?: 'auto' | 'trigger' | 'full' | number | string;
|
|
20
|
+
/**
|
|
21
|
+
* Controls where the dropdown is positioned relative to its trigger.
|
|
22
|
+
* Accepts any Floating UI placement value, such as:
|
|
23
|
+
* `'bottom-start'`, `'bottom-end'`, `'top-start'`, `'right-end'`, etc.
|
|
24
|
+
*
|
|
25
|
+
* @default bottom-start
|
|
26
|
+
*/
|
|
27
|
+
placement?: Placement;
|
|
28
|
+
/**
|
|
29
|
+
* Controls the visual and structural variant of the dropdown.
|
|
30
|
+
* - `'default'` – standard flat list of items
|
|
31
|
+
* - `'tree'` – hierarchical (tree-style) list with indented items and connector lines
|
|
32
|
+
* Tree visuals are only applied when this prop is set to `'tree'`.
|
|
33
|
+
* Ignored by default.
|
|
34
|
+
* @default 'default'
|
|
35
|
+
*/
|
|
36
|
+
variant?: 'default' | 'tree';
|
|
37
|
+
};
|
|
38
|
+
export interface DropdownProps extends BreakpointSupport<DropdownBreakpointProps> {
|
|
39
|
+
/**
|
|
40
|
+
* Child elements — must include exactly one `Dropdown.Trigger` and one `Dropdown.Content`
|
|
41
|
+
*/
|
|
42
|
+
children: React.ReactNode;
|
|
43
|
+
/**
|
|
44
|
+
* When `true`, the dropdown behaves like a modal:
|
|
45
|
+
* - Traps focus inside the dropdown
|
|
46
|
+
* - Shows a visually hidden "Close" button for screen readers
|
|
47
|
+
* - Usually used for menus that require explicit dismissal
|
|
48
|
+
*
|
|
49
|
+
* @default false
|
|
50
|
+
*/
|
|
51
|
+
modal?: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Controlled open state
|
|
54
|
+
*/
|
|
55
|
+
open?: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Uncontrolled default state
|
|
58
|
+
*/
|
|
59
|
+
defaultOpen?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Change handler (fires for both modes)
|
|
62
|
+
*/
|
|
63
|
+
onOpenChange?: (open: boolean) => void;
|
|
64
|
+
className?: string;
|
|
65
|
+
}
|
|
66
|
+
export declare const Dropdown: {
|
|
67
|
+
(props: DropdownProps): import("react/jsx-runtime").JSX.Element;
|
|
68
|
+
Trigger: ({ children }: import('./dropdown-trigger/dropdown-trigger').DropdownTriggerProps) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
|
|
69
|
+
Content: ({ children }: {
|
|
70
|
+
children: React.ReactNode;
|
|
71
|
+
}) => null;
|
|
72
|
+
Item: ({ children, onClick, disabled, active, index, indent, asChild, closeOnSelect, isParent, className, }: import('./dropdown-item/dropdown-item').DropdownItemProps) => import("react/jsx-runtime").JSX.Element;
|
|
73
|
+
Separator: () => import("react/jsx-runtime").JSX.Element;
|
|
74
|
+
};
|
|
75
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { jsxs as U, jsx as m } from "react/jsx-runtime";
|
|
2
|
+
import { useFloatingNodeId as $, useFloating as A, useInteractions as H, useClick as q, useRole as z, useDismiss as G, useListNavigation as J, FloatingPortal as K, FloatingFocusManager as Q } from "../../../../../external/@floating-ui/react/dist/floating-ui.react.es.js";
|
|
3
|
+
import V from "../../../../../external/classnames/index.es.js";
|
|
4
|
+
import e from "react";
|
|
5
|
+
import F from "./dropdown.module.scss.es.js";
|
|
6
|
+
import { DropdownContent as X } from "./dropdown-content/dropdown-content.es.js";
|
|
7
|
+
import { DropdownContext as Y } from "./dropdown-context.es.js";
|
|
8
|
+
import { resolveDropdownWidth as Z } from "./dropdown-helpers.es.js";
|
|
9
|
+
import { DropdownItem as ee } from "./dropdown-item/dropdown-item.es.js";
|
|
10
|
+
import { DropdownSeparator as te } from "./dropdown-separator/dropdown-separator.es.js";
|
|
11
|
+
import { DropdownTrigger as oe } from "./dropdown-trigger/dropdown-trigger.es.js";
|
|
12
|
+
import { autoUpdate as ne } from "../../../../../external/@floating-ui/dom/dist/floating-ui.dom.es.js";
|
|
13
|
+
import { offset as re, flip as ie, shift as se } from "../../../../../external/@floating-ui/react-dom/dist/floating-ui.react-dom.es.js";
|
|
14
|
+
import { useBreakpointProps as ae } from "../../../helpers/hooks/use-breakpoint-props.es.js";
|
|
15
|
+
import { useLabels as le } from "../../../providers/label-provider/use-labels.es.js";
|
|
16
|
+
const de = 4, a = (p) => {
|
|
17
|
+
var D;
|
|
18
|
+
const { getCurrentBreakpointProps: I } = ae(p.defaultServerBreakpoint), {
|
|
19
|
+
children: O,
|
|
20
|
+
modal: f = !1,
|
|
21
|
+
divided: R = !1,
|
|
22
|
+
width: x = "auto",
|
|
23
|
+
variant: l = "default",
|
|
24
|
+
open: d,
|
|
25
|
+
defaultOpen: N = !1,
|
|
26
|
+
onOpenChange: r,
|
|
27
|
+
placement: c = "bottom-start",
|
|
28
|
+
className: P
|
|
29
|
+
} = I(p), { getLabel: S } = le(), k = $(), u = e.useRef([]), [i, g] = e.useState(null), [v, y] = e.useState(null), [B, b] = e.useState(N), s = d ?? B, w = e.useCallback(
|
|
30
|
+
(n) => {
|
|
31
|
+
d === void 0 && b(n), r == null || r(n);
|
|
32
|
+
},
|
|
33
|
+
[d, r]
|
|
34
|
+
), W = A({
|
|
35
|
+
nodeId: k,
|
|
36
|
+
open: s,
|
|
37
|
+
placement: c,
|
|
38
|
+
onOpenChange: w,
|
|
39
|
+
middleware: [re(de), ie(), se()],
|
|
40
|
+
whileElementsMounted: ne
|
|
41
|
+
}), { context: t, refs: o, x: L, y: M, strategy: T } = W, h = H([
|
|
42
|
+
q(t),
|
|
43
|
+
z(t, { role: "menu" }),
|
|
44
|
+
G(t),
|
|
45
|
+
J(t, {
|
|
46
|
+
listRef: u,
|
|
47
|
+
activeIndex: i,
|
|
48
|
+
onNavigate: g,
|
|
49
|
+
loop: !0
|
|
50
|
+
})
|
|
51
|
+
]), _ = {
|
|
52
|
+
open: s,
|
|
53
|
+
setOpen: w,
|
|
54
|
+
refs: o,
|
|
55
|
+
listItemsRef: u,
|
|
56
|
+
activeIndex: i,
|
|
57
|
+
setActiveIndex: g,
|
|
58
|
+
placement: c,
|
|
59
|
+
content: v,
|
|
60
|
+
setContent: y,
|
|
61
|
+
divided: R,
|
|
62
|
+
variant: l,
|
|
63
|
+
...h
|
|
64
|
+
}, j = (D = o.reference.current) == null ? void 0 : D.getBoundingClientRect().width, E = e.useMemo(() => {
|
|
65
|
+
const n = o.reference.current;
|
|
66
|
+
if (!n) return;
|
|
67
|
+
const C = n.offsetParent;
|
|
68
|
+
if (C)
|
|
69
|
+
return C.getBoundingClientRect().width;
|
|
70
|
+
}, [o.reference.current]);
|
|
71
|
+
return /* @__PURE__ */ U(Y.Provider, { value: _, children: [
|
|
72
|
+
O,
|
|
73
|
+
/* @__PURE__ */ m(K, { children: s && /* @__PURE__ */ m(
|
|
74
|
+
Q,
|
|
75
|
+
{
|
|
76
|
+
context: t,
|
|
77
|
+
modal: f,
|
|
78
|
+
visuallyHiddenDismiss: f ? S("close") : !1,
|
|
79
|
+
children: /* @__PURE__ */ m(
|
|
80
|
+
"div",
|
|
81
|
+
{
|
|
82
|
+
...h.getFloatingProps({
|
|
83
|
+
ref: o.setFloating,
|
|
84
|
+
className: V(
|
|
85
|
+
F["tedi-dropdown"],
|
|
86
|
+
{ [F[`tedi-dropdown--${l}`]]: l === "tree" },
|
|
87
|
+
P
|
|
88
|
+
),
|
|
89
|
+
style: {
|
|
90
|
+
position: T,
|
|
91
|
+
left: L ?? 0,
|
|
92
|
+
top: M ?? 0,
|
|
93
|
+
width: Z(x, j, E)
|
|
94
|
+
},
|
|
95
|
+
role: "menu",
|
|
96
|
+
"aria-orientation": "vertical",
|
|
97
|
+
"aria-activedescendant": i !== null ? `dropdown-item-${i}` : void 0
|
|
98
|
+
}),
|
|
99
|
+
"data-placement": c,
|
|
100
|
+
"data-state": s ? "open" : "closed",
|
|
101
|
+
children: v
|
|
102
|
+
}
|
|
103
|
+
)
|
|
104
|
+
}
|
|
105
|
+
) })
|
|
106
|
+
] });
|
|
107
|
+
};
|
|
108
|
+
a.Trigger = oe;
|
|
109
|
+
a.Content = X;
|
|
110
|
+
a.Item = ee;
|
|
111
|
+
a.Separator = te;
|
|
112
|
+
export {
|
|
113
|
+
a as Dropdown
|
|
114
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e={"tedi-dropdown":"tedi-dropdown-0246d37c","tedi-dropdown--tree":"tedi-dropdown--tree-c13f70ee","tedi-dropdown__item":"tedi-dropdown__item-fa7ee478"};exports.default=e;
|
package/src/tedi/index.d.ts
CHANGED
|
@@ -37,6 +37,7 @@ export * from './components/form/select/select';
|
|
|
37
37
|
export * from './components/form/checkbox/checkbox';
|
|
38
38
|
export * from './components/overlays/tooltip';
|
|
39
39
|
export * from './components/overlays/popover';
|
|
40
|
+
export * from './components/overlays/dropdown';
|
|
40
41
|
export * from './components/misc/separator/separator';
|
|
41
42
|
export * from './components/misc/print/print';
|
|
42
43
|
export * from './components/misc/stretch-content/stretch-content';
|
package/tedi.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("./src/tedi/components/base/typography/text/text.cjs.js"),c=require("./src/tedi/components/base/typography/heading/heading.cjs.js"),u=require("./src/tedi/components/base/icon/icon.cjs.js"),a=require("./src/tedi/components/content/label/label.cjs.js"),l=require("./src/tedi/components/content/section/section.cjs.js"),d=require("./src/tedi/components/content/heading-with-icon/heading-with-icon.cjs.js"),p=require("./src/tedi/components/content/truncate/truncate.cjs.js"),q=require("./src/tedi/components/content/text-group/text-group.cjs.js"),g=require("./src/tedi/components/loaders/spinner/spinner.cjs.js"),C=require("./src/tedi/components/tags/tag/tag.cjs.js"),S=require("./src/tedi/components/tags/status-badge/status-badge.cjs.js"),v=require("./src/tedi/components/buttons/closing-button/closing-button.cjs.js"),T=require("./src/tedi/components/buttons/button/button.cjs.js"),b=require("./src/tedi/components/buttons/info-button/info-button.cjs.js"),h=require("./src/tedi/components/buttons/floating-button/floating-button.cjs.js"),x=require("./src/tedi/components/buttons/button-group/button-group.cjs.js"),I=require("./src/tedi/components/buttons/collapse/collapse.cjs.js"),B=require("./src/tedi/components/notifications/alert/alert.cjs.js"),k=require("./src/tedi/components/notifications/toast/toast.cjs.js"),m=require("./src/tedi/components/navigation/hash-trigger/hash-trigger.cjs.js"),P=require("./src/tedi/components/navigation/link/link.cjs.js"),w=require("./src/tedi/components/form/textfield/textfield.cjs.js"),D=require("./src/tedi/components/form/textarea/textarea.cjs.js"),L=require("./src/tedi/components/form/number-field/number-field.cjs.js"),f=require("./src/tedi/components/form/feedback-text/feedback-text.cjs.js"),F=require("./src/tedi/components/form/search/search.cjs.js"),G=require("./src/tedi/components/form/radio/radio.cjs.js"),N=require("./src/tedi/components/form/file-upload/file-upload.cjs.js"),y=require("./src/tedi/components/form/file-dropzone/file-dropzone.cjs.js"),A=require("./src/tedi/components/form/select/select.cjs.js"),M=require("./src/tedi/components/form/checkbox/checkbox.cjs.js"),H=require("./src/tedi/components/misc/separator/separator.cjs.js"),V=require("./src/tedi/components/misc/print/print.cjs.js"),z=require("./src/tedi/components/misc/stretch-content/stretch-content.cjs.js"),R=require("./src/tedi/components/misc/scroll-visibility/scroll-visibility.cjs.js"),U=require("./src/tedi/components/misc/scroll-fade/scroll-fade.cjs.js"),W=require("./src/tedi/components/misc/affix/affix.cjs.js"),E=require("./src/tedi/components/misc/ellipsis/ellipsis.cjs.js"),j=require("./src/tedi/providers/style-provider/style-provider.cjs.js"),o=require("./src/tedi/providers/accessibility-provider/accessibility-provider.cjs.js"),O=require("./src/tedi/providers/accessibility-provider/use-declare-loader.cjs.js"),t=require("./src/tedi/providers/theme-provider/theme-provider.cjs.js"),J=require("./src/tedi/components/content/list/list.cjs.js"),K=require("./src/tedi/components/content/list/list-item.cjs.js"),Q=require("./src/tedi/components/loaders/skeleton/skeleton.cjs.js"),X=require("./src/tedi/components/loaders/skeleton/skeleton-block/skeleton-block.cjs.js"),Y=require("./src/tedi/components/layout/vertical-spacing/vertical-spacing.cjs.js"),Z=require("./src/tedi/components/layout/vertical-spacing/vertical-spacing-item.cjs.js"),_=require("./src/tedi/components/layout/grid/row.cjs.js"),$=require("./src/tedi/components/layout/grid/col.cjs.js"),ee=require("./external/react-toastify/dist/index.cjs.js"),re=require("./src/tedi/components/cards/card/card.cjs.js"),oe=require("./src/tedi/components/cards/card/card-header/card-header.cjs.js"),te=require("./src/tedi/components/cards/card/card-notification/card-notification.cjs.js"),ie=require("./src/tedi/components/cards/card/card-content/card-content.cjs.js"),ne=require("./src/tedi/components/form/choice-group/choice-group.cjs.js"),se=require("./src/tedi/components/form/choice-group/choice-group-context.cjs.js"),ce=require("./src/tedi/components/form/choice-group/components/choice-group-item/choice-group-item.cjs.js"),ue=require("./src/tedi/components/overlays/tooltip/tooltip.cjs.js"),ae=require("./src/tedi/components/overlays/tooltip/tooltip-content.cjs.js"),le=require("./src/tedi/components/overlays/tooltip/tooltip-trigger.cjs.js"),de=require("./src/tedi/components/overlays/popover/popover.cjs.js"),pe=require("./src/tedi/components/overlays/popover/popover-content.cjs.js"),qe=require("./src/tedi/components/overlays/popover/popover-trigger.cjs.js"),ge=require("./src/tedi/components/overlays/dropdown/dropdown.cjs.js"),i=require("./src/tedi/components/overlays/dropdown/dropdown-context.cjs.js"),Ce=require("./src/tedi/components/overlays/dropdown/dropdown-content/dropdown-content.cjs.js"),Se=require("./src/tedi/components/overlays/dropdown/dropdown-trigger/dropdown-trigger.cjs.js"),ve=require("./src/tedi/components/overlays/dropdown/dropdown-item/dropdown-item.cjs.js"),Te=require("./src/tedi/components/layout/sidenav/sidenav.cjs.js"),be=require("./src/tedi/components/layout/sidenav/components/sidenav-dropdown/sidenav-dropdown.cjs.js"),he=require("./src/tedi/components/layout/sidenav/components/sidenav-item/sidenav-item.cjs.js"),xe=require("./src/tedi/components/layout/sidenav/components/sidenav-toggle/sidenav-toggle.cjs.js"),Ie=require("./src/tedi/components/layout/sidenav/components/sidenav-mobile/sidenav-mobile.cjs.js"),Be=require("./src/tedi/helpers/hooks/use-is-mounted.cjs.js"),e=require("./src/tedi/helpers/hooks/use-breakpoint.cjs.js"),ke=require("./src/tedi/helpers/hooks/use-breakpoint-props.cjs.js"),me=require("./src/tedi/helpers/hooks/use-print.cjs.js"),Pe=require("./src/tedi/helpers/hooks/use-element-size.cjs.js"),we=require("./src/tedi/helpers/hooks/use-scroll.cjs.js"),De=require("./src/tedi/helpers/hooks/use-is-touch-device.cjs.js"),Le=require("./src/tedi/helpers/hooks/use-file-upload.cjs.js"),fe=require("./src/tedi/helpers/hooks/use-what-input.cjs.js"),Fe=require("./src/tedi/providers/label-provider/use-labels.cjs.js"),n=require("./src/tedi/providers/label-provider/label-provider.cjs.js"),r=require("./src/tedi/providers/label-provider/labels-map.cjs.js");exports.Text=s.Text;exports.Heading=c.Heading;exports.Icon=u.Icon;exports.Label=a.Label;exports.Section=l.Section;exports.HeadingWithIcon=d.HeadingWithIcon;exports.Truncate=p.Truncate;exports.TextGroup=q.TextGroup;exports.Spinner=g.Spinner;exports.Tag=C.Tag;exports.StatusBadge=S.StatusBadge;exports.ClosingButton=v.ClosingButton;exports.Button=T.Button;exports.InfoButton=b.InfoButton;exports.FloatingButton=h.FloatingButton;exports.ButtonGroup=x.ButtonGroup;exports.Collapse=I.Collapse;exports.Alert=B.Alert;exports.sendNotification=k.sendNotification;exports.HashTrigger=m.HashTrigger;exports.Link=P.Link;exports.TextField=w.TextField;exports.TextArea=D.TextArea;exports.NumberField=L.NumberField;exports.FeedbackText=f.FeedbackText;exports.Search=F.Search;exports.Radio=G.Radio;exports.FileUpload=N.FileUpload;exports.FileDropzone=y.FileDropzone;exports.Select=A.Select;exports.Checkbox=M.Checkbox;exports.Separator=H.Separator;exports.Print=V.Print;exports.StretchContent=z.StretchContent;exports.ScrollVisibility=R.ScrollVisibility;exports.ScrollFade=U.ScrollFade;exports.Affix=W.Affix;exports.Ellipsis=E.Ellipsis;exports.StyleProvider=j.StyleProvider;exports.AccessibilityContext=o.AccessibilityContext;exports.AccessibilityProvider=o.AccessibilityProvider;exports.useDeclareLoader=O.useDeclareLoader;exports.ThemeProvider=t.ThemeProvider;exports.useTheme=t.useTheme;exports.List=J.List;exports.ListItem=K.ListItem;exports.Skeleton=Q.Skeleton;exports.SkeletonBlock=X.SkeletonBlock;exports.VerticalSpacing=Y.VerticalSpacing;exports.VerticalSpacingItem=Z.VerticalSpacingItem;exports.Row=_.Row;exports.Col=$.Col;exports.ToastContainer=ee.ToastContainer;exports.Card=re.Card;exports.CardHeader=oe.CardHeader;exports.CardNotification=te.CardNotification;exports.CardContent=ie.CardContent;exports.ChoiceGroup=ne.ChoiceGroup;exports.ChoiceGroupContext=se.ChoiceGroupContext;exports.ChoiceGroupItem=ce.ChoiceGroupItem;exports.Tooltip=ue.Tooltip;exports.TooltipContent=ae.TooltipContent;exports.TooltipTrigger=le.TooltipTrigger;exports.Popover=de.Popover;exports.PopoverContent=pe.PopoverContent;exports.PopoverTrigger=qe.PopoverTrigger;exports.Dropdown=ge.Dropdown;exports.DropdownContext=i.DropdownContext;exports.useDropdownContext=i.useDropdownContext;exports.DropdownContent=Ce.DropdownContent;exports.DropdownTrigger=Se.DropdownTrigger;exports.DropdownItem=ve.DropdownItem;exports.SideNav=Te.SideNav;exports.SideNavDropdown=be.SideNavDropdown;exports.SideNavItem=he.SideNavItem;exports.SidenavToggle=xe.SidenavToggle;exports.SideNavMobile=Ie.SideNavMobile;exports.useIsMounted=Be.useIsMounted;exports.breakpoints=e.breakpoints;exports.isBreakpointBelow=e.isBreakpointBelow;exports.useBreakpoint=e.useBreakpoint;exports.useBreakpointProps=ke.useBreakpointProps;exports.usePrint=me.usePrint;exports.useElementSize=Pe.useElementSize;exports.useScroll=we.useScroll;exports.useIsTouchDevice=De.useIsTouchDevice;exports.useFileUpload=Le.useFileUpload;exports.useWhatInput=fe.useWhatInput;exports.useLabels=Fe.useLabels;exports.LabelContext=n.LabelContext;exports.LabelProvider=n.LabelProvider;exports.labelsMap=r.labelsMap;exports.validateLabelRecord=r.validateLabelRecord;exports.validateLabelValues=r.validateLabelValues;
|