@otmc/ui 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -32,6 +32,7 @@ __export(index_exports, {
32
32
  NotFound: () => NotFound,
33
33
  ThemeMenu: () => ThemeMenu,
34
34
  ThemeProvider: () => ThemeProvider,
35
+ ThemeSetting: () => ThemeSetting,
35
36
  UNKNOWN: () => UNKNOWN,
36
37
  calculateRemainingTime: () => calculateRemainingTime,
37
38
  copyToClipboard: () => copyToClipboard,
@@ -48,6 +49,7 @@ module.exports = __toCommonJS(index_exports);
48
49
 
49
50
  // src/branding/Footer.tsx
50
51
  var import_core = require("@mantine/core");
52
+ var import_lucide_react = require("lucide-react");
51
53
  var import_icons_react = require("@tabler/icons-react");
52
54
 
53
55
  // src/utils/constants.ts
@@ -98,7 +100,7 @@ function Footer({
98
100
  "Copyright",
99
101
  " "
100
102
  ] }),
101
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons_react.IconCopyright, { size: 15 }),
103
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Copyright, { size: 15, color: "var(--mantine-color-dimmed)" }),
102
104
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.Text, { size: "xs", c: "dimmed", children: [
103
105
  (/* @__PURE__ */ new Date()).getFullYear(),
104
106
  " ",
@@ -144,7 +146,7 @@ function Footer({
144
146
 
145
147
  // src/components/ThemeMenu.tsx
146
148
  var import_core3 = require("@mantine/core");
147
- var import_lucide_react = require("lucide-react");
149
+ var import_lucide_react2 = require("lucide-react");
148
150
 
149
151
  // src/contexts/ThemeProvider.tsx
150
152
  var import_react = require("react");
@@ -254,10 +256,10 @@ var DEFAULT_LABELS = {
254
256
  timeBased: "Theo th\u1EDDi gian"
255
257
  };
256
258
  var MODE_ICONS = {
257
- light: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react.Sun, { size: 16 }),
258
- dark: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react.Moon, { size: 16 }),
259
- auto: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react.Monitor, { size: 16 }),
260
- "time-based": /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react.Clock, { size: 16 })
259
+ light: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react2.Sun, { size: 16 }),
260
+ dark: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react2.Moon, { size: 16 }),
261
+ auto: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react2.Monitor, { size: 16 }),
262
+ "time-based": /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react2.Clock, { size: 16 })
261
263
  };
262
264
  function ThemeMenu({
263
265
  modes = ["light", "dark", "auto", "time-based"],
@@ -270,7 +272,7 @@ function ThemeMenu({
270
272
  const text = { ...DEFAULT_LABELS, ...labels };
271
273
  const isDark = currentTheme === "dark";
272
274
  const activeColor = isDark ? "yellow.8" : "blue.8";
273
- const triggerIcon = theme === "light" ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react.Sun, { size: iconSize, strokeWidth: 2 }) : theme === "dark" ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react.Moon, { size: iconSize, strokeWidth: 2 }) : theme === "auto" ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react.Monitor, { size: iconSize, strokeWidth: 2 }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react.Clock, { size: iconSize, strokeWidth: 2 });
275
+ const triggerIcon = theme === "light" ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react2.Sun, { size: iconSize, strokeWidth: 2 }) : theme === "dark" ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react2.Moon, { size: iconSize, strokeWidth: 2 }) : theme === "auto" ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react2.Monitor, { size: iconSize, strokeWidth: 2 }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react2.Clock, { size: iconSize, strokeWidth: 2 });
274
276
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_core3.Menu, { shadow: "md", width: 200, position: "bottom-end", ...menuProps, children: [
275
277
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_core3.Menu.Target, { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_core3.Tooltip, { label: text.tooltip, position: "bottom", withArrow: true, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
276
278
  import_core3.ActionIcon,
@@ -302,10 +304,170 @@ function ThemeMenu({
302
304
  ] });
303
305
  }
304
306
 
305
- // src/modals/Information.tsx
306
- var import_react2 = require("react");
307
+ // src/components/ThemeSetting.tsx
307
308
  var import_core4 = require("@mantine/core");
309
+ var import_dates = require("@mantine/dates");
308
310
  var import_icons_react2 = require("@tabler/icons-react");
311
+ var import_jsx_runtime4 = require("react/jsx-runtime");
312
+ var DEFAULT_LABELS2 = {
313
+ title: "Appearance",
314
+ subtitle: "Control how the application looks and feels",
315
+ themeMode: "Theme mode",
316
+ themeModeHint: "Auto will switch between light and dark based on time of day",
317
+ currentlyActive: "Currently active:",
318
+ timeBasedSettings: "Time-based settings",
319
+ lightStartTime: "Light theme start time",
320
+ darkStartTime: "Dark theme start time",
321
+ light: "Light",
322
+ dark: "Dark",
323
+ system: "System",
324
+ timeBased: "Time-based"
325
+ };
326
+ var MODE_ICONS2 = {
327
+ light: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons_react2.IconSun, { size: 16 }),
328
+ dark: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons_react2.IconMoon, { size: 16 }),
329
+ auto: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons_react2.IconDeviceLaptop, { size: 16 }),
330
+ "time-based": /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons_react2.IconClock, { size: 16 })
331
+ };
332
+ var MODE_ORDER = ["light", "dark", "auto", "time-based"];
333
+ function ThemeSetting({
334
+ modes = MODE_ORDER,
335
+ labels = {},
336
+ cardProps = {}
337
+ }) {
338
+ const {
339
+ theme,
340
+ timeBasedSettings,
341
+ setTheme,
342
+ setTimeBasedSettings,
343
+ currentTheme
344
+ } = useTheme();
345
+ const text = { ...DEFAULT_LABELS2, ...labels };
346
+ const isTimeBased = theme === "time-based";
347
+ const isDark = currentTheme === "dark";
348
+ const showTimeBased = modes.includes("time-based");
349
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
350
+ import_core4.Card,
351
+ {
352
+ withBorder: true,
353
+ radius: "lg",
354
+ p: "25px",
355
+ bg: isDark ? "dark.8" : "gray.0",
356
+ style: { flex: 1, overflow: "auto", display: "flex", flexDirection: "column" },
357
+ ...cardProps,
358
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Stack, { gap: "lg", style: { flex: 1 }, children: [
359
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Box, { children: [
360
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Group, { gap: "xs", children: [
361
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.ThemeIcon, { variant: "subtle", color: "blue.8", size: "md", radius: "md", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons_react2.IconPalette, { size: 25 }) }),
362
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.Title, { order: 4, children: text.title })
363
+ ] }),
364
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.Text, { size: "sm", c: "dimmed", children: text.subtitle })
365
+ ] }),
366
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.Divider, {}),
367
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Box, { children: [
368
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.Text, { fw: 500, mb: 6, children: text.themeMode }),
369
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
370
+ import_core4.SegmentedControl,
371
+ {
372
+ fullWidth: true,
373
+ value: theme,
374
+ radius: "lg",
375
+ color: "teal.8",
376
+ bg: isDark ? "dark.6" : "gray.3",
377
+ onChange: (value) => setTheme(value),
378
+ data: MODE_ORDER.filter((mode) => modes.includes(mode)).map(
379
+ (mode) => ({
380
+ value: mode,
381
+ label: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Group, { gap: 6, children: [
382
+ MODE_ICONS2[mode],
383
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: mode === "light" ? text.light : mode === "dark" ? text.dark : mode === "auto" ? text.system : text.timeBased })
384
+ ] })
385
+ })
386
+ )
387
+ }
388
+ ),
389
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.Text, { size: "xs", c: "dimmed", mt: "xs", children: text.themeModeHint }),
390
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Text, { size: "xs", mt: 4, children: [
391
+ text.currentlyActive,
392
+ " ",
393
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("b", { children: isDark ? text.dark : text.light })
394
+ ] })
395
+ ] }),
396
+ showTimeBased && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
397
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.Divider, {}),
398
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
399
+ import_core4.Box,
400
+ {
401
+ style: {
402
+ opacity: isTimeBased ? 1 : 0.45,
403
+ pointerEvents: isTimeBased ? "auto" : "none",
404
+ transition: "opacity 150ms ease"
405
+ },
406
+ children: [
407
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Group, { gap: 6, mb: 6, children: [
408
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons_react2.IconClock, { size: 16 }),
409
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.Text, { fw: 500, children: text.timeBasedSettings })
410
+ ] }),
411
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Group, { grow: true, children: [
412
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Box, { children: [
413
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.Text, { size: "sm", mb: 4, children: text.lightStartTime }),
414
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
415
+ import_dates.TimeInput,
416
+ {
417
+ withSeconds: false,
418
+ radius: "13px",
419
+ value: timeBasedSettings.lightStartTime,
420
+ onChange: (event) => setTimeBasedSettings({
421
+ ...timeBasedSettings,
422
+ lightStartTime: event.currentTarget.value
423
+ })
424
+ }
425
+ )
426
+ ] }),
427
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Box, { children: [
428
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.Text, { size: "sm", mb: 4, children: text.darkStartTime }),
429
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
430
+ import_dates.TimeInput,
431
+ {
432
+ withSeconds: false,
433
+ radius: "13px",
434
+ value: timeBasedSettings.darkStartTime,
435
+ onChange: (event) => setTimeBasedSettings({
436
+ ...timeBasedSettings,
437
+ darkStartTime: event.currentTarget.value
438
+ })
439
+ }
440
+ )
441
+ ] })
442
+ ] }),
443
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Text, { size: "xs", c: "dimmed", mt: "xs", children: [
444
+ text.light,
445
+ ": ",
446
+ timeBasedSettings.lightStartTime,
447
+ " \u2192",
448
+ " ",
449
+ timeBasedSettings.darkStartTime,
450
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("br", {}),
451
+ text.dark,
452
+ ": ",
453
+ timeBasedSettings.darkStartTime,
454
+ " \u2192",
455
+ " ",
456
+ timeBasedSettings.lightStartTime
457
+ ] })
458
+ ]
459
+ }
460
+ )
461
+ ] })
462
+ ] })
463
+ }
464
+ );
465
+ }
466
+
467
+ // src/modals/Information.tsx
468
+ var import_react2 = require("react");
469
+ var import_core5 = require("@mantine/core");
470
+ var import_lucide_react3 = require("lucide-react");
309
471
 
310
472
  // src/utils/commonUtils.ts
311
473
  var copyToClipboard = async (text) => {
@@ -445,58 +607,58 @@ function formatHumanDate(date, options) {
445
607
  }
446
608
 
447
609
  // src/modals/Information.tsx
448
- var import_jsx_runtime4 = require("react/jsx-runtime");
449
- var DEFAULT_TITLE = /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Group, { gap: "xs", wrap: "nowrap", children: [
450
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons_react2.IconCpu, { size: 20 }),
451
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: "System Information" })
610
+ var import_jsx_runtime5 = require("react/jsx-runtime");
611
+ var DEFAULT_TITLE = /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_core5.Group, { gap: "xs", wrap: "nowrap", children: [
612
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react3.Cpu, { size: 20 }),
613
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { children: "System Information" })
452
614
  ] });
453
615
  function InformationContent({ info }) {
454
- const colorScheme = (0, import_core4.useComputedColorScheme)();
616
+ const colorScheme = (0, import_core5.useComputedColorScheme)();
455
617
  const author = info.author ?? DEFAULT_AUTHOR;
456
618
  const versionType = info.versionType ?? DEFAULT_VERSION_TYPE;
457
619
  const cards = [
458
620
  {
459
- icon: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons_react2.IconUser, { size: 18 }),
621
+ icon: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react3.User, { size: 18 }),
460
622
  label: "Author",
461
623
  value: author,
462
624
  color: "blue"
463
625
  },
464
626
  {
465
- icon: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons_react2.IconLicense, { size: 18 }),
627
+ icon: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react3.Award, { size: 18 }),
466
628
  label: "License",
467
629
  value: info.license ?? DEFAULT_LICENSE,
468
630
  color: "orange"
469
631
  },
470
632
  {
471
- icon: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons_react2.IconMapPin, { size: 18 }),
633
+ icon: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react3.MapPin, { size: 18 }),
472
634
  label: "Location",
473
635
  value: info.location ?? DEFAULT_LOCATION,
474
636
  color: "teal"
475
637
  },
476
638
  {
477
- icon: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons_react2.IconTag, { size: 18 }),
639
+ icon: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react3.Tag, { size: 18 }),
478
640
  label: "Version Type",
479
641
  value: versionType,
480
642
  color: "red"
481
643
  },
482
644
  {
483
- icon: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons_react2.IconCalendar, { size: 18 }),
645
+ icon: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react3.Calendar, { size: 18 }),
484
646
  label: "Build Time",
485
647
  value: info.buildTime !== void 0 ? formatAbsoluteAndRelativeTime(info.buildTime) : UNKNOWN,
486
648
  color: "green"
487
649
  },
488
650
  ...info.metadata ?? []
489
651
  ];
490
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Stack, { gap: "lg", children: [
491
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Stack, { gap: "xs", align: "center", children: [
652
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_core5.Stack, { gap: "lg", children: [
653
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_core5.Stack, { gap: "xs", align: "center", children: [
492
654
  info.logo,
493
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Stack, { gap: 2, align: "center", children: [
494
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.Title, { order: 2, children: info.name }),
495
- info.tagline && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.Text, { size: "sm", c: "dimmed", w: 600, ta: "center", children: info.tagline })
655
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_core5.Stack, { gap: 2, align: "center", children: [
656
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core5.Title, { order: 2, children: info.name }),
657
+ info.tagline && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core5.Text, { size: "sm", c: "dimmed", w: 600, ta: "center", children: info.tagline })
496
658
  ] }),
497
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Group, { gap: "xs", children: [
498
- info.version && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
499
- import_core4.Badge,
659
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_core5.Group, { gap: "xs", children: [
660
+ info.version && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
661
+ import_core5.Badge,
500
662
  {
501
663
  size: "lg",
502
664
  color: "blue",
@@ -510,8 +672,8 @@ function InformationContent({ info }) {
510
672
  ]
511
673
  }
512
674
  ),
513
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
514
- import_core4.Badge,
675
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
676
+ import_core5.Badge,
515
677
  {
516
678
  size: "lg",
517
679
  color: "teal",
@@ -527,39 +689,39 @@ function InformationContent({ info }) {
527
689
  )
528
690
  ] })
529
691
  ] }),
530
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.Divider, { label: "System Information", labelPosition: "center" }),
531
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.SimpleGrid, { cols: { base: 1, sm: 2 }, children: [
532
- cards.map((card) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
692
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core5.Divider, { label: "System Information", labelPosition: "center" }),
693
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_core5.SimpleGrid, { cols: { base: 1, sm: 2 }, children: [
694
+ cards.map((card) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
533
695
  InfoCard,
534
696
  {
535
- icon: card.icon ?? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons_react2.IconAward, { size: 18 }),
697
+ icon: card.icon ?? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react3.Award, { size: 18 }),
536
698
  label: card.label,
537
699
  value: card.value,
538
700
  color: card.color ?? "gray"
539
701
  },
540
702
  card.label
541
703
  )),
542
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
543
- import_core4.Paper,
704
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
705
+ import_core5.Paper,
544
706
  {
545
707
  withBorder: true,
546
708
  p: "sm",
547
709
  radius: "18px",
548
710
  bg: colorScheme === "dark" ? "gray.9" : "gray.0",
549
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Group, { justify: "space-between", wrap: "nowrap", children: [
550
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Group, { gap: "sm", flex: 1, children: [
551
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.ThemeIcon, { variant: "light", color: "yellow", size: "lg", radius: "14px", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons_react2.IconHash, { size: 18 }) }),
552
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Stack, { gap: 2, children: [
553
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.Text, { size: "xs", c: "dimmed", fw: 700, tt: "uppercase", children: "Build ID" }),
554
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.Text, { size: "sm", fw: 500, truncate: true, children: info.buildId ?? UNKNOWN })
711
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_core5.Group, { justify: "space-between", wrap: "nowrap", children: [
712
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_core5.Group, { gap: "sm", flex: 1, children: [
713
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core5.ThemeIcon, { variant: "light", color: "yellow", size: "lg", radius: "14px", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react3.Hash, { size: 18 }) }),
714
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_core5.Stack, { gap: 2, children: [
715
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core5.Text, { size: "xs", c: "dimmed", fw: 700, tt: "uppercase", children: "Build ID" }),
716
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core5.Text, { size: "sm", fw: 500, truncate: true, children: info.buildId ?? UNKNOWN })
555
717
  ] })
556
718
  ] }),
557
- info.buildId && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(CopyBuildIdButton, { buildId: info.buildId })
719
+ info.buildId && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CopyBuildIdButton, { buildId: info.buildId })
558
720
  ] })
559
721
  }
560
722
  )
561
723
  ] }),
562
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
724
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
563
725
  Footer,
564
726
  {
565
727
  copyright: info.copyright,
@@ -576,8 +738,8 @@ function InformationModal({
576
738
  info,
577
739
  title = DEFAULT_TITLE
578
740
  }) {
579
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
580
- import_core4.Modal,
741
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
742
+ import_core5.Modal,
581
743
  {
582
744
  opened,
583
745
  onClose,
@@ -596,7 +758,7 @@ function InformationModal({
596
758
  }
597
759
  },
598
760
  title,
599
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(InformationContent, { info })
761
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(InformationContent, { info })
600
762
  }
601
763
  );
602
764
  }
@@ -609,13 +771,13 @@ function CopyBuildIdButton({ buildId }) {
609
771
  setTimeout(() => setCopied(false), 2e3);
610
772
  }
611
773
  };
612
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.Tooltip, { label: copied ? "Copied!" : "Copy ID", withArrow: true, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
613
- import_core4.ActionIcon,
774
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core5.Tooltip, { label: copied ? "Copied!" : "Copy ID", withArrow: true, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
775
+ import_core5.ActionIcon,
614
776
  {
615
777
  variant: "subtle",
616
778
  color: copied ? "teal" : "gray",
617
779
  onClick: handleCopy,
618
- children: copied ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons_react2.IconCheck, { size: 16 }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons_react2.IconCopy, { size: 16 })
780
+ children: copied ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react3.Check, { size: 16 }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react3.Copy, { size: 16 })
619
781
  }
620
782
  ) });
621
783
  }
@@ -625,28 +787,28 @@ function InfoCard({
625
787
  value,
626
788
  color
627
789
  }) {
628
- const colorScheme = (0, import_core4.useComputedColorScheme)();
629
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.Paper, { withBorder: true, p: "md", radius: "18px", h: "100%", bg: colorScheme === "dark" ? "gray.9" : "gray.0", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Group, { gap: "sm", align: "flex-start", children: [
630
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.ThemeIcon, { color, variant: "light", size: "lg", radius: "14px", children: icon }),
631
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_core4.Stack, { gap: 2, flex: 1, children: [
632
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.Text, { size: "xs", c: "dimmed", fw: 700, tt: "uppercase", children: label }),
633
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.Text, { size: "sm", fw: 500, lineClamp: 1, children: value })
790
+ const colorScheme = (0, import_core5.useComputedColorScheme)();
791
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core5.Paper, { withBorder: true, p: "md", radius: "18px", h: "100%", bg: colorScheme === "dark" ? "gray.9" : "gray.0", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_core5.Group, { gap: "sm", align: "flex-start", children: [
792
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core5.ThemeIcon, { color, variant: "light", size: "lg", radius: "14px", children: icon }),
793
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_core5.Stack, { gap: 2, flex: 1, children: [
794
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core5.Text, { size: "xs", c: "dimmed", fw: 700, tt: "uppercase", children: label }),
795
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core5.Text, { size: "sm", fw: 500, lineClamp: 1, children: value })
634
796
  ] })
635
797
  ] }) });
636
798
  }
637
799
 
638
800
  // src/pages/NotFound.tsx
639
- var import_core5 = require("@mantine/core");
801
+ var import_core6 = require("@mantine/core");
640
802
  var import_icons_react3 = require("@tabler/icons-react");
641
- var import_jsx_runtime5 = require("react/jsx-runtime");
803
+ var import_jsx_runtime6 = require("react/jsx-runtime");
642
804
  function NotFound({
643
805
  path,
644
806
  onSearchClick,
645
807
  onHomeClick
646
808
  }) {
647
809
  const currentPath = path || (typeof window !== "undefined" ? window.location.pathname : "/404");
648
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
649
- import_core5.Box,
810
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
811
+ import_core6.Box,
650
812
  {
651
813
  style: {
652
814
  minHeight: "100vh",
@@ -654,9 +816,9 @@ function NotFound({
654
816
  alignItems: "center",
655
817
  background: "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)"
656
818
  },
657
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core5.Container, { size: "xl", py: 80, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_core5.Paper, { radius: "xl", p: 48, withBorder: true, style: { borderColor: "var(--mantine-color-default-border)", textAlign: "center" }, children: [
658
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
659
- import_core5.Box,
819
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_core6.Container, { size: "xl", py: 80, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_core6.Paper, { radius: "xl", p: 48, withBorder: true, style: { borderColor: "var(--mantine-color-default-border)", textAlign: "center" }, children: [
820
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
821
+ import_core6.Box,
660
822
  {
661
823
  mx: "auto",
662
824
  mb: "xl",
@@ -670,11 +832,11 @@ function NotFound({
670
832
  background: "linear-gradient(135deg, var(--mantine-color-blue-6), var(--mantine-color-cyan-6))",
671
833
  boxShadow: "0 12px 32px rgba(34, 139, 230, 0.35)"
672
834
  },
673
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_icons_react3.IconFileOff, { size: 44, stroke: 1.5, color: "white" })
835
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_icons_react3.IconFileOff, { size: 44, stroke: 1.5, color: "white" })
674
836
  }
675
837
  ),
676
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
677
- import_core5.Text,
838
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
839
+ import_core6.Text,
678
840
  {
679
841
  fz: { base: 72, sm: 100 },
680
842
  fw: 900,
@@ -684,33 +846,33 @@ function NotFound({
684
846
  children: "404"
685
847
  }
686
848
  ),
687
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core5.Badge, { variant: "light", color: "blue", size: "lg", mb: "xs", children: "NOT FOUND" }),
688
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core5.Title, { order: 2, mt: "sm", mb: "xs", children: "Trang kh\xF4ng t\u1ED3n t\u1EA1i" }),
689
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core5.Text, { c: "dimmed", size: "sm", maw: 440, mx: "auto", children: "Trang ho\u1EB7c \u0111\u01B0\u1EDDng d\u1EABn b\u1EA1n truy c\u1EADp kh\xF4ng t\u1ED3n t\u1EA1i ho\u1EB7c \u0111\xE3 \u0111\u01B0\u1EE3c di chuy\u1EC3n. Vui l\xF2ng ki\u1EC3m tra l\u1EA1i \u0111\u01B0\u1EDDng d\u1EABn ho\u1EB7c quay v\u1EC1 trang ch\u1EE7." }),
690
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core5.Box, { mt: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core5.Code, { color: "blue", variant: "light", px: "md", py: 6, children: currentPath }) }),
691
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_core5.Group, { gap: "sm", mt: "xl", justify: "center", children: [
692
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
693
- import_core5.Button,
849
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_core6.Badge, { variant: "light", color: "blue", size: "lg", mb: "xs", children: "NOT FOUND" }),
850
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_core6.Title, { order: 2, mt: "sm", mb: "xs", children: "Trang kh\xF4ng t\u1ED3n t\u1EA1i" }),
851
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_core6.Text, { c: "dimmed", size: "sm", maw: 440, mx: "auto", children: "Trang ho\u1EB7c \u0111\u01B0\u1EDDng d\u1EABn b\u1EA1n truy c\u1EADp kh\xF4ng t\u1ED3n t\u1EA1i ho\u1EB7c \u0111\xE3 \u0111\u01B0\u1EE3c di chuy\u1EC3n. Vui l\xF2ng ki\u1EC3m tra l\u1EA1i \u0111\u01B0\u1EDDng d\u1EABn ho\u1EB7c quay v\u1EC1 trang ch\u1EE7." }),
852
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_core6.Box, { mt: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_core6.Code, { color: "blue", variant: "light", px: "md", py: 6, children: currentPath }) }),
853
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_core6.Group, { gap: "sm", mt: "xl", justify: "center", children: [
854
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
855
+ import_core6.Button,
694
856
  {
695
857
  variant: "light",
696
- leftSection: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_icons_react3.IconArrowLeft, { size: 16 }),
858
+ leftSection: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_icons_react3.IconArrowLeft, { size: 16 }),
697
859
  onClick: () => window.history.back(),
698
860
  children: "Quay l\u1EA1i"
699
861
  }
700
862
  ),
701
- onSearchClick && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
702
- import_core5.Button,
863
+ onSearchClick && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
864
+ import_core6.Button,
703
865
  {
704
866
  variant: "outline",
705
- leftSection: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_icons_react3.IconSearch, { size: 16 }),
867
+ leftSection: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_icons_react3.IconSearch, { size: 16 }),
706
868
  onClick: onSearchClick,
707
869
  children: "T\xECm Docs"
708
870
  }
709
871
  ),
710
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
711
- import_core5.Button,
872
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
873
+ import_core6.Button,
712
874
  {
713
- leftSection: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_icons_react3.IconHome, { size: 16 }),
875
+ leftSection: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_icons_react3.IconHome, { size: 16 }),
714
876
  onClick: onHomeClick || (() => window.location.href = "/"),
715
877
  children: "Trang ch\u1EE7"
716
878
  }
@@ -734,6 +896,7 @@ function NotFound({
734
896
  NotFound,
735
897
  ThemeMenu,
736
898
  ThemeProvider,
899
+ ThemeSetting,
737
900
  UNKNOWN,
738
901
  calculateRemainingTime,
739
902
  copyToClipboard,