@mieweb/ui 0.3.0-dev.75 → 0.3.0-dev.76

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 (104) hide show
  1. package/dist/brands/bluehive.cjs +3 -3
  2. package/dist/brands/bluehive.js +1 -1
  3. package/dist/brands/index.cjs +14 -14
  4. package/dist/brands/index.js +7 -7
  5. package/dist/brands/ozwell.cjs +2 -2
  6. package/dist/brands/ozwell.js +1 -1
  7. package/dist/brands/waggleline.css +1 -1
  8. package/dist/{chunk-OWPWP46L.js → chunk-2NTYAALC.js} +3 -3
  9. package/dist/{chunk-OWPWP46L.js.map → chunk-2NTYAALC.js.map} +1 -1
  10. package/dist/{chunk-S6UNPMAS.cjs → chunk-66S4PT6C.cjs} +3 -3
  11. package/dist/{chunk-S6UNPMAS.cjs.map → chunk-66S4PT6C.cjs.map} +1 -1
  12. package/dist/{chunk-WDIPJLWW.cjs → chunk-EAXY5X33.cjs} +6 -6
  13. package/dist/{chunk-WDIPJLWW.cjs.map → chunk-EAXY5X33.cjs.map} +1 -1
  14. package/dist/{chunk-G7ZHQA4O.cjs → chunk-FAF3RDHY.cjs} +4 -4
  15. package/dist/{chunk-G7ZHQA4O.cjs.map → chunk-FAF3RDHY.cjs.map} +1 -1
  16. package/dist/{chunk-UHSPAFY6.js → chunk-GFZNSSSN.js} +3 -3
  17. package/dist/{chunk-UHSPAFY6.js.map → chunk-GFZNSSSN.js.map} +1 -1
  18. package/dist/{chunk-Z3TFPXVN.cjs → chunk-GXQFRLTN.cjs} +3 -3
  19. package/dist/{chunk-Z3TFPXVN.cjs.map → chunk-GXQFRLTN.cjs.map} +1 -1
  20. package/dist/{chunk-4DJNHPHB.js → chunk-IGWABMSM.js} +3 -3
  21. package/dist/{chunk-4DJNHPHB.js.map → chunk-IGWABMSM.js.map} +1 -1
  22. package/dist/{chunk-CHMMHFOW.cjs → chunk-IWU7H3YS.cjs} +4 -4
  23. package/dist/chunk-IWU7H3YS.cjs.map +1 -0
  24. package/dist/{chunk-QBFNONJD.js → chunk-J3BU3JBX.js} +6 -4
  25. package/dist/chunk-J3BU3JBX.js.map +1 -0
  26. package/dist/{chunk-Y4MW76JW.js → chunk-JV7UJGBM.js} +6 -6
  27. package/dist/{chunk-Y4MW76JW.js.map → chunk-JV7UJGBM.js.map} +1 -1
  28. package/dist/{chunk-C6MDPPPL.js → chunk-JW5GWKV7.js} +3 -3
  29. package/dist/{chunk-C6MDPPPL.js.map → chunk-JW5GWKV7.js.map} +1 -1
  30. package/dist/{chunk-AL6ASCL6.js → chunk-JWUVVPKM.js} +4 -4
  31. package/dist/chunk-JWUVVPKM.js.map +1 -0
  32. package/dist/{chunk-HT3SXDFF.cjs → chunk-NIEIRA5A.cjs} +6 -4
  33. package/dist/chunk-NIEIRA5A.cjs.map +1 -0
  34. package/dist/{chunk-4LTN2LEN.js → chunk-PSTGFXQG.js} +3 -3
  35. package/dist/{chunk-4LTN2LEN.js.map → chunk-PSTGFXQG.js.map} +1 -1
  36. package/dist/{chunk-4LNS5QDP.cjs → chunk-QITBJX4A.cjs} +3 -3
  37. package/dist/{chunk-4LNS5QDP.cjs.map → chunk-QITBJX4A.cjs.map} +1 -1
  38. package/dist/{chunk-KEIA2G6O.cjs → chunk-QO6U5VOT.cjs} +3 -3
  39. package/dist/{chunk-KEIA2G6O.cjs.map → chunk-QO6U5VOT.cjs.map} +1 -1
  40. package/dist/{chunk-LUVSO5LK.js → chunk-WSOJA67K.js} +4 -4
  41. package/dist/{chunk-LUVSO5LK.js.map → chunk-WSOJA67K.js.map} +1 -1
  42. package/dist/{chunk-35J4B3ZK.cjs → chunk-WZBCK7KG.cjs} +3 -3
  43. package/dist/chunk-WZBCK7KG.cjs.map +1 -0
  44. package/dist/{chunk-O5HS7ZND.cjs → chunk-X7S76WB7.cjs} +3 -3
  45. package/dist/{chunk-O5HS7ZND.cjs.map → chunk-X7S76WB7.cjs.map} +1 -1
  46. package/dist/{chunk-ULOA7WBW.js → chunk-XB7QCKK7.js} +3 -3
  47. package/dist/{chunk-ULOA7WBW.js.map → chunk-XB7QCKK7.js.map} +1 -1
  48. package/dist/{chunk-T4AO7KYK.js → chunk-YDJUUR4Y.js} +3 -3
  49. package/dist/chunk-YDJUUR4Y.js.map +1 -0
  50. package/dist/{chunk-SWV5E75F.cjs → chunk-Z5J4NTPL.cjs} +3 -3
  51. package/dist/{chunk-SWV5E75F.cjs.map → chunk-Z5J4NTPL.cjs.map} +1 -1
  52. package/dist/components/Avatar/index.cjs +5 -5
  53. package/dist/components/Avatar/index.js +1 -1
  54. package/dist/components/Card/index.cjs +15 -15
  55. package/dist/components/Card/index.d.cts +6 -2
  56. package/dist/components/Card/index.d.ts +6 -2
  57. package/dist/components/Card/index.js +1 -1
  58. package/dist/components/Pagination/index.cjs +4 -4
  59. package/dist/components/Pagination/index.d.cts +6 -2
  60. package/dist/components/Pagination/index.d.ts +6 -2
  61. package/dist/components/Pagination/index.js +1 -1
  62. package/dist/default-BTEIFIZJ.cjs +18 -0
  63. package/dist/{default-ZGHKI5WF.cjs.map → default-BTEIFIZJ.cjs.map} +1 -1
  64. package/dist/default-ORBRVZRZ.js +3 -0
  65. package/dist/{default-LIRPABBK.js.map → default-ORBRVZRZ.js.map} +1 -1
  66. package/dist/index.cjs +176 -175
  67. package/dist/index.cjs.map +1 -1
  68. package/dist/index.d.cts +5 -3
  69. package/dist/index.d.ts +5 -3
  70. package/dist/index.js +20 -19
  71. package/dist/index.js.map +1 -1
  72. package/dist/mieweb-4XR6UKDQ.cjs +18 -0
  73. package/dist/{mieweb-UJABK5XX.cjs.map → mieweb-4XR6UKDQ.cjs.map} +1 -1
  74. package/dist/mieweb-N6UMH4MU.js +3 -0
  75. package/dist/{mieweb-PV2YKYO7.js.map → mieweb-N6UMH4MU.js.map} +1 -1
  76. package/dist/ozwell.cjs +1 -1
  77. package/dist/ozwell.cjs.map +1 -1
  78. package/dist/ozwell.js +1 -1
  79. package/dist/ozwell.js.map +1 -1
  80. package/dist/tailwind-preset.cjs +4 -4
  81. package/dist/tailwind-preset.js +1 -1
  82. package/dist/waggleline-2MLRNVCV.js +3 -0
  83. package/dist/{waggleline-BMUYAFJF.js.map → waggleline-2MLRNVCV.js.map} +1 -1
  84. package/dist/waggleline-I7QWD3YX.cjs +18 -0
  85. package/dist/{waggleline-6IGA66HR.cjs.map → waggleline-I7QWD3YX.cjs.map} +1 -1
  86. package/dist/webchart-F6EIMC3I.js +3 -0
  87. package/dist/{webchart-2SLO5ICI.js.map → webchart-F6EIMC3I.js.map} +1 -1
  88. package/dist/webchart-H3BHYNHB.cjs +18 -0
  89. package/dist/{webchart-EHVGP46N.cjs.map → webchart-H3BHYNHB.cjs.map} +1 -1
  90. package/package.json +1 -1
  91. package/dist/chunk-35J4B3ZK.cjs.map +0 -1
  92. package/dist/chunk-AL6ASCL6.js.map +0 -1
  93. package/dist/chunk-CHMMHFOW.cjs.map +0 -1
  94. package/dist/chunk-HT3SXDFF.cjs.map +0 -1
  95. package/dist/chunk-QBFNONJD.js.map +0 -1
  96. package/dist/chunk-T4AO7KYK.js.map +0 -1
  97. package/dist/default-LIRPABBK.js +0 -3
  98. package/dist/default-ZGHKI5WF.cjs +0 -18
  99. package/dist/mieweb-PV2YKYO7.js +0 -3
  100. package/dist/mieweb-UJABK5XX.cjs +0 -18
  101. package/dist/waggleline-6IGA66HR.cjs +0 -18
  102. package/dist/waggleline-BMUYAFJF.js +0 -3
  103. package/dist/webchart-2SLO5ICI.js +0 -3
  104. package/dist/webchart-EHVGP46N.cjs +0 -18
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var chunk66S4PT6C_cjs = require('./chunk-66S4PT6C.cjs');
6
+
7
+
8
+
9
+ Object.defineProperty(exports, "default", {
10
+ enumerable: true,
11
+ get: function () { return chunk66S4PT6C_cjs.miewebBrand; }
12
+ });
13
+ Object.defineProperty(exports, "miewebBrand", {
14
+ enumerable: true,
15
+ get: function () { return chunk66S4PT6C_cjs.miewebBrand; }
16
+ });
17
+ //# sourceMappingURL=mieweb-4XR6UKDQ.cjs.map
18
+ //# sourceMappingURL=mieweb-4XR6UKDQ.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"mieweb-UJABK5XX.cjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"mieweb-4XR6UKDQ.cjs"}
@@ -0,0 +1,3 @@
1
+ export { miewebBrand as default, miewebBrand } from './chunk-GFZNSSSN.js';
2
+ //# sourceMappingURL=mieweb-N6UMH4MU.js.map
3
+ //# sourceMappingURL=mieweb-N6UMH4MU.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"mieweb-PV2YKYO7.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"mieweb-N6UMH4MU.js"}
package/dist/ozwell.cjs CHANGED
@@ -71,7 +71,7 @@ var THEME_OVERRIDES_CSS = `
71
71
 
72
72
  /* --- Unread badge --- */
73
73
  .ozwell-unread-badge {
74
- background: var(--mieweb-destructive, #ef4444) !important;
74
+ background: var(--mieweb-destructive, #dc2626) !important;
75
75
  border-color: var(--mieweb-background, #ffffff) !important;
76
76
  }
77
77
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/AI/OzwellWidget.tsx"],"names":["React","jsx","OzwellChat"],"mappings":"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","file":"ozwell.cjs","sourcesContent":["/**\n * OzwellWidget - MIE-branded wrapper around @ozwell/react's OzwellChat\n *\n * Provides the official Ozwell AI chat widget with MIE brand defaults.\n * This is a real, working AI chat — not a mock. It requires a valid\n * API endpoint and key to function.\n *\n * @example\n * ```tsx\n * // Agent key mode (recommended)\n * <OzwellWidget apiKey=\"agnt_key-your-agent-key\" />\n *\n * // Custom endpoint mode\n * <OzwellWidget\n * endpoint=\"https://ozwell-dev-refserver.opensource.mieweb.org/v1/chat/completions\"\n * apiKey=\"agnt_key-your-key\"\n * onToolCall={(tool, args, sendResult) => {\n * sendResult({ success: true });\n * }}\n * />\n * ```\n */\nimport * as React from 'react';\nimport { OzwellChat, useOzwell } from '@ozwell/react';\nimport type {\n OzwellChatProps,\n OzwellTool,\n OzwellToolFunction,\n OzwellToolParameter,\n OzwellError,\n UseOzwellReturn,\n} from '@ozwell/react';\n\n/** Default Ozwell dev reference server base */\nconst DEV_SERVER = 'https://ozwell-dev-refserver.opensource.mieweb.org';\n\n/** Default chat completions endpoint */\nconst DEFAULT_ENDPOINT = `${DEV_SERVER}/v1/chat/completions`;\n\n/** Default widget URL — the loader script is derived from this */\nconst DEFAULT_WIDGET_URL = `${DEV_SERVER}/embed/ozwell-chat.html`;\n\n/** Ozwell brand primary color */\nconst OZWELL_PRIMARY = '#27aae1';\n\n/**\n * Inline fallback icon — a lightweight Ozwell \"O\" circle in brand blue.\n * The full 900 KB mascot SVG cannot be inlined; this simple glyph is used\n * when the loader's default /favicon.ico 404s and no custom iconSrc is given.\n */\nconst OZWELL_ICON_FALLBACK =\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Ccircle cx='32' cy='32' r='32' fill='%2327aae1'/%3E%3Ctext x='32' y='44' text-anchor='middle' font-size='36' font-family='system-ui,sans-serif' font-weight='700' fill='white'%3EO%3C/text%3E%3C/svg%3E\";\n\n/**\n * Theme-aware CSS overrides for the ozwell-loader's default UI.\n * The loader injects hardcoded colors (#0066ff). These overrides\n * bind to --mieweb-* CSS custom properties so the widget automatically\n * inherits the active brand theme and dark/light mode.\n */\nconst THEME_OVERRIDES_ID = 'ozwell-mieweb-theme-overrides';\nconst THEME_OVERRIDES_CSS = `\n /* ============================\n Ozwell Widget – MIE UI Theme Overrides\n Uses --mieweb-* design tokens for brand + dark mode support.\n ============================ */\n\n /* --- Floating chat button --- */\n @keyframes ozwellFloat {\n 0% { transform: translateY(0) rotate(0deg); }\n 10% { transform: translateY(-5px) rotate(-2deg); }\n 20% { transform: translateY(3px) rotate(3deg); }\n 30% { transform: translateY(-2px) rotate(-1deg); }\n 40% { transform: translateY(4px) rotate(2deg); }\n 50% { transform: translateY(0) rotate(0deg); }\n 60% { transform: translateY(-4px) rotate(2deg); }\n 70% { transform: translateY(2px) rotate(-3deg); }\n 80% { transform: translateY(5px) rotate(1deg); }\n 90% { transform: translateY(-3px) rotate(-2deg); }\n 100% { transform: translateY(0) rotate(0deg); }\n }\n .ozwell-chat-button {\n background: color-mix(in srgb, var(--mieweb-primary-500, #27aae1) 45%, transparent) !important;\n box-shadow: 0 4px 16px color-mix(in srgb, var(--mieweb-primary-500, #27aae1) 30%, transparent) !important;\n animation: ozwellFloat 15s ease-in-out infinite !important;\n }\n .ozwell-chat-button:hover {\n background: color-mix(in srgb, var(--mieweb-primary-500, #27aae1) 65%, transparent) !important;\n box-shadow: 0 6px 20px color-mix(in srgb, var(--mieweb-primary-500, #27aae1) 40%, transparent) !important;\n animation-play-state: paused !important;\n }\n\n /* --- Accessibility: respect reduced-motion preference --- */\n @media (prefers-reduced-motion: reduce) {\n .ozwell-chat-button {\n animation: none !important;\n }\n }\n\n /* --- Unread badge --- */\n .ozwell-unread-badge {\n background: var(--mieweb-destructive, #ef4444) !important;\n border-color: var(--mieweb-background, #ffffff) !important;\n }\n\n /* --- Chat window wrapper --- */\n .ozwell-chat-wrapper {\n background: var(--mieweb-card, #ffffff) !important;\n border-color: var(--mieweb-border, #e5e7eb) !important;\n box-shadow: var(--mieweb-shadow-modal, 0 10px 15px -3px rgb(0 0 0 / 0.1)) !important;\n }\n\n /* --- Header bar --- */\n .ozwell-chat-header {\n background: var(--mieweb-primary-500, #27aae1) !important;\n color: var(--mieweb-primary-foreground, #ffffff) !important;\n }\n\n /* --- Header title --- */\n .ozwell-chat-title {\n color: inherit !important;\n font-family: var(--mieweb-font-sans, inherit) !important;\n }\n\n /* --- Hide / minimize button --- */\n .ozwell-hide-btn {\n color: var(--mieweb-primary-foreground, #ffffff) !important;\n opacity: 0.85;\n }\n .ozwell-hide-btn:hover {\n opacity: 1;\n background: color-mix(in srgb, var(--mieweb-primary-foreground, #ffffff) 15%, transparent) !important;\n }\n\n /* --- Chat icon size --- */\n .ozwell-chat-icon {\n width: 56px !important;\n height: 56px !important;\n }\n`;\n\n/**\n * Reads the current --mieweb-* design-token values from the parent page\n * and returns CSS text that maps the widget's hardcoded colors to the\n * active brand + dark/light mode. Injected into the iframe's <head>.\n */\nfunction buildIframeThemeCSS(): string {\n const root = document.documentElement;\n const get = (v: string, fallback: string) =>\n getComputedStyle(root).getPropertyValue(v).trim() || fallback;\n\n const bg = get('--mieweb-background', '#ffffff');\n const fg = get('--mieweb-foreground', '#171717');\n const card = get('--mieweb-card', '#ffffff');\n const cardFg = get('--mieweb-card-foreground', '#171717');\n const muted = get('--mieweb-muted', '#f5f5f5');\n const mutedFg = get('--mieweb-muted-foreground', '#737373');\n const border = get('--mieweb-border', '#e5e7eb');\n const input = get('--mieweb-input', '#e5e7eb');\n const primary = get('--mieweb-primary-500', '#27aae1');\n const primaryFg = get('--mieweb-primary-foreground', '#ffffff');\n const ring = get('--mieweb-ring', '#27aae1');\n const fontSans = get(\n '--mieweb-font-sans',\n \"'Nunito', ui-sans-serif, system-ui, sans-serif\"\n );\n\n return `\n /* MIE UI iframe theme overrides — regenerated on theme change */\n\n /* --- Layout --- */\n body, .chat-container {\n background: ${bg} !important;\n color: ${fg} !important;\n font-family: ${fontSans} !important;\n }\n\n /* --- Status strip --- */\n .status-strip {\n background: ${muted} !important;\n border-color: ${border} !important;\n }\n .status { color: ${mutedFg} !important; }\n\n /* --- Reasoning controls --- */\n .reasoning-capsule {\n background: ${muted} !important;\n color: ${fg} !important;\n border-color: ${border} !important;\n }\n .reasoning-seg {\n background: ${card} !important;\n border-color: ${border} !important;\n }\n .reasoning-seg-btn {\n color: ${mutedFg} !important;\n }\n .reasoning-seg-btn.active {\n background: ${primary} !important;\n color: ${primaryFg} !important;\n }\n\n /* --- Messages --- */\n .messages { background: ${bg} !important; }\n\n .message.user {\n background: ${primary} !important;\n color: ${primaryFg} !important;\n }\n .message.assistant {\n background: ${card} !important;\n color: ${cardFg} !important;\n border: 1px solid ${border} !important;\n }\n .message.system {\n background: ${muted} !important;\n color: ${fg} !important;\n }\n .message.welcome {\n background: ${card} !important;\n color: ${mutedFg} !important;\n border-color: ${border} !important;\n }\n .message.queued {\n border-color: ${border} !important;\n color: ${mutedFg} !important;\n }\n\n /* --- Input area --- */\n .chat-form {\n background: ${bg} !important;\n border-top: 1px solid ${border} !important;\n }\n .chat-input {\n background: ${input} !important;\n color: ${fg} !important;\n border-color: ${border} !important;\n font-family: ${fontSans} !important;\n }\n .chat-input::placeholder { color: ${mutedFg} !important; }\n .chat-input:focus {\n border-color: ${ring} !important;\n box-shadow: 0 0 0 2px ${ring}33 !important;\n }\n\n /* --- Send button --- */\n .chat-submit {\n background: ${primary} !important;\n color: ${primaryFg} !important;\n }\n .chat-submit:hover {\n filter: brightness(1.1) !important;\n }\n .chat-submit:disabled {\n background: ${muted} !important;\n color: ${mutedFg} !important;\n filter: none !important;\n }\n\n /* --- Footer --- */\n .chat-footer {\n background: ${muted} !important;\n color: ${mutedFg} !important;\n border-color: ${border} !important;\n }\n\n /* --- Tool pills (debug mode) --- */\n .tool-pill {\n background: color-mix(in srgb, ${primary} 15%, ${bg}) !important;\n color: ${fg} !important;\n border-color: ${border} !important;\n }\n .tool-details {\n background: ${card} !important;\n border-color: ${border} !important;\n }\n .tool-details-header {\n background: ${muted} !important;\n color: ${fg} !important;\n }\n .tool-details-content {\n color: ${cardFg} !important;\n }\n\n /* --- Thinking bubble --- */\n .thinking-bubble { color: ${fg} !important; }\n .thinking-content {\n background: ${muted} !important;\n border-color: ${border} !important;\n color: ${mutedFg} !important;\n }\n\n /* --- Queued message actions --- */\n .queued-input {\n background: ${input} !important;\n color: ${fg} !important;\n border-color: ${border} !important;\n }\n\n /* --- Scrollbar (WebKit) --- */\n ::-webkit-scrollbar { width: 6px; }\n ::-webkit-scrollbar-track { background: ${bg}; }\n ::-webkit-scrollbar-thumb {\n background: ${border};\n border-radius: 3px;\n }\n `;\n}\n\nexport type OzwellWidgetProps = OzwellChatProps & {\n /**\n * Custom icon URL for the static (non-animated) chat launcher button.\n * Used as a fallback when the loader's default icon fails to load.\n * Defaults to a lightweight inline Ozwell \"O\" glyph.\n */\n iconSrc?: string;\n};\n\nexport function OzwellWidget({\n endpoint = DEFAULT_ENDPOINT,\n widgetUrl = DEFAULT_WIDGET_URL,\n primaryColor = OZWELL_PRIMARY,\n theme = 'auto',\n iconSrc = OZWELL_ICON_FALLBACK,\n ...rest\n}: OzwellWidgetProps) {\n // Clean up ozwell-loader DOM artifacts on unmount.\n // The vanilla loader injects a fixed-position button, chat wrapper, iframe,\n // and style tags directly into document.body — none of which get removed\n // when the React component unmounts. Without this, the button persists\n // across Storybook story navigation (or any SPA route change).\n React.useEffect(() => {\n return () => {\n // Remove loader-injected DOM elements\n for (const id of [\n 'ozwell-chat-button',\n 'ozwell-chat-wrapper',\n 'ozwell-default-ui-styles',\n ]) {\n document.getElementById(id)?.remove();\n }\n // Remove the loader script tag so it can be re-injected fresh\n document.querySelector('script[src*=\"ozwell-loader.js\"]')?.remove();\n // Remove the iframe (may not have an ID)\n document\n .querySelector(\n 'iframe[title=\"Ozwell Chat\"], iframe[title=\"Ozwell Assistant\"]'\n )\n ?.remove();\n // Clear global state so next mount starts fresh\n delete (window as unknown as Record<string, unknown>).OzwellChat;\n delete (window as unknown as Record<string, unknown>).OzwellChatConfig;\n };\n }, []);\n\n // Inject MIE UI theme overrides so the widget inherits brand tokens.\n // This <style> tag overrides the ozwell-loader's hardcoded colors\n // with --mieweb-* CSS custom properties, enabling brand + dark mode.\n // Not removed on unmount — idempotent CSS safe to leave in place,\n // prevents multi-instance bugs when one widget unmounts while another is live.\n React.useEffect(() => {\n if (document.getElementById(THEME_OVERRIDES_ID)) return;\n const style = document.createElement('style');\n style.id = THEME_OVERRIDES_ID;\n style.textContent = THEME_OVERRIDES_CSS;\n document.head.appendChild(style);\n }, []);\n\n // Fix broken launcher icon — the loader hardcodes src=\"/favicon.ico\" which\n // 404s when hosted on a different origin (e.g. Storybook). Replace with the\n // Ozwell brand icon from the design system.\n React.useEffect(() => {\n // The button is created asynchronously by the loader script, so poll briefly.\n // Once the icon element is found and handled, stop polling immediately.\n const timer = setInterval(() => {\n const img = document.querySelector(\n '#ozwell-chat-button .ozwell-chat-icon'\n ) as HTMLImageElement | null;\n if (!img || img.tagName !== 'IMG') return;\n\n // Found the icon — stop polling\n clearInterval(timer);\n clearTimeout(timeout);\n\n img.onerror = () => {\n img.src = iconSrc;\n img.onerror = null; // prevent infinite loop\n };\n // If already broken (naturalWidth 0), fix immediately\n if (img.complete && img.naturalWidth === 0) {\n img.src = iconSrc;\n }\n }, 200);\n const timeout = setTimeout(() => clearInterval(timer), 5000);\n return () => {\n clearInterval(timer);\n clearTimeout(timeout);\n };\n }, [iconSrc]);\n\n // Inject theme-aware CSS into the Ozwell iframe. The iframe content has\n // hardcoded colors (#0066ff, #ffffff, etc.) with no dark mode or theming.\n // Since it uses srcdoc it is same-origin, so we can access contentDocument.\n // We read --mieweb-* token values from the parent and inject them as\n // literal colors, then re-inject whenever the parent theme changes.\n React.useEffect(() => {\n const IFRAME_STYLE_ID = 'ozwell-mieweb-iframe-theme';\n\n /** Find the ozwell iframe in the parent DOM */\n const findIframe = () =>\n document.querySelector(\n 'iframe[title=\"Ozwell Chat\"], iframe[title=\"Ozwell Assistant\"]'\n ) as HTMLIFrameElement | null;\n\n /** Inject (or replace) the theme CSS inside the iframe */\n const injectTheme = () => {\n const iframe = findIframe();\n const doc = iframe?.contentDocument;\n if (!doc) return;\n let style = doc.getElementById(\n IFRAME_STYLE_ID\n ) as HTMLStyleElement | null;\n if (!style) {\n style = doc.createElement('style');\n style.id = IFRAME_STYLE_ID;\n doc.head.appendChild(style);\n }\n style.textContent = buildIframeThemeCSS();\n };\n\n // Poll until the iframe is ready, then inject\n let attempts = 0;\n const poll = setInterval(() => {\n attempts++;\n const iframe = findIframe();\n if (iframe?.contentDocument?.body) {\n clearInterval(poll);\n injectTheme();\n }\n if (attempts > 50) clearInterval(poll); // give up after 10s\n }, 200);\n\n // Watch for theme changes on <html> (class or data-theme attribute)\n const observer = new MutationObserver(() => {\n // Small delay so CSS variables have settled\n setTimeout(injectTheme, 50);\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'data-theme'],\n });\n\n return () => {\n clearInterval(poll);\n observer.disconnect();\n };\n }, []);\n\n return (\n <OzwellChat\n endpoint={endpoint}\n widgetUrl={widgetUrl}\n primaryColor={primaryColor}\n theme={theme}\n {...rest}\n />\n );\n}\n\n// Re-export hook and types for convenience\nexport { useOzwell };\nexport type {\n OzwellChatProps,\n OzwellTool,\n OzwellToolFunction,\n OzwellToolParameter,\n OzwellError,\n UseOzwellReturn,\n};\n"]}
1
+ {"version":3,"sources":["../src/components/AI/OzwellWidget.tsx"],"names":["React","jsx","OzwellChat"],"mappings":"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","file":"ozwell.cjs","sourcesContent":["/**\n * OzwellWidget - MIE-branded wrapper around @ozwell/react's OzwellChat\n *\n * Provides the official Ozwell AI chat widget with MIE brand defaults.\n * This is a real, working AI chat — not a mock. It requires a valid\n * API endpoint and key to function.\n *\n * @example\n * ```tsx\n * // Agent key mode (recommended)\n * <OzwellWidget apiKey=\"agnt_key-your-agent-key\" />\n *\n * // Custom endpoint mode\n * <OzwellWidget\n * endpoint=\"https://ozwell-dev-refserver.opensource.mieweb.org/v1/chat/completions\"\n * apiKey=\"agnt_key-your-key\"\n * onToolCall={(tool, args, sendResult) => {\n * sendResult({ success: true });\n * }}\n * />\n * ```\n */\nimport * as React from 'react';\nimport { OzwellChat, useOzwell } from '@ozwell/react';\nimport type {\n OzwellChatProps,\n OzwellTool,\n OzwellToolFunction,\n OzwellToolParameter,\n OzwellError,\n UseOzwellReturn,\n} from '@ozwell/react';\n\n/** Default Ozwell dev reference server base */\nconst DEV_SERVER = 'https://ozwell-dev-refserver.opensource.mieweb.org';\n\n/** Default chat completions endpoint */\nconst DEFAULT_ENDPOINT = `${DEV_SERVER}/v1/chat/completions`;\n\n/** Default widget URL — the loader script is derived from this */\nconst DEFAULT_WIDGET_URL = `${DEV_SERVER}/embed/ozwell-chat.html`;\n\n/** Ozwell brand primary color */\nconst OZWELL_PRIMARY = '#27aae1';\n\n/**\n * Inline fallback icon — a lightweight Ozwell \"O\" circle in brand blue.\n * The full 900 KB mascot SVG cannot be inlined; this simple glyph is used\n * when the loader's default /favicon.ico 404s and no custom iconSrc is given.\n */\nconst OZWELL_ICON_FALLBACK =\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Ccircle cx='32' cy='32' r='32' fill='%2327aae1'/%3E%3Ctext x='32' y='44' text-anchor='middle' font-size='36' font-family='system-ui,sans-serif' font-weight='700' fill='white'%3EO%3C/text%3E%3C/svg%3E\";\n\n/**\n * Theme-aware CSS overrides for the ozwell-loader's default UI.\n * The loader injects hardcoded colors (#0066ff). These overrides\n * bind to --mieweb-* CSS custom properties so the widget automatically\n * inherits the active brand theme and dark/light mode.\n */\nconst THEME_OVERRIDES_ID = 'ozwell-mieweb-theme-overrides';\nconst THEME_OVERRIDES_CSS = `\n /* ============================\n Ozwell Widget – MIE UI Theme Overrides\n Uses --mieweb-* design tokens for brand + dark mode support.\n ============================ */\n\n /* --- Floating chat button --- */\n @keyframes ozwellFloat {\n 0% { transform: translateY(0) rotate(0deg); }\n 10% { transform: translateY(-5px) rotate(-2deg); }\n 20% { transform: translateY(3px) rotate(3deg); }\n 30% { transform: translateY(-2px) rotate(-1deg); }\n 40% { transform: translateY(4px) rotate(2deg); }\n 50% { transform: translateY(0) rotate(0deg); }\n 60% { transform: translateY(-4px) rotate(2deg); }\n 70% { transform: translateY(2px) rotate(-3deg); }\n 80% { transform: translateY(5px) rotate(1deg); }\n 90% { transform: translateY(-3px) rotate(-2deg); }\n 100% { transform: translateY(0) rotate(0deg); }\n }\n .ozwell-chat-button {\n background: color-mix(in srgb, var(--mieweb-primary-500, #27aae1) 45%, transparent) !important;\n box-shadow: 0 4px 16px color-mix(in srgb, var(--mieweb-primary-500, #27aae1) 30%, transparent) !important;\n animation: ozwellFloat 15s ease-in-out infinite !important;\n }\n .ozwell-chat-button:hover {\n background: color-mix(in srgb, var(--mieweb-primary-500, #27aae1) 65%, transparent) !important;\n box-shadow: 0 6px 20px color-mix(in srgb, var(--mieweb-primary-500, #27aae1) 40%, transparent) !important;\n animation-play-state: paused !important;\n }\n\n /* --- Accessibility: respect reduced-motion preference --- */\n @media (prefers-reduced-motion: reduce) {\n .ozwell-chat-button {\n animation: none !important;\n }\n }\n\n /* --- Unread badge --- */\n .ozwell-unread-badge {\n background: var(--mieweb-destructive, #dc2626) !important;\n border-color: var(--mieweb-background, #ffffff) !important;\n }\n\n /* --- Chat window wrapper --- */\n .ozwell-chat-wrapper {\n background: var(--mieweb-card, #ffffff) !important;\n border-color: var(--mieweb-border, #e5e7eb) !important;\n box-shadow: var(--mieweb-shadow-modal, 0 10px 15px -3px rgb(0 0 0 / 0.1)) !important;\n }\n\n /* --- Header bar --- */\n .ozwell-chat-header {\n background: var(--mieweb-primary-500, #27aae1) !important;\n color: var(--mieweb-primary-foreground, #ffffff) !important;\n }\n\n /* --- Header title --- */\n .ozwell-chat-title {\n color: inherit !important;\n font-family: var(--mieweb-font-sans, inherit) !important;\n }\n\n /* --- Hide / minimize button --- */\n .ozwell-hide-btn {\n color: var(--mieweb-primary-foreground, #ffffff) !important;\n opacity: 0.85;\n }\n .ozwell-hide-btn:hover {\n opacity: 1;\n background: color-mix(in srgb, var(--mieweb-primary-foreground, #ffffff) 15%, transparent) !important;\n }\n\n /* --- Chat icon size --- */\n .ozwell-chat-icon {\n width: 56px !important;\n height: 56px !important;\n }\n`;\n\n/**\n * Reads the current --mieweb-* design-token values from the parent page\n * and returns CSS text that maps the widget's hardcoded colors to the\n * active brand + dark/light mode. Injected into the iframe's <head>.\n */\nfunction buildIframeThemeCSS(): string {\n const root = document.documentElement;\n const get = (v: string, fallback: string) =>\n getComputedStyle(root).getPropertyValue(v).trim() || fallback;\n\n const bg = get('--mieweb-background', '#ffffff');\n const fg = get('--mieweb-foreground', '#171717');\n const card = get('--mieweb-card', '#ffffff');\n const cardFg = get('--mieweb-card-foreground', '#171717');\n const muted = get('--mieweb-muted', '#f5f5f5');\n const mutedFg = get('--mieweb-muted-foreground', '#737373');\n const border = get('--mieweb-border', '#e5e7eb');\n const input = get('--mieweb-input', '#e5e7eb');\n const primary = get('--mieweb-primary-500', '#27aae1');\n const primaryFg = get('--mieweb-primary-foreground', '#ffffff');\n const ring = get('--mieweb-ring', '#27aae1');\n const fontSans = get(\n '--mieweb-font-sans',\n \"'Nunito', ui-sans-serif, system-ui, sans-serif\"\n );\n\n return `\n /* MIE UI iframe theme overrides — regenerated on theme change */\n\n /* --- Layout --- */\n body, .chat-container {\n background: ${bg} !important;\n color: ${fg} !important;\n font-family: ${fontSans} !important;\n }\n\n /* --- Status strip --- */\n .status-strip {\n background: ${muted} !important;\n border-color: ${border} !important;\n }\n .status { color: ${mutedFg} !important; }\n\n /* --- Reasoning controls --- */\n .reasoning-capsule {\n background: ${muted} !important;\n color: ${fg} !important;\n border-color: ${border} !important;\n }\n .reasoning-seg {\n background: ${card} !important;\n border-color: ${border} !important;\n }\n .reasoning-seg-btn {\n color: ${mutedFg} !important;\n }\n .reasoning-seg-btn.active {\n background: ${primary} !important;\n color: ${primaryFg} !important;\n }\n\n /* --- Messages --- */\n .messages { background: ${bg} !important; }\n\n .message.user {\n background: ${primary} !important;\n color: ${primaryFg} !important;\n }\n .message.assistant {\n background: ${card} !important;\n color: ${cardFg} !important;\n border: 1px solid ${border} !important;\n }\n .message.system {\n background: ${muted} !important;\n color: ${fg} !important;\n }\n .message.welcome {\n background: ${card} !important;\n color: ${mutedFg} !important;\n border-color: ${border} !important;\n }\n .message.queued {\n border-color: ${border} !important;\n color: ${mutedFg} !important;\n }\n\n /* --- Input area --- */\n .chat-form {\n background: ${bg} !important;\n border-top: 1px solid ${border} !important;\n }\n .chat-input {\n background: ${input} !important;\n color: ${fg} !important;\n border-color: ${border} !important;\n font-family: ${fontSans} !important;\n }\n .chat-input::placeholder { color: ${mutedFg} !important; }\n .chat-input:focus {\n border-color: ${ring} !important;\n box-shadow: 0 0 0 2px ${ring}33 !important;\n }\n\n /* --- Send button --- */\n .chat-submit {\n background: ${primary} !important;\n color: ${primaryFg} !important;\n }\n .chat-submit:hover {\n filter: brightness(1.1) !important;\n }\n .chat-submit:disabled {\n background: ${muted} !important;\n color: ${mutedFg} !important;\n filter: none !important;\n }\n\n /* --- Footer --- */\n .chat-footer {\n background: ${muted} !important;\n color: ${mutedFg} !important;\n border-color: ${border} !important;\n }\n\n /* --- Tool pills (debug mode) --- */\n .tool-pill {\n background: color-mix(in srgb, ${primary} 15%, ${bg}) !important;\n color: ${fg} !important;\n border-color: ${border} !important;\n }\n .tool-details {\n background: ${card} !important;\n border-color: ${border} !important;\n }\n .tool-details-header {\n background: ${muted} !important;\n color: ${fg} !important;\n }\n .tool-details-content {\n color: ${cardFg} !important;\n }\n\n /* --- Thinking bubble --- */\n .thinking-bubble { color: ${fg} !important; }\n .thinking-content {\n background: ${muted} !important;\n border-color: ${border} !important;\n color: ${mutedFg} !important;\n }\n\n /* --- Queued message actions --- */\n .queued-input {\n background: ${input} !important;\n color: ${fg} !important;\n border-color: ${border} !important;\n }\n\n /* --- Scrollbar (WebKit) --- */\n ::-webkit-scrollbar { width: 6px; }\n ::-webkit-scrollbar-track { background: ${bg}; }\n ::-webkit-scrollbar-thumb {\n background: ${border};\n border-radius: 3px;\n }\n `;\n}\n\nexport type OzwellWidgetProps = OzwellChatProps & {\n /**\n * Custom icon URL for the static (non-animated) chat launcher button.\n * Used as a fallback when the loader's default icon fails to load.\n * Defaults to a lightweight inline Ozwell \"O\" glyph.\n */\n iconSrc?: string;\n};\n\nexport function OzwellWidget({\n endpoint = DEFAULT_ENDPOINT,\n widgetUrl = DEFAULT_WIDGET_URL,\n primaryColor = OZWELL_PRIMARY,\n theme = 'auto',\n iconSrc = OZWELL_ICON_FALLBACK,\n ...rest\n}: OzwellWidgetProps) {\n // Clean up ozwell-loader DOM artifacts on unmount.\n // The vanilla loader injects a fixed-position button, chat wrapper, iframe,\n // and style tags directly into document.body — none of which get removed\n // when the React component unmounts. Without this, the button persists\n // across Storybook story navigation (or any SPA route change).\n React.useEffect(() => {\n return () => {\n // Remove loader-injected DOM elements\n for (const id of [\n 'ozwell-chat-button',\n 'ozwell-chat-wrapper',\n 'ozwell-default-ui-styles',\n ]) {\n document.getElementById(id)?.remove();\n }\n // Remove the loader script tag so it can be re-injected fresh\n document.querySelector('script[src*=\"ozwell-loader.js\"]')?.remove();\n // Remove the iframe (may not have an ID)\n document\n .querySelector(\n 'iframe[title=\"Ozwell Chat\"], iframe[title=\"Ozwell Assistant\"]'\n )\n ?.remove();\n // Clear global state so next mount starts fresh\n delete (window as unknown as Record<string, unknown>).OzwellChat;\n delete (window as unknown as Record<string, unknown>).OzwellChatConfig;\n };\n }, []);\n\n // Inject MIE UI theme overrides so the widget inherits brand tokens.\n // This <style> tag overrides the ozwell-loader's hardcoded colors\n // with --mieweb-* CSS custom properties, enabling brand + dark mode.\n // Not removed on unmount — idempotent CSS safe to leave in place,\n // prevents multi-instance bugs when one widget unmounts while another is live.\n React.useEffect(() => {\n if (document.getElementById(THEME_OVERRIDES_ID)) return;\n const style = document.createElement('style');\n style.id = THEME_OVERRIDES_ID;\n style.textContent = THEME_OVERRIDES_CSS;\n document.head.appendChild(style);\n }, []);\n\n // Fix broken launcher icon — the loader hardcodes src=\"/favicon.ico\" which\n // 404s when hosted on a different origin (e.g. Storybook). Replace with the\n // Ozwell brand icon from the design system.\n React.useEffect(() => {\n // The button is created asynchronously by the loader script, so poll briefly.\n // Once the icon element is found and handled, stop polling immediately.\n const timer = setInterval(() => {\n const img = document.querySelector(\n '#ozwell-chat-button .ozwell-chat-icon'\n ) as HTMLImageElement | null;\n if (!img || img.tagName !== 'IMG') return;\n\n // Found the icon — stop polling\n clearInterval(timer);\n clearTimeout(timeout);\n\n img.onerror = () => {\n img.src = iconSrc;\n img.onerror = null; // prevent infinite loop\n };\n // If already broken (naturalWidth 0), fix immediately\n if (img.complete && img.naturalWidth === 0) {\n img.src = iconSrc;\n }\n }, 200);\n const timeout = setTimeout(() => clearInterval(timer), 5000);\n return () => {\n clearInterval(timer);\n clearTimeout(timeout);\n };\n }, [iconSrc]);\n\n // Inject theme-aware CSS into the Ozwell iframe. The iframe content has\n // hardcoded colors (#0066ff, #ffffff, etc.) with no dark mode or theming.\n // Since it uses srcdoc it is same-origin, so we can access contentDocument.\n // We read --mieweb-* token values from the parent and inject them as\n // literal colors, then re-inject whenever the parent theme changes.\n React.useEffect(() => {\n const IFRAME_STYLE_ID = 'ozwell-mieweb-iframe-theme';\n\n /** Find the ozwell iframe in the parent DOM */\n const findIframe = () =>\n document.querySelector(\n 'iframe[title=\"Ozwell Chat\"], iframe[title=\"Ozwell Assistant\"]'\n ) as HTMLIFrameElement | null;\n\n /** Inject (or replace) the theme CSS inside the iframe */\n const injectTheme = () => {\n const iframe = findIframe();\n const doc = iframe?.contentDocument;\n if (!doc) return;\n let style = doc.getElementById(\n IFRAME_STYLE_ID\n ) as HTMLStyleElement | null;\n if (!style) {\n style = doc.createElement('style');\n style.id = IFRAME_STYLE_ID;\n doc.head.appendChild(style);\n }\n style.textContent = buildIframeThemeCSS();\n };\n\n // Poll until the iframe is ready, then inject\n let attempts = 0;\n const poll = setInterval(() => {\n attempts++;\n const iframe = findIframe();\n if (iframe?.contentDocument?.body) {\n clearInterval(poll);\n injectTheme();\n }\n if (attempts > 50) clearInterval(poll); // give up after 10s\n }, 200);\n\n // Watch for theme changes on <html> (class or data-theme attribute)\n const observer = new MutationObserver(() => {\n // Small delay so CSS variables have settled\n setTimeout(injectTheme, 50);\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'data-theme'],\n });\n\n return () => {\n clearInterval(poll);\n observer.disconnect();\n };\n }, []);\n\n return (\n <OzwellChat\n endpoint={endpoint}\n widgetUrl={widgetUrl}\n primaryColor={primaryColor}\n theme={theme}\n {...rest}\n />\n );\n}\n\n// Re-export hook and types for convenience\nexport { useOzwell };\nexport type {\n OzwellChatProps,\n OzwellTool,\n OzwellToolFunction,\n OzwellToolParameter,\n OzwellError,\n UseOzwellReturn,\n};\n"]}
package/dist/ozwell.js CHANGED
@@ -50,7 +50,7 @@ var THEME_OVERRIDES_CSS = `
50
50
 
51
51
  /* --- Unread badge --- */
52
52
  .ozwell-unread-badge {
53
- background: var(--mieweb-destructive, #ef4444) !important;
53
+ background: var(--mieweb-destructive, #dc2626) !important;
54
54
  border-color: var(--mieweb-background, #ffffff) !important;
55
55
  }
56
56
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/AI/OzwellWidget.tsx"],"names":[],"mappings":"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","file":"ozwell.js","sourcesContent":["/**\n * OzwellWidget - MIE-branded wrapper around @ozwell/react's OzwellChat\n *\n * Provides the official Ozwell AI chat widget with MIE brand defaults.\n * This is a real, working AI chat — not a mock. It requires a valid\n * API endpoint and key to function.\n *\n * @example\n * ```tsx\n * // Agent key mode (recommended)\n * <OzwellWidget apiKey=\"agnt_key-your-agent-key\" />\n *\n * // Custom endpoint mode\n * <OzwellWidget\n * endpoint=\"https://ozwell-dev-refserver.opensource.mieweb.org/v1/chat/completions\"\n * apiKey=\"agnt_key-your-key\"\n * onToolCall={(tool, args, sendResult) => {\n * sendResult({ success: true });\n * }}\n * />\n * ```\n */\nimport * as React from 'react';\nimport { OzwellChat, useOzwell } from '@ozwell/react';\nimport type {\n OzwellChatProps,\n OzwellTool,\n OzwellToolFunction,\n OzwellToolParameter,\n OzwellError,\n UseOzwellReturn,\n} from '@ozwell/react';\n\n/** Default Ozwell dev reference server base */\nconst DEV_SERVER = 'https://ozwell-dev-refserver.opensource.mieweb.org';\n\n/** Default chat completions endpoint */\nconst DEFAULT_ENDPOINT = `${DEV_SERVER}/v1/chat/completions`;\n\n/** Default widget URL — the loader script is derived from this */\nconst DEFAULT_WIDGET_URL = `${DEV_SERVER}/embed/ozwell-chat.html`;\n\n/** Ozwell brand primary color */\nconst OZWELL_PRIMARY = '#27aae1';\n\n/**\n * Inline fallback icon — a lightweight Ozwell \"O\" circle in brand blue.\n * The full 900 KB mascot SVG cannot be inlined; this simple glyph is used\n * when the loader's default /favicon.ico 404s and no custom iconSrc is given.\n */\nconst OZWELL_ICON_FALLBACK =\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Ccircle cx='32' cy='32' r='32' fill='%2327aae1'/%3E%3Ctext x='32' y='44' text-anchor='middle' font-size='36' font-family='system-ui,sans-serif' font-weight='700' fill='white'%3EO%3C/text%3E%3C/svg%3E\";\n\n/**\n * Theme-aware CSS overrides for the ozwell-loader's default UI.\n * The loader injects hardcoded colors (#0066ff). These overrides\n * bind to --mieweb-* CSS custom properties so the widget automatically\n * inherits the active brand theme and dark/light mode.\n */\nconst THEME_OVERRIDES_ID = 'ozwell-mieweb-theme-overrides';\nconst THEME_OVERRIDES_CSS = `\n /* ============================\n Ozwell Widget – MIE UI Theme Overrides\n Uses --mieweb-* design tokens for brand + dark mode support.\n ============================ */\n\n /* --- Floating chat button --- */\n @keyframes ozwellFloat {\n 0% { transform: translateY(0) rotate(0deg); }\n 10% { transform: translateY(-5px) rotate(-2deg); }\n 20% { transform: translateY(3px) rotate(3deg); }\n 30% { transform: translateY(-2px) rotate(-1deg); }\n 40% { transform: translateY(4px) rotate(2deg); }\n 50% { transform: translateY(0) rotate(0deg); }\n 60% { transform: translateY(-4px) rotate(2deg); }\n 70% { transform: translateY(2px) rotate(-3deg); }\n 80% { transform: translateY(5px) rotate(1deg); }\n 90% { transform: translateY(-3px) rotate(-2deg); }\n 100% { transform: translateY(0) rotate(0deg); }\n }\n .ozwell-chat-button {\n background: color-mix(in srgb, var(--mieweb-primary-500, #27aae1) 45%, transparent) !important;\n box-shadow: 0 4px 16px color-mix(in srgb, var(--mieweb-primary-500, #27aae1) 30%, transparent) !important;\n animation: ozwellFloat 15s ease-in-out infinite !important;\n }\n .ozwell-chat-button:hover {\n background: color-mix(in srgb, var(--mieweb-primary-500, #27aae1) 65%, transparent) !important;\n box-shadow: 0 6px 20px color-mix(in srgb, var(--mieweb-primary-500, #27aae1) 40%, transparent) !important;\n animation-play-state: paused !important;\n }\n\n /* --- Accessibility: respect reduced-motion preference --- */\n @media (prefers-reduced-motion: reduce) {\n .ozwell-chat-button {\n animation: none !important;\n }\n }\n\n /* --- Unread badge --- */\n .ozwell-unread-badge {\n background: var(--mieweb-destructive, #ef4444) !important;\n border-color: var(--mieweb-background, #ffffff) !important;\n }\n\n /* --- Chat window wrapper --- */\n .ozwell-chat-wrapper {\n background: var(--mieweb-card, #ffffff) !important;\n border-color: var(--mieweb-border, #e5e7eb) !important;\n box-shadow: var(--mieweb-shadow-modal, 0 10px 15px -3px rgb(0 0 0 / 0.1)) !important;\n }\n\n /* --- Header bar --- */\n .ozwell-chat-header {\n background: var(--mieweb-primary-500, #27aae1) !important;\n color: var(--mieweb-primary-foreground, #ffffff) !important;\n }\n\n /* --- Header title --- */\n .ozwell-chat-title {\n color: inherit !important;\n font-family: var(--mieweb-font-sans, inherit) !important;\n }\n\n /* --- Hide / minimize button --- */\n .ozwell-hide-btn {\n color: var(--mieweb-primary-foreground, #ffffff) !important;\n opacity: 0.85;\n }\n .ozwell-hide-btn:hover {\n opacity: 1;\n background: color-mix(in srgb, var(--mieweb-primary-foreground, #ffffff) 15%, transparent) !important;\n }\n\n /* --- Chat icon size --- */\n .ozwell-chat-icon {\n width: 56px !important;\n height: 56px !important;\n }\n`;\n\n/**\n * Reads the current --mieweb-* design-token values from the parent page\n * and returns CSS text that maps the widget's hardcoded colors to the\n * active brand + dark/light mode. Injected into the iframe's <head>.\n */\nfunction buildIframeThemeCSS(): string {\n const root = document.documentElement;\n const get = (v: string, fallback: string) =>\n getComputedStyle(root).getPropertyValue(v).trim() || fallback;\n\n const bg = get('--mieweb-background', '#ffffff');\n const fg = get('--mieweb-foreground', '#171717');\n const card = get('--mieweb-card', '#ffffff');\n const cardFg = get('--mieweb-card-foreground', '#171717');\n const muted = get('--mieweb-muted', '#f5f5f5');\n const mutedFg = get('--mieweb-muted-foreground', '#737373');\n const border = get('--mieweb-border', '#e5e7eb');\n const input = get('--mieweb-input', '#e5e7eb');\n const primary = get('--mieweb-primary-500', '#27aae1');\n const primaryFg = get('--mieweb-primary-foreground', '#ffffff');\n const ring = get('--mieweb-ring', '#27aae1');\n const fontSans = get(\n '--mieweb-font-sans',\n \"'Nunito', ui-sans-serif, system-ui, sans-serif\"\n );\n\n return `\n /* MIE UI iframe theme overrides — regenerated on theme change */\n\n /* --- Layout --- */\n body, .chat-container {\n background: ${bg} !important;\n color: ${fg} !important;\n font-family: ${fontSans} !important;\n }\n\n /* --- Status strip --- */\n .status-strip {\n background: ${muted} !important;\n border-color: ${border} !important;\n }\n .status { color: ${mutedFg} !important; }\n\n /* --- Reasoning controls --- */\n .reasoning-capsule {\n background: ${muted} !important;\n color: ${fg} !important;\n border-color: ${border} !important;\n }\n .reasoning-seg {\n background: ${card} !important;\n border-color: ${border} !important;\n }\n .reasoning-seg-btn {\n color: ${mutedFg} !important;\n }\n .reasoning-seg-btn.active {\n background: ${primary} !important;\n color: ${primaryFg} !important;\n }\n\n /* --- Messages --- */\n .messages { background: ${bg} !important; }\n\n .message.user {\n background: ${primary} !important;\n color: ${primaryFg} !important;\n }\n .message.assistant {\n background: ${card} !important;\n color: ${cardFg} !important;\n border: 1px solid ${border} !important;\n }\n .message.system {\n background: ${muted} !important;\n color: ${fg} !important;\n }\n .message.welcome {\n background: ${card} !important;\n color: ${mutedFg} !important;\n border-color: ${border} !important;\n }\n .message.queued {\n border-color: ${border} !important;\n color: ${mutedFg} !important;\n }\n\n /* --- Input area --- */\n .chat-form {\n background: ${bg} !important;\n border-top: 1px solid ${border} !important;\n }\n .chat-input {\n background: ${input} !important;\n color: ${fg} !important;\n border-color: ${border} !important;\n font-family: ${fontSans} !important;\n }\n .chat-input::placeholder { color: ${mutedFg} !important; }\n .chat-input:focus {\n border-color: ${ring} !important;\n box-shadow: 0 0 0 2px ${ring}33 !important;\n }\n\n /* --- Send button --- */\n .chat-submit {\n background: ${primary} !important;\n color: ${primaryFg} !important;\n }\n .chat-submit:hover {\n filter: brightness(1.1) !important;\n }\n .chat-submit:disabled {\n background: ${muted} !important;\n color: ${mutedFg} !important;\n filter: none !important;\n }\n\n /* --- Footer --- */\n .chat-footer {\n background: ${muted} !important;\n color: ${mutedFg} !important;\n border-color: ${border} !important;\n }\n\n /* --- Tool pills (debug mode) --- */\n .tool-pill {\n background: color-mix(in srgb, ${primary} 15%, ${bg}) !important;\n color: ${fg} !important;\n border-color: ${border} !important;\n }\n .tool-details {\n background: ${card} !important;\n border-color: ${border} !important;\n }\n .tool-details-header {\n background: ${muted} !important;\n color: ${fg} !important;\n }\n .tool-details-content {\n color: ${cardFg} !important;\n }\n\n /* --- Thinking bubble --- */\n .thinking-bubble { color: ${fg} !important; }\n .thinking-content {\n background: ${muted} !important;\n border-color: ${border} !important;\n color: ${mutedFg} !important;\n }\n\n /* --- Queued message actions --- */\n .queued-input {\n background: ${input} !important;\n color: ${fg} !important;\n border-color: ${border} !important;\n }\n\n /* --- Scrollbar (WebKit) --- */\n ::-webkit-scrollbar { width: 6px; }\n ::-webkit-scrollbar-track { background: ${bg}; }\n ::-webkit-scrollbar-thumb {\n background: ${border};\n border-radius: 3px;\n }\n `;\n}\n\nexport type OzwellWidgetProps = OzwellChatProps & {\n /**\n * Custom icon URL for the static (non-animated) chat launcher button.\n * Used as a fallback when the loader's default icon fails to load.\n * Defaults to a lightweight inline Ozwell \"O\" glyph.\n */\n iconSrc?: string;\n};\n\nexport function OzwellWidget({\n endpoint = DEFAULT_ENDPOINT,\n widgetUrl = DEFAULT_WIDGET_URL,\n primaryColor = OZWELL_PRIMARY,\n theme = 'auto',\n iconSrc = OZWELL_ICON_FALLBACK,\n ...rest\n}: OzwellWidgetProps) {\n // Clean up ozwell-loader DOM artifacts on unmount.\n // The vanilla loader injects a fixed-position button, chat wrapper, iframe,\n // and style tags directly into document.body — none of which get removed\n // when the React component unmounts. Without this, the button persists\n // across Storybook story navigation (or any SPA route change).\n React.useEffect(() => {\n return () => {\n // Remove loader-injected DOM elements\n for (const id of [\n 'ozwell-chat-button',\n 'ozwell-chat-wrapper',\n 'ozwell-default-ui-styles',\n ]) {\n document.getElementById(id)?.remove();\n }\n // Remove the loader script tag so it can be re-injected fresh\n document.querySelector('script[src*=\"ozwell-loader.js\"]')?.remove();\n // Remove the iframe (may not have an ID)\n document\n .querySelector(\n 'iframe[title=\"Ozwell Chat\"], iframe[title=\"Ozwell Assistant\"]'\n )\n ?.remove();\n // Clear global state so next mount starts fresh\n delete (window as unknown as Record<string, unknown>).OzwellChat;\n delete (window as unknown as Record<string, unknown>).OzwellChatConfig;\n };\n }, []);\n\n // Inject MIE UI theme overrides so the widget inherits brand tokens.\n // This <style> tag overrides the ozwell-loader's hardcoded colors\n // with --mieweb-* CSS custom properties, enabling brand + dark mode.\n // Not removed on unmount — idempotent CSS safe to leave in place,\n // prevents multi-instance bugs when one widget unmounts while another is live.\n React.useEffect(() => {\n if (document.getElementById(THEME_OVERRIDES_ID)) return;\n const style = document.createElement('style');\n style.id = THEME_OVERRIDES_ID;\n style.textContent = THEME_OVERRIDES_CSS;\n document.head.appendChild(style);\n }, []);\n\n // Fix broken launcher icon — the loader hardcodes src=\"/favicon.ico\" which\n // 404s when hosted on a different origin (e.g. Storybook). Replace with the\n // Ozwell brand icon from the design system.\n React.useEffect(() => {\n // The button is created asynchronously by the loader script, so poll briefly.\n // Once the icon element is found and handled, stop polling immediately.\n const timer = setInterval(() => {\n const img = document.querySelector(\n '#ozwell-chat-button .ozwell-chat-icon'\n ) as HTMLImageElement | null;\n if (!img || img.tagName !== 'IMG') return;\n\n // Found the icon — stop polling\n clearInterval(timer);\n clearTimeout(timeout);\n\n img.onerror = () => {\n img.src = iconSrc;\n img.onerror = null; // prevent infinite loop\n };\n // If already broken (naturalWidth 0), fix immediately\n if (img.complete && img.naturalWidth === 0) {\n img.src = iconSrc;\n }\n }, 200);\n const timeout = setTimeout(() => clearInterval(timer), 5000);\n return () => {\n clearInterval(timer);\n clearTimeout(timeout);\n };\n }, [iconSrc]);\n\n // Inject theme-aware CSS into the Ozwell iframe. The iframe content has\n // hardcoded colors (#0066ff, #ffffff, etc.) with no dark mode or theming.\n // Since it uses srcdoc it is same-origin, so we can access contentDocument.\n // We read --mieweb-* token values from the parent and inject them as\n // literal colors, then re-inject whenever the parent theme changes.\n React.useEffect(() => {\n const IFRAME_STYLE_ID = 'ozwell-mieweb-iframe-theme';\n\n /** Find the ozwell iframe in the parent DOM */\n const findIframe = () =>\n document.querySelector(\n 'iframe[title=\"Ozwell Chat\"], iframe[title=\"Ozwell Assistant\"]'\n ) as HTMLIFrameElement | null;\n\n /** Inject (or replace) the theme CSS inside the iframe */\n const injectTheme = () => {\n const iframe = findIframe();\n const doc = iframe?.contentDocument;\n if (!doc) return;\n let style = doc.getElementById(\n IFRAME_STYLE_ID\n ) as HTMLStyleElement | null;\n if (!style) {\n style = doc.createElement('style');\n style.id = IFRAME_STYLE_ID;\n doc.head.appendChild(style);\n }\n style.textContent = buildIframeThemeCSS();\n };\n\n // Poll until the iframe is ready, then inject\n let attempts = 0;\n const poll = setInterval(() => {\n attempts++;\n const iframe = findIframe();\n if (iframe?.contentDocument?.body) {\n clearInterval(poll);\n injectTheme();\n }\n if (attempts > 50) clearInterval(poll); // give up after 10s\n }, 200);\n\n // Watch for theme changes on <html> (class or data-theme attribute)\n const observer = new MutationObserver(() => {\n // Small delay so CSS variables have settled\n setTimeout(injectTheme, 50);\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'data-theme'],\n });\n\n return () => {\n clearInterval(poll);\n observer.disconnect();\n };\n }, []);\n\n return (\n <OzwellChat\n endpoint={endpoint}\n widgetUrl={widgetUrl}\n primaryColor={primaryColor}\n theme={theme}\n {...rest}\n />\n );\n}\n\n// Re-export hook and types for convenience\nexport { useOzwell };\nexport type {\n OzwellChatProps,\n OzwellTool,\n OzwellToolFunction,\n OzwellToolParameter,\n OzwellError,\n UseOzwellReturn,\n};\n"]}
1
+ {"version":3,"sources":["../src/components/AI/OzwellWidget.tsx"],"names":[],"mappings":";;;;;;AAkCA,IAAM,UAAA,GAAa,oDAAA;AAGnB,IAAM,gBAAA,GAAmB,GAAG,UAAU,CAAA,oBAAA,CAAA;AAGtC,IAAM,kBAAA,GAAqB,GAAG,UAAU,CAAA,uBAAA,CAAA;AAGxC,IAAM,cAAA,GAAiB,SAAA;AAOvB,IAAM,oBAAA,GACJ,8RAAA;AAQF,IAAM,kBAAA,GAAqB,+BAAA;AAC3B,IAAM,mBAAA,GAAsB;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAqF5B,SAAS,mBAAA,GAA8B;AACrC,EAAA,MAAM,OAAO,QAAA,CAAS,eAAA;AACtB,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,EAAW,QAAA,KACtB,gBAAA,CAAiB,IAAI,CAAA,CAAE,gBAAA,CAAiB,CAAC,CAAA,CAAE,IAAA,EAAK,IAAK,QAAA;AAEvD,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,qBAAA,EAAuB,SAAS,CAAA;AAC/C,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,qBAAA,EAAuB,SAAS,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,eAAA,EAAiB,SAAS,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,0BAAA,EAA4B,SAAS,CAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,gBAAA,EAAkB,SAAS,CAAA;AAC7C,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,2BAAA,EAA6B,SAAS,CAAA;AAC1D,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,iBAAA,EAAmB,SAAS,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,gBAAA,EAAkB,SAAS,CAAA;AAC7C,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,sBAAA,EAAwB,SAAS,CAAA;AACrD,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,6BAAA,EAA+B,SAAS,CAAA;AAC9D,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,eAAA,EAAiB,SAAS,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,GAAA;AAAA,IACf,oBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO;AAAA;;AAAA;AAAA;AAAA,kBAAA,EAKW,EAAE,CAAA;AAAA,aAAA,EACP,EAAE,CAAA;AAAA,mBAAA,EACI,QAAQ,CAAA;AAAA;;AAAA;AAAA;AAAA,kBAAA,EAKT,KAAK,CAAA;AAAA,oBAAA,EACH,MAAM,CAAA;AAAA;AAAA,qBAAA,EAEL,OAAO,CAAA;;AAAA;AAAA;AAAA,kBAAA,EAIV,KAAK,CAAA;AAAA,aAAA,EACV,EAAE,CAAA;AAAA,oBAAA,EACK,MAAM,CAAA;AAAA;AAAA;AAAA,kBAAA,EAGR,IAAI,CAAA;AAAA,oBAAA,EACF,MAAM,CAAA;AAAA;AAAA;AAAA,aAAA,EAGb,OAAO,CAAA;AAAA;AAAA;AAAA,kBAAA,EAGF,OAAO,CAAA;AAAA,aAAA,EACZ,SAAS,CAAA;AAAA;;AAAA;AAAA,4BAAA,EAIM,EAAE,CAAA;;AAAA;AAAA,kBAAA,EAGZ,OAAO,CAAA;AAAA,aAAA,EACZ,SAAS,CAAA;AAAA;AAAA;AAAA,kBAAA,EAGJ,IAAI,CAAA;AAAA,aAAA,EACT,MAAM,CAAA;AAAA,wBAAA,EACK,MAAM,CAAA;AAAA;AAAA;AAAA,kBAAA,EAGZ,KAAK,CAAA;AAAA,aAAA,EACV,EAAE,CAAA;AAAA;AAAA;AAAA,kBAAA,EAGG,IAAI,CAAA;AAAA,aAAA,EACT,OAAO,CAAA;AAAA,oBAAA,EACA,MAAM,CAAA;AAAA;AAAA;AAAA,oBAAA,EAGN,MAAM,CAAA;AAAA,aAAA,EACb,OAAO,CAAA;AAAA;;AAAA;AAAA;AAAA,kBAAA,EAKF,EAAE,CAAA;AAAA,4BAAA,EACQ,MAAM,CAAA;AAAA;AAAA;AAAA,kBAAA,EAGhB,KAAK,CAAA;AAAA,aAAA,EACV,EAAE,CAAA;AAAA,oBAAA,EACK,MAAM,CAAA;AAAA,mBAAA,EACP,QAAQ,CAAA;AAAA;AAAA,sCAAA,EAEW,OAAO,CAAA;AAAA;AAAA,oBAAA,EAEzB,IAAI,CAAA;AAAA,4BAAA,EACI,IAAI,CAAA;AAAA;;AAAA;AAAA;AAAA,kBAAA,EAKd,OAAO,CAAA;AAAA,aAAA,EACZ,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAMJ,KAAK,CAAA;AAAA,aAAA,EACV,OAAO,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,kBAAA,EAMF,KAAK,CAAA;AAAA,aAAA,EACV,OAAO,CAAA;AAAA,oBAAA,EACA,MAAM,CAAA;AAAA;;AAAA;AAAA;AAAA,qCAAA,EAKW,OAAO,SAAS,EAAE,CAAA;AAAA,aAAA,EAC1C,EAAE,CAAA;AAAA,oBAAA,EACK,MAAM,CAAA;AAAA;AAAA;AAAA,kBAAA,EAGR,IAAI,CAAA;AAAA,oBAAA,EACF,MAAM,CAAA;AAAA;AAAA;AAAA,kBAAA,EAGR,KAAK,CAAA;AAAA,aAAA,EACV,EAAE,CAAA;AAAA;AAAA;AAAA,aAAA,EAGF,MAAM,CAAA;AAAA;;AAAA;AAAA,8BAAA,EAIW,EAAE,CAAA;AAAA;AAAA,kBAAA,EAEd,KAAK,CAAA;AAAA,oBAAA,EACH,MAAM,CAAA;AAAA,aAAA,EACb,OAAO,CAAA;AAAA;;AAAA;AAAA;AAAA,kBAAA,EAKF,KAAK,CAAA;AAAA,aAAA,EACV,EAAE,CAAA;AAAA,oBAAA,EACK,MAAM,CAAA;AAAA;;AAAA;AAAA;AAAA,4CAAA,EAKkB,EAAE,CAAA;AAAA;AAAA,kBAAA,EAE5B,MAAM,CAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAI1B;AAWO,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA,GAAW,gBAAA;AAAA,EACX,SAAA,GAAY,kBAAA;AAAA,EACZ,YAAA,GAAe,cAAA;AAAA,EACf,KAAA,GAAQ,MAAA;AAAA,EACR,OAAA,GAAU,oBAAA;AAAA,EACV,GAAG;AACL,CAAA,EAAsB;AAMpB,EAAM,gBAAU,MAAM;AACpB,IAAA,OAAO,MAAM;AAEX,MAAA,KAAA,MAAW,EAAA,IAAM;AAAA,QACf,oBAAA;AAAA,QACA,qBAAA;AAAA,QACA;AAAA,OACF,EAAG;AACD,QAAA,QAAA,CAAS,cAAA,CAAe,EAAE,CAAA,EAAG,MAAA,EAAO;AAAA,MACtC;AAEA,MAAA,QAAA,CAAS,aAAA,CAAc,iCAAiC,CAAA,EAAG,MAAA,EAAO;AAElE,MAAA,QAAA,CACG,aAAA;AAAA,QACC;AAAA,SAEA,MAAA,EAAO;AAEX,MAAA,OAAQ,MAAA,CAA8C,UAAA;AACtD,MAAA,OAAQ,MAAA,CAA8C,gBAAA;AAAA,IACxD,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAOL,EAAM,gBAAU,MAAM;AACpB,IAAA,IAAI,QAAA,CAAS,cAAA,CAAe,kBAAkB,CAAA,EAAG;AACjD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,IAAA,KAAA,CAAM,EAAA,GAAK,kBAAA;AACX,IAAA,KAAA,CAAM,WAAA,GAAc,mBAAA;AACpB,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,EACjC,CAAA,EAAG,EAAE,CAAA;AAKL,EAAM,gBAAU,MAAM;AAGpB,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,MAAA,MAAM,MAAM,QAAA,CAAS,aAAA;AAAA,QACnB;AAAA,OACF;AACA,MAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,OAAA,KAAY,KAAA,EAAO;AAGnC,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,YAAA,CAAa,OAAO,CAAA;AAEpB,MAAA,GAAA,CAAI,UAAU,MAAM;AAClB,QAAA,GAAA,CAAI,GAAA,GAAM,OAAA;AACV,QAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AAAA,MAChB,CAAA;AAEA,MAAA,IAAI,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,YAAA,KAAiB,CAAA,EAAG;AAC1C,QAAA,GAAA,CAAI,GAAA,GAAM,OAAA;AAAA,MACZ;AAAA,IACF,GAAG,GAAG,CAAA;AACN,IAAA,MAAM,UAAU,UAAA,CAAW,MAAM,aAAA,CAAc,KAAK,GAAG,GAAI,CAAA;AAC3D,IAAA,OAAO,MAAM;AACX,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,YAAA,CAAa,OAAO,CAAA;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAOZ,EAAM,gBAAU,MAAM;AACpB,IAAA,MAAM,eAAA,GAAkB,4BAAA;AAGxB,IAAA,MAAM,UAAA,GAAa,MACjB,QAAA,CAAS,aAAA;AAAA,MACP;AAAA,KACF;AAGF,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,MAAA,MAAM,MAAM,MAAA,EAAQ,eAAA;AACpB,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,IAAI,QAAQ,GAAA,CAAI,cAAA;AAAA,QACd;AAAA,OACF;AACA,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,KAAA,GAAQ,GAAA,CAAI,cAAc,OAAO,CAAA;AACjC,QAAA,KAAA,CAAM,EAAA,GAAK,eAAA;AACX,QAAA,GAAA,CAAI,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,MAC5B;AACA,MAAA,KAAA,CAAM,cAAc,mBAAA,EAAoB;AAAA,IAC1C,CAAA;AAGA,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,MAAM,IAAA,GAAO,YAAY,MAAM;AAC7B,MAAA,QAAA,EAAA;AACA,MAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,MAAA,IAAI,MAAA,EAAQ,iBAAiB,IAAA,EAAM;AACjC,QAAA,aAAA,CAAc,IAAI,CAAA;AAClB,QAAA,WAAA,EAAY;AAAA,MACd;AACA,MAAA,IAAI,QAAA,GAAW,EAAA,EAAI,aAAA,CAAc,IAAI,CAAA;AAAA,IACvC,GAAG,GAAG,CAAA;AAGN,IAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,CAAiB,MAAM;AAE1C,MAAA,UAAA,CAAW,aAAa,EAAE,CAAA;AAAA,IAC5B,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,OAAA,CAAQ,SAAS,eAAA,EAAiB;AAAA,MACzC,UAAA,EAAY,IAAA;AAAA,MACZ,eAAA,EAAiB,CAAC,OAAA,EAAS,YAAY;AAAA,KACxC,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,QAAA,CAAS,UAAA,EAAW;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACE,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,QAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,KAAA;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ","file":"ozwell.js","sourcesContent":["/**\n * OzwellWidget - MIE-branded wrapper around @ozwell/react's OzwellChat\n *\n * Provides the official Ozwell AI chat widget with MIE brand defaults.\n * This is a real, working AI chat — not a mock. It requires a valid\n * API endpoint and key to function.\n *\n * @example\n * ```tsx\n * // Agent key mode (recommended)\n * <OzwellWidget apiKey=\"agnt_key-your-agent-key\" />\n *\n * // Custom endpoint mode\n * <OzwellWidget\n * endpoint=\"https://ozwell-dev-refserver.opensource.mieweb.org/v1/chat/completions\"\n * apiKey=\"agnt_key-your-key\"\n * onToolCall={(tool, args, sendResult) => {\n * sendResult({ success: true });\n * }}\n * />\n * ```\n */\nimport * as React from 'react';\nimport { OzwellChat, useOzwell } from '@ozwell/react';\nimport type {\n OzwellChatProps,\n OzwellTool,\n OzwellToolFunction,\n OzwellToolParameter,\n OzwellError,\n UseOzwellReturn,\n} from '@ozwell/react';\n\n/** Default Ozwell dev reference server base */\nconst DEV_SERVER = 'https://ozwell-dev-refserver.opensource.mieweb.org';\n\n/** Default chat completions endpoint */\nconst DEFAULT_ENDPOINT = `${DEV_SERVER}/v1/chat/completions`;\n\n/** Default widget URL — the loader script is derived from this */\nconst DEFAULT_WIDGET_URL = `${DEV_SERVER}/embed/ozwell-chat.html`;\n\n/** Ozwell brand primary color */\nconst OZWELL_PRIMARY = '#27aae1';\n\n/**\n * Inline fallback icon — a lightweight Ozwell \"O\" circle in brand blue.\n * The full 900 KB mascot SVG cannot be inlined; this simple glyph is used\n * when the loader's default /favicon.ico 404s and no custom iconSrc is given.\n */\nconst OZWELL_ICON_FALLBACK =\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Ccircle cx='32' cy='32' r='32' fill='%2327aae1'/%3E%3Ctext x='32' y='44' text-anchor='middle' font-size='36' font-family='system-ui,sans-serif' font-weight='700' fill='white'%3EO%3C/text%3E%3C/svg%3E\";\n\n/**\n * Theme-aware CSS overrides for the ozwell-loader's default UI.\n * The loader injects hardcoded colors (#0066ff). These overrides\n * bind to --mieweb-* CSS custom properties so the widget automatically\n * inherits the active brand theme and dark/light mode.\n */\nconst THEME_OVERRIDES_ID = 'ozwell-mieweb-theme-overrides';\nconst THEME_OVERRIDES_CSS = `\n /* ============================\n Ozwell Widget – MIE UI Theme Overrides\n Uses --mieweb-* design tokens for brand + dark mode support.\n ============================ */\n\n /* --- Floating chat button --- */\n @keyframes ozwellFloat {\n 0% { transform: translateY(0) rotate(0deg); }\n 10% { transform: translateY(-5px) rotate(-2deg); }\n 20% { transform: translateY(3px) rotate(3deg); }\n 30% { transform: translateY(-2px) rotate(-1deg); }\n 40% { transform: translateY(4px) rotate(2deg); }\n 50% { transform: translateY(0) rotate(0deg); }\n 60% { transform: translateY(-4px) rotate(2deg); }\n 70% { transform: translateY(2px) rotate(-3deg); }\n 80% { transform: translateY(5px) rotate(1deg); }\n 90% { transform: translateY(-3px) rotate(-2deg); }\n 100% { transform: translateY(0) rotate(0deg); }\n }\n .ozwell-chat-button {\n background: color-mix(in srgb, var(--mieweb-primary-500, #27aae1) 45%, transparent) !important;\n box-shadow: 0 4px 16px color-mix(in srgb, var(--mieweb-primary-500, #27aae1) 30%, transparent) !important;\n animation: ozwellFloat 15s ease-in-out infinite !important;\n }\n .ozwell-chat-button:hover {\n background: color-mix(in srgb, var(--mieweb-primary-500, #27aae1) 65%, transparent) !important;\n box-shadow: 0 6px 20px color-mix(in srgb, var(--mieweb-primary-500, #27aae1) 40%, transparent) !important;\n animation-play-state: paused !important;\n }\n\n /* --- Accessibility: respect reduced-motion preference --- */\n @media (prefers-reduced-motion: reduce) {\n .ozwell-chat-button {\n animation: none !important;\n }\n }\n\n /* --- Unread badge --- */\n .ozwell-unread-badge {\n background: var(--mieweb-destructive, #dc2626) !important;\n border-color: var(--mieweb-background, #ffffff) !important;\n }\n\n /* --- Chat window wrapper --- */\n .ozwell-chat-wrapper {\n background: var(--mieweb-card, #ffffff) !important;\n border-color: var(--mieweb-border, #e5e7eb) !important;\n box-shadow: var(--mieweb-shadow-modal, 0 10px 15px -3px rgb(0 0 0 / 0.1)) !important;\n }\n\n /* --- Header bar --- */\n .ozwell-chat-header {\n background: var(--mieweb-primary-500, #27aae1) !important;\n color: var(--mieweb-primary-foreground, #ffffff) !important;\n }\n\n /* --- Header title --- */\n .ozwell-chat-title {\n color: inherit !important;\n font-family: var(--mieweb-font-sans, inherit) !important;\n }\n\n /* --- Hide / minimize button --- */\n .ozwell-hide-btn {\n color: var(--mieweb-primary-foreground, #ffffff) !important;\n opacity: 0.85;\n }\n .ozwell-hide-btn:hover {\n opacity: 1;\n background: color-mix(in srgb, var(--mieweb-primary-foreground, #ffffff) 15%, transparent) !important;\n }\n\n /* --- Chat icon size --- */\n .ozwell-chat-icon {\n width: 56px !important;\n height: 56px !important;\n }\n`;\n\n/**\n * Reads the current --mieweb-* design-token values from the parent page\n * and returns CSS text that maps the widget's hardcoded colors to the\n * active brand + dark/light mode. Injected into the iframe's <head>.\n */\nfunction buildIframeThemeCSS(): string {\n const root = document.documentElement;\n const get = (v: string, fallback: string) =>\n getComputedStyle(root).getPropertyValue(v).trim() || fallback;\n\n const bg = get('--mieweb-background', '#ffffff');\n const fg = get('--mieweb-foreground', '#171717');\n const card = get('--mieweb-card', '#ffffff');\n const cardFg = get('--mieweb-card-foreground', '#171717');\n const muted = get('--mieweb-muted', '#f5f5f5');\n const mutedFg = get('--mieweb-muted-foreground', '#737373');\n const border = get('--mieweb-border', '#e5e7eb');\n const input = get('--mieweb-input', '#e5e7eb');\n const primary = get('--mieweb-primary-500', '#27aae1');\n const primaryFg = get('--mieweb-primary-foreground', '#ffffff');\n const ring = get('--mieweb-ring', '#27aae1');\n const fontSans = get(\n '--mieweb-font-sans',\n \"'Nunito', ui-sans-serif, system-ui, sans-serif\"\n );\n\n return `\n /* MIE UI iframe theme overrides — regenerated on theme change */\n\n /* --- Layout --- */\n body, .chat-container {\n background: ${bg} !important;\n color: ${fg} !important;\n font-family: ${fontSans} !important;\n }\n\n /* --- Status strip --- */\n .status-strip {\n background: ${muted} !important;\n border-color: ${border} !important;\n }\n .status { color: ${mutedFg} !important; }\n\n /* --- Reasoning controls --- */\n .reasoning-capsule {\n background: ${muted} !important;\n color: ${fg} !important;\n border-color: ${border} !important;\n }\n .reasoning-seg {\n background: ${card} !important;\n border-color: ${border} !important;\n }\n .reasoning-seg-btn {\n color: ${mutedFg} !important;\n }\n .reasoning-seg-btn.active {\n background: ${primary} !important;\n color: ${primaryFg} !important;\n }\n\n /* --- Messages --- */\n .messages { background: ${bg} !important; }\n\n .message.user {\n background: ${primary} !important;\n color: ${primaryFg} !important;\n }\n .message.assistant {\n background: ${card} !important;\n color: ${cardFg} !important;\n border: 1px solid ${border} !important;\n }\n .message.system {\n background: ${muted} !important;\n color: ${fg} !important;\n }\n .message.welcome {\n background: ${card} !important;\n color: ${mutedFg} !important;\n border-color: ${border} !important;\n }\n .message.queued {\n border-color: ${border} !important;\n color: ${mutedFg} !important;\n }\n\n /* --- Input area --- */\n .chat-form {\n background: ${bg} !important;\n border-top: 1px solid ${border} !important;\n }\n .chat-input {\n background: ${input} !important;\n color: ${fg} !important;\n border-color: ${border} !important;\n font-family: ${fontSans} !important;\n }\n .chat-input::placeholder { color: ${mutedFg} !important; }\n .chat-input:focus {\n border-color: ${ring} !important;\n box-shadow: 0 0 0 2px ${ring}33 !important;\n }\n\n /* --- Send button --- */\n .chat-submit {\n background: ${primary} !important;\n color: ${primaryFg} !important;\n }\n .chat-submit:hover {\n filter: brightness(1.1) !important;\n }\n .chat-submit:disabled {\n background: ${muted} !important;\n color: ${mutedFg} !important;\n filter: none !important;\n }\n\n /* --- Footer --- */\n .chat-footer {\n background: ${muted} !important;\n color: ${mutedFg} !important;\n border-color: ${border} !important;\n }\n\n /* --- Tool pills (debug mode) --- */\n .tool-pill {\n background: color-mix(in srgb, ${primary} 15%, ${bg}) !important;\n color: ${fg} !important;\n border-color: ${border} !important;\n }\n .tool-details {\n background: ${card} !important;\n border-color: ${border} !important;\n }\n .tool-details-header {\n background: ${muted} !important;\n color: ${fg} !important;\n }\n .tool-details-content {\n color: ${cardFg} !important;\n }\n\n /* --- Thinking bubble --- */\n .thinking-bubble { color: ${fg} !important; }\n .thinking-content {\n background: ${muted} !important;\n border-color: ${border} !important;\n color: ${mutedFg} !important;\n }\n\n /* --- Queued message actions --- */\n .queued-input {\n background: ${input} !important;\n color: ${fg} !important;\n border-color: ${border} !important;\n }\n\n /* --- Scrollbar (WebKit) --- */\n ::-webkit-scrollbar { width: 6px; }\n ::-webkit-scrollbar-track { background: ${bg}; }\n ::-webkit-scrollbar-thumb {\n background: ${border};\n border-radius: 3px;\n }\n `;\n}\n\nexport type OzwellWidgetProps = OzwellChatProps & {\n /**\n * Custom icon URL for the static (non-animated) chat launcher button.\n * Used as a fallback when the loader's default icon fails to load.\n * Defaults to a lightweight inline Ozwell \"O\" glyph.\n */\n iconSrc?: string;\n};\n\nexport function OzwellWidget({\n endpoint = DEFAULT_ENDPOINT,\n widgetUrl = DEFAULT_WIDGET_URL,\n primaryColor = OZWELL_PRIMARY,\n theme = 'auto',\n iconSrc = OZWELL_ICON_FALLBACK,\n ...rest\n}: OzwellWidgetProps) {\n // Clean up ozwell-loader DOM artifacts on unmount.\n // The vanilla loader injects a fixed-position button, chat wrapper, iframe,\n // and style tags directly into document.body — none of which get removed\n // when the React component unmounts. Without this, the button persists\n // across Storybook story navigation (or any SPA route change).\n React.useEffect(() => {\n return () => {\n // Remove loader-injected DOM elements\n for (const id of [\n 'ozwell-chat-button',\n 'ozwell-chat-wrapper',\n 'ozwell-default-ui-styles',\n ]) {\n document.getElementById(id)?.remove();\n }\n // Remove the loader script tag so it can be re-injected fresh\n document.querySelector('script[src*=\"ozwell-loader.js\"]')?.remove();\n // Remove the iframe (may not have an ID)\n document\n .querySelector(\n 'iframe[title=\"Ozwell Chat\"], iframe[title=\"Ozwell Assistant\"]'\n )\n ?.remove();\n // Clear global state so next mount starts fresh\n delete (window as unknown as Record<string, unknown>).OzwellChat;\n delete (window as unknown as Record<string, unknown>).OzwellChatConfig;\n };\n }, []);\n\n // Inject MIE UI theme overrides so the widget inherits brand tokens.\n // This <style> tag overrides the ozwell-loader's hardcoded colors\n // with --mieweb-* CSS custom properties, enabling brand + dark mode.\n // Not removed on unmount — idempotent CSS safe to leave in place,\n // prevents multi-instance bugs when one widget unmounts while another is live.\n React.useEffect(() => {\n if (document.getElementById(THEME_OVERRIDES_ID)) return;\n const style = document.createElement('style');\n style.id = THEME_OVERRIDES_ID;\n style.textContent = THEME_OVERRIDES_CSS;\n document.head.appendChild(style);\n }, []);\n\n // Fix broken launcher icon — the loader hardcodes src=\"/favicon.ico\" which\n // 404s when hosted on a different origin (e.g. Storybook). Replace with the\n // Ozwell brand icon from the design system.\n React.useEffect(() => {\n // The button is created asynchronously by the loader script, so poll briefly.\n // Once the icon element is found and handled, stop polling immediately.\n const timer = setInterval(() => {\n const img = document.querySelector(\n '#ozwell-chat-button .ozwell-chat-icon'\n ) as HTMLImageElement | null;\n if (!img || img.tagName !== 'IMG') return;\n\n // Found the icon — stop polling\n clearInterval(timer);\n clearTimeout(timeout);\n\n img.onerror = () => {\n img.src = iconSrc;\n img.onerror = null; // prevent infinite loop\n };\n // If already broken (naturalWidth 0), fix immediately\n if (img.complete && img.naturalWidth === 0) {\n img.src = iconSrc;\n }\n }, 200);\n const timeout = setTimeout(() => clearInterval(timer), 5000);\n return () => {\n clearInterval(timer);\n clearTimeout(timeout);\n };\n }, [iconSrc]);\n\n // Inject theme-aware CSS into the Ozwell iframe. The iframe content has\n // hardcoded colors (#0066ff, #ffffff, etc.) with no dark mode or theming.\n // Since it uses srcdoc it is same-origin, so we can access contentDocument.\n // We read --mieweb-* token values from the parent and inject them as\n // literal colors, then re-inject whenever the parent theme changes.\n React.useEffect(() => {\n const IFRAME_STYLE_ID = 'ozwell-mieweb-iframe-theme';\n\n /** Find the ozwell iframe in the parent DOM */\n const findIframe = () =>\n document.querySelector(\n 'iframe[title=\"Ozwell Chat\"], iframe[title=\"Ozwell Assistant\"]'\n ) as HTMLIFrameElement | null;\n\n /** Inject (or replace) the theme CSS inside the iframe */\n const injectTheme = () => {\n const iframe = findIframe();\n const doc = iframe?.contentDocument;\n if (!doc) return;\n let style = doc.getElementById(\n IFRAME_STYLE_ID\n ) as HTMLStyleElement | null;\n if (!style) {\n style = doc.createElement('style');\n style.id = IFRAME_STYLE_ID;\n doc.head.appendChild(style);\n }\n style.textContent = buildIframeThemeCSS();\n };\n\n // Poll until the iframe is ready, then inject\n let attempts = 0;\n const poll = setInterval(() => {\n attempts++;\n const iframe = findIframe();\n if (iframe?.contentDocument?.body) {\n clearInterval(poll);\n injectTheme();\n }\n if (attempts > 50) clearInterval(poll); // give up after 10s\n }, 200);\n\n // Watch for theme changes on <html> (class or data-theme attribute)\n const observer = new MutationObserver(() => {\n // Small delay so CSS variables have settled\n setTimeout(injectTheme, 50);\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'data-theme'],\n });\n\n return () => {\n clearInterval(poll);\n observer.disconnect();\n };\n }, []);\n\n return (\n <OzwellChat\n endpoint={endpoint}\n widgetUrl={widgetUrl}\n primaryColor={primaryColor}\n theme={theme}\n {...rest}\n />\n );\n}\n\n// Re-export hook and types for convenience\nexport { useOzwell };\nexport type {\n OzwellChatProps,\n OzwellTool,\n OzwellToolFunction,\n OzwellToolParameter,\n OzwellError,\n UseOzwellReturn,\n};\n"]}
@@ -2,21 +2,21 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var chunkG7ZHQA4O_cjs = require('./chunk-G7ZHQA4O.cjs');
5
+ var chunkFAF3RDHY_cjs = require('./chunk-FAF3RDHY.cjs');
6
6
 
7
7
 
8
8
 
9
9
  Object.defineProperty(exports, "default", {
10
10
  enumerable: true,
11
- get: function () { return chunkG7ZHQA4O_cjs.tailwind_preset_default; }
11
+ get: function () { return chunkFAF3RDHY_cjs.tailwind_preset_default; }
12
12
  });
13
13
  Object.defineProperty(exports, "miewebUIPreset", {
14
14
  enumerable: true,
15
- get: function () { return chunkG7ZHQA4O_cjs.miewebUIPreset; }
15
+ get: function () { return chunkFAF3RDHY_cjs.miewebUIPreset; }
16
16
  });
17
17
  Object.defineProperty(exports, "miewebUISafelist", {
18
18
  enumerable: true,
19
- get: function () { return chunkG7ZHQA4O_cjs.miewebUISafelist; }
19
+ get: function () { return chunkFAF3RDHY_cjs.miewebUISafelist; }
20
20
  });
21
21
  //# sourceMappingURL=tailwind-preset.cjs.map
22
22
  //# sourceMappingURL=tailwind-preset.cjs.map
@@ -1,3 +1,3 @@
1
- export { tailwind_preset_default as default, miewebUIPreset, miewebUISafelist } from './chunk-LUVSO5LK.js';
1
+ export { tailwind_preset_default as default, miewebUIPreset, miewebUISafelist } from './chunk-WSOJA67K.js';
2
2
  //# sourceMappingURL=tailwind-preset.js.map
3
3
  //# sourceMappingURL=tailwind-preset.js.map
@@ -0,0 +1,3 @@
1
+ export { wagglelineBrand as default, wagglelineBrand } from './chunk-2NTYAALC.js';
2
+ //# sourceMappingURL=waggleline-2MLRNVCV.js.map
3
+ //# sourceMappingURL=waggleline-2MLRNVCV.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"waggleline-BMUYAFJF.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"waggleline-2MLRNVCV.js"}
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var chunkZ5J4NTPL_cjs = require('./chunk-Z5J4NTPL.cjs');
6
+
7
+
8
+
9
+ Object.defineProperty(exports, "default", {
10
+ enumerable: true,
11
+ get: function () { return chunkZ5J4NTPL_cjs.wagglelineBrand; }
12
+ });
13
+ Object.defineProperty(exports, "wagglelineBrand", {
14
+ enumerable: true,
15
+ get: function () { return chunkZ5J4NTPL_cjs.wagglelineBrand; }
16
+ });
17
+ //# sourceMappingURL=waggleline-I7QWD3YX.cjs.map
18
+ //# sourceMappingURL=waggleline-I7QWD3YX.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"waggleline-6IGA66HR.cjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"waggleline-I7QWD3YX.cjs"}
@@ -0,0 +1,3 @@
1
+ export { webchartBrand as default, webchartBrand } from './chunk-JW5GWKV7.js';
2
+ //# sourceMappingURL=webchart-F6EIMC3I.js.map
3
+ //# sourceMappingURL=webchart-F6EIMC3I.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"webchart-2SLO5ICI.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"webchart-F6EIMC3I.js"}
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var chunkGXQFRLTN_cjs = require('./chunk-GXQFRLTN.cjs');
6
+
7
+
8
+
9
+ Object.defineProperty(exports, "default", {
10
+ enumerable: true,
11
+ get: function () { return chunkGXQFRLTN_cjs.webchartBrand; }
12
+ });
13
+ Object.defineProperty(exports, "webchartBrand", {
14
+ enumerable: true,
15
+ get: function () { return chunkGXQFRLTN_cjs.webchartBrand; }
16
+ });
17
+ //# sourceMappingURL=webchart-H3BHYNHB.cjs.map
18
+ //# sourceMappingURL=webchart-H3BHYNHB.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"webchart-EHVGP46N.cjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"webchart-H3BHYNHB.cjs"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mieweb/ui",
3
- "version": "0.3.0-dev.75",
3
+ "version": "0.3.0-dev.76",
4
4
  "description": "A themeable, accessible React component library built with Tailwind CSS",
5
5
  "author": "Medical Informatics Engineering, Inc.",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Avatar/Avatar.tsx"],"names":["cva","React","jsx","cn","jsxs"],"mappings":"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","file":"chunk-35J4B3ZK.cjs","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Avatar Component\n// ============================================================================\n\nconst avatarVariants = cva(\n [\n 'relative inline-flex items-center justify-center',\n 'rounded-full overflow-hidden',\n 'bg-primary-800 text-white font-semibold',\n ],\n {\n variants: {\n size: {\n xs: 'h-6 w-6 text-xs',\n sm: 'h-8 w-8 text-sm',\n md: 'h-10 w-10 text-sm',\n lg: 'h-12 w-12 text-base',\n xl: 'h-16 w-16 text-lg',\n },\n ring: {\n true: 'ring-2 ring-primary-400/30',\n false: '',\n },\n },\n defaultVariants: {\n size: 'md',\n ring: false,\n },\n }\n);\n\nexport interface AvatarProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof avatarVariants> {\n /** Image URL for the avatar */\n src?: string | null;\n /** Alt text for the avatar image */\n alt?: string;\n /** Name to generate initials from (used as fallback when no src) */\n name?: string;\n /** Custom fallback content (overrides name initials) */\n fallback?: React.ReactElement | null;\n}\n\n/**\n * Get initials from a name string.\n */\nfunction getInitials(name: string): string {\n return name\n .split(' ')\n .map((part) => part[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n}\n\n/**\n * An avatar component for displaying user profile images with fallback to initials.\n *\n * @example\n * ```tsx\n * // With image\n * <Avatar src=\"/user.jpg\" alt=\"John Doe\" />\n *\n * // With initials fallback\n * <Avatar name=\"John Doe\" />\n *\n * // With custom fallback\n * <Avatar fallback={<UserIcon />} />\n * ```\n */\nconst Avatar = React.forwardRef<HTMLDivElement, AvatarProps>(\n ({ className, src, alt, name, fallback, size, ring, ...props }, ref) => {\n const [imageError, setImageError] = React.useState(false);\n\n // Reset error state when src changes\n React.useEffect(() => {\n setImageError(false);\n }, [src]);\n\n const showImage = src && !imageError;\n const initials = name ? getInitials(name) : null;\n\n return (\n <div\n ref={ref}\n data-slot=\"avatar\"\n className={cn(avatarVariants({ size, ring }), className)}\n {...props}\n >\n {showImage ? (\n <img\n src={src}\n alt={alt || name || 'Avatar'}\n className=\"h-full w-full object-cover\"\n onError={() => setImageError(true)}\n />\n ) : React.isValidElement(fallback) ? (\n fallback\n ) : initials ? (\n initials\n ) : (\n <svg\n className=\"h-[60%] w-[60%] text-white/80\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\" />\n </svg>\n )}\n </div>\n );\n }\n);\n\nAvatar.displayName = 'Avatar';\n\n// ============================================================================\n// Avatar Group Component\n// ============================================================================\n\nexport interface AvatarGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Maximum number of avatars to show before +N indicator */\n max?: number;\n /** Size of avatars in the group */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** Children should be Avatar components */\n children: React.ReactNode;\n}\n\n/**\n * A component for displaying a group of overlapping avatars.\n *\n * @example\n * ```tsx\n * <AvatarGroup max={3}>\n * <Avatar name=\"John Doe\" />\n * <Avatar name=\"Jane Smith\" />\n * <Avatar name=\"Bob Wilson\" />\n * <Avatar name=\"Alice Brown\" />\n * </AvatarGroup>\n * ```\n */\nconst AvatarGroup = React.forwardRef<HTMLDivElement, AvatarGroupProps>(\n ({ className, max, size = 'md', children, ...props }, ref) => {\n const childrenArray = React.Children.toArray(children);\n const visibleChildren = max ? childrenArray.slice(0, max) : childrenArray;\n const remainingCount = max ? Math.max(0, childrenArray.length - max) : 0;\n\n return (\n <div\n ref={ref}\n data-slot=\"avatar-group\"\n className={cn('flex -space-x-2', className)}\n {...props}\n >\n {visibleChildren.map((child, index) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(\n child as React.ReactElement<AvatarProps>,\n {\n key: index,\n size,\n className: cn(\n 'ring-2 ring-white dark:ring-neutral-900',\n (child as React.ReactElement<AvatarProps>).props.className\n ),\n }\n );\n }\n return child;\n })}\n {remainingCount > 0 && (\n <div\n className={cn(\n avatarVariants({ size }),\n 'bg-neutral-200 text-neutral-600 dark:bg-neutral-700 dark:text-neutral-300',\n 'ring-2 ring-white dark:ring-neutral-900'\n )}\n >\n +{remainingCount}\n </div>\n )}\n </div>\n );\n }\n);\n\nAvatarGroup.displayName = 'AvatarGroup';\n\nexport { Avatar, AvatarGroup, avatarVariants, getInitials };\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Card/Card.tsx"],"names":[],"mappings":"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","file":"chunk-AL6ASCL6.js","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst cardVariants = cva(\n [\n 'rounded-xl bg-card text-card-foreground',\n 'border border-border',\n 'relative overflow-hidden',\n ],\n {\n variants: {\n padding: {\n none: 'p-0',\n sm: 'p-3',\n md: 'p-4',\n lg: 'p-6',\n xl: 'p-8',\n },\n variant: {\n default: 'shadow-card',\n elevated: 'shadow-lg border-0',\n outlined: 'shadow-none border-2',\n ghost: 'shadow-none border-0 bg-transparent',\n filled: 'shadow-none border-0 bg-muted',\n },\n interactive: {\n true: [\n 'transition-all duration-200',\n 'hover:shadow-md hover:border-primary-200',\n 'dark:hover:border-primary-800',\n 'cursor-pointer',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2',\n ],\n false: '',\n },\n selected: {\n true: 'ring-2 ring-primary-500 border-primary-500',\n false: '',\n },\n orientation: {\n vertical: 'flex flex-col',\n horizontal: 'flex flex-row',\n },\n },\n defaultVariants: {\n padding: 'md',\n variant: 'default',\n interactive: false,\n selected: false,\n orientation: 'vertical',\n },\n }\n);\n\nconst cardAccentVariants = cva('absolute left-0 top-0 bottom-0 w-1', {\n variants: {\n color: {\n primary: 'bg-primary-800',\n success: 'bg-success',\n warning: 'bg-warning',\n destructive: 'bg-destructive',\n info: 'bg-primary-200',\n },\n },\n});\n\nexport interface CardProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof cardVariants> {\n /** Semantic HTML element to render as */\n as?: 'div' | 'article' | 'section' | 'aside';\n /** Accent color bar on the left side */\n accent?: 'primary' | 'success' | 'warning' | 'destructive' | 'info';\n /** Loading state - shows skeleton overlay */\n loading?: boolean;\n}\n\n/**\n * A card container component for grouping related content.\n *\n * @example\n * ```tsx\n * <Card padding=\"lg\" variant=\"elevated\">\n * <CardHeader>\n * <CardTitle>Card Title</CardTitle>\n * </CardHeader>\n * <CardContent>Card content goes here</CardContent>\n * </Card>\n * ```\n */\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n (\n {\n className,\n padding,\n variant,\n interactive,\n selected,\n orientation,\n accent,\n loading,\n as: Component = 'div',\n children,\n ...props\n },\n ref\n ) => {\n return (\n <Component\n ref={ref}\n className={cn(\n cardVariants({\n padding,\n variant,\n interactive,\n selected,\n orientation,\n }),\n accent && 'pl-4',\n className\n )}\n data-slot=\"card\"\n data-loading={loading || undefined}\n aria-busy={loading || undefined}\n {...props}\n >\n {accent && (\n <div\n className={cn(cardAccentVariants({ color: accent }))}\n aria-hidden=\"true\"\n />\n )}\n {loading && (\n <div className=\"bg-card/80 absolute inset-0 z-10 flex items-center justify-center backdrop-blur-sm\">\n <div className=\"flex gap-1\">\n <div className=\"bg-primary-800 h-2 w-2 animate-bounce rounded-full [animation-delay:-0.3s]\" />\n <div className=\"bg-primary-800 h-2 w-2 animate-bounce rounded-full [animation-delay:-0.15s]\" />\n <div className=\"bg-primary-800 h-2 w-2 animate-bounce rounded-full\" />\n </div>\n </div>\n )}\n {children}\n </Component>\n );\n }\n);\n\nCard.displayName = 'Card';\n\n/**\n * Header section of a Card\n */\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card-header\"\n className={cn('flex flex-col gap-1.5 pb-4', className)}\n {...props}\n />\n));\n\nCardHeader.displayName = 'CardHeader';\n\n/**\n * Title for a Card\n */\nconst CardTitle = React.forwardRef<\n globalThis.HTMLHeadingElement,\n React.HTMLAttributes<globalThis.HTMLHeadingElement>\n>(({ className, children, ...props }, ref) => (\n <h3\n ref={ref}\n data-slot=\"card-title\"\n className={cn(\n 'text-lg leading-none font-semibold tracking-tight',\n className\n )}\n {...props}\n >\n {children}\n </h3>\n));\n\nCardTitle.displayName = 'CardTitle';\n\n/**\n * Description text for a Card\n */\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n data-slot=\"card-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n));\n\nCardDescription.displayName = 'CardDescription';\n\n/**\n * Main content area of a Card\n */\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card-content\"\n className={cn('', className)}\n {...props}\n />\n));\n\nCardContent.displayName = 'CardContent';\n\n/**\n * Footer section of a Card\n */\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card-footer\"\n className={cn('flex items-center pt-4', className)}\n {...props}\n />\n));\n\nCardFooter.displayName = 'CardFooter';\n\n/**\n * Image/Media section for a Card - typically used at the top\n */\nexport interface CardMediaProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n /** Aspect ratio of the media */\n aspectRatio?: 'video' | 'square' | 'wide' | 'auto';\n /** Optional overlay content */\n overlay?: React.ReactNode;\n}\n\nconst CardMedia = React.forwardRef<HTMLDivElement, CardMediaProps>(\n ({ className, aspectRatio = 'video', overlay, src, alt, ...props }, ref) => {\n const aspectClasses = {\n video: 'aspect-video',\n square: 'aspect-square',\n wide: 'aspect-[21/9]',\n auto: '',\n };\n\n return (\n <div\n ref={ref}\n data-slot=\"card-media\"\n className={cn(\n 'relative -mx-4 -mt-4 overflow-hidden first:rounded-t-xl',\n className\n )}\n >\n <img\n src={src}\n alt={alt}\n className={cn('w-full object-cover', aspectClasses[aspectRatio])}\n {...props}\n />\n {overlay && (\n <div className=\"absolute inset-0 flex items-end bg-gradient-to-t from-neutral-900/60 to-transparent p-4\">\n {overlay}\n </div>\n )}\n </div>\n );\n }\n);\n\nCardMedia.displayName = 'CardMedia';\n\n/**\n * Badge/Label component for Cards\n */\nexport interface CardBadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Badge color variant */\n variant?: 'default' | 'primary' | 'success' | 'warning' | 'destructive';\n /** Position of the badge */\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n}\n\nconst CardBadge = React.forwardRef<HTMLSpanElement, CardBadgeProps>(\n (\n {\n className,\n variant = 'default',\n position = 'top-right',\n children,\n ...props\n },\n ref\n ) => {\n const variantClasses = {\n default: 'bg-muted text-muted-foreground',\n primary: 'bg-primary-800 text-white',\n success: 'bg-success text-success-foreground',\n warning: 'bg-warning text-warning-foreground',\n destructive: 'bg-destructive text-destructive-foreground',\n };\n\n const positionClasses = {\n 'top-left': 'top-2 left-2',\n 'top-right': 'top-2 right-2',\n 'bottom-left': 'bottom-2 left-2',\n 'bottom-right': 'bottom-2 right-2',\n };\n\n return (\n <span\n ref={ref}\n data-slot=\"card-badge\"\n className={cn(\n 'absolute z-10 rounded-md px-2 py-1 text-xs font-medium',\n variantClasses[variant],\n positionClasses[position],\n className\n )}\n {...props}\n >\n {children}\n </span>\n );\n }\n);\n\nCardBadge.displayName = 'CardBadge';\n\n/**\n * Actions area for Card buttons/links\n */\nexport interface CardActionsProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Alignment of actions */\n align?: 'left' | 'center' | 'right' | 'between' | 'around';\n}\n\nconst CardActions = React.forwardRef<HTMLDivElement, CardActionsProps>(\n ({ className, align = 'right', children, ...props }, ref) => {\n const alignClasses = {\n left: 'justify-start',\n center: 'justify-center',\n right: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n };\n\n return (\n <div\n ref={ref}\n data-slot=\"card-actions\"\n className={cn(\n 'flex items-center gap-2 pt-4',\n alignClasses[align],\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nCardActions.displayName = 'CardActions';\n\n/**\n * Divider line within a Card\n */\nconst CardDivider = React.forwardRef<\n globalThis.HTMLHRElement,\n React.HTMLAttributes<globalThis.HTMLHRElement>\n>(({ className, ...props }, ref) => (\n <hr\n ref={ref}\n data-slot=\"card-divider\"\n className={cn('border-border -mx-4 my-4', className)}\n {...props}\n />\n));\n\nCardDivider.displayName = 'CardDivider';\n\n/**\n * Collapsible content section for Cards\n */\nexport interface CardCollapsibleProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Whether the content is expanded */\n expanded?: boolean;\n /** Callback when expand state changes */\n onExpandChange?: (expanded: boolean) => void;\n /** Trigger element/text for expanding */\n trigger?: React.ReactNode;\n}\n\nconst CardCollapsible = React.forwardRef<HTMLDivElement, CardCollapsibleProps>(\n (\n {\n className,\n expanded: controlledExpanded,\n onExpandChange,\n trigger = 'Show more',\n children,\n ...props\n },\n ref\n ) => {\n const [internalExpanded, setInternalExpanded] = React.useState(false);\n const isControlled = controlledExpanded !== undefined;\n const expanded = isControlled ? controlledExpanded : internalExpanded;\n\n const handleToggle = () => {\n if (isControlled) {\n onExpandChange?.(!expanded);\n } else {\n setInternalExpanded(!expanded);\n }\n };\n\n return (\n <div\n ref={ref}\n data-slot=\"card-collapsible\"\n className={cn('', className)}\n {...props}\n >\n <button\n type=\"button\"\n onClick={handleToggle}\n className=\"text-primary-800 focus-visible:ring-primary-500 flex items-center gap-1 rounded text-sm hover:underline focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2\"\n aria-expanded={expanded}\n >\n {typeof trigger === 'string' ? (\n <>\n {expanded ? 'Show less' : trigger}\n <svg\n className={cn(\n 'h-4 w-4 transition-transform',\n expanded && 'rotate-180'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </>\n ) : (\n trigger\n )}\n </button>\n <div\n className={cn(\n 'grid transition-all duration-300 ease-in-out',\n expanded\n ? 'mt-3 grid-rows-[1fr] opacity-100'\n : 'grid-rows-[0fr] opacity-0'\n )}\n >\n <div className=\"overflow-hidden\">{children}</div>\n </div>\n </div>\n );\n }\n);\n\nCardCollapsible.displayName = 'CardCollapsible';\n\n/**\n * Stat/Metric display for Cards\n */\nexport interface CardStatProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The main value/number */\n value: React.ReactNode;\n /** Label describing the stat */\n label: string;\n /** Trend indicator */\n trend?: { value: number; label?: string };\n /** Icon to display */\n icon?: React.ReactNode;\n}\n\nconst CardStat = React.forwardRef<HTMLDivElement, CardStatProps>(\n ({ className, value, label, trend, icon, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"card-stat\"\n className={cn('flex items-start gap-3', className)}\n {...props}\n >\n {icon && (\n <div className=\"bg-primary-500/10 text-primary-800 rounded-lg p-2\">\n {icon}\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-2xl font-bold tracking-tight\">{value}</div>\n <div className=\"text-muted-foreground text-sm\">{label}</div>\n {trend && (\n <div\n className={cn(\n 'mt-1 flex items-center gap-1 text-sm',\n trend.value >= 0 ? 'text-success' : 'text-destructive'\n )}\n >\n <svg\n className={cn('h-4 w-4', trend.value < 0 && 'rotate-180')}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 10l7-7m0 0l7 7m-7-7v18\"\n />\n </svg>\n <span>{Math.abs(trend.value)}%</span>\n {trend.label && (\n <span className=\"text-muted-foreground\">{trend.label}</span>\n )}\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\nCardStat.displayName = 'CardStat';\n\nexport {\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n CardMedia,\n CardBadge,\n CardActions,\n CardDivider,\n CardCollapsible,\n CardStat,\n cardVariants,\n cardAccentVariants,\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Card/Card.tsx"],"names":["cva","React","jsxs","cn","jsx","Fragment"],"mappings":"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","file":"chunk-CHMMHFOW.cjs","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst cardVariants = cva(\n [\n 'rounded-xl bg-card text-card-foreground',\n 'border border-border',\n 'relative overflow-hidden',\n ],\n {\n variants: {\n padding: {\n none: 'p-0',\n sm: 'p-3',\n md: 'p-4',\n lg: 'p-6',\n xl: 'p-8',\n },\n variant: {\n default: 'shadow-card',\n elevated: 'shadow-lg border-0',\n outlined: 'shadow-none border-2',\n ghost: 'shadow-none border-0 bg-transparent',\n filled: 'shadow-none border-0 bg-muted',\n },\n interactive: {\n true: [\n 'transition-all duration-200',\n 'hover:shadow-md hover:border-primary-200',\n 'dark:hover:border-primary-800',\n 'cursor-pointer',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2',\n ],\n false: '',\n },\n selected: {\n true: 'ring-2 ring-primary-500 border-primary-500',\n false: '',\n },\n orientation: {\n vertical: 'flex flex-col',\n horizontal: 'flex flex-row',\n },\n },\n defaultVariants: {\n padding: 'md',\n variant: 'default',\n interactive: false,\n selected: false,\n orientation: 'vertical',\n },\n }\n);\n\nconst cardAccentVariants = cva('absolute left-0 top-0 bottom-0 w-1', {\n variants: {\n color: {\n primary: 'bg-primary-800',\n success: 'bg-success',\n warning: 'bg-warning',\n destructive: 'bg-destructive',\n info: 'bg-primary-200',\n },\n },\n});\n\nexport interface CardProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof cardVariants> {\n /** Semantic HTML element to render as */\n as?: 'div' | 'article' | 'section' | 'aside';\n /** Accent color bar on the left side */\n accent?: 'primary' | 'success' | 'warning' | 'destructive' | 'info';\n /** Loading state - shows skeleton overlay */\n loading?: boolean;\n}\n\n/**\n * A card container component for grouping related content.\n *\n * @example\n * ```tsx\n * <Card padding=\"lg\" variant=\"elevated\">\n * <CardHeader>\n * <CardTitle>Card Title</CardTitle>\n * </CardHeader>\n * <CardContent>Card content goes here</CardContent>\n * </Card>\n * ```\n */\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n (\n {\n className,\n padding,\n variant,\n interactive,\n selected,\n orientation,\n accent,\n loading,\n as: Component = 'div',\n children,\n ...props\n },\n ref\n ) => {\n return (\n <Component\n ref={ref}\n className={cn(\n cardVariants({\n padding,\n variant,\n interactive,\n selected,\n orientation,\n }),\n accent && 'pl-4',\n className\n )}\n data-slot=\"card\"\n data-loading={loading || undefined}\n aria-busy={loading || undefined}\n {...props}\n >\n {accent && (\n <div\n className={cn(cardAccentVariants({ color: accent }))}\n aria-hidden=\"true\"\n />\n )}\n {loading && (\n <div className=\"bg-card/80 absolute inset-0 z-10 flex items-center justify-center backdrop-blur-sm\">\n <div className=\"flex gap-1\">\n <div className=\"bg-primary-800 h-2 w-2 animate-bounce rounded-full [animation-delay:-0.3s]\" />\n <div className=\"bg-primary-800 h-2 w-2 animate-bounce rounded-full [animation-delay:-0.15s]\" />\n <div className=\"bg-primary-800 h-2 w-2 animate-bounce rounded-full\" />\n </div>\n </div>\n )}\n {children}\n </Component>\n );\n }\n);\n\nCard.displayName = 'Card';\n\n/**\n * Header section of a Card\n */\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card-header\"\n className={cn('flex flex-col gap-1.5 pb-4', className)}\n {...props}\n />\n));\n\nCardHeader.displayName = 'CardHeader';\n\n/**\n * Title for a Card\n */\nconst CardTitle = React.forwardRef<\n globalThis.HTMLHeadingElement,\n React.HTMLAttributes<globalThis.HTMLHeadingElement>\n>(({ className, children, ...props }, ref) => (\n <h3\n ref={ref}\n data-slot=\"card-title\"\n className={cn(\n 'text-lg leading-none font-semibold tracking-tight',\n className\n )}\n {...props}\n >\n {children}\n </h3>\n));\n\nCardTitle.displayName = 'CardTitle';\n\n/**\n * Description text for a Card\n */\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n data-slot=\"card-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n));\n\nCardDescription.displayName = 'CardDescription';\n\n/**\n * Main content area of a Card\n */\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card-content\"\n className={cn('', className)}\n {...props}\n />\n));\n\nCardContent.displayName = 'CardContent';\n\n/**\n * Footer section of a Card\n */\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card-footer\"\n className={cn('flex items-center pt-4', className)}\n {...props}\n />\n));\n\nCardFooter.displayName = 'CardFooter';\n\n/**\n * Image/Media section for a Card - typically used at the top\n */\nexport interface CardMediaProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n /** Aspect ratio of the media */\n aspectRatio?: 'video' | 'square' | 'wide' | 'auto';\n /** Optional overlay content */\n overlay?: React.ReactNode;\n}\n\nconst CardMedia = React.forwardRef<HTMLDivElement, CardMediaProps>(\n ({ className, aspectRatio = 'video', overlay, src, alt, ...props }, ref) => {\n const aspectClasses = {\n video: 'aspect-video',\n square: 'aspect-square',\n wide: 'aspect-[21/9]',\n auto: '',\n };\n\n return (\n <div\n ref={ref}\n data-slot=\"card-media\"\n className={cn(\n 'relative -mx-4 -mt-4 overflow-hidden first:rounded-t-xl',\n className\n )}\n >\n <img\n src={src}\n alt={alt}\n className={cn('w-full object-cover', aspectClasses[aspectRatio])}\n {...props}\n />\n {overlay && (\n <div className=\"absolute inset-0 flex items-end bg-gradient-to-t from-neutral-900/60 to-transparent p-4\">\n {overlay}\n </div>\n )}\n </div>\n );\n }\n);\n\nCardMedia.displayName = 'CardMedia';\n\n/**\n * Badge/Label component for Cards\n */\nexport interface CardBadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Badge color variant */\n variant?: 'default' | 'primary' | 'success' | 'warning' | 'destructive';\n /** Position of the badge */\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n}\n\nconst CardBadge = React.forwardRef<HTMLSpanElement, CardBadgeProps>(\n (\n {\n className,\n variant = 'default',\n position = 'top-right',\n children,\n ...props\n },\n ref\n ) => {\n const variantClasses = {\n default: 'bg-muted text-muted-foreground',\n primary: 'bg-primary-800 text-white',\n success: 'bg-success text-success-foreground',\n warning: 'bg-warning text-warning-foreground',\n destructive: 'bg-destructive text-destructive-foreground',\n };\n\n const positionClasses = {\n 'top-left': 'top-2 left-2',\n 'top-right': 'top-2 right-2',\n 'bottom-left': 'bottom-2 left-2',\n 'bottom-right': 'bottom-2 right-2',\n };\n\n return (\n <span\n ref={ref}\n data-slot=\"card-badge\"\n className={cn(\n 'absolute z-10 rounded-md px-2 py-1 text-xs font-medium',\n variantClasses[variant],\n positionClasses[position],\n className\n )}\n {...props}\n >\n {children}\n </span>\n );\n }\n);\n\nCardBadge.displayName = 'CardBadge';\n\n/**\n * Actions area for Card buttons/links\n */\nexport interface CardActionsProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Alignment of actions */\n align?: 'left' | 'center' | 'right' | 'between' | 'around';\n}\n\nconst CardActions = React.forwardRef<HTMLDivElement, CardActionsProps>(\n ({ className, align = 'right', children, ...props }, ref) => {\n const alignClasses = {\n left: 'justify-start',\n center: 'justify-center',\n right: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n };\n\n return (\n <div\n ref={ref}\n data-slot=\"card-actions\"\n className={cn(\n 'flex items-center gap-2 pt-4',\n alignClasses[align],\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nCardActions.displayName = 'CardActions';\n\n/**\n * Divider line within a Card\n */\nconst CardDivider = React.forwardRef<\n globalThis.HTMLHRElement,\n React.HTMLAttributes<globalThis.HTMLHRElement>\n>(({ className, ...props }, ref) => (\n <hr\n ref={ref}\n data-slot=\"card-divider\"\n className={cn('border-border -mx-4 my-4', className)}\n {...props}\n />\n));\n\nCardDivider.displayName = 'CardDivider';\n\n/**\n * Collapsible content section for Cards\n */\nexport interface CardCollapsibleProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Whether the content is expanded */\n expanded?: boolean;\n /** Callback when expand state changes */\n onExpandChange?: (expanded: boolean) => void;\n /** Trigger element/text for expanding */\n trigger?: React.ReactNode;\n}\n\nconst CardCollapsible = React.forwardRef<HTMLDivElement, CardCollapsibleProps>(\n (\n {\n className,\n expanded: controlledExpanded,\n onExpandChange,\n trigger = 'Show more',\n children,\n ...props\n },\n ref\n ) => {\n const [internalExpanded, setInternalExpanded] = React.useState(false);\n const isControlled = controlledExpanded !== undefined;\n const expanded = isControlled ? controlledExpanded : internalExpanded;\n\n const handleToggle = () => {\n if (isControlled) {\n onExpandChange?.(!expanded);\n } else {\n setInternalExpanded(!expanded);\n }\n };\n\n return (\n <div\n ref={ref}\n data-slot=\"card-collapsible\"\n className={cn('', className)}\n {...props}\n >\n <button\n type=\"button\"\n onClick={handleToggle}\n className=\"text-primary-800 focus-visible:ring-primary-500 flex items-center gap-1 rounded text-sm hover:underline focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2\"\n aria-expanded={expanded}\n >\n {typeof trigger === 'string' ? (\n <>\n {expanded ? 'Show less' : trigger}\n <svg\n className={cn(\n 'h-4 w-4 transition-transform',\n expanded && 'rotate-180'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </>\n ) : (\n trigger\n )}\n </button>\n <div\n className={cn(\n 'grid transition-all duration-300 ease-in-out',\n expanded\n ? 'mt-3 grid-rows-[1fr] opacity-100'\n : 'grid-rows-[0fr] opacity-0'\n )}\n >\n <div className=\"overflow-hidden\">{children}</div>\n </div>\n </div>\n );\n }\n);\n\nCardCollapsible.displayName = 'CardCollapsible';\n\n/**\n * Stat/Metric display for Cards\n */\nexport interface CardStatProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The main value/number */\n value: React.ReactNode;\n /** Label describing the stat */\n label: string;\n /** Trend indicator */\n trend?: { value: number; label?: string };\n /** Icon to display */\n icon?: React.ReactNode;\n}\n\nconst CardStat = React.forwardRef<HTMLDivElement, CardStatProps>(\n ({ className, value, label, trend, icon, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"card-stat\"\n className={cn('flex items-start gap-3', className)}\n {...props}\n >\n {icon && (\n <div className=\"bg-primary-500/10 text-primary-800 rounded-lg p-2\">\n {icon}\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-2xl font-bold tracking-tight\">{value}</div>\n <div className=\"text-muted-foreground text-sm\">{label}</div>\n {trend && (\n <div\n className={cn(\n 'mt-1 flex items-center gap-1 text-sm',\n trend.value >= 0 ? 'text-success' : 'text-destructive'\n )}\n >\n <svg\n className={cn('h-4 w-4', trend.value < 0 && 'rotate-180')}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 10l7-7m0 0l7 7m-7-7v18\"\n />\n </svg>\n <span>{Math.abs(trend.value)}%</span>\n {trend.label && (\n <span className=\"text-muted-foreground\">{trend.label}</span>\n )}\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\nCardStat.displayName = 'CardStat';\n\nexport {\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n CardMedia,\n CardBadge,\n CardActions,\n CardDivider,\n CardCollapsible,\n CardStat,\n cardVariants,\n cardAccentVariants,\n};\n"]}