@alfadocs/ui-kit-debug 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/_chunks/_commonjsHelpers-C6fGbg64.js +7 -0
  2. package/dist/_chunks/_commonjsHelpers-C6fGbg64.js.map +1 -0
  3. package/dist/_chunks/{ai-prompt-input-bAJwYu84.js → ai-prompt-input-noh-N3cf.js} +2 -2
  4. package/dist/_chunks/{ai-prompt-input-bAJwYu84.js.map → ai-prompt-input-noh-N3cf.js.map} +1 -1
  5. package/dist/_chunks/{contact-card-VJIUqKB2.js → contact-card-DTQUMetD.js} +22 -38
  6. package/dist/_chunks/contact-card-DTQUMetD.js.map +1 -0
  7. package/dist/_chunks/external-link-C6F25E6k.js +16 -0
  8. package/dist/_chunks/external-link-C6F25E6k.js.map +1 -0
  9. package/dist/_chunks/{file-upload-DIecAfC-.js → file-upload-nMh-1jDD.js} +2 -2
  10. package/dist/_chunks/{file-upload-DIecAfC-.js.map → file-upload-nMh-1jDD.js.map} +1 -1
  11. package/dist/_chunks/{index-CeY1nNvd.js → index-CFoBa86t.js} +61 -63
  12. package/dist/_chunks/{index-CeY1nNvd.js.map → index-CFoBa86t.js.map} +1 -1
  13. package/dist/_chunks/{link-BGpwaFik.js → link-DmM5IevO.js} +16 -26
  14. package/dist/_chunks/link-DmM5IevO.js.map +1 -0
  15. package/dist/_chunks/map-pin-B8STOPMJ.js +21 -0
  16. package/dist/_chunks/map-pin-B8STOPMJ.js.map +1 -0
  17. package/dist/_chunks/map-view-Dd48BxVB.js +1941 -0
  18. package/dist/_chunks/map-view-Dd48BxVB.js.map +1 -0
  19. package/dist/_chunks/whatsapp-button-Bj5FIhpC.js +175 -0
  20. package/dist/_chunks/whatsapp-button-Bj5FIhpC.js.map +1 -0
  21. package/dist/agent-catalog.json +53 -1
  22. package/dist/components/ai-prompt-input/index.js +1 -1
  23. package/dist/components/contact-card/index.js +1 -1
  24. package/dist/components/file-upload/index.js +1 -1
  25. package/dist/components/index.d.ts +2 -0
  26. package/dist/components/index.d.ts.map +1 -1
  27. package/dist/components/link/index.js +1 -1
  28. package/dist/components/map-view/index.d.ts +3 -0
  29. package/dist/components/map-view/index.d.ts.map +1 -0
  30. package/dist/components/map-view/index.js +5 -0
  31. package/dist/components/map-view/index.js.map +1 -0
  32. package/dist/components/map-view/map-view.agent.d.ts +4 -0
  33. package/dist/components/map-view/map-view.agent.d.ts.map +1 -0
  34. package/dist/components/map-view/map-view.d.ts +78 -0
  35. package/dist/components/map-view/map-view.d.ts.map +1 -0
  36. package/dist/components/whatsapp-button/index.d.ts +3 -0
  37. package/dist/components/whatsapp-button/index.d.ts.map +1 -0
  38. package/dist/components/whatsapp-button/index.js +5 -0
  39. package/dist/components/whatsapp-button/index.js.map +1 -0
  40. package/dist/components/whatsapp-button/whatsapp-button.d.ts +32 -0
  41. package/dist/components/whatsapp-button/whatsapp-button.d.ts.map +1 -0
  42. package/dist/i18n/config.js +45 -6
  43. package/dist/i18n/config.js.map +1 -1
  44. package/dist/i18n/resources.d.ts +39 -0
  45. package/dist/i18n/resources.d.ts.map +1 -1
  46. package/dist/index.js +348 -344
  47. package/dist/index.js.map +1 -1
  48. package/dist/locales/de.json +13 -0
  49. package/dist/locales/en.json +13 -0
  50. package/dist/locales/it.json +13 -0
  51. package/dist/tokens/google-maps-theme.d.ts +15 -0
  52. package/dist/tokens/google-maps-theme.d.ts.map +1 -0
  53. package/dist/tokens.css +1 -1
  54. package/package.json +15 -1
  55. package/dist/_chunks/contact-card-VJIUqKB2.js.map +0 -1
  56. package/dist/_chunks/link-BGpwaFik.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alfadocs/ui-kit-debug",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "type": "module",
5
5
  "description": "AlfaDocs shared design system — tokens, components, patterns, and translations for platform, booking, and alfascribe. (debug build — identical runtime to @alfadocs/ui-kit, ships source maps for symbolication).",
6
6
  "license": "BUSL-1.1",
@@ -227,6 +227,10 @@
227
227
  "types": "./dist/components/logo/index.d.ts",
228
228
  "import": "./dist/components/logo/index.js"
229
229
  },
230
+ "./map-view": {
231
+ "types": "./dist/components/map-view/index.d.ts",
232
+ "import": "./dist/components/map-view/index.js"
233
+ },
230
234
  "./matrix-rain": {
231
235
  "types": "./dist/components/matrix-rain/index.d.ts",
232
236
  "import": "./dist/components/matrix-rain/index.js"
@@ -451,6 +455,10 @@
451
455
  "types": "./dist/components/warning-stack/index.d.ts",
452
456
  "import": "./dist/components/warning-stack/index.js"
453
457
  },
458
+ "./whatsapp-button": {
459
+ "types": "./dist/components/whatsapp-button/index.d.ts",
460
+ "import": "./dist/components/whatsapp-button/index.js"
461
+ },
454
462
  "./workflow": {
455
463
  "types": "./dist/components/workflow/index.d.ts",
456
464
  "import": "./dist/components/workflow/index.js"
@@ -518,6 +526,7 @@
518
526
  "@tiptap/pm": "^3.22.3",
519
527
  "@tiptap/react": "^3.22.3",
520
528
  "@tiptap/starter-kit": "^3.22.3",
529
+ "@vis.gl/react-google-maps": "^1.1.0 || ^2",
521
530
  "ag-grid-community": "^35.2.1",
522
531
  "ag-grid-react": "^35.2.1",
523
532
  "apexcharts": "^5.10.1",
@@ -607,6 +616,9 @@
607
616
  "@tiptap/starter-kit": {
608
617
  "optional": true
609
618
  },
619
+ "@vis.gl/react-google-maps": {
620
+ "optional": true
621
+ },
610
622
  "ag-grid-community": {
611
623
  "optional": true
612
624
  },
@@ -694,8 +706,10 @@
694
706
  "@tiptap/react": "^3.22.3",
695
707
  "@tiptap/starter-kit": "^3.22.3",
696
708
  "@types/dompurify": "^3.0.5",
709
+ "@types/google.maps": "^3.58.1",
697
710
  "@types/react": "^18.3.28",
698
711
  "@types/react-dom": "^18.3.7",
712
+ "@vis.gl/react-google-maps": "^1.5.5",
699
713
  "@vitejs/plugin-react": "^4.7.0",
700
714
  "@vitest/browser-playwright": "^4.1.4",
701
715
  "@vitest/coverage-v8": "^4.1.4",
@@ -1 +0,0 @@
1
- {"version":3,"file":"contact-card-VJIUqKB2.js","sources":["../../node_modules/lucide-react/dist/esm/icons/map-pin.js","../../src/components/contact-card/contact-card.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0\",\n key: \"1r0f0z\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"10\", r: \"3\", key: \"ilqhr7\" }]\n];\nconst MapPin = createLucideIcon(\"map-pin\", __iconNode);\n\nexport { __iconNode, MapPin as default };\n//# sourceMappingURL=map-pin.js.map\n","import {\n forwardRef,\n Fragment,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { MapPin } from 'lucide-react';\nimport { Card } from '../card/card';\nimport { Link } from '../link/link';\n\n/* ------------------------------------------------------------------ */\n/* Phone helper */\n/* ------------------------------------------------------------------ */\n\n/**\n * Strip everything that's not a digit or a leading `+` so the display\n * string (`\"+49 (0)89 51871478\"`) becomes a valid `tel:` URI target\n * (`\"tel:+498951871478\"`). RFC 3966 allows visual separators, but most\n * dialer apps still trip on them — collapsing to a strict E.164-ish\n * form is the safe default. The `(0)` trunk-prefix convention is\n * intentionally dropped: it's not a real digit in international\n * dialling, only a hint for in-country dialling.\n */\nfunction buildTelHref(display: string): string {\n const trunkStripped = display.replace(/\\(0\\)/g, '');\n const digits = trunkStripped.replace(/[^\\d+]/g, '');\n return `tel:${digits}`;\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport interface ContactCardProps extends Omit<\n HTMLAttributes<HTMLElement>,\n 'title'\n> {\n /**\n * Optional card heading rendered inside `Card.Header` as an `<h2>` —\n * e.g. \"Contact information\" above one or more office blocks. Omit\n * when the card sits inside a section that already has a heading.\n */\n title?: ReactNode;\n /**\n * `Card` variant. Defaults to `default` (subtle border on `--card`\n * surface) to match the marketing site's treatment.\n */\n variant?: 'default' | 'outlined' | 'elevated';\n children: ReactNode;\n}\n\nconst ContactCardRoot = forwardRef<HTMLElement, ContactCardProps>(\n ({ title, variant = 'default', className, children, ...props }, ref) => (\n <Card\n ref={ref}\n variant={variant}\n data-component=\"contact-card\"\n className={className}\n {...props}\n >\n {title !== undefined ? (\n <Card.Header>\n <h2 className=\"type-title-card ds:text-foreground\">{title}</h2>\n </Card.Header>\n ) : null}\n <Card.Body\n className={[\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-md)]',\n // Tighten the body padding-block-start when a header sits\n // above so the whole card reads as one cohesive block rather\n // than two stacked sections — Card.Header already paints\n // bottom padding via `pb-0` + Card.Body's `p-md`.\n ].join(' ')}\n >\n {children}\n </Card.Body>\n </Card>\n ),\n);\nContactCardRoot.displayName = 'ContactCard';\n\n/* ------------------------------------------------------------------ */\n/* Office */\n/* ------------------------------------------------------------------ */\n\nexport interface ContactCardOfficeProps extends Omit<\n HTMLAttributes<HTMLElement>,\n 'children'\n> {\n /**\n * Office name — rendered as the block's bold label next to the pin\n * glyph. Not a heading element by default so a card with multiple\n * offices doesn't fragment the heading outline; pass `nameAs=\"h3\"`\n * (or `h4` etc.) when the consuming page wants a real heading.\n */\n name: ReactNode;\n /**\n * Address lines in document order, one per `<br>`-equivalent. Country\n * / region / postcode formatting is the consumer's responsibility —\n * the kit only inserts the line breaks.\n */\n lines: ReadonlyArray<string>;\n /**\n * VAT / tax-ID number. Rendered on its own line with the kit-owned\n * `ui.contactCard.vatNumberLabel` prefix.\n */\n vatNumber?: string;\n /**\n * Phone number as it should display (with separators, parens, trunk\n * prefix). The kit normalises this into a `tel:` URI internally —\n * see `buildTelHref` for the rules.\n */\n phone?: string;\n /** Heading element used for `name`. Defaults to a non-heading `<p>`. */\n nameAs?: 'p' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n}\n\nconst ContactCardOffice = forwardRef<HTMLElement, ContactCardOfficeProps>(\n (\n { name, lines, vatNumber, phone, nameAs = 'p', className, ...props },\n ref,\n ) => {\n const { t } = useTranslation();\n const NameTag = nameAs as 'p';\n\n return (\n <address\n ref={ref as React.Ref<HTMLElement>}\n data-component=\"contact-card-office\"\n className={[\n // `not-italic` overrides the UA default for `<address>` since\n // the kit's type ramp already encodes intent — italic would\n // double up with a heading-bold name and read as emphasis.\n 'ds:not-italic ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n <NameTag className=\"ds:m-0 ds:flex ds:items-center ds:gap-[var(--spacing-xs)] type-label ds:font-semibold ds:text-foreground\">\n <MapPin\n aria-hidden=\"true\"\n className=\"ds:size-[1.25em] ds:text-primary ds:shrink-0\"\n />\n <span>{name}</span>\n </NameTag>\n <div className=\"type-body-sm ds:text-foreground ds:[unicode-bidi:isolate]\">\n {lines.map((line, i) => (\n <Fragment key={i}>\n {line}\n {i < lines.length - 1 ? <br /> : null}\n </Fragment>\n ))}\n </div>\n {vatNumber ? (\n <div className=\"type-body-sm ds:text-muted-foreground\">\n <span className=\"ds:me-[var(--spacing-2xs)]\">\n {t('contactCard.vatNumberLabel')}\n </span>\n <span className=\"ds:[unicode-bidi:isolate]\">{vatNumber}</span>\n </div>\n ) : null}\n {phone ? (\n <div className=\"type-body-sm ds:text-muted-foreground ds:inline-flex ds:items-baseline ds:gap-[var(--spacing-2xs)] ds:flex-wrap\">\n <span>{t('contactCard.phoneLabel')}</span>\n <Link href={buildTelHref(phone)} intent=\"default\">\n <span className=\"ds:[unicode-bidi:isolate]\">{phone}</span>\n </Link>\n </div>\n ) : null}\n </address>\n );\n },\n);\nContactCardOffice.displayName = 'ContactCard.Office';\n\n/* ------------------------------------------------------------------ */\n/* Links */\n/* ------------------------------------------------------------------ */\n\nexport type ContactCardLinksProps = HTMLAttributes<HTMLUListElement>;\n\nconst ContactCardLinks = forwardRef<HTMLUListElement, ContactCardLinksProps>(\n ({ className, children, ...props }, ref) => (\n <ul\n ref={ref}\n data-component=\"contact-card-links\"\n className={[\n 'ds:m-0 ds:p-0 ds:list-none',\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n {children}\n </ul>\n ),\n);\nContactCardLinks.displayName = 'ContactCard.Links';\n\n/* ------------------------------------------------------------------ */\n/* Link */\n/* ------------------------------------------------------------------ */\n\nexport interface ContactCardLinkProps {\n href: string;\n /**\n * Leading glyph. Rendered with `--primary` so the link list reads as\n * a coloured-icon menu (matches the marketing site's treatment).\n * Consumers pass a bare lucide-react icon; the kit handles colour /\n * size / aria-hidden.\n */\n icon: ReactNode;\n /** Open in a new tab — adds `target=\"_blank\"` and `rel` via `Link`. */\n external?: boolean;\n children: ReactNode;\n}\n\nconst ContactCardLink = forwardRef<HTMLLIElement, ContactCardLinkProps>(\n ({ href, icon, external, children }, ref) => (\n <li ref={ref} className=\"ds:m-0\">\n <Link\n href={href}\n external={external}\n // Wrap in a `text-primary` span so the lucide glyph (which uses\n // `currentColor`) picks up the brand tint without the consumer\n // having to thread a className through every icon. Link adds\n // its own aria-hidden wrapper + `[&_svg]:size-[1em]` outside\n // this; the colour cascades through.\n startIcon={<span className=\"ds:text-primary\">{icon}</span>}\n >\n {children}\n </Link>\n </li>\n ),\n);\nContactCardLink.displayName = 'ContactCard.Link';\n\n/* ------------------------------------------------------------------ */\n/* Compound export */\n/* ------------------------------------------------------------------ */\n\nexport const ContactCard = Object.assign(ContactCardRoot, {\n Office: ContactCardOffice,\n Links: ContactCardLinks,\n Link: ContactCardLink,\n});\n\nexport { buildTelHref as __buildTelHref };\n"],"names":["__iconNode","MapPin","createLucideIcon","buildTelHref","display","ContactCardRoot","forwardRef","title","variant","className","children","props","ref","jsxs","Card","jsx","ContactCardOffice","name","lines","vatNumber","phone","nameAs","t","useTranslation","NameTag","line","i","Fragment","Link","ContactCardLinks","ContactCardLink","href","icon","external","ContactCard"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"link-BGpwaFik.js","sources":["../../node_modules/lucide-react/dist/esm/icons/external-link.js","../../src/components/link/link.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 3h6v6\", key: \"1q9fwt\" }],\n [\"path\", { d: \"M10 14 21 3\", key: \"gplh6r\" }],\n [\"path\", { d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\", key: \"a6xqqp\" }]\n];\nconst ExternalLink = createLucideIcon(\"external-link\", __iconNode);\n\nexport { __iconNode, ExternalLink as default };\n//# sourceMappingURL=external-link.js.map\n","import { forwardRef, type AnchorHTMLAttributes, type ReactNode } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { ExternalLink } from 'lucide-react';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\n/**\n * Link is the semantic anchor primitive for inline navigation —\n * privacy / terms in form copy, external \"remote support\" links in\n * sidebars, in-paragraph references inside info-tip body copy.\n *\n * For action affordances that *look* like a link but trigger UI rather\n * than navigation, use `<Button intent=\"link\">` instead — the semantic\n * boundary matters for screen readers and keyboard users.\n */\nconst linkVariants = cva(\n [\n 'ds:underline-offset-4',\n 'ds:rounded-[var(--radius-xs)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:aria-disabled:cursor-not-allowed ds:aria-disabled:opacity-50 ds:aria-disabled:no-underline',\n ].join(' '),\n {\n variants: {\n intent: {\n // `--primary` already maps to `magenta-700` in light-accent and\n // `magenta-500` in dark (see tokens/index.css), so the accent\n // contrast trade-off in §11 of CLAUDE.md is handled at the\n // token layer, not here.\n default:\n 'ds:text-primary ds:underline ds:hover:text-primary-hover ds:active:opacity-80',\n subtle:\n 'ds:text-muted-foreground ds:no-underline ds:hover:text-foreground ds:hover:underline ds:active:opacity-80',\n inverted:\n 'ds:text-primary-foreground ds:underline ds:hover:opacity-90 ds:active:opacity-80',\n },\n weight: {\n normal: 'ds:font-normal',\n strong: 'ds:font-semibold',\n },\n // When the link carries an icon, the anchor itself becomes a flex\n // container so glyphs centre on the text optical centre — the\n // previous `vertical-align: -0.125em` heuristic over-corrected when\n // the link was the only thing on its line (e.g. each <li> of a\n // vertical sidebar nav). Text-only links remain plain `inline` so\n // they wrap naturally inside a paragraph.\n hasIcon: {\n no: 'ds:inline',\n yes: 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n },\n },\n defaultVariants: {\n intent: 'default',\n weight: 'normal',\n hasIcon: 'no',\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport interface LinkProps\n extends\n Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href'>,\n VariantProps<typeof linkVariants> {\n /** Anchor target. Required — the whole point of the component. */\n href: string;\n /**\n * Flag the link as opening in a new browsing context. Automatically\n * adds `target=\"_blank\"` + `rel=\"noopener noreferrer\"` and renders a\n * trailing `ExternalLink` icon with an i18n'd aria-label.\n */\n external?: boolean;\n /**\n * Render the link in a non-interactive disabled state. Strips `href`,\n * adds `aria-disabled` + `role=\"link\"`, suppresses the underline.\n * Prefer hiding the link entirely when possible — disabled links are\n * a usability anti-pattern outside of state-machine flows.\n */\n disabled?: boolean;\n /** Optional leading icon (inline-start). */\n startIcon?: ReactNode;\n /** Optional trailing icon (inline-end). Ignored when `external`. */\n endIcon?: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const Link = forwardRef<HTMLAnchorElement, LinkProps>(\n (\n {\n href,\n external = false,\n disabled = false,\n startIcon,\n endIcon,\n intent,\n weight,\n className,\n children,\n target,\n rel,\n onClick,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n\n const effectiveTarget = external ? '_blank' : target;\n const effectiveRel = external\n ? [rel, 'noopener', 'noreferrer'].filter(Boolean).join(' ')\n : rel;\n\n const externalLabel = t('link.opensInNewTab', 'Opens in a new tab');\n\n const handleClick: AnchorHTMLAttributes<HTMLAnchorElement>['onClick'] = (\n event,\n ) => {\n if (disabled) {\n event.preventDefault();\n return;\n }\n onClick?.(event);\n };\n\n const hasIcon = Boolean(startIcon || endIcon || external);\n\n return (\n <a\n ref={ref}\n // When disabled, drop href so the link is not actionable; pair\n // with aria-disabled + role=\"link\" so AT still announces the\n // role (the implicit role disappears once href is removed).\n href={disabled ? undefined : href}\n role={disabled ? 'link' : undefined}\n aria-disabled={disabled || undefined}\n target={effectiveTarget}\n rel={effectiveRel || undefined}\n onClick={handleClick}\n data-component=\"link\"\n data-intent={intent ?? 'default'}\n className={linkVariants({\n intent,\n weight,\n hasIcon: hasIcon ? 'yes' : 'no',\n className,\n })}\n {...rest}\n >\n {startIcon ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-flex ds:items-center ds:[&_svg]:size-[1em]\"\n >\n {startIcon}\n </span>\n ) : null}\n {children}\n {external ? (\n <span\n className=\"ds:inline-flex ds:items-center\"\n aria-label={externalLabel}\n >\n <ExternalLink aria-hidden=\"true\" className=\"ds:size-[1em]\" />\n </span>\n ) : endIcon ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-flex ds:items-center ds:[&_svg]:size-[1em]\"\n >\n {endIcon}\n </span>\n ) : null}\n </a>\n );\n },\n);\n\nLink.displayName = 'Link';\n"],"names":["__iconNode","ExternalLink","createLucideIcon","linkVariants","cva","Link","forwardRef","href","external","disabled","startIcon","endIcon","intent","weight","className","children","target","rel","onClick","rest","ref","t","useTranslation","effectiveTarget","effectiveRel","externalLabel","jsxs","event","jsx"],"mappings":"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","x_google_ignoreList":[0]}