@photon-ai/pho-ui 1.4.0 → 2.0.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 (83) hide show
  1. package/dist/chunks/IconAlertCircleFilled-VxKU8TYK.js +11 -0
  2. package/dist/chunks/IconAlertCircleFilled-VxKU8TYK.js.map +1 -0
  3. package/dist/chunks/IconArrowUpRight-DGgKzQwV.js +14 -0
  4. package/dist/chunks/IconArrowUpRight-DGgKzQwV.js.map +1 -0
  5. package/dist/chunks/IconChevronLeft-CSWMKQ4C.js +11 -0
  6. package/dist/chunks/IconChevronLeft-CSWMKQ4C.js.map +1 -0
  7. package/dist/chunks/IconInfoCircle-L0zfhg7R.js +21 -0
  8. package/dist/chunks/IconInfoCircle-L0zfhg7R.js.map +1 -0
  9. package/dist/chunks/animated-height-DhNSac85.js +50 -0
  10. package/dist/chunks/animated-height-DhNSac85.js.map +1 -0
  11. package/dist/chunks/basic-page-D1zm81YS.js +481 -0
  12. package/dist/chunks/basic-page-D1zm81YS.js.map +1 -0
  13. package/dist/chunks/{close-button-B8gF5UNk.js → button-X5wsWvRa.js} +127 -147
  14. package/dist/chunks/button-X5wsWvRa.js.map +1 -0
  15. package/dist/chunks/close-button-xadxp0j8.js +29 -0
  16. package/dist/chunks/close-button-xadxp0j8.js.map +1 -0
  17. package/dist/chunks/combobox-rLdS6fl-.js +117 -0
  18. package/dist/chunks/combobox-rLdS6fl-.js.map +1 -0
  19. package/dist/chunks/dialog-Caze1vkf.js +252 -0
  20. package/dist/chunks/dialog-Caze1vkf.js.map +1 -0
  21. package/dist/chunks/error-DR6G2LmG.js +251 -0
  22. package/dist/chunks/error-DR6G2LmG.js.map +1 -0
  23. package/dist/chunks/{input-CxS7ndpb.js → input-D3XQcC4J.js} +29 -31
  24. package/dist/chunks/input-D3XQcC4J.js.map +1 -0
  25. package/dist/chunks/{menu-BSXds3Rt.js → menu-BC-9IP29.js} +39 -39
  26. package/dist/chunks/menu-BC-9IP29.js.map +1 -0
  27. package/dist/chunks/popover-EL1SE1kj.js +46 -0
  28. package/dist/chunks/popover-EL1SE1kj.js.map +1 -0
  29. package/dist/chunks/{sidebar-DGpEKxOn.js → sidebar-DDJC1MeD.js} +72 -64
  30. package/dist/chunks/sidebar-DDJC1MeD.js.map +1 -0
  31. package/dist/components/button.js +13 -12
  32. package/dist/components/combobox.js +2 -114
  33. package/dist/components/command.js +242 -0
  34. package/dist/components/command.js.map +1 -0
  35. package/dist/components/context-menu.js +1 -1
  36. package/dist/components/dialog.js +1 -1
  37. package/dist/components/drawer.js.map +1 -1
  38. package/dist/components/error.js +13 -0
  39. package/dist/components/input.js +1 -1
  40. package/dist/components/menu.js +1 -1
  41. package/dist/components/notification.js +27 -39
  42. package/dist/components/notification.js.map +1 -1
  43. package/dist/components/phone-input.js +17001 -0
  44. package/dist/components/phone-input.js.map +1 -0
  45. package/dist/components/popover.js +2 -43
  46. package/dist/components/toast.js.map +1 -1
  47. package/dist/index.js +62 -50
  48. package/dist/primitives.js +1 -1
  49. package/dist/sections/basic-page.js +1 -1
  50. package/dist/sections/sidebar.js +1 -1
  51. package/dist/src/components/command/command.d.ts +114 -0
  52. package/dist/src/components/command/index.d.ts +1 -0
  53. package/dist/src/components/dialog/dialog.d.ts +89 -1
  54. package/dist/src/components/drawer/drawer.d.ts +2 -2
  55. package/dist/src/components/error/error.d.ts +56 -0
  56. package/dist/src/components/error/index.d.ts +2 -0
  57. package/dist/src/components/error/problem.d.ts +80 -0
  58. package/dist/src/components/notification/notification.d.ts +1 -1
  59. package/dist/src/components/phone-input/country-alpha3.d.ts +250 -0
  60. package/dist/src/components/phone-input/country-search.d.ts +8 -0
  61. package/dist/src/components/phone-input/index.d.ts +1 -0
  62. package/dist/src/components/phone-input/phone-input.d.ts +47 -0
  63. package/dist/src/components/toast/toast.d.ts +1 -1
  64. package/dist/src/index.d.ts +1 -0
  65. package/dist/src/sections/basic-page/basic-page.d.ts +165 -45
  66. package/dist/src/sections/sidebar/sidebar.d.ts +8 -3
  67. package/dist/src/utils/animated-height.d.ts +13 -0
  68. package/package.json +16 -5
  69. package/src/styles/theme.css +27 -0
  70. package/dist/chunks/basic-page-4_GZOvRr.js +0 -255
  71. package/dist/chunks/basic-page-4_GZOvRr.js.map +0 -1
  72. package/dist/chunks/close-button-B8gF5UNk.js.map +0 -1
  73. package/dist/chunks/dialog-Ba0UUE5g.js +0 -155
  74. package/dist/chunks/dialog-Ba0UUE5g.js.map +0 -1
  75. package/dist/chunks/input-CxS7ndpb.js.map +0 -1
  76. package/dist/chunks/menu-BSXds3Rt.js.map +0 -1
  77. package/dist/chunks/sidebar-DGpEKxOn.js.map +0 -1
  78. package/dist/components/alert-dialog.js +0 -59
  79. package/dist/components/alert-dialog.js.map +0 -1
  80. package/dist/components/combobox.js.map +0 -1
  81. package/dist/components/popover.js.map +0 -1
  82. package/dist/src/components/alert-dialog/alert-dialog.d.ts +0 -41
  83. package/dist/src/components/alert-dialog/index.d.ts +0 -1
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { t as a } from "./cn-DTiB6ek_.js";
2
+ import { t as o } from "./cn-DTiB6ek_.js";
3
3
  import { t as I } from "./resolve-variant-CcD8iG5l.js";
4
4
  import { n as S } from "./spinner-Cy8bkyJf.js";
5
5
  import { createContext as E, useCallback as T, useContext as P, useEffect as N, useMemo as G, useRef as b, useState as C } from "react";
@@ -15,12 +15,12 @@ function L(e) {
15
15
  }
16
16
  function O(e) {
17
17
  function n({ onOpenChange: i, actionsRef: s, ...u }) {
18
- const [d, l] = C(!1), c = b(!1), o = b(null);
18
+ const [l, d] = C(!1), c = b(!1), a = b(null);
19
19
  N(() => {
20
20
  if (s)
21
21
  return s.current = {
22
- unmount: () => o.current?.unmount(),
23
- close: () => o.current?.close()
22
+ unmount: () => a.current?.unmount(),
23
+ close: () => a.current?.close()
24
24
  }, () => {
25
25
  s.current = null;
26
26
  };
@@ -32,20 +32,20 @@ function O(e) {
32
32
  }
33
33
  i?.(h, m);
34
34
  }, [i]), g = G(() => ({
35
- pending: d,
35
+ pending: l,
36
36
  beginPending: () => {
37
- c.current = !0, l(!0);
37
+ c.current = !0, d(!0);
38
38
  },
39
39
  endPending: () => {
40
- c.current = !1, l(!1);
40
+ c.current = !1, d(!1);
41
41
  },
42
- close: () => o.current?.close()
43
- }), [d]);
42
+ close: () => a.current?.close()
43
+ }), [l]);
44
44
  return /* @__PURE__ */ r(y.Provider, {
45
45
  value: g,
46
46
  children: /* @__PURE__ */ r(e, {
47
47
  ...u,
48
- actionsRef: o,
48
+ actionsRef: a,
49
49
  onOpenChange: p
50
50
  })
51
51
  });
@@ -53,21 +53,21 @@ function O(e) {
53
53
  return n;
54
54
  }
55
55
  function w({ onClick: e, closeOnClick: n = !0, loading: i = !1, disabled: s = !1 }) {
56
- const u = P(y), d = u?.pending ?? !1, [l, c] = C(!1), o = b(!0);
57
- N(() => (o.current = !0, () => {
58
- o.current = !1;
56
+ const u = P(y), l = u?.pending ?? !1, [d, c] = C(!1), a = b(!0);
57
+ N(() => (a.current = !0, () => {
58
+ a.current = !1;
59
59
  }), []);
60
- const p = l || i, g = s || d && !l;
60
+ const p = d || i, g = s || l && !d;
61
61
  function h(m) {
62
- if (p || d && !l) {
62
+ if (p || l && !d) {
63
63
  m.preventBaseUIHandler?.();
64
64
  return;
65
65
  }
66
66
  const v = e?.(m);
67
67
  L(v) && (m.preventBaseUIHandler?.(), c(!0), u?.beginPending(), v.then(() => {
68
- u?.endPending(), o.current && c(!1), n && u?.close();
68
+ u?.endPending(), a.current && c(!1), n && u?.close();
69
69
  }, (k) => {
70
- u?.endPending(), o.current && c(!1), typeof process < "u" && process.env.NODE_ENV !== "production" && console.error("Menu.Item: async onClick rejected —", k);
70
+ u?.endPending(), a.current && c(!1), typeof process < "u" && process.env.NODE_ENV !== "production" && console.error("Menu.Item: async onClick rejected —", k);
71
71
  }));
72
72
  }
73
73
  return {
@@ -82,7 +82,7 @@ function z() {
82
82
  size: "md"
83
83
  });
84
84
  }
85
- var j = "bg-pho-primary text-pho-primary shadow-pho-lg ring-pho-secondary origin-[var(--transform-origin)] min-w-44 rounded-base p-1.5 ring-1 ring-inset outline-none transition-[transform,opacity] duration-150 ease-out data-[starting-style]:scale-95 data-[starting-style]:opacity-0 data-[ending-style]:scale-95 data-[ending-style]:opacity-0", f = "relative flex cursor-pointer items-center gap-2 rounded-[calc(var(--radius-base)-6px)] py-2 pr-2.5 pl-2.5 text-base text-pho-secondary outline-none select-none data-[highlighted]:bg-pho-ghost-hover data-[highlighted]:text-pho-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-loading:data-[disabled]:opacity-100 data-loading:[&>svg:not([data-menu-spinner])]:hidden [&>svg]:size-4 [&>svg]:text-current", R = {
85
+ var j = "bg-pho-primary text-pho-primary shadow-pho-lg ring-pho-secondary origin-[var(--transform-origin)] min-w-44 rounded-base p-1.5 ring-1 ring-inset outline-none transition-[transform,opacity] duration-[330ms] ease-pho-spring data-[ending-style]:duration-150 data-[ending-style]:ease-out data-[starting-style]:scale-95 data-[starting-style]:opacity-0 data-[ending-style]:scale-95 data-[ending-style]:opacity-0", f = "relative flex cursor-pointer items-center gap-2 rounded-[calc(var(--radius-base)-6px)] py-2 pr-2.5 pl-2.5 text-base text-pho-secondary outline-none select-none data-[highlighted]:bg-pho-ghost-hover data-[highlighted]:text-pho-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-loading:data-[disabled]:opacity-100 data-loading:[&>svg:not([data-menu-spinner])]:hidden [&>svg]:size-4 [&>svg]:text-current", R = {
86
86
  default: {
87
87
  classes: "",
88
88
  description: "Secondary → primary on highlight"
@@ -95,87 +95,87 @@ var j = "bg-pho-primary text-pho-primary shadow-pho-lg ring-pho-secondary origin
95
95
  function F({ className: e, sideOffset: n = 6, ...i }) {
96
96
  return /* @__PURE__ */ r(t.Positioner, {
97
97
  sideOffset: n,
98
- className: a("z-50", e),
98
+ className: o("z-50", e),
99
99
  ...i
100
100
  });
101
101
  }
102
102
  function K({ className: e, ...n }) {
103
103
  return /* @__PURE__ */ r(t.Popup, {
104
- className: a(j, e),
104
+ className: o(j, e),
105
105
  ...n
106
106
  });
107
107
  }
108
- function q({ className: e, color: n = "default", onClick: i, closeOnClick: s = !0, loading: u = !1, disabled: d = !1, children: l, ...c }) {
109
- const { inert: o, blocked: p, handleClick: g } = w({
108
+ function q({ className: e, color: n = "default", onClick: i, closeOnClick: s = !0, loading: u = !1, disabled: l = !1, children: d, ...c }) {
109
+ const { inert: a, blocked: p, handleClick: g } = w({
110
110
  onClick: i,
111
111
  closeOnClick: s,
112
112
  loading: u,
113
- disabled: d
113
+ disabled: l
114
114
  });
115
115
  return /* @__PURE__ */ x(t.Item, {
116
- className: a(f, I(R, n), e),
116
+ className: o(f, I(R, n), e),
117
117
  closeOnClick: s,
118
118
  disabled: p,
119
- "data-loading": o || void 0,
120
- "aria-busy": o || void 0,
119
+ "data-loading": a || void 0,
120
+ "aria-busy": a || void 0,
121
121
  onClick: g,
122
122
  ...c,
123
- children: [o ? /* @__PURE__ */ x(U, { children: [/* @__PURE__ */ r(z, {}), /* @__PURE__ */ r("output", {
123
+ children: [a ? /* @__PURE__ */ x(U, { children: [/* @__PURE__ */ r(z, {}), /* @__PURE__ */ r("output", {
124
124
  className: "sr-only",
125
125
  "aria-live": "polite"
126
- })] }) : null, l]
126
+ })] }) : null, d]
127
127
  });
128
128
  }
129
129
  function J({ className: e, color: n = "default", ...i }) {
130
130
  return /* @__PURE__ */ r(t.LinkItem, {
131
- className: a(f, I(R, n), e),
131
+ className: o(f, I(R, n), e),
132
132
  ...i
133
133
  });
134
134
  }
135
135
  function Q({ className: e, ...n }) {
136
136
  return /* @__PURE__ */ r(t.GroupLabel, {
137
- className: a("text-pho-secondary px-2.5 py-1.5 text-xs font-medium", e),
137
+ className: o("text-pho-secondary px-2.5 py-1.5 text-xs font-medium", e),
138
138
  ...n
139
139
  });
140
140
  }
141
141
  function W({ className: e, ...n }) {
142
142
  return /* @__PURE__ */ r(_, {
143
- className: a("-mx-1.5 my-1.5 h-px bg-[var(--border-color-pho-secondary)]", e),
143
+ className: o("-mx-1.5 my-1.5 h-px bg-[var(--border-color-pho-secondary)]", e),
144
144
  ...n
145
145
  });
146
146
  }
147
147
  function X({ className: e, ...n }) {
148
148
  return /* @__PURE__ */ r(t.SubmenuTrigger, {
149
- className: a(f, "data-[popup-open]:bg-pho-ghost-hover", e),
149
+ className: o(f, "data-[popup-open]:bg-pho-ghost-hover", e),
150
150
  ...n
151
151
  });
152
152
  }
153
153
  function Y({ className: e, ...n }) {
154
154
  return /* @__PURE__ */ r(t.CheckboxItem, {
155
- className: a(f, "pl-8", e),
155
+ className: o(f, "pl-8", e),
156
156
  ...n
157
157
  });
158
158
  }
159
159
  function Z({ className: e, ...n }) {
160
160
  return /* @__PURE__ */ r(t.RadioItem, {
161
- className: a(f, "pl-8", e),
161
+ className: o(f, "pl-8", e),
162
162
  ...n
163
163
  });
164
164
  }
165
165
  var M = "text-pho-brand absolute left-2.5 flex items-center [&>svg]:size-4";
166
166
  function ee({ className: e, ...n }) {
167
167
  return /* @__PURE__ */ r(t.CheckboxItemIndicator, {
168
- className: a(M, e),
168
+ className: o(M, e),
169
169
  ...n
170
170
  });
171
171
  }
172
172
  function ne({ className: e, ...n }) {
173
173
  return /* @__PURE__ */ r(t.RadioItemIndicator, {
174
- className: a(M, e),
174
+ className: o(M, e),
175
175
  ...n
176
176
  });
177
177
  }
178
- var le = {
178
+ var de = {
179
179
  Root: A,
180
180
  Trigger: B,
181
181
  Portal: H,
@@ -197,7 +197,7 @@ var le = {
197
197
  export {
198
198
  z as a,
199
199
  O as c,
200
- le as i,
200
+ de as i,
201
201
  R as n,
202
202
  w as o,
203
203
  j as r,
@@ -205,4 +205,4 @@ export {
205
205
  f as t
206
206
  };
207
207
 
208
- //# sourceMappingURL=menu-BSXds3Rt.js.map
208
+ //# sourceMappingURL=menu-BC-9IP29.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu-BC-9IP29.js","names":[],"sources":["../../src/components/menu/menu-pending.tsx","../../src/components/menu/menu.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport { Spinner } from \"../spinner/spinner\";\n\n/** Imperative actions exposed by Base UI menu `actionsRef`. */\ninterface RootActions {\n unmount: () => void;\n close: () => void;\n}\n\ninterface MenuPendingContextValue {\n /** True while a menu item promise is in flight. */\n pending: boolean;\n beginPending: () => void;\n endPending: () => void;\n /** Close the menu imperatively (used by async items on resolve). */\n close: () => void;\n}\n\nconst MenuPendingContext = createContext<MenuPendingContextValue | null>(null);\n\n/**\n * Whether the surrounding menu has an async item promise in flight —\n * use it to disable sibling items while work is pending.\n * Returns `false` outside a `Menu.Root` / `ContextMenu.Root`.\n */\nexport function useMenuPending(): boolean {\n return useContext(MenuPendingContext)?.pending ?? false;\n}\n\nexport function isThenable(value: unknown): value is Promise<unknown> {\n return (\n value != null && typeof (value as { then?: unknown }).then === \"function\"\n );\n}\n\ntype PreventableMouseEvent = ReactMouseEvent<HTMLElement> & {\n preventBaseUIHandler?: () => void;\n};\n\ntype RootWithPendingProps = {\n onOpenChange?: (open: boolean, eventDetails: { cancel: () => void }) => void;\n actionsRef?: RefObject<RootActions | null>;\n children?: ReactNode;\n};\n\n/**\n * Wraps a Base UI menu root so async `Menu.Item` clicks can lock dismissal\n * (outside press, Escape) until the promise settles.\n */\nexport function withMenuPendingRoot<P extends RootWithPendingProps>(\n BaseRoot: ComponentType<P>,\n): ComponentType<P> {\n function PendingRoot({ onOpenChange, actionsRef, ...props }: P) {\n const [pending, setPending] = useState(false);\n // Guard reads a ref so a resolve → close() in the same tick isn't blocked\n // by a not-yet-flushed state update.\n const pendingRef = useRef(false);\n const internalActionsRef = useRef<RootActions | null>(null);\n\n useEffect(() => {\n if (!actionsRef) return;\n // Proxy so callers always hit the live Base UI actions, even if the\n // popup remounts after this effect runs.\n actionsRef.current = {\n unmount: () => internalActionsRef.current?.unmount(),\n close: () => internalActionsRef.current?.close(),\n };\n return () => {\n actionsRef.current = null;\n };\n }, [actionsRef]);\n\n const handleOpenChange = useCallback(\n (open: boolean, eventDetails: { cancel: () => void }) => {\n if (!open && pendingRef.current) {\n eventDetails.cancel();\n return;\n }\n onOpenChange?.(open, eventDetails);\n },\n [onOpenChange],\n );\n\n const contextValue = useMemo<MenuPendingContextValue>(\n () => ({\n pending,\n beginPending: () => {\n pendingRef.current = true;\n setPending(true);\n },\n endPending: () => {\n pendingRef.current = false;\n setPending(false);\n },\n close: () => internalActionsRef.current?.close(),\n }),\n [pending],\n );\n\n return (\n <MenuPendingContext.Provider value={contextValue}>\n <BaseRoot\n {...(props as P)}\n actionsRef={internalActionsRef}\n onOpenChange={handleOpenChange}\n />\n </MenuPendingContext.Provider>\n );\n }\n\n return PendingRoot as ComponentType<P>;\n}\n\nexport type AsyncMenuItemClick = (\n event: ReactMouseEvent<HTMLElement>,\n) => void | Promise<unknown>;\n\n/**\n * Shared click handler for `Menu.Item` / `ContextMenu.Item` promise support.\n * Returns whether the item should show its loading state.\n */\nexport function useAsyncMenuItem({\n onClick,\n closeOnClick = true,\n loading = false,\n disabled = false,\n}: {\n onClick?: AsyncMenuItemClick;\n closeOnClick?: boolean;\n loading?: boolean;\n disabled?: boolean;\n}) {\n const pendingContext = useContext(MenuPendingContext);\n const menuPending = pendingContext?.pending ?? false;\n const [busy, setBusy] = useState(false);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const inert = busy || loading;\n // Disable siblings while any item promise is in flight — not the busy item itself.\n const blocked = disabled || (menuPending && !busy);\n\n function handleClick(event: ReactMouseEvent<HTMLElement>) {\n if (inert || (menuPending && !busy)) {\n (event as PreventableMouseEvent).preventBaseUIHandler?.();\n return;\n }\n const result = onClick?.(event);\n if (!isThenable(result)) {\n return;\n }\n // Stop Base UI's closeOnClick for this press; close on resolve instead.\n (event as PreventableMouseEvent).preventBaseUIHandler?.();\n setBusy(true);\n pendingContext?.beginPending();\n result.then(\n () => {\n pendingContext?.endPending();\n if (mountedRef.current) setBusy(false);\n if (closeOnClick) pendingContext?.close();\n },\n (error: unknown) => {\n pendingContext?.endPending();\n if (mountedRef.current) setBusy(false);\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV !== \"production\"\n ) {\n console.error(\"Menu.Item: async onClick rejected —\", error);\n }\n },\n );\n }\n\n return { inert, blocked, handleClick };\n}\n\n/** Menu-row spinner — keeps `data-menu-spinner` for the hide-siblings CSS. */\nexport function MenuItemSpinner() {\n return <Spinner data-menu-spinner=\"\" size=\"md\" />;\n}\n","import {\n type ComponentProps,\n type ElementType,\n type MouseEvent as ReactMouseEvent,\n} from \"react\";\nimport { Menu as BaseMenu } from \"@base-ui/react/menu\";\nimport { Separator as BaseSeparator } from \"@base-ui/react/separator\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant, type VariantMap } from \"../../utils/resolve-variant\";\nimport {\n MenuItemSpinner,\n useAsyncMenuItem,\n useMenuPending,\n withMenuPendingRoot,\n type AsyncMenuItemClick,\n} from \"./menu-pending\";\n\nexport { useMenuPending };\n\n/** Override Base UI's `string | (state) => string` className with plain string. */\ntype StyledProps<T extends ElementType> = Omit<\n ComponentProps<T>,\n \"className\" | \"color\"\n> & {\n className?: string;\n};\n\n/** Shared popup + item styles, reused by `ContextMenu` and `Menubar` menus. */\n// Floating layer: keeps its elevation shadow, sits on the primary surface\n// with the site's hairline (ring-pho-secondary, #eee/#202020) as its edge.\n// `base` radius + p-1.5 inset — the highlight floats 6px clear of the edge.\nexport const MENU_POPUP =\n \"bg-pho-primary text-pho-primary shadow-pho-lg ring-pho-secondary origin-[var(--transform-origin)] min-w-44 rounded-base p-1.5 ring-1 ring-inset outline-none transition-[transform,opacity] duration-[330ms] ease-pho-spring data-[ending-style]:duration-150 data-[ending-style]:ease-out data-[starting-style]:scale-95 data-[starting-style]:opacity-0 data-[ending-style]:scale-95 data-[ending-style]:opacity-0\";\n// Rest at secondary; highlighted lifts to primary with the quiet ghost wash.\n// Icons use `text-current` so they follow the row ink (including destructive).\n// While loading, the spinner is first; hide the rest of the leading icons.\n// Concentric correction (see /scale): row radius = popup radius − popup\n// padding (base − 6px). py-2 + 20px line-height lands the 36px row height.\nexport const MENU_ITEM =\n \"relative flex cursor-pointer items-center gap-2 rounded-[calc(var(--radius-base)-6px)] py-2 pr-2.5 pl-2.5 text-base text-pho-secondary outline-none select-none data-[highlighted]:bg-pho-ghost-hover data-[highlighted]:text-pho-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-loading:data-[disabled]:opacity-100 data-loading:[&>svg:not([data-menu-spinner])]:hidden [&>svg]:size-4 [&>svg]:text-current\";\n\n/** Semantic ink for `Menu.Item` / `LinkItem` / `ContextMenu.Item`. */\nexport const MENU_ITEM_COLORS = {\n default: { classes: \"\", description: \"Secondary → primary on highlight\" },\n destructive: {\n classes:\n \"text-pho-error data-[highlighted]:bg-pho-error-primary data-[highlighted]:text-pho-error\",\n description: \"Error ink + error wash on highlight\",\n },\n} satisfies VariantMap;\n\nexport type MenuItemColor = keyof typeof MENU_ITEM_COLORS;\n\ntype ItemColorProps = {\n /** Semantic ink. @default \"default\" */\n color?: MenuItemColor;\n};\n\nexport type MenuItemProps = Omit<StyledProps<typeof BaseMenu.Item>, \"onClick\"> &\n ItemColorProps & {\n /**\n * Action handler. Return a promise to keep the menu open while it runs:\n * the item shows a spinner, dismissal is locked, and the menu closes when\n * the promise resolves (if `closeOnClick`). On rejection the menu stays\n * open — surface errors inside the handler.\n */\n onClick?: AsyncMenuItemClick;\n /**\n * Declarative loading state (same visual as an in-flight promise).\n * @default false\n */\n loading?: boolean;\n };\n\nconst Root = withMenuPendingRoot(BaseMenu.Root);\nconst Trigger = BaseMenu.Trigger;\nconst Portal = BaseMenu.Portal;\nconst Group = BaseMenu.Group;\nconst RadioGroup = BaseMenu.RadioGroup;\n// Don't wrap SubmenuRoot — nested pending context would shadow the parent\n// Root and fail to lock dismissal for async items inside a submenu.\nconst SubmenuRoot = BaseMenu.SubmenuRoot;\n\nfunction Positioner({\n className,\n sideOffset = 6,\n ...props\n}: StyledProps<typeof BaseMenu.Positioner>) {\n return (\n <BaseMenu.Positioner\n sideOffset={sideOffset}\n className={cn(\"z-50\", className)}\n {...props}\n />\n );\n}\n\nfunction Popup({ className, ...props }: StyledProps<typeof BaseMenu.Popup>) {\n return <BaseMenu.Popup className={cn(MENU_POPUP, className)} {...props} />;\n}\n\nfunction Item({\n className,\n color = \"default\",\n onClick,\n closeOnClick = true,\n loading = false,\n disabled = false,\n children,\n ...props\n}: MenuItemProps) {\n const { inert, blocked, handleClick } = useAsyncMenuItem({\n onClick,\n closeOnClick,\n loading,\n disabled,\n });\n\n return (\n <BaseMenu.Item\n className={cn(\n MENU_ITEM,\n resolveVariant(MENU_ITEM_COLORS, color),\n className,\n )}\n closeOnClick={closeOnClick}\n disabled={blocked}\n data-loading={inert || undefined}\n aria-busy={inert || undefined}\n onClick={handleClick as (event: ReactMouseEvent<HTMLElement>) => void}\n {...props}\n >\n {inert ? (\n <>\n <MenuItemSpinner />\n <output className=\"sr-only\" aria-live=\"polite\" />\n </>\n ) : null}\n {children}\n </BaseMenu.Item>\n );\n}\n\nfunction LinkItem({\n className,\n color = \"default\",\n ...props\n}: StyledProps<typeof BaseMenu.LinkItem> & ItemColorProps) {\n return (\n <BaseMenu.LinkItem\n className={cn(\n MENU_ITEM,\n resolveVariant(MENU_ITEM_COLORS, color),\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction GroupLabel({\n className,\n ...props\n}: StyledProps<typeof BaseMenu.GroupLabel>) {\n return (\n <BaseMenu.GroupLabel\n className={cn(\n \"text-pho-secondary px-2.5 py-1.5 text-xs font-medium\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Separator({ className, ...props }: StyledProps<typeof BaseSeparator>) {\n return (\n <BaseSeparator\n className={cn(\n \"-mx-1.5 my-1.5 h-px bg-[var(--border-color-pho-secondary)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SubmenuTrigger({\n className,\n ...props\n}: StyledProps<typeof BaseMenu.SubmenuTrigger>) {\n return (\n <BaseMenu.SubmenuTrigger\n className={cn(\n MENU_ITEM,\n \"data-[popup-open]:bg-pho-ghost-hover\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CheckboxItem({\n className,\n ...props\n}: StyledProps<typeof BaseMenu.CheckboxItem>) {\n return (\n <BaseMenu.CheckboxItem\n className={cn(MENU_ITEM, \"pl-8\", className)}\n {...props}\n />\n );\n}\n\nfunction RadioItem({\n className,\n ...props\n}: StyledProps<typeof BaseMenu.RadioItem>) {\n return (\n <BaseMenu.RadioItem\n className={cn(MENU_ITEM, \"pl-8\", className)}\n {...props}\n />\n );\n}\n\nconst CHECK_INDICATOR =\n \"text-pho-brand absolute left-2.5 flex items-center [&>svg]:size-4\";\n\nfunction CheckboxItemIndicator({\n className,\n ...props\n}: StyledProps<typeof BaseMenu.CheckboxItemIndicator>) {\n return (\n <BaseMenu.CheckboxItemIndicator\n className={cn(CHECK_INDICATOR, className)}\n {...props}\n />\n );\n}\n\nfunction RadioItemIndicator({\n className,\n ...props\n}: StyledProps<typeof BaseMenu.RadioItemIndicator>) {\n return (\n <BaseMenu.RadioItemIndicator\n className={cn(CHECK_INDICATOR, className)}\n {...props}\n />\n );\n}\n\n/**\n * Dropdown menu built on Base UI `Menu` — a list of actions opened from a\n * trigger. Supports grouped items, separators, submenus\n * (`SubmenuRoot` + `SubmenuTrigger`), and stateful `CheckboxItem` /\n * `RadioItem`s. `Menu.Item` has native promise support (spinner + locked\n * dismissal while pending). For a right-click menu use `ContextMenu`.\n */\nexport const Menu = {\n Root,\n Trigger,\n Portal,\n Positioner,\n Popup,\n Item,\n LinkItem,\n Group,\n GroupLabel,\n Separator,\n SubmenuRoot,\n SubmenuTrigger,\n CheckboxItem,\n CheckboxItemIndicator,\n RadioGroup,\n RadioItem,\n RadioItemIndicator,\n};\n"],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ "use client";
2
+ import { t as e } from "./cn-DTiB6ek_.js";
3
+ import "react";
4
+ import { jsx as a } from "react/jsx-runtime";
5
+ import { Popover as t } from "@base-ui/react/popover";
6
+ var n = t.Root, s = t.Trigger, p = t.Portal, l = t.Close;
7
+ function c({ className: r, sideOffset: o = 8, ...i }) {
8
+ return /* @__PURE__ */ a(t.Positioner, {
9
+ sideOffset: o,
10
+ className: e("z-50", r),
11
+ ...i
12
+ });
13
+ }
14
+ function m({ className: r, ...o }) {
15
+ return /* @__PURE__ */ a(t.Popup, {
16
+ className: e("bg-pho-primary text-pho-primary shadow-pho-lg ring-pho-secondary rounded-base ease-pho-spring max-w-[calc(100vw-2rem)] origin-[var(--transform-origin)] p-4 ring-1 transition-[transform,opacity] duration-[330ms] outline-none ring-inset data-[ending-style]:duration-150 data-[ending-style]:ease-out", "data-[starting-style]:scale-95 data-[starting-style]:opacity-0", "data-[ending-style]:scale-95 data-[ending-style]:opacity-0", r),
17
+ ...o
18
+ });
19
+ }
20
+ function d({ className: r, ...o }) {
21
+ return /* @__PURE__ */ a(t.Title, {
22
+ className: e("text-pho-primary text-base font-medium", r),
23
+ ...o
24
+ });
25
+ }
26
+ function g({ className: r, ...o }) {
27
+ return /* @__PURE__ */ a(t.Description, {
28
+ className: e("text-pho-description text-base", r),
29
+ ...o
30
+ });
31
+ }
32
+ var h = {
33
+ Root: n,
34
+ Trigger: s,
35
+ Portal: p,
36
+ Positioner: c,
37
+ Popup: m,
38
+ Title: d,
39
+ Description: g,
40
+ Close: l
41
+ };
42
+ export {
43
+ h as t
44
+ };
45
+
46
+ //# sourceMappingURL=popover-EL1SE1kj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popover-EL1SE1kj.js","names":[],"sources":["../../src/components/popover/popover.tsx"],"sourcesContent":["import { type ComponentProps, type ElementType } from \"react\";\nimport { Popover as BasePopover } from \"@base-ui/react/popover\";\nimport { cn } from \"../../utils/cn\";\n\n/** Override Base UI's `string | (state) => string` className with plain string. */\ntype StyledProps<T extends ElementType> = Omit<\n ComponentProps<T>,\n \"className\"\n> & {\n className?: string;\n};\n\nconst Root = BasePopover.Root;\nconst Trigger = BasePopover.Trigger;\nconst Portal = BasePopover.Portal;\nconst Close = BasePopover.Close;\n\nfunction Positioner({\n className,\n sideOffset = 8,\n ...props\n}: StyledProps<typeof BasePopover.Positioner>) {\n return (\n <BasePopover.Positioner\n sideOffset={sideOffset}\n className={cn(\"z-50\", className)}\n {...props}\n />\n );\n}\n\nfunction Popup({ className, ...props }: StyledProps<typeof BasePopover.Popup>) {\n return (\n <BasePopover.Popup\n className={cn(\n // Floating layer: keeps shadow elevation; ring-pho-secondary is the\n // site card-hairline edge (#eee / #202020).\n \"bg-pho-primary text-pho-primary shadow-pho-lg ring-pho-secondary rounded-base ease-pho-spring max-w-[calc(100vw-2rem)] origin-[var(--transform-origin)] p-4 ring-1 transition-[transform,opacity] duration-[330ms] outline-none ring-inset data-[ending-style]:duration-150 data-[ending-style]:ease-out\",\n \"data-[starting-style]:scale-95 data-[starting-style]:opacity-0\",\n \"data-[ending-style]:scale-95 data-[ending-style]:opacity-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Title({ className, ...props }: StyledProps<typeof BasePopover.Title>) {\n return (\n <BasePopover.Title\n className={cn(\"text-pho-primary text-base font-medium\", className)}\n {...props}\n />\n );\n}\n\nfunction Description({\n className,\n ...props\n}: StyledProps<typeof BasePopover.Description>) {\n return (\n <BasePopover.Description\n className={cn(\"text-pho-description text-base\", className)}\n {...props}\n />\n );\n}\n\n/**\n * Popover built on Base UI `Popover` — a click-triggered floating panel\n * anchored to its trigger, for rich, interactive content (forms, menus of\n * actions, details). Unlike a `Tooltip`, it can hold focusable controls and is\n * dismissed by clicking away or pressing Escape.\n */\nexport const Popover = {\n Root,\n Trigger,\n Portal,\n Positioner,\n Popup,\n Title,\n Description,\n Close,\n};\n"],"mappings":";;;;;AAYA,IAAM,IAAO,EAAY,MACnB,IAAU,EAAY,SACtB,IAAS,EAAY,QACrB,IAAQ,EAAY;AAE1B,SAAS,EAAW,EAClB,WAAA,GACA,YAAA,IAAa,GACb,GAAG,EAAA,GAC0C;AAC7C,SACE,gBAAA,EAAC,EAAY,YAAb;AAAA,IACc,YAAA;AAAA,IACZ,WAAW,EAAG,QAAQ,CAAS;AAAA,IAC/B,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAM,EAAE,WAAA,GAAW,GAAG,EAAA,GAAgD;AAC7E,SACE,gBAAA,EAAC,EAAY,OAAb;AAAA,IACE,WAAW,EAGT,4SACA,kEACA,8DACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAM,EAAE,WAAA,GAAW,GAAG,EAAA,GAAgD;AAC7E,SACE,gBAAA,EAAC,EAAY,OAAb;AAAA,IACE,WAAW,EAAG,0CAA0C,CAAS;AAAA,IACjE,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAY,EACnB,WAAA,GACA,GAAG,EAAA,GAC2C;AAC9C,SACE,gBAAA,EAAC,EAAY,aAAb;AAAA,IACE,WAAW,EAAG,kCAAkC,CAAS;AAAA,IACzD,GAAI;AAAA,EACL,CAAA;AAEL;AAQA,IAAa,IAAU;AAAA,EACrB,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AACF"}
@@ -1,18 +1,14 @@
1
1
  "use client";
2
2
  import { t as a } from "./cn-DTiB6ek_.js";
3
- import { n as b, r as y } from "./link-provider-9TFNyDqO.js";
4
- import { d as N } from "./close-button-B8gF5UNk.js";
5
- import { t as h } from "./createReactComponent-BqCmnqfX.js";
3
+ import { n as I, r as N } from "./link-provider-9TFNyDqO.js";
4
+ import { u as E } from "./button-X5wsWvRa.js";
5
+ import { t as R } from "./createReactComponent-BqCmnqfX.js";
6
+ import { t as _ } from "./IconArrowUpRight-DGgKzQwV.js";
6
7
  import { n as l } from "./avatar-CiAvJNNs.js";
7
- import { createContext as I, isValidElement as R, useContext as E } from "react";
8
- import { Fragment as _, jsx as t, jsxs as n } from "react/jsx-runtime";
9
- var A = [["path", {
10
- d: "M17 7l-10 10",
11
- key: "svg-0"
12
- }], ["path", {
13
- d: "M8 7l9 0l0 9",
14
- key: "svg-1"
15
- }]], k = h("outline", "arrow-up-right", "ArrowUpRight", A), w = [
8
+ import { createContext as A, isValidElement as S, useContext as T, useMemo as k } from "react";
9
+ import { Fragment as w, jsx as t, jsxs as n } from "react/jsx-runtime";
10
+ import { motion as c } from "motion/react";
11
+ var C = [
16
12
  ["path", {
17
13
  d: "M4 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",
18
14
  key: "svg-0"
@@ -25,54 +21,63 @@ var A = [["path", {
25
21
  d: "M18 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",
26
22
  key: "svg-2"
27
23
  }]
28
- ], C = h("outline", "dots", "Dots", w), f = "border-pho-secondary bg-pho-page sticky top-0 flex h-dvh w-64 shrink-0 flex-col border-r", v = {
24
+ ], D = R("outline", "dots", "Dots", C), u = {
25
+ initial: !1,
26
+ whileTap: { scale: 0.97 },
27
+ transition: {
28
+ type: "spring",
29
+ stiffness: 200,
30
+ damping: 30,
31
+ mass: 0.1
32
+ }
33
+ }, x = "border-pho-secondary bg-pho-page sticky top-0 flex h-dvh w-64 shrink-0 flex-col border-r", g = {
29
34
  base: "px-4 pt-5 pb-4",
30
35
  sm: "px-3 pt-4 pb-3"
31
- }, Y = a(f, v.base), S = {
36
+ }, ae = a(x, g.base), B = {
32
37
  base: "mb-6 px-2",
33
38
  sm: "mb-3 px-0"
34
- }, T = "outline-pho-brand flex min-h-9 w-full cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-left text-base transition-colors focus-visible:outline-2 focus-visible:-outline-offset-1", D = "bg-pho-primary text-pho-primary ring-pho-secondary font-medium ring-1 ring-inset *:data-icon:text-pho-primary", B = a("text-pho-secondary *:data-icon:text-pho-secondary", "hover:bg-pho-primary hover:text-pho-primary hover:*:data-icon:text-pho-primary"), x = I("base");
35
- function M({ className: r, inset: e = "base", ...o }) {
36
- return /* @__PURE__ */ t(x.Provider, {
39
+ }, O = "outline-pho-brand flex min-h-9 w-full cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-left text-base transition-colors focus-visible:outline-2 focus-visible:-outline-offset-1", M = "bg-pho-primary text-pho-primary ring-pho-secondary font-medium ring-1 ring-inset *:data-icon:text-pho-primary", L = a("text-pho-secondary *:data-icon:text-pho-secondary", "hover:bg-pho-primary hover:text-pho-primary hover:*:data-icon:text-pho-primary"), b = A("base");
40
+ function z({ className: r, inset: e = "base", ...o }) {
41
+ return /* @__PURE__ */ t(b.Provider, {
37
42
  value: e,
38
43
  children: /* @__PURE__ */ t("aside", {
39
- className: a(f, v[e], r),
44
+ className: a(x, g[e], r),
40
45
  ...o,
41
46
  "data-inset": e
42
47
  })
43
48
  });
44
49
  }
45
- function O({ className: r, ...e }) {
50
+ function F({ className: r, ...e }) {
46
51
  return /* @__PURE__ */ t("div", {
47
- className: a("flex items-center gap-2.5", S[E(x)], r),
52
+ className: a("flex items-center gap-2.5", B[T(b)], r),
48
53
  ...e
49
54
  });
50
55
  }
51
- function z({ className: r, ...e }) {
56
+ function V({ className: r, ...e }) {
52
57
  return /* @__PURE__ */ t("nav", {
53
58
  className: a("flex flex-1 flex-col gap-6 overflow-y-auto", r),
54
59
  ...e
55
60
  });
56
61
  }
57
- function F({ className: r, ...e }) {
62
+ function U({ className: r, ...e }) {
58
63
  return /* @__PURE__ */ t("div", {
59
64
  className: r,
60
65
  ...e
61
66
  });
62
67
  }
63
- function L({ className: r, ...e }) {
68
+ function j({ className: r, ...e }) {
64
69
  return /* @__PURE__ */ t("div", {
65
70
  className: a("text-pho-description mb-2 px-2 text-xs font-normal", r),
66
71
  ...e
67
72
  });
68
73
  }
69
- function U({ className: r, columns: e, ...o }) {
74
+ function G({ className: r, columns: e, ...o }) {
70
75
  return /* @__PURE__ */ t("ul", {
71
76
  className: a("m-0 list-none p-0 *:m-0", e ? "grid grid-cols-2 gap-x-2 gap-y-0.5" : "flex flex-col gap-0.5", r),
72
77
  ...o
73
78
  });
74
79
  }
75
- function V({ className: r, ...e }) {
80
+ function H({ className: r, ...e }) {
76
81
  return /* @__PURE__ */ t("div", {
77
82
  className: a("mt-4 flex flex-col gap-0.5", r),
78
83
  ...e
@@ -81,59 +86,62 @@ function V({ className: r, ...e }) {
81
86
  function p(r) {
82
87
  if (r == null || r === !1) return null;
83
88
  let e = null;
84
- return y(r) ? e = /* @__PURE__ */ t(r, {}) : R(r) && (e = r), e == null ? null : /* @__PURE__ */ t("span", {
89
+ return N(r) ? e = /* @__PURE__ */ t(r, {}) : S(r) && (e = r), e == null ? null : /* @__PURE__ */ t("span", {
85
90
  "data-icon": !0,
86
91
  className: "pointer-events-none inline-flex shrink-0 items-center [&>svg]:size-4 [&>svg]:shrink-0",
87
92
  children: e
88
93
  });
89
94
  }
90
- function j({ icon: r, active: e, className: o, children: i, href: s, external: c, ...u }) {
91
- const g = b(), d = a(T, e ? D : B, o), m = /* @__PURE__ */ t("span", {
95
+ function P({ icon: r, active: e, className: o, children: i, href: s, external: m, ...d }) {
96
+ const f = I(), y = k(() => c.create(f), [f]), h = a(O, e ? M : L, o), v = /* @__PURE__ */ t("span", {
92
97
  className: "min-w-0 flex-1 truncate",
93
98
  children: i
94
99
  });
95
- return s !== void 0 ? /* @__PURE__ */ t("li", { children: /* @__PURE__ */ n(g, {
100
+ return s !== void 0 ? /* @__PURE__ */ t("li", { children: /* @__PURE__ */ n(y, {
96
101
  href: s,
97
102
  "aria-current": e ? "page" : void 0,
98
- ...c && {
103
+ ...m && {
99
104
  target: "_blank",
100
105
  rel: "noopener noreferrer"
101
106
  },
107
+ ...d,
108
+ className: h,
102
109
  ...u,
103
- className: d,
104
110
  children: [
105
111
  p(r),
106
- m,
107
- c && /* @__PURE__ */ n(_, { children: [p(/* @__PURE__ */ t(k, { "aria-hidden": !0 })), /* @__PURE__ */ t("span", {
112
+ v,
113
+ m && /* @__PURE__ */ n(w, { children: [p(/* @__PURE__ */ t(_, { "aria-hidden": !0 })), /* @__PURE__ */ t("span", {
108
114
  className: "sr-only",
109
115
  children: "(opens in a new tab)"
110
116
  })] })
111
117
  ]
112
- }) }) : /* @__PURE__ */ t("li", { children: /* @__PURE__ */ n("button", {
118
+ }) }) : /* @__PURE__ */ t("li", { children: /* @__PURE__ */ n(c.button, {
113
119
  type: "button",
114
120
  "aria-current": e ? "page" : void 0,
121
+ ...d,
122
+ className: h,
115
123
  ...u,
116
- className: d,
117
- children: [p(r), m]
124
+ children: [p(r), v]
118
125
  }) });
119
126
  }
120
- var G = "group outline-pho-brand flex w-full cursor-pointer items-center gap-2 rounded-base p-2 text-left focus-visible:outline-2 focus-visible:outline-offset-2";
121
- function H(r) {
127
+ var W = "group outline-pho-brand flex w-full cursor-pointer items-center gap-2 rounded-base p-2 text-left focus-visible:outline-2 focus-visible:outline-offset-2";
128
+ function q(r) {
122
129
  const e = r.split(/\s+/).filter(Boolean);
123
130
  return ((e[0]?.[0] ?? r[0] ?? "?") + (e.length >= 2 ? e[e.length - 1]?.[0] ?? "" : "")).toUpperCase();
124
131
  }
125
- function P({ name: r, avatarSrc: e, initials: o, className: i, ...s }) {
126
- return /* @__PURE__ */ n("button", {
132
+ function J({ name: r, avatarSrc: e, initials: o, className: i, ...s }) {
133
+ return /* @__PURE__ */ n(c.button, {
127
134
  type: "button",
128
- className: a(G, i),
135
+ className: a(W, i),
129
136
  ...s,
137
+ ...u,
130
138
  children: [
131
139
  /* @__PURE__ */ n(l.Root, {
132
140
  size: "xs",
133
141
  children: [e && /* @__PURE__ */ t(l.Image, {
134
142
  src: e,
135
143
  alt: ""
136
- }), /* @__PURE__ */ t(l.Fallback, { children: o ?? H(r) })]
144
+ }), /* @__PURE__ */ t(l.Fallback, { children: o ?? q(r) })]
137
145
  }),
138
146
  /* @__PURE__ */ t("span", {
139
147
  className: "text-pho-primary min-w-0 flex-1 truncate text-base",
@@ -141,37 +149,37 @@ function P({ name: r, avatarSrc: e, initials: o, className: i, ...s }) {
141
149
  }),
142
150
  /* @__PURE__ */ t("span", {
143
151
  "aria-hidden": !0,
144
- className: N({
152
+ className: E({
145
153
  variant: "outlined",
146
154
  size: "sm",
147
155
  shape: "circle",
148
- className: "group-hover:bg-pho-primary-hover group-hover:text-pho-secondary-hover group-data-[popup-open]:bg-pho-primary-hover group-data-[popup-open]:text-pho-secondary-hover p-1 group-data-[pressed]:scale-[0.97]"
156
+ className: "group-hover:bg-pho-primary-hover group-hover:text-pho-secondary-hover group-data-[popup-open]:bg-pho-primary-hover group-data-[popup-open]:text-pho-secondary-hover p-1"
149
157
  }),
150
- children: /* @__PURE__ */ t(C, { className: "size-4" })
158
+ children: /* @__PURE__ */ t(D, { className: "size-4" })
151
159
  })
152
160
  ]
153
161
  });
154
162
  }
155
- var Z = {
156
- Root: M,
157
- Header: O,
158
- Nav: z,
159
- Group: F,
160
- GroupLabel: L,
161
- List: U,
162
- Item: j,
163
- Footer: V,
164
- AccountRow: P
163
+ var oe = {
164
+ Root: z,
165
+ Header: F,
166
+ Nav: V,
167
+ Group: U,
168
+ GroupLabel: j,
169
+ List: G,
170
+ Item: P,
171
+ Footer: H,
172
+ AccountRow: J
165
173
  };
166
174
  export {
167
- f as a,
168
- Z as c,
169
- B as i,
170
- T as n,
171
- Y as o,
172
- D as r,
173
- v as s,
174
- S as t
175
+ x as a,
176
+ oe as c,
177
+ L as i,
178
+ O as n,
179
+ ae as o,
180
+ M as r,
181
+ g as s,
182
+ B as t
175
183
  };
176
184
 
177
- //# sourceMappingURL=sidebar-DGpEKxOn.js.map
185
+ //# sourceMappingURL=sidebar-DDJC1MeD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar-DDJC1MeD.js","names":[],"sources":["../../../../node_modules/.pnpm/@tabler+icons-react@3.44.0_react@19.2.7/node_modules/@tabler/icons-react/dist/esm/icons/IconDots.mjs","../../src/sections/sidebar/sidebar.tsx"],"sourcesContent":["/**\n * @license @tabler/icons-react v3.44.0 - MIT\n *\n * This source code is licensed under the MIT license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createReactComponent from '../createReactComponent.mjs';\n\nconst __iconNode = [[\"path\", { \"d\": \"M4 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M18 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\", \"key\": \"svg-2\" }]];\nconst IconDots = createReactComponent(\"outline\", \"dots\", \"Dots\", __iconNode);\n\nexport { __iconNode, IconDots as default };\n//# sourceMappingURL=IconDots.mjs.map\n","import {\n createContext,\n isValidElement,\n useContext,\n useMemo,\n type AnchorHTMLAttributes,\n type ButtonHTMLAttributes,\n type ComponentProps,\n type ComponentType,\n type FC,\n type ReactNode,\n type Ref,\n} from \"react\";\nimport { IconArrowUpRight, IconDots } from \"@tabler/icons-react\";\nimport { motion } from \"motion/react\";\nimport { cn } from \"../../utils/cn\";\nimport { isReactComponent } from \"../../utils/is-react-component\";\nimport { useLinkComponent } from \"../../utils/link-provider\";\nimport { Avatar } from \"../../components/avatar\";\nimport { buttonVariants } from \"../../components/button\";\n\n/** Same press compression as `Button` — transform-only, every interactive row. */\nconst SIDEBAR_PRESS_SCALE = 0.97;\n/** Framer source transition shared with `Button`: `spring-physics 200 30 0.1`. */\nconst SIDEBAR_PRESS_SPRING = {\n type: \"spring\",\n stiffness: 200,\n damping: 30,\n mass: 0.1,\n} as const;\nconst SIDEBAR_PRESS_MOTION = {\n initial: false as const,\n whileTap: { scale: SIDEBAR_PRESS_SCALE },\n transition: SIDEBAR_PRESS_SPRING,\n};\n\n/**\n * Sidebar — Pho's first SECTION: a composed app rail, not a micro component.\n * It encodes the navigation rail used across Photon surfaces (the Pho docs\n * site, the dashboard): a sticky full-height column with a brand header, a\n * scrollable stack of titled nav groups, and a pinned footer that usually\n * carries the account row.\n *\n * Sections stay presentational — no router, no data fetching, no theme\n * plumbing. Links render through the host's `LinkProvider` (same contract as\n * `ButtonLink`), state arrives via props (`active`), and interactive footers\n * compose with other Pho parts (e.g. wrap `Sidebar.AccountRow` in a\n * `Menu.Trigger render={...}` to open an account menu).\n *\n * `Root` takes `inset` (`base` | `sm`, default `base`) for the rail's outer\n * padding and header spacing — prefer that over host-app class overrides.\n */\n\n/* ------------------------------- class map ------------------------------- */\n\n/** The rail itself — sticky, full-height, hairline right edge (no inset). */\nexport const SIDEBAR_ROOT =\n \"border-pho-secondary bg-pho-page sticky top-0 flex h-dvh w-64 shrink-0 flex-col border-r\";\n\n/** Outer inset on `Root` — `base` is the docs/default rail; `sm` is tighter. */\nexport const SIDEBAR_ROOT_INSET = {\n base: \"px-4 pt-5 pb-4\",\n sm: \"px-3 pt-4 pb-3\",\n} as const;\n\n/** `SIDEBAR_ROOT` with the default `base` inset — one string for docs chrome. */\nexport const SIDEBAR_ROOT_BASE = cn(SIDEBAR_ROOT, SIDEBAR_ROOT_INSET.base);\n\n/** Header spacing paired with `Root`'s `inset`. */\nexport const SIDEBAR_HEADER_INSET = {\n base: \"mb-6 px-2\",\n sm: \"mb-3 px-0\",\n} as const;\n\nexport type SidebarInset = keyof typeof SIDEBAR_ROOT_INSET;\n\n/** A nav row at rest and on hover. Active/inactive inks split below. */\nexport const SIDEBAR_ITEM =\n \"outline-pho-brand flex min-h-9 w-full cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-left text-base transition-colors focus-visible:outline-2 focus-visible:-outline-offset-1\";\n\n/**\n * Selected row — lifted onto the primary surface with the site hairline.\n * The icon carries the same ink as the label so the pair reads as one unit.\n */\nexport const SIDEBAR_ITEM_ACTIVE =\n \"bg-pho-primary text-pho-primary ring-pho-secondary font-medium ring-1 ring-inset *:data-icon:text-pho-primary\";\n\n/**\n * Resting row — secondary ink (75%). Hover lifts onto the primary surface\n * (same plane as the active chip, without the ring) so the wash stays quiet\n * on `pho-page`. Icon tracks the label's ink at every state.\n */\nexport const SIDEBAR_ITEM_INACTIVE = cn(\n \"text-pho-secondary *:data-icon:text-pho-secondary\",\n \"hover:bg-pho-primary hover:text-pho-primary hover:*:data-icon:text-pho-primary\",\n);\n\nconst SidebarInsetContext = createContext<SidebarInset>(\"base\");\n\n/* --------------------------------- frame --------------------------------- */\n\ninterface RootProps extends ComponentProps<\"aside\"> {\n /** Outer padding + header spacing. Defaults to `base`. */\n inset?: SidebarInset;\n ref?: Ref<HTMLElement>;\n}\n\n/** The rail — a sticky, full-height `<aside>` with the hairline right edge. */\nfunction Root({ className, inset = \"base\", ...props }: RootProps) {\n return (\n <SidebarInsetContext.Provider value={inset}>\n <aside\n className={cn(SIDEBAR_ROOT, SIDEBAR_ROOT_INSET[inset], className)}\n {...props}\n data-inset={inset}\n />\n </SidebarInsetContext.Provider>\n );\n}\n\n/** Brand slot at the top of the rail — logo, wordmark, workspace switcher. */\nfunction Header({ className, ...props }: ComponentProps<\"div\">) {\n const inset = useContext(SidebarInsetContext);\n return (\n <div\n className={cn(\n \"flex items-center gap-2.5\",\n SIDEBAR_HEADER_INSET[inset],\n className,\n )}\n {...props}\n />\n );\n}\n\n/** The scrollable middle — a stack of `Sidebar.Group`s. */\nfunction Nav({ className, ...props }: ComponentProps<\"nav\">) {\n return (\n <nav\n className={cn(\"flex flex-1 flex-col gap-6 overflow-y-auto\", className)}\n {...props}\n />\n );\n}\n\n/** One titled cluster of nav rows: a `GroupLabel` followed by a `List`. */\nfunction Group({ className, ...props }: ComponentProps<\"div\">) {\n return <div className={className} {...props} />;\n}\n\n/** The cluster's caption — description ink, regular weight. */\nfunction GroupLabel({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\n \"text-pho-description mb-2 px-2 text-xs font-normal\",\n className,\n )}\n {...props}\n />\n );\n}\n\ninterface ListProps extends ComponentProps<\"ul\"> {\n /** Lay the rows out in two columns — for long, flat registries. */\n columns?: boolean;\n}\n\n/** The rows of a group. `columns` switches to a two-column grid. */\nfunction List({ className, columns, ...props }: ListProps) {\n return (\n <ul\n className={cn(\n // list-none/m-0/p-0 shield the rail from host prose styles.\n \"m-0 list-none p-0 *:m-0\",\n columns\n ? \"grid grid-cols-2 gap-x-2 gap-y-0.5\"\n : \"flex flex-col gap-0.5\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Pinned bottom cluster — docs link, account row, theme toggle. */\nfunction Footer({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div className={cn(\"mt-4 flex flex-col gap-0.5\", className)} {...props} />\n );\n}\n\n/* --------------------------------- item ---------------------------------- */\n\n/** An icon slot — a component (`IconBook`) or element (`<IconBook />`). */\ntype Slottable = ReactNode | FC<{ className?: string }>;\n\nfunction renderIcon(icon: Slottable): ReactNode {\n if (icon == null || icon === false) return null;\n let content: ReactNode = null;\n if (isReactComponent(icon)) {\n const Icon = icon;\n content = <Icon />;\n } else if (isValidElement(icon)) {\n content = icon;\n }\n if (content == null) return null;\n return (\n <span\n data-icon\n className=\"pointer-events-none inline-flex shrink-0 items-center [&>svg]:size-4 [&>svg]:shrink-0\"\n >\n {content}\n </span>\n );\n}\n\ninterface ItemBaseProps {\n /** Slot before the label — a component (`IconBook`) or element. */\n icon?: Slottable;\n /** Marks the row as the current destination (adds `aria-current=\"page\"`). */\n active?: boolean;\n children?: ReactNode;\n className?: string;\n}\n\n/**\n * DOM handlers whose React signatures clash with Motion's gesture props.\n * Same omit list as `Button` — rows render through `motion.*`.\n */\ntype MotionHandlerConflicts =\n | \"onAnimationStart\"\n | \"onAnimationEnd\"\n | \"onAnimationIteration\"\n | \"onDrag\"\n | \"onDragStart\"\n | \"onDragEnd\"\n | \"onDragEnter\"\n | \"onDragExit\"\n | \"onDragLeave\"\n | \"onDragOver\"\n | \"onDrop\";\n\nexport interface SidebarItemLinkProps\n extends\n ItemBaseProps,\n Omit<\n AnchorHTMLAttributes<HTMLAnchorElement>,\n keyof ItemBaseProps | MotionHandlerConflicts\n > {\n /** Destination — rendered through the host's `LinkProvider`. */\n href: string;\n /** Leaves the app: opens in a new tab and renders a ↗ cue. */\n external?: boolean;\n}\n\nexport interface SidebarItemButtonProps\n extends\n ItemBaseProps,\n Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n keyof ItemBaseProps | MotionHandlerConflicts\n > {\n href?: undefined;\n external?: undefined;\n}\n\nexport type SidebarItemProps = SidebarItemLinkProps | SidebarItemButtonProps;\n\n/**\n * A nav row — a link when `href` is given (rendered through the host's\n * `LinkProvider`), otherwise a button. `active` lifts the row onto the\n * primary surface; `external` opens a new tab and appends a ↗ cue.\n */\nfunction Item({\n icon,\n active,\n className,\n children,\n href,\n external,\n ...rest\n}: SidebarItemProps) {\n const Link = useLinkComponent();\n // Same bridge as `ButtonLink` — host `LinkProvider` + Motion press scale.\n const MotionLink = useMemo(\n () =>\n motion.create(Link as unknown as ComponentType<Record<string, unknown>>),\n [Link],\n );\n const rowClass = cn(\n SIDEBAR_ITEM,\n active ? SIDEBAR_ITEM_ACTIVE : SIDEBAR_ITEM_INACTIVE,\n className,\n );\n const label = <span className=\"min-w-0 flex-1 truncate\">{children}</span>;\n\n if (href !== undefined) {\n return (\n <li>\n <MotionLink\n href={href}\n aria-current={active ? \"page\" : undefined}\n {...(external && { target: \"_blank\", rel: \"noopener noreferrer\" })}\n {...(rest as AnchorHTMLAttributes<HTMLAnchorElement>)}\n className={rowClass}\n {...SIDEBAR_PRESS_MOTION}\n >\n {renderIcon(icon)}\n {label}\n {external && (\n <>\n {renderIcon(<IconArrowUpRight aria-hidden />)}\n <span className=\"sr-only\">(opens in a new tab)</span>\n </>\n )}\n </MotionLink>\n </li>\n );\n }\n\n return (\n <li>\n <motion.button\n type=\"button\"\n aria-current={active ? \"page\" : undefined}\n {...(rest as Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n MotionHandlerConflicts\n >)}\n className={rowClass}\n {...SIDEBAR_PRESS_MOTION}\n >\n {renderIcon(icon)}\n {label}\n </motion.button>\n </li>\n );\n}\n\n/* ------------------------------ account row ------------------------------ */\n\n/**\n * Whole-row account trigger. The row itself stays visually quiet — it only\n * carries the `group` state (hover/press/popup-open) and the focus ring;\n * all visual feedback renders on the ⋯ circle via `group-*` classes.\n */\nconst ACCOUNT_ROW =\n \"group outline-pho-brand flex w-full cursor-pointer items-center gap-2 rounded-base p-2 text-left focus-visible:outline-2 focus-visible:outline-offset-2\";\n\n/** Avatar initials: first + last word initial, else the first character. */\nfunction initialsFrom(name: string): string {\n const words = name.split(/\\s+/).filter(Boolean);\n const first = words[0]?.[0] ?? name[0] ?? \"?\";\n const last = words.length >= 2 ? (words[words.length - 1]?.[0] ?? \"\") : \"\";\n return (first + last).toUpperCase();\n}\n\nexport interface SidebarAccountRowProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\" | MotionHandlerConflicts\n> {\n /** Display name — also the source for fallback initials. */\n name: string;\n /** Avatar image URL; falls back to initials while loading or on error. */\n avatarSrc?: string;\n /** Override the derived initials. */\n initials?: string;\n ref?: Ref<HTMLButtonElement>;\n}\n\n/**\n * The account chip pinned to the rail's footer — an xs avatar, the name, and\n * a decorative ⋯ circle. The WHOLE row is one button, but the row is only the\n * control — the circle is the indicator: hover, press, and menu-open feedback\n * all render on the ⋯ (a span wearing the stock secondary-circle button\n * classes), driven by the row's `group` state, so it reads as a button\n * without nesting one.\n *\n * It renders a plain `<button>` and forwards every prop, so it slots straight\n * into a menu: `<Menu.Trigger render={<Sidebar.AccountRow name=\"…\" />} />` —\n * Base UI's `data-popup-open` / `data-pressed` states light up the circle.\n */\nfunction AccountRow({\n name,\n avatarSrc,\n initials,\n className,\n ...props\n}: SidebarAccountRowProps) {\n return (\n <motion.button\n type=\"button\"\n className={cn(ACCOUNT_ROW, className)}\n {...props}\n {...SIDEBAR_PRESS_MOTION}\n >\n <Avatar.Root size=\"xs\">\n {avatarSrc && <Avatar.Image src={avatarSrc} alt=\"\" />}\n <Avatar.Fallback>{initials ?? initialsFrom(name)}</Avatar.Fallback>\n </Avatar.Root>\n <span className=\"text-pho-primary min-w-0 flex-1 truncate text-base\">\n {name}\n </span>\n <span\n aria-hidden\n className={buttonVariants({\n variant: \"outlined\",\n size: \"sm\",\n shape: \"circle\",\n // Hover / open washes stay on the ⋯; press scale lives on the row\n // (same as Button / Sidebar.Item) so the circle does not double-scale.\n className:\n \"group-hover:bg-pho-primary-hover group-hover:text-pho-secondary-hover group-data-[popup-open]:bg-pho-primary-hover group-data-[popup-open]:text-pho-secondary-hover p-1\",\n })}\n >\n <IconDots className=\"size-4\" />\n </span>\n </motion.button>\n );\n}\n\n/* -------------------------------- assembly ------------------------------- */\n\n/**\n * The composed sidebar rail. Assemble the frame parts and fill them with\n * rows; wire interactivity by composing other Pho parts around them:\n *\n * ```tsx\n * <Sidebar.Root>\n * <Sidebar.Header>…brand…</Sidebar.Header>\n * <Sidebar.Nav>\n * <Sidebar.Group>\n * <Sidebar.GroupLabel>Pages</Sidebar.GroupLabel>\n * <Sidebar.List>\n * <Sidebar.Item href=\"/\" icon={IconHome} active>\n * Overview\n * </Sidebar.Item>\n * </Sidebar.List>\n * </Sidebar.Group>\n * </Sidebar.Nav>\n * <Sidebar.Footer>\n * <Menu.Root>\n * <Menu.Trigger render={<Sidebar.AccountRow name=\"Ada Lovelace\" />} />\n * …\n * </Menu.Root>\n * </Sidebar.Footer>\n * </Sidebar.Root>\n * ```\n */\nexport const Sidebar = {\n Root,\n Header,\n Nav,\n Group,\n GroupLabel,\n List,\n Item,\n Footer,\n AccountRow,\n};\n"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -1,16 +1,17 @@
1
1
  "use client";
2
- import { a, c as s, d as n, f as o, i as T, l as B, n as u, o as e, r as f, s as S, t as i, u as E } from "../chunks/close-button-B8gF5UNk.js";
2
+ import { a, c as s, d as o, i as n, l as T, n as B, o as u, r as e, s as f, t as i, u as r } from "../chunks/button-X5wsWvRa.js";
3
+ import { t as E } from "../chunks/close-button-xadxp0j8.js";
3
4
  export {
4
- u as BUTTON_COLORS,
5
- f as BUTTON_SHAPES,
6
- T as BUTTON_SIZES,
7
- a as BUTTON_VARIANTS,
8
- e as Button,
9
- S as ButtonLink,
10
- i as CloseButton,
11
- s as EFFECT_BUTTON_SIZES,
12
- B as EffectButton,
13
- E as EffectButtonLink,
14
- n as buttonVariants,
5
+ i as BUTTON_COLORS,
6
+ B as BUTTON_SHAPES,
7
+ e as BUTTON_SIZES,
8
+ n as BUTTON_VARIANTS,
9
+ a as Button,
10
+ u as ButtonLink,
11
+ E as CloseButton,
12
+ f as EFFECT_BUTTON_SIZES,
13
+ s as EffectButton,
14
+ T as EffectButtonLink,
15
+ r as buttonVariants,
15
16
  o as effectButtonVariants
16
17
  };