@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.
Files changed (44) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/DESIGN.md +7 -3
  3. package/README.md +19 -10
  4. package/contracts/naeil-chrome.v1.json +12 -0
  5. package/dist/chunk-HSTDPY56.js +74 -0
  6. package/dist/chunk-OLKTEYLS.js +413 -0
  7. package/dist/{chunk-CE73AEJZ.js → chunk-QQQQZEPV.js} +249 -3
  8. package/dist/{chunk-S64H3OYQ.js → chunk-VWIUN35X.js} +4 -343
  9. package/dist/components/index.d.ts +2 -2
  10. package/dist/components/index.js +11 -9
  11. package/dist/components/naeil-footer.d.ts +16 -0
  12. package/dist/components/naeil-footer.js +76 -0
  13. package/dist/components/naeil-header.d.ts +23 -5
  14. package/dist/components/naeil-header.js +5 -2
  15. package/dist/components/ui/index.d.ts +2 -2
  16. package/dist/components/ui/index.js +6 -6
  17. package/dist/lib/ui-release.d.ts +1 -0
  18. package/dist/lib/ui-release.js +1 -0
  19. package/dist/naeil-header-content-BvISJ4RV.d.ts +4 -0
  20. package/dist/{navigation-CL10a6Eb.d.ts → navigation-CgPeL9tF.d.ts} +1 -1
  21. package/dist/{site-footer-B67meCDv.d.ts → site-footer-vXDa_6yr.d.ts} +4 -2
  22. package/dist/source/components/footer.js +1 -2
  23. package/dist/source/components/naeil-footer.d.ts +16 -0
  24. package/dist/source/components/naeil-footer.js +95 -0
  25. package/dist/source/components/naeil-header-account.d.ts +26 -0
  26. package/dist/source/components/naeil-header-account.js +67 -0
  27. package/dist/source/components/naeil-header.d.ts +2 -1
  28. package/dist/source/components/naeil-header.js +6 -1
  29. package/dist/source/components/ui/site-footer.d.ts +4 -2
  30. package/dist/source/components/ui/site-footer.js +6 -2
  31. package/dist/source/lib/ui-release.d.ts +6 -0
  32. package/dist/source/lib/ui-release.js +4 -0
  33. package/docs/components/README.md +4 -1
  34. package/docs/components/application-layout.md +103 -0
  35. package/docs/components/common.md +2 -2
  36. package/docs/components/naeil-footer.md +20 -0
  37. package/docs/components/naeil-header.md +22 -6
  38. package/docs/components/navigation.md +8 -8
  39. package/docs/design/v2-migration.md +24 -25
  40. package/docs/package-release.md +12 -6
  41. package/package.json +16 -4
  42. package/src/styles/components.css +39 -4
  43. package/src/styles/theme.css +3 -1
  44. 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/components/naeil-header-content.ts
1184
- var headerLocales = ["en", "ko", "ja"];
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
- headerLocales,
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-CL10a6Eb.js';
3
- import { S as SiteFooterProps } from '../site-footer-B67meCDv.js';
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';
@@ -1,19 +1,21 @@
1
1
  "use client";
2
2
  import {
3
- Logo,
4
3
  NaeilHeader,
5
4
  headerLocales
6
- } from "../chunk-S64H3OYQ.js";
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
- SiteFooter
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: cn("max-w-7xl", 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,