@k8o/arte-odyssey 3.0.0 → 3.1.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.
@@ -3,12 +3,15 @@ import { cn } from "./../../helpers/cn";
3
3
  const Card = ({
4
4
  children,
5
5
  variant = "primary",
6
- width = "full"
6
+ width = "full",
7
+ appearance = "shadow"
7
8
  }) => /* @__PURE__ */ jsx(
8
- "section",
9
+ "div",
9
10
  {
10
11
  className: cn(
11
- "rounded-lg shadow-sm",
12
+ "rounded-lg",
13
+ appearance === "shadow" && "shadow-sm",
14
+ appearance === "bordered" && "border border-border-mute",
12
15
  width === "full" && "w-full",
13
16
  width === "fit" && "w-fit",
14
17
  variant === "primary" && "bg-bg-base",
@@ -33,10 +33,17 @@ const Interactive = {
33
33
  ] }) })
34
34
  ] })
35
35
  };
36
+ const Bordered = {
37
+ render: () => /* @__PURE__ */ jsx(Card, { appearance: "bordered", children: /* @__PURE__ */ jsxs("div", { className: "p-4", children: [
38
+ /* @__PURE__ */ jsx("h3", { className: "font-bold text-lg", children: "\u30DC\u30FC\u30C0\u30FC\u30B9\u30BF\u30A4\u30EB" }),
39
+ /* @__PURE__ */ jsx("p", { className: "mt-2 text-fg-mute", children: "\u30B7\u30E3\u30C9\u30A6\u306E\u4EE3\u308F\u308A\u306B\u30DC\u30FC\u30C0\u30FC\u3067\u533A\u5207\u308B\u30B9\u30BF\u30A4\u30EB\u3067\u3059\u3002" })
40
+ ] }) })
41
+ };
36
42
  const FitWidth = {
37
43
  render: () => /* @__PURE__ */ jsx(Card, { width: "fit", children: /* @__PURE__ */ jsx("div", { className: "p-4", children: /* @__PURE__ */ jsx("p", { children: "\u5E45\u304C\u30B3\u30F3\u30C6\u30F3\u30C4\u306B\u5408\u308F\u305B\u3066\u8ABF\u6574\u3055\u308C\u307E\u3059\u3002" }) }) })
38
44
  };
39
45
  export {
46
+ Bordered,
40
47
  FitWidth,
41
48
  Interactive,
42
49
  Primary,
@@ -3,12 +3,15 @@ import { cn } from "./../../helpers/cn";
3
3
  const InteractiveCard = ({
4
4
  children,
5
5
  variant = "primary",
6
- width = "full"
6
+ width = "full",
7
+ appearance = "shadow"
7
8
  }) => /* @__PURE__ */ jsx(
8
- "section",
9
+ "div",
9
10
  {
10
11
  className: cn(
11
- "rounded-lg shadow-sm transition-transform hover:scale-[1.02] active:scale-[0.98]",
12
+ "rounded-lg transition-transform hover:scale-[1.02] active:scale-[0.98]",
13
+ appearance === "shadow" && "shadow-sm",
14
+ appearance === "bordered" && "border border-border-mute",
12
15
  width === "full" && "w-full",
13
16
  width === "fit" && "w-fit",
14
17
  variant === "primary" && "bg-bg-base",
@@ -2,4 +2,5 @@ import type { PropsWithChildren } from 'react';
2
2
  export type CardProps = PropsWithChildren<{
3
3
  variant?: 'primary' | 'secondary';
4
4
  width?: 'full' | 'fit';
5
+ appearance?: 'shadow' | 'bordered';
5
6
  }>;
@@ -1,6 +1,7 @@
1
- import { type FC, type PropsWithChildren } from 'react';
1
+ import { type FC, type PropsWithChildren, type ReactNode } from 'react';
2
2
  export declare const Drawer: FC<PropsWithChildren<{
3
- title: string;
3
+ title: ReactNode;
4
4
  isOpen: boolean;
5
5
  onClose: () => void;
6
+ side?: 'left' | 'right';
6
7
  }>>;
@@ -1,45 +1,55 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useId } from "react";
4
+ import { cn } from "../../helpers/cn";
4
5
  import { Heading } from "../heading";
5
6
  import { IconButton } from "../icon-button";
6
7
  import { CloseIcon } from "../icons";
7
8
  import { Modal } from "../modal";
8
- const Drawer = ({ title, isOpen, onClose, children }) => {
9
+ const Drawer = ({ title, isOpen, onClose, side = "right", children }) => {
9
10
  const rootId = useId();
10
- return /* @__PURE__ */ jsx(Modal, { isOpen, onClose, type: "right", children: /* @__PURE__ */ jsxs(
11
+ return /* @__PURE__ */ jsx(Modal, { isOpen, onClose, type: side, children: /* @__PURE__ */ jsxs(
11
12
  "section",
12
13
  {
13
14
  "aria-describedby": `${rootId}-content`,
14
15
  "aria-labelledby": `${rootId}-header`,
15
- className: "min-h-svh",
16
+ className: "flex h-full flex-col",
16
17
  id: rootId,
17
18
  children: [
18
19
  /* @__PURE__ */ jsxs(
19
20
  "div",
20
21
  {
21
- className: "flex items-center justify-center p-4 pb-2",
22
+ className: "flex shrink-0 items-center justify-center p-4 pb-2",
22
23
  id: `${rootId}-header`,
23
24
  children: [
24
- /* @__PURE__ */ jsx(Heading, { type: "h3", children: title }),
25
- /* @__PURE__ */ jsx("div", { className: "absolute top-2 right-2", children: /* @__PURE__ */ jsx(
26
- IconButton,
25
+ typeof title === "string" ? /* @__PURE__ */ jsx(Heading, { type: "h3", children: title }) : title,
26
+ /* @__PURE__ */ jsx(
27
+ "div",
27
28
  {
28
- label: "\u9589\u3058\u308B",
29
- onClick: (e) => {
30
- e.stopPropagation();
31
- onClose();
32
- },
33
- children: /* @__PURE__ */ jsx(CloseIcon, { size: "sm" })
29
+ className: cn(
30
+ "absolute top-2",
31
+ side === "left" ? "left-2" : "right-2"
32
+ ),
33
+ children: /* @__PURE__ */ jsx(
34
+ IconButton,
35
+ {
36
+ label: "\u9589\u3058\u308B",
37
+ onClick: (e) => {
38
+ e.stopPropagation();
39
+ onClose();
40
+ },
41
+ children: /* @__PURE__ */ jsx(CloseIcon, { size: "sm" })
42
+ }
43
+ )
34
44
  }
35
- ) })
45
+ )
36
46
  ]
37
47
  }
38
48
  ),
39
49
  /* @__PURE__ */ jsx(
40
50
  "div",
41
51
  {
42
- className: "p-4",
52
+ className: "flex-1 overflow-y-auto overscroll-contain p-4",
43
53
  id: `${rootId}-content`,
44
54
  onClick: (e) => {
45
55
  e.stopPropagation();
@@ -1,6 +1,6 @@
1
1
  export { ArteOdyssey } from './arte-odyssey';
2
2
  export { GitHubIcon } from './github-mark';
3
3
  export { Logo, LogoIcon } from './logo';
4
- export { AIIcon, AlertIcon, BadIcon, BlogIcon, BoringIcon, CheckIcon, ChevronIcon, CloseIcon, ColorContrastIcon, ColorInfoIcon, CopyIcon, DarkModeIcon, DifficultIcon, EasyIcon, ExternalLinkIcon, FormIcon, GoodIcon, HistoryIcon, InformativeIcon, InterestingIcon, LightModeIcon, LinkIcon, ListIcon, LocationIcon, MailIcon, MinusIcon, MixedColorIcon, NavigationMenuIcon, NewsIcon, PlusIcon, PrepareIcon, PublishDateIcon, RSSIcon, SendIcon, ShallowIcon, SlideIcon, SubscribeIcon, TableIcon, TagIcon, UpdateDateIcon, ViewIcon, } from './lucide';
4
+ export { AccessibilityIcon, AIIcon, AlertIcon, AtomIcon, BadIcon, BlogIcon, BoringIcon, CheckIcon, ChevronIcon, CloseIcon, ColorContrastIcon, ColorInfoIcon, CopyIcon, DarkModeIcon, DifficultIcon, EasyIcon, ExternalLinkIcon, FormIcon, GoodIcon, HistoryIcon, InformativeIcon, InterestingIcon, LightModeIcon, LinkIcon, ListIcon, LocationIcon, MailIcon, MinusIcon, MixedColorIcon, NavigationMenuIcon, NewsIcon, PaletteIcon, PlusIcon, PrepareIcon, PublishDateIcon, RSSIcon, SendIcon, ShallowIcon, ShieldCheckIcon, SlideIcon, SparklesIcon, SubscribeIcon, TableIcon, TagIcon, UpdateDateIcon, ViewIcon, } from './lucide';
5
5
  export { QiitaIcon } from './qiita';
6
6
  export { TwitterIcon } from './twitter';
@@ -2,8 +2,10 @@ import { ArteOdyssey } from "./arte-odyssey";
2
2
  import { GitHubIcon } from "./github-mark";
3
3
  import { Logo, LogoIcon } from "./logo";
4
4
  import {
5
+ AccessibilityIcon,
5
6
  AIIcon,
6
7
  AlertIcon,
8
+ AtomIcon,
7
9
  BadIcon,
8
10
  BlogIcon,
9
11
  BoringIcon,
@@ -31,13 +33,16 @@ import {
31
33
  MixedColorIcon,
32
34
  NavigationMenuIcon,
33
35
  NewsIcon,
36
+ PaletteIcon,
34
37
  PlusIcon,
35
38
  PrepareIcon,
36
39
  PublishDateIcon,
37
40
  RSSIcon,
38
41
  SendIcon,
39
42
  ShallowIcon,
43
+ ShieldCheckIcon,
40
44
  SlideIcon,
45
+ SparklesIcon,
41
46
  SubscribeIcon,
42
47
  TableIcon,
43
48
  TagIcon,
@@ -48,8 +53,10 @@ import { QiitaIcon } from "./qiita";
48
53
  import { TwitterIcon } from "./twitter";
49
54
  export {
50
55
  AIIcon,
56
+ AccessibilityIcon,
51
57
  AlertIcon,
52
58
  ArteOdyssey,
59
+ AtomIcon,
53
60
  BadIcon,
54
61
  BlogIcon,
55
62
  BoringIcon,
@@ -80,6 +87,7 @@ export {
80
87
  MixedColorIcon,
81
88
  NavigationMenuIcon,
82
89
  NewsIcon,
90
+ PaletteIcon,
83
91
  PlusIcon,
84
92
  PrepareIcon,
85
93
  PublishDateIcon,
@@ -87,7 +95,9 @@ export {
87
95
  RSSIcon,
88
96
  SendIcon,
89
97
  ShallowIcon,
98
+ ShieldCheckIcon,
90
99
  SlideIcon,
100
+ SparklesIcon,
91
101
  SubscribeIcon,
92
102
  TableIcon,
93
103
  TagIcon,
@@ -47,4 +47,9 @@ export declare const InformativeIcon: FC<IconProps>;
47
47
  export declare const ShallowIcon: FC<IconProps>;
48
48
  export declare const EasyIcon: FC<IconProps>;
49
49
  export declare const DifficultIcon: FC<IconProps>;
50
+ export declare const AtomIcon: FC<IconProps>;
51
+ export declare const PaletteIcon: FC<IconProps>;
52
+ export declare const ShieldCheckIcon: FC<IconProps>;
53
+ export declare const AccessibilityIcon: FC<IconProps>;
54
+ export declare const SparklesIcon: FC<IconProps>;
50
55
  export {};
@@ -1,8 +1,10 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import {
3
+ Accessibility,
3
4
  AlignRight,
4
5
  Angry,
5
6
  Annoyed,
7
+ Atom,
6
8
  Bell,
7
9
  Blend,
8
10
  Bookmark,
@@ -34,12 +36,15 @@ import {
34
36
  Minus,
35
37
  MoonStar,
36
38
  PaintBucket,
39
+ Palette,
37
40
  Plus,
38
41
  Presentation,
39
42
  Rocket,
40
43
  Rss,
41
44
  Send,
45
+ ShieldCheck,
42
46
  Smile,
47
+ Sparkles,
43
48
  Sun,
44
49
  Table2,
45
50
  Tag,
@@ -524,9 +529,66 @@ const DifficultIcon = ({ size = "md" }) => {
524
529
  }
525
530
  );
526
531
  };
532
+ const AtomIcon = ({ size = "md" }) => {
533
+ return /* @__PURE__ */ jsx(
534
+ BaseIcon,
535
+ {
536
+ renderItem: (props) => {
537
+ return /* @__PURE__ */ jsx(Atom, { ...props });
538
+ },
539
+ size
540
+ }
541
+ );
542
+ };
543
+ const PaletteIcon = ({ size = "md" }) => {
544
+ return /* @__PURE__ */ jsx(
545
+ BaseIcon,
546
+ {
547
+ renderItem: (props) => {
548
+ return /* @__PURE__ */ jsx(Palette, { ...props });
549
+ },
550
+ size
551
+ }
552
+ );
553
+ };
554
+ const ShieldCheckIcon = ({ size = "md" }) => {
555
+ return /* @__PURE__ */ jsx(
556
+ BaseIcon,
557
+ {
558
+ renderItem: (props) => {
559
+ return /* @__PURE__ */ jsx(ShieldCheck, { ...props });
560
+ },
561
+ size
562
+ }
563
+ );
564
+ };
565
+ const AccessibilityIcon = ({ size = "md" }) => {
566
+ return /* @__PURE__ */ jsx(
567
+ BaseIcon,
568
+ {
569
+ renderItem: (props) => {
570
+ return /* @__PURE__ */ jsx(Accessibility, { ...props });
571
+ },
572
+ size
573
+ }
574
+ );
575
+ };
576
+ const SparklesIcon = ({ size = "md" }) => {
577
+ return /* @__PURE__ */ jsx(
578
+ BaseIcon,
579
+ {
580
+ renderItem: (props) => {
581
+ return /* @__PURE__ */ jsx(Sparkles, { ...props });
582
+ },
583
+ size
584
+ }
585
+ );
586
+ };
527
587
  export {
528
588
  AIIcon,
589
+ AccessibilityIcon,
529
590
  AlertIcon,
591
+ AtomIcon,
530
592
  BadIcon,
531
593
  BlogIcon,
532
594
  BoringIcon,
@@ -554,13 +616,16 @@ export {
554
616
  MixedColorIcon,
555
617
  NavigationMenuIcon,
556
618
  NewsIcon,
619
+ PaletteIcon,
557
620
  PlusIcon,
558
621
  PrepareIcon,
559
622
  PublishDateIcon,
560
623
  RSSIcon,
561
624
  SendIcon,
562
625
  ShallowIcon,
626
+ ShieldCheckIcon,
563
627
  SlideIcon,
628
+ SparklesIcon,
564
629
  SubscribeIcon,
565
630
  TableIcon,
566
631
  TagIcon,
@@ -1,7 +1,7 @@
1
1
  import { type FC, type PropsWithChildren, type RefObject } from 'react';
2
2
  export declare const Modal: FC<PropsWithChildren<{
3
3
  ref?: RefObject<HTMLDialogElement | null>;
4
- type?: 'center' | 'bottom' | 'right';
4
+ type?: 'center' | 'bottom' | 'right' | 'left';
5
5
  defaultOpen?: boolean;
6
6
  isOpen?: boolean;
7
7
  onClose?: () => void;
@@ -63,6 +63,24 @@ const rightVariants = {
63
63
  }
64
64
  }
65
65
  };
66
+ const leftVariants = {
67
+ open: {
68
+ opacity: 1,
69
+ x: 0,
70
+ transition: {
71
+ duration: 0.3,
72
+ ease: [0.4, 0, 0.2, 1]
73
+ }
74
+ },
75
+ closed: {
76
+ opacity: 0,
77
+ x: "-100%",
78
+ transition: {
79
+ duration: 0.3,
80
+ ease: [0.4, 0, 0.2, 1]
81
+ }
82
+ }
83
+ };
66
84
  const Modal = ({ ref, type = "center", defaultOpen, isOpen, onClose, children }) => {
67
85
  const dialogRef = useRef(null);
68
86
  const [dialogOpen, setDialogOpen] = useState(defaultOpen ?? false);
@@ -99,7 +117,8 @@ const Modal = ({ ref, type = "center", defaultOpen, isOpen, onClose, children })
99
117
  "border-border-mute bg-bg-base shadow-md backdrop:bg-back-drop",
100
118
  type === "center" && "m-auto max-h-lg w-5/6 max-w-2xl rounded-lg dark:border",
101
119
  type === "bottom" && "mt-auto w-screen max-w-screen rounded-t-lg dark:border-t",
102
- type === "right" && "ml-auto min-h-svh w-screen max-w-sm rounded-l-lg dark:border-l"
120
+ type === "right" && "ml-auto h-svh max-h-none w-screen max-w-sm rounded-l-lg dark:border-l",
121
+ type === "left" && "mr-auto h-svh max-h-none w-screen max-w-sm rounded-r-lg dark:border-r"
103
122
  ),
104
123
  exit: "closed",
105
124
  initial: "closed",
@@ -110,7 +129,7 @@ const Modal = ({ ref, type = "center", defaultOpen, isOpen, onClose, children })
110
129
  },
111
130
  onClose: realOnClose,
112
131
  ref: realRef,
113
- variants: type === "center" ? centerVariants : type === "bottom" ? bottomVariants : rightVariants,
132
+ variants: type === "center" ? centerVariants : type === "bottom" ? bottomVariants : type === "left" ? leftVariants : rightVariants,
114
133
  children: /* @__PURE__ */ jsx(ToastProvider, { portalRef: realRef, position: "absolute", children })
115
134
  }
116
135
  );
@@ -360,6 +360,37 @@
360
360
  --tracking-*: initial;
361
361
  --tracking-none: 0em;
362
362
  --tracking-normal: 0.025em;
363
+
364
+ --leading-*: initial;
365
+ --leading-none: 1;
366
+ --leading-tight: 1.25;
367
+ --leading-snug: 1.375;
368
+ --leading-normal: 1.5;
369
+ --leading-relaxed: 1.625;
370
+ --leading-loose: 2;
371
+
372
+ --shadow-*: initial;
373
+ --shadow-2xs: 0 1px rgb(0 0 0 / 0.05);
374
+ --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);
375
+ --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
376
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
377
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
378
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
379
+ --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);
380
+
381
+ --inset-shadow-*: initial;
382
+ --inset-shadow-2xs: inset 0 1px rgb(0 0 0 / 0.05);
383
+ --inset-shadow-xs: inset 0 1px 1px rgb(0 0 0 / 0.05);
384
+ --inset-shadow-sm: inset 0 2px 4px rgb(0 0 0 / 0.05);
385
+
386
+ --spacing: 0.25rem;
387
+
388
+ --breakpoint-*: initial;
389
+ --breakpoint-sm: 40rem;
390
+ --breakpoint-md: 48rem;
391
+ --breakpoint-lg: 64rem;
392
+ --breakpoint-xl: 80rem;
393
+ --breakpoint-2xl: 96rem;
363
394
  }
364
395
 
365
396
  @utility grid-cols-auto-fill-* {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@k8o/arte-odyssey",
3
- "version": "3.0.0",
3
+ "version": "3.1.0",
4
4
  "description": "k8o's react ui library",
5
5
  "author": "k8o <kosakanoki@gmail.com>",
6
6
  "keywords": [
@@ -40,6 +40,54 @@
40
40
  "default": "./dist/hooks/*/index.js"
41
41
  }
42
42
  },
43
+ "./helpers/cn": {
44
+ "import": {
45
+ "types": "./dist/helpers/cn.d.ts",
46
+ "default": "./dist/helpers/cn.js"
47
+ }
48
+ },
49
+ "./helpers/color/find-all-colors": {
50
+ "import": {
51
+ "types": "./dist/helpers/color/find-all-colors.d.ts",
52
+ "default": "./dist/helpers/color/find-all-colors.js"
53
+ }
54
+ },
55
+ "./helpers/number/between": {
56
+ "import": {
57
+ "types": "./dist/helpers/number/between.d.ts",
58
+ "default": "./dist/helpers/number/between.js"
59
+ }
60
+ },
61
+ "./helpers/number/cast": {
62
+ "import": {
63
+ "types": "./dist/helpers/number/cast.d.ts",
64
+ "default": "./dist/helpers/number/cast.js"
65
+ }
66
+ },
67
+ "./helpers/number/commalize": {
68
+ "import": {
69
+ "types": "./dist/helpers/number/commalize.d.ts",
70
+ "default": "./dist/helpers/number/commalize.js"
71
+ }
72
+ },
73
+ "./helpers/number/to-precision": {
74
+ "import": {
75
+ "types": "./dist/helpers/number/to-precision.d.ts",
76
+ "default": "./dist/helpers/number/to-precision.js"
77
+ }
78
+ },
79
+ "./helpers/uuid-v4": {
80
+ "import": {
81
+ "types": "./dist/helpers/uuid-v4.d.ts",
82
+ "default": "./dist/helpers/uuid-v4.js"
83
+ }
84
+ },
85
+ "./helpers/is-internal-route": {
86
+ "import": {
87
+ "types": "./dist/helpers/is-internal-route.d.ts",
88
+ "default": "./dist/helpers/is-internal-route.js"
89
+ }
90
+ },
43
91
  "./styles.css": "./dist/styles/index.css",
44
92
  "./*": {
45
93
  "import": {
@@ -52,22 +100,22 @@
52
100
  "*.css"
53
101
  ],
54
102
  "dependencies": {
55
- "@floating-ui/react": "0.27.17",
103
+ "@floating-ui/react": "0.27.18",
56
104
  "baseline-status": "1.1.1",
57
105
  "clsx": "2.1.1",
58
106
  "esbuild": "0.27.3",
59
- "lucide-react": "0.564.0",
60
- "motion": "12.34.0",
107
+ "lucide-react": "0.575.0",
108
+ "motion": "12.34.3",
61
109
  "react-error-boundary": "6.1.1",
62
- "tailwind-merge": "3.4.0"
110
+ "tailwind-merge": "3.5.0"
63
111
  },
64
112
  "devDependencies": {
65
113
  "@chromatic-com/storybook": "5.0.1",
66
- "@storybook/addon-a11y": "10.2.8",
67
- "@storybook/addon-docs": "10.2.8",
68
- "@storybook/addon-vitest": "10.2.8",
69
- "@storybook/react-vite": "10.2.8",
70
- "@tailwindcss/postcss": "4.1.18",
114
+ "@storybook/addon-a11y": "10.2.13",
115
+ "@storybook/addon-docs": "10.2.13",
116
+ "@storybook/addon-vitest": "10.2.13",
117
+ "@storybook/react-vite": "10.2.13",
118
+ "@tailwindcss/postcss": "4.2.1",
71
119
  "@types/react": "19.2.14",
72
120
  "@types/react-dom": "19.2.3",
73
121
  "@vitejs/plugin-react-swc": "4.2.3",
@@ -76,9 +124,9 @@
76
124
  "postcss": "8.5.6",
77
125
  "react": "19.2.4",
78
126
  "react-dom": "19.2.4",
79
- "storybook": "10.2.8",
127
+ "storybook": "10.2.13",
80
128
  "storybook-addon-mock-date": "2.0.0",
81
- "tailwindcss": "4.1.18",
129
+ "tailwindcss": "4.2.1",
82
130
  "vite": "7.3.1",
83
131
  "vitest": "4.0.18",
84
132
  "vitest-browser-react": "2.0.5"