asterui 0.12.45 → 0.12.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/components/Button.d.ts +0 -1
  2. package/dist/components/Button.js +8 -9
  3. package/dist/components/Button.js.map +1 -1
  4. package/dist/components/Checkbox.d.ts +4 -1
  5. package/dist/components/Checkbox.js +106 -77
  6. package/dist/components/Checkbox.js.map +1 -1
  7. package/dist/components/ConfigProvider.d.ts +59 -0
  8. package/dist/components/ConfigProvider.js +46 -0
  9. package/dist/components/ConfigProvider.js.map +1 -0
  10. package/dist/components/CopyButton.d.ts +3 -0
  11. package/dist/components/CopyButton.js +90 -64
  12. package/dist/components/CopyButton.js.map +1 -1
  13. package/dist/contexts/IconSizeContext.d.ts +2 -0
  14. package/dist/contexts/IconSizeContext.js +6 -0
  15. package/dist/contexts/IconSizeContext.js.map +1 -0
  16. package/dist/index.d.ts +10 -4
  17. package/dist/index.js +235 -208
  18. package/dist/index.js.map +1 -1
  19. package/dist/locale/de-DE.d.ts +3 -0
  20. package/dist/locale/de-DE.js +100 -0
  21. package/dist/locale/de-DE.js.map +1 -0
  22. package/dist/locale/en-CA.d.ts +3 -0
  23. package/dist/locale/en-CA.js +11 -0
  24. package/dist/locale/en-CA.js.map +1 -0
  25. package/dist/locale/en-GB.d.ts +3 -0
  26. package/dist/locale/en-GB.js +11 -0
  27. package/dist/locale/en-GB.js.map +1 -0
  28. package/dist/locale/en-US.d.ts +3 -0
  29. package/dist/locale/en-US.js +100 -0
  30. package/dist/locale/en-US.js.map +1 -0
  31. package/dist/locale/es-ES.d.ts +3 -0
  32. package/dist/locale/es-ES.js +100 -0
  33. package/dist/locale/es-ES.js.map +1 -0
  34. package/dist/locale/fr-FR.d.ts +3 -0
  35. package/dist/locale/fr-FR.js +100 -0
  36. package/dist/locale/fr-FR.js.map +1 -0
  37. package/dist/locale/index.d.ts +107 -0
  38. package/dist/locale/ja-JP.d.ts +3 -0
  39. package/dist/locale/ja-JP.js +100 -0
  40. package/dist/locale/ja-JP.js.map +1 -0
  41. package/dist/locale/ko-KR.d.ts +3 -0
  42. package/dist/locale/ko-KR.js +100 -0
  43. package/dist/locale/ko-KR.js.map +1 -0
  44. package/dist/locale/pt-BR.d.ts +3 -0
  45. package/dist/locale/pt-BR.js +100 -0
  46. package/dist/locale/pt-BR.js.map +1 -0
  47. package/dist/locale/zh-CN.d.ts +3 -0
  48. package/dist/locale/zh-CN.js +100 -0
  49. package/dist/locale/zh-CN.js.map +1 -0
  50. package/package.json +1 -1
@@ -1,5 +1,4 @@
1
1
  import { default as React } from 'react';
2
- export declare const IconSizeContext: React.Context<"xs" | "sm" | "md" | "lg" | "xl" | undefined>;
3
2
  type BaseButtonProps = {
4
3
  /** Button color */
5
4
  color?: 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error' | 'neutral';
@@ -1,6 +1,6 @@
1
1
  import { jsx as r, jsxs as I, Fragment as E } from "react/jsx-runtime";
2
- import { createContext as F } from "react";
3
- const $ = F(void 0), Q = ({
2
+ import { IconSizeContext as F } from "../contexts/IconSizeContext.js";
3
+ const O = ({
4
4
  children: a,
5
5
  color: p,
6
6
  variant: i,
@@ -13,10 +13,10 @@ const $ = F(void 0), Q = ({
13
13
  iconPosition: n = "start",
14
14
  danger: k = !1,
15
15
  pressed: b,
16
- className: v = "",
16
+ className: g = "",
17
17
  ...o
18
18
  }) => {
19
- const m = k ? "error" : p, g = {
19
+ const m = k ? "error" : p, v = {
20
20
  primary: "btn-primary",
21
21
  secondary: "btn-secondary",
22
22
  accent: "btn-accent",
@@ -47,20 +47,20 @@ const $ = F(void 0), Q = ({
47
47
  round: "rounded-full"
48
48
  }, u = [
49
49
  "btn",
50
- m && g[m],
50
+ m && v[m],
51
51
  i && w[i],
52
52
  D[c],
53
53
  x && "btn-active",
54
54
  d && B[d],
55
55
  C && "no-animation",
56
- v
56
+ g
57
57
  ].filter(Boolean).join(" "), K = a != null && a !== "" ? {
58
58
  xs: n === "start" ? "mr-1" : "ml-1",
59
59
  sm: n === "start" ? "mr-1" : "ml-1",
60
60
  md: n === "start" ? "mr-1.5" : "ml-1.5",
61
61
  lg: n === "start" ? "mr-2" : "ml-2",
62
62
  xl: n === "start" ? "mr-2" : "ml-2"
63
- }[c] : "", f = l && /* @__PURE__ */ r($.Provider, { value: c, children: /* @__PURE__ */ r("span", { className: `inline-flex items-center ${K}`, "aria-hidden": "true", children: l }) }), h = /* @__PURE__ */ I(E, { children: [
63
+ }[c] : "", f = l && /* @__PURE__ */ r(F.Provider, { value: c, children: /* @__PURE__ */ r("span", { className: `inline-flex items-center ${K}`, "aria-hidden": "true", children: l }) }), h = /* @__PURE__ */ I(E, { children: [
64
64
  t && /* @__PURE__ */ r("span", { className: "loading loading-spinner", "aria-hidden": "true" }),
65
65
  !t && l && n === "start" && f,
66
66
  a,
@@ -108,7 +108,6 @@ const $ = F(void 0), Q = ({
108
108
  );
109
109
  };
110
110
  export {
111
- Q as Button,
112
- $ as IconSizeContext
111
+ O as Button
113
112
  };
114
113
  //# sourceMappingURL=Button.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Button.js","sources":["../../src/components/Button.tsx"],"sourcesContent":["import React, { createContext } from 'react'\n\nexport const IconSizeContext = createContext<'xs' | 'sm' | 'md' | 'lg' | 'xl' | undefined>(undefined)\n\ntype BaseButtonProps = {\n /** Button color */\n color?: 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error' | 'neutral'\n /** Button style variant */\n variant?: 'solid' | 'outline' | 'dash' | 'soft' | 'ghost' | 'link'\n /** Button size */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Active/pressed visual state */\n active?: boolean\n /** Show loading spinner and disable button */\n loading?: boolean\n /** Button shape */\n shape?: 'square' | 'circle' | 'wide' | 'block' | 'round'\n /** Disable click animation */\n noAnimation?: boolean\n /** Icon element to display */\n icon?: React.ReactNode\n /** Position of the icon */\n iconPosition?: 'start' | 'end'\n /** Applies error/danger styling (shorthand for color=\"error\") */\n danger?: boolean\n /** Toggle button pressed state (sets aria-pressed) */\n pressed?: boolean\n}\n\ntype ButtonAsButton = BaseButtonProps &\n Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> & {\n href?: undefined\n htmlType?: 'button' | 'submit' | 'reset'\n }\n\ntype ButtonAsAnchor = BaseButtonProps &\n Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'type'> & {\n href: string\n htmlType?: undefined\n /** Disable the link button */\n disabled?: boolean\n }\n\nexport type ButtonProps = ButtonAsButton | ButtonAsAnchor\n\nexport const Button: React.FC<ButtonProps> = ({\n children,\n color,\n variant,\n size = 'md',\n active = false,\n loading = false,\n shape,\n noAnimation = false,\n icon,\n iconPosition = 'start',\n danger = false,\n pressed,\n className = '',\n ...props\n}) => {\n // danger prop is a shorthand for color=\"error\"\n const effectiveColor = danger ? 'error' : color\n\n const colorClasses = {\n primary: 'btn-primary',\n secondary: 'btn-secondary',\n accent: 'btn-accent',\n info: 'btn-info',\n success: 'btn-success',\n warning: 'btn-warning',\n error: 'btn-error',\n neutral: 'btn-neutral',\n }\n\n const variantClasses = {\n solid: '', // default, no extra class needed\n outline: 'btn-outline',\n dash: 'btn-dash',\n soft: 'btn-soft',\n ghost: 'btn-ghost',\n link: 'btn-link',\n }\n\n const sizeClasses = {\n xs: 'btn-xs',\n sm: 'btn-sm',\n md: '',\n lg: 'btn-lg',\n xl: 'btn-xl',\n }\n\n const shapeClasses = {\n square: 'btn-square',\n circle: 'btn-circle',\n wide: 'btn-wide',\n block: 'btn-block',\n round: 'rounded-full',\n }\n\n const classes = [\n 'btn',\n effectiveColor && colorClasses[effectiveColor],\n variant && variantClasses[variant],\n sizeClasses[size],\n active && 'btn-active',\n shape && shapeClasses[shape],\n noAnimation && 'no-animation',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Determine icon spacing based on whether there's text content and button size\n const hasChildren = children !== undefined && children !== null && children !== ''\n const spacingBySize = {\n xs: iconPosition === 'start' ? 'mr-1' : 'ml-1',\n sm: iconPosition === 'start' ? 'mr-1' : 'ml-1',\n md: iconPosition === 'start' ? 'mr-1.5' : 'ml-1.5',\n lg: iconPosition === 'start' ? 'mr-2' : 'ml-2',\n xl: iconPosition === 'start' ? 'mr-2' : 'ml-2',\n }\n const iconSpacing = hasChildren ? spacingBySize[size] : ''\n\n const iconElement = icon && (\n <IconSizeContext.Provider value={size}>\n <span className={`inline-flex items-center ${iconSpacing}`} aria-hidden=\"true\">\n {icon}\n </span>\n </IconSizeContext.Provider>\n )\n\n const content = (\n <>\n {loading && <span className=\"loading loading-spinner\" aria-hidden=\"true\"></span>}\n {!loading && icon && iconPosition === 'start' && iconElement}\n {children}\n {!loading && icon && iconPosition === 'end' && iconElement}\n </>\n )\n\n if ('href' in props && props.href !== undefined) {\n const { href, disabled, onKeyDown, onClick, ...anchorProps } = props as ButtonAsAnchor & {\n onKeyDown?: React.KeyboardEventHandler<HTMLAnchorElement>\n onClick?: React.MouseEventHandler<HTMLAnchorElement>\n }\n const isDisabled = disabled || loading\n\n // Handle Space key for anchor buttons (links only respond to Enter natively)\n const handleKeyDown = (event: React.KeyboardEvent<HTMLAnchorElement>) => {\n if (event.key === ' ' && !isDisabled) {\n event.preventDefault()\n event.currentTarget.click()\n }\n onKeyDown?.(event)\n }\n\n // Prevent click when disabled\n const handleClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\n if (isDisabled) {\n event.preventDefault()\n return\n }\n onClick?.(event)\n }\n\n return (\n <a\n href={isDisabled ? undefined : href}\n role=\"button\"\n className={classes}\n aria-disabled={isDisabled || undefined}\n aria-busy={loading || undefined}\n aria-pressed={pressed}\n tabIndex={isDisabled ? -1 : 0}\n onKeyDown={handleKeyDown}\n onClick={handleClick}\n {...anchorProps}\n >\n {content}\n </a>\n )\n }\n\n const { htmlType, ...buttonProps } = props as Omit<ButtonAsButton, keyof BaseButtonProps>\n const buttonType: 'button' | 'submit' | 'reset' = htmlType ?? 'button'\n return (\n <button\n type={buttonType}\n className={classes}\n aria-busy={loading || undefined}\n aria-pressed={pressed}\n disabled={loading || buttonProps.disabled}\n {...buttonProps}\n >\n {content}\n </button>\n )\n}\n"],"names":["IconSizeContext","createContext","Button","children","color","variant","size","active","loading","shape","noAnimation","icon","iconPosition","danger","pressed","className","props","effectiveColor","colorClasses","variantClasses","sizeClasses","shapeClasses","classes","iconSpacing","iconElement","jsx","content","jsxs","Fragment","href","disabled","onKeyDown","onClick","anchorProps","isDisabled","event","htmlType","buttonProps"],"mappings":";;AAEO,MAAMA,IAAkBC,EAA4D,MAAS,GA2CvFC,IAAgC,CAAC;AAAA,EAC5C,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,SAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,QAAAC,IAAS;AAAA,EACT,SAAAC,IAAU;AAAA,EACV,OAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,MAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,QAAAC,IAAS;AAAA,EACT,SAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,MAAM;AAEJ,QAAMC,IAAiBJ,IAAS,UAAUT,GAEpCc,IAAe;AAAA,IACnB,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,EAAA,GAGLC,IAAiB;AAAA,IACrB,OAAO;AAAA;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,EAAA,GAGFC,IAAc;AAAA,IAClB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA,GAGAC,IAAe;AAAA,IACnB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,EAAA,GAGHC,IAAU;AAAA,IACd;AAAA,IACAL,KAAkBC,EAAaD,CAAc;AAAA,IAC7CZ,KAAWc,EAAed,CAAO;AAAA,IACjCe,EAAYd,CAAI;AAAA,IAChBC,KAAU;AAAA,IACVE,KAASY,EAAaZ,CAAK;AAAA,IAC3BC,KAAe;AAAA,IACfK;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GAWLQ,IARwCpB,KAAa,QAAQA,MAAa,KAC1D;AAAA,IACpB,IAAIS,MAAiB,UAAU,SAAS;AAAA,IACxC,IAAIA,MAAiB,UAAU,SAAS;AAAA,IACxC,IAAIA,MAAiB,UAAU,WAAW;AAAA,IAC1C,IAAIA,MAAiB,UAAU,SAAS;AAAA,IACxC,IAAIA,MAAiB,UAAU,SAAS;AAAA,EAAA,EAEMN,CAAI,IAAI,IAElDkB,IAAcb,KAClB,gBAAAc,EAACzB,EAAgB,UAAhB,EAAyB,OAAOM,GAC/B,UAAA,gBAAAmB,EAAC,QAAA,EAAK,WAAW,4BAA4BF,CAAW,IAAI,eAAY,QACrE,aACH,GACF,GAGIG,IACJ,gBAAAC,EAAAC,GAAA,EACG,UAAA;AAAA,IAAApB,KAAW,gBAAAiB,EAAC,QAAA,EAAK,WAAU,2BAA0B,eAAY,QAAO;AAAA,IACxE,CAACjB,KAAWG,KAAQC,MAAiB,WAAWY;AAAA,IAChDrB;AAAA,IACA,CAACK,KAAWG,KAAQC,MAAiB,SAASY;AAAA,EAAA,GACjD;AAGF,MAAI,UAAUR,KAASA,EAAM,SAAS,QAAW;AAC/C,UAAM,EAAE,MAAAa,GAAM,UAAAC,GAAU,WAAAC,GAAW,SAAAC,GAAS,GAAGC,MAAgBjB,GAIzDkB,IAAaJ,KAAYtB;AAoB/B,WACE,gBAAAiB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAMS,IAAa,SAAYL;AAAA,QAC/B,MAAK;AAAA,QACL,WAAWP;AAAA,QACX,iBAAeY,KAAc;AAAA,QAC7B,aAAW1B,KAAW;AAAA,QACtB,gBAAcM;AAAA,QACd,UAAUoB,IAAa,KAAK;AAAA,QAC5B,WA1BkB,CAACC,MAAkD;AACvE,UAAIA,EAAM,QAAQ,OAAO,CAACD,MACxBC,EAAM,eAAA,GACNA,EAAM,cAAc,MAAA,IAEtBJ,IAAYI,CAAK;AAAA,QACnB;AAAA,QAqBI,SAlBgB,CAACA,MAA+C;AAClE,cAAID,GAAY;AACd,YAAAC,EAAM,eAAA;AACN;AAAA,UACF;AACA,UAAAH,IAAUG,CAAK;AAAA,QACjB;AAAA,QAaK,GAAGF;AAAA,QAEH,UAAAP;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AAEA,QAAM,EAAE,UAAAU,GAAU,GAAGC,EAAA,IAAgBrB;AAErC,SACE,gBAAAS;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAH8CW,KAAY;AAAA,MAI1D,WAAWd;AAAA,MACX,aAAWd,KAAW;AAAA,MACtB,gBAAcM;AAAA,MACd,UAAUN,KAAW6B,EAAY;AAAA,MAChC,GAAGA;AAAA,MAEH,UAAAX;AAAA,IAAA;AAAA,EAAA;AAGP;"}
1
+ {"version":3,"file":"Button.js","sources":["../../src/components/Button.tsx"],"sourcesContent":["import React from 'react'\nimport { IconSizeContext } from '../contexts/IconSizeContext'\n\ntype BaseButtonProps = {\n /** Button color */\n color?: 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error' | 'neutral'\n /** Button style variant */\n variant?: 'solid' | 'outline' | 'dash' | 'soft' | 'ghost' | 'link'\n /** Button size */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Active/pressed visual state */\n active?: boolean\n /** Show loading spinner and disable button */\n loading?: boolean\n /** Button shape */\n shape?: 'square' | 'circle' | 'wide' | 'block' | 'round'\n /** Disable click animation */\n noAnimation?: boolean\n /** Icon element to display */\n icon?: React.ReactNode\n /** Position of the icon */\n iconPosition?: 'start' | 'end'\n /** Applies error/danger styling (shorthand for color=\"error\") */\n danger?: boolean\n /** Toggle button pressed state (sets aria-pressed) */\n pressed?: boolean\n}\n\ntype ButtonAsButton = BaseButtonProps &\n Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> & {\n href?: undefined\n htmlType?: 'button' | 'submit' | 'reset'\n }\n\ntype ButtonAsAnchor = BaseButtonProps &\n Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'type'> & {\n href: string\n htmlType?: undefined\n /** Disable the link button */\n disabled?: boolean\n }\n\nexport type ButtonProps = ButtonAsButton | ButtonAsAnchor\n\nexport const Button: React.FC<ButtonProps> = ({\n children,\n color,\n variant,\n size = 'md',\n active = false,\n loading = false,\n shape,\n noAnimation = false,\n icon,\n iconPosition = 'start',\n danger = false,\n pressed,\n className = '',\n ...props\n}) => {\n // danger prop is a shorthand for color=\"error\"\n const effectiveColor = danger ? 'error' : color\n\n const colorClasses = {\n primary: 'btn-primary',\n secondary: 'btn-secondary',\n accent: 'btn-accent',\n info: 'btn-info',\n success: 'btn-success',\n warning: 'btn-warning',\n error: 'btn-error',\n neutral: 'btn-neutral',\n }\n\n const variantClasses = {\n solid: '', // default, no extra class needed\n outline: 'btn-outline',\n dash: 'btn-dash',\n soft: 'btn-soft',\n ghost: 'btn-ghost',\n link: 'btn-link',\n }\n\n const sizeClasses = {\n xs: 'btn-xs',\n sm: 'btn-sm',\n md: '',\n lg: 'btn-lg',\n xl: 'btn-xl',\n }\n\n const shapeClasses = {\n square: 'btn-square',\n circle: 'btn-circle',\n wide: 'btn-wide',\n block: 'btn-block',\n round: 'rounded-full',\n }\n\n const classes = [\n 'btn',\n effectiveColor && colorClasses[effectiveColor],\n variant && variantClasses[variant],\n sizeClasses[size],\n active && 'btn-active',\n shape && shapeClasses[shape],\n noAnimation && 'no-animation',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Determine icon spacing based on whether there's text content and button size\n const hasChildren = children !== undefined && children !== null && children !== ''\n const spacingBySize = {\n xs: iconPosition === 'start' ? 'mr-1' : 'ml-1',\n sm: iconPosition === 'start' ? 'mr-1' : 'ml-1',\n md: iconPosition === 'start' ? 'mr-1.5' : 'ml-1.5',\n lg: iconPosition === 'start' ? 'mr-2' : 'ml-2',\n xl: iconPosition === 'start' ? 'mr-2' : 'ml-2',\n }\n const iconSpacing = hasChildren ? spacingBySize[size] : ''\n\n const iconElement = icon && (\n <IconSizeContext.Provider value={size}>\n <span className={`inline-flex items-center ${iconSpacing}`} aria-hidden=\"true\">\n {icon}\n </span>\n </IconSizeContext.Provider>\n )\n\n const content = (\n <>\n {loading && <span className=\"loading loading-spinner\" aria-hidden=\"true\"></span>}\n {!loading && icon && iconPosition === 'start' && iconElement}\n {children}\n {!loading && icon && iconPosition === 'end' && iconElement}\n </>\n )\n\n if ('href' in props && props.href !== undefined) {\n const { href, disabled, onKeyDown, onClick, ...anchorProps } = props as ButtonAsAnchor & {\n onKeyDown?: React.KeyboardEventHandler<HTMLAnchorElement>\n onClick?: React.MouseEventHandler<HTMLAnchorElement>\n }\n const isDisabled = disabled || loading\n\n // Handle Space key for anchor buttons (links only respond to Enter natively)\n const handleKeyDown = (event: React.KeyboardEvent<HTMLAnchorElement>) => {\n if (event.key === ' ' && !isDisabled) {\n event.preventDefault()\n event.currentTarget.click()\n }\n onKeyDown?.(event)\n }\n\n // Prevent click when disabled\n const handleClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\n if (isDisabled) {\n event.preventDefault()\n return\n }\n onClick?.(event)\n }\n\n return (\n <a\n href={isDisabled ? undefined : href}\n role=\"button\"\n className={classes}\n aria-disabled={isDisabled || undefined}\n aria-busy={loading || undefined}\n aria-pressed={pressed}\n tabIndex={isDisabled ? -1 : 0}\n onKeyDown={handleKeyDown}\n onClick={handleClick}\n {...anchorProps}\n >\n {content}\n </a>\n )\n }\n\n const { htmlType, ...buttonProps } = props as Omit<ButtonAsButton, keyof BaseButtonProps>\n const buttonType: 'button' | 'submit' | 'reset' = htmlType ?? 'button'\n return (\n <button\n type={buttonType}\n className={classes}\n aria-busy={loading || undefined}\n aria-pressed={pressed}\n disabled={loading || buttonProps.disabled}\n {...buttonProps}\n >\n {content}\n </button>\n )\n}\n"],"names":["Button","children","color","variant","size","active","loading","shape","noAnimation","icon","iconPosition","danger","pressed","className","props","effectiveColor","colorClasses","variantClasses","sizeClasses","shapeClasses","classes","iconSpacing","iconElement","jsx","IconSizeContext","content","jsxs","Fragment","href","disabled","onKeyDown","onClick","anchorProps","isDisabled","event","htmlType","buttonProps"],"mappings":"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"}
@@ -30,9 +30,12 @@ export interface CheckboxGroupProps {
30
30
  options?: (string | number | CheckboxOptionType)[];
31
31
  /** Layout direction for options */
32
32
  direction?: 'horizontal' | 'vertical';
33
+ /** HTML name attribute for all checkboxes in the group (for form submission) */
34
+ name?: string;
33
35
  className?: string;
36
+ 'data-testid'?: string;
34
37
  }
35
- declare function CheckboxGroup({ children, value, defaultValue, onChange, disabled, options, direction, className }: CheckboxGroupProps): import("react/jsx-runtime").JSX.Element;
38
+ declare function CheckboxGroup({ children, value, defaultValue, onChange, disabled, options, direction, name, className, 'data-testid': testId }: CheckboxGroupProps): import("react/jsx-runtime").JSX.Element;
36
39
  export declare const Checkbox: React.ForwardRefExoticComponent<CheckboxProps & React.RefAttributes<HTMLInputElement>> & {
37
40
  Group: typeof CheckboxGroup;
38
41
  };
@@ -1,57 +1,68 @@
1
- import { jsxs as p, jsx as c } from "react/jsx-runtime";
2
- import R, { forwardRef as G, useContext as $, createContext as B } from "react";
3
- const y = B(null);
4
- function I({
5
- children: x,
6
- value: r,
7
- defaultValue: b,
1
+ import { jsxs as C, jsx as c } from "react/jsx-runtime";
2
+ import V, { forwardRef as G, useContext as B, createContext as P } from "react";
3
+ const N = P(null);
4
+ function S({
5
+ children: u,
6
+ value: d,
7
+ defaultValue: k,
8
8
  onChange: h,
9
- disabled: a = !1,
10
- options: d,
11
- direction: s = "vertical",
12
- className: u = ""
9
+ disabled: r = !1,
10
+ options: f,
11
+ direction: a = "vertical",
12
+ name: y,
13
+ className: m = "",
14
+ "data-testid": i
13
15
  }) {
14
- const [C, g] = R.useState(b || []), l = r !== void 0 ? r : C, t = {
15
- value: l,
16
- onChange: (i, e) => {
17
- const k = e ? [...l, i] : l.filter((f) => f !== i);
18
- r === void 0 && g(k), h?.(k);
16
+ const [x, o] = V.useState(k || []), t = d !== void 0 ? d : x, p = {
17
+ value: t,
18
+ onChange: (l, e) => {
19
+ const n = e ? [...t, l] : t.filter((b) => b !== l);
20
+ d === void 0 && o(n), h?.(n);
19
21
  },
20
- disabled: a
22
+ disabled: r,
23
+ name: y
21
24
  };
22
- if (d) {
23
- const i = s === "horizontal" ? "flex flex-row flex-wrap gap-4" : "flex flex-col";
24
- return /* @__PURE__ */ c(y.Provider, { value: t, children: /* @__PURE__ */ c("div", { className: `${i} ${u}`.trim(), children: d.map((e) => typeof e == "string" || typeof e == "number" ? /* @__PURE__ */ p("label", { className: "flex items-center cursor-pointer gap-2", children: [
25
- /* @__PURE__ */ c(m, { value: e }),
26
- /* @__PURE__ */ c("span", { children: e })
27
- ] }, e) : /* @__PURE__ */ p("label", { className: "flex items-center cursor-pointer gap-2", children: [
28
- /* @__PURE__ */ c(m, { value: e.value, disabled: e.disabled }),
29
- /* @__PURE__ */ c("span", { children: e.label })
30
- ] }, e.value)) }) });
25
+ if (f) {
26
+ const l = a === "horizontal" ? "flex flex-row flex-wrap gap-4" : "flex flex-col gap-2";
27
+ return /* @__PURE__ */ c(N.Provider, { value: p, children: /* @__PURE__ */ c("div", { className: `${l} ${m}`.trim(), "data-testid": i, children: f.map((e) => {
28
+ if (typeof e == "string" || typeof e == "number") {
29
+ const n = i ? `${i}-option-${e}` : void 0;
30
+ return /* @__PURE__ */ C("label", { className: "flex items-center cursor-pointer gap-2", children: [
31
+ /* @__PURE__ */ c(g, { value: e, "data-testid": n }),
32
+ /* @__PURE__ */ c("span", { children: e })
33
+ ] }, e);
34
+ } else {
35
+ const n = i ? `${i}-option-${e.value}` : void 0;
36
+ return /* @__PURE__ */ C("label", { className: "flex items-center cursor-pointer gap-2", children: [
37
+ /* @__PURE__ */ c(g, { value: e.value, disabled: e.disabled, "data-testid": n }),
38
+ /* @__PURE__ */ c("span", { children: e.label })
39
+ ] }, e.value);
40
+ }
41
+ }) }) });
31
42
  }
32
- return /* @__PURE__ */ c(y.Provider, { value: t, children: /* @__PURE__ */ c("div", { className: u, children: x }) });
43
+ return /* @__PURE__ */ c(N.Provider, { value: p, children: /* @__PURE__ */ c("div", { className: m, children: u }) });
33
44
  }
34
- const m = G(
45
+ const g = G(
35
46
  ({
36
- children: x,
37
- size: r,
38
- color: b,
47
+ children: u,
48
+ size: d,
49
+ color: k,
39
50
  indeterminate: h = !1,
40
- swap: a,
41
- className: d = "",
42
- value: s,
43
- checked: u,
44
- onChange: C,
45
- disabled: g,
46
- ...l
51
+ swap: r,
52
+ className: f = "",
53
+ value: a,
54
+ checked: y,
55
+ onChange: m,
56
+ disabled: i,
57
+ ...x
47
58
  }, o) => {
48
- const t = $(y), i = {
59
+ const t = B(N), j = {
49
60
  xs: "checkbox-xs",
50
61
  sm: "checkbox-sm",
51
62
  md: "checkbox-md",
52
63
  lg: "checkbox-lg",
53
64
  xl: "checkbox-xl"
54
- }, e = {
65
+ }, p = {
55
66
  primary: "checkbox-primary",
56
67
  secondary: "checkbox-secondary",
57
68
  accent: "checkbox-accent",
@@ -60,67 +71,85 @@ const m = G(
60
71
  warning: "checkbox-warning",
61
72
  info: "checkbox-info",
62
73
  error: "checkbox-error"
63
- }, k = [
74
+ }, l = [
64
75
  "checkbox",
65
- r && i[r],
66
- b && e[b]
67
- ].filter(Boolean).join(" "), f = t && s !== void 0 && (typeof s == "string" || typeof s == "number") ? t.value?.includes(s) ?? !1 : u, v = t?.disabled || g, w = (n) => {
68
- t && s !== void 0 && (typeof s == "string" || typeof s == "number") && t.onChange?.(s, n.target.checked), C?.(n);
69
- }, V = R.useCallback(
70
- (n) => {
71
- n && (n.indeterminate = h), typeof o == "function" ? o(n) : o && (o.current = n);
76
+ d && j[d],
77
+ k && p[k]
78
+ ].filter(Boolean).join(" "), e = t?.name ?? x.name, n = h ? "mixed" : void 0, b = t && a !== void 0 && (typeof a == "string" || typeof a == "number") ? t.value?.includes(a) ?? !1 : y, v = t?.disabled || i, $ = (s) => {
79
+ t && a !== void 0 && (typeof a == "string" || typeof a == "number") && t.onChange?.(a, s.target.checked), m?.(s);
80
+ }, R = V.useCallback(
81
+ (s) => {
82
+ s && (s.indeterminate = h), typeof o == "function" ? o(s) : o && (o.current = s);
72
83
  },
73
84
  [h, o]
74
- ), N = h ? "indeterminate" : f ? "checked" : "unchecked";
75
- if (a) {
76
- const n = [
85
+ ), w = h ? "indeterminate" : b ? "checked" : "unchecked";
86
+ if (r) {
87
+ const s = [
77
88
  "swap",
78
- a.effect === "rotate" && "swap-rotate",
79
- a.effect === "flip" && "swap-flip",
80
- d
89
+ r.effect === "rotate" && "swap-rotate",
90
+ r.effect === "flip" && "swap-flip",
91
+ f
81
92
  ].filter(Boolean).join(" ");
82
- return /* @__PURE__ */ p("label", { className: n, children: [
93
+ return /* @__PURE__ */ C("label", { className: s, children: [
83
94
  /* @__PURE__ */ c(
84
95
  "input",
85
96
  {
86
97
  ref: o,
87
98
  type: "checkbox",
88
- checked: f,
89
- onChange: w,
99
+ name: e,
100
+ checked: b,
101
+ onChange: $,
90
102
  disabled: v,
91
- "data-state": N,
92
- ...l
103
+ "aria-checked": n,
104
+ "data-state": w,
105
+ ...x
93
106
  }
94
107
  ),
95
- /* @__PURE__ */ c("div", { className: "swap-on", children: a.on }),
96
- /* @__PURE__ */ c("div", { className: "swap-off", children: a.off })
108
+ /* @__PURE__ */ c("div", { className: "swap-on", children: r.on }),
109
+ /* @__PURE__ */ c("div", { className: "swap-off", children: r.off })
97
110
  ] });
98
111
  }
99
- const j = /* @__PURE__ */ c(
112
+ return u ? /* @__PURE__ */ C("label", { className: `flex items-center cursor-pointer gap-2 ${f}`.trim(), children: [
113
+ /* @__PURE__ */ c(
114
+ "input",
115
+ {
116
+ ref: R,
117
+ type: "checkbox",
118
+ className: l,
119
+ name: e,
120
+ value: a,
121
+ checked: b,
122
+ onChange: $,
123
+ disabled: v,
124
+ "aria-checked": n,
125
+ "data-state": w,
126
+ ...x
127
+ }
128
+ ),
129
+ /* @__PURE__ */ c("span", { children: u })
130
+ ] }) : /* @__PURE__ */ c(
100
131
  "input",
101
132
  {
102
- ref: V,
133
+ ref: R,
103
134
  type: "checkbox",
104
- className: k,
105
- value: s,
106
- checked: f,
107
- onChange: w,
135
+ className: `${l} ${f}`.trim(),
136
+ name: e,
137
+ value: a,
138
+ checked: b,
139
+ onChange: $,
108
140
  disabled: v,
109
- "data-state": N,
110
- ...l
141
+ "aria-checked": n,
142
+ "data-state": w,
143
+ ...x
111
144
  }
112
145
  );
113
- return x ? /* @__PURE__ */ p("label", { className: `flex items-center cursor-pointer gap-2 ${d}`, children: [
114
- j,
115
- /* @__PURE__ */ c("span", { children: x })
116
- ] }) : j;
117
146
  }
118
147
  );
119
- m.displayName = "Checkbox";
120
- const z = Object.assign(m, {
121
- Group: I
148
+ g.displayName = "Checkbox";
149
+ const D = Object.assign(g, {
150
+ Group: S
122
151
  });
123
152
  export {
124
- z as Checkbox
153
+ D as Checkbox
125
154
  };
126
155
  //# sourceMappingURL=Checkbox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Checkbox.js","sources":["../../src/components/Checkbox.tsx"],"sourcesContent":["import React, { forwardRef, createContext, useContext } from 'react'\n\nexport interface CheckboxSwapConfig {\n /** Content shown when checked */\n on: React.ReactNode\n /** Content shown when unchecked */\n off: React.ReactNode\n /** Animation effect for the swap transition */\n effect?: 'rotate' | 'flip'\n}\n\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'> {\n children?: React.ReactNode\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: 'primary' | 'secondary' | 'accent' | 'neutral' | 'success' | 'warning' | 'info' | 'error'\n indeterminate?: boolean\n /** Swap mode: toggle between two visual states instead of showing a checkbox */\n swap?: CheckboxSwapConfig\n className?: string\n}\n\nexport interface CheckboxOptionType {\n label: React.ReactNode\n value: string | number\n disabled?: boolean\n}\n\nexport interface CheckboxGroupProps {\n children?: React.ReactNode\n value?: (string | number)[]\n defaultValue?: (string | number)[]\n onChange?: (values: (string | number)[]) => void\n disabled?: boolean\n options?: (string | number | CheckboxOptionType)[]\n /** Layout direction for options */\n direction?: 'horizontal' | 'vertical'\n className?: string\n}\n\ninterface CheckboxGroupContextValue {\n value?: (string | number)[]\n onChange?: (checkedValue: string | number, checked: boolean) => void\n disabled?: boolean\n}\n\nconst CheckboxGroupContext = createContext<CheckboxGroupContextValue | null>(null)\n\nfunction CheckboxGroup({\n children,\n value,\n defaultValue,\n onChange,\n disabled = false,\n options,\n direction = 'vertical',\n className = ''\n}: CheckboxGroupProps) {\n const [internalValue, setInternalValue] = React.useState<(string | number)[]>(defaultValue || [])\n const currentValue = value !== undefined ? value : internalValue\n\n const handleChange = (checkedValue: string | number, checked: boolean) => {\n const newValue = checked\n ? [...currentValue, checkedValue]\n : currentValue.filter((v) => v !== checkedValue)\n\n if (value === undefined) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n }\n\n const contextValue: CheckboxGroupContextValue = {\n value: currentValue,\n onChange: handleChange,\n disabled,\n }\n\n // If options are provided, render checkboxes automatically\n if (options) {\n const directionClasses = direction === 'horizontal' ? 'flex flex-row flex-wrap gap-4' : 'flex flex-col'\n return (\n <CheckboxGroupContext.Provider value={contextValue}>\n <div className={`${directionClasses} ${className}`.trim()}>\n {options.map((option) => {\n if (typeof option === 'string' || typeof option === 'number') {\n return (\n <label key={option} className=\"flex items-center cursor-pointer gap-2\">\n <CheckboxRoot value={option} />\n <span>{option}</span>\n </label>\n )\n } else {\n return (\n <label key={option.value} className=\"flex items-center cursor-pointer gap-2\">\n <CheckboxRoot value={option.value} disabled={option.disabled} />\n <span>{option.label}</span>\n </label>\n )\n }\n })}\n </div>\n </CheckboxGroupContext.Provider>\n )\n }\n\n return (\n <CheckboxGroupContext.Provider value={contextValue}>\n <div className={className}>{children}</div>\n </CheckboxGroupContext.Provider>\n )\n}\n\nconst CheckboxRoot = forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n children,\n size,\n color,\n indeterminate = false,\n swap,\n className = '',\n value,\n checked,\n onChange,\n disabled: disabledProp,\n ...props\n },\n ref\n ) => {\n const groupContext = useContext(CheckboxGroupContext)\n\n const sizeClasses = {\n xs: 'checkbox-xs',\n sm: 'checkbox-sm',\n md: 'checkbox-md',\n lg: 'checkbox-lg',\n xl: 'checkbox-xl',\n }\n\n const colorClasses = {\n primary: 'checkbox-primary',\n secondary: 'checkbox-secondary',\n accent: 'checkbox-accent',\n neutral: 'checkbox-neutral',\n success: 'checkbox-success',\n warning: 'checkbox-warning',\n info: 'checkbox-info',\n error: 'checkbox-error',\n }\n\n const checkboxClasses = [\n 'checkbox',\n size && sizeClasses[size],\n color && colorClasses[color],\n ]\n .filter(Boolean)\n .join(' ')\n\n // If in a group, use group's value to determine checked state\n const isChecked = groupContext && value !== undefined && (typeof value === 'string' || typeof value === 'number')\n ? groupContext.value?.includes(value) ?? false\n : checked\n\n const isDisabled = groupContext?.disabled || disabledProp\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (groupContext && value !== undefined && (typeof value === 'string' || typeof value === 'number')) {\n groupContext.onChange?.(value, e.target.checked)\n }\n onChange?.(e)\n }\n\n // Handle indeterminate state\n const checkboxRef = React.useCallback(\n (node: HTMLInputElement | null) => {\n if (node) {\n node.indeterminate = indeterminate\n }\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n },\n [indeterminate, ref]\n )\n\n const dataState = indeterminate ? 'indeterminate' : isChecked ? 'checked' : 'unchecked'\n\n // Swap mode: render as a swap toggle instead of checkbox\n if (swap) {\n const swapClasses = [\n 'swap',\n swap.effect === 'rotate' && 'swap-rotate',\n swap.effect === 'flip' && 'swap-flip',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <label className={swapClasses}>\n <input\n ref={ref}\n type=\"checkbox\"\n checked={isChecked}\n onChange={handleChange}\n disabled={isDisabled}\n data-state={dataState}\n {...props}\n />\n <div className=\"swap-on\">{swap.on}</div>\n <div className=\"swap-off\">{swap.off}</div>\n </label>\n )\n }\n\n const checkboxInput = (\n <input\n ref={checkboxRef}\n type=\"checkbox\"\n className={checkboxClasses}\n value={value}\n checked={isChecked}\n onChange={handleChange}\n disabled={isDisabled}\n data-state={dataState}\n {...props}\n />\n )\n\n // If children provided, wrap in label\n if (children) {\n return (\n <label className={`flex items-center cursor-pointer gap-2 ${className}`}>\n {checkboxInput}\n <span>{children}</span>\n </label>\n )\n }\n\n return checkboxInput\n }\n)\n\nCheckboxRoot.displayName = 'Checkbox'\n\nexport const Checkbox = Object.assign(CheckboxRoot, {\n Group: CheckboxGroup,\n})\n"],"names":["CheckboxGroupContext","createContext","CheckboxGroup","children","value","defaultValue","onChange","disabled","options","direction","className","internalValue","setInternalValue","React","currentValue","contextValue","checkedValue","checked","newValue","v","directionClasses","option","jsxs","jsx","CheckboxRoot","forwardRef","size","color","indeterminate","swap","disabledProp","props","ref","groupContext","useContext","sizeClasses","colorClasses","checkboxClasses","isChecked","isDisabled","handleChange","e","checkboxRef","node","dataState","swapClasses","checkboxInput","Checkbox"],"mappings":"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"}
1
+ {"version":3,"file":"Checkbox.js","sources":["../../src/components/Checkbox.tsx"],"sourcesContent":["import React, { forwardRef, createContext, useContext } from 'react'\n\nexport interface CheckboxSwapConfig {\n /** Content shown when checked */\n on: React.ReactNode\n /** Content shown when unchecked */\n off: React.ReactNode\n /** Animation effect for the swap transition */\n effect?: 'rotate' | 'flip'\n}\n\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'> {\n children?: React.ReactNode\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: 'primary' | 'secondary' | 'accent' | 'neutral' | 'success' | 'warning' | 'info' | 'error'\n indeterminate?: boolean\n /** Swap mode: toggle between two visual states instead of showing a checkbox */\n swap?: CheckboxSwapConfig\n className?: string\n}\n\nexport interface CheckboxOptionType {\n label: React.ReactNode\n value: string | number\n disabled?: boolean\n}\n\nexport interface CheckboxGroupProps {\n children?: React.ReactNode\n value?: (string | number)[]\n defaultValue?: (string | number)[]\n onChange?: (values: (string | number)[]) => void\n disabled?: boolean\n options?: (string | number | CheckboxOptionType)[]\n /** Layout direction for options */\n direction?: 'horizontal' | 'vertical'\n /** HTML name attribute for all checkboxes in the group (for form submission) */\n name?: string\n className?: string\n 'data-testid'?: string\n}\n\ninterface CheckboxGroupContextValue {\n value?: (string | number)[]\n onChange?: (checkedValue: string | number, checked: boolean) => void\n disabled?: boolean\n name?: string\n}\n\nconst CheckboxGroupContext = createContext<CheckboxGroupContextValue | null>(null)\n\nfunction CheckboxGroup({\n children,\n value,\n defaultValue,\n onChange,\n disabled = false,\n options,\n direction = 'vertical',\n name,\n className = '',\n 'data-testid': testId\n}: CheckboxGroupProps) {\n const [internalValue, setInternalValue] = React.useState<(string | number)[]>(defaultValue || [])\n const currentValue = value !== undefined ? value : internalValue\n\n const handleChange = (checkedValue: string | number, checked: boolean) => {\n const newValue = checked\n ? [...currentValue, checkedValue]\n : currentValue.filter((v) => v !== checkedValue)\n\n if (value === undefined) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n }\n\n const contextValue: CheckboxGroupContextValue = {\n value: currentValue,\n onChange: handleChange,\n disabled,\n name,\n }\n\n // If options are provided, render checkboxes automatically\n if (options) {\n const directionClasses = direction === 'horizontal' ? 'flex flex-row flex-wrap gap-4' : 'flex flex-col gap-2'\n return (\n <CheckboxGroupContext.Provider value={contextValue}>\n <div className={`${directionClasses} ${className}`.trim()} data-testid={testId}>\n {options.map((option) => {\n if (typeof option === 'string' || typeof option === 'number') {\n const optionTestId = testId ? `${testId}-option-${option}` : undefined\n return (\n <label key={option} className=\"flex items-center cursor-pointer gap-2\">\n <CheckboxRoot value={option} data-testid={optionTestId} />\n <span>{option}</span>\n </label>\n )\n } else {\n const optionTestId = testId ? `${testId}-option-${option.value}` : undefined\n return (\n <label key={option.value} className=\"flex items-center cursor-pointer gap-2\">\n <CheckboxRoot value={option.value} disabled={option.disabled} data-testid={optionTestId} />\n <span>{option.label}</span>\n </label>\n )\n }\n })}\n </div>\n </CheckboxGroupContext.Provider>\n )\n }\n\n return (\n <CheckboxGroupContext.Provider value={contextValue}>\n <div className={className}>{children}</div>\n </CheckboxGroupContext.Provider>\n )\n}\n\nconst CheckboxRoot = forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n children,\n size,\n color,\n indeterminate = false,\n swap,\n className = '',\n value,\n checked,\n onChange,\n disabled: disabledProp,\n ...props\n },\n ref\n ) => {\n const groupContext = useContext(CheckboxGroupContext)\n\n const sizeClasses = {\n xs: 'checkbox-xs',\n sm: 'checkbox-sm',\n md: 'checkbox-md',\n lg: 'checkbox-lg',\n xl: 'checkbox-xl',\n }\n\n const colorClasses = {\n primary: 'checkbox-primary',\n secondary: 'checkbox-secondary',\n accent: 'checkbox-accent',\n neutral: 'checkbox-neutral',\n success: 'checkbox-success',\n warning: 'checkbox-warning',\n info: 'checkbox-info',\n error: 'checkbox-error',\n }\n\n const checkboxClasses = [\n 'checkbox',\n size && sizeClasses[size],\n color && colorClasses[color],\n ]\n .filter(Boolean)\n .join(' ')\n\n // Get name from group context or props\n const inputName = groupContext?.name ?? props.name\n\n // aria-checked should be \"mixed\" for indeterminate state\n const ariaChecked = indeterminate ? 'mixed' : undefined\n\n // If in a group, use group's value to determine checked state\n const isChecked = groupContext && value !== undefined && (typeof value === 'string' || typeof value === 'number')\n ? groupContext.value?.includes(value) ?? false\n : checked\n\n const isDisabled = groupContext?.disabled || disabledProp\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (groupContext && value !== undefined && (typeof value === 'string' || typeof value === 'number')) {\n groupContext.onChange?.(value, e.target.checked)\n }\n onChange?.(e)\n }\n\n // Handle indeterminate state\n const checkboxRef = React.useCallback(\n (node: HTMLInputElement | null) => {\n if (node) {\n node.indeterminate = indeterminate\n }\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n },\n [indeterminate, ref]\n )\n\n const dataState = indeterminate ? 'indeterminate' : isChecked ? 'checked' : 'unchecked'\n\n // Swap mode: render as a swap toggle instead of checkbox\n if (swap) {\n const swapClasses = [\n 'swap',\n swap.effect === 'rotate' && 'swap-rotate',\n swap.effect === 'flip' && 'swap-flip',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <label className={swapClasses}>\n <input\n ref={ref}\n type=\"checkbox\"\n name={inputName}\n checked={isChecked}\n onChange={handleChange}\n disabled={isDisabled}\n aria-checked={ariaChecked}\n data-state={dataState}\n {...props}\n />\n <div className=\"swap-on\">{swap.on}</div>\n <div className=\"swap-off\">{swap.off}</div>\n </label>\n )\n }\n\n // If children provided, wrap in label\n if (children) {\n return (\n <label className={`flex items-center cursor-pointer gap-2 ${className}`.trim()}>\n <input\n ref={checkboxRef}\n type=\"checkbox\"\n className={checkboxClasses}\n name={inputName}\n value={value}\n checked={isChecked}\n onChange={handleChange}\n disabled={isDisabled}\n aria-checked={ariaChecked}\n data-state={dataState}\n {...props}\n />\n <span>{children}</span>\n </label>\n )\n }\n\n // Bare checkbox input (no children, no swap)\n return (\n <input\n ref={checkboxRef}\n type=\"checkbox\"\n className={`${checkboxClasses} ${className}`.trim()}\n name={inputName}\n value={value}\n checked={isChecked}\n onChange={handleChange}\n disabled={isDisabled}\n aria-checked={ariaChecked}\n data-state={dataState}\n {...props}\n />\n )\n }\n)\n\nCheckboxRoot.displayName = 'Checkbox'\n\nexport const Checkbox = Object.assign(CheckboxRoot, {\n Group: CheckboxGroup,\n})\n"],"names":["CheckboxGroupContext","createContext","CheckboxGroup","children","value","defaultValue","onChange","disabled","options","direction","name","className","testId","internalValue","setInternalValue","React","currentValue","contextValue","checkedValue","checked","newValue","v","directionClasses","jsx","option","optionTestId","jsxs","CheckboxRoot","forwardRef","size","color","indeterminate","swap","disabledProp","props","ref","groupContext","useContext","sizeClasses","colorClasses","checkboxClasses","inputName","ariaChecked","isChecked","isDisabled","handleChange","e","checkboxRef","node","dataState","swapClasses","Checkbox"],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { default as React } from 'react';
2
+ import { Locale } from '../locale';
3
+ export type ComponentSize = 'small' | 'middle' | 'large';
4
+ export type Direction = 'ltr' | 'rtl';
5
+ export interface ConfigContextValue {
6
+ /** Current locale */
7
+ locale: Locale;
8
+ /** Component size */
9
+ componentSize?: ComponentSize;
10
+ /** Layout direction */
11
+ direction?: Direction;
12
+ /** Prefix for CSS classes */
13
+ prefixCls?: string;
14
+ /** Default container for portals (modals, dropdowns, etc.) */
15
+ getPopupContainer?: (triggerNode?: HTMLElement) => HTMLElement;
16
+ }
17
+ export interface ConfigProviderProps {
18
+ /** Locale configuration */
19
+ locale?: Locale;
20
+ /** Component size for all child components */
21
+ componentSize?: ComponentSize;
22
+ /** Layout direction (ltr or rtl) */
23
+ direction?: Direction;
24
+ /** Prefix for CSS classes */
25
+ prefixCls?: string;
26
+ /** Default container for portals */
27
+ getPopupContainer?: (triggerNode?: HTMLElement) => HTMLElement;
28
+ /** Child components */
29
+ children?: React.ReactNode;
30
+ }
31
+ declare const ConfigContext: React.Context<ConfigContextValue>;
32
+ /**
33
+ * Hook to access the current configuration
34
+ */
35
+ export declare function useConfig(): ConfigContextValue;
36
+ /**
37
+ * Hook to access the current locale
38
+ */
39
+ export declare function useLocale(): Locale;
40
+ /**
41
+ * Hook to get locale strings for a specific component
42
+ */
43
+ export declare function useComponentLocale<K extends keyof Locale>(componentName: K): NonNullable<Locale[K]>;
44
+ /**
45
+ * ConfigProvider component for global configuration
46
+ *
47
+ * Provides locale, component size, direction, and other settings to all child components.
48
+ *
49
+ * @example
50
+ * ```tsx
51
+ * import { ConfigProvider, zhCN } from 'asterui'
52
+ *
53
+ * <ConfigProvider locale={zhCN} componentSize="small">
54
+ * <App />
55
+ * </ConfigProvider>
56
+ * ```
57
+ */
58
+ export declare const ConfigProvider: React.FC<ConfigProviderProps>;
59
+ export { ConfigContext };
@@ -0,0 +1,46 @@
1
+ import { jsx as a } from "react/jsx-runtime";
2
+ import { createContext as C, useContext as r, useMemo as p } from "react";
3
+ import u from "../locale/en-US.js";
4
+ const m = {
5
+ locale: u,
6
+ componentSize: "middle",
7
+ direction: "ltr"
8
+ }, n = C(m);
9
+ function P() {
10
+ return r(n);
11
+ }
12
+ function d() {
13
+ const { locale: o } = r(n);
14
+ return o;
15
+ }
16
+ function S(o) {
17
+ return d()[o] ?? u[o] ?? {};
18
+ }
19
+ const z = ({
20
+ locale: o,
21
+ componentSize: t,
22
+ direction: i,
23
+ prefixCls: c,
24
+ getPopupContainer: l,
25
+ children: f
26
+ }) => {
27
+ const e = r(n), s = p(
28
+ () => ({
29
+ locale: o ?? e.locale,
30
+ componentSize: t ?? e.componentSize,
31
+ direction: i ?? e.direction,
32
+ prefixCls: c ?? e.prefixCls,
33
+ getPopupContainer: l ?? e.getPopupContainer
34
+ }),
35
+ [o, t, i, c, l, e]
36
+ );
37
+ return /* @__PURE__ */ a(n.Provider, { value: s, children: f });
38
+ };
39
+ export {
40
+ n as ConfigContext,
41
+ z as ConfigProvider,
42
+ S as useComponentLocale,
43
+ P as useConfig,
44
+ d as useLocale
45
+ };
46
+ //# sourceMappingURL=ConfigProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigProvider.js","sources":["../../src/components/ConfigProvider.tsx"],"sourcesContent":["import React, { createContext, useContext, useMemo } from 'react'\nimport type { Locale } from '../locale'\nimport enUS from '../locale/en-US'\n\nexport type ComponentSize = 'small' | 'middle' | 'large'\nexport type Direction = 'ltr' | 'rtl'\n\nexport interface ConfigContextValue {\n /** Current locale */\n locale: Locale\n /** Component size */\n componentSize?: ComponentSize\n /** Layout direction */\n direction?: Direction\n /** Prefix for CSS classes */\n prefixCls?: string\n /** Default container for portals (modals, dropdowns, etc.) */\n getPopupContainer?: (triggerNode?: HTMLElement) => HTMLElement\n}\n\nexport interface ConfigProviderProps {\n /** Locale configuration */\n locale?: Locale\n /** Component size for all child components */\n componentSize?: ComponentSize\n /** Layout direction (ltr or rtl) */\n direction?: Direction\n /** Prefix for CSS classes */\n prefixCls?: string\n /** Default container for portals */\n getPopupContainer?: (triggerNode?: HTMLElement) => HTMLElement\n /** Child components */\n children?: React.ReactNode\n}\n\nconst defaultConfig: ConfigContextValue = {\n locale: enUS,\n componentSize: 'middle',\n direction: 'ltr',\n}\n\nconst ConfigContext = createContext<ConfigContextValue>(defaultConfig)\n\n/**\n * Hook to access the current configuration\n */\nexport function useConfig(): ConfigContextValue {\n return useContext(ConfigContext)\n}\n\n/**\n * Hook to access the current locale\n */\nexport function useLocale(): Locale {\n const { locale } = useContext(ConfigContext)\n return locale\n}\n\n/**\n * Hook to get locale strings for a specific component\n */\nexport function useComponentLocale<K extends keyof Locale>(\n componentName: K\n): NonNullable<Locale[K]> {\n const locale = useLocale()\n return (locale[componentName] ?? enUS[componentName] ?? {}) as NonNullable<Locale[K]>\n}\n\n/**\n * ConfigProvider component for global configuration\n *\n * Provides locale, component size, direction, and other settings to all child components.\n *\n * @example\n * ```tsx\n * import { ConfigProvider, zhCN } from 'asterui'\n *\n * <ConfigProvider locale={zhCN} componentSize=\"small\">\n * <App />\n * </ConfigProvider>\n * ```\n */\nexport const ConfigProvider: React.FC<ConfigProviderProps> = ({\n locale,\n componentSize,\n direction,\n prefixCls,\n getPopupContainer,\n children,\n}) => {\n // Get parent config if nested\n const parentConfig = useContext(ConfigContext)\n\n const config = useMemo<ConfigContextValue>(\n () => ({\n locale: locale ?? parentConfig.locale,\n componentSize: componentSize ?? parentConfig.componentSize,\n direction: direction ?? parentConfig.direction,\n prefixCls: prefixCls ?? parentConfig.prefixCls,\n getPopupContainer: getPopupContainer ?? parentConfig.getPopupContainer,\n }),\n [locale, componentSize, direction, prefixCls, getPopupContainer, parentConfig]\n )\n\n return <ConfigContext.Provider value={config}>{children}</ConfigContext.Provider>\n}\n\n// Also export the context for advanced use cases\nexport { ConfigContext }\n"],"names":["defaultConfig","enUS","ConfigContext","createContext","useConfig","useContext","useLocale","locale","useComponentLocale","componentName","ConfigProvider","componentSize","direction","prefixCls","getPopupContainer","children","parentConfig","config","useMemo"],"mappings":";;;AAmCA,MAAMA,IAAoC;AAAA,EACxC,QAAQC;AAAA,EACR,eAAe;AAAA,EACf,WAAW;AACb,GAEMC,IAAgBC,EAAkCH,CAAa;AAK9D,SAASI,IAAgC;AAC9C,SAAOC,EAAWH,CAAa;AACjC;AAKO,SAASI,IAAoB;AAClC,QAAM,EAAE,QAAAC,EAAA,IAAWF,EAAWH,CAAa;AAC3C,SAAOK;AACT;AAKO,SAASC,EACdC,GACwB;AAExB,SADeH,EAAA,EACAG,CAAa,KAAKR,EAAKQ,CAAa,KAAK,CAAA;AAC1D;AAgBO,MAAMC,IAAgD,CAAC;AAAA,EAC5D,QAAAH;AAAA,EACA,eAAAI;AAAA,EACA,WAAAC;AAAA,EACA,WAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,UAAAC;AACF,MAAM;AAEJ,QAAMC,IAAeX,EAAWH,CAAa,GAEvCe,IAASC;AAAA,IACb,OAAO;AAAA,MACL,QAAQX,KAAUS,EAAa;AAAA,MAC/B,eAAeL,KAAiBK,EAAa;AAAA,MAC7C,WAAWJ,KAAaI,EAAa;AAAA,MACrC,WAAWH,KAAaG,EAAa;AAAA,MACrC,mBAAmBF,KAAqBE,EAAa;AAAA,IAAA;AAAA,IAEvD,CAACT,GAAQI,GAAeC,GAAWC,GAAWC,GAAmBE,CAAY;AAAA,EAAA;AAG/E,2BAAQd,EAAc,UAAd,EAAuB,OAAOe,GAAS,UAAAF,GAAS;AAC1D;"}
@@ -1,4 +1,5 @@
1
1
  import { default as React } from 'react';
2
+ export type CopyButtonPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';
2
3
  export interface CopyButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'onError'> {
3
4
  /** Text to copy to clipboard */
4
5
  text: string;
@@ -12,6 +13,8 @@ export interface CopyButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLBut
12
13
  size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
13
14
  /** Button shape */
14
15
  shape?: 'square' | 'circle';
16
+ /** Absolute position within parent (parent must have position: relative) */
17
+ position?: CopyButtonPosition;
15
18
  /** Custom icon for default state */
16
19
  icon?: React.ReactNode;
17
20
  /** Custom icon for copied state */