@naeil/ui 0.5.0 → 0.7.1
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/CHANGELOG.md +21 -0
- package/DESIGN.md +7 -3
- package/README.md +19 -10
- package/contracts/naeil-chrome.v1.json +12 -0
- package/dist/chunk-HSTDPY56.js +74 -0
- package/dist/chunk-OLKTEYLS.js +413 -0
- package/dist/{chunk-CE73AEJZ.js → chunk-QQQQZEPV.js} +249 -3
- package/dist/{chunk-S64H3OYQ.js → chunk-VWIUN35X.js} +4 -343
- package/dist/components/index.d.ts +2 -2
- package/dist/components/index.js +11 -9
- package/dist/components/naeil-footer.d.ts +16 -0
- package/dist/components/naeil-footer.js +76 -0
- package/dist/components/naeil-header.d.ts +23 -5
- package/dist/components/naeil-header.js +5 -2
- package/dist/components/ui/index.d.ts +2 -2
- package/dist/components/ui/index.js +6 -6
- package/dist/lib/ui-release.d.ts +1 -0
- package/dist/lib/ui-release.js +1 -0
- package/dist/naeil-header-content-BvISJ4RV.d.ts +4 -0
- package/dist/{navigation-CL10a6Eb.d.ts → navigation-CgPeL9tF.d.ts} +1 -1
- package/dist/{site-footer-B67meCDv.d.ts → site-footer-vXDa_6yr.d.ts} +4 -2
- package/dist/source/components/footer.js +1 -2
- package/dist/source/components/naeil-footer.d.ts +16 -0
- package/dist/source/components/naeil-footer.js +95 -0
- package/dist/source/components/naeil-header-account.d.ts +26 -0
- package/dist/source/components/naeil-header-account.js +67 -0
- package/dist/source/components/naeil-header.d.ts +2 -1
- package/dist/source/components/naeil-header.js +6 -1
- package/dist/source/components/ui/site-footer.d.ts +4 -2
- package/dist/source/components/ui/site-footer.js +6 -2
- package/dist/source/lib/ui-release.d.ts +6 -0
- package/dist/source/lib/ui-release.js +4 -0
- package/docs/components/README.md +4 -1
- package/docs/components/application-layout.md +103 -0
- package/docs/components/common.md +2 -2
- package/docs/components/naeil-footer.md +20 -0
- package/docs/components/naeil-header.md +22 -6
- package/docs/components/navigation.md +8 -8
- package/docs/design/v2-migration.md +24 -25
- package/docs/package-release.md +12 -6
- package/package.json +16 -4
- package/src/styles/components.css +39 -4
- package/src/styles/theme.css +3 -1
- package/dist/chunk-QSTGUEEI.js +0 -323
|
@@ -646,13 +646,244 @@ function Navigation(_a) {
|
|
|
646
646
|
);
|
|
647
647
|
}
|
|
648
648
|
|
|
649
|
+
// src/components/ui/dropdown-menu.tsx
|
|
650
|
+
import { CheckIcon as CheckIcon2, ChevronRightIcon, CircleIcon } from "lucide-react";
|
|
651
|
+
import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui";
|
|
652
|
+
import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
653
|
+
function DropdownMenu(_a) {
|
|
654
|
+
var props = __objRest(_a, []);
|
|
655
|
+
return /* @__PURE__ */ jsx5(DropdownMenuPrimitive.Root, __spreadValues({ "data-slot": "dropdown-menu" }, props));
|
|
656
|
+
}
|
|
657
|
+
function DropdownMenuPortal(_a) {
|
|
658
|
+
var props = __objRest(_a, []);
|
|
659
|
+
return /* @__PURE__ */ jsx5(DropdownMenuPrimitive.Portal, __spreadValues({ "data-slot": "dropdown-menu-portal" }, props));
|
|
660
|
+
}
|
|
661
|
+
function DropdownMenuTrigger(_a) {
|
|
662
|
+
var props = __objRest(_a, []);
|
|
663
|
+
return /* @__PURE__ */ jsx5(
|
|
664
|
+
DropdownMenuPrimitive.Trigger,
|
|
665
|
+
__spreadValues({
|
|
666
|
+
"data-slot": "dropdown-menu-trigger"
|
|
667
|
+
}, props)
|
|
668
|
+
);
|
|
669
|
+
}
|
|
670
|
+
function DropdownMenuContent(_a) {
|
|
671
|
+
var _b = _a, {
|
|
672
|
+
ref,
|
|
673
|
+
className,
|
|
674
|
+
sideOffset = 4
|
|
675
|
+
} = _b, props = __objRest(_b, [
|
|
676
|
+
"ref",
|
|
677
|
+
"className",
|
|
678
|
+
"sideOffset"
|
|
679
|
+
]);
|
|
680
|
+
const [content, contentRef] = useOverlayRef(ref);
|
|
681
|
+
useRadixHiddenInert(content);
|
|
682
|
+
return /* @__PURE__ */ jsx5(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx5(
|
|
683
|
+
DropdownMenuPrimitive.Content,
|
|
684
|
+
__spreadValues({
|
|
685
|
+
ref: contentRef,
|
|
686
|
+
"data-slot": "dropdown-menu-content",
|
|
687
|
+
sideOffset,
|
|
688
|
+
className: cn(
|
|
689
|
+
"ui-menu ui-popup z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border border-border-strong p-1 shadow-md",
|
|
690
|
+
className
|
|
691
|
+
)
|
|
692
|
+
}, props)
|
|
693
|
+
) });
|
|
694
|
+
}
|
|
695
|
+
function DropdownMenuGroup(_a) {
|
|
696
|
+
var props = __objRest(_a, []);
|
|
697
|
+
return /* @__PURE__ */ jsx5(DropdownMenuPrimitive.Group, __spreadValues({ "data-slot": "dropdown-menu-group" }, props));
|
|
698
|
+
}
|
|
699
|
+
function DropdownMenuItem(_a) {
|
|
700
|
+
var _b = _a, {
|
|
701
|
+
className,
|
|
702
|
+
inset,
|
|
703
|
+
variant = "default"
|
|
704
|
+
} = _b, props = __objRest(_b, [
|
|
705
|
+
"className",
|
|
706
|
+
"inset",
|
|
707
|
+
"variant"
|
|
708
|
+
]);
|
|
709
|
+
return /* @__PURE__ */ jsx5(
|
|
710
|
+
DropdownMenuPrimitive.Item,
|
|
711
|
+
__spreadValues({
|
|
712
|
+
"data-slot": "dropdown-menu-item",
|
|
713
|
+
"data-inset": inset,
|
|
714
|
+
"data-variant": variant,
|
|
715
|
+
className: cn(
|
|
716
|
+
"focus:bg-surface-subtle data-[variant=destructive]:text-error data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-error data-[variant=destructive]:*:[svg]:!text-error [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-md px-2 py-1.5 text-base outline-hidden select-none transition-colors duration-(--ui-motion-fast) data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
717
|
+
className
|
|
718
|
+
)
|
|
719
|
+
}, props)
|
|
720
|
+
);
|
|
721
|
+
}
|
|
722
|
+
function DropdownMenuCheckboxItem(_a) {
|
|
723
|
+
var _b = _a, {
|
|
724
|
+
className,
|
|
725
|
+
children,
|
|
726
|
+
checked
|
|
727
|
+
} = _b, props = __objRest(_b, [
|
|
728
|
+
"className",
|
|
729
|
+
"children",
|
|
730
|
+
"checked"
|
|
731
|
+
]);
|
|
732
|
+
return /* @__PURE__ */ jsxs3(
|
|
733
|
+
DropdownMenuPrimitive.CheckboxItem,
|
|
734
|
+
__spreadProps(__spreadValues({
|
|
735
|
+
"data-slot": "dropdown-menu-checkbox-item",
|
|
736
|
+
className: cn(
|
|
737
|
+
"focus:bg-surface-subtle relative flex cursor-default items-center gap-2 rounded-md py-1.5 pr-2 pl-8 text-base outline-hidden select-none transition-colors duration-(--ui-motion-fast) data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
738
|
+
className
|
|
739
|
+
),
|
|
740
|
+
checked
|
|
741
|
+
}, props), {
|
|
742
|
+
children: [
|
|
743
|
+
/* @__PURE__ */ jsx5("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx5(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx5(CheckIcon2, { className: "size-4" }) }) }),
|
|
744
|
+
children
|
|
745
|
+
]
|
|
746
|
+
})
|
|
747
|
+
);
|
|
748
|
+
}
|
|
749
|
+
function DropdownMenuRadioGroup(_a) {
|
|
750
|
+
var props = __objRest(_a, []);
|
|
751
|
+
return /* @__PURE__ */ jsx5(
|
|
752
|
+
DropdownMenuPrimitive.RadioGroup,
|
|
753
|
+
__spreadValues({
|
|
754
|
+
"data-slot": "dropdown-menu-radio-group"
|
|
755
|
+
}, props)
|
|
756
|
+
);
|
|
757
|
+
}
|
|
758
|
+
function DropdownMenuRadioItem(_a) {
|
|
759
|
+
var _b = _a, {
|
|
760
|
+
className,
|
|
761
|
+
children
|
|
762
|
+
} = _b, props = __objRest(_b, [
|
|
763
|
+
"className",
|
|
764
|
+
"children"
|
|
765
|
+
]);
|
|
766
|
+
return /* @__PURE__ */ jsxs3(
|
|
767
|
+
DropdownMenuPrimitive.RadioItem,
|
|
768
|
+
__spreadProps(__spreadValues({
|
|
769
|
+
"data-slot": "dropdown-menu-radio-item",
|
|
770
|
+
className: cn(
|
|
771
|
+
"focus:bg-surface-subtle relative flex cursor-default items-center gap-2 rounded-md py-1.5 pr-2 pl-8 text-base outline-hidden select-none transition-colors duration-(--ui-motion-fast) data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
772
|
+
className
|
|
773
|
+
)
|
|
774
|
+
}, props), {
|
|
775
|
+
children: [
|
|
776
|
+
/* @__PURE__ */ jsx5("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx5(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx5(CircleIcon, { className: "size-2 fill-current" }) }) }),
|
|
777
|
+
children
|
|
778
|
+
]
|
|
779
|
+
})
|
|
780
|
+
);
|
|
781
|
+
}
|
|
782
|
+
function DropdownMenuLabel(_a) {
|
|
783
|
+
var _b = _a, {
|
|
784
|
+
className,
|
|
785
|
+
inset
|
|
786
|
+
} = _b, props = __objRest(_b, [
|
|
787
|
+
"className",
|
|
788
|
+
"inset"
|
|
789
|
+
]);
|
|
790
|
+
return /* @__PURE__ */ jsx5(
|
|
791
|
+
DropdownMenuPrimitive.Label,
|
|
792
|
+
__spreadValues({
|
|
793
|
+
"data-slot": "dropdown-menu-label",
|
|
794
|
+
"data-inset": inset,
|
|
795
|
+
className: cn(
|
|
796
|
+
"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",
|
|
797
|
+
className
|
|
798
|
+
)
|
|
799
|
+
}, props)
|
|
800
|
+
);
|
|
801
|
+
}
|
|
802
|
+
function DropdownMenuSeparator(_a) {
|
|
803
|
+
var _b = _a, {
|
|
804
|
+
className
|
|
805
|
+
} = _b, props = __objRest(_b, [
|
|
806
|
+
"className"
|
|
807
|
+
]);
|
|
808
|
+
return /* @__PURE__ */ jsx5(
|
|
809
|
+
DropdownMenuPrimitive.Separator,
|
|
810
|
+
__spreadValues({
|
|
811
|
+
"data-slot": "dropdown-menu-separator",
|
|
812
|
+
className: cn("bg-border-subtle -mx-1 my-1 h-px", className)
|
|
813
|
+
}, props)
|
|
814
|
+
);
|
|
815
|
+
}
|
|
816
|
+
function DropdownMenuShortcut(_a) {
|
|
817
|
+
var _b = _a, {
|
|
818
|
+
className
|
|
819
|
+
} = _b, props = __objRest(_b, [
|
|
820
|
+
"className"
|
|
821
|
+
]);
|
|
822
|
+
return /* @__PURE__ */ jsx5(
|
|
823
|
+
"span",
|
|
824
|
+
__spreadValues({
|
|
825
|
+
"data-slot": "dropdown-menu-shortcut",
|
|
826
|
+
className: cn(
|
|
827
|
+
"text-muted-foreground ml-auto text-xs tracking-widest",
|
|
828
|
+
className
|
|
829
|
+
)
|
|
830
|
+
}, props)
|
|
831
|
+
);
|
|
832
|
+
}
|
|
833
|
+
function DropdownMenuSub(_a) {
|
|
834
|
+
var props = __objRest(_a, []);
|
|
835
|
+
return /* @__PURE__ */ jsx5(DropdownMenuPrimitive.Sub, __spreadValues({ "data-slot": "dropdown-menu-sub" }, props));
|
|
836
|
+
}
|
|
837
|
+
function DropdownMenuSubTrigger(_a) {
|
|
838
|
+
var _b = _a, {
|
|
839
|
+
className,
|
|
840
|
+
inset,
|
|
841
|
+
children
|
|
842
|
+
} = _b, props = __objRest(_b, [
|
|
843
|
+
"className",
|
|
844
|
+
"inset",
|
|
845
|
+
"children"
|
|
846
|
+
]);
|
|
847
|
+
return /* @__PURE__ */ jsxs3(
|
|
848
|
+
DropdownMenuPrimitive.SubTrigger,
|
|
849
|
+
__spreadProps(__spreadValues({
|
|
850
|
+
"data-slot": "dropdown-menu-sub-trigger",
|
|
851
|
+
"data-inset": inset,
|
|
852
|
+
className: cn(
|
|
853
|
+
"focus:bg-surface-subtle data-[state=open]:bg-surface-subtle [&_svg:not([class*='text-'])]:text-muted-foreground flex cursor-default items-center gap-2 rounded-md px-2 py-1.5 text-base outline-hidden select-none transition-colors duration-(--ui-motion-fast) data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
854
|
+
className
|
|
855
|
+
)
|
|
856
|
+
}, props), {
|
|
857
|
+
children: [
|
|
858
|
+
children,
|
|
859
|
+
/* @__PURE__ */ jsx5(ChevronRightIcon, { className: "ml-auto size-4" })
|
|
860
|
+
]
|
|
861
|
+
})
|
|
862
|
+
);
|
|
863
|
+
}
|
|
864
|
+
function DropdownMenuSubContent(_a) {
|
|
865
|
+
var _b = _a, {
|
|
866
|
+
className
|
|
867
|
+
} = _b, props = __objRest(_b, [
|
|
868
|
+
"className"
|
|
869
|
+
]);
|
|
870
|
+
return /* @__PURE__ */ jsx5(
|
|
871
|
+
DropdownMenuPrimitive.SubContent,
|
|
872
|
+
__spreadValues({
|
|
873
|
+
"data-slot": "dropdown-menu-sub-content",
|
|
874
|
+
className: cn(
|
|
875
|
+
"ui-menu ui-popup z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border border-border-strong p-1 shadow-lg",
|
|
876
|
+
className
|
|
877
|
+
)
|
|
878
|
+
}, props)
|
|
879
|
+
);
|
|
880
|
+
}
|
|
881
|
+
|
|
649
882
|
export {
|
|
650
883
|
badgeVariants,
|
|
651
884
|
Badge,
|
|
652
885
|
buttonVariants,
|
|
653
886
|
Button,
|
|
654
|
-
useRadixHiddenInert,
|
|
655
|
-
useOverlayRef,
|
|
656
887
|
Select,
|
|
657
888
|
SelectValue,
|
|
658
889
|
SelectGroup,
|
|
@@ -663,5 +894,20 @@ export {
|
|
|
663
894
|
SelectSeparator,
|
|
664
895
|
SelectScrollUpButton,
|
|
665
896
|
SelectScrollDownButton,
|
|
666
|
-
Navigation
|
|
897
|
+
Navigation,
|
|
898
|
+
DropdownMenu,
|
|
899
|
+
DropdownMenuPortal,
|
|
900
|
+
DropdownMenuTrigger,
|
|
901
|
+
DropdownMenuContent,
|
|
902
|
+
DropdownMenuGroup,
|
|
903
|
+
DropdownMenuItem,
|
|
904
|
+
DropdownMenuCheckboxItem,
|
|
905
|
+
DropdownMenuRadioGroup,
|
|
906
|
+
DropdownMenuRadioItem,
|
|
907
|
+
DropdownMenuLabel,
|
|
908
|
+
DropdownMenuSeparator,
|
|
909
|
+
DropdownMenuShortcut,
|
|
910
|
+
DropdownMenuSub,
|
|
911
|
+
DropdownMenuSubTrigger,
|
|
912
|
+
DropdownMenuSubContent
|
|
667
913
|
};
|
|
@@ -1,26 +1,10 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
Badge,
|
|
4
|
-
Button,
|
|
5
|
-
Navigation,
|
|
6
|
-
Select,
|
|
7
|
-
SelectContent,
|
|
8
|
-
SelectItem,
|
|
9
|
-
SelectTrigger,
|
|
10
|
-
SelectValue
|
|
11
|
-
} from "./chunk-CE73AEJZ.js";
|
|
12
2
|
import {
|
|
13
3
|
__objRest,
|
|
14
4
|
__spreadProps,
|
|
15
|
-
__spreadValues
|
|
16
|
-
cn
|
|
5
|
+
__spreadValues
|
|
17
6
|
} from "./chunk-JBTDRVZ7.js";
|
|
18
7
|
|
|
19
|
-
// src/components/naeil-header.tsx
|
|
20
|
-
import { useSyncExternalStore } from "react";
|
|
21
|
-
import { useTheme } from "next-themes";
|
|
22
|
-
import { Moon, Sun } from "lucide-react";
|
|
23
|
-
|
|
24
8
|
// src/components/logo.tsx
|
|
25
9
|
import { useId } from "react";
|
|
26
10
|
|
|
@@ -1180,333 +1164,10 @@ function Logo(_a) {
|
|
|
1180
1164
|
);
|
|
1181
1165
|
}
|
|
1182
1166
|
|
|
1183
|
-
// src/
|
|
1184
|
-
var
|
|
1185
|
-
var headerLocaleNames = { en: "English", ko: "\uD55C\uAD6D\uC5B4", ja: "\u65E5\u672C\u8A9E" };
|
|
1186
|
-
var headerProjects = [
|
|
1187
|
-
{
|
|
1188
|
-
"key": "cc",
|
|
1189
|
-
"href": "/cc",
|
|
1190
|
-
"accent": "oklch(0.704 0.140 181)",
|
|
1191
|
-
"icon": "coral",
|
|
1192
|
-
"status": "active"
|
|
1193
|
-
},
|
|
1194
|
-
{
|
|
1195
|
-
"key": "pkm",
|
|
1196
|
-
"href": "/pkm",
|
|
1197
|
-
"accent": "oklch(0.702 0.183 293)",
|
|
1198
|
-
"icon": "jellyfish",
|
|
1199
|
-
"status": "coming"
|
|
1200
|
-
},
|
|
1201
|
-
{
|
|
1202
|
-
"key": "naeilUi",
|
|
1203
|
-
"href": "/design",
|
|
1204
|
-
"accent": "oklch(0.623 0.214 259)",
|
|
1205
|
-
"icon": "whale",
|
|
1206
|
-
"status": "active"
|
|
1207
|
-
},
|
|
1208
|
-
{
|
|
1209
|
-
"key": "sa",
|
|
1210
|
-
"href": "/sa",
|
|
1211
|
-
"accent": "oklch(0.723 0.219 149)",
|
|
1212
|
-
"icon": "fish",
|
|
1213
|
-
"status": "active"
|
|
1214
|
-
},
|
|
1215
|
-
{
|
|
1216
|
-
"key": "babyAgent",
|
|
1217
|
-
"href": "/baby-agent",
|
|
1218
|
-
"accent": "oklch(0.769 0.188 70.08)",
|
|
1219
|
-
"icon": "turtle",
|
|
1220
|
-
"status": "coming"
|
|
1221
|
-
}
|
|
1222
|
-
];
|
|
1223
|
-
var headerContent = {
|
|
1224
|
-
"en": {
|
|
1225
|
-
"nav": {
|
|
1226
|
-
"home": "Home",
|
|
1227
|
-
"projects": "Projects",
|
|
1228
|
-
"blog": "Blog",
|
|
1229
|
-
"navigation": "Main navigation",
|
|
1230
|
-
"menu": "Menu",
|
|
1231
|
-
"closeMenu": "Close menu"
|
|
1232
|
-
},
|
|
1233
|
-
"theme": {
|
|
1234
|
-
"switchToLight": "Switch to light theme",
|
|
1235
|
-
"switchToDark": "Switch to dark theme"
|
|
1236
|
-
},
|
|
1237
|
-
"locale": {
|
|
1238
|
-
"switchLabel": "Language"
|
|
1239
|
-
},
|
|
1240
|
-
"projects": {
|
|
1241
|
-
"cc": {
|
|
1242
|
-
"name": "Content Collector",
|
|
1243
|
-
"description": "Automated content collection from RSS, YouTube, Reddit + AI summarization"
|
|
1244
|
-
},
|
|
1245
|
-
"pkm": {
|
|
1246
|
-
"name": "PKM",
|
|
1247
|
-
"description": "Personal knowledge management \u2014 document parsing, embeddings, semantic search"
|
|
1248
|
-
},
|
|
1249
|
-
"naeilUi": {
|
|
1250
|
-
"name": "naeil-ui",
|
|
1251
|
-
"description": "Minimal design system \u2014 OKLCH tokens, Tailwind v4, shadcn"
|
|
1252
|
-
},
|
|
1253
|
-
"sa": {
|
|
1254
|
-
"name": "Sustainability Analyzer",
|
|
1255
|
-
"description": "AI-powered ESG report analysis \u2014 PDF parsing, qualitative assessment, comparison tables"
|
|
1256
|
-
},
|
|
1257
|
-
"babyAgent": {
|
|
1258
|
-
"name": "Baby Agent",
|
|
1259
|
-
"description": "Parenting AI agent \u2014 LINE-based Q&A, records, reminders"
|
|
1260
|
-
},
|
|
1261
|
-
"status": {
|
|
1262
|
-
"active": "Active",
|
|
1263
|
-
"coming": "Coming Soon"
|
|
1264
|
-
}
|
|
1265
|
-
}
|
|
1266
|
-
},
|
|
1267
|
-
"ko": {
|
|
1268
|
-
"nav": {
|
|
1269
|
-
"home": "\uD648",
|
|
1270
|
-
"projects": "\uD504\uB85C\uC81D\uD2B8",
|
|
1271
|
-
"blog": "\uBE14\uB85C\uADF8",
|
|
1272
|
-
"navigation": "\uC8FC\uC694 \uBA54\uB274",
|
|
1273
|
-
"menu": "\uBA54\uB274",
|
|
1274
|
-
"closeMenu": "\uBA54\uB274 \uB2EB\uAE30"
|
|
1275
|
-
},
|
|
1276
|
-
"theme": {
|
|
1277
|
-
"switchToLight": "\uBC1D\uC740 \uD14C\uB9C8\uB85C \uC804\uD658",
|
|
1278
|
-
"switchToDark": "\uC5B4\uB450\uC6B4 \uD14C\uB9C8\uB85C \uC804\uD658"
|
|
1279
|
-
},
|
|
1280
|
-
"locale": {
|
|
1281
|
-
"switchLabel": "\uC5B8\uC5B4"
|
|
1282
|
-
},
|
|
1283
|
-
"projects": {
|
|
1284
|
-
"cc": {
|
|
1285
|
-
"name": "Content Collector",
|
|
1286
|
-
"description": "RSS, YouTube, Reddit \uC790\uB3D9 \uC218\uC9D1 + AI \uC694\uC57D"
|
|
1287
|
-
},
|
|
1288
|
-
"pkm": {
|
|
1289
|
-
"name": "PKM",
|
|
1290
|
-
"description": "\uAC1C\uC778 \uC9C0\uC2DD \uAD00\uB9AC \u2014 \uBB38\uC11C \uD30C\uC2F1, \uC784\uBCA0\uB529, \uC2DC\uB9E8\uD2F1 \uAC80\uC0C9"
|
|
1291
|
-
},
|
|
1292
|
-
"naeilUi": {
|
|
1293
|
-
"name": "naeil-ui",
|
|
1294
|
-
"description": "\uBBF8\uB2C8\uBA40 \uB514\uC790\uC778 \uC2DC\uC2A4\uD15C \u2014 OKLCH \uD1A0\uD070, Tailwind v4, shadcn"
|
|
1295
|
-
},
|
|
1296
|
-
"sa": {
|
|
1297
|
-
"name": "Sustainability Analyzer",
|
|
1298
|
-
"description": "ESG \uB9AC\uD3EC\uD2B8 AI \uBD84\uC11D \u2014 PDF \uD30C\uC2F1, \uC815\uC131\uD3C9\uAC00, \uBE44\uAD50\uD45C \uC790\uB3D9 \uC0DD\uC131"
|
|
1299
|
-
},
|
|
1300
|
-
"babyAgent": {
|
|
1301
|
-
"name": "Baby Agent",
|
|
1302
|
-
"description": "\uC721\uC544 AI \uC5D0\uC774\uC804\uD2B8 \u2014 LINE \uAE30\uBC18 Q&A, \uAE30\uB85D, \uB9AC\uB9C8\uC778\uB354"
|
|
1303
|
-
},
|
|
1304
|
-
"status": {
|
|
1305
|
-
"active": "\uD65C\uC131",
|
|
1306
|
-
"coming": "\uC900\uBE44 \uC911"
|
|
1307
|
-
}
|
|
1308
|
-
}
|
|
1309
|
-
},
|
|
1310
|
-
"ja": {
|
|
1311
|
-
"nav": {
|
|
1312
|
-
"home": "\u30DB\u30FC\u30E0",
|
|
1313
|
-
"projects": "\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8",
|
|
1314
|
-
"blog": "\u30D6\u30ED\u30B0",
|
|
1315
|
-
"navigation": "\u30E1\u30A4\u30F3\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3",
|
|
1316
|
-
"menu": "\u30E1\u30CB\u30E5\u30FC",
|
|
1317
|
-
"closeMenu": "\u30E1\u30CB\u30E5\u30FC\u3092\u9589\u3058\u308B"
|
|
1318
|
-
},
|
|
1319
|
-
"theme": {
|
|
1320
|
-
"switchToLight": "\u30E9\u30A4\u30C8\u30C6\u30FC\u30DE\u306B\u5207\u308A\u66FF\u3048\u308B",
|
|
1321
|
-
"switchToDark": "\u30C0\u30FC\u30AF\u30C6\u30FC\u30DE\u306B\u5207\u308A\u66FF\u3048\u308B"
|
|
1322
|
-
},
|
|
1323
|
-
"locale": {
|
|
1324
|
-
"switchLabel": "\u8A00\u8A9E"
|
|
1325
|
-
},
|
|
1326
|
-
"projects": {
|
|
1327
|
-
"cc": {
|
|
1328
|
-
"name": "Content Collector",
|
|
1329
|
-
"description": "RSS\u3001YouTube\u3001Reddit\u306E\u81EA\u52D5\u53CE\u96C6 + AI\u8981\u7D04"
|
|
1330
|
-
},
|
|
1331
|
-
"pkm": {
|
|
1332
|
-
"name": "PKM",
|
|
1333
|
-
"description": "\u500B\u4EBA\u30CA\u30EC\u30C3\u30B8\u7BA1\u7406 \u2014 \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u89E3\u6790\u3001\u57CB\u3081\u8FBC\u307F\u3001\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u691C\u7D22"
|
|
1334
|
-
},
|
|
1335
|
-
"naeilUi": {
|
|
1336
|
-
"name": "naeil-ui",
|
|
1337
|
-
"description": "\u30DF\u30CB\u30DE\u30EB\u30C7\u30B6\u30A4\u30F3\u30B7\u30B9\u30C6\u30E0 \u2014 OKLCH\u30C8\u30FC\u30AF\u30F3\u3001Tailwind v4\u3001shadcn"
|
|
1338
|
-
},
|
|
1339
|
-
"sa": {
|
|
1340
|
-
"name": "Sustainability Analyzer",
|
|
1341
|
-
"description": "ESG\u30EC\u30DD\u30FC\u30C8AI\u5206\u6790 \u2014 PDF\u89E3\u6790\u3001\u5B9A\u6027\u8A55\u4FA1\u3001\u6BD4\u8F03\u8868\u306E\u81EA\u52D5\u751F\u6210"
|
|
1342
|
-
},
|
|
1343
|
-
"babyAgent": {
|
|
1344
|
-
"name": "Baby Agent",
|
|
1345
|
-
"description": "\u80B2\u5150AI\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8 \u2014 LINE Q&A\u3001\u8A18\u9332\u3001\u30EA\u30DE\u30A4\u30F3\u30C0\u30FC"
|
|
1346
|
-
},
|
|
1347
|
-
"status": {
|
|
1348
|
-
"active": "\u30A2\u30AF\u30C6\u30A3\u30D6",
|
|
1349
|
-
"coming": "\u6E96\u5099\u4E2D"
|
|
1350
|
-
}
|
|
1351
|
-
}
|
|
1352
|
-
}
|
|
1353
|
-
};
|
|
1354
|
-
|
|
1355
|
-
// src/components/naeil-header.tsx
|
|
1356
|
-
import { Fragment as Fragment3, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
1357
|
-
var subscribe = () => () => {
|
|
1358
|
-
};
|
|
1359
|
-
function NaeilHeaderThemeControl({ locale }) {
|
|
1360
|
-
const { resolvedTheme, setTheme } = useTheme();
|
|
1361
|
-
const mounted = useSyncExternalStore(subscribe, () => true, () => false);
|
|
1362
|
-
const dark = mounted && resolvedTheme === "dark";
|
|
1363
|
-
return /* @__PURE__ */ jsx3(
|
|
1364
|
-
Button,
|
|
1365
|
-
{
|
|
1366
|
-
variant: "ghost",
|
|
1367
|
-
size: "icon",
|
|
1368
|
-
className: "size-11 shrink-0",
|
|
1369
|
-
disabled: !mounted,
|
|
1370
|
-
"aria-label": headerContent[locale].theme[dark ? "switchToLight" : "switchToDark"],
|
|
1371
|
-
onClick: () => setTheme(dark ? "light" : "dark"),
|
|
1372
|
-
children: dark ? /* @__PURE__ */ jsx3(Sun, { "aria-hidden": "true" }) : /* @__PURE__ */ jsx3(Moon, { "aria-hidden": "true" })
|
|
1373
|
-
}
|
|
1374
|
-
);
|
|
1375
|
-
}
|
|
1376
|
-
function NaeilHeaderLocaleControl({ locale, onLocaleChange }) {
|
|
1377
|
-
return /* @__PURE__ */ jsxs3(Select, { value: locale, onValueChange: (value) => onLocaleChange(value), children: [
|
|
1378
|
-
/* @__PURE__ */ jsx3(
|
|
1379
|
-
SelectTrigger,
|
|
1380
|
-
{
|
|
1381
|
-
className: "h-11 w-auto min-w-20 border-transparent bg-transparent px-2",
|
|
1382
|
-
"aria-label": headerContent[locale].locale.switchLabel,
|
|
1383
|
-
children: /* @__PURE__ */ jsx3(SelectValue, { children: locale.toUpperCase() })
|
|
1384
|
-
}
|
|
1385
|
-
),
|
|
1386
|
-
/* @__PURE__ */ jsx3(SelectContent, { align: "end", children: headerLocales.map((value) => /* @__PURE__ */ jsx3(SelectItem, { value, className: "min-h-11", lang: value, children: headerLocaleNames[value] }, value)) })
|
|
1387
|
-
] });
|
|
1388
|
-
}
|
|
1389
|
-
var NativeLink = (props) => /* @__PURE__ */ jsx3("a", __spreadValues({}, props));
|
|
1390
|
-
function NaeilHeader(_a) {
|
|
1391
|
-
var _b = _a, {
|
|
1392
|
-
locale,
|
|
1393
|
-
resolveHref = (path) => `https://naeil.dev/${locale}${path === "/" ? "" : path}`,
|
|
1394
|
-
brandHref,
|
|
1395
|
-
brandSlot,
|
|
1396
|
-
brandLinkProps,
|
|
1397
|
-
brandLinkComponent,
|
|
1398
|
-
onLocaleChange,
|
|
1399
|
-
authSlot,
|
|
1400
|
-
toolbarSlot,
|
|
1401
|
-
projects,
|
|
1402
|
-
projectsExternal = false,
|
|
1403
|
-
translations,
|
|
1404
|
-
showProjects = true,
|
|
1405
|
-
showBlog = true,
|
|
1406
|
-
subNav,
|
|
1407
|
-
currentProjectKey,
|
|
1408
|
-
currentProjectHref,
|
|
1409
|
-
labels,
|
|
1410
|
-
Link = NativeLink,
|
|
1411
|
-
currentHref,
|
|
1412
|
-
onNavigate,
|
|
1413
|
-
className,
|
|
1414
|
-
containerClassName
|
|
1415
|
-
} = _b, props = __objRest(_b, [
|
|
1416
|
-
"locale",
|
|
1417
|
-
"resolveHref",
|
|
1418
|
-
"brandHref",
|
|
1419
|
-
"brandSlot",
|
|
1420
|
-
"brandLinkProps",
|
|
1421
|
-
"brandLinkComponent",
|
|
1422
|
-
"onLocaleChange",
|
|
1423
|
-
"authSlot",
|
|
1424
|
-
"toolbarSlot",
|
|
1425
|
-
"projects",
|
|
1426
|
-
"projectsExternal",
|
|
1427
|
-
"translations",
|
|
1428
|
-
"showProjects",
|
|
1429
|
-
"showBlog",
|
|
1430
|
-
"subNav",
|
|
1431
|
-
"currentProjectKey",
|
|
1432
|
-
"currentProjectHref",
|
|
1433
|
-
"labels",
|
|
1434
|
-
"Link",
|
|
1435
|
-
"currentHref",
|
|
1436
|
-
"onNavigate",
|
|
1437
|
-
"className",
|
|
1438
|
-
"containerClassName"
|
|
1439
|
-
]);
|
|
1440
|
-
var _b2, _c;
|
|
1441
|
-
const content = headerContent[locale];
|
|
1442
|
-
const projectLinks = !showProjects ? [] : projects != null ? projects : headerProjects.map((project) => {
|
|
1443
|
-
var _a3, _b3, _c2;
|
|
1444
|
-
const current = project.key === currentProjectKey;
|
|
1445
|
-
return {
|
|
1446
|
-
id: project.key,
|
|
1447
|
-
label: (_a3 = translations == null ? void 0 : translations.project(`${project.key}.name`)) != null ? _a3 : content.projects[project.key].name,
|
|
1448
|
-
description: (_b3 = translations == null ? void 0 : translations.project(`${project.key}.description`)) != null ? _b3 : content.projects[project.key].description,
|
|
1449
|
-
href: current ? currentProjectHref || "/" : resolveHref(project.href),
|
|
1450
|
-
external: !current && projectsExternal,
|
|
1451
|
-
active: current || currentHref === project.href || (currentHref == null ? void 0 : currentHref.startsWith(`${project.href}/`)) || currentHref === resolveHref(project.href),
|
|
1452
|
-
icon: /* @__PURE__ */ jsx3("span", { className: "naeil-header-project-icon", style: {
|
|
1453
|
-
borderColor: `color-mix(in oklch, ${project.accent} 30%, transparent)`,
|
|
1454
|
-
backgroundColor: `color-mix(in oklch, ${project.accent} 8%, transparent)`
|
|
1455
|
-
}, children: /* @__PURE__ */ jsx3("img", { src: `https://naeil.dev/images/${project.icon}.png`, alt: "", width: 24, height: 24 }) }),
|
|
1456
|
-
badge: project.status === "coming" ? /* @__PURE__ */ jsx3(Badge, { variant: "outline", children: (_c2 = translations == null ? void 0 : translations.project("status.coming")) != null ? _c2 : content.projects.status.coming }) : void 0
|
|
1457
|
-
};
|
|
1458
|
-
});
|
|
1459
|
-
const brandDestination = brandHref != null ? brandHref : resolveHref("/");
|
|
1460
|
-
const BrandLink = brandLinkComponent != null ? brandLinkComponent : Link;
|
|
1461
|
-
const _a2 = brandLinkProps != null ? brandLinkProps : {}, { onClick: onBrandClick } = _a2, brandProps = __objRest(_a2, ["onClick"]);
|
|
1462
|
-
const toolbar = /* @__PURE__ */ jsx3("div", { "data-app-toolbar": true, className: "naeil-header-controls", children: toolbarSlot !== void 0 ? toolbarSlot : /* @__PURE__ */ jsxs3(Fragment3, { children: [
|
|
1463
|
-
/* @__PURE__ */ jsx3(NaeilHeaderThemeControl, { locale }),
|
|
1464
|
-
onLocaleChange && /* @__PURE__ */ jsx3(NaeilHeaderLocaleControl, { locale, onLocaleChange }),
|
|
1465
|
-
authSlot && /* @__PURE__ */ jsxs3(Fragment3, { children: [
|
|
1466
|
-
/* @__PURE__ */ jsx3("div", { "aria-hidden": "true", className: "naeil-header-separator" }),
|
|
1467
|
-
authSlot
|
|
1468
|
-
] })
|
|
1469
|
-
] }) });
|
|
1470
|
-
return /* @__PURE__ */ jsx3(
|
|
1471
|
-
Navigation,
|
|
1472
|
-
__spreadProps(__spreadValues({}, props), {
|
|
1473
|
-
"data-global-header": true,
|
|
1474
|
-
"data-naeil-header": true,
|
|
1475
|
-
Link,
|
|
1476
|
-
currentHref,
|
|
1477
|
-
onNavigate,
|
|
1478
|
-
brand: /* @__PURE__ */ jsx3(
|
|
1479
|
-
BrandLink,
|
|
1480
|
-
__spreadProps(__spreadValues({
|
|
1481
|
-
href: brandDestination,
|
|
1482
|
-
"data-app-brand": true,
|
|
1483
|
-
"aria-label": brandSlot == null ? ".naeil" : void 0
|
|
1484
|
-
}, brandProps), {
|
|
1485
|
-
onClick: (event) => {
|
|
1486
|
-
onBrandClick == null ? void 0 : onBrandClick(event);
|
|
1487
|
-
onNavigate == null ? void 0 : onNavigate(event, { id: "brand", href: brandDestination, label: ".naeil" });
|
|
1488
|
-
},
|
|
1489
|
-
children: brandSlot != null ? brandSlot : /* @__PURE__ */ jsx3(Logo, { variant: "horizontal", size: 28, className: "block", label: null })
|
|
1490
|
-
})
|
|
1491
|
-
),
|
|
1492
|
-
items: [
|
|
1493
|
-
...showProjects ? [{ id: "projects", label: (_b2 = translations == null ? void 0 : translations.projects) != null ? _b2 : content.nav.projects, items: projectLinks, columns: 2 }] : [],
|
|
1494
|
-
...showBlog ? [{ id: "blog", label: (_c = translations == null ? void 0 : translations.blog) != null ? _c : content.nav.blog, href: resolveHref("/blog"), external: projectsExternal }] : [],
|
|
1495
|
-
...(subNav != null ? subNav : []).map((item) => __spreadProps(__spreadValues({}, item), { id: item.href }))
|
|
1496
|
-
],
|
|
1497
|
-
labels: labels != null ? labels : { navigation: content.nav.navigation, menu: content.nav.menu, close: content.nav.closeMenu },
|
|
1498
|
-
toolbar,
|
|
1499
|
-
mobileToolbar: toolbar,
|
|
1500
|
-
className: cn("naeil-header fixed top-0 w-full", className),
|
|
1501
|
-
containerClassName: cn("naeil-header-frame max-w-7xl", containerClassName)
|
|
1502
|
-
})
|
|
1503
|
-
);
|
|
1504
|
-
}
|
|
1167
|
+
// src/lib/ui-release.ts
|
|
1168
|
+
var uiRelease = { version: "0.7.1", contractVersion: "1" };
|
|
1505
1169
|
|
|
1506
1170
|
export {
|
|
1507
1171
|
Logo,
|
|
1508
|
-
|
|
1509
|
-
NaeilHeaderThemeControl,
|
|
1510
|
-
NaeilHeaderLocaleControl,
|
|
1511
|
-
NaeilHeader
|
|
1172
|
+
uiRelease
|
|
1512
1173
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { N as NavigationLink, a as NavigationProps } from '../navigation-
|
|
3
|
-
import { S as SiteFooterProps } from '../site-footer-
|
|
2
|
+
import { N as NavigationLink, a as NavigationProps } from '../navigation-CgPeL9tF.js';
|
|
3
|
+
import { S as SiteFooterProps } from '../site-footer-vXDa_6yr.js';
|
|
4
4
|
import { ThemeProvider as ThemeProvider$1 } from 'next-themes';
|
|
5
5
|
import * as React$1 from 'react';
|
|
6
6
|
import { SVGProps } from 'react';
|
package/dist/components/index.js
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
|
-
Logo,
|
|
4
3
|
NaeilHeader,
|
|
5
4
|
headerLocales
|
|
6
|
-
} from "../chunk-
|
|
5
|
+
} from "../chunk-OLKTEYLS.js";
|
|
6
|
+
import {
|
|
7
|
+
Logo
|
|
8
|
+
} from "../chunk-VWIUN35X.js";
|
|
9
|
+
import {
|
|
10
|
+
SiteFooter
|
|
11
|
+
} from "../chunk-HSTDPY56.js";
|
|
7
12
|
import {
|
|
13
|
+
Button,
|
|
8
14
|
DropdownMenu,
|
|
9
15
|
DropdownMenuContent,
|
|
10
16
|
DropdownMenuItem,
|
|
11
|
-
DropdownMenuTrigger
|
|
12
|
-
|
|
13
|
-
} from "../chunk-QSTGUEEI.js";
|
|
14
|
-
import {
|
|
15
|
-
Button
|
|
16
|
-
} from "../chunk-CE73AEJZ.js";
|
|
17
|
+
DropdownMenuTrigger
|
|
18
|
+
} from "../chunk-QQQQZEPV.js";
|
|
17
19
|
import {
|
|
18
20
|
__objRest,
|
|
19
21
|
__spreadProps,
|
|
@@ -105,7 +107,7 @@ function Footer({
|
|
|
105
107
|
{
|
|
106
108
|
Link,
|
|
107
109
|
className,
|
|
108
|
-
containerClassName
|
|
110
|
+
containerClassName,
|
|
109
111
|
variant,
|
|
110
112
|
brand: brandSlot != null ? brandSlot : /* @__PURE__ */ jsx2(Logo, { variant: "footer", size: 20, className: "block" }),
|
|
111
113
|
description: description === void 0 ? t("tagline") : description,
|