@atelier-ui/react 0.1.12 → 0.2.1

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 (160) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +3 -3
  3. package/package.json +1 -1
  4. package/src/index.d.ts +29 -29
  5. package/src/index.js +29 -29
  6. package/src/index.js.map +1 -1
  7. package/src/lib/accordion/{llm-accordion.css → atl-accordion.css} +8 -8
  8. package/src/lib/accordion/{llm-accordion.d.ts → atl-accordion.d.ts} +12 -12
  9. package/src/lib/accordion/{llm-accordion.d.ts.map → atl-accordion.d.ts.map} +1 -1
  10. package/src/lib/accordion/{llm-accordion.js → atl-accordion.js} +9 -9
  11. package/src/lib/accordion/{llm-accordion.js.map → atl-accordion.js.map} +1 -1
  12. package/src/lib/alert/{llm-alert.css → atl-alert.css} +10 -10
  13. package/src/lib/alert/{llm-alert.d.ts → atl-alert.d.ts} +8 -8
  14. package/src/lib/alert/{llm-alert.d.ts.map → atl-alert.d.ts.map} +1 -1
  15. package/src/lib/alert/{llm-alert.js → atl-alert.js} +4 -4
  16. package/src/lib/alert/{llm-alert.js.map → atl-alert.js.map} +1 -1
  17. package/src/lib/avatar/{llm-avatar.css → atl-avatar.css} +20 -20
  18. package/src/lib/avatar/{llm-avatar.d.ts → atl-avatar.d.ts} +10 -10
  19. package/src/lib/avatar/{llm-avatar.d.ts.map → atl-avatar.d.ts.map} +1 -1
  20. package/src/lib/avatar/{llm-avatar.js → atl-avatar.js} +6 -6
  21. package/src/lib/avatar/{llm-avatar.js.map → atl-avatar.js.map} +1 -1
  22. package/src/lib/badge/{llm-badge.css → atl-badge.css} +9 -9
  23. package/src/lib/badge/atl-badge.d.ts +27 -0
  24. package/src/lib/badge/{llm-badge.d.ts.map → atl-badge.d.ts.map} +1 -1
  25. package/src/lib/badge/{llm-badge.js → atl-badge.js} +4 -4
  26. package/src/lib/badge/{llm-badge.js.map → atl-badge.js.map} +1 -1
  27. package/src/lib/breadcrumbs/{llm-breadcrumbs.css → atl-breadcrumbs.css} +11 -11
  28. package/src/lib/breadcrumbs/atl-breadcrumbs.d.ts +38 -0
  29. package/src/lib/breadcrumbs/{llm-breadcrumbs.d.ts.map → atl-breadcrumbs.d.ts.map} +1 -1
  30. package/src/lib/breadcrumbs/{llm-breadcrumbs.js → atl-breadcrumbs.js} +7 -7
  31. package/src/lib/breadcrumbs/{llm-breadcrumbs.js.map → atl-breadcrumbs.js.map} +1 -1
  32. package/src/lib/button/{llm-button.css → atl-button.css} +20 -20
  33. package/src/lib/button/{llm-button.d.ts → atl-button.d.ts} +7 -7
  34. package/src/lib/button/{llm-button.d.ts.map → atl-button.d.ts.map} +1 -1
  35. package/src/lib/button/{llm-button.js → atl-button.js} +4 -4
  36. package/src/lib/button/{llm-button.js.map → atl-button.js.map} +1 -1
  37. package/src/lib/card/{llm-card.css → atl-card.css} +20 -20
  38. package/src/lib/card/{llm-card.d.ts → atl-card.d.ts} +13 -13
  39. package/src/lib/card/{llm-card.d.ts.map → atl-card.d.ts.map} +1 -1
  40. package/src/lib/card/atl-card.js +30 -0
  41. package/src/lib/card/{llm-card.js.map → atl-card.js.map} +1 -1
  42. package/src/lib/chat/{llm-chat.css → atl-chat.css} +55 -55
  43. package/src/lib/chat/{llm-chat.d.ts → atl-chat.d.ts} +26 -26
  44. package/src/lib/chat/{llm-chat.d.ts.map → atl-chat.d.ts.map} +1 -1
  45. package/src/lib/chat/{llm-chat.js → atl-chat.js} +21 -21
  46. package/src/lib/chat/{llm-chat.js.map → atl-chat.js.map} +1 -1
  47. package/src/lib/checkbox/{llm-checkbox.css → atl-checkbox.css} +19 -19
  48. package/src/lib/checkbox/{llm-checkbox.d.ts → atl-checkbox.d.ts} +6 -6
  49. package/src/lib/checkbox/{llm-checkbox.d.ts.map → atl-checkbox.d.ts.map} +1 -1
  50. package/src/lib/checkbox/{llm-checkbox.js → atl-checkbox.js} +4 -4
  51. package/src/lib/checkbox/{llm-checkbox.js.map → atl-checkbox.js.map} +1 -1
  52. package/src/lib/code-block/{llm-code-block.css → atl-code-block.css} +2 -2
  53. package/src/lib/code-block/{llm-code-block.d.ts → atl-code-block.d.ts} +4 -4
  54. package/src/lib/code-block/{llm-code-block.d.ts.map → atl-code-block.d.ts.map} +1 -1
  55. package/src/lib/code-block/{llm-code-block.js → atl-code-block.js} +4 -4
  56. package/src/lib/code-block/{llm-code-block.js.map → atl-code-block.js.map} +1 -1
  57. package/src/lib/combobox/{llm-combobox.css → atl-combobox.css} +24 -24
  58. package/src/lib/combobox/{llm-combobox.d.ts → atl-combobox.d.ts} +7 -7
  59. package/src/lib/combobox/{llm-combobox.d.ts.map → atl-combobox.d.ts.map} +1 -1
  60. package/src/lib/combobox/{llm-combobox.js → atl-combobox.js} +8 -8
  61. package/src/lib/combobox/{llm-combobox.js.map → atl-combobox.js.map} +1 -1
  62. package/src/lib/dialog/{llm-dialog.css → atl-dialog.css} +18 -18
  63. package/src/lib/dialog/{llm-dialog.d.ts → atl-dialog.d.ts} +12 -12
  64. package/src/lib/dialog/{llm-dialog.d.ts.map → atl-dialog.d.ts.map} +1 -1
  65. package/src/lib/dialog/{llm-dialog.js → atl-dialog.js} +13 -13
  66. package/src/lib/dialog/{llm-dialog.js.map → atl-dialog.js.map} +1 -1
  67. package/src/lib/drawer/{llm-drawer.css → atl-drawer.css} +35 -35
  68. package/src/lib/drawer/{llm-drawer.d.ts → atl-drawer.d.ts} +12 -12
  69. package/src/lib/drawer/{llm-drawer.d.ts.map → atl-drawer.d.ts.map} +1 -1
  70. package/src/lib/drawer/{llm-drawer.js → atl-drawer.js} +13 -13
  71. package/src/lib/drawer/{llm-drawer.js.map → atl-drawer.js.map} +1 -1
  72. package/src/lib/icon/{llm-icon.css → atl-icon.css} +4 -4
  73. package/src/lib/icon/atl-icon.d.ts +24 -0
  74. package/src/lib/icon/{llm-icon.d.ts.map → atl-icon.d.ts.map} +1 -1
  75. package/src/lib/icon/{llm-icon.js → atl-icon.js} +5 -5
  76. package/src/lib/icon/{llm-icon.js.map → atl-icon.js.map} +1 -1
  77. package/src/lib/input/{llm-input.css → atl-input.css} +14 -14
  78. package/src/lib/input/{llm-input.d.ts → atl-input.d.ts} +6 -6
  79. package/src/lib/input/{llm-input.d.ts.map → atl-input.d.ts.map} +1 -1
  80. package/src/lib/input/{llm-input.js → atl-input.js} +4 -4
  81. package/src/lib/input/{llm-input.js.map → atl-input.js.map} +1 -1
  82. package/src/lib/menu/{llm-menu.css → atl-menu.css} +11 -11
  83. package/src/lib/menu/{llm-menu.d.ts → atl-menu.d.ts} +13 -13
  84. package/src/lib/menu/{llm-menu.d.ts.map → atl-menu.d.ts.map} +1 -1
  85. package/src/lib/menu/{llm-menu.js → atl-menu.js} +10 -10
  86. package/src/lib/menu/{llm-menu.js.map → atl-menu.js.map} +1 -1
  87. package/src/lib/pagination/{llm-pagination.css → atl-pagination.css} +1 -1
  88. package/src/lib/pagination/{llm-pagination.d.ts → atl-pagination.d.ts} +6 -6
  89. package/src/lib/pagination/{llm-pagination.d.ts.map → atl-pagination.d.ts.map} +1 -1
  90. package/src/lib/pagination/{llm-pagination.js → atl-pagination.js} +4 -4
  91. package/src/lib/pagination/{llm-pagination.js.map → atl-pagination.js.map} +1 -1
  92. package/src/lib/progress/{llm-progress.css → atl-progress.css} +9 -9
  93. package/src/lib/progress/{llm-progress.d.ts → atl-progress.d.ts} +6 -6
  94. package/src/lib/progress/{llm-progress.d.ts.map → atl-progress.d.ts.map} +1 -1
  95. package/src/lib/progress/{llm-progress.js → atl-progress.js} +4 -4
  96. package/src/lib/progress/{llm-progress.js.map → atl-progress.js.map} +1 -1
  97. package/src/lib/radio/{llm-radio.css → atl-radio.css} +11 -11
  98. package/src/lib/radio/{llm-radio.d.ts → atl-radio.d.ts} +7 -7
  99. package/src/lib/radio/{llm-radio.d.ts.map → atl-radio.d.ts.map} +1 -1
  100. package/src/lib/radio/{llm-radio.js → atl-radio.js} +6 -6
  101. package/src/lib/radio/{llm-radio.js.map → atl-radio.js.map} +1 -1
  102. package/src/lib/radio-group/{llm-radio-group.css → atl-radio-group.css} +6 -6
  103. package/src/lib/radio-group/{llm-radio-group.d.ts → atl-radio-group.d.ts} +6 -6
  104. package/src/lib/radio-group/{llm-radio-group.d.ts.map → atl-radio-group.d.ts.map} +1 -1
  105. package/src/lib/radio-group/{llm-radio-group.js → atl-radio-group.js} +4 -4
  106. package/src/lib/radio-group/{llm-radio-group.js.map → atl-radio-group.js.map} +1 -1
  107. package/src/lib/select/{llm-select.css → atl-select.css} +11 -11
  108. package/src/lib/select/{llm-select.d.ts → atl-select.d.ts} +10 -10
  109. package/src/lib/select/{llm-select.d.ts.map → atl-select.d.ts.map} +1 -1
  110. package/src/lib/select/{llm-select.js → atl-select.js} +6 -6
  111. package/src/lib/select/{llm-select.js.map → atl-select.js.map} +1 -1
  112. package/src/lib/skeleton/{llm-skeleton.css → atl-skeleton.css} +6 -6
  113. package/src/lib/skeleton/{llm-skeleton.d.ts → atl-skeleton.d.ts} +6 -6
  114. package/src/lib/skeleton/{llm-skeleton.d.ts.map → atl-skeleton.d.ts.map} +1 -1
  115. package/src/lib/skeleton/{llm-skeleton.js → atl-skeleton.js} +4 -4
  116. package/src/lib/skeleton/{llm-skeleton.js.map → atl-skeleton.js.map} +1 -1
  117. package/src/lib/spec.d.ts +120 -120
  118. package/src/lib/spec.js.map +1 -1
  119. package/src/lib/stepper/{llm-stepper.css → atl-stepper.css} +5 -5
  120. package/src/lib/stepper/{llm-stepper.d.ts → atl-stepper.d.ts} +9 -9
  121. package/src/lib/stepper/{llm-stepper.d.ts.map → atl-stepper.d.ts.map} +1 -1
  122. package/src/lib/stepper/{llm-stepper.js → atl-stepper.js} +11 -11
  123. package/src/lib/stepper/{llm-stepper.js.map → atl-stepper.js.map} +1 -1
  124. package/src/lib/table/{llm-table.css → atl-table.css} +30 -30
  125. package/src/lib/table/atl-table.d.ts +40 -0
  126. package/src/lib/table/{llm-table.d.ts.map → atl-table.d.ts.map} +1 -1
  127. package/src/lib/table/{llm-table.js → atl-table.js} +14 -14
  128. package/src/lib/table/{llm-table.js.map → atl-table.js.map} +1 -1
  129. package/src/lib/tabs/{llm-tabs.css → atl-tabs.css} +17 -17
  130. package/src/lib/tabs/{llm-tabs.d.ts → atl-tabs.d.ts} +12 -12
  131. package/src/lib/tabs/{llm-tabs.d.ts.map → atl-tabs.d.ts.map} +1 -1
  132. package/src/lib/tabs/{llm-tabs.js → atl-tabs.js} +11 -11
  133. package/src/lib/tabs/{llm-tabs.js.map → atl-tabs.js.map} +1 -1
  134. package/src/lib/textarea/{llm-textarea.css → atl-textarea.css} +15 -15
  135. package/src/lib/textarea/{llm-textarea.d.ts → atl-textarea.d.ts} +6 -6
  136. package/src/lib/textarea/{llm-textarea.d.ts.map → atl-textarea.d.ts.map} +1 -1
  137. package/src/lib/textarea/{llm-textarea.js → atl-textarea.js} +4 -4
  138. package/src/lib/textarea/{llm-textarea.js.map → atl-textarea.js.map} +1 -1
  139. package/src/lib/toast/{llm-toast.css → atl-toast.css} +16 -16
  140. package/src/lib/toast/atl-toast.d.ts +54 -0
  141. package/src/lib/toast/{llm-toast.d.ts.map → atl-toast.d.ts.map} +1 -1
  142. package/src/lib/toast/{llm-toast.js → atl-toast.js} +12 -12
  143. package/src/lib/toast/{llm-toast.js.map → atl-toast.js.map} +1 -1
  144. package/src/lib/toggle/{llm-toggle.css → atl-toggle.css} +16 -16
  145. package/src/lib/toggle/{llm-toggle.d.ts → atl-toggle.d.ts} +6 -6
  146. package/src/lib/toggle/{llm-toggle.d.ts.map → atl-toggle.d.ts.map} +1 -1
  147. package/src/lib/toggle/{llm-toggle.js → atl-toggle.js} +4 -4
  148. package/src/lib/toggle/{llm-toggle.js.map → atl-toggle.js.map} +1 -1
  149. package/src/lib/tooltip/{llm-tooltip.css → atl-tooltip.css} +12 -12
  150. package/src/lib/tooltip/atl-tooltip.d.ts +17 -0
  151. package/src/lib/tooltip/{llm-tooltip.d.ts.map → atl-tooltip.d.ts.map} +1 -1
  152. package/src/lib/tooltip/{llm-tooltip.js → atl-tooltip.js} +7 -7
  153. package/src/lib/tooltip/{llm-tooltip.js.map → atl-tooltip.js.map} +1 -1
  154. package/src/lib/badge/llm-badge.d.ts +0 -27
  155. package/src/lib/breadcrumbs/llm-breadcrumbs.d.ts +0 -38
  156. package/src/lib/card/llm-card.js +0 -30
  157. package/src/lib/icon/llm-icon.d.ts +0 -24
  158. package/src/lib/table/llm-table.d.ts +0 -40
  159. package/src/lib/toast/llm-toast.d.ts +0 -54
  160. package/src/lib/tooltip/llm-tooltip.d.ts +0 -17
@@ -1 +1 @@
1
- {"version":3,"file":"llm-chat.js","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/chat/llm-chat.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeEvent,\n HTMLAttributes,\n KeyboardEvent,\n MouseEvent,\n ReactNode,\n TextareaHTMLAttributes,\n createContext,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport type {\n LlmChatMessageRole,\n LlmChatStatus,\n LlmChatVariant,\n} from '../spec';\nimport './llm-chat.css';\n\ninterface ChatContextValue {\n headerId: string;\n status: LlmChatStatus;\n close: () => void;\n toggle: () => void;\n}\n\nconst ChatContext = createContext<ChatContextValue>({\n headerId: '',\n status: 'idle',\n close: () => undefined,\n toggle: () => undefined,\n});\n\n/**\n * Properties for the LlmChat component.\n */\nexport interface LlmChatProps {\n /** Layout variant. */\n variant?: LlmChatVariant;\n /** Connection / response status. */\n status?: LlmChatStatus;\n /** Whether the chat is open (drawer / popup variants). */\n open?: boolean;\n /** Callback when open state should change. */\n onOpenChange?: (open: boolean) => void;\n children?: ReactNode;\n}\n\n/**\n * AI assistant surface. Three layout variants share the same content slots:\n * `drawer` (slide-in panel), `popup` (floating bubble + window), `inline`\n * (embedded card). Compose with `LlmChatHeader`, `LlmChatMessages`,\n * `LlmChatMessage`, `LlmChatTyping`, `LlmChatSuggestion`, `LlmChatInput`.\n */\nexport function LlmChat({\n variant = 'drawer',\n status = 'idle',\n open = false,\n onOpenChange,\n children,\n}: LlmChatProps) {\n const dialogRef = useRef<HTMLDialogElement>(null);\n const headerId = useId();\n const triggerElRef = useRef<Element | null>(null);\n\n useEffect(() => {\n if (variant !== 'drawer') return;\n const dialog = dialogRef.current;\n if (!dialog) return;\n if (open) {\n triggerElRef.current = document.activeElement;\n if (!dialog.open) dialog.showModal();\n } else {\n if (dialog.open) dialog.close();\n (triggerElRef.current as HTMLElement | null)?.focus();\n triggerElRef.current = null;\n }\n }, [open, variant]);\n\n // Auto-focus the input on open for drawer / popup. Inline keeps user focus.\n const hostRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (!open) return;\n if (variant === 'inline') return;\n const host = hostRef.current;\n if (!host) return;\n requestAnimationFrame(() => {\n host.querySelector<HTMLTextAreaElement>('textarea')?.focus();\n });\n }, [open, variant]);\n\n useEffect(() => {\n if (variant !== 'drawer') return;\n const dialog = dialogRef.current;\n if (!dialog) return;\n const onClose = () => onOpenChange?.(false);\n const onCancel = (e: Event) => {\n e.preventDefault();\n onOpenChange?.(false);\n };\n dialog.addEventListener('close', onClose);\n dialog.addEventListener('cancel', onCancel);\n return () => {\n dialog.removeEventListener('close', onClose);\n dialog.removeEventListener('cancel', onCancel);\n };\n }, [onOpenChange, variant]);\n\n const handleBackdropClick = (e: MouseEvent<HTMLDialogElement>) => {\n if (e.target === dialogRef.current) onOpenChange?.(false);\n };\n\n const hostClass = [\n 'llm-chat',\n `variant-${variant}`,\n `status-${status}`,\n open && 'is-open',\n ]\n .filter(Boolean)\n .join(' ');\n\n const ctx: ChatContextValue = {\n headerId,\n status,\n close: () => onOpenChange?.(false),\n toggle: () => onOpenChange?.(!open),\n };\n\n return (\n <ChatContext.Provider value={ctx}>\n <div ref={hostRef} className={hostClass}>\n {variant === 'drawer' && (\n <dialog\n ref={dialogRef}\n aria-labelledby={headerId}\n aria-modal=\"true\"\n onClick={handleBackdropClick}\n >\n <div\n className=\"surface drawer-surface\"\n onClick={(e) => e.stopPropagation()}\n >\n {children}\n </div>\n </dialog>\n )}\n {variant === 'popup' && (\n <>\n {open && (\n <div\n className=\"surface popup-surface\"\n role=\"dialog\"\n aria-labelledby={headerId}\n >\n {children}\n </div>\n )}\n <button\n type=\"button\"\n className=\"fab-bubble\"\n aria-label={open ? 'Close AI assistant' : 'Open AI assistant'}\n aria-expanded={open}\n onClick={() => onOpenChange?.(!open)}\n >\n <span aria-hidden=\"true\">AI</span>\n </button>\n </>\n )}\n {variant === 'inline' && (\n <section\n className=\"surface inline-surface\"\n aria-labelledby={headerId}\n >\n {children}\n </section>\n )}\n </div>\n </ChatContext.Provider>\n );\n}\n\n/**\n * Header slot for `LlmChat`. Holds the title block; the close button\n * is rendered automatically (hidden on the inline variant via CSS).\n */\nexport function LlmChatHeader({\n children,\n className,\n ...rest\n}: HTMLAttributes<HTMLDivElement>) {\n const ctx = useContext(ChatContext);\n return (\n <div\n id={ctx.headerId}\n className={['llm-chat-header', className].filter(Boolean).join(' ')}\n {...rest}\n >\n <div className=\"title-block\">{children}</div>\n <button\n type=\"button\"\n className=\"close-btn\"\n aria-label=\"Close chat\"\n onClick={ctx.close}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n );\n}\n\n/**\n * Scrollable message list. Project `LlmChatMessage`, `LlmChatTyping`, or\n * `LlmChatSuggestion` children inside. Auto-scrolls to the bottom whenever\n * children are added or content changes — important for streaming responses\n * where new tokens are appended live.\n */\nexport function LlmChatMessages({\n children,\n className,\n ...rest\n}: HTMLAttributes<HTMLDivElement>) {\n const ref = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const stickToBottom = () => { el.scrollTop = el.scrollHeight; };\n stickToBottom();\n const observer = new MutationObserver(stickToBottom);\n observer.observe(el, { childList: true, subtree: true, characterData: true });\n return () => observer.disconnect();\n }, []);\n return (\n <div\n ref={ref}\n className={['llm-chat-messages', className].filter(Boolean).join(' ')}\n {...rest}\n >\n {children}\n </div>\n );\n}\n\n/**\n * A single chat message. Role drives bubble alignment and color.\n */\nexport interface LlmChatMessageProps extends HTMLAttributes<HTMLDivElement> {\n /** Sender of the message. */\n role?: LlmChatMessageRole;\n /** Marks the message as failed (red dashed border). */\n failed?: boolean;\n}\n\nexport function LlmChatMessage({\n role = 'assistant',\n failed = false,\n children,\n className,\n ...rest\n}: LlmChatMessageProps) {\n const classes = [\n 'llm-chat-message',\n `role-${role}`,\n failed && 'is-failed',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n return (\n <div role=\"listitem\" className={classes} {...rest}>\n {children}\n </div>\n );\n}\n\n/**\n * Typing indicator (three animated dots).\n *\n * Two display modes:\n * - **Standalone bubble** (default) — render at the end of the message\n * list to show \"the assistant is starting to respond\".\n * - **Inline cursor** (`inline`) — render as the LAST child INSIDE the\n * currently-streaming `LlmChatMessage` so the dots read as a typing\n * caret at the end of the partial text.\n */\nexport interface LlmChatTypingProps extends HTMLAttributes<HTMLDivElement> {\n /** When true, renders as an inline cursor without bubble chrome. */\n inline?: boolean;\n}\n\nexport function LlmChatTyping({\n inline = false,\n className,\n ...rest\n}: LlmChatTypingProps) {\n const classes = [\n 'llm-chat-typing',\n inline && 'is-inline',\n className,\n ].filter(Boolean).join(' ');\n return (\n <div role=\"status\" aria-live=\"polite\" className={classes} {...rest}>\n <span className=\"dot\" />\n <span className=\"dot\" />\n <span className=\"dot\" />\n <span className=\"sr-only\">Assistant is typing</span>\n </div>\n );\n}\n\n/**\n * Tappable suggestion chip used in the empty state to seed a conversation.\n */\nexport interface LlmChatSuggestionProps {\n /** Primary label of the suggestion. */\n label: string;\n /** Optional secondary hint text. */\n hint?: string;\n /** Fires the label string when activated. */\n onSelected?: (label: string) => void;\n className?: string;\n}\n\nexport function LlmChatSuggestion({\n label,\n hint,\n onSelected,\n className,\n}: LlmChatSuggestionProps) {\n return (\n <div\n className={['llm-chat-suggestion', className].filter(Boolean).join(' ')}\n >\n <button\n type=\"button\"\n className=\"chip\"\n onClick={() => onSelected?.(label)}\n >\n <span className=\"chip-label\">{label}</span>\n {hint && <span className=\"chip-hint\">{hint}</span>}\n </button>\n </div>\n );\n}\n\n/**\n * Composable input footer for `LlmChat`. Wraps a textarea and emits\n * `onSend` (or `onStop` when the chat status is `'streaming'`).\n *\n * The action button automatically switches between primary \"Send\" and\n * danger \"Stop\" based on the parent chat's status.\n */\nexport interface LlmChatInputProps\n extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'onChange'> {\n value?: string;\n onValueChange?: (value: string) => void;\n onSend?: (text: string) => void;\n onStop?: () => void;\n /** Accessible label for the input field. */\n ariaLabel?: string;\n}\n\nexport function LlmChatInput({\n value,\n onValueChange,\n onSend,\n onStop,\n placeholder,\n ariaLabel = 'Message your AI assistant',\n ...rest\n}: LlmChatInputProps) {\n const ctx = useContext(ChatContext);\n const isStreaming = ctx.status === 'streaming';\n const [internal, setInternal] = useState('');\n const isControlled = value !== undefined;\n const current = isControlled ? value : internal;\n\n const setCurrent = (next: string) => {\n if (!isControlled) setInternal(next);\n onValueChange?.(next);\n };\n\n const effectivePlaceholder =\n placeholder ??\n (isStreaming\n ? 'Waiting for response…'\n : ctx.status === 'error'\n ? 'Try again…'\n : 'Message your AI assistant…');\n\n const emitSend = () => {\n const text = current.trim();\n if (!text || isStreaming) return;\n onSend?.(text);\n setCurrent('');\n };\n\n const handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n setCurrent(e.target.value);\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n emitSend();\n }\n };\n\n return (\n <div className=\"llm-chat-input\">\n <textarea\n className=\"field\"\n rows={1}\n value={current}\n placeholder={effectivePlaceholder}\n disabled={isStreaming}\n aria-label={ariaLabel}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n {...rest}\n />\n {isStreaming ? (\n <button\n type=\"button\"\n className=\"action-btn variant-danger size-md\"\n onClick={onStop}\n >\n Stop\n </button>\n ) : (\n <button\n type=\"button\"\n className=\"action-btn variant-primary size-md\"\n disabled={!current.trim()}\n onClick={emitSend}\n >\n Send\n </button>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"atl-chat.js","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/chat/atl-chat.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeEvent,\n HTMLAttributes,\n KeyboardEvent,\n MouseEvent,\n ReactNode,\n TextareaHTMLAttributes,\n createContext,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport type {\n AtlChatMessageRole,\n AtlChatStatus,\n AtlChatVariant,\n} from '../spec';\nimport './atl-chat.css';\n\ninterface ChatContextValue {\n headerId: string;\n status: AtlChatStatus;\n close: () => void;\n toggle: () => void;\n}\n\nconst ChatContext = createContext<ChatContextValue>({\n headerId: '',\n status: 'idle',\n close: () => undefined,\n toggle: () => undefined,\n});\n\n/**\n * Properties for the AtlChat component.\n */\nexport interface AtlChatProps {\n /** Layout variant. */\n variant?: AtlChatVariant;\n /** Connection / response status. */\n status?: AtlChatStatus;\n /** Whether the chat is open (drawer / popup variants). */\n open?: boolean;\n /** Callback when open state should change. */\n onOpenChange?: (open: boolean) => void;\n children?: ReactNode;\n}\n\n/**\n * AI assistant surface. Three layout variants share the same content slots:\n * `drawer` (slide-in panel), `popup` (floating bubble + window), `inline`\n * (embedded card). Compose with `AtlChatHeader`, `AtlChatMessages`,\n * `AtlChatMessage`, `AtlChatTyping`, `AtlChatSuggestion`, `AtlChatInput`.\n */\nexport function AtlChat({\n variant = 'drawer',\n status = 'idle',\n open = false,\n onOpenChange,\n children,\n}: AtlChatProps) {\n const dialogRef = useRef<HTMLDialogElement>(null);\n const headerId = useId();\n const triggerElRef = useRef<Element | null>(null);\n\n useEffect(() => {\n if (variant !== 'drawer') return;\n const dialog = dialogRef.current;\n if (!dialog) return;\n if (open) {\n triggerElRef.current = document.activeElement;\n if (!dialog.open) dialog.showModal();\n } else {\n if (dialog.open) dialog.close();\n (triggerElRef.current as HTMLElement | null)?.focus();\n triggerElRef.current = null;\n }\n }, [open, variant]);\n\n // Auto-focus the input on open for drawer / popup. Inline keeps user focus.\n const hostRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (!open) return;\n if (variant === 'inline') return;\n const host = hostRef.current;\n if (!host) return;\n requestAnimationFrame(() => {\n host.querySelector<HTMLTextAreaElement>('textarea')?.focus();\n });\n }, [open, variant]);\n\n useEffect(() => {\n if (variant !== 'drawer') return;\n const dialog = dialogRef.current;\n if (!dialog) return;\n const onClose = () => onOpenChange?.(false);\n const onCancel = (e: Event) => {\n e.preventDefault();\n onOpenChange?.(false);\n };\n dialog.addEventListener('close', onClose);\n dialog.addEventListener('cancel', onCancel);\n return () => {\n dialog.removeEventListener('close', onClose);\n dialog.removeEventListener('cancel', onCancel);\n };\n }, [onOpenChange, variant]);\n\n const handleBackdropClick = (e: MouseEvent<HTMLDialogElement>) => {\n if (e.target === dialogRef.current) onOpenChange?.(false);\n };\n\n const hostClass = [\n 'atl-chat',\n `variant-${variant}`,\n `status-${status}`,\n open && 'is-open',\n ]\n .filter(Boolean)\n .join(' ');\n\n const ctx: ChatContextValue = {\n headerId,\n status,\n close: () => onOpenChange?.(false),\n toggle: () => onOpenChange?.(!open),\n };\n\n return (\n <ChatContext.Provider value={ctx}>\n <div ref={hostRef} className={hostClass}>\n {variant === 'drawer' && (\n <dialog\n ref={dialogRef}\n aria-labelledby={headerId}\n aria-modal=\"true\"\n onClick={handleBackdropClick}\n >\n <div\n className=\"surface drawer-surface\"\n onClick={(e) => e.stopPropagation()}\n >\n {children}\n </div>\n </dialog>\n )}\n {variant === 'popup' && (\n <>\n {open && (\n <div\n className=\"surface popup-surface\"\n role=\"dialog\"\n aria-labelledby={headerId}\n >\n {children}\n </div>\n )}\n <button\n type=\"button\"\n className=\"fab-bubble\"\n aria-label={open ? 'Close AI assistant' : 'Open AI assistant'}\n aria-expanded={open}\n onClick={() => onOpenChange?.(!open)}\n >\n <span aria-hidden=\"true\">AI</span>\n </button>\n </>\n )}\n {variant === 'inline' && (\n <section\n className=\"surface inline-surface\"\n aria-labelledby={headerId}\n >\n {children}\n </section>\n )}\n </div>\n </ChatContext.Provider>\n );\n}\n\n/**\n * Header slot for `AtlChat`. Holds the title block; the close button\n * is rendered automatically (hidden on the inline variant via CSS).\n */\nexport function AtlChatHeader({\n children,\n className,\n ...rest\n}: HTMLAttributes<HTMLDivElement>) {\n const ctx = useContext(ChatContext);\n return (\n <div\n id={ctx.headerId}\n className={['atl-chat-header', className].filter(Boolean).join(' ')}\n {...rest}\n >\n <div className=\"title-block\">{children}</div>\n <button\n type=\"button\"\n className=\"close-btn\"\n aria-label=\"Close chat\"\n onClick={ctx.close}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n );\n}\n\n/**\n * Scrollable message list. Project `AtlChatMessage`, `AtlChatTyping`, or\n * `AtlChatSuggestion` children inside. Auto-scrolls to the bottom whenever\n * children are added or content changes — important for streaming responses\n * where new tokens are appended live.\n */\nexport function AtlChatMessages({\n children,\n className,\n ...rest\n}: HTMLAttributes<HTMLDivElement>) {\n const ref = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const stickToBottom = () => { el.scrollTop = el.scrollHeight; };\n stickToBottom();\n const observer = new MutationObserver(stickToBottom);\n observer.observe(el, { childList: true, subtree: true, characterData: true });\n return () => observer.disconnect();\n }, []);\n return (\n <div\n ref={ref}\n className={['atl-chat-messages', className].filter(Boolean).join(' ')}\n {...rest}\n >\n {children}\n </div>\n );\n}\n\n/**\n * A single chat message. Role drives bubble alignment and color.\n */\nexport interface AtlChatMessageProps extends HTMLAttributes<HTMLDivElement> {\n /** Sender of the message. */\n role?: AtlChatMessageRole;\n /** Marks the message as failed (red dashed border). */\n failed?: boolean;\n}\n\nexport function AtlChatMessage({\n role = 'assistant',\n failed = false,\n children,\n className,\n ...rest\n}: AtlChatMessageProps) {\n const classes = [\n 'atl-chat-message',\n `role-${role}`,\n failed && 'is-failed',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n return (\n <div role=\"listitem\" className={classes} {...rest}>\n {children}\n </div>\n );\n}\n\n/**\n * Typing indicator (three animated dots).\n *\n * Two display modes:\n * - **Standalone bubble** (default) — render at the end of the message\n * list to show \"the assistant is starting to respond\".\n * - **Inline cursor** (`inline`) — render as the LAST child INSIDE the\n * currently-streaming `AtlChatMessage` so the dots read as a typing\n * caret at the end of the partial text.\n */\nexport interface AtlChatTypingProps extends HTMLAttributes<HTMLDivElement> {\n /** When true, renders as an inline cursor without bubble chrome. */\n inline?: boolean;\n}\n\nexport function AtlChatTyping({\n inline = false,\n className,\n ...rest\n}: AtlChatTypingProps) {\n const classes = [\n 'atl-chat-typing',\n inline && 'is-inline',\n className,\n ].filter(Boolean).join(' ');\n return (\n <div role=\"status\" aria-live=\"polite\" className={classes} {...rest}>\n <span className=\"dot\" />\n <span className=\"dot\" />\n <span className=\"dot\" />\n <span className=\"sr-only\">Assistant is typing</span>\n </div>\n );\n}\n\n/**\n * Tappable suggestion chip used in the empty state to seed a conversation.\n */\nexport interface AtlChatSuggestionProps {\n /** Primary label of the suggestion. */\n label: string;\n /** Optional secondary hint text. */\n hint?: string;\n /** Fires the label string when activated. */\n onSelected?: (label: string) => void;\n className?: string;\n}\n\nexport function AtlChatSuggestion({\n label,\n hint,\n onSelected,\n className,\n}: AtlChatSuggestionProps) {\n return (\n <div\n className={['atl-chat-suggestion', className].filter(Boolean).join(' ')}\n >\n <button\n type=\"button\"\n className=\"chip\"\n onClick={() => onSelected?.(label)}\n >\n <span className=\"chip-label\">{label}</span>\n {hint && <span className=\"chip-hint\">{hint}</span>}\n </button>\n </div>\n );\n}\n\n/**\n * Composable input footer for `AtlChat`. Wraps a textarea and emits\n * `onSend` (or `onStop` when the chat status is `'streaming'`).\n *\n * The action button automatically switches between primary \"Send\" and\n * danger \"Stop\" based on the parent chat's status.\n */\nexport interface AtlChatInputProps\n extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'onChange'> {\n value?: string;\n onValueChange?: (value: string) => void;\n onSend?: (text: string) => void;\n onStop?: () => void;\n /** Accessible label for the input field. */\n ariaLabel?: string;\n}\n\nexport function AtlChatInput({\n value,\n onValueChange,\n onSend,\n onStop,\n placeholder,\n ariaLabel = 'Message your AI assistant',\n ...rest\n}: AtlChatInputProps) {\n const ctx = useContext(ChatContext);\n const isStreaming = ctx.status === 'streaming';\n const [internal, setInternal] = useState('');\n const isControlled = value !== undefined;\n const current = isControlled ? value : internal;\n\n const setCurrent = (next: string) => {\n if (!isControlled) setInternal(next);\n onValueChange?.(next);\n };\n\n const effectivePlaceholder =\n placeholder ??\n (isStreaming\n ? 'Waiting for response…'\n : ctx.status === 'error'\n ? 'Try again…'\n : 'Message your AI assistant…');\n\n const emitSend = () => {\n const text = current.trim();\n if (!text || isStreaming) return;\n onSend?.(text);\n setCurrent('');\n };\n\n const handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n setCurrent(e.target.value);\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n emitSend();\n }\n };\n\n return (\n <div className=\"atl-chat-input\">\n <textarea\n className=\"field\"\n rows={1}\n value={current}\n placeholder={effectivePlaceholder}\n disabled={isStreaming}\n aria-label={ariaLabel}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n {...rest}\n />\n {isStreaming ? (\n <button\n type=\"button\"\n className=\"action-btn variant-danger size-md\"\n onClick={onStop}\n >\n Stop\n </button>\n ) : (\n <button\n type=\"button\"\n className=\"action-btn variant-primary size-md\"\n disabled={!current.trim()}\n onClick={emitSend}\n >\n Send\n </button>\n )}\n </div>\n );\n}\n"]}
@@ -1,10 +1,10 @@
1
- .llm-checkbox {
1
+ .atl-checkbox {
2
2
  display: block;
3
3
  font-family: var(--ui-font-family);
4
4
  font-size: var(--ui-font-size-md);
5
5
  }
6
6
 
7
- .llm-checkbox label {
7
+ .atl-checkbox label {
8
8
  display: inline-flex;
9
9
  align-items: center;
10
10
  gap: var(--ui-spacing-3);
@@ -15,7 +15,7 @@
15
15
  min-height: 1.5rem;
16
16
  }
17
17
 
18
- .llm-checkbox input[type='checkbox'] {
18
+ .atl-checkbox input[type='checkbox'] {
19
19
  appearance: none;
20
20
  -webkit-appearance: none;
21
21
  flex-shrink: 0;
@@ -32,23 +32,23 @@
32
32
  outline: none;
33
33
  }
34
34
 
35
- .llm-checkbox input[type='checkbox']:hover:not(:disabled) {
35
+ .atl-checkbox input[type='checkbox']:hover:not(:disabled) {
36
36
  border-color: var(--ui-color-primary);
37
37
  background-color: var(--ui-color-primary-light);
38
38
  }
39
39
 
40
- .llm-checkbox input[type='checkbox']:focus-visible {
40
+ .atl-checkbox input[type='checkbox']:focus-visible {
41
41
  box-shadow: var(--ui-focus-ring);
42
42
  border-color: var(--ui-color-primary);
43
43
  }
44
44
 
45
45
  /* Checked state */
46
- .llm-checkbox input[type='checkbox']:checked {
46
+ .atl-checkbox input[type='checkbox']:checked {
47
47
  background-color: var(--ui-color-primary);
48
48
  border-color: var(--ui-color-primary);
49
49
  }
50
50
 
51
- .llm-checkbox input[type='checkbox']:checked::after {
51
+ .atl-checkbox input[type='checkbox']:checked::after {
52
52
  content: '';
53
53
  position: absolute;
54
54
  inset: 0;
@@ -59,16 +59,16 @@
59
59
  border-top: none;
60
60
  border-left: none;
61
61
  transform: rotate(45deg) translate(-1px, -1px);
62
- animation: llm-check-pop var(--ui-duration-normal) var(--ui-ease-spring);
62
+ animation: atl-check-pop var(--ui-duration-normal) var(--ui-ease-spring);
63
63
  }
64
64
 
65
65
  /* Indeterminate state */
66
- .llm-checkbox input[type='checkbox']:indeterminate {
66
+ .atl-checkbox input[type='checkbox']:indeterminate {
67
67
  background-color: var(--ui-color-primary);
68
68
  border-color: var(--ui-color-primary);
69
69
  }
70
70
 
71
- .llm-checkbox input[type='checkbox']:indeterminate::after {
71
+ .atl-checkbox input[type='checkbox']:indeterminate::after {
72
72
  content: '';
73
73
  position: absolute;
74
74
  inset: 0;
@@ -76,39 +76,39 @@
76
76
  width: 0.5rem;
77
77
  height: 2px;
78
78
  background-color: var(--ui-color-text-on-primary);
79
- animation: llm-check-pop var(--ui-duration-normal) var(--ui-ease-spring);
79
+ animation: atl-check-pop var(--ui-duration-normal) var(--ui-ease-spring);
80
80
  }
81
81
 
82
82
  /* Invalid state */
83
- .llm-checkbox.is-invalid input[type='checkbox'] {
83
+ .atl-checkbox.is-invalid input[type='checkbox'] {
84
84
  border-color: var(--ui-color-input-border-invalid);
85
85
  }
86
86
 
87
- .llm-checkbox.is-invalid input[type='checkbox']:focus-visible {
87
+ .atl-checkbox.is-invalid input[type='checkbox']:focus-visible {
88
88
  border-color: var(--ui-color-input-border-invalid);
89
89
  box-shadow: 0 0 0 2px var(--ui-color-surface), 0 0 0 4px var(--ui-color-danger);
90
90
  }
91
91
 
92
92
  /* Disabled state */
93
- .llm-checkbox.is-disabled {
93
+ .atl-checkbox.is-disabled {
94
94
  opacity: var(--ui-opacity-disabled);
95
95
  cursor: not-allowed;
96
96
  }
97
97
 
98
- .llm-checkbox.is-disabled label {
98
+ .atl-checkbox.is-disabled label {
99
99
  cursor: not-allowed;
100
100
  }
101
101
 
102
- .llm-checkbox.is-disabled input[type='checkbox'] {
102
+ .atl-checkbox.is-disabled input[type='checkbox'] {
103
103
  cursor: not-allowed;
104
104
  }
105
105
 
106
106
  /* Error messages */
107
- .llm-checkbox .errors {
107
+ .atl-checkbox .errors {
108
108
  margin-top: var(--ui-spacing-2);
109
109
  }
110
110
 
111
- .llm-checkbox .error-message {
111
+ .atl-checkbox .error-message {
112
112
  margin: 0;
113
113
  font-size: var(--ui-font-size-sm);
114
114
  color: var(--ui-color-error-text);
@@ -116,7 +116,7 @@
116
116
  }
117
117
 
118
118
  /* Animation */
119
- @keyframes llm-check-pop {
119
+ @keyframes atl-check-pop {
120
120
  0% { transform: rotate(45deg) translate(-1px, -1px) scale(0); }
121
121
  60% { transform: rotate(45deg) translate(-1px, -1px) scale(1.15); }
122
122
  100% { transform: rotate(45deg) translate(-1px, -1px) scale(1); }
@@ -1,10 +1,10 @@
1
1
  import { InputHTMLAttributes, ReactNode } from 'react';
2
- import type { LlmCheckboxSpec } from '../spec';
3
- import './llm-checkbox.css';
2
+ import type { AtlCheckboxSpec } from '../spec';
3
+ import './atl-checkbox.css';
4
4
  /**
5
- * Properties for the LlmCheckbox component.
5
+ * Properties for the AtlCheckbox component.
6
6
  */
7
- export interface LlmCheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'checked' | 'onChange' | 'readOnly' | 'value'>, LlmCheckboxSpec {
7
+ export interface AtlCheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'checked' | 'onChange' | 'readOnly' | 'value'>, AtlCheckboxSpec {
8
8
  /**
9
9
  * Whether the checkbox is checked.
10
10
  */
@@ -37,5 +37,5 @@ export interface LlmCheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElem
37
37
  /**
38
38
  * A checkbox component for selecting one or more options.
39
39
  */
40
- export declare function LlmCheckbox({ checked, onCheckedChange, indeterminate, invalid, errors, disabled, readOnly: reactReadOnly, readonly: specReadOnly, required, children, className, id, name, ...rest }: LlmCheckboxProps): import("react").JSX.Element;
41
- //# sourceMappingURL=llm-checkbox.d.ts.map
40
+ export declare function AtlCheckbox({ checked, onCheckedChange, indeterminate, invalid, errors, disabled, readOnly: reactReadOnly, readonly: specReadOnly, required, children, className, id, name, ...rest }: AtlCheckboxProps): import("react").JSX.Element;
41
+ //# sourceMappingURL=atl-checkbox.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"llm-checkbox.d.ts","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/checkbox/llm-checkbox.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAA4B,MAAM,OAAO,CAAC;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,oBAAoB,CAAC;AAE5B;;GAEG;AACH,MAAM,WAAW,gBACf,SAAQ,IAAI,CACR,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CACvD,EACD,eAAe;IACjB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAe,EACf,eAAe,EACf,aAAqB,EACrB,OAAe,EACf,MAAW,EACX,QAAgB,EAChB,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,YAAY,EACtB,QAAgB,EAChB,QAAQ,EACR,SAAS,EACT,EAAE,EACF,IAAI,EACJ,GAAG,IAAI,EACR,EAAE,gBAAgB,+BAsDlB"}
1
+ {"version":3,"file":"atl-checkbox.d.ts","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/checkbox/atl-checkbox.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAA4B,MAAM,OAAO,CAAC;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,oBAAoB,CAAC;AAE5B;;GAEG;AACH,MAAM,WAAW,gBACf,SAAQ,IAAI,CACR,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CACvD,EACD,eAAe;IACjB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAe,EACf,eAAe,EACf,aAAqB,EACrB,OAAe,EACf,MAAW,EACX,QAAgB,EAChB,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,YAAY,EACtB,QAAgB,EAChB,QAAQ,EACR,SAAS,EACT,EAAE,EACF,IAAI,EACJ,GAAG,IAAI,EACR,EAAE,gBAAgB,+BAsDlB"}
@@ -1,17 +1,17 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useRef, useEffect, useId } from 'react';
3
- import './llm-checkbox.css';
3
+ import './atl-checkbox.css';
4
4
  /**
5
5
  * A checkbox component for selecting one or more options.
6
6
  */
7
- export function LlmCheckbox({ checked = false, onCheckedChange, indeterminate = false, invalid = false, errors = [], disabled = false, readOnly: reactReadOnly, readonly: specReadOnly, required = false, children, className, id, name, ...rest }) {
7
+ export function AtlCheckbox({ checked = false, onCheckedChange, indeterminate = false, invalid = false, errors = [], disabled = false, readOnly: reactReadOnly, readonly: specReadOnly, required = false, children, className, id, name, ...rest }) {
8
8
  const readOnly = reactReadOnly ?? specReadOnly ?? false;
9
9
  const inputRef = useRef(null);
10
10
  const generatedId = useId();
11
11
  const inputId = id || `checkbox-${generatedId}`;
12
12
  const errorId = `${inputId}-errors`;
13
13
  const classes = [
14
- 'llm-checkbox',
14
+ 'atl-checkbox',
15
15
  checked && 'is-checked',
16
16
  invalid && 'is-invalid',
17
17
  disabled && 'is-disabled',
@@ -26,4 +26,4 @@ export function LlmCheckbox({ checked = false, onCheckedChange, indeterminate =
26
26
  }, [indeterminate]);
27
27
  return (_jsxs("div", { className: classes, children: [_jsxs("label", { htmlFor: inputId, children: [_jsx("input", { ref: inputRef, type: "checkbox", id: inputId, checked: checked, onChange: (e) => onCheckedChange?.(e.target.checked), disabled: disabled, readOnly: readOnly, required: required, "aria-invalid": invalid || undefined, "aria-required": required || undefined, "aria-describedby": errors.length > 0 ? errorId : undefined, name: name, ...rest }), children] }), errors.length > 0 && (_jsx("div", { className: "errors", id: errorId, "aria-live": "polite", children: errors.map((err, i) => (_jsx("p", { className: "error-message", children: err }, i))) }))] }));
28
28
  }
29
- //# sourceMappingURL=llm-checkbox.js.map
29
+ //# sourceMappingURL=atl-checkbox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"llm-checkbox.js","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/checkbox/llm-checkbox.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAEjF,OAAO,oBAAoB,CAAC;AAyC5B;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,OAAO,GAAG,KAAK,EACf,eAAe,EACf,aAAa,GAAG,KAAK,EACrB,OAAO,GAAG,KAAK,EACf,MAAM,GAAG,EAAE,EACX,QAAQ,GAAG,KAAK,EAChB,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,YAAY,EACtB,QAAQ,GAAG,KAAK,EAChB,QAAQ,EACR,SAAS,EACT,EAAE,EACF,IAAI,EACJ,GAAG,IAAI,EACU;IACjB,MAAM,QAAQ,GAAG,aAAa,IAAI,YAAY,IAAI,KAAK,CAAC;IACxD,MAAM,QAAQ,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,EAAE,IAAI,YAAY,WAAW,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,GAAG,OAAO,SAAS,CAAC;IAEpC,MAAM,OAAO,GAAG;QACd,cAAc;QACd,OAAO,IAAI,YAAY;QACvB,OAAO,IAAI,YAAY;QACvB,QAAQ,IAAI,aAAa;QACzB,SAAS;KACV;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,QAAQ,CAAC,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;QACjD,CAAC;IACH,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,OAAO,CACL,eAAK,SAAS,EAAE,OAAO,aACrB,iBAAO,OAAO,EAAE,OAAO,aACrB,gBACE,GAAG,EAAE,QAAQ,EACb,IAAI,EAAC,UAAU,EACf,EAAE,EAAE,OAAO,EACX,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EACpD,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,kBACJ,OAAO,IAAI,SAAS,mBACnB,QAAQ,IAAI,SAAS,sBAClB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EACzD,IAAI,EAAE,IAAI,KACN,IAAI,GACR,EACD,QAAQ,IACH,EACP,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CACpB,cAAK,SAAS,EAAC,QAAQ,EAAC,EAAE,EAAE,OAAO,eAAY,QAAQ,YACpD,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,YAAW,SAAS,EAAC,eAAe,YACjC,GAAG,IADE,CAAC,CAEL,CACL,CAAC,GACE,CACP,IACG,CACP,CAAC;AACJ,CAAC","sourcesContent":["import { InputHTMLAttributes, ReactNode, useRef, useEffect, useId } from 'react';\nimport type { LlmCheckboxSpec } from '../spec';\nimport './llm-checkbox.css';\n\n/**\n * Properties for the LlmCheckbox component.\n */\nexport interface LlmCheckboxProps\n extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'checked' | 'onChange' | 'readOnly' | 'value'\n >,\n LlmCheckboxSpec {\n /**\n * Whether the checkbox is checked.\n */\n checked?: boolean;\n /**\n * Callback triggered when the checked state changes.\n */\n onCheckedChange?: (checked: boolean) => void;\n /**\n * Whether the checkbox is in an indeterminate state.\n */\n indeterminate?: boolean;\n /**\n * Whether the checkbox is in an invalid state.\n */\n invalid?: boolean;\n /**\n * Array of error messages to display.\n */\n errors?: string[];\n /**\n * Whether the checkbox is read-only.\n */\n readOnly?: boolean;\n /**\n * The content to be rendered as the label for the checkbox.\n */\n children?: ReactNode;\n}\n\n/**\n * A checkbox component for selecting one or more options.\n */\nexport function LlmCheckbox({\n checked = false,\n onCheckedChange,\n indeterminate = false,\n invalid = false,\n errors = [],\n disabled = false,\n readOnly: reactReadOnly,\n readonly: specReadOnly,\n required = false,\n children,\n className,\n id,\n name,\n ...rest\n}: LlmCheckboxProps) {\n const readOnly = reactReadOnly ?? specReadOnly ?? false;\n const inputRef = useRef<HTMLInputElement>(null);\n const generatedId = useId();\n const inputId = id || `checkbox-${generatedId}`;\n const errorId = `${inputId}-errors`;\n\n const classes = [\n 'llm-checkbox',\n checked && 'is-checked',\n invalid && 'is-invalid',\n disabled && 'is-disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate]);\n\n return (\n <div className={classes}>\n <label htmlFor={inputId}>\n <input\n ref={inputRef}\n type=\"checkbox\"\n id={inputId}\n checked={checked}\n onChange={(e) => onCheckedChange?.(e.target.checked)}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n aria-invalid={invalid || undefined}\n aria-required={required || undefined}\n aria-describedby={errors.length > 0 ? errorId : undefined}\n name={name}\n {...rest}\n />\n {children}\n </label>\n {errors.length > 0 && (\n <div className=\"errors\" id={errorId} aria-live=\"polite\">\n {errors.map((err, i) => (\n <p key={i} className=\"error-message\">\n {err}\n </p>\n ))}\n </div>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"atl-checkbox.js","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/checkbox/atl-checkbox.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAEjF,OAAO,oBAAoB,CAAC;AAyC5B;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,OAAO,GAAG,KAAK,EACf,eAAe,EACf,aAAa,GAAG,KAAK,EACrB,OAAO,GAAG,KAAK,EACf,MAAM,GAAG,EAAE,EACX,QAAQ,GAAG,KAAK,EAChB,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,YAAY,EACtB,QAAQ,GAAG,KAAK,EAChB,QAAQ,EACR,SAAS,EACT,EAAE,EACF,IAAI,EACJ,GAAG,IAAI,EACU;IACjB,MAAM,QAAQ,GAAG,aAAa,IAAI,YAAY,IAAI,KAAK,CAAC;IACxD,MAAM,QAAQ,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,EAAE,IAAI,YAAY,WAAW,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,GAAG,OAAO,SAAS,CAAC;IAEpC,MAAM,OAAO,GAAG;QACd,cAAc;QACd,OAAO,IAAI,YAAY;QACvB,OAAO,IAAI,YAAY;QACvB,QAAQ,IAAI,aAAa;QACzB,SAAS;KACV;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,QAAQ,CAAC,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;QACjD,CAAC;IACH,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,OAAO,CACL,eAAK,SAAS,EAAE,OAAO,aACrB,iBAAO,OAAO,EAAE,OAAO,aACrB,gBACE,GAAG,EAAE,QAAQ,EACb,IAAI,EAAC,UAAU,EACf,EAAE,EAAE,OAAO,EACX,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EACpD,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,kBACJ,OAAO,IAAI,SAAS,mBACnB,QAAQ,IAAI,SAAS,sBAClB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EACzD,IAAI,EAAE,IAAI,KACN,IAAI,GACR,EACD,QAAQ,IACH,EACP,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CACpB,cAAK,SAAS,EAAC,QAAQ,EAAC,EAAE,EAAE,OAAO,eAAY,QAAQ,YACpD,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,YAAW,SAAS,EAAC,eAAe,YACjC,GAAG,IADE,CAAC,CAEL,CACL,CAAC,GACE,CACP,IACG,CACP,CAAC;AACJ,CAAC","sourcesContent":["import { InputHTMLAttributes, ReactNode, useRef, useEffect, useId } from 'react';\nimport type { AtlCheckboxSpec } from '../spec';\nimport './atl-checkbox.css';\n\n/**\n * Properties for the AtlCheckbox component.\n */\nexport interface AtlCheckboxProps\n extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'checked' | 'onChange' | 'readOnly' | 'value'\n >,\n AtlCheckboxSpec {\n /**\n * Whether the checkbox is checked.\n */\n checked?: boolean;\n /**\n * Callback triggered when the checked state changes.\n */\n onCheckedChange?: (checked: boolean) => void;\n /**\n * Whether the checkbox is in an indeterminate state.\n */\n indeterminate?: boolean;\n /**\n * Whether the checkbox is in an invalid state.\n */\n invalid?: boolean;\n /**\n * Array of error messages to display.\n */\n errors?: string[];\n /**\n * Whether the checkbox is read-only.\n */\n readOnly?: boolean;\n /**\n * The content to be rendered as the label for the checkbox.\n */\n children?: ReactNode;\n}\n\n/**\n * A checkbox component for selecting one or more options.\n */\nexport function AtlCheckbox({\n checked = false,\n onCheckedChange,\n indeterminate = false,\n invalid = false,\n errors = [],\n disabled = false,\n readOnly: reactReadOnly,\n readonly: specReadOnly,\n required = false,\n children,\n className,\n id,\n name,\n ...rest\n}: AtlCheckboxProps) {\n const readOnly = reactReadOnly ?? specReadOnly ?? false;\n const inputRef = useRef<HTMLInputElement>(null);\n const generatedId = useId();\n const inputId = id || `checkbox-${generatedId}`;\n const errorId = `${inputId}-errors`;\n\n const classes = [\n 'atl-checkbox',\n checked && 'is-checked',\n invalid && 'is-invalid',\n disabled && 'is-disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate]);\n\n return (\n <div className={classes}>\n <label htmlFor={inputId}>\n <input\n ref={inputRef}\n type=\"checkbox\"\n id={inputId}\n checked={checked}\n onChange={(e) => onCheckedChange?.(e.target.checked)}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n aria-invalid={invalid || undefined}\n aria-required={required || undefined}\n aria-describedby={errors.length > 0 ? errorId : undefined}\n name={name}\n {...rest}\n />\n {children}\n </label>\n {errors.length > 0 && (\n <div className=\"errors\" id={errorId} aria-live=\"polite\">\n {errors.map((err, i) => (\n <p key={i} className=\"error-message\">\n {err}\n </p>\n ))}\n </div>\n )}\n </div>\n );\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  /* ============================================================
2
- llm-code-block.css
2
+ atl-code-block.css
3
3
  ============================================================ */
4
4
 
5
- .llm-code-block {
5
+ .atl-code-block {
6
6
  display: block;
7
7
  border: 1px solid var(--ui-color-border);
8
8
  border-radius: var(--ui-radius-lg);
@@ -1,5 +1,5 @@
1
- import './llm-code-block.css';
2
- export interface LlmCodeBlockProps {
1
+ import './atl-code-block.css';
2
+ export interface AtlCodeBlockProps {
3
3
  /** The code string to display. */
4
4
  code: string;
5
5
  /** Language label shown in the header. Ignored if filename is set. */
@@ -11,5 +11,5 @@ export interface LlmCodeBlockProps {
11
11
  /** Whether to display line numbers alongside the code. */
12
12
  showLineNumbers?: boolean;
13
13
  }
14
- export declare function LlmCodeBlock({ code, language, filename, copyable, showLineNumbers, }: LlmCodeBlockProps): import("react").JSX.Element;
15
- //# sourceMappingURL=llm-code-block.d.ts.map
14
+ export declare function AtlCodeBlock({ code, language, filename, copyable, showLineNumbers, }: AtlCodeBlockProps): import("react").JSX.Element;
15
+ //# sourceMappingURL=atl-code-block.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"llm-code-block.d.ts","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/code-block/llm-code-block.tsx"],"names":[],"mappings":"AACA,OAAO,sBAAsB,CAAC;AAE9B,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0DAA0D;IAC1D,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,QAAiB,EACjB,QAAQ,EACR,QAAe,EACf,eAAuB,GACxB,EAAE,iBAAiB,+BA2DnB"}
1
+ {"version":3,"file":"atl-code-block.d.ts","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/code-block/atl-code-block.tsx"],"names":[],"mappings":"AACA,OAAO,sBAAsB,CAAC;AAE9B,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0DAA0D;IAC1D,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,QAAiB,EACjB,QAAQ,EACR,QAAe,EACf,eAAuB,GACxB,EAAE,iBAAiB,+BA2DnB"}
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState } from 'react';
3
- import './llm-code-block.css';
4
- export function LlmCodeBlock({ code, language = 'text', filename, copyable = true, showLineNumbers = false, }) {
3
+ import './atl-code-block.css';
4
+ export function AtlCodeBlock({ code, language = 'text', filename, copyable = true, showLineNumbers = false, }) {
5
5
  const [copied, setCopied] = useState(false);
6
6
  const displayLabel = filename || language;
7
7
  const lines = code.split('\n');
@@ -11,8 +11,8 @@ export function LlmCodeBlock({ code, language = 'text', filename, copyable = tru
11
11
  setTimeout(() => setCopied(false), 1800);
12
12
  });
13
13
  }
14
- return (_jsxs("div", { className: "llm-code-block", children: [_jsxs("div", { className: "code-block-header", children: [_jsx("span", { className: "code-block-label", children: displayLabel }), copyable && (_jsx("button", { className: "code-block-copy", type: "button", "aria-label": copied ? 'Copied' : 'Copy code', onClick: handleCopy, children: copied ? (_jsxs(_Fragment, { children: [_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("polyline", { points: "20 6 9 17 4 12" }) }), "Copied"] })) : (_jsxs(_Fragment, { children: [_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2", ry: "2" }), _jsx("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })] }), "Copy"] })) }))] }), _jsx("div", { className: "code-block-body", children: _jsx("pre", { className: "code-block-pre", children: _jsx("code", { children: showLineNumbers
14
+ return (_jsxs("div", { className: "atl-code-block", children: [_jsxs("div", { className: "code-block-header", children: [_jsx("span", { className: "code-block-label", children: displayLabel }), copyable && (_jsx("button", { className: "code-block-copy", type: "button", "aria-label": copied ? 'Copied' : 'Copy code', onClick: handleCopy, children: copied ? (_jsxs(_Fragment, { children: [_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("polyline", { points: "20 6 9 17 4 12" }) }), "Copied"] })) : (_jsxs(_Fragment, { children: [_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2", ry: "2" }), _jsx("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })] }), "Copy"] })) }))] }), _jsx("div", { className: "code-block-body", children: _jsx("pre", { className: "code-block-pre", children: _jsx("code", { children: showLineNumbers
15
15
  ? lines.map((line, i) => (_jsxs("span", { className: "code-line", children: [_jsx("span", { className: "code-line-number", children: i + 1 }), _jsx("span", { className: "code-line-text", children: line })] }, i)))
16
16
  : code }) }) })] }));
17
17
  }
18
- //# sourceMappingURL=llm-code-block.js.map
18
+ //# sourceMappingURL=atl-code-block.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"llm-code-block.js","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/code-block/llm-code-block.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,sBAAsB,CAAC;AAe9B,MAAM,UAAU,YAAY,CAAC,EAC3B,IAAI,EACJ,QAAQ,GAAG,MAAM,EACjB,QAAQ,EACR,QAAQ,GAAG,IAAI,EACf,eAAe,GAAG,KAAK,GACL;IAClB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5C,MAAM,YAAY,GAAG,QAAQ,IAAI,QAAQ,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE/B,SAAS,UAAU;QACjB,KAAK,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACjD,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,gBAAgB,aAC7B,eAAK,SAAS,EAAC,mBAAmB,aAChC,eAAM,SAAS,EAAC,kBAAkB,YAAE,YAAY,GAAQ,EACvD,QAAQ,IAAI,CACX,iBACE,SAAS,EAAC,iBAAiB,EAC3B,IAAI,EAAC,QAAQ,gBACD,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAC3C,OAAO,EAAE,UAAU,YAElB,MAAM,CAAC,CAAC,CAAC,CACR,8BACE,cAAK,KAAK,EAAC,4BAA4B,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,iBAAa,MAAM,YACpM,mBAAU,MAAM,EAAC,gBAAgB,GAAG,GAChC,cAEL,CACJ,CAAC,CAAC,CAAC,CACF,8BACE,eAAK,KAAK,EAAC,4BAA4B,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,GAAG,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,iBAAa,MAAM,aAClM,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,GAAG,EACzD,eAAM,CAAC,EAAC,yDAAyD,GAAG,IAChE,YAEL,CACJ,GACM,CACV,IACG,EACN,cAAK,SAAS,EAAC,iBAAiB,YAC9B,cAAK,SAAS,EAAC,gBAAgB,YAC7B,yBACG,eAAe;4BACd,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACrB,gBAAc,SAAS,EAAC,WAAW,aACjC,eAAM,SAAS,EAAC,kBAAkB,YAAE,CAAC,GAAG,CAAC,GAAQ,EACjD,eAAM,SAAS,EAAC,gBAAgB,YAAE,IAAI,GAAQ,KAFrC,CAAC,CAGL,CACR,CAAC;4BACJ,CAAC,CAAC,IAAI,GACH,GACH,GACF,IACF,CACP,CAAC;AACJ,CAAC","sourcesContent":["import { useState } from 'react';\nimport './llm-code-block.css';\n\nexport interface LlmCodeBlockProps {\n /** The code string to display. */\n code: string;\n /** Language label shown in the header. Ignored if filename is set. */\n language?: string;\n /** Optional filename shown in the header instead of the language label. */\n filename?: string;\n /** Whether to show a copy-to-clipboard button. */\n copyable?: boolean;\n /** Whether to display line numbers alongside the code. */\n showLineNumbers?: boolean;\n}\n\nexport function LlmCodeBlock({\n code,\n language = 'text',\n filename,\n copyable = true,\n showLineNumbers = false,\n}: LlmCodeBlockProps) {\n const [copied, setCopied] = useState(false);\n\n const displayLabel = filename || language;\n const lines = code.split('\\n');\n\n function handleCopy() {\n void navigator.clipboard.writeText(code).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1800);\n });\n }\n\n return (\n <div className=\"llm-code-block\">\n <div className=\"code-block-header\">\n <span className=\"code-block-label\">{displayLabel}</span>\n {copyable && (\n <button\n className=\"code-block-copy\"\n type=\"button\"\n aria-label={copied ? 'Copied' : 'Copy code'}\n onClick={handleCopy}\n >\n {copied ? (\n <>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n Copied\n </>\n ) : (\n <>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n Copy\n </>\n )}\n </button>\n )}\n </div>\n <div className=\"code-block-body\">\n <pre className=\"code-block-pre\">\n <code>\n {showLineNumbers\n ? lines.map((line, i) => (\n <span key={i} className=\"code-line\">\n <span className=\"code-line-number\">{i + 1}</span>\n <span className=\"code-line-text\">{line}</span>\n </span>\n ))\n : code}\n </code>\n </pre>\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"atl-code-block.js","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/code-block/atl-code-block.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,sBAAsB,CAAC;AAe9B,MAAM,UAAU,YAAY,CAAC,EAC3B,IAAI,EACJ,QAAQ,GAAG,MAAM,EACjB,QAAQ,EACR,QAAQ,GAAG,IAAI,EACf,eAAe,GAAG,KAAK,GACL;IAClB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5C,MAAM,YAAY,GAAG,QAAQ,IAAI,QAAQ,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE/B,SAAS,UAAU;QACjB,KAAK,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACjD,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,gBAAgB,aAC7B,eAAK,SAAS,EAAC,mBAAmB,aAChC,eAAM,SAAS,EAAC,kBAAkB,YAAE,YAAY,GAAQ,EACvD,QAAQ,IAAI,CACX,iBACE,SAAS,EAAC,iBAAiB,EAC3B,IAAI,EAAC,QAAQ,gBACD,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAC3C,OAAO,EAAE,UAAU,YAElB,MAAM,CAAC,CAAC,CAAC,CACR,8BACE,cAAK,KAAK,EAAC,4BAA4B,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,iBAAa,MAAM,YACpM,mBAAU,MAAM,EAAC,gBAAgB,GAAG,GAChC,cAEL,CACJ,CAAC,CAAC,CAAC,CACF,8BACE,eAAK,KAAK,EAAC,4BAA4B,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,GAAG,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,iBAAa,MAAM,aAClM,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,GAAG,EACzD,eAAM,CAAC,EAAC,yDAAyD,GAAG,IAChE,YAEL,CACJ,GACM,CACV,IACG,EACN,cAAK,SAAS,EAAC,iBAAiB,YAC9B,cAAK,SAAS,EAAC,gBAAgB,YAC7B,yBACG,eAAe;4BACd,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACrB,gBAAc,SAAS,EAAC,WAAW,aACjC,eAAM,SAAS,EAAC,kBAAkB,YAAE,CAAC,GAAG,CAAC,GAAQ,EACjD,eAAM,SAAS,EAAC,gBAAgB,YAAE,IAAI,GAAQ,KAFrC,CAAC,CAGL,CACR,CAAC;4BACJ,CAAC,CAAC,IAAI,GACH,GACH,GACF,IACF,CACP,CAAC;AACJ,CAAC","sourcesContent":["import { useState } from 'react';\nimport './atl-code-block.css';\n\nexport interface AtlCodeBlockProps {\n /** The code string to display. */\n code: string;\n /** Language label shown in the header. Ignored if filename is set. */\n language?: string;\n /** Optional filename shown in the header instead of the language label. */\n filename?: string;\n /** Whether to show a copy-to-clipboard button. */\n copyable?: boolean;\n /** Whether to display line numbers alongside the code. */\n showLineNumbers?: boolean;\n}\n\nexport function AtlCodeBlock({\n code,\n language = 'text',\n filename,\n copyable = true,\n showLineNumbers = false,\n}: AtlCodeBlockProps) {\n const [copied, setCopied] = useState(false);\n\n const displayLabel = filename || language;\n const lines = code.split('\\n');\n\n function handleCopy() {\n void navigator.clipboard.writeText(code).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1800);\n });\n }\n\n return (\n <div className=\"atl-code-block\">\n <div className=\"code-block-header\">\n <span className=\"code-block-label\">{displayLabel}</span>\n {copyable && (\n <button\n className=\"code-block-copy\"\n type=\"button\"\n aria-label={copied ? 'Copied' : 'Copy code'}\n onClick={handleCopy}\n >\n {copied ? (\n <>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n Copied\n </>\n ) : (\n <>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n Copy\n </>\n )}\n </button>\n )}\n </div>\n <div className=\"code-block-body\">\n <pre className=\"code-block-pre\">\n <code>\n {showLineNumbers\n ? lines.map((line, i) => (\n <span key={i} className=\"code-line\">\n <span className=\"code-line-number\">{i + 1}</span>\n <span className=\"code-line-text\">{line}</span>\n </span>\n ))\n : code}\n </code>\n </pre>\n </div>\n </div>\n );\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  /* ============================================================
2
- llm-combobox.css
2
+ atl-combobox.css
3
3
  ============================================================ */
4
4
 
5
- .llm-combobox {
5
+ .atl-combobox {
6
6
  display: block;
7
7
  position: relative;
8
8
  font-family: var(--ui-font-family);
@@ -12,13 +12,13 @@
12
12
  /* ---------------------------------------------------------------------------
13
13
  Input wrapper
14
14
  --------------------------------------------------------------------------- */
15
- .llm-combobox-wrapper {
15
+ .atl-combobox-wrapper {
16
16
  position: relative;
17
17
  display: flex;
18
18
  align-items: center;
19
19
  }
20
20
 
21
- .llm-combobox-input {
21
+ .atl-combobox-input {
22
22
  width: 100%;
23
23
  min-height: 2.5rem;
24
24
  box-sizing: border-box;
@@ -37,42 +37,42 @@
37
37
  cursor: text;
38
38
  }
39
39
 
40
- .llm-combobox-input::placeholder {
40
+ .atl-combobox-input::placeholder {
41
41
  color: var(--ui-color-placeholder);
42
42
  }
43
43
 
44
- .llm-combobox-input:hover:not(:disabled) {
44
+ .atl-combobox-input:hover:not(:disabled) {
45
45
  border-color: var(--ui-color-input-border-hover);
46
46
  }
47
47
 
48
- .llm-combobox-input:focus-visible,
49
- .llm-combobox.is-open .llm-combobox-input {
48
+ .atl-combobox-input:focus-visible,
49
+ .atl-combobox.is-open .atl-combobox-input {
50
50
  border-color: var(--ui-color-input-border-focus);
51
51
  box-shadow: var(--ui-focus-ring);
52
52
  }
53
53
 
54
- .llm-combobox.is-invalid .llm-combobox-input {
54
+ .atl-combobox.is-invalid .atl-combobox-input {
55
55
  border-color: var(--ui-color-input-border-invalid);
56
56
  }
57
57
 
58
- .llm-combobox.is-invalid .llm-combobox-input:focus-visible {
58
+ .atl-combobox.is-invalid .atl-combobox-input:focus-visible {
59
59
  border-color: var(--ui-color-input-border-invalid);
60
60
  box-shadow: 0 0 0 2px var(--ui-color-surface), 0 0 0 4px var(--ui-color-danger);
61
61
  }
62
62
 
63
- .llm-combobox.is-disabled {
63
+ .atl-combobox.is-disabled {
64
64
  opacity: var(--ui-opacity-disabled);
65
65
  cursor: not-allowed;
66
66
  }
67
67
 
68
- .llm-combobox.is-disabled .llm-combobox-input {
68
+ .atl-combobox.is-disabled .atl-combobox-input {
69
69
  cursor: not-allowed;
70
70
  }
71
71
 
72
72
  /* ---------------------------------------------------------------------------
73
73
  Chevron icon
74
74
  --------------------------------------------------------------------------- */
75
- .llm-combobox-icon {
75
+ .atl-combobox-icon {
76
76
  position: absolute;
77
77
  right: var(--ui-spacing-4);
78
78
  pointer-events: none;
@@ -82,14 +82,14 @@
82
82
  align-items: center;
83
83
  }
84
84
 
85
- .llm-combobox.is-open .llm-combobox-icon {
85
+ .atl-combobox.is-open .atl-combobox-icon {
86
86
  transform: rotate(180deg);
87
87
  }
88
88
 
89
89
  /* ---------------------------------------------------------------------------
90
90
  Panel
91
91
  --------------------------------------------------------------------------- */
92
- .llm-combobox-panel {
92
+ .atl-combobox-panel {
93
93
  position: absolute;
94
94
  left: 0;
95
95
  top: calc(100% + var(--ui-spacing-2));
@@ -109,7 +109,7 @@
109
109
  /* ---------------------------------------------------------------------------
110
110
  Options
111
111
  --------------------------------------------------------------------------- */
112
- .llm-combobox-option {
112
+ .atl-combobox-option {
113
113
  display: flex;
114
114
  align-items: center;
115
115
  justify-content: space-between;
@@ -121,25 +121,25 @@
121
121
  transition: background-color var(--ui-transition-fast);
122
122
  }
123
123
 
124
- .llm-combobox-option:hover:not(.is-disabled) {
124
+ .atl-combobox-option:hover:not(.is-disabled) {
125
125
  background-color: var(--ui-color-surface-sunken);
126
126
  }
127
127
 
128
- .llm-combobox-option.is-active {
128
+ .atl-combobox-option.is-active {
129
129
  background-color: var(--ui-color-primary-light);
130
130
  color: var(--ui-color-primary);
131
131
  }
132
132
 
133
- .llm-combobox-option.is-selected {
133
+ .atl-combobox-option.is-selected {
134
134
  font-weight: var(--ui-font-weight-semibold);
135
135
  }
136
136
 
137
- .llm-combobox-option.is-disabled {
137
+ .atl-combobox-option.is-disabled {
138
138
  opacity: var(--ui-opacity-disabled);
139
139
  cursor: not-allowed;
140
140
  }
141
141
 
142
- .llm-combobox-check {
142
+ .atl-combobox-check {
143
143
  color: var(--ui-color-primary);
144
144
  flex-shrink: 0;
145
145
  }
@@ -147,7 +147,7 @@
147
147
  /* ---------------------------------------------------------------------------
148
148
  No results
149
149
  --------------------------------------------------------------------------- */
150
- .llm-combobox-no-results {
150
+ .atl-combobox-no-results {
151
151
  padding: var(--ui-spacing-4);
152
152
  text-align: center;
153
153
  color: var(--ui-color-text-muted);
@@ -157,11 +157,11 @@
157
157
  /* ---------------------------------------------------------------------------
158
158
  Errors
159
159
  --------------------------------------------------------------------------- */
160
- .llm-combobox-errors {
160
+ .atl-combobox-errors {
161
161
  margin-top: var(--ui-spacing-2);
162
162
  }
163
163
 
164
- .llm-combobox-error-message {
164
+ .atl-combobox-error-message {
165
165
  margin: 0;
166
166
  font-size: var(--ui-font-size-sm);
167
167
  color: var(--ui-color-error-text);
@@ -1,7 +1,7 @@
1
- import type { LlmComboboxOption, LlmComboboxSpec } from '../spec';
2
- import './llm-combobox.css';
3
- export type { LlmComboboxOption };
4
- export interface LlmComboboxProps extends LlmComboboxSpec {
1
+ import type { AtlComboboxOption, AtlComboboxSpec } from '../spec';
2
+ import './atl-combobox.css';
3
+ export type { AtlComboboxOption };
4
+ export interface AtlComboboxProps extends AtlComboboxSpec {
5
5
  value?: string;
6
6
  onValueChange?: (value: string) => void;
7
7
  errors?: string[];
@@ -13,7 +13,7 @@ export interface LlmComboboxProps extends LlmComboboxSpec {
13
13
  *
14
14
  * Usage:
15
15
  * ```tsx
16
- * <LlmCombobox
16
+ * <AtlCombobox
17
17
  * value={country}
18
18
  * onValueChange={setCountry}
19
19
  * options={countryOptions}
@@ -21,5 +21,5 @@ export interface LlmComboboxProps extends LlmComboboxSpec {
21
21
  * />
22
22
  * ```
23
23
  */
24
- export declare function LlmCombobox({ value, onValueChange, options, placeholder, disabled, readonly, invalid, required, name, errors, }: LlmComboboxProps): import("react").JSX.Element;
25
- //# sourceMappingURL=llm-combobox.d.ts.map
24
+ export declare function AtlCombobox({ value, onValueChange, options, placeholder, disabled, readonly, invalid, required, name, errors, }: AtlComboboxProps): import("react").JSX.Element;
25
+ //# sourceMappingURL=atl-combobox.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"llm-combobox.d.ts","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/combobox/llm-combobox.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,oBAAoB,CAAC;AAE5B,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAElC,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAU,EACV,aAAa,EACb,OAAY,EACZ,WAAgB,EAChB,QAAgB,EAChB,QAAgB,EAChB,OAAe,EACf,QAAgB,EAChB,IAAI,EACJ,MAAW,GACZ,EAAE,gBAAgB,+BA2MlB"}
1
+ {"version":3,"file":"atl-combobox.d.ts","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/combobox/atl-combobox.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,oBAAoB,CAAC;AAE5B,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAElC,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAU,EACV,aAAa,EACb,OAAY,EACZ,WAAgB,EAChB,QAAgB,EAChB,QAAgB,EAChB,OAAe,EACf,QAAgB,EAChB,IAAI,EACJ,MAAW,GACZ,EAAE,gBAAgB,+BA2MlB"}