@lssm/lib.design-system 0.0.0-canary-20251219202229 → 0.0.0-canary-20251220015515

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 (60) hide show
  1. package/README.md +1 -0
  2. package/dist/components/agent/ApprovalQueue.js.map +1 -1
  3. package/dist/components/atoms/ActionButtons.d.ts +2 -2
  4. package/dist/components/atoms/ActionButtons.d.ts.map +1 -1
  5. package/dist/components/atoms/ActionButtons.js.map +1 -1
  6. package/dist/components/atoms/Button.d.ts.map +1 -1
  7. package/dist/components/atoms/Button.js.map +1 -1
  8. package/dist/components/atoms/Cta.d.ts.map +1 -1
  9. package/dist/components/atoms/Cta.js +1 -1
  10. package/dist/components/atoms/Cta.js.map +1 -1
  11. package/dist/components/atoms/Link.web.d.ts +3 -2
  12. package/dist/components/atoms/Link.web.d.ts.map +1 -1
  13. package/dist/components/atoms/Link.web.js +1 -1
  14. package/dist/components/atoms/Link.web.js.map +1 -1
  15. package/dist/components/atoms/Textarea.js.map +1 -1
  16. package/dist/components/data-view/DataViewRenderer.d.ts +2 -2
  17. package/dist/components/data-view/DataViewRenderer.d.ts.map +1 -1
  18. package/dist/components/data-view/DataViewRenderer.js +4 -3
  19. package/dist/components/data-view/DataViewRenderer.js.map +1 -1
  20. package/dist/components/forms/ZodForm.d.ts +2 -2
  21. package/dist/components/forms/ZodForm.d.ts.map +1 -1
  22. package/dist/components/forms/ZodForm.js.map +1 -1
  23. package/dist/components/legal/atoms/LegalHeading.js.map +1 -1
  24. package/dist/components/legal/atoms/LegalList.js.map +1 -1
  25. package/dist/components/legal/atoms/LegalText.js.map +1 -1
  26. package/dist/components/legal/molecules/Consent.js.map +1 -1
  27. package/dist/components/legal/molecules/LegalTOC.js +1 -1
  28. package/dist/components/legal/molecules/LegalTOC.js.map +1 -1
  29. package/dist/components/molecules/AiLinkButton.js +3 -3
  30. package/dist/components/molecules/AiLinkButton.js.map +1 -1
  31. package/dist/components/molecules/CommandPalette.js +1 -1
  32. package/dist/components/molecules/CommandPalette.js.map +1 -1
  33. package/dist/components/molecules/EntityCard.js.map +1 -1
  34. package/dist/components/molecules/NavItemCard.js.map +1 -1
  35. package/dist/components/molecules/SkeletonBlock/index.web.d.ts +2 -2
  36. package/dist/components/molecules/SkeletonCircle/index.web.d.ts +2 -2
  37. package/dist/components/molecules/StatusChip.js.map +1 -1
  38. package/dist/components/organisms/FAQSection.js +1 -1
  39. package/dist/components/organisms/FAQSection.js.map +1 -1
  40. package/dist/components/organisms/Footer.js.map +1 -1
  41. package/dist/components/organisms/HeroSection.js.map +1 -1
  42. package/dist/components/organisms/ListGridPage.js +0 -1
  43. package/dist/components/organisms/ListGridPage.js.map +1 -1
  44. package/dist/components/organisms/MarketingHeaderMobile.js.map +1 -1
  45. package/dist/components/organisms/PageHeaderResponsive.d.ts +1 -1
  46. package/dist/components/organisms/PageHeaderResponsive.d.ts.map +1 -1
  47. package/dist/components/organisms/PageHeaderResponsive.js.map +1 -1
  48. package/dist/components/templates/lists/ListPageTemplate/index.web.d.ts +1 -1
  49. package/dist/components/templates/lists/ListPageTemplate/index.web.js.map +1 -1
  50. package/dist/components/templates/lists/ListPageTemplate/types.d.ts +1 -1
  51. package/dist/contracts/dist/client/react/drivers/shadcn.js.map +1 -1
  52. package/dist/contracts/dist/client/react/form-render.js.map +1 -1
  53. package/dist/contracts/dist/forms.js +3 -2
  54. package/dist/contracts/dist/forms.js.map +1 -1
  55. package/dist/hooks/useListUrlState.d.ts.map +1 -1
  56. package/dist/hooks/useListUrlState.js.map +1 -1
  57. package/dist/renderers/form-contract.d.ts.map +1 -1
  58. package/dist/renderers/form-contract.js +2 -2
  59. package/dist/renderers/form-contract.js.map +1 -1
  60. package/package.json +17 -11
@@ -1,12 +1,12 @@
1
1
  import { SkeletonCircleProps } from "./types.js";
2
- import * as react_jsx_runtime112 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime111 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/components/molecules/SkeletonCircle/index.web.d.ts
5
5
  declare function SkeletonCircle({
6
6
  size,
7
7
  sizeClass,
8
8
  className
9
- }: SkeletonCircleProps): react_jsx_runtime112.JSX.Element;
9
+ }: SkeletonCircleProps): react_jsx_runtime111.JSX.Element;
10
10
  //#endregion
11
11
  export { SkeletonCircle };
12
12
  //# sourceMappingURL=index.web.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StatusChip.js","names":[],"sources":["../../../src/components/molecules/StatusChip.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\n\nconst chipVariants = cva(\n 'inline-flex items-center gap-1 rounded-md px-2 py-0.5 text-base font-medium',\n {\n variants: {\n tone: {\n neutral: 'bg-muted/40 text-foreground',\n info: 'bg-accent/15 text-accent',\n success: 'bg-green-100 text-green-700',\n warning: 'bg-warning/10 text-warning',\n danger: 'bg-destructive/10 text-destructive',\n },\n size: {\n sm: 'text-sm',\n md: 'text-base',\n },\n },\n defaultVariants: { tone: 'neutral', size: 'md' },\n }\n);\n\nexport type StatusChipProps = React.HTMLAttributes<HTMLSpanElement> &\n VariantProps<typeof chipVariants> & {\n icon?: React.ReactNode;\n label?: React.ReactNode;\n hoverContent?: React.ReactNode;\n };\n\nexport function StatusChip({\n tone,\n size,\n icon,\n label,\n className,\n hoverContent,\n ...props\n}: StatusChipProps) {\n const content = (\n <span className={cn(chipVariants({ tone, size }), className)} {...props}>\n {icon && (\n <span className=\"inline-flex h-4 w-4 items-center justify-center\">\n {icon}\n </span>\n )}\n {label}\n </span>\n );\n if (!hoverContent) return content;\n try {\n const { HoverPreview } =\n require('./HoverPreview') as typeof import('./HoverPreview');\n return <HoverPreview trigger={content} content={hoverContent} />;\n } catch {\n return content;\n }\n}\n"],"mappings":";;;;;;;;;;AAMA,MAAM,eAAe,IACnB,+EACA;CACE,UAAU;EACR,MAAM;GACJ,SAAS;GACT,MAAM;GACN,SAAS;GACT,SAAS;GACT,QAAQ;GACT;EACD,MAAM;GACJ,IAAI;GACJ,IAAI;GACL;EACF;CACD,iBAAiB;EAAE,MAAM;EAAW,MAAM;EAAM;CACjD,CACF;AASD,SAAgB,WAAW,EACzB,MACA,MACA,MACA,OACA,WACA,cACA,GAAG,SACe;CAClB,MAAM,UACJ,qBAAC;EAAK,WAAW,GAAG,aAAa;GAAE;GAAM;GAAM,CAAC,EAAE,UAAU;EAAE,GAAI;aAC/D,QACC,oBAAC;GAAK,WAAU;aACb;IACI,EAER;GACI;AAET,KAAI,CAAC,aAAc,QAAO;AAC1B,KAAI;EACF,MAAM,EAAE;AAER,SAAO,oBAAC;GAAa,SAAS;GAAS,SAAS;IAAgB;SAC1D;AACN,SAAO"}
1
+ {"version":3,"file":"StatusChip.js","names":[],"sources":["../../../src/components/molecules/StatusChip.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\n\nconst chipVariants = cva(\n 'inline-flex items-center gap-1 rounded-md px-2 py-0.5 text-base font-medium',\n {\n variants: {\n tone: {\n neutral: 'bg-muted/40 text-foreground',\n info: 'bg-accent/15 text-accent',\n success: 'bg-green-100 text-green-700',\n warning: 'bg-warning/10 text-warning',\n danger: 'bg-destructive/10 text-destructive',\n },\n size: {\n sm: 'text-sm',\n md: 'text-base',\n },\n },\n defaultVariants: { tone: 'neutral', size: 'md' },\n }\n);\n\nexport type StatusChipProps = React.HTMLAttributes<HTMLSpanElement> &\n VariantProps<typeof chipVariants> & {\n icon?: React.ReactNode;\n label?: React.ReactNode;\n hoverContent?: React.ReactNode;\n };\n\nexport function StatusChip({\n tone,\n size,\n icon,\n label,\n className,\n hoverContent,\n ...props\n}: StatusChipProps) {\n const content = (\n <span className={cn(chipVariants({ tone, size }), className)} {...props}>\n {icon && (\n <span className=\"inline-flex h-4 w-4 items-center justify-center\">\n {icon}\n </span>\n )}\n {label}\n </span>\n );\n if (!hoverContent) return content;\n try {\n /* eslint-disable @typescript-eslint/no-require-imports */\n const { HoverPreview } =\n require('./HoverPreview') as typeof import('./HoverPreview');\n /* eslint-enable @typescript-eslint/no-require-imports */\n return <HoverPreview trigger={content} content={hoverContent} />;\n } catch {\n return content;\n }\n}\n"],"mappings":";;;;;;;;;;AAMA,MAAM,eAAe,IACnB,+EACA;CACE,UAAU;EACR,MAAM;GACJ,SAAS;GACT,MAAM;GACN,SAAS;GACT,SAAS;GACT,QAAQ;GACT;EACD,MAAM;GACJ,IAAI;GACJ,IAAI;GACL;EACF;CACD,iBAAiB;EAAE,MAAM;EAAW,MAAM;EAAM;CACjD,CACF;AASD,SAAgB,WAAW,EACzB,MACA,MACA,MACA,OACA,WACA,cACA,GAAG,SACe;CAClB,MAAM,UACJ,qBAAC;EAAK,WAAW,GAAG,aAAa;GAAE;GAAM;GAAM,CAAC,EAAE,UAAU;EAAE,GAAI;aAC/D,QACC,oBAAC;GAAK,WAAU;aACb;IACI,EAER;GACI;AAET,KAAI,CAAC,aAAc,QAAO;AAC1B,KAAI;EAEF,MAAM,EAAE;AAGR,SAAO,oBAAC;GAAa,SAAS;GAAS,SAAS;IAAgB;SAC1D;AACN,SAAO"}
@@ -38,7 +38,7 @@ function FAQSection({ title, subtitle, children, className, items, accordionType
38
38
  collapsible,
39
39
  defaultValue,
40
40
  className: accordionClassName,
41
- children: items.map((faq, index) => /* @__PURE__ */ jsxs(AccordionItem, {
41
+ children: items?.map((faq, index) => /* @__PURE__ */ jsxs(AccordionItem, {
42
42
  value: `item-${index}`,
43
43
  children: [/* @__PURE__ */ jsx(AccordionTrigger, {
44
44
  className: "px-6",
@@ -1 +1 @@
1
- {"version":3,"file":"FAQSection.js","names":["React"],"sources":["../../../src/components/organisms/FAQSection.tsx"],"sourcesContent":["import * as React from 'react';\nimport { VStack } from '@lssm/lib.ui-kit-web/ui/stack';\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from '@lssm/lib.ui-kit-web/ui/accordion';\n\nexport interface FAQItem {\n question: React.ReactNode;\n answer: React.ReactNode;\n}\n\nexport function FAQSection({\n title,\n subtitle,\n children,\n className,\n items,\n accordionType = 'single',\n collapsible = true,\n defaultOpenIndex = 0,\n accordionClassName,\n}: {\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n children?: React.ReactNode; // custom content (deprecated in favor of items)\n className?: string;\n items?: FAQItem[]; // when provided, renders an accordion list\n accordionType?: 'single' | 'multiple';\n collapsible?: boolean;\n defaultOpenIndex?: number; // for 'single' type\n accordionClassName?: string;\n}) {\n const hasItems = Array.isArray(items) && items.length > 0;\n\n const defaultValue = React.useMemo(() => {\n if (!hasItems) return undefined;\n if (accordionType === 'multiple') return undefined; // let UI kit default\n return `item-${Math.max(0, Math.min((items?.length ?? 1) - 1, defaultOpenIndex))}`;\n }, [hasItems, accordionType, defaultOpenIndex, items]);\n\n return (\n <section className={`py-12 sm:py-16 lg:py-24 ${className || ''}`}>\n <div className=\"container mx-auto px-4 sm:px-6 lg:px-8\">\n <VStack className=\"gap-2 text-center\">\n <h2 className=\"text-3xl font-bold md:text-4xl\">{title}</h2>\n {subtitle ? (\n <p className=\"text-muted-foreground mx-auto max-w-2xl text-base\">\n {subtitle}\n </p>\n ) : null}\n </VStack>\n <div className=\"mx-auto mt-8 max-w-3xl\">\n {hasItems ? (\n <VStack className=\"mt-8\">\n <Accordion\n type={accordionType}\n collapsible={collapsible}\n defaultValue={defaultValue as any}\n className={accordionClassName}\n >\n {items!.map((faq, index) => (\n <AccordionItem key={index} value={`item-${index}`}>\n <AccordionTrigger className=\"px-6\">\n <span className=\"text-foreground text-lg font-medium\">\n {faq.question}\n </span>\n </AccordionTrigger>\n <AccordionContent className=\"px-6\">\n <p className=\"text-muted-foreground\">{faq.answer}</p>\n </AccordionContent>\n </AccordionItem>\n ))}\n </Accordion>\n </VStack>\n ) : (\n children\n )}\n </div>\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;AAcA,SAAgB,WAAW,EACzB,OACA,UACA,UACA,WACA,OACA,gBAAgB,UAChB,cAAc,MACd,mBAAmB,GACnB,sBAWC;CACD,MAAM,WAAW,MAAM,QAAQ,MAAM,IAAI,MAAM,SAAS;CAExD,MAAM,eAAeA,QAAM,cAAc;AACvC,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,kBAAkB,WAAY,QAAO;AACzC,SAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,KAAK,OAAO,UAAU,KAAK,GAAG,iBAAiB,CAAC;IAC/E;EAAC;EAAU;EAAe;EAAkB;EAAM,CAAC;AAEtD,QACE,oBAAC;EAAQ,WAAW,2BAA2B,aAAa;YAC1D,qBAAC;GAAI,WAAU;cACb,qBAAC;IAAO,WAAU;eAChB,oBAAC;KAAG,WAAU;eAAkC;MAAW,EAC1D,WACC,oBAAC;KAAE,WAAU;eACV;MACC,GACF;KACG,EACT,oBAAC;IAAI,WAAU;cACZ,WACC,oBAAC;KAAO,WAAU;eAChB,oBAAC;MACC,MAAM;MACO;MACC;MACd,WAAW;gBAEV,MAAO,KAAK,KAAK,UAChB,qBAAC;OAA0B,OAAO,QAAQ;kBACxC,oBAAC;QAAiB,WAAU;kBAC1B,oBAAC;SAAK,WAAU;mBACb,IAAI;UACA;SACU,EACnB,oBAAC;QAAiB,WAAU;kBAC1B,oBAAC;SAAE,WAAU;mBAAyB,IAAI;UAAW;SACpC;SARD,MASJ,CAChB;OACQ;MACL,GAET;KAEE;IACF;GACE"}
1
+ {"version":3,"file":"FAQSection.js","names":["React"],"sources":["../../../src/components/organisms/FAQSection.tsx"],"sourcesContent":["import * as React from 'react';\nimport { VStack } from '@lssm/lib.ui-kit-web/ui/stack';\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from '@lssm/lib.ui-kit-web/ui/accordion';\n\nexport interface FAQItem {\n question: React.ReactNode;\n answer: React.ReactNode;\n}\n\nexport function FAQSection({\n title,\n subtitle,\n children,\n className,\n items,\n accordionType = 'single',\n collapsible = true,\n defaultOpenIndex = 0,\n accordionClassName,\n}: {\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n children?: React.ReactNode; // custom content (deprecated in favor of items)\n className?: string;\n items?: FAQItem[]; // when provided, renders an accordion list\n accordionType?: 'single' | 'multiple';\n collapsible?: boolean;\n defaultOpenIndex?: number; // for 'single' type\n accordionClassName?: string;\n}) {\n const hasItems = Array.isArray(items) && items.length > 0;\n\n const defaultValue = React.useMemo(() => {\n if (!hasItems) return undefined;\n if (accordionType === 'multiple') return undefined; // let UI kit default\n return `item-${Math.max(0, Math.min((items?.length ?? 1) - 1, defaultOpenIndex))}`;\n }, [hasItems, accordionType, defaultOpenIndex, items]);\n\n return (\n <section className={`py-12 sm:py-16 lg:py-24 ${className || ''}`}>\n <div className=\"container mx-auto px-4 sm:px-6 lg:px-8\">\n <VStack className=\"gap-2 text-center\">\n <h2 className=\"text-3xl font-bold md:text-4xl\">{title}</h2>\n {subtitle ? (\n <p className=\"text-muted-foreground mx-auto max-w-2xl text-base\">\n {subtitle}\n </p>\n ) : null}\n </VStack>\n <div className=\"mx-auto mt-8 max-w-3xl\">\n {hasItems ? (\n <VStack className=\"mt-8\">\n <Accordion\n type={accordionType}\n collapsible={collapsible}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n defaultValue={defaultValue as any}\n className={accordionClassName}\n >\n {items?.map((faq, index) => (\n <AccordionItem key={index} value={`item-${index}`}>\n <AccordionTrigger className=\"px-6\">\n <span className=\"text-foreground text-lg font-medium\">\n {faq.question}\n </span>\n </AccordionTrigger>\n <AccordionContent className=\"px-6\">\n <p className=\"text-muted-foreground\">{faq.answer}</p>\n </AccordionContent>\n </AccordionItem>\n ))}\n </Accordion>\n </VStack>\n ) : (\n children\n )}\n </div>\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;AAcA,SAAgB,WAAW,EACzB,OACA,UACA,UACA,WACA,OACA,gBAAgB,UAChB,cAAc,MACd,mBAAmB,GACnB,sBAWC;CACD,MAAM,WAAW,MAAM,QAAQ,MAAM,IAAI,MAAM,SAAS;CAExD,MAAM,eAAeA,QAAM,cAAc;AACvC,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,kBAAkB,WAAY,QAAO;AACzC,SAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,KAAK,OAAO,UAAU,KAAK,GAAG,iBAAiB,CAAC;IAC/E;EAAC;EAAU;EAAe;EAAkB;EAAM,CAAC;AAEtD,QACE,oBAAC;EAAQ,WAAW,2BAA2B,aAAa;YAC1D,qBAAC;GAAI,WAAU;cACb,qBAAC;IAAO,WAAU;eAChB,oBAAC;KAAG,WAAU;eAAkC;MAAW,EAC1D,WACC,oBAAC;KAAE,WAAU;eACV;MACC,GACF;KACG,EACT,oBAAC;IAAI,WAAU;cACZ,WACC,oBAAC;KAAO,WAAU;eAChB,oBAAC;MACC,MAAM;MACO;MAEC;MACd,WAAW;gBAEV,OAAO,KAAK,KAAK,UAChB,qBAAC;OAA0B,OAAO,QAAQ;kBACxC,oBAAC;QAAiB,WAAU;kBAC1B,oBAAC;SAAK,WAAU;mBACb,IAAI;UACA;SACU,EACnB,oBAAC;QAAiB,WAAU;kBAC1B,oBAAC;SAAE,WAAU;mBAAyB,IAAI;UAAW;SACpC;SARD,MASJ,CAChB;OACQ;MACL,GAET;KAEE;IACF;GACE"}
@@ -1 +1 @@
1
- {"version":3,"file":"Footer.js","names":[],"sources":["../../../src/components/organisms/Footer.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\nimport { cva } from 'class-variance-authority';\nimport { HStack, VStack } from '@lssm/lib.ui-kit-web/ui/stack';\n\nexport interface FooterProps {\n left?: React.ReactNode;\n center?: React.ReactNode;\n right?: React.ReactNode;\n links?: { label: React.ReactNode; href: string }[];\n className?: string;\n variant?: 'default' | 'marketing';\n}\n\nconst footerVariants = cva('border-t px-4 text-base', {\n variants: {\n variant: {\n default: '',\n marketing: 'bg-muted/30',\n },\n density: {\n compact: 'py-4',\n comfortable: 'py-6',\n },\n },\n defaultVariants: {\n density: 'comfortable',\n variant: 'default',\n },\n});\n\nexport function Footer({\n left,\n center,\n right,\n links,\n className,\n variant,\n}: FooterProps) {\n return (\n <footer className={cn(footerVariants({ variant }), className)}>\n <div className=\"grid grid-cols-1 items-center gap-3 sm:grid-cols-3\">\n <div className=\"flex items-center gap-3\">{left}</div>\n <div className=\"text-muted-foreground text-center\">{center}</div>\n <VStack>{right}</VStack>\n </div>\n\n {links && links.length > 0 && (\n <div className=\"text-muted-foreground mt-4 flex flex-wrap items-center justify-center gap-3 text-base\">\n {links.map((l) => (\n <a\n href={l.href}\n key={String(l.href)}\n className=\"hover:text-foreground\"\n >\n {l.label}\n </a>\n ))}\n </div>\n )}\n </footer>\n );\n}\n"],"mappings":";;;;;;;AAcA,MAAM,iBAAiB,IAAI,2BAA2B;CACpD,UAAU;EACR,SAAS;GACP,SAAS;GACT,WAAW;GACZ;EACD,SAAS;GACP,SAAS;GACT,aAAa;GACd;EACF;CACD,iBAAiB;EACf,SAAS;EACT,SAAS;EACV;CACF,CAAC;AAEF,SAAgB,OAAO,EACrB,MACA,QACA,OACA,OACA,WACA,WACc;AACd,QACE,qBAAC;EAAO,WAAW,GAAG,eAAe,EAAE,SAAS,CAAC,EAAE,UAAU;aAC3D,qBAAC;GAAI,WAAU;;IACb,oBAAC;KAAI,WAAU;eAA2B;MAAW;IACrD,oBAAC;KAAI,WAAU;eAAqC;MAAa;IACjE,oBAAC,oBAAQ,QAAe;;IACpB,EAEL,SAAS,MAAM,SAAS,KACvB,oBAAC;GAAI,WAAU;aACZ,MAAM,KAAK,MACV,oBAAC;IACC,MAAM,EAAE;IAER,WAAU;cAET,EAAE;MAHE,OAAO,EAAE,KAAK,CAIjB,CACJ;IACE;GAED"}
1
+ {"version":3,"file":"Footer.js","names":[],"sources":["../../../src/components/organisms/Footer.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\nimport { cva } from 'class-variance-authority';\nimport { VStack } from '@lssm/lib.ui-kit-web/ui/stack';\n\nexport interface FooterProps {\n left?: React.ReactNode;\n center?: React.ReactNode;\n right?: React.ReactNode;\n links?: { label: React.ReactNode; href: string }[];\n className?: string;\n variant?: 'default' | 'marketing';\n}\n\nconst footerVariants = cva('border-t px-4 text-base', {\n variants: {\n variant: {\n default: '',\n marketing: 'bg-muted/30',\n },\n density: {\n compact: 'py-4',\n comfortable: 'py-6',\n },\n },\n defaultVariants: {\n density: 'comfortable',\n variant: 'default',\n },\n});\n\nexport function Footer({\n left,\n center,\n right,\n links,\n className,\n variant,\n}: FooterProps) {\n return (\n <footer className={cn(footerVariants({ variant }), className)}>\n <div className=\"grid grid-cols-1 items-center gap-3 sm:grid-cols-3\">\n <div className=\"flex items-center gap-3\">{left}</div>\n <div className=\"text-muted-foreground text-center\">{center}</div>\n <VStack>{right}</VStack>\n </div>\n\n {links && links.length > 0 && (\n <div className=\"text-muted-foreground mt-4 flex flex-wrap items-center justify-center gap-3 text-base\">\n {links.map((l) => (\n <a\n href={l.href}\n key={String(l.href)}\n className=\"hover:text-foreground\"\n >\n {l.label}\n </a>\n ))}\n </div>\n )}\n </footer>\n );\n}\n"],"mappings":";;;;;;;AAcA,MAAM,iBAAiB,IAAI,2BAA2B;CACpD,UAAU;EACR,SAAS;GACP,SAAS;GACT,WAAW;GACZ;EACD,SAAS;GACP,SAAS;GACT,aAAa;GACd;EACF;CACD,iBAAiB;EACf,SAAS;EACT,SAAS;EACV;CACF,CAAC;AAEF,SAAgB,OAAO,EACrB,MACA,QACA,OACA,OACA,WACA,WACc;AACd,QACE,qBAAC;EAAO,WAAW,GAAG,eAAe,EAAE,SAAS,CAAC,EAAE,UAAU;aAC3D,qBAAC;GAAI,WAAU;;IACb,oBAAC;KAAI,WAAU;eAA2B;MAAW;IACrD,oBAAC;KAAI,WAAU;eAAqC;MAAa;IACjE,oBAAC,oBAAQ,QAAe;;IACpB,EAEL,SAAS,MAAM,SAAS,KACvB,oBAAC;GAAI,WAAU;aACZ,MAAM,KAAK,MACV,oBAAC;IACC,MAAM,EAAE;IAER,WAAU;cAET,EAAE;MAHE,OAAO,EAAE,KAAK,CAIjB,CACJ;IACE;GAED"}
@@ -1 +1 @@
1
- {"version":3,"file":"HeroSection.js","names":[],"sources":["../../../src/components/organisms/HeroSection.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Hero } from '@lssm/lib.ui-kit-web/ui/marketing/Hero';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nconst sectionVariants = cva(\n 'relative overflow-hidden bg-linear-to-b from-background to-muted/20',\n {\n variants: {\n density: {\n compact: 'py-12',\n comfortable: 'py-16 sm:py-24 lg:py-32',\n },\n },\n defaultVariants: { density: 'comfortable' },\n }\n);\n\nexport function HeroSection({\n title,\n subtitle,\n primaryCta,\n secondaryCta,\n className,\n density,\n}: {\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n primaryCta?: { label: string; href?: string; onClick?: () => void };\n secondaryCta?: { label: string; href?: string; onClick?: () => void };\n className?: string;\n density?: 'compact' | 'comfortable';\n}) {\n return (\n <section\n className={[sectionVariants({ density }), className]\n .filter(Boolean)\n .join(' ')}\n >\n <div className=\"container mx-auto px-4 sm:px-6 lg:px-8\">\n <Hero\n title={title}\n subtitle={subtitle}\n primaryCta={primaryCta}\n secondaryCta={secondaryCta}\n />\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;AAIA,MAAM,kBAAkB,IACtB,uEACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,aAAa;EACd,EACF;CACD,iBAAiB,EAAE,SAAS,eAAe;CAC5C,CACF;AAED,SAAgB,YAAY,EAC1B,OACA,UACA,YACA,cACA,WACA,WAQC;AACD,QACE,oBAAC;EACC,WAAW,CAAC,gBAAgB,EAAE,SAAS,CAAC,EAAE,UAAU,CACjD,OAAO,QAAQ,CACf,KAAK,IAAI;YAEZ,oBAAC;GAAI,WAAU;aACb,oBAAC;IACQ;IACG;IACE;IACE;KACd;IACE;GACE"}
1
+ {"version":3,"file":"HeroSection.js","names":[],"sources":["../../../src/components/organisms/HeroSection.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Hero } from '@lssm/lib.ui-kit-web/ui/marketing/Hero';\nimport { cva } from 'class-variance-authority';\n\nconst sectionVariants = cva(\n 'relative overflow-hidden bg-linear-to-b from-background to-muted/20',\n {\n variants: {\n density: {\n compact: 'py-12',\n comfortable: 'py-16 sm:py-24 lg:py-32',\n },\n },\n defaultVariants: { density: 'comfortable' },\n }\n);\n\nexport function HeroSection({\n title,\n subtitle,\n primaryCta,\n secondaryCta,\n className,\n density,\n}: {\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n primaryCta?: { label: string; href?: string; onClick?: () => void };\n secondaryCta?: { label: string; href?: string; onClick?: () => void };\n className?: string;\n density?: 'compact' | 'comfortable';\n}) {\n return (\n <section\n className={[sectionVariants({ density }), className]\n .filter(Boolean)\n .join(' ')}\n >\n <div className=\"container mx-auto px-4 sm:px-6 lg:px-8\">\n <Hero\n title={title}\n subtitle={subtitle}\n primaryCta={primaryCta}\n secondaryCta={secondaryCta}\n />\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;AAIA,MAAM,kBAAkB,IACtB,uEACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,aAAa;EACd,EACF;CACD,iBAAiB,EAAE,SAAS,eAAe;CAC5C,CACF;AAED,SAAgB,YAAY,EAC1B,OACA,UACA,YACA,cACA,WACA,WAQC;AACD,QACE,oBAAC;EACC,WAAW,CAAC,gBAAgB,EAAE,SAAS,CAAC,EAAE,UAAU,CACjD,OAAO,QAAQ,CACf,KAAK,IAAI;YAEZ,oBAAC;GAAI,WAAU;aACb,oBAAC;IACQ;IACG;IACE;IACE;KACd;IACE;GACE"}
@@ -26,7 +26,6 @@ function ListGridPage({ title, subtitle, items, renderItem, className, columns,
26
26
  const { screen } = useResponsive();
27
27
  const cols = screen === "desktop" ? columns?.desktop ?? 3 : screen === "tablet" ? columns?.tablet ?? 2 : columns?.mobile ?? 1;
28
28
  const gridClass = `grid ${gridGapVariants({ size })}`;
29
- `${cols}`;
30
29
  const presetColsClass = cols === 1 ? "grid-cols-1" : cols === 2 ? "grid-cols-2" : cols === 3 ? "grid-cols-3" : cols === 4 ? "grid-cols-4" : "grid-cols-3";
31
30
  return /* @__PURE__ */ jsxs(VStack, {
32
31
  className: [containerVariants({ density }), className].filter(Boolean).join(" "),
@@ -1 +1 @@
1
- {"version":3,"file":"ListGridPage.js","names":[],"sources":["../../../src/components/organisms/ListGridPage.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { VStack } from '@lssm/lib.ui-kit-web/ui/stack';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useResponsive } from '../../platform/useResponsive';\n\nconst containerVariants = cva('', {\n variants: {\n density: {\n compact: 'gap-3',\n comfortable: 'gap-4 md:gap-5 lg:gap-6',\n },\n },\n defaultVariants: {\n density: 'comfortable',\n },\n});\n\nconst gridGapVariants = cva('', {\n variants: {\n size: {\n sm: 'gap-3',\n md: 'gap-4',\n lg: 'gap-6',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\nexport interface ListGridPageProps<T>\n extends\n VariantProps<typeof containerVariants>,\n VariantProps<typeof gridGapVariants> {\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n items: T[];\n renderItem: (item: T, index: number) => React.ReactNode;\n className?: string;\n columns?: { mobile?: number; tablet?: number; desktop?: number };\n}\n\nexport function ListGridPage<T>({\n title,\n subtitle,\n items,\n renderItem,\n className,\n columns,\n density,\n size,\n}: ListGridPageProps<T>) {\n const { screen } = useResponsive();\n const cols =\n screen === 'desktop'\n ? (columns?.desktop ?? 3)\n : screen === 'tablet'\n ? (columns?.tablet ?? 2)\n : (columns?.mobile ?? 1);\n const gridClass = `grid ${gridGapVariants({ size })}`;\n const colsClass = `grid-cols-${cols}`;\n // Tailwind can't generate dynamic classes reliably; provide common presets\n const presetColsClass =\n cols === 1\n ? 'grid-cols-1'\n : cols === 2\n ? 'grid-cols-2'\n : cols === 3\n ? 'grid-cols-3'\n : cols === 4\n ? 'grid-cols-4'\n : 'grid-cols-3';\n\n return (\n <VStack\n className={[containerVariants({ density }), className]\n .filter(Boolean)\n .join(' ')}\n >\n <VStack className=\"gap-1\">\n <h1 className=\"text-2xl font-bold md:text-3xl\">{title}</h1>\n {subtitle ? (\n <p className=\"text-muted-foreground text-base\">{subtitle}</p>\n ) : null}\n </VStack>\n <div className={`${gridClass} ${presetColsClass}`}>\n {items.map((item, idx) => (\n <div key={idx}>{renderItem(item, idx)}</div>\n ))}\n </div>\n </VStack>\n );\n}\n"],"mappings":";;;;;;;;;AAOA,MAAM,oBAAoB,IAAI,IAAI;CAChC,UAAU,EACR,SAAS;EACP,SAAS;EACT,aAAa;EACd,EACF;CACD,iBAAiB,EACf,SAAS,eACV;CACF,CAAC;AAEF,MAAM,kBAAkB,IAAI,IAAI;CAC9B,UAAU,EACR,MAAM;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACL,EACF;CACD,iBAAiB,EACf,MAAM,MACP;CACF,CAAC;AAcF,SAAgB,aAAgB,EAC9B,OACA,UACA,OACA,YACA,WACA,SACA,SACA,QACuB;CACvB,MAAM,EAAE,WAAW,eAAe;CAClC,MAAM,OACJ,WAAW,YACN,SAAS,WAAW,IACrB,WAAW,WACR,SAAS,UAAU,IACnB,SAAS,UAAU;CAC5B,MAAM,YAAY,QAAQ,gBAAgB,EAAE,MAAM,CAAC;AACjC,IAAa,KAAb;CAElB,MAAM,kBACJ,SAAS,IACL,gBACA,SAAS,IACP,gBACA,SAAS,IACP,gBACA,SAAS,IACP,gBACA;AAEZ,QACE,qBAAC;EACC,WAAW,CAAC,kBAAkB,EAAE,SAAS,CAAC,EAAE,UAAU,CACnD,OAAO,QAAQ,CACf,KAAK,IAAI;aAEZ,qBAAC;GAAO,WAAU;cAChB,oBAAC;IAAG,WAAU;cAAkC;KAAW,EAC1D,WACC,oBAAC;IAAE,WAAU;cAAmC;KAAa,GAC3D;IACG,EACT,oBAAC;GAAI,WAAW,GAAG,UAAU,GAAG;aAC7B,MAAM,KAAK,MAAM,QAChB,oBAAC,mBAAe,WAAW,MAAM,IAAI,IAA3B,IAAkC,CAC5C;IACE;GACC"}
1
+ {"version":3,"file":"ListGridPage.js","names":[],"sources":["../../../src/components/organisms/ListGridPage.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { VStack } from '@lssm/lib.ui-kit-web/ui/stack';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useResponsive } from '../../platform/useResponsive';\n\nconst containerVariants = cva('', {\n variants: {\n density: {\n compact: 'gap-3',\n comfortable: 'gap-4 md:gap-5 lg:gap-6',\n },\n },\n defaultVariants: {\n density: 'comfortable',\n },\n});\n\nconst gridGapVariants = cva('', {\n variants: {\n size: {\n sm: 'gap-3',\n md: 'gap-4',\n lg: 'gap-6',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\nexport interface ListGridPageProps<T>\n extends\n VariantProps<typeof containerVariants>,\n VariantProps<typeof gridGapVariants> {\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n items: T[];\n renderItem: (item: T, index: number) => React.ReactNode;\n className?: string;\n columns?: { mobile?: number; tablet?: number; desktop?: number };\n}\n\nexport function ListGridPage<T>({\n title,\n subtitle,\n items,\n renderItem,\n className,\n columns,\n density,\n size,\n}: ListGridPageProps<T>) {\n const { screen } = useResponsive();\n const cols =\n screen === 'desktop'\n ? (columns?.desktop ?? 3)\n : screen === 'tablet'\n ? (columns?.tablet ?? 2)\n : (columns?.mobile ?? 1);\n const gridClass = `grid ${gridGapVariants({ size })}`;\n // const colsClass = `grid-cols-${cols}`;\n // Tailwind can't generate dynamic classes reliably; provide common presets\n const presetColsClass =\n cols === 1\n ? 'grid-cols-1'\n : cols === 2\n ? 'grid-cols-2'\n : cols === 3\n ? 'grid-cols-3'\n : cols === 4\n ? 'grid-cols-4'\n : 'grid-cols-3';\n\n return (\n <VStack\n className={[containerVariants({ density }), className]\n .filter(Boolean)\n .join(' ')}\n >\n <VStack className=\"gap-1\">\n <h1 className=\"text-2xl font-bold md:text-3xl\">{title}</h1>\n {subtitle ? (\n <p className=\"text-muted-foreground text-base\">{subtitle}</p>\n ) : null}\n </VStack>\n <div className={`${gridClass} ${presetColsClass}`}>\n {items.map((item, idx) => (\n <div key={idx}>{renderItem(item, idx)}</div>\n ))}\n </div>\n </VStack>\n );\n}\n"],"mappings":";;;;;;;;;AAOA,MAAM,oBAAoB,IAAI,IAAI;CAChC,UAAU,EACR,SAAS;EACP,SAAS;EACT,aAAa;EACd,EACF;CACD,iBAAiB,EACf,SAAS,eACV;CACF,CAAC;AAEF,MAAM,kBAAkB,IAAI,IAAI;CAC9B,UAAU,EACR,MAAM;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACL,EACF;CACD,iBAAiB,EACf,MAAM,MACP;CACF,CAAC;AAcF,SAAgB,aAAgB,EAC9B,OACA,UACA,OACA,YACA,WACA,SACA,SACA,QACuB;CACvB,MAAM,EAAE,WAAW,eAAe;CAClC,MAAM,OACJ,WAAW,YACN,SAAS,WAAW,IACrB,WAAW,WACR,SAAS,UAAU,IACnB,SAAS,UAAU;CAC5B,MAAM,YAAY,QAAQ,gBAAgB,EAAE,MAAM,CAAC;CAGnD,MAAM,kBACJ,SAAS,IACL,gBACA,SAAS,IACP,gBACA,SAAS,IACP,gBACA,SAAS,IACP,gBACA;AAEZ,QACE,qBAAC;EACC,WAAW,CAAC,kBAAkB,EAAE,SAAS,CAAC,EAAE,UAAU,CACnD,OAAO,QAAQ,CACf,KAAK,IAAI;aAEZ,qBAAC;GAAO,WAAU;cAChB,oBAAC;IAAG,WAAU;cAAkC;KAAW,EAC1D,WACC,oBAAC;IAAE,WAAU;cAAmC;KAAa,GAC3D;IACG,EACT,oBAAC;GAAI,WAAW,GAAG,UAAU,GAAG;aAC7B,MAAM,KAAK,MAAM,QAChB,oBAAC,mBAAe,WAAW,MAAM,IAAI,IAA3B,IAAkC,CAC5C;IACE;GACC"}
@@ -1 +1 @@
1
- {"version":3,"file":"MarketingHeaderMobile.js","names":["React"],"sources":["../../../src/components/organisms/MarketingHeaderMobile.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\nimport { Button } from '../atoms/Button';\nimport {\n Sheet,\n SheetContent,\n SheetTrigger,\n SheetTitle,\n SheetHeader,\n SheetFooter,\n SheetDescription,\n} from '@lssm/lib.ui-kit-web/ui/sheet';\nimport { Menu } from 'lucide-react';\nimport type { MarketingHeaderProps } from './MarketingHeader';\nimport { MobileNavMenu } from '../molecules/MobileNavMenu';\nimport { CommandSearchTrigger } from '../molecules/CommandSearchTrigger';\nimport { LangSwitchDropdown } from '../molecules/LangSwitchDropdown';\nimport { VStack } from '@lssm/lib.ui-kit-web/ui/stack';\n\nexport function MarketingHeaderMobile({\n logo,\n nav = [],\n className,\n right,\n}: MarketingHeaderProps) {\n const [open, setOpen] = React.useState(false);\n return (\n <div\n className={cn(\n 'bg-background/95 supports-backdrop-filter:bg-background/60 w-full border-b backdrop-blur-xs md:hidden',\n className\n )}\n >\n <div className=\"mx-auto flex w-full max-w-7xl items-center justify-between px-3 py-2\">\n <div className=\"flex items-center gap-2\">\n <Sheet open={open} onOpenChange={setOpen}>\n <SheetTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" aria-label=\"Open menu\">\n <Menu className=\"h-5 w-5\" />\n </Button>\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"w-[320px] p-4\">\n <SheetHeader>\n <SheetTitle>Menu</SheetTitle>\n <SheetDescription>\n <div className=\"mb-3\">\n <CommandSearchTrigger groups={[]} compact />\n </div>\n <MobileNavMenu items={nav} />\n </SheetDescription>\n </SheetHeader>\n <VStack>\n <MobileNavMenu items={nav} />\n </VStack>\n <SheetFooter>\n {right}\n {/* todo */}\n </SheetFooter>\n </SheetContent>\n </Sheet>\n {logo}\n </div>\n <div className=\"flex items-center gap-2\">\n <LangSwitchDropdown\n value={'en'}\n options={[\n { code: 'fr', label: 'FR' },\n { code: 'en', label: 'EN' },\n ]}\n onChange={() => {}}\n />\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAqBA,SAAgB,sBAAsB,EACpC,MACA,MAAM,EAAE,EACR,WACA,SACuB;CACvB,MAAM,CAAC,MAAM,WAAWA,QAAM,SAAS,MAAM;AAC7C,QACE,oBAAC;EACC,WAAW,GACT,yGACA,UACD;YAED,qBAAC;GAAI,WAAU;cACb,qBAAC;IAAI,WAAU;eACb,qBAAC;KAAY;KAAM,cAAc;gBAC/B,oBAAC;MAAa;gBACZ,oBAAC;OAAO,SAAQ;OAAQ,MAAK;OAAO,cAAW;iBAC7C,oBAAC,QAAK,WAAU,YAAY;QACrB;OACI,EACf,qBAAC;MAAa,MAAK;MAAO,WAAU;;OAClC,qBAAC,0BACC,oBAAC,wBAAW,SAAiB,EAC7B,qBAAC,+BACC,oBAAC;QAAI,WAAU;kBACb,oBAAC;SAAqB,QAAQ,EAAE;SAAE;UAAU;SACxC,EACN,oBAAC,iBAAc,OAAO,MAAO,IACZ,IACP;OACd,oBAAC,oBACC,oBAAC,iBAAc,OAAO,MAAO,GACtB;OACT,oBAAC,yBACE,QAEW;;OACD;MACT,EACP;KACG,EACN,oBAAC;IAAI,WAAU;cACb,oBAAC;KACC,OAAO;KACP,SAAS,CACP;MAAE,MAAM;MAAM,OAAO;MAAM,EAC3B;MAAE,MAAM;MAAM,OAAO;MAAM,CAC5B;KACD,gBAAgB;MAChB;KACE;IACF;GACF"}
1
+ {"version":3,"file":"MarketingHeaderMobile.js","names":["React"],"sources":["../../../src/components/organisms/MarketingHeaderMobile.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\nimport { Button } from '../atoms/Button';\nimport {\n Sheet,\n SheetContent,\n SheetTrigger,\n SheetTitle,\n SheetHeader,\n SheetFooter,\n SheetDescription,\n} from '@lssm/lib.ui-kit-web/ui/sheet';\nimport { Menu } from 'lucide-react';\nimport type { MarketingHeaderProps } from './MarketingHeader';\nimport { MobileNavMenu } from '../molecules/MobileNavMenu';\nimport { CommandSearchTrigger } from '../molecules/CommandSearchTrigger';\nimport { LangSwitchDropdown } from '../molecules/LangSwitchDropdown';\nimport { VStack } from '@lssm/lib.ui-kit-web/ui/stack';\n\nexport function MarketingHeaderMobile({\n logo,\n nav = [],\n className,\n right,\n}: MarketingHeaderProps) {\n const [open, setOpen] = React.useState(false);\n return (\n <div\n className={cn(\n 'bg-background/95 supports-backdrop-filter:bg-background/60 w-full border-b backdrop-blur-xs md:hidden',\n className\n )}\n >\n <div className=\"mx-auto flex w-full max-w-7xl items-center justify-between px-3 py-2\">\n <div className=\"flex items-center gap-2\">\n <Sheet open={open} onOpenChange={setOpen}>\n <SheetTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" aria-label=\"Open menu\">\n <Menu className=\"h-5 w-5\" />\n </Button>\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"w-[320px] p-4\">\n <SheetHeader>\n <SheetTitle>Menu</SheetTitle>\n <SheetDescription>\n <div className=\"mb-3\">\n <CommandSearchTrigger groups={[]} compact />\n </div>\n <MobileNavMenu items={nav} />\n </SheetDescription>\n </SheetHeader>\n <VStack>\n <MobileNavMenu items={nav} />\n </VStack>\n <SheetFooter>\n {right}\n {/* todo */}\n </SheetFooter>\n </SheetContent>\n </Sheet>\n {logo}\n </div>\n <div className=\"flex items-center gap-2\">\n <LangSwitchDropdown\n value={'en'}\n options={[\n { code: 'fr', label: 'FR' },\n { code: 'en', label: 'EN' },\n ]}\n onChange={() => {\n /* noop */\n }}\n />\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAqBA,SAAgB,sBAAsB,EACpC,MACA,MAAM,EAAE,EACR,WACA,SACuB;CACvB,MAAM,CAAC,MAAM,WAAWA,QAAM,SAAS,MAAM;AAC7C,QACE,oBAAC;EACC,WAAW,GACT,yGACA,UACD;YAED,qBAAC;GAAI,WAAU;cACb,qBAAC;IAAI,WAAU;eACb,qBAAC;KAAY;KAAM,cAAc;gBAC/B,oBAAC;MAAa;gBACZ,oBAAC;OAAO,SAAQ;OAAQ,MAAK;OAAO,cAAW;iBAC7C,oBAAC,QAAK,WAAU,YAAY;QACrB;OACI,EACf,qBAAC;MAAa,MAAK;MAAO,WAAU;;OAClC,qBAAC,0BACC,oBAAC,wBAAW,SAAiB,EAC7B,qBAAC,+BACC,oBAAC;QAAI,WAAU;kBACb,oBAAC;SAAqB,QAAQ,EAAE;SAAE;UAAU;SACxC,EACN,oBAAC,iBAAc,OAAO,MAAO,IACZ,IACP;OACd,oBAAC,oBACC,oBAAC,iBAAc,OAAO,MAAO,GACtB;OACT,oBAAC,yBACE,QAEW;;OACD;MACT,EACP;KACG,EACN,oBAAC;IAAI,WAAU;cACb,oBAAC;KACC,OAAO;KACP,SAAS,CACP;MAAE,MAAM;MAAM,OAAO;MAAM,EAC3B;MAAE,MAAM;MAAM,OAAO;MAAM,CAC5B;KACD,gBAAgB;MAGhB;KACE;IACF;GACF"}
@@ -2,7 +2,7 @@ import * as react_jsx_runtime61 from "react/jsx-runtime";
2
2
  import { PageHeaderProps } from "@lssm/lib.ui-kit-web/ui/page-header";
3
3
 
4
4
  //#region src/components/organisms/PageHeaderResponsive.d.ts
5
- interface PageHeaderResponsiveProps extends PageHeaderProps {}
5
+ type PageHeaderResponsiveProps = PageHeaderProps;
6
6
  declare function PageHeaderResponsive(props: PageHeaderResponsiveProps): react_jsx_runtime61.JSX.Element;
7
7
  //#endregion
8
8
  export { PageHeaderResponsive };
@@ -1 +1 @@
1
- {"version":3,"file":"PageHeaderResponsive.d.ts","names":[],"sources":["../../../src/components/organisms/PageHeaderResponsive.tsx"],"sourcesContent":[],"mappings":";;;;UASiB,yBAAA,SAAkC;iBAEnC,oBAAA,QAA4B,4BAAyB,mBAAA,CAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"PageHeaderResponsive.d.ts","names":[],"sources":["../../../src/components/organisms/PageHeaderResponsive.tsx"],"sourcesContent":[],"mappings":";;;;KASY,yBAAA,GAA4B;iBAExB,oBAAA,QAA4B,4BAAyB,mBAAA,CAAA,GAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"PageHeaderResponsive.js","names":["WebPageHeader"],"sources":["../../../src/components/organisms/PageHeaderResponsive.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport {\n PageHeader as WebPageHeader,\n type PageHeaderProps,\n} from '@lssm/lib.ui-kit-web/ui/page-header';\nimport { useResponsive } from '../../platform/useResponsive';\n\nexport interface PageHeaderResponsiveProps extends PageHeaderProps {}\n\nexport function PageHeaderResponsive(props: PageHeaderResponsiveProps) {\n const { screen } = useResponsive();\n const spacing =\n screen === 'desktop' ? 'lg' : screen === 'tablet' ? 'md' : 'sm';\n return (\n <WebPageHeader {...props} spacing={props.spacing ?? (spacing as any)} />\n );\n}\n"],"mappings":";;;;;;;;AAWA,SAAgB,qBAAqB,OAAkC;CACrE,MAAM,EAAE,WAAW,eAAe;CAClC,MAAM,UACJ,WAAW,YAAY,OAAO,WAAW,WAAW,OAAO;AAC7D,QACE,oBAACA;EAAc,GAAI;EAAO,SAAS,MAAM,WAAY;GAAmB"}
1
+ {"version":3,"file":"PageHeaderResponsive.js","names":["WebPageHeader"],"sources":["../../../src/components/organisms/PageHeaderResponsive.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport {\n PageHeader as WebPageHeader,\n type PageHeaderProps,\n} from '@lssm/lib.ui-kit-web/ui/page-header';\nimport { useResponsive } from '../../platform/useResponsive';\n\nexport type PageHeaderResponsiveProps = PageHeaderProps;\n\nexport function PageHeaderResponsive(props: PageHeaderResponsiveProps) {\n const { screen } = useResponsive();\n const spacing =\n screen === 'desktop' ? 'lg' : screen === 'tablet' ? 'md' : 'sm';\n return (\n <WebPageHeader\n {...props}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n spacing={props.spacing ?? (spacing as any)}\n />\n );\n}\n"],"mappings":";;;;;;;;AAWA,SAAgB,qBAAqB,OAAkC;CACrE,MAAM,EAAE,WAAW,eAAe;CAClC,MAAM,UACJ,WAAW,YAAY,OAAO,WAAW,WAAW,OAAO;AAC7D,QACE,oBAACA;EACC,GAAI;EAEJ,SAAS,MAAM,WAAY;GAC3B"}
@@ -2,7 +2,7 @@ import { ListPageTemplateProps } from "./types.js";
2
2
  import * as react_jsx_runtime110 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/components/templates/lists/ListPageTemplate/index.web.d.ts
5
- declare function ListPageTemplate<T = any>({
5
+ declare function ListPageTemplate<T = unknown>({
6
6
  children,
7
7
  title,
8
8
  description,
@@ -1 +1 @@
1
- {"version":3,"file":"index.web.js","names":["React"],"sources":["../../../../../src/components/templates/lists/ListPageTemplate/index.web.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\nimport { PageHeaderResponsive } from '../../../organisms/PageHeaderResponsive';\nimport { FiltersToolbar } from '../../../molecules/FiltersToolbar';\nimport { AiLinkButton } from '../../../molecules/AiLinkButton';\nimport type { ListPageTemplateProps } from './types';\nimport { Skeleton } from '@lssm/lib.ui-kit-web/ui/skeleton';\nimport { Card, CardContent } from '@lssm/lib.ui-kit-web/ui/card';\nimport { EmptyDataList } from '../../../organisms/EmptyDataList';\n\nconst containerVariants = cva('space-y-4 md:space-y-6');\n\nexport * from './types';\n\nexport function ListPageTemplate<T = any>({\n children,\n title,\n description,\n breadcrumb,\n actions,\n className,\n searchPlaceholder,\n searchValue,\n onSearchChange,\n onSearchSubmit,\n isLoading,\n data,\n renderItem,\n emptyProps,\n}: ListPageTemplateProps<T>) {\n const mdHref = React.useMemo(() => {\n if (typeof window === 'undefined') return undefined;\n const url = new URL(window.location.href);\n url.pathname = url.pathname.replace(/\\/$/, '') + '.md';\n return url.toString();\n }, []);\n\n const renderEmpty = () => {\n return (\n <Card>\n <CardContent>\n <EmptyDataList {...emptyProps} />\n </CardContent>\n </Card>\n );\n };\n\n return (\n <div className={cn(containerVariants(), className)}>\n <PageHeaderResponsive\n title={title}\n subtitle={description}\n breadcrumb={breadcrumb}\n actions={\n <>\n {actions}\n {mdHref && <AiLinkButton href={mdHref} />}\n </>\n }\n />\n <FiltersToolbar\n searchPlaceholder={searchPlaceholder}\n searchValue={searchValue}\n onSearchChange={onSearchChange}\n onSearchSubmit={onSearchSubmit}\n />\n <div className=\"space-y-2\">\n {data?.map((item, index) => (\n <div key={index}>{renderItem({ item, index })}</div>\n ))}\n {!data?.length &&\n (isLoading\n ? Array.from({ length: 10 }).map((_, index) => (\n <Skeleton key={index} className=\"h-20 w-full rounded-md\" />\n ))\n : renderEmpty())}\n </div>\n\n {children}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAWA,MAAM,oBAAoB,IAAI,yBAAyB;AAIvD,SAAgB,iBAA0B,EACxC,UACA,OACA,aACA,YACA,SACA,WACA,mBACA,aACA,gBACA,gBACA,WACA,MACA,YACA,cAC2B;CAC3B,MAAM,SAASA,QAAM,cAAc;AACjC,MAAI,OAAO,WAAW,YAAa,QAAO;EAC1C,MAAM,MAAM,IAAI,IAAI,OAAO,SAAS,KAAK;AACzC,MAAI,WAAW,IAAI,SAAS,QAAQ,OAAO,GAAG,GAAG;AACjD,SAAO,IAAI,UAAU;IACpB,EAAE,CAAC;CAEN,MAAM,oBAAoB;AACxB,SACE,oBAAC,kBACC,oBAAC,yBACC,oBAAC,iBAAc,GAAI,aAAc,GACrB,GACT;;AAIX,QACE,qBAAC;EAAI,WAAW,GAAG,mBAAmB,EAAE,UAAU;;GAChD,oBAAC;IACQ;IACP,UAAU;IACE;IACZ,SACE,4CACG,SACA,UAAU,oBAAC,gBAAa,MAAM,SAAU,IACxC;KAEL;GACF,oBAAC;IACoB;IACN;IACG;IACA;KAChB;GACF,qBAAC;IAAI,WAAU;eACZ,MAAM,KAAK,MAAM,UAChB,oBAAC,mBAAiB,WAAW;KAAE;KAAM;KAAO,CAAC,IAAnC,MAA0C,CACpD,EACD,CAAC,MAAM,WACL,YACG,MAAM,KAAK,EAAE,QAAQ,IAAI,CAAC,CAAC,KAAK,GAAG,UACjC,oBAAC,YAAqB,WAAU,4BAAjB,MAA4C,CAC3D,GACF,aAAa;KACf;GAEL;;GACG"}
1
+ {"version":3,"file":"index.web.js","names":["React"],"sources":["../../../../../src/components/templates/lists/ListPageTemplate/index.web.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\nimport { PageHeaderResponsive } from '../../../organisms/PageHeaderResponsive';\nimport { FiltersToolbar } from '../../../molecules/FiltersToolbar';\nimport { AiLinkButton } from '../../../molecules/AiLinkButton';\nimport type { ListPageTemplateProps } from './types';\nimport { Skeleton } from '@lssm/lib.ui-kit-web/ui/skeleton';\nimport { Card, CardContent } from '@lssm/lib.ui-kit-web/ui/card';\nimport { EmptyDataList } from '../../../organisms/EmptyDataList';\n\nconst containerVariants = cva('space-y-4 md:space-y-6');\n\nexport * from './types';\n\nexport function ListPageTemplate<T = unknown>({\n children,\n title,\n description,\n breadcrumb,\n actions,\n className,\n searchPlaceholder,\n searchValue,\n onSearchChange,\n onSearchSubmit,\n isLoading,\n data,\n renderItem,\n emptyProps,\n}: ListPageTemplateProps<T>) {\n const mdHref = React.useMemo(() => {\n if (typeof window === 'undefined') return undefined;\n const url = new URL(window.location.href);\n url.pathname = url.pathname.replace(/\\/$/, '') + '.md';\n return url.toString();\n }, []);\n\n const renderEmpty = () => {\n return (\n <Card>\n <CardContent>\n <EmptyDataList {...emptyProps} />\n </CardContent>\n </Card>\n );\n };\n\n return (\n <div className={cn(containerVariants(), className)}>\n <PageHeaderResponsive\n title={title}\n subtitle={description}\n breadcrumb={breadcrumb}\n actions={\n <>\n {actions}\n {mdHref && <AiLinkButton href={mdHref} />}\n </>\n }\n />\n <FiltersToolbar\n searchPlaceholder={searchPlaceholder}\n searchValue={searchValue}\n onSearchChange={onSearchChange}\n onSearchSubmit={onSearchSubmit}\n />\n <div className=\"space-y-2\">\n {data?.map((item, index) => (\n <div key={index}>{renderItem({ item, index })}</div>\n ))}\n {!data?.length &&\n (isLoading\n ? Array.from({ length: 10 }).map((_, index) => (\n <Skeleton key={index} className=\"h-20 w-full rounded-md\" />\n ))\n : renderEmpty())}\n </div>\n\n {children}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAWA,MAAM,oBAAoB,IAAI,yBAAyB;AAIvD,SAAgB,iBAA8B,EAC5C,UACA,OACA,aACA,YACA,SACA,WACA,mBACA,aACA,gBACA,gBACA,WACA,MACA,YACA,cAC2B;CAC3B,MAAM,SAASA,QAAM,cAAc;AACjC,MAAI,OAAO,WAAW,YAAa,QAAO;EAC1C,MAAM,MAAM,IAAI,IAAI,OAAO,SAAS,KAAK;AACzC,MAAI,WAAW,IAAI,SAAS,QAAQ,OAAO,GAAG,GAAG;AACjD,SAAO,IAAI,UAAU;IACpB,EAAE,CAAC;CAEN,MAAM,oBAAoB;AACxB,SACE,oBAAC,kBACC,oBAAC,yBACC,oBAAC,iBAAc,GAAI,aAAc,GACrB,GACT;;AAIX,QACE,qBAAC;EAAI,WAAW,GAAG,mBAAmB,EAAE,UAAU;;GAChD,oBAAC;IACQ;IACP,UAAU;IACE;IACZ,SACE,4CACG,SACA,UAAU,oBAAC,gBAAa,MAAM,SAAU,IACxC;KAEL;GACF,oBAAC;IACoB;IACN;IACG;IACA;KAChB;GACF,qBAAC;IAAI,WAAU;eACZ,MAAM,KAAK,MAAM,UAChB,oBAAC,mBAAiB,WAAW;KAAE;KAAM;KAAO,CAAC,IAAnC,MAA0C,CACpD,EACD,CAAC,MAAM,WACL,YACG,MAAM,KAAK,EAAE,QAAQ,IAAI,CAAC,CAAC,KAAK,GAAG,UACjC,oBAAC,YAAqB,WAAU,4BAAjB,MAA4C,CAC3D,GACF,aAAa;KACf;GAEL;;GACG"}
@@ -2,7 +2,7 @@ import { EmptyDataListProps } from "../../../organisms/EmptyDataList.types.js";
2
2
  import * as React$1 from "react";
3
3
 
4
4
  //#region src/components/templates/lists/ListPageTemplate/types.d.ts
5
- interface ListPageTemplateProps<T = any> {
5
+ interface ListPageTemplateProps<T = unknown> {
6
6
  children?: React$1.ReactNode;
7
7
  title: React$1.ReactNode;
8
8
  description?: React$1.ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"shadcn.js","names":[],"sources":["../../../../../../../contracts/dist/client/react/drivers/shadcn.js"],"sourcesContent":["//#region src/client/react/drivers/shadcn.ts\n/**\n* Create a shadcn/ui driver by mapping required slots to components.\n* Host apps should import their shadcn primitives and pass them here.\n*/\nfunction shadcnDriver(slots) {\n\treturn slots;\n}\n\n//#endregion\nexport { shadcnDriver };\n//# sourceMappingURL=shadcn.js.map"],"mappings":";;;;;AAKA,SAAS,aAAa,OAAO;AAC5B,QAAO"}
1
+ {"version":3,"file":"shadcn.js","names":[],"sources":["../../../../../../../contracts/dist/client/react/drivers/shadcn.js"],"sourcesContent":["//#region src/client/react/drivers/shadcn.ts\n/**\n* Create a shadcn/ui driver by mapping required slots to components.\n* Host apps should import their shadcn primitives and pass them here.\n*/\nfunction shadcnDriver(slots) {\n\treturn slots;\n}\n\n//#endregion\nexport { shadcnDriver };"],"mappings":";;;;;AAKA,SAAS,aAAa,OAAO;AAC5B,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"form-render.js","names":[],"sources":["../../../../../../contracts/dist/client/react/form-render.js"],"sourcesContent":["import { buildZodWithRelations, evalPredicate } from \"../../forms.js\";\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport { Controller, useFieldArray, useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\n\n//#region src/client/react/form-render.tsx\nfunction toOptionsArray(src) {\n\tif (!src) return void 0;\n\tif (Array.isArray(src)) return {\n\t\tkind: \"static\",\n\t\toptions: src\n\t};\n\treturn src;\n}\nfunction getAtPath(values, path) {\n\tif (!path) return void 0;\n\tconst segs = path.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\").filter(Boolean);\n\tlet cur = values;\n\tfor (const s of segs) {\n\t\tif (cur == null) return void 0;\n\t\tcur = cur[s];\n\t}\n\treturn cur;\n}\nfunction makeDepsKey(values, deps) {\n\tif (!deps || deps.length === 0) return \"[]\";\n\ttry {\n\t\treturn JSON.stringify(deps.map((d) => getAtPath(values, d)));\n\t} catch {\n\t\treturn \"[]\";\n\t}\n}\nfunction useResolvedOptions(values, source, resolvers) {\n\tconst [opts, setOpts] = useState([]);\n\tuseEffect(() => {\n\t\tlet mounted = true;\n\t\tconst run = async () => {\n\t\t\tif (!source) return setOpts([]);\n\t\t\tif (source.kind === \"static\") return setOpts([...source.options ?? []]);\n\t\t\tconst fn = resolvers?.[source.resolverKey];\n\t\t\tif (!fn) return setOpts([]);\n\t\t\tconst res = await fn(values, source.args);\n\t\t\tif (mounted) setOpts([...res ?? []]);\n\t\t};\n\t\trun();\n\t\treturn () => {\n\t\t\tmounted = false;\n\t\t};\n\t}, [useMemo(() => {\n\t\tif (!source) return \"nil\";\n\t\tif (source.kind === \"static\") return JSON.stringify(source.options ?? []);\n\t\treturn makeDepsKey(values, source.deps);\n\t}, [source, values]), source && source.kind === \"resolver\" ? source.resolverKey : void 0]);\n\treturn opts;\n}\nfunction fieldPath(parent, name, arrayIndex) {\n\tif (!name) return parent ?? \"\";\n\tconst child = typeof arrayIndex === \"number\" ? `${name.replace(/^\\$index$/, String(arrayIndex))}` : name;\n\treturn parent ? `${parent}${typeof arrayIndex === \"number\" ? `.${arrayIndex}` : \"\"}.${child}`.replace(/\\.+/g, \".\") : child;\n}\nfunction createFormRenderer(base) {\n\tconst conf = base;\n\tconst { driver } = conf;\n\tfunction InternalForm(props) {\n\t\tconst { spec, options, merged } = props;\n\t\tconst baseZod = useMemo(() => buildZodWithRelations(spec), [spec]);\n\t\tconst form = useForm({\n\t\t\t...merged.formOptions,\n\t\t\tresolver: zodResolver(baseZod),\n\t\t\tdefaultValues: options?.defaultValues\n\t\t});\n\t\tconst values = form.watch();\n\t\tconst renderOne = (f, parent, arrayIndex) => {\n\t\t\tconst DriverField = driver.Field;\n\t\t\tconst DriverLabel = driver.FieldLabel;\n\t\t\tconst DriverDesc = driver.FieldDescription;\n\t\t\tconst DriverError = driver.FieldError;\n\t\t\tconst name = fieldPath(parent, f.name, arrayIndex);\n\t\t\tconst visible = evalPredicate(values, f.visibleWhen);\n\t\t\tconst enabled = evalPredicate(values, f.enabledWhen);\n\t\t\tconst invalid = Boolean(form.getFieldState(name)?.invalid);\n\t\t\tif (!visible) return null;\n\t\t\tconst id = name?.replace(/\\./g, \"-\");\n\t\t\tconst commonWrapProps = {\n\t\t\t\t\"data-invalid\": invalid,\n\t\t\t\thidden: !visible,\n\t\t\t\tdisabled: !enabled\n\t\t\t};\n\t\t\tconst labelNode = f.labelI18n ? /* @__PURE__ */ jsx(DriverLabel, {\n\t\t\t\thtmlFor: id,\n\t\t\t\tchildren: f.labelI18n\n\t\t\t}) : null;\n\t\t\tconst descNode = f.descriptionI18n ? /* @__PURE__ */ jsx(DriverDesc, { children: f.descriptionI18n }) : null;\n\t\t\tif (f.kind === \"group\") {\n\t\t\t\tconst children = f.fields.map((c, i) => /* @__PURE__ */ jsx(React.Fragment, { children: renderOne(c, name, arrayIndex) }, `${name}-${i}`));\n\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\tchildren,\n\t\t\t\t\t\tdescNode\n\t\t\t\t\t]\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (f.kind === \"array\") return renderArray(f, parent);\n\t\t\treturn /* @__PURE__ */ jsx(Controller, {\n\t\t\t\tname,\n\t\t\t\tcontrol: form.control,\n\t\t\t\trender: ({ field, fieldState }) => {\n\t\t\t\t\tconst err = fieldState.error ? [fieldState.error] : [];\n\t\t\t\t\tconst ariaInvalid = fieldState.invalid || void 0;\n\t\t\t\t\tif (f.kind === \"text\") {\n\t\t\t\t\t\tconst textField = f;\n\t\t\t\t\t\tconst Input = driver.Input;\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(Input, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\"aria-invalid\": ariaInvalid,\n\t\t\t\t\t\t\t\t\tplaceholder: f.placeholderI18n,\n\t\t\t\t\t\t\t\t\tautoComplete: textField.autoComplete,\n\t\t\t\t\t\t\t\t\tinputMode: textField.inputMode,\n\t\t\t\t\t\t\t\t\tmaxLength: textField.maxLength,\n\t\t\t\t\t\t\t\t\tminLength: textField.minLength,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\t...field,\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (f.kind === \"textarea\") {\n\t\t\t\t\t\tconst textareaField = f;\n\t\t\t\t\t\tconst Textarea = driver.Textarea;\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(Textarea, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\"aria-invalid\": ariaInvalid,\n\t\t\t\t\t\t\t\t\tplaceholder: f.placeholderI18n,\n\t\t\t\t\t\t\t\t\trows: textareaField.rows,\n\t\t\t\t\t\t\t\t\tmaxLength: textareaField.maxLength,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\t...field,\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (f.kind === \"select\") {\n\t\t\t\t\t\tconst selectField = f;\n\t\t\t\t\t\tconst Select = driver.Select;\n\t\t\t\t\t\tconst opts = useResolvedOptions(values, toOptionsArray(selectField.options), merged.resolvers);\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(Select, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\t\"aria-invalid\": ariaInvalid,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\tvalue: field.value,\n\t\t\t\t\t\t\t\t\tonChange: (v) => field.onChange(v),\n\t\t\t\t\t\t\t\t\toptions: opts,\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (f.kind === \"checkbox\") {\n\t\t\t\t\t\tconst Checkbox = driver.Checkbox;\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(Checkbox, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\tchecked: !!field.value,\n\t\t\t\t\t\t\t\t\tonCheckedChange: (v) => field.onChange(v),\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (f.kind === \"radio\") {\n\t\t\t\t\t\tconst radioField = f;\n\t\t\t\t\t\tconst RadioGroup = driver.RadioGroup;\n\t\t\t\t\t\tconst opts = useResolvedOptions(values, toOptionsArray(radioField.options), merged.resolvers);\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(RadioGroup, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\tvalue: field.value,\n\t\t\t\t\t\t\t\t\tonValueChange: (v) => field.onChange(v),\n\t\t\t\t\t\t\t\t\toptions: opts,\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (f.kind === \"switch\") {\n\t\t\t\t\t\tconst Switch = driver.Switch;\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(Switch, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\tchecked: !!field.value,\n\t\t\t\t\t\t\t\t\tonCheckedChange: (v) => field.onChange(v),\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn /* @__PURE__ */ jsx(Fragment, {});\n\t\t\t\t}\n\t\t\t}, name);\n\t\t};\n\t\tconst renderArray = (f, parent) => {\n\t\t\tconst name = fieldPath(parent, f.name);\n\t\t\tconst { fields, append, remove } = useFieldArray({\n\t\t\t\tcontrol: form.control,\n\t\t\t\tname\n\t\t\t});\n\t\t\tconst canAdd = f.max == null || fields.length < f.max;\n\t\t\tconst canRemove = (idx) => (f.min == null ? fields.length > 0 : fields.length > f.min) && idx >= 0;\n\t\t\tconst Button$1 = driver.Button;\n\t\t\tconst Label = driver.FieldLabel;\n\t\t\treturn /* @__PURE__ */ jsxs(\"div\", { children: [\n\t\t\t\tf.labelI18n ? /* @__PURE__ */ jsx(Label, { children: f.labelI18n }) : null,\n\t\t\t\tfields.map((row, idx) => /* @__PURE__ */ jsxs(\"div\", { children: [renderOne(f.of, name, idx), canRemove(idx) ? /* @__PURE__ */ jsx(Button$1, {\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tvariant: \"ghost\",\n\t\t\t\t\tsize: \"sm\",\n\t\t\t\t\tonClick: () => remove(idx),\n\t\t\t\t\tchildren: \"Remove\"\n\t\t\t\t}) : null] }, row.id ?? idx)),\n\t\t\t\tcanAdd ? /* @__PURE__ */ jsx(Button$1, {\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tvariant: \"outline\",\n\t\t\t\t\tsize: \"sm\",\n\t\t\t\t\tonClick: () => append({}),\n\t\t\t\t\tchildren: \"Add\"\n\t\t\t\t}) : null\n\t\t\t] }, name);\n\t\t};\n\t\tconst onSubmit = async (data) => {\n\t\t\tconst actionKey = spec.actions?.[0]?.key ?? \"submit\";\n\t\t\tif (merged.onSubmitOverride) return merged.onSubmitOverride(data, actionKey);\n\t\t};\n\t\tconst Button = driver.Button;\n\t\treturn /* @__PURE__ */ jsxs(\"form\", {\n\t\t\tonSubmit: form.handleSubmit(onSubmit),\n\t\t\tchildren: [(spec.fields || []).map((f, i) => /* @__PURE__ */ jsx(React.Fragment, { children: renderOne(f) }, i)), spec.actions && spec.actions.length ? /* @__PURE__ */ jsx(\"div\", { children: spec.actions.map((a) => /* @__PURE__ */ jsx(Button, {\n\t\t\t\ttype: \"submit\",\n\t\t\t\tchildren: a.labelI18n\n\t\t\t}, a.key)) }) : null]\n\t\t});\n\t}\n\treturn { render: (spec, options) => /* @__PURE__ */ jsx(InternalForm, {\n\t\tspec,\n\t\toptions,\n\t\tmerged: {\n\t\t\t...conf,\n\t\t\t...options?.overrides ?? {}\n\t\t}\n\t}) };\n}\n\n//#endregion\nexport { createFormRenderer };\n//# sourceMappingURL=form-render.js.map"],"mappings":"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"}
1
+ {"version":3,"file":"form-render.js","names":[],"sources":["../../../../../../contracts/dist/client/react/form-render.js"],"sourcesContent":["import { buildZodWithRelations, evalPredicate } from \"../../forms.js\";\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport { Controller, useFieldArray, useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\n\n//#region src/client/react/form-render.tsx\nfunction toOptionsArray(src) {\n\tif (!src) return void 0;\n\tif (Array.isArray(src)) return {\n\t\tkind: \"static\",\n\t\toptions: src\n\t};\n\treturn src;\n}\nfunction getAtPath(values, path) {\n\tif (!path) return void 0;\n\tconst segs = path.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\").filter(Boolean);\n\tlet cur = values;\n\tfor (const s of segs) {\n\t\tif (cur == null) return void 0;\n\t\tcur = cur[s];\n\t}\n\treturn cur;\n}\nfunction makeDepsKey(values, deps) {\n\tif (!deps || deps.length === 0) return \"[]\";\n\ttry {\n\t\treturn JSON.stringify(deps.map((d) => getAtPath(values, d)));\n\t} catch {\n\t\treturn \"[]\";\n\t}\n}\nfunction useResolvedOptions(values, source, resolvers) {\n\tconst [opts, setOpts] = useState([]);\n\tuseEffect(() => {\n\t\tlet mounted = true;\n\t\tconst run = async () => {\n\t\t\tif (!source) return setOpts([]);\n\t\t\tif (source.kind === \"static\") return setOpts([...source.options ?? []]);\n\t\t\tconst fn = resolvers?.[source.resolverKey];\n\t\t\tif (!fn) return setOpts([]);\n\t\t\tconst res = await fn(values, source.args);\n\t\t\tif (mounted) setOpts([...res ?? []]);\n\t\t};\n\t\trun();\n\t\treturn () => {\n\t\t\tmounted = false;\n\t\t};\n\t}, [useMemo(() => {\n\t\tif (!source) return \"nil\";\n\t\tif (source.kind === \"static\") return JSON.stringify(source.options ?? []);\n\t\treturn makeDepsKey(values, source.deps);\n\t}, [source, values]), source && source.kind === \"resolver\" ? source.resolverKey : void 0]);\n\treturn opts;\n}\nfunction fieldPath(parent, name, arrayIndex) {\n\tif (!name) return parent ?? \"\";\n\tconst child = typeof arrayIndex === \"number\" ? `${name.replace(/^\\$index$/, String(arrayIndex))}` : name;\n\treturn parent ? `${parent}${typeof arrayIndex === \"number\" ? `.${arrayIndex}` : \"\"}.${child}`.replace(/\\.+/g, \".\") : child;\n}\nfunction createFormRenderer(base) {\n\tconst conf = base;\n\tconst { driver } = conf;\n\tfunction InternalForm(props) {\n\t\tconst { spec, options, merged } = props;\n\t\tconst baseZod = useMemo(() => buildZodWithRelations(spec), [spec]);\n\t\tconst form = useForm({\n\t\t\t...merged.formOptions,\n\t\t\tresolver: zodResolver(baseZod),\n\t\t\tdefaultValues: options?.defaultValues\n\t\t});\n\t\tconst values = form.watch();\n\t\tconst renderOne = (f, parent, arrayIndex) => {\n\t\t\tconst DriverField = driver.Field;\n\t\t\tconst DriverLabel = driver.FieldLabel;\n\t\t\tconst DriverDesc = driver.FieldDescription;\n\t\t\tconst DriverError = driver.FieldError;\n\t\t\tconst name = fieldPath(parent, f.name, arrayIndex);\n\t\t\tconst visible = evalPredicate(values, f.visibleWhen);\n\t\t\tconst enabled = evalPredicate(values, f.enabledWhen);\n\t\t\tconst invalid = Boolean(form.getFieldState(name)?.invalid);\n\t\t\tif (!visible) return null;\n\t\t\tconst id = name?.replace(/\\./g, \"-\");\n\t\t\tconst commonWrapProps = {\n\t\t\t\t\"data-invalid\": invalid,\n\t\t\t\thidden: !visible,\n\t\t\t\tdisabled: !enabled\n\t\t\t};\n\t\t\tconst labelNode = f.labelI18n ? /* @__PURE__ */ jsx(DriverLabel, {\n\t\t\t\thtmlFor: id,\n\t\t\t\tchildren: f.labelI18n\n\t\t\t}) : null;\n\t\t\tconst descNode = f.descriptionI18n ? /* @__PURE__ */ jsx(DriverDesc, { children: f.descriptionI18n }) : null;\n\t\t\tif (f.kind === \"group\") {\n\t\t\t\tconst children = f.fields.map((c, i) => /* @__PURE__ */ jsx(React.Fragment, { children: renderOne(c, name, arrayIndex) }, `${name}-${i}`));\n\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\tchildren,\n\t\t\t\t\t\tdescNode\n\t\t\t\t\t]\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (f.kind === \"array\") return renderArray(f, parent);\n\t\t\treturn /* @__PURE__ */ jsx(Controller, {\n\t\t\t\tname,\n\t\t\t\tcontrol: form.control,\n\t\t\t\trender: ({ field, fieldState }) => {\n\t\t\t\t\tconst err = fieldState.error ? [fieldState.error] : [];\n\t\t\t\t\tconst ariaInvalid = fieldState.invalid || void 0;\n\t\t\t\t\tif (f.kind === \"text\") {\n\t\t\t\t\t\tconst textField = f;\n\t\t\t\t\t\tconst Input = driver.Input;\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(Input, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\"aria-invalid\": ariaInvalid,\n\t\t\t\t\t\t\t\t\tplaceholder: f.placeholderI18n,\n\t\t\t\t\t\t\t\t\tautoComplete: textField.autoComplete,\n\t\t\t\t\t\t\t\t\tinputMode: textField.inputMode,\n\t\t\t\t\t\t\t\t\tmaxLength: textField.maxLength,\n\t\t\t\t\t\t\t\t\tminLength: textField.minLength,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\t...field,\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (f.kind === \"textarea\") {\n\t\t\t\t\t\tconst textareaField = f;\n\t\t\t\t\t\tconst Textarea = driver.Textarea;\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(Textarea, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\"aria-invalid\": ariaInvalid,\n\t\t\t\t\t\t\t\t\tplaceholder: f.placeholderI18n,\n\t\t\t\t\t\t\t\t\trows: textareaField.rows,\n\t\t\t\t\t\t\t\t\tmaxLength: textareaField.maxLength,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\t...field,\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (f.kind === \"select\") {\n\t\t\t\t\t\tconst selectField = f;\n\t\t\t\t\t\tconst Select = driver.Select;\n\t\t\t\t\t\tconst opts = useResolvedOptions(values, toOptionsArray(selectField.options), merged.resolvers);\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(Select, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\t\"aria-invalid\": ariaInvalid,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\tvalue: field.value,\n\t\t\t\t\t\t\t\t\tonChange: (v) => field.onChange(v),\n\t\t\t\t\t\t\t\t\toptions: opts,\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (f.kind === \"checkbox\") {\n\t\t\t\t\t\tconst Checkbox = driver.Checkbox;\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(Checkbox, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\tchecked: !!field.value,\n\t\t\t\t\t\t\t\t\tonCheckedChange: (v) => field.onChange(v),\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (f.kind === \"radio\") {\n\t\t\t\t\t\tconst radioField = f;\n\t\t\t\t\t\tconst RadioGroup = driver.RadioGroup;\n\t\t\t\t\t\tconst opts = useResolvedOptions(values, toOptionsArray(radioField.options), merged.resolvers);\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(RadioGroup, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\tvalue: field.value,\n\t\t\t\t\t\t\t\t\tonValueChange: (v) => field.onChange(v),\n\t\t\t\t\t\t\t\t\toptions: opts,\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (f.kind === \"switch\") {\n\t\t\t\t\t\tconst Switch = driver.Switch;\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(Switch, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\tchecked: !!field.value,\n\t\t\t\t\t\t\t\t\tonCheckedChange: (v) => field.onChange(v),\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn /* @__PURE__ */ jsx(Fragment, {});\n\t\t\t\t}\n\t\t\t}, name);\n\t\t};\n\t\tconst renderArray = (f, parent) => {\n\t\t\tconst name = fieldPath(parent, f.name);\n\t\t\tconst { fields, append, remove } = useFieldArray({\n\t\t\t\tcontrol: form.control,\n\t\t\t\tname\n\t\t\t});\n\t\t\tconst canAdd = f.max == null || fields.length < f.max;\n\t\t\tconst canRemove = (idx) => (f.min == null ? fields.length > 0 : fields.length > f.min) && idx >= 0;\n\t\t\tconst Button$1 = driver.Button;\n\t\t\tconst Label = driver.FieldLabel;\n\t\t\treturn /* @__PURE__ */ jsxs(\"div\", { children: [\n\t\t\t\tf.labelI18n ? /* @__PURE__ */ jsx(Label, { children: f.labelI18n }) : null,\n\t\t\t\tfields.map((row, idx) => /* @__PURE__ */ jsxs(\"div\", { children: [renderOne(f.of, name, idx), canRemove(idx) ? /* @__PURE__ */ jsx(Button$1, {\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tvariant: \"ghost\",\n\t\t\t\t\tsize: \"sm\",\n\t\t\t\t\tonClick: () => remove(idx),\n\t\t\t\t\tchildren: \"Remove\"\n\t\t\t\t}) : null] }, row.id ?? idx)),\n\t\t\t\tcanAdd ? /* @__PURE__ */ jsx(Button$1, {\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tvariant: \"outline\",\n\t\t\t\t\tsize: \"sm\",\n\t\t\t\t\tonClick: () => append({}),\n\t\t\t\t\tchildren: \"Add\"\n\t\t\t\t}) : null\n\t\t\t] }, name);\n\t\t};\n\t\tconst onSubmit = async (data) => {\n\t\t\tconst actionKey = spec.actions?.[0]?.key ?? \"submit\";\n\t\t\tif (merged.onSubmitOverride) return merged.onSubmitOverride(data, actionKey);\n\t\t};\n\t\tconst Button = driver.Button;\n\t\treturn /* @__PURE__ */ jsxs(\"form\", {\n\t\t\tonSubmit: form.handleSubmit(onSubmit),\n\t\t\tchildren: [(spec.fields || []).map((f, i) => /* @__PURE__ */ jsx(React.Fragment, { children: renderOne(f) }, i)), spec.actions && spec.actions.length ? /* @__PURE__ */ jsx(\"div\", { children: spec.actions.map((a) => /* @__PURE__ */ jsx(Button, {\n\t\t\t\ttype: \"submit\",\n\t\t\t\tchildren: a.labelI18n\n\t\t\t}, a.key)) }) : null]\n\t\t});\n\t}\n\treturn { render: (spec, options) => /* @__PURE__ */ jsx(InternalForm, {\n\t\tspec,\n\t\toptions,\n\t\tmerged: {\n\t\t\t...conf,\n\t\t\t...options?.overrides ?? {}\n\t\t}\n\t}) };\n}\n\n//#endregion\nexport { createFormRenderer };"],"mappings":"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"}
@@ -5,7 +5,8 @@ function getAtPath(values, path) {
5
5
  let cur = values;
6
6
  for (const s of segs) {
7
7
  if (cur == null) return void 0;
8
- cur = cur[s];
8
+ if (cur && typeof cur === "object" && s in cur) cur = cur[s];
9
+ else return;
9
10
  }
10
11
  return cur;
11
12
  }
@@ -13,7 +14,7 @@ function evalPredicate(values, pred) {
13
14
  if (!pred) return true;
14
15
  if (pred.not) return !evalPredicate(values, pred.not);
15
16
  if (pred.all && pred.all.length) return pred.all.every((p) => evalPredicate(values, p));
16
- if (pred.any && pred.any.length) return pred.any.some((p) => evalPredicate(values, p));
17
+ if (pred.anyOf && pred.anyOf.length) return pred.anyOf.some((p) => evalPredicate(values, p));
17
18
  if (pred.when) {
18
19
  const { path, op = "truthy", value } = pred.when;
19
20
  const v = getAtPath(values, path);
@@ -1 +1 @@
1
- {"version":3,"file":"forms.js","names":[],"sources":["../../../../contracts/dist/forms.js"],"sourcesContent":["//#region src/forms.ts\nfunction formKey(meta) {\n\treturn `${meta.key}.v${meta.version}`;\n}\nvar FormRegistry = class {\n\titems = /* @__PURE__ */ new Map();\n\tregister(spec) {\n\t\tconst key = formKey(spec.meta);\n\t\tif (this.items.has(key)) throw new Error(`Duplicate form ${key}`);\n\t\tthis.items.set(key, spec);\n\t\treturn this;\n\t}\n\tlist() {\n\t\treturn [...this.items.values()];\n\t}\n\tget(key, version) {\n\t\tif (version != null) return this.items.get(`${key}.v${version}`);\n\t\tlet candidate;\n\t\tlet max = -Infinity;\n\t\tfor (const [k, v] of this.items.entries()) {\n\t\t\tif (!k.startsWith(`${key}.v`)) continue;\n\t\t\tif (v.meta.version > max) {\n\t\t\t\tmax = v.meta.version;\n\t\t\t\tcandidate = v;\n\t\t\t}\n\t\t}\n\t\treturn candidate;\n\t}\n};\nfunction getAtPath(values, path) {\n\tif (!path) return void 0;\n\tconst segs = path.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\").filter(Boolean);\n\tlet cur = values;\n\tfor (const s of segs) {\n\t\tif (cur == null) return void 0;\n\t\tcur = cur[s];\n\t}\n\treturn cur;\n}\nfunction evalPredicate(values, pred) {\n\tif (!pred) return true;\n\tif (pred.not) return !evalPredicate(values, pred.not);\n\tif (pred.all && pred.all.length) return pred.all.every((p) => evalPredicate(values, p));\n\tif (pred.any && pred.any.length) return pred.any.some((p) => evalPredicate(values, p));\n\tif (pred.when) {\n\t\tconst { path, op = \"truthy\", value } = pred.when;\n\t\tconst v = getAtPath(values, path);\n\t\tswitch (op) {\n\t\t\tcase \"equals\": return v === value;\n\t\t\tcase \"notEquals\": return v !== value;\n\t\t\tcase \"in\": return Array.isArray(value) && value.includes(v);\n\t\t\tcase \"notIn\": return Array.isArray(value) && !value.includes(v);\n\t\t\tcase \"gt\": return Number(v) > Number(value);\n\t\t\tcase \"gte\": return Number(v) >= Number(value);\n\t\t\tcase \"lt\": return Number(v) < Number(value);\n\t\t\tcase \"lte\": return Number(v) <= Number(value);\n\t\t\tcase \"empty\": return v == null || (Array.isArray(v) ? v.length === 0 : String(v).length === 0);\n\t\t\tcase \"lengthGt\": return (Array.isArray(v) || typeof v === \"string\") && v.length > Number(value ?? 0);\n\t\t\tcase \"lengthGte\": return (Array.isArray(v) || typeof v === \"string\") && v.length >= Number(value ?? 0);\n\t\t\tcase \"lengthLt\": return (Array.isArray(v) || typeof v === \"string\") && v.length < Number(value ?? 0);\n\t\t\tcase \"lengthLte\": return (Array.isArray(v) || typeof v === \"string\") && v.length <= Number(value ?? 0);\n\t\t\tcase \"truthy\":\n\t\t\tdefault: return Boolean(v);\n\t\t}\n\t}\n\treturn true;\n}\n/**\n* Wrap the base zod schema with relation-driven refinements (requiredWhen, array min/max)\n* and optional custom constraints. Call this when wiring RHF resolver.\n*/\nfunction buildZodWithRelations(spec, handlers) {\n\treturn spec.model.getZod().superRefine((values, ctx) => {\n\t\tconst visit = (field, parentPath) => {\n\t\t\tconst path = field.name ? parentPath ? `${parentPath}.${field.name}` : field.name : parentPath ?? \"\";\n\t\t\tif (field.requiredWhen) {\n\t\t\t\tif (evalPredicate(values, field.requiredWhen)) {\n\t\t\t\t\tconst v = getAtPath(values, path);\n\t\t\t\t\tif (v == null || typeof v === \"string\" && v.trim().length === 0 || Array.isArray(v) && v.length === 0) ctx.addIssue({\n\t\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\t\tpath: path.split(\".\"),\n\t\t\t\t\t\tmessage: \"required\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (field.kind === \"array\") {\n\t\t\t\tconst arr = getAtPath(values, path);\n\t\t\t\tif (field.min != null && Array.isArray(arr) && arr.length < field.min) ctx.addIssue({\n\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\tpath: path.split(\".\"),\n\t\t\t\t\tmessage: `min:${field.min}`\n\t\t\t\t});\n\t\t\t\tif (field.max != null && Array.isArray(arr) && arr.length > field.max) ctx.addIssue({\n\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\tpath: path.split(\".\"),\n\t\t\t\t\tmessage: `max:${field.max}`\n\t\t\t\t});\n\t\t\t\tvisit(field.of, path);\n\t\t\t} else if (field.kind === \"group\") for (const child of field.fields) visit(child, path);\n\t\t};\n\t\tfor (const f of spec.fields) visit(f);\n\t\tif (spec.constraints && handlers) for (const c of spec.constraints) {\n\t\t\tconst fn = handlers[c.key];\n\t\t\tif (!fn) continue;\n\t\t\tconst res = fn(values, c.paths, c.args);\n\t\t\tif (!res.ok) ctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tpath: (res.path ?? c.paths[0] ?? \"\").split(\".\").filter(Boolean),\n\t\t\t\tmessage: res.message ?? c.messageI18n\n\t\t\t});\n\t\t}\n\t});\n}\nfunction defineFormSpec(spec) {\n\treturn spec;\n}\n\n//#endregion\nexport { FormRegistry, buildZodWithRelations, defineFormSpec, evalPredicate };\n//# sourceMappingURL=forms.js.map"],"mappings":"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"}
1
+ {"version":3,"file":"forms.js","names":[],"sources":["../../../../contracts/dist/forms.js"],"sourcesContent":["//#region src/forms.ts\nfunction formKey(meta) {\n\treturn `${meta.key}.v${meta.version}`;\n}\nvar FormRegistry = class {\n\titems = /* @__PURE__ */ new Map();\n\tregister(spec) {\n\t\tconst key = formKey(spec.meta);\n\t\tif (this.items.has(key)) throw new Error(`Duplicate form ${key}`);\n\t\tthis.items.set(key, spec);\n\t\treturn this;\n\t}\n\tlist() {\n\t\treturn [...this.items.values()];\n\t}\n\tget(key, version) {\n\t\tif (version != null) return this.items.get(`${key}.v${version}`);\n\t\tlet candidate;\n\t\tlet max = -Infinity;\n\t\tfor (const [k, v] of this.items.entries()) {\n\t\t\tif (!k.startsWith(`${key}.v`)) continue;\n\t\t\tif (v.meta.version > max) {\n\t\t\t\tmax = v.meta.version;\n\t\t\t\tcandidate = v;\n\t\t\t}\n\t\t}\n\t\treturn candidate;\n\t}\n};\nfunction getAtPath(values, path) {\n\tif (!path) return void 0;\n\tconst segs = path.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\").filter(Boolean);\n\tlet cur = values;\n\tfor (const s of segs) {\n\t\tif (cur == null) return void 0;\n\t\tif (cur && typeof cur === \"object\" && s in cur) cur = cur[s];\n\t\telse return;\n\t}\n\treturn cur;\n}\nfunction evalPredicate(values, pred) {\n\tif (!pred) return true;\n\tif (pred.not) return !evalPredicate(values, pred.not);\n\tif (pred.all && pred.all.length) return pred.all.every((p) => evalPredicate(values, p));\n\tif (pred.anyOf && pred.anyOf.length) return pred.anyOf.some((p) => evalPredicate(values, p));\n\tif (pred.when) {\n\t\tconst { path, op = \"truthy\", value } = pred.when;\n\t\tconst v = getAtPath(values, path);\n\t\tswitch (op) {\n\t\t\tcase \"equals\": return v === value;\n\t\t\tcase \"notEquals\": return v !== value;\n\t\t\tcase \"in\": return Array.isArray(value) && value.includes(v);\n\t\t\tcase \"notIn\": return Array.isArray(value) && !value.includes(v);\n\t\t\tcase \"gt\": return Number(v) > Number(value);\n\t\t\tcase \"gte\": return Number(v) >= Number(value);\n\t\t\tcase \"lt\": return Number(v) < Number(value);\n\t\t\tcase \"lte\": return Number(v) <= Number(value);\n\t\t\tcase \"empty\": return v == null || (Array.isArray(v) ? v.length === 0 : String(v).length === 0);\n\t\t\tcase \"lengthGt\": return (Array.isArray(v) || typeof v === \"string\") && v.length > Number(value ?? 0);\n\t\t\tcase \"lengthGte\": return (Array.isArray(v) || typeof v === \"string\") && v.length >= Number(value ?? 0);\n\t\t\tcase \"lengthLt\": return (Array.isArray(v) || typeof v === \"string\") && v.length < Number(value ?? 0);\n\t\t\tcase \"lengthLte\": return (Array.isArray(v) || typeof v === \"string\") && v.length <= Number(value ?? 0);\n\t\t\tcase \"truthy\":\n\t\t\tdefault: return Boolean(v);\n\t\t}\n\t}\n\treturn true;\n}\n/**\n* Wrap the base zod schema with relation-driven refinements (requiredWhen, array min/max)\n* and optional custom constraints. Call this when wiring RHF resolver.\n*/\nfunction buildZodWithRelations(spec, handlers) {\n\treturn spec.model.getZod().superRefine((values, ctx) => {\n\t\tconst visit = (field, parentPath) => {\n\t\t\tconst path = field.name ? parentPath ? `${parentPath}.${field.name}` : field.name : parentPath ?? \"\";\n\t\t\tif (field.requiredWhen) {\n\t\t\t\tif (evalPredicate(values, field.requiredWhen)) {\n\t\t\t\t\tconst v = getAtPath(values, path);\n\t\t\t\t\tif (v == null || typeof v === \"string\" && v.trim().length === 0 || Array.isArray(v) && v.length === 0) ctx.addIssue({\n\t\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\t\tpath: path.split(\".\"),\n\t\t\t\t\t\tmessage: \"required\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (field.kind === \"array\") {\n\t\t\t\tconst arr = getAtPath(values, path);\n\t\t\t\tif (field.min != null && Array.isArray(arr) && arr.length < field.min) ctx.addIssue({\n\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\tpath: path.split(\".\"),\n\t\t\t\t\tmessage: `min:${field.min}`\n\t\t\t\t});\n\t\t\t\tif (field.max != null && Array.isArray(arr) && arr.length > field.max) ctx.addIssue({\n\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\tpath: path.split(\".\"),\n\t\t\t\t\tmessage: `max:${field.max}`\n\t\t\t\t});\n\t\t\t\tvisit(field.of, path);\n\t\t\t} else if (field.kind === \"group\") for (const child of field.fields) visit(child, path);\n\t\t};\n\t\tfor (const f of spec.fields) visit(f);\n\t\tif (spec.constraints && handlers) for (const c of spec.constraints) {\n\t\t\tconst fn = handlers[c.key];\n\t\t\tif (!fn) continue;\n\t\t\tconst res = fn(values, c.paths, c.args);\n\t\t\tif (!res.ok) ctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tpath: (res.path ?? c.paths[0] ?? \"\").split(\".\").filter(Boolean),\n\t\t\t\tmessage: res.message ?? c.messageI18n\n\t\t\t});\n\t\t}\n\t});\n}\nfunction defineFormSpec(spec) {\n\treturn spec;\n}\n\n//#endregion\nexport { FormRegistry, buildZodWithRelations, defineFormSpec, evalPredicate };"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useListUrlState.d.ts","names":[],"sources":["../../src/hooks/useListUrlState.ts"],"sourcesContent":[],"mappings":";UAEiB,8BACE,0BAA0B;EAD5B,CAAA,EAAA,MAAA;EACE,IAAA,EAAA,MAAA;EAA0B,KAAA,EAAA,MAAA;EAMlC,IAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAQ,OAAA,EAAR,QAAQ;AAGnB;AACmB,iBADH,eACG,CAAA,iBAAA,MAAA,CAAA,MAAA,EAAA,OAAA,CAAA,GAA0B,MAA1B,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,CAAA;EAAA,QAAA;EAAA,SAAA;EAAA;CAAA,EAAA;EAA0B,QAAA,EAYjC,YAZiC,CAYpB,QAZoB,CAAA;EAE3C,SAAA,CAAA,EAAA;IACA,CAAA,EAAA,MAAA;IAOA,IAAA,EAAA,MAAA;IAEuB,KAAA,EAAA,MAAA;IAAb,IAAA,EAAA,MAAA;;;EAuCoB,YAAA,CAAA,EAAA,OAAA;CAAb,CAAA,EAAA;EAAR,SAAA,KAAA,cAAA,SAAA,CAAA;EAgCM,SAAA,QAAA,EAAA,CAAA,IAAA,EAhCN,OAgCM,CAhCE,YAgCF,CAhCe,QAgCf,CAAA,CAAA,EAAA,GAAA,IAAA;EACJ,SAAA,SAAA,EAAA,CAAA,GAAA,EAAA,MADI,QACJ,EAAA,KAAA,EAAA,QAAA,CAAA,MAAe,QAAf,CAAA,GAAA,SAAA,GAAA,IAAA,EAAA,GAAA,IAAA;EAAe,SAAA,YAAA,EAAA,GAAA,GAAA,IAAA;CAAQ"}
1
+ {"version":3,"file":"useListUrlState.d.ts","names":[],"sources":["../../src/hooks/useListUrlState.ts"],"sourcesContent":[],"mappings":";UAEiB,8BACE,0BAA0B;EAD5B,CAAA,EAAA,MAAA;EACE,IAAA,EAAA,MAAA;EAA0B,KAAA,EAAA,MAAA;EAMlC,IAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAQ,OAAA,EAAR,QAAQ;AAGnB;AACmB,iBADH,eACG,CAAA,iBAAA,MAAA,CAAA,MAAA,EAAA,OAAA,CAAA,GAA0B,MAA1B,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,CAAA;EAAA,QAAA;EAAA,SAAA;EAAA;CAAA,EAAA;EAA0B,QAAA,EAYjC,YAZiC,CAYpB,QAZoB,CAAA;EAE3C,SAAA,CAAA,EAAA;IACA,CAAA,EAAA,MAAA;IAOA,IAAA,EAAA,MAAA;IAEuB,KAAA,EAAA,MAAA;IAAb,IAAA,EAAA,MAAA;;;EAuCoB,YAAA,CAAA,EAAA,OAAA;CAAb,CAAA,EAAA;EAAR,SAAA,KAAA,cAAA,SAAA,CAAA;EAmCM,SAAA,QAAA,EAAA,CAAA,IAAA,EAnCN,OAmCM,CAnCE,YAmCF,CAnCe,QAmCf,CAAA,CAAA,EAAA,GAAA,IAAA;EACJ,SAAA,SAAA,EAAA,CAAA,GAAA,EAAA,MADI,QACJ,EAAA,KAAA,EAAA,QAAA,CAAA,MAAe,QAAf,CAAA,GAAA,SAAA,GAAA,IAAA,EAAA,GAAA,IAAA;EAAe,SAAA,YAAA,EAAA,GAAA,GAAA,IAAA;CAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"useListUrlState.js","names":["React","filters: TFilters","merged: ListUrlState<TFilters>"],"sources":["../../src/hooks/useListUrlState.ts"],"sourcesContent":["import * as React from 'react';\n\nexport interface ListUrlState<\n TFilters extends Record<string, unknown> = Record<string, unknown>,\n> {\n q: string;\n page: number;\n limit: number;\n sort?: string | null;\n filters: TFilters;\n}\n\nexport function useListUrlState<\n TFilters extends Record<string, unknown> = Record<string, unknown>,\n>({\n defaults,\n paramKeys = {\n q: 'q',\n page: 'page',\n limit: 'limit',\n sort: 'sort',\n filters: 'f',\n },\n replaceState = true,\n}: {\n defaults: ListUrlState<TFilters>;\n paramKeys?: {\n q: string;\n page: string;\n limit: string;\n sort: string;\n filters: string;\n };\n replaceState?: boolean;\n}) {\n const read = React.useCallback((): ListUrlState<TFilters> => {\n if (typeof window === 'undefined') return defaults;\n const url = new URL(window.location.href);\n const qs = url.searchParams;\n const parseNum = (v: string | null, d: number) => {\n const n = v ? Number(v) : NaN;\n return Number.isFinite(n) && n > 0 ? n : d;\n };\n const filtersRaw = qs.get(paramKeys.filters);\n let filters: TFilters = defaults.filters;\n if (filtersRaw) {\n try {\n filters = JSON.parse(filtersRaw) as TFilters;\n } catch {\n filters = defaults.filters;\n }\n }\n return {\n q: qs.get(paramKeys.q) ?? defaults.q,\n page: parseNum(qs.get(paramKeys.page), defaults.page),\n limit: parseNum(qs.get(paramKeys.limit), defaults.limit),\n sort: qs.get(paramKeys.sort),\n filters,\n };\n }, [defaults, paramKeys]);\n\n const [state, setState] = React.useState<ListUrlState<TFilters>>(read);\n\n const write = React.useCallback(\n (next: Partial<ListUrlState<TFilters>>) => {\n if (typeof window === 'undefined') return;\n const url = new URL(window.location.href);\n const qs = url.searchParams;\n const merged: ListUrlState<TFilters> = { ...state, ...next } as any;\n\n const setOrDel = (key: string, value: string | null | undefined) => {\n if (value == null || value === '' || value === 'null') qs.delete(key);\n else qs.set(key, value);\n };\n\n setOrDel(paramKeys.q, merged.q || null);\n setOrDel(paramKeys.page, String(merged.page));\n setOrDel(paramKeys.limit, String(merged.limit));\n setOrDel(paramKeys.sort, merged.sort ?? null);\n try {\n const json = JSON.stringify(merged.filters ?? {});\n setOrDel(paramKeys.filters, json === '{}' ? null : json);\n } catch {\n // ignore\n }\n\n const newUrl = `${url.pathname}?${qs.toString()}${url.hash}`;\n if (replaceState) window.history.replaceState({}, '', newUrl);\n else window.history.pushState({}, '', newUrl);\n setState(merged);\n },\n [state, paramKeys, replaceState]\n );\n\n const setFilter = React.useCallback(\n (\n key: keyof TFilters,\n value: TFilters[keyof TFilters] | undefined | null\n ) => {\n write({\n filters: { ...(state.filters as any), [key]: value } as TFilters,\n });\n },\n [state.filters, write]\n );\n\n const clearFilters = React.useCallback(() => {\n write({ filters: {} as TFilters, page: 1 });\n }, [write]);\n\n React.useEffect(() => {\n const onPop = () => setState(read());\n window.addEventListener('popstate', onPop);\n return () => window.removeEventListener('popstate', onPop);\n }, [read]);\n\n return { state, setState: write, setFilter, clearFilters } as const;\n}\n"],"mappings":";;;AAYA,SAAgB,gBAEd,EACA,UACA,YAAY;CACV,GAAG;CACH,MAAM;CACN,OAAO;CACP,MAAM;CACN,SAAS;CACV,EACD,eAAe,QAWd;CACD,MAAM,OAAOA,QAAM,kBAA0C;AAC3D,MAAI,OAAO,WAAW,YAAa,QAAO;EAE1C,MAAM,KADM,IAAI,IAAI,OAAO,SAAS,KAAK,CAC1B;EACf,MAAM,YAAY,GAAkB,MAAc;GAChD,MAAM,IAAI,IAAI,OAAO,EAAE,GAAG;AAC1B,UAAO,OAAO,SAAS,EAAE,IAAI,IAAI,IAAI,IAAI;;EAE3C,MAAM,aAAa,GAAG,IAAI,UAAU,QAAQ;EAC5C,IAAIC,UAAoB,SAAS;AACjC,MAAI,WACF,KAAI;AACF,aAAU,KAAK,MAAM,WAAW;UAC1B;AACN,aAAU,SAAS;;AAGvB,SAAO;GACL,GAAG,GAAG,IAAI,UAAU,EAAE,IAAI,SAAS;GACnC,MAAM,SAAS,GAAG,IAAI,UAAU,KAAK,EAAE,SAAS,KAAK;GACrD,OAAO,SAAS,GAAG,IAAI,UAAU,MAAM,EAAE,SAAS,MAAM;GACxD,MAAM,GAAG,IAAI,UAAU,KAAK;GAC5B;GACD;IACA,CAAC,UAAU,UAAU,CAAC;CAEzB,MAAM,CAAC,OAAO,YAAYD,QAAM,SAAiC,KAAK;CAEtE,MAAM,QAAQA,QAAM,aACjB,SAA0C;AACzC,MAAI,OAAO,WAAW,YAAa;EACnC,MAAM,MAAM,IAAI,IAAI,OAAO,SAAS,KAAK;EACzC,MAAM,KAAK,IAAI;EACf,MAAME,SAAiC;GAAE,GAAG;GAAO,GAAG;GAAM;EAE5D,MAAM,YAAY,KAAa,UAAqC;AAClE,OAAI,SAAS,QAAQ,UAAU,MAAM,UAAU,OAAQ,IAAG,OAAO,IAAI;OAChE,IAAG,IAAI,KAAK,MAAM;;AAGzB,WAAS,UAAU,GAAG,OAAO,KAAK,KAAK;AACvC,WAAS,UAAU,MAAM,OAAO,OAAO,KAAK,CAAC;AAC7C,WAAS,UAAU,OAAO,OAAO,OAAO,MAAM,CAAC;AAC/C,WAAS,UAAU,MAAM,OAAO,QAAQ,KAAK;AAC7C,MAAI;GACF,MAAM,OAAO,KAAK,UAAU,OAAO,WAAW,EAAE,CAAC;AACjD,YAAS,UAAU,SAAS,SAAS,OAAO,OAAO,KAAK;UAClD;EAIR,MAAM,SAAS,GAAG,IAAI,SAAS,GAAG,GAAG,UAAU,GAAG,IAAI;AACtD,MAAI,aAAc,QAAO,QAAQ,aAAa,EAAE,EAAE,IAAI,OAAO;MACxD,QAAO,QAAQ,UAAU,EAAE,EAAE,IAAI,OAAO;AAC7C,WAAS,OAAO;IAElB;EAAC;EAAO;EAAW;EAAa,CACjC;CAED,MAAM,YAAYF,QAAM,aAEpB,KACA,UACG;AACH,QAAM,EACJ,SAAS;GAAE,GAAI,MAAM;IAAkB,MAAM;GAAO,EACrD,CAAC;IAEJ,CAAC,MAAM,SAAS,MAAM,CACvB;CAED,MAAM,eAAeA,QAAM,kBAAkB;AAC3C,QAAM;GAAE,SAAS,EAAE;GAAc,MAAM;GAAG,CAAC;IAC1C,CAAC,MAAM,CAAC;AAEX,SAAM,gBAAgB;EACpB,MAAM,cAAc,SAAS,MAAM,CAAC;AACpC,SAAO,iBAAiB,YAAY,MAAM;AAC1C,eAAa,OAAO,oBAAoB,YAAY,MAAM;IACzD,CAAC,KAAK,CAAC;AAEV,QAAO;EAAE;EAAO,UAAU;EAAO;EAAW;EAAc"}
1
+ {"version":3,"file":"useListUrlState.js","names":["React","filters: TFilters","merged: ListUrlState<TFilters>"],"sources":["../../src/hooks/useListUrlState.ts"],"sourcesContent":["import * as React from 'react';\n\nexport interface ListUrlState<\n TFilters extends Record<string, unknown> = Record<string, unknown>,\n> {\n q: string;\n page: number;\n limit: number;\n sort?: string | null;\n filters: TFilters;\n}\n\nexport function useListUrlState<\n TFilters extends Record<string, unknown> = Record<string, unknown>,\n>({\n defaults,\n paramKeys = {\n q: 'q',\n page: 'page',\n limit: 'limit',\n sort: 'sort',\n filters: 'f',\n },\n replaceState = true,\n}: {\n defaults: ListUrlState<TFilters>;\n paramKeys?: {\n q: string;\n page: string;\n limit: string;\n sort: string;\n filters: string;\n };\n replaceState?: boolean;\n}) {\n const read = React.useCallback((): ListUrlState<TFilters> => {\n if (typeof window === 'undefined') return defaults;\n const url = new URL(window.location.href);\n const qs = url.searchParams;\n const parseNum = (v: string | null, d: number) => {\n const n = v ? Number(v) : NaN;\n return Number.isFinite(n) && n > 0 ? n : d;\n };\n const filtersRaw = qs.get(paramKeys.filters);\n let filters: TFilters = defaults.filters;\n if (filtersRaw) {\n try {\n filters = JSON.parse(filtersRaw) as TFilters;\n } catch {\n filters = defaults.filters;\n }\n }\n return {\n q: qs.get(paramKeys.q) ?? defaults.q,\n page: parseNum(qs.get(paramKeys.page), defaults.page),\n limit: parseNum(qs.get(paramKeys.limit), defaults.limit),\n sort: qs.get(paramKeys.sort),\n filters,\n };\n }, [defaults, paramKeys]);\n\n const [state, setState] = React.useState<ListUrlState<TFilters>>(read);\n\n const write = React.useCallback(\n (next: Partial<ListUrlState<TFilters>>) => {\n if (typeof window === 'undefined') return;\n const url = new URL(window.location.href);\n const qs = url.searchParams;\n const merged: ListUrlState<TFilters> = {\n ...state,\n ...next,\n } as ListUrlState<TFilters>;\n\n const setOrDel = (key: string, value: string | null | undefined) => {\n if (value == null || value === '' || value === 'null') qs.delete(key);\n else qs.set(key, value);\n };\n\n setOrDel(paramKeys.q, merged.q || null);\n setOrDel(paramKeys.page, String(merged.page));\n setOrDel(paramKeys.limit, String(merged.limit));\n setOrDel(paramKeys.sort, merged.sort ?? null);\n try {\n const json = JSON.stringify(merged.filters ?? {});\n setOrDel(paramKeys.filters, json === '{}' ? null : json);\n } catch {\n // ignore\n }\n\n const newUrl = `${url.pathname}?${qs.toString()}${url.hash}`;\n if (replaceState) window.history.replaceState({}, '', newUrl);\n else window.history.pushState({}, '', newUrl);\n setState(merged);\n },\n [state, paramKeys, replaceState]\n );\n\n const setFilter = React.useCallback(\n (\n key: keyof TFilters,\n value: TFilters[keyof TFilters] | undefined | null\n ) => {\n write({\n filters: { ...state.filters, [key]: value } as TFilters,\n });\n },\n [state.filters, write]\n );\n\n const clearFilters = React.useCallback(() => {\n write({ filters: {} as TFilters, page: 1 });\n }, [write]);\n\n React.useEffect(() => {\n const onPop = () => setState(read());\n window.addEventListener('popstate', onPop);\n return () => window.removeEventListener('popstate', onPop);\n }, [read]);\n\n return { state, setState: write, setFilter, clearFilters } as const;\n}\n"],"mappings":";;;AAYA,SAAgB,gBAEd,EACA,UACA,YAAY;CACV,GAAG;CACH,MAAM;CACN,OAAO;CACP,MAAM;CACN,SAAS;CACV,EACD,eAAe,QAWd;CACD,MAAM,OAAOA,QAAM,kBAA0C;AAC3D,MAAI,OAAO,WAAW,YAAa,QAAO;EAE1C,MAAM,KADM,IAAI,IAAI,OAAO,SAAS,KAAK,CAC1B;EACf,MAAM,YAAY,GAAkB,MAAc;GAChD,MAAM,IAAI,IAAI,OAAO,EAAE,GAAG;AAC1B,UAAO,OAAO,SAAS,EAAE,IAAI,IAAI,IAAI,IAAI;;EAE3C,MAAM,aAAa,GAAG,IAAI,UAAU,QAAQ;EAC5C,IAAIC,UAAoB,SAAS;AACjC,MAAI,WACF,KAAI;AACF,aAAU,KAAK,MAAM,WAAW;UAC1B;AACN,aAAU,SAAS;;AAGvB,SAAO;GACL,GAAG,GAAG,IAAI,UAAU,EAAE,IAAI,SAAS;GACnC,MAAM,SAAS,GAAG,IAAI,UAAU,KAAK,EAAE,SAAS,KAAK;GACrD,OAAO,SAAS,GAAG,IAAI,UAAU,MAAM,EAAE,SAAS,MAAM;GACxD,MAAM,GAAG,IAAI,UAAU,KAAK;GAC5B;GACD;IACA,CAAC,UAAU,UAAU,CAAC;CAEzB,MAAM,CAAC,OAAO,YAAYD,QAAM,SAAiC,KAAK;CAEtE,MAAM,QAAQA,QAAM,aACjB,SAA0C;AACzC,MAAI,OAAO,WAAW,YAAa;EACnC,MAAM,MAAM,IAAI,IAAI,OAAO,SAAS,KAAK;EACzC,MAAM,KAAK,IAAI;EACf,MAAME,SAAiC;GACrC,GAAG;GACH,GAAG;GACJ;EAED,MAAM,YAAY,KAAa,UAAqC;AAClE,OAAI,SAAS,QAAQ,UAAU,MAAM,UAAU,OAAQ,IAAG,OAAO,IAAI;OAChE,IAAG,IAAI,KAAK,MAAM;;AAGzB,WAAS,UAAU,GAAG,OAAO,KAAK,KAAK;AACvC,WAAS,UAAU,MAAM,OAAO,OAAO,KAAK,CAAC;AAC7C,WAAS,UAAU,OAAO,OAAO,OAAO,MAAM,CAAC;AAC/C,WAAS,UAAU,MAAM,OAAO,QAAQ,KAAK;AAC7C,MAAI;GACF,MAAM,OAAO,KAAK,UAAU,OAAO,WAAW,EAAE,CAAC;AACjD,YAAS,UAAU,SAAS,SAAS,OAAO,OAAO,KAAK;UAClD;EAIR,MAAM,SAAS,GAAG,IAAI,SAAS,GAAG,GAAG,UAAU,GAAG,IAAI;AACtD,MAAI,aAAc,QAAO,QAAQ,aAAa,EAAE,EAAE,IAAI,OAAO;MACxD,QAAO,QAAQ,UAAU,EAAE,EAAE,IAAI,OAAO;AAC7C,WAAS,OAAO;IAElB;EAAC;EAAO;EAAW;EAAa,CACjC;CAED,MAAM,YAAYF,QAAM,aAEpB,KACA,UACG;AACH,QAAM,EACJ,SAAS;GAAE,GAAG,MAAM;IAAU,MAAM;GAAO,EAC5C,CAAC;IAEJ,CAAC,MAAM,SAAS,MAAM,CACvB;CAED,MAAM,eAAeA,QAAM,kBAAkB;AAC3C,QAAM;GAAE,SAAS,EAAE;GAAc,MAAM;GAAG,CAAC;IAC1C,CAAC,MAAM,CAAC;AAEX,SAAM,gBAAgB;EACpB,MAAM,cAAc,SAAS,MAAM,CAAC;AACpC,SAAO,iBAAiB,YAAY,MAAM;AAC1C,eAAa,OAAO,oBAAoB,YAAY,MAAM;IACzD,CAAC,KAAK,CAAC;AAEV,QAAO;EAAE;EAAO,UAAU;EAAO;EAAW;EAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"form-contract.d.ts","names":[],"sources":["../../src/renderers/form-contract.tsx"],"sourcesContent":[],"mappings":";;;;;;cAoFa;qDAiBX,iBAAA,CAAA,cAAA"}
1
+ {"version":3,"file":"form-contract.d.ts","names":[],"sources":["../../src/renderers/form-contract.tsx"],"sourcesContent":[],"mappings":";;;;;;cA+Fa;qDAsBX,iBAAA,CAAA,cAAA"}
@@ -38,7 +38,7 @@ const Checkbox = (props) => /* @__PURE__ */ jsx(Checkbox$1, {
38
38
  });
39
39
  const RadioGroup = (props) => /* @__PURE__ */ jsx(RadioGroup$1, {
40
40
  ...props,
41
- children: props.options?.map((o, i) => /* @__PURE__ */ jsxs("div", {
41
+ children: props.options?.map((o) => /* @__PURE__ */ jsxs("div", {
42
42
  className: "flex items-center gap-3",
43
43
  children: [/* @__PURE__ */ jsx(RadioGroupItem, {
44
44
  value: o.value,
@@ -47,7 +47,7 @@ const RadioGroup = (props) => /* @__PURE__ */ jsx(RadioGroup$1, {
47
47
  htmlFor: o.value,
48
48
  children: o.label
49
49
  })]
50
- }))
50
+ }, o.value))
51
51
  });
52
52
  const Switch = (props) => /* @__PURE__ */ jsx(Switch$1, {
53
53
  checked: !!props.checked,
@@ -1 +1 @@
1
- {"version":3,"file":"form-contract.js","names":["SelectUiKit","CheckboxUiKit","RadioGroupUiKit","SwitchUiKit","FieldWrap"],"sources":["../../src/renderers/form-contract.tsx"],"sourcesContent":["'use client';\nimport React from 'react';\nimport { createFormRenderer } from '@lssm/lib.contracts/client/react/form-render';\nimport { shadcnDriver } from '@lssm/lib.contracts/client/react/drivers/shadcn';\n\n// Minimal shadcn driver mapping: host must wire its components here.\n// Replace these placeholders with actual shadcn/ui imports in your app.\nimport {\n Field as FieldWrap,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n} from '@lssm/lib.ui-kit-web/ui/field';\nimport { Button } from '../components/atoms/Button';\nimport { Input } from '../components/atoms/Input';\nimport { Textarea } from '../components/atoms/Textarea';\nimport { Switch as SwitchUiKit } from '@lssm/lib.ui-kit-web/ui/switch';\nimport {\n RadioGroup as RadioGroupUiKit,\n RadioGroupItem,\n} from '@lssm/lib.ui-kit-web/ui/radio-group';\nimport { Checkbox as CheckboxUiKit } from '@lssm/lib.ui-kit-web/ui/checkbox';\nimport {\n Select as SelectUiKit,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@lssm/lib.ui-kit-web/ui/select';\nimport { Label } from '@lssm/lib.ui-kit-web/ui/label';\n\n// Select/Checkbox/Radio/Switch are app-specific; provide thin wrappers.\nconst Select = (props: any) => {\n const { options, value, onChange, ...rest } = props;\n return (\n <SelectUiKit\n value={value ?? ''}\n onValueChange={(v) => onChange?.(v)}\n {...rest}\n >\n <SelectTrigger className=\"w-[180px]\">\n <SelectValue placeholder={props.placeholder} />\n </SelectTrigger>\n <SelectContent>\n <SelectGroup>\n {/* <SelectLabel>Fruits</SelectLabel> */}\n {/* <SelectItem value=\"\" disabled hidden></SelectItem> */}\n {options?.map((o: any, i: number) => (\n <SelectItem key={i} value={o.value} disabled={o.disabled}>\n {o.labelI18n}\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectContent>\n </SelectUiKit>\n );\n};\nconst Checkbox = (props: any) => (\n <CheckboxUiKit\n checked={!!props.checked}\n onCheckedChange={(v) => props.onCheckedChange?.(v)}\n {...props}\n />\n);\nconst RadioGroup = (props: any) => (\n <RadioGroupUiKit {...props}>\n {props.options?.map((o: any, i: number) => (\n <div className=\"flex items-center gap-3\">\n <RadioGroupItem value={o.value} id={o.value} />\n <Label htmlFor={o.value}>{o.label}</Label>\n </div>\n ))}\n </RadioGroupUiKit>\n);\nconst Switch = (props: any) => (\n <SwitchUiKit\n checked={!!props.checked}\n onCheckedChange={(v) => props.onCheckedChange?.(v)}\n {...props}\n />\n);\n\nexport const formRenderer = createFormRenderer({\n driver: shadcnDriver({\n Field: FieldWrap,\n FieldLabel: FieldLabel,\n FieldDescription: FieldDescription,\n FieldError: FieldError,\n FieldGroup: FieldGroup,\n FieldSet: (p: any) => <fieldset {...p} />,\n FieldLegend: (p: any) => <legend {...p} />,\n Input: Input as any,\n Textarea: Textarea as any,\n Select: Select,\n Checkbox: Checkbox,\n RadioGroup: RadioGroup,\n Switch: Switch,\n Button: Button as any,\n }),\n});\n"],"mappings":";;;;;;;;;;;;;;;;;AAkCA,MAAM,UAAU,UAAe;CAC7B,MAAM,EAAE,SAAS,OAAO,UAAU,GAAG,SAAS;AAC9C,QACE,qBAACA;EACC,OAAO,SAAS;EAChB,gBAAgB,MAAM,WAAW,EAAE;EACnC,GAAI;aAEJ,oBAAC;GAAc,WAAU;aACvB,oBAAC,eAAY,aAAa,MAAM,cAAe;IACjC,EAChB,oBAAC,2BACC,oBAAC,yBAGE,SAAS,KAAK,GAAQ,MACrB,oBAAC;GAAmB,OAAO,EAAE;GAAO,UAAU,EAAE;aAC7C,EAAE;KADY,EAEJ,CACb,GACU,GACA;GACJ;;AAGlB,MAAM,YAAY,UAChB,oBAACC;CACC,SAAS,CAAC,CAAC,MAAM;CACjB,kBAAkB,MAAM,MAAM,kBAAkB,EAAE;CAClD,GAAI;EACJ;AAEJ,MAAM,cAAc,UAClB,oBAACC;CAAgB,GAAI;WAClB,MAAM,SAAS,KAAK,GAAQ,MAC3B,qBAAC;EAAI,WAAU;aACb,oBAAC;GAAe,OAAO,EAAE;GAAO,IAAI,EAAE;IAAS,EAC/C,oBAAC;GAAM,SAAS,EAAE;aAAQ,EAAE;IAAc;GACtC,CACN;EACc;AAEpB,MAAM,UAAU,UACd,oBAACC;CACC,SAAS,CAAC,CAAC,MAAM;CACjB,kBAAkB,MAAM,MAAM,kBAAkB,EAAE;CAClD,GAAI;EACJ;AAGJ,MAAa,eAAe,mBAAmB,EAC7C,QAAQ,aAAa;CACZC;CACK;CACM;CACN;CACA;CACZ,WAAW,MAAW,oBAAC,cAAS,GAAI,IAAK;CACzC,cAAc,MAAW,oBAAC,YAAO,GAAI,IAAK;CACnC;CACG;CACF;CACE;CACE;CACJ;CACA;CACT,CAAC,EACH,CAAC"}
1
+ {"version":3,"file":"form-contract.js","names":["SelectUiKit","CheckboxUiKit","RadioGroupUiKit","SwitchUiKit","FieldWrap"],"sources":["../../src/renderers/form-contract.tsx"],"sourcesContent":["'use client';\nimport React from 'react';\nimport { createFormRenderer } from '@lssm/lib.contracts/client/react/form-render';\nimport { shadcnDriver } from '@lssm/lib.contracts/client/react/drivers/shadcn';\n\n// Minimal shadcn driver mapping: host must wire its components here.\n// Replace these placeholders with actual shadcn/ui imports in your app.\nimport {\n Field as FieldWrap,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n} from '@lssm/lib.ui-kit-web/ui/field';\nimport { Button } from '../components/atoms/Button';\nimport { Input } from '../components/atoms/Input';\nimport { Textarea } from '../components/atoms/Textarea';\nimport { Switch as SwitchUiKit } from '@lssm/lib.ui-kit-web/ui/switch';\nimport {\n RadioGroup as RadioGroupUiKit,\n RadioGroupItem,\n} from '@lssm/lib.ui-kit-web/ui/radio-group';\nimport { Checkbox as CheckboxUiKit } from '@lssm/lib.ui-kit-web/ui/checkbox';\nimport {\n Select as SelectUiKit,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@lssm/lib.ui-kit-web/ui/select';\nimport { Label } from '@lssm/lib.ui-kit-web/ui/label';\n\n// Select/Checkbox/Radio/Switch are app-specific; provide thin wrappers.\ninterface FormOption {\n value: string;\n label?: string;\n labelI18n?: string;\n disabled?: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst Select = (props: any) => {\n const { options, value, onChange, ...rest } = props;\n return (\n <SelectUiKit\n value={value ?? ''}\n onValueChange={(v) => onChange?.(v)}\n {...rest}\n >\n <SelectTrigger className=\"w-[180px]\">\n <SelectValue placeholder={props.placeholder} />\n </SelectTrigger>\n <SelectContent>\n <SelectGroup>\n {/* <SelectLabel>Fruits</SelectLabel> */}\n {/* <SelectItem value=\"\" disabled hidden></SelectItem> */}\n {(options as FormOption[] | undefined)?.map((o, i) => (\n <SelectItem key={i} value={o.value} disabled={o.disabled}>\n {o.labelI18n}\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectContent>\n </SelectUiKit>\n );\n};\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst Checkbox = (props: any) => (\n <CheckboxUiKit\n checked={!!props.checked}\n onCheckedChange={(v) => props.onCheckedChange?.(v)}\n {...props}\n />\n);\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst RadioGroup = (props: any) => (\n <RadioGroupUiKit {...props}>\n {(props.options as FormOption[] | undefined)?.map((o) => (\n <div key={o.value} className=\"flex items-center gap-3\">\n <RadioGroupItem value={o.value} id={o.value} />\n <Label htmlFor={o.value}>{o.label}</Label>\n </div>\n ))}\n </RadioGroupUiKit>\n);\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst Switch = (props: any) => (\n <SwitchUiKit\n checked={!!props.checked}\n onCheckedChange={(v) => props.onCheckedChange?.(v)}\n {...props}\n />\n);\n\nexport const formRenderer = createFormRenderer({\n driver: shadcnDriver({\n Field: FieldWrap,\n FieldLabel: FieldLabel,\n FieldDescription: FieldDescription,\n FieldError: FieldError,\n FieldGroup: FieldGroup,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n FieldSet: (p: any) => <fieldset {...p} />,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n FieldLegend: (p: any) => <legend {...p} />,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Input: Input as any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Textarea: Textarea as any,\n Select: Select,\n Checkbox: Checkbox,\n RadioGroup: RadioGroup,\n Switch: Switch,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Button: Button as any,\n }),\n});\n"],"mappings":";;;;;;;;;;;;;;;;;AA0CA,MAAM,UAAU,UAAe;CAC7B,MAAM,EAAE,SAAS,OAAO,UAAU,GAAG,SAAS;AAC9C,QACE,qBAACA;EACC,OAAO,SAAS;EAChB,gBAAgB,MAAM,WAAW,EAAE;EACnC,GAAI;aAEJ,oBAAC;GAAc,WAAU;aACvB,oBAAC,eAAY,aAAa,MAAM,cAAe;IACjC,EAChB,oBAAC,2BACC,oBAAC,yBAGG,SAAsC,KAAK,GAAG,MAC9C,oBAAC;GAAmB,OAAO,EAAE;GAAO,UAAU,EAAE;aAC7C,EAAE;KADY,EAEJ,CACb,GACU,GACA;GACJ;;AAIlB,MAAM,YAAY,UAChB,oBAACC;CACC,SAAS,CAAC,CAAC,MAAM;CACjB,kBAAkB,MAAM,MAAM,kBAAkB,EAAE;CAClD,GAAI;EACJ;AAGJ,MAAM,cAAc,UAClB,oBAACC;CAAgB,GAAI;WACjB,MAAM,SAAsC,KAAK,MACjD,qBAAC;EAAkB,WAAU;aAC3B,oBAAC;GAAe,OAAO,EAAE;GAAO,IAAI,EAAE;IAAS,EAC/C,oBAAC;GAAM,SAAS,EAAE;aAAQ,EAAE;IAAc;IAFlC,EAAE,MAGN,CACN;EACc;AAGpB,MAAM,UAAU,UACd,oBAACC;CACC,SAAS,CAAC,CAAC,MAAM;CACjB,kBAAkB,MAAM,MAAM,kBAAkB,EAAE;CAClD,GAAI;EACJ;AAGJ,MAAa,eAAe,mBAAmB,EAC7C,QAAQ,aAAa;CACZC;CACK;CACM;CACN;CACA;CAEZ,WAAW,MAAW,oBAAC,cAAS,GAAI,IAAK;CAEzC,cAAc,MAAW,oBAAC,YAAO,GAAI,IAAK;CAEnC;CAEG;CACF;CACE;CACE;CACJ;CAEA;CACT,CAAC,EACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lssm/lib.design-system",
3
- "version": "0.0.0-canary-20251219202229",
3
+ "version": "0.0.0-canary-20251220015515",
4
4
  "scripts": {
5
5
  "publish:pkg": "bun publish --tolerate-republish --ignore-scripts --verbose",
6
6
  "publish:pkg:canary": "bun publish:pkg --tag canary",
@@ -21,23 +21,23 @@
21
21
  "tree-shake": true,
22
22
  "dependencies": {
23
23
  "@hookform/resolvers": "5.2.2",
24
- "@lssm/lib.ai-agent": "0.0.0-canary-20251219202229",
25
- "@lssm/lib.contracts": "0.0.0-canary-20251219202229",
26
- "@lssm/lib.ui-kit": "0.0.0-canary-20251219202229",
27
- "@lssm/lib.ui-kit-web": "0.0.0-canary-20251219202229",
24
+ "@lssm/lib.ai-agent": "0.0.0-canary-20251220015515",
25
+ "@lssm/lib.contracts": "0.0.0-canary-20251220015515",
26
+ "@lssm/lib.ui-kit": "0.0.0-canary-20251220015515",
27
+ "@lssm/lib.ui-kit-web": "0.0.0-canary-20251220015515",
28
28
  "class-variance-authority": "^0.7.1",
29
29
  "clsx": "^2.1.1",
30
30
  "lucide-react": "^0.535.0",
31
31
  "react": "19.2.3",
32
- "react-dom": "^19.2.3",
32
+ "react-dom": "19.2.3",
33
33
  "tailwind-merge": "^3.3.1",
34
34
  "tailwindcss-animate": "^1.0.7",
35
35
  "zod": "^4.1.13",
36
- "next": "16.0.10"
36
+ "next": "16.1.0"
37
37
  },
38
38
  "devDependencies": {
39
- "@lssm/tool.typescript": "0.0.0-canary-20251219202229",
40
- "@lssm/tool.tsdown": "0.0.0-canary-20251219202229",
39
+ "@lssm/tool.typescript": "0.0.0-canary-20251220015515",
40
+ "@lssm/tool.tsdown": "0.0.0-canary-20251220015515",
41
41
  "@types/node": "^24.9.0",
42
42
  "@types/react-dom": "^19.0.14",
43
43
  "postcss": "^8.5",
@@ -59,7 +59,13 @@
59
59
  "exports": {
60
60
  ".": "./dist/index.js",
61
61
  "./*": "./*"
62
- }
62
+ },
63
+ "registry": "https://registry.npmjs.org/"
63
64
  },
64
- "license": "MIT"
65
+ "license": "MIT",
66
+ "repository": {
67
+ "type": "git",
68
+ "url": "https://github.com/lssm-tech/contractspec.git",
69
+ "directory": "packages/libs/design-system"
70
+ }
65
71
  }