@zentauri-ui/zentauri-components 2.1.8 → 2.1.9

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 (77) hide show
  1. package/README.md +5 -4
  2. package/cli/props.json +161 -0
  3. package/cli/registry.json +2 -0
  4. package/dist/{chunk-D7ZTSAA6.mjs → chunk-3HBC34NF.mjs} +4 -4
  5. package/dist/{chunk-D7ZTSAA6.mjs.map → chunk-3HBC34NF.mjs.map} +1 -1
  6. package/dist/{chunk-UVP3MUBU.mjs → chunk-3RC5IG6O.mjs} +18 -6
  7. package/dist/chunk-3RC5IG6O.mjs.map +1 -0
  8. package/dist/{chunk-DPNTQ4AK.js → chunk-4TPE5DEG.js} +18 -6
  9. package/dist/chunk-4TPE5DEG.js.map +1 -0
  10. package/dist/{chunk-L5QORCUO.js → chunk-7CZDJTPD.js} +12 -12
  11. package/dist/{chunk-L5QORCUO.js.map → chunk-7CZDJTPD.js.map} +1 -1
  12. package/dist/{chunk-BAAXQPZ7.js → chunk-7DGPRPWM.js} +6 -6
  13. package/dist/{chunk-BAAXQPZ7.js.map → chunk-7DGPRPWM.js.map} +1 -1
  14. package/dist/chunk-GP3FUS2H.mjs +26 -0
  15. package/dist/chunk-GP3FUS2H.mjs.map +1 -0
  16. package/dist/chunk-MWG7LHAK.js +19 -0
  17. package/dist/{chunk-6OVDBAMI.js.map → chunk-MWG7LHAK.js.map} +1 -1
  18. package/dist/{chunk-OWVQVAOY.mjs → chunk-OLT7P7JO.mjs} +3 -3
  19. package/dist/{chunk-OWVQVAOY.mjs.map → chunk-OLT7P7JO.mjs.map} +1 -1
  20. package/dist/chunk-PAISX7YL.js +38 -0
  21. package/dist/chunk-PAISX7YL.js.map +1 -0
  22. package/dist/{chunk-4PAHLHYF.mjs → chunk-VN7FE5RR.mjs} +3 -3
  23. package/dist/{chunk-4PAHLHYF.mjs.map → chunk-VN7FE5RR.mjs.map} +1 -1
  24. package/dist/design-system/code-diff.d.ts +18 -0
  25. package/dist/design-system/code-diff.d.ts.map +1 -0
  26. package/dist/design-system/facade.js +7 -6
  27. package/dist/design-system/facade.js.map +1 -1
  28. package/dist/design-system/facade.mjs +6 -5
  29. package/dist/design-system/facade.mjs.map +1 -1
  30. package/dist/design-system/index.d.ts +1 -0
  31. package/dist/design-system/index.d.ts.map +1 -1
  32. package/dist/ui/buttons/animated.js +9 -8
  33. package/dist/ui/buttons/animated.js.map +1 -1
  34. package/dist/ui/buttons/animated.mjs +7 -6
  35. package/dist/ui/buttons/animated.mjs.map +1 -1
  36. package/dist/ui/buttons.js +10 -9
  37. package/dist/ui/buttons.mjs +8 -7
  38. package/dist/ui/code-diff/code-diff-base.d.ts +6 -0
  39. package/dist/ui/code-diff/code-diff-base.d.ts.map +1 -0
  40. package/dist/ui/code-diff/code-diff.d.ts +6 -0
  41. package/dist/ui/code-diff/code-diff.d.ts.map +1 -0
  42. package/dist/ui/code-diff/index.d.ts +4 -0
  43. package/dist/ui/code-diff/index.d.ts.map +1 -0
  44. package/dist/ui/code-diff/types.d.ts +26 -0
  45. package/dist/ui/code-diff/types.d.ts.map +1 -0
  46. package/dist/ui/code-diff/variants.d.ts +11 -0
  47. package/dist/ui/code-diff/variants.d.ts.map +1 -0
  48. package/dist/ui/code-diff.js +302 -0
  49. package/dist/ui/code-diff.js.map +1 -0
  50. package/dist/ui/code-diff.mjs +297 -0
  51. package/dist/ui/code-diff.mjs.map +1 -0
  52. package/dist/ui/data-table.js +21 -20
  53. package/dist/ui/data-table.js.map +1 -1
  54. package/dist/ui/data-table.mjs +11 -10
  55. package/dist/ui/data-table.mjs.map +1 -1
  56. package/dist/ui/dynamic-stepper.js +19 -18
  57. package/dist/ui/dynamic-stepper.js.map +1 -1
  58. package/dist/ui/dynamic-stepper.mjs +8 -7
  59. package/dist/ui/dynamic-stepper.mjs.map +1 -1
  60. package/dist/ui/pagination.js +11 -10
  61. package/dist/ui/pagination.mjs +8 -7
  62. package/dist/ui/split-button.js +21 -20
  63. package/dist/ui/split-button.js.map +1 -1
  64. package/dist/ui/split-button.mjs +8 -7
  65. package/dist/ui/split-button.mjs.map +1 -1
  66. package/package.json +4 -1
  67. package/src/design-system/code-diff.ts +37 -0
  68. package/src/design-system/index.ts +1 -0
  69. package/src/ui/code-diff/code-diff-base.tsx +284 -0
  70. package/src/ui/code-diff/code-diff.test.tsx +50 -0
  71. package/src/ui/code-diff/code-diff.tsx +8 -0
  72. package/src/ui/code-diff/index.ts +15 -0
  73. package/src/ui/code-diff/types.ts +31 -0
  74. package/src/ui/code-diff/variants.ts +49 -0
  75. package/dist/chunk-6OVDBAMI.js +0 -19
  76. package/dist/chunk-DPNTQ4AK.js.map +0 -1
  77. package/dist/chunk-UVP3MUBU.mjs.map +0 -1
@@ -2,10 +2,11 @@
2
2
  import { Dropdown, DropdownTrigger, DropdownContent, DropdownItem } from '../chunk-IHDM7AHY.mjs';
3
3
  import '../chunk-VXDEPZKH.mjs';
4
4
  import '../chunk-VBNW2B4D.mjs';
5
- import '../chunk-OWVQVAOY.mjs';
6
- import { buttonVariants } from '../chunk-4PAHLHYF.mjs';
7
- import { zuiSplitButtonRoot, zuiSplitButtonFullWidth, zuiSplitButtonDropdown, zuiSplitButtonGroup, zuiSplitButtonPrimary, zuiSplitButtonTrigger, zuiSplitButtonTriggerSizes, zuiSplitButtonContent, zuiSplitButtonItemDisabled } from '../chunk-UVP3MUBU.mjs';
5
+ import '../chunk-OLT7P7JO.mjs';
6
+ import { buttonVariants } from '../chunk-VN7FE5RR.mjs';
7
+ import { zuiSplitButtonRoot, zuiSplitButtonFullWidth, zuiSplitButtonDropdown, zuiSplitButtonGroup, zuiSplitButtonPrimary, zuiSplitButtonTrigger, zuiSplitButtonTriggerSizes, zuiSplitButtonContent, zuiSplitButtonItemDisabled } from '../chunk-3RC5IG6O.mjs';
8
8
  import '../chunk-2NQKFH26.mjs';
9
+ import '../chunk-YPTHTFVF.mjs';
9
10
  import '../chunk-XY3TKIIH.mjs';
10
11
  import '../chunk-FX5KR2GP.mjs';
11
12
  import '../chunk-ZBAKTM2R.mjs';
@@ -13,24 +14,25 @@ import '../chunk-4ZBMDWWY.mjs';
13
14
  import '../chunk-YH6MOKHR.mjs';
14
15
  import '../chunk-T4ZLTKV2.mjs';
15
16
  import '../chunk-PUSCPBT2.mjs';
17
+ import '../chunk-5AOVTY2X.mjs';
16
18
  import '../chunk-523VQLCW.mjs';
17
19
  import '../chunk-3VW4HMJT.mjs';
18
20
  import '../chunk-LRYKMXKI.mjs';
19
21
  import '../chunk-XFJIX2YP.mjs';
20
22
  import '../chunk-4WG3VNVL.mjs';
21
- import '../chunk-YPTHTFVF.mjs';
23
+ import '../chunk-34LHS26H.mjs';
22
24
  import '../chunk-JEDMUBYI.mjs';
23
25
  import '../chunk-EJ3UMMCS.mjs';
24
26
  import '../chunk-EE53BIXR.mjs';
25
27
  import '../chunk-YXU2MJMT.mjs';
26
28
  import '../chunk-3IE4IELX.mjs';
27
29
  import '../chunk-BUEI4RMR.mjs';
28
- import '../chunk-5AOVTY2X.mjs';
30
+ import '../chunk-U64ISRUX.mjs';
29
31
  import '../chunk-SS3T3BUL.mjs';
30
32
  import '../chunk-SCWQSQBJ.mjs';
31
33
  import '../chunk-ZPGYR2UP.mjs';
32
34
  import '../chunk-MBEQ4GQ7.mjs';
33
- import '../chunk-34LHS26H.mjs';
35
+ import '../chunk-GP3FUS2H.mjs';
34
36
  import '../chunk-YKTANA3H.mjs';
35
37
  import '../chunk-ENYZGL4R.mjs';
36
38
  import '../chunk-2VPXQ2LA.mjs';
@@ -38,7 +40,6 @@ import '../chunk-GUB3RSPR.mjs';
38
40
  import '../chunk-6ERBVFDA.mjs';
39
41
  import '../chunk-DOA4ESKS.mjs';
40
42
  import '../chunk-QX6PPTWL.mjs';
41
- import '../chunk-U64ISRUX.mjs';
42
43
  import '../chunk-TKAOHMVA.mjs';
43
44
  import '../chunk-HFQJRAG7.mjs';
44
45
  import '../chunk-NIVJFG5Z.mjs';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ui/split-button/variants.ts","../../src/ui/split-button/split-button-base.tsx","../../src/ui/split-button/split-button.tsx"],"names":["jsx"],"mappings":"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","file":"split-button.mjs","sourcesContent":["import { cva } from \"class-variance-authority\";\n\nimport {\n zuiSplitButtonContent,\n zuiSplitButtonDropdown,\n zuiSplitButtonFullWidth,\n zuiSplitButtonGroup,\n zuiSplitButtonItemDisabled,\n zuiSplitButtonPrimary,\n zuiSplitButtonRoot,\n zuiSplitButtonTrigger,\n zuiSplitButtonTriggerSizes,\n} from \"../../design-system\";\n\nexport const splitButtonRootVariants = cva(zuiSplitButtonRoot, {\n variants: {\n fullWidth: {\n true: zuiSplitButtonFullWidth,\n },\n },\n});\nexport const splitButtonDropdownVariants = cva(zuiSplitButtonDropdown, {\n variants: {\n fullWidth: {\n true: zuiSplitButtonFullWidth,\n },\n },\n});\nexport const splitButtonGroupVariants = cva(zuiSplitButtonGroup, {\n variants: {\n fullWidth: {\n true: zuiSplitButtonFullWidth,\n },\n },\n});\nexport const splitButtonPrimaryVariants = cva(zuiSplitButtonPrimary);\nexport const splitButtonTriggerVariants = cva(zuiSplitButtonTrigger, {\n variants: {\n size: zuiSplitButtonTriggerSizes,\n },\n defaultVariants: {\n size: \"md\",\n },\n});\nexport const splitButtonContentVariants = cva(zuiSplitButtonContent);\nexport const splitButtonItemDisabledVariants = cva(zuiSplitButtonItemDisabled);\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { FiChevronDown, FiLoader } from \"react-icons/fi\";\n\nimport {\n Dropdown,\n DropdownContent,\n DropdownItem,\n DropdownTrigger,\n} from \"../dropdown\";\nimport { buttonVariants } from \"../buttons\";\nimport { cn } from \"../../lib/utils\";\n\nimport type {\n SplitButtonAppearance,\n SplitButtonProps,\n SplitButtonVariant,\n} from \"./types\";\nimport {\n splitButtonContentVariants,\n splitButtonDropdownVariants,\n splitButtonGroupVariants,\n splitButtonItemDisabledVariants,\n splitButtonPrimaryVariants,\n splitButtonRootVariants,\n splitButtonTriggerVariants,\n} from \"./variants\";\n\nconst variantAppearanceMap = {\n primary: \"default\",\n secondary: \"secondary\",\n outline: \"outline\",\n ghost: \"ghost\",\n danger: \"destructive\",\n success: \"green\",\n} as const satisfies Record<SplitButtonVariant, SplitButtonAppearance>;\n\nfunction resolveAppearance({\n appearance,\n variant,\n}: {\n appearance?: SplitButtonAppearance;\n variant?: SplitButtonVariant;\n}) {\n return appearance ?? (variant ? variantAppearanceMap[variant] : \"default\");\n}\n\nexport function SplitButtonBase({\n label,\n onClick,\n items,\n disabled = false,\n loading = false,\n appearance,\n variant,\n size = \"md\",\n startIcon,\n fullWidth = false,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n triggerLabel,\n triggerOn = \"click\",\n className,\n ref,\n ...rest\n}: SplitButtonProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const isUnavailable = disabled || loading;\n const resolvedAppearance = resolveAppearance({ appearance, variant });\n const isControlled = controlledOpen !== undefined;\n const open = isUnavailable\n ? false\n : isControlled\n ? controlledOpen\n : uncontrolledOpen;\n\n const setOpen = (nextOpen: boolean) => {\n if (isUnavailable && nextOpen) {\n return;\n }\n if (!isControlled) {\n setUncontrolledOpen(nextOpen);\n }\n onOpenChange?.(nextOpen);\n };\n\n const fullWidthFlag = fullWidth ? \"true\" : undefined;\n const menuLabel = triggerLabel ?? `More ${label} actions`;\n\n // Shared timeout ref for hover mode: delays close so the cursor can\n // travel through the mt-2 gap between the button and the menu panel\n // without dismissing the menu.\n const hoverCloseRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const scheduleClose = () => {\n cancelClose();\n hoverCloseRef.current = setTimeout(() => setOpen(false), 120);\n };\n\n const cancelClose = () => {\n if (hoverCloseRef.current !== null) {\n clearTimeout(hoverCloseRef.current);\n hoverCloseRef.current = null;\n }\n };\n\n useEffect(() => cancelClose, []);\n\n useEffect(() => {\n if (isUnavailable && !isControlled) {\n setUncontrolledOpen(false);\n onOpenChange?.(false);\n }\n }, [isUnavailable, onOpenChange, isControlled]);\n\n const dropdownHoverHandlers =\n triggerOn === \"hover\"\n ? {\n onMouseEnter: () => {\n cancelClose();\n setOpen(true);\n },\n onMouseLeave: scheduleClose,\n }\n : undefined;\n\n const contentHoverHandlers =\n triggerOn === \"hover\"\n ? { onMouseEnter: cancelClose, onMouseLeave: scheduleClose }\n : undefined;\n\n return (\n <div\n ref={ref}\n data-slot=\"split-button\"\n data-full-width={fullWidthFlag}\n className={cn(splitButtonRootVariants({ fullWidth }), className)}\n {...rest}\n >\n <Dropdown\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={setOpen}\n data-full-width={fullWidthFlag}\n className={splitButtonDropdownVariants({ fullWidth })}\n {...dropdownHoverHandlers}\n >\n <div\n data-slot=\"split-button-group\"\n data-full-width={fullWidthFlag}\n className={splitButtonGroupVariants({ fullWidth })}\n >\n <button\n type=\"button\"\n data-slot=\"split-button-primary\"\n data-full-width={fullWidthFlag}\n disabled={isUnavailable}\n onClick={onClick}\n className={cn(\n buttonVariants({ appearance: resolvedAppearance, size }),\n splitButtonPrimaryVariants(),\n )}\n >\n {loading ? (\n <FiLoader\n aria-hidden\n className=\"animate-spin\"\n data-slot=\"split-button-spinner-icon\"\n />\n ) : (\n startIcon\n )}\n <span>{label}</span>\n {loading ? (\n <span className=\"sr-only\" role=\"status\" aria-label=\"Loading\" />\n ) : null}\n </button>\n\n <DropdownTrigger\n aria-label={menuLabel}\n disabled={isUnavailable}\n className={cn(\n buttonVariants({ appearance: resolvedAppearance, size }),\n splitButtonTriggerVariants({ size }),\n )}\n >\n <FiChevronDown aria-hidden />\n </DropdownTrigger>\n </div>\n\n <DropdownContent\n className={splitButtonContentVariants()}\n placement=\"bottom\"\n {...contentHoverHandlers}\n >\n {items.map((item) => (\n <DropdownItem\n key={item.id}\n leftIcon={item.icon}\n aria-disabled={item.disabled ? \"true\" : undefined}\n className={\n item.disabled ? splitButtonItemDisabledVariants() : undefined\n }\n onClick={(event) => {\n if (item.disabled) {\n event.preventDefault();\n event.stopPropagation();\n }\n }}\n onKeyDown={(event) => {\n if (item.disabled) {\n event.preventDefault();\n event.stopPropagation();\n }\n }}\n onSelect={() => {\n setOpen(false);\n item.onSelect?.();\n }}\n >\n {item.label}\n </DropdownItem>\n ))}\n </DropdownContent>\n </Dropdown>\n </div>\n );\n}\n\nSplitButtonBase.displayName = \"SplitButton\";\n","// split-button.tsx — default static entry (no framer-motion)\nimport { SplitButtonBase } from \"./split-button-base\";\nimport type { SplitButtonProps } from \"./types\";\n\nexport const SplitButton = (props: SplitButtonProps) => {\n return <SplitButtonBase {...props} />;\n};\n\nSplitButton.displayName = \"SplitButton\";\n"]}
1
+ {"version":3,"sources":["../../src/ui/split-button/variants.ts","../../src/ui/split-button/split-button-base.tsx","../../src/ui/split-button/split-button.tsx"],"names":["jsx"],"mappings":"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","file":"split-button.mjs","sourcesContent":["import { cva } from \"class-variance-authority\";\n\nimport {\n zuiSplitButtonContent,\n zuiSplitButtonDropdown,\n zuiSplitButtonFullWidth,\n zuiSplitButtonGroup,\n zuiSplitButtonItemDisabled,\n zuiSplitButtonPrimary,\n zuiSplitButtonRoot,\n zuiSplitButtonTrigger,\n zuiSplitButtonTriggerSizes,\n} from \"../../design-system\";\n\nexport const splitButtonRootVariants = cva(zuiSplitButtonRoot, {\n variants: {\n fullWidth: {\n true: zuiSplitButtonFullWidth,\n },\n },\n});\nexport const splitButtonDropdownVariants = cva(zuiSplitButtonDropdown, {\n variants: {\n fullWidth: {\n true: zuiSplitButtonFullWidth,\n },\n },\n});\nexport const splitButtonGroupVariants = cva(zuiSplitButtonGroup, {\n variants: {\n fullWidth: {\n true: zuiSplitButtonFullWidth,\n },\n },\n});\nexport const splitButtonPrimaryVariants = cva(zuiSplitButtonPrimary);\nexport const splitButtonTriggerVariants = cva(zuiSplitButtonTrigger, {\n variants: {\n size: zuiSplitButtonTriggerSizes,\n },\n defaultVariants: {\n size: \"md\",\n },\n});\nexport const splitButtonContentVariants = cva(zuiSplitButtonContent);\nexport const splitButtonItemDisabledVariants = cva(zuiSplitButtonItemDisabled);\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { FiChevronDown, FiLoader } from \"react-icons/fi\";\n\nimport {\n Dropdown,\n DropdownContent,\n DropdownItem,\n DropdownTrigger,\n} from \"../dropdown\";\nimport { buttonVariants } from \"../buttons\";\nimport { cn } from \"../../lib/utils\";\n\nimport type {\n SplitButtonAppearance,\n SplitButtonProps,\n SplitButtonVariant,\n} from \"./types\";\nimport {\n splitButtonContentVariants,\n splitButtonDropdownVariants,\n splitButtonGroupVariants,\n splitButtonItemDisabledVariants,\n splitButtonPrimaryVariants,\n splitButtonRootVariants,\n splitButtonTriggerVariants,\n} from \"./variants\";\n\nconst variantAppearanceMap = {\n primary: \"default\",\n secondary: \"secondary\",\n outline: \"outline\",\n ghost: \"ghost\",\n danger: \"destructive\",\n success: \"green\",\n} as const satisfies Record<SplitButtonVariant, SplitButtonAppearance>;\n\nfunction resolveAppearance({\n appearance,\n variant,\n}: {\n appearance?: SplitButtonAppearance;\n variant?: SplitButtonVariant;\n}) {\n return appearance ?? (variant ? variantAppearanceMap[variant] : \"default\");\n}\n\nexport function SplitButtonBase({\n label,\n onClick,\n items,\n disabled = false,\n loading = false,\n appearance,\n variant,\n size = \"md\",\n startIcon,\n fullWidth = false,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n triggerLabel,\n triggerOn = \"click\",\n className,\n ref,\n ...rest\n}: SplitButtonProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const isUnavailable = disabled || loading;\n const resolvedAppearance = resolveAppearance({ appearance, variant });\n const isControlled = controlledOpen !== undefined;\n const open = isUnavailable\n ? false\n : isControlled\n ? controlledOpen\n : uncontrolledOpen;\n\n const setOpen = (nextOpen: boolean) => {\n if (isUnavailable && nextOpen) {\n return;\n }\n if (!isControlled) {\n setUncontrolledOpen(nextOpen);\n }\n onOpenChange?.(nextOpen);\n };\n\n const fullWidthFlag = fullWidth ? \"true\" : undefined;\n const menuLabel = triggerLabel ?? `More ${label} actions`;\n\n // Shared timeout ref for hover mode: delays close so the cursor can\n // travel through the mt-2 gap between the button and the menu panel\n // without dismissing the menu.\n const hoverCloseRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const scheduleClose = () => {\n cancelClose();\n hoverCloseRef.current = setTimeout(() => setOpen(false), 120);\n };\n\n const cancelClose = () => {\n if (hoverCloseRef.current !== null) {\n clearTimeout(hoverCloseRef.current);\n hoverCloseRef.current = null;\n }\n };\n\n useEffect(() => cancelClose, []);\n\n useEffect(() => {\n if (isUnavailable && !isControlled) {\n setUncontrolledOpen(false);\n onOpenChange?.(false);\n }\n }, [isUnavailable, onOpenChange, isControlled]);\n\n const dropdownHoverHandlers =\n triggerOn === \"hover\"\n ? {\n onMouseEnter: () => {\n cancelClose();\n setOpen(true);\n },\n onMouseLeave: scheduleClose,\n }\n : undefined;\n\n const contentHoverHandlers =\n triggerOn === \"hover\"\n ? { onMouseEnter: cancelClose, onMouseLeave: scheduleClose }\n : undefined;\n\n return (\n <div\n ref={ref}\n data-slot=\"split-button\"\n data-full-width={fullWidthFlag}\n className={cn(splitButtonRootVariants({ fullWidth }), className)}\n {...rest}\n >\n <Dropdown\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={setOpen}\n data-full-width={fullWidthFlag}\n className={splitButtonDropdownVariants({ fullWidth })}\n {...dropdownHoverHandlers}\n >\n <div\n data-slot=\"split-button-group\"\n data-full-width={fullWidthFlag}\n className={splitButtonGroupVariants({ fullWidth })}\n >\n <button\n type=\"button\"\n data-slot=\"split-button-primary\"\n data-full-width={fullWidthFlag}\n disabled={isUnavailable}\n onClick={onClick}\n className={cn(\n buttonVariants({ appearance: resolvedAppearance, size }),\n splitButtonPrimaryVariants(),\n )}\n >\n {loading ? (\n <FiLoader\n aria-hidden\n className=\"animate-spin\"\n data-slot=\"split-button-spinner-icon\"\n />\n ) : (\n startIcon\n )}\n <span>{label}</span>\n {loading ? (\n <span className=\"sr-only\" role=\"status\" aria-label=\"Loading\" />\n ) : null}\n </button>\n\n <DropdownTrigger\n aria-label={menuLabel}\n disabled={isUnavailable}\n className={cn(\n buttonVariants({ appearance: resolvedAppearance, size }),\n splitButtonTriggerVariants({ size }),\n )}\n >\n <FiChevronDown aria-hidden />\n </DropdownTrigger>\n </div>\n\n <DropdownContent\n className={splitButtonContentVariants()}\n placement=\"bottom\"\n {...contentHoverHandlers}\n >\n {items.map((item) => (\n <DropdownItem\n key={item.id}\n leftIcon={item.icon}\n aria-disabled={item.disabled ? \"true\" : undefined}\n className={\n item.disabled ? splitButtonItemDisabledVariants() : undefined\n }\n onClick={(event) => {\n if (item.disabled) {\n event.preventDefault();\n event.stopPropagation();\n }\n }}\n onKeyDown={(event) => {\n if (item.disabled) {\n event.preventDefault();\n event.stopPropagation();\n }\n }}\n onSelect={() => {\n setOpen(false);\n item.onSelect?.();\n }}\n >\n {item.label}\n </DropdownItem>\n ))}\n </DropdownContent>\n </Dropdown>\n </div>\n );\n}\n\nSplitButtonBase.displayName = \"SplitButton\";\n","// split-button.tsx — default static entry (no framer-motion)\nimport { SplitButtonBase } from \"./split-button-base\";\nimport type { SplitButtonProps } from \"./types\";\n\nexport const SplitButton = (props: SplitButtonProps) => {\n return <SplitButtonBase {...props} />;\n};\n\nSplitButton.displayName = \"SplitButton\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zentauri-ui/zentauri-components",
3
- "version": "2.1.8",
3
+ "version": "2.1.9",
4
4
  "description": "React + Tailwind UI kit with charts, ESM/CJS builds, per-entry exports, and a zentauri-components / zentauri-ui CLI to vendor UI or hook source into your app",
5
5
  "keywords": [
6
6
  "react",
@@ -150,5 +150,8 @@
150
150
  "tsup": "^8.5.1",
151
151
  "typescript": "^5",
152
152
  "vitest": "^4.1.4"
153
+ },
154
+ "dependencies": {
155
+ "diff": "^9.0.0"
153
156
  }
154
157
  }
@@ -0,0 +1,37 @@
1
+ export const zuiCodeDiffBase = [
2
+ "relative overflow-auto rounded-lg border border-[color:var(--zui-code-diff-border,var(--zui-border,#0000001a))] dark:border-[color:var(--zui-code-diff-border-dark,var(--zui-border-dark,#ffffff1a))]",
3
+ "bg-[var(--zui-code-diff-bg,var(--zui-surface,oklch(98.4%_0.003_247.858)))] dark:bg-[var(--zui-code-diff-bg-dark,var(--zui-surface-dark,oklch(12.9%_0.042_264.695)))]",
4
+ "text-[color:var(--zui-code-diff-fg,var(--zui-fg,oklch(20.8%_0.042_265.755)))] dark:text-[color:var(--zui-code-diff-fg-dark,var(--zui-fg-dark,oklch(98.4%_0.003_247.858)))]",
5
+ ] as const;
6
+
7
+ export const zuiCodeDiffSizes = {
8
+ sm: "text-xs leading-5",
9
+ md: "text-sm leading-6",
10
+ lg: "text-base leading-7",
11
+ } as const;
12
+
13
+ export const zuiCodeDiffHeaderBase =
14
+ "sticky top-0 z-10 flex items-center justify-between border-b border-[color:var(--zui-code-diff-border,var(--zui-border,#0000001a))] dark:border-[color:var(--zui-code-diff-border-dark,var(--zui-border-dark,#ffffff1a))] bg-[var(--zui-code-diff-header-bg,var(--zui-surface-muted,oklch(92.9%_0.013_255.508)))] dark:bg-[var(--zui-code-diff-header-bg-dark,var(--zui-surface-muted-dark,oklch(27.9%_0.041_260.031)))] px-4 py-2";
15
+
16
+ export const zuiCodeDiffTableBase = "w-full border-collapse table-fixed";
17
+
18
+ export const zuiCodeDiffLineNumberBase =
19
+ "select-none text-right align-top whitespace-nowrap border-r border-[color:var(--zui-code-diff-border,var(--zui-border,#0000001a))] dark:border-[color:var(--zui-code-diff-border-dark,var(--zui-border-dark,#ffffff1a))] px-3 text-[color:var(--zui-code-diff-line-number-fg,var(--zui-fg-muted,oklch(55.2%_0.046_257.417)))] dark:text-[color:var(--zui-code-diff-line-number-fg-dark,var(--zui-fg-muted-dark,oklch(70.8%_0.015_256.243)))]";
20
+
21
+ export const zuiCodeDiffLineContentBase =
22
+ "whitespace-pre-wrap break-all px-4 align-top";
23
+
24
+ export const zuiCodeDiffLineAdded =
25
+ "bg-[var(--zui-code-diff-added-bg,oklch(92.8%_0.109_150.96))] dark:bg-[var(--zui-code-diff-added-bg-dark,oklch(26.8%_0.077_146.44))] text-[color:var(--zui-code-diff-added-fg,oklch(29.1%_0.065_148.99))] dark:text-[color:var(--zui-code-diff-added-fg-dark,oklch(74%_0.131_149.02))]";
26
+
27
+ export const zuiCodeDiffLineRemoved =
28
+ "bg-[var(--zui-code-diff-removed-bg,oklch(93.1%_0.08_22.4))] dark:bg-[var(--zui-code-diff-removed-bg-dark,oklch(26.9%_0.07_22.54))] text-[color:var(--zui-code-diff-removed-fg,oklch(30.7%_0.06_28.07))] dark:text-[color:var(--zui-code-diff-removed-fg-dark,oklch(74.2%_0.127_24.75))]";
29
+
30
+ export const zuiCodeDiffLineUnchanged = "";
31
+
32
+ export const zuiCodeDiffGutterMarker =
33
+ "inline-block w-4 text-center select-none";
34
+
35
+ export const zuiCodeDiffAppearances = {
36
+ default: "",
37
+ } as const;
@@ -7,6 +7,7 @@ export * from "./badge";
7
7
  export * from "./breadcrumb";
8
8
  export * from "./button";
9
9
  export * from "./card";
10
+ export * from "./code-diff";
10
11
  export * from "./checkbox";
11
12
  export * from "./combobox";
12
13
  export * from "./command";
@@ -0,0 +1,284 @@
1
+ "use client";
2
+
3
+ import { diffLines } from "diff";
4
+ import { useMemo } from "react";
5
+
6
+ import { cn } from "../../lib/utils";
7
+
8
+ import type { CodeDiffBaseProps, DiffLine } from "./types";
9
+ import {
10
+ codeDiffLineContentVariants,
11
+ codeDiffLineNumberVariants,
12
+ codeDiffVariants,
13
+ } from "./variants";
14
+
15
+ function computeDiff(oldCode: string, newCode: string): DiffLine[] {
16
+ const changes = diffLines(oldCode, newCode);
17
+ const lines: DiffLine[] = [];
18
+ let oldLineNum = 1;
19
+ let newLineNum = 1;
20
+
21
+ for (const change of changes) {
22
+ const changeLines = change.value.replace(/\n$/, "").split("\n");
23
+ for (const content of changeLines) {
24
+ if (change.added) {
25
+ lines.push({
26
+ type: "added",
27
+ content,
28
+ oldLineNumber: null,
29
+ newLineNumber: newLineNum++,
30
+ });
31
+ } else if (change.removed) {
32
+ lines.push({
33
+ type: "removed",
34
+ content,
35
+ oldLineNumber: oldLineNum++,
36
+ newLineNumber: null,
37
+ });
38
+ } else {
39
+ lines.push({
40
+ type: "unchanged",
41
+ content,
42
+ oldLineNumber: oldLineNum++,
43
+ newLineNumber: newLineNum++,
44
+ });
45
+ }
46
+ }
47
+ }
48
+ return lines;
49
+ }
50
+
51
+ interface SplitRow {
52
+ oldLine: DiffLine | null;
53
+ newLine: DiffLine | null;
54
+ }
55
+
56
+ function toSplitRows(lines: DiffLine[]): SplitRow[] {
57
+ const rows: SplitRow[] = [];
58
+ let i = 0;
59
+
60
+ while (i < lines.length) {
61
+ const current = lines[i]!;
62
+
63
+ if (current.type === "unchanged") {
64
+ rows.push({ oldLine: current, newLine: current });
65
+ i++;
66
+ } else if (current.type === "removed") {
67
+ const removedBlock: DiffLine[] = [];
68
+ while (i < lines.length && lines[i]!.type === "removed") {
69
+ removedBlock.push(lines[i]!);
70
+ i++;
71
+ }
72
+ const addedBlock: DiffLine[] = [];
73
+ while (i < lines.length && lines[i]!.type === "added") {
74
+ addedBlock.push(lines[i]!);
75
+ i++;
76
+ }
77
+ const maxLen = Math.max(removedBlock.length, addedBlock.length);
78
+ for (let j = 0; j < maxLen; j++) {
79
+ rows.push({
80
+ oldLine: j < removedBlock.length ? removedBlock[j]! : null,
81
+ newLine: j < addedBlock.length ? addedBlock[j]! : null,
82
+ });
83
+ }
84
+ } else if (current.type === "added") {
85
+ const addedBlock: DiffLine[] = [];
86
+ while (i < lines.length && lines[i]!.type === "added") {
87
+ addedBlock.push(lines[i]!);
88
+ i++;
89
+ }
90
+ for (const added of addedBlock) {
91
+ rows.push({ oldLine: null, newLine: added });
92
+ }
93
+ } else {
94
+ i++;
95
+ }
96
+ }
97
+ return rows;
98
+ }
99
+
100
+ function LineNumberCell({
101
+ lineNumber,
102
+ type,
103
+ showLineNumbers,
104
+ }: {
105
+ lineNumber: number | null;
106
+ type: DiffLine["type"];
107
+ showLineNumbers: boolean;
108
+ }) {
109
+ return (
110
+ <td
111
+ className={codeDiffLineNumberVariants({ type })}
112
+ style={{ width: showLineNumbers ? "4.5rem" : "2rem" }}
113
+ >
114
+ {showLineNumbers && lineNumber !== null ? lineNumber : ""}
115
+ </td>
116
+ );
117
+ }
118
+
119
+ function LineContentCell({
120
+ line,
121
+ type,
122
+ showGutterMarkers,
123
+ }: {
124
+ line: string;
125
+ type: DiffLine["type"];
126
+ showGutterMarkers: boolean;
127
+ }) {
128
+ return (
129
+ <td className={codeDiffLineContentVariants({ type })}>
130
+ {showGutterMarkers ? (
131
+ <span className="inline-block w-4 select-none text-center">
132
+ {type === "added" ? "+" : type === "removed" ? "-" : " "}
133
+ </span>
134
+ ) : null}
135
+ <span>{line || " "}</span>
136
+ </td>
137
+ );
138
+ }
139
+
140
+ function UnifiedView({
141
+ lines,
142
+ showLineNumbers,
143
+ showGutterMarkers,
144
+ }: {
145
+ lines: DiffLine[];
146
+ showLineNumbers: boolean;
147
+ showGutterMarkers: boolean;
148
+ }) {
149
+ return (
150
+ <table className="w-full border-collapse table-fixed">
151
+ <tbody>
152
+ {lines.map((line, idx) => (
153
+ <tr key={idx}>
154
+ <LineNumberCell
155
+ lineNumber={line.oldLineNumber}
156
+ type={line.type}
157
+ showLineNumbers={showLineNumbers}
158
+ />
159
+ <LineNumberCell
160
+ lineNumber={line.newLineNumber}
161
+ type={line.type}
162
+ showLineNumbers={showLineNumbers}
163
+ />
164
+ <LineContentCell
165
+ line={line.content}
166
+ type={line.type}
167
+ showGutterMarkers={showGutterMarkers}
168
+ />
169
+ </tr>
170
+ ))}
171
+ </tbody>
172
+ </table>
173
+ );
174
+ }
175
+
176
+ function SplitView({
177
+ lines,
178
+ showLineNumbers,
179
+ showGutterMarkers,
180
+ }: {
181
+ lines: DiffLine[];
182
+ showLineNumbers: boolean;
183
+ showGutterMarkers: boolean;
184
+ }) {
185
+ const rows = toSplitRows(lines);
186
+
187
+ return (
188
+ <table className="w-full border-collapse table-fixed">
189
+ <colgroup>
190
+ <col style={{ width: showLineNumbers ? "4.5rem" : "2rem" }} />
191
+ <col />
192
+ <col style={{ width: showLineNumbers ? "4.5rem" : "2rem" }} />
193
+ <col />
194
+ </colgroup>
195
+ <tbody>
196
+ {rows.map((row, idx) => (
197
+ <tr key={idx}>
198
+ <LineNumberCell
199
+ lineNumber={row.oldLine?.oldLineNumber ?? null}
200
+ type={row.oldLine?.type ?? "unchanged"}
201
+ showLineNumbers={showLineNumbers}
202
+ />
203
+ <LineContentCell
204
+ line={row.oldLine?.content ?? ""}
205
+ type={row.oldLine?.type ?? "unchanged"}
206
+ showGutterMarkers={showGutterMarkers}
207
+ />
208
+ <LineNumberCell
209
+ lineNumber={row.newLine?.newLineNumber ?? null}
210
+ type={row.newLine?.type ?? "unchanged"}
211
+ showLineNumbers={showLineNumbers}
212
+ />
213
+ <LineContentCell
214
+ line={row.newLine?.content ?? ""}
215
+ type={row.newLine?.type ?? "unchanged"}
216
+ showGutterMarkers={showGutterMarkers}
217
+ />
218
+ </tr>
219
+ ))}
220
+ </tbody>
221
+ </table>
222
+ );
223
+ }
224
+
225
+ export function CodeDiffBase({
226
+ className,
227
+ appearance,
228
+ size,
229
+ oldCode,
230
+ newCode,
231
+ viewType = "unified",
232
+ showLineNumbers = true,
233
+ showGutterMarkers = true,
234
+ oldTitle = "Old",
235
+ newTitle = "New",
236
+ ref,
237
+ as: Wrapper = "div",
238
+ ...rest
239
+ }: CodeDiffBaseProps) {
240
+ const lines = useMemo(
241
+ () => computeDiff(oldCode ?? "", newCode ?? ""),
242
+ [oldCode, newCode],
243
+ );
244
+ const hasChanges = lines.some(
245
+ (l) => l.type === "added" || l.type === "removed",
246
+ );
247
+
248
+ return (
249
+ <Wrapper
250
+ ref={ref}
251
+ data-slot="code-diff"
252
+ className={cn(codeDiffVariants({ appearance, size }), className)}
253
+ {...rest}
254
+ >
255
+ {hasChanges ? (
256
+ <div className="sticky top-0 flex items-center justify-between border-b border-[color:var(--zui-code-diff-border,var(--zui-border,#0000001a))] dark:border-[color:var(--zui-code-diff-border-dark,var(--zui-border-dark,#ffffff1a))] bg-[var(--zui-code-diff-header-bg,var(--zui-surface-muted,oklch(92.9%_0.013_255.508)))] dark:bg-[var(--zui-code-diff-header-bg-dark,var(--zui-surface-muted-dark,oklch(27.9%_0.041_260.031)))] px-4 py-2">
257
+ <span className="text-xs font-medium">
258
+ {lines.filter((l) => l.type === "added").length} additions{" "}
259
+ <span className="mx-1">&bull;</span>{" "}
260
+ {lines.filter((l) => l.type === "removed").length} deletions
261
+ </span>
262
+ <span className="text-xs text-[color:var(--zui-code-diff-header-fg,var(--zui-fg-muted,oklch(55.2%_0.046_257.417)))] dark:text-[color:var(--zui-code-diff-header-fg-dark,var(--zui-fg-muted-dark,oklch(70.8%_0.015_256.243)))]">
263
+ {oldTitle} &rarr; {newTitle}
264
+ </span>
265
+ </div>
266
+ ) : null}
267
+ {viewType === "split" ? (
268
+ <SplitView
269
+ lines={lines}
270
+ showLineNumbers={showLineNumbers}
271
+ showGutterMarkers={showGutterMarkers}
272
+ />
273
+ ) : (
274
+ <UnifiedView
275
+ lines={lines}
276
+ showLineNumbers={showLineNumbers}
277
+ showGutterMarkers={showGutterMarkers}
278
+ />
279
+ )}
280
+ </Wrapper>
281
+ );
282
+ }
283
+
284
+ CodeDiffBase.displayName = "CodeDiff";
@@ -0,0 +1,50 @@
1
+ import { createRef } from "react";
2
+ import { render, screen } from "@testing-library/react";
3
+ import { describe, expect, it } from "vitest";
4
+
5
+ import { CodeDiff } from "./code-diff";
6
+
7
+ const oldCode = "line one\nline two\nline three";
8
+ const newCode = "line one\nline two modified\nline three\nline four";
9
+
10
+ describe("CodeDiff", () => {
11
+ it("should expose displayName", () => {
12
+ expect(CodeDiff.displayName).toBe("CodeDiff");
13
+ });
14
+
15
+ it("should stamp data-slot", () => {
16
+ render(<CodeDiff oldCode={oldCode} newCode={newCode} />);
17
+ const root = document.querySelector('[data-slot="code-diff"]');
18
+ expect(root).toBeTruthy();
19
+ expect(root?.getAttribute("data-slot")).toBe("code-diff");
20
+ });
21
+
22
+ it("should render diff lines", () => {
23
+ render(<CodeDiff oldCode={oldCode} newCode={newCode} />);
24
+ expect(screen.getByText("line one")).toBeInTheDocument();
25
+ expect(screen.getByText("line two modified")).toBeInTheDocument();
26
+ expect(screen.getByText("line four")).toBeInTheDocument();
27
+ });
28
+
29
+ it("should show additions and deletions count", () => {
30
+ render(<CodeDiff oldCode={oldCode} newCode={newCode} />);
31
+ expect(screen.getByText(/additions/)).toBeInTheDocument();
32
+ expect(screen.getByText(/deletions/)).toBeInTheDocument();
33
+ });
34
+
35
+ it("should render unchanged code when no changes", () => {
36
+ render(<CodeDiff oldCode="same" newCode="same" />);
37
+ expect(screen.getByText("same")).toBeInTheDocument();
38
+ });
39
+
40
+ it("should forward ref", () => {
41
+ const ref = createRef<HTMLDivElement>();
42
+ render(<CodeDiff ref={ref} oldCode={oldCode} newCode={newCode} />);
43
+ expect(ref.current?.getAttribute("data-slot")).toBe("code-diff");
44
+ });
45
+
46
+ it("should render in split view", () => {
47
+ render(<CodeDiff oldCode={oldCode} newCode={newCode} viewType="split" />);
48
+ expect(screen.getAllByText("line one").length).toBeGreaterThanOrEqual(1);
49
+ });
50
+ });
@@ -0,0 +1,8 @@
1
+ import { CodeDiffBase } from "./code-diff-base";
2
+ import type { CodeDiffProps } from "./types";
3
+
4
+ export function CodeDiff(props: CodeDiffProps) {
5
+ return <CodeDiffBase {...props} />;
6
+ }
7
+
8
+ CodeDiff.displayName = "CodeDiff";
@@ -0,0 +1,15 @@
1
+ "use client";
2
+
3
+ export { CodeDiff } from "./code-diff";
4
+ export type {
5
+ CodeDiffBaseProps,
6
+ CodeDiffProps,
7
+ CodeDiffVariantProps,
8
+ CodeDiffViewType,
9
+ DiffLine,
10
+ } from "./types";
11
+ export {
12
+ codeDiffLineContentVariants,
13
+ codeDiffLineNumberVariants,
14
+ codeDiffVariants,
15
+ } from "./variants";
@@ -0,0 +1,31 @@
1
+ import type { VariantProps } from "class-variance-authority";
2
+ import type { ComponentPropsWithRef, ElementType } from "react";
3
+
4
+ import type { codeDiffVariants } from "./variants";
5
+
6
+ export type CodeDiffVariantProps = VariantProps<typeof codeDiffVariants>;
7
+
8
+ export type CodeDiffViewType = "split" | "unified";
9
+
10
+ export interface CodeDiffBaseProps extends ComponentPropsWithRef<"div"> {
11
+ oldCode: string;
12
+ newCode: string;
13
+ language?: string;
14
+ viewType?: CodeDiffViewType;
15
+ showLineNumbers?: boolean;
16
+ showGutterMarkers?: boolean;
17
+ oldTitle?: string;
18
+ newTitle?: string;
19
+ appearance?: CodeDiffVariantProps["appearance"];
20
+ size?: CodeDiffVariantProps["size"];
21
+ as?: ElementType;
22
+ }
23
+
24
+ export type CodeDiffProps = Omit<CodeDiffBaseProps, "as">;
25
+
26
+ export interface DiffLine {
27
+ type: "added" | "removed" | "unchanged";
28
+ content: string;
29
+ oldLineNumber: number | null;
30
+ newLineNumber: number | null;
31
+ }
@@ -0,0 +1,49 @@
1
+ import { cva } from "class-variance-authority";
2
+
3
+ import {
4
+ zuiCodeDiffAppearances,
5
+ zuiCodeDiffBase,
6
+ zuiCodeDiffLineAdded,
7
+ zuiCodeDiffLineContentBase,
8
+ zuiCodeDiffLineNumberBase,
9
+ zuiCodeDiffLineRemoved,
10
+ zuiCodeDiffLineUnchanged,
11
+ zuiCodeDiffSizes,
12
+ } from "../../design-system/code-diff";
13
+
14
+ export const codeDiffVariants = cva(zuiCodeDiffBase, {
15
+ variants: {
16
+ appearance: zuiCodeDiffAppearances,
17
+ size: zuiCodeDiffSizes,
18
+ },
19
+ defaultVariants: {
20
+ appearance: "default",
21
+ size: "md",
22
+ },
23
+ });
24
+
25
+ export const codeDiffLineNumberVariants = cva(zuiCodeDiffLineNumberBase, {
26
+ variants: {
27
+ type: {
28
+ added: zuiCodeDiffLineAdded,
29
+ removed: zuiCodeDiffLineRemoved,
30
+ unchanged: zuiCodeDiffLineUnchanged,
31
+ },
32
+ },
33
+ defaultVariants: {
34
+ type: "unchanged",
35
+ },
36
+ });
37
+
38
+ export const codeDiffLineContentVariants = cva(zuiCodeDiffLineContentBase, {
39
+ variants: {
40
+ type: {
41
+ added: zuiCodeDiffLineAdded,
42
+ removed: zuiCodeDiffLineRemoved,
43
+ unchanged: zuiCodeDiffLineUnchanged,
44
+ },
45
+ },
46
+ defaultVariants: {
47
+ type: "unchanged",
48
+ },
49
+ });
@@ -1,19 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkDPNTQ4AK_js = require('./chunk-DPNTQ4AK.js');
4
- var classVarianceAuthority = require('class-variance-authority');
5
-
6
- var buttonVariants = classVarianceAuthority.cva(chunkDPNTQ4AK_js.zuiButtonBase, {
7
- variants: {
8
- appearance: chunkDPNTQ4AK_js.zuiButtonAppearances,
9
- size: chunkDPNTQ4AK_js.zuiButtonSizes
10
- },
11
- defaultVariants: {
12
- appearance: "default",
13
- size: "md"
14
- }
15
- });
16
-
17
- exports.buttonVariants = buttonVariants;
18
- //# sourceMappingURL=chunk-6OVDBAMI.js.map
19
- //# sourceMappingURL=chunk-6OVDBAMI.js.map