@k8o/arte-odyssey 0.0.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/LICENSE +21 -0
- package/dist/components/accordion/accordion-button.d.ts +2 -0
- package/dist/components/accordion/accordion-button.js +40 -0
- package/dist/components/accordion/accordion-item.d.ts +4 -0
- package/dist/components/accordion/accordion-item.js +11 -0
- package/dist/components/accordion/accordion-panel.d.ts +2 -0
- package/dist/components/accordion/accordion-panel.js +21 -0
- package/dist/components/accordion/accordion.d.ts +2 -0
- package/dist/components/accordion/accordion.js +17 -0
- package/dist/components/accordion/accordion.stories.js +89 -0
- package/dist/components/accordion/context.d.ts +10 -0
- package/dist/components/accordion/context.js +38 -0
- package/dist/components/accordion/index.d.ts +4 -0
- package/dist/components/accordion/index.js +4 -0
- package/dist/components/alert/alert.d.ts +8 -0
- package/dist/components/alert/alert.js +46 -0
- package/dist/components/alert/alert.stories.js +51 -0
- package/dist/components/alert/index.d.ts +1 -0
- package/dist/components/alert/index.js +1 -0
- package/dist/components/anchor/anchor.d.ts +14 -0
- package/dist/components/anchor/anchor.js +31 -0
- package/dist/components/anchor/anchor.stories.js +23 -0
- package/dist/components/anchor/index.d.ts +1 -0
- package/dist/components/anchor/index.js +1 -0
- package/dist/components/baseline-status/baseline-status.d.ts +16 -0
- package/dist/components/baseline-status/baseline-status.js +39 -0
- package/dist/components/baseline-status/baseline-status.stories.js +15 -0
- package/dist/components/baseline-status/index.d.ts +1 -0
- package/dist/components/baseline-status/index.js +1 -0
- package/dist/components/breadcrumb/breadcrumb.d.ts +18 -0
- package/dist/components/breadcrumb/breadcrumb.js +36 -0
- package/dist/components/breadcrumb/breadcrumb.stories.js +40 -0
- package/dist/components/breadcrumb/index.d.ts +1 -0
- package/dist/components/breadcrumb/index.js +1 -0
- package/dist/components/button/button.d.ts +10 -0
- package/dist/components/button/button.js +55 -0
- package/dist/components/button/button.stories.js +96 -0
- package/dist/components/button/index.d.ts +1 -0
- package/dist/components/button/index.js +1 -0
- package/dist/components/card/card.d.ts +3 -0
- package/dist/components/card/card.js +26 -0
- package/dist/components/card/card.stories.js +38 -0
- package/dist/components/card/index.d.ts +2 -0
- package/dist/components/card/index.js +2 -0
- package/dist/components/card/interactive-card.d.ts +3 -0
- package/dist/components/card/interactive-card.js +34 -0
- package/dist/components/card/type.d.ts +6 -0
- package/dist/components/card/type.js +0 -0
- package/dist/components/code/code.d.ts +4 -0
- package/dist/components/code/code.js +38 -0
- package/dist/components/code/code.stories.js +60 -0
- package/dist/components/code/index.d.ts +1 -0
- package/dist/components/code/index.js +4 -0
- package/dist/components/dialog/dialog.d.ts +17 -0
- package/dist/components/dialog/dialog.js +85 -0
- package/dist/components/dialog/dialog.stories.js +98 -0
- package/dist/components/dialog/index.d.ts +1 -0
- package/dist/components/dialog/index.js +1 -0
- package/dist/components/drawer/drawer.d.ts +6 -0
- package/dist/components/drawer/drawer.js +56 -0
- package/dist/components/drawer/drawer.stories.js +25 -0
- package/dist/components/drawer/index.d.ts +1 -0
- package/dist/components/drawer/index.js +1 -0
- package/dist/components/dropdown-menu/dropdown-menu.d.ts +24 -0
- package/dist/components/dropdown-menu/dropdown-menu.js +130 -0
- package/dist/components/dropdown-menu/dropdown-menu.stories.js +111 -0
- package/dist/components/dropdown-menu/hooks.d.ts +23 -0
- package/dist/components/dropdown-menu/hooks.js +56 -0
- package/dist/components/dropdown-menu/index.d.ts +1 -0
- package/dist/components/dropdown-menu/index.js +1 -0
- package/dist/components/error-boundary/index.d.ts +1 -0
- package/dist/components/error-boundary/index.js +4 -0
- package/dist/components/form/autocomplete/autocomplete.d.ts +14 -0
- package/dist/components/form/autocomplete/autocomplete.js +225 -0
- package/dist/components/form/autocomplete/autocomplete.stories.js +59 -0
- package/dist/components/form/autocomplete/index.d.ts +1 -0
- package/dist/components/form/autocomplete/index.js +1 -0
- package/dist/components/form/checkbox/checkbox.d.ts +8 -0
- package/dist/components/form/checkbox/checkbox.js +40 -0
- package/dist/components/form/checkbox/checkbox.stories.js +27 -0
- package/dist/components/form/checkbox/index.d.ts +1 -0
- package/dist/components/form/checkbox/index.js +1 -0
- package/dist/components/form/form-control/form-control.d.ts +20 -0
- package/dist/components/form/form-control/form-control.js +53 -0
- package/dist/components/form/form-control/form-control.stories.js +94 -0
- package/dist/components/form/form-control/index.d.ts +1 -0
- package/dist/components/form/form-control/index.js +1 -0
- package/dist/components/form/number-field/index.d.ts +1 -0
- package/dist/components/form/number-field/index.js +1 -0
- package/dist/components/form/number-field/number-field.d.ts +17 -0
- package/dist/components/form/number-field/number-field.js +150 -0
- package/dist/components/form/number-field/number-field.stories.js +106 -0
- package/dist/components/form/radio/index.d.ts +1 -0
- package/dist/components/form/radio/index.js +1 -0
- package/dist/components/form/radio/radio.d.ts +11 -0
- package/dist/components/form/radio/radio.js +51 -0
- package/dist/components/form/radio/radio.stories.js +55 -0
- package/dist/components/form/range-field/index.d.ts +1 -0
- package/dist/components/form/range-field/index.js +4 -0
- package/dist/components/form/range-field/range-field.d.ts +17 -0
- package/dist/components/form/range-field/range-field.js +54 -0
- package/dist/components/form/range-field/range-field.stories.js +162 -0
- package/dist/components/form/select/index.d.ts +1 -0
- package/dist/components/form/select/index.js +1 -0
- package/dist/components/form/select/select.d.ts +14 -0
- package/dist/components/form/select/select.js +39 -0
- package/dist/components/form/select/select.stories.js +58 -0
- package/dist/components/form/text-field/index.d.ts +1 -0
- package/dist/components/form/text-field/index.js +1 -0
- package/dist/components/form/text-field/text-field.d.ts +15 -0
- package/dist/components/form/text-field/text-field.js +40 -0
- package/dist/components/form/text-field/text-field.stories.js +61 -0
- package/dist/components/form/textarea/index.d.ts +1 -0
- package/dist/components/form/textarea/index.js +1 -0
- package/dist/components/form/textarea/textarea.d.ts +18 -0
- package/dist/components/form/textarea/textarea.js +56 -0
- package/dist/components/form/textarea/textarea.stories.js +92 -0
- package/dist/components/heading/heading.d.ts +8 -0
- package/dist/components/heading/heading.js +77 -0
- package/dist/components/heading/heading.stories.js +52 -0
- package/dist/components/heading/index.d.ts +1 -0
- package/dist/components/heading/index.js +1 -0
- package/dist/components/icon-button/icon-button.d.ts +8 -0
- package/dist/components/icon-button/icon-button.js +38 -0
- package/dist/components/icon-button/icon-button.stories.js +54 -0
- package/dist/components/icon-button/index.d.ts +1 -0
- package/dist/components/icon-button/index.js +1 -0
- package/dist/components/icon-link/icon-link.d.ts +17 -0
- package/dist/components/icon-link/icon-link.js +37 -0
- package/dist/components/icon-link/icon-link.stories.js +40 -0
- package/dist/components/icon-link/index.d.ts +1 -0
- package/dist/components/icon-link/index.js +1 -0
- package/dist/components/icons/arte-odyssey.d.ts +3 -0
- package/dist/components/icons/arte-odyssey.js +463 -0
- package/dist/components/icons/base.d.ts +9 -0
- package/dist/components/icons/base.js +13 -0
- package/dist/components/icons/github-mark.d.ts +3 -0
- package/dist/components/icons/github-mark.js +33 -0
- package/dist/components/icons/icons.stories.js +276 -0
- package/dist/components/icons/index.d.ts +7 -0
- package/dist/components/icons/index.js +7 -0
- package/dist/components/icons/logo.d.ts +6 -0
- package/dist/components/icons/logo.js +50 -0
- package/dist/components/icons/lucide.d.ts +50 -0
- package/dist/components/icons/lucide.js +569 -0
- package/dist/components/icons/qiita.d.ts +3 -0
- package/dist/components/icons/qiita.js +48 -0
- package/dist/components/icons/twitter.d.ts +3 -0
- package/dist/components/icons/twitter.js +34 -0
- package/dist/components/icons/zenn.d.ts +6 -0
- package/dist/components/icons/zenn.js +41 -0
- package/dist/components/index.d.ts +37 -0
- package/dist/components/index.js +37 -0
- package/dist/components/link-button/index.d.ts +1 -0
- package/dist/components/link-button/index.js +1 -0
- package/dist/components/link-button/link-button.d.ts +19 -0
- package/dist/components/link-button/link-button.js +46 -0
- package/dist/components/link-button/link-button.stories.js +51 -0
- package/dist/components/list-box/hooks.d.ts +37 -0
- package/dist/components/list-box/hooks.js +70 -0
- package/dist/components/list-box/index.d.ts +1 -0
- package/dist/components/list-box/index.js +1 -0
- package/dist/components/list-box/list-box.d.ts +22 -0
- package/dist/components/list-box/list-box.js +145 -0
- package/dist/components/list-box/list-box.stories.js +69 -0
- package/dist/components/modal/index.d.ts +1 -0
- package/dist/components/modal/index.js +1 -0
- package/dist/components/modal/modal.d.ts +8 -0
- package/dist/components/modal/modal.js +118 -0
- package/dist/components/modal/modal.stories.js +22 -0
- package/dist/components/popover/hooks.d.ts +65 -0
- package/dist/components/popover/hooks.js +187 -0
- package/dist/components/popover/index.d.ts +1 -0
- package/dist/components/popover/index.js +1 -0
- package/dist/components/popover/popover.d.ts +18 -0
- package/dist/components/popover/popover.js +141 -0
- package/dist/components/popover/popover.stories.js +45 -0
- package/dist/components/progress/index.d.ts +1 -0
- package/dist/components/progress/index.js +1 -0
- package/dist/components/progress/progress.d.ts +7 -0
- package/dist/components/progress/progress.js +21 -0
- package/dist/components/progress/progress.stories.js +16 -0
- package/dist/components/providers/component-provider.d.ts +2 -0
- package/dist/components/providers/component-provider.js +9 -0
- package/dist/components/providers/index.d.ts +2 -0
- package/dist/components/providers/index.js +2 -0
- package/dist/components/providers/portal-root.d.ts +5 -0
- package/dist/components/providers/portal-root.js +17 -0
- package/dist/components/scroll-linked/index.d.ts +1 -0
- package/dist/components/scroll-linked/index.js +1 -0
- package/dist/components/scroll-linked/scroll-linked.d.ts +2 -0
- package/dist/components/scroll-linked/scroll-linked.js +21 -0
- package/dist/components/scroll-linked/scroll-linked.stories.js +18 -0
- package/dist/components/separator/index.d.ts +1 -0
- package/dist/components/separator/index.js +1 -0
- package/dist/components/separator/separator.d.ts +4 -0
- package/dist/components/separator/separator.js +20 -0
- package/dist/components/separator/separator.stories.js +27 -0
- package/dist/components/tabs/index.d.ts +1 -0
- package/dist/components/tabs/index.js +1 -0
- package/dist/components/tabs/tabs.d.ts +16 -0
- package/dist/components/tabs/tabs.js +145 -0
- package/dist/components/tabs/tabs.stories.js +49 -0
- package/dist/components/text-tag/index.d.ts +1 -0
- package/dist/components/text-tag/index.js +1 -0
- package/dist/components/text-tag/text-tag.d.ts +5 -0
- package/dist/components/text-tag/text-tag.js +23 -0
- package/dist/components/text-tag/text-tag.stories.js +30 -0
- package/dist/components/toast/index.d.ts +1 -0
- package/dist/components/toast/index.js +5 -0
- package/dist/components/toast/provider.d.ts +11 -0
- package/dist/components/toast/provider.js +125 -0
- package/dist/components/toast/toast.d.ts +9 -0
- package/dist/components/toast/toast.js +19 -0
- package/dist/components/toast/toast.stories.js +45 -0
- package/dist/components/tooltip/index.d.ts +1 -0
- package/dist/components/tooltip/index.js +1 -0
- package/dist/components/tooltip/tooltip.d.ts +13 -0
- package/dist/components/tooltip/tooltip.js +60 -0
- package/dist/components/tooltip/tooltip.stories.js +40 -0
- package/dist/helpers/cn.d.ts +2 -0
- package/dist/helpers/cn.js +8 -0
- package/dist/helpers/color/find-all-colors.d.ts +12 -0
- package/dist/helpers/color/find-all-colors.js +210 -0
- package/dist/helpers/is-internal-route.d.ts +1 -0
- package/dist/helpers/is-internal-route.js +12 -0
- package/dist/helpers/number/between.d.ts +1 -0
- package/dist/helpers/number/between.js +19 -0
- package/dist/helpers/number/cast.d.ts +1 -0
- package/dist/helpers/number/cast.js +41 -0
- package/dist/helpers/number/commalize.d.ts +1 -0
- package/dist/helpers/number/commalize.js +22 -0
- package/dist/helpers/number/index.d.ts +4 -0
- package/dist/helpers/number/index.js +10 -0
- package/dist/helpers/number/to-precision.d.ts +1 -0
- package/dist/helpers/number/to-precision.js +17 -0
- package/dist/helpers/uuid-v4.d.ts +1 -0
- package/dist/helpers/uuid-v4.js +32 -0
- package/dist/hooks/click-away/index.d.ts +2 -0
- package/dist/hooks/click-away/index.js +24 -0
- package/dist/hooks/click-away/index.test.js +31 -0
- package/dist/hooks/client/index.d.ts +1 -0
- package/dist/hooks/client/index.js +12 -0
- package/dist/hooks/clipboard/index.d.ts +4 -0
- package/dist/hooks/clipboard/index.js +17 -0
- package/dist/hooks/clipboard/index.test.js +35 -0
- package/dist/hooks/hash/index.d.ts +1 -0
- package/dist/hooks/hash/index.js +28 -0
- package/dist/hooks/hash/index.test.js +46 -0
- package/dist/hooks/index.d.ts +10 -0
- package/dist/hooks/index.js +10 -0
- package/dist/hooks/interval/index.d.ts +1 -0
- package/dist/hooks/interval/index.js +17 -0
- package/dist/hooks/interval/index.test.js +32 -0
- package/dist/hooks/local-storage/index.d.ts +1 -0
- package/dist/hooks/local-storage/index.js +48 -0
- package/dist/hooks/local-storage/index.test.js +82 -0
- package/dist/hooks/scroll-direction/index.d.ts +6 -0
- package/dist/hooks/scroll-direction/index.js +40 -0
- package/dist/hooks/scroll-direction/index.test.js +174 -0
- package/dist/hooks/step/index.d.ts +13 -0
- package/dist/hooks/step/index.js +39 -0
- package/dist/hooks/step/index.test.js +85 -0
- package/dist/hooks/timeout/index.d.ts +1 -0
- package/dist/hooks/timeout/index.js +17 -0
- package/dist/hooks/timeout/index.test.js +31 -0
- package/dist/hooks/window-size/index.d.ts +6 -0
- package/dist/hooks/window-size/index.js +22 -0
- package/dist/hooks/window-size/index.test.js +18 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/package.json +6 -0
- package/dist/styles/index.css +394 -0
- package/dist/types/variables.d.ts +6 -0
- package/dist/types/variables.js +0 -0
- package/package.json +110 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { fn } from "storybook/test";
|
|
3
|
+
import { Dialog } from "../dialog";
|
|
4
|
+
import { Modal } from "./modal";
|
|
5
|
+
const meta = {
|
|
6
|
+
title: "components/modal",
|
|
7
|
+
component: Modal
|
|
8
|
+
};
|
|
9
|
+
var modal_stories_default = meta;
|
|
10
|
+
const Default = {
|
|
11
|
+
args: {
|
|
12
|
+
defaultOpen: true,
|
|
13
|
+
children: /* @__PURE__ */ jsxs(Dialog.Root, { children: [
|
|
14
|
+
/* @__PURE__ */ jsx(Dialog.Header, { onClose: fn(), title: "Hello" }),
|
|
15
|
+
/* @__PURE__ */ jsx(Dialog.Content, { children: "World" })
|
|
16
|
+
] })
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
export {
|
|
20
|
+
Default,
|
|
21
|
+
modal_stories_default as default
|
|
22
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { FloatingContext, Placement, ReferenceType } from '@floating-ui/react';
|
|
2
|
+
import { type CSSProperties, type HTMLProps, type RefObject } from 'react';
|
|
3
|
+
type PopoverContext = {
|
|
4
|
+
rootId: string;
|
|
5
|
+
type: 'dialog' | 'menu' | 'tooltip' | 'listbox';
|
|
6
|
+
isOpen: boolean;
|
|
7
|
+
toggleOpen: () => void;
|
|
8
|
+
onOpen: () => void;
|
|
9
|
+
onClose: () => void;
|
|
10
|
+
context: FloatingContext;
|
|
11
|
+
placement: Placement;
|
|
12
|
+
triggerRef: RefObject<Element | null>;
|
|
13
|
+
setTriggerRef: (node: ReferenceType | null) => void;
|
|
14
|
+
setContentRef: (node: HTMLElement | null) => void;
|
|
15
|
+
contentStyles: CSSProperties;
|
|
16
|
+
};
|
|
17
|
+
declare const PopoverContext: React.Context<PopoverContext | null>;
|
|
18
|
+
export declare const PopoverProvider: React.Context<PopoverContext | null>;
|
|
19
|
+
export declare const useFloatingUIContext: () => FloatingContext;
|
|
20
|
+
export declare const usePlacement: () => Placement;
|
|
21
|
+
export declare const useOpenContext: () => {
|
|
22
|
+
isOpen: boolean;
|
|
23
|
+
onOpen: () => void;
|
|
24
|
+
onClose: () => void;
|
|
25
|
+
toggleOpen: () => void;
|
|
26
|
+
};
|
|
27
|
+
export declare const usePopoverContent: () => {
|
|
28
|
+
id: string;
|
|
29
|
+
ref: RefObject<HTMLDivElement | null>;
|
|
30
|
+
isOpen: boolean;
|
|
31
|
+
isHover: boolean;
|
|
32
|
+
context: FloatingContext;
|
|
33
|
+
setContentRef: (node: HTMLElement | null) => void;
|
|
34
|
+
contentStyles: CSSProperties;
|
|
35
|
+
itemProps: {
|
|
36
|
+
id: string;
|
|
37
|
+
ref: RefObject<HTMLDivElement | null>;
|
|
38
|
+
role: string;
|
|
39
|
+
'aria-orientation'?: undefined;
|
|
40
|
+
onMouseEnter?: undefined;
|
|
41
|
+
onMouseLeave?: undefined;
|
|
42
|
+
onFocus?: undefined;
|
|
43
|
+
onBlur?: undefined;
|
|
44
|
+
} | {
|
|
45
|
+
id: string;
|
|
46
|
+
ref: RefObject<HTMLDivElement | null>;
|
|
47
|
+
role: string;
|
|
48
|
+
'aria-orientation': string;
|
|
49
|
+
onMouseEnter?: undefined;
|
|
50
|
+
onMouseLeave?: undefined;
|
|
51
|
+
onFocus?: undefined;
|
|
52
|
+
onBlur?: undefined;
|
|
53
|
+
} | {
|
|
54
|
+
id: string;
|
|
55
|
+
ref: RefObject<HTMLDivElement | null>;
|
|
56
|
+
role: string;
|
|
57
|
+
onMouseEnter: () => void;
|
|
58
|
+
onMouseLeave: () => void;
|
|
59
|
+
onFocus: () => void;
|
|
60
|
+
onBlur: () => void;
|
|
61
|
+
'aria-orientation'?: undefined;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
export declare const usePopoverTrigger: () => Omit<HTMLProps<HTMLButtonElement>, "selected" | "active">;
|
|
65
|
+
export {};
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
createContext,
|
|
4
|
+
use,
|
|
5
|
+
useMemo
|
|
6
|
+
} from "react";
|
|
7
|
+
import { useClickAway } from "./../../hooks/click-away";
|
|
8
|
+
const PopoverContext = createContext(null);
|
|
9
|
+
const PopoverProvider = PopoverContext;
|
|
10
|
+
const usePopoverContext = () => {
|
|
11
|
+
const popover = use(PopoverContext);
|
|
12
|
+
if (!popover) {
|
|
13
|
+
throw new Error("usePopoverContext must be used within a Popover.Root");
|
|
14
|
+
}
|
|
15
|
+
return popover;
|
|
16
|
+
};
|
|
17
|
+
const useFloatingUIContext = () => {
|
|
18
|
+
const popover = usePopoverContext();
|
|
19
|
+
return useMemo(() => popover.context, [popover]);
|
|
20
|
+
};
|
|
21
|
+
const usePlacement = () => {
|
|
22
|
+
const popover = usePopoverContext();
|
|
23
|
+
return popover.placement;
|
|
24
|
+
};
|
|
25
|
+
const useOpenContext = () => {
|
|
26
|
+
const popover = usePopoverContext();
|
|
27
|
+
return useMemo(
|
|
28
|
+
() => ({
|
|
29
|
+
isOpen: popover.isOpen,
|
|
30
|
+
onOpen: popover.onOpen,
|
|
31
|
+
onClose: popover.onClose,
|
|
32
|
+
toggleOpen: popover.toggleOpen
|
|
33
|
+
}),
|
|
34
|
+
[popover.isOpen, popover.onClose, popover.onOpen, popover.toggleOpen]
|
|
35
|
+
);
|
|
36
|
+
};
|
|
37
|
+
const usePopoverContent = () => {
|
|
38
|
+
const popover = usePopoverContext();
|
|
39
|
+
const isHover = popover.type === "tooltip";
|
|
40
|
+
const ref = useClickAway((event) => {
|
|
41
|
+
if (!popover.isOpen) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (popover.triggerRef.current?.contains(event.target)) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
popover.onClose();
|
|
48
|
+
}, !isHover);
|
|
49
|
+
const itemProps = useMemo(() => {
|
|
50
|
+
switch (popover.type) {
|
|
51
|
+
case "dialog":
|
|
52
|
+
return {
|
|
53
|
+
id: `${popover.rootId}_list`,
|
|
54
|
+
ref,
|
|
55
|
+
role: "dialog"
|
|
56
|
+
};
|
|
57
|
+
case "menu":
|
|
58
|
+
return {
|
|
59
|
+
id: `${popover.rootId}_list`,
|
|
60
|
+
ref,
|
|
61
|
+
role: "menu",
|
|
62
|
+
"aria-orientation": "vertical"
|
|
63
|
+
};
|
|
64
|
+
case "tooltip":
|
|
65
|
+
return {
|
|
66
|
+
id: `${popover.rootId}_list`,
|
|
67
|
+
ref,
|
|
68
|
+
role: "tooltip",
|
|
69
|
+
onMouseEnter: popover.onOpen,
|
|
70
|
+
onMouseLeave: popover.onClose,
|
|
71
|
+
onFocus: popover.onOpen,
|
|
72
|
+
onBlur: popover.onClose
|
|
73
|
+
};
|
|
74
|
+
case "listbox":
|
|
75
|
+
return {
|
|
76
|
+
id: `${popover.rootId}_list`,
|
|
77
|
+
ref,
|
|
78
|
+
role: "listbox"
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}, [popover.rootId, popover.type, ref, popover.onClose, popover.onOpen]);
|
|
82
|
+
return useMemo(
|
|
83
|
+
() => ({
|
|
84
|
+
id: `${popover.rootId}_list`,
|
|
85
|
+
ref,
|
|
86
|
+
isOpen: popover.isOpen,
|
|
87
|
+
isHover,
|
|
88
|
+
context: popover.context,
|
|
89
|
+
setContentRef: popover.setContentRef,
|
|
90
|
+
contentStyles: popover.contentStyles,
|
|
91
|
+
itemProps
|
|
92
|
+
}),
|
|
93
|
+
[
|
|
94
|
+
popover.rootId,
|
|
95
|
+
popover.isOpen,
|
|
96
|
+
popover.context,
|
|
97
|
+
popover.setContentRef,
|
|
98
|
+
popover.contentStyles,
|
|
99
|
+
ref,
|
|
100
|
+
isHover,
|
|
101
|
+
itemProps
|
|
102
|
+
]
|
|
103
|
+
);
|
|
104
|
+
};
|
|
105
|
+
const usePopoverTrigger = () => {
|
|
106
|
+
const popover = usePopoverContext();
|
|
107
|
+
return useMemo(() => {
|
|
108
|
+
switch (popover.type) {
|
|
109
|
+
case "dialog":
|
|
110
|
+
return {
|
|
111
|
+
onClick: popover.toggleOpen,
|
|
112
|
+
onKeyDown: (e) => {
|
|
113
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
114
|
+
e.preventDefault();
|
|
115
|
+
popover.toggleOpen();
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
"aria-haspopup": "dialog",
|
|
119
|
+
"aria-expanded": popover.isOpen,
|
|
120
|
+
"aria-controls": popover.isOpen ? `${popover.rootId}_list` : void 0,
|
|
121
|
+
ref: popover.setTriggerRef
|
|
122
|
+
};
|
|
123
|
+
case "tooltip":
|
|
124
|
+
return {
|
|
125
|
+
onMouseEnter: popover.onOpen,
|
|
126
|
+
onMouseLeave: popover.onClose,
|
|
127
|
+
onFocus: popover.onOpen,
|
|
128
|
+
onBlur: popover.onClose,
|
|
129
|
+
"aria-describedby": `${popover.rootId}_content`,
|
|
130
|
+
ref: popover.setTriggerRef
|
|
131
|
+
};
|
|
132
|
+
case "menu":
|
|
133
|
+
return {
|
|
134
|
+
onClick: popover.toggleOpen,
|
|
135
|
+
onKeyDown: (e) => {
|
|
136
|
+
if (e.key === "Enter") {
|
|
137
|
+
e.preventDefault();
|
|
138
|
+
popover.toggleOpen();
|
|
139
|
+
}
|
|
140
|
+
if (e.key === "ArrowUp") {
|
|
141
|
+
e.preventDefault();
|
|
142
|
+
popover.onOpen();
|
|
143
|
+
}
|
|
144
|
+
if (e.key === "ArrowDown") {
|
|
145
|
+
e.preventDefault();
|
|
146
|
+
popover.onOpen();
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
"aria-haspopup": "menu",
|
|
150
|
+
"aria-expanded": popover.isOpen,
|
|
151
|
+
"aria-controls": popover.isOpen ? `${popover.rootId}_list` : void 0,
|
|
152
|
+
ref: popover.setTriggerRef
|
|
153
|
+
};
|
|
154
|
+
case "listbox":
|
|
155
|
+
return {
|
|
156
|
+
onClick: popover.toggleOpen,
|
|
157
|
+
onKeyDown: (e) => {
|
|
158
|
+
if (e.key === "Enter") {
|
|
159
|
+
e.preventDefault();
|
|
160
|
+
popover.toggleOpen();
|
|
161
|
+
}
|
|
162
|
+
if (e.key === "ArrowUp") {
|
|
163
|
+
e.preventDefault();
|
|
164
|
+
popover.onOpen();
|
|
165
|
+
}
|
|
166
|
+
if (e.key === "ArrowDown") {
|
|
167
|
+
e.preventDefault();
|
|
168
|
+
popover.onOpen();
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
role: "combobox",
|
|
172
|
+
"aria-haspopup": "listbox",
|
|
173
|
+
"aria-expanded": popover.isOpen,
|
|
174
|
+
"aria-controls": popover.isOpen ? `${popover.rootId}_list` : void 0,
|
|
175
|
+
ref: popover.setTriggerRef
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
}, [popover]);
|
|
179
|
+
};
|
|
180
|
+
export {
|
|
181
|
+
PopoverProvider,
|
|
182
|
+
useFloatingUIContext,
|
|
183
|
+
useOpenContext,
|
|
184
|
+
usePlacement,
|
|
185
|
+
usePopoverContent,
|
|
186
|
+
usePopoverTrigger
|
|
187
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './popover';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./popover";
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type Placement } from '@floating-ui/react';
|
|
2
|
+
import { type Variants } from 'motion/react';
|
|
3
|
+
import { type FC, type HTMLProps, type PropsWithChildren, type ReactElement } from 'react';
|
|
4
|
+
export { useOpenContext } from './hooks';
|
|
5
|
+
export declare const Popover: {
|
|
6
|
+
Root: FC<PropsWithChildren<{
|
|
7
|
+
placement?: Placement;
|
|
8
|
+
type?: "dialog" | "menu" | "tooltip" | "listbox";
|
|
9
|
+
flipDisabled?: boolean;
|
|
10
|
+
}>>;
|
|
11
|
+
Content: FC<{
|
|
12
|
+
renderItem: (props: Record<string, unknown>) => ReactElement;
|
|
13
|
+
motionVariants?: Variants;
|
|
14
|
+
}>;
|
|
15
|
+
Trigger: FC<{
|
|
16
|
+
renderItem: (props: Omit<HTMLProps<HTMLButtonElement>, "selected" | "active" | "color">) => ReactElement;
|
|
17
|
+
}>;
|
|
18
|
+
};
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import {
|
|
4
|
+
autoUpdate,
|
|
5
|
+
FloatingFocusManager,
|
|
6
|
+
FloatingPortal,
|
|
7
|
+
flip,
|
|
8
|
+
offset,
|
|
9
|
+
useFloating
|
|
10
|
+
} from "@floating-ui/react";
|
|
11
|
+
import { AnimatePresence } from "motion/react";
|
|
12
|
+
import * as motion from "motion/react-client";
|
|
13
|
+
import {
|
|
14
|
+
useCallback,
|
|
15
|
+
useEffect,
|
|
16
|
+
useId,
|
|
17
|
+
useState
|
|
18
|
+
} from "react";
|
|
19
|
+
import { usePortalRoot } from "../providers";
|
|
20
|
+
import { PopoverProvider, usePopoverContent, usePopoverTrigger } from "./hooks";
|
|
21
|
+
import { useOpenContext } from "./hooks";
|
|
22
|
+
const Root = ({
|
|
23
|
+
children,
|
|
24
|
+
type = "menu",
|
|
25
|
+
placement = "bottom-start",
|
|
26
|
+
flipDisabled = false
|
|
27
|
+
}) => {
|
|
28
|
+
const id = useId();
|
|
29
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
30
|
+
const {
|
|
31
|
+
refs,
|
|
32
|
+
floatingStyles,
|
|
33
|
+
context,
|
|
34
|
+
placement: computedPlacement
|
|
35
|
+
} = useFloating({
|
|
36
|
+
strategy: "fixed",
|
|
37
|
+
placement,
|
|
38
|
+
open: isOpen,
|
|
39
|
+
whileElementsMounted: autoUpdate,
|
|
40
|
+
// 要素と8pxだけ離す
|
|
41
|
+
middleware: [
|
|
42
|
+
offset(8),
|
|
43
|
+
!flipDisabled && flip({
|
|
44
|
+
fallbackAxisSideDirection: "end",
|
|
45
|
+
padding: 8
|
|
46
|
+
})
|
|
47
|
+
],
|
|
48
|
+
transform: false
|
|
49
|
+
});
|
|
50
|
+
const toggleOpen = useCallback(() => {
|
|
51
|
+
setIsOpen((prev) => !prev);
|
|
52
|
+
}, []);
|
|
53
|
+
const onOpen = useCallback(() => {
|
|
54
|
+
setIsOpen(true);
|
|
55
|
+
}, []);
|
|
56
|
+
const onClose = useCallback(() => {
|
|
57
|
+
setIsOpen(false);
|
|
58
|
+
}, []);
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
const handleKeyDown = (e) => {
|
|
61
|
+
if (e.key === "Escape") {
|
|
62
|
+
onClose();
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
window.addEventListener("keydown", handleKeyDown);
|
|
66
|
+
return () => {
|
|
67
|
+
window.removeEventListener("keydown", handleKeyDown);
|
|
68
|
+
};
|
|
69
|
+
}, [onClose]);
|
|
70
|
+
return /* @__PURE__ */ jsx(
|
|
71
|
+
PopoverProvider,
|
|
72
|
+
{
|
|
73
|
+
value: {
|
|
74
|
+
rootId: id,
|
|
75
|
+
type,
|
|
76
|
+
isOpen,
|
|
77
|
+
toggleOpen,
|
|
78
|
+
onOpen,
|
|
79
|
+
onClose,
|
|
80
|
+
context,
|
|
81
|
+
placement: computedPlacement,
|
|
82
|
+
triggerRef: refs.domReference,
|
|
83
|
+
setTriggerRef: refs.setReference,
|
|
84
|
+
setContentRef: refs.setFloating,
|
|
85
|
+
contentStyles: floatingStyles
|
|
86
|
+
},
|
|
87
|
+
children
|
|
88
|
+
}
|
|
89
|
+
);
|
|
90
|
+
};
|
|
91
|
+
const contentMotionVariants = {
|
|
92
|
+
closed: {
|
|
93
|
+
scale: 0,
|
|
94
|
+
transition: {
|
|
95
|
+
delay: 0.1
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
open: {
|
|
99
|
+
scale: 1,
|
|
100
|
+
transition: {
|
|
101
|
+
type: "spring",
|
|
102
|
+
duration: 0.2
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
const Content = ({ renderItem, motionVariants = contentMotionVariants }) => {
|
|
107
|
+
const { isOpen, isHover, context, setContentRef, contentStyles, itemProps } = usePopoverContent();
|
|
108
|
+
const root = usePortalRoot();
|
|
109
|
+
const protalProps = root ? { root } : {};
|
|
110
|
+
return /* @__PURE__ */ jsx(AnimatePresence, { children: isOpen && /* @__PURE__ */ jsx(FloatingPortal, { ...protalProps, children: /* @__PURE__ */ jsx(
|
|
111
|
+
FloatingFocusManager,
|
|
112
|
+
{
|
|
113
|
+
context,
|
|
114
|
+
disabled: isHover,
|
|
115
|
+
modal: false,
|
|
116
|
+
children: /* @__PURE__ */ jsx("div", { ref: setContentRef, style: contentStyles, children: /* @__PURE__ */ jsx(
|
|
117
|
+
motion.div,
|
|
118
|
+
{
|
|
119
|
+
animate: "open",
|
|
120
|
+
exit: "closed",
|
|
121
|
+
initial: "closed",
|
|
122
|
+
variants: motionVariants,
|
|
123
|
+
children: renderItem(itemProps)
|
|
124
|
+
}
|
|
125
|
+
) })
|
|
126
|
+
}
|
|
127
|
+
) }) });
|
|
128
|
+
};
|
|
129
|
+
const Trigger = ({ renderItem }) => {
|
|
130
|
+
const props = usePopoverTrigger();
|
|
131
|
+
return renderItem(props);
|
|
132
|
+
};
|
|
133
|
+
const Popover = {
|
|
134
|
+
Root,
|
|
135
|
+
Content,
|
|
136
|
+
Trigger
|
|
137
|
+
};
|
|
138
|
+
export {
|
|
139
|
+
Popover,
|
|
140
|
+
useOpenContext
|
|
141
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button } from "../button";
|
|
3
|
+
import { Popover } from "./popover";
|
|
4
|
+
const meta = {
|
|
5
|
+
title: "components/popover",
|
|
6
|
+
component: Popover.Root,
|
|
7
|
+
parameters: {
|
|
8
|
+
a11y: {
|
|
9
|
+
options: {
|
|
10
|
+
rules: {
|
|
11
|
+
// https://github.com/floating-ui/floating-ui/pull/2298#issuecomment-1518101512
|
|
12
|
+
"aria-hidden-focus": { enabled: false }
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
var popover_stories_default = meta;
|
|
19
|
+
const Default = {
|
|
20
|
+
render: () => /* @__PURE__ */ jsxs(Popover.Root, { children: [
|
|
21
|
+
/* @__PURE__ */ jsx(
|
|
22
|
+
Popover.Trigger,
|
|
23
|
+
{
|
|
24
|
+
renderItem: (props) => /* @__PURE__ */ jsx(Button, { ...props, size: "md", type: "button", children: "Popover" })
|
|
25
|
+
}
|
|
26
|
+
),
|
|
27
|
+
/* @__PURE__ */ jsx(
|
|
28
|
+
Popover.Content,
|
|
29
|
+
{
|
|
30
|
+
renderItem: (props) => /* @__PURE__ */ jsx("div", { className: "rounded-sm bg-bg-mute p-4 shadow-md", ...props, children: /* @__PURE__ */ jsx("div", { role: "menuitem", children: "Popover content" }) })
|
|
31
|
+
}
|
|
32
|
+
)
|
|
33
|
+
] }),
|
|
34
|
+
play: async ({ canvas, userEvent }) => {
|
|
35
|
+
const trigger = canvas.getByRole("button", {
|
|
36
|
+
name: "Popover"
|
|
37
|
+
});
|
|
38
|
+
trigger.focus();
|
|
39
|
+
await userEvent.keyboard("{Enter}");
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
export {
|
|
43
|
+
Default,
|
|
44
|
+
popover_stories_default as default
|
|
45
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './progress';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./progress";
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { toPrecision } from "./../../helpers/number";
|
|
3
|
+
const Progress = ({ progress, maxProgress, minProgress = 0, label }) => {
|
|
4
|
+
return /* @__PURE__ */ jsx("div", { className: "w-full rounded-sm bg-bg-emphasize", children: /* @__PURE__ */ jsx(
|
|
5
|
+
"div",
|
|
6
|
+
{
|
|
7
|
+
"aria-label": label ?? `${toPrecision(progress / maxProgress).toString()}%`,
|
|
8
|
+
"aria-valuemax": maxProgress,
|
|
9
|
+
"aria-valuemin": minProgress,
|
|
10
|
+
"aria-valuenow": progress,
|
|
11
|
+
className: "h-4 rounded-sm bg-primary-fg",
|
|
12
|
+
role: "progressbar",
|
|
13
|
+
style: {
|
|
14
|
+
width: `${(progress / maxProgress * 100).toString()}%`
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
) });
|
|
18
|
+
};
|
|
19
|
+
export {
|
|
20
|
+
Progress
|
|
21
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Progress } from ".";
|
|
2
|
+
const meta = {
|
|
3
|
+
title: "components/progress",
|
|
4
|
+
component: Progress
|
|
5
|
+
};
|
|
6
|
+
var progress_stories_default = meta;
|
|
7
|
+
const Primary = {
|
|
8
|
+
args: {
|
|
9
|
+
progress: 50,
|
|
10
|
+
maxProgress: 100
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
Primary,
|
|
15
|
+
progress_stories_default as default
|
|
16
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { MotionConfig } from "motion/react";
|
|
3
|
+
import { ToastProvider } from "../toast";
|
|
4
|
+
const ComponentProvider = ({ children }) => {
|
|
5
|
+
return /* @__PURE__ */ jsx(MotionConfig, { reducedMotion: "user", children: /* @__PURE__ */ jsx(ToastProvider, { children }) });
|
|
6
|
+
};
|
|
7
|
+
export {
|
|
8
|
+
ComponentProvider
|
|
9
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type FC, type PropsWithChildren, type RefObject } from 'react';
|
|
2
|
+
export declare const usePortalRoot: () => RefObject<HTMLElement | null> | undefined;
|
|
3
|
+
export declare const PortalRootProvider: FC<PropsWithChildren<{
|
|
4
|
+
value?: RefObject<HTMLElement | null> | undefined;
|
|
5
|
+
}>>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import {
|
|
4
|
+
createContext,
|
|
5
|
+
use
|
|
6
|
+
} from "react";
|
|
7
|
+
const PortalRootContext = createContext(void 0);
|
|
8
|
+
const usePortalRoot = () => {
|
|
9
|
+
return use(PortalRootContext);
|
|
10
|
+
};
|
|
11
|
+
const PortalRootProvider = ({ value, children }) => {
|
|
12
|
+
return /* @__PURE__ */ jsx(PortalRootContext, { value, children });
|
|
13
|
+
};
|
|
14
|
+
export {
|
|
15
|
+
PortalRootProvider,
|
|
16
|
+
usePortalRoot
|
|
17
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './scroll-linked';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./scroll-linked";
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { motion, useScroll, useSpring } from "motion/react";
|
|
4
|
+
const ScrollLinked = () => {
|
|
5
|
+
const { scrollYProgress } = useScroll();
|
|
6
|
+
const scaleX = useSpring(scrollYProgress, {
|
|
7
|
+
stiffness: 100,
|
|
8
|
+
damping: 30,
|
|
9
|
+
restDelta: 0.01
|
|
10
|
+
});
|
|
11
|
+
return /* @__PURE__ */ jsx(
|
|
12
|
+
motion.div,
|
|
13
|
+
{
|
|
14
|
+
className: "fixed top-0 right-0 left-0 h-2 origin-left bg-primary-fg",
|
|
15
|
+
style: { scaleX }
|
|
16
|
+
}
|
|
17
|
+
);
|
|
18
|
+
};
|
|
19
|
+
export {
|
|
20
|
+
ScrollLinked
|
|
21
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { ScrollLinked } from "./scroll-linked";
|
|
3
|
+
const meta = {
|
|
4
|
+
title: "components/scroll-linked",
|
|
5
|
+
component: ScrollLinked
|
|
6
|
+
};
|
|
7
|
+
var scroll_linked_stories_default = meta;
|
|
8
|
+
const NoScroll = {};
|
|
9
|
+
const Scroll = {
|
|
10
|
+
decorators: [
|
|
11
|
+
(Story) => /* @__PURE__ */ jsx("div", { className: "h-lvh overflow-y-scroll", children: /* @__PURE__ */ jsx(Story, {}) })
|
|
12
|
+
]
|
|
13
|
+
};
|
|
14
|
+
export {
|
|
15
|
+
NoScroll,
|
|
16
|
+
Scroll,
|
|
17
|
+
scroll_linked_stories_default as default
|
|
18
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './separator';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./separator";
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "./../../helpers/cn";
|
|
3
|
+
const Separator = ({ orientation = "horizontal" }) => {
|
|
4
|
+
const isVertical = orientation === "vertical";
|
|
5
|
+
const Element = isVertical ? "div" : "hr";
|
|
6
|
+
return /* @__PURE__ */ jsx(
|
|
7
|
+
Element,
|
|
8
|
+
{
|
|
9
|
+
"aria-orientation": isVertical ? "vertical" : void 0,
|
|
10
|
+
className: cn("bg-border-base", {
|
|
11
|
+
"h-full w-px": isVertical,
|
|
12
|
+
"h-px w-full": !isVertical
|
|
13
|
+
}),
|
|
14
|
+
role: isVertical ? "separator" : void 0
|
|
15
|
+
}
|
|
16
|
+
);
|
|
17
|
+
};
|
|
18
|
+
export {
|
|
19
|
+
Separator
|
|
20
|
+
};
|