Random updates
This commit is contained in:
28
package-lock.json
generated
28
package-lock.json
generated
@@ -13,9 +13,9 @@
|
|||||||
"@mantine/form": "^8.2.2",
|
"@mantine/form": "^8.2.2",
|
||||||
"@mantine/hooks": "^8.2.2",
|
"@mantine/hooks": "^8.2.2",
|
||||||
"@mantine/notifications": "^8.2.2",
|
"@mantine/notifications": "^8.2.2",
|
||||||
"@tanstack/react-query": "^5.84.0",
|
"@tanstack/react-query": "^5.84.1",
|
||||||
"@tanstack/react-query-devtools": "^5.84.0",
|
"@tanstack/react-query-devtools": "^5.84.1",
|
||||||
"@tanstack/react-query-persist-client": "^5.84.0",
|
"@tanstack/react-query-persist-client": "^5.84.1",
|
||||||
"idb-keyval": "^6.2.2",
|
"idb-keyval": "^6.2.2",
|
||||||
"jotai": "^2.12.5",
|
"jotai": "^2.12.5",
|
||||||
"react": "^19.1.1",
|
"react": "^19.1.1",
|
||||||
@@ -1662,9 +1662,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tanstack/react-query": {
|
"node_modules/@tanstack/react-query": {
|
||||||
"version": "5.84.0",
|
"version": "5.84.1",
|
||||||
"resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.84.0.tgz",
|
"resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.84.1.tgz",
|
||||||
"integrity": "sha512-iPycFGLq5lltDE16Jf13Nx7SOvtfoopfOH/+Ahbdd+z4QqOfYu/SOkY86AVYVcKjneuqPxTm8e85lSGhwe0cog==",
|
"integrity": "sha512-zo7EUygcWJMQfFNWDSG7CBhy8irje/XY0RDVKKV4IQJAysb+ZJkkJPcnQi+KboyGUgT+SQebRFoTqLuTtfoDLw==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@tanstack/query-core": "5.83.1"
|
"@tanstack/query-core": "5.83.1"
|
||||||
@@ -1678,9 +1678,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tanstack/react-query-devtools": {
|
"node_modules/@tanstack/react-query-devtools": {
|
||||||
"version": "5.84.0",
|
"version": "5.84.1",
|
||||||
"resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.84.0.tgz",
|
"resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.84.1.tgz",
|
||||||
"integrity": "sha512-7SwgDOm1Waz9wKOwR8WPaN4yo6zq1UBQxGLWy/SJWZOoo2bUVRVlGPvFicuOUwQWv5VDzzNYq4GvTQnX4T3xtw==",
|
"integrity": "sha512-nle+OQ9B3Z3EG2R3ixvaNcJ6OeqGwmAc5iMDW6Vj+emLZkWRrN3BDsrzZQu414n34lpxplnC7z1jmKuU/scHCQ==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@tanstack/query-devtools": "5.84.0"
|
"@tanstack/query-devtools": "5.84.0"
|
||||||
@@ -1690,14 +1690,14 @@
|
|||||||
"url": "https://github.com/sponsors/tannerlinsley"
|
"url": "https://github.com/sponsors/tannerlinsley"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@tanstack/react-query": "^5.84.0",
|
"@tanstack/react-query": "^5.84.1",
|
||||||
"react": "^18 || ^19"
|
"react": "^18 || ^19"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tanstack/react-query-persist-client": {
|
"node_modules/@tanstack/react-query-persist-client": {
|
||||||
"version": "5.84.0",
|
"version": "5.84.1",
|
||||||
"resolved": "https://registry.npmjs.org/@tanstack/react-query-persist-client/-/react-query-persist-client-5.84.0.tgz",
|
"resolved": "https://registry.npmjs.org/@tanstack/react-query-persist-client/-/react-query-persist-client-5.84.1.tgz",
|
||||||
"integrity": "sha512-vpe2KnCkbcZmbk4SXObKxJL9BKP6IlZxBOi5Ua7oZFa8LKoECBHR+oK0YoEhtQKVaBaRbSc7G0YsuUZWct7vRQ==",
|
"integrity": "sha512-Qpn2kg7eI+dI4AHeXmI0FYn1JVwluSESA3iJ+KJv9zZiluPhiFmzFT++j9QYwu/LHUwp4PmjqSPHkuBLiYkTRQ==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@tanstack/query-persist-client-core": "5.83.1"
|
"@tanstack/query-persist-client-core": "5.83.1"
|
||||||
@@ -1707,7 +1707,7 @@
|
|||||||
"url": "https://github.com/sponsors/tannerlinsley"
|
"url": "https://github.com/sponsors/tannerlinsley"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@tanstack/react-query": "^5.84.0",
|
"@tanstack/react-query": "^5.84.1",
|
||||||
"react": "^18 || ^19"
|
"react": "^18 || ^19"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -15,9 +15,9 @@
|
|||||||
"@mantine/form": "^8.2.2",
|
"@mantine/form": "^8.2.2",
|
||||||
"@mantine/hooks": "^8.2.2",
|
"@mantine/hooks": "^8.2.2",
|
||||||
"@mantine/notifications": "^8.2.2",
|
"@mantine/notifications": "^8.2.2",
|
||||||
"@tanstack/react-query": "^5.84.0",
|
"@tanstack/react-query": "^5.84.1",
|
||||||
"@tanstack/react-query-devtools": "^5.84.0",
|
"@tanstack/react-query-devtools": "^5.84.1",
|
||||||
"@tanstack/react-query-persist-client": "^5.84.0",
|
"@tanstack/react-query-persist-client": "^5.84.1",
|
||||||
"idb-keyval": "^6.2.2",
|
"idb-keyval": "^6.2.2",
|
||||||
"jotai": "^2.12.5",
|
"jotai": "^2.12.5",
|
||||||
"react": "^19.1.1",
|
"react": "^19.1.1",
|
||||||
|
|||||||
@@ -130,7 +130,9 @@ export function useMutationAPI() {
|
|||||||
endpoint === 'api/bookmarkCategoryOrder' &&
|
endpoint === 'api/bookmarkCategoryOrder' &&
|
||||||
queryClient.refetchQueries({ queryKey: ['GET', 'api/bookmarkCategories'] });
|
queryClient.refetchQueries({ queryKey: ['GET', 'api/bookmarkCategories'] });
|
||||||
endpoint === 'api/applicationOrder' &&
|
endpoint === 'api/applicationOrder' &&
|
||||||
queryClient.refetchQueries({ queryKey: ['GET', 'api/applicationOrder'] });
|
queryClient.refetchQueries({ queryKey: ['GET', 'api/applications'] });
|
||||||
|
endpoint === 'api/applications' &&
|
||||||
|
queryClient.refetchQueries({ queryKey: ['GET', 'api/enabledApplications'] });
|
||||||
endpoint === 'api/bookmarks' &&
|
endpoint === 'api/bookmarks' &&
|
||||||
queryClient.refetchQueries({ queryKey: ['GET', 'api/themes'] });
|
queryClient.refetchQueries({ queryKey: ['GET', 'api/themes'] });
|
||||||
endpoint === 'api/providers' &&
|
endpoint === 'api/providers' &&
|
||||||
@@ -145,7 +147,9 @@ export function useMutationAPI() {
|
|||||||
endpoint === 'api/bookmarkCategoryOrder' &&
|
endpoint === 'api/bookmarkCategoryOrder' &&
|
||||||
queryClient.refetchQueries({ queryKey: ['GET', 'api/bookmarkCategories'] });
|
queryClient.refetchQueries({ queryKey: ['GET', 'api/bookmarkCategories'] });
|
||||||
endpoint === 'api/applicationOrder' &&
|
endpoint === 'api/applicationOrder' &&
|
||||||
queryClient.refetchQueries({ queryKey: ['GET', 'api/applicationOrder'] });
|
queryClient.refetchQueries({ queryKey: ['GET', 'api/applications'] });
|
||||||
|
endpoint === 'api/applications' &&
|
||||||
|
queryClient.refetchQueries({ queryKey: ['GET', 'api/enabledApplications'] });
|
||||||
endpoint === 'api/bookmarks' &&
|
endpoint === 'api/bookmarks' &&
|
||||||
queryClient.refetchQueries({ queryKey: ['GET', 'api/themes'] });
|
queryClient.refetchQueries({ queryKey: ['GET', 'api/themes'] });
|
||||||
endpoint === 'api/providers' &&
|
endpoint === 'api/providers' &&
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { Button, Group, Modal, Text, TextInput } from '@mantine/core';
|
import { Button, Group, Modal, Text, TextInput } from '@mantine/core';
|
||||||
import { useCommonHooks } from 'hooks';
|
import { useCommonHooks } from 'hooks';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
|
import { FaTag } from 'react-icons/fa';
|
||||||
import { modalClasses, textInputClasses } from 'styles';
|
import { modalClasses, textInputClasses } from 'styles';
|
||||||
import type { Theme, ThemePlaylist } from 'types';
|
import type { Theme, ThemePlaylist } from 'types';
|
||||||
import { ThemePreviewMiddleware } from '../../Themes';
|
import { ThemePreviewMiddleware } from '../../Themes';
|
||||||
@@ -55,6 +56,14 @@ export function ThemePlaylistModal({
|
|||||||
<Modal.Overlay />
|
<Modal.Overlay />
|
||||||
<Modal.Content>
|
<Modal.Content>
|
||||||
<Modal.Header style={{ justifyContent: 'center' }}>
|
<Modal.Header style={{ justifyContent: 'center' }}>
|
||||||
|
{selectedPlaylist?.name !== 'Time of Day' && (
|
||||||
|
<Group pos={'absolute'} justify='center' left={'.5rem'}>
|
||||||
|
<FaTag color={'var(--mantine-color-background-0)'} size={'2.5rem'} />
|
||||||
|
<Text size='1.25rem' pos={'absolute'} c={'var(--mantine-color-primary-0)'}>
|
||||||
|
{themeList.length}
|
||||||
|
</Text>
|
||||||
|
</Group>
|
||||||
|
)}
|
||||||
<Group pos={'absolute'}>
|
<Group pos={'absolute'}>
|
||||||
<Text c={'var(--mantine-color-background-0)'}>Name:</Text>
|
<Text c={'var(--mantine-color-background-0)'}>Name:</Text>
|
||||||
<TextInput
|
<TextInput
|
||||||
|
|||||||
@@ -18,12 +18,14 @@ export function ThemeCard({
|
|||||||
themePlaylists,
|
themePlaylists,
|
||||||
setSelectedTheme,
|
setSelectedTheme,
|
||||||
openThemeModal,
|
openThemeModal,
|
||||||
|
enabled = true,
|
||||||
}: {
|
}: {
|
||||||
cardTheme: Theme;
|
cardTheme: Theme;
|
||||||
allThemes: Theme[];
|
allThemes: Theme[];
|
||||||
themePlaylists: ThemePlaylist[];
|
themePlaylists: ThemePlaylist[];
|
||||||
setSelectedTheme: (theme: Theme) => void;
|
setSelectedTheme: (theme: Theme) => void;
|
||||||
openThemeModal: () => void;
|
openThemeModal: () => void;
|
||||||
|
enabled?: boolean;
|
||||||
}) {
|
}) {
|
||||||
const { hovered, ref: hoverRef } = useHover();
|
const { hovered, ref: hoverRef } = useHover();
|
||||||
const { ref, width } = useElementSize();
|
const { ref, width } = useElementSize();
|
||||||
@@ -107,7 +109,7 @@ export function ThemeCard({
|
|||||||
handleOpen={handleOpen}
|
handleOpen={handleOpen}
|
||||||
themePlaylists={themePlaylists}
|
themePlaylists={themePlaylists}
|
||||||
openModal={openModal}
|
openModal={openModal}
|
||||||
hovered={hovered}
|
hovered={hovered && enabled}
|
||||||
hoverPreview={hoverPreview}
|
hoverPreview={hoverPreview}
|
||||||
setHoverPreview={setHoverPreview}
|
setHoverPreview={setHoverPreview}
|
||||||
transition={transition}
|
transition={transition}
|
||||||
@@ -145,7 +147,7 @@ export function ThemeCard({
|
|||||||
setCurrentThemePlaylist('All');
|
setCurrentThemePlaylist('All');
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{hovered && currentTheme !== 'random' && (
|
{hovered && enabled && currentTheme !== 'random' && (
|
||||||
<Overlay
|
<Overlay
|
||||||
style={{
|
style={{
|
||||||
opacity: !hoverPreview || transition ? 0.5 : 0,
|
opacity: !hoverPreview || transition ? 0.5 : 0,
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import { Group, Modal, Text, TextInput } from '@mantine/core';
|
import { ActionIcon, Card, Group, Modal, Text, TextInput } from '@mantine/core';
|
||||||
import { useDisclosure } from '@mantine/hooks';
|
import { useDisclosure } from '@mantine/hooks';
|
||||||
import { useCommonHooks, useMutationAPI } from 'hooks';
|
import { useCommonHooks, useMutationAPI } from 'hooks';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
|
import { FaChevronLeft, FaChevronRight } from 'react-icons/fa';
|
||||||
import { modalClasses, textInputClasses } from 'styles';
|
import { modalClasses, textInputClasses } from 'styles';
|
||||||
import type { Theme } from 'types';
|
import type { Theme, ThemePlaylist } from 'types';
|
||||||
import { NewThemeStarter } from './components/NewThemeStarter';
|
import { NewThemeStarter } from './components/NewThemeStarter';
|
||||||
import { ThemeEditor } from './components/ThemeEditor';
|
import { ThemeEditor } from './components/ThemeEditor';
|
||||||
|
|
||||||
@@ -16,6 +17,7 @@ export function ThemeModal({
|
|||||||
setIsNew,
|
setIsNew,
|
||||||
allThemes,
|
allThemes,
|
||||||
closeThemeModal,
|
closeThemeModal,
|
||||||
|
themePlaylists,
|
||||||
}: {
|
}: {
|
||||||
opened: boolean;
|
opened: boolean;
|
||||||
selectedTheme: Theme;
|
selectedTheme: Theme;
|
||||||
@@ -25,6 +27,7 @@ export function ThemeModal({
|
|||||||
setIsNew: (isNew: boolean) => void;
|
setIsNew: (isNew: boolean) => void;
|
||||||
allThemes: Theme[];
|
allThemes: Theme[];
|
||||||
closeThemeModal: () => void;
|
closeThemeModal: () => void;
|
||||||
|
themePlaylists: ThemePlaylist[];
|
||||||
}) {
|
}) {
|
||||||
const themesEndpoint = 'api/themes';
|
const themesEndpoint = 'api/themes';
|
||||||
const { isMobile } = useCommonHooks();
|
const { isMobile } = useCommonHooks();
|
||||||
@@ -36,11 +39,22 @@ export function ThemeModal({
|
|||||||
|
|
||||||
const [pickerOpen, { open: openPicker, close: closePicker }] = useDisclosure(false);
|
const [pickerOpen, { open: openPicker, close: closePicker }] = useDisclosure(false);
|
||||||
const [duplicate, setDuplicate] = useState(false);
|
const [duplicate, setDuplicate] = useState(false);
|
||||||
|
const [hidden, setHidden] = useState(false);
|
||||||
|
|
||||||
|
const playlists =
|
||||||
|
themePlaylists.length > 0
|
||||||
|
? themePlaylists.filter((playlist: ThemePlaylist) => {
|
||||||
|
if (playlist.themeList.includes(`${selectedTheme.id}`)) {
|
||||||
|
return playlist;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
: [];
|
||||||
|
|
||||||
const handleClose = () => {
|
const handleClose = () => {
|
||||||
closeThemeModal();
|
closeThemeModal();
|
||||||
closePicker();
|
closePicker();
|
||||||
setIsNew(false);
|
setIsNew(false);
|
||||||
|
setHidden(false);
|
||||||
setSelectedTheme({
|
setSelectedTheme({
|
||||||
id: undefined,
|
id: undefined,
|
||||||
name: 'default',
|
name: 'default',
|
||||||
@@ -87,7 +101,7 @@ export function ThemeModal({
|
|||||||
keepMounted={true}
|
keepMounted={true}
|
||||||
>
|
>
|
||||||
<Modal.Overlay />
|
<Modal.Overlay />
|
||||||
<Modal.Content>
|
<Modal.Content style={{ overflow: 'visible' }}>
|
||||||
<Modal.Header style={{ justifyContent: 'center' }}>
|
<Modal.Header style={{ justifyContent: 'center' }}>
|
||||||
{!isNew && (
|
{!isNew && (
|
||||||
<Group pos={'absolute'}>
|
<Group pos={'absolute'}>
|
||||||
@@ -116,6 +130,87 @@ export function ThemeModal({
|
|||||||
<Modal.CloseButton />
|
<Modal.CloseButton />
|
||||||
</Modal.Header>
|
</Modal.Header>
|
||||||
<Modal.Body>
|
<Modal.Body>
|
||||||
|
<Group
|
||||||
|
gap={0}
|
||||||
|
pos={'absolute'}
|
||||||
|
h={'90%'}
|
||||||
|
w={'100%'}
|
||||||
|
bg={'var(--mantine-color-background-0)'}
|
||||||
|
style={{ zIndex: -1 }}
|
||||||
|
/>
|
||||||
|
{playlists.length > 0 && !isMobile && (
|
||||||
|
<Card
|
||||||
|
pos={'absolute'}
|
||||||
|
top={0}
|
||||||
|
style={{
|
||||||
|
color: 'var(--mantine-color-primary-0)',
|
||||||
|
backgroundColor:
|
||||||
|
'color-mix(in srgb, var(--mantine-color-accent-0), transparent 80%)',
|
||||||
|
backdropFilter: 'blur(15px)',
|
||||||
|
borderRadius: '8px',
|
||||||
|
right: hidden ? '-10rem' : 0,
|
||||||
|
transition: 'all .2s ease',
|
||||||
|
overflow: 'visible',
|
||||||
|
zIndex: -2,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Card.Section
|
||||||
|
h={'60px'}
|
||||||
|
px={'2rem'}
|
||||||
|
bg={'var(--mantine-color-accent-0)'}
|
||||||
|
style={{
|
||||||
|
alignContent: 'center',
|
||||||
|
borderTopRightRadius: '4px',
|
||||||
|
borderTopLeftRadius: '4px',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Text
|
||||||
|
c={'var(--mantine-color-background-0)'}
|
||||||
|
fz={'1.5rem'}
|
||||||
|
w={'100%'}
|
||||||
|
style={{ textAlign: 'center' }}
|
||||||
|
>
|
||||||
|
Playlists:
|
||||||
|
</Text>
|
||||||
|
<ActionIcon
|
||||||
|
pos={'absolute'}
|
||||||
|
right={-32}
|
||||||
|
top={16}
|
||||||
|
p={0}
|
||||||
|
m={0}
|
||||||
|
onClick={() => setHidden((hidden) => !hidden)}
|
||||||
|
style={{
|
||||||
|
borderRadius: '50%',
|
||||||
|
backgroundColor: 'var(--mantine-color-accent-0)',
|
||||||
|
color: 'var(--mantine-color-background-0)',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{hidden ? <FaChevronLeft /> : <FaChevronRight />}
|
||||||
|
</ActionIcon>
|
||||||
|
</Card.Section>
|
||||||
|
<Card.Section>
|
||||||
|
{playlists.map((playlist: ThemePlaylist) => (
|
||||||
|
<Text
|
||||||
|
key={playlist.id}
|
||||||
|
px={'1rem'}
|
||||||
|
py={'0.25rem'}
|
||||||
|
style={{
|
||||||
|
fontSize: '18px',
|
||||||
|
fontWeight: 600,
|
||||||
|
backgroundColor:
|
||||||
|
'color-mix(in srgb, var(--mantine-color-background-0), transparent 0%)',
|
||||||
|
borderRadius: '24px',
|
||||||
|
margin: '0.5rem',
|
||||||
|
textAlign: 'center',
|
||||||
|
color: 'var(--mantine-color-primary-0)',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{playlist.name}
|
||||||
|
</Text>
|
||||||
|
))}
|
||||||
|
</Card.Section>
|
||||||
|
</Card>
|
||||||
|
)}
|
||||||
{isNew ? (
|
{isNew ? (
|
||||||
<NewThemeStarter
|
<NewThemeStarter
|
||||||
allThemes={allThemes}
|
allThemes={allThemes}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Box, Button, Divider, Group, Overlay, Stack, Text } from '@mantine/core';
|
import { Box, Button, Divider, Group, Overlay, Stack, Text } from '@mantine/core';
|
||||||
import { useLongPress } from '@mantine/hooks';
|
import { useHover, useLongPress } from '@mantine/hooks';
|
||||||
import { useState } from 'react';
|
import { useMemo, useState } from 'react';
|
||||||
import { FaArrowRight } from 'react-icons/fa';
|
import { FaArrowRight } from 'react-icons/fa';
|
||||||
import { textClasses } from 'styles';
|
import { textClasses } from 'styles';
|
||||||
import type { Theme } from 'types';
|
import type { Theme } from 'types';
|
||||||
@@ -27,10 +27,14 @@ export function NewThemeStarter({
|
|||||||
const handlers = useLongPress(() => {
|
const handlers = useLongPress(() => {
|
||||||
setPressed(true);
|
setPressed(true);
|
||||||
});
|
});
|
||||||
const randomTheme = {
|
const { hovered: newHover, ref: newRef } = useHover();
|
||||||
|
const { hovered: copyHover, ref: copyRef } = useHover();
|
||||||
|
const randomTheme = useMemo(() => {
|
||||||
|
return {
|
||||||
...allThemes[Math.floor(Math.random() * allThemes.length)],
|
...allThemes[Math.floor(Math.random() * allThemes.length)],
|
||||||
randomEnabled: 1,
|
randomEnabled: 1,
|
||||||
};
|
};
|
||||||
|
}, []);
|
||||||
return (
|
return (
|
||||||
<Stack align='center' p={'2rem'}>
|
<Stack align='center' p={'2rem'}>
|
||||||
{!duplicate ? (
|
{!duplicate ? (
|
||||||
@@ -40,12 +44,17 @@ export function NewThemeStarter({
|
|||||||
</Text>
|
</Text>
|
||||||
<Group>
|
<Group>
|
||||||
<Stack
|
<Stack
|
||||||
|
ref={newRef}
|
||||||
justify='center'
|
justify='center'
|
||||||
align='center'
|
align='center'
|
||||||
bg={'var(--mantine-color-primary-0)'}
|
bg={
|
||||||
|
newHover
|
||||||
|
? 'var(--mantine-color-accent-0)'
|
||||||
|
: 'var(--mantine-color-primary-0)'
|
||||||
|
}
|
||||||
px={'1rem'}
|
px={'1rem'}
|
||||||
py={'3rem'}
|
py={'3rem'}
|
||||||
style={{ borderRadius: '8px' }}
|
style={{ borderRadius: '8px', transition: 'all .2s ease-in-out' }}
|
||||||
>
|
>
|
||||||
<ThemeCard
|
<ThemeCard
|
||||||
cardTheme={{
|
cardTheme={{
|
||||||
@@ -65,6 +74,7 @@ export function NewThemeStarter({
|
|||||||
themePlaylists={[]}
|
themePlaylists={[]}
|
||||||
setSelectedTheme={setSelectedTheme}
|
setSelectedTheme={setSelectedTheme}
|
||||||
openThemeModal={() => {}}
|
openThemeModal={() => {}}
|
||||||
|
enabled={false}
|
||||||
/>
|
/>
|
||||||
<Button
|
<Button
|
||||||
pos={'absolute'}
|
pos={'absolute'}
|
||||||
@@ -99,13 +109,21 @@ export function NewThemeStarter({
|
|||||||
m={'2rem'}
|
m={'2rem'}
|
||||||
/>
|
/>
|
||||||
<Stack
|
<Stack
|
||||||
|
ref={copyRef}
|
||||||
justify='center'
|
justify='center'
|
||||||
align='center'
|
align='center'
|
||||||
pos={'relative'}
|
pos={'relative'}
|
||||||
bg={'var(--mantine-color-primary-0)'}
|
bg={
|
||||||
|
copyHover
|
||||||
|
? 'var(--mantine-color-accent-0)'
|
||||||
|
: 'var(--mantine-color-primary-0)'
|
||||||
|
}
|
||||||
px={'1rem'}
|
px={'1rem'}
|
||||||
py={'3rem'}
|
py={'3rem'}
|
||||||
style={{ borderRadius: '8px' }}
|
style={{
|
||||||
|
borderRadius: '8px',
|
||||||
|
transition: 'all .2s ease-in-out',
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
<ThemeCard
|
<ThemeCard
|
||||||
cardTheme={randomTheme}
|
cardTheme={randomTheme}
|
||||||
@@ -113,6 +131,7 @@ export function NewThemeStarter({
|
|||||||
themePlaylists={[]}
|
themePlaylists={[]}
|
||||||
setSelectedTheme={setSelectedTheme}
|
setSelectedTheme={setSelectedTheme}
|
||||||
openThemeModal={() => {}}
|
openThemeModal={() => {}}
|
||||||
|
enabled={false}
|
||||||
/>
|
/>
|
||||||
<Overlay
|
<Overlay
|
||||||
bg={'transparent'}
|
bg={'transparent'}
|
||||||
|
|||||||
@@ -157,6 +157,7 @@ export function ThemeEditor({
|
|||||||
pos={'absolute'}
|
pos={'absolute'}
|
||||||
top={'11.5rem'}
|
top={'11.5rem'}
|
||||||
left={'8.5rem'}
|
left={'8.5rem'}
|
||||||
|
style={{ cursor: 'pointer' }}
|
||||||
/>
|
/>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<Tooltip
|
<Tooltip
|
||||||
@@ -175,6 +176,7 @@ export function ThemeEditor({
|
|||||||
pos={'absolute'}
|
pos={'absolute'}
|
||||||
bottom={'6rem'}
|
bottom={'6rem'}
|
||||||
left={'11rem'}
|
left={'11rem'}
|
||||||
|
style={{ cursor: 'pointer' }}
|
||||||
/>
|
/>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<Tooltip
|
<Tooltip
|
||||||
@@ -193,6 +195,7 @@ export function ThemeEditor({
|
|||||||
pos={'absolute'}
|
pos={'absolute'}
|
||||||
bottom={'4rem'}
|
bottom={'4rem'}
|
||||||
right={'3.5rem'}
|
right={'3.5rem'}
|
||||||
|
style={{ cursor: 'pointer' }}
|
||||||
/>
|
/>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<Tooltip
|
<Tooltip
|
||||||
@@ -211,6 +214,7 @@ export function ThemeEditor({
|
|||||||
pos={'absolute'}
|
pos={'absolute'}
|
||||||
top={'4.5rem'}
|
top={'4.5rem'}
|
||||||
right={'15%'}
|
right={'15%'}
|
||||||
|
style={{ cursor: 'pointer' }}
|
||||||
/>
|
/>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<Tooltip
|
<Tooltip
|
||||||
@@ -229,6 +233,7 @@ export function ThemeEditor({
|
|||||||
pos={'absolute'}
|
pos={'absolute'}
|
||||||
top={'3.25rem'}
|
top={'3.25rem'}
|
||||||
left={'6.5rem'}
|
left={'6.5rem'}
|
||||||
|
style={{ cursor: 'pointer' }}
|
||||||
/>
|
/>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<Tooltip
|
<Tooltip
|
||||||
@@ -280,7 +285,7 @@ export function ThemeEditor({
|
|||||||
Change{' '}
|
Change{' '}
|
||||||
{BackgroundProperties[colorId as keyof typeof BackgroundProperties]}
|
{BackgroundProperties[colorId as keyof typeof BackgroundProperties]}
|
||||||
</Text>
|
</Text>
|
||||||
{(colorId === 'backgroundColor' || colorId === 'searchColor') && (
|
{colorId === 'searchColor' && (
|
||||||
<ColorPicker
|
<ColorPicker
|
||||||
value={colorValue}
|
value={colorValue}
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
@@ -294,7 +299,7 @@ export function ThemeEditor({
|
|||||||
w={'90%'}
|
w={'90%'}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{colorId !== 'backgroundColor' && colorId !== 'searchColor' && (
|
{colorId !== 'searchColor' && (
|
||||||
<ColorPicker
|
<ColorPicker
|
||||||
value={colorValue}
|
value={colorValue}
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
@@ -320,7 +325,7 @@ export function ThemeEditor({
|
|||||||
<Button
|
<Button
|
||||||
c={'white'}
|
c={'white'}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
const rc = randomColor();
|
const rc = randomColor(colorId === 'searchColor');
|
||||||
setColorValue(rc);
|
setColorValue(rc);
|
||||||
setDesignerTheme({
|
setDesignerTheme({
|
||||||
...selectedTheme,
|
...selectedTheme,
|
||||||
@@ -604,7 +609,7 @@ export function ThemeEditor({
|
|||||||
setSelectedTheme({
|
setSelectedTheme({
|
||||||
...selectedTheme,
|
...selectedTheme,
|
||||||
backgroundColor: randomColor(),
|
backgroundColor: randomColor(),
|
||||||
searchColor: randomColor(),
|
searchColor: randomColor(true),
|
||||||
primaryColor: randomColor(),
|
primaryColor: randomColor(),
|
||||||
accentColor: randomColor(),
|
accentColor: randomColor(),
|
||||||
borderColor: randomColor(),
|
borderColor: randomColor(),
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ export function ThemeModalContent({ selectedTheme }: { selectedTheme: Theme }) {
|
|||||||
'--mantine-color-background-0': selectedTheme?.backgroundColor,
|
'--mantine-color-background-0': selectedTheme?.backgroundColor,
|
||||||
'--mantine-color-border-0': selectedTheme?.borderColor,
|
'--mantine-color-border-0': selectedTheme?.borderColor,
|
||||||
'--mantine-color-search-0': selectedTheme?.searchColor,
|
'--mantine-color-search-0': selectedTheme?.searchColor,
|
||||||
|
transition: 'all 0.2s ease',
|
||||||
}}
|
}}
|
||||||
align='center'
|
align='center'
|
||||||
gap={0}
|
gap={0}
|
||||||
@@ -67,6 +68,7 @@ export function ThemeModalContent({ selectedTheme }: { selectedTheme: Theme }) {
|
|||||||
textShadow: selectedTheme.textShadowsEnabled
|
textShadow: selectedTheme.textShadowsEnabled
|
||||||
? '3px 3px 1px color-mix(in srgb, var(--mantine-color-primary-0), transparent 50%)'
|
? '3px 3px 1px color-mix(in srgb, var(--mantine-color-primary-0), transparent 50%)'
|
||||||
: undefined,
|
: undefined,
|
||||||
|
transition: 'all 0.2s ease',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Hello World!
|
Hello World!
|
||||||
@@ -79,6 +81,7 @@ export function ThemeModalContent({ selectedTheme }: { selectedTheme: Theme }) {
|
|||||||
boxShadow: selectedTheme.textShadowsEnabled
|
boxShadow: selectedTheme.textShadowsEnabled
|
||||||
? '1px 1px 1px color-mix(in srgb, var(--mantine-color-accent-0), transparent 50%)'
|
? '1px 1px 1px color-mix(in srgb, var(--mantine-color-accent-0), transparent 50%)'
|
||||||
: undefined,
|
: undefined,
|
||||||
|
transition: 'all 0.2s ease',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Applications
|
Applications
|
||||||
@@ -103,6 +106,7 @@ export function ThemeModalContent({ selectedTheme }: { selectedTheme: Theme }) {
|
|||||||
style={{
|
style={{
|
||||||
display: 'grid',
|
display: 'grid',
|
||||||
gridTemplateColumns: '1fr 1fr 1fr',
|
gridTemplateColumns: '1fr 1fr 1fr',
|
||||||
|
transition: 'all 0.2s ease',
|
||||||
}}
|
}}
|
||||||
w={'100%'}
|
w={'100%'}
|
||||||
display={'grid'}
|
display={'grid'}
|
||||||
@@ -147,6 +151,7 @@ export function ThemeModalContent({ selectedTheme }: { selectedTheme: Theme }) {
|
|||||||
boxShadow: selectedTheme.textShadowsEnabled
|
boxShadow: selectedTheme.textShadowsEnabled
|
||||||
? '1px 1px 1px color-mix(in srgb, var(--mantine-color-accent-0), transparent 50%)'
|
? '1px 1px 1px color-mix(in srgb, var(--mantine-color-accent-0), transparent 50%)'
|
||||||
: undefined,
|
: undefined,
|
||||||
|
transition: 'all 0.2s ease',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Bookmarks
|
Bookmarks
|
||||||
@@ -182,6 +187,7 @@ export function ThemeModalContent({ selectedTheme }: { selectedTheme: Theme }) {
|
|||||||
textTransform: 'uppercase',
|
textTransform: 'uppercase',
|
||||||
marginTop: '1.25rem',
|
marginTop: '1.25rem',
|
||||||
marginBottom: '1.25rem',
|
marginBottom: '1.25rem',
|
||||||
|
transition: 'all 0.2s ease',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Example Category
|
Example Category
|
||||||
@@ -192,6 +198,7 @@ export function ThemeModalContent({ selectedTheme }: { selectedTheme: Theme }) {
|
|||||||
fontSize: '.875rem',
|
fontSize: '.875rem',
|
||||||
lineHeight: 2,
|
lineHeight: 2,
|
||||||
color: selectedTheme?.primaryColor,
|
color: selectedTheme?.primaryColor,
|
||||||
|
transition: 'all 0.2s ease',
|
||||||
}}
|
}}
|
||||||
component='a'
|
component='a'
|
||||||
>
|
>
|
||||||
@@ -203,6 +210,7 @@ export function ThemeModalContent({ selectedTheme }: { selectedTheme: Theme }) {
|
|||||||
fontSize: '.875rem',
|
fontSize: '.875rem',
|
||||||
lineHeight: 2,
|
lineHeight: 2,
|
||||||
color: selectedTheme?.primaryColor,
|
color: selectedTheme?.primaryColor,
|
||||||
|
transition: 'all 0.2s ease',
|
||||||
}}
|
}}
|
||||||
component='a'
|
component='a'
|
||||||
>
|
>
|
||||||
@@ -228,6 +236,7 @@ export function ThemeModalContent({ selectedTheme }: { selectedTheme: Theme }) {
|
|||||||
textTransform: 'uppercase',
|
textTransform: 'uppercase',
|
||||||
marginTop: '1.25rem',
|
marginTop: '1.25rem',
|
||||||
marginBottom: '1.25rem',
|
marginBottom: '1.25rem',
|
||||||
|
transition: 'all 0.2s ease',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Example Category
|
Example Category
|
||||||
@@ -238,6 +247,7 @@ export function ThemeModalContent({ selectedTheme }: { selectedTheme: Theme }) {
|
|||||||
fontSize: '.875rem',
|
fontSize: '.875rem',
|
||||||
lineHeight: 2,
|
lineHeight: 2,
|
||||||
color: selectedTheme?.primaryColor,
|
color: selectedTheme?.primaryColor,
|
||||||
|
transition: 'all 0.2s ease',
|
||||||
}}
|
}}
|
||||||
component='a'
|
component='a'
|
||||||
>
|
>
|
||||||
@@ -249,6 +259,7 @@ export function ThemeModalContent({ selectedTheme }: { selectedTheme: Theme }) {
|
|||||||
fontSize: '.875rem',
|
fontSize: '.875rem',
|
||||||
lineHeight: 2,
|
lineHeight: 2,
|
||||||
color: selectedTheme?.primaryColor,
|
color: selectedTheme?.primaryColor,
|
||||||
|
transition: 'all 0.2s ease',
|
||||||
}}
|
}}
|
||||||
component='a'
|
component='a'
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -127,6 +127,7 @@ export function Themes() {
|
|||||||
setIsNew={setIsNew}
|
setIsNew={setIsNew}
|
||||||
allThemes={allThemes}
|
allThemes={allThemes}
|
||||||
closeThemeModal={closeThemeModal}
|
closeThemeModal={closeThemeModal}
|
||||||
|
themePlaylists={themePlaylists}
|
||||||
/>
|
/>
|
||||||
<BackgroundModal
|
<BackgroundModal
|
||||||
backgroundModalOpened={backgroundModalOpened}
|
backgroundModalOpened={backgroundModalOpened}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
&.root {
|
&.root {
|
||||||
padding-top: 1.5rem;
|
padding-top: 1.5rem;
|
||||||
color: var(--mantine-color-primary-0);
|
color: var(--mantine-color-primary-0);
|
||||||
background-color: transparent;
|
background-color: color-mix(in srgb, var(--mantine-color-background-0), transparent 50%);
|
||||||
backdrop-filter: blur(5px) brightness(1.25);
|
backdrop-filter: blur(5px) brightness(1.25);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
.settingsItemHover {
|
.settingsItemHover {
|
||||||
&.root {
|
&.root {
|
||||||
color: var(--mantine-color-primary-0);
|
color: var(--mantine-color-primary-0);
|
||||||
background-color: transparent;
|
background-color: color-mix(in srgb, var(--mantine-color-background-0), transparent 50%);
|
||||||
backdrop-filter: blur(5px) brightness(1.25);
|
backdrop-filter: blur(5px) brightness(1.25);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
&:hover {
|
&:hover {
|
||||||
|
|||||||
Reference in New Issue
Block a user