@photon-ai/pho-ui 2.1.0 → 2.2.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/IconAlertCircleFilled-VxKU8TYK.js.map +1 -1
- package/dist/chunks/IconArrowUpRight-DGgKzQwV.js.map +1 -1
- package/dist/chunks/IconCheck-D2WuculQ.js.map +1 -1
- package/dist/chunks/IconChevronLeft-CSWMKQ4C.js.map +1 -1
- package/dist/chunks/IconInfoCircle-L0zfhg7R.js.map +1 -1
- package/dist/chunks/IconX-pZ9vrtSr.js.map +1 -1
- package/dist/chunks/animated-height-C2eQstGy.js.map +1 -1
- package/dist/chunks/{avatar-CiAvJNNs.js → avatar-BkmGDIqf.js} +3 -3
- package/dist/chunks/{avatar-CiAvJNNs.js.map → avatar-BkmGDIqf.js.map} +1 -1
- package/dist/chunks/basic-page-CB36yrpL.js +643 -0
- package/dist/chunks/basic-page-CB36yrpL.js.map +1 -0
- package/dist/chunks/{button-X5wsWvRa.js → button-BmhyLgy5.js} +3 -3
- package/dist/chunks/{button-X5wsWvRa.js.map → button-BmhyLgy5.js.map} +1 -1
- package/dist/chunks/{card-9cGnv-VD.js → card-DSW3Uhag.js} +2 -2
- package/dist/chunks/{card-9cGnv-VD.js.map → card-DSW3Uhag.js.map} +1 -1
- package/dist/chunks/{close-button-xadxp0j8.js → close-button-GvqWbLl0.js} +2 -2
- package/dist/chunks/{close-button-xadxp0j8.js.map → close-button-GvqWbLl0.js.map} +1 -1
- package/dist/chunks/{cn-DTiB6ek_.js → cn-ChIgwEl3.js} +99 -96
- package/dist/chunks/{cn-DTiB6ek_.js.map → cn-ChIgwEl3.js.map} +1 -1
- package/dist/chunks/{combobox-rLdS6fl-.js → combobox-Dj5m_dDd.js} +2 -2
- package/dist/chunks/{combobox-rLdS6fl-.js.map → combobox-Dj5m_dDd.js.map} +1 -1
- package/dist/chunks/createReactComponent-BqCmnqfX.js.map +1 -1
- package/dist/chunks/{dialog-BC23YRUq.js → dialog-DtFO7oy0.js} +5 -5
- package/dist/chunks/{dialog-BC23YRUq.js.map → dialog-DtFO7oy0.js.map} +1 -1
- package/dist/chunks/{error-DR6G2LmG.js → error-Da7P5WZi.js} +11 -10
- package/dist/chunks/{error-DR6G2LmG.js.map → error-Da7P5WZi.js.map} +1 -1
- package/dist/chunks/{input-D3XQcC4J.js → input-QSAUO30c.js} +2 -2
- package/dist/chunks/{input-D3XQcC4J.js.map → input-QSAUO30c.js.map} +1 -1
- package/dist/chunks/{input-group-D6dlma8k.js → input-group-5AtpIhC_.js} +2 -2
- package/dist/chunks/{input-group-D6dlma8k.js.map → input-group-5AtpIhC_.js.map} +1 -1
- package/dist/chunks/{menu-BC-9IP29.js → menu-Cgj3lq9z.js} +3 -3
- package/dist/chunks/{menu-BC-9IP29.js.map → menu-Cgj3lq9z.js.map} +1 -1
- package/dist/chunks/{popover-EL1SE1kj.js → popover-BhBJO346.js} +2 -2
- package/dist/chunks/{popover-EL1SE1kj.js.map → popover-BhBJO346.js.map} +1 -1
- package/dist/chunks/{scroll-area-CNZVwe7v.js → scroll-area-Cw4JFqNG.js} +2 -2
- package/dist/chunks/{scroll-area-CNZVwe7v.js.map → scroll-area-Cw4JFqNG.js.map} +1 -1
- package/dist/chunks/{sidebar-DDJC1MeD.js → sidebar-BETMObNj.js} +25 -24
- package/dist/chunks/{sidebar-DDJC1MeD.js.map → sidebar-BETMObNj.js.map} +1 -1
- package/dist/chunks/{spinner-Cy8bkyJf.js → spinner-BzLUo4Xk.js} +2 -2
- package/dist/chunks/{spinner-Cy8bkyJf.js.map → spinner-BzLUo4Xk.js.map} +1 -1
- package/dist/chunks/{status-view-CcbctPqR.js → status-view-C8tabjDu.js} +2 -2
- package/dist/chunks/{status-view-CcbctPqR.js.map → status-view-C8tabjDu.js.map} +1 -1
- package/dist/components/accordion.js +1 -1
- package/dist/components/autocomplete.js +1 -1
- package/dist/components/avatar.js +1 -1
- package/dist/components/badge.js +1 -1
- package/dist/components/button.js +2 -2
- package/dist/components/card.js +1 -1
- package/dist/components/checkbox.js +1 -1
- package/dist/components/checkbox.js.map +1 -1
- package/dist/components/collapsible.js +1 -1
- package/dist/components/combobox.js +1 -1
- package/dist/components/command.js +2 -2
- package/dist/components/command.js.map +1 -1
- package/dist/components/context-menu.js +2 -2
- package/dist/components/context-menu.js.map +1 -1
- package/dist/components/dialog.js +1 -1
- package/dist/components/drawer.js +1 -1
- package/dist/components/error.js +1 -1
- package/dist/components/field.js +1 -1
- package/dist/components/fieldset.js +1 -1
- package/dist/components/form.js +1 -1
- package/dist/components/input-group.js +1 -1
- package/dist/components/input.js +1 -1
- package/dist/components/kbd.js +1 -1
- package/dist/components/kbd.js.map +1 -1
- package/dist/components/menu.js +1 -1
- package/dist/components/menubar.js +1 -1
- package/dist/components/meter.js +1 -1
- package/dist/components/navigation-menu.js +1 -1
- package/dist/components/notification.js +1 -1
- package/dist/components/notification.js.map +1 -1
- package/dist/components/number-field.js +1 -1
- package/dist/components/otp-field.js +1 -1
- package/dist/components/otp-field.js.map +1 -1
- package/dist/components/phone-input.js +2064 -2050
- package/dist/components/phone-input.js.map +1 -1
- package/dist/components/popover.js +1 -1
- package/dist/components/preview-card.js +1 -1
- package/dist/components/progress.js +1 -1
- package/dist/components/radio-group.js +1 -1
- package/dist/components/radio-group.js.map +1 -1
- package/dist/components/scroll-area.js +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/select.js.map +1 -1
- package/dist/components/separator.js +1 -1
- package/dist/components/skeleton.js +1 -1
- package/dist/components/slider.js +1 -1
- package/dist/components/spinner.js +1 -1
- package/dist/components/status-view.js +1 -1
- package/dist/components/switch.js +1 -1
- package/dist/components/switch.js.map +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/theme-toggle.js +1 -1
- package/dist/components/theme-toggle.js.map +1 -1
- package/dist/components/toast.js +1 -1
- package/dist/components/toggle-group.js +1 -1
- package/dist/components/toggle.js +1 -1
- package/dist/components/toolbar.js +1 -1
- package/dist/components/tooltip.js +1 -1
- package/dist/icons.js.map +1 -1
- package/dist/index.js +11 -11
- package/dist/primitives.js +1 -3
- package/dist/sections/basic-page.js +1 -1
- package/dist/sections/sidebar.js +1 -1
- package/dist/src/components/toast/toast.d.ts +1 -1
- package/dist/src/sections/basic-page/basic-page.d.ts +57 -21
- package/dist/src/sections/basic-page/index.d.ts +1 -1
- package/dist/utils.js +1 -1
- package/package.json +21 -20
- package/dist/chunks/basic-page-Dfln58iw.js +0 -482
- package/dist/chunks/basic-page-Dfln58iw.js.map +0 -1
- package/dist/primitives.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { t as d } from "../chunks/cn-
|
|
2
|
+
import { t as d } from "../chunks/cn-ChIgwEl3.js";
|
|
3
3
|
import { r as m } from "../chunks/use-press-pulse-8iorQPsh.js";
|
|
4
4
|
import { a as g, n as C, r as R, t as v } from "../chunks/choice-card-CunOnY9l.js";
|
|
5
5
|
import { createContext as x, useContext as N } from "react";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"radio-group.js","names":[],"sources":["../../src/components/radio-group/radio-group.tsx","../../src/components/radio-group/radio-card.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n type ComponentProps,\n type ReactNode,\n} from \"react\";\nimport { RadioGroup as BaseRadioGroup } from \"@base-ui/react/radio-group\";\nimport { Radio as BaseRadio } from \"@base-ui/react/radio\";\nimport { motion } from \"motion/react\";\nimport { cn } from \"../../utils/cn\";\nimport { usePressPulse } from \"../../utils/use-press-pulse\";\nimport { CHOICE_INDICATOR_POP_TRANSITION } from \"../../utils/choice-card\";\n\nexport interface RadioGroupProps extends Omit<\n ComponentProps<typeof BaseRadioGroup>,\n \"className\"\n> {\n className?: string;\n}\n\nconst RadioGroupDisabledContext = createContext(false);\n\n/** Group-level `disabled`, so press pulse skips when the group is locked. */\nexport function useRadioGroupDisabled() {\n return useContext(RadioGroupDisabledContext);\n}\n\n/**\n * Single-choice group built on Base UI `RadioGroup`. Holds `Radio` items;\n * exactly one may be selected. Control with `value` / `onValueChange` or leave\n * uncontrolled with `defaultValue`.\n */\nexport function RadioGroup({ className, disabled, ...props }: RadioGroupProps) {\n return (\n <RadioGroupDisabledContext.Provider value={Boolean(disabled)}>\n <BaseRadioGroup\n disabled={disabled}\n className={cn(\"flex flex-col gap-3\", className)}\n {...props}\n />\n </RadioGroupDisabledContext.Provider>\n );\n}\n\nRadioGroup.displayName = \"RadioGroup\";\n\nexport interface RadioProps extends Omit<\n ComponentProps<typeof BaseRadio.Root>,\n \"className\"\n> {\n className?: string;\n /** Text rendered beside the dot; the whole row selects this option. */\n label?: ReactNode;\n}\n\n/**\n * A single option within a `RadioGroup`. Requires a `value`; pass `label` for a\n * clickable text row or provide an `aria-label`.\n */\nexport function Radio({ className, label, disabled, ...props }: RadioProps) {\n const groupDisabled = useRadioGroupDisabled();\n const { motionProps } = usePressPulse({\n scale: 0.94,\n disabled: Boolean(disabled || groupDisabled),\n });\n // With a label, the whole row is the hit target — press-trigger from there\n // (pointerdown bubbles up from the label text too) so the dot still\n // animates when the text, not the dot itself, is what's clicked.\n const { onPointerDown, ...dotMotionProps } = motionProps;\n\n const dot = (\n <BaseRadio.Root\n disabled={disabled}\n render={\n <motion.span\n {...dotMotionProps}\n onPointerDown={label ? undefined : onPointerDown}\n />\n }\n className={cn(\n \"outline-pho-brand bg-pho-primary ring-pho-primary flex size-5 shrink-0 cursor-pointer items-center justify-center rounded-full ring-1 ring-inset focus-visible:outline-2 focus-visible:outline-offset-2\",\n // Transform stays out — Motion owns the press pulse.\n \"transition-[background-color,box-shadow,color,outline-color] duration-150 ease-out\",\n // group-hover covers hovering the label text, not just the dot itself.\n \"hover:bg-pho-primary-hover hover:ring-pho-ink group-hover:bg-pho-primary-hover group-hover:ring-pho-ink\",\n \"data-[checked]:bg-pho-brand-solid data-[checked]:ring-transparent\",\n \"data-[checked]:hover:bg-pho-brand-solid-hover data-[checked]:group-hover:bg-pho-brand-solid-hover\",\n \"data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\n className,\n )}\n {...props}\n >\n {/* The indicator only renders when checked, i.e. always on brand-solid —\n on-brand (light-dark(#fff,#000)) keeps the dot visible in dark mode,\n where brand-solid is white. Pops in rather than appearing flat. */}\n <BaseRadio.Indicator\n render={\n <motion.span\n initial={{ scale: 0 }}\n animate={{ scale: 1 }}\n transition={CHOICE_INDICATOR_POP_TRANSITION}\n />\n }\n className=\"bg-pho-on-brand size-2 rounded-full\"\n />\n </BaseRadio.Root>\n );\n\n if (!label) return dot;\n return (\n <label\n className=\"group flex cursor-pointer items-center gap-2 select-none\"\n onPointerDown={onPointerDown}\n >\n {dot}\n <span className=\"text-pho-secondary text-base\">{label}</span>\n </label>\n );\n}\n\nRadio.displayName = \"Radio\";\n","import { type ComponentProps, type ReactNode } from \"react\";\nimport { Radio as BaseRadio } from \"@base-ui/react/radio\";\nimport { motion } from \"motion/react\";\nimport { cn } from \"../../utils/cn\";\nimport { usePressPulse } from \"../../utils/use-press-pulse\";\nimport {\n CHOICE_CARD_BASE,\n CHOICE_CARD_WITH_ICON,\n CHOICE_CARD_PRESS_SCALE,\n CHOICE_CARD_PRESS_TRANSITION,\n CHOICE_INDICATOR_POP_TRANSITION,\n} from \"../../utils/choice-card\";\nimport { useRadioGroupDisabled } from \"./radio-group\";\n\nexport interface RadioCardProps extends Omit<\n ComponentProps<typeof BaseRadio.Root>,\n \"className\" | \"title\"\n> {\n className?: string;\n /** Tile heading. */\n title: ReactNode;\n /** Supporting copy shown below the title. */\n description?: ReactNode;\n /** Glyph stacked above the title. When set, it replaces the radio dot. */\n icon?: ReactNode;\n}\n\nfunction CardCopy({\n title,\n description,\n}: {\n title: ReactNode;\n description?: ReactNode;\n}) {\n return (\n <span>\n <span className=\"text-pho-primary block\">{title}</span>\n {description ? (\n <span className=\"text-pho-description block\">{description}</span>\n ) : null}\n </span>\n );\n}\n\n/**\n * A `Radio` styled as a bordered, selectable tile — title, optional\n * description, and either a stacked icon or the radio dot. The tile *is*\n * the radio (see `usePressPulse`); an inner glyph is decorative.\n */\nexport function RadioCard({\n className,\n title,\n description,\n icon,\n disabled,\n ...props\n}: RadioCardProps) {\n const groupDisabled = useRadioGroupDisabled();\n const { motionProps } = usePressPulse({\n scale: CHOICE_CARD_PRESS_SCALE,\n disabled: Boolean(disabled || groupDisabled),\n transition: CHOICE_CARD_PRESS_TRANSITION,\n });\n const hasIcon = icon != null;\n\n return (\n <BaseRadio.Root\n disabled={disabled}\n render={<motion.span {...motionProps} />}\n className={cn(\n CHOICE_CARD_BASE,\n hasIcon && CHOICE_CARD_WITH_ICON,\n className,\n )}\n {...props}\n >\n {hasIcon ? (\n <span\n aria-hidden\n className=\"text-pho-secondary flex size-6 shrink-0 items-center justify-center [&>svg]:size-6\"\n >\n {icon}\n </span>\n ) : (\n <span\n aria-hidden\n className={cn(\n \"bg-pho-primary ring-pho-primary mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-full ring-1 ring-inset\",\n \"group-hover:bg-pho-primary-hover group-hover:ring-pho-ink transition-[background-color,box-shadow] duration-150 ease-out\",\n \"group-data-[checked]:bg-pho-brand-solid group-data-[checked]:group-hover:bg-pho-brand-solid-hover group-data-[checked]:ring-transparent\",\n )}\n >\n <BaseRadio.Indicator\n render={\n <motion.span\n initial={{ scale: 0 }}\n animate={{ scale: 1 }}\n transition={CHOICE_INDICATOR_POP_TRANSITION}\n />\n }\n className=\"bg-pho-on-brand size-1.5 rounded-full\"\n />\n </span>\n )}\n <CardCopy title={title} description={description} />\n </BaseRadio.Root>\n );\n}\n\nRadioCard.displayName = \"RadioCard\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"radio-group.js","names":[],"sources":["../../src/components/radio-group/radio-group.tsx","../../src/components/radio-group/radio-card.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n type ComponentProps,\n type ReactNode,\n} from \"react\";\nimport { RadioGroup as BaseRadioGroup } from \"@base-ui/react/radio-group\";\nimport { Radio as BaseRadio } from \"@base-ui/react/radio\";\nimport { motion } from \"motion/react\";\nimport { cn } from \"../../utils/cn\";\nimport { usePressPulse } from \"../../utils/use-press-pulse\";\nimport { CHOICE_INDICATOR_POP_TRANSITION } from \"../../utils/choice-card\";\n\nexport interface RadioGroupProps extends Omit<\n ComponentProps<typeof BaseRadioGroup>,\n \"className\"\n> {\n className?: string;\n}\n\nconst RadioGroupDisabledContext = createContext(false);\n\n/** Group-level `disabled`, so press pulse skips when the group is locked. */\nexport function useRadioGroupDisabled() {\n return useContext(RadioGroupDisabledContext);\n}\n\n/**\n * Single-choice group built on Base UI `RadioGroup`. Holds `Radio` items;\n * exactly one may be selected. Control with `value` / `onValueChange` or leave\n * uncontrolled with `defaultValue`.\n */\nexport function RadioGroup({ className, disabled, ...props }: RadioGroupProps) {\n return (\n <RadioGroupDisabledContext.Provider value={Boolean(disabled)}>\n <BaseRadioGroup\n disabled={disabled}\n className={cn(\"flex flex-col gap-3\", className)}\n {...props}\n />\n </RadioGroupDisabledContext.Provider>\n );\n}\n\nRadioGroup.displayName = \"RadioGroup\";\n\nexport interface RadioProps extends Omit<\n ComponentProps<typeof BaseRadio.Root>,\n \"className\"\n> {\n className?: string;\n /** Text rendered beside the dot; the whole row selects this option. */\n label?: ReactNode;\n}\n\n/**\n * A single option within a `RadioGroup`. Requires a `value`; pass `label` for a\n * clickable text row or provide an `aria-label`.\n */\nexport function Radio({ className, label, disabled, ...props }: RadioProps) {\n const groupDisabled = useRadioGroupDisabled();\n const { motionProps } = usePressPulse({\n scale: 0.94,\n disabled: Boolean(disabled || groupDisabled),\n });\n // With a label, the whole row is the hit target — press-trigger from there\n // (pointerdown bubbles up from the label text too) so the dot still\n // animates when the text, not the dot itself, is what's clicked.\n const { onPointerDown, ...dotMotionProps } = motionProps;\n\n const dot = (\n <BaseRadio.Root\n disabled={disabled}\n render={\n <motion.span\n {...dotMotionProps}\n onPointerDown={label ? undefined : onPointerDown}\n />\n }\n className={cn(\n \"outline-pho-brand bg-pho-primary ring-pho-primary flex size-5 shrink-0 cursor-pointer items-center justify-center rounded-full ring-1 ring-inset focus-visible:outline-2 focus-visible:outline-offset-2\",\n // Transform stays out — Motion owns the press pulse.\n \"transition-[background-color,box-shadow,color,outline-color] duration-150 ease-out\",\n // group-hover covers hovering the label text, not just the dot itself.\n \"hover:bg-pho-primary-hover hover:ring-pho-ink group-hover:bg-pho-primary-hover group-hover:ring-pho-ink\",\n \"data-[checked]:bg-pho-brand-solid data-[checked]:ring-transparent\",\n \"data-[checked]:hover:bg-pho-brand-solid-hover data-[checked]:group-hover:bg-pho-brand-solid-hover\",\n \"data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\n className,\n )}\n {...props}\n >\n {/* The indicator only renders when checked, i.e. always on brand-solid —\n on-brand (light-dark(#fff,#000)) keeps the dot visible in dark mode,\n where brand-solid is white. Pops in rather than appearing flat. */}\n <BaseRadio.Indicator\n render={\n <motion.span\n initial={{ scale: 0 }}\n animate={{ scale: 1 }}\n transition={CHOICE_INDICATOR_POP_TRANSITION}\n />\n }\n className=\"bg-pho-on-brand size-2 rounded-full\"\n />\n </BaseRadio.Root>\n );\n\n if (!label) return dot;\n return (\n <label\n className=\"group flex cursor-pointer items-center gap-2 select-none\"\n onPointerDown={onPointerDown}\n >\n {dot}\n <span className=\"text-pho-secondary text-base\">{label}</span>\n </label>\n );\n}\n\nRadio.displayName = \"Radio\";\n","import { type ComponentProps, type ReactNode } from \"react\";\nimport { Radio as BaseRadio } from \"@base-ui/react/radio\";\nimport { motion } from \"motion/react\";\nimport { cn } from \"../../utils/cn\";\nimport { usePressPulse } from \"../../utils/use-press-pulse\";\nimport {\n CHOICE_CARD_BASE,\n CHOICE_CARD_WITH_ICON,\n CHOICE_CARD_PRESS_SCALE,\n CHOICE_CARD_PRESS_TRANSITION,\n CHOICE_INDICATOR_POP_TRANSITION,\n} from \"../../utils/choice-card\";\nimport { useRadioGroupDisabled } from \"./radio-group\";\n\nexport interface RadioCardProps extends Omit<\n ComponentProps<typeof BaseRadio.Root>,\n \"className\" | \"title\"\n> {\n className?: string;\n /** Tile heading. */\n title: ReactNode;\n /** Supporting copy shown below the title. */\n description?: ReactNode;\n /** Glyph stacked above the title. When set, it replaces the radio dot. */\n icon?: ReactNode;\n}\n\nfunction CardCopy({\n title,\n description,\n}: {\n title: ReactNode;\n description?: ReactNode;\n}) {\n return (\n <span>\n <span className=\"text-pho-primary block\">{title}</span>\n {description ? (\n <span className=\"text-pho-description block\">{description}</span>\n ) : null}\n </span>\n );\n}\n\n/**\n * A `Radio` styled as a bordered, selectable tile — title, optional\n * description, and either a stacked icon or the radio dot. The tile *is*\n * the radio (see `usePressPulse`); an inner glyph is decorative.\n */\nexport function RadioCard({\n className,\n title,\n description,\n icon,\n disabled,\n ...props\n}: RadioCardProps) {\n const groupDisabled = useRadioGroupDisabled();\n const { motionProps } = usePressPulse({\n scale: CHOICE_CARD_PRESS_SCALE,\n disabled: Boolean(disabled || groupDisabled),\n transition: CHOICE_CARD_PRESS_TRANSITION,\n });\n const hasIcon = icon != null;\n\n return (\n <BaseRadio.Root\n disabled={disabled}\n render={<motion.span {...motionProps} />}\n className={cn(\n CHOICE_CARD_BASE,\n hasIcon && CHOICE_CARD_WITH_ICON,\n className,\n )}\n {...props}\n >\n {hasIcon ? (\n <span\n aria-hidden\n className=\"text-pho-secondary flex size-6 shrink-0 items-center justify-center [&>svg]:size-6\"\n >\n {icon}\n </span>\n ) : (\n <span\n aria-hidden\n className={cn(\n \"bg-pho-primary ring-pho-primary mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-full ring-1 ring-inset\",\n \"group-hover:bg-pho-primary-hover group-hover:ring-pho-ink transition-[background-color,box-shadow] duration-150 ease-out\",\n \"group-data-[checked]:bg-pho-brand-solid group-data-[checked]:group-hover:bg-pho-brand-solid-hover group-data-[checked]:ring-transparent\",\n )}\n >\n <BaseRadio.Indicator\n render={\n <motion.span\n initial={{ scale: 0 }}\n animate={{ scale: 1 }}\n transition={CHOICE_INDICATOR_POP_TRANSITION}\n />\n }\n className=\"bg-pho-on-brand size-1.5 rounded-full\"\n />\n </span>\n )}\n <CardCopy title={title} description={description} />\n </BaseRadio.Root>\n );\n}\n\nRadioCard.displayName = \"RadioCard\";\n"],"mappings":";;;;;;;;;AAoBA,IAAM,IAA4B,EAAc,EAAK;AAGrD,SAAgB,IAAwB;AACtC,SAAO,EAAW,CAAyB;AAC7C;AAOA,SAAgB,EAAW,EAAE,WAAA,GAAW,UAAA,GAAU,GAAG,EAAA,GAA0B;AAC7E,SACE,gBAAA,EAAC,EAA0B,UAA3B;AAAA,IAAoC,OAAO,EAAQ;AAAA,IACjD,UAAA,gBAAA,EAAC,GAAD;AAAA,MACY,UAAA;AAAA,MACV,WAAW,EAAG,uBAAuB,CAAS;AAAA,MAC9C,GAAI;AAAA,IACL,CAAA;AAAA,EACiC,CAAA;AAExC;AAEA,EAAW,cAAc;AAezB,SAAgB,EAAM,EAAE,WAAA,GAAW,OAAA,GAAO,UAAA,GAAU,GAAG,EAAA,GAAqB;AAC1E,QAAM,IAAgB,EAAsB,GACtC,EAAE,aAAA,EAAA,IAAgB,EAAc;AAAA,IACpC,OAAO;AAAA,IACP,UAAU,GAAQ,KAAY;AAAA,EAChC,CAAC,GAIK,EAAE,eAAA,GAAe,GAAG,EAAA,IAAmB,GAEvC,IACJ,gBAAA,EAAC,EAAU,MAAX;AAAA,IACY,UAAA;AAAA,IACV,QACE,gBAAA,EAAC,EAAO,MAAR;AAAA,MACE,GAAI;AAAA,MACJ,eAAe,IAAQ,SAAY;AAAA,IACpC,CAAA;AAAA,IAEH,WAAW,EACT,2MAEA,sFAEA,2GACA,qEACA,qGACA,iEACA,CACF;AAAA,IACA,GAAI;AAAA,IAKJ,UAAA,gBAAA,EAAC,EAAU,WAAX;AAAA,MACE,QACE,gBAAA,EAAC,EAAO,MAAR;AAAA,QACE,SAAS,EAAE,OAAO,EAAE;AAAA,QACpB,SAAS,EAAE,OAAO,EAAE;AAAA,QACpB,YAAY;AAAA,MACb,CAAA;AAAA,MAEH,WAAU;AAAA,IACX,CAAA;AAAA,EACa,CAAA;AAGlB,SAAK,IAEH,gBAAA,EAAC,SAAD;AAAA,IACE,WAAU;AAAA,IACK,eAAA;AAAA,IAFjB,UAAA,CAIG,GACD,gBAAA,EAAC,QAAD;AAAA,MAAM,WAAU;AAAA,MAAgC,UAAA;AAAA,IAAY,CAAA,CACvD;AAAA,OARU;AAUrB;AAEA,EAAM,cAAc;AC7FpB,SAAS,EAAS,EAChB,OAAA,GACA,aAAA,EAAA,GAIC;AACD,SACE,gBAAA,EAAC,QAAD,EAAA,UAAA,CACE,gBAAA,EAAC,QAAD;AAAA,IAAM,WAAU;AAAA,IAA0B,UAAA;AAAA,EAAY,CAAA,GACrD,IACC,gBAAA,EAAC,QAAD;AAAA,IAAM,WAAU;AAAA,IAA8B,UAAA;AAAA,EAAkB,CAAA,IAC9D,IACA,EAAA,CAAA;AAEV;AAOA,SAAgB,EAAU,EACxB,WAAA,GACA,OAAA,GACA,aAAA,GACA,MAAA,GACA,UAAA,GACA,GAAG,EAAA,GACc;AACjB,QAAM,IAAgB,EAAsB,GACtC,EAAE,aAAA,EAAA,IAAgB,EAAc;AAAA,IACpC,OAAO;AAAA,IACP,UAAU,GAAQ,KAAY;AAAA,IAC9B,YAAY;AAAA,EACd,CAAC,GACK,IAAU,KAAQ;AAExB,SACE,gBAAA,EAAC,EAAU,MAAX;AAAA,IACY,UAAA;AAAA,IACV,QAAQ,gBAAA,EAAC,EAAO,MAAR,EAAa,GAAI,EAAc,CAAA;AAAA,IACvC,WAAW,EACT,GACA,KAAA,oBACA,CACF;AAAA,IACA,GAAI;AAAA,IARN,UAAA,CAUG,IACC,gBAAA,EAAC,QAAD;AAAA,MACE,eAAA;AAAA,MACA,WAAU;AAAA,MAET,UAAA;AAAA,IACG,CAAA,IAEN,gBAAA,EAAC,QAAD;AAAA,MACE,eAAA;AAAA,MACA,WAAW,EACT,0HACA,4HACA,yIACF;AAAA,MAEA,UAAA,gBAAA,EAAC,EAAU,WAAX;AAAA,QACE,QACE,gBAAA,EAAC,EAAO,MAAR;AAAA,UACE,SAAS,EAAE,OAAO,EAAE;AAAA,UACpB,SAAS,EAAE,OAAO,EAAE;AAAA,UACpB,YAAY;AAAA,QACb,CAAA;AAAA,QAEH,WAAU;AAAA,MACX,CAAA;AAAA,IACG,CAAA,GAER,gBAAA,EAAC,GAAD;AAAA,MAAiB,OAAA;AAAA,MAAoB,aAAA;AAAA,IAAc,CAAA,CACrC;AAAA;AAEpB;AAEA,EAAU,cAAc"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { t as a } from "../chunks/cn-
|
|
2
|
+
import { t as a } from "../chunks/cn-ChIgwEl3.js";
|
|
3
3
|
import { r as p } from "../chunks/use-press-pulse-8iorQPsh.js";
|
|
4
4
|
import { t as u } from "../chunks/IconCheck-D2WuculQ.js";
|
|
5
5
|
import { createContext as m, useContext as g } from "react";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.js","names":[],"sources":["../../src/components/select/select.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n type ComponentProps,\n type ElementType,\n type ReactNode,\n} from \"react\";\nimport { Select as BaseSelect } from \"@base-ui/react/select\";\nimport { motion } from \"motion/react\";\nimport { IconCheck } from \"@tabler/icons-react\";\nimport { cn } from \"../../utils/cn\";\nimport { usePressPulse } from \"../../utils/use-press-pulse\";\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/** Lets `ItemIndicator` know whether the Root is in `multiple` mode. */\nconst SelectMultipleContext = createContext(false);\n\nexport type SelectTriggerVariant = \"default\" | \"inline\";\n\n// Inline rides someone else's surface, so its pulse is shallower and snappier\n// than the default field's (0.98 / stiffness 700) — felt, not seen moving.\nconst INLINE_PRESS_SCALE = 0.99;\nconst INLINE_PRESS_SPRING = {\n type: \"spring\",\n stiffness: 1100,\n damping: 40,\n mass: 0.04,\n} as const;\n\nfunction Root({\n multiple = false,\n ...props\n}: ComponentProps<typeof BaseSelect.Root>) {\n return (\n <SelectMultipleContext.Provider value={Boolean(multiple)}>\n <BaseSelect.Root multiple={multiple} {...props} />\n </SelectMultipleContext.Provider>\n );\n}\n\nconst Value = BaseSelect.Value;\nconst Portal = BaseSelect.Portal;\nconst List = BaseSelect.List;\nconst Group = BaseSelect.Group;\n\n// Shared by both Trigger variants — layout, easing, disabled, icon tone.\nconst TRIGGER_BASE = cn(\n \"flex cursor-pointer items-center justify-between gap-2 text-base select-none\",\n // Colors/stroke ease briefly; transform stays out (Motion owns it).\n \"transition-[color,background-color,box-shadow,outline-color] duration-150 ease-out\",\n \"data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\n \"[&_svg]:text-pho-secondary [&_svg]:size-4\",\n);\n\nfunction Trigger({\n className,\n disabled,\n variant = \"default\",\n onPointerDown,\n ...props\n}: StyledProps<typeof BaseSelect.Trigger> & {\n /**\n * `inline` drops the field chrome (ring, background, padding, min-width)\n * to ride a host surface — an Input Group addon, a toolbar — which then\n * carries the focus/open treatment. The press pulse moves to the arrow.\n * @default \"default\"\n */\n variant?: SelectTriggerVariant;\n}) {\n // One-shot press pulse (fires on pointer-down, always completes) — the\n // Effect Button gesture family adapted for a field-sized control. Both\n // variants pulse the whole trigger; inline is shallower and quicker.\n const inline = variant === \"inline\";\n const { motionProps } = usePressPulse({\n scale: inline ? INLINE_PRESS_SCALE : 0.98,\n transition: inline ? INLINE_PRESS_SPRING : undefined,\n disabled: Boolean(disabled),\n });\n\n return (\n <BaseSelect.Trigger\n disabled={disabled}\n onPointerDown={onPointerDown}\n // Motion owns transform; a caller-supplied `render` in props still wins.\n render={<motion.button {...motionProps} />}\n className={cn(\n TRIGGER_BASE,\n inline\n ? // Chrome-free: no surface of its own, text inherits the host\n // tone, and the host shows focus (e.g. Input Group's shared ring).\n \"rounded-base min-w-0 bg-transparent focus-visible:outline-none\"\n : cn(\n // Flat field surface — shadows are reserved for floating\n // layers; the 15% ring-pho-primary hairline is the input edge.\n \"bg-pho-primary ring-pho-primary text-pho-primary outline-pho-brand rounded-base min-w-44 px-3 py-2 ring-1 ring-inset\",\n \"data-[popup-open]:ring-pho-brand focus-visible:outline-2 focus-visible:-outline-offset-1\",\n ),\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Icon({ className, ...props }: StyledProps<typeof BaseSelect.Icon>) {\n return (\n <BaseSelect.Icon\n className={cn(\"flex shrink-0 items-center\", className)}\n {...props}\n />\n );\n}\n\nfunction Positioner({\n className,\n sideOffset = 6,\n align = \"start\",\n alignItemWithTrigger = false,\n ...props\n}: StyledProps<typeof BaseSelect.Positioner>) {\n return (\n <BaseSelect.Positioner\n sideOffset={sideOffset}\n align={align}\n // Base UI defaults to the macOS-style overlap (popup covers the trigger\n // so the selected item sits on the value text) — disorienting in a page\n // flow, so Pho drops the list below the field like a menu instead.\n alignItemWithTrigger={alignItemWithTrigger}\n className={cn(\"z-50 outline-none\", className)}\n {...props}\n />\n );\n}\n\nfunction Popup({ className, ...props }: StyledProps<typeof BaseSelect.Popup>) {\n return (\n <BaseSelect.Popup\n className={cn(\n // Floating layer: keeps its elevation shadow, edged with the site\n // hairline (ring-pho-secondary, #eee/#202020).\n \"bg-pho-primary text-pho-primary shadow-pho-lg ring-pho-secondary rounded-base max-h-[var(--available-height)] min-w-[var(--anchor-width)] origin-[var(--transform-origin)] overflow-y-auto p-1 ring-1 outline-none ring-inset\",\n // Effect-Button animation family, faster: the open springs from the\n // trigger edge with a slight overshoot; close is a quick ease-out.\n \"transition-[transform,opacity] duration-[140ms] ease-[cubic-bezier(0.34,1.3,0.64,1)]\",\n \"data-[starting-style]:scale-95 data-[starting-style]:opacity-0\",\n \"data-[ending-style]:scale-95 data-[ending-style]:opacity-0 data-[ending-style]:duration-100 data-[ending-style]:ease-out\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Item({ className, ...props }: StyledProps<typeof BaseSelect.Item>) {\n return (\n <BaseSelect.Item\n className={cn(\n // Fixed 1rem leading column: the selection mark lives there, so every\n // label starts at the same x whether or not it is selected.\n // `group/pho-item` feeds the multiple-mode checkbox indicator.\n \"group/pho-item text-pho-secondary grid cursor-pointer grid-cols-[1rem_1fr] items-center gap-2 rounded-[calc(var(--radius-base)-4px)] py-1.5 pr-2.5 pl-2 text-base outline-none select-none\",\n // Secondary at rest; highlight lifts to primary + ghost wash (Menu idiom).\n \"data-[highlighted]:bg-pho-ghost-hover data-[highlighted]:text-pho-primary data-[disabled]:opacity-50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ItemText({\n className,\n ...props\n}: StyledProps<typeof BaseSelect.ItemText>) {\n return (\n <BaseSelect.ItemText\n // Pin to column 2: when the single-select indicator unmounts, grid\n // auto-placement would otherwise pull the label into the mark column.\n className={cn(\"col-start-2 min-w-0\", className)}\n {...props}\n />\n );\n}\n\n/**\n * Leading selection mark, mode-aware. Single: a brand check that appears in\n * the reserved column. Multiple: an always-visible checkbox box that fills\n * with the same quiet fill/stroke ease as the standalone Checkbox.\n */\nfunction ItemIndicator({\n className,\n children,\n ...props\n}: StyledProps<typeof BaseSelect.ItemIndicator> & { children?: ReactNode }) {\n const multiple = useContext(SelectMultipleContext);\n const mark = children ?? <IconCheck />;\n\n if (multiple) {\n return (\n <span\n aria-hidden\n className={cn(\n \"col-start-1 flex size-4 shrink-0 items-center justify-center rounded-sm ring-1 ring-inset\",\n \"bg-pho-primary ring-pho-primary text-pho-on-brand\",\n // Fill + stroke ease together on toggle — Checkbox's transition.\n \"transition-[background-color,box-shadow,color] duration-150 ease-out\",\n \"group-data-[selected]/pho-item:bg-pho-brand-solid group-data-[selected]/pho-item:ring-transparent\",\n )}\n >\n <BaseSelect.ItemIndicator\n className={cn(\n \"flex items-center justify-center [&>svg]:size-3\",\n // Glyph pops with the fill; exits on the same path.\n \"transition-[transform,opacity] duration-150 ease-out\",\n \"data-[starting-style]:scale-50 data-[starting-style]:opacity-0\",\n \"data-[ending-style]:scale-50 data-[ending-style]:opacity-0\",\n className,\n )}\n {...props}\n >\n {mark}\n </BaseSelect.ItemIndicator>\n </span>\n );\n }\n\n return (\n <BaseSelect.ItemIndicator\n className={cn(\n \"text-pho-brand col-start-1 flex size-4 items-center justify-center [&>svg]:size-4\",\n className,\n )}\n {...props}\n >\n {mark}\n </BaseSelect.ItemIndicator>\n );\n}\n\nfunction GroupLabel({\n className,\n ...props\n}: StyledProps<typeof BaseSelect.GroupLabel>) {\n return (\n <BaseSelect.GroupLabel\n className={cn(\n \"text-pho-secondary px-2.5 py-1.5 text-xs font-medium\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/**\n * Select built on Base UI `Select` — pick one option (or several with\n * `multiple`) from a list that opens below the trigger on click; the pattern\n * other design systems call a picker. Pass `items` to `Select.Root`, render an\n * `Item` per option, and show the selection with `Select.Value`. For a short,\n * always-visible set use `RadioGroup`; to filter a long list by typing use\n * `Combobox`.\n */\nexport const Select = {\n Root,\n Trigger,\n Value,\n Icon,\n Portal,\n Positioner,\n Popup,\n List,\n Item,\n ItemText,\n ItemIndicator,\n Group,\n GroupLabel,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"select.js","names":[],"sources":["../../src/components/select/select.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n type ComponentProps,\n type ElementType,\n type ReactNode,\n} from \"react\";\nimport { Select as BaseSelect } from \"@base-ui/react/select\";\nimport { motion } from \"motion/react\";\nimport { IconCheck } from \"@tabler/icons-react\";\nimport { cn } from \"../../utils/cn\";\nimport { usePressPulse } from \"../../utils/use-press-pulse\";\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/** Lets `ItemIndicator` know whether the Root is in `multiple` mode. */\nconst SelectMultipleContext = createContext(false);\n\nexport type SelectTriggerVariant = \"default\" | \"inline\";\n\n// Inline rides someone else's surface, so its pulse is shallower and snappier\n// than the default field's (0.98 / stiffness 700) — felt, not seen moving.\nconst INLINE_PRESS_SCALE = 0.99;\nconst INLINE_PRESS_SPRING = {\n type: \"spring\",\n stiffness: 1100,\n damping: 40,\n mass: 0.04,\n} as const;\n\nfunction Root({\n multiple = false,\n ...props\n}: ComponentProps<typeof BaseSelect.Root>) {\n return (\n <SelectMultipleContext.Provider value={Boolean(multiple)}>\n <BaseSelect.Root multiple={multiple} {...props} />\n </SelectMultipleContext.Provider>\n );\n}\n\nconst Value = BaseSelect.Value;\nconst Portal = BaseSelect.Portal;\nconst List = BaseSelect.List;\nconst Group = BaseSelect.Group;\n\n// Shared by both Trigger variants — layout, easing, disabled, icon tone.\nconst TRIGGER_BASE = cn(\n \"flex cursor-pointer items-center justify-between gap-2 text-base select-none\",\n // Colors/stroke ease briefly; transform stays out (Motion owns it).\n \"transition-[color,background-color,box-shadow,outline-color] duration-150 ease-out\",\n \"data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\n \"[&_svg]:text-pho-secondary [&_svg]:size-4\",\n);\n\nfunction Trigger({\n className,\n disabled,\n variant = \"default\",\n onPointerDown,\n ...props\n}: StyledProps<typeof BaseSelect.Trigger> & {\n /**\n * `inline` drops the field chrome (ring, background, padding, min-width)\n * to ride a host surface — an Input Group addon, a toolbar — which then\n * carries the focus/open treatment. The press pulse moves to the arrow.\n * @default \"default\"\n */\n variant?: SelectTriggerVariant;\n}) {\n // One-shot press pulse (fires on pointer-down, always completes) — the\n // Effect Button gesture family adapted for a field-sized control. Both\n // variants pulse the whole trigger; inline is shallower and quicker.\n const inline = variant === \"inline\";\n const { motionProps } = usePressPulse({\n scale: inline ? INLINE_PRESS_SCALE : 0.98,\n transition: inline ? INLINE_PRESS_SPRING : undefined,\n disabled: Boolean(disabled),\n });\n\n return (\n <BaseSelect.Trigger\n disabled={disabled}\n onPointerDown={onPointerDown}\n // Motion owns transform; a caller-supplied `render` in props still wins.\n render={<motion.button {...motionProps} />}\n className={cn(\n TRIGGER_BASE,\n inline\n ? // Chrome-free: no surface of its own, text inherits the host\n // tone, and the host shows focus (e.g. Input Group's shared ring).\n \"rounded-base min-w-0 bg-transparent focus-visible:outline-none\"\n : cn(\n // Flat field surface — shadows are reserved for floating\n // layers; the 15% ring-pho-primary hairline is the input edge.\n \"bg-pho-primary ring-pho-primary text-pho-primary outline-pho-brand rounded-base min-w-44 px-3 py-2 ring-1 ring-inset\",\n \"data-[popup-open]:ring-pho-brand focus-visible:outline-2 focus-visible:-outline-offset-1\",\n ),\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Icon({ className, ...props }: StyledProps<typeof BaseSelect.Icon>) {\n return (\n <BaseSelect.Icon\n className={cn(\"flex shrink-0 items-center\", className)}\n {...props}\n />\n );\n}\n\nfunction Positioner({\n className,\n sideOffset = 6,\n align = \"start\",\n alignItemWithTrigger = false,\n ...props\n}: StyledProps<typeof BaseSelect.Positioner>) {\n return (\n <BaseSelect.Positioner\n sideOffset={sideOffset}\n align={align}\n // Base UI defaults to the macOS-style overlap (popup covers the trigger\n // so the selected item sits on the value text) — disorienting in a page\n // flow, so Pho drops the list below the field like a menu instead.\n alignItemWithTrigger={alignItemWithTrigger}\n className={cn(\"z-50 outline-none\", className)}\n {...props}\n />\n );\n}\n\nfunction Popup({ className, ...props }: StyledProps<typeof BaseSelect.Popup>) {\n return (\n <BaseSelect.Popup\n className={cn(\n // Floating layer: keeps its elevation shadow, edged with the site\n // hairline (ring-pho-secondary, #eee/#202020).\n \"bg-pho-primary text-pho-primary shadow-pho-lg ring-pho-secondary rounded-base max-h-[var(--available-height)] min-w-[var(--anchor-width)] origin-[var(--transform-origin)] overflow-y-auto p-1 ring-1 outline-none ring-inset\",\n // Effect-Button animation family, faster: the open springs from the\n // trigger edge with a slight overshoot; close is a quick ease-out.\n \"transition-[transform,opacity] duration-[140ms] ease-[cubic-bezier(0.34,1.3,0.64,1)]\",\n \"data-[starting-style]:scale-95 data-[starting-style]:opacity-0\",\n \"data-[ending-style]:scale-95 data-[ending-style]:opacity-0 data-[ending-style]:duration-100 data-[ending-style]:ease-out\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Item({ className, ...props }: StyledProps<typeof BaseSelect.Item>) {\n return (\n <BaseSelect.Item\n className={cn(\n // Fixed 1rem leading column: the selection mark lives there, so every\n // label starts at the same x whether or not it is selected.\n // `group/pho-item` feeds the multiple-mode checkbox indicator.\n \"group/pho-item text-pho-secondary grid cursor-pointer grid-cols-[1rem_1fr] items-center gap-2 rounded-[calc(var(--radius-base)-4px)] py-1.5 pr-2.5 pl-2 text-base outline-none select-none\",\n // Secondary at rest; highlight lifts to primary + ghost wash (Menu idiom).\n \"data-[highlighted]:bg-pho-ghost-hover data-[highlighted]:text-pho-primary data-[disabled]:opacity-50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ItemText({\n className,\n ...props\n}: StyledProps<typeof BaseSelect.ItemText>) {\n return (\n <BaseSelect.ItemText\n // Pin to column 2: when the single-select indicator unmounts, grid\n // auto-placement would otherwise pull the label into the mark column.\n className={cn(\"col-start-2 min-w-0\", className)}\n {...props}\n />\n );\n}\n\n/**\n * Leading selection mark, mode-aware. Single: a brand check that appears in\n * the reserved column. Multiple: an always-visible checkbox box that fills\n * with the same quiet fill/stroke ease as the standalone Checkbox.\n */\nfunction ItemIndicator({\n className,\n children,\n ...props\n}: StyledProps<typeof BaseSelect.ItemIndicator> & { children?: ReactNode }) {\n const multiple = useContext(SelectMultipleContext);\n const mark = children ?? <IconCheck />;\n\n if (multiple) {\n return (\n <span\n aria-hidden\n className={cn(\n \"col-start-1 flex size-4 shrink-0 items-center justify-center rounded-sm ring-1 ring-inset\",\n \"bg-pho-primary ring-pho-primary text-pho-on-brand\",\n // Fill + stroke ease together on toggle — Checkbox's transition.\n \"transition-[background-color,box-shadow,color] duration-150 ease-out\",\n \"group-data-[selected]/pho-item:bg-pho-brand-solid group-data-[selected]/pho-item:ring-transparent\",\n )}\n >\n <BaseSelect.ItemIndicator\n className={cn(\n \"flex items-center justify-center [&>svg]:size-3\",\n // Glyph pops with the fill; exits on the same path.\n \"transition-[transform,opacity] duration-150 ease-out\",\n \"data-[starting-style]:scale-50 data-[starting-style]:opacity-0\",\n \"data-[ending-style]:scale-50 data-[ending-style]:opacity-0\",\n className,\n )}\n {...props}\n >\n {mark}\n </BaseSelect.ItemIndicator>\n </span>\n );\n }\n\n return (\n <BaseSelect.ItemIndicator\n className={cn(\n \"text-pho-brand col-start-1 flex size-4 items-center justify-center [&>svg]:size-4\",\n className,\n )}\n {...props}\n >\n {mark}\n </BaseSelect.ItemIndicator>\n );\n}\n\nfunction GroupLabel({\n className,\n ...props\n}: StyledProps<typeof BaseSelect.GroupLabel>) {\n return (\n <BaseSelect.GroupLabel\n className={cn(\n \"text-pho-secondary px-2.5 py-1.5 text-xs font-medium\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/**\n * Select built on Base UI `Select` — pick one option (or several with\n * `multiple`) from a list that opens below the trigger on click; the pattern\n * other design systems call a picker. Pass `items` to `Select.Root`, render an\n * `Item` per option, and show the selection with `Select.Value`. For a short,\n * always-visible set use `RadioGroup`; to filter a long list by typing use\n * `Combobox`.\n */\nexport const Select = {\n Root,\n Trigger,\n Value,\n Icon,\n Portal,\n Positioner,\n Popup,\n List,\n Item,\n ItemText,\n ItemIndicator,\n Group,\n GroupLabel,\n};\n"],"mappings":"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"}
|
|
@@ -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-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,
|
|
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,IAOJ,UAAA,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,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { t as _ } from "../chunks/cn-
|
|
2
|
+
import { t as _ } from "../chunks/cn-ChIgwEl3.js";
|
|
3
3
|
import { t as y } from "../chunks/createReactComponent-BqCmnqfX.js";
|
|
4
4
|
import { useEffect as v, useSyncExternalStore as $ } from "react";
|
|
5
5
|
import { jsx as h } from "react/jsx-runtime";
|
|
@@ -1 +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 (xs–md p-0.5 = 2px, lg p-1 = 4px). Plain round, no\n// squircle (the track carries a ring-inset).\nconst THEME_SIZES = {\n xs: {\n track: \"gap-px rounded-base p-0.5\",\n item: \"size-5.5 rounded-[calc(var(--radius-base)-2px)] [&>svg]:size-3\",\n },\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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"}
|
|
1
|
+
{"version":3,"file":"theme-toggle.js","names":["__iconNode","__iconNode"],"sources":["../../../../node_modules/.pnpm/@tabler+icons-react@3.46.0_react@19.2.8/node_modules/@tabler/icons-react/dist/esm/icons/IconDeviceDesktop.mjs","../../../../node_modules/.pnpm/@tabler+icons-react@3.46.0_react@19.2.8/node_modules/@tabler/icons-react/dist/esm/icons/IconMoon.mjs","../../../../node_modules/.pnpm/@tabler+icons-react@3.46.0_react@19.2.8/node_modules/@tabler/icons-react/dist/esm/icons/IconSun.mjs","../../src/components/theme-toggle/theme-toggle.tsx"],"sourcesContent":["/**\n * @license @tabler/icons-react v3.46.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.46.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.46.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 (xs–md p-0.5 = 2px, lg p-1 = 4px). Plain round, no\n// squircle (the track carries a ring-inset).\nconst THEME_SIZES = {\n xs: {\n track: \"gap-px rounded-base p-0.5\",\n item: \"size-5.5 rounded-[calc(var(--radius-base)-2px)] [&>svg]:size-3\",\n },\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
package/dist/icons.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons.js","names":[],"sources":["../src/icons/discord.tsx","../src/icons/github.tsx","../src/icons/google.tsx","../src/icons/imessage.tsx","../src/icons/photon-mark.tsx","../src/icons/reddit.tsx","../src/icons/slack.tsx","../src/icons/telegram.tsx","../src/icons/whatsapp.tsx","../src/icons/x.tsx","../src/icons/youtube.tsx","../src/icons/index.ts"],"sourcesContent":["import { type ComponentProps } from \"react\";\n\n/** Discord brand mark — monochrome, follows `currentColor`. */\nexport function DiscordIcon(props: ComponentProps<\"svg\">) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" {...props}>\n <path d=\"M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z\" />\n </svg>\n );\n}\n","import { type ComponentProps } from \"react\";\n\n/** GitHub brand mark — monochrome, follows `currentColor`. */\nexport function GitHubIcon(props: ComponentProps<\"svg\">) {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 1.5A10.5 10.5 0 0 0 8.68 22c.53.1.72-.23.72-.5l-.01-1.82c-2.92.63-3.54-1.4-3.54-1.4-.48-1.22-1.17-1.54-1.17-1.54-.95-.65.07-.64.07-.64 1.06.07 1.61 1.09 1.61 1.09.94 1.6 2.46 1.14 3.06.87.1-.68.37-1.14.67-1.4-2.33-.27-4.78-1.17-4.78-5.2 0-1.15.41-2.09 1.08-2.83-.1-.27-.47-1.34.1-2.8 0 0 .88-.28 2.88 1.08a9.9 9.9 0 0 1 5.24 0c2-1.36 2.88-1.08 2.88-1.08.57 1.46.21 2.53.1 2.8.68.74 1.08 1.68 1.08 2.83 0 4.04-2.45 4.93-4.79 5.19.38.33.71.97.71 1.96l-.01 2.9c0 .28.19.61.73.5A10.5 10.5 0 0 0 12 1.5Z\"\n />\n </svg>\n );\n}\n","import { type ComponentProps } from \"react\";\n\n/** Google brand mark — fixed multi-color fills (not themeable by design). */\nexport function GoogleIcon(props: ComponentProps<\"svg\">) {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1Z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84A11 11 0 0 0 12 23Z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M5.84 14.1a6.6 6.6 0 0 1 0-4.2V7.06H2.18a11 11 0 0 0 0 9.88l3.66-2.84Z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1A11 11 0 0 0 2.18 7.06l3.66 2.84C6.71 7.3 9.14 5.38 12 5.38Z\"\n />\n </svg>\n );\n}\n","import { type ComponentProps } from \"react\";\n\n/** iMessage brand mark — monochrome, follows `currentColor`. */\nexport function IMessageIcon(props: ComponentProps<\"svg\">) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" {...props}>\n <path d=\"M5.285 0A5.273 5.273 0 0 0 0 5.285v13.43A5.273 5.273 0 0 0 5.285 24h13.43A5.273 5.273 0 0 0 24 18.715V5.285A5.273 5.273 0 0 0 18.715 0ZM12 4.154a8.809 7.337 0 0 1 8.809 7.338A8.809 7.337 0 0 1 12 18.828a8.809 7.337 0 0 1-2.492-.303A8.656 7.337 0 0 1 5.93 19.93a9.929 7.337 0 0 0 1.54-2.155 8.809 7.337 0 0 1-4.279-6.283A8.809 7.337 0 0 1 12 4.154\" />\n </svg>\n );\n}\n","import { type ComponentProps } from \"react\";\n\n/** The Photon mark — three angled signal bars; inherits `currentColor`. */\nexport function PhotonMark(props: ComponentProps<\"svg\">) {\n return (\n <svg viewBox=\"0 0 29 29\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M24.012 15.984h3.384c.612 0 1.044.576.9 1.116l-2.592 10.296c-.072.396-.432.684-.864.684h-3.42c-.54 0-.972-.576-.864-1.116l2.592-10.296c.108-.396.432-.684.864-.684ZM17.172 0h3.384c.612 0 1.044.576.864 1.116l-2.52 10.296c-.144.396-.504.684-.936.684h-3.348c-.612 0-1.044-.576-.864-1.116L16.308.684C16.38.288 16.776 0 17.172 0ZM3.636 7.416H7.02c.576 0 1.008.576.864 1.152l-2.556 10.26c-.108.396-.468.684-.864.684h-3.42c-.576 0-1.044-.54-.864-1.116l2.556-10.26c.108-.432.468-.72.9-.72Z\"\n />\n </svg>\n );\n}\n","import { type ComponentProps } from \"react\";\n\n/** Reddit brand mark — monochrome, follows `currentColor`. */\nexport function RedditIcon(props: ComponentProps<\"svg\">) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" {...props}>\n <path d=\"M12 0C5.373 0 0 5.373 0 12c0 3.314 1.343 6.314 3.515 8.485l-2.286 2.286C.775 23.225 1.097 24 1.738 24H12c6.627 0 12-5.373 12-12S18.627 0 12 0Zm4.388 3.199c1.104 0 1.999.895 1.999 1.999 0 1.105-.895 2-1.999 2-.946 0-1.739-.657-1.947-1.539v.002c-1.147.162-2.032 1.15-2.032 2.341v.007c1.776.067 3.4.567 4.686 1.363.473-.363 1.064-.58 1.707-.58 1.547 0 2.802 1.254 2.802 2.802 0 1.117-.655 2.081-1.601 2.531-.088 3.256-3.637 5.876-7.997 5.876-4.361 0-7.905-2.617-7.998-5.87-.954-.447-1.614-1.415-1.614-2.538 0-1.548 1.255-2.802 2.803-2.802.645 0 1.239.218 1.712.585 1.275-.79 2.881-1.291 4.64-1.365v-.01c0-1.663 1.263-3.034 2.88-3.207.188-.911.993-1.595 1.959-1.595Zm-8.085 8.376c-.784 0-1.459.78-1.506 1.797-.047 1.016.64 1.429 1.426 1.429.786 0 1.371-.369 1.418-1.385.047-1.017-.553-1.841-1.338-1.841Zm7.406 0c-.786 0-1.385.824-1.338 1.841.047 1.017.634 1.385 1.418 1.385.785 0 1.473-.413 1.426-1.429-.046-1.017-.721-1.797-1.506-1.797Zm-3.703 4.013c-.974 0-1.907.048-2.77.135-.147.015-.241.168-.183.305.483 1.154 1.622 1.964 2.953 1.964 1.33 0 2.47-.81 2.953-1.964.057-.137-.037-.29-.184-.305-.863-.087-1.795-.135-2.769-.135Z\" />\n </svg>\n );\n}\n","import { type ComponentProps } from \"react\";\n\n/** Slack brand mark — monochrome, follows `currentColor`. */\nexport function SlackIcon(props: ComponentProps<\"svg\">) {\n return (\n <svg\n viewBox=\"73.6 73.6 122.8 122.8\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M99.4,151.2c0,7.1-5.8,12.9-12.9,12.9s-12.9-5.8-12.9-12.9c0-7.1,5.8-12.9,12.9-12.9h12.9V151.2z\" />\n <path d=\"M105.9,151.2c0-7.1,5.8-12.9,12.9-12.9s12.9,5.8,12.9,12.9v32.3c0,7.1-5.8,12.9-12.9,12.9s-12.9-5.8-12.9-12.9C105.9,183.5,105.9,151.2,105.9,151.2z\" />\n <path d=\"M118.8,99.4c-7.1,0-12.9-5.8-12.9-12.9s5.8-12.9,12.9-12.9s12.9,5.8,12.9,12.9v12.9H118.8z\" />\n <path d=\"M118.8,105.9c7.1,0,12.9,5.8,12.9,12.9s-5.8,12.9-12.9,12.9H86.5c-7.1,0-12.9-5.8-12.9-12.9s5.8-12.9,12.9-12.9C86.5,105.9,118.8,105.9,118.8,105.9z\" />\n <path d=\"M170.6,118.8c0-7.1,5.8-12.9,12.9-12.9c7.1,0,12.9,5.8,12.9,12.9s-5.8,12.9-12.9,12.9h-12.9V118.8z\" />\n <path d=\"M164.1,118.8c0,7.1-5.8,12.9-12.9,12.9c-7.1,0-12.9-5.8-12.9-12.9V86.5c0-7.1,5.8-12.9,12.9-12.9c7.1,0,12.9,5.8,12.9,12.9V118.8z\" />\n <path d=\"M151.2,170.6c7.1,0,12.9,5.8,12.9,12.9c0,7.1-5.8,12.9-12.9,12.9c-7.1,0-12.9-5.8-12.9-12.9v-12.9H151.2z\" />\n <path d=\"M151.2,164.1c-7.1,0-12.9-5.8-12.9-12.9c0-7.1,5.8-12.9,12.9-12.9h32.3c7.1,0,12.9,5.8,12.9,12.9c0,7.1-5.8,12.9-12.9,12.9H151.2z\" />\n </svg>\n );\n}\n","import { type ComponentProps } from \"react\";\n\n/** Telegram brand mark — monochrome, follows `currentColor`. */\nexport function TelegramIcon(props: ComponentProps<\"svg\">) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" {...props}>\n <path d=\"M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z\" />\n </svg>\n );\n}\n","import { type ComponentProps } from \"react\";\n\n/** WhatsApp brand mark — monochrome, follows `currentColor`. */\nexport function WhatsAppIcon(props: ComponentProps<\"svg\">) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" {...props}>\n <path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z\" />\n </svg>\n );\n}\n","import { type ComponentProps } from \"react\";\n\n/** X (Twitter) brand mark — monochrome, follows `currentColor`. */\nexport function XIcon(props: ComponentProps<\"svg\">) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" {...props}>\n <path d=\"M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z\" />\n </svg>\n );\n}\n","import { type ComponentProps } from \"react\";\n\n/** YouTube brand mark — monochrome, follows `currentColor`. */\nexport function YouTubeIcon(props: ComponentProps<\"svg\">) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" {...props}>\n <path d=\"M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z\" />\n </svg>\n );\n}\n","/**\n * Photon brand and social marks — monochrome `currentColor` (except Google,\n * which is intentionally multi-color). Path data is canonical; do not edit.\n */\nimport { type ComponentProps, type FC } from \"react\";\nimport { DiscordIcon } from \"./discord\";\nimport { GitHubIcon } from \"./github\";\nimport { GoogleIcon } from \"./google\";\nimport { IMessageIcon } from \"./imessage\";\nimport { PhotonMark } from \"./photon-mark\";\nimport { RedditIcon } from \"./reddit\";\nimport { SlackIcon } from \"./slack\";\nimport { TelegramIcon } from \"./telegram\";\nimport { WhatsAppIcon } from \"./whatsapp\";\nimport { XIcon } from \"./x\";\nimport { YouTubeIcon } from \"./youtube\";\n\nexport {\n DiscordIcon,\n GitHubIcon,\n GoogleIcon,\n IMessageIcon,\n PhotonMark,\n RedditIcon,\n SlackIcon,\n TelegramIcon,\n WhatsAppIcon,\n XIcon,\n YouTubeIcon,\n};\n\n/** Third-party marks in gallery order (Photon's own mark ships separately). */\nexport const brandMarks: { name: string; Icon: FC<ComponentProps<\"svg\">> }[] = [\n { name: \"GitHub\", Icon: GitHubIcon },\n { name: \"X\", Icon: XIcon },\n { name: \"Discord\", Icon: DiscordIcon },\n { name: \"Telegram\", Icon: TelegramIcon },\n { name: \"iMessage\", Icon: IMessageIcon },\n { name: \"Slack\", Icon: SlackIcon },\n { name: \"Reddit\", Icon: RedditIcon },\n { name: \"YouTube\", Icon: YouTubeIcon },\n { name: \"WhatsApp\", Icon: WhatsAppIcon },\n { name: \"Google\", Icon: GoogleIcon },\n];\n"],"mappings":";;;AAGA,SAAgB,EAAY,GAA8B;AACxD,SACE,gBAAA,EAAC,OAAD;AAAA,IAAK,SAAQ;AAAA,IAAY,MAAK;AAAA,IAAe,eAAY;AAAA,IAAO,GAAI;AAAA,cAClE,gBAAA,EAAC,QAAD,EAAM,GAAE,kvCAAmvC,CAAA;AAAA,EACxvC,CAAA;AAET;ACNA,SAAgB,EAAW,GAA8B;AACvD,SACE,gBAAA,EAAC,OAAD;AAAA,IAAK,SAAQ;AAAA,IAAY,eAAY;AAAA,IAAO,GAAI;AAAA,cAC9C,gBAAA,EAAC,QAAD;AAAA,MACE,MAAK;AAAA,MACL,UAAS;AAAA,MACT,UAAS;AAAA,MACT,GAAE;AAAA,IACH,CAAA;AAAA,EACE,CAAA;AAET;ACXA,SAAgB,EAAW,GAA8B;AACvD,SACE,gBAAA,EAAC,OAAD;AAAA,IAAK,SAAQ;AAAA,IAAY,eAAY;AAAA,IAAO,GAAI;AAAA,cAAhD;AAAA,MACE,gBAAA,EAAC,QAAD;AAAA,QACE,MAAK;AAAA,QACL,GAAE;AAAA,MACH,CAAA;AAAA,MACD,gBAAA,EAAC,QAAD;AAAA,QACE,MAAK;AAAA,QACL,GAAE;AAAA,MACH,CAAA;AAAA,MACD,gBAAA,EAAC,QAAD;AAAA,QACE,MAAK;AAAA,QACL,GAAE;AAAA,MACH,CAAA;AAAA,MACD,gBAAA,EAAC,QAAD;AAAA,QACE,MAAK;AAAA,QACL,GAAE;AAAA,MACH,CAAA;AAAA,IACE;AAAA;AAET;ACrBA,SAAgB,EAAa,GAA8B;AACzD,SACE,gBAAA,EAAC,OAAD;AAAA,IAAK,SAAQ;AAAA,IAAY,MAAK;AAAA,IAAe,eAAY;AAAA,IAAO,GAAI;AAAA,cAClE,gBAAA,EAAC,QAAD,EAAM,GAAE,6VAA8V,CAAA;AAAA,EACnW,CAAA;AAET;ACNA,SAAgB,EAAW,GAA8B;AACvD,SACE,gBAAA,EAAC,OAAD;AAAA,IAAK,SAAQ;AAAA,IAAY,MAAK;AAAA,IAAO,eAAY;AAAA,IAAO,GAAI;AAAA,cAC1D,gBAAA,EAAC,QAAD;AAAA,MACE,MAAK;AAAA,MACL,GAAE;AAAA,IACH,CAAA;AAAA,EACE,CAAA;AAET;ACTA,SAAgB,EAAW,GAA8B;AACvD,SACE,gBAAA,EAAC,OAAD;AAAA,IAAK,SAAQ;AAAA,IAAY,MAAK;AAAA,IAAe,eAAY;AAAA,IAAO,GAAI;AAAA,cAClE,gBAAA,EAAC,QAAD,EAAM,GAAE,smCAAumC,CAAA;AAAA,EAC5mC,CAAA;AAET;ACNA,SAAgB,EAAU,GAA8B;AACtD,SACE,gBAAA,EAAC,OAAD;AAAA,IACE,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,eAAY;AAAA,IACZ,GAAI;AAAA,cAJN;AAAA,MAME,gBAAA,EAAC,QAAD,EAAM,GAAE,gGAAiG,CAAA;AAAA,MACzG,gBAAA,EAAC,QAAD,EAAM,GAAE,kJAAmJ,CAAA;AAAA,MAC3J,gBAAA,EAAC,QAAD,EAAM,GAAE,0FAA2F,CAAA;AAAA,MACnG,gBAAA,EAAC,QAAD,EAAM,GAAE,kJAAmJ,CAAA;AAAA,MAC3J,gBAAA,EAAC,QAAD,EAAM,GAAE,kGAAmG,CAAA;AAAA,MAC3G,gBAAA,EAAC,QAAD,EAAM,GAAE,gIAAiI,CAAA;AAAA,MACzI,gBAAA,EAAC,QAAD,EAAM,GAAE,wGAAyG,CAAA;AAAA,MACjH,gBAAA,EAAC,QAAD,EAAM,GAAE,gIAAiI,CAAA;AAAA,IACtI;AAAA;AAET;AClBA,SAAgB,EAAa,GAA8B;AACzD,SACE,gBAAA,EAAC,OAAD;AAAA,IAAK,SAAQ;AAAA,IAAY,MAAK;AAAA,IAAe,eAAY;AAAA,IAAO,GAAI;AAAA,cAClE,gBAAA,EAAC,QAAD,EAAM,GAAE,ynBAA0nB,CAAA;AAAA,EAC/nB,CAAA;AAET;ACNA,SAAgB,EAAa,GAA8B;AACzD,SACE,gBAAA,EAAC,OAAD;AAAA,IAAK,SAAQ;AAAA,IAAY,MAAK;AAAA,IAAe,eAAY;AAAA,IAAO,GAAI;AAAA,cAClE,gBAAA,EAAC,QAAD,EAAM,GAAE,mlCAAolC,CAAA;AAAA,EACzlC,CAAA;AAET;ACNA,SAAgB,EAAM,GAA8B;AAClD,SACE,gBAAA,EAAC,OAAD;AAAA,IAAK,SAAQ;AAAA,IAAY,MAAK;AAAA,IAAe,eAAY;AAAA,IAAO,GAAI;AAAA,cAClE,gBAAA,EAAC,QAAD,EAAM,GAAE,qMAAsM,CAAA;AAAA,EAC3M,CAAA;AAET;ACNA,SAAgB,EAAY,GAA8B;AACxD,SACE,gBAAA,EAAC,OAAD;AAAA,IAAK,SAAQ;AAAA,IAAY,MAAK;AAAA,IAAe,eAAY;AAAA,IAAO,GAAI;AAAA,cAClE,gBAAA,EAAC,QAAD,EAAM,GAAE,+VAAgW,CAAA;AAAA,EACrW,CAAA;AAET;ACuBA,IAAa,IAAkE;AAAA,EAC7E;AAAA,IAAE,MAAM;AAAA,IAAU,MAAM;AAAA,EAAW;AAAA,EACnC;AAAA,IAAE,MAAM;AAAA,IAAK,MAAM;AAAA,EAAM;AAAA,EACzB;AAAA,IAAE,MAAM;AAAA,IAAW,MAAM;AAAA,EAAY;AAAA,EACrC;AAAA,IAAE,MAAM;AAAA,IAAY,MAAM;AAAA,EAAa;AAAA,EACvC;AAAA,IAAE,MAAM;AAAA,IAAY,MAAM;AAAA,EAAa;AAAA,EACvC;AAAA,IAAE,MAAM;AAAA,IAAS,MAAM;AAAA,EAAU;AAAA,EACjC;AAAA,IAAE,MAAM;AAAA,IAAU,MAAM;AAAA,EAAW;AAAA,EACnC;AAAA,IAAE,MAAM;AAAA,IAAW,MAAM;AAAA,EAAY;AAAA,EACrC;AAAA,IAAE,MAAM;AAAA,IAAY,MAAM;AAAA,EAAa;AAAA,EACvC;AAAA,IAAE,MAAM;AAAA,IAAU,MAAM;AAAA,EAAW;AACrC"}
|
|
1
|
+
{"version":3,"file":"icons.js","names":[],"sources":["../src/icons/discord.tsx","../src/icons/github.tsx","../src/icons/google.tsx","../src/icons/imessage.tsx","../src/icons/photon-mark.tsx","../src/icons/reddit.tsx","../src/icons/slack.tsx","../src/icons/telegram.tsx","../src/icons/whatsapp.tsx","../src/icons/x.tsx","../src/icons/youtube.tsx","../src/icons/index.ts"],"sourcesContent":["import { type ComponentProps } from \"react\";\n\n/** Discord brand mark — monochrome, follows `currentColor`. */\nexport function DiscordIcon(props: ComponentProps<\"svg\">) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" {...props}>\n <path d=\"M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z\" />\n </svg>\n );\n}\n","import { type ComponentProps } from \"react\";\n\n/** GitHub brand mark — monochrome, follows `currentColor`. */\nexport function GitHubIcon(props: ComponentProps<\"svg\">) {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 1.5A10.5 10.5 0 0 0 8.68 22c.53.1.72-.23.72-.5l-.01-1.82c-2.92.63-3.54-1.4-3.54-1.4-.48-1.22-1.17-1.54-1.17-1.54-.95-.65.07-.64.07-.64 1.06.07 1.61 1.09 1.61 1.09.94 1.6 2.46 1.14 3.06.87.1-.68.37-1.14.67-1.4-2.33-.27-4.78-1.17-4.78-5.2 0-1.15.41-2.09 1.08-2.83-.1-.27-.47-1.34.1-2.8 0 0 .88-.28 2.88 1.08a9.9 9.9 0 0 1 5.24 0c2-1.36 2.88-1.08 2.88-1.08.57 1.46.21 2.53.1 2.8.68.74 1.08 1.68 1.08 2.83 0 4.04-2.45 4.93-4.79 5.19.38.33.71.97.71 1.96l-.01 2.9c0 .28.19.61.73.5A10.5 10.5 0 0 0 12 1.5Z\"\n />\n </svg>\n );\n}\n","import { type ComponentProps } from \"react\";\n\n/** Google brand mark — fixed multi-color fills (not themeable by design). */\nexport function GoogleIcon(props: ComponentProps<\"svg\">) {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1Z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84A11 11 0 0 0 12 23Z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M5.84 14.1a6.6 6.6 0 0 1 0-4.2V7.06H2.18a11 11 0 0 0 0 9.88l3.66-2.84Z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1A11 11 0 0 0 2.18 7.06l3.66 2.84C6.71 7.3 9.14 5.38 12 5.38Z\"\n />\n </svg>\n );\n}\n","import { type ComponentProps } from \"react\";\n\n/** iMessage brand mark — monochrome, follows `currentColor`. */\nexport function IMessageIcon(props: ComponentProps<\"svg\">) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" {...props}>\n <path d=\"M5.285 0A5.273 5.273 0 0 0 0 5.285v13.43A5.273 5.273 0 0 0 5.285 24h13.43A5.273 5.273 0 0 0 24 18.715V5.285A5.273 5.273 0 0 0 18.715 0ZM12 4.154a8.809 7.337 0 0 1 8.809 7.338A8.809 7.337 0 0 1 12 18.828a8.809 7.337 0 0 1-2.492-.303A8.656 7.337 0 0 1 5.93 19.93a9.929 7.337 0 0 0 1.54-2.155 8.809 7.337 0 0 1-4.279-6.283A8.809 7.337 0 0 1 12 4.154\" />\n </svg>\n );\n}\n","import { type ComponentProps } from \"react\";\n\n/** The Photon mark — three angled signal bars; inherits `currentColor`. */\nexport function PhotonMark(props: ComponentProps<\"svg\">) {\n return (\n <svg viewBox=\"0 0 29 29\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M24.012 15.984h3.384c.612 0 1.044.576.9 1.116l-2.592 10.296c-.072.396-.432.684-.864.684h-3.42c-.54 0-.972-.576-.864-1.116l2.592-10.296c.108-.396.432-.684.864-.684ZM17.172 0h3.384c.612 0 1.044.576.864 1.116l-2.52 10.296c-.144.396-.504.684-.936.684h-3.348c-.612 0-1.044-.576-.864-1.116L16.308.684C16.38.288 16.776 0 17.172 0ZM3.636 7.416H7.02c.576 0 1.008.576.864 1.152l-2.556 10.26c-.108.396-.468.684-.864.684h-3.42c-.576 0-1.044-.54-.864-1.116l2.556-10.26c.108-.432.468-.72.9-.72Z\"\n />\n </svg>\n );\n}\n","import { type ComponentProps } from \"react\";\n\n/** Reddit brand mark — monochrome, follows `currentColor`. */\nexport function RedditIcon(props: ComponentProps<\"svg\">) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" {...props}>\n <path d=\"M12 0C5.373 0 0 5.373 0 12c0 3.314 1.343 6.314 3.515 8.485l-2.286 2.286C.775 23.225 1.097 24 1.738 24H12c6.627 0 12-5.373 12-12S18.627 0 12 0Zm4.388 3.199c1.104 0 1.999.895 1.999 1.999 0 1.105-.895 2-1.999 2-.946 0-1.739-.657-1.947-1.539v.002c-1.147.162-2.032 1.15-2.032 2.341v.007c1.776.067 3.4.567 4.686 1.363.473-.363 1.064-.58 1.707-.58 1.547 0 2.802 1.254 2.802 2.802 0 1.117-.655 2.081-1.601 2.531-.088 3.256-3.637 5.876-7.997 5.876-4.361 0-7.905-2.617-7.998-5.87-.954-.447-1.614-1.415-1.614-2.538 0-1.548 1.255-2.802 2.803-2.802.645 0 1.239.218 1.712.585 1.275-.79 2.881-1.291 4.64-1.365v-.01c0-1.663 1.263-3.034 2.88-3.207.188-.911.993-1.595 1.959-1.595Zm-8.085 8.376c-.784 0-1.459.78-1.506 1.797-.047 1.016.64 1.429 1.426 1.429.786 0 1.371-.369 1.418-1.385.047-1.017-.553-1.841-1.338-1.841Zm7.406 0c-.786 0-1.385.824-1.338 1.841.047 1.017.634 1.385 1.418 1.385.785 0 1.473-.413 1.426-1.429-.046-1.017-.721-1.797-1.506-1.797Zm-3.703 4.013c-.974 0-1.907.048-2.77.135-.147.015-.241.168-.183.305.483 1.154 1.622 1.964 2.953 1.964 1.33 0 2.47-.81 2.953-1.964.057-.137-.037-.29-.184-.305-.863-.087-1.795-.135-2.769-.135Z\" />\n </svg>\n );\n}\n","import { type ComponentProps } from \"react\";\n\n/** Slack brand mark — monochrome, follows `currentColor`. */\nexport function SlackIcon(props: ComponentProps<\"svg\">) {\n return (\n <svg\n viewBox=\"73.6 73.6 122.8 122.8\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M99.4,151.2c0,7.1-5.8,12.9-12.9,12.9s-12.9-5.8-12.9-12.9c0-7.1,5.8-12.9,12.9-12.9h12.9V151.2z\" />\n <path d=\"M105.9,151.2c0-7.1,5.8-12.9,12.9-12.9s12.9,5.8,12.9,12.9v32.3c0,7.1-5.8,12.9-12.9,12.9s-12.9-5.8-12.9-12.9C105.9,183.5,105.9,151.2,105.9,151.2z\" />\n <path d=\"M118.8,99.4c-7.1,0-12.9-5.8-12.9-12.9s5.8-12.9,12.9-12.9s12.9,5.8,12.9,12.9v12.9H118.8z\" />\n <path d=\"M118.8,105.9c7.1,0,12.9,5.8,12.9,12.9s-5.8,12.9-12.9,12.9H86.5c-7.1,0-12.9-5.8-12.9-12.9s5.8-12.9,12.9-12.9C86.5,105.9,118.8,105.9,118.8,105.9z\" />\n <path d=\"M170.6,118.8c0-7.1,5.8-12.9,12.9-12.9c7.1,0,12.9,5.8,12.9,12.9s-5.8,12.9-12.9,12.9h-12.9V118.8z\" />\n <path d=\"M164.1,118.8c0,7.1-5.8,12.9-12.9,12.9c-7.1,0-12.9-5.8-12.9-12.9V86.5c0-7.1,5.8-12.9,12.9-12.9c7.1,0,12.9,5.8,12.9,12.9V118.8z\" />\n <path d=\"M151.2,170.6c7.1,0,12.9,5.8,12.9,12.9c0,7.1-5.8,12.9-12.9,12.9c-7.1,0-12.9-5.8-12.9-12.9v-12.9H151.2z\" />\n <path d=\"M151.2,164.1c-7.1,0-12.9-5.8-12.9-12.9c0-7.1,5.8-12.9,12.9-12.9h32.3c7.1,0,12.9,5.8,12.9,12.9c0,7.1-5.8,12.9-12.9,12.9H151.2z\" />\n </svg>\n );\n}\n","import { type ComponentProps } from \"react\";\n\n/** Telegram brand mark — monochrome, follows `currentColor`. */\nexport function TelegramIcon(props: ComponentProps<\"svg\">) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" {...props}>\n <path d=\"M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z\" />\n </svg>\n );\n}\n","import { type ComponentProps } from \"react\";\n\n/** WhatsApp brand mark — monochrome, follows `currentColor`. */\nexport function WhatsAppIcon(props: ComponentProps<\"svg\">) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" {...props}>\n <path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z\" />\n </svg>\n );\n}\n","import { type ComponentProps } from \"react\";\n\n/** X (Twitter) brand mark — monochrome, follows `currentColor`. */\nexport function XIcon(props: ComponentProps<\"svg\">) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" {...props}>\n <path d=\"M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z\" />\n </svg>\n );\n}\n","import { type ComponentProps } from \"react\";\n\n/** YouTube brand mark — monochrome, follows `currentColor`. */\nexport function YouTubeIcon(props: ComponentProps<\"svg\">) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" {...props}>\n <path d=\"M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z\" />\n </svg>\n );\n}\n","/**\n * Photon brand and social marks — monochrome `currentColor` (except Google,\n * which is intentionally multi-color). Path data is canonical; do not edit.\n */\nimport { type ComponentProps, type FC } from \"react\";\nimport { DiscordIcon } from \"./discord\";\nimport { GitHubIcon } from \"./github\";\nimport { GoogleIcon } from \"./google\";\nimport { IMessageIcon } from \"./imessage\";\nimport { PhotonMark } from \"./photon-mark\";\nimport { RedditIcon } from \"./reddit\";\nimport { SlackIcon } from \"./slack\";\nimport { TelegramIcon } from \"./telegram\";\nimport { WhatsAppIcon } from \"./whatsapp\";\nimport { XIcon } from \"./x\";\nimport { YouTubeIcon } from \"./youtube\";\n\nexport {\n DiscordIcon,\n GitHubIcon,\n GoogleIcon,\n IMessageIcon,\n PhotonMark,\n RedditIcon,\n SlackIcon,\n TelegramIcon,\n WhatsAppIcon,\n XIcon,\n YouTubeIcon,\n};\n\n/** Third-party marks in gallery order (Photon's own mark ships separately). */\nexport const brandMarks: { name: string; Icon: FC<ComponentProps<\"svg\">> }[] = [\n { name: \"GitHub\", Icon: GitHubIcon },\n { name: \"X\", Icon: XIcon },\n { name: \"Discord\", Icon: DiscordIcon },\n { name: \"Telegram\", Icon: TelegramIcon },\n { name: \"iMessage\", Icon: IMessageIcon },\n { name: \"Slack\", Icon: SlackIcon },\n { name: \"Reddit\", Icon: RedditIcon },\n { name: \"YouTube\", Icon: YouTubeIcon },\n { name: \"WhatsApp\", Icon: WhatsAppIcon },\n { name: \"Google\", Icon: GoogleIcon },\n];\n"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { t as s } from "./chunks/cn-
|
|
2
|
+
import { t as s } from "./chunks/cn-ChIgwEl3.js";
|
|
3
3
|
import { n as r, r as o, t as E } from "./chunks/link-provider-9TFNyDqO.js";
|
|
4
4
|
import { t as i } from "./chunks/resolve-variant-CcD8iG5l.js";
|
|
5
5
|
import { n as I, r as n, t as A } from "./chunks/use-press-pulse-8iorQPsh.js";
|
|
6
6
|
import "./utils.js";
|
|
7
|
-
import { a as e, c as R, d as p, i as B, l as C, n as O, o as P, r as f, s as u, t as D, u as N } from "./chunks/button-
|
|
8
|
-
import { a as c, c as l, i as V, l as U, n as G, o as d, r as M, s as b, t as g } from "./chunks/error-
|
|
9
|
-
import { a as F, i as W, n as h, o as Z, r as v, s as w, t as x } from "./chunks/basic-page-
|
|
10
|
-
import { a as z, c as Y, i as j, n as q, o as y, r as J, s as K, t as Q } from "./chunks/sidebar-
|
|
11
|
-
import { t as $ } from "./chunks/input-
|
|
12
|
-
import { t as sa } from "./chunks/close-button-
|
|
13
|
-
import { t as ra } from "./chunks/input-group-
|
|
14
|
-
import { n as Ea, t as _a } from "./chunks/card-
|
|
15
|
-
import { n as Sa, t as Ia } from "./chunks/dialog-
|
|
16
|
-
import { i as Aa, n as Ta, r as ma, t as ea } from "./chunks/status-view-
|
|
7
|
+
import { a as e, c as R, d as p, i as B, l as C, n as O, o as P, r as f, s as u, t as D, u as N } from "./chunks/button-BmhyLgy5.js";
|
|
8
|
+
import { a as c, c as l, i as V, l as U, n as G, o as d, r as M, s as b, t as g } from "./chunks/error-Da7P5WZi.js";
|
|
9
|
+
import { a as F, i as W, n as h, o as Z, r as v, s as w, t as x } from "./chunks/basic-page-CB36yrpL.js";
|
|
10
|
+
import { a as z, c as Y, i as j, n as q, o as y, r as J, s as K, t as Q } from "./chunks/sidebar-BETMObNj.js";
|
|
11
|
+
import { t as $ } from "./chunks/input-QSAUO30c.js";
|
|
12
|
+
import { t as sa } from "./chunks/close-button-GvqWbLl0.js";
|
|
13
|
+
import { t as ra } from "./chunks/input-group-5AtpIhC_.js";
|
|
14
|
+
import { n as Ea, t as _a } from "./chunks/card-DSW3Uhag.js";
|
|
15
|
+
import { n as Sa, t as Ia } from "./chunks/dialog-DtFO7oy0.js";
|
|
16
|
+
import { i as Aa, n as Ta, r as ma, t as ea } from "./chunks/status-view-C8tabjDu.js";
|
|
17
17
|
import "./components/status-view.js";
|
|
18
18
|
export {
|
|
19
19
|
x as BASIC_PAGE_CALLOUT,
|
package/dist/primitives.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import
|
|
2
|
+
import "./chunks/rolldown-runtime-wKSmTnsc.js";
|
|
3
3
|
import "./primitives/accordion.js";
|
|
4
4
|
import "./primitives/alert-dialog.js";
|
|
5
5
|
import "./primitives/autocomplete.js";
|
|
@@ -80,5 +80,3 @@ export * from "@base-ui/react/toggle";
|
|
|
80
80
|
export * from "@base-ui/react/toggle-group";
|
|
81
81
|
export * from "@base-ui/react/toolbar";
|
|
82
82
|
export * from "@base-ui/react/tooltip";
|
|
83
|
-
|
|
84
|
-
//# sourceMappingURL=primitives.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { a as _, i as E, n as I, o as a, r as s, s as P, t as C } from "../chunks/basic-page-
|
|
2
|
+
import { a as _, i as E, n as I, o as a, r as s, s as P, t as C } from "../chunks/basic-page-CB36yrpL.js";
|
|
3
3
|
export {
|
|
4
4
|
C as BASIC_PAGE_CALLOUT,
|
|
5
5
|
I as BASIC_PAGE_CARD,
|
package/dist/sections/sidebar.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { a as I, c as _, i as A, n as R, o as S, r as a, s, t as T } from "../chunks/sidebar-
|
|
2
|
+
import { a as I, c as _, i as A, n as R, o as S, r as a, s, t as T } from "../chunks/sidebar-BETMObNj.js";
|
|
3
3
|
export {
|
|
4
4
|
T as SIDEBAR_HEADER_INSET,
|
|
5
5
|
R as SIDEBAR_ITEM,
|
|
@@ -20,7 +20,7 @@ declare function Close({ className, ...props }: StyledProps<typeof BaseToast.Clo
|
|
|
20
20
|
*/
|
|
21
21
|
export declare const Toast: {
|
|
22
22
|
Provider: import('react').FC<import('@base-ui/react').ToastProviderProps>;
|
|
23
|
-
Portal: import('react').ForwardRefExoticComponent<Omit<import(
|
|
23
|
+
Portal: import('react').ForwardRefExoticComponent<Omit<import('@base-ui/react').ToastPortalProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
|
|
24
24
|
Viewport: typeof Viewport;
|
|
25
25
|
Root: typeof Root;
|
|
26
26
|
Content: typeof Content;
|