@naeil/ui 0.2.0 → 0.4.0

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 (109) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/DESIGN.md +194 -0
  3. package/LICENSE +21 -0
  4. package/README.md +77 -53
  5. package/THIRD_PARTY_NOTICES.md +51 -0
  6. package/dist/{chunk-SYI3IKIC.js → chunk-QKVN6Q6C.js} +102 -19
  7. package/dist/components/index.d.ts +17 -8
  8. package/dist/components/index.js +1278 -251
  9. package/dist/components/ui/index.d.ts +27 -5
  10. package/dist/components/ui/index.js +288 -33
  11. package/dist/source/components/brand-artwork.generated.d.ts +162 -0
  12. package/dist/source/components/brand-artwork.generated.js +1103 -0
  13. package/dist/source/components/footer.d.ts +15 -0
  14. package/dist/source/components/footer.js +128 -0
  15. package/dist/source/components/index.d.ts +11 -0
  16. package/dist/source/components/index.js +26 -0
  17. package/dist/source/components/locale-switcher.d.ts +17 -0
  18. package/dist/source/components/locale-switcher.js +66 -0
  19. package/dist/source/components/logo.d.ts +18 -0
  20. package/dist/source/components/logo.js +91 -0
  21. package/dist/source/components/nav.d.ts +39 -0
  22. package/dist/source/components/nav.js +375 -0
  23. package/dist/source/components/theme-provider.d.ts +6 -0
  24. package/dist/source/components/theme-provider.js +45 -0
  25. package/dist/source/components/theme-toggle-icon.d.ts +5 -0
  26. package/dist/source/components/theme-toggle-icon.js +62 -0
  27. package/dist/source/components/theme-toggle.d.ts +5 -0
  28. package/dist/source/components/theme-toggle.js +34 -0
  29. package/dist/source/components/typography.d.ts +12 -0
  30. package/dist/source/components/typography.js +49 -0
  31. package/dist/source/components/ui/avatar.d.ts +14 -0
  32. package/dist/source/components/ui/avatar.js +137 -0
  33. package/dist/source/components/ui/badge.d.ts +13 -0
  34. package/dist/source/components/ui/badge.js +76 -0
  35. package/dist/source/components/ui/button.d.ts +14 -0
  36. package/dist/source/components/ui/button.js +88 -0
  37. package/dist/source/components/ui/card.d.ts +13 -0
  38. package/dist/source/components/ui/card.js +135 -0
  39. package/dist/source/components/ui/checkbox.d.ts +7 -0
  40. package/dist/source/components/ui/checkbox.js +58 -0
  41. package/dist/source/components/ui/dialog.d.ts +20 -0
  42. package/dist/source/components/ui/dialog.js +182 -0
  43. package/dist/source/components/ui/dropdown-menu.d.ts +28 -0
  44. package/dist/source/components/ui/dropdown-menu.js +282 -0
  45. package/dist/source/components/ui/index.d.ts +19 -0
  46. package/dist/source/components/ui/index.js +131 -0
  47. package/dist/source/components/ui/input.d.ts +6 -0
  48. package/dist/source/components/ui/input.js +49 -0
  49. package/dist/source/components/ui/select.d.ts +16 -0
  50. package/dist/source/components/ui/select.js +197 -0
  51. package/dist/source/components/ui/sonner.d.ts +6 -0
  52. package/dist/source/components/ui/sonner.js +80 -0
  53. package/dist/source/components/ui/switch.d.ts +7 -0
  54. package/dist/source/components/ui/switch.js +54 -0
  55. package/dist/source/components/ui/tabs.d.ts +10 -0
  56. package/dist/source/components/ui/tabs.js +57 -0
  57. package/dist/source/components/ui/textarea.d.ts +6 -0
  58. package/dist/source/components/ui/textarea.js +46 -0
  59. package/dist/source/i18n/config.d.ts +6 -0
  60. package/dist/source/i18n/config.js +12 -0
  61. package/dist/source/i18n/routing.d.ts +371 -0
  62. package/dist/source/i18n/routing.js +17 -0
  63. package/dist/source/lib/design/modal-inert.d.ts +6 -0
  64. package/dist/source/lib/design/modal-inert.js +73 -0
  65. package/dist/source/lib/utils.d.ts +5 -0
  66. package/dist/source/lib/utils.js +8 -0
  67. package/dist/tokens.ts +217 -0
  68. package/docs/components/README.md +21 -0
  69. package/docs/components/avatar.md +47 -0
  70. package/docs/components/badge.md +29 -0
  71. package/docs/components/button.md +39 -0
  72. package/docs/components/card.md +32 -0
  73. package/docs/components/checkbox.md +35 -0
  74. package/docs/components/common.md +31 -0
  75. package/docs/components/composition.md +68 -0
  76. package/docs/components/dialog.md +41 -0
  77. package/docs/components/dropdown-menu.md +38 -0
  78. package/docs/components/input.md +32 -0
  79. package/docs/components/select.md +39 -0
  80. package/docs/components/sonner.md +37 -0
  81. package/docs/components/switch.md +33 -0
  82. package/docs/components/tabs.md +40 -0
  83. package/docs/components/textarea.md +35 -0
  84. package/docs/design/component-demand.md +30 -0
  85. package/docs/design/public-ui-final-verification.md +96 -0
  86. package/docs/design/public-ui-release-validation.md +86 -0
  87. package/docs/design/public-ui-stage3-verification.md +98 -0
  88. package/docs/design/public-ui-stage4-verification.md +129 -0
  89. package/docs/design/public-ui-support.md +42 -0
  90. package/docs/design/v2-migration.md +229 -0
  91. package/docs/package-release.md +108 -0
  92. package/licenses/Lato-OFL.txt +93 -0
  93. package/licenses/Noto-Sans-JP-OFL.txt +93 -0
  94. package/licenses/Nunito-Sans-OFL.txt +93 -0
  95. package/licenses/Pretendard-OFL.txt +94 -0
  96. package/licenses/React-MIT.txt +21 -0
  97. package/licenses/Storybook-MIT.txt +21 -0
  98. package/licenses/popper-MIT.txt +25 -0
  99. package/licenses/react-remove-scroll-bar-MIT.txt +21 -0
  100. package/licenses/store2-MIT.txt +22 -0
  101. package/licenses/toggle-selection-MIT.txt +21 -0
  102. package/package.json +184 -34
  103. package/src/styles/components.css +276 -0
  104. package/src/styles/globals.css +18 -0
  105. package/src/styles/theme.css +185 -98
  106. package/messages/en.json +0 -221
  107. package/messages/ja.json +0 -221
  108. package/messages/ko.json +0 -221
  109. package/src/app/globals.css +0 -32
@@ -11,10 +11,14 @@ import { cva } from "class-variance-authority";
11
11
  import { Slot } from "radix-ui";
12
12
  import { jsx } from "react/jsx-runtime";
13
13
  var badgeVariants = cva(
14
- "inline-flex items-center justify-center rounded-sm border px-2 py-0.5 text-[11px] font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:ring-accent/25 focus-visible:ring-[2px] focus-visible:outline-none aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-colors overflow-hidden",
14
+ "inline-flex items-center justify-center rounded-sm border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none ui-focus aria-invalid:border-error transition-colors overflow-hidden",
15
15
  {
16
16
  variants: {
17
17
  variant: {
18
+ success: "bg-success-bg text-success border-transparent",
19
+ warning: "bg-warning-bg text-warning border-transparent",
20
+ error: "bg-error-bg text-error border-transparent",
21
+ info: "bg-info-bg text-info border-transparent",
18
22
  default: "bg-primary text-primary-foreground border-transparent [a&]:hover:bg-primary/90",
19
23
  secondary: "bg-secondary text-secondary-foreground border-transparent [a&]:hover:bg-secondary/80",
20
24
  outline: "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
@@ -50,6 +54,78 @@ function Badge(_a) {
50
54
  // src/components/ui/dropdown-menu.tsx
51
55
  import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react";
52
56
  import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui";
57
+
58
+ // src/lib/design/modal-inert.ts
59
+ import { useEffect, useMemo, useState } from "react";
60
+ var ownershipKey = /* @__PURE__ */ Symbol.for("@naeil/ui/radix-hidden-inert/v1");
61
+ function ownershipFor(doc) {
62
+ var _a;
63
+ const shared = doc;
64
+ return (_a = shared[ownershipKey]) != null ? _a : shared[ownershipKey] = /* @__PURE__ */ new WeakMap();
65
+ }
66
+ function useRadixHiddenInert(content) {
67
+ useEffect(() => {
68
+ if (!content) return;
69
+ const doc = content.ownerDocument;
70
+ const ownership = ownershipFor(doc);
71
+ const held = /* @__PURE__ */ new Set();
72
+ function release(element) {
73
+ held.delete(element);
74
+ const state = ownership.get(element);
75
+ if (!state || --state.users > 0) return;
76
+ element.inert = state.original;
77
+ ownership.delete(element);
78
+ }
79
+ function sync() {
80
+ const hidden = (content == null ? void 0 : content.isConnected) && content.dataset.state === "open" ? [...doc.querySelectorAll('[data-aria-hidden="true"][aria-hidden="true"]')].filter((element) => !element.contains(content)) : [];
81
+ const desired = new Set(hidden);
82
+ for (const element of held) if (!desired.has(element)) release(element);
83
+ for (const element of desired) {
84
+ if (held.has(element)) continue;
85
+ let state = ownership.get(element);
86
+ if (!state) {
87
+ state = { users: 0, original: element.inert };
88
+ ownership.set(element, state);
89
+ }
90
+ state.users++;
91
+ held.add(element);
92
+ element.inert = true;
93
+ }
94
+ }
95
+ const observer = new MutationObserver(sync);
96
+ observer.observe(doc.body, {
97
+ subtree: true,
98
+ childList: true,
99
+ attributes: true,
100
+ attributeFilter: ["aria-hidden", "data-aria-hidden", "data-state"]
101
+ });
102
+ sync();
103
+ return () => {
104
+ observer.disconnect();
105
+ for (const element of held) release(element);
106
+ };
107
+ }, [content]);
108
+ }
109
+ function assignObjectRef(ref, node) {
110
+ ref.current = node;
111
+ }
112
+ function useOverlayRef(consumerRef) {
113
+ const [node, setNode] = useState(null);
114
+ const ref = useMemo(() => (value) => {
115
+ setNode(value);
116
+ const cleanup = typeof consumerRef === "function" ? consumerRef(value) : void 0;
117
+ if (consumerRef && typeof consumerRef !== "function") assignObjectRef(consumerRef, value);
118
+ return () => {
119
+ setNode(null);
120
+ if (typeof cleanup === "function") cleanup();
121
+ else if (typeof consumerRef === "function") consumerRef(null);
122
+ else if (consumerRef) assignObjectRef(consumerRef, null);
123
+ };
124
+ }, [consumerRef]);
125
+ return [node, ref];
126
+ }
127
+
128
+ // src/components/ui/dropdown-menu.tsx
53
129
  import { jsx as jsx2, jsxs } from "react/jsx-runtime";
54
130
  function DropdownMenu(_a) {
55
131
  var props = __objRest(_a, []);
@@ -70,19 +146,24 @@ function DropdownMenuTrigger(_a) {
70
146
  }
71
147
  function DropdownMenuContent(_a) {
72
148
  var _b = _a, {
149
+ ref,
73
150
  className,
74
151
  sideOffset = 4
75
152
  } = _b, props = __objRest(_b, [
153
+ "ref",
76
154
  "className",
77
155
  "sideOffset"
78
156
  ]);
157
+ const [content, contentRef] = useOverlayRef(ref);
158
+ useRadixHiddenInert(content);
79
159
  return /* @__PURE__ */ jsx2(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx2(
80
160
  DropdownMenuPrimitive.Content,
81
161
  __spreadValues({
162
+ ref: contentRef,
82
163
  "data-slot": "dropdown-menu-content",
83
164
  sideOffset,
84
165
  className: cn(
85
- "bg-card/95 text-popover-foreground backdrop-blur-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 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-lg border border-border-subtle p-1 shadow-md",
166
+ "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",
86
167
  className
87
168
  )
88
169
  }, props)
@@ -109,7 +190,7 @@ function DropdownMenuItem(_a) {
109
190
  "data-inset": inset,
110
191
  "data-variant": variant,
111
192
  className: cn(
112
- "focus:bg-surface-subtle data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-md px-2 py-1.5 text-sm outline-hidden select-none transition-colors duration-150 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",
193
+ "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",
113
194
  className
114
195
  )
115
196
  }, props)
@@ -130,7 +211,7 @@ function DropdownMenuCheckboxItem(_a) {
130
211
  __spreadProps(__spreadValues({
131
212
  "data-slot": "dropdown-menu-checkbox-item",
132
213
  className: cn(
133
- "focus:bg-surface-subtle relative flex cursor-default items-center gap-2 rounded-md py-1.5 pr-2 pl-8 text-sm outline-hidden select-none transition-colors duration-150 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
214
+ "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",
134
215
  className
135
216
  ),
136
217
  checked
@@ -164,7 +245,7 @@ function DropdownMenuRadioItem(_a) {
164
245
  __spreadProps(__spreadValues({
165
246
  "data-slot": "dropdown-menu-radio-item",
166
247
  className: cn(
167
- "focus:bg-surface-subtle relative flex cursor-default items-center gap-2 rounded-md py-1.5 pr-2 pl-8 text-sm outline-hidden select-none transition-colors duration-150 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
248
+ "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",
168
249
  className
169
250
  )
170
251
  }, props), {
@@ -246,7 +327,7 @@ function DropdownMenuSubTrigger(_a) {
246
327
  "data-slot": "dropdown-menu-sub-trigger",
247
328
  "data-inset": inset,
248
329
  className: cn(
249
- "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-sm outline-hidden select-none transition-colors duration-150 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
330
+ "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",
250
331
  className
251
332
  )
252
333
  }, props), {
@@ -268,7 +349,7 @@ function DropdownMenuSubContent(_a) {
268
349
  __spreadValues({
269
350
  "data-slot": "dropdown-menu-sub-content",
270
351
  className: cn(
271
- "bg-card/95 text-popover-foreground backdrop-blur-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-lg border border-border-subtle p-1 shadow-lg",
352
+ "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",
272
353
  className
273
354
  )
274
355
  }, props)
@@ -280,26 +361,26 @@ import { cva as cva2 } from "class-variance-authority";
280
361
  import { Slot as Slot2 } from "radix-ui";
281
362
  import { jsx as jsx3 } from "react/jsx-runtime";
282
363
  var buttonVariants = cva2(
283
- "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all duration-150 cursor-pointer active:scale-[0.98] disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-accent focus-visible:ring-accent/25 focus-visible:ring-[2px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
364
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap ui-control ui-focus rounded-md text-base font-medium transition-colors duration-(--ui-motion-fast) cursor-pointer disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 ui-focus aria-invalid:border-error",
284
365
  {
285
366
  variants: {
286
367
  variant: {
287
- default: "bg-primary text-primary-foreground shadow-[inset_0_1px_0_0_var(--color-primary-foreground)/0.1] hover:bg-primary/90",
288
- destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40",
289
- outline: "border border-border-subtle bg-background hover:bg-surface-subtle",
368
+ default: "bg-primary text-primary-foreground hover:bg-primary-hover",
369
+ destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90 ",
370
+ outline: "border border-border-strong bg-background hover:bg-surface-subtle",
290
371
  secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
291
372
  ghost: "hover:bg-surface-subtle",
292
373
  link: "text-primary underline-offset-4 hover:underline"
293
374
  },
294
375
  size: {
295
- default: "h-9 px-4 py-2 has-[>svg]:px-3",
296
- xs: "h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",
297
- sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
298
- lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
299
- icon: "size-9",
300
- "icon-xs": "size-6 rounded-md [&_svg:not([class*='size-'])]:size-3",
301
- "icon-sm": "size-8",
302
- "icon-lg": "size-10"
376
+ default: "px-4 has-[>svg]:px-3",
377
+ xs: "gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",
378
+ sm: "rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
379
+ lg: "rounded-md px-6 has-[>svg]:px-4",
380
+ icon: "",
381
+ "icon-xs": "rounded-md [&_svg:not([class*='size-'])]:size-3",
382
+ "icon-sm": "",
383
+ "icon-lg": ""
303
384
  }
304
385
  },
305
386
  defaultVariants: {
@@ -335,6 +416,8 @@ function Button(_a) {
335
416
  export {
336
417
  badgeVariants,
337
418
  Badge,
419
+ useRadixHiddenInert,
420
+ useOverlayRef,
338
421
  DropdownMenu,
339
422
  DropdownMenuPortal,
340
423
  DropdownMenuTrigger,
@@ -1,6 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { ThemeProvider as ThemeProvider$1 } from 'next-themes';
3
3
  import * as React$1 from 'react';
4
+ import { SVGProps } from 'react';
4
5
 
5
6
  interface NavProps {
6
7
  /** Internal Link component (from consumer's next-intl routing) */
@@ -9,11 +10,11 @@ interface NavProps {
9
10
  }>;
10
11
  /** Current pathname value (already resolved, not a hook) */
11
12
  usePathname: () => string;
12
- /** Where the .naeil logo links to. Default: "/" */
13
+ /** Where the naeil logo links to. Default: "/" */
13
14
  brandHref?: string;
14
15
  /** Whether brandHref is external (renders <a>) or internal (renders Link). Default: false */
15
16
  brandExternal?: boolean;
16
- /** Custom brand content (replaces default Logo + ".naeil" text) */
17
+ /** Custom brand content (replaces the default naeil wordmark lockup) */
17
18
  brandSlot?: React.ReactNode;
18
19
  /** When true, project links (except current) are rendered as external <a> to externalBaseUrl. Default: false */
19
20
  projectsExternal?: boolean;
@@ -70,18 +71,26 @@ declare function ThemeProvider({ children, ...props }: React.ComponentProps<type
70
71
 
71
72
  declare function ThemeToggleIcon(): react_jsx_runtime.JSX.Element;
72
73
 
73
- declare function Logo({ size, mono, className, }: {
74
+ interface LogoProps extends Omit<SVGProps<SVGSVGElement>, "children" | "width" | "height" | "viewBox"> {
75
+ /** Rendered height. Symbol stays square; lockups preserve their aspect ratio. */
74
76
  size?: number;
77
+ /** Legacy single-ink currentColor silhouette. Prefer tone="gray" for tonal detail. */
75
78
  mono?: boolean;
76
- className?: string;
77
- }): react_jsx_runtime.JSX.Element;
79
+ variant?: "symbol" | "horizontal" | "footer" | "stacked" | "wordmark";
80
+ tone?: "color" | "gray";
81
+ /** Auto follows the nearest .light/.dark or data-theme ancestor, then the OS. */
82
+ theme?: "auto" | "light" | "dark";
83
+ /** null marks a decorative logo; label the containing link instead. */
84
+ label?: string | null;
85
+ }
86
+ declare function Logo({ size, mono, variant, tone, theme, label, className, ...props }: LogoProps): react_jsx_runtime.JSX.Element;
78
87
 
79
88
  type HeadingProps = React$1.HTMLAttributes<HTMLHeadingElement> & {
80
89
  children: React$1.ReactNode;
81
90
  };
82
- declare const pageTitleClass = "text-foreground text-4xl font-bold tracking-tight lg:text-5xl";
83
- declare const sectionTitleClass = "text-foreground text-lg font-bold";
91
+ declare const pageTitleClass = "text-foreground text-3xl font-semibold leading-tight";
92
+ declare const sectionTitleClass = "text-foreground text-xl font-semibold";
84
93
  declare function PageTitle({ className, children, ...props }: HeadingProps): react_jsx_runtime.JSX.Element;
85
94
  declare function SectionTitle({ className, children, ...props }: HeadingProps): react_jsx_runtime.JSX.Element;
86
95
 
87
- export { Footer, LocaleSwitcher, Logo, Nav, PageTitle, SectionTitle, ThemeProvider, ThemeToggle, ThemeToggleIcon, pageTitleClass, sectionTitleClass };
96
+ export { Footer, LocaleSwitcher, Logo, type LogoProps, Nav, PageTitle, SectionTitle, ThemeProvider, ThemeToggle, ThemeToggleIcon, pageTitleClass, sectionTitleClass };