@payloadcms/ui 3.59.1 → 3.60.0-canary.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/elements/CodeEditor/CodeEditor.js +1 -1
- package/dist/elements/CodeEditor/CodeEditor.js.map +1 -1
- package/dist/elements/Collapsible/index.d.ts +15 -2
- package/dist/elements/Collapsible/index.d.ts.map +1 -1
- package/dist/elements/Collapsible/index.js +59 -60
- package/dist/elements/Collapsible/index.js.map +1 -1
- package/dist/elements/Collapsible/index.scss +6 -2
- package/dist/elements/Combobox/index.d.ts +30 -0
- package/dist/elements/Combobox/index.d.ts.map +1 -0
- package/dist/elements/Combobox/index.js +96 -0
- package/dist/elements/Combobox/index.js.map +1 -0
- package/dist/elements/Combobox/index.scss +49 -0
- package/dist/elements/Nav/context.d.ts +6 -0
- package/dist/elements/Nav/context.d.ts.map +1 -1
- package/dist/elements/Nav/context.js +6 -0
- package/dist/elements/Nav/context.js.map +1 -1
- package/dist/elements/PageControls/index.d.ts +9 -0
- package/dist/elements/PageControls/index.d.ts.map +1 -1
- package/dist/elements/PageControls/index.js +101 -45
- package/dist/elements/PageControls/index.js.map +1 -1
- package/dist/elements/Popup/PopupButtonList/index.scss +3 -4
- package/dist/elements/Popup/index.scss +2 -0
- package/dist/elements/StickyToolbar/index.d.ts +3 -0
- package/dist/elements/StickyToolbar/index.d.ts.map +1 -1
- package/dist/elements/StickyToolbar/index.js +3 -0
- package/dist/elements/StickyToolbar/index.js.map +1 -1
- package/dist/exports/client/{CodeEditor-UTOLPRAV.js → CodeEditor-WXQZOS3M.js} +2 -2
- package/dist/exports/client/{chunk-S2X3JKSP.js → chunk-PDWTBQPH.js} +2 -2
- package/dist/exports/client/{chunk-S2X3JKSP.js.map → chunk-PDWTBQPH.js.map} +3 -3
- package/dist/exports/client/index.d.ts +6 -1
- package/dist/exports/client/index.d.ts.map +1 -1
- package/dist/exports/client/index.js +12 -12
- package/dist/exports/client/index.js.map +4 -4
- package/dist/fields/Code/index.d.ts.map +1 -1
- package/dist/fields/Code/index.js +5 -2
- package/dist/fields/Code/index.js.map +1 -1
- package/dist/hooks/useControllableState.d.ts +2 -0
- package/dist/hooks/useControllableState.d.ts.map +1 -1
- package/dist/hooks/useControllableState.js +44 -11
- package/dist/hooks/useControllableState.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +5 -5
- /package/dist/exports/client/{CodeEditor-UTOLPRAV.js.map → CodeEditor-WXQZOS3M.js.map} +0 -0
|
@@ -71,6 +71,7 @@ const CodeEditor = props => {
|
|
|
71
71
|
React.useEffect(t3, t4);
|
|
72
72
|
return _jsx(Editor, {
|
|
73
73
|
className: classes,
|
|
74
|
+
height: maxHeight ? Math.min(dynamicHeight, maxHeight) : dynamicHeight,
|
|
74
75
|
loading: _jsx(ShimmerEffect, {
|
|
75
76
|
height: dynamicHeight
|
|
76
77
|
}),
|
|
@@ -86,7 +87,6 @@ const CodeEditor = props => {
|
|
|
86
87
|
theme: theme === "dark" ? "vs-dark" : "vs",
|
|
87
88
|
value,
|
|
88
89
|
...rest,
|
|
89
|
-
height: maxHeight ? Math.min(dynamicHeight, maxHeight) : dynamicHeight,
|
|
90
90
|
onChange: (value_0, ev) => {
|
|
91
91
|
rest.onChange?.(value_0, ev);
|
|
92
92
|
setDynamicHeight(value_0 ? Math.max(MIN_HEIGHT, value_0.split("\n").length * 18 + 2 + paddingFromProps) : MIN_HEIGHT);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeEditor.js","names":["c","_c","EditorImport","React","useState","useTheme","ShimmerEffect","defaultGlobalEditorOptions","defaultOptions","Editor","default","baseClass","CodeEditor","props","$","className","maxHeight","minHeight","options","readOnly","recalculatedHeightAt","value","rest","MIN_HEIGHT","prevCalculatedHeightAt","useRef","insertSpaces","tabSize","trimAutoWhitespace","globalEditorOptions","paddingFromProps","padding","top","bottom","dynamicHeight","setDynamicHeight","theme","t0","defaultLanguage","t1","t2","filter","Boolean","classes","join","t3","t4","current","Math","max","split","length","useEffect","_jsx","
|
|
1
|
+
{"version":3,"file":"CodeEditor.js","names":["c","_c","EditorImport","React","useState","useTheme","ShimmerEffect","defaultGlobalEditorOptions","defaultOptions","Editor","default","baseClass","CodeEditor","props","$","className","maxHeight","minHeight","options","readOnly","recalculatedHeightAt","value","rest","MIN_HEIGHT","prevCalculatedHeightAt","useRef","insertSpaces","tabSize","trimAutoWhitespace","globalEditorOptions","paddingFromProps","padding","top","bottom","dynamicHeight","setDynamicHeight","theme","t0","defaultLanguage","t1","t2","filter","Boolean","classes","join","t3","t4","current","Math","max","split","length","useEffect","_jsx","height","min","loading","detectIndentation","undefined","onChange","value_0","ev","onMount","editor","monaco","model","getModel","updateOptions","getValue"],"sources":["../../../src/elements/CodeEditor/CodeEditor.tsx"],"sourcesContent":["'use client'\nimport EditorImport from '@monaco-editor/react'\nimport React, { useState } from 'react'\n\nimport type { Props } from './types.js'\n\nimport { useTheme } from '../../providers/Theme/index.js'\nimport { ShimmerEffect } from '../ShimmerEffect/index.js'\nimport { defaultGlobalEditorOptions, defaultOptions } from './constants.js'\nimport './index.scss'\n\nconst Editor = 'default' in EditorImport ? EditorImport.default : EditorImport\n\nconst baseClass = 'code-editor'\n\nconst CodeEditor: React.FC<Props> = (props) => {\n const {\n className,\n maxHeight,\n minHeight,\n options,\n readOnly,\n recalculatedHeightAt,\n value,\n ...rest\n } = props\n const MIN_HEIGHT = minHeight ?? 56 // equivalent to 3 lines\n const prevCalculatedHeightAt = React.useRef<number | undefined>(recalculatedHeightAt)\n\n // Extract per-model settings to avoid global conflicts\n const { insertSpaces, tabSize, trimAutoWhitespace, ...globalEditorOptions } = options || {}\n const paddingFromProps = options?.padding\n ? (options.padding.top || 0) + (options.padding?.bottom || 0)\n : 0\n\n const [dynamicHeight, setDynamicHeight] = useState(MIN_HEIGHT)\n const { theme } = useTheme()\n\n const classes = [\n baseClass,\n className,\n rest?.defaultLanguage ? `language--${rest.defaultLanguage}` : '',\n readOnly && 'read-only',\n ]\n .filter(Boolean)\n .join(' ')\n\n React.useEffect(() => {\n if (recalculatedHeightAt && recalculatedHeightAt > prevCalculatedHeightAt.current) {\n setDynamicHeight(\n value\n ? Math.max(MIN_HEIGHT, value.split('\\n').length * 18 + 2 + paddingFromProps)\n : MIN_HEIGHT,\n )\n prevCalculatedHeightAt.current = recalculatedHeightAt\n }\n }, [value, MIN_HEIGHT, paddingFromProps, recalculatedHeightAt])\n\n return (\n <Editor\n className={classes}\n height={maxHeight ? Math.min(dynamicHeight, maxHeight) : dynamicHeight}\n loading={<ShimmerEffect height={dynamicHeight} />}\n options={{\n ...defaultGlobalEditorOptions,\n ...globalEditorOptions,\n readOnly: Boolean(readOnly),\n /**\n * onMount the model will set:\n * - insertSpaces\n * - tabSize\n * - trimAutoWhitespace\n */\n detectIndentation: false,\n insertSpaces: undefined,\n tabSize: undefined,\n trimAutoWhitespace: undefined,\n }}\n theme={theme === 'dark' ? 'vs-dark' : 'vs'}\n value={value}\n {...rest}\n // Since we are not building an IDE and the container\n // can already have scrolling, we want the height of the\n // editor to fit its content.\n // See: https://github.com/microsoft/monaco-editor/discussions/3677\n onChange={(value, ev) => {\n rest.onChange?.(value, ev)\n setDynamicHeight(\n value\n ? Math.max(MIN_HEIGHT, value.split('\\n').length * 18 + 2 + paddingFromProps)\n : MIN_HEIGHT,\n )\n }}\n onMount={(editor, monaco) => {\n rest.onMount?.(editor, monaco)\n\n // Set per-model options to avoid global conflicts\n const model = editor.getModel()\n if (model) {\n model.updateOptions({\n insertSpaces: insertSpaces ?? defaultOptions.insertSpaces,\n tabSize: tabSize ?? defaultOptions.tabSize,\n trimAutoWhitespace: trimAutoWhitespace ?? defaultOptions.trimAutoWhitespace,\n })\n }\n\n setDynamicHeight(\n Math.max(MIN_HEIGHT, editor.getValue().split('\\n').length * 18 + 2 + paddingFromProps),\n )\n }}\n />\n )\n}\n\n// eslint-disable-next-line no-restricted-exports\nexport default CodeEditor\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,16 +3,29 @@ import type { DragHandleProps } from '../DraggableSortable/DraggableSortableItem
|
|
|
3
3
|
import './index.scss';
|
|
4
4
|
import { CollapsibleProvider, useCollapsible } from './provider.js';
|
|
5
5
|
export { CollapsibleProvider, useCollapsible };
|
|
6
|
-
export type
|
|
6
|
+
export type CollapsibleProps = {
|
|
7
7
|
actions?: React.ReactNode;
|
|
8
|
+
/**
|
|
9
|
+
* Components that will be rendered within the collapsible provider but after the wrapper.
|
|
10
|
+
*/
|
|
11
|
+
AfterCollapsible?: React.ReactNode;
|
|
8
12
|
children: React.ReactNode;
|
|
9
13
|
className?: string;
|
|
10
14
|
collapsibleStyle?: 'default' | 'error';
|
|
15
|
+
/**
|
|
16
|
+
* If set to true, clicking on the collapsible header will not toggle the collapsible state.
|
|
17
|
+
* This is useful if the collapsible state is controlled externally (e.g. from a parent component or custom button).
|
|
18
|
+
*/
|
|
19
|
+
disableHeaderToggle?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* If set to true, the toggle indicator (chevron) on the right side of the header will be hidden.
|
|
22
|
+
*/
|
|
23
|
+
disableToggleIndicator?: boolean;
|
|
11
24
|
dragHandleProps?: DragHandleProps;
|
|
12
25
|
header?: React.ReactNode;
|
|
13
26
|
initCollapsed?: boolean;
|
|
14
27
|
isCollapsed?: boolean;
|
|
15
28
|
onToggle?: (collapsed: boolean) => Promise<void> | void;
|
|
16
29
|
};
|
|
17
|
-
export declare const Collapsible: React.FC<
|
|
30
|
+
export declare const Collapsible: React.FC<CollapsibleProps>;
|
|
18
31
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Collapsible/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAEvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qDAAqD,CAAA;AAK1F,OAAO,cAAc,CAAA;AAErB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAInE,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,CAAA;AAE9C,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Collapsible/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAEvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qDAAqD,CAAA;AAK1F,OAAO,cAAc,CAAA;AAErB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAInE,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,CAAA;AAE9C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB;;OAEG;IACH,gBAAgB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAClC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB,CAAC,EAAE,SAAS,GAAG,OAAO,CAAA;IACtC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B;;OAEG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACxB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;CACxD,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAoGlD,CAAA"}
|
|
@@ -12,12 +12,15 @@ import { CollapsibleProvider, useCollapsible } from './provider.js';
|
|
|
12
12
|
const baseClass = 'collapsible';
|
|
13
13
|
export { CollapsibleProvider, useCollapsible };
|
|
14
14
|
export const Collapsible = t0 => {
|
|
15
|
-
const $ = _c(
|
|
15
|
+
const $ = _c(25);
|
|
16
16
|
const {
|
|
17
17
|
actions,
|
|
18
|
+
AfterCollapsible,
|
|
18
19
|
children,
|
|
19
20
|
className,
|
|
20
21
|
collapsibleStyle: t1,
|
|
22
|
+
disableHeaderToggle: t2,
|
|
23
|
+
disableToggleIndicator: t3,
|
|
21
24
|
dragHandleProps,
|
|
22
25
|
header,
|
|
23
26
|
initCollapsed,
|
|
@@ -25,6 +28,8 @@ export const Collapsible = t0 => {
|
|
|
25
28
|
onToggle
|
|
26
29
|
} = t0;
|
|
27
30
|
const collapsibleStyle = t1 === undefined ? "default" : t1;
|
|
31
|
+
const disableHeaderToggle = t2 === undefined ? false : t2;
|
|
32
|
+
const disableToggleIndicator = t3 === undefined ? false : t3;
|
|
28
33
|
const [collapsedLocal, setCollapsedLocal] = useState(Boolean(initCollapsed));
|
|
29
34
|
const [hoveringToggle, setHoveringToggle] = useState(false);
|
|
30
35
|
const {
|
|
@@ -34,9 +39,9 @@ export const Collapsible = t0 => {
|
|
|
34
39
|
t
|
|
35
40
|
} = useTranslation();
|
|
36
41
|
const isCollapsed = typeof collapsedFromProps === "boolean" ? collapsedFromProps : collapsedLocal;
|
|
37
|
-
let
|
|
42
|
+
let t4;
|
|
38
43
|
if ($[0] !== isCollapsed || $[1] !== onToggle) {
|
|
39
|
-
|
|
44
|
+
t4 = () => {
|
|
40
45
|
if (typeof onToggle === "function") {
|
|
41
46
|
onToggle(!isCollapsed);
|
|
42
47
|
}
|
|
@@ -44,64 +49,55 @@ export const Collapsible = t0 => {
|
|
|
44
49
|
};
|
|
45
50
|
$[0] = isCollapsed;
|
|
46
51
|
$[1] = onToggle;
|
|
47
|
-
$[2] =
|
|
52
|
+
$[2] = t4;
|
|
48
53
|
} else {
|
|
49
|
-
|
|
54
|
+
t4 = $[2];
|
|
50
55
|
}
|
|
51
|
-
const toggleCollapsible =
|
|
52
|
-
const
|
|
53
|
-
const
|
|
54
|
-
const
|
|
55
|
-
const
|
|
56
|
-
const
|
|
57
|
-
let t8;
|
|
58
|
-
if ($[3] !== className || $[4] !== t3 || $[5] !== t4 || $[6] !== t5 || $[7] !== t6 || $[8] !== t7) {
|
|
59
|
-
t8 = [baseClass, className, t3, t4, t5, t6, t7].filter(Boolean);
|
|
60
|
-
$[3] = className;
|
|
61
|
-
$[4] = t3;
|
|
62
|
-
$[5] = t4;
|
|
63
|
-
$[6] = t5;
|
|
64
|
-
$[7] = t6;
|
|
65
|
-
$[8] = t7;
|
|
66
|
-
$[9] = t8;
|
|
67
|
-
} else {
|
|
68
|
-
t8 = $[9];
|
|
69
|
-
}
|
|
70
|
-
const t9 = t8.join(" ");
|
|
56
|
+
const toggleCollapsible = t4;
|
|
57
|
+
const t5 = dragHandleProps && `${baseClass}--has-drag-handle`;
|
|
58
|
+
const t6 = isCollapsed && `${baseClass}--collapsed`;
|
|
59
|
+
const t7 = isWithinCollapsible && `${baseClass}--nested`;
|
|
60
|
+
const t8 = hoveringToggle && !disableHeaderToggle && `${baseClass}--hovered`;
|
|
61
|
+
const t9 = `${baseClass}--style-${collapsibleStyle}`;
|
|
71
62
|
let t10;
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
$[
|
|
77
|
-
$[
|
|
63
|
+
if ($[3] !== className || $[4] !== t5 || $[5] !== t6 || $[6] !== t7 || $[7] !== t8 || $[8] !== t9) {
|
|
64
|
+
t10 = [baseClass, className, t5, t6, t7, t8, t9].filter(Boolean);
|
|
65
|
+
$[3] = className;
|
|
66
|
+
$[4] = t5;
|
|
67
|
+
$[5] = t6;
|
|
68
|
+
$[6] = t7;
|
|
69
|
+
$[7] = t8;
|
|
70
|
+
$[8] = t9;
|
|
71
|
+
$[9] = t10;
|
|
78
72
|
} else {
|
|
79
|
-
t10 = $[
|
|
80
|
-
t11 = $[11];
|
|
73
|
+
t10 = $[9];
|
|
81
74
|
}
|
|
82
|
-
const
|
|
75
|
+
const t11 = t10.join(" ");
|
|
76
|
+
const t12 = `${baseClass}__toggle-wrap${disableHeaderToggle ? " toggle-disabled" : ""}`;
|
|
83
77
|
let t13;
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
78
|
+
let t14;
|
|
79
|
+
if ($[10] === Symbol.for("react.memo_cache_sentinel")) {
|
|
80
|
+
t13 = () => setHoveringToggle(true);
|
|
81
|
+
t14 = () => setHoveringToggle(false);
|
|
82
|
+
$[10] = t13;
|
|
83
|
+
$[11] = t14;
|
|
88
84
|
} else {
|
|
89
|
-
t13 = $[
|
|
85
|
+
t13 = $[10];
|
|
86
|
+
t14 = $[11];
|
|
90
87
|
}
|
|
91
|
-
const t14 = t13.join(" ");
|
|
92
88
|
let t15;
|
|
93
|
-
if ($[
|
|
89
|
+
if ($[12] !== AfterCollapsible || $[13] !== actions || $[14] !== children || $[15] !== disableHeaderToggle || $[16] !== disableToggleIndicator || $[17] !== dragHandleProps || $[18] !== header || $[19] !== isCollapsed || $[20] !== t || $[21] !== t11 || $[22] !== t12 || $[23] !== toggleCollapsible) {
|
|
94
90
|
t15 = _jsx("div", {
|
|
95
|
-
className:
|
|
91
|
+
className: t11,
|
|
96
92
|
children: _jsxs(CollapsibleProvider, {
|
|
97
93
|
isCollapsed,
|
|
98
94
|
toggle: toggleCollapsible,
|
|
99
95
|
children: [_jsxs("div", {
|
|
100
|
-
className:
|
|
101
|
-
onMouseEnter:
|
|
102
|
-
onMouseLeave:
|
|
103
|
-
children: [_jsx("button", {
|
|
104
|
-
className:
|
|
96
|
+
className: t12,
|
|
97
|
+
onMouseEnter: t13,
|
|
98
|
+
onMouseLeave: t14,
|
|
99
|
+
children: [!disableHeaderToggle && _jsx("button", {
|
|
100
|
+
className: [`${baseClass}__toggle`, `${baseClass}__toggle--${isCollapsed ? "collapsed" : "open"}`].filter(Boolean).join(" "),
|
|
105
101
|
onClick: toggleCollapsible,
|
|
106
102
|
type: "button",
|
|
107
103
|
children: _jsx("span", {
|
|
@@ -120,7 +116,7 @@ export const Collapsible = t0 => {
|
|
|
120
116
|
children: [actions ? _jsx("div", {
|
|
121
117
|
className: `${baseClass}__actions`,
|
|
122
118
|
children: actions
|
|
123
|
-
}) : null, _jsx("div", {
|
|
119
|
+
}) : null, !disableToggleIndicator && _jsx("div", {
|
|
124
120
|
className: `${baseClass}__indicator`,
|
|
125
121
|
children: _jsx(ChevronIcon, {
|
|
126
122
|
direction: !isCollapsed ? "up" : undefined
|
|
@@ -133,21 +129,24 @@ export const Collapsible = t0 => {
|
|
|
133
129
|
className: `${baseClass}__content`,
|
|
134
130
|
children
|
|
135
131
|
})
|
|
136
|
-
})]
|
|
132
|
+
}), AfterCollapsible]
|
|
137
133
|
})
|
|
138
134
|
});
|
|
139
|
-
$[
|
|
140
|
-
$[
|
|
141
|
-
$[
|
|
142
|
-
$[
|
|
143
|
-
$[
|
|
144
|
-
$[
|
|
145
|
-
$[
|
|
146
|
-
$[
|
|
147
|
-
$[
|
|
148
|
-
$[
|
|
135
|
+
$[12] = AfterCollapsible;
|
|
136
|
+
$[13] = actions;
|
|
137
|
+
$[14] = children;
|
|
138
|
+
$[15] = disableHeaderToggle;
|
|
139
|
+
$[16] = disableToggleIndicator;
|
|
140
|
+
$[17] = dragHandleProps;
|
|
141
|
+
$[18] = header;
|
|
142
|
+
$[19] = isCollapsed;
|
|
143
|
+
$[20] = t;
|
|
144
|
+
$[21] = t11;
|
|
145
|
+
$[22] = t12;
|
|
146
|
+
$[23] = toggleCollapsible;
|
|
147
|
+
$[24] = t15;
|
|
149
148
|
} else {
|
|
150
|
-
t15 = $[
|
|
149
|
+
t15 = $[24];
|
|
151
150
|
}
|
|
152
151
|
return t15;
|
|
153
152
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["c","_c","React","useState","ChevronIcon","DragHandleIcon","useTranslation","AnimateHeight","CollapsibleProvider","useCollapsible","baseClass","Collapsible","t0","$","actions","children","className","collapsibleStyle","t1","dragHandleProps","header","initCollapsed","isCollapsed","collapsedFromProps","onToggle","undefined","collapsedLocal","setCollapsedLocal","Boolean","hoveringToggle","setHoveringToggle","isWithinCollapsible","t","
|
|
1
|
+
{"version":3,"file":"index.js","names":["c","_c","React","useState","ChevronIcon","DragHandleIcon","useTranslation","AnimateHeight","CollapsibleProvider","useCollapsible","baseClass","Collapsible","t0","$","actions","AfterCollapsible","children","className","collapsibleStyle","t1","disableHeaderToggle","t2","disableToggleIndicator","t3","dragHandleProps","header","initCollapsed","isCollapsed","collapsedFromProps","onToggle","undefined","collapsedLocal","setCollapsedLocal","Boolean","hoveringToggle","setHoveringToggle","isWithinCollapsible","t","t4","toggleCollapsible","t5","t6","t7","t8","t9","t10","filter","t11","join","t12","t13","t14","Symbol","for","t15","_jsx","_jsxs","toggle","onMouseEnter","onMouseLeave","onClick","type","attributes","listeners","direction","height"],"sources":["../../../src/elements/Collapsible/index.tsx"],"sourcesContent":["'use client'\nimport React, { useState } from 'react'\n\nimport type { DragHandleProps } from '../DraggableSortable/DraggableSortableItem/types.js'\n\nimport { ChevronIcon } from '../../icons/Chevron/index.js'\nimport { DragHandleIcon } from '../../icons/DragHandle/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport './index.scss'\nimport { AnimateHeight } from '../AnimateHeight/index.js'\nimport { CollapsibleProvider, useCollapsible } from './provider.js'\n\nconst baseClass = 'collapsible'\n\nexport { CollapsibleProvider, useCollapsible }\n\nexport type CollapsibleProps = {\n actions?: React.ReactNode\n /**\n * Components that will be rendered within the collapsible provider but after the wrapper.\n */\n AfterCollapsible?: React.ReactNode\n children: React.ReactNode\n className?: string\n collapsibleStyle?: 'default' | 'error'\n /**\n * If set to true, clicking on the collapsible header will not toggle the collapsible state.\n * This is useful if the collapsible state is controlled externally (e.g. from a parent component or custom button).\n */\n disableHeaderToggle?: boolean\n /**\n * If set to true, the toggle indicator (chevron) on the right side of the header will be hidden.\n */\n disableToggleIndicator?: boolean\n dragHandleProps?: DragHandleProps\n header?: React.ReactNode\n initCollapsed?: boolean\n isCollapsed?: boolean\n onToggle?: (collapsed: boolean) => Promise<void> | void\n}\n\nexport const Collapsible: React.FC<CollapsibleProps> = ({\n actions,\n AfterCollapsible,\n children,\n className,\n collapsibleStyle = 'default',\n disableHeaderToggle = false,\n disableToggleIndicator = false,\n dragHandleProps,\n header,\n initCollapsed,\n isCollapsed: collapsedFromProps,\n onToggle,\n}) => {\n const [collapsedLocal, setCollapsedLocal] = useState(Boolean(initCollapsed))\n const [hoveringToggle, setHoveringToggle] = useState(false)\n const { isWithinCollapsible } = useCollapsible()\n const { t } = useTranslation()\n\n const isCollapsed = typeof collapsedFromProps === 'boolean' ? collapsedFromProps : collapsedLocal\n\n const toggleCollapsible = React.useCallback(() => {\n if (typeof onToggle === 'function') {\n void onToggle(!isCollapsed)\n }\n setCollapsedLocal(!isCollapsed)\n }, [onToggle, isCollapsed])\n\n return (\n <div\n className={[\n baseClass,\n className,\n dragHandleProps && `${baseClass}--has-drag-handle`,\n isCollapsed && `${baseClass}--collapsed`,\n isWithinCollapsible && `${baseClass}--nested`,\n hoveringToggle && !disableHeaderToggle && `${baseClass}--hovered`,\n `${baseClass}--style-${collapsibleStyle}`,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <CollapsibleProvider isCollapsed={isCollapsed} toggle={toggleCollapsible}>\n <div\n className={`${baseClass}__toggle-wrap${disableHeaderToggle ? ' toggle-disabled' : ''}`}\n onMouseEnter={() => setHoveringToggle(true)}\n onMouseLeave={() => setHoveringToggle(false)}\n >\n {!disableHeaderToggle && (\n <button\n className={[\n `${baseClass}__toggle`,\n `${baseClass}__toggle--${isCollapsed ? 'collapsed' : 'open'}`,\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={toggleCollapsible}\n type=\"button\"\n >\n <span>{t('fields:toggleBlock')}</span>\n </button>\n )}\n\n {dragHandleProps && (\n <div\n className={`${baseClass}__drag`}\n {...dragHandleProps.attributes}\n {...dragHandleProps.listeners}\n >\n <DragHandleIcon />\n </div>\n )}\n {header ? (\n <div\n className={[\n `${baseClass}__header-wrap`,\n dragHandleProps && `${baseClass}__header-wrap--has-drag-handle`,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {header}\n </div>\n ) : null}\n <div className={`${baseClass}__actions-wrap`}>\n {actions ? <div className={`${baseClass}__actions`}>{actions}</div> : null}\n {!disableToggleIndicator && (\n <div className={`${baseClass}__indicator`}>\n <ChevronIcon direction={!isCollapsed ? 'up' : undefined} />\n </div>\n )}\n </div>\n </div>\n <AnimateHeight height={isCollapsed ? 0 : 'auto'}>\n <div className={`${baseClass}__content`}>{children}</div>\n </AnimateHeight>\n {AfterCollapsible}\n </CollapsibleProvider>\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
@layer payload-default {
|
|
4
4
|
.collapsible {
|
|
5
|
+
position: relative;
|
|
5
6
|
--toggle-pad-h: #{base(0.75)};
|
|
6
7
|
--toggle-pad-v: #{base(0.6)};
|
|
7
8
|
|
|
@@ -20,7 +21,7 @@
|
|
|
20
21
|
border-top-left-radius: $style-radius-m;
|
|
21
22
|
width: 100%;
|
|
22
23
|
|
|
23
|
-
&:hover {
|
|
24
|
+
&:not(.toggle-disabled):hover {
|
|
24
25
|
background: var(--theme-elevation-100);
|
|
25
26
|
}
|
|
26
27
|
|
|
@@ -47,7 +48,6 @@
|
|
|
47
48
|
@extend %btn-reset;
|
|
48
49
|
@extend %body;
|
|
49
50
|
text-align: left;
|
|
50
|
-
cursor: pointer;
|
|
51
51
|
border-top-right-radius: $style-radius-m;
|
|
52
52
|
border-top-left-radius: $style-radius-m;
|
|
53
53
|
width: 100%;
|
|
@@ -57,6 +57,10 @@
|
|
|
57
57
|
top: 0;
|
|
58
58
|
left: 0;
|
|
59
59
|
|
|
60
|
+
&:not(.toggle-disabled) {
|
|
61
|
+
cursor: pointer;
|
|
62
|
+
}
|
|
63
|
+
|
|
60
64
|
span {
|
|
61
65
|
user-select: none;
|
|
62
66
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { PopupProps } from '../Popup/index.js';
|
|
3
|
+
import './index.scss';
|
|
4
|
+
/**
|
|
5
|
+
* @internal
|
|
6
|
+
* @experimental
|
|
7
|
+
*/
|
|
8
|
+
export type ComboboxEntry = {
|
|
9
|
+
Component: React.ReactNode;
|
|
10
|
+
name: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* @internal
|
|
14
|
+
* @experimental
|
|
15
|
+
*/
|
|
16
|
+
export type ComboboxProps = {
|
|
17
|
+
entries: ComboboxEntry[];
|
|
18
|
+
/** Minimum number of entries required to show search */
|
|
19
|
+
minEntriesForSearch?: number;
|
|
20
|
+
onSelect?: (entry: ComboboxEntry) => void;
|
|
21
|
+
searchPlaceholder?: string;
|
|
22
|
+
} & Omit<PopupProps, 'children' | 'render'>;
|
|
23
|
+
/**
|
|
24
|
+
* A wrapper on top of Popup + PopupList.ButtonGroup that adds search functionality.
|
|
25
|
+
*
|
|
26
|
+
* @internal - this component may be removed or receive breaking changes in minor releases.
|
|
27
|
+
* @experimental
|
|
28
|
+
*/
|
|
29
|
+
export declare const Combobox: React.FC<ComboboxProps>;
|
|
30
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Combobox/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAoC,MAAM,OAAO,CAAA;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAGnD,OAAO,cAAc,CAAA;AAIrB;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,aAAa,EAAE,CAAA;IACxB,wDAAwD;IACxD,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAA;AAE3C;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAmG5C,CAAA"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
4
|
+
import React, { useMemo, useRef, useState } from 'react';
|
|
5
|
+
import { Popup, PopupList } from '../Popup/index.js';
|
|
6
|
+
import './index.scss';
|
|
7
|
+
const baseClass = 'combobox';
|
|
8
|
+
/**
|
|
9
|
+
* A wrapper on top of Popup + PopupList.ButtonGroup that adds search functionality.
|
|
10
|
+
*
|
|
11
|
+
* @internal - this component may be removed or receive breaking changes in minor releases.
|
|
12
|
+
* @experimental
|
|
13
|
+
*/
|
|
14
|
+
export const Combobox = props => {
|
|
15
|
+
const {
|
|
16
|
+
entries,
|
|
17
|
+
minEntriesForSearch = 8,
|
|
18
|
+
onSelect,
|
|
19
|
+
onToggleClose,
|
|
20
|
+
onToggleOpen,
|
|
21
|
+
searchPlaceholder = 'Search...',
|
|
22
|
+
...popupProps
|
|
23
|
+
} = props;
|
|
24
|
+
const [searchValue, setSearchValue] = useState('');
|
|
25
|
+
const isOpenRef = useRef(false);
|
|
26
|
+
const searchInputRef = useRef(null);
|
|
27
|
+
const filteredEntries = useMemo(() => {
|
|
28
|
+
if (!searchValue) {
|
|
29
|
+
return entries;
|
|
30
|
+
}
|
|
31
|
+
const search = searchValue.toLowerCase();
|
|
32
|
+
return entries.filter(entry => entry.name.toLowerCase().includes(search));
|
|
33
|
+
}, [entries, searchValue]);
|
|
34
|
+
const showSearch = entries.length >= minEntriesForSearch;
|
|
35
|
+
const hasResults = filteredEntries.length > 0;
|
|
36
|
+
const handleToggleOpen = React.useCallback(active => {
|
|
37
|
+
isOpenRef.current = active;
|
|
38
|
+
if (active && showSearch) {
|
|
39
|
+
setTimeout(() => {
|
|
40
|
+
searchInputRef.current?.focus();
|
|
41
|
+
}, 100);
|
|
42
|
+
}
|
|
43
|
+
onToggleOpen?.(active);
|
|
44
|
+
}, [showSearch, onToggleOpen]);
|
|
45
|
+
const handleToggleClose = React.useCallback(() => {
|
|
46
|
+
isOpenRef.current = false;
|
|
47
|
+
setSearchValue('');
|
|
48
|
+
onToggleClose?.();
|
|
49
|
+
}, [onToggleClose]);
|
|
50
|
+
return /*#__PURE__*/_jsx(Popup, {
|
|
51
|
+
...popupProps,
|
|
52
|
+
className: `${baseClass} ${popupProps.className || ''}`,
|
|
53
|
+
onToggleClose: handleToggleClose,
|
|
54
|
+
onToggleOpen: handleToggleOpen,
|
|
55
|
+
render: ({
|
|
56
|
+
close
|
|
57
|
+
}) => /*#__PURE__*/_jsxs("div", {
|
|
58
|
+
className: `${baseClass}__content`,
|
|
59
|
+
children: [showSearch && /*#__PURE__*/_jsx("div", {
|
|
60
|
+
className: `${baseClass}__search-wrapper${!hasResults ? ` ${baseClass}__search-wrapper--no-results` : ''}`,
|
|
61
|
+
children: /*#__PURE__*/_jsx("input", {
|
|
62
|
+
"aria-label": searchPlaceholder,
|
|
63
|
+
className: `${baseClass}__search-input`,
|
|
64
|
+
onChange: e => setSearchValue(e.target.value),
|
|
65
|
+
placeholder: searchPlaceholder,
|
|
66
|
+
ref: searchInputRef,
|
|
67
|
+
type: "text",
|
|
68
|
+
value: searchValue
|
|
69
|
+
})
|
|
70
|
+
}), /*#__PURE__*/_jsx(PopupList.ButtonGroup, {
|
|
71
|
+
children: filteredEntries.map((entry_0, index) => {
|
|
72
|
+
const handleClick = () => {
|
|
73
|
+
if (onSelect) {
|
|
74
|
+
onSelect(entry_0);
|
|
75
|
+
}
|
|
76
|
+
close();
|
|
77
|
+
};
|
|
78
|
+
return /*#__PURE__*/_jsx("div", {
|
|
79
|
+
className: `${baseClass}__entry`,
|
|
80
|
+
onClick: handleClick,
|
|
81
|
+
onKeyDown: e_0 => {
|
|
82
|
+
if (e_0.key === 'Enter' || e_0.key === ' ') {
|
|
83
|
+
e_0.preventDefault();
|
|
84
|
+
handleClick();
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
role: "menuitem",
|
|
88
|
+
tabIndex: 0,
|
|
89
|
+
children: entry_0.Component
|
|
90
|
+
}, `${entry_0.name}-${index}`);
|
|
91
|
+
})
|
|
92
|
+
})]
|
|
93
|
+
})
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["React","useMemo","useRef","useState","Popup","PopupList","baseClass","Combobox","props","entries","minEntriesForSearch","onSelect","onToggleClose","onToggleOpen","searchPlaceholder","popupProps","searchValue","setSearchValue","isOpenRef","searchInputRef","filteredEntries","search","toLowerCase","filter","entry","name","includes","showSearch","length","hasResults","handleToggleOpen","useCallback","active","current","setTimeout","focus","handleToggleClose","_jsx","className","render","close","_jsxs","onChange","e","target","value","placeholder","ref","type","ButtonGroup","map","index","handleClick","onClick","onKeyDown","key","preventDefault","role","tabIndex","Component"],"sources":["../../../src/elements/Combobox/index.tsx"],"sourcesContent":["'use client'\nimport React, { useMemo, useRef, useState } from 'react'\n\nimport type { PopupProps } from '../Popup/index.js'\n\nimport { Popup, PopupList } from '../Popup/index.js'\nimport './index.scss'\n\nconst baseClass = 'combobox'\n\n/**\n * @internal\n * @experimental\n */\nexport type ComboboxEntry = {\n Component: React.ReactNode\n name: string\n}\n\n/**\n * @internal\n * @experimental\n */\nexport type ComboboxProps = {\n entries: ComboboxEntry[]\n /** Minimum number of entries required to show search */\n minEntriesForSearch?: number\n onSelect?: (entry: ComboboxEntry) => void\n searchPlaceholder?: string\n} & Omit<PopupProps, 'children' | 'render'>\n\n/**\n * A wrapper on top of Popup + PopupList.ButtonGroup that adds search functionality.\n *\n * @internal - this component may be removed or receive breaking changes in minor releases.\n * @experimental\n */\nexport const Combobox: React.FC<ComboboxProps> = (props) => {\n const {\n entries,\n minEntriesForSearch = 8,\n onSelect,\n onToggleClose,\n onToggleOpen,\n searchPlaceholder = 'Search...',\n ...popupProps\n } = props\n const [searchValue, setSearchValue] = useState('')\n const isOpenRef = useRef(false)\n const searchInputRef = useRef<HTMLInputElement>(null)\n\n const filteredEntries = useMemo(() => {\n if (!searchValue) {\n return entries\n }\n const search = searchValue.toLowerCase()\n return entries.filter((entry) => entry.name.toLowerCase().includes(search))\n }, [entries, searchValue])\n\n const showSearch = entries.length >= minEntriesForSearch\n const hasResults = filteredEntries.length > 0\n\n const handleToggleOpen = React.useCallback(\n (active: boolean) => {\n isOpenRef.current = active\n if (active && showSearch) {\n setTimeout(() => {\n searchInputRef.current?.focus()\n }, 100)\n }\n onToggleOpen?.(active)\n },\n [showSearch, onToggleOpen],\n )\n\n const handleToggleClose = React.useCallback(() => {\n isOpenRef.current = false\n setSearchValue('')\n onToggleClose?.()\n }, [onToggleClose])\n\n return (\n <Popup\n {...popupProps}\n className={`${baseClass} ${popupProps.className || ''}`}\n onToggleClose={handleToggleClose}\n onToggleOpen={handleToggleOpen}\n render={({ close }) => (\n <div className={`${baseClass}__content`}>\n {showSearch && (\n <div\n className={`${baseClass}__search-wrapper${!hasResults ? ` ${baseClass}__search-wrapper--no-results` : ''}`}\n >\n <input\n aria-label={searchPlaceholder}\n className={`${baseClass}__search-input`}\n onChange={(e) => setSearchValue(e.target.value)}\n placeholder={searchPlaceholder}\n ref={searchInputRef}\n type=\"text\"\n value={searchValue}\n />\n </div>\n )}\n <PopupList.ButtonGroup>\n {filteredEntries.map((entry, index) => {\n const handleClick = () => {\n if (onSelect) {\n onSelect(entry)\n }\n close()\n }\n\n return (\n <div\n className={`${baseClass}__entry`}\n key={`${entry.name}-${index}`}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleClick()\n }\n }}\n role=\"menuitem\"\n tabIndex={0}\n >\n {entry.Component}\n </div>\n )\n })}\n </PopupList.ButtonGroup>\n </div>\n )}\n />\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
@import '../../scss/styles.scss';
|
|
2
|
+
|
|
3
|
+
@layer payload-default {
|
|
4
|
+
.combobox {
|
|
5
|
+
&__content {
|
|
6
|
+
display: flex;
|
|
7
|
+
flex-direction: column;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
&__search-wrapper {
|
|
11
|
+
padding-top: var(--popup-padding);
|
|
12
|
+
padding-bottom: calc(var(--base) * 0.5);
|
|
13
|
+
border-bottom: 1px solid var(--theme-elevation-150);
|
|
14
|
+
margin-bottom: calc(var(--base) * 0.5);
|
|
15
|
+
|
|
16
|
+
&--no-results {
|
|
17
|
+
border-bottom: none;
|
|
18
|
+
margin-bottom: 0;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
&__search-input {
|
|
23
|
+
width: 100%;
|
|
24
|
+
background: var(--theme-elevation-50);
|
|
25
|
+
color: var(--theme-text);
|
|
26
|
+
border: none;
|
|
27
|
+
border-radius: var(--style-radius-s);
|
|
28
|
+
padding: calc(var(--base) * 0.25) calc(var(--base) * 0.5);
|
|
29
|
+
outline: none;
|
|
30
|
+
box-shadow: none;
|
|
31
|
+
|
|
32
|
+
&::placeholder {
|
|
33
|
+
color: var(--theme-elevation-400);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
&:focus,
|
|
37
|
+
&:focus-visible {
|
|
38
|
+
background: var(--theme-elevation-100);
|
|
39
|
+
outline: none;
|
|
40
|
+
border: none;
|
|
41
|
+
box-shadow: none;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
&__entry {
|
|
46
|
+
cursor: pointer;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -6,8 +6,14 @@ type NavContextType = {
|
|
|
6
6
|
setNavOpen: (value: boolean) => void;
|
|
7
7
|
shouldAnimate: boolean;
|
|
8
8
|
};
|
|
9
|
+
/**
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
9
12
|
export declare const NavContext: React.Context<NavContextType>;
|
|
10
13
|
export declare const useNav: () => NavContextType;
|
|
14
|
+
/**
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
11
17
|
export declare const NavProvider: React.FC<{
|
|
12
18
|
children: React.ReactNode;
|
|
13
19
|
initialIsOpen?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/elements/Nav/context.tsx"],"names":[],"mappings":"AAGA,OAAO,KAA4B,MAAM,OAAO,CAAA;AAIhD,KAAK,cAAc,GAAG;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IAC9C,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACpC,aAAa,EAAE,OAAO,CAAA;CACvB,CAAA;AAED,eAAO,MAAM,UAAU,+BAMrB,CAAA;AAEF,eAAO,MAAM,MAAM,sBAA8B,CAAA;AAYjD,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;IACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAkFA,CAAA"}
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/elements/Nav/context.tsx"],"names":[],"mappings":"AAGA,OAAO,KAA4B,MAAM,OAAO,CAAA;AAIhD,KAAK,cAAc,GAAG;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IAC9C,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACpC,aAAa,EAAE,OAAO,CAAA;CACvB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,+BAMrB,CAAA;AAEF,eAAO,MAAM,MAAM,sBAA8B,CAAA;AAYjD;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;IACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAkFA,CAAA"}
|
|
@@ -5,6 +5,9 @@ import { useWindowInfo } from '@faceless-ui/window-info';
|
|
|
5
5
|
import { usePathname } from 'next/navigation.js';
|
|
6
6
|
import React, { useEffect, useRef } from 'react';
|
|
7
7
|
import { usePreferences } from '../../providers/Preferences/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
8
11
|
export const NavContext = /*#__PURE__*/React.createContext({
|
|
9
12
|
hydrated: false,
|
|
10
13
|
navOpen: true,
|
|
@@ -22,6 +25,9 @@ const getNavPreference = async getPreference => {
|
|
|
22
25
|
return true;
|
|
23
26
|
}
|
|
24
27
|
};
|
|
28
|
+
/**
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
25
31
|
export const NavProvider = ({
|
|
26
32
|
children,
|
|
27
33
|
initialIsOpen
|