create-pixi-vn 2.0.2 → 2.0.4

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.
Files changed (128) hide show
  1. package/index.js +1 -1
  2. package/package.json +5 -4
  3. package/template-react-vite-muijoy/package-lock.json +4 -4
  4. package/template-react-vite-muijoy/package.json +1 -1
  5. package/template-react-vite-muijoy/src/assets/ink-manifest.gen.json +1 -0
  6. package/template-react-vite-muijoy/src/components/menus/main-menu.tsx +1 -2
  7. package/template-react-vite-muijoy/src/components/menus/save-menu/save-slots.tsx +2 -2
  8. package/template-react-vite-muijoy/src/components/scrrens/narration/narration-cards.tsx +1 -1
  9. package/template-react-vite-muijoy/src/components/ui/image.tsx +7 -38
  10. package/template-react-vite-muijoy/src/content/labels/start.label.ts +2 -4
  11. package/template-react-vite-muijoy/src/pixi-vn-keys.gen.d.ts +20 -0
  12. package/template-react-vite-muijoy/vite.config.ts +1 -0
  13. package/template-react-vite-muijoy-ink/package-lock.json +3 -3
  14. package/template-react-vite-muijoy-ink/package.json +2 -2
  15. package/template-react-vite-muijoy-ink/src/components/menus/save-menu/save-slots.tsx +2 -2
  16. package/template-react-vite-muijoy-ink/src/components/scrrens/narration/narration-cards.tsx +1 -1
  17. package/template-react-vite-muijoy-ink/src/components/ui/image.tsx +7 -38
  18. package/template-react-vite-muijoy-ink/src/pixi-vn-keys.gen.d.ts +22 -0
  19. package/template-react-vite-muijoy-ink/vite.config.ts +1 -0
  20. package/template-react-vite-muijoy-ink-tauri/package-lock.json +3 -3
  21. package/template-react-vite-muijoy-ink-tauri/package.json +2 -2
  22. package/template-react-vite-muijoy-ink-tauri/src/components/menus/save-menu/save-slots.tsx +2 -2
  23. package/template-react-vite-muijoy-ink-tauri/src/components/scrrens/narration/narration-cards.tsx +1 -1
  24. package/template-react-vite-muijoy-ink-tauri/src/components/ui/image.tsx +7 -38
  25. package/template-react-vite-muijoy-ink-tauri/src/pixi-vn-keys.gen.d.ts +22 -0
  26. package/template-react-vite-muijoy-ink-tauri/vite.config.ts +1 -0
  27. package/template-react-vite-muijoy-tauri/package-lock.json +4 -4
  28. package/template-react-vite-muijoy-tauri/package.json +1 -1
  29. package/template-react-vite-muijoy-tauri/src/assets/ink-manifest.gen.json +1 -0
  30. package/template-react-vite-muijoy-tauri/src/components/menus/main-menu.tsx +1 -2
  31. package/template-react-vite-muijoy-tauri/src/components/menus/save-menu/save-slots.tsx +2 -2
  32. package/template-react-vite-muijoy-tauri/src/components/scrrens/narration/narration-cards.tsx +1 -1
  33. package/template-react-vite-muijoy-tauri/src/components/ui/image.tsx +7 -38
  34. package/template-react-vite-muijoy-tauri/src/content/labels/start.label.ts +2 -4
  35. package/template-react-vite-muijoy-tauri/src/pixi-vn-keys.gen.d.ts +20 -0
  36. package/template-react-vite-muijoy-tauri/vite.config.ts +1 -0
  37. package/template-react-vite-muijoy-electron/.eslintrc.cjs +0 -29
  38. package/template-react-vite-muijoy-electron/.vscode/extensions.json +0 -9
  39. package/template-react-vite-muijoy-electron/.vscode/launch.json +0 -32
  40. package/template-react-vite-muijoy-electron/.vscode/settings.json +0 -49
  41. package/template-react-vite-muijoy-electron/README.md +0 -207
  42. package/template-react-vite-muijoy-electron/_gitignore +0 -107
  43. package/template-react-vite-muijoy-electron/forge.config.cts +0 -73
  44. package/template-react-vite-muijoy-electron/forge.env.d.ts +0 -1
  45. package/template-react-vite-muijoy-electron/index.html +0 -13
  46. package/template-react-vite-muijoy-electron/ionic.config.json +0 -7
  47. package/template-react-vite-muijoy-electron/package-lock.json +0 -16984
  48. package/template-react-vite-muijoy-electron/package.json +0 -85
  49. package/template-react-vite-muijoy-electron/public/apple-touch-icon.png +0 -0
  50. package/template-react-vite-muijoy-electron/public/favicon.ico +0 -0
  51. package/template-react-vite-muijoy-electron/public/mask-icon.svg +0 -890
  52. package/template-react-vite-muijoy-electron/public/pixi-vn.svg +0 -23
  53. package/template-react-vite-muijoy-electron/public/pwa-192x192.png +0 -0
  54. package/template-react-vite-muijoy-electron/public/pwa-512x512.png +0 -0
  55. package/template-react-vite-muijoy-electron/public/robots.txt +0 -3
  56. package/template-react-vite-muijoy-electron/src/App.css +0 -42
  57. package/template-react-vite-muijoy-electron/src/App.tsx +0 -16
  58. package/template-react-vite-muijoy-electron/src/AppRoutes.tsx +0 -66
  59. package/template-react-vite-muijoy-electron/src/Home.tsx +0 -27
  60. package/template-react-vite-muijoy-electron/src/Imports.tsx +0 -34
  61. package/template-react-vite-muijoy-electron/src/atoms/autoInfoState.ts +0 -50
  62. package/template-react-vite-muijoy-electron/src/atoms/dialogueCardHeightState.ts +0 -23
  63. package/template-react-vite-muijoy-electron/src/atoms/dialogueCardImageWidthState.ts +0 -23
  64. package/template-react-vite-muijoy-electron/src/atoms/hideInterfaceState.ts +0 -6
  65. package/template-react-vite-muijoy-electron/src/atoms/nextStepLoadingState.ts +0 -6
  66. package/template-react-vite-muijoy-electron/src/atoms/openGameSaveScreenState.ts +0 -6
  67. package/template-react-vite-muijoy-electron/src/atoms/openHistoryScreenState.ts +0 -6
  68. package/template-react-vite-muijoy-electron/src/atoms/openSettingsState.ts +0 -6
  69. package/template-react-vite-muijoy-electron/src/atoms/saveLoadAlertState.ts +0 -26
  70. package/template-react-vite-muijoy-electron/src/atoms/saveScreenPageState.ts +0 -23
  71. package/template-react-vite-muijoy-electron/src/atoms/skipEnabledState.ts +0 -6
  72. package/template-react-vite-muijoy-electron/src/atoms/typewriterDelayState.ts +0 -23
  73. package/template-react-vite-muijoy-electron/src/atoms/typewriterIsAnimatedState.ts +0 -6
  74. package/template-react-vite-muijoy-electron/src/components/ChoiceButton.tsx +0 -19
  75. package/template-react-vite-muijoy-electron/src/components/DragHandleDivider.tsx +0 -40
  76. package/template-react-vite-muijoy-electron/src/components/MenuButton.tsx +0 -37
  77. package/template-react-vite-muijoy-electron/src/components/ModalConfirmation.tsx +0 -70
  78. package/template-react-vite-muijoy-electron/src/components/ModalDialog.tsx +0 -103
  79. package/template-react-vite-muijoy-electron/src/components/NextButton.tsx +0 -94
  80. package/template-react-vite-muijoy-electron/src/components/SettingButton.tsx +0 -44
  81. package/template-react-vite-muijoy-electron/src/components/SliderResizer.tsx +0 -53
  82. package/template-react-vite-muijoy-electron/src/components/TextMenuButton.tsx +0 -41
  83. package/template-react-vite-muijoy-electron/src/components/Typewriter.tsx +0 -335
  84. package/template-react-vite-muijoy-electron/src/components/TypographyShadow.tsx +0 -15
  85. package/template-react-vite-muijoy-electron/src/i18n.ts +0 -29
  86. package/template-react-vite-muijoy-electron/src/index.css +0 -9
  87. package/template-react-vite-muijoy-electron/src/interceptors/EventInterceptor.tsx +0 -49
  88. package/template-react-vite-muijoy-electron/src/interceptors/SkipAutoInterceptor.tsx +0 -67
  89. package/template-react-vite-muijoy-electron/src/main.tsx +0 -39
  90. package/template-react-vite-muijoy-electron/src/models/Character.ts +0 -86
  91. package/template-react-vite-muijoy-electron/src/models/GameSaveData.ts +0 -9
  92. package/template-react-vite-muijoy-electron/src/pixi-vn.d.ts +0 -36
  93. package/template-react-vite-muijoy-electron/src/providers/ThemeProvider.tsx +0 -165
  94. package/template-react-vite-muijoy-electron/src/screens/ChoiceMenu.tsx +0 -130
  95. package/template-react-vite-muijoy-electron/src/screens/GameSaveScreen.tsx +0 -274
  96. package/template-react-vite-muijoy-electron/src/screens/HistoryScreen.tsx +0 -155
  97. package/template-react-vite-muijoy-electron/src/screens/LoadingScreen.tsx +0 -40
  98. package/template-react-vite-muijoy-electron/src/screens/MainMenu.tsx +0 -98
  99. package/template-react-vite-muijoy-electron/src/screens/NarrationScreen.tsx +0 -220
  100. package/template-react-vite-muijoy-electron/src/screens/QuickTools.tsx +0 -168
  101. package/template-react-vite-muijoy-electron/src/screens/Settings.tsx +0 -536
  102. package/template-react-vite-muijoy-electron/src/screens/modals/SaveLoadAlert.tsx +0 -135
  103. package/template-react-vite-muijoy-electron/src/screens/modals/TextInput.tsx +0 -61
  104. package/template-react-vite-muijoy-electron/src/use_query/useQueryInterface.ts +0 -73
  105. package/template-react-vite-muijoy-electron/src/use_query/useQueryLastSave.ts +0 -18
  106. package/template-react-vite-muijoy-electron/src/use_query/useQuerySaves.ts +0 -18
  107. package/template-react-vite-muijoy-electron/src/utilities/actions-utility.ts +0 -10
  108. package/template-react-vite-muijoy-electron/src/utilities/component-utility.ts +0 -25
  109. package/template-react-vite-muijoy-electron/src/utilities/indexedDB-utility.ts +0 -196
  110. package/template-react-vite-muijoy-electron/src/utilities/navigate-utility.ts +0 -18
  111. package/template-react-vite-muijoy-electron/src/utilities/save-utility.ts +0 -125
  112. package/template-react-vite-muijoy-electron/src/values/characters.ts +0 -11
  113. package/template-react-vite-muijoy-electron/src/values/translations/strings_en.json +0 -60
  114. package/template-react-vite-muijoy-electron/src/vite-env.d.ts +0 -4
  115. package/template-react-vite-muijoy-electron/src-electron/icons/icon.icns +0 -0
  116. package/template-react-vite-muijoy-electron/src-electron/icons/icon.ico +0 -0
  117. package/template-react-vite-muijoy-electron/src-electron/icons/icon.png +0 -0
  118. package/template-react-vite-muijoy-electron/src-electron/index.css +0 -7
  119. package/template-react-vite-muijoy-electron/src-electron/main.ts +0 -59
  120. package/template-react-vite-muijoy-electron/src-electron/preload.ts +0 -2
  121. package/template-react-vite-muijoy-electron/src-electron/renderer.ts +0 -31
  122. package/template-react-vite-muijoy-electron/tsconfig.json +0 -32
  123. package/template-react-vite-muijoy-electron/tsconfig.node.json +0 -11
  124. package/template-react-vite-muijoy-electron/vite.base.config.ts +0 -93
  125. package/template-react-vite-muijoy-electron/vite.config.ts +0 -54
  126. package/template-react-vite-muijoy-electron/vite.main.config.ts +0 -9
  127. package/template-react-vite-muijoy-electron/vite.preload.config.ts +0 -9
  128. package/template-react-vite-muijoy-electron/vite.renderer.config.ts +0 -9
@@ -1,103 +0,0 @@
1
- import { DialogActions, DialogContent, Divider, ModalClose } from '@mui/joy';
2
- import Modal from '@mui/joy/Modal';
3
- import { default as ModalDialogJoy, ModalDialogProps } from '@mui/joy/ModalDialog';
4
- import { AnimatePresence, motion } from "motion/react";
5
- import { useEffect, useState } from 'react';
6
-
7
- export interface ModalDialogCustomProps extends ModalDialogProps {
8
- open: boolean;
9
- setOpen: (open: boolean) => void;
10
- children?: React.ReactNode;
11
- head?: string | React.ReactNode;
12
- actions?: React.ReactNode;
13
- canBeIgnored?: boolean;
14
- }
15
-
16
- export default function ModalDialogCustom(props: ModalDialogCustomProps) {
17
- const {
18
- open
19
- , setOpen
20
- , children
21
- , actions
22
- , head
23
- , sx
24
- , canBeIgnored = true
25
- , ...rest
26
- } = props;
27
- const [internalOpen, setInternalOpen] = useState(open)
28
- useEffect(() => {
29
- if (open) {
30
- setInternalOpen(open)
31
- return
32
- }
33
- const timeout = setTimeout(() => {
34
- setInternalOpen(open)
35
- }, 400)
36
- return () => {
37
- clearTimeout(timeout)
38
- }
39
- }, [open])
40
-
41
- return (
42
- <AnimatePresence>
43
- <Modal
44
- keepMounted
45
- open={internalOpen}
46
- onClose={() => canBeIgnored && setOpen(false)}
47
- component={motion.div}
48
- variants={{
49
- open: {
50
- opacity: 1,
51
- pointerEvents: "auto",
52
- backdropFilter: "blur(8px)",
53
- },
54
- closed: {
55
- opacity: 0,
56
- pointerEvents: "none",
57
- backdropFilter: "blur(0px)",
58
- }
59
- }}
60
- initial={"closed"}
61
- animate={open ? "open" : "closed"}
62
- exit={"closed"}
63
- transition={{
64
- duration: 0.4,
65
- }}
66
- >
67
- <ModalDialogJoy
68
- sx={{
69
- ...sx,
70
- }}
71
- component={motion.div}
72
- variants={{
73
- open: {
74
- opacity: 1,
75
- pointerEvents: "auto",
76
- },
77
- closed: {
78
- opacity: 0,
79
- pointerEvents: "none",
80
- }
81
- }}
82
- initial={"closed"}
83
- animate={internalOpen ? "open" : "closed"}
84
- exit={"closed"}
85
- transition={{
86
- duration: 0.3,
87
- }}
88
- {...rest}
89
- >
90
- {canBeIgnored && <ModalClose />}
91
- {head}
92
- {head && <Divider />}
93
- <DialogContent>
94
- {children}
95
- </DialogContent>
96
- {actions && <DialogActions>
97
- {actions}
98
- </DialogActions>}
99
- </ModalDialogJoy>
100
- </Modal>
101
- </AnimatePresence>
102
- );
103
- }
@@ -1,94 +0,0 @@
1
- import { StepLabelProps } from '@drincs/pixi-vn/dist/override';
2
- import { Button } from '@mui/joy';
3
- import { motion } from "motion/react";
4
- import { useSnackbar } from 'notistack';
5
- import { useEffect } from 'react';
6
- import { useTranslation } from 'react-i18next';
7
- import { useRecoilState, useRecoilValue } from 'recoil';
8
- import { hideInterfaceState } from '../atoms/hideInterfaceState';
9
- import { nextStepLoadingState } from '../atoms/nextStepLoadingState';
10
- import { skipEnabledState } from '../atoms/skipEnabledState';
11
- import { useQueryCanGoNext } from '../use_query/useQueryInterface';
12
- import { useMyNavigate } from '../utilities/navigate-utility';
13
-
14
- export default function NextButton({ nextOnClick }: {
15
- nextOnClick: (props: StepLabelProps) => void,
16
- }) {
17
- const [skip, setSkip] = useRecoilState(skipEnabledState)
18
- const nextStepLoading = useRecoilValue(nextStepLoadingState)
19
- const { data: canGoNext = false } = useQueryCanGoNext()
20
- const hideNextButton = useRecoilValue(hideInterfaceState) || !canGoNext
21
- const { enqueueSnackbar } = useSnackbar();
22
- const navigate = useMyNavigate();
23
- const { t } = useTranslation(["ui"]);
24
- const { t: tNarration } = useTranslation(["narration"]);
25
- useEffect(() => {
26
- window.addEventListener("keypress", onkeypress);
27
- window.addEventListener("keyup", onkeyup);
28
-
29
- return () => {
30
- window.removeEventListener("keypress", onkeypress);
31
- window.removeEventListener("keyup", onkeyup);
32
- };
33
- }, []);
34
-
35
- function onkeypress(event: KeyboardEvent) {
36
- if ((event.code == 'Enter' || event.code == 'Space')) {
37
- setSkip(true)
38
- }
39
- }
40
-
41
- function onkeyup(event: KeyboardEvent) {
42
- if ((event.code == 'Enter' || event.code == 'Space')) {
43
- setSkip(false)
44
- nextOnClick({
45
- t: tNarration,
46
- navigate,
47
- notify: (message, variant) => enqueueSnackbar(message, { variant }),
48
- })
49
- }
50
- }
51
-
52
- return (
53
- <Button
54
- variant="solid"
55
- color="primary"
56
- size="sm"
57
- loading={nextStepLoading}
58
- sx={{
59
- position: "absolute",
60
- bottom: 0,
61
- right: 0,
62
- width: { xs: 70, sm: 100, md: 150 },
63
- border: 3,
64
- zIndex: 100,
65
- }}
66
- onClick={() => {
67
- if (skip) {
68
- setSkip(false)
69
- }
70
- nextOnClick({
71
- t: tNarration,
72
- navigate,
73
- notify: (message, variant) => enqueueSnackbar(message, { variant }),
74
- })
75
- }}
76
- component={motion.div}
77
- variants={{
78
- open: {
79
- opacity: 1,
80
- pointerEvents: "auto",
81
- },
82
- closed: {
83
- opacity: 0,
84
- pointerEvents: "none",
85
- }
86
- }}
87
- initial={"closed"}
88
- animate={hideNextButton ? "closed" : "open"}
89
- exit={"closed"}
90
- >
91
- {t("next")}
92
- </Button>
93
- );
94
- }
@@ -1,44 +0,0 @@
1
- import { Card, CardContent, CardProps, Checkbox, useTheme } from "@mui/joy";
2
-
3
- export default function SettingButton({ children, checked, disabled, sx, onChange, onClick, ...rest }: {
4
- checked?: boolean;
5
- disabled?: boolean;
6
- } & CardProps) {
7
- return (
8
- <Card
9
- sx={{
10
- boxShadow: 'none',
11
- '&:hover': disabled ? undefined : { bgcolor: 'background.level1' },
12
- backgroundColor: disabled ? useTheme().palette.neutral[100] : undefined,
13
- ...sx,
14
- }}
15
- onClick={disabled ? undefined : onClick}
16
- {...rest}
17
- >
18
- <CardContent>
19
- {children}
20
- </CardContent>
21
- <Checkbox
22
- disableIcon
23
- overlay
24
- checked={true}
25
- variant="outlined"
26
- color="neutral"
27
- onChange={onChange}
28
- sx={{ mt: -2 }}
29
- disabled={disabled}
30
- slotProps={{
31
- action: {
32
- sx: {
33
- borderWidth: checked ? 2 : undefined,
34
- borderColor: checked ? useTheme().palette.primary.outlinedBorder : undefined,
35
- '&:hover': disabled ? undefined : {
36
- bgcolor: 'transparent',
37
- },
38
- },
39
- },
40
- }}
41
- />
42
- </Card>
43
- );
44
- }
@@ -1,53 +0,0 @@
1
- import { Slider, SliderProps, Stack, useTheme } from "@mui/joy";
2
- import { AnimationProps, motion } from "motion/react";
3
-
4
- interface SliderResizerProps extends SliderProps, AnimationProps { }
5
-
6
- export default function SliderResizer(props: SliderResizerProps) {
7
- const {
8
- orientation,
9
- sx,
10
- key,
11
- ...rest
12
- } = props;
13
-
14
- return (
15
- <Stack
16
- key={"stack-" + key}
17
- direction={orientation === "vertical" ? "row" : "column"}
18
- justifyContent="center"
19
- alignItems="center"
20
- spacing={0}
21
- sx={{
22
- pointerEvents: "none",
23
- width: '100%',
24
- height: '100%',
25
- position: "absolute",
26
- left: 0,
27
- right: 0,
28
- }}
29
- >
30
- <Slider
31
- key={key}
32
- orientation={orientation}
33
- valueLabelDisplay="auto"
34
- valueLabelFormat={(index) => index + "%"}
35
- sx={{
36
- position: "static",
37
- zIndex: useTheme().zIndex.table + 1,
38
- "--Slider-trackSize": "0px",
39
- "--Slider-thumbWidth": orientation === "vertical" ? "42px" : "16px",
40
- "--Slider-thumbSize": orientation === "vertical" ? "16px" : "42px",
41
- "& .MuiSlider-thumb": {
42
- cursor: orientation === "vertical" ? "row-resize" : "col-resize",
43
- pointerEvents: "auto",
44
- },
45
- ...sx,
46
- pointerEvents: "none",
47
- }}
48
- component={motion.div}
49
- {...rest}
50
- />
51
- </Stack>
52
- );
53
- }
@@ -1,41 +0,0 @@
1
- import { Link, LinkProps, LinkTypeMap, Typography, useTheme } from "@mui/joy";
2
-
3
- interface TextMenuButtonProps extends LinkProps<LinkTypeMap['defaultComponent'], {
4
- component?: React.ElementType;
5
- focusVisible?: boolean;
6
- }> {
7
- to?: string;
8
- selected?: boolean;
9
- }
10
-
11
- export default function TextMenuButton(props: TextMenuButtonProps) {
12
- const {
13
- sx,
14
- children,
15
- disabled,
16
- selected,
17
- ...rest
18
- } = props;
19
-
20
- return (
21
- <Link
22
- sx={{
23
- fontSize: { xs: "0.6rem", sm: "0.7rem", md: "0.8rem", lg: "1rem", xl: "1.1rem" },
24
- userSelect: "none",
25
- ...sx
26
- }}
27
- disabled={disabled}
28
- {...rest}
29
- >
30
- <Typography
31
- textColor={
32
- selected ? useTheme().palette.primary[500] :
33
- disabled ? useTheme().palette.neutral[500] :
34
- useTheme().palette.neutral[300]
35
- }
36
- >
37
- {children}
38
- </Typography>
39
- </Link>
40
- );
41
- }
@@ -1,335 +0,0 @@
1
- import { useTheme } from "@mui/joy";
2
- import { motion, Variants } from "motion/react";
3
- import { useMemo, useRef } from "react";
4
- import Markdown from "react-markdown";
5
- import rehypeRaw from "rehype-raw";
6
- import remarkGfm from "remark-gfm";
7
-
8
- function TypewriterInternal({ children, letterVariants, dadElement, scrollOnLastItem }: {
9
- children: any
10
- letterVariants: Variants
11
- dadElement: (children: JSX.Element | JSX.Element[]) => JSX.Element | JSX.Element[]
12
- isRoot?: boolean
13
- scrollOnLastItem?: (scrollTop: number) => void
14
- }) {
15
- if (typeof children === "string") {
16
- const spanList = children.split("").map((char, i) => {
17
- const ref = useRef<HTMLSpanElement>(null);
18
- return <motion.span
19
- ref={ref}
20
- key={`span-${char}-${i}`}
21
- variants={letterVariants}
22
- onAnimationComplete={scrollOnLastItem ? () => {
23
- if (ref.current?.offsetParent) {
24
- scrollOnLastItem(ref.current.offsetTop)
25
- }
26
- } : undefined}
27
- >
28
- {char}
29
- </motion.span>
30
- })
31
- return dadElement(spanList)
32
- }
33
- else if (Array.isArray(children)) {
34
- const list = children.map((child) => {
35
- if (typeof child === "string") {
36
- let spanList = child.split("").map((char, i) => {
37
- const ref = useRef<HTMLSpanElement>(null);
38
- return <motion.span
39
- ref={ref}
40
- key={`span-${char}-${i}`}
41
- variants={letterVariants}
42
- onAnimationComplete={scrollOnLastItem ? () => {
43
- if (ref.current?.offsetParent) {
44
- scrollOnLastItem(ref.current.offsetTop)
45
- }
46
- } : undefined}
47
- >
48
- {char}
49
- </motion.span>
50
- })
51
- return spanList
52
- }
53
- return child
54
- })
55
- return dadElement(list)
56
- }
57
- return dadElement(children)
58
- };
59
-
60
- export default function Typewriter({ text, delay = 0, onAnimationComplete, onAnimationStart, scroll }: {
61
- text: string
62
- delay?: number
63
- onAnimationComplete?: () => void
64
- onAnimationStart?: () => void
65
- scroll?: (offsetTop: number) => void
66
- }) {
67
- const sentenceVariants: Variants = {
68
- hidden: {},
69
- visible: { opacity: 1, transition: { staggerChildren: delay / 1000 } },
70
- };
71
- const letterVariants = useMemo<Variants>(() => ({
72
- hidden: { opacity: 0 },
73
- visible: { opacity: 1, transition: { opacity: { duration: 0 } } },
74
- }), [delay]);
75
-
76
- return (
77
- <motion.div
78
- key={text}
79
- variants={sentenceVariants}
80
- initial="hidden"
81
- animate={"visible"}
82
- onAnimationStart={onAnimationStart}
83
- onAnimationComplete={onAnimationComplete}
84
- >
85
- <Markdown
86
- remarkPlugins={[remarkGfm]}
87
- rehypePlugins={[rehypeRaw]}
88
- components={{
89
- p: ({ children }) => {
90
- return <TypewriterInternal
91
- children={children}
92
- letterVariants={letterVariants}
93
- scrollOnLastItem={scroll}
94
- dadElement={(children) => {
95
- if (Array.isArray(children)) {
96
- children.push(<motion.br />)
97
- return children
98
- }
99
- return children
100
- }}
101
- />
102
- },
103
- a: ({ children, href, style }) => {
104
- return <TypewriterInternal
105
- children={children}
106
- letterVariants={letterVariants}
107
- scrollOnLastItem={scroll}
108
- dadElement={(children) => <motion.a
109
- href={href}
110
- target="_blank"
111
- style={{
112
- ...style,
113
- color: useTheme().palette.primary[500],
114
- }}
115
- variants={letterVariants}
116
- >
117
- {children}
118
- </motion.a>
119
- }
120
- />
121
- },
122
- code: ({ children, style }) => {
123
- return <TypewriterInternal
124
- children={children}
125
- letterVariants={letterVariants}
126
- scrollOnLastItem={scroll}
127
- dadElement={(children) => <motion.code
128
- style={{
129
- ...style,
130
- backgroundColor: useTheme().palette.neutral[600],
131
- color: useTheme().palette.neutral[200],
132
- }}
133
- variants={letterVariants}
134
- >
135
- {children}
136
- </motion.code>
137
- }
138
- />
139
- },
140
- ul: ({ children, style }) => {
141
- return <TypewriterInternal
142
- children={children}
143
- letterVariants={letterVariants}
144
- scrollOnLastItem={scroll}
145
- dadElement={(children) => <motion.ul
146
- style={{
147
- ...style,
148
- margin: 0,
149
- }}
150
- variants={letterVariants}
151
- >
152
- {children}
153
- </motion.ul>
154
- }
155
- />
156
- },
157
- li: ({ children, style }) => {
158
- return <TypewriterInternal
159
- children={children}
160
- letterVariants={letterVariants}
161
- scrollOnLastItem={scroll}
162
- dadElement={(children) => <motion.li
163
- style={style}
164
- variants={letterVariants}
165
- >
166
- {children}
167
- </motion.li>
168
- }
169
- />
170
- },
171
- strong: ({ children, style }) => {
172
- return <TypewriterInternal
173
- children={children}
174
- letterVariants={letterVariants}
175
- scrollOnLastItem={scroll}
176
- dadElement={(children) => <motion.strong
177
- style={style}
178
- variants={letterVariants}
179
- >
180
- {children}
181
- </motion.strong>
182
- }
183
- />
184
- },
185
- em: ({ children, style }) => {
186
- return <TypewriterInternal
187
- children={children}
188
- letterVariants={letterVariants}
189
- scrollOnLastItem={scroll}
190
- dadElement={(children) => <motion.em
191
- style={style}
192
- variants={letterVariants}
193
- >
194
- {children}
195
- </motion.em>
196
- }
197
- />
198
- },
199
- hr: ({ style }) => {
200
- return <motion.hr
201
- style={style}
202
- variants={letterVariants}
203
- />
204
- },
205
- th: ({ children, style }) => {
206
- return <TypewriterInternal
207
- children={children}
208
- letterVariants={letterVariants}
209
- scrollOnLastItem={scroll}
210
- dadElement={(children) => <motion.th
211
- style={style}
212
- variants={letterVariants}
213
- >
214
- {children}
215
- </motion.th>
216
- }
217
- />
218
- },
219
- del: ({ children, style }) => {
220
- return <TypewriterInternal
221
- children={children}
222
- letterVariants={letterVariants}
223
- scrollOnLastItem={scroll}
224
- dadElement={(children) => <motion.del
225
- style={style}
226
- variants={letterVariants}
227
- >
228
- {children}
229
- </motion.del>
230
- }
231
- />
232
- },
233
- table: ({ children, style }) => {
234
- return <TypewriterInternal
235
- children={children}
236
- letterVariants={letterVariants}
237
- scrollOnLastItem={scroll}
238
- dadElement={(children) => <motion.table
239
- style={style}
240
- variants={letterVariants}
241
- >
242
- {children}
243
- </motion.table>
244
- }
245
- />
246
- },
247
- span: ({ children, style }) => {
248
- return <TypewriterInternal
249
- children={children}
250
- letterVariants={letterVariants}
251
- scrollOnLastItem={scroll}
252
- dadElement={(children) => <motion.span
253
- style={style}
254
- variants={letterVariants}
255
- >
256
- {children}
257
- </motion.span>
258
- }
259
- />
260
- },
261
- h1: ({ children, style }) => {
262
- return <TypewriterInternal
263
- children={children}
264
- letterVariants={letterVariants}
265
- scrollOnLastItem={scroll}
266
- dadElement={(children) => <motion.h1
267
- style={{
268
- ...style,
269
- margin: 0,
270
- }}
271
- variants={letterVariants}
272
- >
273
- {children}
274
- </motion.h1>
275
- }
276
- />
277
- },
278
- h2: ({ children, style }) => {
279
- return <TypewriterInternal
280
- children={children}
281
- letterVariants={letterVariants}
282
- scrollOnLastItem={scroll}
283
- dadElement={(children) => <motion.h2
284
- style={{
285
- ...style,
286
- margin: 0,
287
- }}
288
- variants={letterVariants}
289
- >
290
- {children}
291
- </motion.h2>
292
- }
293
- />
294
- },
295
- h3: ({ children, style }) => {
296
- return <TypewriterInternal
297
- children={children}
298
- letterVariants={letterVariants}
299
- scrollOnLastItem={scroll}
300
- dadElement={(children) => <motion.h3
301
- style={{
302
- ...style,
303
- margin: 0,
304
- }}
305
- variants={letterVariants}
306
- >
307
- {children}
308
- </motion.h3>
309
- }
310
- />
311
- },
312
- h4: ({ children, style }) => {
313
- return <TypewriterInternal
314
- children={children}
315
- letterVariants={letterVariants}
316
- scrollOnLastItem={scroll}
317
- dadElement={(children) => <motion.h4
318
- style={{
319
- ...style,
320
- margin: 0,
321
- }}
322
- variants={letterVariants}
323
- >
324
- {children}
325
- </motion.h4>
326
- }
327
- />
328
- },
329
- }}
330
- >
331
- {text}
332
- </Markdown>
333
- </motion.div>
334
- )
335
- };
@@ -1,15 +0,0 @@
1
- import { Typography, TypographyProps, useTheme } from "@mui/joy";
2
-
3
- export default function TypographyShadow({ sx, shadowColor = useTheme().palette.neutral[900], ...rest }: TypographyProps & { shadowColor?: string }) {
4
- return (
5
- <Typography
6
- sx={{
7
- textShadow: `0 0 3px ${shadowColor}, 0 0 5px ${shadowColor}`,
8
- pointerEvents: "auto",
9
- color: useTheme().palette.neutral[300],
10
- ...sx,
11
- }}
12
- {...rest}
13
- />
14
- );
15
- }