@photon-ai/pho-ui 0.7.2 → 1.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.
- package/dist/chunks/avatar-CiAvJNNs.js +99 -0
- package/dist/chunks/avatar-CiAvJNNs.js.map +1 -0
- package/dist/chunks/close-button-8f-oRJXt.js +420 -0
- package/dist/chunks/close-button-8f-oRJXt.js.map +1 -0
- package/dist/chunks/{cn-7uGUzCOM.js → cn-DTiB6ek_.js} +4 -2
- package/dist/chunks/{cn-7uGUzCOM.js.map → cn-DTiB6ek_.js.map} +1 -1
- package/dist/chunks/dialog-Bgb2Z1_v.js +141 -0
- package/dist/chunks/dialog-Bgb2Z1_v.js.map +1 -0
- package/dist/chunks/{input-DbJpdu6v.js → input-BSJGBUbf.js} +36 -36
- package/dist/chunks/input-BSJGBUbf.js.map +1 -0
- package/dist/chunks/menu-COLB_liS.js +205 -0
- package/dist/chunks/menu-COLB_liS.js.map +1 -0
- package/dist/chunks/{sidebar-CivriTLb.js → sidebar-16Pfn7IC.js} +12 -12
- package/dist/chunks/sidebar-16Pfn7IC.js.map +1 -0
- package/dist/chunks/spinner-Cy8bkyJf.js +54 -0
- package/dist/chunks/spinner-Cy8bkyJf.js.map +1 -0
- package/dist/components/accordion.js +21 -21
- package/dist/components/accordion.js.map +1 -1
- package/dist/components/alert-dialog.js +26 -26
- package/dist/components/alert-dialog.js.map +1 -1
- package/dist/components/autocomplete.js +46 -46
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/avatar.js +1 -1
- package/dist/components/badge.js +1 -1
- package/dist/components/button.js +11 -11
- package/dist/components/checkbox.js +3 -3
- package/dist/components/checkbox.js.map +1 -1
- package/dist/components/collapsible.js +8 -8
- package/dist/components/collapsible.js.map +1 -1
- package/dist/components/combobox.js +69 -69
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/context-menu.js +57 -44
- package/dist/components/context-menu.js.map +1 -1
- package/dist/components/dialog.js +3 -2
- package/dist/components/drawer.js +15 -15
- package/dist/components/drawer.js.map +1 -1
- package/dist/components/field.js +18 -18
- package/dist/components/field.js.map +1 -1
- package/dist/components/fieldset.js +9 -9
- package/dist/components/fieldset.js.map +1 -1
- package/dist/components/form.js +1 -1
- package/dist/components/input.js +1 -1
- package/dist/components/kbd.js +6 -6
- package/dist/components/kbd.js.map +1 -1
- package/dist/components/menu.js +6 -4
- package/dist/components/menubar.js +5 -5
- package/dist/components/menubar.js.map +1 -1
- package/dist/components/meter.js +20 -20
- package/dist/components/meter.js.map +1 -1
- package/dist/components/navigation-menu.js +8 -8
- package/dist/components/navigation-menu.js.map +1 -1
- package/dist/components/notification.js +24 -24
- package/dist/components/notification.js.map +1 -1
- package/dist/components/number-field.js +32 -32
- package/dist/components/number-field.js.map +1 -1
- package/dist/components/otp-field.js +5 -5
- package/dist/components/otp-field.js.map +1 -1
- package/dist/components/popover.js +10 -10
- package/dist/components/popover.js.map +1 -1
- package/dist/components/preview-card.js +8 -8
- package/dist/components/preview-card.js.map +1 -1
- package/dist/components/progress.js +25 -25
- package/dist/components/progress.js.map +1 -1
- package/dist/components/radio-group.js +13 -13
- package/dist/components/radio-group.js.map +1 -1
- package/dist/components/scroll-area.js +1 -1
- package/dist/components/select.js +27 -27
- package/dist/components/select.js.map +1 -1
- package/dist/components/separator.js +1 -1
- package/dist/components/slider.js +17 -17
- package/dist/components/slider.js.map +1 -1
- package/dist/components/spinner.js +6 -0
- package/dist/components/switch.js +10 -10
- package/dist/components/switch.js.map +1 -1
- package/dist/components/tabs.js +16 -16
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/theme-toggle.js +199 -0
- package/dist/components/theme-toggle.js.map +1 -0
- package/dist/components/toast.js +24 -24
- package/dist/components/toast.js.map +1 -1
- package/dist/components/toggle-group.js +1 -1
- package/dist/components/toggle.js +5 -5
- package/dist/components/toggle.js.map +1 -1
- package/dist/components/toolbar.js +8 -8
- package/dist/components/toolbar.js.map +1 -1
- package/dist/components/tooltip.js +10 -10
- package/dist/components/tooltip.js.map +1 -1
- package/dist/index.js +29 -28
- package/dist/sections/sidebar.js +1 -1
- package/dist/src/components/avatar/avatar.d.ts +24 -2
- package/dist/src/components/avatar/index.d.ts +1 -1
- package/dist/src/components/button/button.d.ts +58 -44
- package/dist/src/components/button/index.d.ts +1 -1
- package/dist/src/components/dialog/dialog.d.ts +50 -7
- package/dist/src/components/dialog/index.d.ts +1 -1
- package/dist/src/components/menu/index.d.ts +1 -1
- package/dist/src/components/menu/menu-pending.d.ts +43 -0
- package/dist/src/components/spinner/index.d.ts +1 -0
- package/dist/src/components/spinner/spinner.d.ts +32 -0
- package/dist/src/components/theme-toggle/index.d.ts +1 -0
- package/dist/src/components/theme-toggle/theme-toggle.d.ts +77 -0
- package/dist/src/sections/sidebar/sidebar.d.ts +5 -6
- package/dist/utils.js +1 -1
- package/package.json +9 -1
- package/src/styles/fonts.css +14 -18
- package/src/styles/pho.css +5 -1
- package/src/styles/theme.css +182 -146
- package/dist/chunks/avatar-Bb4RZQIa.js +0 -53
- package/dist/chunks/avatar-Bb4RZQIa.js.map +0 -1
- package/dist/chunks/button-CQ4cZvkC.js +0 -365
- package/dist/chunks/button-CQ4cZvkC.js.map +0 -1
- package/dist/chunks/close-button-CNhn8z0w.js +0 -29
- package/dist/chunks/close-button-CNhn8z0w.js.map +0 -1
- package/dist/chunks/dialog-7oOe-eaO.js +0 -63
- package/dist/chunks/dialog-7oOe-eaO.js.map +0 -1
- package/dist/chunks/input-DbJpdu6v.js.map +0 -1
- package/dist/chunks/menu-BfaNHnOp.js +0 -101
- package/dist/chunks/menu-BfaNHnOp.js.map +0 -1
- package/dist/chunks/sidebar-CivriTLb.js.map +0 -1
- package/dist/src/components/context-menu/context-menu.d.ts +0 -34
- package/dist/src/components/menu/menu.d.ts +0 -47
|
@@ -1,47 +1,47 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { t as
|
|
2
|
+
import { t as o } from "../chunks/cn-DTiB6ek_.js";
|
|
3
3
|
import "react";
|
|
4
|
-
import { jsx as
|
|
5
|
-
import { Slider as
|
|
4
|
+
import { jsx as n } from "react/jsx-runtime";
|
|
5
|
+
import { Slider as r } from "@base-ui/react/slider";
|
|
6
6
|
function l({ className: e, ...t }) {
|
|
7
|
-
return /* @__PURE__ */
|
|
8
|
-
className:
|
|
7
|
+
return /* @__PURE__ */ n(r.Root, {
|
|
8
|
+
className: o("flex w-full flex-col gap-3", e),
|
|
9
9
|
...t
|
|
10
10
|
});
|
|
11
11
|
}
|
|
12
12
|
function a({ className: e, ...t }) {
|
|
13
|
-
return /* @__PURE__ */
|
|
14
|
-
className:
|
|
13
|
+
return /* @__PURE__ */ n(r.Label, {
|
|
14
|
+
className: o("text-pho-secondary text-base font-medium", e),
|
|
15
15
|
...t
|
|
16
16
|
});
|
|
17
17
|
}
|
|
18
18
|
function i({ className: e, ...t }) {
|
|
19
|
-
return /* @__PURE__ */
|
|
20
|
-
className:
|
|
19
|
+
return /* @__PURE__ */ n(r.Value, {
|
|
20
|
+
className: o("text-pho-secondary text-base tabular-nums", e),
|
|
21
21
|
...t
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
24
|
function u({ className: e, ...t }) {
|
|
25
|
-
return /* @__PURE__ */
|
|
26
|
-
className:
|
|
25
|
+
return /* @__PURE__ */ n(r.Control, {
|
|
26
|
+
className: o("relative flex w-full touch-none items-center py-2 select-none", e),
|
|
27
27
|
...t
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
30
|
function s({ className: e, ...t }) {
|
|
31
|
-
return /* @__PURE__ */
|
|
32
|
-
className:
|
|
31
|
+
return /* @__PURE__ */ n(r.Track, {
|
|
32
|
+
className: o("bg-pho-secondary relative h-1.5 w-full rounded-full", e),
|
|
33
33
|
...t
|
|
34
34
|
});
|
|
35
35
|
}
|
|
36
36
|
function c({ className: e, ...t }) {
|
|
37
|
-
return /* @__PURE__ */
|
|
38
|
-
className:
|
|
37
|
+
return /* @__PURE__ */ n(r.Indicator, {
|
|
38
|
+
className: o("bg-pho-brand-solid rounded-full", e),
|
|
39
39
|
...t
|
|
40
40
|
});
|
|
41
41
|
}
|
|
42
42
|
function f({ className: e, ...t }) {
|
|
43
|
-
return /* @__PURE__ */
|
|
44
|
-
className:
|
|
43
|
+
return /* @__PURE__ */ n(r.Thumb, {
|
|
44
|
+
className: o("outline-pho-brand size-4 rounded-full bg-white ring-1 ring-black/15 transition focus-visible:outline-2 focus-visible:outline-offset-2 data-[disabled]:opacity-50", e),
|
|
45
45
|
...t
|
|
46
46
|
});
|
|
47
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slider.js","names":[],"sources":["../../src/components/slider/slider.tsx"],"sourcesContent":["import { type ComponentProps, type ElementType } from \"react\";\nimport { Slider as BaseSlider } from \"@base-ui/react/slider\";\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 BaseSlider.Root>) {\n return (\n <BaseSlider.Root\n className={cn(\"flex w-full flex-col gap-3\", className)}\n {...props}\n />\n );\n}\n\nfunction Label({ className, ...props }: StyledProps<typeof BaseSlider.Label>) {\n return (\n <BaseSlider.Label\n className={cn(\"text-pho-secondary text-
|
|
1
|
+
{"version":3,"file":"slider.js","names":[],"sources":["../../src/components/slider/slider.tsx"],"sourcesContent":["import { type ComponentProps, type ElementType } from \"react\";\nimport { Slider as BaseSlider } from \"@base-ui/react/slider\";\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 BaseSlider.Root>) {\n return (\n <BaseSlider.Root\n className={cn(\"flex w-full flex-col gap-3\", className)}\n {...props}\n />\n );\n}\n\nfunction Label({ className, ...props }: StyledProps<typeof BaseSlider.Label>) {\n return (\n <BaseSlider.Label\n className={cn(\"text-pho-secondary text-base font-medium\", className)}\n {...props}\n />\n );\n}\n\nfunction Value({ className, ...props }: StyledProps<typeof BaseSlider.Value>) {\n return (\n <BaseSlider.Value\n className={cn(\"text-pho-secondary text-base tabular-nums\", className)}\n {...props}\n />\n );\n}\n\nfunction Control({\n className,\n ...props\n}: StyledProps<typeof BaseSlider.Control>) {\n return (\n <BaseSlider.Control\n className={cn(\n \"relative flex w-full touch-none items-center py-2 select-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Track({ className, ...props }: StyledProps<typeof BaseSlider.Track>) {\n return (\n <BaseSlider.Track\n className={cn(\n \"bg-pho-secondary relative h-1.5 w-full rounded-full\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Indicator({\n className,\n ...props\n}: StyledProps<typeof BaseSlider.Indicator>) {\n return (\n <BaseSlider.Indicator\n className={cn(\"bg-pho-brand-solid rounded-full\", className)}\n {...props}\n />\n );\n}\n\nfunction Thumb({ className, ...props }: StyledProps<typeof BaseSlider.Thumb>) {\n return (\n <BaseSlider.Thumb\n // Flat white circle in both modes. The edge is a FIXED black/15\n // hairline: the thumb is always white, and in dark mode it rides a\n // white filled range (brand-solid), where any light-dark ring would\n // resolve white-on-white and vanish.\n className={cn(\n \"outline-pho-brand size-4 rounded-full bg-white ring-1 ring-black/15 transition focus-visible:outline-2 focus-visible:outline-offset-2 data-[disabled]:opacity-50\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/**\n * Slider built on Base UI `Slider` for picking a number (or range) along a\n * track. Compose a header with `Slider.Label` + `Slider.Value`, then\n * `Slider.Control` → `Track` → `Indicator` + `Thumb`. Set `value` /\n * `defaultValue`, `min`, `max`, `step` on `Slider.Root`. For a precise typed\n * number, prefer `NumberField`.\n */\nexport const Slider = {\n Root,\n Label,\n Value,\n Control,\n Track,\n Indicator,\n Thumb,\n};\n"],"mappings":";;;;;AAYA,SAAS,EAAK,EAAE,WAAA,GAAW,GAAG,EAAA,GAA8C;AAC1E,SACE,gBAAA,EAAC,EAAW,MAAZ;AAAA,IACE,WAAW,EAAG,8BAA8B,CAAS;AAAA,IACrD,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,4CAA4C,CAAS;AAAA,IACnE,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,6CAA6C,CAAS;AAAA,IACpE,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAQ,EACf,WAAA,GACA,GAAG,EAAA,GACsC;AACzC,SACE,gBAAA,EAAC,EAAW,SAAZ;AAAA,IACE,WAAW,EACT,iEACA,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,EACT,uDACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAU,EACjB,WAAA,GACA,GAAG,EAAA,GACwC;AAC3C,SACE,gBAAA,EAAC,EAAW,WAAZ;AAAA,IACE,WAAW,EAAG,mCAAmC,CAAS;AAAA,IAC1D,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAM,EAAE,WAAA,GAAW,GAAG,EAAA,GAA+C;AAC5E,SACE,gBAAA,EAAC,EAAW,OAAZ;AAAA,IAKE,WAAW,EACT,oKACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AASA,IAAa,IAAS;AAAA,EACpB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AACF"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { t as e } from "../chunks/cn-
|
|
2
|
+
import { t as e } from "../chunks/cn-DTiB6ek_.js";
|
|
3
3
|
import "react";
|
|
4
4
|
import { jsx as a } from "react/jsx-runtime";
|
|
5
|
-
import { Switch as
|
|
6
|
-
var
|
|
5
|
+
import { Switch as i } from "@base-ui/react/switch";
|
|
6
|
+
var o = {
|
|
7
7
|
sm: {
|
|
8
8
|
track: "h-5 w-9",
|
|
9
9
|
thumb: "size-4 data-[checked]:translate-x-4"
|
|
@@ -13,16 +13,16 @@ var r = {
|
|
|
13
13
|
thumb: "size-5 data-[checked]:translate-x-5"
|
|
14
14
|
}
|
|
15
15
|
};
|
|
16
|
-
function
|
|
17
|
-
return /* @__PURE__ */ a(
|
|
18
|
-
className: e("bg-pho-
|
|
19
|
-
...
|
|
20
|
-
children: /* @__PURE__ */ a(
|
|
16
|
+
function n({ className: r, size: t = "md", ...s }) {
|
|
17
|
+
return /* @__PURE__ */ a(i.Root, {
|
|
18
|
+
className: e("bg-pho-secondary outline-pho-brand relative inline-flex shrink-0 cursor-pointer items-center rounded-full p-0.5 transition-colors duration-150 ease-out focus-visible:outline-2 focus-visible:outline-offset-2", "data-[checked]:bg-pho-success-solid", "data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50", o[t].track, r),
|
|
19
|
+
...s,
|
|
20
|
+
children: /* @__PURE__ */ a(i.Thumb, { className: e("pointer-events-none block rounded-full bg-white ring-1 ring-black/15 transition-[translate,box-shadow] duration-150 ease-out ring-inset data-[checked]:ring-0", o[t].thumb) })
|
|
21
21
|
});
|
|
22
22
|
}
|
|
23
|
-
|
|
23
|
+
n.displayName = "Switch";
|
|
24
24
|
export {
|
|
25
|
-
|
|
25
|
+
n as Switch
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
//# sourceMappingURL=switch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"switch.js","names":[],"sources":["../../src/components/switch/switch.tsx"],"sourcesContent":["import { type ComponentProps } from \"react\";\nimport { Switch as BaseSwitch } from \"@base-ui/react/switch\";\nimport { cn } from \"../../utils/cn\";\n\nexport type SwitchSize = \"sm\" | \"md\";\n\nconst SIZE: Record<SwitchSize, { track: string; thumb: string }> = {\n sm: { track: \"h-5 w-9\", thumb: \"size-4 data-[checked]:translate-x-4\" },\n md: { track: \"h-6 w-11\", thumb: \"size-5 data-[checked]:translate-x-5\" },\n};\n\nexport interface SwitchProps extends Omit<\n ComponentProps<typeof BaseSwitch.Root>,\n \"className\"\n> {\n className?: string;\n /** Size variant. @default \"md\" */\n size?: SwitchSize;\n}\n\n/**\n * On/off toggle built on Base UI `Switch`. Use a switch for a setting that\n * takes effect immediately; use a `Checkbox` for a value confirmed on submit.\n * Controlled via `checked` / `onCheckedChange` or uncontrolled via\n * `defaultChecked`. Always provide a label or `aria-label`.\n */\nexport function Switch({ className, size = \"md\", ...props }: SwitchProps) {\n return (\n <BaseSwitch.Root\n className={cn(\n \"bg-pho-
|
|
1
|
+
{"version":3,"file":"switch.js","names":[],"sources":["../../src/components/switch/switch.tsx"],"sourcesContent":["import { type ComponentProps } from \"react\";\nimport { Switch as BaseSwitch } from \"@base-ui/react/switch\";\nimport { cn } from \"../../utils/cn\";\n\nexport type SwitchSize = \"sm\" | \"md\";\n\nconst SIZE: Record<SwitchSize, { track: string; thumb: string }> = {\n sm: { track: \"h-5 w-9\", thumb: \"size-4 data-[checked]:translate-x-4\" },\n md: { track: \"h-6 w-11\", thumb: \"size-5 data-[checked]:translate-x-5\" },\n};\n\nexport interface SwitchProps extends Omit<\n ComponentProps<typeof BaseSwitch.Root>,\n \"className\"\n> {\n className?: string;\n /** Size variant. @default \"md\" */\n size?: SwitchSize;\n}\n\n/**\n * On/off toggle built on Base UI `Switch`. Use a switch for a setting that\n * takes effect immediately; use a `Checkbox` for a value confirmed on submit.\n * Controlled via `checked` / `onCheckedChange` or uncontrolled via\n * `defaultChecked`. Always provide a label or `aria-label`.\n */\nexport function Switch({ className, size = \"md\", ...props }: SwitchProps) {\n return (\n <BaseSwitch.Root\n className={cn(\n \"bg-pho-secondary outline-pho-brand relative inline-flex shrink-0 cursor-pointer items-center rounded-full p-0.5 transition-colors duration-150 ease-out focus-visible:outline-2 focus-visible:outline-offset-2\",\n // Success solid (green) — not brand-solid. Brand flips to white in dark\n // mode and the whole switch reads as a photographic negative.\n \"data-[checked]:bg-pho-success-solid\",\n \"data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\n SIZE[size].track,\n className,\n )}\n {...props}\n >\n {/* Thumb stays white in both states — success-solid is green in light and\n dark, so white always contrasts. Off-track is near-white in light mode,\n so a hairline keeps the thumb from vanishing; drop it when checked or\n the inset black/15 muddies the white circle on green. Tailwind v4's\n translate-x-* animates via `translate`, so it must be in the list. */}\n <BaseSwitch.Thumb\n className={cn(\n \"pointer-events-none block rounded-full bg-white ring-1 ring-black/15 transition-[translate,box-shadow] duration-150 ease-out ring-inset data-[checked]:ring-0\",\n SIZE[size].thumb,\n )}\n />\n </BaseSwitch.Root>\n );\n}\n\nSwitch.displayName = \"Switch\";\n"],"mappings":";;;;;AAMA,IAAM,IAA6D;AAAA,EACjE,IAAI;AAAA,IAAE,OAAO;AAAA,IAAW,OAAO;AAAA,EAAsC;AAAA,EACrE,IAAI;AAAA,IAAE,OAAO;AAAA,IAAY,OAAO;AAAA,EAAsC;AACxE;AAiBA,SAAgB,EAAO,EAAE,WAAA,GAAW,MAAA,IAAO,MAAM,GAAG,EAAA,GAAsB;AACxE,SACE,gBAAA,EAAC,EAAW,MAAZ;AAAA,IACE,WAAW,EACT,kNAGA,uCACA,iEACA,EAAK,CAAA,EAAM,OACX,CACF;AAAA,IACA,GAAI;AAAA,cAOJ,gBAAA,EAAC,EAAW,OAAZ,EACE,WAAW,EACT,iKACA,EAAK,CAAA,EAAM,KACb,EACD,CAAA;AAAA,EACc,CAAA;AAErB;AAEA,EAAO,cAAc"}
|
package/dist/components/tabs.js
CHANGED
|
@@ -1,42 +1,42 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { t as
|
|
2
|
+
import { t as a } from "../chunks/cn-DTiB6ek_.js";
|
|
3
3
|
import "react";
|
|
4
|
-
import { jsx as
|
|
4
|
+
import { jsx as r } from "react/jsx-runtime";
|
|
5
5
|
import { Tabs as o } from "@base-ui/react/tabs";
|
|
6
|
-
var
|
|
7
|
-
function
|
|
8
|
-
return /* @__PURE__ */
|
|
9
|
-
className:
|
|
6
|
+
var s = o.Root;
|
|
7
|
+
function i({ className: e, ...t }) {
|
|
8
|
+
return /* @__PURE__ */ r(o.List, {
|
|
9
|
+
className: a("relative flex items-center gap-1", e),
|
|
10
10
|
...t
|
|
11
11
|
});
|
|
12
12
|
}
|
|
13
13
|
function n({ className: e, ...t }) {
|
|
14
|
-
return /* @__PURE__ */
|
|
15
|
-
className:
|
|
14
|
+
return /* @__PURE__ */ r(o.Tab, {
|
|
15
|
+
className: a("outline-pho-brand text-pho-secondary hover:bg-pho-ghost-hover hover:text-pho-secondary-hover rounded-base relative z-10 cursor-pointer px-3 py-1.5 text-base font-medium transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2", "aria-selected:bg-pho-inverse aria-selected:text-pho-inverse aria-selected:hover:bg-pho-inverse", e),
|
|
16
16
|
...t
|
|
17
17
|
});
|
|
18
18
|
}
|
|
19
19
|
function l({ className: e, ...t }) {
|
|
20
|
-
return /* @__PURE__ */
|
|
21
|
-
className:
|
|
20
|
+
return /* @__PURE__ */ r(o.Indicator, {
|
|
21
|
+
className: a("bg-pho-inverse rounded-base absolute top-1/2 left-0 z-0 h-[var(--active-tab-height)] w-[var(--active-tab-width)] translate-x-[var(--active-tab-left)] -translate-y-1/2 transition-[translate,width] duration-200 ease-out", e),
|
|
22
22
|
...t
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
25
|
function c({ className: e, ...t }) {
|
|
26
|
-
return /* @__PURE__ */
|
|
27
|
-
className:
|
|
26
|
+
return /* @__PURE__ */ r(o.Panel, {
|
|
27
|
+
className: a("outline-pho-brand text-pho-secondary py-4 text-base focus-visible:outline-2 focus-visible:-outline-offset-2", e),
|
|
28
28
|
...t
|
|
29
29
|
});
|
|
30
30
|
}
|
|
31
|
-
var
|
|
32
|
-
Root:
|
|
33
|
-
List:
|
|
31
|
+
var p = {
|
|
32
|
+
Root: s,
|
|
33
|
+
List: i,
|
|
34
34
|
Tab: n,
|
|
35
35
|
Indicator: l,
|
|
36
36
|
Panel: c
|
|
37
37
|
};
|
|
38
38
|
export {
|
|
39
|
-
|
|
39
|
+
p as Tabs
|
|
40
40
|
};
|
|
41
41
|
|
|
42
42
|
//# sourceMappingURL=tabs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.js","names":[],"sources":["../../src/components/tabs/tabs.tsx"],"sourcesContent":["import { type ComponentProps, type ElementType } from \"react\";\nimport { Tabs as BaseTabs } from \"@base-ui/react/tabs\";\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 = BaseTabs.Root;\n\nfunction List({ className, ...props }: StyledProps<typeof BaseTabs.List>) {\n return (\n <BaseTabs.List\n className={cn(\n // Flat chip row — the site Tab has no underline or hairline.\n \"relative flex items-center gap-1\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Tab({ className, ...props }: StyledProps<typeof BaseTabs.Tab>) {\n return (\n <BaseTabs.Tab\n className={cn(\n // Site Tab spec: 8px radius; inactive = tertiary label with the quiet\n // ghost-hover wash; active = the inverted chip (dark chip in light\n // mode, light chip in dark) — visible on any surface.\n \"outline-pho-brand text-pho-
|
|
1
|
+
{"version":3,"file":"tabs.js","names":[],"sources":["../../src/components/tabs/tabs.tsx"],"sourcesContent":["import { type ComponentProps, type ElementType } from \"react\";\nimport { Tabs as BaseTabs } from \"@base-ui/react/tabs\";\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 = BaseTabs.Root;\n\nfunction List({ className, ...props }: StyledProps<typeof BaseTabs.List>) {\n return (\n <BaseTabs.List\n className={cn(\n // Flat chip row — the site Tab has no underline or hairline.\n \"relative flex items-center gap-1\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Tab({ className, ...props }: StyledProps<typeof BaseTabs.Tab>) {\n return (\n <BaseTabs.Tab\n className={cn(\n // Site Tab spec: 8px radius; inactive = tertiary label with the quiet\n // ghost-hover wash; active = the inverted chip (dark chip in light\n // mode, light chip in dark) — visible on any surface.\n \"outline-pho-brand text-pho-secondary hover:bg-pho-ghost-hover hover:text-pho-secondary-hover rounded-base relative z-10 cursor-pointer px-3 py-1.5 text-base font-medium transition-colors focus-visible:outline-2 focus-visible:-outline-offset-2\",\n // Base UI marks the active tab with aria-selected/data-active (there\n // is no data-selected attribute on Tab).\n \"aria-selected:bg-pho-inverse aria-selected:text-pho-inverse aria-selected:hover:bg-pho-inverse\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Indicator({\n className,\n ...props\n}: StyledProps<typeof BaseTabs.Indicator>) {\n return (\n <BaseTabs.Indicator\n // A sliding copy of the active chip, behind the tabs (z-0). Optional:\n // the Tab paints its own inverse fill, so omitting the Indicator loses\n // only the slide, never the selected state.\n className={cn(\n \"bg-pho-inverse rounded-base absolute top-1/2 left-0 z-0 h-[var(--active-tab-height)] w-[var(--active-tab-width)] translate-x-[var(--active-tab-left)] -translate-y-1/2 transition-[translate,width] duration-200 ease-out\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Panel({ className, ...props }: StyledProps<typeof BaseTabs.Panel>) {\n return (\n <BaseTabs.Panel\n className={cn(\n \"outline-pho-brand text-pho-secondary py-4 text-base focus-visible:outline-2 focus-visible:-outline-offset-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/**\n * Tabbed sections built on Base UI `Tabs`, with an underline `Indicator` that\n * slides to the active tab. Each `Tabs.Tab` and `Tabs.Panel` share a `value`.\n * Control with `value` / `onValueChange` or leave uncontrolled via\n * `defaultValue`.\n */\nexport const Tabs = { Root, List, Tab, Indicator, Panel };\n"],"mappings":";;;;;AAYA,IAAM,IAAO,EAAS;AAEtB,SAAS,EAAK,EAAE,WAAA,GAAW,GAAG,EAAA,GAA4C;AACxE,SACE,gBAAA,EAAC,EAAS,MAAV;AAAA,IACE,WAAW,EAET,oCACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAI,EAAE,WAAA,GAAW,GAAG,EAAA,GAA2C;AACtE,SACE,gBAAA,EAAC,EAAS,KAAV;AAAA,IACE,WAAW,EAIT,sPAGA,kGACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAU,EACjB,WAAA,GACA,GAAG,EAAA,GACsC;AACzC,SACE,gBAAA,EAAC,EAAS,WAAV;AAAA,IAIE,WAAW,EACT,6NACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAM,EAAE,WAAA,GAAW,GAAG,EAAA,GAA6C;AAC1E,SACE,gBAAA,EAAC,EAAS,OAAV;AAAA,IACE,WAAW,EACT,+GACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAQA,IAAa,IAAO;AAAA,EAAE,MAAA;AAAA,EAAM,MAAA;AAAA,EAAM,KAAA;AAAA,EAAK,WAAA;AAAA,EAAW,OAAA;AAAM"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as _ } from "../chunks/cn-DTiB6ek_.js";
|
|
3
|
+
import { t as y } from "../chunks/createReactComponent-BqCmnqfX.js";
|
|
4
|
+
import { useEffect as v, useSyncExternalStore as $ } from "react";
|
|
5
|
+
import { jsx as h } from "react/jsx-runtime";
|
|
6
|
+
var j = [
|
|
7
|
+
["path", {
|
|
8
|
+
d: "M3 5a1 1 0 0 1 1 -1h16a1 1 0 0 1 1 1v10a1 1 0 0 1 -1 1h-16a1 1 0 0 1 -1 -1v-10",
|
|
9
|
+
key: "svg-0"
|
|
10
|
+
}],
|
|
11
|
+
["path", {
|
|
12
|
+
d: "M7 20h10",
|
|
13
|
+
key: "svg-1"
|
|
14
|
+
}],
|
|
15
|
+
["path", {
|
|
16
|
+
d: "M9 16v4",
|
|
17
|
+
key: "svg-2"
|
|
18
|
+
}],
|
|
19
|
+
["path", {
|
|
20
|
+
d: "M15 16v4",
|
|
21
|
+
key: "svg-3"
|
|
22
|
+
}]
|
|
23
|
+
], G = y("outline", "device-desktop", "DeviceDesktop", j), U = [["path", {
|
|
24
|
+
d: "M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454l0 .008",
|
|
25
|
+
key: "svg-0"
|
|
26
|
+
}]], V = y("outline", "moon", "Moon", U), Y = [["path", {
|
|
27
|
+
d: "M8 12a4 4 0 1 0 8 0a4 4 0 1 0 -8 0",
|
|
28
|
+
key: "svg-0"
|
|
29
|
+
}], ["path", {
|
|
30
|
+
d: "M3 12h1m8 -9v1m8 8h1m-9 8v1m-6.4 -15.4l.7 .7m12.1 -.7l-.7 .7m0 11.4l.7 .7m-12.1 -.7l-.7 .7",
|
|
31
|
+
key: "svg-1"
|
|
32
|
+
}]], Z = y("outline", "sun", "Sun", Y), b = "pho-mode", u = "pho-themechange", p = [
|
|
33
|
+
{
|
|
34
|
+
value: "device",
|
|
35
|
+
label: "Device",
|
|
36
|
+
Icon: G
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
value: "light",
|
|
40
|
+
label: "Light",
|
|
41
|
+
Icon: Z
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
value: "dark",
|
|
45
|
+
label: "Dark",
|
|
46
|
+
Icon: V
|
|
47
|
+
}
|
|
48
|
+
], B = {
|
|
49
|
+
sm: {
|
|
50
|
+
track: "gap-0.5 rounded-base p-0.5",
|
|
51
|
+
item: "size-7 rounded-[calc(var(--radius-base)-2px)] [&>svg]:size-3.5"
|
|
52
|
+
},
|
|
53
|
+
md: {
|
|
54
|
+
track: "gap-0.5 rounded-base p-0.5",
|
|
55
|
+
item: "size-8 rounded-[calc(var(--radius-base)-2px)] [&>svg]:size-4"
|
|
56
|
+
},
|
|
57
|
+
lg: {
|
|
58
|
+
track: "gap-1 rounded-base p-1",
|
|
59
|
+
item: "size-9 rounded-[calc(var(--radius-base)-4px)] [&>svg]:size-5"
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
function F(e) {
|
|
63
|
+
return e === "light" || e === "dark" || e === "device" ? e : "device";
|
|
64
|
+
}
|
|
65
|
+
function M(e, n = typeof window < "u" ? window.matchMedia("(prefers-color-scheme: dark)") : { matches: !1 }) {
|
|
66
|
+
return e === "light" || e === "dark" ? e : n.matches ? "dark" : "light";
|
|
67
|
+
}
|
|
68
|
+
function l(e) {
|
|
69
|
+
return typeof e == "function" ? e() : e !== void 0 ? e : typeof document > "u" ? null : document.documentElement;
|
|
70
|
+
}
|
|
71
|
+
var s = null, g = null, k = /* @__PURE__ */ new Map();
|
|
72
|
+
function w(e) {
|
|
73
|
+
if (e == null || typeof localStorage > "u") return null;
|
|
74
|
+
const n = localStorage.getItem(e);
|
|
75
|
+
return n == null ? null : F(n);
|
|
76
|
+
}
|
|
77
|
+
function J(e = b) {
|
|
78
|
+
return s ?? w(e) ?? "device";
|
|
79
|
+
}
|
|
80
|
+
function re(e = typeof document > "u" ? null : document.documentElement) {
|
|
81
|
+
return e?.dataset.mode === "dark" ? "dark" : "light";
|
|
82
|
+
}
|
|
83
|
+
function T(e, n) {
|
|
84
|
+
n && (e === "dark" ? n.dataset.mode = "dark" : delete n.dataset.mode);
|
|
85
|
+
}
|
|
86
|
+
function Q(e) {
|
|
87
|
+
if (g?.(), g = null, typeof window > "u" || J(e) !== "device") return;
|
|
88
|
+
const n = window.matchMedia("(prefers-color-scheme: dark)"), r = () => {
|
|
89
|
+
T(M("device", n), document.documentElement), window.dispatchEvent(new Event(u));
|
|
90
|
+
};
|
|
91
|
+
n.addEventListener("change", r), g = () => n.removeEventListener("change", r);
|
|
92
|
+
}
|
|
93
|
+
function W(e, n) {
|
|
94
|
+
if (N(e), typeof window > "u" || n !== "device") return;
|
|
95
|
+
const r = window.matchMedia("(prefers-color-scheme: dark)"), t = () => {
|
|
96
|
+
T(M("device", r), e);
|
|
97
|
+
};
|
|
98
|
+
r.addEventListener("change", t), k.set(e, () => r.removeEventListener("change", t));
|
|
99
|
+
}
|
|
100
|
+
function N(e) {
|
|
101
|
+
e && (k.get(e)?.(), k.delete(e));
|
|
102
|
+
}
|
|
103
|
+
function E(e, n) {
|
|
104
|
+
const r = n && "storageKey" in n ? n.storageKey : b, t = n?.target ?? (typeof document > "u" ? null : document.documentElement), i = typeof document > "u" || t == null || t === document.documentElement;
|
|
105
|
+
if (T(M(e), t), !i) {
|
|
106
|
+
t && W(t, e);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
s = e, r != null && typeof localStorage < "u" && localStorage.setItem(r, e), Q(r ?? null), typeof window < "u" && window.dispatchEvent(new Event(u));
|
|
110
|
+
}
|
|
111
|
+
function X(e) {
|
|
112
|
+
return typeof window > "u" ? () => {
|
|
113
|
+
} : (window.addEventListener(u, e), () => window.removeEventListener(u, e));
|
|
114
|
+
}
|
|
115
|
+
function D(e, n) {
|
|
116
|
+
n.modeProp === void 0 && E(e, {
|
|
117
|
+
target: l(n.target),
|
|
118
|
+
storageKey: n.storageKey
|
|
119
|
+
}), n.onModeChange?.(e);
|
|
120
|
+
}
|
|
121
|
+
function K({ mode: e, defaultMode: n = "device", onModeChange: r, storageKey: t = b, target: i, size: z = "md", className: A, "aria-label": C = "Theme", ...H }) {
|
|
122
|
+
const O = $(X, () => s ?? w(t) ?? n, () => n);
|
|
123
|
+
v(() => {
|
|
124
|
+
e === void 0 && E(s ?? w(t) ?? n, {
|
|
125
|
+
target: l(i),
|
|
126
|
+
storageKey: t
|
|
127
|
+
});
|
|
128
|
+
}, [
|
|
129
|
+
e,
|
|
130
|
+
t,
|
|
131
|
+
i,
|
|
132
|
+
n
|
|
133
|
+
]), v(() => {
|
|
134
|
+
e !== void 0 && E(e, {
|
|
135
|
+
target: l(i),
|
|
136
|
+
storageKey: t
|
|
137
|
+
});
|
|
138
|
+
}, [
|
|
139
|
+
e,
|
|
140
|
+
t,
|
|
141
|
+
i
|
|
142
|
+
]), v(() => () => {
|
|
143
|
+
const a = l(i);
|
|
144
|
+
a && a !== document.documentElement && N(a);
|
|
145
|
+
}, [i]);
|
|
146
|
+
const x = e ?? O, S = B[z];
|
|
147
|
+
return /* @__PURE__ */ h("div", {
|
|
148
|
+
role: "radiogroup",
|
|
149
|
+
"aria-label": C,
|
|
150
|
+
...H,
|
|
151
|
+
className: _("ring-pho-interactive inline-flex items-center ring-1 ring-inset", S.track, A),
|
|
152
|
+
children: p.map(({ value: a, label: R, Icon: q }) => {
|
|
153
|
+
const f = x === a;
|
|
154
|
+
return /* @__PURE__ */ h("button", {
|
|
155
|
+
type: "button",
|
|
156
|
+
role: "radio",
|
|
157
|
+
"aria-checked": f,
|
|
158
|
+
"aria-label": R,
|
|
159
|
+
tabIndex: f ? 0 : -1,
|
|
160
|
+
onClick: () => D(a, {
|
|
161
|
+
modeProp: e,
|
|
162
|
+
storageKey: t,
|
|
163
|
+
target: i,
|
|
164
|
+
onModeChange: r
|
|
165
|
+
}),
|
|
166
|
+
onKeyDown: (d) => {
|
|
167
|
+
const o = p.map((m) => m.value), L = o.indexOf(x);
|
|
168
|
+
let c;
|
|
169
|
+
if (d.key === "ArrowRight" || d.key === "ArrowDown" ? c = o[(L + 1) % o.length] : d.key === "ArrowLeft" || d.key === "ArrowUp" ? c = o[(L - 1 + o.length) % o.length] : d.key === "Home" ? c = o[0] : d.key === "End" && (c = o[o.length - 1]), !c) return;
|
|
170
|
+
d.preventDefault(), D(c, {
|
|
171
|
+
modeProp: e,
|
|
172
|
+
storageKey: t,
|
|
173
|
+
target: i,
|
|
174
|
+
onModeChange: r
|
|
175
|
+
});
|
|
176
|
+
const I = d.currentTarget.parentElement?.querySelector(`[aria-label="${p.find((m) => m.value === c)?.label}"]`);
|
|
177
|
+
I instanceof HTMLElement && I.focus();
|
|
178
|
+
},
|
|
179
|
+
className: _("outline-pho-brand inline-flex flex-1 cursor-pointer items-center justify-center transition duration-100 ease-linear focus-visible:outline-2 focus-visible:outline-offset-2", f ? "bg-pho-inverse text-pho-inverse" : "text-pho-description hover:text-pho-primary", S.item),
|
|
180
|
+
children: /* @__PURE__ */ h(q, {
|
|
181
|
+
"aria-hidden": "true",
|
|
182
|
+
className: "shrink-0"
|
|
183
|
+
})
|
|
184
|
+
}, a);
|
|
185
|
+
})
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
K.displayName = "ThemeToggle";
|
|
189
|
+
export {
|
|
190
|
+
b as THEME_STORAGE_KEY,
|
|
191
|
+
K as ThemeToggle,
|
|
192
|
+
re as getThemeMode,
|
|
193
|
+
J as getThemePreference,
|
|
194
|
+
F as parseThemeMode,
|
|
195
|
+
M as resolveThemeMode,
|
|
196
|
+
E as setThemeMode
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
//# sourceMappingURL=theme-toggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-toggle.js","names":["__iconNode","__iconNode"],"sources":["../../../../node_modules/.pnpm/@tabler+icons-react@3.44.0_react@19.2.7/node_modules/@tabler/icons-react/dist/esm/icons/IconDeviceDesktop.mjs","../../../../node_modules/.pnpm/@tabler+icons-react@3.44.0_react@19.2.7/node_modules/@tabler/icons-react/dist/esm/icons/IconMoon.mjs","../../../../node_modules/.pnpm/@tabler+icons-react@3.44.0_react@19.2.7/node_modules/@tabler/icons-react/dist/esm/icons/IconSun.mjs","../../src/components/theme-toggle/theme-toggle.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\": \"M3 5a1 1 0 0 1 1 -1h16a1 1 0 0 1 1 1v10a1 1 0 0 1 -1 1h-16a1 1 0 0 1 -1 -1v-10\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M7 20h10\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M9 16v4\", \"key\": \"svg-2\" }], [\"path\", { \"d\": \"M15 16v4\", \"key\": \"svg-3\" }]];\nconst IconDeviceDesktop = createReactComponent(\"outline\", \"device-desktop\", \"DeviceDesktop\", __iconNode);\n\nexport { __iconNode, IconDeviceDesktop as default };\n//# sourceMappingURL=IconDeviceDesktop.mjs.map\n","/**\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\": \"M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454l0 .008\", \"key\": \"svg-0\" }]];\nconst IconMoon = createReactComponent(\"outline\", \"moon\", \"Moon\", __iconNode);\n\nexport { __iconNode, IconMoon as default };\n//# sourceMappingURL=IconMoon.mjs.map\n","/**\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\": \"M8 12a4 4 0 1 0 8 0a4 4 0 1 0 -8 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M3 12h1m8 -9v1m8 8h1m-9 8v1m-6.4 -15.4l.7 .7m12.1 -.7l-.7 .7m0 11.4l.7 .7m-12.1 -.7l-.7 .7\", \"key\": \"svg-1\" }]];\nconst IconSun = createReactComponent(\"outline\", \"sun\", \"Sun\", __iconNode);\n\nexport { __iconNode, IconSun as default };\n//# sourceMappingURL=IconSun.mjs.map\n","import { useEffect, useSyncExternalStore, type HTMLAttributes } from \"react\";\nimport { IconDeviceDesktop, IconMoon, IconSun } from \"@tabler/icons-react\";\nimport { cn } from \"../../utils/cn\";\n\n/**\n * Appearance preference — `device` follows `prefers-color-scheme`; `light` /\n * `dark` force the scheme via `data-mode`.\n */\nexport type ThemeMode = \"device\" | \"light\" | \"dark\";\n\n/** Resolved color-scheme after applying a preference. */\nexport type ResolvedTheme = \"light\" | \"dark\";\n\n/** Default `localStorage` key used by the docs site and this component. */\nexport const THEME_STORAGE_KEY = \"pho-mode\";\n\nconst THEME_CHANGE_EVENT = \"pho-themechange\";\n\nconst OPTIONS = [\n { value: \"device\" as const, label: \"Device\", Icon: IconDeviceDesktop },\n { value: \"light\" as const, label: \"Light\", Icon: IconSun },\n { value: \"dark\" as const, label: \"Dark\", Icon: IconMoon },\n];\n\n// Concentric correction (see /scale): inner = outer − gap, derived from the\n// radius token with calc so it tracks theme changes. Track is `base`; the gap\n// is the track padding (sm/md p-0.5 = 2px, lg p-1 = 4px). Plain round, no\n// squircle (the track carries a ring-inset).\nconst THEME_SIZES = {\n sm: {\n track: \"gap-0.5 rounded-base p-0.5\",\n item: \"size-7 rounded-[calc(var(--radius-base)-2px)] [&>svg]:size-3.5\",\n },\n md: {\n track: \"gap-0.5 rounded-base p-0.5\",\n item: \"size-8 rounded-[calc(var(--radius-base)-2px)] [&>svg]:size-4\",\n },\n lg: {\n track: \"gap-1 rounded-base p-1\",\n item: \"size-9 rounded-[calc(var(--radius-base)-4px)] [&>svg]:size-5\",\n },\n} as const;\n\nexport type ThemeToggleSize = keyof typeof THEME_SIZES;\n\nexport interface ThemeToggleProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\" | \"color\" | \"onChange\" | \"defaultValue\"\n> {\n /** Controlled preference. */\n mode?: ThemeMode;\n /** Uncontrolled initial preference. @default \"device\" */\n defaultMode?: ThemeMode;\n /** Fired when the user picks a segment. */\n onModeChange?: (mode: ThemeMode) => void;\n /**\n * Persist the preference under this `localStorage` key. Pass `null` to skip\n * persistence. @default \"pho-mode\"\n */\n storageKey?: string | null;\n /**\n * Element that receives `data-mode=\"dark\"`. Defaults to\n * `document.documentElement`.\n */\n target?: HTMLElement | null | (() => HTMLElement | null);\n /** Size variant. @default \"md\" */\n size?: ThemeToggleSize;\n}\n\n/** Parse a stored preference; unknown / missing values fall back to `device`. */\nexport function parseThemeMode(value: string | null | undefined): ThemeMode {\n if (value === \"light\" || value === \"dark\" || value === \"device\") return value;\n return \"device\";\n}\n\n/** Resolve a preference against the OS color-scheme. */\nexport function resolveThemeMode(\n mode: ThemeMode,\n query: { matches: boolean } = typeof window !== \"undefined\"\n ? window.matchMedia(\"(prefers-color-scheme: dark)\")\n : { matches: false },\n): ResolvedTheme {\n if (mode === \"light\" || mode === \"dark\") return mode;\n return query.matches ? \"dark\" : \"light\";\n}\n\nfunction resolveTarget(\n target?: ThemeToggleProps[\"target\"],\n): HTMLElement | null {\n if (typeof target === \"function\") return target();\n if (target !== undefined) return target;\n return typeof document === \"undefined\" ? null : document.documentElement;\n}\n\n/** Preference mirrored across document-level ThemeToggle instances. */\nlet storedPreference: ThemeMode | null = null;\nlet mediaCleanup: (() => void) | null = null;\n/** Per-target `prefers-color-scheme` listeners (scoped `target` instances). */\nconst targetMediaCleanups = new Map<HTMLElement, () => void>();\n\n/** Drop in-memory preference + media listener (tests / full remounts). */\nexport function clearThemePreference() {\n storedPreference = null;\n mediaCleanup?.();\n mediaCleanup = null;\n for (const cleanup of targetMediaCleanups.values()) cleanup();\n targetMediaCleanups.clear();\n}\n\n/** Read a persisted preference, or `null` when nothing is stored. */\nfunction readStoredPreference(storageKey: string | null): ThemeMode | null {\n if (storageKey == null || typeof localStorage === \"undefined\") return null;\n const raw = localStorage.getItem(storageKey);\n if (raw == null) return null;\n return parseThemeMode(raw);\n}\n\n/** Current document preference (memory, then storage, else `device`). */\nexport function getThemePreference(\n storageKey: string | null = THEME_STORAGE_KEY,\n): ThemeMode {\n return storedPreference ?? readStoredPreference(storageKey) ?? \"device\";\n}\n\n/** Read the resolved light/dark mode from an element (or `<html>`). */\nexport function getThemeMode(\n target: HTMLElement | null = typeof document === \"undefined\"\n ? null\n : document.documentElement,\n): ResolvedTheme {\n return target?.dataset.mode === \"dark\" ? \"dark\" : \"light\";\n}\n\nfunction applyResolved(resolved: ResolvedTheme, target: HTMLElement | null) {\n if (!target) return;\n if (resolved === \"dark\") target.dataset.mode = \"dark\";\n else delete target.dataset.mode;\n}\n\nfunction bindMediaListener(storageKey: string | null) {\n mediaCleanup?.();\n mediaCleanup = null;\n if (typeof window === \"undefined\") return;\n if (getThemePreference(storageKey) !== \"device\") return;\n\n const mql = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const onChange = () => {\n applyResolved(resolveThemeMode(\"device\", mql), document.documentElement);\n window.dispatchEvent(new Event(THEME_CHANGE_EVENT));\n };\n mql.addEventListener(\"change\", onChange);\n mediaCleanup = () => mql.removeEventListener(\"change\", onChange);\n}\n\n/** Track OS scheme changes for a scoped target (docs previews, etc.). */\nfunction bindTargetMediaListener(target: HTMLElement, mode: ThemeMode) {\n unbindTargetMediaListener(target);\n if (typeof window === \"undefined\" || mode !== \"device\") return;\n\n const mql = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const onChange = () => {\n applyResolved(resolveThemeMode(\"device\", mql), target);\n };\n mql.addEventListener(\"change\", onChange);\n targetMediaCleanups.set(target, () =>\n mql.removeEventListener(\"change\", onChange),\n );\n}\n\nfunction unbindTargetMediaListener(target: HTMLElement | null) {\n if (!target) return;\n targetMediaCleanups.get(target)?.();\n targetMediaCleanups.delete(target);\n}\n\n/**\n * Apply an appearance preference: persist it, resolve against the OS when\n * `device`, set `data-mode` on the target, and notify document-level toggles.\n */\nexport function setThemeMode(\n mode: ThemeMode,\n options?: {\n target?: HTMLElement | null;\n storageKey?: string | null;\n },\n): void {\n const storageKey =\n options && \"storageKey\" in options ? options.storageKey : THEME_STORAGE_KEY;\n const target =\n options?.target ??\n (typeof document === \"undefined\" ? null : document.documentElement);\n const syncDocument =\n typeof document === \"undefined\" ||\n target == null ||\n target === document.documentElement;\n\n applyResolved(resolveThemeMode(mode), target);\n\n if (!syncDocument) {\n if (target) bindTargetMediaListener(target, mode);\n return;\n }\n\n storedPreference = mode;\n if (storageKey != null && typeof localStorage !== \"undefined\") {\n localStorage.setItem(storageKey, mode);\n }\n bindMediaListener(storageKey ?? null);\n\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new Event(THEME_CHANGE_EVENT));\n }\n}\n\nfunction subscribeTheme(onChange: () => void) {\n if (typeof window === \"undefined\") return () => {};\n window.addEventListener(THEME_CHANGE_EVENT, onChange);\n return () => window.removeEventListener(THEME_CHANGE_EVENT, onChange);\n}\n\nfunction selectMode(\n value: ThemeMode,\n options: {\n modeProp?: ThemeMode;\n storageKey: string | null;\n target: ThemeToggleProps[\"target\"];\n onModeChange?: (mode: ThemeMode) => void;\n },\n) {\n if (options.modeProp === undefined) {\n setThemeMode(value, {\n target: resolveTarget(options.target),\n storageKey: options.storageKey,\n });\n }\n options.onModeChange?.(value);\n}\n\n/**\n * Segmented appearance control — Device / Light / Dark. Forces\n * `data-mode=\"dark\"` (or clears it) so Pho's `light-dark()` tokens follow\n * `color-scheme`. `device` tracks `prefers-color-scheme`. Persists under\n * `pho-mode` by default; pair with a blocking `<head>` script to avoid a\n * flash (see docs).\n */\nexport function ThemeToggle({\n mode: modeProp,\n defaultMode = \"device\",\n onModeChange,\n storageKey = THEME_STORAGE_KEY,\n target,\n size = \"md\",\n className,\n \"aria-label\": ariaLabel = \"Theme\",\n ...props\n}: ThemeToggleProps) {\n const storeMode = useSyncExternalStore(\n subscribeTheme,\n () => storedPreference ?? readStoredPreference(storageKey) ?? defaultMode,\n () => defaultMode,\n );\n\n // Uncontrolled — hydrate from storage (or `defaultMode`) on mount.\n useEffect(() => {\n if (modeProp !== undefined) return;\n const initial =\n storedPreference ?? readStoredPreference(storageKey) ?? defaultMode;\n setThemeMode(initial, {\n target: resolveTarget(target),\n storageKey,\n });\n }, [modeProp, storageKey, target, defaultMode]);\n\n // Controlled — keep the target in sync with the prop.\n useEffect(() => {\n if (modeProp === undefined) return;\n setThemeMode(modeProp, {\n target: resolveTarget(target),\n storageKey,\n });\n }, [modeProp, storageKey, target]);\n\n // Drop scoped-target media listeners on unmount (document listener is shared).\n useEffect(() => {\n return () => {\n const el = resolveTarget(target);\n if (el && el !== document.documentElement) {\n unbindTargetMediaListener(el);\n }\n };\n }, [target]);\n\n const mode = modeProp ?? storeMode;\n const sizes = THEME_SIZES[size];\n\n return (\n // Segmented control: styled buttons with radiogroup semantics. Native\n // `<input type=\"radio\">` cannot express the inverse-chip track layout.\n // oxlint-disable-next-line jsx-a11y/prefer-tag-over-role\n <div\n role=\"radiogroup\"\n aria-label={ariaLabel}\n {...props}\n className={cn(\n \"ring-pho-interactive inline-flex items-center ring-1 ring-inset\",\n sizes.track,\n className,\n )}\n >\n {OPTIONS.map(({ value, label, Icon }) => {\n const selected = mode === value;\n return (\n <button\n key={value}\n type=\"button\"\n role=\"radio\" // oxlint-disable-line jsx-a11y/prefer-tag-over-role -- segment needs button chrome\n aria-checked={selected}\n aria-label={label}\n tabIndex={selected ? 0 : -1}\n onClick={() =>\n selectMode(value, { modeProp, storageKey, target, onModeChange })\n }\n onKeyDown={(event) => {\n const order = OPTIONS.map((o) => o.value);\n const index = order.indexOf(mode);\n let next: ThemeMode | undefined;\n if (event.key === \"ArrowRight\" || event.key === \"ArrowDown\") {\n next = order[(index + 1) % order.length];\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") {\n next = order[(index - 1 + order.length) % order.length];\n } else if (event.key === \"Home\") {\n next = order[0];\n } else if (event.key === \"End\") {\n next = order[order.length - 1];\n }\n if (!next) return;\n event.preventDefault();\n selectMode(next, { modeProp, storageKey, target, onModeChange });\n const el = event.currentTarget.parentElement?.querySelector(\n `[aria-label=\"${OPTIONS.find((o) => o.value === next)?.label}\"]`,\n );\n if (el instanceof HTMLElement) el.focus();\n }}\n className={cn(\n \"outline-pho-brand inline-flex flex-1 cursor-pointer items-center justify-center transition duration-100 ease-linear focus-visible:outline-2 focus-visible:outline-offset-2\",\n // No hover wash — in a segmented control the only filled element\n // is the selected chip. Unselected segments rest at the dim\n // description ink and jump to primary on hover for a clear cue.\n selected\n ? \"bg-pho-inverse text-pho-inverse\"\n : \"text-pho-description hover:text-pho-primary\",\n sizes.item,\n )}\n >\n <Icon aria-hidden=\"true\" className=\"shrink-0\" />\n </button>\n );\n })}\n </div>\n );\n}\n\nThemeToggle.displayName = \"ThemeToggle\";\n"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
|
package/dist/components/toast.js
CHANGED
|
@@ -1,60 +1,60 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { t as
|
|
2
|
+
import { t as r } from "../chunks/cn-DTiB6ek_.js";
|
|
3
3
|
import "react";
|
|
4
|
-
import { jsx as
|
|
5
|
-
import { Toast as
|
|
6
|
-
var n =
|
|
4
|
+
import { jsx as a } from "react/jsx-runtime";
|
|
5
|
+
import { Toast as o } from "@base-ui/react/toast";
|
|
6
|
+
var n = o.Provider, s = o.Portal, i = o.Action, l = o.useToastManager, c = o.createToastManager;
|
|
7
7
|
function p({ className: t, ...e }) {
|
|
8
|
-
return /* @__PURE__ */ o
|
|
9
|
-
className:
|
|
8
|
+
return /* @__PURE__ */ a(o.Viewport, {
|
|
9
|
+
className: r("fixed right-4 bottom-4 z-50 flex w-[22rem] max-w-[calc(100vw-2rem)] flex-col gap-2 outline-none", t),
|
|
10
10
|
...e
|
|
11
11
|
});
|
|
12
12
|
}
|
|
13
13
|
function u({ className: t, ...e }) {
|
|
14
|
-
return /* @__PURE__ */ o
|
|
15
|
-
className:
|
|
14
|
+
return /* @__PURE__ */ a(o.Root, {
|
|
15
|
+
className: r("bg-pho-primary text-pho-primary shadow-pho-lg ring-pho-secondary rounded-base relative w-full ring-1 select-none ring-inset", "[transform:translateX(var(--toast-swipe-movement-x,0px))] transition-[transform,opacity] duration-300 ease-out", "data-[starting-style]:translate-x-full data-[starting-style]:opacity-0", "data-[ending-style]:translate-x-full data-[ending-style]:opacity-0", "data-[swiping]:duration-0", t),
|
|
16
16
|
...e
|
|
17
17
|
});
|
|
18
18
|
}
|
|
19
19
|
function m({ className: t, ...e }) {
|
|
20
|
-
return /* @__PURE__ */ o
|
|
21
|
-
className:
|
|
20
|
+
return /* @__PURE__ */ a(o.Content, {
|
|
21
|
+
className: r("flex flex-col gap-1 p-4 pr-10", t),
|
|
22
22
|
...e
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
|
-
function
|
|
26
|
-
return /* @__PURE__ */ o
|
|
27
|
-
className:
|
|
25
|
+
function d({ className: t, ...e }) {
|
|
26
|
+
return /* @__PURE__ */ a(o.Title, {
|
|
27
|
+
className: r("text-pho-primary text-base font-medium", t),
|
|
28
28
|
...e
|
|
29
29
|
});
|
|
30
30
|
}
|
|
31
|
-
function
|
|
32
|
-
return /* @__PURE__ */ o
|
|
33
|
-
className:
|
|
31
|
+
function f({ className: t, ...e }) {
|
|
32
|
+
return /* @__PURE__ */ a(o.Description, {
|
|
33
|
+
className: r("text-pho-description text-base", t),
|
|
34
34
|
...e
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
|
-
function
|
|
38
|
-
return /* @__PURE__ */ o
|
|
39
|
-
className:
|
|
37
|
+
function g({ className: t, ...e }) {
|
|
38
|
+
return /* @__PURE__ */ a(o.Close, {
|
|
39
|
+
className: r("text-pho-secondary hover:text-pho-secondary-hover hover:bg-pho-ghost-hover outline-pho-brand absolute top-2.5 right-2.5 flex size-6 cursor-pointer items-center justify-center rounded-sm transition focus-visible:outline-2 [&>svg]:size-4", t),
|
|
40
40
|
...e
|
|
41
41
|
});
|
|
42
42
|
}
|
|
43
|
-
var
|
|
43
|
+
var b = {
|
|
44
44
|
Provider: n,
|
|
45
45
|
Portal: s,
|
|
46
46
|
Viewport: p,
|
|
47
47
|
Root: u,
|
|
48
48
|
Content: m,
|
|
49
|
-
Title:
|
|
50
|
-
Description:
|
|
51
|
-
Close:
|
|
49
|
+
Title: d,
|
|
50
|
+
Description: f,
|
|
51
|
+
Close: g,
|
|
52
52
|
Action: i,
|
|
53
53
|
useToastManager: l,
|
|
54
54
|
createToastManager: c
|
|
55
55
|
};
|
|
56
56
|
export {
|
|
57
|
-
|
|
57
|
+
b as Toast
|
|
58
58
|
};
|
|
59
59
|
|
|
60
60
|
//# sourceMappingURL=toast.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toast.js","names":[],"sources":["../../src/components/toast/toast.tsx"],"sourcesContent":["import { type ComponentProps, type ElementType } from \"react\";\nimport { Toast as BaseToast } from \"@base-ui/react/toast\";\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 Provider = BaseToast.Provider;\nconst Portal = BaseToast.Portal;\nconst Action = BaseToast.Action;\n\n/** Imperative toast API: `const toast = useToastManager(); toast.add({ title })`. */\nconst useToastManager = BaseToast.useToastManager;\nconst createToastManager = BaseToast.createToastManager;\n\nfunction Viewport({\n className,\n ...props\n}: StyledProps<typeof BaseToast.Viewport>) {\n return (\n <BaseToast.Viewport\n className={cn(\n \"fixed right-4 bottom-4 z-50 flex w-[22rem] max-w-[calc(100vw-2rem)] flex-col gap-2 outline-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Root({ className, ...props }: StyledProps<typeof BaseToast.Root>) {\n return (\n <BaseToast.Root\n className={cn(\n // Floating layer: keeps its elevation shadow, sits on the card surface\n // with the site hairline (ring-pho-secondary).\n \"
|
|
1
|
+
{"version":3,"file":"toast.js","names":[],"sources":["../../src/components/toast/toast.tsx"],"sourcesContent":["import { type ComponentProps, type ElementType } from \"react\";\nimport { Toast as BaseToast } from \"@base-ui/react/toast\";\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 Provider = BaseToast.Provider;\nconst Portal = BaseToast.Portal;\nconst Action = BaseToast.Action;\n\n/** Imperative toast API: `const toast = useToastManager(); toast.add({ title })`. */\nconst useToastManager = BaseToast.useToastManager;\nconst createToastManager = BaseToast.createToastManager;\n\nfunction Viewport({\n className,\n ...props\n}: StyledProps<typeof BaseToast.Viewport>) {\n return (\n <BaseToast.Viewport\n className={cn(\n \"fixed right-4 bottom-4 z-50 flex w-[22rem] max-w-[calc(100vw-2rem)] flex-col gap-2 outline-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Root({ className, ...props }: StyledProps<typeof BaseToast.Root>) {\n return (\n <BaseToast.Root\n className={cn(\n // Floating layer: keeps its elevation shadow, sits on the card surface\n // with the site hairline (ring-pho-secondary).\n \"bg-pho-primary text-pho-primary shadow-pho-lg ring-pho-secondary rounded-base relative w-full ring-1 select-none ring-inset\",\n \"[transform:translateX(var(--toast-swipe-movement-x,0px))] transition-[transform,opacity] duration-300 ease-out\",\n \"data-[starting-style]:translate-x-full data-[starting-style]:opacity-0\",\n \"data-[ending-style]:translate-x-full data-[ending-style]:opacity-0\",\n \"data-[swiping]:duration-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Content({\n className,\n ...props\n}: StyledProps<typeof BaseToast.Content>) {\n return (\n <BaseToast.Content\n className={cn(\"flex flex-col gap-1 p-4 pr-10\", className)}\n {...props}\n />\n );\n}\n\nfunction Title({ className, ...props }: StyledProps<typeof BaseToast.Title>) {\n return (\n <BaseToast.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 BaseToast.Description>) {\n return (\n <BaseToast.Description\n className={cn(\"text-pho-description text-base\", className)}\n {...props}\n />\n );\n}\n\nfunction Close({ className, ...props }: StyledProps<typeof BaseToast.Close>) {\n return (\n <BaseToast.Close\n className={cn(\n \"text-pho-secondary hover:text-pho-secondary-hover hover:bg-pho-ghost-hover outline-pho-brand absolute top-2.5 right-2.5 flex size-6 cursor-pointer items-center justify-center rounded-sm transition focus-visible:outline-2 [&>svg]:size-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/**\n * Toast built on Base UI `Toast` — a transient, non-blocking notification.\n * Wrap your app in `Toast.Provider`, render a `Toast.Portal` → `Viewport` that\n * maps `useToastManager().toasts` to `Toast.Root`s, then call\n * `useToastManager().add({ title, description })` to show one. Use a toast for\n * confirmation of a background action; for a choice the user must make, use\n * `AlertDialog`.\n */\nexport const Toast = {\n Provider,\n Portal,\n Viewport,\n Root,\n Content,\n Title,\n Description,\n Close,\n Action,\n useToastManager,\n createToastManager,\n};\n"],"mappings":";;;;;AAYA,IAAM,IAAW,EAAU,UACrB,IAAS,EAAU,QACnB,IAAS,EAAU,QAGnB,IAAkB,EAAU,iBAC5B,IAAqB,EAAU;AAErC,SAAS,EAAS,EAChB,WAAA,GACA,GAAG,EAAA,GACsC;AACzC,SACE,gBAAA,EAAC,EAAU,UAAX;AAAA,IACE,WAAW,EACT,mGACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAK,EAAE,WAAA,GAAW,GAAG,EAAA,GAA6C;AACzE,SACE,gBAAA,EAAC,EAAU,MAAX;AAAA,IACE,WAAW,EAGT,+HACA,kHACA,0EACA,sEACA,6BACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAQ,EACf,WAAA,GACA,GAAG,EAAA,GACqC;AACxC,SACE,gBAAA,EAAC,EAAU,SAAX;AAAA,IACE,WAAW,EAAG,iCAAiC,CAAS;AAAA,IACxD,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAM,EAAE,WAAA,GAAW,GAAG,EAAA,GAA8C;AAC3E,SACE,gBAAA,EAAC,EAAU,OAAX;AAAA,IACE,WAAW,EAAG,0CAA0C,CAAS;AAAA,IACjE,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAY,EACnB,WAAA,GACA,GAAG,EAAA,GACyC;AAC5C,SACE,gBAAA,EAAC,EAAU,aAAX;AAAA,IACE,WAAW,EAAG,kCAAkC,CAAS;AAAA,IACzD,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAM,EAAE,WAAA,GAAW,GAAG,EAAA,GAA8C;AAC3E,SACE,gBAAA,EAAC,EAAU,OAAX;AAAA,IACE,WAAW,EACT,+OACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAUA,IAAa,IAAQ;AAAA,EACnB,UAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,iBAAA;AAAA,EACA,oBAAA;AACF"}
|