@mks2508/mks-ui 0.5.4 → 0.5.8
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/react-ui/primitives/waapi/Gooey/Gooey.types.d.ts +23 -4
- package/dist/react-ui/primitives/waapi/Gooey/Gooey.types.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/Gooey/GooeyCanvas.d.ts +2 -2
- package/dist/react-ui/primitives/waapi/Gooey/GooeyCanvas.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/Gooey/GooeyCanvas.js +292 -31
- package/dist/react-ui/primitives/waapi/Gooey/gooey-utils.d.ts +7 -0
- package/dist/react-ui/primitives/waapi/Gooey/gooey-utils.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/Gooey/gooey-utils.js +6 -1
- package/dist/react-ui/ui/DynamicToggle/{DynamicToggle-Cm6-VceQ.css → DynamicToggle-DJLwEkHr.css} +116 -51
- package/dist/react-ui/ui/DynamicToggle/DynamicToggle.css +116 -51
- package/dist/react-ui/ui/DynamicToggle/DynamicToggle.styles.d.ts +1 -0
- package/dist/react-ui/ui/DynamicToggle/DynamicToggle.styles.d.ts.map +1 -1
- package/dist/react-ui/ui/DynamicToggle/DynamicToggle.styles.js +9 -3
- package/dist/react-ui/ui/DynamicToggle/DynamicToggle.types.d.ts +61 -31
- package/dist/react-ui/ui/DynamicToggle/DynamicToggle.types.d.ts.map +1 -1
- package/dist/react-ui/ui/DynamicToggle/index.d.ts +9 -3
- package/dist/react-ui/ui/DynamicToggle/index.d.ts.map +1 -1
- package/dist/react-ui/ui/DynamicToggle/index.js +68 -37
- package/package.json +52 -13
- package/src/assets/react.svg +0 -1
- package/src/core/index.ts +0 -7
- package/src/core/types.ts +0 -82
- package/src/css.d.ts +0 -7
- package/src/index.css +0 -129
- package/src/index.ts +0 -29
- package/src/react-ui/blocks/Terminal/ResttyAdapter.ts +0 -278
- package/src/react-ui/blocks/Terminal/Terminal.adapter.ts +0 -97
- package/src/react-ui/blocks/Terminal/Terminal.theme.restty.ts +0 -155
- package/src/react-ui/blocks/Terminal/Terminal.theme.ts +0 -80
- package/src/react-ui/blocks/Terminal/Terminal.types.ts +0 -438
- package/src/react-ui/blocks/Terminal/TerminalDisplay.styles.ts +0 -38
- package/src/react-ui/blocks/Terminal/TerminalDisplay.tsx +0 -254
- package/src/react-ui/blocks/Terminal/TerminalDisplay.types.ts +0 -73
- package/src/react-ui/blocks/Terminal/TerminalPanel.tsx +0 -269
- package/src/react-ui/blocks/Terminal/TerminalRestty.tsx +0 -326
- package/src/react-ui/blocks/Terminal/TerminalXterm.tsx +0 -230
- package/src/react-ui/blocks/Terminal/XTermAdapter.ts +0 -163
- package/src/react-ui/blocks/Terminal/chrome.ts +0 -25
- package/src/react-ui/blocks/Terminal/components/LogLineBadges.tsx +0 -316
- package/src/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.tsx +0 -218
- package/src/react-ui/blocks/Terminal/components/SyntaxHighlight.tsx +0 -386
- package/src/react-ui/blocks/Terminal/components/TerminalLogBadge.tsx +0 -67
- package/src/react-ui/blocks/Terminal/components/index.ts +0 -10
- package/src/react-ui/blocks/Terminal/display.ts +0 -46
- package/src/react-ui/blocks/Terminal/hooks/index.ts +0 -22
- package/src/react-ui/blocks/Terminal/hooks/useTerminalSettings.ts +0 -229
- package/src/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.ts +0 -292
- package/src/react-ui/blocks/Terminal/index.ts +0 -111
- package/src/react-ui/blocks/Terminal/panel/LogLinesViewer.tsx +0 -330
- package/src/react-ui/blocks/Terminal/panel/TerminalDebugPanel.tsx +0 -242
- package/src/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.tsx +0 -202
- package/src/react-ui/blocks/Terminal/panel/TerminalFilterTabs.tsx +0 -140
- package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.tsx +0 -68
- package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.types.ts +0 -85
- package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.tsx +0 -383
- package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.tsx +0 -439
- package/src/react-ui/blocks/Terminal/panel/TerminalLogsPanel.tsx +0 -550
- package/src/react-ui/blocks/Terminal/panel/TerminalLogsPanel.types.ts +0 -259
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.styles.ts +0 -75
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.tsx +0 -266
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.types.ts +0 -82
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelFooter.tsx +0 -112
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelHeader.tsx +0 -178
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelToolbar.tsx +0 -203
- package/src/react-ui/blocks/Terminal/panel/TerminalSessionControl.tsx +0 -252
- package/src/react-ui/blocks/Terminal/panel/TerminalSessionTabs.tsx +0 -334
- package/src/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.tsx +0 -261
- package/src/react-ui/blocks/Terminal/panel/TerminalThemeSelector.tsx +0 -248
- package/src/react-ui/blocks/Terminal/panel/index.ts +0 -72
- package/src/react-ui/blocks/Terminal/panel/terminal-filter-dropdown.module.css +0 -59
- package/src/react-ui/blocks/Terminal/panel/terminal-session-tabs.module.css +0 -59
- package/src/react-ui/blocks/Terminal/parsing/BadgeFormatter.ts +0 -180
- package/src/react-ui/blocks/Terminal/parsing/HttpLogParser.ts +0 -248
- package/src/react-ui/blocks/Terminal/parsing/LogParser.types.ts +0 -283
- package/src/react-ui/blocks/Terminal/parsing/LogParserService.ts +0 -686
- package/src/react-ui/blocks/Terminal/parsing/MultilineAggregator.ts +0 -466
- package/src/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.ts +0 -343
- package/src/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.ts +0 -167
- package/src/react-ui/blocks/Terminal/parsing/TableParser.ts +0 -348
- package/src/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.ts +0 -251
- package/src/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.ts +0 -390
- package/src/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.ts +0 -320
- package/src/react-ui/blocks/Terminal/parsing/ansi/index.ts +0 -20
- package/src/react-ui/blocks/Terminal/parsing/index.ts +0 -69
- package/src/react-ui/blocks/Terminal/parsing/levels/LogLevel.types.ts +0 -68
- package/src/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.ts +0 -436
- package/src/react-ui/blocks/Terminal/parsing/levels/index.ts +0 -14
- package/src/react-ui/blocks/index.ts +0 -11
- package/src/react-ui/components/MorphingPopover/MorphingPopover.types.ts +0 -49
- package/src/react-ui/components/MorphingPopover/index.tsx +0 -186
- package/src/react-ui/components/MorphingPopover/morphing-popover.module.css +0 -153
- package/src/react-ui/components/index.ts +0 -9
- package/src/react-ui/hooks/Animation/UseAutoHeight.tsx +0 -123
- package/src/react-ui/hooks/DOM/UseIsInView.tsx +0 -44
- package/src/react-ui/hooks/Formatting/UseListFormat.ts +0 -134
- package/src/react-ui/hooks/State/UseControlledState.tsx +0 -57
- package/src/react-ui/hooks/State/UseDataState.tsx +0 -76
- package/src/react-ui/hooks/index.ts +0 -20
- package/src/react-ui/icons/index.ts +0 -12
- package/src/react-ui/icons/lucide-animated/activity.tsx +0 -109
- package/src/react-ui/icons/lucide-animated/arrow-down-to-line.tsx +0 -51
- package/src/react-ui/icons/lucide-animated/arrow-up.tsx +0 -50
- package/src/react-ui/icons/lucide-animated/bell-electric.tsx +0 -124
- package/src/react-ui/icons/lucide-animated/bell.tsx +0 -93
- package/src/react-ui/icons/lucide-animated/bot.tsx +0 -122
- package/src/react-ui/icons/lucide-animated/box.tsx +0 -117
- package/src/react-ui/icons/lucide-animated/check.tsx +0 -21
- package/src/react-ui/icons/lucide-animated/circle-check.tsx +0 -107
- package/src/react-ui/icons/lucide-animated/delete.tsx +0 -133
- package/src/react-ui/icons/lucide-animated/download.tsx +0 -99
- package/src/react-ui/icons/lucide-animated/edit-2.tsx +0 -21
- package/src/react-ui/icons/lucide-animated/globe.tsx +0 -23
- package/src/react-ui/icons/lucide-animated/home.tsx +0 -103
- package/src/react-ui/icons/lucide-animated/index.ts +0 -38
- package/src/react-ui/icons/lucide-animated/layers.tsx +0 -23
- package/src/react-ui/icons/lucide-animated/layout-panel-top.tsx +0 -143
- package/src/react-ui/icons/lucide-animated/list.tsx +0 -54
- package/src/react-ui/icons/lucide-animated/package.tsx +0 -24
- package/src/react-ui/icons/lucide-animated/palette.tsx +0 -25
- package/src/react-ui/icons/lucide-animated/plus.tsx +0 -92
- package/src/react-ui/icons/lucide-animated/refresh-cw.tsx +0 -24
- package/src/react-ui/icons/lucide-animated/rocket.tsx +0 -24
- package/src/react-ui/icons/lucide-animated/save.tsx +0 -23
- package/src/react-ui/icons/lucide-animated/search.tsx +0 -94
- package/src/react-ui/icons/lucide-animated/settings.tsx +0 -92
- package/src/react-ui/icons/lucide-animated/terminal.tsx +0 -46
- package/src/react-ui/icons/lucide-animated/trash-2.tsx +0 -25
- package/src/react-ui/icons/lucide-animated/trending-down.tsx +0 -151
- package/src/react-ui/icons/lucide-animated/trending-up.tsx +0 -150
- package/src/react-ui/icons/lucide-animated/type.tsx +0 -23
- package/src/react-ui/icons/lucide-animated/upload.tsx +0 -23
- package/src/react-ui/icons/lucide-animated/x.tsx +0 -102
- package/src/react-ui/index.ts +0 -30
- package/src/react-ui/lib/get-strict-context.tsx +0 -56
- package/src/react-ui/lib/icon-wrapper.tsx +0 -70
- package/src/react-ui/lib/index.ts +0 -9
- package/src/react-ui/lib/utils.ts +0 -24
- package/src/react-ui/primitives/AutoHeight/index.tsx +0 -74
- package/src/react-ui/primitives/CountingNumber/index.tsx +0 -147
- package/src/react-ui/primitives/Highlight/Highlight.types.ts +0 -136
- package/src/react-ui/primitives/Highlight/index.tsx +0 -577
- package/src/react-ui/primitives/Slot/index.tsx +0 -128
- package/src/react-ui/primitives/index.ts +0 -16
- package/src/react-ui/primitives/waapi/Gooey/Gooey.types.ts +0 -123
- package/src/react-ui/primitives/waapi/Gooey/GooeyCanvas.tsx +0 -80
- package/src/react-ui/primitives/waapi/Gooey/GooeyFilter.tsx +0 -77
- package/src/react-ui/primitives/waapi/Gooey/MorphPath.tsx +0 -58
- package/src/react-ui/primitives/waapi/Gooey/gooey-utils.ts +0 -244
- package/src/react-ui/primitives/waapi/Gooey/index.ts +0 -50
- package/src/react-ui/primitives/waapi/Gooey/useMorphPath.ts +0 -48
- package/src/react-ui/primitives/waapi/Morph/Morph.types.ts +0 -106
- package/src/react-ui/primitives/waapi/Morph/MorphContext.tsx +0 -21
- package/src/react-ui/primitives/waapi/Morph/index.tsx +0 -56
- package/src/react-ui/primitives/waapi/Morph/techniques/index.ts +0 -12
- package/src/react-ui/primitives/waapi/Morph/techniques/useCSSGridMorph.ts +0 -89
- package/src/react-ui/primitives/waapi/Morph/techniques/useFLIPClipPath.ts +0 -176
- package/src/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.ts +0 -87
- package/src/react-ui/primitives/waapi/Morph/useMorph.ts +0 -101
- package/src/react-ui/primitives/waapi/Reorder/Reorder.types.ts +0 -177
- package/src/react-ui/primitives/waapi/Reorder/index.tsx +0 -260
- package/src/react-ui/primitives/waapi/Reorder/useReorder.ts +0 -47
- package/src/react-ui/primitives/waapi/Reorder/useReorderPresence.ts +0 -209
- package/src/react-ui/primitives/waapi/Reorder/utils/separatorCoordination.ts +0 -104
- package/src/react-ui/primitives/waapi/SlidingNumber/SlidingNumber.styles.ts +0 -14
- package/src/react-ui/primitives/waapi/SlidingNumber/SlidingNumber.types.ts +0 -84
- package/src/react-ui/primitives/waapi/SlidingNumber/index.tsx +0 -474
- package/src/react-ui/primitives/waapi/SlidingText/SlidingText.styles.ts +0 -32
- package/src/react-ui/primitives/waapi/SlidingText/SlidingText.types.ts +0 -69
- package/src/react-ui/primitives/waapi/SlidingText/index.tsx +0 -140
- package/src/react-ui/primitives/waapi/core/animationConstants.ts +0 -215
- package/src/react-ui/primitives/waapi/core/index.ts +0 -53
- package/src/react-ui/primitives/waapi/core/types.ts +0 -200
- package/src/react-ui/primitives/waapi/core/useAnimationOrchestrator.ts +0 -430
- package/src/react-ui/primitives/waapi/core/useElementRegistry.ts +0 -81
- package/src/react-ui/primitives/waapi/core/useFLIPAnimation.ts +0 -138
- package/src/react-ui/primitives/waapi/core/usePositionCapture.ts +0 -106
- package/src/react-ui/primitives/waapi/index.ts +0 -139
- package/src/react-ui/styles/animations.css +0 -369
- package/src/react-ui/ui/Accordion/Accordion.styles.ts +0 -72
- package/src/react-ui/ui/Accordion/Accordion.types.ts +0 -199
- package/src/react-ui/ui/Accordion/index.tsx +0 -362
- package/src/react-ui/ui/AlertDialog/AlertDialog.styles.ts +0 -38
- package/src/react-ui/ui/AlertDialog/AlertDialog.types.ts +0 -296
- package/src/react-ui/ui/AlertDialog/index.tsx +0 -540
- package/src/react-ui/ui/Badge/Badge.styles.ts +0 -43
- package/src/react-ui/ui/Badge/Badge.types.ts +0 -26
- package/src/react-ui/ui/Badge/index.tsx +0 -34
- package/src/react-ui/ui/Button/Button.styles.ts +0 -57
- package/src/react-ui/ui/Button/Button.types.ts +0 -63
- package/src/react-ui/ui/Button/index.tsx +0 -155
- package/src/react-ui/ui/Card/Card.styles.ts +0 -32
- package/src/react-ui/ui/Card/Card.types.ts +0 -39
- package/src/react-ui/ui/Card/index.tsx +0 -130
- package/src/react-ui/ui/Checkbox/Checkbox.styles.ts +0 -40
- package/src/react-ui/ui/Checkbox/Checkbox.types.ts +0 -98
- package/src/react-ui/ui/Checkbox/index.tsx +0 -233
- package/src/react-ui/ui/Combobox/Combobox.styles.ts +0 -34
- package/src/react-ui/ui/Combobox/Combobox.types.ts +0 -89
- package/src/react-ui/ui/Combobox/index.tsx +0 -331
- package/src/react-ui/ui/CornerBracket/CornerBracket.styles.ts +0 -38
- package/src/react-ui/ui/CornerBracket/CornerBracket.types.ts +0 -15
- package/src/react-ui/ui/CornerBracket/index.tsx +0 -49
- package/src/react-ui/ui/DataCard/DataCard.styles.ts +0 -94
- package/src/react-ui/ui/DataCard/DataCard.types.ts +0 -125
- package/src/react-ui/ui/DataCard/index.tsx +0 -340
- package/src/react-ui/ui/Dialog/Dialog.styles.ts +0 -59
- package/src/react-ui/ui/Dialog/Dialog.types.ts +0 -284
- package/src/react-ui/ui/Dialog/index.tsx +0 -452
- package/src/react-ui/ui/DropdownMenu/DropdownMenu.styles.ts +0 -35
- package/src/react-ui/ui/DropdownMenu/DropdownMenu.types.ts +0 -81
- package/src/react-ui/ui/DropdownMenu/index.tsx +0 -300
- package/src/react-ui/ui/DynamicToggle/DynamicToggle.css +0 -303
- package/src/react-ui/ui/DynamicToggle/DynamicToggle.styles.ts +0 -85
- package/src/react-ui/ui/DynamicToggle/DynamicToggle.types.ts +0 -174
- package/src/react-ui/ui/DynamicToggle/index.tsx +0 -294
- package/src/react-ui/ui/DynamicToggle/prototype-v7.html +0 -615
- package/src/react-ui/ui/DynamicToggle/prototype.html +0 -419
- package/src/react-ui/ui/Field/Field.styles.ts +0 -47
- package/src/react-ui/ui/Field/Field.types.ts +0 -60
- package/src/react-ui/ui/Field/index.tsx +0 -254
- package/src/react-ui/ui/Input/Input.styles.ts +0 -11
- package/src/react-ui/ui/Input/Input.types.ts +0 -10
- package/src/react-ui/ui/Input/index.tsx +0 -32
- package/src/react-ui/ui/InputGroup/InputGroup.styles.ts +0 -53
- package/src/react-ui/ui/InputGroup/InputGroup.types.ts +0 -44
- package/src/react-ui/ui/InputGroup/index.tsx +0 -149
- package/src/react-ui/ui/Label/Label.styles.ts +0 -10
- package/src/react-ui/ui/Label/Label.types.ts +0 -9
- package/src/react-ui/ui/Label/index.tsx +0 -27
- package/src/react-ui/ui/Menu/Menu.styles.ts +0 -71
- package/src/react-ui/ui/Menu/Menu.types.ts +0 -425
- package/src/react-ui/ui/Menu/index.tsx +0 -900
- package/src/react-ui/ui/Popover/Popover.styles.ts +0 -55
- package/src/react-ui/ui/Popover/Popover.types.ts +0 -261
- package/src/react-ui/ui/Popover/index.tsx +0 -422
- package/src/react-ui/ui/Progress/Progress.styles.ts +0 -36
- package/src/react-ui/ui/Progress/Progress.types.ts +0 -162
- package/src/react-ui/ui/Progress/index.tsx +0 -254
- package/src/react-ui/ui/Select/Select.styles.ts +0 -30
- package/src/react-ui/ui/Select/Select.types.ts +0 -51
- package/src/react-ui/ui/Select/index.tsx +0 -225
- package/src/react-ui/ui/Separator/Separator.styles.ts +0 -10
- package/src/react-ui/ui/Separator/Separator.types.ts +0 -10
- package/src/react-ui/ui/Separator/index.tsx +0 -37
- package/src/react-ui/ui/Switch/Switch.styles.ts +0 -50
- package/src/react-ui/ui/Switch/Switch.types.ts +0 -155
- package/src/react-ui/ui/Switch/index.tsx +0 -253
- package/src/react-ui/ui/Tabs/Tabs.css +0 -39
- package/src/react-ui/ui/Tabs/Tabs.styles.ts +0 -148
- package/src/react-ui/ui/Tabs/Tabs.types.ts +0 -255
- package/src/react-ui/ui/Tabs/index.tsx +0 -529
- package/src/react-ui/ui/TextFlow/TextFlow.styles.ts +0 -36
- package/src/react-ui/ui/TextFlow/TextFlow.types.ts +0 -118
- package/src/react-ui/ui/TextFlow/index.tsx +0 -276
- package/src/react-ui/ui/Textarea/Textarea.styles.ts +0 -10
- package/src/react-ui/ui/Textarea/Textarea.types.ts +0 -9
- package/src/react-ui/ui/Textarea/index.tsx +0 -27
- package/src/react-ui/ui/Tooltip/Tooltip.styles.ts +0 -43
- package/src/react-ui/ui/Tooltip/Tooltip.types.ts +0 -253
- package/src/react-ui/ui/Tooltip/index.tsx +0 -394
- package/src/react-ui/ui/index.ts +0 -41
- package/src/types/css-modules.d.ts +0 -18
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import * as React from 'react';
|
|
4
|
-
|
|
5
|
-
/** Possible values stored in a data-* attribute. */
|
|
6
|
-
type DataStateValue = string | boolean | null;
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Parse a DOM dataset attribute string into a typed value.
|
|
10
|
-
*
|
|
11
|
-
* @param value - Raw attribute string
|
|
12
|
-
* @returns Parsed DataStateValue
|
|
13
|
-
*/
|
|
14
|
-
function parseDatasetValue(value: string | null): DataStateValue {
|
|
15
|
-
if (value === null) return null;
|
|
16
|
-
if (value === '' || value === 'true') return true;
|
|
17
|
-
if (value === 'false') return false;
|
|
18
|
-
return value;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Hook that observes a `data-*` attribute on a DOM element via MutationObserver
|
|
23
|
-
* and returns the current value reactively.
|
|
24
|
-
*
|
|
25
|
-
* @param key - The data attribute key (without `data-` prefix)
|
|
26
|
-
* @param forwardedRef - Optional forwarded ref to merge
|
|
27
|
-
* @param onChange - Callback when value changes
|
|
28
|
-
* @returns Tuple of [currentValue, localRef]
|
|
29
|
-
*
|
|
30
|
-
* @example
|
|
31
|
-
* ```tsx
|
|
32
|
-
* const [state, ref] = useDataState<HTMLDivElement>('state');
|
|
33
|
-
* // Reacts to changes in `data-state` attribute on the element
|
|
34
|
-
* ```
|
|
35
|
-
*/
|
|
36
|
-
function useDataState<T extends HTMLElement = HTMLElement>(
|
|
37
|
-
key: string,
|
|
38
|
-
forwardedRef?: React.Ref<T | null>,
|
|
39
|
-
onChange?: (value: DataStateValue) => void,
|
|
40
|
-
): [DataStateValue, React.RefObject<T | null>] {
|
|
41
|
-
const localRef = React.useRef<T | null>(null);
|
|
42
|
-
React.useImperativeHandle(forwardedRef, () => localRef.current as T);
|
|
43
|
-
|
|
44
|
-
const getSnapshot = (): DataStateValue => {
|
|
45
|
-
const el = localRef.current;
|
|
46
|
-
return el ? parseDatasetValue(el.getAttribute(`data-${key}`)) : null;
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
const subscribe = (callback: () => void) => {
|
|
50
|
-
const el = localRef.current;
|
|
51
|
-
if (!el) return () => {};
|
|
52
|
-
const observer = new MutationObserver((records) => {
|
|
53
|
-
for (const record of records) {
|
|
54
|
-
if (record.attributeName === `data-${key}`) {
|
|
55
|
-
callback();
|
|
56
|
-
break;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
observer.observe(el, {
|
|
61
|
-
attributes: true,
|
|
62
|
-
attributeFilter: [`data-${key}`],
|
|
63
|
-
});
|
|
64
|
-
return () => observer.disconnect();
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
const value = React.useSyncExternalStore(subscribe, getSnapshot);
|
|
68
|
-
|
|
69
|
-
React.useEffect(() => {
|
|
70
|
-
if (onChange) onChange(value);
|
|
71
|
-
}, [value, onChange]);
|
|
72
|
-
|
|
73
|
-
return [value, localRef];
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export { useDataState, type DataStateValue };
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Custom React hooks barrel export.
|
|
3
|
-
*
|
|
4
|
-
* @module @mks2508/mks-ui/react/hooks
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
export { useAutoHeight } from './Animation/UseAutoHeight';
|
|
8
|
-
export type { IAutoHeightOptions } from './Animation/UseAutoHeight';
|
|
9
|
-
|
|
10
|
-
export { useControlledState } from './State/UseControlledState';
|
|
11
|
-
export type { IControlledStateProps } from './State/UseControlledState';
|
|
12
|
-
|
|
13
|
-
export { useDataState } from './State/UseDataState';
|
|
14
|
-
export type { DataStateValue } from './State/UseDataState';
|
|
15
|
-
|
|
16
|
-
export { useIsInView } from './DOM/UseIsInView';
|
|
17
|
-
export type { IUseIsInViewOptions } from './DOM/UseIsInView';
|
|
18
|
-
|
|
19
|
-
export { useListFormat } from './Formatting/UseListFormat';
|
|
20
|
-
export type { IUseListFormatOptions, IListPart, ListFormatType, ListFormatStyle } from './Formatting/UseListFormat';
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Icons barrel export - Organized by registry.
|
|
3
|
-
*
|
|
4
|
-
* @module @mks2508/mks-ui/react/icons
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
// Lucide animated icons (preferred for animated icons)
|
|
8
|
-
export * from './lucide-animated';
|
|
9
|
-
|
|
10
|
-
// HugeIcons - re-exported as namespace to avoid naming conflicts
|
|
11
|
-
// Use: import { HugeIcons } from '@mks2508/mks-ui/react'
|
|
12
|
-
export * as HugeIcons from '@hugeicons/core-free-icons';
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import type { Variants } from "motion/react";
|
|
4
|
-
import { motion, useAnimation } from "motion/react";
|
|
5
|
-
import type { HTMLAttributes } from "react";
|
|
6
|
-
import { forwardRef, useCallback, useImperativeHandle, useRef } from "react";
|
|
7
|
-
|
|
8
|
-
import { cn } from "@/react-ui/lib/utils";
|
|
9
|
-
|
|
10
|
-
export interface ActivityIconHandle {
|
|
11
|
-
startAnimation: () => void;
|
|
12
|
-
stopAnimation: () => void;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
interface ActivityIconProps extends HTMLAttributes<HTMLDivElement> {
|
|
16
|
-
size?: number;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const VARIANTS: Variants = {
|
|
20
|
-
normal: {
|
|
21
|
-
opacity: 1,
|
|
22
|
-
pathLength: 1,
|
|
23
|
-
pathOffset: 0,
|
|
24
|
-
transition: {
|
|
25
|
-
duration: 0.4,
|
|
26
|
-
opacity: { duration: 0.1 },
|
|
27
|
-
},
|
|
28
|
-
},
|
|
29
|
-
animate: {
|
|
30
|
-
opacity: [0, 1],
|
|
31
|
-
pathLength: [0, 1],
|
|
32
|
-
pathOffset: [1, 0],
|
|
33
|
-
transition: {
|
|
34
|
-
duration: 0.6,
|
|
35
|
-
ease: "linear",
|
|
36
|
-
opacity: { duration: 0.1 },
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
const ActivityIcon = forwardRef<ActivityIconHandle, ActivityIconProps>(
|
|
42
|
-
({ onMouseEnter, onMouseLeave, className, size = 28, ...props }, ref) => {
|
|
43
|
-
const controls = useAnimation();
|
|
44
|
-
const isControlledRef = useRef(false);
|
|
45
|
-
|
|
46
|
-
useImperativeHandle(ref, () => {
|
|
47
|
-
isControlledRef.current = true;
|
|
48
|
-
|
|
49
|
-
return {
|
|
50
|
-
startAnimation: () => controls.start("animate"),
|
|
51
|
-
stopAnimation: () => controls.start("normal"),
|
|
52
|
-
};
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
const handleMouseEnter = useCallback(
|
|
56
|
-
(e: React.MouseEvent<HTMLDivElement>) => {
|
|
57
|
-
if (isControlledRef.current) {
|
|
58
|
-
onMouseEnter?.(e);
|
|
59
|
-
} else {
|
|
60
|
-
controls.start("animate");
|
|
61
|
-
}
|
|
62
|
-
},
|
|
63
|
-
[controls, onMouseEnter]
|
|
64
|
-
);
|
|
65
|
-
|
|
66
|
-
const handleMouseLeave = useCallback(
|
|
67
|
-
(e: React.MouseEvent<HTMLDivElement>) => {
|
|
68
|
-
if (isControlledRef.current) {
|
|
69
|
-
onMouseLeave?.(e);
|
|
70
|
-
} else {
|
|
71
|
-
controls.start("normal");
|
|
72
|
-
}
|
|
73
|
-
},
|
|
74
|
-
[controls, onMouseLeave]
|
|
75
|
-
);
|
|
76
|
-
|
|
77
|
-
return (
|
|
78
|
-
<div
|
|
79
|
-
className={cn(className)}
|
|
80
|
-
onMouseEnter={handleMouseEnter}
|
|
81
|
-
onMouseLeave={handleMouseLeave}
|
|
82
|
-
{...props}
|
|
83
|
-
>
|
|
84
|
-
<svg
|
|
85
|
-
fill="none"
|
|
86
|
-
height={size}
|
|
87
|
-
stroke="currentColor"
|
|
88
|
-
strokeLinecap="round"
|
|
89
|
-
strokeLinejoin="round"
|
|
90
|
-
strokeWidth="2"
|
|
91
|
-
viewBox="0 0 24 24"
|
|
92
|
-
width={size}
|
|
93
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
94
|
-
>
|
|
95
|
-
<motion.path
|
|
96
|
-
animate={controls}
|
|
97
|
-
d="M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2"
|
|
98
|
-
initial="normal"
|
|
99
|
-
variants={VARIANTS}
|
|
100
|
-
/>
|
|
101
|
-
</svg>
|
|
102
|
-
</div>
|
|
103
|
-
);
|
|
104
|
-
}
|
|
105
|
-
);
|
|
106
|
-
|
|
107
|
-
ActivityIcon.displayName = "ActivityIcon";
|
|
108
|
-
|
|
109
|
-
export { ActivityIcon };
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ArrowDownToLine Icon.
|
|
3
|
-
*
|
|
4
|
-
* Simple SVG icon for follow cursor enabled.
|
|
5
|
-
*
|
|
6
|
-
* @module components/icons/arrow-down-to-line
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
'use client';
|
|
10
|
-
|
|
11
|
-
import type { HTMLAttributes } from 'react';
|
|
12
|
-
|
|
13
|
-
export interface IArrowDownToLineIconProps extends HTMLAttributes<SVGSVGElement> {
|
|
14
|
-
size?: number;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* ArrowDownToLine Icon component.
|
|
19
|
-
*
|
|
20
|
-
* Use for follow cursor enabled state (auto-scroll to bottom).
|
|
21
|
-
*
|
|
22
|
-
* @example
|
|
23
|
-
* ```tsx
|
|
24
|
-
* <ArrowDownToLineIcon className="w-4 h-4 text-primary" />
|
|
25
|
-
* ```
|
|
26
|
-
*/
|
|
27
|
-
export function ArrowDownToLineIcon({
|
|
28
|
-
className,
|
|
29
|
-
size = 24,
|
|
30
|
-
...props
|
|
31
|
-
}: IArrowDownToLineIconProps) {
|
|
32
|
-
return (
|
|
33
|
-
<svg
|
|
34
|
-
className={className}
|
|
35
|
-
width={size}
|
|
36
|
-
height={size}
|
|
37
|
-
viewBox="0 0 24 24"
|
|
38
|
-
fill="none"
|
|
39
|
-
stroke="currentColor"
|
|
40
|
-
strokeWidth="2"
|
|
41
|
-
strokeLinecap="round"
|
|
42
|
-
strokeLinejoin="round"
|
|
43
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
44
|
-
{...props}
|
|
45
|
-
>
|
|
46
|
-
<path d="M12 17V3" />
|
|
47
|
-
<path d="m6 11 6 6 6-6" />
|
|
48
|
-
<path d="M20 21H4" />
|
|
49
|
-
</svg>
|
|
50
|
-
);
|
|
51
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ArrowUp Icon.
|
|
3
|
-
*
|
|
4
|
-
* Simple SVG icon for follow cursor disabled.
|
|
5
|
-
*
|
|
6
|
-
* @module components/icons/arrow-up
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
'use client';
|
|
10
|
-
|
|
11
|
-
import type { HTMLAttributes } from 'react';
|
|
12
|
-
|
|
13
|
-
export interface IArrowUpIconProps extends HTMLAttributes<SVGSVGElement> {
|
|
14
|
-
size?: number;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* ArrowUp Icon component.
|
|
19
|
-
*
|
|
20
|
-
* Use for follow cursor disabled state (scroll locked).
|
|
21
|
-
*
|
|
22
|
-
* @example
|
|
23
|
-
* ```tsx
|
|
24
|
-
* <ArrowUpIcon className="w-4 h-4 text-muted-foreground" />
|
|
25
|
-
* ```
|
|
26
|
-
*/
|
|
27
|
-
export function ArrowUpIcon({
|
|
28
|
-
className,
|
|
29
|
-
size = 24,
|
|
30
|
-
...props
|
|
31
|
-
}: IArrowUpIconProps) {
|
|
32
|
-
return (
|
|
33
|
-
<svg
|
|
34
|
-
className={className}
|
|
35
|
-
width={size}
|
|
36
|
-
height={size}
|
|
37
|
-
viewBox="0 0 24 24"
|
|
38
|
-
fill="none"
|
|
39
|
-
stroke="currentColor"
|
|
40
|
-
strokeWidth="2"
|
|
41
|
-
strokeLinecap="round"
|
|
42
|
-
strokeLinejoin="round"
|
|
43
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
44
|
-
{...props}
|
|
45
|
-
>
|
|
46
|
-
<path d="M12 3v17" />
|
|
47
|
-
<path d="m6 11 6-6 6 6" />
|
|
48
|
-
</svg>
|
|
49
|
-
);
|
|
50
|
-
}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { motion, useAnimation } from "motion/react";
|
|
4
|
-
import type { HTMLAttributes } from "react";
|
|
5
|
-
import { forwardRef, useCallback, useImperativeHandle, useRef } from "react";
|
|
6
|
-
|
|
7
|
-
import { cn } from "@/react-ui/lib/utils";
|
|
8
|
-
|
|
9
|
-
export interface BellElectricIconHandle {
|
|
10
|
-
startAnimation: () => void;
|
|
11
|
-
stopAnimation: () => void;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
interface BellElectricIconProps extends HTMLAttributes<HTMLDivElement> {
|
|
15
|
-
size?: number;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const BellElectricIcon = forwardRef<
|
|
19
|
-
BellElectricIconHandle,
|
|
20
|
-
BellElectricIconProps
|
|
21
|
-
>(({ onMouseEnter, onMouseLeave, className, size = 28, ...props }, ref) => {
|
|
22
|
-
const controls = useAnimation();
|
|
23
|
-
const isControlledRef = useRef(false);
|
|
24
|
-
|
|
25
|
-
useImperativeHandle(ref, () => {
|
|
26
|
-
isControlledRef.current = true;
|
|
27
|
-
return {
|
|
28
|
-
startAnimation: () => controls.start("animate"),
|
|
29
|
-
stopAnimation: () => controls.start("normal"),
|
|
30
|
-
};
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
const handleMouseEnter = useCallback(
|
|
34
|
-
(e: React.MouseEvent<HTMLDivElement>) => {
|
|
35
|
-
if (isControlledRef.current) {
|
|
36
|
-
onMouseEnter?.(e);
|
|
37
|
-
} else {
|
|
38
|
-
controls.start("animate");
|
|
39
|
-
}
|
|
40
|
-
},
|
|
41
|
-
[controls, onMouseEnter]
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
const handleMouseLeave = useCallback(
|
|
45
|
-
(e: React.MouseEvent<HTMLDivElement>) => {
|
|
46
|
-
if (isControlledRef.current) {
|
|
47
|
-
onMouseLeave?.(e);
|
|
48
|
-
} else {
|
|
49
|
-
controls.start("normal");
|
|
50
|
-
}
|
|
51
|
-
},
|
|
52
|
-
[controls, onMouseLeave]
|
|
53
|
-
);
|
|
54
|
-
|
|
55
|
-
return (
|
|
56
|
-
<div
|
|
57
|
-
className={cn(className)}
|
|
58
|
-
onMouseEnter={handleMouseEnter}
|
|
59
|
-
onMouseLeave={handleMouseLeave}
|
|
60
|
-
{...props}
|
|
61
|
-
>
|
|
62
|
-
<motion.svg
|
|
63
|
-
animate={controls}
|
|
64
|
-
fill="none"
|
|
65
|
-
height={size}
|
|
66
|
-
stroke="currentColor"
|
|
67
|
-
strokeLinecap="round"
|
|
68
|
-
strokeLinejoin="round"
|
|
69
|
-
strokeWidth="2"
|
|
70
|
-
style={{ transformBox: "fill-box", transformOrigin: "50% 50%" }}
|
|
71
|
-
transition={{ duration: 0.9 }}
|
|
72
|
-
variants={{
|
|
73
|
-
normal: { rotate: 0, translateX: 0, translateY: 0 },
|
|
74
|
-
animate: {
|
|
75
|
-
rotate: [0, -12, 12, -8, 8, 0],
|
|
76
|
-
translateX: [0, -1.5, 1.5, -1, 1, 0],
|
|
77
|
-
translateY: [0, -1, 1, -0.5, 0.5, 0],
|
|
78
|
-
},
|
|
79
|
-
}}
|
|
80
|
-
viewBox="0 0 24 24"
|
|
81
|
-
width={size}
|
|
82
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
83
|
-
>
|
|
84
|
-
<path d="M18.518 17.347A7 7 0 0 1 14 19" />
|
|
85
|
-
<motion.path
|
|
86
|
-
animate={controls}
|
|
87
|
-
d="M18.8 4A11 11 0 0 1 20 9"
|
|
88
|
-
style={{ transformBox: "fill-box", originX: "50%", originY: "50%" }}
|
|
89
|
-
transition={{ duration: 0.9 }}
|
|
90
|
-
variants={{
|
|
91
|
-
normal: { translateX: 0, translateY: 0, rotate: 0 },
|
|
92
|
-
animate: {
|
|
93
|
-
translateX: [0, -0.8, 0.8, -0.6, 0.6, 0],
|
|
94
|
-
translateY: [0, -0.5, 0.5, -0.3, 0.3, 0],
|
|
95
|
-
rotate: [0, -6, 6, -4, 4, 0],
|
|
96
|
-
},
|
|
97
|
-
}}
|
|
98
|
-
/>
|
|
99
|
-
<motion.path
|
|
100
|
-
animate={controls}
|
|
101
|
-
d="M9 9h.01"
|
|
102
|
-
style={{ transformBox: "fill-box", originX: "50%", originY: "50%" }}
|
|
103
|
-
transition={{ duration: 0.75 }}
|
|
104
|
-
variants={{
|
|
105
|
-
normal: { translateX: 0, translateY: 0, rotate: 0, scale: 1 },
|
|
106
|
-
animate: {
|
|
107
|
-
translateX: [0, -1.6, 1.6, -1.2, 1.2, 0],
|
|
108
|
-
translateY: [0, -1.2, 1.2, -0.8, 0.8, 0],
|
|
109
|
-
rotate: [0, -10, 10, -7, 7, 0],
|
|
110
|
-
scale: [1, 1.08, 0.95, 1.06, 0.98, 1],
|
|
111
|
-
},
|
|
112
|
-
}}
|
|
113
|
-
/>
|
|
114
|
-
<circle cx="9" cy="9" r="7" />
|
|
115
|
-
<rect height="6" rx="2" width="10" x="4" y="16" />
|
|
116
|
-
<circle cx="20" cy="16" r="2" />
|
|
117
|
-
</motion.svg>
|
|
118
|
-
</div>
|
|
119
|
-
);
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
BellElectricIcon.displayName = "BellElectricIcon";
|
|
123
|
-
|
|
124
|
-
export { BellElectricIcon };
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import type { Variants } from "motion/react";
|
|
4
|
-
import { motion, useAnimation } from "motion/react";
|
|
5
|
-
import type { HTMLAttributes } from "react";
|
|
6
|
-
import { forwardRef, useCallback, useImperativeHandle, useRef } from "react";
|
|
7
|
-
|
|
8
|
-
import { cn } from "@/react-ui/lib/utils";
|
|
9
|
-
|
|
10
|
-
export interface BellIconHandle {
|
|
11
|
-
startAnimation: () => void;
|
|
12
|
-
stopAnimation: () => void;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
interface BellIconProps extends HTMLAttributes<HTMLDivElement> {
|
|
16
|
-
size?: number;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const SVG_VARIANTS: Variants = {
|
|
20
|
-
normal: { rotate: 0 },
|
|
21
|
-
animate: { rotate: [0, -10, 10, -10, 0] },
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
const BellIcon = forwardRef<BellIconHandle, BellIconProps>(
|
|
25
|
-
({ onMouseEnter, onMouseLeave, className, size = 28, ...props }, ref) => {
|
|
26
|
-
const controls = useAnimation();
|
|
27
|
-
const isControlledRef = useRef(false);
|
|
28
|
-
|
|
29
|
-
useImperativeHandle(ref, () => {
|
|
30
|
-
isControlledRef.current = true;
|
|
31
|
-
|
|
32
|
-
return {
|
|
33
|
-
startAnimation: () => controls.start("animate"),
|
|
34
|
-
stopAnimation: () => controls.start("normal"),
|
|
35
|
-
};
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
const handleMouseEnter = useCallback(
|
|
39
|
-
(e: React.MouseEvent<HTMLDivElement>) => {
|
|
40
|
-
if (isControlledRef.current) {
|
|
41
|
-
onMouseEnter?.(e);
|
|
42
|
-
} else {
|
|
43
|
-
controls.start("animate");
|
|
44
|
-
}
|
|
45
|
-
},
|
|
46
|
-
[controls, onMouseEnter]
|
|
47
|
-
);
|
|
48
|
-
|
|
49
|
-
const handleMouseLeave = useCallback(
|
|
50
|
-
(e: React.MouseEvent<HTMLDivElement>) => {
|
|
51
|
-
if (isControlledRef.current) {
|
|
52
|
-
onMouseLeave?.(e);
|
|
53
|
-
} else {
|
|
54
|
-
controls.start("normal");
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
[controls, onMouseLeave]
|
|
58
|
-
);
|
|
59
|
-
return (
|
|
60
|
-
<div
|
|
61
|
-
className={cn(className)}
|
|
62
|
-
onMouseEnter={handleMouseEnter}
|
|
63
|
-
onMouseLeave={handleMouseLeave}
|
|
64
|
-
{...props}
|
|
65
|
-
>
|
|
66
|
-
<motion.svg
|
|
67
|
-
animate={controls}
|
|
68
|
-
fill="none"
|
|
69
|
-
height={size}
|
|
70
|
-
stroke="currentColor"
|
|
71
|
-
strokeLinecap="round"
|
|
72
|
-
strokeLinejoin="round"
|
|
73
|
-
strokeWidth="2"
|
|
74
|
-
transition={{
|
|
75
|
-
duration: 0.5,
|
|
76
|
-
ease: "easeInOut",
|
|
77
|
-
}}
|
|
78
|
-
variants={SVG_VARIANTS}
|
|
79
|
-
viewBox="0 0 24 24"
|
|
80
|
-
width={size}
|
|
81
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
82
|
-
>
|
|
83
|
-
<path d="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9" />
|
|
84
|
-
<path d="M10.3 21a1.94 1.94 0 0 0 3.4 0" />
|
|
85
|
-
</motion.svg>
|
|
86
|
-
</div>
|
|
87
|
-
);
|
|
88
|
-
}
|
|
89
|
-
);
|
|
90
|
-
|
|
91
|
-
BellIcon.displayName = "BellIcon";
|
|
92
|
-
|
|
93
|
-
export { BellIcon };
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { motion, useAnimation } from "motion/react";
|
|
4
|
-
import type { HTMLAttributes } from "react";
|
|
5
|
-
import { forwardRef, useCallback, useImperativeHandle, useRef } from "react";
|
|
6
|
-
|
|
7
|
-
import { cn } from "@/react-ui/lib/utils";
|
|
8
|
-
|
|
9
|
-
export interface BotIconHandle {
|
|
10
|
-
startAnimation: () => void;
|
|
11
|
-
stopAnimation: () => void;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface BotIconProps extends HTMLAttributes<HTMLDivElement> {
|
|
15
|
-
size?: number;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const BotIcon = forwardRef<BotIconHandle, BotIconProps>(
|
|
19
|
-
({ onMouseEnter, onMouseLeave, className, size = 28, ...props }, ref) => {
|
|
20
|
-
const controls = useAnimation();
|
|
21
|
-
const isControlledRef = useRef(false);
|
|
22
|
-
|
|
23
|
-
useImperativeHandle(ref, () => {
|
|
24
|
-
isControlledRef.current = true;
|
|
25
|
-
|
|
26
|
-
return {
|
|
27
|
-
startAnimation: () => controls.start("animate"),
|
|
28
|
-
stopAnimation: () => controls.start("normal"),
|
|
29
|
-
};
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
const handleMouseEnter = useCallback(
|
|
33
|
-
(e: React.MouseEvent<HTMLDivElement>) => {
|
|
34
|
-
if (isControlledRef.current) {
|
|
35
|
-
onMouseEnter?.(e);
|
|
36
|
-
} else {
|
|
37
|
-
controls.start("animate");
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
[controls, onMouseEnter]
|
|
41
|
-
);
|
|
42
|
-
|
|
43
|
-
const handleMouseLeave = useCallback(
|
|
44
|
-
(e: React.MouseEvent<HTMLDivElement>) => {
|
|
45
|
-
if (isControlledRef.current) {
|
|
46
|
-
onMouseLeave?.(e);
|
|
47
|
-
} else {
|
|
48
|
-
controls.start("normal");
|
|
49
|
-
}
|
|
50
|
-
},
|
|
51
|
-
[controls, onMouseLeave]
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
return (
|
|
55
|
-
<div
|
|
56
|
-
className={cn(className)}
|
|
57
|
-
onMouseEnter={handleMouseEnter}
|
|
58
|
-
onMouseLeave={handleMouseLeave}
|
|
59
|
-
{...props}
|
|
60
|
-
>
|
|
61
|
-
<svg
|
|
62
|
-
fill="none"
|
|
63
|
-
height={size}
|
|
64
|
-
stroke="currentColor"
|
|
65
|
-
strokeLinecap="round"
|
|
66
|
-
strokeLinejoin="round"
|
|
67
|
-
strokeWidth="2"
|
|
68
|
-
viewBox="0 0 24 24"
|
|
69
|
-
width={size}
|
|
70
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
71
|
-
>
|
|
72
|
-
<path d="M12 8V4H8" />
|
|
73
|
-
<rect height="12" rx="2" width="16" x="4" y="8" />
|
|
74
|
-
<path d="M2 14h2" />
|
|
75
|
-
<path d="M20 14h2" />
|
|
76
|
-
|
|
77
|
-
<motion.line
|
|
78
|
-
animate={controls}
|
|
79
|
-
initial="normal"
|
|
80
|
-
variants={{
|
|
81
|
-
normal: { y1: 13, y2: 15 },
|
|
82
|
-
animate: {
|
|
83
|
-
y1: [13, 14, 13],
|
|
84
|
-
y2: [15, 14, 15],
|
|
85
|
-
transition: {
|
|
86
|
-
duration: 0.5,
|
|
87
|
-
ease: "easeInOut",
|
|
88
|
-
delay: 0.2,
|
|
89
|
-
},
|
|
90
|
-
},
|
|
91
|
-
}}
|
|
92
|
-
x1={15}
|
|
93
|
-
x2={15}
|
|
94
|
-
/>
|
|
95
|
-
|
|
96
|
-
<motion.line
|
|
97
|
-
animate={controls}
|
|
98
|
-
initial="normal"
|
|
99
|
-
variants={{
|
|
100
|
-
normal: { y1: 13, y2: 15 },
|
|
101
|
-
animate: {
|
|
102
|
-
y1: [13, 14, 13],
|
|
103
|
-
y2: [15, 14, 15],
|
|
104
|
-
transition: {
|
|
105
|
-
duration: 0.5,
|
|
106
|
-
ease: "easeInOut",
|
|
107
|
-
delay: 0.2,
|
|
108
|
-
},
|
|
109
|
-
},
|
|
110
|
-
}}
|
|
111
|
-
x1={9}
|
|
112
|
-
x2={9}
|
|
113
|
-
/>
|
|
114
|
-
</svg>
|
|
115
|
-
</div>
|
|
116
|
-
);
|
|
117
|
-
}
|
|
118
|
-
);
|
|
119
|
-
|
|
120
|
-
BotIcon.displayName = "Bot";
|
|
121
|
-
|
|
122
|
-
export { BotIcon };
|