@photon-ai/pho-ui 0.1.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.
- package/README.md +49 -0
- package/dist/chunks/button-9pp4g7en.js +334 -0
- package/dist/chunks/button-9pp4g7en.js.map +1 -0
- package/dist/chunks/close-button-CbQNfpxU.js +30 -0
- package/dist/chunks/close-button-CbQNfpxU.js.map +1 -0
- package/dist/chunks/cn-D6jQqeRj.js +1762 -0
- package/dist/chunks/cn-D6jQqeRj.js.map +1 -0
- package/dist/chunks/dialog-BSBF1Wyq.js +63 -0
- package/dist/chunks/dialog-BSBF1Wyq.js.map +1 -0
- package/dist/chunks/input-aZqjjV_m.js +75 -0
- package/dist/chunks/input-aZqjjV_m.js.map +1 -0
- package/dist/chunks/link-provider-9TFNyDqO.js +28 -0
- package/dist/chunks/link-provider-9TFNyDqO.js.map +1 -0
- package/dist/chunks/menu-BkzDbNuX.js +101 -0
- package/dist/chunks/menu-BkzDbNuX.js.map +1 -0
- package/dist/chunks/resolve-variant-CcD8iG5l.js +9 -0
- package/dist/chunks/resolve-variant-CcD8iG5l.js.map +1 -0
- package/dist/chunks/rolldown-runtime-wKSmTnsc.js +22 -0
- package/dist/components/accordion.js +42 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/alert-dialog.js +59 -0
- package/dist/components/alert-dialog.js.map +1 -0
- package/dist/components/autocomplete.js +82 -0
- package/dist/components/autocomplete.js.map +1 -0
- package/dist/components/avatar.js +49 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.js +59 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/button.js +17 -0
- package/dist/components/checkbox.js +51 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/collapsible.js +28 -0
- package/dist/components/collapsible.js.map +1 -0
- package/dist/components/combobox.js +117 -0
- package/dist/components/combobox.js.map +1 -0
- package/dist/components/context-menu.js +63 -0
- package/dist/components/context-menu.js.map +1 -0
- package/dist/components/dialog.js +5 -0
- package/dist/components/drawer.js +59 -0
- package/dist/components/drawer.js.map +1 -0
- package/dist/components/field.js +49 -0
- package/dist/components/field.js.map +1 -0
- package/dist/components/fieldset.js +26 -0
- package/dist/components/fieldset.js.map +1 -0
- package/dist/components/form.js +17 -0
- package/dist/components/form.js.map +1 -0
- package/dist/components/input.js +5 -0
- package/dist/components/kbd.js +18 -0
- package/dist/components/kbd.js.map +1 -0
- package/dist/components/menu.js +7 -0
- package/dist/components/menubar.js +17 -0
- package/dist/components/menubar.js.map +1 -0
- package/dist/components/meter.js +47 -0
- package/dist/components/meter.js.map +1 -0
- package/dist/components/navigation-menu.js +74 -0
- package/dist/components/navigation-menu.js.map +1 -0
- package/dist/components/notification.js +91 -0
- package/dist/components/notification.js.map +1 -0
- package/dist/components/number-field.js +56 -0
- package/dist/components/number-field.js.map +1 -0
- package/dist/components/otp-field.js +19 -0
- package/dist/components/otp-field.js.map +1 -0
- package/dist/components/popover.js +46 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/preview-card.js +31 -0
- package/dist/components/preview-card.js.map +1 -0
- package/dist/components/progress.js +47 -0
- package/dist/components/progress.js.map +1 -0
- package/dist/components/radio-group.js +34 -0
- package/dist/components/radio-group.js.map +1 -0
- package/dist/components/scroll-area.js +43 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/select.js +69 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.js +17 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/slider.js +61 -0
- package/dist/components/slider.js.map +1 -0
- package/dist/components/switch.js +28 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/tabs.js +42 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/toast.js +60 -0
- package/dist/components/toast.js.map +1 -0
- package/dist/components/toggle-group.js +17 -0
- package/dist/components/toggle-group.js.map +1 -0
- package/dist/components/toggle.js +33 -0
- package/dist/components/toggle.js.map +1 -0
- package/dist/components/toolbar.js +55 -0
- package/dist/components/toolbar.js.map +1 -0
- package/dist/components/tooltip.js +32 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/icons.js +192 -0
- package/dist/icons.js.map +1 -0
- package/dist/index.js +30 -0
- package/dist/primitives/accordion.js +3 -0
- package/dist/primitives/alert-dialog.js +3 -0
- package/dist/primitives/autocomplete.js +3 -0
- package/dist/primitives/avatar.js +3 -0
- package/dist/primitives/button.js +3 -0
- package/dist/primitives/checkbox-group.js +3 -0
- package/dist/primitives/checkbox.js +3 -0
- package/dist/primitives/collapsible.js +3 -0
- package/dist/primitives/combobox.js +3 -0
- package/dist/primitives/context-menu.js +3 -0
- package/dist/primitives/csp-provider.js +3 -0
- package/dist/primitives/dialog.js +3 -0
- package/dist/primitives/direction-provider.js +3 -0
- package/dist/primitives/drawer.js +3 -0
- package/dist/primitives/field.js +3 -0
- package/dist/primitives/fieldset.js +3 -0
- package/dist/primitives/form.js +3 -0
- package/dist/primitives/input.js +3 -0
- package/dist/primitives/menu.js +3 -0
- package/dist/primitives/menubar.js +3 -0
- package/dist/primitives/meter.js +3 -0
- package/dist/primitives/navigation-menu.js +3 -0
- package/dist/primitives/number-field.js +3 -0
- package/dist/primitives/otp-field.js +3 -0
- package/dist/primitives/popover.js +3 -0
- package/dist/primitives/preview-card.js +3 -0
- package/dist/primitives/progress.js +3 -0
- package/dist/primitives/radio-group.js +3 -0
- package/dist/primitives/radio.js +3 -0
- package/dist/primitives/scroll-area.js +3 -0
- package/dist/primitives/select.js +3 -0
- package/dist/primitives/separator.js +3 -0
- package/dist/primitives/slider.js +3 -0
- package/dist/primitives/switch.js +3 -0
- package/dist/primitives/tabs.js +3 -0
- package/dist/primitives/toast.js +3 -0
- package/dist/primitives/toggle-group.js +3 -0
- package/dist/primitives/toggle.js +3 -0
- package/dist/primitives/toolbar.js +3 -0
- package/dist/primitives/tooltip.js +3 -0
- package/dist/primitives.js +84 -0
- package/dist/primitives.js.map +1 -0
- package/dist/src/components/accordion/accordion.d.ts +24 -0
- package/dist/src/components/accordion/index.d.ts +1 -0
- package/dist/src/components/alert-dialog/alert-dialog.d.ts +41 -0
- package/dist/src/components/alert-dialog/index.d.ts +1 -0
- package/dist/src/components/autocomplete/autocomplete.d.ts +38 -0
- package/dist/src/components/autocomplete/index.d.ts +1 -0
- package/dist/src/components/avatar/avatar.d.ts +40 -0
- package/dist/src/components/avatar/index.d.ts +1 -0
- package/dist/src/components/badge/badge.d.ts +63 -0
- package/dist/src/components/badge/index.d.ts +1 -0
- package/dist/src/components/button/button.d.ts +196 -0
- package/dist/src/components/button/close-button.d.ts +28 -0
- package/dist/src/components/button/index.d.ts +2 -0
- package/dist/src/components/checkbox/checkbox-group.d.ts +15 -0
- package/dist/src/components/checkbox/checkbox.d.ts +20 -0
- package/dist/src/components/checkbox/index.d.ts +2 -0
- package/dist/src/components/collapsible/collapsible.d.ts +20 -0
- package/dist/src/components/collapsible/index.d.ts +1 -0
- package/dist/src/components/combobox/combobox.d.ts +49 -0
- package/dist/src/components/combobox/index.d.ts +1 -0
- package/dist/src/components/context-menu/context-menu.d.ts +34 -0
- package/dist/src/components/context-menu/index.d.ts +1 -0
- package/dist/src/components/dialog/dialog.d.ts +41 -0
- package/dist/src/components/dialog/index.d.ts +1 -0
- package/dist/src/components/drawer/drawer.d.ts +32 -0
- package/dist/src/components/drawer/index.d.ts +1 -0
- package/dist/src/components/field/field.d.ts +27 -0
- package/dist/src/components/field/index.d.ts +1 -0
- package/dist/src/components/fieldset/fieldset.d.ts +18 -0
- package/dist/src/components/fieldset/index.d.ts +1 -0
- package/dist/src/components/form/form.d.ts +14 -0
- package/dist/src/components/form/index.d.ts +1 -0
- package/dist/src/components/input/index.d.ts +1 -0
- package/dist/src/components/input/input.d.ts +30 -0
- package/dist/src/components/kbd/index.d.ts +1 -0
- package/dist/src/components/kbd/kbd.d.ts +18 -0
- package/dist/src/components/menu/index.d.ts +1 -0
- package/dist/src/components/menu/menu.d.ts +47 -0
- package/dist/src/components/menubar/index.d.ts +1 -0
- package/dist/src/components/menubar/menubar.d.ts +14 -0
- package/dist/src/components/meter/index.d.ts +1 -0
- package/dist/src/components/meter/meter.d.ts +24 -0
- package/dist/src/components/navigation-menu/index.d.ts +1 -0
- package/dist/src/components/navigation-menu/navigation-menu.d.ts +35 -0
- package/dist/src/components/notification/index.d.ts +1 -0
- package/dist/src/components/notification/notification.d.ts +73 -0
- package/dist/src/components/number-field/index.d.ts +1 -0
- package/dist/src/components/number-field/number-field.d.ts +28 -0
- package/dist/src/components/otp-field/index.d.ts +1 -0
- package/dist/src/components/otp-field/otp-field.d.ts +17 -0
- package/dist/src/components/popover/index.d.ts +1 -0
- package/dist/src/components/popover/popover.d.ts +27 -0
- package/dist/src/components/preview-card/index.d.ts +1 -0
- package/dist/src/components/preview-card/preview-card.d.ts +22 -0
- package/dist/src/components/progress/index.d.ts +1 -0
- package/dist/src/components/progress/progress.d.ts +24 -0
- package/dist/src/components/radio-group/index.d.ts +1 -0
- package/dist/src/components/radio-group/radio-group.d.ts +28 -0
- package/dist/src/components/scroll-area/index.d.ts +1 -0
- package/dist/src/components/scroll-area/scroll-area.d.ts +25 -0
- package/dist/src/components/select/index.d.ts +1 -0
- package/dist/src/components/select/select.d.ts +36 -0
- package/dist/src/components/separator/index.d.ts +1 -0
- package/dist/src/components/separator/separator.d.ts +14 -0
- package/dist/src/components/slider/index.d.ts +1 -0
- package/dist/src/components/slider/slider.d.ts +30 -0
- package/dist/src/components/switch/index.d.ts +1 -0
- package/dist/src/components/switch/switch.d.ts +18 -0
- package/dist/src/components/tabs/index.d.ts +1 -0
- package/dist/src/components/tabs/tabs.d.ts +24 -0
- package/dist/src/components/toast/index.d.ts +1 -0
- package/dist/src/components/toast/toast.d.ts +34 -0
- package/dist/src/components/toggle/index.d.ts +1 -0
- package/dist/src/components/toggle/toggle.d.ts +33 -0
- package/dist/src/components/toggle-group/index.d.ts +1 -0
- package/dist/src/components/toggle-group/toggle-group.d.ts +15 -0
- package/dist/src/components/toolbar/index.d.ts +1 -0
- package/dist/src/components/toolbar/toolbar.d.ts +28 -0
- package/dist/src/components/tooltip/index.d.ts +1 -0
- package/dist/src/components/tooltip/tooltip.d.ts +23 -0
- package/dist/src/icons/discord.d.ts +3 -0
- package/dist/src/icons/github.d.ts +3 -0
- package/dist/src/icons/google.d.ts +3 -0
- package/dist/src/icons/imessage.d.ts +3 -0
- package/dist/src/icons/index.d.ts +18 -0
- package/dist/src/icons/photon-mark.d.ts +3 -0
- package/dist/src/icons/reddit.d.ts +3 -0
- package/dist/src/icons/slack.d.ts +3 -0
- package/dist/src/icons/telegram.d.ts +3 -0
- package/dist/src/icons/whatsapp.d.ts +3 -0
- package/dist/src/icons/x.d.ts +3 -0
- package/dist/src/icons/youtube.d.ts +3 -0
- package/dist/src/index.d.ts +11 -0
- package/dist/src/primitives/accordion.d.ts +5 -0
- package/dist/src/primitives/alert-dialog.d.ts +5 -0
- package/dist/src/primitives/autocomplete.d.ts +5 -0
- package/dist/src/primitives/avatar.d.ts +5 -0
- package/dist/src/primitives/button.d.ts +5 -0
- package/dist/src/primitives/checkbox-group.d.ts +5 -0
- package/dist/src/primitives/checkbox.d.ts +5 -0
- package/dist/src/primitives/collapsible.d.ts +5 -0
- package/dist/src/primitives/combobox.d.ts +5 -0
- package/dist/src/primitives/context-menu.d.ts +5 -0
- package/dist/src/primitives/csp-provider.d.ts +5 -0
- package/dist/src/primitives/dialog.d.ts +5 -0
- package/dist/src/primitives/direction-provider.d.ts +5 -0
- package/dist/src/primitives/drawer.d.ts +5 -0
- package/dist/src/primitives/field.d.ts +5 -0
- package/dist/src/primitives/fieldset.d.ts +5 -0
- package/dist/src/primitives/form.d.ts +5 -0
- package/dist/src/primitives/index.d.ts +44 -0
- package/dist/src/primitives/input.d.ts +5 -0
- package/dist/src/primitives/menu.d.ts +5 -0
- package/dist/src/primitives/menubar.d.ts +5 -0
- package/dist/src/primitives/meter.d.ts +5 -0
- package/dist/src/primitives/navigation-menu.d.ts +5 -0
- package/dist/src/primitives/number-field.d.ts +5 -0
- package/dist/src/primitives/otp-field.d.ts +5 -0
- package/dist/src/primitives/popover.d.ts +5 -0
- package/dist/src/primitives/preview-card.d.ts +5 -0
- package/dist/src/primitives/progress.d.ts +5 -0
- package/dist/src/primitives/radio-group.d.ts +5 -0
- package/dist/src/primitives/radio.d.ts +5 -0
- package/dist/src/primitives/scroll-area.d.ts +5 -0
- package/dist/src/primitives/select.d.ts +5 -0
- package/dist/src/primitives/separator.d.ts +5 -0
- package/dist/src/primitives/slider.d.ts +5 -0
- package/dist/src/primitives/switch.d.ts +5 -0
- package/dist/src/primitives/tabs.d.ts +5 -0
- package/dist/src/primitives/toast.d.ts +5 -0
- package/dist/src/primitives/toggle-group.d.ts +5 -0
- package/dist/src/primitives/toggle.d.ts +5 -0
- package/dist/src/primitives/toolbar.d.ts +5 -0
- package/dist/src/primitives/tooltip.d.ts +5 -0
- package/dist/src/utils/cn.d.ts +3 -0
- package/dist/src/utils/index.d.ts +4 -0
- package/dist/src/utils/is-react-component.d.ts +9 -0
- package/dist/src/utils/link-provider.d.ts +17 -0
- package/dist/src/utils/resolve-variant.d.ts +19 -0
- package/dist/utils.js +11 -0
- package/package.json +406 -0
- package/src/styles/fonts.css +20 -0
- package/src/styles/pho.css +50 -0
- package/src/styles/theme.css +289 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { createContext as o, createElement as i, forwardRef as f, isValidElement as a, useContext as u } from "react";
|
|
3
|
+
import { jsx as s } from "react/jsx-runtime";
|
|
4
|
+
function p(t) {
|
|
5
|
+
return typeof t == "function" ? !0 : typeof t == "object" && t !== null && "$$typeof" in t && !a(t);
|
|
6
|
+
}
|
|
7
|
+
var n = f((t, e) => i("a", {
|
|
8
|
+
...t,
|
|
9
|
+
ref: e
|
|
10
|
+
}));
|
|
11
|
+
n.displayName = "DefaultLink";
|
|
12
|
+
var r = o(n);
|
|
13
|
+
function l({ component: t, children: e }) {
|
|
14
|
+
return /* @__PURE__ */ s(r.Provider, {
|
|
15
|
+
value: t,
|
|
16
|
+
children: e
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function d() {
|
|
20
|
+
return u(r);
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
d as n,
|
|
24
|
+
p as r,
|
|
25
|
+
l as t
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=link-provider-9TFNyDqO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-provider-9TFNyDqO.js","names":[],"sources":["../../src/utils/is-react-component.ts","../../src/utils/link-provider.tsx"],"sourcesContent":["import { isValidElement, type ComponentType } from \"react\";\n\n/**\n * Distinguish an icon passed as a *component* (e.g. a Phosphor icon or any\n * `FC`/forwardRef) from one passed as an already-rendered *element*. Lets icon\n * props accept either form: `prefix={Plus}` or `prefix={<Plus />}`.\n */\nexport function isReactComponent(\n value: unknown,\n): value is ComponentType<{ className?: string }> {\n if (typeof value === \"function\") return true;\n // forwardRef / memo components are objects carrying `$$typeof` but, unlike a\n // rendered element, are not valid React elements.\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"$$typeof\" in value &&\n !isValidElement(value)\n );\n}\n","import {\n createContext,\n createElement,\n forwardRef,\n useContext,\n type AnchorHTMLAttributes,\n type ComponentType,\n type ReactNode,\n} from \"react\";\n\n/**\n * The shape a host app's link component must satisfy. Routers (TanStack Router,\n * React Router, Next.js) expose a `Link` that takes `href` + anchor props; this\n * lets Pho components render real client-side links without depending on any\n * specific router.\n */\nexport type LinkComponent = ComponentType<\n AnchorHTMLAttributes<HTMLAnchorElement> & { href: string }\n>;\n\n// Forwards its ref so wrappers (e.g. Motion) can reach the underlying anchor.\nconst DefaultLink: LinkComponent = forwardRef<\n HTMLAnchorElement,\n AnchorHTMLAttributes<HTMLAnchorElement> & { href: string }\n>((props, ref) => createElement(\"a\", { ...props, ref }));\nDefaultLink.displayName = \"DefaultLink\";\n\nconst LinkContext = createContext<LinkComponent>(DefaultLink);\n\n/** Inject the host router's link component for all Pho links beneath it. */\nexport function LinkProvider({\n component,\n children,\n}: {\n component: LinkComponent;\n children: ReactNode;\n}) {\n return (\n <LinkContext.Provider value={component}>{children}</LinkContext.Provider>\n );\n}\n\n/** Read the active link component (falls back to a plain `<a>`). */\nexport function useLinkComponent(): LinkComponent {\n return useContext(LinkContext);\n}\n"],"mappings":";;;AAOA,SAAgB,EACd,GACgD;AAChD,SAAI,OAAO,KAAU,aAAmB,KAItC,OAAO,KAAU,YACjB,MAAU,QACV,cAAc,KACd,CAAC,EAAe,CAAK;AAEzB;ACEA,IAAM,IAA6B,EAAA,CAGhC,GAAO,MAAQ,EAAc,KAAK;AAAA,EAAE,GAAG;AAAA,EAAO,KAAA;AAAI,CAAC,CAAC;AACvD,EAAY,cAAc;AAE1B,IAAM,IAAc,EAA6B,CAAW;AAG5D,SAAgB,EAAa,EAC3B,WAAA,GACA,UAAA,EAAA,GAIC;AACD,SACE,gBAAA,EAAC,EAAY,UAAb;AAAA,IAAsB,OAAO;AAAA,IAAY,UAAA;AAAA,EAA+B,CAAA;AAE5E;AAGA,SAAgB,IAAkC;AAChD,SAAO,EAAW,CAAW;AAC/B"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as a } from "./cn-D6jQqeRj.js";
|
|
3
|
+
import "react";
|
|
4
|
+
import { jsx as o } from "react/jsx-runtime";
|
|
5
|
+
import { Menu as r } from "@base-ui/react/menu";
|
|
6
|
+
import { Separator as p } from "@base-ui/react/separator";
|
|
7
|
+
var u = "squircle bg-pho-primary text-pho-primary shadow-pho-lg ring-pho-interactive origin-[var(--transform-origin)] min-w-44 rounded-xl p-1 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", n = "relative flex cursor-pointer items-center gap-2 rounded-lg py-1.5 pr-2.5 pl-2.5 text-sm text-pho-secondary outline-none select-none data-[highlighted]:bg-pho-secondary data-[highlighted]:text-pho-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:text-fg-pho-quaternary", c = r.Root, m = r.Trigger, l = r.Portal, d = r.Group, g = r.RadioGroup, h = r.SubmenuRoot;
|
|
8
|
+
function f({ className: t, sideOffset: e = 6, ...s }) {
|
|
9
|
+
return /* @__PURE__ */ o(r.Positioner, {
|
|
10
|
+
sideOffset: e,
|
|
11
|
+
className: a("z-50", t),
|
|
12
|
+
...s
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
function x({ className: t, ...e }) {
|
|
16
|
+
return /* @__PURE__ */ o(r.Popup, {
|
|
17
|
+
className: a(u, t),
|
|
18
|
+
...e
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
function y({ className: t, ...e }) {
|
|
22
|
+
return /* @__PURE__ */ o(r.Item, {
|
|
23
|
+
className: a(n, t),
|
|
24
|
+
...e
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function b({ className: t, ...e }) {
|
|
28
|
+
return /* @__PURE__ */ o(r.LinkItem, {
|
|
29
|
+
className: a(n, t),
|
|
30
|
+
...e
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function I({ className: t, ...e }) {
|
|
34
|
+
return /* @__PURE__ */ o(r.GroupLabel, {
|
|
35
|
+
className: a("text-pho-quaternary px-2.5 py-1.5 text-xs font-medium", t),
|
|
36
|
+
...e
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function v({ className: t, ...e }) {
|
|
40
|
+
return /* @__PURE__ */ o(p, {
|
|
41
|
+
className: a("-mx-1 my-1 h-px bg-[var(--border-color-pho-secondary)]", t),
|
|
42
|
+
...e
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function N({ className: t, ...e }) {
|
|
46
|
+
return /* @__PURE__ */ o(r.SubmenuTrigger, {
|
|
47
|
+
className: a(n, "data-[popup-open]:bg-pho-secondary", t),
|
|
48
|
+
...e
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function R({ className: t, ...e }) {
|
|
52
|
+
return /* @__PURE__ */ o(r.CheckboxItem, {
|
|
53
|
+
className: a(n, "pl-8", t),
|
|
54
|
+
...e
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function P({ className: t, ...e }) {
|
|
58
|
+
return /* @__PURE__ */ o(r.RadioItem, {
|
|
59
|
+
className: a(n, "pl-8", t),
|
|
60
|
+
...e
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
var i = "text-pho-brand absolute left-2.5 flex items-center [&>svg]:size-4";
|
|
64
|
+
function C({ className: t, ...e }) {
|
|
65
|
+
return /* @__PURE__ */ o(r.CheckboxItemIndicator, {
|
|
66
|
+
className: a(i, t),
|
|
67
|
+
...e
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
function S({ className: t, ...e }) {
|
|
71
|
+
return /* @__PURE__ */ o(r.RadioItemIndicator, {
|
|
72
|
+
className: a(i, t),
|
|
73
|
+
...e
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
var L = {
|
|
77
|
+
Root: c,
|
|
78
|
+
Trigger: m,
|
|
79
|
+
Portal: l,
|
|
80
|
+
Positioner: f,
|
|
81
|
+
Popup: x,
|
|
82
|
+
Item: y,
|
|
83
|
+
LinkItem: b,
|
|
84
|
+
Group: d,
|
|
85
|
+
GroupLabel: I,
|
|
86
|
+
Separator: v,
|
|
87
|
+
SubmenuRoot: h,
|
|
88
|
+
SubmenuTrigger: N,
|
|
89
|
+
CheckboxItem: R,
|
|
90
|
+
CheckboxItemIndicator: C,
|
|
91
|
+
RadioGroup: g,
|
|
92
|
+
RadioItem: P,
|
|
93
|
+
RadioItemIndicator: S
|
|
94
|
+
};
|
|
95
|
+
export {
|
|
96
|
+
u as n,
|
|
97
|
+
L as r,
|
|
98
|
+
n as t
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
//# sourceMappingURL=menu-BkzDbNuX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu-BkzDbNuX.js","names":[],"sources":["../../src/components/menu/menu.tsx"],"sourcesContent":["import { type ComponentProps, type ElementType } 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\";\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\n/** Shared popup + item styles, reused by `ContextMenu` and `Menubar` menus. */\nexport const MENU_POPUP =\n \"squircle bg-pho-primary text-pho-primary shadow-pho-lg ring-pho-interactive origin-[var(--transform-origin)] min-w-44 rounded-xl p-1 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\";\nexport const MENU_ITEM =\n \"relative flex cursor-pointer items-center gap-2 rounded-lg py-1.5 pr-2.5 pl-2.5 text-sm text-pho-secondary outline-none select-none data-[highlighted]:bg-pho-secondary data-[highlighted]:text-pho-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:text-fg-pho-quaternary\";\n\nconst Root = BaseMenu.Root;\nconst Trigger = BaseMenu.Trigger;\nconst Portal = BaseMenu.Portal;\nconst Group = BaseMenu.Group;\nconst RadioGroup = BaseMenu.RadioGroup;\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({ className, ...props }: StyledProps<typeof BaseMenu.Item>) {\n return <BaseMenu.Item className={cn(MENU_ITEM, className)} {...props} />;\n}\n\nfunction LinkItem({\n className,\n ...props\n}: StyledProps<typeof BaseMenu.LinkItem>) {\n return <BaseMenu.LinkItem className={cn(MENU_ITEM, className)} {...props} />;\n}\n\nfunction GroupLabel({\n className,\n ...props\n}: StyledProps<typeof BaseMenu.GroupLabel>) {\n return (\n <BaseMenu.GroupLabel\n className={cn(\n \"text-pho-quaternary 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 my-1 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(MENU_ITEM, \"data-[popup-open]:bg-pho-secondary\", className)}\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. 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":";;;;;;AAcA,IAAa,IACX,sVACW,IACX,4TAEI,IAAO,EAAS,MAChB,IAAU,EAAS,SACnB,IAAS,EAAS,QAClB,IAAQ,EAAS,OACjB,IAAa,EAAS,YACtB,IAAc,EAAS;AAE7B,SAAS,EAAW,EAClB,WAAA,GACA,YAAA,IAAa,GACb,GAAG,EAAA,GACuC;AAC1C,SACE,gBAAA,EAAC,EAAS,YAAV;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,GAA6C;AAC1E,SAAO,gBAAA,EAAC,EAAS,OAAV;AAAA,IAAgB,WAAW,EAAG,GAAY,CAAS;AAAA,IAAG,GAAI;AAAA,EAAQ,CAAA;AAC3E;AAEA,SAAS,EAAK,EAAE,WAAA,GAAW,GAAG,EAAA,GAA4C;AACxE,SAAO,gBAAA,EAAC,EAAS,MAAV;AAAA,IAAe,WAAW,EAAG,GAAW,CAAS;AAAA,IAAG,GAAI;AAAA,EAAQ,CAAA;AACzE;AAEA,SAAS,EAAS,EAChB,WAAA,GACA,GAAG,EAAA,GACqC;AACxC,SAAO,gBAAA,EAAC,EAAS,UAAV;AAAA,IAAmB,WAAW,EAAG,GAAW,CAAS;AAAA,IAAG,GAAI;AAAA,EAAQ,CAAA;AAC7E;AAEA,SAAS,EAAW,EAClB,WAAA,GACA,GAAG,EAAA,GACuC;AAC1C,SACE,gBAAA,EAAC,EAAS,YAAV;AAAA,IACE,WAAW,EACT,yDACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAU,EAAE,WAAA,GAAW,GAAG,EAAA,GAA4C;AAC7E,SACE,gBAAA,EAAC,GAAD;AAAA,IACE,WAAW,EACT,0DACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAe,EACtB,WAAA,GACA,GAAG,EAAA,GAC2C;AAC9C,SACE,gBAAA,EAAC,EAAS,gBAAV;AAAA,IACE,WAAW,EAAG,GAAW,sCAAsC,CAAS;AAAA,IACxE,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAa,EACpB,WAAA,GACA,GAAG,EAAA,GACyC;AAC5C,SACE,gBAAA,EAAC,EAAS,cAAV;AAAA,IACE,WAAW,EAAG,GAAW,QAAQ,CAAS;AAAA,IAC1C,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAU,EACjB,WAAA,GACA,GAAG,EAAA,GACsC;AACzC,SACE,gBAAA,EAAC,EAAS,WAAV;AAAA,IACE,WAAW,EAAG,GAAW,QAAQ,CAAS;AAAA,IAC1C,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,IAAM,IACJ;AAEF,SAAS,EAAsB,EAC7B,WAAA,GACA,GAAG,EAAA,GACkD;AACrD,SACE,gBAAA,EAAC,EAAS,uBAAV;AAAA,IACE,WAAW,EAAG,GAAiB,CAAS;AAAA,IACxC,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAmB,EAC1B,WAAA,GACA,GAAG,EAAA,GAC+C;AAClD,SACE,gBAAA,EAAC,EAAS,oBAAV;AAAA,IACE,WAAW,EAAG,GAAiB,CAAS;AAAA,IACxC,GAAI;AAAA,EACL,CAAA;AAEL;AAQA,IAAa,IAAO;AAAA,EAClB,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,uBAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,oBAAA;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-variant-CcD8iG5l.js","names":[],"sources":["../../src/utils/resolve-variant.ts"],"sourcesContent":["/**\n * A single option within a variant axis: the Tailwind classes it applies plus a\n * human description (surfaced in docs and the future component registry).\n */\nexport interface VariantDef {\n classes: string;\n description?: string;\n}\n\n/** One variant axis — maps each option name to its definition. */\nexport type VariantMap = Record<string, VariantDef>;\n\n/**\n * Resolve the Tailwind classes for a chosen option of a variant axis.\n * Returns `\"\"` for an unknown key so callers can compose safely with `cn`.\n *\n * @example\n * const SIZE = { sm: { classes: \"h-6 px-2\" }, md: { classes: \"h-9 px-3\" } };\n * cn(base, resolveVariant(SIZE, size));\n */\nexport function resolveVariant<M extends VariantMap>(\n map: M,\n key: keyof M | (string & {}),\n): string {\n return map[key as keyof M]?.classes ?? \"\";\n}\n"],"mappings":";AAoBA,SAAgB,EACd,GACA,GACQ;AACR,SAAO,EAAI,CAAA,GAAiB,WAAW;AACzC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var o = Object.defineProperty, v = Object.getOwnPropertyDescriptor, O = Object.getOwnPropertyNames, c = Object.prototype.hasOwnProperty, g = (r, e) => {
|
|
3
|
+
let t = {};
|
|
4
|
+
for (var n in r)
|
|
5
|
+
o(t, n, {
|
|
6
|
+
get: r[n],
|
|
7
|
+
enumerable: !0
|
|
8
|
+
});
|
|
9
|
+
return e || o(t, Symbol.toStringTag, { value: "Module" }), t;
|
|
10
|
+
}, _ = (r, e, t, n) => {
|
|
11
|
+
if (e && typeof e == "object" || typeof e == "function")
|
|
12
|
+
for (var l = O(e), p = 0, u = l.length, a; p < u; p++)
|
|
13
|
+
a = l[p], !c.call(r, a) && a !== t && o(r, a, {
|
|
14
|
+
get: ((b) => e[b]).bind(null, a),
|
|
15
|
+
enumerable: !(n = v(e, a)) || n.enumerable
|
|
16
|
+
});
|
|
17
|
+
return r;
|
|
18
|
+
}, P = (r, e, t) => (_(r, e, "default"), t && _(t, e, "default"));
|
|
19
|
+
export {
|
|
20
|
+
P as n,
|
|
21
|
+
g as t
|
|
22
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as o } from "../chunks/cn-D6jQqeRj.js";
|
|
3
|
+
import "react";
|
|
4
|
+
import { jsx as n } from "react/jsx-runtime";
|
|
5
|
+
import { Accordion as r } from "@base-ui/react/accordion";
|
|
6
|
+
function a({ className: e, ...t }) {
|
|
7
|
+
return /* @__PURE__ */ n(r.Root, {
|
|
8
|
+
className: o("w-full divide-y divide-[var(--border-color-pho-secondary)] border-y border-[var(--border-color-pho-secondary)]", e),
|
|
9
|
+
...t
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
var i = r.Item;
|
|
13
|
+
function s({ className: e, ...t }) {
|
|
14
|
+
return /* @__PURE__ */ n(r.Header, {
|
|
15
|
+
className: o("flex", e),
|
|
16
|
+
...t
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function c({ className: e, ...t }) {
|
|
20
|
+
return /* @__PURE__ */ n(r.Trigger, {
|
|
21
|
+
className: o("outline-pho-brand text-pho-secondary hover:text-pho-secondary-hover flex flex-1 cursor-pointer items-center justify-between gap-3 py-4 text-left text-sm font-medium transition focus-visible:outline-2 focus-visible:-outline-offset-2", "[&>svg]:text-fg-pho-quaternary [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:transition-transform [&>svg]:duration-150 data-[panel-open]:[&>svg]:rotate-180", e),
|
|
22
|
+
...t
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function d({ className: e, ...t }) {
|
|
26
|
+
return /* @__PURE__ */ n(r.Panel, {
|
|
27
|
+
className: o("text-pho-tertiary h-[var(--accordion-panel-height)] overflow-hidden text-sm transition-[height] duration-150 ease-out", "data-[ending-style]:h-0 data-[starting-style]:h-0", e),
|
|
28
|
+
...t
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
var h = {
|
|
32
|
+
Root: a,
|
|
33
|
+
Item: i,
|
|
34
|
+
Header: s,
|
|
35
|
+
Trigger: c,
|
|
36
|
+
Panel: d
|
|
37
|
+
};
|
|
38
|
+
export {
|
|
39
|
+
h as Accordion
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=accordion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion.js","names":[],"sources":["../../src/components/accordion/accordion.tsx"],"sourcesContent":["import { type ComponentProps, type ElementType } from \"react\";\nimport { Accordion as BaseAccordion } from \"@base-ui/react/accordion\";\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\nfunction Root({ className, ...props }: StyledProps<typeof BaseAccordion.Root>) {\n return (\n <BaseAccordion.Root\n className={cn(\n \"w-full divide-y divide-[var(--border-color-pho-secondary)] border-y border-[var(--border-color-pho-secondary)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nconst Item = BaseAccordion.Item;\n\nfunction Header({\n className,\n ...props\n}: StyledProps<typeof BaseAccordion.Header>) {\n return <BaseAccordion.Header className={cn(\"flex\", className)} {...props} />;\n}\n\nfunction Trigger({\n className,\n ...props\n}: StyledProps<typeof BaseAccordion.Trigger>) {\n return (\n <BaseAccordion.Trigger\n className={cn(\n \"outline-pho-brand text-pho-secondary hover:text-pho-secondary-hover flex flex-1 cursor-pointer items-center justify-between gap-3 py-4 text-left text-sm font-medium transition focus-visible:outline-2 focus-visible:-outline-offset-2\",\n \"[&>svg]:text-fg-pho-quaternary [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:transition-transform [&>svg]:duration-150 data-[panel-open]:[&>svg]:rotate-180\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Panel({\n className,\n ...props\n}: StyledProps<typeof BaseAccordion.Panel>) {\n return (\n <BaseAccordion.Panel\n className={cn(\n \"text-pho-tertiary h-[var(--accordion-panel-height)] overflow-hidden text-sm transition-[height] duration-150 ease-out\",\n \"data-[ending-style]:h-0 data-[starting-style]:h-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/**\n * Stacked, individually-collapsible sections built on Base UI `Accordion`.\n * Single-open by default; set `openMultiple` to allow several at once. Each\n * `Accordion.Item` needs a `value`; control the open set with `value` /\n * `onValueChange` or `defaultValue`.\n */\nexport const Accordion = { Root, Item, Header, Trigger, Panel };\n"],"mappings":";;;;;AAYA,SAAS,EAAK,EAAE,WAAA,GAAW,GAAG,EAAA,GAAiD;AAC7E,SACE,gBAAA,EAAC,EAAc,MAAf;AAAA,IACE,WAAW,EACT,kHACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,IAAM,IAAO,EAAc;AAE3B,SAAS,EAAO,EACd,WAAA,GACA,GAAG,EAAA,GACwC;AAC3C,SAAO,gBAAA,EAAC,EAAc,QAAf;AAAA,IAAsB,WAAW,EAAG,QAAQ,CAAS;AAAA,IAAG,GAAI;AAAA,EAAQ,CAAA;AAC7E;AAEA,SAAS,EAAQ,EACf,WAAA,GACA,GAAG,EAAA,GACyC;AAC5C,SACE,gBAAA,EAAC,EAAc,SAAf;AAAA,IACE,WAAW,EACT,2OACA,yJACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAM,EACb,WAAA,GACA,GAAG,EAAA,GACuC;AAC1C,SACE,gBAAA,EAAC,EAAc,OAAf;AAAA,IACE,WAAW,EACT,yHACA,qDACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAQA,IAAa,IAAY;AAAA,EAAE,MAAA;AAAA,EAAM,MAAA;AAAA,EAAM,QAAA;AAAA,EAAQ,SAAA;AAAA,EAAS,OAAA;AAAM"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as o } from "../chunks/cn-D6jQqeRj.js";
|
|
3
|
+
import "react";
|
|
4
|
+
import { jsx as e, jsxs as i } from "react/jsx-runtime";
|
|
5
|
+
import { AlertDialog as r } from "@base-ui/react/alert-dialog";
|
|
6
|
+
var x = r.Root, g = r.Trigger, n = r.Portal, y = r.Close;
|
|
7
|
+
function l({ className: t, ...a }) {
|
|
8
|
+
return /* @__PURE__ */ e(r.Backdrop, {
|
|
9
|
+
className: o("bg-pho-overlay fixed inset-0 z-50 backdrop-blur-[2px] transition-opacity duration-200 ease-out", "data-[ending-style]:opacity-0 data-[starting-style]:opacity-0", t),
|
|
10
|
+
...a
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
function s({ className: t, ...a }) {
|
|
14
|
+
return /* @__PURE__ */ e(r.Popup, {
|
|
15
|
+
className: o("squircle border-pho-interactive bg-pho-primary shadow-pho-xl fixed top-1/2 left-1/2 z-50 w-[calc(100%-2rem)] max-w-md -translate-x-1/2 -translate-y-1/2 overflow-hidden rounded-2xl border outline-none", "transition-all duration-200 ease-out", "data-[starting-style]:scale-95 data-[starting-style]:opacity-0", "data-[ending-style]:scale-95 data-[ending-style]:opacity-0", t),
|
|
16
|
+
...a
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function c({ className: t, ...a }) {
|
|
20
|
+
return /* @__PURE__ */ e(r.Title, {
|
|
21
|
+
className: o("text-pho-primary text-lg font-semibold", t),
|
|
22
|
+
...a
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function p({ className: t, ...a }) {
|
|
26
|
+
return /* @__PURE__ */ e(r.Description, {
|
|
27
|
+
className: o("text-pho-tertiary mt-1 text-sm", t),
|
|
28
|
+
...a
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function f({ title: t, description: a, children: d, className: m, ...u }) {
|
|
32
|
+
return /* @__PURE__ */ i(n, { children: [/* @__PURE__ */ e(l, {}), /* @__PURE__ */ i(s, {
|
|
33
|
+
className: m,
|
|
34
|
+
...u,
|
|
35
|
+
children: [(t || a) && /* @__PURE__ */ i("div", {
|
|
36
|
+
className: "flex flex-col gap-1 px-6 pt-5",
|
|
37
|
+
children: [t && /* @__PURE__ */ e(c, { children: t }), a && /* @__PURE__ */ e(p, { children: a })]
|
|
38
|
+
}), /* @__PURE__ */ e("div", {
|
|
39
|
+
className: "px-6 py-5",
|
|
40
|
+
children: d
|
|
41
|
+
})]
|
|
42
|
+
})] });
|
|
43
|
+
}
|
|
44
|
+
var D = {
|
|
45
|
+
Root: x,
|
|
46
|
+
Trigger: g,
|
|
47
|
+
Portal: n,
|
|
48
|
+
Backdrop: l,
|
|
49
|
+
Popup: s,
|
|
50
|
+
Title: c,
|
|
51
|
+
Description: p,
|
|
52
|
+
Close: y,
|
|
53
|
+
Content: f
|
|
54
|
+
};
|
|
55
|
+
export {
|
|
56
|
+
D as AlertDialog
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=alert-dialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-dialog.js","names":[],"sources":["../../src/components/alert-dialog/alert-dialog.tsx"],"sourcesContent":["import { type ComponentProps, type ElementType, type ReactNode } from \"react\";\nimport { AlertDialog as BaseAlertDialog } from \"@base-ui/react/alert-dialog\";\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 = BaseAlertDialog.Root;\nconst Trigger = BaseAlertDialog.Trigger;\nconst Portal = BaseAlertDialog.Portal;\nconst Close = BaseAlertDialog.Close;\n\nfunction Backdrop({\n className,\n ...props\n}: StyledProps<typeof BaseAlertDialog.Backdrop>) {\n return (\n <BaseAlertDialog.Backdrop\n className={cn(\n \"bg-pho-overlay fixed inset-0 z-50 backdrop-blur-[2px] transition-opacity duration-200 ease-out\",\n \"data-[ending-style]:opacity-0 data-[starting-style]:opacity-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Popup({\n className,\n ...props\n}: StyledProps<typeof BaseAlertDialog.Popup>) {\n return (\n <BaseAlertDialog.Popup\n className={cn(\n \"squircle border-pho-interactive bg-pho-primary shadow-pho-xl fixed top-1/2 left-1/2 z-50 w-[calc(100%-2rem)] max-w-md -translate-x-1/2 -translate-y-1/2 overflow-hidden rounded-2xl border outline-none\",\n \"transition-all duration-200 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({\n className,\n ...props\n}: StyledProps<typeof BaseAlertDialog.Title>) {\n return (\n <BaseAlertDialog.Title\n className={cn(\"text-pho-primary text-lg font-semibold\", className)}\n {...props}\n />\n );\n}\n\nfunction Description({\n className,\n ...props\n}: StyledProps<typeof BaseAlertDialog.Description>) {\n return (\n <BaseAlertDialog.Description\n className={cn(\"text-pho-tertiary mt-1 text-sm\", className)}\n {...props}\n />\n );\n}\n\ninterface ContentProps extends Omit<\n StyledProps<typeof BaseAlertDialog.Popup>,\n \"title\"\n> {\n /** Heading rendered in the panel header. */\n title?: ReactNode;\n /** Supporting text under the title. */\n description?: ReactNode;\n children?: ReactNode;\n}\n\n/**\n * Convenience panel: portal + backdrop + styled popup with a title/description\n * header. The action buttons are your responsibility — an alert dialog requires\n * an explicit choice and must not be dismissed by clicking away.\n */\nfunction Content({\n title,\n description,\n children,\n className,\n ...props\n}: ContentProps) {\n return (\n <Portal>\n <Backdrop />\n <Popup className={className} {...props}>\n {(title || description) && (\n <div className=\"flex flex-col gap-1 px-6 pt-5\">\n {title && <Title>{title}</Title>}\n {description && <Description>{description}</Description>}\n </div>\n )}\n <div className=\"px-6 py-5\">{children}</div>\n </Popup>\n </Portal>\n );\n}\n\n/**\n * Alert dialog built on Base UI `AlertDialog` — a modal that interrupts to\n * confirm a consequential or destructive action. Unlike `Dialog`, it does not\n * close on outside press or Escape: the user must pick an action. Reach for\n * `Dialog` for anything that isn't a forced decision.\n */\nexport const AlertDialog = {\n Root,\n Trigger,\n Portal,\n Backdrop,\n Popup,\n Title,\n Description,\n Close,\n Content,\n};\n"],"mappings":";;;;;AAYA,IAAM,IAAO,EAAgB,MACvB,IAAU,EAAgB,SAC1B,IAAS,EAAgB,QACzB,IAAQ,EAAgB;AAE9B,SAAS,EAAS,EAChB,WAAA,GACA,GAAG,EAAA,GAC4C;AAC/C,SACE,gBAAA,EAAC,EAAgB,UAAjB;AAAA,IACE,WAAW,EACT,kGACA,iEACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAM,EACb,WAAA,GACA,GAAG,EAAA,GACyC;AAC5C,SACE,gBAAA,EAAC,EAAgB,OAAjB;AAAA,IACE,WAAW,EACT,2MACA,wCACA,kEACA,8DACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAM,EACb,WAAA,GACA,GAAG,EAAA,GACyC;AAC5C,SACE,gBAAA,EAAC,EAAgB,OAAjB;AAAA,IACE,WAAW,EAAG,0CAA0C,CAAS;AAAA,IACjE,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAY,EACnB,WAAA,GACA,GAAG,EAAA,GAC+C;AAClD,SACE,gBAAA,EAAC,EAAgB,aAAjB;AAAA,IACE,WAAW,EAAG,kCAAkC,CAAS;AAAA,IACzD,GAAI;AAAA,EACL,CAAA;AAEL;AAkBA,SAAS,EAAQ,EACf,OAAA,GACA,aAAA,GACA,UAAA,GACA,WAAA,GACA,GAAG,EAAA,GACY;AACf,SACE,gBAAA,EAAC,GAAD,EAAA,UAAA,CACE,gBAAA,EAAC,GAAD,CAAW,CAAA,GACX,gBAAA,EAAC,GAAD;AAAA,IAAkB,WAAA;AAAA,IAAW,GAAI;AAAA,cAAjC,EACI,KAAS,MACT,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,gBAAf,CACG,KAAS,gBAAA,EAAC,GAAD,EAAA,UAAQ,EAAa,CAAA,GAC9B,KAAe,gBAAA,EAAC,GAAD,EAAA,UAAc,EAAyB,CAAA,CACpD;AAAA,QAEP,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,MAAa,UAAA;AAAA,IAAc,CAAA,CACrC;AAAA,IACD,EAAA,CAAA;AAEZ;AAQA,IAAa,IAAc;AAAA,EACzB,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AACF"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as o } from "../chunks/cn-D6jQqeRj.js";
|
|
3
|
+
import "react";
|
|
4
|
+
import { jsx as a } from "react/jsx-runtime";
|
|
5
|
+
import { Autocomplete as r } from "@base-ui/react/autocomplete";
|
|
6
|
+
var i = r.Root, s = r.Value, l = r.Portal, p = r.Group, u = r.Collection;
|
|
7
|
+
function c({ className: t, ...e }) {
|
|
8
|
+
return /* @__PURE__ */ a(r.InputGroup, {
|
|
9
|
+
className: o("relative flex items-center", t),
|
|
10
|
+
...e
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
function m({ className: t, ...e }) {
|
|
14
|
+
return /* @__PURE__ */ a(r.Input, {
|
|
15
|
+
className: o("squircle bg-pho-primary shadow-pho-xs ring-pho-primary text-pho-primary placeholder:text-pho-placeholder focus-visible:ring-pho-brand w-full rounded-lg px-3 py-2 text-sm ring-1 transition-shadow duration-100 ease-linear outline-none ring-inset focus-visible:ring-2 disabled:cursor-not-allowed disabled:opacity-50", t),
|
|
16
|
+
...e
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function h({ className: t, ...e }) {
|
|
20
|
+
return /* @__PURE__ */ a(r.Clear, {
|
|
21
|
+
className: o("text-fg-pho-quaternary hover:text-fg-pho-quaternary-hover absolute right-2.5 flex cursor-pointer items-center [&>svg]:size-4", t),
|
|
22
|
+
...e
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function d({ className: t, sideOffset: e = 6, ...n }) {
|
|
26
|
+
return /* @__PURE__ */ a(r.Positioner, {
|
|
27
|
+
sideOffset: e,
|
|
28
|
+
className: o("z-50 outline-none", t),
|
|
29
|
+
...n
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function g({ className: t, ...e }) {
|
|
33
|
+
return /* @__PURE__ */ a(r.Popup, {
|
|
34
|
+
className: o("squircle bg-pho-primary text-pho-primary shadow-pho-lg ring-pho-interactive w-[var(--anchor-width)] max-w-[var(--available-width)] origin-[var(--transform-origin)] rounded-xl p-1 ring-1 transition-[transform,opacity] duration-150 ease-out outline-none ring-inset", "data-[starting-style]:scale-95 data-[starting-style]:opacity-0", "data-[ending-style]:scale-95 data-[ending-style]:opacity-0", t),
|
|
35
|
+
...e
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function y({ className: t, ...e }) {
|
|
39
|
+
return /* @__PURE__ */ a(r.List, {
|
|
40
|
+
className: o("max-h-[min(20rem,var(--available-height))] overflow-y-auto overscroll-contain", t),
|
|
41
|
+
...e
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function x({ className: t, ...e }) {
|
|
45
|
+
return /* @__PURE__ */ a(r.Empty, {
|
|
46
|
+
className: o("text-pho-tertiary px-2.5 py-6 text-center text-sm empty:m-0 empty:p-0", t),
|
|
47
|
+
...e
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function f({ className: t, ...e }) {
|
|
51
|
+
return /* @__PURE__ */ a(r.Item, {
|
|
52
|
+
className: o("text-pho-secondary flex cursor-pointer items-center gap-2 rounded-lg py-1.5 pr-2.5 pl-2 text-sm outline-none select-none", "data-[highlighted]:bg-pho-secondary data-[highlighted]:text-pho-primary", t),
|
|
53
|
+
...e
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function v({ className: t, ...e }) {
|
|
57
|
+
return /* @__PURE__ */ a(r.GroupLabel, {
|
|
58
|
+
className: o("text-pho-quaternary px-2.5 py-1.5 text-xs font-medium", t),
|
|
59
|
+
...e
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
var I = {
|
|
63
|
+
Root: i,
|
|
64
|
+
Value: s,
|
|
65
|
+
InputGroup: c,
|
|
66
|
+
Input: m,
|
|
67
|
+
Clear: h,
|
|
68
|
+
Portal: l,
|
|
69
|
+
Positioner: d,
|
|
70
|
+
Popup: g,
|
|
71
|
+
List: y,
|
|
72
|
+
Collection: u,
|
|
73
|
+
Empty: x,
|
|
74
|
+
Item: f,
|
|
75
|
+
Group: p,
|
|
76
|
+
GroupLabel: v
|
|
77
|
+
};
|
|
78
|
+
export {
|
|
79
|
+
I as Autocomplete
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
//# sourceMappingURL=autocomplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autocomplete.js","names":[],"sources":["../../src/components/autocomplete/autocomplete.tsx"],"sourcesContent":["import { type ComponentProps, type ElementType } from \"react\";\nimport { Autocomplete as BaseAutocomplete } from \"@base-ui/react/autocomplete\";\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 = BaseAutocomplete.Root;\nconst Value = BaseAutocomplete.Value;\nconst Portal = BaseAutocomplete.Portal;\nconst Group = BaseAutocomplete.Group;\nconst Collection = BaseAutocomplete.Collection;\n\nfunction InputGroup({\n className,\n ...props\n}: StyledProps<typeof BaseAutocomplete.InputGroup>) {\n return (\n <BaseAutocomplete.InputGroup\n className={cn(\"relative flex items-center\", className)}\n {...props}\n />\n );\n}\n\nfunction Input({\n className,\n ...props\n}: StyledProps<typeof BaseAutocomplete.Input>) {\n return (\n <BaseAutocomplete.Input\n className={cn(\n \"squircle bg-pho-primary shadow-pho-xs ring-pho-primary text-pho-primary placeholder:text-pho-placeholder focus-visible:ring-pho-brand w-full rounded-lg px-3 py-2 text-sm ring-1 transition-shadow duration-100 ease-linear outline-none ring-inset focus-visible:ring-2 disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Clear({\n className,\n ...props\n}: StyledProps<typeof BaseAutocomplete.Clear>) {\n return (\n <BaseAutocomplete.Clear\n className={cn(\n \"text-fg-pho-quaternary hover:text-fg-pho-quaternary-hover absolute right-2.5 flex cursor-pointer items-center [&>svg]:size-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Positioner({\n className,\n sideOffset = 6,\n ...props\n}: StyledProps<typeof BaseAutocomplete.Positioner>) {\n return (\n <BaseAutocomplete.Positioner\n sideOffset={sideOffset}\n className={cn(\"z-50 outline-none\", className)}\n {...props}\n />\n );\n}\n\nfunction Popup({\n className,\n ...props\n}: StyledProps<typeof BaseAutocomplete.Popup>) {\n return (\n <BaseAutocomplete.Popup\n className={cn(\n \"squircle bg-pho-primary text-pho-primary shadow-pho-lg ring-pho-interactive w-[var(--anchor-width)] max-w-[var(--available-width)] origin-[var(--transform-origin)] rounded-xl p-1 ring-1 transition-[transform,opacity] duration-150 ease-out outline-none ring-inset\",\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 List({\n className,\n ...props\n}: StyledProps<typeof BaseAutocomplete.List>) {\n return (\n <BaseAutocomplete.List\n className={cn(\n \"max-h-[min(20rem,var(--available-height))] overflow-y-auto overscroll-contain\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Empty({\n className,\n ...props\n}: StyledProps<typeof BaseAutocomplete.Empty>) {\n return (\n <BaseAutocomplete.Empty\n className={cn(\n \"text-pho-tertiary px-2.5 py-6 text-center text-sm empty:m-0 empty:p-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Item({\n className,\n ...props\n}: StyledProps<typeof BaseAutocomplete.Item>) {\n return (\n <BaseAutocomplete.Item\n className={cn(\n \"text-pho-secondary flex cursor-pointer items-center gap-2 rounded-lg py-1.5 pr-2.5 pl-2 text-sm outline-none select-none\",\n \"data-[highlighted]:bg-pho-secondary data-[highlighted]:text-pho-primary\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction GroupLabel({\n className,\n ...props\n}: StyledProps<typeof BaseAutocomplete.GroupLabel>) {\n return (\n <BaseAutocomplete.GroupLabel\n className={cn(\n \"text-pho-quaternary px-2.5 py-1.5 text-xs font-medium\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/**\n * Autocomplete built on Base UI `Autocomplete` — a free-text input that offers\n * matching suggestions as you type. Unlike `Combobox`, the value isn't\n * constrained to the list: the user can submit text that matches no suggestion.\n * Pass `items` to `Autocomplete.Root` and render an `Item` per suggestion.\n */\nexport const Autocomplete = {\n Root,\n Value,\n InputGroup,\n Input,\n Clear,\n Portal,\n Positioner,\n Popup,\n List,\n Collection,\n Empty,\n Item,\n Group,\n GroupLabel,\n};\n"],"mappings":";;;;;AAYA,IAAM,IAAO,EAAiB,MACxB,IAAQ,EAAiB,OACzB,IAAS,EAAiB,QAC1B,IAAQ,EAAiB,OACzB,IAAa,EAAiB;AAEpC,SAAS,EAAW,EAClB,WAAA,GACA,GAAG,EAAA,GAC+C;AAClD,SACE,gBAAA,EAAC,EAAiB,YAAlB;AAAA,IACE,WAAW,EAAG,8BAA8B,CAAS;AAAA,IACrD,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAM,EACb,WAAA,GACA,GAAG,EAAA,GAC0C;AAC7C,SACE,gBAAA,EAAC,EAAiB,OAAlB;AAAA,IACE,WAAW,EACT,4TACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAM,EACb,WAAA,GACA,GAAG,EAAA,GAC0C;AAC7C,SACE,gBAAA,EAAC,EAAiB,OAAlB;AAAA,IACE,WAAW,EACT,gIACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAW,EAClB,WAAA,GACA,YAAA,IAAa,GACb,GAAG,EAAA,GAC+C;AAClD,SACE,gBAAA,EAAC,EAAiB,YAAlB;AAAA,IACc,YAAA;AAAA,IACZ,WAAW,EAAG,qBAAqB,CAAS;AAAA,IAC5C,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAM,EACb,WAAA,GACA,GAAG,EAAA,GAC0C;AAC7C,SACE,gBAAA,EAAC,EAAiB,OAAlB;AAAA,IACE,WAAW,EACT,0QACA,kEACA,8DACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAK,EACZ,WAAA,GACA,GAAG,EAAA,GACyC;AAC5C,SACE,gBAAA,EAAC,EAAiB,MAAlB;AAAA,IACE,WAAW,EACT,iFACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAM,EACb,WAAA,GACA,GAAG,EAAA,GAC0C;AAC7C,SACE,gBAAA,EAAC,EAAiB,OAAlB;AAAA,IACE,WAAW,EACT,yEACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAK,EACZ,WAAA,GACA,GAAG,EAAA,GACyC;AAC5C,SACE,gBAAA,EAAC,EAAiB,MAAlB;AAAA,IACE,WAAW,EACT,4HACA,2EACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAW,EAClB,WAAA,GACA,GAAG,EAAA,GAC+C;AAClD,SACE,gBAAA,EAAC,EAAiB,YAAlB;AAAA,IACE,WAAW,EACT,yDACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAQA,IAAa,IAAe;AAAA,EAC1B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AACF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as s } from "../chunks/cn-D6jQqeRj.js";
|
|
3
|
+
import { t as l } from "../chunks/resolve-variant-CcD8iG5l.js";
|
|
4
|
+
import "react";
|
|
5
|
+
import { jsx as r } from "react/jsx-runtime";
|
|
6
|
+
import { Avatar as i } from "@base-ui/react/avatar";
|
|
7
|
+
var o = {
|
|
8
|
+
sm: {
|
|
9
|
+
classes: "size-8 text-xs",
|
|
10
|
+
description: "Small — dense lists"
|
|
11
|
+
},
|
|
12
|
+
md: {
|
|
13
|
+
classes: "size-10 text-sm",
|
|
14
|
+
description: "Medium — the default"
|
|
15
|
+
},
|
|
16
|
+
lg: {
|
|
17
|
+
classes: "size-12 text-md",
|
|
18
|
+
description: "Large — profile headers"
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
function n({ className: e, size: t = "md", ...a }) {
|
|
22
|
+
return /* @__PURE__ */ r(i.Root, {
|
|
23
|
+
className: s("squircle bg-pho-tertiary text-pho-secondary relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full align-middle font-medium select-none", l(o, t), e),
|
|
24
|
+
...a
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function m({ className: e, ...t }) {
|
|
28
|
+
return /* @__PURE__ */ r(i.Image, {
|
|
29
|
+
className: s("size-full object-cover", e),
|
|
30
|
+
...t
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function c({ className: e, ...t }) {
|
|
34
|
+
return /* @__PURE__ */ r(i.Fallback, {
|
|
35
|
+
className: s("flex size-full items-center justify-center", e),
|
|
36
|
+
...t
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
var x = {
|
|
40
|
+
Root: n,
|
|
41
|
+
Image: m,
|
|
42
|
+
Fallback: c
|
|
43
|
+
};
|
|
44
|
+
export {
|
|
45
|
+
o as AVATAR_SIZES,
|
|
46
|
+
x as Avatar
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.js","names":[],"sources":["../../src/components/avatar/avatar.tsx"],"sourcesContent":["import { type ComponentProps, type ElementType } from \"react\";\nimport { Avatar as BaseAvatar } from \"@base-ui/react/avatar\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant, type VariantMap } from \"../../utils/resolve-variant\";\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\n/** Size axis — three sizes, no `xs`/`xl` (Geist-reductive). `md` is default. */\nexport const AVATAR_SIZES = {\n sm: { classes: \"size-8 text-xs\", description: \"Small — dense lists\" },\n md: { classes: \"size-10 text-sm\", description: \"Medium — the default\" },\n lg: { classes: \"size-12 text-md\", description: \"Large — profile headers\" },\n} satisfies VariantMap;\n\nexport type AvatarSize = keyof typeof AVATAR_SIZES;\n\ninterface RootProps extends StyledProps<typeof BaseAvatar.Root> {\n /** Size variant. @default \"md\" */\n size?: AvatarSize;\n}\n\nfunction Root({ className, size = \"md\", ...props }: RootProps) {\n return (\n <BaseAvatar.Root\n className={cn(\n \"squircle bg-pho-tertiary text-pho-secondary relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full align-middle font-medium select-none\",\n resolveVariant(AVATAR_SIZES, size),\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Image({ className, ...props }: StyledProps<typeof BaseAvatar.Image>) {\n return (\n <BaseAvatar.Image\n className={cn(\"size-full object-cover\", className)}\n {...props}\n />\n );\n}\n\nfunction Fallback({\n className,\n ...props\n}: StyledProps<typeof BaseAvatar.Fallback>) {\n return (\n <BaseAvatar.Fallback\n className={cn(\"flex size-full items-center justify-center\", className)}\n {...props}\n />\n );\n}\n\n/**\n * Avatar built on Base UI `Avatar`. Compose `Avatar.Image` with an\n * `Avatar.Fallback` (initials or icon) that shows while the image loads or if\n * it fails. Set `size` on `Avatar.Root`.\n */\nexport const Avatar = { Root, Image, Fallback };\n"],"mappings":";;;;;;AAcA,IAAa,IAAe;AAAA,EAC1B,IAAI;AAAA,IAAE,SAAS;AAAA,IAAkB,aAAa;AAAA,EAAsB;AAAA,EACpE,IAAI;AAAA,IAAE,SAAS;AAAA,IAAmB,aAAa;AAAA,EAAuB;AAAA,EACtE,IAAI;AAAA,IAAE,SAAS;AAAA,IAAmB,aAAa;AAAA,EAA0B;AAC3E;AASA,SAAS,EAAK,EAAE,WAAA,GAAW,MAAA,IAAO,MAAM,GAAG,EAAA,GAAoB;AAC7D,SACE,gBAAA,EAAC,EAAW,MAAZ;AAAA,IACE,WAAW,EACT,2KACA,EAAe,GAAc,CAAI,GACjC,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAM,EAAE,WAAA,GAAW,GAAG,EAAA,GAA+C;AAC5E,SACE,gBAAA,EAAC,EAAW,OAAZ;AAAA,IACE,WAAW,EAAG,0BAA0B,CAAS;AAAA,IACjD,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAS,EAChB,WAAA,GACA,GAAG,EAAA,GACuC;AAC1C,SACE,gBAAA,EAAC,EAAW,UAAZ;AAAA,IACE,WAAW,EAAG,8CAA8C,CAAS;AAAA,IACrE,GAAI;AAAA,EACL,CAAA;AAEL;AAOA,IAAa,IAAS;AAAA,EAAE,MAAA;AAAA,EAAM,OAAA;AAAA,EAAO,UAAA;AAAS"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as a } from "../chunks/cn-D6jQqeRj.js";
|
|
3
|
+
import { t as i } from "../chunks/resolve-variant-CcD8iG5l.js";
|
|
4
|
+
import "react";
|
|
5
|
+
import { jsx as o } from "react/jsx-runtime";
|
|
6
|
+
var l = a("inline-flex shrink-0 items-center whitespace-nowrap rounded-full font-medium", "bg-current/10 ring-1 ring-current/20 ring-inset"), c = {
|
|
7
|
+
sm: {
|
|
8
|
+
classes: "gap-0.5 px-1.5 py-px text-2xs",
|
|
9
|
+
description: "Small — dense rows, table cells, inline with tight text"
|
|
10
|
+
},
|
|
11
|
+
md: {
|
|
12
|
+
classes: "gap-1 px-2 py-0.5 text-xs",
|
|
13
|
+
description: "Medium — the default"
|
|
14
|
+
}
|
|
15
|
+
}, d = {
|
|
16
|
+
gray: {
|
|
17
|
+
classes: "text-pho-secondary",
|
|
18
|
+
description: "Neutral — the low-signal default"
|
|
19
|
+
},
|
|
20
|
+
brand: {
|
|
21
|
+
classes: "text-pho-brand",
|
|
22
|
+
description: "Brand — plan tiers, feature flags, highlights"
|
|
23
|
+
},
|
|
24
|
+
success: {
|
|
25
|
+
classes: "text-pho-success",
|
|
26
|
+
description: "Success — healthy, live, complete"
|
|
27
|
+
},
|
|
28
|
+
warning: {
|
|
29
|
+
classes: "text-pho-warning",
|
|
30
|
+
description: "Warning — needs attention, degraded"
|
|
31
|
+
},
|
|
32
|
+
error: {
|
|
33
|
+
classes: "text-pho-error",
|
|
34
|
+
description: "Error — failed, blocked, over limit"
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
function p(e) {
|
|
38
|
+
const { color: s = "gray", size: t = "md", className: r } = e ?? {};
|
|
39
|
+
return a(l, i(c, t), i(d, s), r);
|
|
40
|
+
}
|
|
41
|
+
function g({ color: e, size: s, className: t, children: r, ...n }) {
|
|
42
|
+
return /* @__PURE__ */ o("span", {
|
|
43
|
+
className: a(p({
|
|
44
|
+
color: e,
|
|
45
|
+
size: s
|
|
46
|
+
}), t),
|
|
47
|
+
...n,
|
|
48
|
+
children: r
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
g.displayName = "Badge";
|
|
52
|
+
export {
|
|
53
|
+
d as BADGE_COLORS,
|
|
54
|
+
c as BADGE_SIZES,
|
|
55
|
+
g as Badge,
|
|
56
|
+
p as badgeVariants
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.js","names":[],"sources":["../../src/components/badge/badge.tsx"],"sourcesContent":["import { type ComponentProps } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant, type VariantMap } from \"../../utils/resolve-variant\";\n\n/**\n * Design notes (Geist-aligned):\n * - ONE color axis, a tight semantic set (`gray` / `brand` / `success` /\n * `warning` / `error`). Untitled UI's `type` triplication (modern / pill /\n * badge-color) is dropped: a Badge is always the soft \"accent\" material.\n * - The color axis only sets the *text* token; the fill and hairline ring\n * derive from `currentColor` at low opacity, so every color shares one recipe\n * and no per-color background/ring token has to exist.\n * - TWO sizes (`sm` / `md`, default `md`). A badge is inherently small.\n * - The richer Untitled features (dot, icon, avatar, count, dismiss button) are\n * deliberately left out — a dismissible or selectable chip is a Tag, not a\n * Badge, and a badge that triggers an action is a Button.\n */\n\n/** Shared material: pill shape + the currentColor-derived accent fill and ring. */\nconst BADGE_BASE = cn(\n \"inline-flex shrink-0 items-center whitespace-nowrap rounded-full font-medium\",\n \"bg-current/10 ring-1 ring-current/20 ring-inset\",\n);\n\n/** Size axis — padding, gap, and label size. */\nexport const BADGE_SIZES = {\n sm: {\n classes: \"gap-0.5 px-1.5 py-px text-2xs\",\n description: \"Small — dense rows, table cells, inline with tight text\",\n },\n md: {\n classes: \"gap-1 px-2 py-0.5 text-xs\",\n description: \"Medium — the default\",\n },\n} satisfies VariantMap;\n\n/** Color axis — a closed semantic set; each key tints text, fill, and ring. */\nexport const BADGE_COLORS = {\n gray: {\n classes: \"text-pho-secondary\",\n description: \"Neutral — the low-signal default\",\n },\n brand: {\n classes: \"text-pho-brand\",\n description: \"Brand — plan tiers, feature flags, highlights\",\n },\n success: {\n classes: \"text-pho-success\",\n description: \"Success — healthy, live, complete\",\n },\n warning: {\n classes: \"text-pho-warning\",\n description: \"Warning — needs attention, degraded\",\n },\n error: {\n classes: \"text-pho-error\",\n description: \"Error — failed, blocked, over limit\",\n },\n} satisfies VariantMap;\n\nexport type BadgeSize = keyof typeof BADGE_SIZES;\nexport type BadgeColor = keyof typeof BADGE_COLORS;\n\n/** Compose the full class string for a badge — exported for reuse/testing. */\nexport function badgeVariants(opts?: {\n color?: BadgeColor;\n size?: BadgeSize;\n className?: string;\n}): string {\n const { color = \"gray\", size = \"md\", className } = opts ?? {};\n return cn(\n BADGE_BASE,\n resolveVariant(BADGE_SIZES, size),\n resolveVariant(BADGE_COLORS, color),\n className,\n );\n}\n\ninterface BadgeBaseProps {\n /** Semantic color. @default \"gray\" */\n color?: BadgeColor;\n /** Size variant. @default \"md\" */\n size?: BadgeSize;\n}\n\nexport interface BadgeProps\n extends BadgeBaseProps, Omit<ComponentProps<\"span\">, keyof BadgeBaseProps> {}\n\n/**\n * Badge — a small, non-interactive status label: a plan tier (`Pro`), a state\n * (`Live`, `Failed`), a count. It's a plain `<span>`, so it never takes focus or\n * handles clicks — for a dismissible or selectable chip reach for a `Tag`, and\n * for a standalone action use a `Button`. Let `color` carry the meaning and keep\n * the label to a word or two.\n */\nexport function Badge({\n color,\n size,\n className,\n children,\n ...props\n}: BadgeProps) {\n return (\n <span className={cn(badgeVariants({ color, size }), className)} {...props}>\n {children}\n </span>\n );\n}\n\nBadge.displayName = \"Badge\";\n"],"mappings":";;;;;AAmBA,IAAM,IAAa,EACjB,gFACA,iDACF,GAGa,IAAc;AAAA,EACzB,IAAI;AAAA,IACF,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA,IAAI;AAAA,IACF,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AACF,GAGa,IAAe;AAAA,EAC1B,MAAM;AAAA,IACJ,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AACF;AAMA,SAAgB,EAAc,GAInB;AACT,QAAM,EAAE,OAAA,IAAQ,QAAQ,MAAA,IAAO,MAAM,WAAA,EAAA,IAAc,KAAQ,CAAC;AAC5D,SAAO,EACL,GACA,EAAe,GAAa,CAAI,GAChC,EAAe,GAAc,CAAK,GAClC,CACF;AACF;AAmBA,SAAgB,EAAM,EACpB,OAAA,GACA,MAAA,GACA,WAAA,GACA,UAAA,GACA,GAAG,EAAA,GACU;AACb,SACE,gBAAA,EAAC,QAAD;AAAA,IAAM,WAAW,EAAG,EAAc;AAAA,MAAE,OAAA;AAAA,MAAO,MAAA;AAAA,IAAK,CAAC,GAAG,CAAS;AAAA,IAAG,GAAI;AAAA,IACjE,UAAA;AAAA,EACG,CAAA;AAEV;AAEA,EAAM,cAAc"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { a, c as s, d as o, i as T, l as n, n as B, o as u, r as E, s as e, t as f, u as i } from "../chunks/button-9pp4g7en.js";
|
|
3
|
+
import { t as S } from "../chunks/close-button-CbQNfpxU.js";
|
|
4
|
+
export {
|
|
5
|
+
f as BUTTON_SHAPES,
|
|
6
|
+
B as BUTTON_SIZES,
|
|
7
|
+
E as BUTTON_VARIANTS,
|
|
8
|
+
T as Button,
|
|
9
|
+
a as ButtonLink,
|
|
10
|
+
S as CloseButton,
|
|
11
|
+
u as EFFECT_BUTTON_SIZES,
|
|
12
|
+
e as EFFECT_BUTTON_VARIANTS,
|
|
13
|
+
s as EffectButton,
|
|
14
|
+
n as EffectButtonLink,
|
|
15
|
+
i as buttonVariants,
|
|
16
|
+
o as effectButtonVariants
|
|
17
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t } from "../chunks/cn-D6jQqeRj.js";
|
|
3
|
+
import "react";
|
|
4
|
+
import { jsx as e, jsxs as n } from "react/jsx-runtime";
|
|
5
|
+
import { Check as l, Minus as m } from "@phosphor-icons/react";
|
|
6
|
+
import { Checkbox as s } from "@base-ui/react/checkbox";
|
|
7
|
+
import { CheckboxGroup as p } from "@base-ui/react/checkbox-group";
|
|
8
|
+
var h = {
|
|
9
|
+
sm: "size-4",
|
|
10
|
+
md: "size-5"
|
|
11
|
+
}, c = {
|
|
12
|
+
sm: "size-3",
|
|
13
|
+
md: "size-3.5"
|
|
14
|
+
};
|
|
15
|
+
function u({ className: o, label: r, size: a = "md", ...d }) {
|
|
16
|
+
const i = /* @__PURE__ */ e(s.Root, {
|
|
17
|
+
className: t("group/cb squircle outline-pho-brand bg-pho-primary shadow-pho-xs ring-pho-primary flex shrink-0 cursor-pointer items-center justify-center rounded-md text-white ring-1 transition duration-100 ease-linear ring-inset focus-visible:outline-2 focus-visible:outline-offset-2", "data-[checked]:bg-pho-brand-solid data-[checked]:ring-transparent", "data-[indeterminate]:bg-pho-brand-solid data-[indeterminate]:ring-transparent", "data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50", h[a], o),
|
|
18
|
+
...d,
|
|
19
|
+
children: /* @__PURE__ */ n(s.Indicator, {
|
|
20
|
+
className: "flex items-center justify-center",
|
|
21
|
+
children: [/* @__PURE__ */ e(l, {
|
|
22
|
+
weight: "bold",
|
|
23
|
+
className: t(c[a], "group-data-[indeterminate]/cb:hidden")
|
|
24
|
+
}), /* @__PURE__ */ e(m, {
|
|
25
|
+
weight: "bold",
|
|
26
|
+
className: t(c[a], "hidden group-data-[indeterminate]/cb:block")
|
|
27
|
+
})]
|
|
28
|
+
})
|
|
29
|
+
});
|
|
30
|
+
return r ? /* @__PURE__ */ n("label", {
|
|
31
|
+
className: "flex cursor-pointer items-center gap-2 select-none",
|
|
32
|
+
children: [i, /* @__PURE__ */ e("span", {
|
|
33
|
+
className: "text-pho-secondary text-sm",
|
|
34
|
+
children: r
|
|
35
|
+
})]
|
|
36
|
+
}) : i;
|
|
37
|
+
}
|
|
38
|
+
u.displayName = "Checkbox";
|
|
39
|
+
function b({ className: o, ...r }) {
|
|
40
|
+
return /* @__PURE__ */ e(p, {
|
|
41
|
+
className: t("flex flex-col gap-3", o),
|
|
42
|
+
...r
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
b.displayName = "CheckboxGroup";
|
|
46
|
+
export {
|
|
47
|
+
u as Checkbox,
|
|
48
|
+
b as CheckboxGroup
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=checkbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkbox.js","names":[],"sources":["../../src/components/checkbox/checkbox.tsx","../../src/components/checkbox/checkbox-group.tsx"],"sourcesContent":["import { type ComponentProps, type ReactNode } from \"react\";\nimport { Checkbox as BaseCheckbox } from \"@base-ui/react/checkbox\";\nimport { Check, Minus } from \"@phosphor-icons/react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type CheckboxSize = \"sm\" | \"md\";\n\nconst BOX: Record<CheckboxSize, string> = { sm: \"size-4\", md: \"size-5\" };\nconst ICON: Record<CheckboxSize, string> = { sm: \"size-3\", md: \"size-3.5\" };\n\nexport interface CheckboxProps extends Omit<\n ComponentProps<typeof BaseCheckbox.Root>,\n \"className\"\n> {\n className?: string;\n /** Text rendered beside the box; the whole row toggles the checkbox. */\n label?: ReactNode;\n /** Size variant. @default \"md\" */\n size?: CheckboxSize;\n}\n\n/**\n * Checkbox built on Base UI `Checkbox`. Supports checked, unchecked, and\n * `indeterminate` states; pass `label` for a clickable text row, or omit it\n * and provide an `aria-label`. For a set of related options that submit\n * together, wrap them in `CheckboxGroup`.\n */\nexport function Checkbox({\n className,\n label,\n size = \"md\",\n ...props\n}: CheckboxProps) {\n const box = (\n <BaseCheckbox.Root\n className={cn(\n \"group/cb squircle outline-pho-brand bg-pho-primary shadow-pho-xs ring-pho-primary flex shrink-0 cursor-pointer items-center justify-center rounded-md text-white ring-1 transition duration-100 ease-linear ring-inset focus-visible:outline-2 focus-visible:outline-offset-2\",\n \"data-[checked]:bg-pho-brand-solid data-[checked]:ring-transparent\",\n \"data-[indeterminate]:bg-pho-brand-solid data-[indeterminate]:ring-transparent\",\n \"data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\n BOX[size],\n className,\n )}\n {...props}\n >\n <BaseCheckbox.Indicator className=\"flex items-center justify-center\">\n <Check\n weight=\"bold\"\n className={cn(ICON[size], \"group-data-[indeterminate]/cb:hidden\")}\n />\n <Minus\n weight=\"bold\"\n className={cn(\n ICON[size],\n \"hidden group-data-[indeterminate]/cb:block\",\n )}\n />\n </BaseCheckbox.Indicator>\n </BaseCheckbox.Root>\n );\n\n if (!label) return box;\n return (\n <label className=\"flex cursor-pointer items-center gap-2 select-none\">\n {box}\n <span className=\"text-pho-secondary text-sm\">{label}</span>\n </label>\n );\n}\n\nCheckbox.displayName = \"Checkbox\";\n","import { type ComponentProps } from \"react\";\nimport { CheckboxGroup as BaseCheckboxGroup } from \"@base-ui/react/checkbox-group\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface CheckboxGroupProps extends Omit<\n ComponentProps<typeof BaseCheckboxGroup>,\n \"className\"\n> {\n className?: string;\n}\n\n/**\n * Groups related `Checkbox`es and tracks their values as one. Built on Base UI\n * `CheckboxGroup` — supports a parent \"select all\" checkbox via `allValues`.\n * Control with `value` / `onValueChange` or leave uncontrolled with\n * `defaultValue`.\n */\nexport function CheckboxGroup({ className, ...props }: CheckboxGroupProps) {\n return (\n <BaseCheckboxGroup\n className={cn(\"flex flex-col gap-3\", className)}\n {...props}\n />\n );\n}\n\nCheckboxGroup.displayName = \"CheckboxGroup\";\n"],"mappings":";;;;;;;AAOA,IAAM,IAAoC;AAAA,EAAE,IAAI;AAAA,EAAU,IAAI;AAAS,GACjE,IAAqC;AAAA,EAAE,IAAI;AAAA,EAAU,IAAI;AAAW;AAmB1E,SAAgB,EAAS,EACvB,WAAA,GACA,OAAA,GACA,MAAA,IAAO,MACP,GAAG,EAAA,GACa;AAChB,QAAM,IACJ,gBAAA,EAAC,EAAa,MAAd;AAAA,IACE,WAAW,EACT,iRACA,qEACA,iFACA,iEACA,EAAI,CAAA,GACJ,CACF;AAAA,IACA,GAAI;AAAA,cAEJ,gBAAA,EAAC,EAAa,WAAd;AAAA,MAAwB,WAAU;AAAA,gBAAlC,CACE,gBAAA,EAAC,GAAD;AAAA,QACE,QAAO;AAAA,QACP,WAAW,EAAG,EAAK,CAAA,GAAO,sCAAsC;AAAA,MACjE,CAAA,GACD,gBAAA,EAAC,GAAD;AAAA,QACE,QAAO;AAAA,QACP,WAAW,EACT,EAAK,CAAA,GACL,4CACF;AAAA,MACD,CAAA,CACqB;AAAA;EACP,CAAA;AAGrB,SAAK,IAEH,gBAAA,EAAC,SAAD;AAAA,IAAO,WAAU;AAAA,cAAjB,CACG,GACD,gBAAA,EAAC,QAAD;AAAA,MAAM,WAAU;AAAA,gBAA8B;AAAA,IAAY,CAAA,CACrD;AAAA,OALU;AAOrB;AAEA,EAAS,cAAc;ACrDvB,SAAgB,EAAc,EAAE,WAAA,GAAW,GAAG,EAAA,GAA6B;AACzE,SACE,gBAAA,EAAC,GAAD;AAAA,IACE,WAAW,EAAG,uBAAuB,CAAS;AAAA,IAC9C,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,EAAc,cAAc"}
|