@keboola/design 9.1.0 → 10.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/AGENTS.md +117 -40
  2. package/COMPONENT-API.md +31 -9
  3. package/README.md +3 -3
  4. package/dist/MermaidDiagram-EOKJHQQV.js +10 -0
  5. package/dist/MermaidDiagram-EOKJHQQV.js.map +1 -0
  6. package/dist/charts.d.ts +31 -2
  7. package/dist/charts.js +6 -9
  8. package/dist/charts.js.map +1 -1
  9. package/dist/chunk-63NSN2VL.js +274 -0
  10. package/dist/chunk-63NSN2VL.js.map +1 -0
  11. package/dist/{rjsf.cjs → chunk-6FPEI4EM.js} +1491 -5701
  12. package/dist/chunk-6FPEI4EM.js.map +1 -0
  13. package/dist/chunk-7PUUHEJQ.js +1313 -0
  14. package/dist/chunk-7PUUHEJQ.js.map +1 -0
  15. package/dist/chunk-BOHNXTMM.js +606 -0
  16. package/dist/chunk-BOHNXTMM.js.map +1 -0
  17. package/dist/{testing.cjs → chunk-C3L3TBBT.js} +33 -164
  18. package/dist/chunk-C3L3TBBT.js.map +1 -0
  19. package/dist/chunk-CTCFYWJC.js +407 -0
  20. package/dist/chunk-CTCFYWJC.js.map +1 -0
  21. package/dist/chunk-ESBL3IPF.js +23 -0
  22. package/dist/chunk-ESBL3IPF.js.map +1 -0
  23. package/dist/chunk-IJTHFNNJ.js +261 -0
  24. package/dist/chunk-IJTHFNNJ.js.map +1 -0
  25. package/dist/chunk-JP7PNHLH.js +40 -0
  26. package/dist/chunk-JP7PNHLH.js.map +1 -0
  27. package/dist/chunk-KPNAW5MU.js +229 -0
  28. package/dist/chunk-KPNAW5MU.js.map +1 -0
  29. package/dist/chunk-L37JJ6MR.js +152 -0
  30. package/dist/chunk-L37JJ6MR.js.map +1 -0
  31. package/dist/chunk-Q7NWXLCT.js +90 -0
  32. package/dist/chunk-Q7NWXLCT.js.map +1 -0
  33. package/dist/chunk-SYIEF644.js +1016 -0
  34. package/dist/chunk-SYIEF644.js.map +1 -0
  35. package/dist/chunk-VMFSRV5H.js +16 -0
  36. package/dist/chunk-VMFSRV5H.js.map +1 -0
  37. package/dist/chunk-VPPM7UUQ.js +47 -0
  38. package/dist/chunk-VPPM7UUQ.js.map +1 -0
  39. package/dist/chunk-XV3UUOYF.js +845 -0
  40. package/dist/chunk-XV3UUOYF.js.map +1 -0
  41. package/dist/editors.d.ts +27 -3
  42. package/dist/editors.js +85 -2081
  43. package/dist/editors.js.map +1 -1
  44. package/dist/icons.d.ts +29 -8
  45. package/dist/icons.js +2 -361
  46. package/dist/icons.js.map +1 -1
  47. package/dist/index.d.ts +709 -425
  48. package/dist/index.js +5042 -13885
  49. package/dist/index.js.map +1 -1
  50. package/dist/markdown-editor.js +41 -3426
  51. package/dist/markdown-editor.js.map +1 -1
  52. package/dist/mermaid.js +8 -1129
  53. package/dist/mermaid.js.map +1 -1
  54. package/dist/rjsf.js +180 -9381
  55. package/dist/rjsf.js.map +1 -1
  56. package/dist/styles.css +1 -1
  57. package/dist/testing.js +5 -357
  58. package/dist/testing.js.map +1 -1
  59. package/package.json +28 -73
  60. package/src/styles.css +60 -3
  61. package/src/theme.css +1 -0
  62. package/dist/charts.cjs +0 -268
  63. package/dist/charts.cjs.map +0 -1
  64. package/dist/charts.d.cts +0 -181
  65. package/dist/constants-D3gaMY-W.d.cts +0 -39
  66. package/dist/editors.cjs +0 -2440
  67. package/dist/editors.cjs.map +0 -1
  68. package/dist/editors.d.cts +0 -165
  69. package/dist/icons.cjs +0 -23888
  70. package/dist/icons.cjs.map +0 -1
  71. package/dist/icons.d.cts +0 -20
  72. package/dist/index.cjs +0 -24894
  73. package/dist/index.cjs.map +0 -1
  74. package/dist/index.d.cts +0 -10438
  75. package/dist/markdown-editor.cjs +0 -4636
  76. package/dist/markdown-editor.cjs.map +0 -1
  77. package/dist/markdown-editor.d.cts +0 -75
  78. package/dist/mermaid.cjs +0 -1138
  79. package/dist/mermaid.cjs.map +0 -1
  80. package/dist/mermaid.d.cts +0 -15
  81. package/dist/rjsf.cjs.map +0 -1
  82. package/dist/rjsf.d.cts +0 -55
  83. package/dist/testing.cjs.map +0 -1
  84. package/dist/testing.d.cts +0 -25
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/mergeRefs.ts","../src/utils/createChangeInputEvent.ts","../src/utils/createPrefixedString.ts","../src/components/ScrollArea/ScrollBar.tsx","../src/components/ScrollArea/ScrollArea.tsx","../src/components/Label/Label.tsx","../src/components/InputGroup/InputGroupAddon.tsx","../src/components/InputGroup/InputGroupButton.tsx","../src/components/InputGroup/InputGroupInput.tsx","../src/components/InputGroup/InputGroupText.tsx","../src/components/InputGroup/InputGroupTextArea.tsx","../src/components/InputGroup/InputGroup.tsx","../src/hooks/useControllableState.ts","../src/blocks/TextInput/utils.ts","../src/blocks/TextInput/TextInput.tsx","../src/blocks/Textarea/Textarea.tsx","../src/blocks/ColorInput/utils.ts","../src/blocks/ColorInput/ColorPicker.tsx","../src/blocks/ColorInput/ColorInput.tsx","../src/blocks/NumberInput/NumberInput.tsx","../src/blocks/FormGroup/context.ts","../src/blocks/FormGroup/FormGroupColorInput.tsx","../src/blocks/FormGroup/FormGroupError.tsx","../src/blocks/FormGroup/FormGroupHelp.tsx","../src/blocks/FormGroup/FormGroupNumberInput.tsx","../src/blocks/FormGroup/FormGroupTextarea.tsx","../src/blocks/FormGroup/FormGroupTextInput.tsx","../src/blocks/FormGroup/FormGroup.tsx"],"names":["ScrollAreaPrimitive","jsx","cva","useRef","jsxs"],"mappings":"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","file":"chunk-SYIEF644.js","sourcesContent":["import type { MutableRefObject, RefCallback } from 'react';\n\ntype PossibleRef<T> = MutableRefObject<T> | RefCallback<T> | null;\n\n/**\n * Set a given ref to a given value\n * This utility takes care of different types of refs: callback refs and RefObject(s)\n */\nfunction setRef<T>(ref: PossibleRef<T>, value: T) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref != null) {\n ref.current = value;\n }\n}\n\n/**\n * A utility to compose multiple refs together\n * Accepts callback refs and RefObject(s)\n */\nexport const mergeRefs = <T>(...refs: PossibleRef<T>[]) => {\n return (node: T) => refs.forEach((ref) => setRef(ref, node));\n};\n","import type { ChangeEvent } from 'react';\n\nexport const createChangeInputEvent = (input: HTMLInputElement) => {\n const changeEvent: ChangeEvent<HTMLInputElement> = {\n target: input,\n currentTarget: input,\n type: 'change',\n nativeEvent: new Event('change', { bubbles: true }),\n bubbles: true,\n cancelable: false,\n defaultPrevented: false,\n eventPhase: 2, // AT_TARGET\n isTrusted: false, // Synthetic events are not trusted\n preventDefault: () => {}, // Provide dummy functions if not needed\n isDefaultPrevented: () => false,\n stopPropagation: () => {},\n isPropagationStopped: () => false,\n persist: () => {},\n timeStamp: Date.now(),\n };\n\n Object.defineProperty(changeEvent, 'target', {\n value: input,\n writable: false,\n });\n\n return changeEvent;\n};\n","export const createPrefixedString = (prefix: string) => (literals: TemplateStringsArray) =>\n literals.reduce((acc, literal) => acc + literal, `${prefix}-`);\n","import type { ComponentProps } from 'react';\nimport * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>;\n\nexport const ScrollBar = ({ className, orientation = 'vertical', ...props }: Props) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n orientation={orientation}\n className={cn(\n 'tw:flex tw:touch-none tw:select-none tw:transition-color',\n {\n 'tw:h-full tw:w-2.5 tw:p-px': orientation === 'vertical',\n 'tw:h-2.5 tw:flex-col tw:p-px': orientation === 'horizontal',\n },\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n className={cn(\n 'tw:relative',\n 'tw:flex-1',\n 'tw:rounded-full',\n 'tw:bg-border',\n 'tw:hover:bg-muted-foreground',\n )}\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n);\n","import type { ComponentProps } from 'react';\nimport * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';\n\nimport { cn } from '../../utils';\n\nimport { ScrollBar } from './ScrollBar';\n\ntype Props = ComponentProps<typeof ScrollAreaPrimitive.Root> & {\n viewPortClassName?: string;\n scrollBarClassName?: string;\n orientation?: ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>['orientation'];\n};\n\nexport const ScrollArea = ({\n ref,\n className,\n children,\n viewPortClassName,\n orientation,\n scrollBarClassName,\n ...props\n}: Props) => (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\n 'tw:peer/scroll-area tw:relative tw:overflow-hidden tw:focus-visible:outline-hidden',\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n ref={ref}\n className={cn(\n 'tw:h-full tw:w-full tw:rounded-[inherit] tw:focus-visible:outline-hidden',\n viewPortClassName,\n )}\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n {orientation ? (\n <ScrollBar className={scrollBarClassName} orientation={orientation} />\n ) : (\n <>\n <ScrollBar className={scrollBarClassName} orientation=\"vertical\" />\n <ScrollBar className={scrollBarClassName} orientation=\"horizontal\" />\n </>\n )}\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n);\n","import type { ComponentPropsWithRef } from 'react';\nimport type { LabelProps } from '@radix-ui/react-label';\nimport * as RLabel from '@radix-ui/react-label';\n\nimport { cn } from '../../utils';\n\ntype Props = { id?: string | number; htmlFor?: string | number } & Omit<\n LabelProps,\n 'id' | 'htmlFor'\n>;\n\n/**\n * Decorative optional marker (`(optional)`). Like `Label.Required` it is `aria-hidden`, so it is\n * purely visual — optionality is conveyed by the *absence* of `aria-required`/`required` on the\n * associated control, not by this text.\n */\nconst Optional = ({ className, ...props }: ComponentPropsWithRef<'span'>) => (\n <span {...props} aria-hidden className={cn('tw:ml-0.5', 'tw:text-muted-foreground', className)}>\n (optional)\n </span>\n);\n\n/**\n * Decorative required marker (the `*`). It is `aria-hidden`, so it is purely visual and is **not**\n * announced by assistive tech — conveying the requirement is the caller's responsibility: set\n * `aria-required` (or `required`) on the associated control.\n */\nconst Required = ({ className, ...props }: ComponentPropsWithRef<'span'>) => (\n <span {...props} aria-hidden className={cn('tw:ml-0.5', 'tw:text-primary', className)}>\n *\n </span>\n);\n\nexport const Label = ({ className, children, id, htmlFor, ...rest }: Props) => (\n <RLabel.Root\n {...rest}\n id={id?.toString()}\n htmlFor={htmlFor?.toString()}\n className={cn(\n 'tw:m-0 tw:text-foreground tw:font-normal tw:peer-disabled:opacity-50',\n className,\n )}\n >\n {children}\n </RLabel.Root>\n);\n\nLabel.Optional = Optional;\nLabel.Required = Required;\n","import type { ComponentProps } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '../../utils';\n\n// Padding only fires when the addon actually has content — keeps an empty\n// `<Addon>{maybeNull}</Addon>` from carving 16px out of the input row.\nconst addonVariants = cva(\n [\n 'tw:flex',\n 'tw:items-center',\n 'tw:gap-1',\n\n // Default size for nested Lucide icons in prefix/suffix slots; callers can override on the icon.\n \"tw:[&_svg.lucide:not([class*='tw:size-'])]:size-4\",\n 'tw:[&_svg]:shrink-0',\n ],\n {\n defaultVariants: {\n align: 'inline-start',\n },\n variants: {\n align: {\n 'inline-start': ['tw:order-first', 'tw:[&:not(:empty)]:pl-4'],\n 'inline-end': ['tw:order-last', 'tw:[&:not(:empty)]:pr-4'],\n 'block-start': [\n 'tw:order-first',\n // `tw:w-full` needs to be empty-conditional too — when the addon\n // has no content the root stays in flex-row, and a 100%-wide\n // empty addon would claim half of the input row beside the input.\n 'tw:[&:not(:empty)]:w-full',\n 'tw:[&:not(:empty)]:px-4',\n 'tw:[&:not(:empty)]:py-1.5',\n ],\n 'block-end': [\n 'tw:order-last',\n 'tw:[&:not(:empty)]:w-full',\n 'tw:[&:not(:empty)]:px-4',\n 'tw:[&:not(:empty)]:py-1.5',\n ],\n },\n },\n },\n);\n\ntype Props = ComponentProps<'div'> & VariantProps<typeof addonVariants>;\n\nexport const InputGroupAddon = ({\n children,\n align = 'inline-start',\n className,\n ...props\n}: Props) => (\n <div {...props} data-align={align} className={cn(addonVariants({ align, className }))}>\n {children}\n </div>\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\nimport { Button } from '../Button';\n\ntype ButtonProps = ComponentProps<typeof Button>;\n\ntype Props = Omit<ButtonProps, 'size' | 'block' | 'variant'>;\n\nexport const InputGroupButton = ({ ref, className, tabIndex = -1, ...props }: Props) => (\n <Button\n {...props}\n tabIndex={tabIndex}\n ref={ref}\n variant=\"invisible\"\n size=\"icon-sm\"\n className={cn('tw:size-5', 'tw:[&_svg]:text-muted-foreground', className)}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'input'>;\n\nexport const InputGroupInput = ({ ref, className, ...inputProps }: Props) => (\n <input\n {...inputProps}\n ref={ref}\n className={cn(\n 'tw:w-full',\n 'tw:bg-transparent',\n 'tw:outline-hidden',\n\n // font\n 'tw:font-sans',\n 'tw:text-sm',\n\n // placeholder\n 'tw:placeholder:text-neutral-400',\n 'tw:placeholder:font-normal',\n\n // disabled\n 'tw:disabled:cursor-not-allowed',\n\n className,\n )}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'span'>;\n\nexport const InputGroupText = ({ className, ...props }: Props) => (\n <span\n className={cn(\n 'tw:flex',\n 'tw:items-center',\n 'tw:gap-2',\n 'tw:text-sm',\n 'tw:text-muted-foreground',\n 'tw:[&_svg]:pointer-events-none',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4',\n className,\n )}\n {...props}\n />\n);\n","import type { ChangeEventHandler, ComponentProps, FocusEventHandler } from 'react';\nimport TextareaAutosize from 'react-textarea-autosize';\n\nimport { cn } from '../../utils';\n\ntype TextareaNativeProps = Omit<\n ComponentProps<typeof TextareaAutosize>,\n 'value' | 'defaultValue' | 'rows' | 'maxRows'\n>;\n\ntype Props = TextareaNativeProps & {\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string) => void;\n onValueBlur?: (value: string) => void;\n maxRows?: number | 'unlimited';\n disableResize?: boolean;\n};\n\nexport const InputGroupTextArea = ({\n ref,\n className,\n onChange,\n onValueChange,\n value,\n defaultValue,\n onBlur,\n onValueBlur,\n disableResize = false,\n minRows = 1,\n maxRows = 4,\n ...props\n}: Props) => {\n const handleChange: ChangeEventHandler<HTMLTextAreaElement> = (event) => {\n onValueChange?.(event.target.value);\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLTextAreaElement> = (event) => {\n onValueBlur?.(event.target.value);\n onBlur?.(event);\n };\n\n return (\n <TextareaAutosize\n {...props}\n ref={ref}\n value={value ?? undefined}\n defaultValue={defaultValue ?? undefined}\n onChange={handleChange}\n onBlur={handleBlur}\n minRows={minRows}\n maxRows={maxRows === 'unlimited' ? undefined : maxRows}\n className={cn(\n 'tw:w-full',\n 'tw:bg-transparent',\n 'tw:outline-hidden',\n 'tw:px-4',\n\n // font\n 'tw:font-sans',\n 'tw:text-sm',\n\n // placeholder\n 'tw:placeholder:text-neutral-400',\n 'tw:placeholder:font-normal',\n\n // disabled\n 'tw:disabled:cursor-not-allowed',\n {\n 'tw:resize-none': disableResize,\n },\n\n className,\n )}\n />\n );\n};\n","import type { ComponentPropsWithRef } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '../../utils';\nimport { useArgoDesign } from '../ThemeProvider/context';\n\nimport { InputGroupAddon } from './InputGroupAddon';\nimport { InputGroupButton } from './InputGroupButton';\nimport { InputGroupInput } from './InputGroupInput';\nimport { InputGroupText } from './InputGroupText';\nimport { InputGroupTextArea } from './InputGroupTextArea';\n\nconst inputGroupVariants = cva(\n [\n 'tailwindcss-preflight',\n 'tw:group',\n\n 'tw:overflow-hidden',\n 'tw:box-border',\n\n // positioning\n 'tw:flex',\n 'tw:items-center',\n\n // base — legacy (non-argo) chrome uses a fixed radius; argo overrides it with\n // the brand radius token in the `argo` variant below.\n 'tw:rounded',\n 'tw:border',\n 'tw:border-solid',\n // `border-input` rather than the fixed `neutral-200` — same light-scheme\n // grey, but it follows the dark scheme too. The base text stays pinned:\n // `secondary` and the readonly state below both fill with a fixed light\n // grey, so a scheme-following text colour would go light-on-light there.\n // `primary` opts into the token itself (and re-pins its readonly fill).\n 'tw:border-input',\n 'tw:text-neutral-800',\n 'tw:transition',\n\n // focus\n 'tw:has-[:is(input,textarea):focus]:ring-4',\n\n // readonly\n 'tw:has-[:is(input,textarea)[readonly]]:bg-neutral-150',\n 'tw:has-[:is(input,textarea)[readonly]]:focus-within:ring-0',\n 'tw:has-[:is(input,textarea)[readonly]]:border-neutral-150',\n\n // disabled cursor (opacity owned by variant)\n 'tw:has-[:is(input,textarea):disabled]:cursor-not-allowed',\n\n // textarea: top-align addons, allow vertical expansion, own its y-padding\n 'tw:has-[textarea]:items-start',\n\n 'tw:has-[[data-align=block-start]:not(:empty)]:flex-wrap',\n 'tw:has-[[data-align=block-end]:not(:empty)]:flex-wrap',\n 'tw:[&>input]:has-[[data-align=block-start]:not(:empty)]:w-auto',\n 'tw:[&>input]:has-[[data-align=block-start]:not(:empty)]:flex-1',\n 'tw:[&>input]:has-[[data-align=block-end]:not(:empty)]:w-auto',\n 'tw:[&>input]:has-[[data-align=block-end]:not(:empty)]:flex-1',\n\n 'tw:[&>input]:px-4',\n 'tw:[&>input]:has-[[data-align=inline-start]:not(:empty)]:pl-2',\n 'tw:[&>input]:has-[[data-align=inline-end]:not(:empty)]:pr-2',\n ],\n {\n defaultVariants: {\n variant: 'primary',\n state: 'default',\n sizing: 'medium',\n focusVariant: 'default',\n },\n compoundVariants: [\n {\n variant: 'secondary',\n state: 'error',\n className: ['tw:bg-error-100'],\n },\n {\n variant: 'secondary',\n state: 'warning',\n className: ['tw:bg-warning-100'],\n },\n {\n variant: 'primary',\n state: 'default',\n focusVariant: 'off',\n className: ['tw:has-[:is(input,textarea):focus]:border-neutral-200'],\n },\n {\n variant: 'secondary',\n state: 'default',\n focusVariant: 'off',\n className: ['tw:has-[:is(input,textarea):focus]:border-neutral-100'],\n },\n {\n variant: ['primary', 'secondary'],\n state: 'error',\n focusVariant: 'on',\n className: ['tw:!border-error-500', 'tw:!ring-error-200'],\n },\n {\n variant: ['primary', 'secondary'],\n state: 'warning',\n focusVariant: 'on',\n className: ['tw:!border-warning-500', 'tw:!ring-warning-200'],\n },\n // --- argo ---\n {\n variant: 'argo',\n state: 'default',\n className: [\n 'tw:has-[:is(input,textarea):focus]:border-primary',\n 'tw:has-[:is(input,textarea):focus]:ring-ring/50',\n ],\n },\n {\n variant: 'argo',\n state: 'error',\n className: [\n 'tw:border-destructive',\n 'tw:has-[:is(input,textarea):focus]:border-destructive',\n 'tw:has-[:is(input,textarea):focus]:ring-destructive/20',\n ],\n },\n {\n variant: 'argo',\n focusVariant: 'on',\n className: ['tw:!border-primary', 'tw:!ring-ring/50'],\n },\n {\n variant: 'argo',\n state: 'error',\n focusVariant: 'on',\n className: ['tw:!border-destructive', 'tw:!ring-destructive/20'],\n },\n {\n variant: 'argo',\n state: 'default',\n focusVariant: 'off',\n className: ['tw:has-[:is(input,textarea):focus]:border-input'],\n },\n ],\n variants: {\n focusVariant: {\n default: [],\n on: ['tw:!border-ring', 'tw:!ring-ring/30', 'tw:!ring-4'],\n off: ['tw:has-[:is(input,textarea):focus]:!ring-0'],\n },\n variant: {\n primary: [\n // The field-surface token — white in the light scheme, so this is a\n // no-op there; the dark scheme gets a field fill, not a white slab.\n 'tw:bg-input-background',\n 'tw:text-foreground',\n // The base readonly fill is a fixed light grey, which the scheme-following\n // text above would sit on invisibly in dark. Re-pin to the same\n // `muted`/`input` pair argo uses for exactly this reason.\n 'tw:has-[:is(input,textarea)[readonly]]:bg-muted',\n 'tw:has-[:is(input,textarea)[readonly]]:border-input',\n 'tw:has-[:is(input,textarea):disabled]:opacity-40',\n // aria-invalid on the control surfaces the error chrome without a `state` prop — the\n // accessible path (mirrors the `state=\"error\"` legacy tokens). Higher specificity than\n // the default focus selector, so it wins without `!important`.\n 'tw:has-[:is(input,textarea)[aria-invalid=true]]:border-error-500',\n 'tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:border-error-500',\n 'tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:ring-error-200',\n ],\n secondary: [\n 'tw:bg-neutral-100',\n 'tw:border-neutral-100',\n 'tw:has-[:is(input,textarea):disabled]:opacity-40',\n 'tw:has-[:is(input,textarea)[aria-invalid=true]]:border-error-500',\n 'tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:border-error-500',\n 'tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:ring-error-200',\n ],\n argo: [\n // argo follows the brand radius token (overrides the static base)\n 'tw:rounded-[var(--radius-lg,0.25rem)]',\n // muted filled input surface — gray, distinct from white containers; not the app-background token.\n // Deliberately `muted`, not the `input-background` field token legacy uses: argo's field is a\n // grey inset by design. Converging the two is a brand-value decision, not a component one.\n 'tw:bg-muted',\n 'tw:border-input',\n 'tw:text-foreground',\n 'tw:has-[:is(input,textarea):disabled]:opacity-50',\n // readonly: keep the themed input surface/border. The base layer's fixed\n // `neutral-150` (a light grey) is correct for the legacy light chrome but\n // collides with argo's themed `foreground` text — light-on-light, invisible\n // in dark mode. Re-pin to the same `muted`/`input` tokens the editable argo\n // input uses (validated AA), so readonly stays legible in every scheme.\n 'tw:has-[:is(input,textarea)[readonly]]:bg-muted',\n 'tw:has-[:is(input,textarea)[readonly]]:border-input',\n // higher specificity than has-[:is(input,textarea):focus] — prevents focus border on readonly\n 'tw:has-[:is(input,textarea)[readonly]:focus]:border-input',\n // aria-invalid on the control surfaces the error chrome without a `state` prop — the\n // accessible path (uses the themeable `destructive` status token).\n 'tw:has-[:is(input,textarea)[aria-invalid=true]]:border-destructive',\n 'tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:border-destructive',\n 'tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:ring-destructive/20',\n ],\n },\n sizing: {\n default: [\n 'tw:[&>:is(input,textarea)]:py-2.5',\n 'tw:[&>:is(input,textarea)]:leading-[18px]',\n 'tw:[&>textarea]:!min-h-[calc(2.5rem-2px)]',\n ],\n small: [\n 'tw:[&>:is(input,textarea)]:py-2',\n 'tw:[&>:is(input,textarea)]:leading-[16px]',\n 'tw:[&>textarea]:!min-h-[calc(2rem-2px)]',\n ],\n medium: [\n 'tw:[&>:is(input,textarea)]:py-2',\n 'tw:[&>:is(input,textarea)]:leading-[18px]',\n 'tw:[&>textarea]:!min-h-[calc(2.25rem-2px)]',\n ],\n },\n state: {\n default: [\n 'tw:has-[:is(input,textarea):focus]:border-ring',\n 'tw:has-[:is(input,textarea):focus]:ring-ring/30',\n ],\n error: [\n 'tw:border-error-500',\n 'tw:has-[:is(input,textarea):focus]:border-error-500',\n 'tw:has-[:is(input,textarea):focus]:ring-error-200',\n ],\n warning: [\n 'tw:border-warning-500',\n 'tw:has-[:is(input,textarea):focus]:border-warning-500',\n 'tw:has-[:is(input,textarea):focus]:ring-warning-200',\n ],\n },\n },\n },\n);\n\ntype Props = ComponentPropsWithRef<'div'> &\n Omit<VariantProps<typeof inputGroupVariants>, 'variant'> & {\n variant?: Exclude<VariantProps<typeof inputGroupVariants>['variant'], 'argo'>;\n };\n\nconst InputGroupRoot = ({\n ref,\n children,\n state,\n variant,\n sizing,\n focusVariant,\n className,\n ...props\n}: Props) => {\n const isArgo = useArgoDesign();\n const effectiveVariant = isArgo ? 'argo' : variant;\n const effectiveSizing = effectiveVariant === 'argo' ? 'medium' : sizing;\n return (\n <div\n {...props}\n ref={ref}\n className={cn(\n inputGroupVariants({\n state,\n variant: effectiveVariant,\n sizing: effectiveSizing,\n focusVariant,\n className,\n }),\n )}\n >\n {children}\n </div>\n );\n};\n\nexport const InputGroup = InputGroupRoot as typeof InputGroupRoot & {\n Input: typeof InputGroupInput;\n Addon: typeof InputGroupAddon;\n Button: typeof InputGroupButton;\n TextArea: typeof InputGroupTextArea;\n Text: typeof InputGroupText;\n};\n\nInputGroup.Input = InputGroupInput;\nInputGroup.Addon = InputGroupAddon;\nInputGroup.Button = InputGroupButton;\nInputGroup.TextArea = InputGroupTextArea;\nInputGroup.Text = InputGroupText;\n","import { useCallback, useRef, useState } from 'react';\nimport type { Dispatch, SetStateAction } from 'react';\n\ntype UseControllableStateParams<T> = {\n /** The controlled value. When defined, the hook operates in controlled mode. */\n prop: T | undefined;\n /** The initial value used in uncontrolled mode. */\n defaultProp: T;\n /** Called with the next value whenever `setValue` runs (controlled and uncontrolled). */\n onChange?: (value: T) => void;\n};\n\n/**\n * Controlled/uncontrolled state, à la Radix's `useControllableState`.\n *\n * Returns a `[value, setValue]` tuple where `setValue` accepts a value or an updater\n * function (`SetStateAction<T>`). In controlled mode (`prop !== undefined`) the hook never\n * owns state — `setValue` resolves the next value and calls `onChange`; the parent is\n * responsible for feeding the new `prop` back. In uncontrolled mode the hook owns the value\n * in internal state and still calls `onChange`. `onChange` fires on every `setValue` call\n * (it is not deduped against the previous value).\n */\nexport const useControllableState = <T>({\n prop,\n defaultProp,\n onChange,\n}: UseControllableStateParams<T>): readonly [T, Dispatch<SetStateAction<T>>] => {\n const [uncontrolled, setUncontrolled] = useState<T>(defaultProp);\n const isControlled = prop !== undefined;\n // Inline the `!== undefined` check (rather than reusing `isControlled`) so TypeScript\n // narrows `prop` from `T | undefined` to `T` here.\n const value = prop !== undefined ? prop : uncontrolled;\n\n // Read the latest value/onChange without widening `setValue`'s dependency list,\n // keeping its identity stable across renders.\n const valueRef = useRef(value);\n valueRef.current = value;\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const setValue = useCallback<Dispatch<SetStateAction<T>>>(\n (next) => {\n const nextValue =\n typeof next === 'function' ? (next as (prev: T) => T)(valueRef.current) : next;\n // Advance the ref immediately so multiple functional-updater calls in the same tick\n // compose (each resolves against the previous result, not the stale render value).\n valueRef.current = nextValue;\n if (!isControlled) setUncontrolled(nextValue);\n onChangeRef.current?.(nextValue);\n },\n [isControlled],\n );\n\n return [value, setValue] as const;\n};\n","import { createPrefixedString } from '../../utils';\n\nexport const genInputTestId = (prefix: string = '') => {\n const ps = createPrefixedString(prefix);\n return {\n toString: () => prefix,\n inputWrapper: ps`input-wrapper`,\n input: ps`input`,\n clearButton: ps`clear-button`,\n };\n};\n","import { useRef } from 'react';\nimport type {\n ChangeEventHandler,\n ComponentProps,\n ComponentRef,\n FocusEventHandler,\n MouseEventHandler,\n ReactNode,\n} from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { X } from '../../icons';\nimport { cn, createChangeInputEvent, mergeRefs } from '../../utils';\n\nimport { genInputTestId } from './utils';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'focusVariant' | 'sizing' | 'state'\n>;\n\ntype OwnProps = {\n prefix?: ReactNode;\n rightSuffix?: ReactNode;\n rightSuffixVariant?: 'addon' | 'default';\n leftSuffix?: ReactNode;\n allowClear?: boolean;\n onClear?: () => void;\n testId?: string;\n value?: string | null;\n defaultValue?: string | null;\n /** Called with the unwrapped string value on every change. For the raw event use `onChange`. */\n onValueChange?: (value: string) => void;\n /** Called with the unwrapped string value on blur. For the raw event use `onBlur`. */\n onValueBlur?: (value: string) => void;\n type?: 'text' | 'email' | 'password' | 'datetime-local' | 'date';\n};\n\n/**\n * Props for `TextInput`. Combines `InputGroup` chrome (variant / sizing / state / focusVariant) with\n * input-specific slots (`prefix`, `leftSuffix`, `rightSuffix`, `allowClear`) and a string-typed\n * `value` / `defaultValue` plus convenience `onValueChange` / `onValueBlur` callbacks. `null` /\n * `undefined` are coerced to empty strings.\n */\nexport type Props = InputGroupProps &\n OwnProps &\n Omit<ComponentProps<'input'>, 'prefix' | 'value' | 'defaultValue' | 'type' | 'accept' | 'step'>;\n\nconst sanitizeTextInputValue = (value: string | null | undefined) => {\n if (typeof value === 'string' && value.trim() === '') return '';\n return value;\n};\n\n/**\n * Standard text input with a string-only API, built on `InputGroup` chrome — addons, clear button,\n * sizing, focus variants. The default choice for a bare text input.\n *\n * **When to use:** any plain text / email / password / date-input field outside `useAppForm`. Pair with\n * `onValueChange` instead of unwrapping `event.target.value` from `onChange`.\n * **When NOT to use:** for fields inside a labelled group use `FormGroup.TextInput`; for forms with\n * validation use `useAppForm` + `field.TextField`; for search use `SearchInput`.\n * **Composition:** wrap in a `FormGroup` for shared error / help-text state, or render directly inside\n * page layouts. Chrome resolves from the active brand automatically: a modern brand always renders argo\n * (any `variant` is ignored), while `variant` only tunes the legacy-brand chrome.\n */\nexport const TextInput = ({\n ref: forwardedRef,\n state = 'default',\n sizing = 'default',\n className,\n prefix = null,\n rightSuffix = null,\n rightSuffixVariant = 'default',\n leftSuffix = null,\n allowClear = false,\n onClear,\n disabled = false,\n testId: prefixTestId = '',\n autoFocus = false,\n id,\n name,\n variant,\n readOnly,\n type = 'text',\n focusVariant = 'default',\n onChange,\n onBlur,\n onValueChange,\n onValueBlur,\n value: valueProp,\n defaultValue,\n ...inputProps\n}: Props) => {\n const inputRef = useRef<ComponentRef<'input'>>(null);\n\n const [value, setValue] = useControllableState<string>({\n // `undefined` stays uncontrolled; any provided value (incl. `null`) is controlled and coerced\n // to a string. Whitespace-only input collapses to '' via `sanitizeTextInputValue`.\n prop: valueProp === undefined ? undefined : (sanitizeTextInputValue(valueProp) ?? ''),\n defaultProp: sanitizeTextInputValue(defaultValue) ?? '',\n onChange: onValueChange,\n });\n\n const testId = genInputTestId(prefixTestId);\n const isClearButtonVisible = (!!value && !disabled && !readOnly) || !!onClear;\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n setValue(event.target.value);\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n onValueBlur?.(event.target.value);\n onBlur?.(event);\n };\n\n const handleClear: MouseEventHandler<HTMLButtonElement> = () => {\n if (inputRef.current === null) return;\n inputRef.current.value = ''; // keep the DOM node in sync before firing the synthetic change\n inputRef.current.focus();\n onClear?.();\n handleChange(createChangeInputEvent(inputRef.current));\n };\n\n return (\n <InputGroup\n state={state}\n variant={variant}\n sizing={sizing}\n focusVariant={focusVariant}\n className={className}\n data-testid={testId.inputWrapper}\n >\n {prefix && <InputGroup.Addon align=\"inline-start\">{prefix}</InputGroup.Addon>}\n\n <InputGroup.Input\n {...inputProps}\n value={value}\n autoFocus={autoFocus}\n type={type}\n onChange={handleChange}\n onBlur={handleBlur}\n ref={mergeRefs(forwardedRef ?? null, inputRef)}\n disabled={disabled}\n id={id}\n name={name}\n readOnly={readOnly}\n data-testid={testId.input}\n />\n\n {(leftSuffix || allowClear || rightSuffix) && (\n <InputGroup.Addon align=\"inline-end\">\n {leftSuffix}\n {allowClear && isClearButtonVisible && (\n <InputGroup.Button\n aria-label=\"Clear\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleClear}\n data-testid={testId.clearButton}\n >\n <X className=\"tw:size-4\" />\n </InputGroup.Button>\n )}\n {rightSuffix && (\n <div\n className={cn({\n 'tw:whitespace-nowrap tw:bg-muted tw:px-4 tw:-mr-4 tw:py-2.5':\n rightSuffixVariant === 'addon',\n })}\n >\n {rightSuffix}\n </div>\n )}\n </InputGroup.Addon>\n )}\n </InputGroup>\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { useControllableState } from '../../hooks/useControllableState';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'sizing' | 'focusVariant' | 'state'\n>;\n\ntype TextareaNativeProps = Omit<\n ComponentProps<typeof InputGroup.TextArea>,\n 'value' | 'defaultValue' | 'rows' | 'maxRows'\n>;\n\ntype TextareaOwnProps = {\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string) => void;\n onValueBlur?: (value: string) => void;\n maxRows?: number | 'unlimited';\n disableResize?: boolean;\n containerClassName?: string;\n};\n\ntype Props = InputGroupProps & TextareaNativeProps & TextareaOwnProps;\n\n/**\n * Multi-line text input. Chrome resolves from the active brand automatically: a modern brand always\n * renders argo (any `variant` is ignored), while `variant` only tunes the legacy-brand chrome.\n */\nexport const Textarea = ({\n ref,\n containerClassName,\n\n // group props\n state = 'default',\n variant,\n sizing,\n focusVariant,\n\n // value handling\n value: valueProp,\n defaultValue,\n onValueChange,\n\n ...rest\n}: Props) => {\n const [value, setValue] = useControllableState<string>({\n // `undefined` stays uncontrolled; any provided value (incl. `null`) is controlled, coerced to ''.\n prop: valueProp === undefined ? undefined : (valueProp ?? ''),\n defaultProp: defaultValue ?? '',\n onChange: onValueChange,\n });\n\n return (\n <InputGroup\n state={state}\n sizing={sizing}\n focusVariant={focusVariant}\n variant={variant}\n className={containerClassName}\n >\n <InputGroup.TextArea {...rest} ref={ref} value={value} onValueChange={setValue} />\n </InputGroup>\n );\n};\n","import type { ComponentProps } from 'react';\n\nconst HEX_CHARSET = /^[0-9a-fA-F]+$/;\n// `#` + 3, 4, 6, or 8 hex digits — every length CSS accepts as a hex color.\nconst COMPLETE_HEX_PATTERN = /^#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\n// Longest hex body CSS accepts (`#rrggbbaa` without the hash).\nconst MAX_HEX_BODY_LENGTH = 8;\n// Native <input type=\"color\"> default when fed anything unparseable.\nconst PICKER_FALLBACK = '#000000';\n\nconst extractHexBody = (value: unknown): string | null => {\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n if (trimmed === '') return null;\n return trimmed.startsWith('#') ? trimmed.slice(1) : trimmed;\n};\n\nexport const isCompleteHexColor = (value: string): boolean => COMPLETE_HEX_PATTERN.test(value);\n\n// @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/showPicker\nexport const showPicker = (input: HTMLInputElement) => {\n const isShowPickerSupported = 'showPicker' in HTMLInputElement.prototype;\n isShowPickerSupported ? input.showPicker() : input.click();\n};\n\n/**\n * Coerces free-form text into a partial hex color for the visible text\n * input. Allows up to 8 hex digits to support `#rrggbbaa` (RGBA / alpha).\n *\n * Behaviour:\n * - empty / null / undefined / non-string → `''`\n * - trims surrounding whitespace\n * - prepends `#` when the user types raw hex without it\n * - keeps only the leading run of valid hex digits, dropping the rest\n * - caps total length at `# + 8` hex digits\n * - returns `''` when no valid hex digits remain (e.g. bare `#`, `zz`) so\n * the input doesn't sit on a lonely `#`\n *\n * Note: the result may be a *prefix* (e.g. `#a`, `#ab`) that is not yet a\n * valid CSS color — gate any rendering on `isCompleteHexColor`.\n */\nexport const coerceHexInputValue = (value?: string | null): string => {\n const body = extractHexBody(value);\n if (body === null) return '';\n const [validBody] = body.match(/^[0-9a-fA-F]+/) ?? [];\n if (!validBody) return '';\n return `#${validBody.slice(0, MAX_HEX_BODY_LENGTH)}`;\n};\n\n/**\n * Coerces any value into the strict lowercase `#rrggbb` form required by the\n * native `<input type=\"color\">`. Anything the picker can't render is\n * collapsed to `#000000`.\n *\n * - 3-digit shorthand (`#abc`) → expanded to 6 digits (`#aabbcc`)\n * - 4/8-digit RGBA → alpha channel is dropped\n * - invalid characters, wrong length, or non-string types → `#000000`\n *\n * The native picker silently lowercases its value; we lowercase here too so\n * controlled consumers see the same string round-trip.\n */\nexport const coerceColorPickerValue = (value: ComponentProps<'input'>['value'] | null) => {\n const body = extractHexBody(value);\n if (body === null || !HEX_CHARSET.test(body)) return PICKER_FALLBACK;\n\n if (body.length === 3 || body.length === 4) {\n const [r, g, b] = body;\n return `#${r}${r}${g}${g}${b}${b}`.toLowerCase();\n }\n if (body.length === 6 || body.length === 8) {\n return `#${body.slice(0, 6).toLowerCase()}`;\n }\n return PICKER_FALLBACK;\n};\n","import { type ComponentProps, type ComponentRef, useRef } from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { Pipette } from '../../icons';\n\nimport { coerceColorPickerValue, showPicker } from './utils';\n\ntype Props = Omit<ComponentProps<'input'>, 'type'>;\n\nexport const ColorPicker = ({ value, disabled, readOnly, ...props }: Props) => {\n const pickerRef = useRef<ComponentRef<'input'>>(null);\n\n const handleOpenPicker = () => {\n if (!pickerRef.current) return;\n showPicker(pickerRef.current);\n };\n\n return (\n <div className=\"tw:relative\">\n <input\n {...props}\n ref={pickerRef}\n type=\"color\"\n value={coerceColorPickerValue(value)}\n tabIndex={-1}\n aria-hidden\n className=\"tw:pointer-events-none tw:absolute tw:left-0 tw:top-full tw:size-0 tw:opacity-0\"\n disabled={disabled}\n readOnly={readOnly}\n />\n <InputGroup.Button\n onMouseDown={(event) => event.preventDefault()}\n disabled={disabled || readOnly}\n onClick={handleOpenPicker}\n aria-label=\"Pick color\"\n >\n <Pipette className=\"tw:size-4\" />\n </InputGroup.Button>\n </div>\n );\n};\n","import { useRef } from 'react';\nimport type {\n ChangeEventHandler,\n ComponentProps,\n ComponentRef,\n FocusEventHandler,\n MouseEventHandler,\n} from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { X } from '../../icons';\nimport { cn, createChangeInputEvent, mergeRefs } from '../../utils';\n\nimport { ColorPicker } from './ColorPicker';\nimport { coerceHexInputValue, isCompleteHexColor } from './utils';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'focusVariant' | 'state' | 'sizing'\n>;\n\ntype InputGroupInputProps = Omit<ComponentProps<typeof InputGroup.Input>, 'value' | 'defaultValue'>;\n\ntype Props = InputGroupProps &\n InputGroupInputProps & {\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string) => void;\n onValueBlur?: (value: string) => void;\n allowClear?: boolean;\n };\n\nexport const ColorInput = ({\n ref,\n\n // group props\n state,\n variant,\n focusVariant,\n sizing,\n className,\n\n // own props\n value: valueProp,\n onValueChange,\n onValueBlur,\n onChange,\n onBlur,\n defaultValue,\n allowClear = false,\n\n // input props\n disabled,\n readOnly,\n ...restInputProps\n}: Props) => {\n const inputRef = useRef<ComponentRef<'input'>>(null);\n\n const [value, setValue] = useControllableState<string>({\n // A `null` controlled value stays controlled (coerced to ''); `undefined` is uncontrolled.\n prop: valueProp === null ? '' : valueProp,\n defaultProp: defaultValue ?? '',\n onChange: onValueChange,\n });\n\n const isControlled = valueProp !== undefined;\n\n const canClear = allowClear && !!value && !disabled && !readOnly;\n const swatchColor = coerceHexInputValue(value);\n const isValidSwatch = isCompleteHexColor(swatchColor);\n\n // Preserve raw text while the user is typing — sanitise on blur.\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n setValue(event.target.value);\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n const newValue = event.target.value;\n const sanitizedNewValue = coerceHexInputValue(newValue);\n\n if (sanitizedNewValue !== newValue) {\n // In controlled mode, let the parent decide whether to apply the\n // sanitised value via `onValueChange` — don't fight its `value` prop.\n if (!isControlled) event.target.value = sanitizedNewValue;\n setValue(sanitizedNewValue);\n }\n\n onValueBlur?.(sanitizedNewValue);\n onBlur?.(event);\n };\n\n const handlePickerChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n setValue(coerceHexInputValue(event.target.value));\n onChange?.(event);\n };\n\n const handleClear: MouseEventHandler<HTMLButtonElement> = () => {\n if (!inputRef.current) return;\n inputRef.current.value = '';\n setValue('');\n onChange?.(createChangeInputEvent(inputRef.current));\n };\n\n return (\n <InputGroup\n state={state}\n variant={variant}\n sizing={sizing}\n focusVariant={focusVariant}\n className={className}\n >\n <InputGroup.Addon\n align=\"inline-start\"\n className={cn(\n { 'tw:-ml-7 tw:opacity-0': !value },\n 'tw:transition-[opacity,margin]',\n 'tw:ease-linear',\n 'tw:duration-200',\n )}\n >\n <div\n style={isValidSwatch ? { background: swatchColor } : undefined}\n className={cn(\n 'tw:size-5',\n 'tw:shrink-0',\n 'tw:rounded-sm',\n 'tw:border',\n 'tw:border-solid',\n 'tw:border-neutral-300',\n {\n 'tw:bg-[linear-gradient(to_top_right,transparent_calc(50%_-_1px),theme(colors.red.300)_calc(50%_-_1px),theme(colors.red.300)_calc(50%_+_1px),transparent_calc(50%_+_1px))]':\n !isValidSwatch,\n },\n )}\n />\n </InputGroup.Addon>\n\n <InputGroup.Input\n {...restInputProps}\n type=\"text\"\n ref={mergeRefs(ref ?? null, inputRef)}\n value={value}\n onChange={handleChange}\n onBlur={handleBlur}\n disabled={disabled}\n readOnly={readOnly}\n />\n\n <InputGroup.Addon align=\"inline-end\">\n {canClear && (\n <InputGroup.Button\n // prevents input focus stealing\n onMouseDown={(event) => event.preventDefault()}\n onClick={handleClear}\n aria-label=\"Clear color\"\n >\n <X className=\"tw:size-4\" />\n </InputGroup.Button>\n )}\n <ColorPicker\n disabled={disabled}\n readOnly={readOnly}\n value={value}\n onChange={handlePickerChange}\n />\n </InputGroup.Addon>\n </InputGroup>\n );\n};\n","import type {\n ChangeEvent,\n ChangeEventHandler,\n ComponentProps,\n FocusEventHandler,\n ReactNode,\n} from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'focusVariant' | 'state' | 'sizing'\n>;\n\ntype InputGroupInputProps = Omit<\n ComponentProps<typeof InputGroup.Input>,\n 'value' | 'defaultValue' | 'type' | 'prefix'\n>;\n\ntype Props = InputGroupProps &\n InputGroupInputProps & {\n value?: number | null;\n defaultValue?: number | null;\n onValueChange?: (value: number | null) => void;\n onValueBlur?: (value: number | null) => void;\n prefix?: ReactNode;\n suffix?: ReactNode;\n };\n\nconst toNumberOrNull = (event: ChangeEvent<HTMLInputElement>) =>\n Number.isNaN(event.target.valueAsNumber) ? null : event.target.valueAsNumber;\n\nexport const NumberInput = ({\n ref,\n state,\n variant,\n focusVariant,\n sizing,\n className,\n\n value,\n defaultValue,\n onValueChange,\n onValueBlur,\n onChange,\n onBlur,\n\n prefix,\n suffix,\n\n ...inputProps\n}: Props) => {\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n onValueChange?.(toNumberOrNull(event));\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n onValueBlur?.(toNumberOrNull(event));\n onBlur?.(event);\n };\n\n const isControlled = value !== undefined;\n const valueProp = isControlled ? { value: value ?? '' } : { defaultValue: defaultValue ?? '' };\n\n return (\n <InputGroup\n state={state}\n variant={variant}\n sizing={sizing}\n focusVariant={focusVariant}\n className={className}\n >\n {prefix && <InputGroup.Addon align=\"inline-start\">{prefix}</InputGroup.Addon>}\n <InputGroup.Input\n {...inputProps}\n {...valueProp}\n ref={ref}\n type=\"number\"\n onChange={handleChange}\n onBlur={handleBlur}\n />\n {suffix && <InputGroup.Addon align=\"inline-end\">{suffix}</InputGroup.Addon>}\n </InputGroup>\n );\n};\n","import { createContext, use } from 'react';\n\nimport type { FormGroupContext } from './types';\n\nconst FormGroupContext = createContext<FormGroupContext>({\n state: 'default',\n});\n\nexport const FormGroupProvider = FormGroupContext;\n\nexport const useFormGroupContext = () => use(FormGroupContext);\n","import type { ComponentProps } from 'react';\n\nimport { ColorInput } from '../ColorInput';\n\nimport { useFormGroupContext } from './context';\n\ntype Props = Omit<ComponentProps<typeof ColorInput>, 'state'>;\n\nexport const FormGroupColorInput = ({ ref, ...props }: Props) => {\n const { state } = useFormGroupContext();\n return <ColorInput state={state} {...props} ref={ref} />;\n};\n","import { useMemo } from 'react';\nimport type { ComponentPropsWithRef, ReactNode } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentPropsWithRef<'div'> & {\n /**\n * Field validation errors. TanStack Form errors are strings (function validators) or\n * `{ message }` objects (Standard Schema / zod). A single message renders inline; several\n * render as a list. Ignored when `children` is provided.\n */\n errors?: readonly (string | { message?: string } | undefined)[];\n};\n\n// Normalize a TanStack error entry (string or `{ message }`) to a display string.\nconst toMessage = (entry: string | { message?: string } | undefined): string | undefined =>\n typeof entry === 'string' ? entry : entry?.message;\n\n/**\n * Field error message. Unlike `FormGroup.Help` (advisory description), this is a validation\n * error, so it carries `role=\"alert\"` — announced when it appears, even if focus isn't on the\n * field (e.g. surfaced on submit). Renders a `<div>` (not `<p>`) so multiple errors can render\n * as a `<ul>`.\n */\nexport const FormGroupError = ({ children, className, errors, ...rest }: Props) => {\n const content = useMemo<ReactNode>(() => {\n if (children) return children;\n\n const messages = (errors ?? []).map(toMessage).filter((message) => !!message);\n if (messages.length === 0) return null;\n if (messages.length === 1) return messages[0];\n\n return (\n <ul className=\"tw:m-0 tw:flex tw:list-disc tw:flex-col tw:gap-0 tw:pl-4\">\n {messages.map((message, index) => (\n <li key={index}>{message}</li>\n ))}\n </ul>\n );\n }, [children, errors]);\n\n if (!content) return null;\n\n return (\n <div {...rest} role=\"alert\" className={cn('tw:m-0 tw:text-xs tw:text-destructive', className)}>\n {content}\n </div>\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { HelpBlock } from '../../components/HelpBlock';\n\nimport { useFormGroupContext } from './context';\n\ntype Props = Omit<ComponentProps<typeof HelpBlock>, 'state'>;\n\nexport const FormGroupHelp = ({ children, ...rest }: Props) => {\n const formGroupContext = useFormGroupContext();\n\n // Help stays advisory; a group's error state surfaces via FormGroup.Error, not here.\n return (\n <HelpBlock state={formGroupContext.state === 'warning' ? 'warning' : 'default'} {...rest}>\n {children}\n </HelpBlock>\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { NumberInput } from '../NumberInput';\n\nimport { useFormGroupContext } from './context';\n\ntype Props = Omit<ComponentProps<typeof NumberInput>, 'state'>;\n\nexport const FormGroupNumberInput = ({ ref, ...props }: Props) => {\n const { state } = useFormGroupContext();\n return <NumberInput {...props} ref={ref} state={state} />;\n};\n","import type { ComponentProps } from 'react';\n\nimport { Textarea } from '../Textarea';\n\nimport { useFormGroupContext } from './context';\n\ntype Props = Omit<ComponentProps<typeof Textarea>, 'state'>;\n\nexport const FormGroupTextarea = (props: Props) => {\n const { state } = useFormGroupContext();\n return <Textarea state={state} {...props} />;\n};\n","import type { ComponentProps } from 'react';\n\nimport { TextInput } from '../TextInput';\n\nimport { useFormGroupContext } from './context';\n\ntype Props = Omit<ComponentProps<typeof TextInput>, 'state'>;\n\nexport const FormGroupTextInput = ({ ref, ...props }: Props) => {\n const { state } = useFormGroupContext();\n return <TextInput state={state} {...props} ref={ref} />;\n};\n","import type { ComponentPropsWithRef } from 'react';\n\nimport { cn } from '../../utils';\n\nimport { FormGroupProvider } from './context';\nimport { FormGroupColorInput } from './FormGroupColorInput';\nimport { FormGroupError } from './FormGroupError';\nimport { FormGroupHelp } from './FormGroupHelp';\nimport { FormGroupNumberInput } from './FormGroupNumberInput';\nimport { FormGroupTextarea } from './FormGroupTextarea';\nimport { FormGroupTextInput } from './FormGroupTextInput';\nimport type { FormGroupContext } from './types';\n\n/**\n * Props for `FormGroup`. `state` from `FormGroupContext` (\"default\" | \"error\" | \"warning\") propagates via\n * context to nested inputs. `FormGroup.Help` stays advisory (it reacts only to \"warning\"); validation errors\n * render through `FormGroup.Error`, not the input `state`.\n */\ntype FormGroupProps = ComponentPropsWithRef<'div'> & FormGroupContext;\n\n/**\n * Label + input + help-text grouping with shared validation state. Provides the chrome for a single field.\n *\n * **When to use:** rendering a label + bare input + help/error text outside `useAppForm` (e.g. one-off\n * filter fields, settings panes). `state=\"error\"` flips `FormGroup.TextInput` chrome without per-component\n * wiring; the error message itself renders via `FormGroup.Error` (`role=\"alert\"`), while `FormGroup.Help`\n * stays advisory.\n * **When NOT to use:** for a full form with validation and submit state, use `useAppForm` from `blocks/Form` —\n * it composes `FormGroup` internally via the typed field connectors.\n * **Composition:** nest a `Label`, then one of `FormGroup.TextInput` / `FormGroup.NumberInput` /\n * `FormGroup.ColorInput` / `FormGroup.Textarea`, optionally followed by `FormGroup.Help`\n * (advisory description) or `FormGroup.Error` (validation error, announced via `role=\"alert\"`).\n */\nexport const FormGroup = ({ className, children, state, ...rest }: FormGroupProps) => {\n return (\n <FormGroupProvider value={{ state }}>\n <div {...rest} className={cn('tw:flex tw:flex-col tw:gap-1', className)}>\n {children}\n </div>\n </FormGroupProvider>\n );\n};\n\nFormGroup.Help = FormGroupHelp;\nFormGroup.Error = FormGroupError;\nFormGroup.TextInput = FormGroupTextInput;\nFormGroup.NumberInput = FormGroupNumberInput;\nFormGroup.ColorInput = FormGroupColorInput;\nFormGroup.Textarea = FormGroupTextarea;\n"]}
@@ -0,0 +1,16 @@
1
+ // src/components/MergeEditor/constants.ts
2
+ var CHUNK_TYPE = {
3
+ UNCHANGED: "unchanged",
4
+ ADDED: "added",
5
+ REMOVED: "removed"
6
+ };
7
+ var CHANGE_CLASS = {
8
+ SAFE: "safe",
9
+ CONFLICT: "conflict"
10
+ };
11
+ var LINE_HEIGHT_PX = 20;
12
+ var PANE_HEADER_HEIGHT_PX = 58;
13
+
14
+ export { CHANGE_CLASS, CHUNK_TYPE, LINE_HEIGHT_PX, PANE_HEADER_HEIGHT_PX };
15
+ //# sourceMappingURL=chunk-VMFSRV5H.js.map
16
+ //# sourceMappingURL=chunk-VMFSRV5H.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/MergeEditor/constants.ts"],"names":[],"mappings":";AAAO,IAAM,UAAA,GAAa;AAAA,EACxB,SAAA,EAAW,WAAA;AAAA,EACX,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS;AACX;AAgCO,IAAM,YAAA,GAAe;AAAA,EAC1B,IAAA,EAAM,MAAA;AAAA,EACN,QAAA,EAAU;AACZ;AAKO,IAAM,cAAA,GAAiB;AAGvB,IAAM,qBAAA,GAAwB","file":"chunk-VMFSRV5H.js","sourcesContent":["export const CHUNK_TYPE = {\n UNCHANGED: 'unchanged',\n ADDED: 'added',\n REMOVED: 'removed',\n} as const;\n\ntype ChunkType = (typeof CHUNK_TYPE)[keyof typeof CHUNK_TYPE];\n\nexport type DiffChunk = {\n type: ChunkType;\n value: string;\n /** 1-indexed start line in the old (left) text */\n oldStart: number;\n /** 1-indexed end line in the old (left) text */\n oldEnd: number;\n /** 1-indexed start line in the new (right) text */\n newStart: number;\n /** 1-indexed end line in the new (right) text */\n newEnd: number;\n};\n\n/**\n * A paired conflict: adjacent REMOVED + ADDED chunks from diffLines,\n * representing a section that was modified. If only one side exists,\n * the other is empty (pure insertion or deletion).\n */\nexport type MergeConflict = {\n id: string;\n oldValue: string;\n oldStartLine: number;\n oldEndLine: number;\n newValue: string;\n newStartLine: number;\n newEndLine: number;\n};\n\nexport const CHANGE_CLASS = {\n SAFE: 'safe',\n CONFLICT: 'conflict',\n} as const;\n\nexport type ChangeClassification = (typeof CHANGE_CLASS)[keyof typeof CHANGE_CLASS];\n\n/** Must match the CodeMirror line-height set in MergePane */\nexport const LINE_HEIGHT_PX = 20;\n\n/** Must match the rendered header height in MergePane (py-3 + content + border) */\nexport const PANE_HEADER_HEIGHT_PX = 58;\n"]}
@@ -0,0 +1,47 @@
1
+ import { cn } from './chunk-JP7PNHLH.js';
2
+ import { useId } from 'react';
3
+ import { jsx, Fragment } from 'react/jsx-runtime';
4
+
5
+ var HEIGHT_CLASS_NAME = {
6
+ xxs: "tw:h-3 tw:rounded",
7
+ xs: "tw:h-4 tw:rounded",
8
+ sm: "tw:h-5 tw:rounded",
9
+ md: "tw:h-6 tw:rounded-md",
10
+ lg: "tw:h-8 tw:rounded-lg",
11
+ xl: "tw:h-10 tw:rounded-lg",
12
+ "2xl": "tw:h-12 tw:rounded-lg"
13
+ };
14
+ var ANIMATION_CLASS_NAME = cn(
15
+ // base styles
16
+ "tw:relative",
17
+ "tw:overflow-hidden",
18
+ "tw:pointer-events-none",
19
+ "tw:bg-skeleton",
20
+ // before
21
+ 'tw:before:content-[""]',
22
+ "tw:before:opacity-100",
23
+ "tw:before:absolute",
24
+ "tw:before:inset-0",
25
+ "tw:before:-translate-x-full",
26
+ "tw:before:animate-[shimmer_2s_infinite]",
27
+ "tw:before:bg-gradient-to-r",
28
+ "tw:before:from-transparent",
29
+ "tw:before:to-transparent",
30
+ "tw:before:via-white/40"
31
+ );
32
+ var Skeleton = ({ height = "md", className, count = 1 }) => {
33
+ const prefixId = useId();
34
+ const keys = Array.from({ length: count }, (_, i) => `${prefixId}-${i}`);
35
+ return /* @__PURE__ */ jsx(Fragment, { children: keys.map((key) => /* @__PURE__ */ jsx(
36
+ "div",
37
+ {
38
+ "data-skeleton": "true",
39
+ className: cn(HEIGHT_CLASS_NAME[height], ANIMATION_CLASS_NAME, className)
40
+ },
41
+ key
42
+ )) });
43
+ };
44
+
45
+ export { Skeleton };
46
+ //# sourceMappingURL=chunk-VPPM7UUQ.js.map
47
+ //# sourceMappingURL=chunk-VPPM7UUQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Skeleton/Skeleton.tsx"],"names":[],"mappings":";;;;AAkBA,IAAM,iBAAA,GAA4C;AAAA,EAChD,GAAA,EAAK,mBAAA;AAAA,EACL,EAAA,EAAI,mBAAA;AAAA,EACJ,EAAA,EAAI,mBAAA;AAAA,EACJ,EAAA,EAAI,sBAAA;AAAA,EACJ,EAAA,EAAI,sBAAA;AAAA,EACJ,EAAA,EAAI,uBAAA;AAAA,EACJ,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,oBAAA,GAAuB,EAAA;AAAA;AAAA,EAE3B,aAAA;AAAA,EACA,oBAAA;AAAA,EACA,wBAAA;AAAA,EACA,gBAAA;AAAA;AAAA,EAGA,wBAAA;AAAA,EACA,uBAAA;AAAA,EACA,oBAAA;AAAA,EACA,mBAAA;AAAA,EACA,6BAAA;AAAA,EACA,yCAAA;AAAA,EACA,4BAAA;AAAA,EACA,4BAAA;AAAA,EACA,0BAAA;AAAA,EACA;AACF,CAAA;AAeO,IAAM,QAAA,GAAW,CAAC,EAAE,MAAA,GAAS,MAAM,SAAA,EAAW,KAAA,GAAQ,GAAE,KAAqB;AAClF,EAAA,MAAM,WAAW,KAAA,EAAM;AACvB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,EAAE,QAAQ,KAAA,EAAM,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA;AAEvE,EAAA,uBACE,GAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,qBACT,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MAEC,eAAA,EAAc,MAAA;AAAA,MACd,WAAW,EAAA,CAAG,iBAAA,CAAkB,MAAM,CAAA,EAAG,sBAAsB,SAAS;AAAA,KAAA;AAAA,IAFnE;AAAA,GAIR,CAAA,EACH,CAAA;AAEJ","file":"chunk-VPPM7UUQ.js","sourcesContent":["import { useId } from 'react';\n\nimport { cn } from '../../utils';\n\nexport type Height = 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\n/**\n * Props for `Skeleton`. `height` maps to the named token (xxs 12px → 2xl 48px); `count` renders multiple\n * stacked placeholders sharing the same shape.\n */\ntype SkeletonProps = {\n /** Named height token — `xxs` (12px) through `2xl` (48px). */\n height?: Height;\n className?: string;\n /** Number of stacked placeholder rows. Use for list-style loading states. */\n count?: number;\n};\n\nconst HEIGHT_CLASS_NAME: Record<Height, string> = {\n xxs: 'tw:h-3 tw:rounded',\n xs: 'tw:h-4 tw:rounded',\n sm: 'tw:h-5 tw:rounded',\n md: 'tw:h-6 tw:rounded-md',\n lg: 'tw:h-8 tw:rounded-lg',\n xl: 'tw:h-10 tw:rounded-lg',\n '2xl': 'tw:h-12 tw:rounded-lg',\n};\n\nconst ANIMATION_CLASS_NAME = cn(\n // base styles\n 'tw:relative',\n 'tw:overflow-hidden',\n 'tw:pointer-events-none',\n 'tw:bg-skeleton',\n\n // before\n 'tw:before:content-[\"\"]',\n 'tw:before:opacity-100',\n 'tw:before:absolute',\n 'tw:before:inset-0',\n 'tw:before:-translate-x-full',\n 'tw:before:animate-[shimmer_2s_infinite]',\n 'tw:before:bg-gradient-to-r',\n 'tw:before:from-transparent',\n 'tw:before:to-transparent',\n 'tw:before:via-white/40',\n);\n\n/**\n * Animated placeholder shown in place of content that is still loading.\n *\n * **When to use:** during initial page or section load while the real content is fetched. Match the\n * placeholder shape to the eventual content (one `Skeleton height=\"lg\"` per title row, several `xs` for\n * paragraph lines). For list shells use `count` to render N stacked placeholders.\n * **When NOT to use:** for indeterminate background work without a layout slot use `DotsLoader` or\n * `Button isLoading`; for empty / error states once the request resolves use `EmptyState` / `ErrorState`.\n * **Composition:** drop directly into the slot the real content will occupy. `SkeletonList` is the typical\n * shell for `Table` / `Card`-list pages.\n *\n * @see RECIPES.md#data-card-with-skeleton — for a loading card pattern\n */\nexport const Skeleton = ({ height = 'md', className, count = 1 }: SkeletonProps) => {\n const prefixId = useId();\n const keys = Array.from({ length: count }, (_, i) => `${prefixId}-${i}`);\n\n return (\n <>\n {keys.map((key) => (\n <div\n key={key}\n data-skeleton=\"true\"\n className={cn(HEIGHT_CLASS_NAME[height], ANIMATION_CLASS_NAME, className)}\n />\n ))}\n </>\n );\n};\n"]}