@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.
- package/README.md +1 -0
- package/dist/components/agent/ApprovalQueue.js.map +1 -1
- package/dist/components/atoms/ActionButtons.d.ts +2 -2
- package/dist/components/atoms/ActionButtons.d.ts.map +1 -1
- package/dist/components/atoms/ActionButtons.js.map +1 -1
- package/dist/components/atoms/Button.d.ts.map +1 -1
- package/dist/components/atoms/Button.js.map +1 -1
- package/dist/components/atoms/Cta.d.ts.map +1 -1
- package/dist/components/atoms/Cta.js +1 -1
- package/dist/components/atoms/Cta.js.map +1 -1
- package/dist/components/atoms/Link.web.d.ts +3 -2
- package/dist/components/atoms/Link.web.d.ts.map +1 -1
- package/dist/components/atoms/Link.web.js +1 -1
- package/dist/components/atoms/Link.web.js.map +1 -1
- package/dist/components/atoms/Textarea.js.map +1 -1
- package/dist/components/data-view/DataViewRenderer.d.ts +2 -2
- package/dist/components/data-view/DataViewRenderer.d.ts.map +1 -1
- package/dist/components/data-view/DataViewRenderer.js +4 -3
- package/dist/components/data-view/DataViewRenderer.js.map +1 -1
- package/dist/components/forms/ZodForm.d.ts +2 -2
- package/dist/components/forms/ZodForm.d.ts.map +1 -1
- package/dist/components/forms/ZodForm.js.map +1 -1
- package/dist/components/legal/atoms/LegalHeading.js.map +1 -1
- package/dist/components/legal/atoms/LegalList.js.map +1 -1
- package/dist/components/legal/atoms/LegalText.js.map +1 -1
- package/dist/components/legal/molecules/Consent.js.map +1 -1
- package/dist/components/legal/molecules/LegalTOC.js +1 -1
- package/dist/components/legal/molecules/LegalTOC.js.map +1 -1
- package/dist/components/molecules/AiLinkButton.js +3 -3
- package/dist/components/molecules/AiLinkButton.js.map +1 -1
- package/dist/components/molecules/CommandPalette.js +1 -1
- package/dist/components/molecules/CommandPalette.js.map +1 -1
- package/dist/components/molecules/EntityCard.js.map +1 -1
- package/dist/components/molecules/NavItemCard.js.map +1 -1
- package/dist/components/molecules/SkeletonBlock/index.web.d.ts +2 -2
- package/dist/components/molecules/SkeletonCircle/index.web.d.ts +2 -2
- package/dist/components/molecules/StatusChip.js.map +1 -1
- package/dist/components/organisms/FAQSection.js +1 -1
- package/dist/components/organisms/FAQSection.js.map +1 -1
- package/dist/components/organisms/Footer.js.map +1 -1
- package/dist/components/organisms/HeroSection.js.map +1 -1
- package/dist/components/organisms/ListGridPage.js +0 -1
- package/dist/components/organisms/ListGridPage.js.map +1 -1
- package/dist/components/organisms/MarketingHeaderMobile.js.map +1 -1
- package/dist/components/organisms/PageHeaderResponsive.d.ts +1 -1
- package/dist/components/organisms/PageHeaderResponsive.d.ts.map +1 -1
- package/dist/components/organisms/PageHeaderResponsive.js.map +1 -1
- package/dist/components/templates/lists/ListPageTemplate/index.web.d.ts +1 -1
- package/dist/components/templates/lists/ListPageTemplate/index.web.js.map +1 -1
- package/dist/components/templates/lists/ListPageTemplate/types.d.ts +1 -1
- package/dist/contracts/dist/client/react/drivers/shadcn.js.map +1 -1
- package/dist/contracts/dist/client/react/form-render.js.map +1 -1
- package/dist/contracts/dist/forms.js +3 -2
- package/dist/contracts/dist/forms.js.map +1 -1
- package/dist/hooks/useListUrlState.d.ts.map +1 -1
- package/dist/hooks/useListUrlState.js.map +1 -1
- package/dist/renderers/form-contract.d.ts.map +1 -1
- package/dist/renderers/form-contract.js +2 -2
- package/dist/renderers/form-contract.js.map +1 -1
- package/package.json +17 -11
package/README.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApprovalQueue.js","names":[],"sources":["../../../src/components/agent/ApprovalQueue.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport type { ApprovalRequest } from '@lssm/lib.ai-agent/approval';\nimport {\n Table,\n TableHead,\n TableRow,\n TableHeader,\n TableBody,\n TableCell,\n} from '@lssm/lib.ui-kit-web/ui/table';\nimport { Card, CardHeader, CardContent } from '@lssm/lib.ui-kit-web/ui/card';\nimport { Badge } from '@lssm/lib.ui-kit-web/ui/badge';\nimport { Button } from '@lssm/lib.ui-kit-web/ui/button';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\n\nexport interface ApprovalQueueProps {\n title?: string;\n description?: string;\n requests: ApprovalRequest[];\n onApprove?: (request: ApprovalRequest) => void;\n onReject?: (request: ApprovalRequest) => void;\n className?: string;\n emptyState?: React.ReactNode;\n}\n\nexport function ApprovalQueue({\n title = 'Approvals',\n description = 'Requests escalated by AI agents',\n requests,\n onApprove,\n onReject,\n className,\n emptyState = (\n <p className=\"text-muted-foreground\">Nothing waiting for review.</p>\n ),\n}: ApprovalQueueProps) {\n return (\n <Card className={className}>\n <CardHeader>\n <div className=\"space-y-1\">\n <h3 className=\"text-xl font-semibold\">{title}</h3>\n <p className=\"text-muted-foreground text-sm\">{description}</p>\n </div>\n </CardHeader>\n <CardContent>\n {requests.length === 0 ? (\n emptyState\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Agent</TableHead>\n <TableHead>Reason</TableHead>\n <TableHead>Tenant</TableHead>\n <TableHead>Requested</TableHead>\n <TableHead>Status</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {requests.map((request) => (\n <TableRow key={request.id}>\n <TableCell className=\"font-medium\">\n {request.agentId}\n </TableCell>\n <TableCell className=\"max-w-sm truncate\">\n {request.reason}\n </TableCell>\n <TableCell>{request.tenantId ?? '—'}</TableCell>\n <TableCell>{formatRelative(request.requestedAt)}</TableCell>\n <TableCell>\n <Badge variant={badgeVariant(request.status)}>\n {request.status}\n </Badge>\n </TableCell>\n <TableCell>\n <div className=\"flex justify-end gap-2\">\n <Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={request.status !== 'pending'}\n onClick={() => onReject?.(request)}\n >\n Reject\n </Button>\n <Button\n size=\"sm\"\n disabled={request.status !== 'pending'}\n onClick={() => onApprove?.(request)}\n >\n Approve\n </Button>\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n </CardContent>\n </Card>\n );\n}\n\nfunction badgeVariant(\n status: ApprovalRequest['status']\n): 'default' | 'secondary' | 'outline' | 'destructive' {\n switch (status) {\n case 'approved':\n return 'default';\n case 'rejected':\n return 'destructive';\n default:\n return 'secondary';\n }\n}\n\nfunction formatRelative(date: Date) {\n const formatter = new Intl.RelativeTimeFormat(undefined, { numeric: 'auto' });\n const deltaMinutes = Math.round(\n (Date.now() - new Date(date).getTime()) / 60000\n );\n if (Math.abs(deltaMinutes) < 60) {\n return formatter.format(-deltaMinutes, 'minute');\n }\n const deltaHours = Math.round(deltaMinutes / 60);\n if (Math.abs(deltaHours) < 24) {\n return formatter.format(-deltaHours, 'hour');\n }\n const deltaDays = Math.round(deltaHours / 24);\n return formatter.format(-deltaDays, 'day');\n}\n"],"mappings":";;;;;;;;;;AA2BA,SAAgB,cAAc,EAC5B,QAAQ,aACR,cAAc,mCACd,UACA,WACA,UACA,WACA,aACE,oBAAC;CAAE,WAAU;WAAwB;EAA+B,IAEjD;AACrB,QACE,qBAAC;EAAgB;aACf,oBAAC,wBACC,qBAAC;GAAI,WAAU;cACb,oBAAC;IAAG,WAAU;cAAyB;KAAW,EAClD,oBAAC;IAAE,WAAU;cAAiC;KAAgB;IAC1D,GACK,EACb,oBAAC,yBACE,SAAS,WAAW,IACnB,aAEA,qBAAC,oBACC,oBAAC,yBACC,qBAAC;GACC,oBAAC,uBAAU,UAAiB;GAC5B,oBAAC,uBAAU,WAAkB;GAC7B,oBAAC,uBAAU,WAAkB;GAC7B,oBAAC,uBAAU,cAAqB;GAChC,oBAAC,uBAAU,WAAkB;GAC7B,oBAAC;IAAU,WAAU;cAAa;KAAmB;MAC5C,GACC,EACd,oBAAC,uBACE,SAAS,KAAK,YACb,qBAAC;GACC,oBAAC;IAAU,WAAU;cAClB,QAAQ;KACC;GACZ,oBAAC;IAAU,WAAU;cAClB,QAAQ;KACC;GACZ,oBAAC,uBAAW,QAAQ,YAAY,MAAgB;GAChD,oBAAC,uBAAW,eAAe,QAAQ,YAAY,GAAa;GAC5D,oBAAC,uBACC,oBAAC;IAAM,SAAS,aAAa,QAAQ,OAAO;cACzC,QAAQ;KACH,GACE;GACZ,oBAAC,uBACC,qBAAC;IAAI,WAAU;eACb,oBAAC;KACC,MAAK;KACL,SAAQ;KACR,UAAU,QAAQ,WAAW;KAC7B,eAAe,WAAW,QAAQ;eACnC;MAEQ,EACT,oBAAC;KACC,MAAK;KACL,UAAU,QAAQ,WAAW;KAC7B,eAAe,YAAY,QAAQ;eACpC;MAEQ;KACL,GACI;OAhCC,QAAQ,GAiCZ,CACX,GACQ,IACN,GAEE;GACT;;AAIX,SAAS,aACP,QACqD;AACrD,SAAQ,QAAR;EACE,KAAK,WACH,QAAO;EACT,KAAK,WACH,QAAO;EACT,QACE,QAAO;;;AAIb,SAAS,eAAe,MAAY;CAClC,MAAM,YAAY,IAAI,KAAK,mBAAmB,QAAW,EAAE,SAAS,QAAQ,CAAC;CAC7E,MAAM,eAAe,KAAK,OACvB,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,SAAS,IAAI,IAC3C;AACD,KAAI,KAAK,IAAI,aAAa,GAAG,GAC3B,QAAO,UAAU,OAAO,CAAC,cAAc,SAAS;CAElD,MAAM,aAAa,KAAK,MAAM,eAAe,GAAG;AAChD,KAAI,KAAK,IAAI,WAAW,GAAG,GACzB,QAAO,UAAU,OAAO,CAAC,YAAY,OAAO;CAE9C,MAAM,YAAY,KAAK,MAAM,aAAa,GAAG;AAC7C,QAAO,UAAU,OAAO,CAAC,WAAW,MAAM"}
|
|
1
|
+
{"version":3,"file":"ApprovalQueue.js","names":[],"sources":["../../../src/components/agent/ApprovalQueue.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport type { ApprovalRequest } from '@lssm/lib.ai-agent/approval';\nimport {\n Table,\n TableHead,\n TableRow,\n TableHeader,\n TableBody,\n TableCell,\n} from '@lssm/lib.ui-kit-web/ui/table';\nimport { Card, CardHeader, CardContent } from '@lssm/lib.ui-kit-web/ui/card';\nimport { Badge } from '@lssm/lib.ui-kit-web/ui/badge';\nimport { Button } from '@lssm/lib.ui-kit-web/ui/button';\nimport { cn as _cn } from '@lssm/lib.ui-kit-web/ui/utils';\n\nexport interface ApprovalQueueProps {\n title?: string;\n description?: string;\n requests: ApprovalRequest[];\n onApprove?: (request: ApprovalRequest) => void;\n onReject?: (request: ApprovalRequest) => void;\n className?: string;\n emptyState?: React.ReactNode;\n}\n\nexport function ApprovalQueue({\n title = 'Approvals',\n description = 'Requests escalated by AI agents',\n requests,\n onApprove,\n onReject,\n className,\n emptyState = (\n <p className=\"text-muted-foreground\">Nothing waiting for review.</p>\n ),\n}: ApprovalQueueProps) {\n return (\n <Card className={className}>\n <CardHeader>\n <div className=\"space-y-1\">\n <h3 className=\"text-xl font-semibold\">{title}</h3>\n <p className=\"text-muted-foreground text-sm\">{description}</p>\n </div>\n </CardHeader>\n <CardContent>\n {requests.length === 0 ? (\n emptyState\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Agent</TableHead>\n <TableHead>Reason</TableHead>\n <TableHead>Tenant</TableHead>\n <TableHead>Requested</TableHead>\n <TableHead>Status</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {requests.map((request) => (\n <TableRow key={request.id}>\n <TableCell className=\"font-medium\">\n {request.agentId}\n </TableCell>\n <TableCell className=\"max-w-sm truncate\">\n {request.reason}\n </TableCell>\n <TableCell>{request.tenantId ?? '—'}</TableCell>\n <TableCell>{formatRelative(request.requestedAt)}</TableCell>\n <TableCell>\n <Badge variant={badgeVariant(request.status)}>\n {request.status}\n </Badge>\n </TableCell>\n <TableCell>\n <div className=\"flex justify-end gap-2\">\n <Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={request.status !== 'pending'}\n onClick={() => onReject?.(request)}\n >\n Reject\n </Button>\n <Button\n size=\"sm\"\n disabled={request.status !== 'pending'}\n onClick={() => onApprove?.(request)}\n >\n Approve\n </Button>\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n </CardContent>\n </Card>\n );\n}\n\nfunction badgeVariant(\n status: ApprovalRequest['status']\n): 'default' | 'secondary' | 'outline' | 'destructive' {\n switch (status) {\n case 'approved':\n return 'default';\n case 'rejected':\n return 'destructive';\n default:\n return 'secondary';\n }\n}\n\nfunction formatRelative(date: Date) {\n const formatter = new Intl.RelativeTimeFormat(undefined, { numeric: 'auto' });\n const deltaMinutes = Math.round(\n (Date.now() - new Date(date).getTime()) / 60000\n );\n if (Math.abs(deltaMinutes) < 60) {\n return formatter.format(-deltaMinutes, 'minute');\n }\n const deltaHours = Math.round(deltaMinutes / 60);\n if (Math.abs(deltaHours) < 24) {\n return formatter.format(-deltaHours, 'hour');\n }\n const deltaDays = Math.round(deltaHours / 24);\n return formatter.format(-deltaDays, 'day');\n}\n"],"mappings":";;;;;;;;;;AA2BA,SAAgB,cAAc,EAC5B,QAAQ,aACR,cAAc,mCACd,UACA,WACA,UACA,WACA,aACE,oBAAC;CAAE,WAAU;WAAwB;EAA+B,IAEjD;AACrB,QACE,qBAAC;EAAgB;aACf,oBAAC,wBACC,qBAAC;GAAI,WAAU;cACb,oBAAC;IAAG,WAAU;cAAyB;KAAW,EAClD,oBAAC;IAAE,WAAU;cAAiC;KAAgB;IAC1D,GACK,EACb,oBAAC,yBACE,SAAS,WAAW,IACnB,aAEA,qBAAC,oBACC,oBAAC,yBACC,qBAAC;GACC,oBAAC,uBAAU,UAAiB;GAC5B,oBAAC,uBAAU,WAAkB;GAC7B,oBAAC,uBAAU,WAAkB;GAC7B,oBAAC,uBAAU,cAAqB;GAChC,oBAAC,uBAAU,WAAkB;GAC7B,oBAAC;IAAU,WAAU;cAAa;KAAmB;MAC5C,GACC,EACd,oBAAC,uBACE,SAAS,KAAK,YACb,qBAAC;GACC,oBAAC;IAAU,WAAU;cAClB,QAAQ;KACC;GACZ,oBAAC;IAAU,WAAU;cAClB,QAAQ;KACC;GACZ,oBAAC,uBAAW,QAAQ,YAAY,MAAgB;GAChD,oBAAC,uBAAW,eAAe,QAAQ,YAAY,GAAa;GAC5D,oBAAC,uBACC,oBAAC;IAAM,SAAS,aAAa,QAAQ,OAAO;cACzC,QAAQ;KACH,GACE;GACZ,oBAAC,uBACC,qBAAC;IAAI,WAAU;eACb,oBAAC;KACC,MAAK;KACL,SAAQ;KACR,UAAU,QAAQ,WAAW;KAC7B,eAAe,WAAW,QAAQ;eACnC;MAEQ,EACT,oBAAC;KACC,MAAK;KACL,UAAU,QAAQ,WAAW;KAC7B,eAAe,YAAY,QAAQ;eACpC;MAEQ;KACL,GACI;OAhCC,QAAQ,GAiCZ,CACX,GACQ,IACN,GAEE;GACT;;AAIX,SAAS,aACP,QACqD;AACrD,SAAQ,QAAR;EACE,KAAK,WACH,QAAO;EACT,KAAK,WACH,QAAO;EACT,QACE,QAAO;;;AAIb,SAAS,eAAe,MAAY;CAClC,MAAM,YAAY,IAAI,KAAK,mBAAmB,QAAW,EAAE,SAAS,QAAQ,CAAC;CAC7E,MAAM,eAAe,KAAK,OACvB,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,SAAS,IAAI,IAC3C;AACD,KAAI,KAAK,IAAI,aAAa,GAAG,GAC3B,QAAO,UAAU,OAAO,CAAC,cAAc,SAAS;CAElD,MAAM,aAAa,KAAK,MAAM,eAAe,GAAG;AAChD,KAAI,KAAK,IAAI,WAAW,GAAG,GACzB,QAAO,UAAU,OAAO,CAAC,YAAY,OAAO;CAE9C,MAAM,YAAY,KAAK,MAAM,aAAa,GAAG;AAC7C,QAAO,UAAU,OAAO,CAAC,WAAW,MAAM"}
|
|
@@ -5,11 +5,11 @@ import { VariantProps } from "class-variance-authority";
|
|
|
5
5
|
import * as class_variance_authority_types1 from "class-variance-authority/types";
|
|
6
6
|
|
|
7
7
|
//#region src/components/atoms/ActionButtons.d.ts
|
|
8
|
-
declare const
|
|
8
|
+
declare const _actionBtn: (props?: ({
|
|
9
9
|
tone?: "subtle" | "neutral" | "danger" | "outline" | null | undefined;
|
|
10
10
|
size?: "sm" | "md" | "lg" | "icon" | null | undefined;
|
|
11
11
|
} & class_variance_authority_types1.ClassProp) | undefined) => string;
|
|
12
|
-
type ActionBtnProps = Omit<ButtonProps, 'size' | 'variant'> & VariantProps<typeof
|
|
12
|
+
type ActionBtnProps = Omit<ButtonProps, 'size' | 'variant'> & VariantProps<typeof _actionBtn> & {
|
|
13
13
|
label?: React$1.ReactNode;
|
|
14
14
|
iconLeft?: React$1.ReactNode;
|
|
15
15
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionButtons.d.ts","names":[],"sources":["../../../src/components/atoms/ActionButtons.tsx"],"sourcesContent":[],"mappings":";;;;;;;cAaM;;;IAgBJ,+BAAA,CAAA;AA3BgE,KA6B7D,cAAA,GAAiB,IAFpB,CAEyB,WAFzB,EAAA,MAAA,GAAA,SAAA,CAAA,GAGA,YAHA,CAAA,OAGoB,
|
|
1
|
+
{"version":3,"file":"ActionButtons.d.ts","names":[],"sources":["../../../src/components/atoms/ActionButtons.tsx"],"sourcesContent":[],"mappings":";;;;;;;cAaM;;;IAgBJ,+BAAA,CAAA;AA3BgE,KA6B7D,cAAA,GAAiB,IAFpB,CAEyB,WAFzB,EAAA,MAAA,GAAA,SAAA,CAAA,GAGA,YAHA,CAAA,OAGoB,UAHpB,CAAA,GAAA;EAEG,KAAA,CAAA,EAEO,OAAA,CAAM,SAFC;EAAQ,QAAA,CAAA,EAGZ,OAAA,CAAM,SAHM;CAAL;AACA,iBAwDN,UAAA,CAxDM,KAAA,EAwDY,IAxDZ,CAwDiB,cAxDjB,EAAA,UAAA,GAAA,MAAA,CAAA,CAAA,EAwDqD,kBAAA,CAAA,GAAA,CAAA,OAxDrD;AAApB,iBA8Dc,YAAA,CA9Dd,KAAA,EA8DkC,IA9DlC,CA8DuC,cA9DvC,EAAA,UAAA,CAAA,CAAA,EA8DkE,kBAAA,CAAA,GAAA,CAAA,OA9DlE;AACU,iBAuEI,UAAA,CAvEE,KAAA,EAuEgB,IAvEhB,CAuEqB,cAvErB,EAAA,UAAA,CAAA,CAAA,EAuEgD,kBAAA,CAAA,GAAA,CAAA,OAvEhD;AACH,iBA4EC,YAAA,CA5EK,KAAA,EA6EZ,IA7EY,CA6EP,cA7EO,EAAA,UAAA,CAAA,GAAA;EAAS,MAAA,CAAA,EAAA,OAAA;AAsD9B,CAAA,CAAA,EAuBgE,kBAAA,CAAA,GAAA,CAAA,OAvBtC;AAAa,iBAwCvB,gBAAA,CAxCuB,KAAA,EAwCC,IAxCD,CAwCM,cAxCN,EAAA,UAAA,CAAA,CAAA,EAwCiC,kBAAA,CAAA,GAAA,CAAA,OAxCjC;AAAL,iBAiDlB,iBAAA,CAjDkB,KAAA,EAiDO,IAjDP,CAiDY,cAjDZ,EAAA,UAAA,CAAA,CAAA,EAiDuC,kBAAA,CAAA,GAAA,CAAA,OAjDvC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionButtons.js","names":["EditIcon","DeleteIcon","ViewIcon","ToggleLeftIcon","ToggleRightIcon"],"sources":["../../../src/components/atoms/ActionButtons.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Button, type ButtonProps } from './Button';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport {\n Edit as EditIcon,\n Eye as ViewIcon,\n ToggleLeft as ToggleLeftIcon,\n ToggleRight as ToggleRightIcon,\n Trash2 as DeleteIcon,\n} from 'lucide-react';\nimport { Box } from '@lssm/lib.ui-kit-web/ui/stack';\nimport { Text } from '@lssm/lib.ui-kit-web/ui/text';\n\nconst
|
|
1
|
+
{"version":3,"file":"ActionButtons.js","names":["EditIcon","DeleteIcon","ViewIcon","ToggleLeftIcon","ToggleRightIcon"],"sources":["../../../src/components/atoms/ActionButtons.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Button, type ButtonProps } from './Button';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport {\n Edit as EditIcon,\n Eye as ViewIcon,\n ToggleLeft as ToggleLeftIcon,\n ToggleRight as ToggleRightIcon,\n Trash2 as DeleteIcon,\n} from 'lucide-react';\nimport { Box } from '@lssm/lib.ui-kit-web/ui/stack';\nimport { Text } from '@lssm/lib.ui-kit-web/ui/text';\n\nconst _actionBtn = cva('', {\n variants: {\n tone: {\n neutral: 'default',\n danger: 'destructive',\n subtle: 'secondary',\n outline: 'outline',\n },\n size: {\n sm: 'sm',\n md: 'default',\n lg: 'lg',\n icon: 'icon',\n },\n },\n defaultVariants: { tone: 'neutral', size: 'md' },\n});\n\ntype ActionBtnProps = Omit<ButtonProps, 'size' | 'variant'> &\n VariantProps<typeof _actionBtn> & {\n label?: React.ReactNode;\n iconLeft?: React.ReactNode;\n };\n\nfunction toVariant(\n tone: NonNullable<VariantProps<typeof _actionBtn>['tone']>\n): ButtonProps['variant'] {\n switch (tone) {\n case 'danger':\n return 'destructive';\n case 'subtle':\n return 'secondary';\n case 'outline':\n return 'outline';\n default:\n return 'default';\n }\n}\n\nfunction toSize(\n size: NonNullable<VariantProps<typeof _actionBtn>['size']>\n): ButtonProps['size'] {\n switch (size) {\n case 'sm':\n return 'sm';\n case 'lg':\n return 'lg';\n case 'icon':\n return 'icon';\n default:\n return 'default';\n }\n}\n\nfunction ActionButtonBase({\n tone = 'neutral',\n size = 'md',\n label,\n iconLeft,\n ...props\n}: ActionBtnProps) {\n return (\n <Button\n variant={toVariant(tone || 'neutral')}\n size={toSize(size || 'md')}\n {...props}\n >\n {iconLeft ? (\n <Box className=\"mr-2 inline-flex h-4 w-4\">{iconLeft}</Box>\n ) : null}\n <Text>{label}</Text>\n </Button>\n );\n}\n\nexport function EditButton(props: Omit<ActionBtnProps, 'iconLeft' | 'tone'>) {\n return (\n <ActionButtonBase iconLeft={<EditIcon className=\"h-4 w-4\" />} {...props} />\n );\n}\n\nexport function DeleteButton(props: Omit<ActionBtnProps, 'iconLeft'>) {\n return (\n <ActionButtonBase\n iconLeft={<DeleteIcon className=\"h-4 w-4\" />}\n tone=\"danger\"\n {...props}\n />\n );\n}\n\nexport function ViewButton(props: Omit<ActionBtnProps, 'iconLeft'>) {\n return (\n <ActionButtonBase iconLeft={<ViewIcon className=\"h-4 w-4\" />} {...props} />\n );\n}\n\nexport function ToggleButton(\n props: Omit<ActionBtnProps, 'iconLeft'> & { active?: boolean }\n) {\n const { active, ...rest } = props;\n return (\n <ActionButtonBase\n iconLeft={\n active ? (\n <ToggleLeftIcon className=\"h-4 w-4\" />\n ) : (\n <ToggleRightIcon className=\"h-4 w-4\" />\n )\n }\n {...rest}\n />\n );\n}\n\nexport function ToggleLeftButton(props: Omit<ActionBtnProps, 'iconLeft'>) {\n return (\n <ActionButtonBase\n iconLeft={<ToggleLeftIcon className=\"h-4 w-4\" />}\n {...props}\n />\n );\n}\n\nexport function ToggleRightButton(props: Omit<ActionBtnProps, 'iconLeft'>) {\n return (\n <ActionButtonBase\n iconLeft={<ToggleRightIcon className=\"h-4 w-4\" />}\n {...props}\n />\n );\n}\n"],"mappings":";;;;;;;;;AAamB,IAAI,IAAI;CACzB,UAAU;EACR,MAAM;GACJ,SAAS;GACT,QAAQ;GACR,QAAQ;GACR,SAAS;GACV;EACD,MAAM;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,MAAM;GACP;EACF;CACD,iBAAiB;EAAE,MAAM;EAAW,MAAM;EAAM;CACjD,CAAC;AAQF,SAAS,UACP,MACwB;AACxB,SAAQ,MAAR;EACE,KAAK,SACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,KAAK,UACH,QAAO;EACT,QACE,QAAO;;;AAIb,SAAS,OACP,MACqB;AACrB,SAAQ,MAAR;EACE,KAAK,KACH,QAAO;EACT,KAAK,KACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,QACE,QAAO;;;AAIb,SAAS,iBAAiB,EACxB,OAAO,WACP,OAAO,MACP,OACA,UACA,GAAG,SACc;AACjB,QACE,qBAAC;EACC,SAAS,UAAU,QAAQ,UAAU;EACrC,MAAM,OAAO,QAAQ,KAAK;EAC1B,GAAI;aAEH,WACC,oBAAC;GAAI,WAAU;aAA4B;IAAe,GACxD,MACJ,oBAAC,kBAAM,QAAa;GACb;;AAIb,SAAgB,WAAW,OAAkD;AAC3E,QACE,oBAAC;EAAiB,UAAU,oBAACA,QAAS,WAAU,YAAY;EAAE,GAAI;GAAS;;AAI/E,SAAgB,aAAa,OAAyC;AACpE,QACE,oBAAC;EACC,UAAU,oBAACC,UAAW,WAAU,YAAY;EAC5C,MAAK;EACL,GAAI;GACJ;;AAIN,SAAgB,WAAW,OAAyC;AAClE,QACE,oBAAC;EAAiB,UAAU,oBAACC,OAAS,WAAU,YAAY;EAAE,GAAI;GAAS;;AAI/E,SAAgB,aACd,OACA;CACA,MAAM,EAAE,QAAQ,GAAG,SAAS;AAC5B,QACE,oBAAC;EACC,UACE,SACE,oBAACC,cAAe,WAAU,YAAY,GAEtC,oBAACC,eAAgB,WAAU,YAAY;EAG3C,GAAI;GACJ;;AAIN,SAAgB,iBAAiB,OAAyC;AACxE,QACE,oBAAC;EACC,UAAU,oBAACD,cAAe,WAAU,YAAY;EAChD,GAAI;GACJ;;AAIN,SAAgB,kBAAkB,OAAyC;AACzE,QACE,oBAAC;EACC,UAAU,oBAACC,eAAgB,WAAU,YAAY;EACjD,GAAI;GACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.d.ts","names":[],"sources":["../../../src/components/atoms/Button.tsx"],"sourcesContent":[],"mappings":";;;;;KASK,gBAAA;
|
|
1
|
+
{"version":3,"file":"Button.d.ts","names":[],"sources":["../../../src/components/atoms/Button.tsx"],"sourcesContent":[],"mappings":";;;;;KASK,gBAAA;KAEO,aAAA,GAAc,KACxB;YAIU,OAAA,CAAM;EAPb,OAAA,CAAA,EAAA,OAAA;EAEO,WAAA,CAAA,EAAA,MAAW;EACrB,gBAAA,CAAA,EAOmB,gBAPnB;EADwB,OAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EAKd,SAAM,CAAA,EAAA,GAAA,GAAA,IAAA;EAGG,UAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EAOe,WAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EAAxB,OAAM,CAAA,EAAN,OAAA,CAAM,iBAAA,CAAkB,iBAAlB,CAAA;EAAiB,QAAA,CAAA,EAAA,OAAA;AAInC,CAAA;AACE,iBADc,MAAA,CACd;EAAA,QAAA;EAAA,OAAA;EAAA,gBAAA;EAAA,OAAA;EAAA,SAAA;EAAA,UAAA;EAAA,WAAA;EAAA,YAAA;EAAA,UAAA;EAAA,aAAA;EAAA,WAAA;EAAA,SAAA;EAAA,OAAA;EAAA,SAAA;EAAA,QAAA;EAAA,GAAA;AAAA,CAAA,EAgBC,aAhBD,CAAA,EAgBY,kBAAA,CAAA,GAAA,CAAA,OAhBZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.js","names":["WebButton"],"sources":["../../../src/components/atoms/Button.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n Button as WebButton,\n type ButtonProps as WebButtonProps,\n} from '@lssm/lib.ui-kit-web/ui/button';\nimport { Loader2 } from 'lucide-react';\n// type-only import to avoid bundling RN on web\nimport type { PressableProps as
|
|
1
|
+
{"version":3,"file":"Button.js","names":["WebButton"],"sources":["../../../src/components/atoms/Button.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n Button as WebButton,\n type ButtonProps as WebButtonProps,\n} from '@lssm/lib.ui-kit-web/ui/button';\nimport { Loader2 } from 'lucide-react';\n// type-only import to avoid bundling RN on web\nimport type { PressableProps as _RNPressableProps } from 'react-native';\n\ntype SpinnerPlacement = 'start' | 'end';\n\nexport type ButtonProps = Omit<\n WebButtonProps,\n 'onClick' | 'disabled' | 'children'\n> & {\n // PressableBridgeProps & {\n children: React.ReactNode;\n loading?: boolean;\n loadingText?: string; // ignored on web, present for API symmetry\n spinnerPlacement?: SpinnerPlacement;\n // Normalized events\n onPress?: () => void;\n onPressIn?: () => void;\n onPressOut?: () => void;\n onLongPress?: () => void;\n // Web-only optional onClick for compatibility\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n disabled?: boolean;\n};\n\nexport function Button({\n children,\n loading,\n spinnerPlacement = 'start',\n onPress,\n onPressIn,\n onPressOut,\n onLongPress,\n onTouchStart,\n onTouchEnd,\n onTouchCancel,\n onMouseDown,\n onMouseUp,\n onClick,\n className,\n disabled,\n ...rest\n}: ButtonProps) {\n const isDisabled = Boolean(disabled || loading);\n\n const content = !rest.asChild ? (\n <>\n {loading && spinnerPlacement === 'start' ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : null}\n {children}\n {loading && spinnerPlacement === 'end' ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : null}\n </>\n ) : (\n children\n );\n\n return (\n <WebButton\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n {...(rest as any)}\n className={className}\n disabled={isDisabled}\n aria-busy={loading ? true : undefined}\n aria-disabled={isDisabled ? true : undefined}\n // normalized + bridged events\n onPress={onPress || onClick}\n onClick={onPress || onClick}\n onMouseDown={onMouseDown || onPressIn}\n onMouseUp={onMouseUp || onPressOut}\n onTouchStart={onTouchStart}\n onTouchEnd={onTouchEnd || onPressOut}\n onTouchCancel={onTouchCancel || onPressOut}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n type={(rest as any)?.type ?? 'button'}\n >\n {content}\n </WebButton>\n );\n}\n\nexport default Button;\n"],"mappings":";;;;;;AA8BA,SAAgB,OAAO,EACrB,UACA,SACA,mBAAmB,SACnB,SACA,WACA,YACA,aACA,cACA,YACA,eACA,aACA,WACA,SACA,WACA,UACA,GAAG,QACW;CACd,MAAM,aAAa,QAAQ,YAAY,QAAQ;CAE/C,MAAM,UAAU,CAAC,KAAK,UACpB;EACG,WAAW,qBAAqB,UAC/B,oBAAC,WAAQ,WAAU,yBAAyB,GAC1C;EACH;EACA,WAAW,qBAAqB,QAC/B,oBAAC,WAAQ,WAAU,yBAAyB,GAC1C;KACH,GAEH;AAGF,QACE,oBAACA;EAEC,GAAK;EACM;EACX,UAAU;EACV,aAAW,UAAU,OAAO;EAC5B,iBAAe,aAAa,OAAO;EAEnC,SAAS,WAAW;EACpB,SAAS,WAAW;EACpB,aAAa,eAAe;EAC5B,WAAW,aAAa;EACV;EACd,YAAY,cAAc;EAC1B,eAAe,iBAAiB;EAEhC,MAAO,MAAc,QAAQ;YAE5B;GACS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cta.d.ts","names":[],"sources":["../../../src/components/atoms/Cta.tsx"],"sourcesContent":[],"mappings":";;;;;;;;cAsBa,KAAG,OAAA,CAAA,0BAAA,
|
|
1
|
+
{"version":3,"file":"Cta.d.ts","names":[],"sources":["../../../src/components/atoms/Cta.tsx"],"sourcesContent":[],"mappings":";;;;;;;;cAsBa,KAAG,OAAA,CAAA,0BAAA,KAgFf,+BAAA,CAhFe,WAAA;EAHD,QAAM,mBAAA;;;;EAGL,OAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EAAA,SAAA,CAAA,EAAA,GAAA,GAAA,IAAA;;;;;;;;;;;;;aAHD,OAAA,CAAM"}
|
|
@@ -24,7 +24,7 @@ cva("", {
|
|
|
24
24
|
emphasis: "default"
|
|
25
25
|
}
|
|
26
26
|
});
|
|
27
|
-
const Cta = React$1.forwardRef(({ capture, ctaName, as = "button", href, onClick, size = "touch", emphasis = "default", children, ...props },
|
|
27
|
+
const Cta = React$1.forwardRef(({ capture, ctaName, as = "button", href, onClick, size = "touch", emphasis = "default", children, ...props }, _ref) => {
|
|
28
28
|
const handleClick = (e) => {
|
|
29
29
|
if (ctaName) try {
|
|
30
30
|
if (capture) capture(ctaName);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cta.js","names":["React","handleClick: React.MouseEventHandler<\n HTMLButtonElement | HTMLAnchorElement\n >"],"sources":["../../../src/components/atoms/Cta.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Button, type ButtonProps } from './Button';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { ButtonLink } from './ButtonLink';\n\nconst
|
|
1
|
+
{"version":3,"file":"Cta.js","names":["React","handleClick: React.MouseEventHandler<\n HTMLButtonElement | HTMLAnchorElement\n >"],"sources":["../../../src/components/atoms/Cta.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Button, type ButtonProps } from './Button';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { ButtonLink } from './ButtonLink';\n\nconst _ctaVariants = cva('', {\n variants: {\n size: { sm: 'sm', md: 'md', lg: 'lg', touch: 'touch' },\n emphasis: { default: 'default', subtle: 'secondary', strong: 'default' },\n },\n defaultVariants: { size: 'touch', emphasis: 'default' },\n});\n\nexport type CtaProps = ButtonProps &\n VariantProps<typeof _ctaVariants> & {\n capture?: (cta: string) => void;\n ctaName?: string;\n as?: 'button' | 'a';\n href?: string;\n children?: React.ReactNode;\n };\n\nexport const Cta = React.forwardRef<\n HTMLButtonElement | HTMLAnchorElement,\n CtaProps\n>(\n (\n {\n capture,\n ctaName,\n as = 'button',\n href,\n onClick,\n size = 'touch',\n emphasis = 'default',\n children,\n ...props\n },\n _ref\n ) => {\n const handleClick: React.MouseEventHandler<\n HTMLButtonElement | HTMLAnchorElement\n > = (e) => {\n if (ctaName) {\n try {\n if (capture) capture(ctaName);\n // Optional PostHog fallback if present globally\n const ph = (globalThis as unknown as { posthog?: unknown }).posthog;\n if (\n ph &&\n typeof (ph as { capture?: unknown }).capture === 'function'\n ) {\n (\n ph as {\n capture: (\n event: string,\n props?: Record<string, unknown>\n ) => void;\n }\n ).capture('cta_click', { cta: ctaName });\n }\n } catch {\n /* noop */\n }\n }\n onClick?.(e as unknown as React.MouseEvent<HTMLButtonElement>);\n };\n\n const uiSize = size as ButtonProps['size'];\n const uiVariant = (\n emphasis === 'subtle' ? 'secondary' : 'default'\n ) as ButtonProps['variant'];\n\n if (as === 'a') {\n return (\n <ButtonLink\n size={uiSize}\n variant={uiVariant}\n {...props}\n href={href}\n onClick={\n handleClick as unknown as React.MouseEventHandler<HTMLAnchorElement>\n }\n >\n {children}\n </ButtonLink>\n );\n }\n\n return (\n <Button\n size={uiSize}\n variant={uiVariant}\n onClick={\n handleClick as unknown as React.MouseEventHandler<HTMLButtonElement>\n }\n {...props}\n >\n {children}\n </Button>\n );\n }\n);\nCta.displayName = 'Cta';\n"],"mappings":";;;;;;;AAKqB,IAAI,IAAI;CAC3B,UAAU;EACR,MAAM;GAAE,IAAI;GAAM,IAAI;GAAM,IAAI;GAAM,OAAO;GAAS;EACtD,UAAU;GAAE,SAAS;GAAW,QAAQ;GAAa,QAAQ;GAAW;EACzE;CACD,iBAAiB;EAAE,MAAM;EAAS,UAAU;EAAW;CACxD,CAAC;AAWF,MAAa,MAAMA,QAAM,YAKrB,EACE,SACA,SACA,KAAK,UACL,MACA,SACA,OAAO,SACP,WAAW,WACX,UACA,GAAG,SAEL,SACG;CACH,MAAMC,eAED,MAAM;AACT,MAAI,QACF,KAAI;AACF,OAAI,QAAS,SAAQ,QAAQ;GAE7B,MAAM,KAAM,WAAgD;AAC5D,OACE,MACA,OAAQ,GAA6B,YAAY,WAEjD,CACE,GAMA,QAAQ,aAAa,EAAE,KAAK,SAAS,CAAC;UAEpC;AAIV,YAAU,EAAoD;;CAGhE,MAAM,SAAS;CACf,MAAM,YACJ,aAAa,WAAW,cAAc;AAGxC,KAAI,OAAO,IACT,QACE,oBAAC;EACC,MAAM;EACN,SAAS;EACT,GAAI;EACE;EACN,SACE;EAGD;GACU;AAIjB,QACE,oBAAC;EACC,MAAM;EACN,SAAS;EACT,SACE;EAEF,GAAI;EAEH;GACM;EAGd;AACD,IAAI,cAAc"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import * as React$1 from "react";
|
|
2
2
|
import "react/jsx-runtime";
|
|
3
|
+
import { UrlObject } from "url";
|
|
3
4
|
|
|
4
5
|
//#region src/components/atoms/Link.web.d.ts
|
|
5
6
|
type LinkProps = {
|
|
6
|
-
href
|
|
7
|
+
href?: string | UrlObject;
|
|
7
8
|
children?: React$1.ReactNode;
|
|
8
9
|
className?: string;
|
|
9
10
|
prefetch?: boolean;
|
|
@@ -13,7 +14,7 @@ type LinkProps = {
|
|
|
13
14
|
target?: string;
|
|
14
15
|
rel?: string;
|
|
15
16
|
onClick?: React$1.MouseEventHandler<HTMLAnchorElement>;
|
|
16
|
-
} & Record<string,
|
|
17
|
+
} & Record<string, unknown>;
|
|
17
18
|
//#endregion
|
|
18
19
|
export { LinkProps };
|
|
19
20
|
//# sourceMappingURL=Link.web.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Link.web.d.ts","names":[],"sources":["../../../src/components/atoms/Link.web.tsx"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Link.web.d.ts","names":[],"sources":["../../../src/components/atoms/Link.web.tsx"],"sourcesContent":[],"mappings":";;;;;KAIY,SAAA;kBACM;aACL,OAAA,CAAM;EAFP,SAAA,CAAA,EAAS,MAAA;EACH,QAAA,CAAA,EAAA,OAAA;EACL,OAAM,CAAA,EAAA,OAAA;EAQiB,MAAA,CAAA,EAAA,OAAA;EAAxB,OAAM,CAAA,EAAA,OAAA;EACd,MAAA,CAAA,EAAA,MAAA;EAAM,GAAA,CAAA,EAAA,MAAA;YADE,OAAA,CAAM,kBAAkB;IAChC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Link.web.js","names":["Link","NextLink"],"sources":["../../../src/components/atoms/Link.web.tsx"],"sourcesContent":["import * as React from 'react';\nimport NextLink from 'next/link';\n\nexport type LinkProps = {\n href
|
|
1
|
+
{"version":3,"file":"Link.web.js","names":["Link","NextLink"],"sources":["../../../src/components/atoms/Link.web.tsx"],"sourcesContent":["import * as React from 'react';\nimport NextLink from 'next/link';\nimport type { UrlObject } from 'url';\n\nexport type LinkProps = {\n href?: string | UrlObject;\n children?: React.ReactNode;\n className?: string;\n prefetch?: boolean;\n replace?: boolean;\n scroll?: boolean;\n shallow?: boolean;\n target?: string;\n rel?: string;\n onClick?: React.MouseEventHandler<HTMLAnchorElement>;\n} & Record<string, unknown>;\n\nexport function Link({ href, children, ...props }: LinkProps) {\n return (\n <NextLink href={href || '#'} {...props}>\n {children}\n </NextLink>\n );\n}\n"],"mappings":";;;;;AAiBA,SAAgBA,OAAK,EAAE,MAAM,UAAU,GAAG,SAAoB;AAC5D,QACE,oBAACC;EAAS,MAAM,QAAQ;EAAK,GAAI;EAC9B;GACQ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Textarea.js","names":["React","WebTextarea"],"sources":["../../../src/components/atoms/Textarea.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n Textarea as WebTextarea,\n type TextareaProps as WebTextareaProps,\n} from '@lssm/lib.ui-kit-web/ui/textarea';\nimport { type KeyboardOptions, mapKeyboardToWeb } from '../../lib/keyboard';\n\ninterface BaseFieldProps {\n value?: string;\n defaultValue?: string;\n // onChange?: (text: string) => void;\n // onSubmit?: () => void;\n // onFocus?: () => void;\n // onBlur?: () => void;\n placeholder?: string;\n disabled?: boolean;\n readOnly?: boolean;\n maxLength?: number;\n name?: string;\n className?: string;\n rows?: number;\n keyboard?: KeyboardOptions;\n}\n\nexport type TextareaProps = WebTextareaProps & BaseFieldProps;\n\n// export type TextareaProps = Omit<\n// WebTextareaProps,\n// // 'onChange' | 'value' | 'defaultValue'\n// > &\n// BaseFieldProps;\n\nexport function Textarea({\n value,\n defaultValue,\n onChange,\n onSubmit,\n onFocus,\n onBlur,\n placeholder,\n disabled,\n readOnly,\n maxLength,\n name,\n className,\n rows,\n keyboard,\n ...rest\n}: TextareaProps) {\n const webKeyboard = mapKeyboardToWeb(keyboard);\n\n const handleChange = React.useCallback<\n React.ChangeEventHandler<HTMLTextAreaElement>\n >((e) => onChange?.(e), [onChange]);\n\n const handleKeyDown = React.useCallback<\n React.KeyboardEventHandler<HTMLTextAreaElement>\n >(\n (e) => {\n if (e.key === 'Enter' && webKeyboard.type !== 'search') {\n // For textarea, Enter inserts newline; onSubmit could be used with modifier\n if (e.metaKey || e.ctrlKey) onSubmit?.(e);\n }\n },\n [onSubmit, webKeyboard.type]\n );\n\n return (\n <WebTextarea\n {...(rest as any)}\n className={className}\n value={value as any}\n defaultValue={defaultValue as any}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={onFocus as any}\n onBlur={onBlur as any}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n maxLength={maxLength}\n name={name}\n rows={rows}\n {...webKeyboard}\n />\n );\n}\n\nexport default Textarea;\n"],"mappings":";;;;;;AAgCA,SAAgB,SAAS,EACvB,OACA,cACA,UACA,UACA,SACA,QACA,aACA,UACA,UACA,WACA,MACA,WACA,MACA,UACA,GAAG,QACa;CAChB,MAAM,cAAc,iBAAiB,SAAS;CAE9C,MAAM,eAAeA,QAAM,aAExB,MAAM,WAAW,EAAE,EAAE,CAAC,SAAS,CAAC;CAEnC,MAAM,gBAAgBA,QAAM,aAGzB,MAAM;AACL,MAAI,EAAE,QAAQ,WAAW,YAAY,SAAS,UAE5C;OAAI,EAAE,WAAW,EAAE,QAAS,YAAW,EAAE;;IAG7C,CAAC,UAAU,YAAY,KAAK,CAC7B;AAED,QACE,oBAACC;
|
|
1
|
+
{"version":3,"file":"Textarea.js","names":["React","WebTextarea"],"sources":["../../../src/components/atoms/Textarea.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n Textarea as WebTextarea,\n type TextareaProps as WebTextareaProps,\n} from '@lssm/lib.ui-kit-web/ui/textarea';\nimport { type KeyboardOptions, mapKeyboardToWeb } from '../../lib/keyboard';\n\ninterface BaseFieldProps {\n value?: string;\n defaultValue?: string;\n // onChange?: (text: string) => void;\n // onSubmit?: () => void;\n // onFocus?: () => void;\n // onBlur?: () => void;\n placeholder?: string;\n disabled?: boolean;\n readOnly?: boolean;\n maxLength?: number;\n name?: string;\n className?: string;\n rows?: number;\n keyboard?: KeyboardOptions;\n}\n\nexport type TextareaProps = WebTextareaProps & BaseFieldProps;\n\n// export type TextareaProps = Omit<\n// WebTextareaProps,\n// // 'onChange' | 'value' | 'defaultValue'\n// > &\n// BaseFieldProps;\n\nexport function Textarea({\n value,\n defaultValue,\n onChange,\n onSubmit,\n onFocus,\n onBlur,\n placeholder,\n disabled,\n readOnly,\n maxLength,\n name,\n className,\n rows,\n keyboard,\n ...rest\n}: TextareaProps) {\n const webKeyboard = mapKeyboardToWeb(keyboard);\n\n const handleChange = React.useCallback<\n React.ChangeEventHandler<HTMLTextAreaElement>\n >((e) => onChange?.(e), [onChange]);\n\n const handleKeyDown = React.useCallback<\n React.KeyboardEventHandler<HTMLTextAreaElement>\n >(\n (e) => {\n if (e.key === 'Enter' && webKeyboard.type !== 'search') {\n // For textarea, Enter inserts newline; onSubmit could be used with modifier\n if (e.metaKey || e.ctrlKey) onSubmit?.(e);\n }\n },\n [onSubmit, webKeyboard.type]\n );\n\n return (\n <WebTextarea\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n {...(rest as any)}\n className={className}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value={value as any}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n defaultValue={defaultValue as any}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onFocus={onFocus as any}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onBlur={onBlur as any}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n maxLength={maxLength}\n name={name}\n rows={rows}\n {...webKeyboard}\n />\n );\n}\n\nexport default Textarea;\n"],"mappings":";;;;;;AAgCA,SAAgB,SAAS,EACvB,OACA,cACA,UACA,UACA,SACA,QACA,aACA,UACA,UACA,WACA,MACA,WACA,MACA,UACA,GAAG,QACa;CAChB,MAAM,cAAc,iBAAiB,SAAS;CAE9C,MAAM,eAAeA,QAAM,aAExB,MAAM,WAAW,EAAE,EAAE,CAAC,SAAS,CAAC;CAEnC,MAAM,gBAAgBA,QAAM,aAGzB,MAAM;AACL,MAAI,EAAE,QAAQ,WAAW,YAAY,SAAS,UAE5C;OAAI,EAAE,WAAW,EAAE,QAAS,YAAW,EAAE;;IAG7C,CAAC,UAAU,YAAY,KAAK,CAC7B;AAED,QACE,oBAACC;EAEC,GAAK;EACM;EAEJ;EAEO;EACd,UAAU;EACV,WAAW;EAEF;EAED;EACK;EACH;EACA;EACC;EACL;EACA;EACN,GAAI;GACJ"}
|
|
@@ -16,8 +16,8 @@ interface DataViewRendererProps {
|
|
|
16
16
|
footer?: React$1.ReactNode;
|
|
17
17
|
search?: string;
|
|
18
18
|
onSearchChange?: (value: string) => void;
|
|
19
|
-
filters?: Record<string,
|
|
20
|
-
onFilterChange?: (filters: Record<string,
|
|
19
|
+
filters?: Record<string, unknown>;
|
|
20
|
+
onFilterChange?: (filters: Record<string, unknown>) => void;
|
|
21
21
|
pagination?: {
|
|
22
22
|
page: number;
|
|
23
23
|
pageSize: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataViewRenderer.d.ts","names":[],"sources":["../../../src/components/data-view/DataViewRenderer.tsx"],"sourcesContent":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"DataViewRenderer.d.ts","names":[],"sources":["../../../src/components/data-view/DataViewRenderer.tsx"],"sourcesContent":[],"mappings":";;;;;UAqBiB,qBAAA;QACT;UACE;EAFO,IAAA,CAAA,EAGR,MAHQ,CAAA,MAAA,EAAA,OAAqB,CAAA,GAAA,IAAA;EAC9B,SAAA,CAAA,EAAA,MAAA;EACE,aAAA,CAAA,EAAA,CAAA,IAAA,EAGe,MAHf,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,GAG2C,OAAA,CAAM,SAHjD;EACD,QAAA,CAAA,EAAA,CAAA,IAAA,EAGW,MAHX,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,GAAA,IAAA;EAEgB,UAAA,CAAA,EAAA,CAAA,IAAA,EAEH,MAFG,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,GAAA,IAAA;EAA4B,aAAM,CAAA,EAGzC,OAAA,CAAM,SAHmC;EACvC,UAAA,CAAA,EAGL,OAAA,CAAM,SAHD;EACE,MAAA,CAAA,EAGX,OAAA,CAAM,SAHK;EACJ,MAAM,CAAA,EAAA,MAAA;EACT,cAAM,CAAA,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,GAAA,IAAA;EACV,OAAM,CAAA,EAKL,MALK,CAAA,MAAA,EAAA,OAAA,CAAA;EAKL,cAAA,CAAA,EAAA,CAAA,OAAA,EACiB,MADjB,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,GAAA,IAAA;EACiB,UAAA,CAAA,EAAA;IAAM,IAAA,EAAA,MAAA;IAWnB,QAAA,EAAA,MAAgB;IAC9B,KAAA,EAAA,MAAA;EACA,CAAA;EACA,YAAA,CAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,GAAA,IAAA;;AAEA,iBALc,gBAAA,CAKd;EAAA,IAAA;EAAA,KAAA;EAAA,IAAA;EAAA,SAAA;EAAA,aAAA;EAAA,QAAA;EAAA,UAAA;EAAA,aAAA;EAAA,UAAA;EAAA,MAAA;EAAA,MAAA;EAAA,cAAA;EAAA,OAAA;EAAA,cAAA;EAAA,UAAA;EAAA;AAAA,CAAA,EAYC,qBAZD,CAAA,EAYsB,kBAAA,CAAA,GAAA,CAAA,OAZtB"}
|
|
@@ -88,9 +88,10 @@ function DataViewRenderer({ spec, items = [], item = null, className, renderActi
|
|
|
88
88
|
key,
|
|
89
89
|
label: `${key}: ${value}`,
|
|
90
90
|
onRemove: () => {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
if (filters) {
|
|
92
|
+
const { [key]: _, ...rest } = filters;
|
|
93
|
+
onFilterChange?.(rest);
|
|
94
|
+
}
|
|
94
95
|
}
|
|
95
96
|
})) : [],
|
|
96
97
|
onClearAll: filters && Object.keys(filters).length > 0 ? () => onFilterChange?.({}) : void 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataViewRenderer.js","names":["React","listView: DataViewListConfig"],"sources":["../../../src/components/data-view/DataViewRenderer.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport type {\n DataViewGridConfig,\n DataViewListConfig,\n DataViewSpec,\n} from '@lssm/lib.contracts/data-views';\nimport { DataViewList } from './DataViewList';\nimport { DataViewTable } from './DataViewTable';\nimport { DataViewDetail } from './DataViewDetail';\nimport { FiltersToolbar } from '../molecules/FiltersToolbar';\nimport {\n Pagination,\n PaginationContent,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n
|
|
1
|
+
{"version":3,"file":"DataViewRenderer.js","names":["React","listView: DataViewListConfig"],"sources":["../../../src/components/data-view/DataViewRenderer.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport type {\n DataViewGridConfig,\n DataViewListConfig,\n DataViewSpec,\n} from '@lssm/lib.contracts/data-views';\nimport { DataViewList } from './DataViewList';\nimport { DataViewTable } from './DataViewTable';\nimport { DataViewDetail } from './DataViewDetail';\nimport { FiltersToolbar } from '../molecules/FiltersToolbar';\nimport {\n Pagination,\n PaginationContent,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from '@lssm/lib.ui-kit-web/ui/pagination';\n\nexport interface DataViewRendererProps {\n spec: DataViewSpec;\n items?: Record<string, unknown>[];\n item?: Record<string, unknown> | null;\n className?: string;\n renderActions?: (item: Record<string, unknown>) => React.ReactNode;\n onSelect?: (item: Record<string, unknown>) => void;\n onRowClick?: (item: Record<string, unknown>) => void;\n headerActions?: React.ReactNode;\n emptyState?: React.ReactNode;\n footer?: React.ReactNode;\n\n // Filters & Search\n search?: string;\n onSearchChange?: (value: string) => void;\n filters?: Record<string, unknown>;\n onFilterChange?: (filters: Record<string, unknown>) => void;\n\n // Pagination\n pagination?: {\n page: number;\n pageSize: number;\n total: number;\n };\n onPageChange?: (page: number) => void;\n}\n\nexport function DataViewRenderer({\n spec,\n items = [],\n item = null,\n className,\n renderActions,\n onSelect,\n onRowClick,\n headerActions,\n emptyState,\n footer,\n search,\n onSearchChange,\n filters,\n onFilterChange,\n pagination,\n onPageChange,\n}: DataViewRendererProps) {\n const viewContent = React.useMemo(() => {\n switch (spec.view.kind) {\n case 'list':\n return (\n <DataViewList\n spec={spec}\n items={items}\n className={className}\n renderActions={renderActions}\n onSelect={onSelect}\n emptyState={emptyState}\n />\n );\n case 'table':\n return (\n <DataViewTable\n spec={spec}\n items={items}\n className={className}\n onRowClick={onRowClick}\n emptyState={emptyState}\n headerActions={headerActions}\n footer={footer}\n />\n );\n case 'detail':\n return (\n <DataViewDetail\n spec={spec}\n item={item}\n className={className}\n emptyState={emptyState}\n headerActions={headerActions}\n />\n );\n case 'grid': {\n const grid = spec.view as DataViewGridConfig;\n const listView: DataViewListConfig = {\n kind: 'list',\n layout: 'card',\n fields: grid.fields,\n filters: grid.filters,\n actions: grid.actions,\n primaryField: grid.primaryField,\n secondaryFields: grid.secondaryFields,\n };\n const listSpec = {\n ...spec,\n view: listView,\n } satisfies DataViewSpec;\n return (\n <DataViewList\n spec={listSpec}\n items={items}\n className={className}\n renderActions={renderActions}\n onSelect={onSelect}\n emptyState={emptyState}\n />\n );\n }\n default:\n return <div className={className}>Unsupported data view kind</div>;\n }\n }, [\n spec,\n items,\n item,\n className,\n renderActions,\n onSelect,\n onRowClick,\n headerActions,\n emptyState,\n footer,\n ]);\n\n // Only render toolbar/pagination if it's a collection view\n const isCollection =\n spec.view.kind === 'list' ||\n spec.view.kind === 'table' ||\n spec.view.kind === 'grid';\n\n if (!isCollection) {\n return <>{viewContent}</>;\n }\n\n return (\n <div className=\"space-y-4\">\n {(spec.view.filters?.length || onSearchChange) && (\n <FiltersToolbar\n searchValue={search}\n onSearchChange={onSearchChange}\n searchPlaceholder=\"Search...\"\n activeChips={\n filters\n ? Object.entries(filters).map(([key, value]) => ({\n key,\n label: `${key}: ${value}`,\n onRemove: () => {\n if (filters) {\n const { [key]: _, ...rest } = filters;\n onFilterChange?.(rest);\n }\n },\n }))\n : []\n }\n onClearAll={\n filters && Object.keys(filters).length > 0\n ? () => onFilterChange?.({})\n : undefined\n }\n right={headerActions}\n >\n {/* Render filter dropdowns here if needed */}\n </FiltersToolbar>\n )}\n\n {viewContent}\n\n {pagination && pagination.total > 0 && (\n <div className=\"py-4\">\n <Pagination>\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n if (pagination.page > 1) {\n onPageChange?.(pagination.page - 1);\n }\n }}\n aria-disabled={pagination.page <= 1}\n className={\n pagination.page <= 1 ? 'pointer-events-none opacity-50' : ''\n }\n />\n </PaginationItem>\n\n {/* Simplified pagination: show current page */}\n <PaginationItem>\n <PaginationLink href=\"#\" isActive>\n {pagination.page}\n </PaginationLink>\n </PaginationItem>\n\n <PaginationItem>\n <PaginationNext\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n const totalPages = Math.ceil(\n pagination.total / pagination.pageSize\n );\n if (pagination.page < totalPages) {\n onPageChange?.(pagination.page + 1);\n }\n }}\n aria-disabled={\n pagination.page >=\n Math.ceil(pagination.total / pagination.pageSize)\n }\n className={\n pagination.page >=\n Math.ceil(pagination.total / pagination.pageSize)\n ? 'pointer-events-none opacity-50'\n : ''\n }\n />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n <div className=\"text-muted-foreground mt-2 text-center text-sm\">\n Page {pagination.page} of{' '}\n {Math.ceil(pagination.total / pagination.pageSize)} (\n {pagination.total} items)\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;AAgDA,SAAgB,iBAAiB,EAC/B,MACA,QAAQ,EAAE,EACV,OAAO,MACP,WACA,eACA,UACA,YACA,eACA,YACA,QACA,QACA,gBACA,SACA,gBACA,YACA,gBACwB;CACxB,MAAM,cAAcA,QAAM,cAAc;AACtC,UAAQ,KAAK,KAAK,MAAlB;GACE,KAAK,OACH,QACE,oBAAC;IACO;IACC;IACI;IACI;IACL;IACE;KACZ;GAEN,KAAK,QACH,QACE,oBAAC;IACO;IACC;IACI;IACC;IACA;IACG;IACP;KACR;GAEN,KAAK,SACH,QACE,oBAAC;IACO;IACA;IACK;IACC;IACG;KACf;GAEN,KAAK,QAAQ;IACX,MAAM,OAAO,KAAK;IAClB,MAAMC,WAA+B;KACnC,MAAM;KACN,QAAQ;KACR,QAAQ,KAAK;KACb,SAAS,KAAK;KACd,SAAS,KAAK;KACd,cAAc,KAAK;KACnB,iBAAiB,KAAK;KACvB;AAKD,WACE,oBAAC;KACC,MANa;MACf,GAAG;MACH,MAAM;MACP;KAIU;KACI;KACI;KACL;KACE;MACZ;;GAGN,QACE,QAAO,oBAAC;IAAe;cAAW;KAAgC;;IAErE;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AAQF,KAAI,EAJF,KAAK,KAAK,SAAS,UACnB,KAAK,KAAK,SAAS,WACnB,KAAK,KAAK,SAAS,QAGnB,QAAO,0CAAG,cAAe;AAG3B,QACE,qBAAC;EAAI,WAAU;;IACX,KAAK,KAAK,SAAS,UAAU,mBAC7B,oBAAC;IACC,aAAa;IACG;IAChB,mBAAkB;IAClB,aACE,UACI,OAAO,QAAQ,QAAQ,CAAC,KAAK,CAAC,KAAK,YAAY;KAC7C;KACA,OAAO,GAAG,IAAI,IAAI;KAClB,gBAAgB;AACd,UAAI,SAAS;OACX,MAAM,GAAG,MAAM,GAAG,GAAG,SAAS;AAC9B,wBAAiB,KAAK;;;KAG3B,EAAE,GACH,EAAE;IAER,YACE,WAAW,OAAO,KAAK,QAAQ,CAAC,SAAS,UAC/B,iBAAiB,EAAE,CAAC,GAC1B;IAEN,OAAO;KAGQ;GAGlB;GAEA,cAAc,WAAW,QAAQ,KAChC,qBAAC;IAAI,WAAU;eACb,oBAAC,wBACC,qBAAC;KACC,oBAAC,4BACC,oBAAC;MACC,MAAK;MACL,UAAU,MAAM;AACd,SAAE,gBAAgB;AAClB,WAAI,WAAW,OAAO,EACpB,gBAAe,WAAW,OAAO,EAAE;;MAGvC,iBAAe,WAAW,QAAQ;MAClC,WACE,WAAW,QAAQ,IAAI,mCAAmC;OAE5D,GACa;KAGjB,oBAAC,4BACC,oBAAC;MAAe,MAAK;MAAI;gBACtB,WAAW;OACG,GACF;KAEjB,oBAAC,4BACC,oBAAC;MACC,MAAK;MACL,UAAU,MAAM;AACd,SAAE,gBAAgB;OAClB,MAAM,aAAa,KAAK,KACtB,WAAW,QAAQ,WAAW,SAC/B;AACD,WAAI,WAAW,OAAO,WACpB,gBAAe,WAAW,OAAO,EAAE;;MAGvC,iBACE,WAAW,QACX,KAAK,KAAK,WAAW,QAAQ,WAAW,SAAS;MAEnD,WACE,WAAW,QACX,KAAK,KAAK,WAAW,QAAQ,WAAW,SAAS,GAC7C,mCACA;OAEN,GACa;QACC,GACT,EACb,qBAAC;KAAI,WAAU;;MAAiD;MACxD,WAAW;MAAK;MAAI;MACzB,KAAK,KAAK,WAAW,QAAQ,WAAW,SAAS;MAAC;MAClD,WAAW;MAAM;;MACd;KACF;;GAEJ"}
|
|
@@ -5,13 +5,13 @@ import * as z from "zod";
|
|
|
5
5
|
import { UseFormReturn } from "@lssm/lib.ui-kit-web/ui/form";
|
|
6
6
|
|
|
7
7
|
//#region src/components/forms/ZodForm.d.ts
|
|
8
|
-
interface ZodFormProps<TSchema extends z.ZodType<any,
|
|
8
|
+
interface ZodFormProps<TSchema extends z.ZodType<any, any, any>, TFieldValues extends FieldValues = z.input<TSchema>, TOutput = z.output<TSchema>> {
|
|
9
9
|
schema: TSchema;
|
|
10
10
|
defaultValues?: Partial<TFieldValues> | Promise<Partial<TFieldValues>>;
|
|
11
11
|
onSubmit: (data: TOutput) => Promise<void> | void;
|
|
12
12
|
children: (f: UseFormReturn<TFieldValues, any, TOutput>) => React$1.ReactNode;
|
|
13
13
|
}
|
|
14
|
-
declare function ZodForm<TSchema extends z.ZodType<any,
|
|
14
|
+
declare function ZodForm<TSchema extends z.ZodType<any, any, any>, TFieldValues extends FieldValues = z.input<TSchema>, TOutput = z.output<TSchema>>({
|
|
15
15
|
schema,
|
|
16
16
|
defaultValues,
|
|
17
17
|
onSubmit,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ZodForm.d.ts","names":[],"sources":["../../../src/components/forms/ZodForm.tsx"],"sourcesContent":[],"mappings":";;;;;;;UAciB,
|
|
1
|
+
{"version":3,"file":"ZodForm.d.ts","names":[],"sources":["../../../src/components/forms/ZodForm.tsx"],"sourcesContent":[],"mappings":";;;;;;;UAciB,6BAEC,CAAA,CAAE,6CACG,cAAc,CAAA,CAAE,MAAM,oBACjC,CAAA,CAAE,OAAO;UAEX;kBACQ,QAAQ,gBAAgB,QAAQ,QAAQ;EAPzC,QAAA,EAAA,CAAA,IAAY,EAQV,OARU,EAAA,GAQE,OARF,CAAA,IAAA,CAAA,GAAA,IAAA;EAET,QAAA,EAAA,CAAA,CAAA,EAQJ,aARI,CAQU,YARV,EAAA,GAAA,EAQ6B,OAR7B,CAAA,EAAA,GAQ0C,OAAA,CAAM,SARhD;;AACyB,iBAU7B,OAV6B,CAAA,gBAY3B,CAAA,CAAE,OAZyB,CAAA,GAAA,EAAA,GAAA,EAAA,GAAA,CAAA,EAAA,qBAatB,WAbsB,GAaR,CAAA,CAAE,KAbM,CAaA,OAbA,CAAA,EAAA,UAcjC,CAAA,CAAE,MAd+B,CAcxB,OAdwB,CAAA,CAAA,CAAA;EAAA,MAAA;EAAA,aAAA;EAAA,QAAA;EAAA;AAAA,CAAA,EAoB1C,YApB0C,CAoB7B,OApB6B,EAoBpB,YApBoB,EAoBN,OApBM,CAAA,CAAA,EAoBE,mBAAA,CAAA,GAAA,CAAA,OApBF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ZodForm.js","names":[],"sources":["../../../src/components/forms/ZodForm.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport {\n Form,\n useForm,\n type UseFormReturn,\n zodResolver,\n} from '@lssm/lib.ui-kit-web/ui/form';\nimport type { FieldValues } from 'react-hook-form';\nimport * as z from 'zod';\n\n// import { useForm, type UseFormReturn } from 'react-hook-form';\n\nexport interface ZodFormProps<\n TSchema extends z.ZodType<any,
|
|
1
|
+
{"version":3,"file":"ZodForm.js","names":[],"sources":["../../../src/components/forms/ZodForm.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport {\n Form,\n useForm,\n type UseFormReturn,\n zodResolver,\n} from '@lssm/lib.ui-kit-web/ui/form';\nimport type { FieldValues } from 'react-hook-form';\nimport * as z from 'zod';\n\n// import { useForm, type UseFormReturn } from 'react-hook-form';\n\nexport interface ZodFormProps<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n TSchema extends z.ZodType<any, any, any>,\n TFieldValues extends FieldValues = z.input<TSchema>,\n TOutput = z.output<TSchema>,\n> {\n schema: TSchema;\n defaultValues?: Partial<TFieldValues> | Promise<Partial<TFieldValues>>;\n onSubmit: (data: TOutput) => Promise<void> | void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n children: (f: UseFormReturn<TFieldValues, any, TOutput>) => React.ReactNode;\n}\n\nexport function ZodForm<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n TSchema extends z.ZodType<any, any, any>,\n TFieldValues extends FieldValues = z.input<TSchema>,\n TOutput = z.output<TSchema>,\n>({\n schema,\n defaultValues,\n onSubmit,\n children,\n}: ZodFormProps<TSchema, TFieldValues, TOutput>) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const form = useForm<TFieldValues, any, TOutput>({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resolver: zodResolver(schema as any),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n defaultValues: defaultValues as any,\n });\n return (\n <Form {...form}>\n <form onSubmit={form.handleSubmit(onSubmit)}>{children(form)}</form>\n </Form>\n );\n}\n"],"mappings":";;;;;;;;AA2BA,SAAgB,QAKd,EACA,QACA,eACA,UACA,YAC+C;CAE/C,MAAM,OAAO,QAAoC;EAE/C,UAAU,YAAY,OAAc;EAErB;EAChB,CAAC;AACF,QACE,oBAAC;EAAK,GAAI;YACR,oBAAC;GAAK,UAAU,KAAK,aAAa,SAAS;aAAG,SAAS,KAAK;IAAQ;GAC/D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LegalHeading.js","names":[],"sources":["../../../../src/components/legal/atoms/LegalHeading.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\n\nconst headingVariants = cva('text-foreground tracking-tight', {\n variants: {\n level: {\n h1: 'text-3xl font-semibold md:text-4xl',\n h2: 'text-2xl font-semibold md:text-3xl',\n h3: 'text-xl font-semibold md:text-2xl',\n h4: 'text-lg font-semibold md:text-xl',\n },\n tone: {\n default: '',\n muted: 'text-muted-foreground',\n accent: 'text-primary',\n },\n spacing: {\n none: '',\n sm: 'mt-4',\n md: 'mt-6',\n lg: 'mt-8',\n },\n },\n defaultVariants: {\n level: 'h2',\n tone: 'default',\n spacing: 'md',\n },\n});\n\nexport type LegalHeadingProps = React.HTMLAttributes<HTMLHeadingElement> &\n VariantProps<typeof headingVariants> & {\n as?: 'h1' | 'h2' | 'h3' | 'h4';\n };\n\nexport function LegalHeading({\n as,\n level,\n tone,\n spacing,\n className,\n ...props\n}: LegalHeadingProps) {\n const Comp = (as ?? level ?? 'h2') as
|
|
1
|
+
{"version":3,"file":"LegalHeading.js","names":[],"sources":["../../../../src/components/legal/atoms/LegalHeading.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\n\nconst headingVariants = cva('text-foreground tracking-tight', {\n variants: {\n level: {\n h1: 'text-3xl font-semibold md:text-4xl',\n h2: 'text-2xl font-semibold md:text-3xl',\n h3: 'text-xl font-semibold md:text-2xl',\n h4: 'text-lg font-semibold md:text-xl',\n },\n tone: {\n default: '',\n muted: 'text-muted-foreground',\n accent: 'text-primary',\n },\n spacing: {\n none: '',\n sm: 'mt-4',\n md: 'mt-6',\n lg: 'mt-8',\n },\n },\n defaultVariants: {\n level: 'h2',\n tone: 'default',\n spacing: 'md',\n },\n});\n\nexport type LegalHeadingProps = React.HTMLAttributes<HTMLHeadingElement> &\n VariantProps<typeof headingVariants> & {\n as?: 'h1' | 'h2' | 'h3' | 'h4';\n };\n\nexport function LegalHeading({\n as,\n level,\n tone,\n spacing,\n className,\n ...props\n}: LegalHeadingProps) {\n const Comp = (as ?? level ?? 'h2') as 'h1' | 'h2' | 'h3' | 'h4';\n return (\n <Comp\n className={cn(headingVariants({ level, tone, spacing }), className)}\n {...props}\n />\n );\n}\n\nexport { headingVariants };\n"],"mappings":";;;;;;AAIA,MAAM,kBAAkB,IAAI,kCAAkC;CAC5D,UAAU;EACR,OAAO;GACL,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACL;EACD,MAAM;GACJ,SAAS;GACT,OAAO;GACP,QAAQ;GACT;EACD,SAAS;GACP,MAAM;GACN,IAAI;GACJ,IAAI;GACJ,IAAI;GACL;EACF;CACD,iBAAiB;EACf,OAAO;EACP,MAAM;EACN,SAAS;EACV;CACF,CAAC;AAOF,SAAgB,aAAa,EAC3B,IACA,OACA,MACA,SACA,WACA,GAAG,SACiB;AAEpB,QACE,oBAFY,MAAM,SAAS;EAGzB,WAAW,GAAG,gBAAgB;GAAE;GAAO;GAAM;GAAS,CAAC,EAAE,UAAU;EACnE,GAAI;GACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LegalList.js","names":[],"sources":["../../../../src/components/legal/atoms/LegalList.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\n\nconst listVariants = cva('', {\n variants: {\n type: {\n unordered: 'list-disc pl-6',\n ordered: 'list-decimal pl-6',\n none: 'pl-0',\n },\n spacing: {\n sm: 'space-y-1',\n md: 'space-y-2',\n lg: 'space-y-3',\n },\n },\n defaultVariants: {\n type: 'unordered',\n spacing: 'md',\n },\n});\n\nexport type LegalListProps = React.HTMLAttributes<\n HTMLUListElement | HTMLOListElement\n> &\n VariantProps<typeof listVariants>;\n\nexport function LegalList({\n type,\n spacing,\n className,\n children,\n ...props\n}: LegalListProps) {\n const Comp
|
|
1
|
+
{"version":3,"file":"LegalList.js","names":[],"sources":["../../../../src/components/legal/atoms/LegalList.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\n\nconst listVariants = cva('', {\n variants: {\n type: {\n unordered: 'list-disc pl-6',\n ordered: 'list-decimal pl-6',\n none: 'pl-0',\n },\n spacing: {\n sm: 'space-y-1',\n md: 'space-y-2',\n lg: 'space-y-3',\n },\n },\n defaultVariants: {\n type: 'unordered',\n spacing: 'md',\n },\n});\n\nexport type LegalListProps = React.HTMLAttributes<\n HTMLUListElement | HTMLOListElement\n> &\n VariantProps<typeof listVariants>;\n\nexport function LegalList({\n type,\n spacing,\n className,\n children,\n ...props\n}: LegalListProps) {\n const Comp = (type === 'ordered' ? 'ol' : 'ul') as React.ElementType;\n return (\n <Comp className={cn(listVariants({ type, spacing }), className)} {...props}>\n {children}\n </Comp>\n );\n}\n\nexport { listVariants };\n"],"mappings":";;;;;;AAIA,MAAM,eAAe,IAAI,IAAI;CAC3B,UAAU;EACR,MAAM;GACJ,WAAW;GACX,SAAS;GACT,MAAM;GACP;EACD,SAAS;GACP,IAAI;GACJ,IAAI;GACJ,IAAI;GACL;EACF;CACD,iBAAiB;EACf,MAAM;EACN,SAAS;EACV;CACF,CAAC;AAOF,SAAgB,UAAU,EACxB,MACA,SACA,WACA,UACA,GAAG,SACc;AAEjB,QACE,oBAFY,SAAS,YAAY,OAAO;EAElC,WAAW,GAAG,aAAa;GAAE;GAAM;GAAS,CAAC,EAAE,UAAU;EAAE,GAAI;EAClE;GACI"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LegalText.js","names":[],"sources":["../../../../src/components/legal/atoms/LegalText.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\n\nconst textVariants = cva('text-base leading-relaxed', {\n variants: {\n tone: {\n default: 'text-foreground',\n muted: 'text-muted-foreground',\n danger: 'text-destructive',\n },\n size: {\n base: 'text-base',\n sm: 'text-sm',\n lg: 'text-lg',\n },\n spacing: {\n none: '',\n sm: 'mt-2',\n md: 'mt-3',\n lg: 'mt-4',\n },\n },\n defaultVariants: {\n tone: 'default',\n size: 'base',\n spacing: 'sm',\n },\n});\n\nexport type LegalTextProps = React.HTMLAttributes<HTMLParagraphElement> &\n VariantProps<typeof textVariants> & { as?: 'p' | 'div' | 'span' };\n\nexport function LegalText({\n as = 'p',\n tone,\n size,\n spacing,\n className,\n ...props\n}: LegalTextProps) {\n const Comp
|
|
1
|
+
{"version":3,"file":"LegalText.js","names":[],"sources":["../../../../src/components/legal/atoms/LegalText.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\n\nconst textVariants = cva('text-base leading-relaxed', {\n variants: {\n tone: {\n default: 'text-foreground',\n muted: 'text-muted-foreground',\n danger: 'text-destructive',\n },\n size: {\n base: 'text-base',\n sm: 'text-sm',\n lg: 'text-lg',\n },\n spacing: {\n none: '',\n sm: 'mt-2',\n md: 'mt-3',\n lg: 'mt-4',\n },\n },\n defaultVariants: {\n tone: 'default',\n size: 'base',\n spacing: 'sm',\n },\n});\n\nexport type LegalTextProps = React.HTMLAttributes<HTMLParagraphElement> &\n VariantProps<typeof textVariants> & { as?: 'p' | 'div' | 'span' };\n\nexport function LegalText({\n as = 'p',\n tone,\n size,\n spacing,\n className,\n ...props\n}: LegalTextProps) {\n const Comp = as as React.ElementType;\n return (\n <Comp\n className={cn(textVariants({ tone, size, spacing }), className)}\n {...props}\n />\n );\n}\n\nexport { textVariants };\n"],"mappings":";;;;;;AAIA,MAAM,eAAe,IAAI,6BAA6B;CACpD,UAAU;EACR,MAAM;GACJ,SAAS;GACT,OAAO;GACP,QAAQ;GACT;EACD,MAAM;GACJ,MAAM;GACN,IAAI;GACJ,IAAI;GACL;EACD,SAAS;GACP,MAAM;GACN,IAAI;GACJ,IAAI;GACJ,IAAI;GACL;EACF;CACD,iBAAiB;EACf,MAAM;EACN,MAAM;EACN,SAAS;EACV;CACF,CAAC;AAKF,SAAgB,UAAU,EACxB,KAAK,KACL,MACA,MACA,SACA,WACA,GAAG,SACc;AAEjB,QACE,oBAFW;EAGT,WAAW,GAAG,aAAa;GAAE;GAAM;GAAM;GAAS,CAAC,EAAE,UAAU;EAC/D,GAAI;GACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Consent.js","names":[],"sources":["../../../../src/components/legal/molecules/Consent.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Checkbox } from '@lssm/lib.ui-kit-web/ui/checkbox';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\n\nexport function ConsentItem({\n id,\n label,\n description,\n checked,\n onChange,\n className,\n}: {\n id: string;\n label: React.ReactNode;\n description?: React.ReactNode;\n checked: boolean;\n onChange: (checked: boolean) => void;\n className?: string;\n}) {\n return (\n <div className={cn('flex items-start gap-3', className)}>\n <Checkbox\n id={id}\n checked={checked}\n onCheckedChange={(v:
|
|
1
|
+
{"version":3,"file":"Consent.js","names":[],"sources":["../../../../src/components/legal/molecules/Consent.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Checkbox } from '@lssm/lib.ui-kit-web/ui/checkbox';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\n\nexport function ConsentItem({\n id,\n label,\n description,\n checked,\n onChange,\n className,\n}: {\n id: string;\n label: React.ReactNode;\n description?: React.ReactNode;\n checked: boolean;\n onChange: (checked: boolean) => void;\n className?: string;\n}) {\n return (\n <div className={cn('flex items-start gap-3', className)}>\n <Checkbox\n id={id}\n checked={checked}\n onCheckedChange={(v: boolean | 'indeterminate') => onChange(Boolean(v))}\n />\n <div>\n <label htmlFor={id} className=\"text-base font-medium\">\n {label}\n </label>\n {description && (\n <div className=\"text-muted-foreground text-base\">{description}</div>\n )}\n </div>\n </div>\n );\n}\n\nexport function ConsentList({\n items,\n onChange,\n className,\n}: {\n items: {\n id: string;\n label: React.ReactNode;\n description?: React.ReactNode;\n checked: boolean;\n }[];\n onChange: (id: string, checked: boolean) => void;\n className?: string;\n}) {\n return (\n <div className={cn('space-y-3', className)}>\n {items.map((it) => (\n <ConsentItem key={it.id} {...it} onChange={(c) => onChange(it.id, c)} />\n ))}\n </div>\n );\n}\n"],"mappings":";;;;;;AAIA,SAAgB,YAAY,EAC1B,IACA,OACA,aACA,SACA,UACA,aAQC;AACD,QACE,qBAAC;EAAI,WAAW,GAAG,0BAA0B,UAAU;aACrD,oBAAC;GACK;GACK;GACT,kBAAkB,MAAiC,SAAS,QAAQ,EAAE,CAAC;IACvE,EACF,qBAAC,oBACC,oBAAC;GAAM,SAAS;GAAI,WAAU;aAC3B;IACK,EACP,eACC,oBAAC;GAAI,WAAU;aAAmC;IAAkB,IAElE;GACF;;AAIV,SAAgB,YAAY,EAC1B,OACA,UACA,aAUC;AACD,QACE,oBAAC;EAAI,WAAW,GAAG,aAAa,UAAU;YACvC,MAAM,KAAK,OACV,oBAAC;GAAwB,GAAI;GAAI,WAAW,MAAM,SAAS,GAAG,IAAI,EAAE;KAAlD,GAAG,GAAmD,CACxE;GACE"}
|
|
@@ -30,7 +30,7 @@ function LegalTOC({ items, activeHref, onNavigate, variant, size, className, ...
|
|
|
30
30
|
...props,
|
|
31
31
|
children: variant === "inline" ? items.map((it) => /* @__PURE__ */ jsx("a", {
|
|
32
32
|
href: it.href,
|
|
33
|
-
onClick: (
|
|
33
|
+
onClick: (_e) => {
|
|
34
34
|
onNavigate?.(it.href);
|
|
35
35
|
},
|
|
36
36
|
className: cn("hover:bg-accent hover:text-accent-foreground rounded-xs px-2 py-1", activeHref === it.href && "bg-accent text-accent-foreground"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LegalTOC.js","names":[],"sources":["../../../../src/components/legal/molecules/LegalTOC.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\n\nexport interface TocItem {\n href: string;\n label: React.ReactNode;\n}\n\nconst tocVariants = cva('text-base', {\n variants: {\n variant: {\n sidebar: 'space-y-2',\n inline: 'flex flex-wrap gap-3',\n },\n size: {\n sm: '',\n md: 'text-base',\n },\n },\n defaultVariants: { variant: 'sidebar', size: 'md' },\n});\n\nexport type LegalTOCProps = {\n items: TocItem[];\n activeHref?: string;\n onNavigate?: (href: string) => void;\n} & VariantProps<typeof tocVariants> &\n React.HTMLAttributes<HTMLDivElement>;\n\nexport function LegalTOC({\n items,\n activeHref,\n onNavigate,\n variant,\n size,\n className,\n ...props\n}: LegalTOCProps) {\n return (\n <nav\n aria-label=\"Table of contents\"\n className={cn(tocVariants({ variant, size }), className)}\n {...props}\n >\n {variant === 'inline' ? (\n items.map((it) => (\n <a\n key={it.href}\n href={it.href}\n onClick={(
|
|
1
|
+
{"version":3,"file":"LegalTOC.js","names":[],"sources":["../../../../src/components/legal/molecules/LegalTOC.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\n\nexport interface TocItem {\n href: string;\n label: React.ReactNode;\n}\n\nconst tocVariants = cva('text-base', {\n variants: {\n variant: {\n sidebar: 'space-y-2',\n inline: 'flex flex-wrap gap-3',\n },\n size: {\n sm: '',\n md: 'text-base',\n },\n },\n defaultVariants: { variant: 'sidebar', size: 'md' },\n});\n\nexport type LegalTOCProps = {\n items: TocItem[];\n activeHref?: string;\n onNavigate?: (href: string) => void;\n} & VariantProps<typeof tocVariants> &\n React.HTMLAttributes<HTMLDivElement>;\n\nexport function LegalTOC({\n items,\n activeHref,\n onNavigate,\n variant,\n size,\n className,\n ...props\n}: LegalTOCProps) {\n return (\n <nav\n aria-label=\"Table of contents\"\n className={cn(tocVariants({ variant, size }), className)}\n {...props}\n >\n {variant === 'inline' ? (\n items.map((it) => (\n <a\n key={it.href}\n href={it.href}\n onClick={(_e) => {\n onNavigate?.(it.href);\n // allow default anchor behaviour too\n }}\n className={cn(\n 'hover:bg-accent hover:text-accent-foreground rounded-xs px-2 py-1',\n activeHref === it.href && 'bg-accent text-accent-foreground'\n )}\n >\n {it.label}\n </a>\n ))\n ) : (\n <ul className=\"list-none space-y-2 pl-0\">\n {items.map((it) => (\n <li key={it.href}>\n <a\n href={it.href}\n onClick={() => onNavigate?.(it.href)}\n className={cn(\n 'hover:bg-accent hover:text-accent-foreground block rounded-xs px-2 py-1',\n activeHref === it.href && 'bg-accent text-accent-foreground'\n )}\n >\n {it.label}\n </a>\n </li>\n ))}\n </ul>\n )}\n </nav>\n );\n}\n\nexport { tocVariants };\n"],"mappings":";;;;;;AASA,MAAM,cAAc,IAAI,aAAa;CACnC,UAAU;EACR,SAAS;GACP,SAAS;GACT,QAAQ;GACT;EACD,MAAM;GACJ,IAAI;GACJ,IAAI;GACL;EACF;CACD,iBAAiB;EAAE,SAAS;EAAW,MAAM;EAAM;CACpD,CAAC;AASF,SAAgB,SAAS,EACvB,OACA,YACA,YACA,SACA,MACA,WACA,GAAG,SACa;AAChB,QACE,oBAAC;EACC,cAAW;EACX,WAAW,GAAG,YAAY;GAAE;GAAS;GAAM,CAAC,EAAE,UAAU;EACxD,GAAI;YAEH,YAAY,WACX,MAAM,KAAK,OACT,oBAAC;GAEC,MAAM,GAAG;GACT,UAAU,OAAO;AACf,iBAAa,GAAG,KAAK;;GAGvB,WAAW,GACT,qEACA,eAAe,GAAG,QAAQ,mCAC3B;aAEA,GAAG;KAXC,GAAG,KAYN,CACJ,GAEF,oBAAC;GAAG,WAAU;aACX,MAAM,KAAK,OACV,oBAAC,kBACC,oBAAC;IACC,MAAM,GAAG;IACT,eAAe,aAAa,GAAG,KAAK;IACpC,WAAW,GACT,2EACA,eAAe,GAAG,QAAQ,mCAC3B;cAEA,GAAG;KACF,IAVG,GAAG,KAWP,CACL;IACC;GAEH"}
|
|
@@ -19,20 +19,20 @@ function AiLinkButton({ href, className }) {
|
|
|
19
19
|
const copyLink = React$1.useCallback(() => {
|
|
20
20
|
try {
|
|
21
21
|
navigator.clipboard?.writeText(href).catch(() => {});
|
|
22
|
-
} catch {}
|
|
22
|
+
} catch (_e) {}
|
|
23
23
|
}, [href]);
|
|
24
24
|
const openChatGPT = React$1.useCallback(() => {
|
|
25
25
|
const url = buildProviderUrl("chatgpt", href);
|
|
26
26
|
try {
|
|
27
27
|
navigator.clipboard?.writeText(href).catch(() => {});
|
|
28
|
-
} catch {}
|
|
28
|
+
} catch (_e) {}
|
|
29
29
|
window.open(url, "_blank", "noopener,noreferrer");
|
|
30
30
|
}, [href]);
|
|
31
31
|
const openClaude = React$1.useCallback(() => {
|
|
32
32
|
const url = buildProviderUrl("claude", href);
|
|
33
33
|
try {
|
|
34
34
|
navigator.clipboard?.writeText(href).catch(() => {});
|
|
35
|
-
} catch {}
|
|
35
|
+
} catch (_e) {}
|
|
36
36
|
window.open(url, "_blank", "noopener,noreferrer");
|
|
37
37
|
}, [href]);
|
|
38
38
|
return /* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiLinkButton.js","names":["React"],"sources":["../../../src/components/molecules/AiLinkButton.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Button } from '../atoms/Button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@lssm/lib.ui-kit-web/ui/dropdown-menu';\n// } from './DropdownMenu';\n\ntype Provider = 'chatgpt' | 'claude';\n\nexport interface AiLinkButtonProps {\n href: string; // canonical or .md URL\n provider?: Provider;\n className?: string;\n}\n\nfunction buildPrompt(href: string) {\n return `Please load and use this markdown context when answering: ${href}`;\n}\n\nfunction buildProviderUrl(provider: Provider, href: string) {\n const prompt = encodeURIComponent(buildPrompt(href));\n switch (provider) {\n case 'claude':\n return `https://claude.ai/new?prompt=${prompt}`;\n case 'chatgpt':\n default:\n return `https://chatgpt.com/?q=${prompt}`;\n }\n}\n\nexport function AiLinkButton({ href, className }: AiLinkButtonProps) {\n const copyLink = React.useCallback(() => {\n try {\n navigator.clipboard?.writeText(href).catch(() => {});\n } catch {}\n }, [href]);\n\n const openChatGPT = React.useCallback(() => {\n const url = buildProviderUrl('chatgpt', href);\n try {\n navigator.clipboard?.writeText(href).catch(() => {});\n } catch {}\n window.open(url, '_blank', 'noopener,noreferrer');\n }, [href]);\n\n const openClaude = React.useCallback(() => {\n const url = buildProviderUrl('claude', href);\n try {\n navigator.clipboard?.writeText(href).catch(() => {});\n } catch {}\n window.open(url, '_blank', 'noopener,noreferrer');\n }, [href]);\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n className={className}\n variant=\"secondary\"\n aria-label=\"AI actions\"\n >\n AI\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={copyLink}>Get link for AI</DropdownMenuItem>\n <DropdownMenuItem onClick={openChatGPT}>\n Open in ChatGPT\n </DropdownMenuItem>\n <DropdownMenuItem onClick={openClaude}>Open in Claude</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"mappings":";;;;;;AAkBA,SAAS,YAAY,MAAc;AACjC,QAAO,6DAA6D;;AAGtE,SAAS,iBAAiB,UAAoB,MAAc;CAC1D,MAAM,SAAS,mBAAmB,YAAY,KAAK,CAAC;AACpD,SAAQ,UAAR;EACE,KAAK,SACH,QAAO,gCAAgC;EACzC,KAAK;EACL,QACE,QAAO,0BAA0B;;;AAIvC,SAAgB,aAAa,EAAE,MAAM,aAAgC;CACnE,MAAM,WAAWA,QAAM,kBAAkB;AACvC,MAAI;AACF,aAAU,WAAW,UAAU,KAAK,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"AiLinkButton.js","names":["React"],"sources":["../../../src/components/molecules/AiLinkButton.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Button } from '../atoms/Button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@lssm/lib.ui-kit-web/ui/dropdown-menu';\n// } from './DropdownMenu';\n\ntype Provider = 'chatgpt' | 'claude';\n\nexport interface AiLinkButtonProps {\n href: string; // canonical or .md URL\n provider?: Provider;\n className?: string;\n}\n\nfunction buildPrompt(href: string) {\n return `Please load and use this markdown context when answering: ${href}`;\n}\n\nfunction buildProviderUrl(provider: Provider, href: string) {\n const prompt = encodeURIComponent(buildPrompt(href));\n switch (provider) {\n case 'claude':\n return `https://claude.ai/new?prompt=${prompt}`;\n case 'chatgpt':\n default:\n return `https://chatgpt.com/?q=${prompt}`;\n }\n}\n\nexport function AiLinkButton({ href, className }: AiLinkButtonProps) {\n const copyLink = React.useCallback(() => {\n try {\n navigator.clipboard?.writeText(href).catch(() => {\n /* ignore */\n });\n } catch (_e) {\n /* ignore */\n }\n }, [href]);\n\n const openChatGPT = React.useCallback(() => {\n const url = buildProviderUrl('chatgpt', href);\n try {\n navigator.clipboard?.writeText(href).catch(() => {\n /* ignore */\n });\n } catch (_e) {\n /* ignore */\n }\n window.open(url, '_blank', 'noopener,noreferrer');\n }, [href]);\n\n const openClaude = React.useCallback(() => {\n const url = buildProviderUrl('claude', href);\n try {\n navigator.clipboard?.writeText(href).catch(() => {\n /* ignore */\n });\n } catch (_e) {\n /* ignore */\n }\n window.open(url, '_blank', 'noopener,noreferrer');\n }, [href]);\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n className={className}\n variant=\"secondary\"\n aria-label=\"AI actions\"\n >\n AI\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={copyLink}>Get link for AI</DropdownMenuItem>\n <DropdownMenuItem onClick={openChatGPT}>\n Open in ChatGPT\n </DropdownMenuItem>\n <DropdownMenuItem onClick={openClaude}>Open in Claude</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"mappings":";;;;;;AAkBA,SAAS,YAAY,MAAc;AACjC,QAAO,6DAA6D;;AAGtE,SAAS,iBAAiB,UAAoB,MAAc;CAC1D,MAAM,SAAS,mBAAmB,YAAY,KAAK,CAAC;AACpD,SAAQ,UAAR;EACE,KAAK,SACH,QAAO,gCAAgC;EACzC,KAAK;EACL,QACE,QAAO,0BAA0B;;;AAIvC,SAAgB,aAAa,EAAE,MAAM,aAAgC;CACnE,MAAM,WAAWA,QAAM,kBAAkB;AACvC,MAAI;AACF,aAAU,WAAW,UAAU,KAAK,CAAC,YAAY,GAE/C;WACK,IAAI;IAGZ,CAAC,KAAK,CAAC;CAEV,MAAM,cAAcA,QAAM,kBAAkB;EAC1C,MAAM,MAAM,iBAAiB,WAAW,KAAK;AAC7C,MAAI;AACF,aAAU,WAAW,UAAU,KAAK,CAAC,YAAY,GAE/C;WACK,IAAI;AAGb,SAAO,KAAK,KAAK,UAAU,sBAAsB;IAChD,CAAC,KAAK,CAAC;CAEV,MAAM,aAAaA,QAAM,kBAAkB;EACzC,MAAM,MAAM,iBAAiB,UAAU,KAAK;AAC5C,MAAI;AACF,aAAU,WAAW,UAAU,KAAK,CAAC,YAAY,GAE/C;WACK,IAAI;AAGb,SAAO,KAAK,KAAK,UAAU,sBAAsB;IAChD,CAAC,KAAK,CAAC;AAEV,QACE,qBAAC,2BACC,oBAAC;EAAoB;YACnB,oBAAC;GACY;GACX,SAAQ;GACR,cAAW;aACZ;IAEQ;GACW,EACtB,qBAAC;EAAoB,OAAM;;GACzB,oBAAC;IAAiB,SAAS;cAAU;KAAkC;GACvE,oBAAC;IAAiB,SAAS;cAAa;KAErB;GACnB,oBAAC;IAAiB,SAAS;cAAY;KAAiC;;GACpD,IACT"}
|
|
@@ -9,7 +9,7 @@ function CommandPalette({ open, onOpenChange, groups, placeholder = "Type a comm
|
|
|
9
9
|
const [internalOpen, setInternalOpen] = React$1.useState(false);
|
|
10
10
|
const isControlled = typeof open === "boolean";
|
|
11
11
|
const visible = isControlled ? open : internalOpen;
|
|
12
|
-
const setVisible = isControlled ? onOpenChange : setInternalOpen;
|
|
12
|
+
const setVisible = isControlled && onOpenChange ? onOpenChange : setInternalOpen;
|
|
13
13
|
React$1.useEffect(() => {
|
|
14
14
|
const handler = (e) => {
|
|
15
15
|
if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === "k") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandPalette.js","names":["React"],"sources":["../../../src/components/molecules/CommandPalette.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport {\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n CommandShortcut,\n} from '@lssm/lib.ui-kit-web/ui/command';\n\nexport interface CommandPaletteProps {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n groups: {\n heading?: string;\n items: {\n id: string;\n label: string;\n shortcut?: string;\n onSelect?: () => void;\n }[];\n }[];\n placeholder?: string;\n kbd?: string; // e.g., ⌘K shown in UI copy\n}\n\nexport function CommandPalette({\n open,\n onOpenChange,\n groups,\n placeholder = 'Type a command or search…',\n}: CommandPaletteProps) {\n const [internalOpen, setInternalOpen] = React.useState(false);\n const isControlled = typeof open === 'boolean';\n const visible = isControlled ? open : internalOpen;\n const setVisible = isControlled ? onOpenChange
|
|
1
|
+
{"version":3,"file":"CommandPalette.js","names":["React"],"sources":["../../../src/components/molecules/CommandPalette.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport {\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n CommandShortcut,\n} from '@lssm/lib.ui-kit-web/ui/command';\n\nexport interface CommandPaletteProps {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n groups: {\n heading?: string;\n items: {\n id: string;\n label: string;\n shortcut?: string;\n onSelect?: () => void;\n }[];\n }[];\n placeholder?: string;\n kbd?: string; // e.g., ⌘K shown in UI copy\n}\n\nexport function CommandPalette({\n open,\n onOpenChange,\n groups,\n placeholder = 'Type a command or search…',\n}: CommandPaletteProps) {\n const [internalOpen, setInternalOpen] = React.useState(false);\n const isControlled = typeof open === 'boolean';\n const visible = isControlled ? open : internalOpen;\n const setVisible = (\n isControlled && onOpenChange ? onOpenChange : setInternalOpen\n ) as (open: boolean) => void;\n\n React.useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'k') {\n e.preventDefault();\n setVisible(!visible);\n }\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [visible, setVisible]);\n\n return (\n <CommandDialog open={visible} onOpenChange={setVisible}>\n <CommandInput placeholder={placeholder} />\n <CommandList>\n <CommandEmpty>No results found.</CommandEmpty>\n {groups.map((g, gi) => (\n <CommandGroup key={gi} heading={g.heading}>\n {g.items.map((it) => (\n <CommandItem key={it.id} onSelect={it.onSelect}>\n <span>{it.label}</span>\n {it.shortcut && (\n <CommandShortcut>{it.shortcut}</CommandShortcut>\n )}\n </CommandItem>\n ))}\n </CommandGroup>\n ))}\n <CommandSeparator />\n </CommandList>\n </CommandDialog>\n );\n}\n"],"mappings":";;;;;;;AA8BA,SAAgB,eAAe,EAC7B,MACA,cACA,QACA,cAAc,+BACQ;CACtB,MAAM,CAAC,cAAc,mBAAmBA,QAAM,SAAS,MAAM;CAC7D,MAAM,eAAe,OAAO,SAAS;CACrC,MAAM,UAAU,eAAe,OAAO;CACtC,MAAM,aACJ,gBAAgB,eAAe,eAAe;AAGhD,SAAM,gBAAgB;EACpB,MAAM,WAAW,MAAqB;AACpC,QAAK,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,aAAa,KAAK,KAAK;AAC3D,MAAE,gBAAgB;AAClB,eAAW,CAAC,QAAQ;;;AAGxB,WAAS,iBAAiB,WAAW,QAAQ;AAC7C,eAAa,SAAS,oBAAoB,WAAW,QAAQ;IAC5D,CAAC,SAAS,WAAW,CAAC;AAEzB,QACE,qBAAC;EAAc,MAAM;EAAS,cAAc;aAC1C,oBAAC,gBAA0B,cAAe,EAC1C,qBAAC;GACC,oBAAC,0BAAa,sBAAgC;GAC7C,OAAO,KAAK,GAAG,OACd,oBAAC;IAAsB,SAAS,EAAE;cAC/B,EAAE,MAAM,KAAK,OACZ,qBAAC;KAAwB,UAAU,GAAG;gBACpC,oBAAC,oBAAM,GAAG,QAAa,EACtB,GAAG,YACF,oBAAC,6BAAiB,GAAG,WAA2B;OAHlC,GAAG,GAKP,CACd;MARe,GASJ,CACf;GACF,oBAAC,qBAAmB;MACR;GACA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityCard.js","names":["Wrapper: React.ElementType"],"sources":["../../../src/components/molecules/EntityCard.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Card, CardContent } from '@lssm/lib.ui-kit-web/ui/card';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\n\nconst entityCardVariants = cva('transition-all hover:shadow-2xs', {\n variants: {\n emphasis: {\n default: '',\n subtle: 'border-muted/60 bg-muted/20',\n strong: 'border-primary/50 bg-primary/5',\n },\n density: {\n compact: 'p-3',\n comfortable: 'p-4 md:p-5',\n },\n },\n defaultVariants: { emphasis: 'default', density: 'comfortable' },\n});\n\nexport type EntityCardProps = React.ComponentProps<typeof Card> &\n VariantProps<typeof entityCardVariants> & {\n cardTitle: React.ReactNode;\n cardSubtitle?: React.ReactNode;\n chips?: React.ReactNode; // right-aligned small chips\n meta?: React.ReactNode; // rows of icon+text data\n footer?: React.ReactNode; // actions area\n href?: string; // optional link wrapper\n contentClassName?: string;\n preview?: React.ReactNode; // hover preview content\n };\n\nexport function EntityCard({\n cardTitle,\n cardSubtitle,\n chips,\n meta,\n footer,\n emphasis,\n density,\n className,\n contentClassName,\n href,\n preview,\n ...cardProps\n}: EntityCardProps) {\n const Wrapper: React.ElementType = href ? 'a' : 'div';\n const cardContent = (\n <Card\n className={cn(entityCardVariants({ emphasis }), className)}\n {...cardProps}\n >\n <CardContent\n className={cn(entityCardVariants({ density }), contentClassName)}\n >\n <div className=\"space-y-3\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-lg font-medium\">{cardTitle}</div>\n {cardSubtitle && (\n <div className=\"text-muted-foreground text-base\">\n {cardSubtitle}\n </div>\n )}\n </div>\n {chips && (\n <div className=\"inline-flex shrink-0 items-center gap-1\">\n {chips}\n </div>\n )}\n </div>\n {meta && <div className=\"space-y-1\">{meta}</div>}\n {footer && (\n <div className=\"flex items-center justify-between\">{footer}</div>\n )}\n </div>\n </CardContent>\n </Card>\n );\n\n const maybePreview = (() => {\n if (!preview) return cardContent;\n try {\n const { HoverPreview } =\n require('./HoverPreview') as typeof import('./HoverPreview');\n return <HoverPreview trigger={cardContent} content={preview} />;\n } catch {\n return cardContent;\n }\n })();\n\n return (\n <Wrapper href={href} className={href ? 'block' : undefined}>\n {maybePreview}\n </Wrapper>\n );\n}\n"],"mappings":";;;;;;;;;;;AAOA,MAAM,qBAAqB,IAAI,mCAAmC;CAChE,UAAU;EACR,UAAU;GACR,SAAS;GACT,QAAQ;GACR,QAAQ;GACT;EACD,SAAS;GACP,SAAS;GACT,aAAa;GACd;EACF;CACD,iBAAiB;EAAE,UAAU;EAAW,SAAS;EAAe;CACjE,CAAC;AAcF,SAAgB,WAAW,EACzB,WACA,cACA,OACA,MACA,QACA,UACA,SACA,WACA,kBACA,MACA,SACA,GAAG,aACe;CAClB,MAAMA,UAA6B,OAAO,MAAM;CAChD,MAAM,cACJ,oBAAC;EACC,WAAW,GAAG,mBAAmB,EAAE,UAAU,CAAC,EAAE,UAAU;EAC1D,GAAI;YAEJ,oBAAC;GACC,WAAW,GAAG,mBAAmB,EAAE,SAAS,CAAC,EAAE,iBAAiB;aAEhE,qBAAC;IAAI,WAAU;;KACb,qBAAC;MAAI,WAAU;iBACb,qBAAC;OAAI,WAAU;kBACb,oBAAC;QAAI,WAAU;kBAAgC;SAAgB,EAC9D,gBACC,oBAAC;QAAI,WAAU;kBACZ;SACG;QAEJ,EACL,SACC,oBAAC;OAAI,WAAU;iBACZ;QACG;OAEJ;KACL,QAAQ,oBAAC;MAAI,WAAU;gBAAa;OAAW;KAC/C,UACC,oBAAC;MAAI,WAAU;gBAAqC;OAAa;;KAE/D;IACM;GACT;CAGT,MAAM,sBAAsB;AAC1B,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI;
|
|
1
|
+
{"version":3,"file":"EntityCard.js","names":["Wrapper: React.ElementType"],"sources":["../../../src/components/molecules/EntityCard.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Card, CardContent } from '@lssm/lib.ui-kit-web/ui/card';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\n\nconst entityCardVariants = cva('transition-all hover:shadow-2xs', {\n variants: {\n emphasis: {\n default: '',\n subtle: 'border-muted/60 bg-muted/20',\n strong: 'border-primary/50 bg-primary/5',\n },\n density: {\n compact: 'p-3',\n comfortable: 'p-4 md:p-5',\n },\n },\n defaultVariants: { emphasis: 'default', density: 'comfortable' },\n});\n\nexport type EntityCardProps = React.ComponentProps<typeof Card> &\n VariantProps<typeof entityCardVariants> & {\n cardTitle: React.ReactNode;\n cardSubtitle?: React.ReactNode;\n chips?: React.ReactNode; // right-aligned small chips\n meta?: React.ReactNode; // rows of icon+text data\n footer?: React.ReactNode; // actions area\n href?: string; // optional link wrapper\n contentClassName?: string;\n preview?: React.ReactNode; // hover preview content\n };\n\nexport function EntityCard({\n cardTitle,\n cardSubtitle,\n chips,\n meta,\n footer,\n emphasis,\n density,\n className,\n contentClassName,\n href,\n preview,\n ...cardProps\n}: EntityCardProps) {\n const Wrapper: React.ElementType = href ? 'a' : 'div';\n const cardContent = (\n <Card\n className={cn(entityCardVariants({ emphasis }), className)}\n {...cardProps}\n >\n <CardContent\n className={cn(entityCardVariants({ density }), contentClassName)}\n >\n <div className=\"space-y-3\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-lg font-medium\">{cardTitle}</div>\n {cardSubtitle && (\n <div className=\"text-muted-foreground text-base\">\n {cardSubtitle}\n </div>\n )}\n </div>\n {chips && (\n <div className=\"inline-flex shrink-0 items-center gap-1\">\n {chips}\n </div>\n )}\n </div>\n {meta && <div className=\"space-y-1\">{meta}</div>}\n {footer && (\n <div className=\"flex items-center justify-between\">{footer}</div>\n )}\n </div>\n </CardContent>\n </Card>\n );\n\n const maybePreview = (() => {\n if (!preview) return cardContent;\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={cardContent} content={preview} />;\n } catch {\n return cardContent;\n }\n })();\n\n return (\n <Wrapper href={href} className={href ? 'block' : undefined}>\n {maybePreview}\n </Wrapper>\n );\n}\n"],"mappings":";;;;;;;;;;;AAOA,MAAM,qBAAqB,IAAI,mCAAmC;CAChE,UAAU;EACR,UAAU;GACR,SAAS;GACT,QAAQ;GACR,QAAQ;GACT;EACD,SAAS;GACP,SAAS;GACT,aAAa;GACd;EACF;CACD,iBAAiB;EAAE,UAAU;EAAW,SAAS;EAAe;CACjE,CAAC;AAcF,SAAgB,WAAW,EACzB,WACA,cACA,OACA,MACA,QACA,UACA,SACA,WACA,kBACA,MACA,SACA,GAAG,aACe;CAClB,MAAMA,UAA6B,OAAO,MAAM;CAChD,MAAM,cACJ,oBAAC;EACC,WAAW,GAAG,mBAAmB,EAAE,UAAU,CAAC,EAAE,UAAU;EAC1D,GAAI;YAEJ,oBAAC;GACC,WAAW,GAAG,mBAAmB,EAAE,SAAS,CAAC,EAAE,iBAAiB;aAEhE,qBAAC;IAAI,WAAU;;KACb,qBAAC;MAAI,WAAU;iBACb,qBAAC;OAAI,WAAU;kBACb,oBAAC;QAAI,WAAU;kBAAgC;SAAgB,EAC9D,gBACC,oBAAC;QAAI,WAAU;kBACZ;SACG;QAEJ,EACL,SACC,oBAAC;OAAI,WAAU;iBACZ;QACG;OAEJ;KACL,QAAQ,oBAAC;MAAI,WAAU;gBAAa;OAAW;KAC/C,UACC,oBAAC;MAAI,WAAU;gBAAqC;OAAa;;KAE/D;IACM;GACT;CAGT,MAAM,sBAAsB;AAC1B,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI;GAEF,MAAM,EAAE;AAGR,UAAO,oBAAC;IAAa,SAAS;IAAa,SAAS;KAAW;UACzD;AACN,UAAO;;KAEP;AAEJ,QACE,oBAAC;EAAc;EAAM,WAAW,OAAO,UAAU;YAC9C;GACO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NavItemCard.js","names":[],"sources":["../../../src/components/molecules/NavItemCard.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\nimport type { NavLink } from '../../types/navigation';\n\nexport interface NavItemCardProps {\n item: NavLink;\n className?: string;\n}\n\nexport function NavItemCard({ item, className }: NavItemCardProps) {\n return (\n <a\n href={item.href}\n className={cn(\n 'hover:bg-accent block rounded-md p-2 transition-colors',\n className\n )}\n aria-label={typeof item.label === 'string' ? item.label : item.ariaLabel}\n target={item.target}\n rel={item.external ? 'noopener noreferrer' : undefined}\n >\n <div className=\"flex items-center gap-3\">\n {item.imageSrc ? (\n // keep generic img to avoid coupling to Next.js Image\n
|
|
1
|
+
{"version":3,"file":"NavItemCard.js","names":[],"sources":["../../../src/components/molecules/NavItemCard.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\nimport type { NavLink } from '../../types/navigation';\n\nexport interface NavItemCardProps {\n item: NavLink;\n className?: string;\n}\n\nexport function NavItemCard({ item, className }: NavItemCardProps) {\n return (\n <a\n href={item.href}\n className={cn(\n 'hover:bg-accent block rounded-md p-2 transition-colors',\n className\n )}\n aria-label={typeof item.label === 'string' ? item.label : item.ariaLabel}\n target={item.target}\n rel={item.external ? 'noopener noreferrer' : undefined}\n >\n <div className=\"flex items-center gap-3\">\n {item.imageSrc ? (\n // keep generic img to avoid coupling to Next.js Image\n <img\n src={item.imageSrc}\n alt={item.imageAlt || ''}\n className=\"h-12 w-12 rounded-xs object-cover\"\n />\n ) : (\n item.icon || null\n )}\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2 text-base font-medium\">\n {item.label}\n {item.badge && (\n <span className=\"text-muted-foreground ml-1 text-xs\">\n {item.badge}\n </span>\n )}\n </div>\n {item.description && (\n <div className=\"text-muted-foreground line-clamp-2 text-sm\">\n {item.description}\n </div>\n )}\n {item.categories && item.categories.length > 0 && (\n <div className=\"mt-1 flex flex-wrap items-center gap-1\">\n {item.categories.map((c, i) => (\n <span\n key={i}\n className=\"bg-muted text-muted-foreground rounded-xs px-1.5 py-0.5 text-[10px]\"\n >\n {c}\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n </a>\n );\n}\n"],"mappings":";;;;;;;AAWA,SAAgB,YAAY,EAAE,MAAM,aAA+B;AACjE,QACE,oBAAC;EACC,MAAM,KAAK;EACX,WAAW,GACT,0DACA,UACD;EACD,cAAY,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,KAAK;EAC/D,QAAQ,KAAK;EACb,KAAK,KAAK,WAAW,wBAAwB;YAE7C,qBAAC;GAAI,WAAU;cACZ,KAAK,WAEJ,oBAAC;IACC,KAAK,KAAK;IACV,KAAK,KAAK,YAAY;IACtB,WAAU;KACV,GAEF,KAAK,QAAQ,MAEf,qBAAC;IAAI,WAAU;;KACb,qBAAC;MAAI,WAAU;iBACZ,KAAK,OACL,KAAK,SACJ,oBAAC;OAAK,WAAU;iBACb,KAAK;QACD;OAEL;KACL,KAAK,eACJ,oBAAC;MAAI,WAAU;gBACZ,KAAK;OACF;KAEP,KAAK,cAAc,KAAK,WAAW,SAAS,KAC3C,oBAAC;MAAI,WAAU;gBACZ,KAAK,WAAW,KAAK,GAAG,MACvB,oBAAC;OAEC,WAAU;iBAET;SAHI,EAIA,CACP;OACE;;KAEJ;IACF;GACJ"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SkeletonBlockProps } from "./types.js";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react_jsx_runtime112 from "react/jsx-runtime";
|
|
3
3
|
|
|
4
4
|
//#region src/components/molecules/SkeletonBlock/index.web.d.ts
|
|
5
5
|
declare function SkeletonBlock({
|
|
@@ -7,7 +7,7 @@ declare function SkeletonBlock({
|
|
|
7
7
|
h,
|
|
8
8
|
rounded,
|
|
9
9
|
className
|
|
10
|
-
}: SkeletonBlockProps):
|
|
10
|
+
}: SkeletonBlockProps): react_jsx_runtime112.JSX.Element;
|
|
11
11
|
//#endregion
|
|
12
12
|
export { SkeletonBlock };
|
|
13
13
|
//# sourceMappingURL=index.web.d.ts.map
|