@otmc/ui 0.1.5 → 0.1.7

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/branding/Footer.tsx","../src/utils/constants.ts","../src/components/ThemeMenu.tsx","../src/contexts/ThemeProvider.tsx","../src/components/ThemeSetting.tsx","../src/modals/Information.tsx","../src/utils/commonUtils.ts","../src/utils/timeUtils.ts","../src/pages/NotFound.tsx"],"sourcesContent":["/*\r\n * OTMC License.\r\n * Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * Contributors: Nguyen Van Trung, OTMC Authors.\r\n */\r\n\r\nexport * from './branding';\r\nexport * from './components';\r\nexport * from './contexts';\r\nexport * from './modals';\r\nexport * from './pages';\r\nexport * from './utils';\r\n","/***\r\n * OTMC License.\r\n * Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * Contributors: Nguyen Van Trung, OTMC Contributors.\r\n***/\r\n\r\nimport { Stack, Group, Text, Anchor, Tooltip, ActionIcon } from '@mantine/core';\r\nimport { Copyright } from 'lucide-react';\r\nimport {\r\n IconHeart,\r\n IconBrandFacebook,\r\n IconBrandGithub,\r\n IconMail,\r\n} from '@tabler/icons-react';\r\nimport { ReactNode } from 'react';\r\n\r\nimport {\r\n DEFAULT_AUTHOR,\r\n DEFAULT_AUTHOR_HREF,\r\n DEFAULT_COPYRIGHT,\r\n} from '../utils/constants';\r\n\r\nexport interface FooterSocialLink {\r\n label: string;\r\n href: string;\r\n icon: ReactNode;\r\n color?: string;\r\n external?: boolean;\r\n}\r\n\r\nexport interface FooterProps {\r\n copyright?: string;\r\n author?: string;\r\n authorHref?: string;\r\n socialLinks?: FooterSocialLink[];\r\n showCopyright?: boolean;\r\n showAuthor?: boolean;\r\n showSocialLinks?: boolean;\r\n}\r\n\r\nconst DEFAULT_SOCIAL_LINKS: FooterSocialLink[] = [\r\n {\r\n label: 'Facebook',\r\n href: 'https://www.facebook.com',\r\n icon: <IconBrandFacebook size={20} />,\r\n color: 'blue.8',\r\n external: true,\r\n },\r\n {\r\n label: 'GitHub',\r\n href: 'https://github.com',\r\n icon: <IconBrandGithub size={20} />,\r\n color: 'gray.6',\r\n external: true,\r\n },\r\n {\r\n label: 'Gmail',\r\n href: 'mailto:test@gmail.com',\r\n icon: <IconMail size={20} />,\r\n color: 'red.8',\r\n external: false,\r\n },\r\n];\r\n\r\nexport function Footer({\r\n copyright = DEFAULT_COPYRIGHT,\r\n author = DEFAULT_AUTHOR,\r\n authorHref = DEFAULT_AUTHOR_HREF,\r\n socialLinks = DEFAULT_SOCIAL_LINKS,\r\n showSocialLinks = true,\r\n}: FooterProps) {\r\n\r\n return (\r\n <Stack gap=\"sm\" mt=\"md\" align=\"center\">\r\n <Stack gap={2} align=\"center\">\r\n <Group gap={4} wrap=\"nowrap\">\r\n <Text c=\"dimmed\" size=\"xs\">\r\n Copyright{' '}\r\n </Text>\r\n <Copyright size={15} color=\"var(--mantine-color-dimmed)\" />\r\n <Text size=\"xs\" c=\"dimmed\">\r\n {new Date().getFullYear()} {copyright}\r\n </Text>\r\n </Group>\r\n <Group gap={4} wrap=\"nowrap\">\r\n <Text size=\"xs\" c=\"dimmed\">\r\n Built with\r\n </Text>\r\n <IconHeart\r\n size={15}\r\n style={{ color: 'var(--mantine-color-red-7)' }}\r\n />\r\n <Text size=\"xs\" c=\"dimmed\">\r\n by\r\n </Text>\r\n <Anchor\r\n href={authorHref}\r\n size=\"xs\"\r\n fw={500}\r\n target=\"_blank\"\r\n >\r\n {author}\r\n </Anchor>\r\n </Group>\r\n </Stack>\r\n\r\n {showSocialLinks && socialLinks.length > 0 && (\r\n <Group gap=\"sm\">\r\n {socialLinks.map((link) => (\r\n <Tooltip key={link.href} label={link.label} withArrow>\r\n <ActionIcon\r\n variant=\"subtle\"\r\n color={link.color}\r\n component=\"a\"\r\n href={link.href}\r\n target={link.external ? '_blank' : undefined}\r\n rel={link.external ? 'noopener noreferrer' : undefined}\r\n >\r\n {link.icon}\r\n </ActionIcon>\r\n </Tooltip>\r\n ))}\r\n </Group>\r\n )}\r\n </Stack>\r\n );\r\n}\r\n\r\n","/**\r\n * @License OTMC License\r\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * @Contributors Trung Ng, OTMC Authors.\r\n**/\r\n\r\nexport const DEFAULT_AUTHOR = 'Nguyen Van Trung, OTMC Contributors.';\r\nexport const DEFAULT_AUTHOR_HREF = 'https://github.com/otmc-sw';\r\nexport const DEFAULT_COPYRIGHT = 'OTMC Softwares. All rights reserved.';\r\nexport const DEFAULT_LICENSE = 'OTMC License.';\r\nexport const DEFAULT_LOCATION = 'An Nhon, Gia Lai, Viet Nam.';\r\nexport const DEFAULT_VERSION_TYPE = 'Internal';\r\nexport const UNKNOWN = 'Unknown';\r\n","/**\r\n * @License OTMC License\r\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * @Contributors Trung Ng, OTMC Authors.\r\n**/\r\n\r\nimport {\r\n ActionIcon,\r\n Menu,\r\n Tooltip,\r\n type ActionIconProps,\r\n type MenuProps,\r\n} from '@mantine/core';\r\nimport { Sun, Moon, Monitor, Clock } from 'lucide-react';\r\nimport type { ReactNode } from 'react';\r\n\r\nimport { useTheme, type ThemeMode } from '../contexts/ThemeProvider';\r\n\r\nexport interface ThemeMenuLabels {\r\n tooltip?: string;\r\n title?: string;\r\n light?: string;\r\n dark?: string;\r\n auto?: string;\r\n timeBased?: string;\r\n}\r\n\r\nexport interface ThemeMenuProps {\r\n modes?: ThemeMode[];\r\n labels?: ThemeMenuLabels;\r\n iconSize?: number;\r\n size?: ActionIconProps['size'];\r\n menuProps?: Partial<MenuProps>;\r\n}\r\n\r\nconst DEFAULT_LABELS: Required<ThemeMenuLabels> = {\r\n tooltip: 'Chế độ giao diện',\r\n title: 'Chế độ giao diện',\r\n light: 'Sáng',\r\n dark: 'Tối',\r\n auto: 'Theo hệ thống',\r\n timeBased: 'Theo thời gian',\r\n};\r\n\r\nconst MODE_ICONS: Record<ThemeMode, ReactNode> = {\r\n light: <Sun size={16} />,\r\n dark: <Moon size={16} />,\r\n auto: <Monitor size={16} />,\r\n 'time-based': <Clock size={16} />,\r\n};\r\n\r\nexport function ThemeMenu({\r\n modes = ['light', 'dark', 'auto', 'time-based'],\r\n labels = {},\r\n iconSize = 20,\r\n size = 'lg',\r\n menuProps = {},\r\n}: ThemeMenuProps) {\r\n const { theme, currentTheme, setTheme } = useTheme();\r\n const text = { ...DEFAULT_LABELS, ...labels };\r\n const isDark = currentTheme === 'dark';\r\n\r\n const activeColor = isDark ? 'yellow.8' : 'blue.8';\r\n\r\n const triggerIcon =\r\n theme === 'light' ? (\r\n <Sun size={iconSize} strokeWidth={2} />\r\n ) : theme === 'dark' ? (\r\n <Moon size={iconSize} strokeWidth={2} />\r\n ) : theme === 'auto' ? (\r\n <Monitor size={iconSize} strokeWidth={2} />\r\n ) : (\r\n <Clock size={iconSize} strokeWidth={2} />\r\n );\r\n\r\n return (\r\n <Menu shadow=\"md\" width={200} position=\"bottom-end\" {...menuProps}>\r\n <Menu.Target>\r\n <Tooltip label={text.tooltip} position=\"bottom\" withArrow>\r\n <ActionIcon\r\n variant=\"subtle\"\r\n color={activeColor}\r\n size={size}\r\n radius=\"lg\"\r\n style={{\r\n boxShadow: isDark\r\n ? '0 0 15px rgba(250, 176, 5, 0.2)'\r\n : '0 0 15px rgba(34, 139, 230, 0.2)',\r\n }}\r\n >\r\n {triggerIcon}\r\n </ActionIcon>\r\n </Tooltip>\r\n </Menu.Target>\r\n\r\n <Menu.Dropdown style={{ borderRadius: '11px' }}>\r\n <Menu.Label>{text.title}</Menu.Label>\r\n {modes.map((mode) => (\r\n <Menu.Item\r\n key={mode}\r\n leftSection={MODE_ICONS[mode]}\r\n onClick={() => setTheme(mode)}\r\n color={theme === mode ? activeColor : undefined}\r\n fw={theme === mode ? 700 : 400}\r\n >\r\n {text[mode === 'time-based' ? 'timeBased' : mode]}\r\n </Menu.Item>\r\n ))}\r\n </Menu.Dropdown>\r\n </Menu>\r\n );\r\n}\r\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\n\nimport React, { createContext, useContext, useEffect, useState } from 'react';\nimport {\n useMantineColorScheme,\n type MantineColorScheme,\n} from '@mantine/core';\n\nexport type ThemeMode = 'light' | 'dark' | 'auto' | 'time-based';\n\nexport interface TimeBasedSettings {\n lightStartTime: string;\n darkStartTime: string;\n}\n\nexport interface ThemeProviderProps {\n children: React.ReactNode;\n defaultTheme?: ThemeMode;\n defaultTimeBasedSettings?: TimeBasedSettings;\n storagePrefix?: string;\n}\n\nexport interface ThemeContextType {\n theme: ThemeMode;\n currentTheme: 'light' | 'dark';\n setTheme: (theme: ThemeMode) => void;\n toggleTheme: () => void;\n timeBasedSettings: TimeBasedSettings;\n setTimeBasedSettings: (v: TimeBasedSettings) => void;\n}\n\nconst ThemeContext = createContext<ThemeContextType | null>(null);\n\nexport const useTheme = () => {\n const ctx = useContext(ThemeContext);\n if (!ctx) {\n throw new Error('useTheme must be used inside ThemeProvider');\n }\n return ctx;\n};\n\nexport const resolveColorScheme = (colorScheme: 'light' | 'dark' | 'auto'): 'light' | 'dark' => {\n if (colorScheme === 'auto') {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return colorScheme;\n};\n\nconst resolveTimeBasedTheme = (\n settings: TimeBasedSettings\n): 'light' | 'dark' => {\n const now = new Date();\n const minutes = now.getHours() * 60 + now.getMinutes();\n\n const [lh, lm] = settings.lightStartTime.split(':').map(Number);\n const [dh, dm] = settings.darkStartTime.split(':').map(Number);\n\n const light = lh * 60 + lm;\n const dark = dh * 60 + dm;\n\n return light < dark\n ? minutes >= light && minutes < dark\n ? 'light'\n : 'dark'\n : minutes >= light || minutes < dark\n ? 'light'\n : 'dark';\n};\n\nconst resolveAutoScheme = (): 'light' | 'dark' =>\n window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light';\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\n children,\n defaultTheme = 'auto',\n defaultTimeBasedSettings = {\n lightStartTime: '07:00',\n darkStartTime: '19:00',\n },\n storagePrefix = '',\n}) => {\n const themeStorageKey = `${storagePrefix}theme`;\n const timeStorageKey = `${storagePrefix}time-theme`;\n\n const { colorScheme, setColorScheme } = useMantineColorScheme();\n\n const [theme, setThemeState] = useState<ThemeMode>(\n () => (localStorage.getItem(themeStorageKey) as ThemeMode) ?? defaultTheme\n );\n\n const [timeBasedSettings, setTimeBasedSettings] =\n useState<TimeBasedSettings>(() =>\n JSON.parse(localStorage.getItem(timeStorageKey) || 'null') ??\n defaultTimeBasedSettings\n );\n\n const handleSetTimeBasedSettings = (settings: TimeBasedSettings) => {\n setTimeBasedSettings(settings);\n localStorage.setItem(timeStorageKey, JSON.stringify(settings));\n if (theme === 'time-based') {\n applyTheme('time-based');\n }\n };\n\n const applyTheme = (mode: ThemeMode) => {\n let scheme: MantineColorScheme;\n\n switch (mode) {\n case 'light':\n case 'dark':\n case 'auto':\n scheme = mode;\n break;\n case 'time-based':\n scheme = resolveTimeBasedTheme(timeBasedSettings);\n break;\n default:\n scheme = 'auto';\n }\n\n setColorScheme(scheme);\n };\n\n useEffect(() => {\n applyTheme(theme);\n }, [theme, timeBasedSettings]);\n\n const setTheme = (mode: ThemeMode) => {\n setThemeState(mode);\n localStorage.setItem(themeStorageKey, mode);\n applyTheme(mode);\n };\n\n const toggleTheme = () => {\n setTheme(colorScheme === 'dark' ? 'light' : 'dark');\n };\n\n const currentTheme: 'light' | 'dark' =\n theme === 'time-based'\n ? resolveTimeBasedTheme(timeBasedSettings)\n : colorScheme === 'auto'\n ? resolveAutoScheme()\n : colorScheme;\n\n return (\n <ThemeContext.Provider\n value={{\n theme,\n currentTheme,\n setTheme,\n toggleTheme,\n timeBasedSettings,\n setTimeBasedSettings: handleSetTimeBasedSettings,\n }}\n >\n {children}\n </ThemeContext.Provider>\n );\n};\n","/**\r\n * @License OTMC License\r\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * @Contributors Trung Ng, OTMC Authors.\r\n**/\r\n\r\nimport {\r\n Box,\r\n Card,\r\n Divider,\r\n Group,\r\n SegmentedControl,\r\n Stack,\r\n Text,\r\n ThemeIcon,\r\n Title,\r\n type CardProps,\r\n} from '@mantine/core';\r\nimport { TimeInput } from '@mantine/dates';\r\nimport {\r\n IconClock,\r\n IconDeviceLaptop,\r\n IconMoon,\r\n IconPalette,\r\n IconSun,\r\n} from '@tabler/icons-react';\r\nimport type { ReactNode } from 'react';\r\n\r\nimport {\r\n useTheme,\r\n type ThemeMode,\r\n} from '../contexts/ThemeProvider';\r\n\r\nexport interface ThemeSettingLabels {\r\n title?: string;\r\n subtitle?: string;\r\n themeMode?: string;\r\n themeModeHint?: string;\r\n currentlyActive?: string;\r\n timeBasedSettings?: string;\r\n lightStartTime?: string;\r\n darkStartTime?: string;\r\n light?: string;\r\n dark?: string;\r\n system?: string;\r\n timeBased?: string;\r\n}\r\n\r\nexport interface ThemeSettingProps {\r\n modes?: ThemeMode[];\r\n labels?: ThemeSettingLabels;\r\n cardProps?: Partial<CardProps>;\r\n}\r\n\r\nconst DEFAULT_LABELS: Required<ThemeSettingLabels> = {\r\n title: 'Appearance',\r\n subtitle: 'Control how the application looks and feels',\r\n themeMode: 'Theme mode',\r\n themeModeHint: 'Auto will switch between light and dark based on time of day',\r\n currentlyActive: 'Currently active:',\r\n timeBasedSettings: 'Time-based settings',\r\n lightStartTime: 'Light theme start time',\r\n darkStartTime: 'Dark theme start time',\r\n light: 'Light',\r\n dark: 'Dark',\r\n system: 'System',\r\n timeBased: 'Time-based',\r\n};\r\n\r\nconst MODE_ICONS: Record<ThemeMode, ReactNode> = {\r\n light: <IconSun size={16} />,\r\n dark: <IconMoon size={16} />,\r\n auto: <IconDeviceLaptop size={16} />,\r\n 'time-based': <IconClock size={16} />,\r\n};\r\n\r\nconst MODE_ORDER: ThemeMode[] = ['light', 'dark', 'auto', 'time-based'];\r\n\r\nexport function ThemeSetting({\r\n modes = MODE_ORDER,\r\n labels = {},\r\n cardProps = {},\r\n}: ThemeSettingProps) {\r\n const {\r\n theme,\r\n timeBasedSettings,\r\n setTheme,\r\n setTimeBasedSettings,\r\n currentTheme,\r\n } = useTheme();\r\n\r\n const text = { ...DEFAULT_LABELS, ...labels };\r\n const isTimeBased = theme === 'time-based';\r\n const isDark = currentTheme === 'dark';\r\n const showTimeBased = modes.includes('time-based');\r\n\r\n return (\r\n <Card\r\n withBorder\r\n radius=\"lg\"\r\n p=\"25px\"\r\n bg={isDark ? 'dark.8' : 'gray.0'}\r\n style={{ flex: 1, overflow: 'auto', display: 'flex', flexDirection: 'column' }}\r\n {...cardProps}\r\n >\r\n <Stack gap=\"lg\" style={{ flex: 1 }}>\r\n <Box>\r\n <Group gap=\"xs\">\r\n <ThemeIcon variant=\"subtle\" color=\"blue.8\" size=\"md\" radius=\"md\">\r\n <IconPalette size={25} />\r\n </ThemeIcon>\r\n <Title order={4}>{text.title}</Title>\r\n </Group>\r\n <Text size=\"sm\" c=\"dimmed\">\r\n {text.subtitle}\r\n </Text>\r\n </Box>\r\n\r\n <Divider />\r\n\r\n <Box>\r\n <Text fw={500} mb={6}>\r\n {text.themeMode}\r\n </Text>\r\n\r\n <SegmentedControl\r\n fullWidth\r\n value={theme}\r\n radius=\"lg\"\r\n color=\"teal.8\"\r\n bg={isDark ? 'dark.6' : 'gray.3'}\r\n onChange={(value) => setTheme(value as ThemeMode)}\r\n data={MODE_ORDER.filter((mode) => modes.includes(mode)).map(\r\n (mode) => ({\r\n value: mode,\r\n label: (\r\n <Group gap={6}>\r\n {MODE_ICONS[mode]}\r\n <span>\r\n {mode === 'light'\r\n ? text.light\r\n : mode === 'dark'\r\n ? text.dark\r\n : mode === 'auto'\r\n ? text.system\r\n : text.timeBased}\r\n </span>\r\n </Group>\r\n ),\r\n })\r\n )}\r\n />\r\n\r\n <Text size=\"xs\" c=\"dimmed\" mt=\"xs\">\r\n {text.themeModeHint}\r\n </Text>\r\n\r\n <Text size=\"xs\" mt={4}>\r\n {text.currentlyActive}{' '}\r\n <b>{isDark ? text.dark : text.light}</b>\r\n </Text>\r\n </Box>\r\n\r\n {showTimeBased && (\r\n <>\r\n <Divider />\r\n\r\n <Box\r\n style={{\r\n opacity: isTimeBased ? 1 : 0.45,\r\n pointerEvents: isTimeBased ? 'auto' : 'none',\r\n transition: 'opacity 150ms ease',\r\n }}\r\n >\r\n <Group gap={6} mb={6}>\r\n <IconClock size={16} />\r\n <Text fw={500}>{text.timeBasedSettings}</Text>\r\n </Group>\r\n\r\n <Group grow>\r\n <Box>\r\n <Text size=\"sm\" mb={4}>\r\n {text.lightStartTime}\r\n </Text>\r\n <TimeInput\r\n withSeconds={false}\r\n radius=\"13px\"\r\n value={timeBasedSettings.lightStartTime}\r\n onChange={(event) =>\r\n setTimeBasedSettings({\r\n ...timeBasedSettings,\r\n lightStartTime: event.currentTarget.value,\r\n })\r\n }\r\n />\r\n </Box>\r\n\r\n <Box>\r\n <Text size=\"sm\" mb={4}>\r\n {text.darkStartTime}\r\n </Text>\r\n <TimeInput\r\n withSeconds={false}\r\n radius=\"13px\"\r\n value={timeBasedSettings.darkStartTime}\r\n onChange={(event) =>\r\n setTimeBasedSettings({\r\n ...timeBasedSettings,\r\n darkStartTime: event.currentTarget.value,\r\n })\r\n }\r\n />\r\n </Box>\r\n </Group>\r\n\r\n <Text size=\"xs\" c=\"dimmed\" mt=\"xs\">\r\n {text.light}: {timeBasedSettings.lightStartTime} →{' '}\r\n {timeBasedSettings.darkStartTime}\r\n <br />\r\n {text.dark}: {timeBasedSettings.darkStartTime} →{' '}\r\n {timeBasedSettings.lightStartTime}\r\n </Text>\r\n </Box>\r\n </>\r\n )}\r\n </Stack>\r\n </Card>\r\n );\r\n}\r\n","/***\n * OTMC License.\n * Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * Contributors: Nguyen Van Trung, OTMC Contributors.\n***/\n\nimport { useState, type ReactNode } from 'react';\nimport {\n Modal,\n Stack,\n Title,\n Text,\n Group,\n Divider,\n Badge,\n ThemeIcon,\n SimpleGrid,\n Paper,\n ActionIcon,\n Tooltip,\n useComputedColorScheme,\n} from '@mantine/core';\nimport {\n Award,\n Calendar,\n Check,\n Copy,\n Cpu,\n Copyright,\n Hash,\n MapPin,\n Tag,\n User,\n} from 'lucide-react';\n\nimport { Footer, type FooterSocialLink } from '../branding';\nimport { copyToClipboard } from '../utils/commonUtils';\nimport {\n DEFAULT_AUTHOR,\n DEFAULT_LICENSE,\n DEFAULT_LOCATION,\n DEFAULT_VERSION_TYPE,\n UNKNOWN,\n} from '../utils/constants';\nimport { formatAbsoluteAndRelativeTime } from '../utils/timeUtils';\n\nexport interface InformationMetadata {\n icon?: ReactNode;\n label: string;\n value: string;\n color?: string;\n}\n\nexport interface ApplicationInfo {\n name: string;\n version?: string;\n versionType?: string;\n tagline?: string;\n logo?: ReactNode;\n author?: string;\n authorHref?: string;\n license?: string;\n location?: string;\n copyright?: string;\n buildId?: string;\n buildTime?: string | number | Date;\n metadata?: InformationMetadata[];\n socialLinks?: FooterSocialLink[];\n}\n\nexport interface InformationContentProps {\n info: ApplicationInfo;\n}\n\nexport interface InformationModalProps {\n opened: boolean;\n onClose: () => void;\n info: ApplicationInfo;\n title?: ReactNode;\n}\n\nconst DEFAULT_TITLE = (\n <Group gap=\"xs\" wrap=\"nowrap\">\n <Cpu size={20} />\n <span>System Information</span>\n </Group>\n);\n\n\nexport function InformationContent({ info }: InformationContentProps) {\n const colorScheme = useComputedColorScheme();\n\n const author = info.author ?? DEFAULT_AUTHOR;\n const versionType = info.versionType ?? DEFAULT_VERSION_TYPE;\n\n const cards: InformationMetadata[] = [\n {\n icon: <User size={18} />,\n label: 'Author',\n value: author,\n color: 'blue',\n },\n {\n icon: <Award size={18} />,\n label: 'License',\n value: info.license ?? DEFAULT_LICENSE,\n color: 'orange',\n },\n {\n icon: <MapPin size={18} />,\n label: 'Location',\n value: info.location ?? DEFAULT_LOCATION,\n color: 'teal',\n },\n {\n icon: <Tag size={18} />,\n label: 'Version Type',\n value: versionType,\n color: 'red',\n },\n {\n icon: <Calendar size={18} />,\n label: 'Build Time',\n value:\n info.buildTime !== undefined\n ? formatAbsoluteAndRelativeTime(info.buildTime)\n : UNKNOWN,\n color: 'green',\n },\n ...(info.metadata ?? []),\n ];\n\n return (\n <Stack gap=\"lg\">\n <Stack gap=\"xs\" align=\"center\">\n {info.logo}\n\n <Stack gap={2} align=\"center\">\n <Title order={2}>{info.name}</Title>\n {info.tagline && (\n <Text size=\"sm\" c=\"dimmed\" w={600} ta=\"center\">\n {info.tagline}\n </Text>\n )}\n </Stack>\n\n <Group gap=\"xs\">\n {info.version && (\n <Badge\n size=\"lg\"\n color=\"blue\"\n variant=\"outline\"\n mt=\"sm\"\n tt=\"none\"\n fw={600}\n >\n ✨ v{info.version}\n </Badge>\n )}\n <Badge\n size=\"lg\"\n color=\"teal\"\n variant=\"light\"\n mt=\"sm\"\n tt=\"none\"\n fw={600}\n >\n 🧩 {versionType}\n </Badge>\n </Group>\n </Stack>\n\n <Divider label=\"System Information\" labelPosition=\"center\" />\n\n <SimpleGrid cols={{ base: 1, sm: 2 }}>\n {cards.map((card) => (\n <InfoCard\n key={card.label}\n icon={card.icon ?? <Award size={18} />}\n label={card.label}\n value={card.value}\n color={card.color ?? 'gray'}\n />\n ))}\n\n <Paper\n withBorder\n p=\"sm\"\n radius=\"18px\"\n bg={colorScheme === 'dark' ? 'gray.9' : 'gray.0'}\n >\n <Group justify=\"space-between\" wrap=\"nowrap\">\n <Group gap=\"sm\" flex={1}>\n <ThemeIcon variant=\"light\" color=\"yellow\" size=\"lg\" radius=\"14px\">\n <Hash size={18} />\n </ThemeIcon>\n\n <Stack gap={2}>\n <Text size=\"xs\" c=\"dimmed\" fw={700} tt=\"uppercase\">\n Build ID\n </Text>\n <Text size=\"sm\" fw={500} truncate>\n {info.buildId ?? UNKNOWN}\n </Text>\n </Stack>\n </Group>\n\n {info.buildId && <CopyBuildIdButton buildId={info.buildId} />}\n </Group>\n </Paper>\n </SimpleGrid>\n\n <Footer\n copyright={info.copyright}\n author={author}\n authorHref={info.authorHref}\n socialLinks={info.socialLinks}\n />\n </Stack>\n );\n}\n\nexport function InformationModal({\n opened,\n onClose,\n info,\n title = DEFAULT_TITLE,\n}: InformationModalProps) {\n return (\n <Modal\n opened={opened}\n onClose={onClose}\n withCloseButton\n centered\n radius=\"lg\"\n size=\"60%\"\n styles={{\n content: {\n maxHeight: '90vh',\n height: '90vh',\n },\n body: {\n flex: 1,\n overflow: 'auto',\n },\n }}\n title={title}\n >\n <InformationContent info={info} />\n </Modal>\n );\n}\n\nfunction CopyBuildIdButton({ buildId }: { buildId: string }) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async () => {\n const success = await copyToClipboard(buildId);\n if (success) {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n };\n\n return (\n <Tooltip label={copied ? 'Copied!' : 'Copy ID'} withArrow>\n <ActionIcon\n variant=\"subtle\"\n color={copied ? 'teal' : 'gray'}\n onClick={handleCopy}\n >\n {copied ? <Check size={16} /> : <Copy size={16} />}\n </ActionIcon>\n </Tooltip>\n );\n}\n\nfunction InfoCard({\n icon,\n label,\n value,\n color,\n}: {\n icon: ReactNode;\n label: string;\n value: string;\n color: string;\n}) {\n const colorScheme = useComputedColorScheme();\n return (\n <Paper withBorder p=\"md\" radius=\"18px\" h=\"100%\" bg={colorScheme === 'dark' ? 'gray.9' : 'gray.0'}>\n <Group gap=\"sm\" align=\"flex-start\">\n <ThemeIcon color={color} variant=\"light\" size=\"lg\" radius=\"14px\">\n {icon}\n </ThemeIcon>\n\n <Stack gap={2} flex={1}>\n <Text size=\"xs\" c=\"dimmed\" fw={700} tt=\"uppercase\">\n {label}\n </Text>\n <Text size=\"sm\" fw={500} lineClamp={1}>\n {value}\n </Text>\n </Stack>\n </Group>\n </Paper>\n );\n}\n\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nexport const copyToClipboard = async (text: string): Promise<boolean> => {\n try {\n if (navigator.clipboard && window.isSecureContext) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n \n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.left = '-9999px';\n textarea.style.top = '-9999px';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n \n const success = document.execCommand('copy');\n document.body.removeChild(textarea);\n \n return success;\n } catch (err) {\n console.error('Failed to copy to clipboard:', err);\n return false;\n }\n};\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\n\nexport type TimestampFormatType = \"absolute\" | \"relative\";\n\n\nexport function normalizeDate(dateInput: string | number | Date): Date | null {\n if (dateInput instanceof Date) {\n return isNaN(dateInput.getTime()) ? null : dateInput;\n }\n\n if (typeof dateInput === 'string') {\n const date = new Date(dateInput);\n return isNaN(date.getTime()) ? null : date;\n }\n\n if (typeof dateInput === 'number') {\n const timestamp = dateInput < 1e12 ? dateInput * 1000 : dateInput;\n const date = new Date(timestamp);\n return isNaN(date.getTime()) ? null : date;\n }\n\n return null;\n}\n\nexport function pad(n: number, width: number = 2): string {\n return String(n).padStart(width, \"0\");\n}\n\nexport function formatAbsolute(date: Date): string {\n const tz = -date.getTimezoneOffset();\n const sign = tz >= 0 ? \"+\" : \"-\";\n \n return (\n `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ` +\n `${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())} ` +\n `${sign}${pad(Math.floor(Math.abs(tz) / 60))}:${pad(Math.abs(tz) % 60)}`\n );\n}\n\nexport function formatRelativeTime(date: string | number | Date): string {\n const normalizedDate = normalizeDate(date);\n if (!normalizedDate) return \"Invalid date\";\n\n const now = Date.now();\n const diffMs = now - normalizedDate.getTime();\n const diffSeconds = Math.floor(diffMs / 1000);\n\n if (diffSeconds < 0) {\n return \"Just now\";\n }\n\n if (diffSeconds < 60) {\n return \"Just now\";\n }\n\n const minute = 60;\n const hour = minute * 60;\n const day = hour * 24;\n const week = day * 7;\n const month = day * 30;\n const year = day * 365;\n\n if (diffSeconds < hour) {\n const mins = Math.floor(diffSeconds / minute);\n return `${mins} min${mins !== 1 ? 's' : ''} ago`;\n } else if (diffSeconds < day) {\n const hours = Math.floor(diffSeconds / hour);\n return `${hours} hour${hours !== 1 ? 's' : ''} ago`;\n } else if (diffSeconds < week) {\n const days = Math.floor(diffSeconds / day);\n return `${days} day${days !== 1 ? 's' : ''} ago`;\n } else if (diffSeconds < month) {\n const weeks = Math.floor(diffSeconds / week);\n return `${weeks} week${weeks !== 1 ? 's' : ''} ago`;\n } else if (diffSeconds < year) {\n const months = Math.floor(diffSeconds / month);\n return `${months} month${months !== 1 ? 's' : ''} ago`;\n } else {\n const years = Math.floor(diffSeconds / year);\n return `${years} year${years !== 1 ? 's' : ''} ago`;\n }\n}\n\nexport function formatAbsoluteAndRelativeTime(date: string | number | Date): string {\n const normalizedDate = normalizeDate(date);\n if (!normalizedDate) return \"Invalid date\";\n\n const absoluteTime = formatAbsolute(normalizedDate);\n const relativeTime = formatRelativeTime(normalizedDate);\n\n return `${absoluteTime} (${relativeTime})`;\n}\n\nexport function calculateRemainingTime(targetDate: string | number | Date | undefined): string {\n if (!targetDate) return 'Not set';\n\n const normalizedDate = normalizeDate(targetDate);\n if (!normalizedDate) return 'Invalid date';\n\n const now = new Date();\n const diffMs = normalizedDate.getTime() - now.getTime();\n\n if (diffMs < 0) {\n const daysOverdue = Math.floor(Math.abs(diffMs) / (1000 * 60 * 60 * 24));\n return `Overdue ${daysOverdue}d`;\n }\n\n const days = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n const hours = Math.floor((diffMs % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));\n\n if (days > 0) {\n return `${days}d ${hours}h`;\n } else if (hours > 0) {\n return `${hours}h`;\n } else {\n return '< 1h';\n }\n}\n\nconst MONTH_NAMES = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\nexport function formatHumanDate(date: string | number | Date, options?: { showTime?: boolean; showSeconds?: boolean }): string {\n const normalizedDate = normalizeDate(date);\n if (!normalizedDate) return 'Invalid date';\n\n const month = MONTH_NAMES[normalizedDate.getMonth()];\n const day = normalizedDate.getDate();\n const year = normalizedDate.getFullYear();\n\n if (!options?.showTime) {\n return `${month} ${day}, ${year}`;\n }\n\n const hours = normalizedDate.getHours();\n const minutes = normalizedDate.getMinutes();\n const seconds = normalizedDate.getSeconds();\n const ampm = hours >= 12 ? 'PM' : 'AM';\n const hours12 = hours % 12 || 12;\n\n let timeStr = `${hours12}:${pad(minutes)}`;\n if (options.showSeconds) {\n timeStr += `:${pad(seconds)}`;\n }\n timeStr += ` ${ampm}`;\n\n return `${month} ${day}, ${year} ${timeStr}`;\n}\n\n","import {\n Box,\n Button,\n Container,\n Group,\n Paper,\n Text,\n Title,\n Code,\n Badge,\n} from '@mantine/core';\nimport {\n IconArrowLeft,\n IconHome,\n IconSearch,\n IconFileOff,\n} from '@tabler/icons-react';\n\nexport interface NotFoundProps {\n /** Đường dẫn bị lỗi (mặc định lấy theo URL hiện tại nếu không truyền) */\n path?: string;\n /** Callback khi nhấn tìm kiếm docs */\n onSearchClick?: () => void;\n /** Callback khi quay lại trang chủ */\n onHomeClick?: () => void;\n}\n\nexport function NotFound({\n path,\n onSearchClick,\n onHomeClick,\n}: NotFoundProps) {\n const currentPath =\n path || (typeof window !== 'undefined' ? window.location.pathname : '/404');\n\n return (\n <Box\n style={{\n minHeight: '100vh',\n display: 'flex',\n alignItems: 'center',\n background:\n 'radial-gradient(circle at top left, rgba(34, 139, 230, 0.15), transparent 45%), radial-gradient(circle at bottom right, rgba(34, 211, 238, 0.12), transparent 45%), var(--mantine-color-body)',\n }}\n >\n <Container size=\"xl\" py={80}>\n <Paper radius=\"xl\" p={48} withBorder style={{ borderColor: 'var(--mantine-color-default-border)', textAlign: 'center' }}>\n {/* Icon Badge */}\n <Box\n mx=\"auto\"\n mb=\"xl\"\n w={96}\n h={96}\n style={{\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background:\n 'linear-gradient(135deg, var(--mantine-color-blue-6), var(--mantine-color-cyan-6))',\n boxShadow: '0 12px 32px rgba(34, 139, 230, 0.35)',\n }}\n >\n <IconFileOff size={44} stroke={1.5} color=\"white\" />\n </Box>\n\n {/* Big 404 */}\n <Text\n fz={{ base: 72, sm: 100 }}\n fw={900}\n lh={1}\n variant=\"gradient\"\n gradient={{ from: 'blue.7', to: 'cyan.5', deg: 45 }}\n >\n 404\n </Text>\n\n <Badge variant=\"light\" color=\"blue\" size=\"lg\" mb=\"xs\">\n NOT FOUND\n </Badge>\n\n <Title order={2} mt=\"sm\" mb=\"xs\">\n Trang không tồn tại\n </Title>\n\n <Text c=\"dimmed\" size=\"sm\" maw={440} mx=\"auto\">\n Trang hoặc đường dẫn bạn truy cập không tồn tại hoặc đã được di\n chuyển. Vui lòng kiểm tra lại đường dẫn hoặc quay về trang chủ.\n </Text>\n\n {/* Missing path */}\n <Box mt=\"lg\">\n <Code color=\"blue\" variant=\"light\" px=\"md\" py={6}>\n {currentPath}\n </Code>\n </Box>\n\n {/* Actions */}\n <Group gap=\"sm\" mt=\"xl\" justify=\"center\">\n <Button\n variant=\"light\"\n leftSection={<IconArrowLeft size={16} />}\n onClick={() => window.history.back()}\n >\n Quay lại\n </Button>\n\n {onSearchClick && (\n <Button\n variant=\"outline\"\n leftSection={<IconSearch size={16} />}\n onClick={onSearchClick}\n >\n Tìm Docs\n </Button>\n )}\n\n <Button\n leftSection={<IconHome size={16} />}\n onClick={onHomeClick || (() => (window.location.href = '/'))}\n >\n Trang chủ\n </Button>\n </Group>\n </Paper>\n </Container>\n </Box>\n );\n}\n\nexport default NotFound;\n"],"mappings":"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","names":["import_core","import_lucide_react","import_core","import_jsx_runtime","import_jsx_runtime","import_core","import_icons_react","import_jsx_runtime","DEFAULT_LABELS","MODE_ICONS","import_react","import_core","import_lucide_react","import_jsx_runtime","import_core","import_icons_react","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/components/common/NotificationCenter.tsx","../src/api/utils.ts","../src/api/llm.ts","../src/api/instructions.ts","../src/branding/Footer.tsx","../src/utils/constants.ts","../src/components/ThemeMenu.tsx","../src/contexts/ThemeProvider.tsx","../src/components/ThemeSetting.tsx","../src/modals/Information.tsx","../src/utils/commonUtils.ts","../src/utils/timeUtils.ts","../src/pages/NotFound.tsx","../src/utils/debug.ts"],"sourcesContent":["/*\r\n * OTMC License.\r\n * Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * Contributors: Nguyen Van Trung, OTMC Authors.\r\n */\r\n\r\nexport * from './api';\r\nexport * from './branding';\r\nexport * from './components';\r\nexport * from './contexts';\r\nexport * from './modals';\r\nexport * from './pages';\r\nexport * from './utils';\r\n","/**\r\n * @License OTMC License\r\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * @Contributors Trung Ng, OTMC Authors.\r\n**/\r\nimport { notifications } from '@mantine/notifications';\r\nimport { IconX, IconAlertCircle, IconInfoCircle, IconCheck } from '@tabler/icons-react';\r\n\r\ninterface NotificationOptions {\r\n title: string;\r\n message?: string;\r\n autoClose?: number;\r\n}\r\n\r\nconst notificationCenter = {\r\n error: ({ title, message, autoClose = 15000 }: NotificationOptions) => {\r\n notifications.show({\r\n color: 'red',\r\n title: `${title}`,\r\n message,\r\n icon: <IconX />,\r\n autoClose,\r\n radius: 'lg',\r\n });\r\n },\r\n\r\n warn: ({ title, message, autoClose = 10000 }: NotificationOptions) => {\r\n notifications.show({\r\n color: 'yellow',\r\n title: `${title}`,\r\n message,\r\n icon: <IconAlertCircle />,\r\n autoClose,\r\n radius: 'lg',\r\n });\r\n },\r\n\r\n info: ({ title, message, autoClose = 8000 }: NotificationOptions) => {\r\n notifications.show({\r\n color: 'blue',\r\n title: `${title}`,\r\n icon: <IconInfoCircle />,\r\n message,\r\n autoClose,\r\n radius: 'lg',\r\n });\r\n },\r\n\r\n success: ({ title, message, autoClose = 5000 }: NotificationOptions) => {\r\n notifications.show({\r\n color: 'green',\r\n title: `${title}`,\r\n icon: <IconCheck />,\r\n message,\r\n autoClose,\r\n radius: 'lg',\r\n });\r\n },\r\n};\r\n\r\nexport default notificationCenter;\r\n","/**\r\n * @License OTMC License\r\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * @Contributors Trung Ng, OTMC Authors.\r\n**/\r\n\r\nimport notificationCenter from \"../components/common/NotificationCenter\";\r\n\r\nlet backendUrlOverride: string | undefined;\r\n\r\nexport function setBackendUrl(url: string) {\r\n backendUrlOverride = url;\r\n}\r\n\r\nexport function getBackendUrl(): string {\r\n if (backendUrlOverride) return backendUrlOverride;\r\n if (typeof window !== 'undefined' && window.location?.origin) {\r\n return window.location.origin + \"/api\";\r\n }\r\n return \"\";\r\n}\r\n\r\nexport const BACKEND_URL = getBackendUrl();\r\n\r\nlet accessTokenGetter: (() => Promise<string | null>) | null = null;\r\n\r\nexport function setAccessTokenGetter(getter: () => Promise<string | null>) {\r\n accessTokenGetter = getter;\r\n}\r\n\r\nexport interface SuccessResponse<T> {\r\n success: boolean;\r\n data: T;\r\n message?: string;\r\n}\r\n\r\nexport interface ErrorResponse {\r\n success: boolean;\r\n error: {\r\n code: number;\r\n key: string;\r\n type: string;\r\n\r\n summary: string;\r\n detail: string;\r\n file?: string;\r\n line?: number;\r\n function?: string;\r\n timestamp?: string;\r\n };\r\n}\r\n\r\nexport type ApiResponse<T> = SuccessResponse<T> | ErrorResponse;\r\n\r\nclass ApiClient {\r\n private baseUrl?: string;\r\n\r\n constructor(baseUrl?: string) {\r\n this.baseUrl = baseUrl;\r\n }\r\n\r\n private async request<T>(\r\n endpoint: string,\r\n options: RequestInit = {}\r\n ): Promise<ApiResponse<T>> {\r\n const url = `${this.baseUrl ?? getBackendUrl()}${endpoint}`;\r\n\r\n const config: RequestInit = {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options.headers,\r\n },\r\n ...options,\r\n };\r\n\r\n const token = accessTokenGetter ? await accessTokenGetter() : null;\r\n if (token) {\r\n (config.headers as Record<string, string>).Authorization = `Bearer ${token}`;\r\n }\r\n\r\n try {\r\n const response = await fetch(url, config);\r\n\r\n if (options.method === 'DELETE') {\r\n if (response.status === 204 || response.status === 200) {\r\n return { success: true, data: undefined as unknown as T, message: 'Success' };\r\n }\r\n const text = await response.text();\r\n if (text) {\r\n const data: ApiResponse<T> = JSON.parse(text);\r\n if (!response.ok) {\r\n const error = (data as ErrorResponse).error;\r\n notificationCenter.error({\r\n title: `${error.summary}`,\r\n message: `${error.detail}`,\r\n autoClose: 15000,\r\n });\r\n throw new Error(`${error.summary}: ${error.detail}` || `Request Failed with status: ${response.status}`);\r\n }\r\n return data;\r\n } else {\r\n return { success: true, data: undefined as unknown as T, message: 'Success' };\r\n }\r\n }\r\n\r\n const responseData: ApiResponse<T> = await response.json();\r\n\r\n if (!response.ok) {\r\n const error = (responseData as ErrorResponse).error;\r\n notificationCenter.error({\r\n title: `${error.summary}`,\r\n message: `${error.detail}`,\r\n autoClose: 15000,\r\n });\r\n throw new Error(`${error.summary}: ${error.detail}` || `Request Failed with status: ${response.status}`);\r\n }\r\n\r\n return responseData;\r\n } catch (error) {\r\n console.error(`API request failed: ${endpoint}`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n get<T>(endpoint: string, params?: Record<string, string>) {\r\n const queryString = params ? `?${new URLSearchParams(params).toString()}` : '';\r\n return this.request<T>(`${endpoint}${queryString}`, { method: 'GET' });\r\n }\r\n\r\n post<T>(endpoint: string, data?: unknown) {\r\n return this.request<T>(endpoint, {\r\n method: 'POST',\r\n body: data ? JSON.stringify(data) : undefined,\r\n });\r\n }\r\n\r\n put<T>(endpoint: string, data?: unknown) {\r\n return this.request<T>(endpoint, {\r\n method: 'PUT',\r\n body: data ? JSON.stringify(data) : undefined,\r\n });\r\n }\r\n\r\n patch<T>(endpoint: string, data?: unknown) {\r\n return this.request<T>(endpoint, {\r\n method: 'PATCH',\r\n body: data ? JSON.stringify(data) : undefined,\r\n });\r\n }\r\n\r\n delete<T>(endpoint: string) {\r\n return this.request<T>(endpoint, { method: 'DELETE' });\r\n }\r\n}\r\n\r\nexport const apiClient = new ApiClient();\r\n\r\nexport const apiUtils = {\r\n handleSuccess: <T>(response: SuccessResponse<T>): T => {\r\n return response.data;\r\n },\r\n\r\n handleError: (error: unknown): void => {\r\n console.error('API Error:', error);\r\n throw error;\r\n },\r\n\r\n validateId: (id: string): boolean => {\r\n return /^[0-9A-HJKMNP-TV-Z]{26}$/.test(id);\r\n },\r\n\r\n getDataFromResponse: <T>(response: ApiResponse<T>): T | undefined => {\r\n if (response.success && 'data' in response) {\r\n return response.data;\r\n }\r\n return undefined;\r\n },\r\n};\r\n","/**\r\n * @License OTMC License\r\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * @Contributors Trung Ng, OTMC Authors.\r\n**/\r\n\r\nimport { apiClient } from './utils';\r\n\r\nexport interface LLMRequest {\r\n type: string;\r\n prompt: string;\r\n content: string;\r\n}\r\n\r\nexport interface LLMResponse {\r\n type: string;\r\n response: string;\r\n}\r\n\r\nexport interface GenerateDocumentRequest {\r\n prompt: string;\r\n}\r\n\r\nexport interface GenerateDocumentResponse {\r\n content: string;\r\n}\r\n\r\nexport interface FormatDocumentRequest {\r\n doc_id?: number | null;\r\n title?: string | null;\r\n content: string;\r\n}\r\n\r\nexport interface FormatDocumentResponse {\r\n content: string;\r\n}\r\n\r\nexport interface LLMTestResponse {\r\n message: string;\r\n}\r\n\r\nexport interface LLMReloadResponse {\r\n status: string;\r\n message: string;\r\n provider: string;\r\n}\r\n\r\nexport interface LLMConfigResponse {\r\n status: string;\r\n}\r\n\r\nexport const llmApi = {\r\n generate: (data: LLMRequest) =>\r\n apiClient.post<LLMResponse & { content?: string }>('/llm/generate', data),\r\n\r\n generateDocument: (data: GenerateDocumentRequest) =>\r\n apiClient.post<GenerateDocumentResponse>('/llm/generate-document', data),\r\n\r\n formatDocument: (templateId: number, data: FormatDocumentRequest) =>\r\n apiClient.post<FormatDocumentResponse>(`/llm/format/${templateId}`, data),\r\n\r\n getConfig: () =>\r\n apiClient.get<LLMConfigResponse>('/llm/config'),\r\n\r\n testConnection: () =>\r\n apiClient.get<LLMTestResponse>('/llm/test'),\r\n\r\n reload: () =>\r\n apiClient.post<LLMReloadResponse>('/llm/reload'),\r\n};\r\n","/**\r\n * @License OTMC License\r\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * @Contributors Trung Ng, OTMC Authors.\r\n**/\r\n\r\nimport { apiClient } from './utils'\r\n\r\nexport interface Instruction {\r\n id: number\r\n name: string\r\n content: string\r\n}\r\n\r\nexport const instructionsApi = {\r\n getAll: () => apiClient.get<Instruction[]>('/prompts'),\r\n\r\n getById: (id: number) => apiClient.get<Instruction>(`/prompts/${id}`),\r\n\r\n create: (instruction: Omit<Instruction, 'id'>) =>\r\n apiClient.post<Instruction>('/prompts', instruction),\r\n\r\n update: (id: number, content: string) =>\r\n apiClient.patch<Instruction>(`/prompts/${id}`, { content }),\r\n\r\n delete: (id: number) =>\r\n apiClient.delete(`/prompts/${id}`)\r\n}\r\n","/***\r\n * OTMC License.\r\n * Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * Contributors: Nguyen Van Trung, OTMC Contributors.\r\n***/\r\n\r\nimport { Stack, Group, Text, Anchor, Tooltip, ActionIcon } from '@mantine/core';\r\nimport { Copyright } from 'lucide-react';\r\nimport {\r\n IconHeart,\r\n IconBrandFacebook,\r\n IconBrandGithub,\r\n IconMail,\r\n} from '@tabler/icons-react';\r\nimport { ReactNode } from 'react';\r\n\r\nimport {\r\n DEFAULT_AUTHOR,\r\n DEFAULT_AUTHOR_HREF,\r\n DEFAULT_COPYRIGHT,\r\n} from '../utils/constants';\r\n\r\nexport interface FooterSocialLink {\r\n label: string;\r\n href: string;\r\n icon: ReactNode;\r\n color?: string;\r\n external?: boolean;\r\n}\r\n\r\nexport interface FooterProps {\r\n copyright?: string;\r\n author?: string;\r\n authorHref?: string;\r\n socialLinks?: FooterSocialLink[];\r\n showCopyright?: boolean;\r\n showAuthor?: boolean;\r\n showSocialLinks?: boolean;\r\n}\r\n\r\nconst DEFAULT_SOCIAL_LINKS: FooterSocialLink[] = [\r\n {\r\n label: 'Facebook',\r\n href: 'https://www.facebook.com',\r\n icon: <IconBrandFacebook size={20} />,\r\n color: 'blue.8',\r\n external: true,\r\n },\r\n {\r\n label: 'GitHub',\r\n href: 'https://github.com',\r\n icon: <IconBrandGithub size={20} />,\r\n color: 'gray.6',\r\n external: true,\r\n },\r\n {\r\n label: 'Gmail',\r\n href: 'mailto:test@gmail.com',\r\n icon: <IconMail size={20} />,\r\n color: 'red.8',\r\n external: false,\r\n },\r\n];\r\n\r\nexport function Footer({\r\n copyright = DEFAULT_COPYRIGHT,\r\n author = DEFAULT_AUTHOR,\r\n authorHref = DEFAULT_AUTHOR_HREF,\r\n socialLinks = DEFAULT_SOCIAL_LINKS,\r\n showSocialLinks = true,\r\n}: FooterProps) {\r\n\r\n return (\r\n <Stack gap=\"sm\" mt=\"md\" align=\"center\">\r\n <Stack gap={2} align=\"center\">\r\n <Group gap={4} wrap=\"nowrap\">\r\n <Text c=\"dimmed\" size=\"xs\">\r\n Copyright{' '}\r\n </Text>\r\n <Copyright size={15} color=\"var(--mantine-color-dimmed)\" />\r\n <Text size=\"xs\" c=\"dimmed\">\r\n {new Date().getFullYear()} {copyright}\r\n </Text>\r\n </Group>\r\n <Group gap={4} wrap=\"nowrap\">\r\n <Text size=\"xs\" c=\"dimmed\">\r\n Built with\r\n </Text>\r\n <IconHeart\r\n size={15}\r\n style={{ color: 'var(--mantine-color-red-7)' }}\r\n />\r\n <Text size=\"xs\" c=\"dimmed\">\r\n by\r\n </Text>\r\n <Anchor\r\n href={authorHref}\r\n size=\"xs\"\r\n fw={500}\r\n target=\"_blank\"\r\n >\r\n {author}\r\n </Anchor>\r\n </Group>\r\n </Stack>\r\n\r\n {showSocialLinks && socialLinks.length > 0 && (\r\n <Group gap=\"sm\">\r\n {socialLinks.map((link) => (\r\n <Tooltip key={link.href} label={link.label} withArrow>\r\n <ActionIcon\r\n variant=\"subtle\"\r\n color={link.color}\r\n component=\"a\"\r\n href={link.href}\r\n target={link.external ? '_blank' : undefined}\r\n rel={link.external ? 'noopener noreferrer' : undefined}\r\n >\r\n {link.icon}\r\n </ActionIcon>\r\n </Tooltip>\r\n ))}\r\n </Group>\r\n )}\r\n </Stack>\r\n );\r\n}\r\n\r\n","/**\r\n * @License OTMC License\r\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * @Contributors Trung Ng, OTMC Authors.\r\n**/\r\n\r\nexport const DEFAULT_AUTHOR = 'Nguyen Van Trung, OTMC Contributors.';\r\nexport const DEFAULT_AUTHOR_HREF = 'https://github.com/otmc-sw';\r\nexport const DEFAULT_COPYRIGHT = 'OTMC Softwares. All rights reserved.';\r\nexport const DEFAULT_LICENSE = 'OTMC License.';\r\nexport const DEFAULT_LOCATION = 'An Nhon, Gia Lai, Viet Nam.';\r\nexport const DEFAULT_VERSION_TYPE = 'Internal';\r\nexport const UNKNOWN = 'Unknown';\r\n","/**\r\n * @License OTMC License\r\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * @Contributors Trung Ng, OTMC Authors.\r\n**/\r\n\r\nimport {\r\n ActionIcon,\r\n Menu,\r\n Tooltip,\r\n type ActionIconProps,\r\n type MenuProps,\r\n} from '@mantine/core';\r\nimport { Sun, Moon, Monitor, Clock } from 'lucide-react';\r\nimport type { ReactNode } from 'react';\r\n\r\nimport { useTheme, type ThemeMode } from '../contexts/ThemeProvider';\r\n\r\nexport interface ThemeMenuLabels {\r\n tooltip?: string;\r\n title?: string;\r\n light?: string;\r\n dark?: string;\r\n auto?: string;\r\n timeBased?: string;\r\n}\r\n\r\nexport interface ThemeMenuProps {\r\n modes?: ThemeMode[];\r\n labels?: ThemeMenuLabels;\r\n iconSize?: number;\r\n size?: ActionIconProps['size'];\r\n menuProps?: Partial<MenuProps>;\r\n}\r\n\r\nconst DEFAULT_LABELS: Required<ThemeMenuLabels> = {\r\n tooltip: 'Chế độ giao diện',\r\n title: 'Chế độ giao diện',\r\n light: 'Sáng',\r\n dark: 'Tối',\r\n auto: 'Theo hệ thống',\r\n timeBased: 'Theo thời gian',\r\n};\r\n\r\nconst MODE_ICONS: Record<ThemeMode, ReactNode> = {\r\n light: <Sun size={16} />,\r\n dark: <Moon size={16} />,\r\n auto: <Monitor size={16} />,\r\n 'time-based': <Clock size={16} />,\r\n};\r\n\r\nexport function ThemeMenu({\r\n modes = ['light', 'dark', 'auto', 'time-based'],\r\n labels = {},\r\n iconSize = 20,\r\n size = 'lg',\r\n menuProps = {},\r\n}: ThemeMenuProps) {\r\n const { theme, currentTheme, setTheme } = useTheme();\r\n const text = { ...DEFAULT_LABELS, ...labels };\r\n const isDark = currentTheme === 'dark';\r\n\r\n const activeColor = isDark ? 'yellow.8' : 'blue.8';\r\n\r\n const triggerIcon =\r\n theme === 'light' ? (\r\n <Sun size={iconSize} strokeWidth={2} />\r\n ) : theme === 'dark' ? (\r\n <Moon size={iconSize} strokeWidth={2} />\r\n ) : theme === 'auto' ? (\r\n <Monitor size={iconSize} strokeWidth={2} />\r\n ) : (\r\n <Clock size={iconSize} strokeWidth={2} />\r\n );\r\n\r\n return (\r\n <Menu shadow=\"md\" width={200} position=\"bottom-end\" {...menuProps}>\r\n <Menu.Target>\r\n <Tooltip label={text.tooltip} position=\"bottom\" withArrow>\r\n <ActionIcon\r\n variant=\"subtle\"\r\n color={activeColor}\r\n size={size}\r\n radius=\"lg\"\r\n style={{\r\n boxShadow: isDark\r\n ? '0 0 15px rgba(250, 176, 5, 0.2)'\r\n : '0 0 15px rgba(34, 139, 230, 0.2)',\r\n }}\r\n >\r\n {triggerIcon}\r\n </ActionIcon>\r\n </Tooltip>\r\n </Menu.Target>\r\n\r\n <Menu.Dropdown style={{ borderRadius: '11px' }}>\r\n <Menu.Label>{text.title}</Menu.Label>\r\n {modes.map((mode) => (\r\n <Menu.Item\r\n key={mode}\r\n leftSection={MODE_ICONS[mode]}\r\n onClick={() => setTheme(mode)}\r\n color={theme === mode ? activeColor : undefined}\r\n fw={theme === mode ? 700 : 400}\r\n >\r\n {text[mode === 'time-based' ? 'timeBased' : mode]}\r\n </Menu.Item>\r\n ))}\r\n </Menu.Dropdown>\r\n </Menu>\r\n );\r\n}\r\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\n\nimport React, { createContext, useContext, useEffect, useState } from 'react';\nimport {\n useMantineColorScheme,\n type MantineColorScheme,\n} from '@mantine/core';\n\nexport type ThemeMode = 'light' | 'dark' | 'auto' | 'time-based';\n\nexport interface TimeBasedSettings {\n lightStartTime: string;\n darkStartTime: string;\n}\n\nexport interface ThemeProviderProps {\n children: React.ReactNode;\n defaultTheme?: ThemeMode;\n defaultTimeBasedSettings?: TimeBasedSettings;\n storagePrefix?: string;\n}\n\nexport interface ThemeContextType {\n theme: ThemeMode;\n currentTheme: 'light' | 'dark';\n setTheme: (theme: ThemeMode) => void;\n toggleTheme: () => void;\n timeBasedSettings: TimeBasedSettings;\n setTimeBasedSettings: (v: TimeBasedSettings) => void;\n}\n\nconst ThemeContext = createContext<ThemeContextType | null>(null);\n\nexport const useTheme = () => {\n const ctx = useContext(ThemeContext);\n if (!ctx) {\n throw new Error('useTheme must be used inside ThemeProvider');\n }\n return ctx;\n};\n\nexport const resolveColorScheme = (colorScheme: 'light' | 'dark' | 'auto'): 'light' | 'dark' => {\n if (colorScheme === 'auto') {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return colorScheme;\n};\n\nconst resolveTimeBasedTheme = (\n settings: TimeBasedSettings\n): 'light' | 'dark' => {\n const now = new Date();\n const minutes = now.getHours() * 60 + now.getMinutes();\n\n const [lh, lm] = settings.lightStartTime.split(':').map(Number);\n const [dh, dm] = settings.darkStartTime.split(':').map(Number);\n\n const light = lh * 60 + lm;\n const dark = dh * 60 + dm;\n\n return light < dark\n ? minutes >= light && minutes < dark\n ? 'light'\n : 'dark'\n : minutes >= light || minutes < dark\n ? 'light'\n : 'dark';\n};\n\nconst resolveAutoScheme = (): 'light' | 'dark' =>\n window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light';\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\n children,\n defaultTheme = 'auto',\n defaultTimeBasedSettings = {\n lightStartTime: '07:00',\n darkStartTime: '19:00',\n },\n storagePrefix = '',\n}) => {\n const themeStorageKey = `${storagePrefix}theme`;\n const timeStorageKey = `${storagePrefix}time-theme`;\n\n const { colorScheme, setColorScheme } = useMantineColorScheme();\n\n const [theme, setThemeState] = useState<ThemeMode>(\n () => (localStorage.getItem(themeStorageKey) as ThemeMode) ?? defaultTheme\n );\n\n const [timeBasedSettings, setTimeBasedSettings] =\n useState<TimeBasedSettings>(() =>\n JSON.parse(localStorage.getItem(timeStorageKey) || 'null') ??\n defaultTimeBasedSettings\n );\n\n const handleSetTimeBasedSettings = (settings: TimeBasedSettings) => {\n setTimeBasedSettings(settings);\n localStorage.setItem(timeStorageKey, JSON.stringify(settings));\n if (theme === 'time-based') {\n applyTheme('time-based');\n }\n };\n\n const applyTheme = (mode: ThemeMode) => {\n let scheme: MantineColorScheme;\n\n switch (mode) {\n case 'light':\n case 'dark':\n case 'auto':\n scheme = mode;\n break;\n case 'time-based':\n scheme = resolveTimeBasedTheme(timeBasedSettings);\n break;\n default:\n scheme = 'auto';\n }\n\n setColorScheme(scheme);\n };\n\n useEffect(() => {\n applyTheme(theme);\n }, [theme, timeBasedSettings]);\n\n const setTheme = (mode: ThemeMode) => {\n setThemeState(mode);\n localStorage.setItem(themeStorageKey, mode);\n applyTheme(mode);\n };\n\n const toggleTheme = () => {\n setTheme(colorScheme === 'dark' ? 'light' : 'dark');\n };\n\n const currentTheme: 'light' | 'dark' =\n theme === 'time-based'\n ? resolveTimeBasedTheme(timeBasedSettings)\n : colorScheme === 'auto'\n ? resolveAutoScheme()\n : colorScheme;\n\n return (\n <ThemeContext.Provider\n value={{\n theme,\n currentTheme,\n setTheme,\n toggleTheme,\n timeBasedSettings,\n setTimeBasedSettings: handleSetTimeBasedSettings,\n }}\n >\n {children}\n </ThemeContext.Provider>\n );\n};\n","/**\r\n * @License OTMC License\r\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * @Contributors Trung Ng, OTMC Authors.\r\n**/\r\n\r\nimport {\r\n Box,\r\n Card,\r\n Divider,\r\n Group,\r\n SegmentedControl,\r\n Stack,\r\n Text,\r\n ThemeIcon,\r\n Title,\r\n type CardProps,\r\n} from '@mantine/core';\r\nimport { TimeInput } from '@mantine/dates';\r\nimport {\r\n IconClock,\r\n IconDeviceLaptop,\r\n IconMoon,\r\n IconPalette,\r\n IconSun,\r\n} from '@tabler/icons-react';\r\nimport type { ReactNode } from 'react';\r\n\r\nimport {\r\n useTheme,\r\n type ThemeMode,\r\n} from '../contexts/ThemeProvider';\r\n\r\nexport interface ThemeSettingLabels {\r\n title?: string;\r\n subtitle?: string;\r\n themeMode?: string;\r\n themeModeHint?: string;\r\n currentlyActive?: string;\r\n timeBasedSettings?: string;\r\n lightStartTime?: string;\r\n darkStartTime?: string;\r\n light?: string;\r\n dark?: string;\r\n system?: string;\r\n timeBased?: string;\r\n}\r\n\r\nexport interface ThemeSettingProps {\r\n modes?: ThemeMode[];\r\n labels?: ThemeSettingLabels;\r\n cardProps?: Partial<CardProps>;\r\n}\r\n\r\nconst DEFAULT_LABELS: Required<ThemeSettingLabels> = {\r\n title: 'Appearance',\r\n subtitle: 'Control how the application looks and feels',\r\n themeMode: 'Theme mode',\r\n themeModeHint: 'Auto will switch between light and dark based on time of day',\r\n currentlyActive: 'Currently active:',\r\n timeBasedSettings: 'Time-based settings',\r\n lightStartTime: 'Light theme start time',\r\n darkStartTime: 'Dark theme start time',\r\n light: 'Light',\r\n dark: 'Dark',\r\n system: 'System',\r\n timeBased: 'Time-based',\r\n};\r\n\r\nconst MODE_ICONS: Record<ThemeMode, ReactNode> = {\r\n light: <IconSun size={16} />,\r\n dark: <IconMoon size={16} />,\r\n auto: <IconDeviceLaptop size={16} />,\r\n 'time-based': <IconClock size={16} />,\r\n};\r\n\r\nconst MODE_ORDER: ThemeMode[] = ['light', 'dark', 'auto', 'time-based'];\r\n\r\nexport function ThemeSetting({\r\n modes = MODE_ORDER,\r\n labels = {},\r\n cardProps = {},\r\n}: ThemeSettingProps) {\r\n const {\r\n theme,\r\n timeBasedSettings,\r\n setTheme,\r\n setTimeBasedSettings,\r\n currentTheme,\r\n } = useTheme();\r\n\r\n const text = { ...DEFAULT_LABELS, ...labels };\r\n const isTimeBased = theme === 'time-based';\r\n const isDark = currentTheme === 'dark';\r\n const showTimeBased = modes.includes('time-based');\r\n\r\n return (\r\n <Card\r\n withBorder\r\n radius=\"lg\"\r\n p=\"25px\"\r\n bg={isDark ? 'dark.8' : 'gray.0'}\r\n style={{ flex: 1, overflow: 'auto', display: 'flex', flexDirection: 'column' }}\r\n {...cardProps}\r\n >\r\n <Stack gap=\"lg\" style={{ flex: 1 }}>\r\n <Box>\r\n <Group gap=\"xs\">\r\n <ThemeIcon variant=\"subtle\" color=\"blue.8\" size=\"md\" radius=\"md\">\r\n <IconPalette size={25} />\r\n </ThemeIcon>\r\n <Title order={4}>{text.title}</Title>\r\n </Group>\r\n <Text size=\"sm\" c=\"dimmed\">\r\n {text.subtitle}\r\n </Text>\r\n </Box>\r\n\r\n <Divider />\r\n\r\n <Box>\r\n <Text fw={500} mb={6}>\r\n {text.themeMode}\r\n </Text>\r\n\r\n <SegmentedControl\r\n fullWidth\r\n value={theme}\r\n radius=\"lg\"\r\n color=\"teal.8\"\r\n bg={isDark ? 'dark.6' : 'gray.3'}\r\n onChange={(value) => setTheme(value as ThemeMode)}\r\n data={MODE_ORDER.filter((mode) => modes.includes(mode)).map(\r\n (mode) => ({\r\n value: mode,\r\n label: (\r\n <Group gap={6}>\r\n {MODE_ICONS[mode]}\r\n <span>\r\n {mode === 'light'\r\n ? text.light\r\n : mode === 'dark'\r\n ? text.dark\r\n : mode === 'auto'\r\n ? text.system\r\n : text.timeBased}\r\n </span>\r\n </Group>\r\n ),\r\n })\r\n )}\r\n />\r\n\r\n <Text size=\"xs\" c=\"dimmed\" mt=\"xs\">\r\n {text.themeModeHint}\r\n </Text>\r\n\r\n <Text size=\"xs\" mt={4}>\r\n {text.currentlyActive}{' '}\r\n <b>{isDark ? text.dark : text.light}</b>\r\n </Text>\r\n </Box>\r\n\r\n {showTimeBased && (\r\n <>\r\n <Divider />\r\n\r\n <Box\r\n style={{\r\n opacity: isTimeBased ? 1 : 0.45,\r\n pointerEvents: isTimeBased ? 'auto' : 'none',\r\n transition: 'opacity 150ms ease',\r\n }}\r\n >\r\n <Group gap={6} mb={6}>\r\n <IconClock size={16} />\r\n <Text fw={500}>{text.timeBasedSettings}</Text>\r\n </Group>\r\n\r\n <Group grow>\r\n <Box>\r\n <Text size=\"sm\" mb={4}>\r\n {text.lightStartTime}\r\n </Text>\r\n <TimeInput\r\n withSeconds={false}\r\n radius=\"13px\"\r\n value={timeBasedSettings.lightStartTime}\r\n onChange={(event) =>\r\n setTimeBasedSettings({\r\n ...timeBasedSettings,\r\n lightStartTime: event.currentTarget.value,\r\n })\r\n }\r\n />\r\n </Box>\r\n\r\n <Box>\r\n <Text size=\"sm\" mb={4}>\r\n {text.darkStartTime}\r\n </Text>\r\n <TimeInput\r\n withSeconds={false}\r\n radius=\"13px\"\r\n value={timeBasedSettings.darkStartTime}\r\n onChange={(event) =>\r\n setTimeBasedSettings({\r\n ...timeBasedSettings,\r\n darkStartTime: event.currentTarget.value,\r\n })\r\n }\r\n />\r\n </Box>\r\n </Group>\r\n\r\n <Text size=\"xs\" c=\"dimmed\" mt=\"xs\">\r\n {text.light}: {timeBasedSettings.lightStartTime} →{' '}\r\n {timeBasedSettings.darkStartTime}\r\n <br />\r\n {text.dark}: {timeBasedSettings.darkStartTime} →{' '}\r\n {timeBasedSettings.lightStartTime}\r\n </Text>\r\n </Box>\r\n </>\r\n )}\r\n </Stack>\r\n </Card>\r\n );\r\n}\r\n","/***\n * OTMC License.\n * Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * Contributors: Nguyen Van Trung, OTMC Contributors.\n***/\n\nimport { useState, type ReactNode } from 'react';\nimport {\n Modal,\n Stack,\n Title,\n Text,\n Group,\n Divider,\n Badge,\n ThemeIcon,\n SimpleGrid,\n Paper,\n ActionIcon,\n Tooltip,\n useComputedColorScheme,\n} from '@mantine/core';\nimport {\n Award,\n Calendar,\n Check,\n Copy,\n Cpu,\n Copyright,\n Hash,\n MapPin,\n Tag,\n User,\n} from 'lucide-react';\n\nimport { Footer, type FooterSocialLink } from '../branding';\nimport { copyToClipboard } from '../utils/commonUtils';\nimport {\n DEFAULT_AUTHOR,\n DEFAULT_LICENSE,\n DEFAULT_LOCATION,\n DEFAULT_VERSION_TYPE,\n UNKNOWN,\n} from '../utils/constants';\nimport { formatAbsoluteAndRelativeTime } from '../utils/timeUtils';\n\nexport interface InformationMetadata {\n icon?: ReactNode;\n label: string;\n value: string;\n color?: string;\n}\n\nexport interface ApplicationInfo {\n name: string;\n version?: string;\n versionType?: string;\n tagline?: string;\n logo?: ReactNode;\n author?: string;\n authorHref?: string;\n license?: string;\n location?: string;\n copyright?: string;\n buildId?: string;\n buildTime?: string | number | Date;\n metadata?: InformationMetadata[];\n socialLinks?: FooterSocialLink[];\n}\n\nexport interface InformationContentProps {\n info: ApplicationInfo;\n}\n\nexport interface InformationModalProps {\n opened: boolean;\n onClose: () => void;\n info: ApplicationInfo;\n title?: ReactNode;\n}\n\nconst DEFAULT_TITLE = (\n <Group gap=\"xs\" wrap=\"nowrap\">\n <Cpu size={20} />\n <span>System Information</span>\n </Group>\n);\n\n\nexport function InformationContent({ info }: InformationContentProps) {\n const colorScheme = useComputedColorScheme();\n\n const author = info.author ?? DEFAULT_AUTHOR;\n const versionType = info.versionType ?? DEFAULT_VERSION_TYPE;\n\n const cards: InformationMetadata[] = [\n {\n icon: <User size={18} />,\n label: 'Author',\n value: author,\n color: 'blue',\n },\n {\n icon: <Award size={18} />,\n label: 'License',\n value: info.license ?? DEFAULT_LICENSE,\n color: 'orange',\n },\n {\n icon: <MapPin size={18} />,\n label: 'Location',\n value: info.location ?? DEFAULT_LOCATION,\n color: 'teal',\n },\n {\n icon: <Tag size={18} />,\n label: 'Version Type',\n value: versionType,\n color: 'red',\n },\n {\n icon: <Calendar size={18} />,\n label: 'Build Time',\n value:\n info.buildTime !== undefined\n ? formatAbsoluteAndRelativeTime(info.buildTime)\n : UNKNOWN,\n color: 'green',\n },\n ...(info.metadata ?? []),\n ];\n\n return (\n <Stack gap=\"lg\">\n <Stack gap=\"xs\" align=\"center\">\n {info.logo}\n\n <Stack gap={2} align=\"center\">\n <Title order={2}>{info.name}</Title>\n {info.tagline && (\n <Text size=\"sm\" c=\"dimmed\" w={600} ta=\"center\">\n {info.tagline}\n </Text>\n )}\n </Stack>\n\n <Group gap=\"xs\">\n {info.version && (\n <Badge\n size=\"lg\"\n color=\"blue\"\n variant=\"outline\"\n mt=\"sm\"\n tt=\"none\"\n fw={600}\n >\n ✨ v{info.version}\n </Badge>\n )}\n <Badge\n size=\"lg\"\n color=\"teal\"\n variant=\"light\"\n mt=\"sm\"\n tt=\"none\"\n fw={600}\n >\n 🧩 {versionType}\n </Badge>\n </Group>\n </Stack>\n\n <Divider label=\"System Information\" labelPosition=\"center\" />\n\n <SimpleGrid cols={{ base: 1, sm: 2 }}>\n {cards.map((card) => (\n <InfoCard\n key={card.label}\n icon={card.icon ?? <Award size={18} />}\n label={card.label}\n value={card.value}\n color={card.color ?? 'gray'}\n />\n ))}\n\n <Paper\n withBorder\n p=\"sm\"\n radius=\"18px\"\n bg={colorScheme === 'dark' ? 'gray.9' : 'gray.0'}\n >\n <Group justify=\"space-between\" wrap=\"nowrap\">\n <Group gap=\"sm\" flex={1}>\n <ThemeIcon variant=\"light\" color=\"yellow\" size=\"lg\" radius=\"14px\">\n <Hash size={18} />\n </ThemeIcon>\n\n <Stack gap={2}>\n <Text size=\"xs\" c=\"dimmed\" fw={700} tt=\"uppercase\">\n Build ID\n </Text>\n <Text size=\"sm\" fw={500} truncate>\n {info.buildId ?? UNKNOWN}\n </Text>\n </Stack>\n </Group>\n\n {info.buildId && <CopyBuildIdButton buildId={info.buildId} />}\n </Group>\n </Paper>\n </SimpleGrid>\n\n <Footer\n copyright={info.copyright}\n author={author}\n authorHref={info.authorHref}\n socialLinks={info.socialLinks}\n />\n </Stack>\n );\n}\n\nexport function InformationModal({\n opened,\n onClose,\n info,\n title = DEFAULT_TITLE,\n}: InformationModalProps) {\n return (\n <Modal\n opened={opened}\n onClose={onClose}\n withCloseButton\n centered\n radius=\"lg\"\n size=\"60%\"\n styles={{\n content: {\n maxHeight: '90vh',\n height: '90vh',\n },\n body: {\n flex: 1,\n overflow: 'auto',\n },\n }}\n title={title}\n >\n <InformationContent info={info} />\n </Modal>\n );\n}\n\nfunction CopyBuildIdButton({ buildId }: { buildId: string }) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async () => {\n const success = await copyToClipboard(buildId);\n if (success) {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n };\n\n return (\n <Tooltip label={copied ? 'Copied!' : 'Copy ID'} withArrow>\n <ActionIcon\n variant=\"subtle\"\n color={copied ? 'teal' : 'gray'}\n onClick={handleCopy}\n >\n {copied ? <Check size={16} /> : <Copy size={16} />}\n </ActionIcon>\n </Tooltip>\n );\n}\n\nfunction InfoCard({\n icon,\n label,\n value,\n color,\n}: {\n icon: ReactNode;\n label: string;\n value: string;\n color: string;\n}) {\n const colorScheme = useComputedColorScheme();\n return (\n <Paper withBorder p=\"md\" radius=\"18px\" h=\"100%\" bg={colorScheme === 'dark' ? 'gray.9' : 'gray.0'}>\n <Group gap=\"sm\" align=\"flex-start\">\n <ThemeIcon color={color} variant=\"light\" size=\"lg\" radius=\"14px\">\n {icon}\n </ThemeIcon>\n\n <Stack gap={2} flex={1}>\n <Text size=\"xs\" c=\"dimmed\" fw={700} tt=\"uppercase\">\n {label}\n </Text>\n <Text size=\"sm\" fw={500} lineClamp={1}>\n {value}\n </Text>\n </Stack>\n </Group>\n </Paper>\n );\n}\n\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nexport const copyToClipboard = async (text: string): Promise<boolean> => {\n try {\n if (navigator.clipboard && window.isSecureContext) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n \n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.left = '-9999px';\n textarea.style.top = '-9999px';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n \n const success = document.execCommand('copy');\n document.body.removeChild(textarea);\n \n return success;\n } catch (err) {\n console.error('Failed to copy to clipboard:', err);\n return false;\n }\n};\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\n\nexport type TimestampFormatType = \"absolute\" | \"relative\";\n\n\nexport function normalizeDate(dateInput: string | number | Date): Date | null {\n if (dateInput instanceof Date) {\n return isNaN(dateInput.getTime()) ? null : dateInput;\n }\n\n if (typeof dateInput === 'string') {\n const date = new Date(dateInput);\n return isNaN(date.getTime()) ? null : date;\n }\n\n if (typeof dateInput === 'number') {\n const timestamp = dateInput < 1e12 ? dateInput * 1000 : dateInput;\n const date = new Date(timestamp);\n return isNaN(date.getTime()) ? null : date;\n }\n\n return null;\n}\n\nexport function pad(n: number, width: number = 2): string {\n return String(n).padStart(width, \"0\");\n}\n\nexport function formatAbsolute(date: Date): string {\n const tz = -date.getTimezoneOffset();\n const sign = tz >= 0 ? \"+\" : \"-\";\n \n return (\n `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ` +\n `${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())} ` +\n `${sign}${pad(Math.floor(Math.abs(tz) / 60))}:${pad(Math.abs(tz) % 60)}`\n );\n}\n\nexport function formatRelativeTime(date: string | number | Date): string {\n const normalizedDate = normalizeDate(date);\n if (!normalizedDate) return \"Invalid date\";\n\n const now = Date.now();\n const diffMs = now - normalizedDate.getTime();\n const diffSeconds = Math.floor(diffMs / 1000);\n\n if (diffSeconds < 0) {\n return \"Just now\";\n }\n\n if (diffSeconds < 60) {\n return \"Just now\";\n }\n\n const minute = 60;\n const hour = minute * 60;\n const day = hour * 24;\n const week = day * 7;\n const month = day * 30;\n const year = day * 365;\n\n if (diffSeconds < hour) {\n const mins = Math.floor(diffSeconds / minute);\n return `${mins} min${mins !== 1 ? 's' : ''} ago`;\n } else if (diffSeconds < day) {\n const hours = Math.floor(diffSeconds / hour);\n return `${hours} hour${hours !== 1 ? 's' : ''} ago`;\n } else if (diffSeconds < week) {\n const days = Math.floor(diffSeconds / day);\n return `${days} day${days !== 1 ? 's' : ''} ago`;\n } else if (diffSeconds < month) {\n const weeks = Math.floor(diffSeconds / week);\n return `${weeks} week${weeks !== 1 ? 's' : ''} ago`;\n } else if (diffSeconds < year) {\n const months = Math.floor(diffSeconds / month);\n return `${months} month${months !== 1 ? 's' : ''} ago`;\n } else {\n const years = Math.floor(diffSeconds / year);\n return `${years} year${years !== 1 ? 's' : ''} ago`;\n }\n}\n\nexport function formatAbsoluteAndRelativeTime(date: string | number | Date): string {\n const normalizedDate = normalizeDate(date);\n if (!normalizedDate) return \"Invalid date\";\n\n const absoluteTime = formatAbsolute(normalizedDate);\n const relativeTime = formatRelativeTime(normalizedDate);\n\n return `${absoluteTime} (${relativeTime})`;\n}\n\nexport function calculateRemainingTime(targetDate: string | number | Date | undefined): string {\n if (!targetDate) return 'Not set';\n\n const normalizedDate = normalizeDate(targetDate);\n if (!normalizedDate) return 'Invalid date';\n\n const now = new Date();\n const diffMs = normalizedDate.getTime() - now.getTime();\n\n if (diffMs < 0) {\n const daysOverdue = Math.floor(Math.abs(diffMs) / (1000 * 60 * 60 * 24));\n return `Overdue ${daysOverdue}d`;\n }\n\n const days = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n const hours = Math.floor((diffMs % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));\n\n if (days > 0) {\n return `${days}d ${hours}h`;\n } else if (hours > 0) {\n return `${hours}h`;\n } else {\n return '< 1h';\n }\n}\n\nconst MONTH_NAMES = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\nexport function formatHumanDate(date: string | number | Date, options?: { showTime?: boolean; showSeconds?: boolean }): string {\n const normalizedDate = normalizeDate(date);\n if (!normalizedDate) return 'Invalid date';\n\n const month = MONTH_NAMES[normalizedDate.getMonth()];\n const day = normalizedDate.getDate();\n const year = normalizedDate.getFullYear();\n\n if (!options?.showTime) {\n return `${month} ${day}, ${year}`;\n }\n\n const hours = normalizedDate.getHours();\n const minutes = normalizedDate.getMinutes();\n const seconds = normalizedDate.getSeconds();\n const ampm = hours >= 12 ? 'PM' : 'AM';\n const hours12 = hours % 12 || 12;\n\n let timeStr = `${hours12}:${pad(minutes)}`;\n if (options.showSeconds) {\n timeStr += `:${pad(seconds)}`;\n }\n timeStr += ` ${ampm}`;\n\n return `${month} ${day}, ${year} ${timeStr}`;\n}\n\n","import {\n Box,\n Button,\n Container,\n Group,\n Paper,\n Text,\n Title,\n Code,\n Badge,\n} from '@mantine/core';\nimport {\n IconArrowLeft,\n IconHome,\n IconSearch,\n IconFileOff,\n} from '@tabler/icons-react';\n\nexport interface NotFoundProps {\n /** Đường dẫn bị lỗi (mặc định lấy theo URL hiện tại nếu không truyền) */\n path?: string;\n /** Callback khi nhấn tìm kiếm docs */\n onSearchClick?: () => void;\n /** Callback khi quay lại trang chủ */\n onHomeClick?: () => void;\n}\n\nexport function NotFound({\n path,\n onSearchClick,\n onHomeClick,\n}: NotFoundProps) {\n const currentPath =\n path || (typeof window !== 'undefined' ? window.location.pathname : '/404');\n\n return (\n <Box\n style={{\n minHeight: '100vh',\n display: 'flex',\n alignItems: 'center',\n background:\n 'radial-gradient(circle at top left, rgba(34, 139, 230, 0.15), transparent 45%), radial-gradient(circle at bottom right, rgba(34, 211, 238, 0.12), transparent 45%), var(--mantine-color-body)',\n }}\n >\n <Container size=\"xl\" py={80}>\n <Paper radius=\"xl\" p={48} withBorder style={{ borderColor: 'var(--mantine-color-default-border)', textAlign: 'center' }}>\n {/* Icon Badge */}\n <Box\n mx=\"auto\"\n mb=\"xl\"\n w={96}\n h={96}\n style={{\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background:\n 'linear-gradient(135deg, var(--mantine-color-blue-6), var(--mantine-color-cyan-6))',\n boxShadow: '0 12px 32px rgba(34, 139, 230, 0.35)',\n }}\n >\n <IconFileOff size={44} stroke={1.5} color=\"white\" />\n </Box>\n\n {/* Big 404 */}\n <Text\n fz={{ base: 72, sm: 100 }}\n fw={900}\n lh={1}\n variant=\"gradient\"\n gradient={{ from: 'blue.7', to: 'cyan.5', deg: 45 }}\n >\n 404\n </Text>\n\n <Badge variant=\"light\" color=\"blue\" size=\"lg\" mb=\"xs\">\n NOT FOUND\n </Badge>\n\n <Title order={2} mt=\"sm\" mb=\"xs\">\n Trang không tồn tại\n </Title>\n\n <Text c=\"dimmed\" size=\"sm\" maw={440} mx=\"auto\">\n Trang hoặc đường dẫn bạn truy cập không tồn tại hoặc đã được di\n chuyển. Vui lòng kiểm tra lại đường dẫn hoặc quay về trang chủ.\n </Text>\n\n {/* Missing path */}\n <Box mt=\"lg\">\n <Code color=\"blue\" variant=\"light\" px=\"md\" py={6}>\n {currentPath}\n </Code>\n </Box>\n\n {/* Actions */}\n <Group gap=\"sm\" mt=\"xl\" justify=\"center\">\n <Button\n variant=\"light\"\n leftSection={<IconArrowLeft size={16} />}\n onClick={() => window.history.back()}\n >\n Quay lại\n </Button>\n\n {onSearchClick && (\n <Button\n variant=\"outline\"\n leftSection={<IconSearch size={16} />}\n onClick={onSearchClick}\n >\n Tìm Docs\n </Button>\n )}\n\n <Button\n leftSection={<IconHome size={16} />}\n onClick={onHomeClick || (() => (window.location.href = '/'))}\n >\n Trang chủ\n </Button>\n </Group>\n </Paper>\n </Container>\n </Box>\n );\n}\n\nexport default NotFound;\n","/**\r\n * @License OTMC License\r\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * @Contributors Trung Ng, OTMC Authors.\r\n**/\r\nconst env: Record<string, string | undefined> =\r\n ((globalThis as any).process?.env as Record<string, string | undefined>) ?? {};\r\n\r\nconst shouldLog = env.NODE_ENV !== 'production';\r\n\r\nconst debugInclude = (() => {\r\n try {\r\n const envValue =\r\n (globalThis as any).__OTMC_DEBUG_INCLUDE__ ?? env.OTMC_DEBUG_INCLUDE;\r\n if (envValue) {\r\n return JSON.parse(envValue);\r\n }\r\n } catch (e) {\r\n console.warn('Failed to parse OTMC_DEBUG_INCLUDE:', e);\r\n }\r\n return [];\r\n})();\r\n\r\nconst shouldLogForFile = (fileName?: string): boolean => {\r\n if (!shouldLog) return false;\r\n if (!fileName || debugInclude.length === 0) return true;\r\n return debugInclude.some((included: string) => fileName.includes(included));\r\n};\r\n\r\nconst getCallingFile = (): string | undefined => {\r\n const stack = new Error().stack;\r\n if (!stack) return undefined;\r\n\r\n const lines = stack.split('\\n');\r\n for (let i = 3; i < lines.length; i++) {\r\n const line = lines[i];\r\n const match = line.match(/at .*?\\((.+?):\\d+:\\d+\\)|at (.+?):\\d+:\\d+/);\r\n if (match) {\r\n const filePath = match[1] || match[2];\r\n const fileName = filePath.split('/').pop();\r\n return fileName;\r\n }\r\n }\r\n return undefined;\r\n};\r\n\r\nexport const debug = {\r\n log: (...args: any[]) => {\r\n const fileName = getCallingFile();\r\n if (shouldLogForFile(fileName)) {\r\n console.log(...args);\r\n }\r\n },\r\n warn: (...args: any[]) => {\r\n const fileName = getCallingFile();\r\n if (shouldLogForFile(fileName)) {\r\n console.warn(...args);\r\n }\r\n },\r\n error: (...args: any[]) => {\r\n const fileName = getCallingFile();\r\n if (shouldLogForFile(fileName)) {\r\n console.error(...args);\r\n }\r\n },\r\n table: (...args: any[]) => {\r\n const fileName = getCallingFile();\r\n if (shouldLogForFile(fileName)) {\r\n console.table(...args);\r\n }\r\n },\r\n withFile: (fileName: string) => ({\r\n log: (...args: any[]) => {\r\n if (shouldLogForFile(fileName)) {\r\n console.log(...args);\r\n }\r\n },\r\n warn: (...args: any[]) => {\r\n if (shouldLogForFile(fileName)) {\r\n console.warn(...args);\r\n }\r\n },\r\n error: (...args: any[]) => {\r\n if (shouldLogForFile(fileName)) {\r\n console.error(...args);\r\n }\r\n },\r\n table: (...args: any[]) => {\r\n if (shouldLogForFile(fileName)) {\r\n console.table(...args);\r\n }\r\n },\r\n }),\r\n};\r\n"],"mappings":"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","names":["import_icons_react","import_jsx_runtime","import_core","import_lucide_react","import_core","import_jsx_runtime","import_jsx_runtime","import_core","import_icons_react","import_jsx_runtime","DEFAULT_LABELS","MODE_ICONS","import_react","import_core","import_lucide_react","import_jsx_runtime","import_core","import_icons_react","import_jsx_runtime"]}
package/dist/index.d.cts CHANGED
@@ -1,3 +1,4 @@
1
+ export { A as ApiResponse, B as BACKEND_URL, E as ErrorResponse, F as FormatDocumentRequest, a as FormatDocumentResponse, G as GenerateDocumentRequest, b as GenerateDocumentResponse, I as Instruction, L as LLMConfigResponse, c as LLMReloadResponse, d as LLMRequest, e as LLMResponse, f as LLMTestResponse, S as SuccessResponse, g as apiClient, h as apiUtils, i as getBackendUrl, j as instructionsApi, l as llmApi, s as setAccessTokenGetter, k as setBackendUrl } from './instructions-CCxIhaa6.cjs';
1
2
  import * as react from 'react';
2
3
  import react__default, { ReactNode } from 'react';
3
4
  import { ActionIconProps, MenuProps, CardProps } from '@mantine/core';
@@ -87,6 +88,18 @@ interface ThemeSettingProps {
87
88
  }
88
89
  declare function ThemeSetting({ modes, labels, cardProps, }: ThemeSettingProps): react.JSX.Element;
89
90
 
91
+ interface NotificationOptions {
92
+ title: string;
93
+ message?: string;
94
+ autoClose?: number;
95
+ }
96
+ declare const notificationCenter: {
97
+ error: ({ title, message, autoClose }: NotificationOptions) => void;
98
+ warn: ({ title, message, autoClose }: NotificationOptions) => void;
99
+ info: ({ title, message, autoClose }: NotificationOptions) => void;
100
+ success: ({ title, message, autoClose }: NotificationOptions) => void;
101
+ };
102
+
90
103
  interface InformationMetadata {
91
104
  icon?: ReactNode;
92
105
  label: string;
@@ -138,6 +151,19 @@ declare function NotFound({ path, onSearchClick, onHomeClick, }: NotFoundProps):
138
151
  **/
139
152
  declare const copyToClipboard: (text: string) => Promise<boolean>;
140
153
 
154
+ declare const debug: {
155
+ log: (...args: any[]) => void;
156
+ warn: (...args: any[]) => void;
157
+ error: (...args: any[]) => void;
158
+ table: (...args: any[]) => void;
159
+ withFile: (fileName: string) => {
160
+ log: (...args: any[]) => void;
161
+ warn: (...args: any[]) => void;
162
+ error: (...args: any[]) => void;
163
+ table: (...args: any[]) => void;
164
+ };
165
+ };
166
+
141
167
  /**
142
168
  * @License OTMC License
143
169
  * @Copyright (c) 2026 OTMC Softwares. All rights reserved.
@@ -168,4 +194,4 @@ declare function formatHumanDate(date: string | number | Date, options?: {
168
194
  showSeconds?: boolean;
169
195
  }): string;
170
196
 
171
- export { type ApplicationInfo, DEFAULT_AUTHOR, DEFAULT_AUTHOR_HREF, DEFAULT_COPYRIGHT, DEFAULT_LICENSE, DEFAULT_LOCATION, DEFAULT_VERSION_TYPE, Footer, type FooterProps, type FooterSocialLink, InformationContent, type InformationContentProps, type InformationMetadata, InformationModal, type InformationModalProps, NotFound, type NotFoundProps, type ThemeContextType, ThemeMenu, type ThemeMenuLabels, type ThemeMenuProps, type ThemeMode, ThemeProvider, type ThemeProviderProps, ThemeSetting, type ThemeSettingLabels, type ThemeSettingProps, type TimeBasedSettings, type TimestampFormatType, UNKNOWN, calculateRemainingTime, copyToClipboard, formatAbsolute, formatAbsoluteAndRelativeTime, formatHumanDate, formatRelativeTime, normalizeDate, pad, resolveColorScheme, useTheme };
197
+ export { type ApplicationInfo, DEFAULT_AUTHOR, DEFAULT_AUTHOR_HREF, DEFAULT_COPYRIGHT, DEFAULT_LICENSE, DEFAULT_LOCATION, DEFAULT_VERSION_TYPE, Footer, type FooterProps, type FooterSocialLink, InformationContent, type InformationContentProps, type InformationMetadata, InformationModal, type InformationModalProps, NotFound, type NotFoundProps, type ThemeContextType, ThemeMenu, type ThemeMenuLabels, type ThemeMenuProps, type ThemeMode, ThemeProvider, type ThemeProviderProps, ThemeSetting, type ThemeSettingLabels, type ThemeSettingProps, type TimeBasedSettings, type TimestampFormatType, UNKNOWN, calculateRemainingTime, copyToClipboard, debug, formatAbsolute, formatAbsoluteAndRelativeTime, formatHumanDate, formatRelativeTime, normalizeDate, notificationCenter, pad, resolveColorScheme, useTheme };
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export { A as ApiResponse, B as BACKEND_URL, E as ErrorResponse, F as FormatDocumentRequest, a as FormatDocumentResponse, G as GenerateDocumentRequest, b as GenerateDocumentResponse, I as Instruction, L as LLMConfigResponse, c as LLMReloadResponse, d as LLMRequest, e as LLMResponse, f as LLMTestResponse, S as SuccessResponse, g as apiClient, h as apiUtils, i as getBackendUrl, j as instructionsApi, l as llmApi, s as setAccessTokenGetter, k as setBackendUrl } from './instructions-CCxIhaa6.js';
1
2
  import * as react from 'react';
2
3
  import react__default, { ReactNode } from 'react';
3
4
  import { ActionIconProps, MenuProps, CardProps } from '@mantine/core';
@@ -87,6 +88,18 @@ interface ThemeSettingProps {
87
88
  }
88
89
  declare function ThemeSetting({ modes, labels, cardProps, }: ThemeSettingProps): react.JSX.Element;
89
90
 
91
+ interface NotificationOptions {
92
+ title: string;
93
+ message?: string;
94
+ autoClose?: number;
95
+ }
96
+ declare const notificationCenter: {
97
+ error: ({ title, message, autoClose }: NotificationOptions) => void;
98
+ warn: ({ title, message, autoClose }: NotificationOptions) => void;
99
+ info: ({ title, message, autoClose }: NotificationOptions) => void;
100
+ success: ({ title, message, autoClose }: NotificationOptions) => void;
101
+ };
102
+
90
103
  interface InformationMetadata {
91
104
  icon?: ReactNode;
92
105
  label: string;
@@ -138,6 +151,19 @@ declare function NotFound({ path, onSearchClick, onHomeClick, }: NotFoundProps):
138
151
  **/
139
152
  declare const copyToClipboard: (text: string) => Promise<boolean>;
140
153
 
154
+ declare const debug: {
155
+ log: (...args: any[]) => void;
156
+ warn: (...args: any[]) => void;
157
+ error: (...args: any[]) => void;
158
+ table: (...args: any[]) => void;
159
+ withFile: (fileName: string) => {
160
+ log: (...args: any[]) => void;
161
+ warn: (...args: any[]) => void;
162
+ error: (...args: any[]) => void;
163
+ table: (...args: any[]) => void;
164
+ };
165
+ };
166
+
141
167
  /**
142
168
  * @License OTMC License
143
169
  * @Copyright (c) 2026 OTMC Softwares. All rights reserved.
@@ -168,4 +194,4 @@ declare function formatHumanDate(date: string | number | Date, options?: {
168
194
  showSeconds?: boolean;
169
195
  }): string;
170
196
 
171
- export { type ApplicationInfo, DEFAULT_AUTHOR, DEFAULT_AUTHOR_HREF, DEFAULT_COPYRIGHT, DEFAULT_LICENSE, DEFAULT_LOCATION, DEFAULT_VERSION_TYPE, Footer, type FooterProps, type FooterSocialLink, InformationContent, type InformationContentProps, type InformationMetadata, InformationModal, type InformationModalProps, NotFound, type NotFoundProps, type ThemeContextType, ThemeMenu, type ThemeMenuLabels, type ThemeMenuProps, type ThemeMode, ThemeProvider, type ThemeProviderProps, ThemeSetting, type ThemeSettingLabels, type ThemeSettingProps, type TimeBasedSettings, type TimestampFormatType, UNKNOWN, calculateRemainingTime, copyToClipboard, formatAbsolute, formatAbsoluteAndRelativeTime, formatHumanDate, formatRelativeTime, normalizeDate, pad, resolveColorScheme, useTheme };
197
+ export { type ApplicationInfo, DEFAULT_AUTHOR, DEFAULT_AUTHOR_HREF, DEFAULT_COPYRIGHT, DEFAULT_LICENSE, DEFAULT_LOCATION, DEFAULT_VERSION_TYPE, Footer, type FooterProps, type FooterSocialLink, InformationContent, type InformationContentProps, type InformationMetadata, InformationModal, type InformationModalProps, NotFound, type NotFoundProps, type ThemeContextType, ThemeMenu, type ThemeMenuLabels, type ThemeMenuProps, type ThemeMode, ThemeProvider, type ThemeProviderProps, ThemeSetting, type ThemeSettingLabels, type ThemeSettingProps, type TimeBasedSettings, type TimestampFormatType, UNKNOWN, calculateRemainingTime, copyToClipboard, debug, formatAbsolute, formatAbsoluteAndRelativeTime, formatHumanDate, formatRelativeTime, normalizeDate, notificationCenter, pad, resolveColorScheme, useTheme };