@flanksource/clicky-ui 0.2.15 → 0.2.16

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/dist/components/Combobox.cjs +15 -7
  2. package/dist/components/Combobox.cjs.map +1 -1
  3. package/dist/components/Combobox.d.ts +8 -0
  4. package/dist/components/Combobox.d.ts.map +1 -1
  5. package/dist/components/Combobox.js +15 -7
  6. package/dist/components/Combobox.js.map +1 -1
  7. package/dist/components/DateTimePicker.cjs +3 -0
  8. package/dist/components/DateTimePicker.cjs.map +1 -1
  9. package/dist/components/DateTimePicker.d.ts +6 -2
  10. package/dist/components/DateTimePicker.d.ts.map +1 -1
  11. package/dist/components/DateTimePicker.js +3 -0
  12. package/dist/components/DateTimePicker.js.map +1 -1
  13. package/dist/components/Field.cjs +33 -0
  14. package/dist/components/Field.cjs.map +1 -0
  15. package/dist/components/Field.d.ts +27 -0
  16. package/dist/components/Field.d.ts.map +1 -0
  17. package/dist/components/Field.js +33 -0
  18. package/dist/components/Field.js.map +1 -0
  19. package/dist/components/FilterBar.cjs +41 -14
  20. package/dist/components/FilterBar.cjs.map +1 -1
  21. package/dist/components/FilterBar.d.ts +2 -0
  22. package/dist/components/FilterBar.d.ts.map +1 -1
  23. package/dist/components/FilterBar.js +43 -16
  24. package/dist/components/FilterBar.js.map +1 -1
  25. package/dist/components/MultiSelect.cjs +2 -1
  26. package/dist/components/MultiSelect.cjs.map +1 -1
  27. package/dist/components/MultiSelect.d.ts +5 -1
  28. package/dist/components/MultiSelect.d.ts.map +1 -1
  29. package/dist/components/MultiSelect.js +2 -1
  30. package/dist/components/MultiSelect.js.map +1 -1
  31. package/dist/components/json-schema-form-fields.cjs +15 -8
  32. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  33. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  34. package/dist/components/json-schema-form-fields.js +15 -8
  35. package/dist/components/json-schema-form-fields.js.map +1 -1
  36. package/dist/components/json-schema-form-types.d.ts +1 -0
  37. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  38. package/dist/components/loading.cjs +4 -4
  39. package/dist/components/loading.cjs.map +1 -1
  40. package/dist/components/loading.d.ts +6 -4
  41. package/dist/components/loading.d.ts.map +1 -1
  42. package/dist/components/loading.js +4 -4
  43. package/dist/components/loading.js.map +1 -1
  44. package/dist/components/use-form.cjs +27 -0
  45. package/dist/components/use-form.cjs.map +1 -0
  46. package/dist/components/use-form.d.ts +30 -0
  47. package/dist/components/use-form.d.ts.map +1 -0
  48. package/dist/components/use-form.js +27 -0
  49. package/dist/components/use-form.js.map +1 -0
  50. package/dist/components.cjs +7 -0
  51. package/dist/components.cjs.map +1 -1
  52. package/dist/components.d.ts +4 -1
  53. package/dist/components.d.ts.map +1 -1
  54. package/dist/components.js +8 -1
  55. package/dist/components.js.map +1 -1
  56. package/dist/data/version-info.cjs +3 -3
  57. package/dist/data/version-info.js +3 -3
  58. package/dist/index.cjs +7 -0
  59. package/dist/index.cjs.map +1 -1
  60. package/dist/index.js +8 -1
  61. package/dist/index.js.map +1 -1
  62. package/dist/overlay/Modal.cjs +27 -23
  63. package/dist/overlay/Modal.cjs.map +1 -1
  64. package/dist/overlay/Modal.d.ts +7 -1
  65. package/dist/overlay/Modal.d.ts.map +1 -1
  66. package/dist/overlay/Modal.js +27 -23
  67. package/dist/overlay/Modal.js.map +1 -1
  68. package/dist/rpc/FilterForm.cjs +4 -4
  69. package/dist/rpc/FilterForm.cjs.map +1 -1
  70. package/dist/rpc/FilterForm.js +4 -4
  71. package/dist/rpc/FilterForm.js.map +1 -1
  72. package/dist/rpc/OperationCatalog.cjs +17 -21
  73. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  74. package/dist/rpc/OperationCatalog.d.ts +3 -3
  75. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  76. package/dist/rpc/OperationCatalog.js +18 -22
  77. package/dist/rpc/OperationCatalog.js.map +1 -1
  78. package/dist/rpc/formMetadata.cjs +5 -3
  79. package/dist/rpc/formMetadata.cjs.map +1 -1
  80. package/dist/rpc/formMetadata.d.ts.map +1 -1
  81. package/dist/rpc/formMetadata.js +5 -3
  82. package/dist/rpc/formMetadata.js.map +1 -1
  83. package/dist/styles.css +1 -1
  84. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"loading.cjs","sources":["../../src/components/loading.tsx"],"sourcesContent":["import {\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n type SVGProps,\n} from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type LoadingSize = \"sm\" | \"md\" | \"lg\" | \"responsive\";\nexport type LoadingVariant = \"inline\" | \"centered\";\n\nexport interface LoadingProps extends HTMLAttributes<HTMLDivElement> {\n /** Fixed size, or `responsive` (default) to scale with the container. */\n size?: LoadingSize;\n /** `inline` for a small in-flow loader, `centered` for a section/page loader. */\n variant?: LoadingVariant;\n /** Optional caption rendered beside (inline) or beneath (centered) the dots. */\n label?: ReactNode;\n}\n\nconst FIXED_DOT_SIZE: Record<Exclude<LoadingSize, \"responsive\">, string> = {\n sm: \"size-4\",\n md: \"size-6\",\n lg: \"size-10\",\n};\n\n// Scales with the nearest `container-type` ancestor's inline size: floors at\n// 1.5rem (24px) in tight panels, climbs to 4.5rem (72px) on full-page loads,\n// interpolating smoothly between. Pure CSS — no ResizeObserver, SSR-safe.\nconst RESPONSIVE_DOT_SIZE = \"size-[clamp(1.5rem,12cqi,4.5rem)]\";\nconst RESPONSIVE_LABEL_SIZE = \"text-[clamp(0.7rem,4cqi,0.95rem)]\";\n\n/**\n * Three bouncing dots. `fill=\"currentColor\"` so the dots inherit the surrounding\n * theme text color (works in light and dark). Size is driven entirely by the\n * className (width + height); the viewBox keeps the 1:1 aspect.\n */\nexport const LoadingDots = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n ({ className, ...props }, ref) => (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n className={cn(\"shrink-0\", className)}\n {...props}\n >\n <circle cx=\"4\" cy=\"12\" r=\"3\">\n <animate\n id=\"clickyLoadDotA\"\n fill=\"freeze\"\n attributeName=\"opacity\"\n begin=\"0;clickyLoadDotC.end-0.25s\"\n dur=\"0.75s\"\n values=\"1;0.2\"\n />\n </circle>\n <circle cx=\"12\" cy=\"12\" r=\"3\" opacity=\"0.4\">\n <animate\n fill=\"freeze\"\n attributeName=\"opacity\"\n begin=\"clickyLoadDotA.begin+0.15s\"\n dur=\"0.75s\"\n values=\"1;0.2\"\n />\n </circle>\n <circle cx=\"20\" cy=\"12\" r=\"3\" opacity=\"0.3\">\n <animate\n id=\"clickyLoadDotC\"\n fill=\"freeze\"\n attributeName=\"opacity\"\n begin=\"clickyLoadDotA.begin+0.3s\"\n dur=\"0.75s\"\n values=\"1;0.2\"\n />\n </circle>\n </svg>\n ),\n);\nLoadingDots.displayName = \"LoadingDots\";\n\n/**\n * Loading indicator built on the shared 3-dot animation.\n *\n * `centered` establishes a size container (`container-type: inline-size`) so the\n * default `responsive` size scales the dots to the space the loader is given —\n * small inside a narrow panel, large on a full-page route shell. The `inline`\n * variant is not a container, so a `responsive` request there renders at `sm`.\n */\nexport const Loading = forwardRef<HTMLDivElement, LoadingProps>(\n ({ size = \"responsive\", variant = \"inline\", label, className, ...props }, ref) => {\n const effectiveSize =\n variant === \"inline\" && size === \"responsive\" ? \"sm\" : size;\n const isResponsive = effectiveSize === \"responsive\";\n const dotClass = isResponsive\n ? RESPONSIVE_DOT_SIZE\n : FIXED_DOT_SIZE[effectiveSize];\n\n if (variant === \"centered\") {\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-label=\"Loading\"\n className={cn(\n \"flex min-h-32 w-full flex-col items-center justify-center gap-3 text-muted-foreground\",\n \"[container-type:inline-size]\",\n className,\n )}\n {...props}\n >\n <LoadingDots className={dotClass} />\n {label != null && (\n <span className={cn(isResponsive ? RESPONSIVE_LABEL_SIZE : \"text-sm\")}>\n {label}\n </span>\n )}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-label=\"Loading\"\n className={cn(\n \"inline-flex items-center gap-2 text-muted-foreground\",\n className,\n )}\n {...props}\n >\n <LoadingDots className={dotClass} />\n {label != null && <span className=\"text-sm\">{label}</span>}\n </div>\n );\n },\n);\nLoading.displayName = \"Loading\";\n"],"names":["forwardRef","jsxs","cn","jsx"],"mappings":";;;;;AAoBA,MAAM,iBAAqE;AAAA,EACzE,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAKA,MAAM,sBAAsB;AAC5B,MAAM,wBAAwB;AAOvB,MAAM,cAAcA,MAAAA;AAAAA,EACzB,CAAC,EAAE,WAAW,GAAG,MAAA,GAAS,QACxBC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,OAAM;AAAA,MACN,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,eAAY;AAAA,MACZ,WAAWC,MAAAA,GAAG,YAAY,SAAS;AAAA,MAClC,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAAC,+BAAC,YAAO,IAAG,KAAI,IAAG,MAAK,GAAE,KACvB,UAAAA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,eAAc;AAAA,YACd,OAAM;AAAA,YACN,KAAI;AAAA,YACJ,QAAO;AAAA,UAAA;AAAA,QAAA,GAEX;AAAA,QACAA,2BAAAA,IAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,SAAQ,OACpC,UAAAA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,eAAc;AAAA,YACd,OAAM;AAAA,YACN,KAAI;AAAA,YACJ,QAAO;AAAA,UAAA;AAAA,QAAA,GAEX;AAAA,QACAA,2BAAAA,IAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,SAAQ,OACpC,UAAAA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,eAAc;AAAA,YACd,OAAM;AAAA,YACN,KAAI;AAAA,YACJ,QAAO;AAAA,UAAA;AAAA,QAAA,EACT,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AACA,YAAY,cAAc;AAUnB,MAAM,UAAUH,MAAAA;AAAAA,EACrB,CAAC,EAAE,OAAO,cAAc,UAAU,UAAU,OAAO,WAAW,GAAG,MAAA,GAAS,QAAQ;AAChF,UAAM,gBACJ,YAAY,YAAY,SAAS,eAAe,OAAO;AACzD,UAAM,eAAe,kBAAkB;AACvC,UAAM,WAAW,eACb,sBACA,eAAe,aAAa;AAEhC,QAAI,YAAY,YAAY;AAC1B,aACEC,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA,MAAK;AAAA,UACL,cAAW;AAAA,UACX,WAAWC,MAAAA;AAAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,UAED,GAAG;AAAA,UAEJ,UAAA;AAAA,YAAAC,2BAAAA,IAAC,aAAA,EAAY,WAAW,SAAA,CAAU;AAAA,YACjC,SAAS,QACRA,+BAAC,QAAA,EAAK,WAAWD,SAAG,eAAe,wBAAwB,SAAS,GACjE,UAAA,MAAA,CACH;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAIR;AAEA,WACED,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,cAAW;AAAA,QACX,WAAWC,MAAAA;AAAAA,UACT;AAAA,UACA;AAAA,QAAA;AAAA,QAED,GAAG;AAAA,QAEJ,UAAA;AAAA,UAAAC,2BAAAA,IAAC,aAAA,EAAY,WAAW,SAAA,CAAU;AAAA,UACjC,SAAS,QAAQA,2BAAAA,IAAC,QAAA,EAAK,WAAU,WAAW,UAAA,MAAA,CAAM;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGzD;AACF;AACA,QAAQ,cAAc;;;"}
1
+ {"version":3,"file":"loading.cjs","sources":["../../src/components/loading.tsx"],"sourcesContent":["import {\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n type SVGProps,\n} from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type LoadingSize = \"sm\" | \"md\" | \"lg\" | \"responsive\";\nexport type LoadingVariant = \"inline\" | \"centered\";\n\nexport interface LoadingProps extends HTMLAttributes<HTMLDivElement> {\n /** Fixed size, or `responsive` (default) to scale with the container. */\n size?: LoadingSize;\n /** `inline` for a small in-flow loader, `centered` for a section/page loader. */\n variant?: LoadingVariant;\n /** Optional caption rendered beside (inline) or beneath (centered) the dots. */\n label?: ReactNode;\n}\n\nconst FIXED_DOT_SIZE: Record<Exclude<LoadingSize, \"responsive\">, string> = {\n sm: \"size-4\",\n md: \"size-6\",\n lg: \"size-10\",\n};\n\n// Scales with the SMALLER of the container's two dimensions (`cqmin`, enabled by\n// `container-type: size` on the centered wrapper). Using `cqmin` rather than the\n// width alone means a wide-but-short panel reads as small — only a genuinely\n// large area (a full-page load) grows the dots. Floors at 1.25rem (20px) in\n// tight panels, climbs to 2.5rem (40px) on big loads. Pure CSS — no\n// ResizeObserver, SSR-safe.\nconst RESPONSIVE_DOT_SIZE = \"size-[clamp(1.25rem,18cqmin,2.5rem)]\";\nconst RESPONSIVE_LABEL_SIZE = \"text-[clamp(0.72rem,4.5cqmin,0.9rem)]\";\n\n/**\n * Three bouncing dots. `fill=\"currentColor\"` so the dots inherit the surrounding\n * theme text color (works in light and dark). Size is driven entirely by the\n * className (width + height); the viewBox keeps the 1:1 aspect.\n */\nexport const LoadingDots = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n ({ className, ...props }, ref) => (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n className={cn(\"shrink-0\", className)}\n {...props}\n >\n <circle cx=\"4\" cy=\"12\" r=\"3\">\n <animate\n id=\"clickyLoadDotA\"\n fill=\"freeze\"\n attributeName=\"opacity\"\n begin=\"0;clickyLoadDotC.end-0.25s\"\n dur=\"0.75s\"\n values=\"1;0.2\"\n />\n </circle>\n <circle cx=\"12\" cy=\"12\" r=\"3\" opacity=\"0.4\">\n <animate\n fill=\"freeze\"\n attributeName=\"opacity\"\n begin=\"clickyLoadDotA.begin+0.15s\"\n dur=\"0.75s\"\n values=\"1;0.2\"\n />\n </circle>\n <circle cx=\"20\" cy=\"12\" r=\"3\" opacity=\"0.3\">\n <animate\n id=\"clickyLoadDotC\"\n fill=\"freeze\"\n attributeName=\"opacity\"\n begin=\"clickyLoadDotA.begin+0.3s\"\n dur=\"0.75s\"\n values=\"1;0.2\"\n />\n </circle>\n </svg>\n ),\n);\nLoadingDots.displayName = \"LoadingDots\";\n\n/**\n * Loading indicator built on the shared 3-dot animation.\n *\n * `centered` fills the space it is given (`h-full` within a `min-h-32` floor) and\n * establishes a size container (`container-type: size`) so the default\n * `responsive` size scales the dots to that space via `cqmin` small inside a\n * narrow/short panel, large on a full-page route shell that stretches it tall.\n * The `inline` variant is not a container, so a `responsive` request there\n * renders at `sm`.\n */\nexport const Loading = forwardRef<HTMLDivElement, LoadingProps>(\n ({ size = \"responsive\", variant = \"inline\", label, className, ...props }, ref) => {\n const effectiveSize =\n variant === \"inline\" && size === \"responsive\" ? \"sm\" : size;\n const isResponsive = effectiveSize === \"responsive\";\n const dotClass = isResponsive\n ? RESPONSIVE_DOT_SIZE\n : FIXED_DOT_SIZE[effectiveSize];\n\n if (variant === \"centered\") {\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-label=\"Loading\"\n className={cn(\n \"flex h-full min-h-32 w-full flex-col items-center justify-center gap-3 text-muted-foreground\",\n \"[container-type:size]\",\n className,\n )}\n {...props}\n >\n <LoadingDots className={dotClass} />\n {label != null && (\n <span className={cn(isResponsive ? RESPONSIVE_LABEL_SIZE : \"text-sm\")}>\n {label}\n </span>\n )}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-label=\"Loading\"\n className={cn(\n \"inline-flex items-center gap-2 text-muted-foreground\",\n className,\n )}\n {...props}\n >\n <LoadingDots className={dotClass} />\n {label != null && <span className=\"text-sm\">{label}</span>}\n </div>\n );\n },\n);\nLoading.displayName = \"Loading\";\n"],"names":["forwardRef","jsxs","cn","jsx"],"mappings":";;;;;AAoBA,MAAM,iBAAqE;AAAA,EACzE,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAQA,MAAM,sBAAsB;AAC5B,MAAM,wBAAwB;AAOvB,MAAM,cAAcA,MAAAA;AAAAA,EACzB,CAAC,EAAE,WAAW,GAAG,MAAA,GAAS,QACxBC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,OAAM;AAAA,MACN,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,eAAY;AAAA,MACZ,WAAWC,MAAAA,GAAG,YAAY,SAAS;AAAA,MAClC,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAAC,+BAAC,YAAO,IAAG,KAAI,IAAG,MAAK,GAAE,KACvB,UAAAA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,eAAc;AAAA,YACd,OAAM;AAAA,YACN,KAAI;AAAA,YACJ,QAAO;AAAA,UAAA;AAAA,QAAA,GAEX;AAAA,QACAA,2BAAAA,IAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,SAAQ,OACpC,UAAAA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,eAAc;AAAA,YACd,OAAM;AAAA,YACN,KAAI;AAAA,YACJ,QAAO;AAAA,UAAA;AAAA,QAAA,GAEX;AAAA,QACAA,2BAAAA,IAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,SAAQ,OACpC,UAAAA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,eAAc;AAAA,YACd,OAAM;AAAA,YACN,KAAI;AAAA,YACJ,QAAO;AAAA,UAAA;AAAA,QAAA,EACT,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AACA,YAAY,cAAc;AAYnB,MAAM,UAAUH,MAAAA;AAAAA,EACrB,CAAC,EAAE,OAAO,cAAc,UAAU,UAAU,OAAO,WAAW,GAAG,MAAA,GAAS,QAAQ;AAChF,UAAM,gBACJ,YAAY,YAAY,SAAS,eAAe,OAAO;AACzD,UAAM,eAAe,kBAAkB;AACvC,UAAM,WAAW,eACb,sBACA,eAAe,aAAa;AAEhC,QAAI,YAAY,YAAY;AAC1B,aACEC,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA,MAAK;AAAA,UACL,cAAW;AAAA,UACX,WAAWC,MAAAA;AAAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,UAED,GAAG;AAAA,UAEJ,UAAA;AAAA,YAAAC,2BAAAA,IAAC,aAAA,EAAY,WAAW,SAAA,CAAU;AAAA,YACjC,SAAS,QACRA,+BAAC,QAAA,EAAK,WAAWD,SAAG,eAAe,wBAAwB,SAAS,GACjE,UAAA,MAAA,CACH;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAIR;AAEA,WACED,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,cAAW;AAAA,QACX,WAAWC,MAAAA;AAAAA,UACT;AAAA,UACA;AAAA,QAAA;AAAA,QAED,GAAG;AAAA,QAEJ,UAAA;AAAA,UAAAC,2BAAAA,IAAC,aAAA,EAAY,WAAW,SAAA,CAAU;AAAA,UACjC,SAAS,QAAQA,2BAAAA,IAAC,QAAA,EAAK,WAAU,WAAW,UAAA,MAAA,CAAM;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGzD;AACF;AACA,QAAQ,cAAc;;;"}
@@ -18,10 +18,12 @@ export declare const LoadingDots: import('react').ForwardRefExoticComponent<Omit
18
18
  /**
19
19
  * Loading indicator built on the shared 3-dot animation.
20
20
  *
21
- * `centered` establishes a size container (`container-type: inline-size`) so the
22
- * default `responsive` size scales the dots to the space the loader is given —
23
- * small inside a narrow panel, large on a full-page route shell. The `inline`
24
- * variant is not a container, so a `responsive` request there renders at `sm`.
21
+ * `centered` fills the space it is given (`h-full` within a `min-h-32` floor) and
22
+ * establishes a size container (`container-type: size`) so the default
23
+ * `responsive` size scales the dots to that space via `cqmin` small inside a
24
+ * narrow/short panel, large on a full-page route shell that stretches it tall.
25
+ * The `inline` variant is not a container, so a `responsive` request there
26
+ * renders at `sm`.
25
27
  */
26
28
  export declare const Loading: import('react').ForwardRefExoticComponent<LoadingProps & import('react').RefAttributes<HTMLDivElement>>;
27
29
  //# sourceMappingURL=loading.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loading.d.ts","sourceRoot":"","sources":["../../src/components/loading.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,QAAQ,EACd,MAAM,OAAO,CAAC;AAGf,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,YAAY,CAAC;AAC5D,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEnD,MAAM,WAAW,YAAa,SAAQ,cAAc,CAAC,cAAc,CAAC;IAClE,yEAAyE;IACzE,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,iFAAiF;IACjF,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,gFAAgF;IAChF,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAcD;;;;GAIG;AACH,eAAO,MAAM,WAAW,gIA0CvB,CAAC;AAGF;;;;;;;GAOG;AACH,eAAO,MAAM,OAAO,yGAgDnB,CAAC"}
1
+ {"version":3,"file":"loading.d.ts","sourceRoot":"","sources":["../../src/components/loading.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,QAAQ,EACd,MAAM,OAAO,CAAC;AAGf,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,YAAY,CAAC;AAC5D,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEnD,MAAM,WAAW,YAAa,SAAQ,cAAc,CAAC,cAAc,CAAC;IAClE,yEAAyE;IACzE,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,iFAAiF;IACjF,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,gFAAgF;IAChF,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAiBD;;;;GAIG;AACH,eAAO,MAAM,WAAW,gIA0CvB,CAAC;AAGF;;;;;;;;;GASG;AACH,eAAO,MAAM,OAAO,yGAgDnB,CAAC"}
@@ -6,8 +6,8 @@ const FIXED_DOT_SIZE = {
6
6
  md: "size-6",
7
7
  lg: "size-10"
8
8
  };
9
- const RESPONSIVE_DOT_SIZE = "size-[clamp(1.5rem,12cqi,4.5rem)]";
10
- const RESPONSIVE_LABEL_SIZE = "text-[clamp(0.7rem,4cqi,0.95rem)]";
9
+ const RESPONSIVE_DOT_SIZE = "size-[clamp(1.25rem,18cqmin,2.5rem)]";
10
+ const RESPONSIVE_LABEL_SIZE = "text-[clamp(0.72rem,4.5cqmin,0.9rem)]";
11
11
  const LoadingDots = forwardRef(
12
12
  ({ className, ...props }, ref) => /* @__PURE__ */ jsxs(
13
13
  "svg",
@@ -70,8 +70,8 @@ const Loading = forwardRef(
70
70
  role: "status",
71
71
  "aria-label": "Loading",
72
72
  className: cn(
73
- "flex min-h-32 w-full flex-col items-center justify-center gap-3 text-muted-foreground",
74
- "[container-type:inline-size]",
73
+ "flex h-full min-h-32 w-full flex-col items-center justify-center gap-3 text-muted-foreground",
74
+ "[container-type:size]",
75
75
  className
76
76
  ),
77
77
  ...props,
@@ -1 +1 @@
1
- {"version":3,"file":"loading.js","sources":["../../src/components/loading.tsx"],"sourcesContent":["import {\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n type SVGProps,\n} from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type LoadingSize = \"sm\" | \"md\" | \"lg\" | \"responsive\";\nexport type LoadingVariant = \"inline\" | \"centered\";\n\nexport interface LoadingProps extends HTMLAttributes<HTMLDivElement> {\n /** Fixed size, or `responsive` (default) to scale with the container. */\n size?: LoadingSize;\n /** `inline` for a small in-flow loader, `centered` for a section/page loader. */\n variant?: LoadingVariant;\n /** Optional caption rendered beside (inline) or beneath (centered) the dots. */\n label?: ReactNode;\n}\n\nconst FIXED_DOT_SIZE: Record<Exclude<LoadingSize, \"responsive\">, string> = {\n sm: \"size-4\",\n md: \"size-6\",\n lg: \"size-10\",\n};\n\n// Scales with the nearest `container-type` ancestor's inline size: floors at\n// 1.5rem (24px) in tight panels, climbs to 4.5rem (72px) on full-page loads,\n// interpolating smoothly between. Pure CSS — no ResizeObserver, SSR-safe.\nconst RESPONSIVE_DOT_SIZE = \"size-[clamp(1.5rem,12cqi,4.5rem)]\";\nconst RESPONSIVE_LABEL_SIZE = \"text-[clamp(0.7rem,4cqi,0.95rem)]\";\n\n/**\n * Three bouncing dots. `fill=\"currentColor\"` so the dots inherit the surrounding\n * theme text color (works in light and dark). Size is driven entirely by the\n * className (width + height); the viewBox keeps the 1:1 aspect.\n */\nexport const LoadingDots = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n ({ className, ...props }, ref) => (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n className={cn(\"shrink-0\", className)}\n {...props}\n >\n <circle cx=\"4\" cy=\"12\" r=\"3\">\n <animate\n id=\"clickyLoadDotA\"\n fill=\"freeze\"\n attributeName=\"opacity\"\n begin=\"0;clickyLoadDotC.end-0.25s\"\n dur=\"0.75s\"\n values=\"1;0.2\"\n />\n </circle>\n <circle cx=\"12\" cy=\"12\" r=\"3\" opacity=\"0.4\">\n <animate\n fill=\"freeze\"\n attributeName=\"opacity\"\n begin=\"clickyLoadDotA.begin+0.15s\"\n dur=\"0.75s\"\n values=\"1;0.2\"\n />\n </circle>\n <circle cx=\"20\" cy=\"12\" r=\"3\" opacity=\"0.3\">\n <animate\n id=\"clickyLoadDotC\"\n fill=\"freeze\"\n attributeName=\"opacity\"\n begin=\"clickyLoadDotA.begin+0.3s\"\n dur=\"0.75s\"\n values=\"1;0.2\"\n />\n </circle>\n </svg>\n ),\n);\nLoadingDots.displayName = \"LoadingDots\";\n\n/**\n * Loading indicator built on the shared 3-dot animation.\n *\n * `centered` establishes a size container (`container-type: inline-size`) so the\n * default `responsive` size scales the dots to the space the loader is given —\n * small inside a narrow panel, large on a full-page route shell. The `inline`\n * variant is not a container, so a `responsive` request there renders at `sm`.\n */\nexport const Loading = forwardRef<HTMLDivElement, LoadingProps>(\n ({ size = \"responsive\", variant = \"inline\", label, className, ...props }, ref) => {\n const effectiveSize =\n variant === \"inline\" && size === \"responsive\" ? \"sm\" : size;\n const isResponsive = effectiveSize === \"responsive\";\n const dotClass = isResponsive\n ? RESPONSIVE_DOT_SIZE\n : FIXED_DOT_SIZE[effectiveSize];\n\n if (variant === \"centered\") {\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-label=\"Loading\"\n className={cn(\n \"flex min-h-32 w-full flex-col items-center justify-center gap-3 text-muted-foreground\",\n \"[container-type:inline-size]\",\n className,\n )}\n {...props}\n >\n <LoadingDots className={dotClass} />\n {label != null && (\n <span className={cn(isResponsive ? RESPONSIVE_LABEL_SIZE : \"text-sm\")}>\n {label}\n </span>\n )}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-label=\"Loading\"\n className={cn(\n \"inline-flex items-center gap-2 text-muted-foreground\",\n className,\n )}\n {...props}\n >\n <LoadingDots className={dotClass} />\n {label != null && <span className=\"text-sm\">{label}</span>}\n </div>\n );\n },\n);\nLoading.displayName = \"Loading\";\n"],"names":[],"mappings":";;;AAoBA,MAAM,iBAAqE;AAAA,EACzE,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAKA,MAAM,sBAAsB;AAC5B,MAAM,wBAAwB;AAOvB,MAAM,cAAc;AAAA,EACzB,CAAC,EAAE,WAAW,GAAG,MAAA,GAAS,QACxB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,OAAM;AAAA,MACN,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,eAAY;AAAA,MACZ,WAAW,GAAG,YAAY,SAAS;AAAA,MAClC,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAA,oBAAC,YAAO,IAAG,KAAI,IAAG,MAAK,GAAE,KACvB,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,eAAc;AAAA,YACd,OAAM;AAAA,YACN,KAAI;AAAA,YACJ,QAAO;AAAA,UAAA;AAAA,QAAA,GAEX;AAAA,QACA,oBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,SAAQ,OACpC,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,eAAc;AAAA,YACd,OAAM;AAAA,YACN,KAAI;AAAA,YACJ,QAAO;AAAA,UAAA;AAAA,QAAA,GAEX;AAAA,QACA,oBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,SAAQ,OACpC,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,eAAc;AAAA,YACd,OAAM;AAAA,YACN,KAAI;AAAA,YACJ,QAAO;AAAA,UAAA;AAAA,QAAA,EACT,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AACA,YAAY,cAAc;AAUnB,MAAM,UAAU;AAAA,EACrB,CAAC,EAAE,OAAO,cAAc,UAAU,UAAU,OAAO,WAAW,GAAG,MAAA,GAAS,QAAQ;AAChF,UAAM,gBACJ,YAAY,YAAY,SAAS,eAAe,OAAO;AACzD,UAAM,eAAe,kBAAkB;AACvC,UAAM,WAAW,eACb,sBACA,eAAe,aAAa;AAEhC,QAAI,YAAY,YAAY;AAC1B,aACE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA,MAAK;AAAA,UACL,cAAW;AAAA,UACX,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,UAED,GAAG;AAAA,UAEJ,UAAA;AAAA,YAAA,oBAAC,aAAA,EAAY,WAAW,SAAA,CAAU;AAAA,YACjC,SAAS,QACR,oBAAC,QAAA,EAAK,WAAW,GAAG,eAAe,wBAAwB,SAAS,GACjE,UAAA,MAAA,CACH;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAIR;AAEA,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,cAAW;AAAA,QACX,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QAAA;AAAA,QAED,GAAG;AAAA,QAEJ,UAAA;AAAA,UAAA,oBAAC,aAAA,EAAY,WAAW,SAAA,CAAU;AAAA,UACjC,SAAS,QAAQ,oBAAC,QAAA,EAAK,WAAU,WAAW,UAAA,MAAA,CAAM;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGzD;AACF;AACA,QAAQ,cAAc;"}
1
+ {"version":3,"file":"loading.js","sources":["../../src/components/loading.tsx"],"sourcesContent":["import {\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n type SVGProps,\n} from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type LoadingSize = \"sm\" | \"md\" | \"lg\" | \"responsive\";\nexport type LoadingVariant = \"inline\" | \"centered\";\n\nexport interface LoadingProps extends HTMLAttributes<HTMLDivElement> {\n /** Fixed size, or `responsive` (default) to scale with the container. */\n size?: LoadingSize;\n /** `inline` for a small in-flow loader, `centered` for a section/page loader. */\n variant?: LoadingVariant;\n /** Optional caption rendered beside (inline) or beneath (centered) the dots. */\n label?: ReactNode;\n}\n\nconst FIXED_DOT_SIZE: Record<Exclude<LoadingSize, \"responsive\">, string> = {\n sm: \"size-4\",\n md: \"size-6\",\n lg: \"size-10\",\n};\n\n// Scales with the SMALLER of the container's two dimensions (`cqmin`, enabled by\n// `container-type: size` on the centered wrapper). Using `cqmin` rather than the\n// width alone means a wide-but-short panel reads as small — only a genuinely\n// large area (a full-page load) grows the dots. Floors at 1.25rem (20px) in\n// tight panels, climbs to 2.5rem (40px) on big loads. Pure CSS — no\n// ResizeObserver, SSR-safe.\nconst RESPONSIVE_DOT_SIZE = \"size-[clamp(1.25rem,18cqmin,2.5rem)]\";\nconst RESPONSIVE_LABEL_SIZE = \"text-[clamp(0.72rem,4.5cqmin,0.9rem)]\";\n\n/**\n * Three bouncing dots. `fill=\"currentColor\"` so the dots inherit the surrounding\n * theme text color (works in light and dark). Size is driven entirely by the\n * className (width + height); the viewBox keeps the 1:1 aspect.\n */\nexport const LoadingDots = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n ({ className, ...props }, ref) => (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n className={cn(\"shrink-0\", className)}\n {...props}\n >\n <circle cx=\"4\" cy=\"12\" r=\"3\">\n <animate\n id=\"clickyLoadDotA\"\n fill=\"freeze\"\n attributeName=\"opacity\"\n begin=\"0;clickyLoadDotC.end-0.25s\"\n dur=\"0.75s\"\n values=\"1;0.2\"\n />\n </circle>\n <circle cx=\"12\" cy=\"12\" r=\"3\" opacity=\"0.4\">\n <animate\n fill=\"freeze\"\n attributeName=\"opacity\"\n begin=\"clickyLoadDotA.begin+0.15s\"\n dur=\"0.75s\"\n values=\"1;0.2\"\n />\n </circle>\n <circle cx=\"20\" cy=\"12\" r=\"3\" opacity=\"0.3\">\n <animate\n id=\"clickyLoadDotC\"\n fill=\"freeze\"\n attributeName=\"opacity\"\n begin=\"clickyLoadDotA.begin+0.3s\"\n dur=\"0.75s\"\n values=\"1;0.2\"\n />\n </circle>\n </svg>\n ),\n);\nLoadingDots.displayName = \"LoadingDots\";\n\n/**\n * Loading indicator built on the shared 3-dot animation.\n *\n * `centered` fills the space it is given (`h-full` within a `min-h-32` floor) and\n * establishes a size container (`container-type: size`) so the default\n * `responsive` size scales the dots to that space via `cqmin` small inside a\n * narrow/short panel, large on a full-page route shell that stretches it tall.\n * The `inline` variant is not a container, so a `responsive` request there\n * renders at `sm`.\n */\nexport const Loading = forwardRef<HTMLDivElement, LoadingProps>(\n ({ size = \"responsive\", variant = \"inline\", label, className, ...props }, ref) => {\n const effectiveSize =\n variant === \"inline\" && size === \"responsive\" ? \"sm\" : size;\n const isResponsive = effectiveSize === \"responsive\";\n const dotClass = isResponsive\n ? RESPONSIVE_DOT_SIZE\n : FIXED_DOT_SIZE[effectiveSize];\n\n if (variant === \"centered\") {\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-label=\"Loading\"\n className={cn(\n \"flex h-full min-h-32 w-full flex-col items-center justify-center gap-3 text-muted-foreground\",\n \"[container-type:size]\",\n className,\n )}\n {...props}\n >\n <LoadingDots className={dotClass} />\n {label != null && (\n <span className={cn(isResponsive ? RESPONSIVE_LABEL_SIZE : \"text-sm\")}>\n {label}\n </span>\n )}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-label=\"Loading\"\n className={cn(\n \"inline-flex items-center gap-2 text-muted-foreground\",\n className,\n )}\n {...props}\n >\n <LoadingDots className={dotClass} />\n {label != null && <span className=\"text-sm\">{label}</span>}\n </div>\n );\n },\n);\nLoading.displayName = \"Loading\";\n"],"names":[],"mappings":";;;AAoBA,MAAM,iBAAqE;AAAA,EACzE,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAQA,MAAM,sBAAsB;AAC5B,MAAM,wBAAwB;AAOvB,MAAM,cAAc;AAAA,EACzB,CAAC,EAAE,WAAW,GAAG,MAAA,GAAS,QACxB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,OAAM;AAAA,MACN,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,eAAY;AAAA,MACZ,WAAW,GAAG,YAAY,SAAS;AAAA,MAClC,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAA,oBAAC,YAAO,IAAG,KAAI,IAAG,MAAK,GAAE,KACvB,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,eAAc;AAAA,YACd,OAAM;AAAA,YACN,KAAI;AAAA,YACJ,QAAO;AAAA,UAAA;AAAA,QAAA,GAEX;AAAA,QACA,oBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,SAAQ,OACpC,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,eAAc;AAAA,YACd,OAAM;AAAA,YACN,KAAI;AAAA,YACJ,QAAO;AAAA,UAAA;AAAA,QAAA,GAEX;AAAA,QACA,oBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,SAAQ,OACpC,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,eAAc;AAAA,YACd,OAAM;AAAA,YACN,KAAI;AAAA,YACJ,QAAO;AAAA,UAAA;AAAA,QAAA,EACT,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AACA,YAAY,cAAc;AAYnB,MAAM,UAAU;AAAA,EACrB,CAAC,EAAE,OAAO,cAAc,UAAU,UAAU,OAAO,WAAW,GAAG,MAAA,GAAS,QAAQ;AAChF,UAAM,gBACJ,YAAY,YAAY,SAAS,eAAe,OAAO;AACzD,UAAM,eAAe,kBAAkB;AACvC,UAAM,WAAW,eACb,sBACA,eAAe,aAAa;AAEhC,QAAI,YAAY,YAAY;AAC1B,aACE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA,MAAK;AAAA,UACL,cAAW;AAAA,UACX,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,UAED,GAAG;AAAA,UAEJ,UAAA;AAAA,YAAA,oBAAC,aAAA,EAAY,WAAW,SAAA,CAAU;AAAA,YACjC,SAAS,QACR,oBAAC,QAAA,EAAK,WAAW,GAAG,eAAe,wBAAwB,SAAS,GACjE,UAAA,MAAA,CACH;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAIR;AAEA,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,cAAW;AAAA,QACX,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QAAA;AAAA,QAED,GAAG;AAAA,QAEJ,UAAA;AAAA,UAAA,oBAAC,aAAA,EAAY,WAAW,SAAA,CAAU;AAAA,UACjC,SAAS,QAAQ,oBAAC,QAAA,EAAK,WAAU,WAAW,UAAA,MAAA,CAAM;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGzD;AACF;AACA,QAAQ,cAAc;"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const react = require("react");
4
+ function useForm({ values, validate, onSubmit }) {
5
+ const [touched, setTouched] = react.useState({});
6
+ const [submitted, setSubmitted] = react.useState(false);
7
+ const errors = react.useMemo(() => validate(values), [validate, values]);
8
+ const isValid = react.useMemo(() => !Object.values(errors).some(Boolean), [errors]);
9
+ const fieldError = react.useCallback(
10
+ (key) => submitted || touched[key] ? errors[key] : void 0,
11
+ [submitted, touched, errors]
12
+ );
13
+ const markTouched = react.useCallback((key) => {
14
+ setTouched((prev) => prev[key] ? prev : { ...prev, [key]: true });
15
+ }, []);
16
+ const submit = react.useCallback(() => {
17
+ setSubmitted(true);
18
+ if (isValid) onSubmit == null ? void 0 : onSubmit(values);
19
+ }, [isValid, onSubmit, values]);
20
+ const reset = react.useCallback(() => {
21
+ setTouched({});
22
+ setSubmitted(false);
23
+ }, []);
24
+ return { errors, isValid, submitted, fieldError, markTouched, submit, reset };
25
+ }
26
+ exports.useForm = useForm;
27
+ //# sourceMappingURL=use-form.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-form.cjs","sources":["../../src/components/use-form.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\n\n// FieldErrors maps a field key to its current validation message (or undefined\n// when the field is valid). validate() returns the full map every call so a form\n// can show every problem at once, not just the first.\nexport type FieldErrors = Record<string, string | undefined>;\n\nexport interface UseFormOptions<V> {\n /** The current form values (owned by the caller). */\n values: V;\n /** Pure validator returning all field errors for the given values. */\n validate: (values: V) => FieldErrors;\n /** Called by submit() only when the form is valid. */\n onSubmit?: (values: V) => void;\n}\n\nexport interface UseFormResult {\n /** Every field's error (independent of touched/submitted). */\n errors: FieldErrors;\n /** True when no field has an error. */\n isValid: boolean;\n /** True once submit() has been called (reveals all errors). */\n submitted: boolean;\n /**\n * The error to display for a field: present only once the field has been\n * touched (blurred) or submit() has run, so a pristine form isn't all red.\n */\n fieldError: (key: string) => string | undefined;\n /** Mark a field touched — wire to a field's onBlur. */\n markTouched: (key: string) => void;\n /** Reveal all errors; run onSubmit only when valid. */\n submit: () => void;\n /** Clear touched + submitted state (e.g. when a dialog reopens). */\n reset: () => void;\n}\n\n// useForm centralizes the touched/submitted/error bookkeeping a hand-built form\n// needs: it computes per-field errors from the caller's validate(), and gates\n// their display so each error surfaces on blur or on submit. The form values\n// stay owned by the caller (this hook does not store them), so it composes with\n// conditional fields and bespoke layouts.\nexport function useForm<V>({ values, validate, onSubmit }: UseFormOptions<V>): UseFormResult {\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n const [submitted, setSubmitted] = useState(false);\n\n const errors = useMemo(() => validate(values), [validate, values]);\n const isValid = useMemo(() => !Object.values(errors).some(Boolean), [errors]);\n\n const fieldError = useCallback(\n (key: string) => (submitted || touched[key] ? errors[key] : undefined),\n [submitted, touched, errors],\n );\n\n const markTouched = useCallback((key: string) => {\n setTouched((prev) => (prev[key] ? prev : { ...prev, [key]: true }));\n }, []);\n\n const submit = useCallback(() => {\n setSubmitted(true);\n if (isValid) onSubmit?.(values);\n }, [isValid, onSubmit, values]);\n\n const reset = useCallback(() => {\n setTouched({});\n setSubmitted(false);\n }, []);\n\n return { errors, isValid, submitted, fieldError, markTouched, submit, reset };\n}\n"],"names":["useState","useMemo","useCallback"],"mappings":";;;AAyCO,SAAS,QAAW,EAAE,QAAQ,UAAU,YAA8C;AAC3F,QAAM,CAAC,SAAS,UAAU,IAAIA,MAAAA,SAAkC,CAAA,CAAE;AAClE,QAAM,CAAC,WAAW,YAAY,IAAIA,MAAAA,SAAS,KAAK;AAEhD,QAAM,SAASC,MAAAA,QAAQ,MAAM,SAAS,MAAM,GAAG,CAAC,UAAU,MAAM,CAAC;AACjE,QAAM,UAAUA,MAAAA,QAAQ,MAAM,CAAC,OAAO,OAAO,MAAM,EAAE,KAAK,OAAO,GAAG,CAAC,MAAM,CAAC;AAE5E,QAAM,aAAaC,MAAAA;AAAAA,IACjB,CAAC,QAAiB,aAAa,QAAQ,GAAG,IAAI,OAAO,GAAG,IAAI;AAAA,IAC5D,CAAC,WAAW,SAAS,MAAM;AAAA,EAAA;AAG7B,QAAM,cAAcA,kBAAY,CAAC,QAAgB;AAC/C,eAAW,CAAC,SAAU,KAAK,GAAG,IAAI,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,MAAO;AAAA,EACpE,GAAG,CAAA,CAAE;AAEL,QAAM,SAASA,MAAAA,YAAY,MAAM;AAC/B,iBAAa,IAAI;AACjB,QAAI,8CAAoB;AAAA,EAC1B,GAAG,CAAC,SAAS,UAAU,MAAM,CAAC;AAE9B,QAAM,QAAQA,MAAAA,YAAY,MAAM;AAC9B,eAAW,CAAA,CAAE;AACb,iBAAa,KAAK;AAAA,EACpB,GAAG,CAAA,CAAE;AAEL,SAAO,EAAE,QAAQ,SAAS,WAAW,YAAY,aAAa,QAAQ,MAAA;AACxE;;"}
@@ -0,0 +1,30 @@
1
+ export type FieldErrors = Record<string, string | undefined>;
2
+ export interface UseFormOptions<V> {
3
+ /** The current form values (owned by the caller). */
4
+ values: V;
5
+ /** Pure validator returning all field errors for the given values. */
6
+ validate: (values: V) => FieldErrors;
7
+ /** Called by submit() only when the form is valid. */
8
+ onSubmit?: (values: V) => void;
9
+ }
10
+ export interface UseFormResult {
11
+ /** Every field's error (independent of touched/submitted). */
12
+ errors: FieldErrors;
13
+ /** True when no field has an error. */
14
+ isValid: boolean;
15
+ /** True once submit() has been called (reveals all errors). */
16
+ submitted: boolean;
17
+ /**
18
+ * The error to display for a field: present only once the field has been
19
+ * touched (blurred) or submit() has run, so a pristine form isn't all red.
20
+ */
21
+ fieldError: (key: string) => string | undefined;
22
+ /** Mark a field touched — wire to a field's onBlur. */
23
+ markTouched: (key: string) => void;
24
+ /** Reveal all errors; run onSubmit only when valid. */
25
+ submit: () => void;
26
+ /** Clear touched + submitted state (e.g. when a dialog reopens). */
27
+ reset: () => void;
28
+ }
29
+ export declare function useForm<V>({ values, validate, onSubmit }: UseFormOptions<V>): UseFormResult;
30
+ //# sourceMappingURL=use-form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-form.d.ts","sourceRoot":"","sources":["../../src/components/use-form.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAE7D,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,qDAAqD;IACrD,MAAM,EAAE,CAAC,CAAC;IACV,sEAAsE;IACtE,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,WAAW,CAAC;IACrC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,8DAA8D;IAC9D,MAAM,EAAE,WAAW,CAAC;IACpB,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,+DAA+D;IAC/D,SAAS,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAChD,uDAAuD;IACvD,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,uDAAuD;IACvD,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,oEAAoE;IACpE,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAOD,wBAAgB,OAAO,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,aAAa,CA2B3F"}
@@ -0,0 +1,27 @@
1
+ import { useState, useMemo, useCallback } from "react";
2
+ function useForm({ values, validate, onSubmit }) {
3
+ const [touched, setTouched] = useState({});
4
+ const [submitted, setSubmitted] = useState(false);
5
+ const errors = useMemo(() => validate(values), [validate, values]);
6
+ const isValid = useMemo(() => !Object.values(errors).some(Boolean), [errors]);
7
+ const fieldError = useCallback(
8
+ (key) => submitted || touched[key] ? errors[key] : void 0,
9
+ [submitted, touched, errors]
10
+ );
11
+ const markTouched = useCallback((key) => {
12
+ setTouched((prev) => prev[key] ? prev : { ...prev, [key]: true });
13
+ }, []);
14
+ const submit = useCallback(() => {
15
+ setSubmitted(true);
16
+ if (isValid) onSubmit == null ? void 0 : onSubmit(values);
17
+ }, [isValid, onSubmit, values]);
18
+ const reset = useCallback(() => {
19
+ setTouched({});
20
+ setSubmitted(false);
21
+ }, []);
22
+ return { errors, isValid, submitted, fieldError, markTouched, submit, reset };
23
+ }
24
+ export {
25
+ useForm
26
+ };
27
+ //# sourceMappingURL=use-form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-form.js","sources":["../../src/components/use-form.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\n\n// FieldErrors maps a field key to its current validation message (or undefined\n// when the field is valid). validate() returns the full map every call so a form\n// can show every problem at once, not just the first.\nexport type FieldErrors = Record<string, string | undefined>;\n\nexport interface UseFormOptions<V> {\n /** The current form values (owned by the caller). */\n values: V;\n /** Pure validator returning all field errors for the given values. */\n validate: (values: V) => FieldErrors;\n /** Called by submit() only when the form is valid. */\n onSubmit?: (values: V) => void;\n}\n\nexport interface UseFormResult {\n /** Every field's error (independent of touched/submitted). */\n errors: FieldErrors;\n /** True when no field has an error. */\n isValid: boolean;\n /** True once submit() has been called (reveals all errors). */\n submitted: boolean;\n /**\n * The error to display for a field: present only once the field has been\n * touched (blurred) or submit() has run, so a pristine form isn't all red.\n */\n fieldError: (key: string) => string | undefined;\n /** Mark a field touched — wire to a field's onBlur. */\n markTouched: (key: string) => void;\n /** Reveal all errors; run onSubmit only when valid. */\n submit: () => void;\n /** Clear touched + submitted state (e.g. when a dialog reopens). */\n reset: () => void;\n}\n\n// useForm centralizes the touched/submitted/error bookkeeping a hand-built form\n// needs: it computes per-field errors from the caller's validate(), and gates\n// their display so each error surfaces on blur or on submit. The form values\n// stay owned by the caller (this hook does not store them), so it composes with\n// conditional fields and bespoke layouts.\nexport function useForm<V>({ values, validate, onSubmit }: UseFormOptions<V>): UseFormResult {\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n const [submitted, setSubmitted] = useState(false);\n\n const errors = useMemo(() => validate(values), [validate, values]);\n const isValid = useMemo(() => !Object.values(errors).some(Boolean), [errors]);\n\n const fieldError = useCallback(\n (key: string) => (submitted || touched[key] ? errors[key] : undefined),\n [submitted, touched, errors],\n );\n\n const markTouched = useCallback((key: string) => {\n setTouched((prev) => (prev[key] ? prev : { ...prev, [key]: true }));\n }, []);\n\n const submit = useCallback(() => {\n setSubmitted(true);\n if (isValid) onSubmit?.(values);\n }, [isValid, onSubmit, values]);\n\n const reset = useCallback(() => {\n setTouched({});\n setSubmitted(false);\n }, []);\n\n return { errors, isValid, submitted, fieldError, markTouched, submit, reset };\n}\n"],"names":[],"mappings":";AAyCO,SAAS,QAAW,EAAE,QAAQ,UAAU,YAA8C;AAC3F,QAAM,CAAC,SAAS,UAAU,IAAI,SAAkC,CAAA,CAAE;AAClE,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAEhD,QAAM,SAAS,QAAQ,MAAM,SAAS,MAAM,GAAG,CAAC,UAAU,MAAM,CAAC;AACjE,QAAM,UAAU,QAAQ,MAAM,CAAC,OAAO,OAAO,MAAM,EAAE,KAAK,OAAO,GAAG,CAAC,MAAM,CAAC;AAE5E,QAAM,aAAa;AAAA,IACjB,CAAC,QAAiB,aAAa,QAAQ,GAAG,IAAI,OAAO,GAAG,IAAI;AAAA,IAC5D,CAAC,WAAW,SAAS,MAAM;AAAA,EAAA;AAG7B,QAAM,cAAc,YAAY,CAAC,QAAgB;AAC/C,eAAW,CAAC,SAAU,KAAK,GAAG,IAAI,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,MAAO;AAAA,EACpE,GAAG,CAAA,CAAE;AAEL,QAAM,SAAS,YAAY,MAAM;AAC/B,iBAAa,IAAI;AACjB,QAAI,8CAAoB;AAAA,EAC1B,GAAG,CAAC,SAAS,UAAU,MAAM,CAAC;AAE9B,QAAM,QAAQ,YAAY,MAAM;AAC9B,eAAW,CAAA,CAAE;AACb,iBAAa,KAAK;AAAA,EACpB,GAAG,CAAA,CAAE;AAEL,SAAO,EAAE,QAAQ,SAAS,WAAW,YAAY,aAAa,QAAQ,MAAA;AACxE;"}
@@ -16,6 +16,8 @@ const FilterBar = require("./components/FilterBar.cjs");
16
16
  const MultiSelect = require("./components/MultiSelect.cjs");
17
17
  const select = require("./components/select.cjs");
18
18
  const Combobox = require("./components/Combobox.cjs");
19
+ const Field = require("./components/Field.cjs");
20
+ const useForm = require("./components/use-form.cjs");
19
21
  const TreePickerField = require("./components/TreePickerField.cjs");
20
22
  const WorkloadPicker = require("./components/WorkloadPicker.cjs");
21
23
  const workloadPickerUtils = require("./components/workload-picker-utils.cjs");
@@ -32,6 +34,7 @@ const Section = require("./layout/Section.cjs");
32
34
  const DropdownMenu = require("./overlay/DropdownMenu.cjs");
33
35
  const HoverCard = require("./overlay/HoverCard.cjs");
34
36
  const Modal = require("./overlay/Modal.cjs");
37
+ const modalStack = require("./overlay/modalStack.cjs");
35
38
  exports.Button = button.Button;
36
39
  exports.Loading = loading.Loading;
37
40
  exports.LoadingDots = loading.LoadingDots;
@@ -46,9 +49,12 @@ exports.DateTimePicker = DateTimePicker.DateTimePicker;
46
49
  exports.TimeRange = TimeRange.TimeRange;
47
50
  exports.RangeSlider = RangeSlider.RangeSlider;
48
51
  exports.FilterBar = FilterBar.FilterBar;
52
+ exports.applyFilterExtensions = FilterBar.applyFilterExtensions;
49
53
  exports.MultiSelect = MultiSelect.MultiSelect;
50
54
  exports.Select = select.Select;
51
55
  exports.Combobox = Combobox.Combobox;
56
+ exports.Field = Field.Field;
57
+ exports.useForm = useForm.useForm;
52
58
  exports.TreePickerField = TreePickerField.TreePickerField;
53
59
  exports.WorkloadPicker = WorkloadPicker.WorkloadPicker;
54
60
  exports.kindForValue = workloadPickerUtils.kindForValue;
@@ -74,4 +80,5 @@ exports.Section = Section.Section;
74
80
  exports.DropdownMenu = DropdownMenu.DropdownMenu;
75
81
  exports.HoverCard = HoverCard.HoverCard;
76
82
  exports.Modal = Modal.Modal;
83
+ exports.useModalStack = modalStack.useModalStack;
77
84
  //# sourceMappingURL=components.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"components.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"components.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -10,10 +10,12 @@ export { DatePicker, type DatePickerProps } from './components/DatePicker';
10
10
  export { DateTimePicker, type DateTimePickerProps } from './components/DateTimePicker';
11
11
  export { TimeRange, type TimeRangeKind, type TimeRangePreset, type TimeRangePresetGroup, type TimeRangeProps, } from './components/TimeRange';
12
12
  export { RangeSlider, type RangeSliderProps, type RangeSliderValue, } from './components/RangeSlider';
13
- export { FilterBar, type FilterBarBooleanFilter, type FilterBarEnumFilter, type FilterBarFilter, type FilterBarLookupFilter, type FilterBarLookupInputType, type FilterBarLookupMultiFilter, type FilterBarLookupOption, type FilterBarMultiFilter, type FilterBarMultiFilterMode, type FilterBarNestedMultiFilter, type FilterBarNestedMultiGroup, type FilterBarNumberFilter, type FilterBarNumberValue, type FilterBarProps, type FilterBarRangePreset, type FilterBarRangeProps, type FilterBarSearchProps, type FilterBarSelectMultiFilter, type FilterBarTextFilter, } from './components/FilterBar';
13
+ export { FilterBar, applyFilterExtensions, type FilterExtension, type FilterBarBooleanFilter, type FilterBarEnumFilter, type FilterBarFilter, type FilterBarLookupFilter, type FilterBarLookupInputType, type FilterBarLookupMultiFilter, type FilterBarLookupOption, type FilterBarMultiFilter, type FilterBarMultiFilterMode, type FilterBarNestedMultiFilter, type FilterBarNestedMultiGroup, type FilterBarNumberFilter, type FilterBarNumberValue, type FilterBarProps, type FilterBarRangePreset, type FilterBarRangeProps, type FilterBarSearchProps, type FilterBarSelectMultiFilter, type FilterBarTextFilter, } from './components/FilterBar';
14
14
  export { MultiSelect, type MultiSelectOption, type MultiSelectProps, } from './components/MultiSelect';
15
15
  export { Select, type SelectProps, type SelectOption } from './components/select';
16
16
  export { Combobox, type ComboboxProps, type ComboboxOption, type ComboboxSingleProps, type ComboboxMultiProps, } from './components/Combobox';
17
+ export { Field, type FieldProps } from './components/Field';
18
+ export { useForm, type UseFormOptions, type UseFormResult, type FieldErrors, } from './components/use-form';
17
19
  export { TreePickerField, type TreePickerFieldProps } from './components/TreePickerField';
18
20
  export { WorkloadPicker, type WorkloadPickerProps } from './components/WorkloadPicker';
19
21
  export { workloadKey, parseWorkloadKey, kindForValue, loadedWorkloads, type WorkloadKind, type WorkloadResource, type ParsedWorkloadKey, } from './components/workload-picker-utils';
@@ -33,4 +35,5 @@ export { Section, DetailEmptyState, type SectionProps, type DetailEmptyStateProp
33
35
  export { DropdownMenu, type DropdownMenuProps, type DropdownMenuItem, } from './overlay/DropdownMenu';
34
36
  export { HoverCard, type HoverCardProps, type HoverCardPlacement } from './overlay/HoverCard';
35
37
  export { Modal, type ModalProps, type ModalSize } from './overlay/Modal';
38
+ export { useModalStack, type ModalStackPosition } from './overlay/modalStack';
36
39
  //# sourceMappingURL=components.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../src/components.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../src/components.ts"],"names":[],"mappings":"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"}
@@ -10,10 +10,12 @@ import { DatePicker } from "./components/DatePicker.js";
10
10
  import { DateTimePicker } from "./components/DateTimePicker.js";
11
11
  import { TimeRange } from "./components/TimeRange.js";
12
12
  import { RangeSlider } from "./components/RangeSlider.js";
13
- import { FilterBar } from "./components/FilterBar.js";
13
+ import { FilterBar, applyFilterExtensions } from "./components/FilterBar.js";
14
14
  import { MultiSelect } from "./components/MultiSelect.js";
15
15
  import { Select } from "./components/select.js";
16
16
  import { Combobox } from "./components/Combobox.js";
17
+ import { Field } from "./components/Field.js";
18
+ import { useForm } from "./components/use-form.js";
17
19
  import { TreePickerField } from "./components/TreePickerField.js";
18
20
  import { WorkloadPicker } from "./components/WorkloadPicker.js";
19
21
  import { kindForValue, loadedWorkloads, parseWorkloadKey, workloadKey } from "./components/workload-picker-utils.js";
@@ -30,6 +32,7 @@ import { DetailEmptyState, Section } from "./layout/Section.js";
30
32
  import { DropdownMenu } from "./overlay/DropdownMenu.js";
31
33
  import { HoverCard } from "./overlay/HoverCard.js";
32
34
  import { Modal } from "./overlay/Modal.js";
35
+ import { useModalStack } from "./overlay/modalStack.js";
33
36
  export {
34
37
  Button,
35
38
  CLICKY_FORMAT_OPTIONS,
@@ -42,6 +45,7 @@ export {
42
45
  DensitySwitcher,
43
46
  DetailEmptyState,
44
47
  DropdownMenu,
48
+ Field,
45
49
  FilterBar,
46
50
  FormatOptionsDropdown,
47
51
  HoverCard,
@@ -62,6 +66,7 @@ export {
62
66
  TimeRange,
63
67
  TreePickerField,
64
68
  WorkloadPicker,
69
+ applyFilterExtensions,
65
70
  buttonVariants,
66
71
  effectiveProperties,
67
72
  isOpenStringMap,
@@ -71,6 +76,8 @@ export {
71
76
  parseWorkloadKey,
72
77
  readPreferences,
73
78
  resolveControl,
79
+ useForm,
80
+ useModalStack,
74
81
  workloadKey,
75
82
  writePreferences
76
83
  };
@@ -1 +1 @@
1
- {"version":3,"file":"components.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"components.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -15,9 +15,9 @@ function detectMode() {
15
15
  }
16
16
  function getVersionInfo() {
17
17
  return {
18
- commit: read(() => "9003843", ""),
19
- tag: read(() => "clicky-ui@0.2.14", ""),
20
- date: read(() => "2026-06-11T06:28:27.843Z", ""),
18
+ commit: read(() => "815fc3b", ""),
19
+ tag: read(() => "clicky-ui@0.2.15", ""),
20
+ date: read(() => "2026-06-11T10:01:07.060Z", ""),
21
21
  dirty: read(() => true, false),
22
22
  mode: detectMode()
23
23
  };
@@ -13,9 +13,9 @@ function detectMode() {
13
13
  }
14
14
  function getVersionInfo() {
15
15
  return {
16
- commit: read(() => "9003843", ""),
17
- tag: read(() => "clicky-ui@0.2.14", ""),
18
- date: read(() => "2026-06-11T06:28:15.522Z", ""),
16
+ commit: read(() => "815fc3b", ""),
17
+ tag: read(() => "clicky-ui@0.2.15", ""),
18
+ date: read(() => "2026-06-11T10:00:55.956Z", ""),
19
19
  dirty: read(() => true, false),
20
20
  mode: detectMode()
21
21
  };
package/dist/index.cjs CHANGED
@@ -27,6 +27,8 @@ const FilterBar = require("./components/FilterBar.cjs");
27
27
  const MultiSelect = require("./components/MultiSelect.cjs");
28
28
  const select = require("./components/select.cjs");
29
29
  const Combobox = require("./components/Combobox.cjs");
30
+ const Field = require("./components/Field.cjs");
31
+ const useForm = require("./components/use-form.cjs");
30
32
  const TreePickerField = require("./components/TreePickerField.cjs");
31
33
  const WorkloadPicker = require("./components/WorkloadPicker.cjs");
32
34
  const workloadPickerUtils = require("./components/workload-picker-utils.cjs");
@@ -43,6 +45,7 @@ const Section = require("./layout/Section.cjs");
43
45
  const DropdownMenu = require("./overlay/DropdownMenu.cjs");
44
46
  const HoverCard = require("./overlay/HoverCard.cjs");
45
47
  const Modal = require("./overlay/Modal.cjs");
48
+ const modalStack = require("./overlay/modalStack.cjs");
46
49
  const AnsiHtml = require("./data/AnsiHtml.cjs");
47
50
  const Avatar = require("./data/Avatar.cjs");
48
51
  const AvatarBadge = require("./data/AvatarBadge.cjs");
@@ -433,9 +436,12 @@ exports.DateTimePicker = DateTimePicker.DateTimePicker;
433
436
  exports.TimeRange = TimeRange.TimeRange;
434
437
  exports.RangeSlider = RangeSlider.RangeSlider;
435
438
  exports.FilterBar = FilterBar.FilterBar;
439
+ exports.applyFilterExtensions = FilterBar.applyFilterExtensions;
436
440
  exports.MultiSelect = MultiSelect.MultiSelect;
437
441
  exports.Select = select.Select;
438
442
  exports.Combobox = Combobox.Combobox;
443
+ exports.Field = Field.Field;
444
+ exports.useForm = useForm.useForm;
439
445
  exports.TreePickerField = TreePickerField.TreePickerField;
440
446
  exports.WorkloadPicker = WorkloadPicker.WorkloadPicker;
441
447
  exports.kindForValue = workloadPickerUtils.kindForValue;
@@ -461,6 +467,7 @@ exports.Section = Section.Section;
461
467
  exports.DropdownMenu = DropdownMenu.DropdownMenu;
462
468
  exports.HoverCard = HoverCard.HoverCard;
463
469
  exports.Modal = Modal.Modal;
470
+ exports.useModalStack = modalStack.useModalStack;
464
471
  exports.AnsiHtml = AnsiHtml.AnsiHtml;
465
472
  exports.Avatar = Avatar.Avatar;
466
473
  exports.AvatarBadge = AvatarBadge.AvatarBadge;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.js CHANGED
@@ -21,10 +21,12 @@ import { DatePicker } from "./components/DatePicker.js";
21
21
  import { DateTimePicker } from "./components/DateTimePicker.js";
22
22
  import { TimeRange } from "./components/TimeRange.js";
23
23
  import { RangeSlider } from "./components/RangeSlider.js";
24
- import { FilterBar } from "./components/FilterBar.js";
24
+ import { FilterBar, applyFilterExtensions } from "./components/FilterBar.js";
25
25
  import { MultiSelect } from "./components/MultiSelect.js";
26
26
  import { Select } from "./components/select.js";
27
27
  import { Combobox } from "./components/Combobox.js";
28
+ import { Field } from "./components/Field.js";
29
+ import { useForm } from "./components/use-form.js";
28
30
  import { TreePickerField } from "./components/TreePickerField.js";
29
31
  import { WorkloadPicker } from "./components/WorkloadPicker.js";
30
32
  import { kindForValue, loadedWorkloads, parseWorkloadKey, workloadKey } from "./components/workload-picker-utils.js";
@@ -41,6 +43,7 @@ import { DetailEmptyState, Section } from "./layout/Section.js";
41
43
  import { DropdownMenu } from "./overlay/DropdownMenu.js";
42
44
  import { HoverCard } from "./overlay/HoverCard.js";
43
45
  import { Modal } from "./overlay/Modal.js";
46
+ import { useModalStack } from "./overlay/modalStack.js";
44
47
  import { AnsiHtml } from "./data/AnsiHtml.js";
45
48
  import { Avatar } from "./data/Avatar.js";
46
49
  import { AvatarBadge } from "./data/AvatarBadge.js";
@@ -435,6 +438,7 @@ export {
435
438
  EndpointList,
436
439
  EntityExplorerApp,
437
440
  ErrorDetails,
441
+ Field,
438
442
  FilterBar,
439
443
  FilterForm,
440
444
  FilterPill,
@@ -1006,6 +1010,7 @@ export {
1006
1010
  Version,
1007
1011
  WorkloadPicker,
1008
1012
  allGroupsTerminal,
1013
+ applyFilterExtensions,
1009
1014
  badgeVariants,
1010
1015
  bucketTasks,
1011
1016
  buttonVariants,
@@ -1108,7 +1113,9 @@ export {
1108
1113
  totalDuration,
1109
1114
  useDensity,
1110
1115
  useDensityValue,
1116
+ useForm,
1111
1117
  useHistoryRoute,
1118
+ useModalStack,
1112
1119
  useOpenAPI,
1113
1120
  useOperationById,
1114
1121
  useOperations,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -26,6 +26,7 @@ function Modal({
26
26
  onClose,
27
27
  confirmClose = false,
28
28
  title,
29
+ subtitle,
29
30
  size = "md",
30
31
  closeOnBackdrop = false,
31
32
  closeOnEsc = true,
@@ -100,29 +101,32 @@ function Modal({
100
101
  ),
101
102
  onClick: (e) => e.stopPropagation(),
102
103
  children: [
103
- (title || headerSlot || expandable || !hideClose) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-density-2 px-density-4 py-density-3 border-b border-border", children: [
104
- title ? /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-sm font-semibold flex-1", children: title }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1" }),
105
- headerSlot,
106
- expandable && /* @__PURE__ */ jsxRuntime.jsx(
107
- "button",
108
- {
109
- type: "button",
110
- onClick: () => setExpanded((v) => !v),
111
- "aria-label": expanded ? "Restore size" : "Expand to fullscreen",
112
- className: "text-muted-foreground hover:text-foreground",
113
- children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: expanded ? UiFullscreen.UiFullscreenFilled : UiFullscreen.UiFullscreen })
114
- }
115
- ),
116
- !hideClose && /* @__PURE__ */ jsxRuntime.jsx(
117
- "button",
118
- {
119
- type: "button",
120
- onClick: requestClose,
121
- "aria-label": "Close",
122
- className: "text-muted-foreground hover:text-foreground",
123
- children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiClose.UiClose })
124
- }
125
- )
104
+ (title || subtitle || headerSlot || expandable || !hideClose) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-density-4 py-density-3 border-b border-border", children: [
105
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-density-2", children: [
106
+ title ? /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-sm font-semibold flex-1", children: title }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1" }),
107
+ headerSlot,
108
+ expandable && /* @__PURE__ */ jsxRuntime.jsx(
109
+ "button",
110
+ {
111
+ type: "button",
112
+ onClick: () => setExpanded((v) => !v),
113
+ "aria-label": expanded ? "Restore size" : "Expand to fullscreen",
114
+ className: "text-muted-foreground hover:text-foreground",
115
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: expanded ? UiFullscreen.UiFullscreenFilled : UiFullscreen.UiFullscreen })
116
+ }
117
+ ),
118
+ !hideClose && /* @__PURE__ */ jsxRuntime.jsx(
119
+ "button",
120
+ {
121
+ type: "button",
122
+ onClick: requestClose,
123
+ "aria-label": "Close",
124
+ className: "text-muted-foreground hover:text-foreground",
125
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiClose.UiClose })
126
+ }
127
+ )
128
+ ] }),
129
+ subtitle ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-density-2", children: subtitle }) : null
126
130
  ] }),
127
131
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 overflow-auto px-density-4 py-density-3", children }),
128
132
  footer && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-density-4 py-density-3 border-t border-border", children: footer }),