@servicetitan/anvil2-ext-atlas 1.2.3 → 1.3.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 (40) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/atlas-header-Cxxvgc7g.js +40 -0
  3. package/dist/atlas-header-Cxxvgc7g.js.map +1 -0
  4. package/dist/atlas-header.js +1 -1
  5. package/dist/{chat-window-BU8VGO9z.js → chat-window-4hy-1xfj.js} +2 -2
  6. package/dist/{chat-window-BU8VGO9z.js.map → chat-window-4hy-1xfj.js.map} +1 -1
  7. package/dist/chat.js +1 -1
  8. package/dist/components/atlas-header/atlas-header.d.ts +11 -2
  9. package/dist/components/loader/index.d.ts +1 -0
  10. package/dist/components/loader/pulse-loader.d.ts +30 -0
  11. package/dist/components/messages/assistant-message.d.ts +2 -0
  12. package/dist/components/messages/markdown-message.d.ts +2 -0
  13. package/dist/index.js +8 -7
  14. package/dist/index.js.map +1 -1
  15. package/dist/{loader-DYmcO1Y_.js → loader-BF1xpasR.js} +2 -2
  16. package/dist/{loader-DYmcO1Y_.js.map → loader-BF1xpasR.js.map} +1 -1
  17. package/dist/loader.js +2 -1
  18. package/dist/loader.js.map +1 -1
  19. package/dist/{markdown-text-BXCCdmOl.js → markdown-text-CgCSN9q6.js} +2 -2
  20. package/dist/{markdown-text-BXCCdmOl.js.map → markdown-text-CgCSN9q6.js.map} +1 -1
  21. package/dist/markdown-text.css +19 -15
  22. package/dist/markdown-text.js +1 -1
  23. package/dist/messages.js +1 -1
  24. package/dist/{notification-card-CdQVC1kO.js → notification-card-DMnEZI0Q.js} +2 -2
  25. package/dist/{notification-card-CdQVC1kO.js.map → notification-card-DMnEZI0Q.js.map} +1 -1
  26. package/dist/notification-card.js +1 -1
  27. package/dist/{proxy-B3m3ViIw.js → proxy-BJr91CAa.js} +2 -2
  28. package/dist/{proxy-B3m3ViIw.js.map → proxy-BJr91CAa.js.map} +1 -1
  29. package/dist/pulse-loader-DUrtKYC5.js +390 -0
  30. package/dist/pulse-loader-DUrtKYC5.js.map +1 -0
  31. package/dist/recommendations.js +1 -1
  32. package/dist/{single-recommendation-card-DgAQbMg4.js → single-recommendation-card-CV75jkZb.js} +2 -2
  33. package/dist/{single-recommendation-card-DgAQbMg4.js.map → single-recommendation-card-CV75jkZb.js.map} +1 -1
  34. package/dist/{user-message-BFrCI10z.js → user-message-BqWF67vX.js} +44 -21
  35. package/dist/user-message-BqWF67vX.js.map +1 -0
  36. package/dist/user-message.css +32 -28
  37. package/package.json +9 -9
  38. package/dist/atlas-header-CYHhcWuk.js +0 -23
  39. package/dist/atlas-header-CYHhcWuk.js.map +0 -1
  40. package/dist/user-message-BFrCI10z.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # @servicetitan/anvil2-ext-atlas
2
2
 
3
+ ## 1.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#2200](https://github.com/servicetitan/hammer/pull/2200) [`df50c67`](https://github.com/servicetitan/hammer/commit/df50c67c10afb863377f638e2c305738b811f4e2) Thanks [@arnold-dad-st](https://github.com/arnold-dad-st)! - [PulseLoader] Add new `PulseLoader` component replacing the 3-dot loader with an animated Atlas logo and status text; update `AssistantMessage`, `MarkdownMessage`, and `Thinking` to use the new loader with an optional `statusMessage` prop
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [[`6042a60`](https://github.com/servicetitan/hammer/commit/6042a60d0b6bc2861ef92946cad8812d276b2165), [`0814ff2`](https://github.com/servicetitan/hammer/commit/0814ff20e6fe13264289c13014ed3646ca08e69e), [`6042a60`](https://github.com/servicetitan/hammer/commit/6042a60d0b6bc2861ef92946cad8812d276b2165), [`6042a60`](https://github.com/servicetitan/hammer/commit/6042a60d0b6bc2861ef92946cad8812d276b2165), [`5cef90f`](https://github.com/servicetitan/hammer/commit/5cef90f66ffba73a29f485848312bd5f9cc67037), [`6042a60`](https://github.com/servicetitan/hammer/commit/6042a60d0b6bc2861ef92946cad8812d276b2165), [`6042a60`](https://github.com/servicetitan/hammer/commit/6042a60d0b6bc2861ef92946cad8812d276b2165), [`6042a60`](https://github.com/servicetitan/hammer/commit/6042a60d0b6bc2861ef92946cad8812d276b2165), [`f8d56e0`](https://github.com/servicetitan/hammer/commit/f8d56e000d06d8b1725674de99e8e60dcd1e940f), [`6042a60`](https://github.com/servicetitan/hammer/commit/6042a60d0b6bc2861ef92946cad8812d276b2165), [`1f3828b`](https://github.com/servicetitan/hammer/commit/1f3828bf0708c806ba03b681425eec6deae4a8b8), [`75f1cf1`](https://github.com/servicetitan/hammer/commit/75f1cf1d9a13bd95daf1d1913602898baa0df199), [`6042a60`](https://github.com/servicetitan/hammer/commit/6042a60d0b6bc2861ef92946cad8812d276b2165), [`6042a60`](https://github.com/servicetitan/hammer/commit/6042a60d0b6bc2861ef92946cad8812d276b2165), [`c27d4df`](https://github.com/servicetitan/hammer/commit/c27d4dfcc4088189eb3c9f7609d7656b6859936a), [`f8d56e0`](https://github.com/servicetitan/hammer/commit/f8d56e000d06d8b1725674de99e8e60dcd1e940f), [`6042a60`](https://github.com/servicetitan/hammer/commit/6042a60d0b6bc2861ef92946cad8812d276b2165), [`6042a60`](https://github.com/servicetitan/hammer/commit/6042a60d0b6bc2861ef92946cad8812d276b2165), [`6042a60`](https://github.com/servicetitan/hammer/commit/6042a60d0b6bc2861ef92946cad8812d276b2165), [`6042a60`](https://github.com/servicetitan/hammer/commit/6042a60d0b6bc2861ef92946cad8812d276b2165)]:
12
+ - @servicetitan/anvil2@2.8.0
13
+
3
14
  ## 1.2.3
4
15
 
5
16
  ### Patch Changes
@@ -0,0 +1,40 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { Flex, Icon, Text } from '@servicetitan/anvil2';
3
+ import { P as PulseLoader, S as SvgAtlasLogo } from './pulse-loader-DUrtKYC5.js';
4
+
5
+ const AtlasHeader = ({
6
+ svgIcon,
7
+ assistant = "Atlas",
8
+ className,
9
+ loading = false,
10
+ statusMessage = "Thinking..."
11
+ }) => {
12
+ if (loading) {
13
+ return /* @__PURE__ */ jsx(
14
+ PulseLoader,
15
+ {
16
+ className,
17
+ statusMessage,
18
+ svgIcon
19
+ }
20
+ );
21
+ }
22
+ return /* @__PURE__ */ jsxs(Flex, { className, alignItems: "flex-start", gap: 3, children: [
23
+ /* @__PURE__ */ jsx(
24
+ "div",
25
+ {
26
+ style: {
27
+ flexShrink: 0,
28
+ display: "flex",
29
+ alignItems: "center",
30
+ marginTop: "3px"
31
+ },
32
+ children: /* @__PURE__ */ jsx(Icon, { svg: svgIcon ?? SvgAtlasLogo, size: "medium", inherit: true })
33
+ }
34
+ ),
35
+ /* @__PURE__ */ jsx(Text, { inline: true, children: /* @__PURE__ */ jsx("b", { children: assistant }) })
36
+ ] });
37
+ };
38
+
39
+ export { AtlasHeader as A };
40
+ //# sourceMappingURL=atlas-header-Cxxvgc7g.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atlas-header-Cxxvgc7g.js","sources":["../src/components/atlas-header/atlas-header.tsx"],"sourcesContent":["import { FC } from \"react\";\nimport { Flex, Icon, Svg, Text } from \"@servicetitan/anvil2\";\nimport IconAtlasLogo from \"@servicetitan/anvil2/assets/icons/st/atlas_logo.svg\";\nimport { PulseLoader } from \"../loader\";\n\nexport interface AtlasHeaderProps {\n /**\n * Custom icon to display instead of the default Atlas logo\n */\n svgIcon?: Svg;\n /**\n * Custom assistant name to display instead of \"Atlas\"\n */\n assistant?: string;\n /**\n * Additional CSS class names\n */\n className?: string;\n /**\n * Whether the loading animation is active\n */\n loading?: boolean;\n /**\n * Status message shown while loading. Defaults to \"Thinking...\"\n */\n statusMessage?: string;\n}\n\n/**\n * Shared component that displays the Atlas logo and name header.\n * When loading is true, the icon pulses and shows the statusMessage with a gradient sweep animation.\n * Used across all message types and recommendation cards.\n */\nexport const AtlasHeader: FC<AtlasHeaderProps> = ({\n svgIcon,\n assistant = \"Atlas\",\n className,\n loading = false,\n statusMessage = \"Thinking...\",\n}) => {\n if (loading) {\n return (\n <PulseLoader\n className={className}\n statusMessage={statusMessage}\n svgIcon={svgIcon}\n />\n );\n }\n\n return (\n <Flex className={className} alignItems=\"flex-start\" gap={3}>\n <div\n style={{\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n marginTop: \"3px\",\n }}\n >\n <Icon svg={svgIcon ?? IconAtlasLogo} size=\"medium\" inherit />\n </div>\n <Text inline>\n <b>{assistant}</b>\n </Text>\n </Flex>\n );\n};\n"],"names":["IconAtlasLogo"],"mappings":";;;;AAiCO,MAAM,cAAoC,CAAC;AAAA,EAChD,OAAA;AAAA,EACA,SAAA,GAAY,OAAA;AAAA,EACZ,SAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,aAAA,GAAgB;AAClB,CAAA,KAAM;AACJ,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACE,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,SAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,4BACG,IAAA,EAAA,EAAK,SAAA,EAAsB,UAAA,EAAW,YAAA,EAAa,KAAK,CAAA,EACvD,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO;AAAA,UACL,UAAA,EAAY,CAAA;AAAA,UACZ,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,SAAA,EAAW;AAAA,SACb;AAAA,QAEA,QAAA,kBAAA,GAAA,CAAC,QAAK,GAAA,EAAK,OAAA,IAAWA,cAAe,IAAA,EAAK,QAAA,EAAS,SAAO,IAAA,EAAC;AAAA;AAAA,KAC7D;AAAA,wBACC,IAAA,EAAA,EAAK,MAAA,EAAM,MACV,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAG,qBAAU,CAAA,EAChB;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -1,2 +1,2 @@
1
- export { A as AtlasHeader } from './atlas-header-CYHhcWuk.js';
1
+ export { A as AtlasHeader } from './atlas-header-Cxxvgc7g.js';
2
2
  //# sourceMappingURL=atlas-header.js.map
@@ -1,6 +1,6 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { c as classNames } from './index-DDXI3m_u.js';
3
- import { m as motion } from './proxy-B3m3ViIw.js';
3
+ import { m as motion } from './proxy-BJr91CAa.js';
4
4
 
5
5
  import './chat-window.css';const open = "_open_1qo7q_19";
6
6
  const closed = "_closed_1qo7q_23";
@@ -72,4 +72,4 @@ const ChatWindow = ({
72
72
  };
73
73
 
74
74
  export { ChatWindow as C };
75
- //# sourceMappingURL=chat-window-BU8VGO9z.js.map
75
+ //# sourceMappingURL=chat-window-4hy-1xfj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-window-BU8VGO9z.js","sources":["../src/components/chat/chat-window.tsx"],"sourcesContent":["import { ReactNode } from \"react\";\nimport classNames from \"classnames\";\nimport { motion } from \"framer-motion\";\n\nimport styles from \"./styles.module.scss\";\n\ninterface ChatWindowProps {\n open: boolean;\n position?: { x: number; y: number };\n isDragging?: boolean;\n fullscreen?: boolean;\n children: ReactNode;\n}\n\nexport const ChatWindow = ({\n open,\n position,\n isDragging,\n fullscreen = false,\n children,\n}: ChatWindowProps) => {\n const isFullscreenOpen = fullscreen && open;\n\n const className = classNames({\n [styles[\"chat-window-expanded\"]]: isFullscreenOpen,\n [styles[\"chat-window\"]]: !isFullscreenOpen,\n [styles[\"open\"]]: !isFullscreenOpen && open,\n [styles[\"closed\"]]: !isFullscreenOpen && !open,\n [styles[\"positioned\"]]: !isFullscreenOpen && position,\n [styles[\"relative\"]]: !isFullscreenOpen && !position,\n });\n\n const getPositionStyles = () => {\n if (isFullscreenOpen) {\n return {};\n }\n\n return position\n ? {\n left: position.x,\n top: position.y,\n }\n : {};\n };\n\n return (\n <motion.div\n layout={!isDragging}\n initial={{\n opacity: isFullscreenOpen ? 0 : 1,\n x: !isFullscreenOpen && !open ? 0 : -25,\n }}\n animate={{\n x: isFullscreenOpen ? 0 : open ? -25 : 0,\n }}\n transition={{\n type: isFullscreenOpen ? \"tween\" : \"spring\",\n ease: isFullscreenOpen ? \"easeInOut\" : undefined,\n stiffness: 300,\n damping: 35,\n duration: 0.3,\n }}\n className={className}\n style={getPositionStyles()}\n >\n <motion.div\n layout={!isDragging ? \"position\" : undefined}\n style={{ width: \"100%\", height: \"100%\" }}\n >\n {children}\n </motion.div>\n </motion.div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAcO,MAAM,aAAa,CAAC;AAAA,EACzB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb;AACF,CAAA,KAAuB;AACrB,EAAA,MAAM,mBAAmB,UAAA,IAAc,IAAA;AAEvC,EAAA,MAAM,YAAY,UAAA,CAAW;AAAA,IAC3B,CAAC,MAAA,CAAO,sBAAsB,CAAC,GAAG,gBAAA;AAAA,IAClC,CAAC,MAAA,CAAO,aAAa,CAAC,GAAG,CAAC,gBAAA;AAAA,IAC1B,CAAC,MAAA,CAAO,MAAM,CAAC,GAAG,CAAC,gBAAA,IAAoB,IAAA;AAAA,IACvC,CAAC,MAAA,CAAO,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAA;AAAA,IAC1C,CAAC,MAAA,CAAO,YAAY,CAAC,GAAG,CAAC,gBAAA,IAAoB,QAAA;AAAA,IAC7C,CAAC,MAAA,CAAO,UAAU,CAAC,GAAG,CAAC,oBAAoB,CAAC;AAAA,GAC7C,CAAA;AAED,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO,QAAA,GACH;AAAA,MACE,MAAM,QAAA,CAAS,CAAA;AAAA,MACf,KAAK,QAAA,CAAS;AAAA,QAEhB,EAAC;AAAA,EACP,CAAA;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,QAAQ,CAAC,UAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,mBAAmB,CAAA,GAAI,CAAA;AAAA,QAChC,CAAA,EAAG,CAAC,gBAAA,IAAoB,CAAC,OAAO,CAAA,GAAI;AAAA,OACtC;AAAA,MACA,OAAA,EAAS;AAAA,QACP,CAAA,EAAG,gBAAA,GAAmB,CAAA,GAAI,IAAA,GAAO,GAAA,GAAM;AAAA,OACzC;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,mBAAmB,OAAA,GAAU,QAAA;AAAA,QACnC,IAAA,EAAM,mBAAmB,WAAA,GAAc,MAAA;AAAA,QACvC,SAAA,EAAW,GAAA;AAAA,QACX,OAAA,EAAS,EAAA;AAAA,QACT,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,SAAA;AAAA,MACA,OAAO,iBAAA,EAAkB;AAAA,MAEzB,QAAA,kBAAA,GAAA;AAAA,QAAC,MAAA,CAAO,GAAA;AAAA,QAAP;AAAA,UACC,MAAA,EAAQ,CAAC,UAAA,GAAa,UAAA,GAAa,MAAA;AAAA,UACnC,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAQ,MAAA,EAAO;AAAA,UAEtC;AAAA;AAAA;AACH;AAAA,GACF;AAEJ;;;;"}
1
+ {"version":3,"file":"chat-window-4hy-1xfj.js","sources":["../src/components/chat/chat-window.tsx"],"sourcesContent":["import { ReactNode } from \"react\";\nimport classNames from \"classnames\";\nimport { motion } from \"framer-motion\";\n\nimport styles from \"./styles.module.scss\";\n\ninterface ChatWindowProps {\n open: boolean;\n position?: { x: number; y: number };\n isDragging?: boolean;\n fullscreen?: boolean;\n children: ReactNode;\n}\n\nexport const ChatWindow = ({\n open,\n position,\n isDragging,\n fullscreen = false,\n children,\n}: ChatWindowProps) => {\n const isFullscreenOpen = fullscreen && open;\n\n const className = classNames({\n [styles[\"chat-window-expanded\"]]: isFullscreenOpen,\n [styles[\"chat-window\"]]: !isFullscreenOpen,\n [styles[\"open\"]]: !isFullscreenOpen && open,\n [styles[\"closed\"]]: !isFullscreenOpen && !open,\n [styles[\"positioned\"]]: !isFullscreenOpen && position,\n [styles[\"relative\"]]: !isFullscreenOpen && !position,\n });\n\n const getPositionStyles = () => {\n if (isFullscreenOpen) {\n return {};\n }\n\n return position\n ? {\n left: position.x,\n top: position.y,\n }\n : {};\n };\n\n return (\n <motion.div\n layout={!isDragging}\n initial={{\n opacity: isFullscreenOpen ? 0 : 1,\n x: !isFullscreenOpen && !open ? 0 : -25,\n }}\n animate={{\n x: isFullscreenOpen ? 0 : open ? -25 : 0,\n }}\n transition={{\n type: isFullscreenOpen ? \"tween\" : \"spring\",\n ease: isFullscreenOpen ? \"easeInOut\" : undefined,\n stiffness: 300,\n damping: 35,\n duration: 0.3,\n }}\n className={className}\n style={getPositionStyles()}\n >\n <motion.div\n layout={!isDragging ? \"position\" : undefined}\n style={{ width: \"100%\", height: \"100%\" }}\n >\n {children}\n </motion.div>\n </motion.div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAcO,MAAM,aAAa,CAAC;AAAA,EACzB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb;AACF,CAAA,KAAuB;AACrB,EAAA,MAAM,mBAAmB,UAAA,IAAc,IAAA;AAEvC,EAAA,MAAM,YAAY,UAAA,CAAW;AAAA,IAC3B,CAAC,MAAA,CAAO,sBAAsB,CAAC,GAAG,gBAAA;AAAA,IAClC,CAAC,MAAA,CAAO,aAAa,CAAC,GAAG,CAAC,gBAAA;AAAA,IAC1B,CAAC,MAAA,CAAO,MAAM,CAAC,GAAG,CAAC,gBAAA,IAAoB,IAAA;AAAA,IACvC,CAAC,MAAA,CAAO,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAA;AAAA,IAC1C,CAAC,MAAA,CAAO,YAAY,CAAC,GAAG,CAAC,gBAAA,IAAoB,QAAA;AAAA,IAC7C,CAAC,MAAA,CAAO,UAAU,CAAC,GAAG,CAAC,oBAAoB,CAAC;AAAA,GAC7C,CAAA;AAED,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO,QAAA,GACH;AAAA,MACE,MAAM,QAAA,CAAS,CAAA;AAAA,MACf,KAAK,QAAA,CAAS;AAAA,QAEhB,EAAC;AAAA,EACP,CAAA;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,QAAQ,CAAC,UAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,mBAAmB,CAAA,GAAI,CAAA;AAAA,QAChC,CAAA,EAAG,CAAC,gBAAA,IAAoB,CAAC,OAAO,CAAA,GAAI;AAAA,OACtC;AAAA,MACA,OAAA,EAAS;AAAA,QACP,CAAA,EAAG,gBAAA,GAAmB,CAAA,GAAI,IAAA,GAAO,GAAA,GAAM;AAAA,OACzC;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,mBAAmB,OAAA,GAAU,QAAA;AAAA,QACnC,IAAA,EAAM,mBAAmB,WAAA,GAAc,MAAA;AAAA,QACvC,SAAA,EAAW,GAAA;AAAA,QACX,OAAA,EAAS,EAAA;AAAA,QACT,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,SAAA;AAAA,MACA,OAAO,iBAAA,EAAkB;AAAA,MAEzB,QAAA,kBAAA,GAAA;AAAA,QAAC,MAAA,CAAO,GAAA;AAAA,QAAP;AAAA,UACC,MAAA,EAAQ,CAAC,UAAA,GAAa,UAAA,GAAa,MAAA;AAAA,UACnC,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAQ,MAAA,EAAO;AAAA,UAEtC;AAAA;AAAA;AACH;AAAA,GACF;AAEJ;;;;"}
package/dist/chat.js CHANGED
@@ -1,2 +1,2 @@
1
- export { C as ChatWindow } from './chat-window-BU8VGO9z.js';
1
+ export { C as ChatWindow } from './chat-window-4hy-1xfj.js';
2
2
  //# sourceMappingURL=chat.js.map
@@ -13,9 +13,18 @@ export interface AtlasHeaderProps {
13
13
  * Additional CSS class names
14
14
  */
15
15
  className?: string;
16
+ /**
17
+ * Whether the loading animation is active
18
+ */
19
+ loading?: boolean;
20
+ /**
21
+ * Status message shown while loading. Defaults to "Thinking..."
22
+ */
23
+ statusMessage?: string;
16
24
  }
17
25
  /**
18
- * Shared component that displays the Atlas logo and name header
19
- * Used across all message types and recommendation cards
26
+ * Shared component that displays the Atlas logo and name header.
27
+ * When loading is true, the icon pulses and shows the statusMessage with a gradient sweep animation.
28
+ * Used across all message types and recommendation cards.
20
29
  */
21
30
  export declare const AtlasHeader: FC<AtlasHeaderProps>;
@@ -1 +1,2 @@
1
1
  export * from './loader';
2
+ export * from './pulse-loader';
@@ -0,0 +1,30 @@
1
+ import { FC } from 'react';
2
+ import { Svg } from '@servicetitan/anvil2';
3
+ /**
4
+ * Props for the PulseLoader component
5
+ * @property {string} [statusMessage] - Custom status message displayed next to the animated logo. Defaults to "Thinking..."
6
+ * @property {Svg} [svgIcon] - Custom icon to display instead of the default Atlas logo
7
+ * @property {string} [className] - Additional CSS class names
8
+ */
9
+ export interface PulseLoaderProps {
10
+ /** Custom status message displayed next to the animated logo. Defaults to "Thinking..." */
11
+ statusMessage?: string;
12
+ /** Custom icon to display instead of the default Atlas logo */
13
+ svgIcon?: Svg;
14
+ /** Additional CSS class names */
15
+ className?: string;
16
+ }
17
+ /**
18
+ * PulseLoader component for displaying an animated Atlas logo with status text.
19
+ *
20
+ * Features:
21
+ * - Animated Atlas logo with scale pulse effect
22
+ * - Gradient sweep animation on the status text
23
+ * - Smooth fade transition when status message changes
24
+ * - Accessible with role="status" and aria-live="polite"
25
+ * - Chromatic-stable with data-chromatic="ignore" on animated elements
26
+ *
27
+ * @example
28
+ * <PulseLoader statusMessage="Thinking..." />
29
+ */
30
+ export declare const PulseLoader: FC<PulseLoaderProps>;
@@ -6,5 +6,7 @@ export interface AssistantMessageProps extends MessageProps {
6
6
  svgIcon?: Svg;
7
7
  assistant?: string;
8
8
  onRetry?: () => void;
9
+ statusMessage?: string;
10
+ loading?: boolean;
9
11
  }
10
12
  export declare const AssistantMessage: FC<AssistantMessageProps>;
@@ -8,6 +8,8 @@ export interface MarkdownMessageProps extends MessageProps {
8
8
  assistant?: string;
9
9
  onRetry?: () => void;
10
10
  toolboxProps?: Omit<ToolboxProps, "text">;
11
+ loading?: boolean;
12
+ statusMessage?: string;
11
13
  }
12
14
  export declare const MarkdownMessage: FC<MarkdownMessageProps>;
13
15
  export declare const Thinking: FC<MarkdownMessageProps>;
package/dist/index.js CHANGED
@@ -1,15 +1,16 @@
1
- export { A as AtlasHeader } from './atlas-header-CYHhcWuk.js';
2
- export { C as ChatWindow } from './chat-window-BU8VGO9z.js';
1
+ export { A as AtlasHeader } from './atlas-header-Cxxvgc7g.js';
2
+ export { C as ChatWindow } from './chat-window-4hy-1xfj.js';
3
3
  export { C as ChatComposerRich } from './chat-composer-rich-Bj1gmhec.js';
4
4
  export { C as Content } from './content-DAPOfSv5.js';
5
5
  export { F as Footer } from './footer-Cv4yRBA1.js';
6
6
  export { H as Header } from './header-ku2JmzDC.js';
7
7
  export { I as InfiniteContent } from './infinite-content-BnStGJfq.js';
8
- export { L as Loader } from './loader-DYmcO1Y_.js';
9
- export { M as MarkdownText } from './markdown-text-BXCCdmOl.js';
10
- export { A as AssistantMessage, E as ErrorMessage, M as MarkdownMessage, S as SmallAction, a as SystemMessage, T as Thinking, U as UserMessage } from './user-message-BFrCI10z.js';
11
- export { N as NotificationCard } from './notification-card-CdQVC1kO.js';
12
- export { C as ConfirmationCard, M as MultipleRecommendationCard, S as SingleRecommendationCard } from './single-recommendation-card-DgAQbMg4.js';
8
+ export { L as Loader } from './loader-BF1xpasR.js';
9
+ export { P as PulseLoader } from './pulse-loader-DUrtKYC5.js';
10
+ export { M as MarkdownText } from './markdown-text-CgCSN9q6.js';
11
+ export { A as AssistantMessage, E as ErrorMessage, M as MarkdownMessage, S as SmallAction, a as SystemMessage, T as Thinking, U as UserMessage } from './user-message-BqWF67vX.js';
12
+ export { N as NotificationCard } from './notification-card-DMnEZI0Q.js';
13
+ export { C as ConfirmationCard, M as MultipleRecommendationCard, S as SingleRecommendationCard } from './single-recommendation-card-CV75jkZb.js';
13
14
  export { S as SystemError, W as Welcome } from './welcome-CLNfeZDg.js';
14
15
  export { S as Spinner } from './spinner-QnlThoJs.js';
15
16
  export { S as Suggestion, a as SuggestionList } from './suggestion-pJLJZyjg.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/hooks/use-draggable.ts"],"sourcesContent":["import { MouseEvent, useCallback, useEffect, useState } from \"react\";\n\nexport interface UseDraggableProps {\n initialX?: number;\n initialY?: number;\n minVisibleHorizontal?: number;\n minVisibleVertical?: number;\n width?: number;\n}\n\nexport interface Position {\n x: number;\n y: number;\n}\n\nexport const useDraggable = ({\n initialX = window.innerWidth - 390,\n initialY = 64,\n minVisibleHorizontal = 390,\n minVisibleVertical = 56,\n width = 390,\n}: UseDraggableProps = {}) => {\n const [position, setPosition] = useState<Position>({\n x: initialX,\n y: initialY,\n });\n const [isDragging, setIsDragging] = useState(false);\n const [dragOffset, setDragOffset] = useState<Position>({ x: 0, y: 0 });\n\n // Function to ensure position is within viewport boundaries\n const ensurePositionInViewport = useCallback(\n (pos: Position): Position => {\n const maxX = window.innerWidth - minVisibleHorizontal;\n const minX = -width + minVisibleHorizontal;\n const maxY = window.innerHeight - minVisibleVertical;\n return {\n x: Math.min(Math.max(pos.x, minX), maxX),\n y: Math.min(Math.max(pos.y, minVisibleVertical), maxY),\n };\n },\n [minVisibleHorizontal, minVisibleVertical, width],\n );\n\n // Function to recalculate initial position based on current viewport\n const recalculateInitialPosition = useCallback((): Position => {\n const newInitialX = window.innerWidth - width;\n return { x: newInitialX, y: initialY };\n }, [width, initialY]);\n\n const resetPosition = useCallback(() => {\n const newInitialPos = recalculateInitialPosition();\n setPosition(newInitialPos);\n }, [recalculateInitialPosition]);\n\n const handleMouseDown = useCallback(\n (e: MouseEvent) => {\n e.preventDefault();\n setIsDragging(true);\n\n setDragOffset({\n x: e.clientX - position.x,\n y: e.clientY - position.y,\n });\n },\n [position],\n );\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!isDragging) {\n return;\n }\n\n const newX = e.clientX - dragOffset.x;\n const newY = e.clientY - dragOffset.y;\n\n const constrainedPosition = ensurePositionInViewport({\n x: newX,\n y: newY,\n });\n setPosition(constrainedPosition);\n },\n [isDragging, dragOffset, ensurePositionInViewport],\n );\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n // Handle viewport resize\n const handleResize = useCallback(() => {\n const constrainedPosition = ensurePositionInViewport(position);\n setPosition(constrainedPosition);\n }, [position, ensurePositionInViewport]);\n\n useEffect(() => {\n if (isDragging) {\n // Prevent text selection while dragging\n document.body.style.userSelect = \"none\";\n document.body.style.webkitUserSelect = \"none\";\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n }\n\n return () => {\n // Restore text selection\n document.body.style.userSelect = \"\";\n document.body.style.webkitUserSelect = \"\";\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [isDragging, handleMouseMove, handleMouseUp]);\n\n // Add resize listener\n useEffect(() => {\n window.addEventListener(\"resize\", handleResize);\n\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n };\n }, [handleResize]);\n\n return {\n position,\n isDragging,\n handleMouseDown,\n resetPosition,\n };\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/hooks/use-draggable.ts"],"sourcesContent":["import { MouseEvent, useCallback, useEffect, useState } from \"react\";\n\nexport interface UseDraggableProps {\n initialX?: number;\n initialY?: number;\n minVisibleHorizontal?: number;\n minVisibleVertical?: number;\n width?: number;\n}\n\nexport interface Position {\n x: number;\n y: number;\n}\n\nexport const useDraggable = ({\n initialX = window.innerWidth - 390,\n initialY = 64,\n minVisibleHorizontal = 390,\n minVisibleVertical = 56,\n width = 390,\n}: UseDraggableProps = {}) => {\n const [position, setPosition] = useState<Position>({\n x: initialX,\n y: initialY,\n });\n const [isDragging, setIsDragging] = useState(false);\n const [dragOffset, setDragOffset] = useState<Position>({ x: 0, y: 0 });\n\n // Function to ensure position is within viewport boundaries\n const ensurePositionInViewport = useCallback(\n (pos: Position): Position => {\n const maxX = window.innerWidth - minVisibleHorizontal;\n const minX = -width + minVisibleHorizontal;\n const maxY = window.innerHeight - minVisibleVertical;\n return {\n x: Math.min(Math.max(pos.x, minX), maxX),\n y: Math.min(Math.max(pos.y, minVisibleVertical), maxY),\n };\n },\n [minVisibleHorizontal, minVisibleVertical, width],\n );\n\n // Function to recalculate initial position based on current viewport\n const recalculateInitialPosition = useCallback((): Position => {\n const newInitialX = window.innerWidth - width;\n return { x: newInitialX, y: initialY };\n }, [width, initialY]);\n\n const resetPosition = useCallback(() => {\n const newInitialPos = recalculateInitialPosition();\n setPosition(newInitialPos);\n }, [recalculateInitialPosition]);\n\n const handleMouseDown = useCallback(\n (e: MouseEvent) => {\n e.preventDefault();\n setIsDragging(true);\n\n setDragOffset({\n x: e.clientX - position.x,\n y: e.clientY - position.y,\n });\n },\n [position],\n );\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!isDragging) {\n return;\n }\n\n const newX = e.clientX - dragOffset.x;\n const newY = e.clientY - dragOffset.y;\n\n const constrainedPosition = ensurePositionInViewport({\n x: newX,\n y: newY,\n });\n setPosition(constrainedPosition);\n },\n [isDragging, dragOffset, ensurePositionInViewport],\n );\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n // Handle viewport resize\n const handleResize = useCallback(() => {\n const constrainedPosition = ensurePositionInViewport(position);\n setPosition(constrainedPosition);\n }, [position, ensurePositionInViewport]);\n\n useEffect(() => {\n if (isDragging) {\n // Prevent text selection while dragging\n document.body.style.userSelect = \"none\";\n document.body.style.webkitUserSelect = \"none\";\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n }\n\n return () => {\n // Restore text selection\n document.body.style.userSelect = \"\";\n document.body.style.webkitUserSelect = \"\";\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [isDragging, handleMouseMove, handleMouseUp]);\n\n // Add resize listener\n useEffect(() => {\n window.addEventListener(\"resize\", handleResize);\n\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n };\n }, [handleResize]);\n\n return {\n position,\n isDragging,\n handleMouseDown,\n resetPosition,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { Flex } from '@servicetitan/anvil2';
3
- import { m as motion, e as easeInOut } from './proxy-B3m3ViIw.js';
3
+ import { m as motion, e as easeInOut } from './proxy-BJr91CAa.js';
4
4
 
5
5
  const dotVariants = {
6
6
  bounce: (i) => ({
@@ -45,4 +45,4 @@ const Loader = () => {
45
45
  };
46
46
 
47
47
  export { Loader as L };
48
- //# sourceMappingURL=loader-DYmcO1Y_.js.map
48
+ //# sourceMappingURL=loader-BF1xpasR.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader-DYmcO1Y_.js","sources":["../src/components/loader/loader.tsx"],"sourcesContent":["import { FC } from \"react\";\nimport { easeInOut, motion } from \"framer-motion\";\nimport { Flex } from \"@servicetitan/anvil2\";\n\nconst dotVariants = {\n bounce: (i: number) => ({\n y: [0, -15, 0],\n transition: {\n duration: 1.2,\n ease: easeInOut,\n repeat: Infinity,\n delay: i * 0.15,\n },\n }),\n};\n\nexport const Loader: FC = () => {\n return (\n <Flex\n role=\"status\"\n aria-label=\"Loading message\"\n style={{\n paddingBlockStart: \"var(--size-2)\",\n marginBlockStart: \"var(--size-3)\",\n }}\n data-chromatic=\"ignore\"\n >\n {[0, 1, 2].map((i) => (\n <motion.div\n key={i}\n custom={i}\n variants={dotVariants}\n animate=\"bounce\"\n data-chromatic=\"ignore\"\n style={{\n width: \"8px\",\n height: \"8px\",\n borderRadius: \"50%\",\n background: \"var(--foreground-color-primary)\",\n }}\n />\n ))}\n </Flex>\n );\n};\n"],"names":[],"mappings":";;;;AAIA,MAAM,WAAA,GAAc;AAAA,EAClB,MAAA,EAAQ,CAAC,CAAA,MAAe;AAAA,IACtB,CAAA,EAAG,CAAC,CAAA,EAAG,GAAA,EAAK,CAAC,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,GAAA;AAAA,MACV,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,QAAA;AAAA,MACR,OAAO,CAAA,GAAI;AAAA;AACb,GACF;AACF,CAAA;AAEO,MAAM,SAAa,MAAM;AAC9B,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,iBAAA;AAAA,MACX,KAAA,EAAO;AAAA,QACL,iBAAA,EAAmB,eAAA;AAAA,QACnB,gBAAA,EAAkB;AAAA,OACpB;AAAA,MACA,gBAAA,EAAe,QAAA;AAAA,MAEd,WAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,qBACd,GAAA;AAAA,QAAC,MAAA,CAAO,GAAA;AAAA,QAAP;AAAA,UAEC,MAAA,EAAQ,CAAA;AAAA,UACR,QAAA,EAAU,WAAA;AAAA,UACV,OAAA,EAAQ,QAAA;AAAA,UACR,gBAAA,EAAe,QAAA;AAAA,UACf,KAAA,EAAO;AAAA,YACL,KAAA,EAAO,KAAA;AAAA,YACP,MAAA,EAAQ,KAAA;AAAA,YACR,YAAA,EAAc,KAAA;AAAA,YACd,UAAA,EAAY;AAAA;AACd,SAAA;AAAA,QAVK;AAAA,OAYR;AAAA;AAAA,GACH;AAEJ;;;;"}
1
+ {"version":3,"file":"loader-BF1xpasR.js","sources":["../src/components/loader/loader.tsx"],"sourcesContent":["import { FC } from \"react\";\nimport { easeInOut, motion } from \"framer-motion\";\nimport { Flex } from \"@servicetitan/anvil2\";\n\nconst dotVariants = {\n bounce: (i: number) => ({\n y: [0, -15, 0],\n transition: {\n duration: 1.2,\n ease: easeInOut,\n repeat: Infinity,\n delay: i * 0.15,\n },\n }),\n};\n\nexport const Loader: FC = () => {\n return (\n <Flex\n role=\"status\"\n aria-label=\"Loading message\"\n style={{\n paddingBlockStart: \"var(--size-2)\",\n marginBlockStart: \"var(--size-3)\",\n }}\n data-chromatic=\"ignore\"\n >\n {[0, 1, 2].map((i) => (\n <motion.div\n key={i}\n custom={i}\n variants={dotVariants}\n animate=\"bounce\"\n data-chromatic=\"ignore\"\n style={{\n width: \"8px\",\n height: \"8px\",\n borderRadius: \"50%\",\n background: \"var(--foreground-color-primary)\",\n }}\n />\n ))}\n </Flex>\n );\n};\n"],"names":[],"mappings":";;;;AAIA,MAAM,WAAA,GAAc;AAAA,EAClB,MAAA,EAAQ,CAAC,CAAA,MAAe;AAAA,IACtB,CAAA,EAAG,CAAC,CAAA,EAAG,GAAA,EAAK,CAAC,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,GAAA;AAAA,MACV,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,QAAA;AAAA,MACR,OAAO,CAAA,GAAI;AAAA;AACb,GACF;AACF,CAAA;AAEO,MAAM,SAAa,MAAM;AAC9B,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,iBAAA;AAAA,MACX,KAAA,EAAO;AAAA,QACL,iBAAA,EAAmB,eAAA;AAAA,QACnB,gBAAA,EAAkB;AAAA,OACpB;AAAA,MACA,gBAAA,EAAe,QAAA;AAAA,MAEd,WAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,qBACd,GAAA;AAAA,QAAC,MAAA,CAAO,GAAA;AAAA,QAAP;AAAA,UAEC,MAAA,EAAQ,CAAA;AAAA,UACR,QAAA,EAAU,WAAA;AAAA,UACV,OAAA,EAAQ,QAAA;AAAA,UACR,gBAAA,EAAe,QAAA;AAAA,UACf,KAAA,EAAO;AAAA,YACL,KAAA,EAAO,KAAA;AAAA,YACP,MAAA,EAAQ,KAAA;AAAA,YACR,YAAA,EAAc,KAAA;AAAA,YACd,UAAA,EAAY;AAAA;AACd,SAAA;AAAA,QAVK;AAAA,OAYR;AAAA;AAAA,GACH;AAEJ;;;;"}
package/dist/loader.js CHANGED
@@ -1,2 +1,3 @@
1
- export { L as Loader } from './loader-DYmcO1Y_.js';
1
+ export { L as Loader } from './loader-BF1xpasR.js';
2
+ export { P as PulseLoader } from './pulse-loader-DUrtKYC5.js';
2
3
  //# sourceMappingURL=loader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"loader.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -2,11 +2,11 @@ import { jsx } from 'react/jsx-runtime';
2
2
  import { M as Markdown, r as remarkGfm } from './index-DFEn2XpE.js';
3
3
 
4
4
  import './markdown-text.css';const styles = {
5
- "markdown-content": "_markdown-content_1mrdm_1"};
5
+ "markdown-content": "_markdown-content_p12r8_1"};
6
6
 
7
7
  const MarkdownText = ({ text = "" }) => {
8
8
  return /* @__PURE__ */ jsx("div", { className: styles["markdown-content"], children: /* @__PURE__ */ jsx(Markdown, { remarkPlugins: [remarkGfm], children: text }) });
9
9
  };
10
10
 
11
11
  export { MarkdownText as M };
12
- //# sourceMappingURL=markdown-text-BXCCdmOl.js.map
12
+ //# sourceMappingURL=markdown-text-CgCSN9q6.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-text-BXCCdmOl.js","sources":["../src/components/markdown-text/markdown-text.tsx"],"sourcesContent":["import { FC } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\n\nimport styles from \"./markdown-text.module.scss\";\n\nexport interface MarkdownTextProps {\n text: string;\n}\n\nexport const MarkdownText: FC<MarkdownTextProps> = ({ text = \"\" }) => {\n return (\n <div className={styles[\"markdown-content\"]}>\n <ReactMarkdown remarkPlugins={[remarkGfm]}>{text}</ReactMarkdown>\n </div>\n );\n};\n"],"names":["ReactMarkdown"],"mappings":";;;;;;AAUO,MAAM,YAAA,GAAsC,CAAC,EAAE,IAAA,GAAO,IAAG,KAAM;AACpE,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,kBAAkB,CAAA,EACvC,QAAA,kBAAA,GAAA,CAACA,QAAA,EAAA,EAAc,aAAA,EAAe,CAAC,SAAS,CAAA,EAAI,gBAAK,CAAA,EACnD,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"markdown-text-CgCSN9q6.js","sources":["../src/components/markdown-text/markdown-text.tsx"],"sourcesContent":["import { FC } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\n\nimport styles from \"./markdown-text.module.scss\";\n\nexport interface MarkdownTextProps {\n text: string;\n}\n\nexport const MarkdownText: FC<MarkdownTextProps> = ({ text = \"\" }) => {\n return (\n <div className={styles[\"markdown-content\"]}>\n <ReactMarkdown remarkPlugins={[remarkGfm]}>{text}</ReactMarkdown>\n </div>\n );\n};\n"],"names":["ReactMarkdown"],"mappings":";;;;;;AAUO,MAAM,YAAA,GAAsC,CAAC,EAAE,IAAA,GAAO,IAAG,KAAM;AACpE,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,kBAAkB,CAAA,EACvC,QAAA,kBAAA,GAAA,CAACA,QAAA,EAAA,EAAc,aAAA,EAAe,CAAC,SAAS,CAAA,EAAI,gBAAK,CAAA,EACnD,CAAA;AAEJ;;;;"}
@@ -1,45 +1,49 @@
1
1
  @layer starter, reset, base, state, application;
2
- ._markdown-content_1mrdm_1 h1,
3
- ._markdown-content_1mrdm_1 h2,
4
- ._markdown-content_1mrdm_1 h3,
5
- ._markdown-content_1mrdm_1 h4 {
2
+ ._markdown-content_p12r8_1 h1,
3
+ ._markdown-content_p12r8_1 h2,
4
+ ._markdown-content_p12r8_1 h3,
5
+ ._markdown-content_p12r8_1 h4 {
6
6
  font-size: 1rem;
7
7
  margin-top: 0;
8
8
  }
9
- ._markdown-content_1mrdm_1 p {
9
+ ._markdown-content_p12r8_1 p {
10
10
  margin: 0 0 var(--size-2);
11
11
  }
12
- ._markdown-content_1mrdm_1 pre {
12
+ ._markdown-content_p12r8_1 pre {
13
13
  background-color: var(--background-color-stronger);
14
14
  border-radius: var(--border-radius-large);
15
15
  padding: var(--size-4);
16
16
  overflow: auto;
17
17
  }
18
- ._markdown-content_1mrdm_1 code {
18
+ ._markdown-content_p12r8_1 code {
19
19
  background-color: var(--background-color-stronger);
20
20
  border-radius: var(--border-radius-large);
21
21
  padding: 0.2em 0.4em;
22
22
  font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace;
23
23
  }
24
- ._markdown-content_1mrdm_1 pre code {
24
+ ._markdown-content_p12r8_1 pre code {
25
25
  background-color: transparent;
26
26
  padding: 0;
27
27
  }
28
- ._markdown-content_1mrdm_1 ul,
29
- ._markdown-content_1mrdm_1 ol {
28
+ ._markdown-content_p12r8_1 ul,
29
+ ._markdown-content_p12r8_1 ol {
30
30
  padding-left: 2em;
31
31
  margin: 0 0 1em;
32
32
  }
33
- ._markdown-content_1mrdm_1 table {
33
+ ._markdown-content_p12r8_1 table {
34
34
  border-collapse: collapse;
35
- width: 100%;
35
+ display: block;
36
+ width: -moz-max-content;
37
+ width: max-content;
38
+ max-width: 100%;
39
+ overflow-x: auto;
36
40
  margin: 1em 0;
37
41
  }
38
- ._markdown-content_1mrdm_1 th,
39
- ._markdown-content_1mrdm_1 td {
42
+ ._markdown-content_p12r8_1 th,
43
+ ._markdown-content_p12r8_1 td {
40
44
  border: 1px solid var(--border-color-subdued);
41
45
  padding: 6px 13px;
42
46
  }
43
- ._markdown-content_1mrdm_1 th {
47
+ ._markdown-content_p12r8_1 th {
44
48
  background-color: var(--background-color-strong);
45
49
  }
@@ -1,2 +1,2 @@
1
- export { M as MarkdownText } from './markdown-text-BXCCdmOl.js';
1
+ export { M as MarkdownText } from './markdown-text-CgCSN9q6.js';
2
2
  //# sourceMappingURL=markdown-text.js.map
package/dist/messages.js CHANGED
@@ -1,2 +1,2 @@
1
- export { A as AssistantMessage, E as ErrorMessage, M as MarkdownMessage, S as SmallAction, a as SystemMessage, T as Thinking, U as UserMessage } from './user-message-BFrCI10z.js';
1
+ export { A as AssistantMessage, E as ErrorMessage, M as MarkdownMessage, S as SmallAction, a as SystemMessage, T as Thinking, U as UserMessage } from './user-message-BqWF67vX.js';
2
2
  //# sourceMappingURL=messages.js.map
@@ -1,6 +1,6 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { Card, Flex, Text } from '@servicetitan/anvil2';
3
- import { M as MarkdownText } from './markdown-text-BXCCdmOl.js';
3
+ import { M as MarkdownText } from './markdown-text-CgCSN9q6.js';
4
4
 
5
5
  const NotificationCard = ({
6
6
  title,
@@ -64,4 +64,4 @@ const NotificationCard = ({
64
64
  };
65
65
 
66
66
  export { NotificationCard as N };
67
- //# sourceMappingURL=notification-card-CdQVC1kO.js.map
67
+ //# sourceMappingURL=notification-card-DMnEZI0Q.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"notification-card-CdQVC1kO.js","sources":["../src/components/notification-card/notification-card.tsx"],"sourcesContent":["import { FC } from \"react\";\nimport { Card, Flex, Text } from \"@servicetitan/anvil2\";\n\nimport { MarkdownText } from \"../markdown-text\";\n\ninterface NotificationCardProps {\n title: string;\n message: string;\n timestamp: string;\n unread?: boolean;\n onClick?: () => void;\n}\n\nexport const NotificationCard: FC<NotificationCardProps> = ({\n title,\n message,\n timestamp,\n onClick,\n unread = false,\n}) => {\n return (\n <Card\n onClick={onClick}\n style={{\n cursor: \"pointer\",\n }}\n >\n <Flex direction=\"column\" gap={2} style={{ width: \"100%\" }}>\n <Flex alignItems=\"center\" justifyContent=\"space-between\">\n <Text\n size=\"medium\"\n style={{\n color: \"var(--foreground-color-primary)\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n width: \"75%\",\n }}\n >\n {unread ? <b>{title}</b> : title}\n </Text>\n <Flex alignItems=\"center\" gap={1}>\n <Text\n size=\"small\"\n style={{ color: \"var(--foreground-color-subdued)\" }}\n >\n {timestamp}\n {unread && (\n <span\n style={{\n display: \"inline-block\",\n width: 12,\n height: 12,\n borderRadius: \"50%\",\n background: \"var(--background-color-danger)\",\n marginLeft: 8,\n }}\n aria-label=\"Unread notification\"\n />\n )}\n </Text>\n </Flex>\n </Flex>\n\n <Text size=\"small\" style={{ color: \"var(--foreground-color-subdued)\" }}>\n {unread ? (\n <b>\n <MarkdownText text={message} />\n </b>\n ) : (\n <MarkdownText text={message} />\n )}\n </Text>\n </Flex>\n </Card>\n );\n};\n"],"names":[],"mappings":";;;;AAaO,MAAM,mBAA8C,CAAC;AAAA,EAC1D,KAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA,GAAS;AACX,CAAA,KAAM;AACJ,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ;AAAA,OACV;AAAA,MAEA,QAAA,kBAAA,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,GAAA,EAAK,GAAG,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAO,EACtD,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,IAAA,EAAA,EAAK,UAAA,EAAW,QAAA,EAAS,cAAA,EAAe,eAAA,EACvC,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,KAAA,EAAO;AAAA,gBACL,KAAA,EAAO,iCAAA;AAAA,gBACP,UAAA,EAAY,QAAA;AAAA,gBACZ,QAAA,EAAU,QAAA;AAAA,gBACV,YAAA,EAAc,UAAA;AAAA,gBACd,KAAA,EAAO;AAAA,eACT;AAAA,cAEC,QAAA,EAAA,MAAA,mBAAS,GAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,KAAA,EAAM,CAAA,GAAO;AAAA;AAAA,WAC7B;AAAA,0BACA,GAAA,CAAC,IAAA,EAAA,EAAK,UAAA,EAAW,QAAA,EAAS,KAAK,CAAA,EAC7B,QAAA,kBAAA,IAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,OAAA;AAAA,cACL,KAAA,EAAO,EAAE,KAAA,EAAO,iCAAA,EAAkC;AAAA,cAEjD,QAAA,EAAA;AAAA,gBAAA,SAAA;AAAA,gBACA,MAAA,oBACC,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAO;AAAA,sBACL,OAAA,EAAS,cAAA;AAAA,sBACT,KAAA,EAAO,EAAA;AAAA,sBACP,MAAA,EAAQ,EAAA;AAAA,sBACR,YAAA,EAAc,KAAA;AAAA,sBACd,UAAA,EAAY,gCAAA;AAAA,sBACZ,UAAA,EAAY;AAAA,qBACd;AAAA,oBACA,YAAA,EAAW;AAAA;AAAA;AACb;AAAA;AAAA,WAEJ,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBAEA,GAAA,CAAC,QAAK,IAAA,EAAK,OAAA,EAAQ,OAAO,EAAE,KAAA,EAAO,iCAAA,EAAkC,EAClE,QAAA,EAAA,MAAA,mBACC,GAAA,CAAC,OACC,QAAA,kBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,MAAM,OAAA,EAAS,CAAA,EAC/B,oBAEA,GAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAM,OAAA,EAAS,CAAA,EAEjC;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;;;;"}
1
+ {"version":3,"file":"notification-card-DMnEZI0Q.js","sources":["../src/components/notification-card/notification-card.tsx"],"sourcesContent":["import { FC } from \"react\";\nimport { Card, Flex, Text } from \"@servicetitan/anvil2\";\n\nimport { MarkdownText } from \"../markdown-text\";\n\ninterface NotificationCardProps {\n title: string;\n message: string;\n timestamp: string;\n unread?: boolean;\n onClick?: () => void;\n}\n\nexport const NotificationCard: FC<NotificationCardProps> = ({\n title,\n message,\n timestamp,\n onClick,\n unread = false,\n}) => {\n return (\n <Card\n onClick={onClick}\n style={{\n cursor: \"pointer\",\n }}\n >\n <Flex direction=\"column\" gap={2} style={{ width: \"100%\" }}>\n <Flex alignItems=\"center\" justifyContent=\"space-between\">\n <Text\n size=\"medium\"\n style={{\n color: \"var(--foreground-color-primary)\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n width: \"75%\",\n }}\n >\n {unread ? <b>{title}</b> : title}\n </Text>\n <Flex alignItems=\"center\" gap={1}>\n <Text\n size=\"small\"\n style={{ color: \"var(--foreground-color-subdued)\" }}\n >\n {timestamp}\n {unread && (\n <span\n style={{\n display: \"inline-block\",\n width: 12,\n height: 12,\n borderRadius: \"50%\",\n background: \"var(--background-color-danger)\",\n marginLeft: 8,\n }}\n aria-label=\"Unread notification\"\n />\n )}\n </Text>\n </Flex>\n </Flex>\n\n <Text size=\"small\" style={{ color: \"var(--foreground-color-subdued)\" }}>\n {unread ? (\n <b>\n <MarkdownText text={message} />\n </b>\n ) : (\n <MarkdownText text={message} />\n )}\n </Text>\n </Flex>\n </Card>\n );\n};\n"],"names":[],"mappings":";;;;AAaO,MAAM,mBAA8C,CAAC;AAAA,EAC1D,KAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA,GAAS;AACX,CAAA,KAAM;AACJ,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ;AAAA,OACV;AAAA,MAEA,QAAA,kBAAA,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,GAAA,EAAK,GAAG,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAO,EACtD,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,IAAA,EAAA,EAAK,UAAA,EAAW,QAAA,EAAS,cAAA,EAAe,eAAA,EACvC,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,KAAA,EAAO;AAAA,gBACL,KAAA,EAAO,iCAAA;AAAA,gBACP,UAAA,EAAY,QAAA;AAAA,gBACZ,QAAA,EAAU,QAAA;AAAA,gBACV,YAAA,EAAc,UAAA;AAAA,gBACd,KAAA,EAAO;AAAA,eACT;AAAA,cAEC,QAAA,EAAA,MAAA,mBAAS,GAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,KAAA,EAAM,CAAA,GAAO;AAAA;AAAA,WAC7B;AAAA,0BACA,GAAA,CAAC,IAAA,EAAA,EAAK,UAAA,EAAW,QAAA,EAAS,KAAK,CAAA,EAC7B,QAAA,kBAAA,IAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,OAAA;AAAA,cACL,KAAA,EAAO,EAAE,KAAA,EAAO,iCAAA,EAAkC;AAAA,cAEjD,QAAA,EAAA;AAAA,gBAAA,SAAA;AAAA,gBACA,MAAA,oBACC,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAO;AAAA,sBACL,OAAA,EAAS,cAAA;AAAA,sBACT,KAAA,EAAO,EAAA;AAAA,sBACP,MAAA,EAAQ,EAAA;AAAA,sBACR,YAAA,EAAc,KAAA;AAAA,sBACd,UAAA,EAAY,gCAAA;AAAA,sBACZ,UAAA,EAAY;AAAA,qBACd;AAAA,oBACA,YAAA,EAAW;AAAA;AAAA;AACb;AAAA;AAAA,WAEJ,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBAEA,GAAA,CAAC,QAAK,IAAA,EAAK,OAAA,EAAQ,OAAO,EAAE,KAAA,EAAO,iCAAA,EAAkC,EAClE,QAAA,EAAA,MAAA,mBACC,GAAA,CAAC,OACC,QAAA,kBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,MAAM,OAAA,EAAS,CAAA,EAC/B,oBAEA,GAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAM,OAAA,EAAS,CAAA,EAEjC;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;;;;"}
@@ -1,2 +1,2 @@
1
- export { N as NotificationCard } from './notification-card-CdQVC1kO.js';
1
+ export { N as NotificationCard } from './notification-card-DMnEZI0Q.js';
2
2
  //# sourceMappingURL=notification-card.js.map
@@ -9924,5 +9924,5 @@ const featureBundle = {
9924
9924
 
9925
9925
  const motion = /*@__PURE__*/ createMotionProxy(featureBundle, createDomVisualElement);
9926
9926
 
9927
- export { easeInOut as e, motion as m };
9928
- //# sourceMappingURL=proxy-B3m3ViIw.js.map
9927
+ export { LayoutGroupContext as L, MotionConfigContext as M, PresenceContext as P, usePresence as a, useIsomorphicLayoutEffect as b, easeInOut as e, isHTMLElement as i, motion as m, useConstant as u };
9928
+ //# sourceMappingURL=proxy-BJr91CAa.js.map