@g4rcez/components 3.0.0-0 → 3.0.1
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/ai/SKILL.md +266 -0
- package/dist/ai/docs/Alert.md +167 -0
- package/dist/ai/docs/AnimatedList.md +205 -0
- package/dist/ai/docs/Autocomplete.md +225 -0
- package/dist/ai/docs/Button.md +182 -0
- package/dist/ai/docs/Calendar.md +219 -0
- package/dist/ai/docs/Card.md +174 -0
- package/dist/ai/docs/Checkbox.md +199 -0
- package/dist/ai/docs/CommandPalette.md +293 -0
- package/dist/ai/docs/DatePicker.md +171 -0
- package/dist/ai/docs/Dropdown.md +223 -0
- package/dist/ai/docs/Empty.md +163 -0
- package/dist/ai/docs/Expand.md +143 -0
- package/dist/ai/docs/FileUpload.md +225 -0
- package/dist/ai/docs/Form.md +107 -0
- package/dist/ai/docs/FormReset.md +117 -0
- package/dist/ai/docs/Heading.md +88 -0
- package/dist/ai/docs/Input.md +237 -0
- package/dist/ai/docs/InputField.md +170 -0
- package/dist/ai/docs/List.md +205 -0
- package/dist/ai/docs/Menu.md +166 -0
- package/dist/ai/docs/Modal.md +280 -0
- package/dist/ai/docs/MultiSelect.md +196 -0
- package/dist/ai/docs/Notifications.md +231 -0
- package/dist/ai/docs/PageCalendar.md +271 -0
- package/dist/ai/docs/Polymorph.md +159 -0
- package/dist/ai/docs/Progress.md +145 -0
- package/dist/ai/docs/Radiobox.md +128 -0
- package/dist/ai/docs/RenderOnView.md +138 -0
- package/dist/ai/docs/Resizable.md +159 -0
- package/dist/ai/docs/Select.md +284 -0
- package/dist/ai/docs/Shortcut.md +105 -0
- package/dist/ai/docs/Skeleton.md +166 -0
- package/dist/ai/docs/Slider.md +144 -0
- package/dist/ai/docs/Slot.md +173 -0
- package/dist/ai/docs/Spinner.md +118 -0
- package/dist/ai/docs/Stats.md +137 -0
- package/dist/ai/docs/Step.md +159 -0
- package/dist/ai/docs/Switch.md +167 -0
- package/dist/ai/docs/Table.md +298 -0
- package/dist/ai/docs/Tabs.md +191 -0
- package/dist/ai/docs/Tag.md +224 -0
- package/dist/ai/docs/TaskList.md +144 -0
- package/dist/ai/docs/Textarea.md +167 -0
- package/dist/ai/docs/Timeline.md +210 -0
- package/dist/ai/docs/Toolbar.md +132 -0
- package/dist/ai/docs/Tooltip.md +231 -0
- package/dist/ai/docs/TransferList.md +142 -0
- package/dist/ai/docs/Typography.md +187 -0
- package/dist/ai/docs/Wizard.md +213 -0
- package/dist/ai/docs/index.md +183 -0
- package/dist/components/core/button.d.ts +2 -8
- package/dist/components/core/button.d.ts.map +1 -1
- package/dist/components/core/polymorph.d.ts.map +1 -1
- package/dist/components/core/slot.d.ts +1 -1
- package/dist/components/core/slot.d.ts.map +1 -1
- package/dist/components/core/tag.d.ts +2 -2
- package/dist/components/core/tag.d.ts.map +1 -1
- package/dist/components/core/typography.d.ts.map +1 -1
- package/dist/components/display/alert.d.ts.map +1 -1
- package/dist/components/display/calendar.d.ts.map +1 -1
- package/dist/components/display/card.d.ts.map +1 -1
- package/dist/components/display/list.d.ts.map +1 -1
- package/dist/components/display/notifications.d.ts +2 -0
- package/dist/components/display/notifications.d.ts.map +1 -1
- package/dist/components/display/progress.d.ts.map +1 -1
- package/dist/components/display/skeleton.d.ts.map +1 -1
- package/dist/components/display/step.d.ts.map +1 -1
- package/dist/components/display/tabs.d.ts.map +1 -1
- package/dist/components/floating/command-palette.d.ts +1 -0
- package/dist/components/floating/command-palette.d.ts.map +1 -1
- package/dist/components/floating/dropdown.d.ts +1 -0
- package/dist/components/floating/dropdown.d.ts.map +1 -1
- package/dist/components/floating/menu.d.ts +2 -2
- package/dist/components/floating/menu.d.ts.map +1 -1
- package/dist/components/floating/modal.d.ts +20 -53
- package/dist/components/floating/modal.d.ts.map +1 -1
- package/dist/components/floating/tooltip.d.ts.map +1 -1
- package/dist/components/floating/wizard.d.ts +1 -1
- package/dist/components/floating/wizard.d.ts.map +1 -1
- package/dist/components/form/autocomplete.d.ts.map +1 -1
- package/dist/components/form/date-picker.d.ts.map +1 -1
- package/dist/components/form/free-text.d.ts.map +1 -1
- package/dist/components/form/input-field.d.ts +3 -2
- package/dist/components/form/input-field.d.ts.map +1 -1
- package/dist/components/form/multi-select.d.ts.map +1 -1
- package/dist/components/form/select.d.ts.map +1 -1
- package/dist/components/form/slider.d.ts.map +1 -1
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/page-calendar/calendar-header.d.ts +16 -0
- package/dist/components/page-calendar/calendar-header.d.ts.map +1 -0
- package/dist/components/page-calendar/day-view.d.ts +12 -0
- package/dist/components/page-calendar/day-view.d.ts.map +1 -0
- package/dist/components/page-calendar/event-pill.d.ts +9 -0
- package/dist/components/page-calendar/event-pill.d.ts.map +1 -0
- package/dist/components/page-calendar/index.d.ts +4 -0
- package/dist/components/page-calendar/index.d.ts.map +1 -0
- package/dist/components/page-calendar/month-view.d.ts +11 -0
- package/dist/components/page-calendar/month-view.d.ts.map +1 -0
- package/dist/components/page-calendar/page-calendar.d.ts +18 -0
- package/dist/components/page-calendar/page-calendar.d.ts.map +1 -0
- package/dist/components/page-calendar/page-calendar.types.d.ts +18 -0
- package/dist/components/page-calendar/page-calendar.types.d.ts.map +1 -0
- package/dist/components/page-calendar/page-calendar.utils.d.ts +18 -0
- package/dist/components/page-calendar/page-calendar.utils.d.ts.map +1 -0
- package/dist/components/page-calendar/week-view.d.ts +11 -0
- package/dist/components/page-calendar/week-view.d.ts.map +1 -0
- package/dist/components/table/index.d.ts.map +1 -1
- package/dist/components/table/inner-table.d.ts.map +1 -1
- package/dist/components/table/metadata.d.ts.map +1 -1
- package/dist/components/table/row.d.ts.map +1 -1
- package/dist/components/table/table-lib.d.ts.map +1 -1
- package/dist/components/table/thead.d.ts.map +1 -1
- package/dist/config/context.d.ts.map +1 -1
- package/dist/config/default-translations.d.ts +21 -4
- package/dist/config/default-translations.d.ts.map +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/hooks/use-components-provider.d.ts.map +1 -1
- package/dist/hooks/use-form.d.ts +11 -11
- package/dist/hooks/use-form.d.ts.map +1 -1
- package/dist/hooks/use-input-id.d.ts.map +1 -1
- package/dist/hooks/use-preferences.d.ts.map +1 -1
- package/dist/hooks/use-previous.d.ts.map +1 -1
- package/dist/hooks/use-reactive.d.ts.map +1 -1
- package/dist/hooks/use-resize-observer.d.ts.map +1 -1
- package/dist/hooks/use-stable-ref.d.ts.map +1 -1
- package/dist/hooks/use-swipe.d.ts.map +1 -1
- package/dist/hooks/use-translations.d.ts +21 -4
- package/dist/hooks/use-translations.d.ts.map +1 -1
- package/dist/index.css +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -20
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +13862 -12512
- package/dist/index.mjs.map +1 -1
- package/dist/index.umd.js +24 -17
- package/dist/index.umd.js.map +1 -1
- package/dist/lib/dom.d.ts +1 -0
- package/dist/lib/dom.d.ts.map +1 -1
- package/dist/lib/fns.d.ts.map +1 -1
- package/dist/preset/plugin.tailwind.d.ts +9 -0
- package/dist/preset/plugin.tailwind.d.ts.map +1 -0
- package/dist/preset/plugin.tailwind.js +27 -0
- package/dist/preset/preset.tailwind.d.ts +8 -0
- package/dist/preset/preset.tailwind.d.ts.map +1 -0
- package/dist/preset/preset.tailwind.js +54 -0
- package/dist/preset/src/styles/common.d.ts +2 -14
- package/dist/preset/src/styles/common.d.ts.map +1 -1
- package/dist/preset/src/styles/common.js +1 -0
- package/dist/preset/src/styles/dark.d.ts.map +1 -1
- package/dist/preset/src/styles/dark.js +119 -114
- package/dist/preset/src/styles/light.d.ts.map +1 -1
- package/dist/preset/src/styles/light.js +111 -106
- package/dist/preset/src/styles/theme.types.d.ts +17 -8
- package/dist/preset/src/styles/theme.types.d.ts.map +1 -1
- package/dist/styles/common.d.ts +2 -14
- package/dist/styles/common.d.ts.map +1 -1
- package/dist/styles/dark.d.ts.map +1 -1
- package/dist/styles/light.d.ts.map +1 -1
- package/dist/styles/theme.types.d.ts +17 -8
- package/dist/styles/theme.types.d.ts.map +1 -1
- package/package.json +299 -301
- package/dist/components/core/button.jsx +0 -86
- package/dist/components/core/heading.jsx +0 -4
- package/dist/components/core/polymorph.jsx +0 -5
- package/dist/components/core/render-on-view.jsx +0 -31
- package/dist/components/core/resizable.jsx +0 -51
- package/dist/components/core/slot.jsx +0 -163
- package/dist/components/core/tag.jsx +0 -51
- package/dist/components/core/typography.jsx +0 -26
- package/dist/components/display/alert.jsx +0 -56
- package/dist/components/display/calendar.jsx +0 -301
- package/dist/components/display/card.jsx +0 -43
- package/dist/components/display/empty.jsx +0 -11
- package/dist/components/display/list.jsx +0 -81
- package/dist/components/display/notifications.jsx +0 -98
- package/dist/components/display/progress.jsx +0 -13
- package/dist/components/display/shortcut.jsx +0 -23
- package/dist/components/display/skeleton.jsx +0 -14
- package/dist/components/display/spinner.jsx +0 -7
- package/dist/components/display/stats.jsx +0 -20
- package/dist/components/display/step.jsx +0 -131
- package/dist/components/display/tabs.jsx +0 -100
- package/dist/components/display/timeline.jsx +0 -25
- package/dist/components/floating/command-palette.jsx +0 -172
- package/dist/components/floating/dropdown.jsx +0 -53
- package/dist/components/floating/expand.jsx +0 -44
- package/dist/components/floating/menu.jsx +0 -147
- package/dist/components/floating/modal.jsx +0 -241
- package/dist/components/floating/toolbar.jsx +0 -5
- package/dist/components/floating/tooltip.jsx +0 -64
- package/dist/components/floating/wizard.jsx +0 -164
- package/dist/components/form/autocomplete.jsx +0 -275
- package/dist/components/form/checkbox.jsx +0 -12
- package/dist/components/form/date-picker.jsx +0 -115
- package/dist/components/form/file-upload.jsx +0 -133
- package/dist/components/form/form.jsx +0 -10
- package/dist/components/form/formReset.jsx +0 -17
- package/dist/components/form/free-text.jsx +0 -41
- package/dist/components/form/input-field.jsx +0 -54
- package/dist/components/form/input.jsx +0 -36
- package/dist/components/form/multi-select.jsx +0 -328
- package/dist/components/form/radiobox.jsx +0 -6
- package/dist/components/form/select.jsx +0 -42
- package/dist/components/form/slider.jsx +0 -45
- package/dist/components/form/switch.jsx +0 -46
- package/dist/components/form/task-list.jsx +0 -26
- package/dist/components/form/textarea.jsx +0 -12
- package/dist/components/form/transfer-list.jsx +0 -39
- package/dist/components/index.js +0 -43
- package/dist/components/table/filter.jsx +0 -141
- package/dist/components/table/group.jsx +0 -68
- package/dist/components/table/index.jsx +0 -60
- package/dist/components/table/inner-table.jsx +0 -104
- package/dist/components/table/metadata.jsx +0 -37
- package/dist/components/table/pagination.jsx +0 -73
- package/dist/components/table/row.jsx +0 -58
- package/dist/components/table/sort.jsx +0 -105
- package/dist/components/table/table-lib.js +0 -84
- package/dist/components/table/table.context.jsx +0 -4
- package/dist/components/table/thead.jsx +0 -103
- package/dist/config/context.js +0 -12
- package/dist/config/default-translations.jsx +0 -66
- package/dist/config/default-tweaks.js +0 -4
- package/dist/constants.js +0 -2
- package/dist/hooks/use-click-outside.js +0 -17
- package/dist/hooks/use-color-parser.js +0 -9
- package/dist/hooks/use-components-provider.jsx +0 -16
- package/dist/hooks/use-debounce.js +0 -12
- package/dist/hooks/use-floating-ref.js +0 -6
- package/dist/hooks/use-form.js +0 -549
- package/dist/hooks/use-hover.js +0 -18
- package/dist/hooks/use-input-id.js +0 -5
- package/dist/hooks/use-is-coarse-device.js +0 -12
- package/dist/hooks/use-locale.js +0 -10
- package/dist/hooks/use-media-query.js +0 -25
- package/dist/hooks/use-on-event.js +0 -7
- package/dist/hooks/use-parent.js +0 -21
- package/dist/hooks/use-preferences.js +0 -23
- package/dist/hooks/use-previous.js +0 -8
- package/dist/hooks/use-reactive.js +0 -8
- package/dist/hooks/use-remove-scroll.js +0 -61
- package/dist/hooks/use-resize-observer.js +0 -17
- package/dist/hooks/use-stable-ref.js +0 -8
- package/dist/hooks/use-swipe.js +0 -16
- package/dist/hooks/use-translations.js +0 -9
- package/dist/hooks/use-tweaks.js +0 -9
- package/dist/hooks/use-window-size.js +0 -14
- package/dist/lib/combi-keys.js +0 -60
- package/dist/lib/dict.js +0 -39
- package/dist/lib/dom.js +0 -44
- package/dist/lib/fns.js +0 -46
- package/dist/lib/fzf.js +0 -117
- package/dist/lib/keyboard-area.js +0 -14
- package/dist/preset/tailwindcssv4.d.ts +0 -3
- package/dist/preset/tailwindcssv4.d.ts.map +0 -1
- package/dist/preset/tailwindcssv4.js +0 -75
- package/dist/styles/common.js +0 -28
- package/dist/styles/dark.js +0 -209
- package/dist/styles/design-tokens.js +0 -69
- package/dist/styles/light.js +0 -209
- package/dist/styles/theme.js +0 -4
- package/dist/styles/theme.types.js +0 -1
- package/dist/types.js +0 -1
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { motion } from "motion/react";
|
|
3
|
-
import React, { createContext, Fragment, useContext, useEffect, useRef, useState } from "react";
|
|
4
|
-
import { useColorParser } from "../../hooks/use-color-parser";
|
|
5
|
-
const PROGRESS_BAR_DURATION = 0.3;
|
|
6
|
-
const transition = { duration: PROGRESS_BAR_DURATION, type: "tween", ease: "easeInOut" };
|
|
7
|
-
const StepContext = createContext(null);
|
|
8
|
-
const iconTransitions = { delay: 0.2, duration: 0.3, type: "tween", ease: "easeOut" };
|
|
9
|
-
const states = {
|
|
10
|
-
initial: { pathLength: 0, opacity: 0 },
|
|
11
|
-
animate: { pathLength: 1, opacity: 1 },
|
|
12
|
-
};
|
|
13
|
-
const ErrorIcon = (props) => (<svg {...props} viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
|
|
14
|
-
<motion.path className="currentColor" initial={states.initial} animate={states.animate} transition={iconTransitions} d="M18 6 6 18"/>
|
|
15
|
-
<motion.path className="currentColor" initial={states.initial} animate={states.animate} transition={iconTransitions} d="m6 6 12 12"/>
|
|
16
|
-
</svg>);
|
|
17
|
-
const CheckIcon = (props) => (<svg {...props} fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={3}>
|
|
18
|
-
<motion.path d="M5 13l4 4L19 7" strokeLinecap="round" strokeLinejoin="round" animate={states.animate} initial={states.initial} transition={iconTransitions}/>
|
|
19
|
-
</svg>);
|
|
20
|
-
const variants = {
|
|
21
|
-
complete: { scale: 1.25 },
|
|
22
|
-
active: { scale: 1, transition: { delay: 0, duration: 0.3 } }
|
|
23
|
-
};
|
|
24
|
-
const transitions = { duration: 0.6, delay: 0.2, type: "tween", ease: "circOut", };
|
|
25
|
-
const getCurrentStatus = (step, currentStep, status) => {
|
|
26
|
-
if (status === "error")
|
|
27
|
-
return "error";
|
|
28
|
-
if (currentStep === step)
|
|
29
|
-
return "active";
|
|
30
|
-
if (currentStep < step)
|
|
31
|
-
return "inactive";
|
|
32
|
-
return "complete";
|
|
33
|
-
};
|
|
34
|
-
const calculateStepDelay = (step, currentStep, previousStep, duration) => {
|
|
35
|
-
if (currentStep === previousStep)
|
|
36
|
-
return 0;
|
|
37
|
-
const isForward = currentStep > previousStep;
|
|
38
|
-
if (isForward) {
|
|
39
|
-
if (step <= previousStep || step > currentStep)
|
|
40
|
-
return 0;
|
|
41
|
-
return ((step - previousStep) / (currentStep - previousStep)) * duration;
|
|
42
|
-
}
|
|
43
|
-
if (step <= currentStep || step > previousStep)
|
|
44
|
-
return 0;
|
|
45
|
-
return ((previousStep - step) / (previousStep - currentStep)) * duration;
|
|
46
|
-
};
|
|
47
|
-
export const useStepContext = () => useContext(StepContext);
|
|
48
|
-
export const Step = ({ step, currentStep, status, title, titleClassName, ...props }) => {
|
|
49
|
-
const parser = useColorParser();
|
|
50
|
-
const context = useStepContext();
|
|
51
|
-
const [visualCurrentStep, setVisualCurrentStep] = useState(currentStep);
|
|
52
|
-
useEffect(() => {
|
|
53
|
-
if (!context) {
|
|
54
|
-
setVisualCurrentStep(currentStep);
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
const delay = calculateStepDelay(step, context.currentStep, context.previousStep, context.progressBarDuration);
|
|
58
|
-
if (delay === 0) {
|
|
59
|
-
setVisualCurrentStep(currentStep);
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
const timer = setTimeout(() => {
|
|
63
|
-
setVisualCurrentStep(currentStep);
|
|
64
|
-
}, delay * 1000);
|
|
65
|
-
return () => clearTimeout(timer);
|
|
66
|
-
}, [currentStep, context, step]);
|
|
67
|
-
const innerStatus = getCurrentStatus(step, visualCurrentStep, status);
|
|
68
|
-
const widthPerStep = context?.steps ? 100 / (context?.steps) : undefined;
|
|
69
|
-
return (<Fragment>
|
|
70
|
-
<div className={`h-[2px] w-full xl:block bg-card-border hidden first:hidden ${innerStatus === "active" || innerStatus === "complete" ? "bg-success" : ""}`}/>
|
|
71
|
-
<motion.button {...props} type="button" data-step={step} animate={innerStatus} className="flex relative justify-center items-center w-auto text-center">
|
|
72
|
-
<motion.div variants={variants} transition={transitions} className={`hidden xl:block absolute inset-0 rounded-full text-center ${innerStatus === "error" ? "bg-danger" : ""}`}/>
|
|
73
|
-
<motion.div initial={false} animate={innerStatus} transition={transition} className="flex relative justify-center items-center font-semibold rounded-full size-10 aspect-square" variants={{
|
|
74
|
-
error: {
|
|
75
|
-
color: parser("var(--danger-foreground)"),
|
|
76
|
-
borderColor: parser("var(--danger-hover)"),
|
|
77
|
-
backgroundColor: parser("var(--danger-DEFAULT)"),
|
|
78
|
-
},
|
|
79
|
-
inactive: {
|
|
80
|
-
transition,
|
|
81
|
-
color: parser("var(--disabled)"),
|
|
82
|
-
borderColor: parser("var(--card-border)"),
|
|
83
|
-
backgroundColor: parser("var(--background)"),
|
|
84
|
-
},
|
|
85
|
-
active: {
|
|
86
|
-
transition,
|
|
87
|
-
color: parser("var(--primary-foreground)"),
|
|
88
|
-
borderColor: parser("var(--primary-DEFAULT)"),
|
|
89
|
-
backgroundColor: parser("var(--primary-DEFAULT)"),
|
|
90
|
-
},
|
|
91
|
-
complete: {
|
|
92
|
-
transition,
|
|
93
|
-
color: parser("var(--success-foreground)"),
|
|
94
|
-
borderColor: parser("var(--success-DEFAULT)"),
|
|
95
|
-
backgroundColor: parser("var(--success-DEFAULT)"),
|
|
96
|
-
},
|
|
97
|
-
}}>
|
|
98
|
-
<div className="flex justify-center items-center">
|
|
99
|
-
{innerStatus === "complete" ? (<CheckIcon className="size-6 text-primary-foreground"/>) : innerStatus === "error" ? (<ErrorIcon className="size-6 text-danger-foreground"/>) : (<Fragment>
|
|
100
|
-
<span>{step}</span>
|
|
101
|
-
</Fragment>)}
|
|
102
|
-
</div>
|
|
103
|
-
</motion.div>
|
|
104
|
-
<header className="flex flex-col justify-start items-start px-2">
|
|
105
|
-
<h3 className={`h-full whitespace-nowrap flex items-center ${titleClassName}`}>{title}</h3>
|
|
106
|
-
</header>
|
|
107
|
-
</motion.button>
|
|
108
|
-
</Fragment>);
|
|
109
|
-
};
|
|
110
|
-
export const Steps = (props) => {
|
|
111
|
-
const previousStepRef = useRef(props.currentStep);
|
|
112
|
-
const [previousStep, setPreviousStep] = useState(props.currentStep);
|
|
113
|
-
useEffect(() => {
|
|
114
|
-
previousStepRef.current = previousStep;
|
|
115
|
-
const timer = setTimeout(() => {
|
|
116
|
-
setPreviousStep(props.currentStep);
|
|
117
|
-
}, PROGRESS_BAR_DURATION * 1000);
|
|
118
|
-
return () => clearTimeout(timer);
|
|
119
|
-
}, [props.currentStep, previousStep]);
|
|
120
|
-
const contextValue = {
|
|
121
|
-
currentStep: props.currentStep,
|
|
122
|
-
previousStep: previousStepRef.current,
|
|
123
|
-
progressBarDuration: PROGRESS_BAR_DURATION,
|
|
124
|
-
steps: React.Children.count(props.children),
|
|
125
|
-
};
|
|
126
|
-
return (<StepContext.Provider value={contextValue}>
|
|
127
|
-
<div className="flex relative flex-col gap-4 justify-center items-start w-full lg:flex-row lg:justify-between lg:items-center">
|
|
128
|
-
{props.children}
|
|
129
|
-
</div>
|
|
130
|
-
</StepContext.Provider>);
|
|
131
|
-
};
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import React, { createContext, Fragment, useContext, useEffect, useRef } from "react";
|
|
3
|
-
import { Is } from "sidekicker";
|
|
4
|
-
import { useReactive } from "../../hooks/use-reactive";
|
|
5
|
-
import { useStableRef } from "../../hooks/use-stable-ref";
|
|
6
|
-
import { css } from "../../lib/dom";
|
|
7
|
-
import { keyboardKeys } from "../../lib/keyboard-area";
|
|
8
|
-
import { Polymorph } from "../core/polymorph";
|
|
9
|
-
import { Card } from "./card";
|
|
10
|
-
const Context = createContext("");
|
|
11
|
-
const isElementDisabled = (element) => element.hasAttribute("disabled") || element.getAttribute("aria-disabled") === "true";
|
|
12
|
-
const getNElement = (elements, currentIndex, direction) => {
|
|
13
|
-
const step = direction === "forward" ? 1 : -1;
|
|
14
|
-
const startIndex = currentIndex + step;
|
|
15
|
-
for (let i = startIndex; i >= 0 && i < elements.length; i += step) {
|
|
16
|
-
const element = elements[i];
|
|
17
|
-
if (!isElementDisabled(element))
|
|
18
|
-
return element;
|
|
19
|
-
}
|
|
20
|
-
return direction === "backward"
|
|
21
|
-
? getNElement(elements, elements.length - 1, "backward")
|
|
22
|
-
: getNElement(elements, -1, "forward");
|
|
23
|
-
};
|
|
24
|
-
const moveOn = (ul, direction) => {
|
|
25
|
-
const items = Array.from(ul.querySelectorAll("li"));
|
|
26
|
-
const find = items.findIndex((x) => x.dataset.active === "true");
|
|
27
|
-
if (find === -1)
|
|
28
|
-
return null;
|
|
29
|
-
const item = getNElement(items, find, direction);
|
|
30
|
-
if (item === null)
|
|
31
|
-
return null;
|
|
32
|
-
item.querySelector("button")?.focus({ preventScroll: false });
|
|
33
|
-
return item.getAttribute("data-id") || "";
|
|
34
|
-
};
|
|
35
|
-
const actionKeys = {
|
|
36
|
-
[keyboardKeys.ArrowLeft]: (_, ul) => moveOn(ul, "backward"),
|
|
37
|
-
[keyboardKeys.ArrowRight]: (_, ul) => moveOn(ul, "forward"),
|
|
38
|
-
};
|
|
39
|
-
export const Tabs = (props) => {
|
|
40
|
-
const [active, setActive] = useReactive(props.active);
|
|
41
|
-
const ref = useRef(null);
|
|
42
|
-
const onChangeRef = useStableRef(props.onChange);
|
|
43
|
-
useEffect(() => {
|
|
44
|
-
const header = ref.current;
|
|
45
|
-
if (header === null)
|
|
46
|
-
return;
|
|
47
|
-
let first = header.querySelector(`li[data-active=true]`);
|
|
48
|
-
if (first === null) {
|
|
49
|
-
first = header.querySelector(`li[data-id]`);
|
|
50
|
-
const id = first.getAttribute("data-id") || "";
|
|
51
|
-
setActive(id);
|
|
52
|
-
}
|
|
53
|
-
}, [props.active, setActive]);
|
|
54
|
-
useEffect(() => {
|
|
55
|
-
if (onChangeRef.current)
|
|
56
|
-
onChangeRef.current(active);
|
|
57
|
-
}, [onChangeRef, active]);
|
|
58
|
-
const items = React.Children.toArray(props.children);
|
|
59
|
-
const onClick = (e) => {
|
|
60
|
-
const anchor = e.currentTarget;
|
|
61
|
-
setActive(anchor.dataset.id || "");
|
|
62
|
-
};
|
|
63
|
-
const onKeyDown = (e) => {
|
|
64
|
-
if (ref.current === null)
|
|
65
|
-
return;
|
|
66
|
-
const k = e.key;
|
|
67
|
-
if (Is.keyof(actionKeys, k)) {
|
|
68
|
-
const fn = actionKeys[k];
|
|
69
|
-
const result = fn(e, ref.current);
|
|
70
|
-
if (result === null)
|
|
71
|
-
return;
|
|
72
|
-
setActive(result);
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
return (<Context.Provider value={active}>
|
|
76
|
-
<Card className={props.className} container={css("pt-0 max-w-full w-full min-w-0", props.container)} header={<header className="overflow-x-auto relative mb-2">
|
|
77
|
-
<div className="absolute bottom-0 w-full h-px bg-card-border"/>
|
|
78
|
-
<nav className="min-w-0">
|
|
79
|
-
<ul onKeyDown={onKeyDown} ref={ref} className="flex overflow-x-auto flex-1 justify-start w-0 min-w-full">
|
|
80
|
-
{items.map((x) => {
|
|
81
|
-
const inner = x.props;
|
|
82
|
-
const current = active === inner.id;
|
|
83
|
-
return (<li data-id={inner.id} data-active={current} key={`tab-header-${inner.id}`} aria-disabled={inner.disabled} className={css("relative w-fit border-b border-transparent transition-all", current ? "border-primary font-medium text-primary" : "", inner.disabled ? "aria-disabled:text-disabled" : "")}>
|
|
84
|
-
<Polymorph as="button" type="button" data-id={inner.id} aria-current="page" disabled={inner.disabled} onClick={inner.disabled ? undefined : onClick} className="block py-4 px-10 w-full whitespace-nowrap disabled:cursor-not-allowed">
|
|
85
|
-
{inner.title}
|
|
86
|
-
</Polymorph>
|
|
87
|
-
</li>);
|
|
88
|
-
})}
|
|
89
|
-
</ul>
|
|
90
|
-
</nav>
|
|
91
|
-
</header>}>
|
|
92
|
-
{props.children}
|
|
93
|
-
</Card>
|
|
94
|
-
</Context.Provider>);
|
|
95
|
-
};
|
|
96
|
-
const useTabs = () => useContext(Context);
|
|
97
|
-
export const Tab = (props) => {
|
|
98
|
-
const active = useTabs();
|
|
99
|
-
return <Fragment>{props.id === active ? props.children : null}</Fragment>;
|
|
100
|
-
};
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { css } from "../../lib/dom";
|
|
3
|
-
import { Polymorph } from "../core/polymorph";
|
|
4
|
-
export const TimelineItem = (props) => (<li data-component="timeline-item" className="relative pb-12" role="listitem">
|
|
5
|
-
<span aria-hidden="true" className="absolute left-6 top-8 -ml-px h-full w-0.5 bg-card-border"/>
|
|
6
|
-
<div className="relative flex items-stretch justify-start space-x-3">{props.children}</div>
|
|
7
|
-
</li>);
|
|
8
|
-
TimelineItem.Icon = function TimelineIcon(props) {
|
|
9
|
-
return (<header {...props} className={css("flex size-12 items-center justify-center rounded-full bg-primary p-2 text-primary-foreground", props.className)}>
|
|
10
|
-
{props.children}
|
|
11
|
-
</header>);
|
|
12
|
-
};
|
|
13
|
-
TimelineItem.Body = function TimelineItemBody(props) {
|
|
14
|
-
return (<Polymorph {...props} className={css("min-w-0 flex-1", props.className)}>
|
|
15
|
-
{props.children}
|
|
16
|
-
</Polymorph>);
|
|
17
|
-
};
|
|
18
|
-
TimelineItem.Right = function TimelineItemRight(props) {
|
|
19
|
-
return (<footer className="flex gap-6 self-stretch px-4 align-baseline">
|
|
20
|
-
<Polymorph {...props} type="button"/>
|
|
21
|
-
</footer>);
|
|
22
|
-
};
|
|
23
|
-
export const Timeline = (props) => (<ul data-component="timeline" role="list" className="flow-root [&>li:last-child>span[aria-hidden=true]]:hidden">
|
|
24
|
-
{props.children}
|
|
25
|
-
</ul>);
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { autoUpdate, useFloating, useInteractions, useListNavigation } from "@floating-ui/react";
|
|
3
|
-
import { FilterIcon } from "lucide-react";
|
|
4
|
-
import React, { forwardRef, Fragment, useEffect, useId, useRef, useState } from "react";
|
|
5
|
-
import { Is } from "sidekicker";
|
|
6
|
-
import { useStableRef } from "../../hooks/use-stable-ref";
|
|
7
|
-
import { useTranslations } from "../../hooks/use-translations";
|
|
8
|
-
import { CombiKeys } from "../../lib/combi-keys";
|
|
9
|
-
import { Dict } from "../../lib/dict";
|
|
10
|
-
import { css, isReactFC } from "../../lib/dom";
|
|
11
|
-
import { fzf } from "../../lib/fzf";
|
|
12
|
-
import { Shortcut } from "../display/shortcut";
|
|
13
|
-
import { SkeletonCell } from "../display/skeleton";
|
|
14
|
-
import { Modal } from "./modal";
|
|
15
|
-
const Group = (props) => (<span className="flex items-center h-full text-sm font-medium text-left text-secondary">
|
|
16
|
-
{isReactFC(props.item.title) ? <props.item.title text={props.text}/> : props.item.title}
|
|
17
|
-
</span>);
|
|
18
|
-
const Item = forwardRef((props, ref) => {
|
|
19
|
-
const id = useId();
|
|
20
|
-
const active = props.active;
|
|
21
|
-
const item = props.item;
|
|
22
|
-
if (item.type === "group")
|
|
23
|
-
return (<div id={id} className="px-2 pt-2 pb-1 h-10">
|
|
24
|
-
<Group text={props.text} item={item}/>
|
|
25
|
-
</div>);
|
|
26
|
-
if (item.type !== "shortcut")
|
|
27
|
-
return <Fragment />;
|
|
28
|
-
return (<button {...props} id={id} ref={ref} role="option" type="button" aria-selected={active} data-component="command-palette-item" className={css("flex h-10 items-center justify-between rounded-lg p-2 hover:bg-floating-hover", active ? "bg-floating-hover" : "")}>
|
|
29
|
-
<span className="flex gap-2 items-center">
|
|
30
|
-
{item.Icon ? item.Icon : null}
|
|
31
|
-
<span>{isReactFC(item.title) ? <item.title text={props.text}/> : item.title}</span>
|
|
32
|
-
</span>
|
|
33
|
-
{item.shortcut ? <Shortcut value={item.shortcut}/> : null}
|
|
34
|
-
</button>);
|
|
35
|
-
});
|
|
36
|
-
const getFuzzyData = (commands, value) => {
|
|
37
|
-
if (value.length === 0)
|
|
38
|
-
return commands;
|
|
39
|
-
const rules = [
|
|
40
|
-
{ key: "title", value },
|
|
41
|
-
{ key: "shortcut", value },
|
|
42
|
-
{ key: "hint", value },
|
|
43
|
-
];
|
|
44
|
-
const normalize = commands.map((x) => ({ ...x, title: Is.function(x.title) ? x.title({ text: value }) : x.title }));
|
|
45
|
-
const target = normalize.reduce((acc, x) => {
|
|
46
|
-
const enabled = Is.function(x.enabled) ? x.enabled({ text: value }) : (x.enabled ?? true);
|
|
47
|
-
if (enabled)
|
|
48
|
-
acc.push({ ...x, enabled: enabled });
|
|
49
|
-
return acc;
|
|
50
|
-
}, []);
|
|
51
|
-
const filter = fzf(target, "title", rules);
|
|
52
|
-
const withEnabled = normalize.filter((x) => (Is.function(x.enabled) ? x.enabled({ text: value }) : false));
|
|
53
|
-
return Dict.unique(filter.concat(withEnabled), (x) => x.title);
|
|
54
|
-
};
|
|
55
|
-
const loadingSkeleton = [0, 0, 0, 0, 0];
|
|
56
|
-
export const CommandPalette = (props) => {
|
|
57
|
-
const bindKey = props.bind ?? "Mod + k";
|
|
58
|
-
const listRef = useRef([]);
|
|
59
|
-
const translations = useTranslations();
|
|
60
|
-
const [value, setValue] = useState("");
|
|
61
|
-
const valueRef = useStableRef(value);
|
|
62
|
-
const id = useId();
|
|
63
|
-
const ref = useRef(null);
|
|
64
|
-
const [activeIndex, setActiveIndex] = useState(null);
|
|
65
|
-
const root = useFloating({
|
|
66
|
-
open: props.open,
|
|
67
|
-
strategy: "absolute",
|
|
68
|
-
whileElementsMounted: autoUpdate,
|
|
69
|
-
onOpenChange: props.onChangeVisibility,
|
|
70
|
-
});
|
|
71
|
-
const listNav = useListNavigation(root.context, {
|
|
72
|
-
cols: 0,
|
|
73
|
-
listRef,
|
|
74
|
-
loop: true,
|
|
75
|
-
activeIndex,
|
|
76
|
-
virtual: true,
|
|
77
|
-
allowEscape: true,
|
|
78
|
-
focusItemOnHover: false,
|
|
79
|
-
focusItemOnOpen: "auto",
|
|
80
|
-
openOnArrowKeyDown: true,
|
|
81
|
-
scrollItemIntoView: false,
|
|
82
|
-
selectedIndex: activeIndex,
|
|
83
|
-
onNavigate: (n) => {
|
|
84
|
-
if (Is.number(n)) {
|
|
85
|
-
listRef.current[n]?.scrollIntoView({ block: "start", inline: "start" });
|
|
86
|
-
}
|
|
87
|
-
setActiveIndex((prev) => {
|
|
88
|
-
if (Is.number(n))
|
|
89
|
-
return n;
|
|
90
|
-
return props.open ? (prev ?? 0) : null;
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
const { getItemProps, getReferenceProps } = useInteractions([listNav]);
|
|
95
|
-
const commands = props.commands.flatMap((x) => (x.type === "group" ? [x, ...x.items] : [x]));
|
|
96
|
-
const fuzzy = getFuzzyData(commands, value);
|
|
97
|
-
const displayItems = value === ""
|
|
98
|
-
? commands
|
|
99
|
-
: [
|
|
100
|
-
{
|
|
101
|
-
type: "group",
|
|
102
|
-
title: "Results",
|
|
103
|
-
items: [],
|
|
104
|
-
},
|
|
105
|
-
...fuzzy.filter((x) => x.type !== "group"),
|
|
106
|
-
];
|
|
107
|
-
useEffect(() => {
|
|
108
|
-
const combi = new CombiKeys();
|
|
109
|
-
combi.add(bindKey, () => props.onChangeVisibility?.(true));
|
|
110
|
-
commands.forEach((cmd) => {
|
|
111
|
-
if (cmd.type === "group")
|
|
112
|
-
return;
|
|
113
|
-
if (cmd.type === "shortcut" && cmd.shortcut !== undefined)
|
|
114
|
-
combi.add(cmd.shortcut, (event) => cmd.action({
|
|
115
|
-
event,
|
|
116
|
-
text: valueRef.current,
|
|
117
|
-
setOpen: props.onChangeVisibility,
|
|
118
|
-
}));
|
|
119
|
-
});
|
|
120
|
-
return combi.register();
|
|
121
|
-
}, [bindKey, commands, props, valueRef]);
|
|
122
|
-
const Icon = props.Icon ?? FilterIcon;
|
|
123
|
-
return (<Fragment>
|
|
124
|
-
<Modal ref={ref} animated={false} closable={false} open={props.open} overlayClickClose ariaTitle="Command palette" bodyClassName="px-0 py-0 pt-0" data-component="command-palette" onChange={props.onChangeVisibility} className="container relative py-0 md:max-w-(--breakpoint-sm) lg:max-w-(--breakpoint-md) overflow-clip">
|
|
125
|
-
<header className="flex sticky top-0 items-center w-full h-12 border-b overflow-clip isolate z-floating border-floating-border bg-floating-background">
|
|
126
|
-
<div className="flex justify-center items-center size-10">
|
|
127
|
-
{props.Icon ? <Icon Default={FilterIcon} text={value} size={16}/> : <FilterIcon size={16}/>}
|
|
128
|
-
|
|
129
|
-
</div>
|
|
130
|
-
<input {...getReferenceProps({
|
|
131
|
-
ref: root.refs.setReference,
|
|
132
|
-
onKeyDown: (e) => {
|
|
133
|
-
const item = Is.number(activeIndex) ? displayItems[activeIndex] : null;
|
|
134
|
-
if (item) {
|
|
135
|
-
const key = e.key;
|
|
136
|
-
if (key === "Enter") {
|
|
137
|
-
if (item.type === "shortcut")
|
|
138
|
-
item.action({ event: e, text: value, setOpen: props.onChangeVisibility, });
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
})} autoFocus value={value} data-combikeysbypass="true" placeholder="Search for..." onChange={(e) => setValue(e.target.value)} className="items-center py-2 px-2 pb-2 w-full h-12 text-lg text-left bg-transparent outline-hidden"/>
|
|
143
|
-
</header>
|
|
144
|
-
{props.loading ? (<ul role="listbox" data-component="command-palette-list" className="flex overflow-y-auto flex-col gap-1 px-2 my-2 w-full max-h-96 origin-[top_center]">
|
|
145
|
-
<div className="px-2 pt-2 pb-1 h-10">{translations.commandPaletteLoading}</div>
|
|
146
|
-
{loadingSkeleton.map((_, i) => (<li key={`${id}-${i}-skeleton-index`} className={css("flex h-10 items-center justify-between rounded-lg p-2 hover:bg-primary hover:text-primary-foreground")}>
|
|
147
|
-
{SkeletonCell}
|
|
148
|
-
</li>))}
|
|
149
|
-
</ul>) : (<div className="flex flex-row flex-nowrap min-w-full" data-component="command-palette-container">
|
|
150
|
-
<ul role="listbox" data-component="command-palette-list" className="flex overflow-y-auto flex-col gap-1 px-2 my-2 w-full max-h-96 h-fit origin-[top_center]">
|
|
151
|
-
{displayItems.map((item, index) => (<Item {...getItemProps({
|
|
152
|
-
onMouseEnter: () => setActiveIndex(index),
|
|
153
|
-
ref(node) {
|
|
154
|
-
listRef.current[index] = node;
|
|
155
|
-
},
|
|
156
|
-
onClick(e) {
|
|
157
|
-
e.preventDefault();
|
|
158
|
-
props.onChangeVisibility(false);
|
|
159
|
-
if (item.type === "shortcut")
|
|
160
|
-
item.action({ event: e, text: value, setOpen: props.onChangeVisibility, });
|
|
161
|
-
},
|
|
162
|
-
})} item={item} text={value} active={activeIndex === index} key={`${id}-${item.type}-${index}`}/>))}
|
|
163
|
-
{displayItems.length === 1 ? (<div className={css("flex items-center justify-between rounded-lg p-2 text-secondary")}>
|
|
164
|
-
{translations.commandPaletteEmpty ?? props.emptyMessage}
|
|
165
|
-
</div>) : null}
|
|
166
|
-
</ul>
|
|
167
|
-
{props.Preview && Is.number(activeIndex) ? <props.Preview command={displayItems[activeIndex]} text={value}/> : null}
|
|
168
|
-
</div>)}
|
|
169
|
-
{props.footer ? <footer className="flex items-center p-2 h-8 rounded-b-lg bg-background">{props.footer}</footer> : null}
|
|
170
|
-
</Modal>
|
|
171
|
-
</Fragment>);
|
|
172
|
-
};
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { arrow, autoUpdate, flip, FloatingArrow, FloatingFocusManager, FloatingPortal, offset, shift, useClick, useDismiss, useFloating, useInteractions, useRole, } from "@floating-ui/react";
|
|
3
|
-
import React, { Fragment, useEffect, useId, useMemo, useRef, useState } from "react";
|
|
4
|
-
export const Dropdown = (props) => {
|
|
5
|
-
const headingId = useId();
|
|
6
|
-
const [open, setOpen] = useState(props.open);
|
|
7
|
-
useEffect(() => setOpen(props.open), [props.open]);
|
|
8
|
-
const arrowRef = useRef(null);
|
|
9
|
-
const middleware = useMemo(() => [
|
|
10
|
-
offset(10),
|
|
11
|
-
flip({ fallbackAxisSideDirection: "end" }),
|
|
12
|
-
shift(),
|
|
13
|
-
arrow({
|
|
14
|
-
padding: 5,
|
|
15
|
-
element: arrowRef,
|
|
16
|
-
}),
|
|
17
|
-
], [props.arrow]);
|
|
18
|
-
const { refs, floatingStyles, context } = useFloating({
|
|
19
|
-
open,
|
|
20
|
-
middleware,
|
|
21
|
-
transform: true,
|
|
22
|
-
whileElementsMounted: autoUpdate,
|
|
23
|
-
onOpenChange: (nextValue, event) => {
|
|
24
|
-
const element = event?.relatedTarget;
|
|
25
|
-
if (element) {
|
|
26
|
-
if (element.dataset.floating === "true" && !nextValue)
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
setOpen(nextValue);
|
|
30
|
-
props.onChange?.(nextValue);
|
|
31
|
-
},
|
|
32
|
-
});
|
|
33
|
-
const click = useClick(context);
|
|
34
|
-
const dismiss = useDismiss(context);
|
|
35
|
-
const role = useRole(context, { role: "tooltip" });
|
|
36
|
-
const { getReferenceProps, getFloatingProps } = useInteractions([click, dismiss, role]);
|
|
37
|
-
return (<Fragment>
|
|
38
|
-
<button ref={refs.setReference} {...getReferenceProps(props.buttonProps)} type="button">
|
|
39
|
-
{props.trigger}
|
|
40
|
-
</button>
|
|
41
|
-
{open && (<FloatingPortal preserveTabOrder id={`${headingId}-portal`}>
|
|
42
|
-
<FloatingFocusManager guards restoreFocus={true} returnFocus={true} visuallyHiddenDismiss context={context} modal={false}>
|
|
43
|
-
<div className="relative p-4 rounded-lg border isolate z-floating min-w-96 border-floating-border bg-floating-background shadow-shadow-floating" ref={refs.setFloating} aria-labelledby={headingId} style={floatingStyles} {...getFloatingProps()}>
|
|
44
|
-
<FloatingArrow ref={arrowRef} context={context} strokeWidth={0.1} className="fill-floating-background stroke-floating-border"/>
|
|
45
|
-
<header className="mb-2">
|
|
46
|
-
<h3 className="text-2xl font-medium tracking-wide leading-snug text-left">{props.title}</h3>
|
|
47
|
-
</header>
|
|
48
|
-
{props.children}
|
|
49
|
-
</div>
|
|
50
|
-
</FloatingFocusManager>
|
|
51
|
-
</FloatingPortal>)}
|
|
52
|
-
</Fragment>);
|
|
53
|
-
};
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { FloatingFocusManager, FloatingPortal, useClick, useDismiss, useFloating, useInteractions, useRole } from "@floating-ui/react";
|
|
3
|
-
import { AnimatePresence, motion } from "motion/react";
|
|
4
|
-
import { useEffect, useId, useRef, useState } from "react";
|
|
5
|
-
import { Button } from "../core/button";
|
|
6
|
-
export const Expand = (props) => {
|
|
7
|
-
const root = useRef(null);
|
|
8
|
-
const id = useId();
|
|
9
|
-
const wrapperId = `${id}:wrapper`;
|
|
10
|
-
const titleId = `${id}:title`;
|
|
11
|
-
const [open, setOpen] = useState(props.open ?? false);
|
|
12
|
-
useEffect(() => {
|
|
13
|
-
setOpen(props.open ?? false);
|
|
14
|
-
}, [props.open]);
|
|
15
|
-
const { context, refs } = useFloating({
|
|
16
|
-
transform: true,
|
|
17
|
-
open: open !== null,
|
|
18
|
-
nodeId: id,
|
|
19
|
-
onOpenChange: setOpen,
|
|
20
|
-
strategy: "absolute",
|
|
21
|
-
});
|
|
22
|
-
const click = useClick(context, { enabled: props.disabled ?? true });
|
|
23
|
-
const role = useRole(context, { role: "tooltip" });
|
|
24
|
-
const dismiss = useDismiss(context, {
|
|
25
|
-
escapeKey: true,
|
|
26
|
-
referencePress: true,
|
|
27
|
-
outsidePress: true,
|
|
28
|
-
});
|
|
29
|
-
const { getFloatingProps, getReferenceProps } = useInteractions([click, role, dismiss]);
|
|
30
|
-
return (<div className="relative inline-flex items-center justify-center" ref={root}>
|
|
31
|
-
<Button {...getReferenceProps(props)} as={motion.button} layoutId={wrapperId} ref={refs.setReference} size="small" onClick={() => setOpen(true)}>
|
|
32
|
-
<motion.span layoutId={titleId}>{props.trigger}</motion.span>
|
|
33
|
-
</Button>
|
|
34
|
-
<AnimatePresence>
|
|
35
|
-
{open ? (<FloatingPortal root={root}>
|
|
36
|
-
<FloatingFocusManager visuallyHiddenDismiss modal closeOnFocusOut context={context}>
|
|
37
|
-
<motion.div {...getFloatingProps()} ref={refs.setFloating} layoutId={wrapperId} className="absolute -left-1/4 -top-3/4">
|
|
38
|
-
{props.children}
|
|
39
|
-
</motion.div>
|
|
40
|
-
</FloatingFocusManager>
|
|
41
|
-
</FloatingPortal>) : null}
|
|
42
|
-
</AnimatePresence>
|
|
43
|
-
</div>);
|
|
44
|
-
};
|