@crestapps/ai-chat-ui 1.0.0-preview.9 → 1.0.0-preview.95

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 (35) hide show
  1. package/dist/ai-chat-widget.js +962 -0
  2. package/dist/ai-chat-widget.js.map +1 -0
  3. package/dist/ai-chat-widget.min.js +2 -0
  4. package/dist/ai-chat-widget.min.js.map +1 -0
  5. package/dist/ai-chat.css +45 -14
  6. package/dist/ai-chat.css.map +1 -1
  7. package/dist/ai-chat.js +1076 -1019
  8. package/dist/ai-chat.js.map +1 -1
  9. package/dist/ai-chat.min.css +1 -1
  10. package/dist/ai-chat.min.js +1 -1
  11. package/dist/ai-chat.min.js.map +1 -1
  12. package/dist/chat-interaction-settings.js +297 -0
  13. package/dist/chat-interaction-settings.js.map +1 -0
  14. package/dist/chat-interaction-settings.min.js +2 -0
  15. package/dist/chat-interaction-settings.min.js.map +1 -0
  16. package/dist/chat-interaction.js +1224 -325
  17. package/dist/chat-interaction.js.map +1 -1
  18. package/dist/chat-interaction.min.js +1 -1
  19. package/dist/chat-interaction.min.js.map +1 -1
  20. package/dist/chat-widget.css +48 -26
  21. package/dist/chat-widget.css.map +1 -1
  22. package/dist/chat-widget.min.css +1 -1
  23. package/dist/document-drop-zone.css +10 -10
  24. package/dist/document-drop-zone.css.map +1 -1
  25. package/dist/document-drop-zone.js +92 -14
  26. package/dist/document-drop-zone.js.map +1 -1
  27. package/dist/document-drop-zone.min.css +1 -1
  28. package/dist/document-drop-zone.min.js +1 -1
  29. package/dist/document-drop-zone.min.js.map +1 -1
  30. package/dist/technical-name-generator.js +36 -8
  31. package/dist/technical-name-generator.js.map +1 -1
  32. package/dist/technical-name-generator.min.js +1 -1
  33. package/dist/technical-name-generator.min.js.map +1 -1
  34. package/package.json +9 -1
  35. package/README.md +0 -145
@@ -1 +1 @@
1
- {"version":3,"sources":["document-drop-zone.js"],"names":["window","document","initDocumentDropZone","options","dropZone","querySelector","fileInput","browseButton","forEach","eventName","addEventListener","preventDefaults","setDragState","event","contains","relatedTarget","files","dataTransfer","length","DataTransfer","Array","prototype","call","file","items","add","dispatchEvent","Event","bubbles","assignFiles","preventDefault","stopPropagation","openPicker","target","closest","click","isActive","classList","toggle"],"mappings":"CAAA,SAAWA,EAAQC,GACf,aAiBAD,EAAOE,qBAAuB,SAA8BC,GACxD,GAAKA,EAAL,CAIA,IAAIC,EAAuC,iBAArBD,EAAQC,SACxBH,EAASI,cAAcF,EAAQC,UAC/BD,EAAQC,SACVE,EAAyC,iBAAtBH,EAAQG,UACzBL,EAASI,cAAcF,EAAQG,WAC/BH,EAAQG,UACVC,EAA+C,iBAAzBJ,EAAQI,aAC5BN,EAASI,cAAcF,EAAQI,cAC/BJ,EAAQI,aAETH,GAAaE,IAiBlB,CAAC,YAAa,WAAY,YAAa,QAAQE,QAAQ,SAAUC,GAC7DL,EAASM,iBAAiBD,EAAWE,EACzC,GAEAP,EAASM,iBAAiB,YAAa,WAAcE,GAAa,EAAO,GACzER,EAASM,iBAAiB,WAAY,WAAcE,GAAa,EAAO,GACxER,EAASM,iBAAiB,YAAa,SAAUG,GACxCT,EAASU,SAASD,EAAME,gBACzBH,GAAa,EAErB,GACAR,EAASM,iBAAiB,OAAQ,SAAUG,GACxCD,GAAa,GACb,IAAII,EAAQH,EAAMI,aAAeJ,EAAMI,aAAaD,MAAQ,KACxDA,GAASA,EAAME,OAAS,GA7DpC,SAAqBZ,EAAWU,GAC5B,GAAKV,GAAcU,EAAnB,CAIA,IAAIC,EAAe,IAAIE,aAEvBC,MAAMC,UAAUb,QAAQc,KAAKN,EAAO,SAAUO,GAC1CN,EAAaO,MAAMC,IAAIF,EAC3B,GAEAjB,EAAUU,MAAQC,EAAaD,MAC/BV,EAAUoB,cAAc,IAAIC,MAAM,SAAU,CAAEC,SAAS,IATvD,CAUJ,CAiDYC,CAAYvB,EAAWU,EAE/B,GAEIT,GACAA,EAAaG,iBAAiB,QAAS,SAAUG,GAC7CA,EAAMiB,iBACNjB,EAAMkB,kBACNC,GACJ,GAGJ5B,EAASM,iBAAiB,QAAS,SAAUG,GACrCA,EAAMoB,OAAOC,QAAQ,4BAIzBF,GACJ,GA9DA,CAgBA,SAASA,IACL1B,EAAU6B,OACd,CAEA,SAASxB,EAAgBE,GACrBA,EAAMiB,iBACNjB,EAAMkB,iBACV,CAEA,SAASnB,EAAawB,GAClBhC,EAASiC,UAAUC,OAAO,+BAAgCF,EAC9D,CAoCJ,CACH,CArFD,CAqFGpC,OAAQC","file":"document-drop-zone.min.js","sourcesContent":["(function (window, document) {\n 'use strict';\n\n function assignFiles(fileInput, files) {\n if (!fileInput || !files) {\n return;\n }\n\n var dataTransfer = new DataTransfer();\n\n Array.prototype.forEach.call(files, function (file) {\n dataTransfer.items.add(file);\n });\n\n fileInput.files = dataTransfer.files;\n fileInput.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n window.initDocumentDropZone = function initDocumentDropZone(options) {\n if (!options) {\n return;\n }\n\n var dropZone = typeof options.dropZone === 'string'\n ? document.querySelector(options.dropZone)\n : options.dropZone;\n var fileInput = typeof options.fileInput === 'string'\n ? document.querySelector(options.fileInput)\n : options.fileInput;\n var browseButton = typeof options.browseButton === 'string'\n ? document.querySelector(options.browseButton)\n : options.browseButton;\n\n if (!dropZone || !fileInput) {\n return;\n }\n\n function openPicker() {\n fileInput.click();\n }\n\n function preventDefaults(event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n function setDragState(isActive) {\n dropZone.classList.toggle('document-drop-zone--dragover', isActive);\n }\n\n ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(function (eventName) {\n dropZone.addEventListener(eventName, preventDefaults);\n });\n\n dropZone.addEventListener('dragenter', function () { setDragState(true); });\n dropZone.addEventListener('dragover', function () { setDragState(true); });\n dropZone.addEventListener('dragleave', function (event) {\n if (!dropZone.contains(event.relatedTarget)) {\n setDragState(false);\n }\n });\n dropZone.addEventListener('drop', function (event) {\n setDragState(false);\n var files = event.dataTransfer ? event.dataTransfer.files : null;\n if (files && files.length > 0) {\n assignFiles(fileInput, files);\n }\n });\n\n if (browseButton) {\n browseButton.addEventListener('click', function (event) {\n event.preventDefault();\n event.stopPropagation();\n openPicker();\n });\n }\n\n dropZone.addEventListener('click', function (event) {\n if (event.target.closest('[data-drop-zone-browse]')) {\n return;\n }\n\n openPicker();\n });\n };\n})(window, document);\n"]}
1
+ {"version":3,"sources":["document-drop-zone.js"],"names":["window","document","dropZoneStateKey","initializeFromElement","element","dataset","documentDropZoneInitialized","options","dropZone","fileInput","getAttribute","browseButton","state","initDocumentDropZone","scanForAutoInitialization","root","querySelectorAll","matches","forEach","startAutoInitialization","MutationObserver","mutations","mutation","addedNodes","node","nodeType","observe","body","childList","subtree","querySelector","dispose","eventName","addEventListener","preventDefaults","handleDragEnter","handleDragOver","handleDragLeave","handleDrop","handleBrowseClick","event","preventDefault","stopPropagation","openPicker","handleClick","removeEventListener","click","setDragState","isActive","classList","toggle","contains","relatedTarget","files","dataTransfer","length","DataTransfer","Array","prototype","call","file","items","add","dispatchEvent","Event","bubbles","assignFiles","target","closest","readyState","once"],"mappings":"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","file":"document-drop-zone.min.js","sourcesContent":["(function (window, document) {\n 'use strict';\n\n var dropZoneStateKey = '__documentDropZoneState';\n\n function assignFiles(fileInput, files) {\n if (!fileInput || !files) {\n return;\n }\n\n var dataTransfer = new DataTransfer();\n\n Array.prototype.forEach.call(files, function (file) {\n dataTransfer.items.add(file);\n });\n\n fileInput.files = dataTransfer.files;\n fileInput.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n window.initDocumentDropZone = function initDocumentDropZone(options) {\n if (!options) {\n return;\n }\n\n var dropZone = typeof options.dropZone === 'string'\n ? document.querySelector(options.dropZone)\n : options.dropZone;\n var fileInput = typeof options.fileInput === 'string'\n ? document.querySelector(options.fileInput)\n : options.fileInput;\n var browseButton = typeof options.browseButton === 'string'\n ? document.querySelector(options.browseButton)\n : options.browseButton;\n\n if (!dropZone || !fileInput) {\n return;\n }\n\n if (dropZone[dropZoneStateKey] && typeof dropZone[dropZoneStateKey].dispose === 'function') {\n dropZone[dropZoneStateKey].dispose();\n }\n\n function openPicker() {\n fileInput.click();\n }\n\n function preventDefaults(event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n function setDragState(isActive) {\n dropZone.classList.toggle('document-drop-zone--dragover', isActive);\n }\n\n function handleDragEnter() {\n setDragState(true);\n }\n\n function handleDragOver() {\n setDragState(true);\n }\n\n function handleDragLeave(event) {\n if (!dropZone.contains(event.relatedTarget)) {\n setDragState(false);\n }\n }\n\n function handleDrop(event) {\n setDragState(false);\n var files = event.dataTransfer ? event.dataTransfer.files : null;\n if (files && files.length > 0) {\n assignFiles(fileInput, files);\n }\n }\n\n ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(function (eventName) {\n dropZone.addEventListener(eventName, preventDefaults);\n });\n\n dropZone.addEventListener('dragenter', handleDragEnter);\n dropZone.addEventListener('dragover', handleDragOver);\n dropZone.addEventListener('dragleave', handleDragLeave);\n dropZone.addEventListener('drop', handleDrop);\n\n var handleBrowseClick = null;\n if (browseButton) {\n handleBrowseClick = function (event) {\n event.preventDefault();\n event.stopPropagation();\n openPicker();\n };\n\n browseButton.addEventListener('click', handleBrowseClick);\n }\n\n function handleClick(event) {\n if (event.target.closest('[data-drop-zone-browse]')) {\n return;\n }\n\n openPicker();\n }\n\n dropZone.addEventListener('click', handleClick);\n\n dropZone[dropZoneStateKey] = {\n dispose: function () {\n ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(function (eventName) {\n dropZone.removeEventListener(eventName, preventDefaults);\n });\n\n dropZone.removeEventListener('dragenter', handleDragEnter);\n dropZone.removeEventListener('dragover', handleDragOver);\n dropZone.removeEventListener('dragleave', handleDragLeave);\n dropZone.removeEventListener('drop', handleDrop);\n dropZone.removeEventListener('click', handleClick);\n\n if (browseButton && handleBrowseClick) {\n browseButton.removeEventListener('click', handleBrowseClick);\n }\n }\n };\n\n return dropZone[dropZoneStateKey];\n };\n\n function initializeFromElement(element) {\n if (!element || element.dataset.documentDropZoneInitialized === 'true') {\n return element ? element[dropZoneStateKey] || null : null;\n }\n\n var options = {\n dropZone: element,\n fileInput: element.getAttribute('data-document-drop-zone-file-input'),\n browseButton: element.getAttribute('data-document-drop-zone-browse-button'),\n };\n\n var state = window.initDocumentDropZone(options);\n if (!state) {\n return null;\n }\n\n element.dataset.documentDropZoneInitialized = 'true';\n\n return state;\n }\n\n function scanForAutoInitialization(root) {\n if (!root || typeof root.querySelectorAll !== 'function') {\n return;\n }\n\n if (typeof root.matches === 'function' && root.matches('[data-document-drop-zone-file-input]')) {\n initializeFromElement(root);\n }\n\n root.querySelectorAll('[data-document-drop-zone-file-input]').forEach(initializeFromElement);\n }\n\n function startAutoInitialization() {\n scanForAutoInitialization(document);\n\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n\n var observer = new MutationObserver(function (mutations) {\n mutations.forEach(function (mutation) {\n mutation.addedNodes.forEach(function (node) {\n if (node && node.nodeType === 1) {\n scanForAutoInitialization(node);\n }\n });\n });\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', startAutoInitialization, { once: true });\n } else {\n startAutoInitialization();\n }\n})(window, document);\n"]}
@@ -16,26 +16,54 @@
16
16
  }
17
17
  function initAutoGenerateTechnicalName(displayId, nameId) {
18
18
  if (!displayId || !nameId) return;
19
- document.addEventListener('DOMContentLoaded', function () {
19
+ function attach() {
20
20
  var displayEl = document.getElementById(displayId);
21
21
  var nameEl = document.getElementById(nameId);
22
22
  if (!displayEl || !nameEl) return;
23
+ if (nameEl.dataset.techNameInitialized === 'true') return;
24
+ nameEl.dataset.techNameInitialized = 'true';
23
25
 
24
26
  // Track whether the user has entered a non-empty value in the Name field.
25
27
  var userEdited = nameEl.value.trim() !== '';
28
+ // Set while we synthesize input/change events on the name field so we can
29
+ // distinguish programmatic updates from real user typing.
30
+ var suppressUserEditedTracking = false;
26
31
 
27
32
  // Resume auto-generation only when the Name field is empty again.
28
- nameEl.addEventListener('input', function () {
33
+ nameEl.addEventListener('input', function (e) {
34
+ if (suppressUserEditedTracking || e && e.isTrusted === false) {
35
+ return;
36
+ }
29
37
  userEdited = nameEl.value.trim() !== '';
30
38
  });
31
-
32
- // Generate on keyup as requested
33
- displayEl.addEventListener('keyup', function () {
39
+ function updateGeneratedValue() {
34
40
  if (userEdited) return;
35
41
  var generated = toTitleCaseNoSpaces(displayEl.value || '');
36
- nameEl.value = generated;
37
- });
38
- });
42
+ if (nameEl.value === generated) {
43
+ return;
44
+ }
45
+ suppressUserEditedTracking = true;
46
+ try {
47
+ nameEl.value = generated;
48
+ nameEl.dispatchEvent(new Event('input', {
49
+ bubbles: true
50
+ }));
51
+ nameEl.dispatchEvent(new Event('change', {
52
+ bubbles: true
53
+ }));
54
+ } finally {
55
+ suppressUserEditedTracking = false;
56
+ }
57
+ }
58
+ displayEl.addEventListener('input', updateGeneratedValue);
59
+ displayEl.addEventListener('keyup', updateGeneratedValue);
60
+ displayEl.addEventListener('change', updateGeneratedValue);
61
+ }
62
+ if (document.readyState === 'loading') {
63
+ document.addEventListener('DOMContentLoaded', attach);
64
+ } else {
65
+ attach();
66
+ }
39
67
  }
40
68
 
41
69
  // Automatically initialize for any elements using the data attributes.
@@ -1 +1 @@
1
- {"version":3,"sources":["technical-name-generator.js"],"names":["toTitleCaseNoSpaces","value","trim","split","filter","w","length","map","charAt","toUpperCase","slice","toLowerCase","join","initAutoGenerateTechnicalName","displayId","nameId","document","addEventListener","displayEl","getElementById","nameEl","userEdited","generated","autoEls","querySelectorAll","i","el","getAttribute","window"],"mappings":";;;;;AAAA,CAAC,YAAY;EACX;EACA,SAASA,mBAAmBA,CAACC,KAAK,EAAE;IAClC,OAAO,CAACA,KAAK,IAAI,EAAE,EAChBC,IAAI,CAAC;IACN;IAAA,CACCC,KAAK,CAAC,eAAe,CAAC,CACtBC,MAAM,CAAC,UAAUC,CAAC,EAAE;MAAE,OAAOA,CAAC,CAACC,MAAM,GAAG,CAAC;IAAE,CAAC,CAAC,CAC7CC,GAAG,CAAC,UAAUF,CAAC,EAAE;MAAE,OAAOA,CAAC,CAACG,MAAM,CAAC,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC,GAAGJ,CAAC,CAACK,KAAK,CAAC,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;IAAE,CAAC,CAAC,CAClFC,IAAI,CAAC,EAAE,CAAC;EACb;EAEA,SAASC,6BAA6BA,CAACC,SAAS,EAAEC,MAAM,EAAE;IACxD,IAAI,CAACD,SAAS,IAAI,CAACC,MAAM,EAAE;IAC3BC,QAAQ,CAACC,gBAAgB,CAAC,kBAAkB,EAAE,YAAY;MACxD,IAAIC,SAAS,GAAGF,QAAQ,CAACG,cAAc,CAACL,SAAS,CAAC;MAClD,IAAIM,MAAM,GAAGJ,QAAQ,CAACG,cAAc,CAACJ,MAAM,CAAC;MAC5C,IAAI,CAACG,SAAS,IAAI,CAACE,MAAM,EAAE;;MAE3B;MACA,IAAIC,UAAU,GAAGD,MAAM,CAACnB,KAAK,CAACC,IAAI,CAAC,CAAC,KAAK,EAAE;;MAE3C;MACAkB,MAAM,CAACH,gBAAgB,CAAC,OAAO,EAAE,YAAY;QAC3CI,UAAU,GAAGD,MAAM,CAACnB,KAAK,CAACC,IAAI,CAAC,CAAC,KAAK,EAAE;MACzC,CAAC,CAAC;;MAEF;MACAgB,SAAS,CAACD,gBAAgB,CAAC,OAAO,EAAE,YAAY;QAC9C,IAAII,UAAU,EAAE;QAChB,IAAIC,SAAS,GAAGtB,mBAAmB,CAACkB,SAAS,CAACjB,KAAK,IAAI,EAAE,CAAC;QAC1DmB,MAAM,CAACnB,KAAK,GAAGqB,SAAS;MAC1B,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;;EAEA;EACAN,QAAQ,CAACC,gBAAgB,CAAC,kBAAkB,EAAE,YAAY;IACxD,IAAIM,OAAO,GAAGP,QAAQ,CAACQ,gBAAgB,CAAC,uBAAuB,CAAC;IAChE,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,OAAO,CAACjB,MAAM,EAAEmB,CAAC,EAAE,EAAE;MACvC,IAAIC,EAAE,GAAGH,OAAO,CAACE,CAAC,CAAC;MACnB,IAAIX,SAAS,GAAGY,EAAE,CAACC,YAAY,CAAC,iBAAiB,CAAC;MAClD,IAAIZ,MAAM,GAAGW,EAAE,CAACC,YAAY,CAAC,cAAc,CAAC;MAC5C,IAAIb,SAAS,IAAIC,MAAM,EAAE;QACvB;QACAF,6BAA6B,CAACC,SAAS,EAAEC,MAAM,CAAC;MAClD;IACF;EACF,CAAC,CAAC;EAEFa,MAAM,CAACf,6BAA6B,GAAGA,6BAA6B;AACtE,CAAC,EAAE,CAAC","file":"technical-name-generator.js","sourcesContent":["(function () {\n // Expose initializer globally so views can call it with specific field IDs.\n function toTitleCaseNoSpaces(value) {\n return (value || '')\n .trim()\n // split on whitespace or common separators or any non-alphanumeric\n .split(/[^A-Za-z0-9]+/)\n .filter(function (w) { return w.length > 0; })\n .map(function (w) { return w.charAt(0).toUpperCase() + w.slice(1).toLowerCase(); })\n .join('');\n }\n\n function initAutoGenerateTechnicalName(displayId, nameId) {\n if (!displayId || !nameId) return;\n document.addEventListener('DOMContentLoaded', function () {\n var displayEl = document.getElementById(displayId);\n var nameEl = document.getElementById(nameId);\n if (!displayEl || !nameEl) return;\n\n // Track whether the user has entered a non-empty value in the Name field.\n var userEdited = nameEl.value.trim() !== '';\n\n // Resume auto-generation only when the Name field is empty again.\n nameEl.addEventListener('input', function () {\n userEdited = nameEl.value.trim() !== '';\n });\n\n // Generate on keyup as requested\n displayEl.addEventListener('keyup', function () {\n if (userEdited) return;\n var generated = toTitleCaseNoSpaces(displayEl.value || '');\n nameEl.value = generated;\n });\n });\n }\n\n // Automatically initialize for any elements using the data attributes.\n document.addEventListener('DOMContentLoaded', function () {\n var autoEls = document.querySelectorAll('[data-auto-tech-name]');\n for (var i = 0; i < autoEls.length; i++) {\n var el = autoEls[i];\n var displayId = el.getAttribute('data-display-id');\n var nameId = el.getAttribute('data-name-id');\n if (displayId && nameId) {\n // call initializer immediately (it will attach listeners)\n initAutoGenerateTechnicalName(displayId, nameId);\n }\n }\n });\n\n window.initAutoGenerateTechnicalName = initAutoGenerateTechnicalName;\n})();\n"]}
1
+ {"version":3,"sources":["technical-name-generator.js"],"names":["toTitleCaseNoSpaces","value","trim","split","filter","w","length","map","charAt","toUpperCase","slice","toLowerCase","join","initAutoGenerateTechnicalName","displayId","nameId","attach","displayEl","document","getElementById","nameEl","dataset","techNameInitialized","userEdited","suppressUserEditedTracking","addEventListener","e","isTrusted","updateGeneratedValue","generated","dispatchEvent","Event","bubbles","readyState","autoEls","querySelectorAll","i","el","getAttribute","window"],"mappings":"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","file":"technical-name-generator.js","sourcesContent":["(function () {\n // Expose initializer globally so views can call it with specific field IDs.\n function toTitleCaseNoSpaces(value) {\n return (value || '')\n .trim()\n // split on whitespace or common separators or any non-alphanumeric\n .split(/[^A-Za-z0-9]+/)\n .filter(function (w) { return w.length > 0; })\n .map(function (w) { return w.charAt(0).toUpperCase() + w.slice(1).toLowerCase(); })\n .join('');\n }\n\n function initAutoGenerateTechnicalName(displayId, nameId) {\n if (!displayId || !nameId) return;\n\n function attach() {\n var displayEl = document.getElementById(displayId);\n var nameEl = document.getElementById(nameId);\n if (!displayEl || !nameEl) return;\n if (nameEl.dataset.techNameInitialized === 'true') return;\n\n nameEl.dataset.techNameInitialized = 'true';\n\n // Track whether the user has entered a non-empty value in the Name field.\n var userEdited = nameEl.value.trim() !== '';\n // Set while we synthesize input/change events on the name field so we can\n // distinguish programmatic updates from real user typing.\n var suppressUserEditedTracking = false;\n\n // Resume auto-generation only when the Name field is empty again.\n nameEl.addEventListener('input', function (e) {\n if (suppressUserEditedTracking || (e && e.isTrusted === false)) {\n return;\n }\n\n userEdited = nameEl.value.trim() !== '';\n });\n\n function updateGeneratedValue() {\n if (userEdited) return;\n\n var generated = toTitleCaseNoSpaces(displayEl.value || '');\n\n if (nameEl.value === generated) {\n return;\n }\n\n suppressUserEditedTracking = true;\n try {\n nameEl.value = generated;\n nameEl.dispatchEvent(new Event('input', { bubbles: true }));\n nameEl.dispatchEvent(new Event('change', { bubbles: true }));\n } finally {\n suppressUserEditedTracking = false;\n }\n }\n\n displayEl.addEventListener('input', updateGeneratedValue);\n displayEl.addEventListener('keyup', updateGeneratedValue);\n displayEl.addEventListener('change', updateGeneratedValue);\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', attach);\n } else {\n attach();\n }\n }\n\n // Automatically initialize for any elements using the data attributes.\n document.addEventListener('DOMContentLoaded', function () {\n var autoEls = document.querySelectorAll('[data-auto-tech-name]');\n for (var i = 0; i < autoEls.length; i++) {\n var el = autoEls[i];\n var displayId = el.getAttribute('data-display-id');\n var nameId = el.getAttribute('data-name-id');\n if (displayId && nameId) {\n // call initializer immediately (it will attach listeners)\n initAutoGenerateTechnicalName(displayId, nameId);\n }\n }\n });\n\n window.initAutoGenerateTechnicalName = initAutoGenerateTechnicalName;\n})();\n"]}
@@ -1,2 +1,2 @@
1
- !function(){function t(t,e){t&&e&&document.addEventListener("DOMContentLoaded",function(){var n=document.getElementById(t),a=document.getElementById(e);if(n&&a){var i=""!==a.value.trim();a.addEventListener("input",function(){i=""!==a.value.trim()}),n.addEventListener("keyup",function(){if(!i){var t=(n.value||""||"").trim().split(/[^A-Za-z0-9]+/).filter(function(t){return t.length>0}).map(function(t){return t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()}).join("");a.value=t}})}})}document.addEventListener("DOMContentLoaded",function(){for(var e=document.querySelectorAll("[data-auto-tech-name]"),n=0;n<e.length;n++){var a=e[n],i=a.getAttribute("data-display-id"),d=a.getAttribute("data-name-id");i&&d&&t(i,d)}}),window.initAutoGenerateTechnicalName=t}();
1
+ !function(){function e(e,t){function n(){var n=document.getElementById(e),a=document.getElementById(t);if(n&&a&&"true"!==a.dataset.techNameInitialized){a.dataset.techNameInitialized="true";var i=""!==a.value.trim(),d=!1;a.addEventListener("input",function(e){d||e&&!1===e.isTrusted||(i=""!==a.value.trim())}),n.addEventListener("input",u),n.addEventListener("keyup",u),n.addEventListener("change",u)}function u(){if(!i){var e=(n.value||""||"").trim().split(/[^A-Za-z0-9]+/).filter(function(e){return e.length>0}).map(function(e){return e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()}).join("");if(a.value!==e){d=!0;try{a.value=e,a.dispatchEvent(new Event("input",{bubbles:!0})),a.dispatchEvent(new Event("change",{bubbles:!0}))}finally{d=!1}}}}}e&&t&&("loading"===document.readyState?document.addEventListener("DOMContentLoaded",n):n())}document.addEventListener("DOMContentLoaded",function(){for(var t=document.querySelectorAll("[data-auto-tech-name]"),n=0;n<t.length;n++){var a=t[n],i=a.getAttribute("data-display-id"),d=a.getAttribute("data-name-id");i&&d&&e(i,d)}}),window.initAutoGenerateTechnicalName=e}();
2
2
  //# sourceMappingURL=technical-name-generator.min.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["technical-name-generator.js"],"names":["initAutoGenerateTechnicalName","displayId","nameId","document","addEventListener","displayEl","getElementById","nameEl","userEdited","value","trim","generated","split","filter","w","length","map","charAt","toUpperCase","slice","toLowerCase","join","autoEls","querySelectorAll","i","el","getAttribute","window"],"mappings":"CAAA,WAYE,SAASA,EAA8BC,EAAWC,GAC3CD,GAAcC,GACnBC,SAASC,iBAAiB,mBAAoB,WAC5C,IAAIC,EAAYF,SAASG,eAAeL,GACpCM,EAASJ,SAASG,eAAeJ,GACrC,GAAKG,GAAcE,EAAnB,CAGA,IAAIC,EAAqC,KAAxBD,EAAOE,MAAMC,OAG9BH,EAAOH,iBAAiB,QAAS,WAC/BI,EAAqC,KAAxBD,EAAOE,MAAMC,MAC5B,GAGAL,EAAUD,iBAAiB,QAAS,WAClC,IAAII,EAAJ,CACA,IAAIG,GAAgCN,EAAUI,OAAS,IA3B1C,IACdC,OAEAE,MAAM,iBACNC,OAAO,SAAUC,GAAK,OAAOA,EAAEC,OAAS,CAAG,GAC3CC,IAAI,SAAUF,GAAK,OAAOA,EAAEG,OAAO,GAAGC,cAAgBJ,EAAEK,MAAM,GAAGC,aAAe,GAChFC,KAAK,IAsBJd,EAAOE,MAAQE,CAFC,CAGlB,EAf2B,CAgB7B,EACF,CAGAR,SAASC,iBAAiB,mBAAoB,WAE5C,IADA,IAAIkB,EAAUnB,SAASoB,iBAAiB,yBAC/BC,EAAI,EAAGA,EAAIF,EAAQP,OAAQS,IAAK,CACvC,IAAIC,EAAKH,EAAQE,GACbvB,EAAYwB,EAAGC,aAAa,mBAC5BxB,EAASuB,EAAGC,aAAa,gBACzBzB,GAAaC,GAEfF,EAA8BC,EAAWC,EAE7C,CACF,GAEAyB,OAAO3B,8BAAgCA,CACxC,CAnDD","file":"technical-name-generator.min.js","sourcesContent":["(function () {\n // Expose initializer globally so views can call it with specific field IDs.\n function toTitleCaseNoSpaces(value) {\n return (value || '')\n .trim()\n // split on whitespace or common separators or any non-alphanumeric\n .split(/[^A-Za-z0-9]+/)\n .filter(function (w) { return w.length > 0; })\n .map(function (w) { return w.charAt(0).toUpperCase() + w.slice(1).toLowerCase(); })\n .join('');\n }\n\n function initAutoGenerateTechnicalName(displayId, nameId) {\n if (!displayId || !nameId) return;\n document.addEventListener('DOMContentLoaded', function () {\n var displayEl = document.getElementById(displayId);\n var nameEl = document.getElementById(nameId);\n if (!displayEl || !nameEl) return;\n\n // Track whether the user has entered a non-empty value in the Name field.\n var userEdited = nameEl.value.trim() !== '';\n\n // Resume auto-generation only when the Name field is empty again.\n nameEl.addEventListener('input', function () {\n userEdited = nameEl.value.trim() !== '';\n });\n\n // Generate on keyup as requested\n displayEl.addEventListener('keyup', function () {\n if (userEdited) return;\n var generated = toTitleCaseNoSpaces(displayEl.value || '');\n nameEl.value = generated;\n });\n });\n }\n\n // Automatically initialize for any elements using the data attributes.\n document.addEventListener('DOMContentLoaded', function () {\n var autoEls = document.querySelectorAll('[data-auto-tech-name]');\n for (var i = 0; i < autoEls.length; i++) {\n var el = autoEls[i];\n var displayId = el.getAttribute('data-display-id');\n var nameId = el.getAttribute('data-name-id');\n if (displayId && nameId) {\n // call initializer immediately (it will attach listeners)\n initAutoGenerateTechnicalName(displayId, nameId);\n }\n }\n });\n\n window.initAutoGenerateTechnicalName = initAutoGenerateTechnicalName;\n})();\n"]}
1
+ {"version":3,"sources":["technical-name-generator.js"],"names":["initAutoGenerateTechnicalName","displayId","nameId","attach","displayEl","document","getElementById","nameEl","dataset","techNameInitialized","userEdited","value","trim","suppressUserEditedTracking","addEventListener","e","isTrusted","updateGeneratedValue","generated","split","filter","w","length","map","charAt","toUpperCase","slice","toLowerCase","join","dispatchEvent","Event","bubbles","readyState","autoEls","querySelectorAll","i","el","getAttribute","window"],"mappings":"CAAA,WAYE,SAASA,EAA8BC,EAAWC,GAGhD,SAASC,IACP,IAAIC,EAAYC,SAASC,eAAeL,GACpCM,EAASF,SAASC,eAAeJ,GACrC,GAAKE,GAAcG,GACwB,SAAvCA,EAAOC,QAAQC,oBAAnB,CAEAF,EAAOC,QAAQC,oBAAsB,OAGrC,IAAIC,EAAqC,KAAxBH,EAAOI,MAAMC,OAG1BC,GAA6B,EAGjCN,EAAOO,iBAAiB,QAAS,SAAUC,GACrCF,GAA+BE,IAAqB,IAAhBA,EAAEC,YAI1CN,EAAqC,KAAxBH,EAAOI,MAAMC,OAC5B,GAqBAR,EAAUU,iBAAiB,QAASG,GACpCb,EAAUU,iBAAiB,QAASG,GACpCb,EAAUU,iBAAiB,SAAUG,EAxCc,CAmBnD,SAASA,IACP,IAAIP,EAAJ,CAEA,IAAIQ,GAAgCd,EAAUO,OAAS,IAtC1C,IACdC,OAEAO,MAAM,iBACNC,OAAO,SAAUC,GAAK,OAAOA,EAAEC,OAAS,CAAG,GAC3CC,IAAI,SAAUF,GAAK,OAAOA,EAAEG,OAAO,GAAGC,cAAgBJ,EAAEK,MAAM,GAAGC,aAAe,GAChFC,KAAK,IAkCJ,GAAIrB,EAAOI,QAAUO,EAArB,CAIAL,GAA6B,EAC7B,IACEN,EAAOI,MAAQO,EACfX,EAAOsB,cAAc,IAAIC,MAAM,QAAS,CAAEC,SAAS,KACnDxB,EAAOsB,cAAc,IAAIC,MAAM,SAAU,CAAEC,SAAS,IACtD,CAAC,QACClB,GAA6B,CAC/B,CATA,CANgB,CAgBlB,CAKF,CA/CKZ,GAAcC,IAiDS,YAAxBG,SAAS2B,WACX3B,SAASS,iBAAiB,mBAAoBX,GAE9CA,IAEJ,CAGAE,SAASS,iBAAiB,mBAAoB,WAE5C,IADA,IAAImB,EAAU5B,SAAS6B,iBAAiB,yBAC/BC,EAAI,EAAGA,EAAIF,EAAQX,OAAQa,IAAK,CACvC,IAAIC,EAAKH,EAAQE,GACblC,EAAYmC,EAAGC,aAAa,mBAC5BnC,EAASkC,EAAGC,aAAa,gBACzBpC,GAAaC,GAEfF,EAA8BC,EAAWC,EAE7C,CACF,GAEAoC,OAAOtC,8BAAgCA,CACxC,CApFD","file":"technical-name-generator.min.js","sourcesContent":["(function () {\n // Expose initializer globally so views can call it with specific field IDs.\n function toTitleCaseNoSpaces(value) {\n return (value || '')\n .trim()\n // split on whitespace or common separators or any non-alphanumeric\n .split(/[^A-Za-z0-9]+/)\n .filter(function (w) { return w.length > 0; })\n .map(function (w) { return w.charAt(0).toUpperCase() + w.slice(1).toLowerCase(); })\n .join('');\n }\n\n function initAutoGenerateTechnicalName(displayId, nameId) {\n if (!displayId || !nameId) return;\n\n function attach() {\n var displayEl = document.getElementById(displayId);\n var nameEl = document.getElementById(nameId);\n if (!displayEl || !nameEl) return;\n if (nameEl.dataset.techNameInitialized === 'true') return;\n\n nameEl.dataset.techNameInitialized = 'true';\n\n // Track whether the user has entered a non-empty value in the Name field.\n var userEdited = nameEl.value.trim() !== '';\n // Set while we synthesize input/change events on the name field so we can\n // distinguish programmatic updates from real user typing.\n var suppressUserEditedTracking = false;\n\n // Resume auto-generation only when the Name field is empty again.\n nameEl.addEventListener('input', function (e) {\n if (suppressUserEditedTracking || (e && e.isTrusted === false)) {\n return;\n }\n\n userEdited = nameEl.value.trim() !== '';\n });\n\n function updateGeneratedValue() {\n if (userEdited) return;\n\n var generated = toTitleCaseNoSpaces(displayEl.value || '');\n\n if (nameEl.value === generated) {\n return;\n }\n\n suppressUserEditedTracking = true;\n try {\n nameEl.value = generated;\n nameEl.dispatchEvent(new Event('input', { bubbles: true }));\n nameEl.dispatchEvent(new Event('change', { bubbles: true }));\n } finally {\n suppressUserEditedTracking = false;\n }\n }\n\n displayEl.addEventListener('input', updateGeneratedValue);\n displayEl.addEventListener('keyup', updateGeneratedValue);\n displayEl.addEventListener('change', updateGeneratedValue);\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', attach);\n } else {\n attach();\n }\n }\n\n // Automatically initialize for any elements using the data attributes.\n document.addEventListener('DOMContentLoaded', function () {\n var autoEls = document.querySelectorAll('[data-auto-tech-name]');\n for (var i = 0; i < autoEls.length; i++) {\n var el = autoEls[i];\n var displayId = el.getAttribute('data-display-id');\n var nameId = el.getAttribute('data-name-id');\n if (displayId && nameId) {\n // call initializer immediately (it will attach listeners)\n initAutoGenerateTechnicalName(displayId, nameId);\n }\n }\n });\n\n window.initAutoGenerateTechnicalName = initAutoGenerateTechnicalName;\n})();\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crestapps/ai-chat-ui",
3
- "version": "1.0.0-preview.9",
3
+ "version": "1.0.0-preview.95",
4
4
  "description": "Browser-ready JavaScript widgets and CSS for CrestApps AI chat sessions and chat interactions. Supports streaming responses, image generation, Chart.js interactive charts, document uploads, copy-to-clipboard, and feedback buttons.",
5
5
  "license": "MIT",
6
6
  "author": "CrestApps",
@@ -13,6 +13,10 @@
13
13
  "bugs": {
14
14
  "url": "https://github.com/CrestApps/CrestApps.Core/issues"
15
15
  },
16
+ "publishConfig": {
17
+ "access": "public",
18
+ "registry": "https://registry.npmjs.org/"
19
+ },
16
20
  "keywords": [
17
21
  "ai",
18
22
  "chat",
@@ -35,6 +39,10 @@
35
39
  "./ai-chat.min": "./dist/ai-chat.min.js",
36
40
  "./ai-chat.js.map": "./dist/ai-chat.js.map",
37
41
  "./ai-chat.min.js.map": "./dist/ai-chat.min.js.map",
42
+ "./ai-chat-widget": "./dist/ai-chat-widget.js",
43
+ "./ai-chat-widget.min": "./dist/ai-chat-widget.min.js",
44
+ "./ai-chat-widget.js.map": "./dist/ai-chat-widget.js.map",
45
+ "./ai-chat-widget.min.js.map": "./dist/ai-chat-widget.min.js.map",
38
46
  "./chat-interaction": "./dist/chat-interaction.js",
39
47
  "./chat-interaction.min": "./dist/chat-interaction.min.js",
40
48
  "./chat-interaction.js.map": "./dist/chat-interaction.js.map",
package/README.md DELETED
@@ -1,145 +0,0 @@
1
- # @crestapps/ai-chat-ui
2
-
3
- Browser-ready JavaScript widgets and CSS for **CrestApps AI** chat sessions and chat interactions. Drop them into any page that uses the [CrestApps.Core](https://github.com/CrestApps/CrestApps.Core) backend to get a fully functional AI chat experience with streaming responses, document uploads, image generation, interactive charts, copy-to-clipboard, and user feedback buttons.
4
-
5
- ## Features
6
-
7
- | Feature | Details |
8
- |---------|---------|
9
- | **Streaming responses** | Real-time token-by-token output via SignalR or REST |
10
- | **Image generation** | Inline rendering of images produced by `GenerateImageTool` |
11
- | **Interactive charts** | [Chart.js](https://www.chartjs.org/) rendering of charts produced by `GenerateChartTool` (optional peer dependency) |
12
- | **Document uploads** | Drag-and-drop or file-picker uploads attached to chat sessions |
13
- | **Copy to clipboard** | One-click copy of any assistant message |
14
- | **Feedback buttons** | Thumbs-up / thumbs-down per message |
15
- | **Markdown rendering** | Powered by [marked](https://github.com/markedjs/marked) and [DOMPurify](https://github.com/cure53/DOMPurify) |
16
-
17
- ## Installation
18
-
19
- ```bash
20
- npm install @crestapps/ai-chat-ui
21
- ```
22
-
23
- ### Optional: Chart.js Support
24
-
25
- To render interactive charts, also install Chart.js:
26
-
27
- ```bash
28
- npm install chart.js
29
- ```
30
-
31
- ## Included Files
32
-
33
- After installation the `dist/` directory contains:
34
-
35
- | File | Description |
36
- |------|-------------|
37
- | `ai-chat.js` / `.min.js` | AI Chat widget — manages sessions, uploads, streaming, and the full chat UI |
38
- | `chat-interaction.js` / `.min.js` | Chat Interaction widget — lighter standalone chat experience |
39
- | `document-drop-zone.js` / `.min.js` | Drag-and-drop file upload component |
40
- | `technical-name-generator.js` / `.min.js` | Auto-generates URL-safe technical names from display names |
41
- | `chat-widget.css` / `.min.css` | Styles for the floating AI Chat widget |
42
- | `document-drop-zone.css` / `.min.css` | Styles for the document drop-zone component |
43
-
44
- ## Usage
45
-
46
- ### Via CDN (simplest)
47
-
48
- Use [jsDelivr](https://www.jsdelivr.com/) to load files directly — no install required:
49
-
50
- ```html
51
- <!-- CSS -->
52
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@crestapps/ai-chat-ui@1.0.0-preview-22/dist/chat-widget.min.css" />
53
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@crestapps/ai-chat-ui@1.0.0-preview-22/dist/document-drop-zone.min.css" />
54
-
55
- <!-- Required dependencies -->
56
- <script src="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.prod.js"></script>
57
- <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
58
- <script src="https://cdn.jsdelivr.net/npm/dompurify/dist/purify.min.js"></script>
59
- <script src="https://cdn.jsdelivr.net/npm/@microsoft/signalr/dist/browser/signalr.min.js"></script>
60
-
61
- <!-- Optional: Chart.js for interactive charts -->
62
- <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
63
-
64
- <!-- CrestApps AI Chat UI -->
65
- <script src="https://cdn.jsdelivr.net/npm/@crestapps/ai-chat-ui@1.0.0-preview-22/dist/ai-chat.min.js"></script>
66
- <script src="https://cdn.jsdelivr.net/npm/@crestapps/ai-chat-ui@1.0.0-preview-22/dist/document-drop-zone.min.js"></script>
67
- ```
68
-
69
- > **Tip:** Replace `@1.0.0-preview-22` with the version you want, or omit it to always get the latest release.
70
-
71
- ### Via npm
72
-
73
- ```bash
74
- npm install @crestapps/ai-chat-ui
75
- ```
76
-
77
- Then copy the files from `node_modules/@crestapps/ai-chat-ui/dist/` into your web application's static assets folder and reference them with `<script>` and `<link>` tags.
78
-
79
- ### CDN URL Pattern
80
-
81
- All files in the package are available via jsDelivr using this pattern:
82
-
83
- ```
84
- https://cdn.jsdelivr.net/npm/@crestapps/ai-chat-ui@<version>/dist/<file>
85
- ```
86
-
87
- | Asset | CDN URL |
88
- |-------|---------|
89
- | `ai-chat.min.js` | `https://cdn.jsdelivr.net/npm/@crestapps/ai-chat-ui@1.0.0-preview-22/dist/ai-chat.min.js` |
90
- | `chat-interaction.min.js` | `https://cdn.jsdelivr.net/npm/@crestapps/ai-chat-ui@1.0.0-preview-22/dist/chat-interaction.min.js` |
91
- | `document-drop-zone.min.js` | `https://cdn.jsdelivr.net/npm/@crestapps/ai-chat-ui@1.0.0-preview-22/dist/document-drop-zone.min.js` |
92
- | `technical-name-generator.min.js` | `https://cdn.jsdelivr.net/npm/@crestapps/ai-chat-ui@1.0.0-preview-22/dist/technical-name-generator.min.js` |
93
- | `chat-widget.min.css` | `https://cdn.jsdelivr.net/npm/@crestapps/ai-chat-ui@1.0.0-preview-22/dist/chat-widget.min.css` |
94
- | `document-drop-zone.min.css` | `https://cdn.jsdelivr.net/npm/@crestapps/ai-chat-ui@1.0.0-preview-22/dist/document-drop-zone.min.css` |
95
-
96
- ### Initializing the AI Chat Widget
97
-
98
- ```javascript
99
- var chatManager = window.openAIChatManager();
100
- chatManager.createInstance({
101
- containerEl: '#ai-chat-container',
102
- profileId: 'your-profile-id',
103
- baseUrl: '/ai/chat-sessions',
104
- hubUrl: '/ai-chat-hub'
105
- });
106
- ```
107
-
108
- ### Initializing the Chat Interaction Widget
109
-
110
- ```javascript
111
- var interactionManager = window.chatInteractionManager();
112
- interactionManager.createInstance({
113
- containerEl: '#chat-interaction-container',
114
- deploymentName: 'your-deployment-name',
115
- baseUrl: '/chat-interactions',
116
- hubUrl: '/chat-interaction-hub'
117
- });
118
- ```
119
-
120
- ## Client-Side Dependencies
121
-
122
- Both widgets expect these libraries to be loaded on the page **before** the CrestApps script:
123
-
124
- | Library | Required | Purpose |
125
- |---------|----------|---------|
126
- | [Vue 3](https://vuejs.org/) | ✅ Yes | Reactive UI rendering |
127
- | [marked](https://github.com/markedjs/marked) | ✅ Yes | Markdown → HTML conversion |
128
- | [DOMPurify](https://github.com/cure53/DOMPurify) | ✅ Yes | HTML sanitization |
129
- | [SignalR](https://learn.microsoft.com/aspnet/core/signalr/) | ✅ Yes | Real-time streaming |
130
- | [Chart.js](https://www.chartjs.org/) | ❌ Optional | Interactive chart rendering |
131
- | [highlight.js](https://highlightjs.org/) | ❌ Optional | Code syntax highlighting |
132
-
133
- ## Backend Requirements
134
-
135
- These widgets are designed to work with the [CrestApps.Core](https://github.com/CrestApps/CrestApps.Core) .NET backend. You need:
136
-
137
- 1. **AI Chat sessions** — register with `.AddAISuite(ai => ai.AddChatInteractions(...))` or AI Profiles
138
- 2. **At least one AI provider** — e.g., `.AddOpenAI()`, `.AddAzureOpenAI()`, `.AddOllama()`
139
- 3. **SignalR hubs** — register with `.AddSignalR()`
140
-
141
- See the [CrestApps.Core documentation](https://crestapps.com/docs/core/chat) for full backend setup instructions.
142
-
143
- ## License
144
-
145
- [MIT](https://github.com/CrestApps/CrestApps.Core/blob/main/LICENSE)