comfyui-frontend-package 1.38.2__py3-none-any.whl → 1.38.3__py3-none-any.whl

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 (131) hide show
  1. comfyui_frontend_package/static/assets/{AboutPanel-C7253TdA.js → AboutPanel-CYH8kZrG.js} +2 -2
  2. comfyui_frontend_package/static/assets/{AboutPanel-C7253TdA.js.map → AboutPanel-CYH8kZrG.js.map} +1 -1
  3. comfyui_frontend_package/static/assets/{AudioPreviewPlayer-DgSsFFU7.js → AudioPreviewPlayer-BwJepJEw.js} +2 -2
  4. comfyui_frontend_package/static/assets/{AudioPreviewPlayer-DgSsFFU7.js.map → AudioPreviewPlayer-BwJepJEw.js.map} +1 -1
  5. comfyui_frontend_package/static/assets/{ComfyQueueButton-DriR7JtM.js → ComfyQueueButton-BM8zaTn_.js} +2 -2
  6. comfyui_frontend_package/static/assets/{ComfyQueueButton-DriR7JtM.js.map → ComfyQueueButton-BM8zaTn_.js.map} +1 -1
  7. comfyui_frontend_package/static/assets/{ExtensionPanel-yJP3r-dq.js → ExtensionPanel-CkIkopXr.js} +2 -2
  8. comfyui_frontend_package/static/assets/{ExtensionPanel-yJP3r-dq.js.map → ExtensionPanel-CkIkopXr.js.map} +1 -1
  9. comfyui_frontend_package/static/assets/{GraphView-D-tZ3xO5.css → GraphView-CoiT3fdb.css} +1 -1
  10. comfyui_frontend_package/static/assets/GraphView-Djp0ICHX.js +15 -0
  11. comfyui_frontend_package/static/assets/GraphView-Djp0ICHX.js.map +1 -0
  12. comfyui_frontend_package/static/assets/{KeybindingPanel-f7VKBCyl.js → KeybindingPanel-5iNg_eid.js} +2 -2
  13. comfyui_frontend_package/static/assets/{KeybindingPanel-f7VKBCyl.js.map → KeybindingPanel-5iNg_eid.js.map} +1 -1
  14. comfyui_frontend_package/static/assets/LazyImage.vue_vue_type_script_setup_true_lang-Bwob1r0X.js +2 -0
  15. comfyui_frontend_package/static/assets/LazyImage.vue_vue_type_script_setup_true_lang-Bwob1r0X.js.map +1 -0
  16. comfyui_frontend_package/static/assets/{LegacyCreditsPanel-e57J4OZv.js → LegacyCreditsPanel-D28HHk-A.js} +2 -2
  17. comfyui_frontend_package/static/assets/{LegacyCreditsPanel-e57J4OZv.js.map → LegacyCreditsPanel-D28HHk-A.js.map} +1 -1
  18. comfyui_frontend_package/static/assets/{Load3D-DYW1gw8I.js → Load3D-CPNYDT4-.js} +2 -2
  19. comfyui_frontend_package/static/assets/Load3D-CPNYDT4-.js.map +1 -0
  20. comfyui_frontend_package/static/assets/{Load3D.vue_vue_type_script_setup_true_lang-BLcsvL5E.js → Load3D.vue_vue_type_script_setup_true_lang-KEzORqB0.js} +2 -2
  21. comfyui_frontend_package/static/assets/{Load3D.vue_vue_type_script_setup_true_lang-BLcsvL5E.js.map → Load3D.vue_vue_type_script_setup_true_lang-KEzORqB0.js.map} +1 -1
  22. comfyui_frontend_package/static/assets/{Media3DTop-D77j8ukJ.js → Media3DTop-CQp4nFvB.js} +2 -2
  23. comfyui_frontend_package/static/assets/{Media3DTop-D77j8ukJ.js.map → Media3DTop-CQp4nFvB.js.map} +1 -1
  24. comfyui_frontend_package/static/assets/{ServerConfigPanel-CQPgIsZk.js → ServerConfigPanel-B3WCmowi.js} +2 -2
  25. comfyui_frontend_package/static/assets/{ServerConfigPanel-CQPgIsZk.js.map → ServerConfigPanel-B3WCmowi.js.map} +1 -1
  26. comfyui_frontend_package/static/assets/{SubscriptionRequiredDialogContent-DtxMOWxy.js → SubscriptionRequiredDialogContent-JgqOjXs3.js} +2 -2
  27. comfyui_frontend_package/static/assets/{SubscriptionRequiredDialogContent-DtxMOWxy.js.map → SubscriptionRequiredDialogContent-JgqOjXs3.js.map} +1 -1
  28. comfyui_frontend_package/static/assets/{UserPanel-BPwKKP_j.js → UserPanel-B5k84B9y.js} +2 -2
  29. comfyui_frontend_package/static/assets/{UserPanel-BPwKKP_j.js.map → UserPanel-B5k84B9y.js.map} +1 -1
  30. comfyui_frontend_package/static/assets/{UserSelectView-DNaXeKx4.js → UserSelectView-R_nCWiDS.js} +2 -2
  31. comfyui_frontend_package/static/assets/{UserSelectView-DNaXeKx4.js.map → UserSelectView-R_nCWiDS.js.map} +1 -1
  32. comfyui_frontend_package/static/assets/{ValueControlPopover-kd7h8GFO.js → ValueControlPopover-BqA-EaFY.js} +2 -2
  33. comfyui_frontend_package/static/assets/{ValueControlPopover-kd7h8GFO.js.map → ValueControlPopover-BqA-EaFY.js.map} +1 -1
  34. comfyui_frontend_package/static/assets/{WidgetAudioUI-B-Ra7X5I.js → WidgetAudioUI-Bu3u9PBZ.js} +2 -2
  35. comfyui_frontend_package/static/assets/{WidgetAudioUI-B-Ra7X5I.js.map → WidgetAudioUI-Bu3u9PBZ.js.map} +1 -1
  36. comfyui_frontend_package/static/assets/{WidgetButton-BQWWeE_x.js → WidgetButton-CS0lZIN_.js} +2 -2
  37. comfyui_frontend_package/static/assets/{WidgetButton-BQWWeE_x.js.map → WidgetButton-CS0lZIN_.js.map} +1 -1
  38. comfyui_frontend_package/static/assets/{WidgetColorPicker-4E2rnL8u.js → WidgetColorPicker-CQ_vqexP.js} +2 -2
  39. comfyui_frontend_package/static/assets/{WidgetColorPicker-4E2rnL8u.js.map → WidgetColorPicker-CQ_vqexP.js.map} +1 -1
  40. comfyui_frontend_package/static/assets/{WidgetGalleria-DaEjYhLq.js → WidgetGalleria-CE2__qNK.js} +2 -2
  41. comfyui_frontend_package/static/assets/{WidgetGalleria-DaEjYhLq.js.map → WidgetGalleria-CE2__qNK.js.map} +1 -1
  42. comfyui_frontend_package/static/assets/WidgetInputNumber-CR_vNT3l.js +2 -0
  43. comfyui_frontend_package/static/assets/WidgetInputNumber-CR_vNT3l.js.map +1 -0
  44. comfyui_frontend_package/static/assets/{WidgetInputNumber.vue_vue_type_script_setup_true_lang-CdvBpGed.js → WidgetInputNumber.vue_vue_type_script_setup_true_lang-rPX1TIkC.js} +2 -2
  45. comfyui_frontend_package/static/assets/{WidgetInputNumber.vue_vue_type_script_setup_true_lang-CdvBpGed.js.map → WidgetInputNumber.vue_vue_type_script_setup_true_lang-rPX1TIkC.js.map} +1 -1
  46. comfyui_frontend_package/static/assets/{WidgetInputText-B2YoBI4Y.js → WidgetInputText-NnOJku4t.js} +2 -2
  47. comfyui_frontend_package/static/assets/{WidgetInputText-B2YoBI4Y.js.map → WidgetInputText-NnOJku4t.js.map} +1 -1
  48. comfyui_frontend_package/static/assets/{WidgetLayoutField.vue_vue_type_script_setup_true_lang-CYDaxuge.js → WidgetLayoutField.vue_vue_type_script_setup_true_lang-BrNsu13j.js} +2 -2
  49. comfyui_frontend_package/static/assets/{WidgetLayoutField.vue_vue_type_script_setup_true_lang-CYDaxuge.js.map → WidgetLayoutField.vue_vue_type_script_setup_true_lang-BrNsu13j.js.map} +1 -1
  50. comfyui_frontend_package/static/assets/{WidgetLegacy-DgBI3-l2.js → WidgetLegacy-3d5GSSgo.js} +2 -2
  51. comfyui_frontend_package/static/assets/WidgetLegacy-3d5GSSgo.js.map +1 -0
  52. comfyui_frontend_package/static/assets/{WidgetMarkdown-Bqcf7Vpy.js → WidgetMarkdown-BTfwNVeV.js} +2 -2
  53. comfyui_frontend_package/static/assets/{WidgetMarkdown-Bqcf7Vpy.js.map → WidgetMarkdown-BTfwNVeV.js.map} +1 -1
  54. comfyui_frontend_package/static/assets/WidgetRecordAudio-X2n565MP.js +2 -0
  55. comfyui_frontend_package/static/assets/WidgetRecordAudio-X2n565MP.js.map +1 -0
  56. comfyui_frontend_package/static/assets/WidgetSelect-DsU3dEFm.js +2 -0
  57. comfyui_frontend_package/static/assets/WidgetSelect-DsU3dEFm.js.map +1 -0
  58. comfyui_frontend_package/static/assets/{WidgetSelect.vue_vue_type_script_setup_true_lang-Ua67RWUI.js → WidgetSelect.vue_vue_type_script_setup_true_lang-DLMXofNs.js} +2 -2
  59. comfyui_frontend_package/static/assets/{WidgetSelect.vue_vue_type_script_setup_true_lang-Ua67RWUI.js.map → WidgetSelect.vue_vue_type_script_setup_true_lang-DLMXofNs.js.map} +1 -1
  60. comfyui_frontend_package/static/assets/{WidgetTextarea-syfN9Olh.js → WidgetTextarea-BguNaUH3.js} +2 -2
  61. comfyui_frontend_package/static/assets/{WidgetTextarea-syfN9Olh.js.map → WidgetTextarea-BguNaUH3.js.map} +1 -1
  62. comfyui_frontend_package/static/assets/{WidgetToggleSwitch-C2c4CfAT.js → WidgetToggleSwitch-Cnenb1g4.js} +2 -2
  63. comfyui_frontend_package/static/assets/{WidgetToggleSwitch-C2c4CfAT.js.map → WidgetToggleSwitch-Cnenb1g4.js.map} +1 -1
  64. comfyui_frontend_package/static/assets/{WidgetWithControl.vue_vue_type_script_setup_true_lang-B5RYQ41H.js → WidgetWithControl.vue_vue_type_script_setup_true_lang-CWBg5k0x.js} +3 -3
  65. comfyui_frontend_package/static/assets/{WidgetWithControl.vue_vue_type_script_setup_true_lang-B5RYQ41H.js.map → WidgetWithControl.vue_vue_type_script_setup_true_lang-CWBg5k0x.js.map} +1 -1
  66. comfyui_frontend_package/static/assets/{audioService-CnSU5S1Z.js → audioService-C_4pv8R5.js} +2 -2
  67. comfyui_frontend_package/static/assets/{audioService-CnSU5S1Z.js.map → audioService-C_4pv8R5.js.map} +1 -1
  68. comfyui_frontend_package/static/assets/{audioUtils-BZ8b3tiu.js → audioUtils-CYVbzDGB.js} +2 -2
  69. comfyui_frontend_package/static/assets/{audioUtils-BZ8b3tiu.js.map → audioUtils-CYVbzDGB.js.map} +1 -1
  70. comfyui_frontend_package/static/assets/{index-BBvP0bLh.js → index-BST1SetX.js} +2 -2
  71. comfyui_frontend_package/static/assets/{index-BBvP0bLh.js.map → index-BST1SetX.js.map} +1 -1
  72. comfyui_frontend_package/static/assets/index-DOAA7WkP.css +1 -0
  73. comfyui_frontend_package/static/assets/{index-C5dKoXkW.js → index-DwjwpNvK.js} +2 -2
  74. comfyui_frontend_package/static/assets/index-DwjwpNvK.js.map +1 -0
  75. comfyui_frontend_package/static/assets/{index-Bc79VbnU.js → index-U7jagKl8.js} +22 -22
  76. comfyui_frontend_package/static/assets/index-U7jagKl8.js.map +1 -0
  77. comfyui_frontend_package/static/assets/{keybindingService-DOwK-S5D.js → keybindingService-6A6hKCpd.js} +2 -2
  78. comfyui_frontend_package/static/assets/{keybindingService-DOwK-S5D.js.map → keybindingService-6A6hKCpd.js.map} +1 -1
  79. comfyui_frontend_package/static/assets/{main-9V_ekXTj.js → main-7u-fkFqV.js} +4 -4
  80. comfyui_frontend_package/static/assets/main-7u-fkFqV.js.map +1 -0
  81. comfyui_frontend_package/static/assets/{main-Mk83jtey.js → main-BrRR7na1.js} +4 -4
  82. comfyui_frontend_package/static/assets/main-BrRR7na1.js.map +1 -0
  83. comfyui_frontend_package/static/assets/{main-QxfzWHY3.js → main-Btwx4xDf.js} +5 -5
  84. comfyui_frontend_package/static/assets/main-Btwx4xDf.js.map +1 -0
  85. comfyui_frontend_package/static/assets/{main-D8WRsxlG.js → main-CU-38qC-.js} +3 -3
  86. comfyui_frontend_package/static/assets/main-CU-38qC-.js.map +1 -0
  87. comfyui_frontend_package/static/assets/{main-DdPAQm8u.js → main-CZbK9-kR.js} +4 -4
  88. comfyui_frontend_package/static/assets/main-CZbK9-kR.js.map +1 -0
  89. comfyui_frontend_package/static/assets/{main-IIi2nOrM.js → main-Cv05dk1q.js} +4 -4
  90. comfyui_frontend_package/static/assets/main-Cv05dk1q.js.map +1 -0
  91. comfyui_frontend_package/static/assets/{main-Be2ivsXL.js → main-DVNhdlF2.js} +4 -6
  92. comfyui_frontend_package/static/assets/main-DVNhdlF2.js.map +1 -0
  93. comfyui_frontend_package/static/assets/{main-DnlhxsrE.js → main-DckcRPaY.js} +3 -3
  94. comfyui_frontend_package/static/assets/main-DckcRPaY.js.map +1 -0
  95. comfyui_frontend_package/static/assets/{main-B992pnxN.js → main-DeynLPZA.js} +4 -4
  96. comfyui_frontend_package/static/assets/main-DeynLPZA.js.map +1 -0
  97. comfyui_frontend_package/static/assets/{main-AFY0Q5Cd.js → main-DtCc3tTY.js} +4 -4
  98. comfyui_frontend_package/static/assets/main-DtCc3tTY.js.map +1 -0
  99. comfyui_frontend_package/static/assets/{main-QbQAnNpJ.js → main-apejL0E_.js} +4 -4
  100. comfyui_frontend_package/static/assets/main-apejL0E_.js.map +1 -0
  101. comfyui_frontend_package/static/index.html +1 -1
  102. {comfyui_frontend_package-1.38.2.dist-info → comfyui_frontend_package-1.38.3.dist-info}/METADATA +1 -1
  103. {comfyui_frontend_package-1.38.2.dist-info → comfyui_frontend_package-1.38.3.dist-info}/RECORD +105 -105
  104. comfyui_frontend_package/static/assets/GraphView-Dwrm8D3J.js +0 -15
  105. comfyui_frontend_package/static/assets/GraphView-Dwrm8D3J.js.map +0 -1
  106. comfyui_frontend_package/static/assets/LazyImage.vue_vue_type_script_setup_true_lang-CX9YtPlM.js +0 -2
  107. comfyui_frontend_package/static/assets/LazyImage.vue_vue_type_script_setup_true_lang-CX9YtPlM.js.map +0 -1
  108. comfyui_frontend_package/static/assets/Load3D-DYW1gw8I.js.map +0 -1
  109. comfyui_frontend_package/static/assets/WidgetInputNumber-u4JzBngV.js +0 -2
  110. comfyui_frontend_package/static/assets/WidgetInputNumber-u4JzBngV.js.map +0 -1
  111. comfyui_frontend_package/static/assets/WidgetLegacy-DgBI3-l2.js.map +0 -1
  112. comfyui_frontend_package/static/assets/WidgetRecordAudio-hHbaGdj1.js +0 -2
  113. comfyui_frontend_package/static/assets/WidgetRecordAudio-hHbaGdj1.js.map +0 -1
  114. comfyui_frontend_package/static/assets/WidgetSelect-Cv4W8ECC.js +0 -2
  115. comfyui_frontend_package/static/assets/WidgetSelect-Cv4W8ECC.js.map +0 -1
  116. comfyui_frontend_package/static/assets/index-Bc79VbnU.js.map +0 -1
  117. comfyui_frontend_package/static/assets/index-C5dKoXkW.js.map +0 -1
  118. comfyui_frontend_package/static/assets/index-gxCJ3H4T.css +0 -1
  119. comfyui_frontend_package/static/assets/main-9V_ekXTj.js.map +0 -1
  120. comfyui_frontend_package/static/assets/main-AFY0Q5Cd.js.map +0 -1
  121. comfyui_frontend_package/static/assets/main-B992pnxN.js.map +0 -1
  122. comfyui_frontend_package/static/assets/main-Be2ivsXL.js.map +0 -1
  123. comfyui_frontend_package/static/assets/main-D8WRsxlG.js.map +0 -1
  124. comfyui_frontend_package/static/assets/main-DdPAQm8u.js.map +0 -1
  125. comfyui_frontend_package/static/assets/main-DnlhxsrE.js.map +0 -1
  126. comfyui_frontend_package/static/assets/main-IIi2nOrM.js.map +0 -1
  127. comfyui_frontend_package/static/assets/main-Mk83jtey.js.map +0 -1
  128. comfyui_frontend_package/static/assets/main-QbQAnNpJ.js.map +0 -1
  129. comfyui_frontend_package/static/assets/main-QxfzWHY3.js.map +0 -1
  130. {comfyui_frontend_package-1.38.2.dist-info → comfyui_frontend_package-1.38.3.dist-info}/WHEEL +0 -0
  131. {comfyui_frontend_package-1.38.2.dist-info → comfyui_frontend_package-1.38.3.dist-info}/top_level.txt +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"WidgetColorPicker-4E2rnL8u.js","sources":["../../src/renderer/extensions/vueNodes/widgets/components/WidgetColorPicker.vue"],"sourcesContent":["<!-- Needs custom color picker for alpha support -->\n<template>\n <WidgetLayoutField :widget=\"widget\">\n <label\n :class=\"\n cn(WidgetInputBaseClass, 'flex items-center gap-2 w-full px-4 py-2')\n \"\n >\n <ColorPicker\n v-model=\"localValue\"\n v-bind=\"filteredProps\"\n class=\"h-4 w-8 overflow-hidden !rounded-full border-none\"\n :aria-label=\"widget.name\"\n :pt=\"{\n preview: '!w-full !h-full !border-none'\n }\"\n @update:model-value=\"onPickerUpdate\"\n />\n <span\n class=\"text-xs truncate min-w-[4ch]\"\n data-testid=\"widget-color-text\"\n >{{ toHexFromFormat(localValue, format) }}</span\n >\n </label>\n </WidgetLayoutField>\n</template>\n\n<script setup lang=\"ts\">\nimport ColorPicker from 'primevue/colorpicker'\nimport { computed, ref, watch } from 'vue'\n\nimport type { SimplifiedWidget } from '@/types/simplifiedWidget'\nimport { isColorFormat, toHexFromFormat } from '@/utils/colorUtil'\nimport type { ColorFormat, HSB } from '@/utils/colorUtil'\nimport { cn } from '@/utils/tailwindUtil'\nimport {\n PANEL_EXCLUDED_PROPS,\n filterWidgetProps\n} from '@/utils/widgetPropFilter'\n\nimport { WidgetInputBaseClass } from './layout'\nimport WidgetLayoutField from './layout/WidgetLayoutField.vue'\n\ntype WidgetOptions = { format?: ColorFormat } & Record<string, unknown>\n\nconst props = defineProps<{\n widget: SimplifiedWidget<string, WidgetOptions>\n modelValue: string\n}>()\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n}>()\n\nconst format = computed<ColorFormat>(() => {\n const optionFormat = props.widget.options?.format\n return isColorFormat(optionFormat) ? optionFormat : 'hex'\n})\n\ntype PickerValue = string | HSB\nconst localValue = ref<PickerValue>(\n toHexFromFormat(\n props.modelValue || '#000000',\n isColorFormat(props.widget.options?.format)\n ? props.widget.options.format\n : 'hex'\n )\n)\n\nwatch(\n () => props.modelValue,\n (newVal) => {\n localValue.value = toHexFromFormat(newVal || '#000000', format.value)\n }\n)\n\nfunction onPickerUpdate(val: unknown) {\n localValue.value = val as PickerValue\n emit('update:modelValue', toHexFromFormat(val, format.value))\n}\n\n// ColorPicker specific excluded props include panel/overlay classes\nconst COLOR_PICKER_EXCLUDED_PROPS = [...PANEL_EXCLUDED_PROPS] as const\n\nconst filteredProps = computed(() =>\n filterWidgetProps(props.widget.options, COLOR_PICKER_EXCLUDED_PROPS)\n)\n</script>\n"],"names":["props","__props","emit","__emit","format","computed","optionFormat","isColorFormat","localValue","ref","toHexFromFormat","watch","newVal","onPickerUpdate","val","__name","COLOR_PICKER_EXCLUDED_PROPS","PANEL_EXCLUDED_PROPS","filteredProps","filterWidgetProps"],"mappings":"u2BA6CA,MAAMA,EAAQC,EAKRC,EAAOC,EAIPC,EAASC,EAAsB,IAAM,CACzC,MAAMC,EAAeN,EAAM,OAAO,SAAS,OAC3C,OAAOO,EAAcD,CAAY,EAAIA,EAAe,KACtD,CAAC,EAGKE,EAAaC,EACjBC,EACEV,EAAM,YAAc,UACpBO,EAAcP,EAAM,OAAO,SAAS,MAAM,EACtCA,EAAM,OAAO,QAAQ,OACrB,KAAA,CACN,EAGFW,EACE,IAAMX,EAAM,WACXY,GAAW,CACVJ,EAAW,MAAQE,EAAgBE,GAAU,UAAWR,EAAO,KAAK,CACtE,CAAA,EAGF,SAASS,EAAeC,EAAc,CACpCN,EAAW,MAAQM,EACnBZ,EAAK,oBAAqBQ,EAAgBI,EAAKV,EAAO,KAAK,CAAC,CAC9D,CAHSW,EAAAF,EAAA,kBAMT,MAAMG,EAA8B,CAAC,GAAGC,CAAoB,EAEtDC,EAAgBb,EAAS,IAC7Bc,EAAkBnB,EAAM,OAAO,QAASgB,CAA2B,CAAA"}
1
+ {"version":3,"file":"WidgetColorPicker-CQ_vqexP.js","sources":["../../src/renderer/extensions/vueNodes/widgets/components/WidgetColorPicker.vue"],"sourcesContent":["<!-- Needs custom color picker for alpha support -->\n<template>\n <WidgetLayoutField :widget=\"widget\">\n <label\n :class=\"\n cn(WidgetInputBaseClass, 'flex items-center gap-2 w-full px-4 py-2')\n \"\n >\n <ColorPicker\n v-model=\"localValue\"\n v-bind=\"filteredProps\"\n class=\"h-4 w-8 overflow-hidden !rounded-full border-none\"\n :aria-label=\"widget.name\"\n :pt=\"{\n preview: '!w-full !h-full !border-none'\n }\"\n @update:model-value=\"onPickerUpdate\"\n />\n <span\n class=\"text-xs truncate min-w-[4ch]\"\n data-testid=\"widget-color-text\"\n >{{ toHexFromFormat(localValue, format) }}</span\n >\n </label>\n </WidgetLayoutField>\n</template>\n\n<script setup lang=\"ts\">\nimport ColorPicker from 'primevue/colorpicker'\nimport { computed, ref, watch } from 'vue'\n\nimport type { SimplifiedWidget } from '@/types/simplifiedWidget'\nimport { isColorFormat, toHexFromFormat } from '@/utils/colorUtil'\nimport type { ColorFormat, HSB } from '@/utils/colorUtil'\nimport { cn } from '@/utils/tailwindUtil'\nimport {\n PANEL_EXCLUDED_PROPS,\n filterWidgetProps\n} from '@/utils/widgetPropFilter'\n\nimport { WidgetInputBaseClass } from './layout'\nimport WidgetLayoutField from './layout/WidgetLayoutField.vue'\n\ntype WidgetOptions = { format?: ColorFormat } & Record<string, unknown>\n\nconst props = defineProps<{\n widget: SimplifiedWidget<string, WidgetOptions>\n modelValue: string\n}>()\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n}>()\n\nconst format = computed<ColorFormat>(() => {\n const optionFormat = props.widget.options?.format\n return isColorFormat(optionFormat) ? optionFormat : 'hex'\n})\n\ntype PickerValue = string | HSB\nconst localValue = ref<PickerValue>(\n toHexFromFormat(\n props.modelValue || '#000000',\n isColorFormat(props.widget.options?.format)\n ? props.widget.options.format\n : 'hex'\n )\n)\n\nwatch(\n () => props.modelValue,\n (newVal) => {\n localValue.value = toHexFromFormat(newVal || '#000000', format.value)\n }\n)\n\nfunction onPickerUpdate(val: unknown) {\n localValue.value = val as PickerValue\n emit('update:modelValue', toHexFromFormat(val, format.value))\n}\n\n// ColorPicker specific excluded props include panel/overlay classes\nconst COLOR_PICKER_EXCLUDED_PROPS = [...PANEL_EXCLUDED_PROPS] as const\n\nconst filteredProps = computed(() =>\n filterWidgetProps(props.widget.options, COLOR_PICKER_EXCLUDED_PROPS)\n)\n</script>\n"],"names":["props","__props","emit","__emit","format","computed","optionFormat","isColorFormat","localValue","ref","toHexFromFormat","watch","newVal","onPickerUpdate","val","__name","COLOR_PICKER_EXCLUDED_PROPS","PANEL_EXCLUDED_PROPS","filteredProps","filterWidgetProps"],"mappings":"u2BA6CA,MAAMA,EAAQC,EAKRC,EAAOC,EAIPC,EAASC,EAAsB,IAAM,CACzC,MAAMC,EAAeN,EAAM,OAAO,SAAS,OAC3C,OAAOO,EAAcD,CAAY,EAAIA,EAAe,KACtD,CAAC,EAGKE,EAAaC,EACjBC,EACEV,EAAM,YAAc,UACpBO,EAAcP,EAAM,OAAO,SAAS,MAAM,EACtCA,EAAM,OAAO,QAAQ,OACrB,KAAA,CACN,EAGFW,EACE,IAAMX,EAAM,WACXY,GAAW,CACVJ,EAAW,MAAQE,EAAgBE,GAAU,UAAWR,EAAO,KAAK,CACtE,CAAA,EAGF,SAASS,EAAeC,EAAc,CACpCN,EAAW,MAAQM,EACnBZ,EAAK,oBAAqBQ,EAAgBI,EAAKV,EAAO,KAAK,CAAC,CAC9D,CAHSW,EAAAF,EAAA,kBAMT,MAAMG,EAA8B,CAAC,GAAGC,CAAoB,EAEtDC,EAAgBb,EAAS,IAC7Bc,EAAkBnB,EAAM,OAAO,QAASgB,CAA2B,CAAA"}
@@ -1,2 +1,2 @@
1
- import{n as v}from"./vendor-primevue-Cif--Rbw.js";import{b as w}from"./vendor-vue-DNQSPQQ2.js";import{f as _,G as b}from"./widgetPropFilter-CygYoMQt.js";import{a2 as x,dk as I,dl as y,r as $,E as s,c as B,d as P,z as E,k as d,e as i,a8 as u,m as N}from"./vendor-other-Dsj-QuOx.js";import{d as S}from"./index-Bc79VbnU.js";import"./vendor-reka-ui-WjwjFuZo.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-ByuY8CdW.js";import"./vendor-tiptap-YMjM2h-Z.js";const V={class:"flex flex-col gap-1"},k=["src","alt"],A={class:"h-full w-full p-1"},C=["src","alt"],G=x({__name:"WidgetGalleria",props:I({widget:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(c){const o=y(c,"modelValue"),r=c,n=$(0),{t:m}=w(),p=s(()=>_(r.widget.options,b)),t=s(()=>!o.value||!Array.isArray(o.value)?[]:o.value.filter(a=>a!=null).map((a,l)=>typeof a=="string"?{itemImageSrc:a,thumbnailImageSrc:a,alt:`Image ${l}`}:a??{})),f=s(()=>r.widget.options?.showThumbnails!==!1&&t.value.length>1),g=s(()=>r.widget.options?.showItemNavigators!==!1&&t.value.length>1);return(a,l)=>(P(),B("div",V,[E(u(v),N({"active-index":n.value,"onUpdate:activeIndex":l[0]||(l[0]=e=>n.value=e),value:t.value},p.value,{"show-thumbnails":f.value,"show-item-navigators":g.value,class:"max-w-full",pt:{thumbnails:{class:"overflow-hidden"},thumbnailContent:{class:"py-4 px-2"},thumbnailPrevButton:{class:"m-0"},thumbnailNextButton:{class:"m-0"}}}),{item:d(({item:e})=>[i("img",{src:e?.itemImageSrc||e?.src||"",alt:e?.alt||`${u(m)("g.galleryImage")} ${n.value+1} of ${t.value.length}`,class:"h-auto max-h-64 w-full object-contain"},null,8,k)]),thumbnail:d(({item:e})=>[i("div",A,[i("img",{src:e?.thumbnailImageSrc||e?.src||"",alt:e?.alt||`${u(m)("g.galleryThumbnail")} ${t.value.findIndex(h=>h===e)+1} of ${t.value.length}`,class:"h-full w-full rounded-lg object-cover"},null,8,C)])]),_:1},16,["active-index","value","show-thumbnails","show-item-navigators"])]))}}),z=S(G,[["__scopeId","data-v-34cd3eda"]]);export{z as default};
2
- //# sourceMappingURL=WidgetGalleria-DaEjYhLq.js.map
1
+ import{n as v}from"./vendor-primevue-Cif--Rbw.js";import{b as w}from"./vendor-vue-DNQSPQQ2.js";import{f as _,G as b}from"./widgetPropFilter-CygYoMQt.js";import{a2 as x,dk as I,dl as y,r as $,E as s,c as B,d as P,z as E,k as d,e as i,a8 as u,m as N}from"./vendor-other-Dsj-QuOx.js";import{d as S}from"./index-U7jagKl8.js";import"./vendor-reka-ui-WjwjFuZo.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-ByuY8CdW.js";import"./vendor-tiptap-YMjM2h-Z.js";const V={class:"flex flex-col gap-1"},k=["src","alt"],A={class:"h-full w-full p-1"},C=["src","alt"],G=x({__name:"WidgetGalleria",props:I({widget:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(c){const o=y(c,"modelValue"),r=c,n=$(0),{t:m}=w(),p=s(()=>_(r.widget.options,b)),t=s(()=>!o.value||!Array.isArray(o.value)?[]:o.value.filter(a=>a!=null).map((a,l)=>typeof a=="string"?{itemImageSrc:a,thumbnailImageSrc:a,alt:`Image ${l}`}:a??{})),f=s(()=>r.widget.options?.showThumbnails!==!1&&t.value.length>1),g=s(()=>r.widget.options?.showItemNavigators!==!1&&t.value.length>1);return(a,l)=>(P(),B("div",V,[E(u(v),N({"active-index":n.value,"onUpdate:activeIndex":l[0]||(l[0]=e=>n.value=e),value:t.value},p.value,{"show-thumbnails":f.value,"show-item-navigators":g.value,class:"max-w-full",pt:{thumbnails:{class:"overflow-hidden"},thumbnailContent:{class:"py-4 px-2"},thumbnailPrevButton:{class:"m-0"},thumbnailNextButton:{class:"m-0"}}}),{item:d(({item:e})=>[i("img",{src:e?.itemImageSrc||e?.src||"",alt:e?.alt||`${u(m)("g.galleryImage")} ${n.value+1} of ${t.value.length}`,class:"h-auto max-h-64 w-full object-contain"},null,8,k)]),thumbnail:d(({item:e})=>[i("div",A,[i("img",{src:e?.thumbnailImageSrc||e?.src||"",alt:e?.alt||`${u(m)("g.galleryThumbnail")} ${t.value.findIndex(h=>h===e)+1} of ${t.value.length}`,class:"h-full w-full rounded-lg object-cover"},null,8,C)])]),_:1},16,["active-index","value","show-thumbnails","show-item-navigators"])]))}}),z=S(G,[["__scopeId","data-v-34cd3eda"]]);export{z as default};
2
+ //# sourceMappingURL=WidgetGalleria-CE2__qNK.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WidgetGalleria-DaEjYhLq.js","sources":["../../src/renderer/extensions/vueNodes/widgets/components/WidgetGalleria.vue"],"sourcesContent":["<template>\n <div class=\"flex flex-col gap-1\">\n <Galleria\n v-model:active-index=\"activeIndex\"\n :value=\"galleryImages\"\n v-bind=\"filteredProps\"\n :show-thumbnails=\"showThumbnails\"\n :show-item-navigators=\"showNavButtons\"\n class=\"max-w-full\"\n :pt=\"{\n thumbnails: {\n class: 'overflow-hidden'\n },\n thumbnailContent: {\n class: 'py-4 px-2'\n },\n thumbnailPrevButton: {\n class: 'm-0'\n },\n thumbnailNextButton: {\n class: 'm-0'\n }\n }\"\n >\n <template #item=\"{ item }\">\n <img\n :src=\"item?.itemImageSrc || item?.src || ''\"\n :alt=\"\n item?.alt ||\n `${t('g.galleryImage')} ${activeIndex + 1} of ${galleryImages.length}`\n \"\n class=\"h-auto max-h-64 w-full object-contain\"\n />\n </template>\n <template #thumbnail=\"{ item }\">\n <div class=\"h-full w-full p-1\">\n <img\n :src=\"item?.thumbnailImageSrc || item?.src || ''\"\n :alt=\"\n item?.alt ||\n `${t('g.galleryThumbnail')} ${galleryImages.findIndex((img) => img === item) + 1} of ${galleryImages.length}`\n \"\n class=\"h-full w-full rounded-lg object-cover\"\n />\n </div>\n </template>\n </Galleria>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Galleria from 'primevue/galleria'\nimport { computed, ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport type { SimplifiedWidget } from '@/types/simplifiedWidget'\nimport {\n GALLERIA_EXCLUDED_PROPS,\n filterWidgetProps\n} from '@/utils/widgetPropFilter'\n\nexport interface GalleryImage {\n itemImageSrc?: string\n thumbnailImageSrc?: string\n src?: string\n alt?: string\n}\n\nexport type GalleryValue = string[] | GalleryImage[]\n\nconst value = defineModel<GalleryValue>({ required: true })\n\nconst props = defineProps<{\n widget: SimplifiedWidget<GalleryValue>\n}>()\n\nconst activeIndex = ref(0)\n\nconst { t } = useI18n()\n\nconst filteredProps = computed(() =>\n filterWidgetProps(props.widget.options, GALLERIA_EXCLUDED_PROPS)\n)\n\nconst galleryImages = computed(() => {\n if (!value.value || !Array.isArray(value.value)) return []\n\n return value.value\n .filter((item) => item !== null && item !== undefined) // Filter out null/undefined\n .map((item, index) => {\n if (typeof item === 'string') {\n return {\n itemImageSrc: item,\n thumbnailImageSrc: item,\n alt: `Image ${index}`\n }\n }\n return item ?? {} // Ensure we have at least an empty object\n })\n})\n\nconst showThumbnails = computed(() => {\n return (\n props.widget.options?.showThumbnails !== false &&\n galleryImages.value.length > 1\n )\n})\n\nconst showNavButtons = computed(() => {\n return (\n props.widget.options?.showItemNavigators !== false &&\n galleryImages.value.length > 1\n )\n})\n</script>\n\n<style scoped>\n/* Ensure thumbnail container doesn't overflow */\n:deep(.p-galleria-thumbnails) {\n overflow: hidden;\n}\n\n/* Constrain thumbnail items to prevent overlap */\n:deep(.p-galleria-thumbnail-item) {\n flex-shrink: 0;\n}\n\n/* Ensure thumbnail wrapper maintains aspect ratio */\n:deep(.p-galleria-thumbnail) {\n overflow: hidden;\n}\n</style>\n"],"names":["value","_useModel","__props","props","activeIndex","ref","t","useI18n","filteredProps","computed","filterWidgetProps","GALLERIA_EXCLUDED_PROPS","galleryImages","item","index","showThumbnails","showNavButtons"],"mappings":"wrBAsEA,MAAMA,EAAQC,EAAyBC,EAAA,YAAmB,EAEpDC,EAAQD,EAIRE,EAAcC,EAAI,CAAC,EAEnB,CAAE,EAAAC,CAAA,EAAMC,EAAA,EAERC,EAAgBC,EAAS,IAC7BC,EAAkBP,EAAM,OAAO,QAASQ,CAAuB,CAAA,EAG3DC,EAAgBH,EAAS,IACzB,CAACT,EAAM,OAAS,CAAC,MAAM,QAAQA,EAAM,KAAK,EAAU,CAAA,EAEjDA,EAAM,MACV,OAAQa,GAASA,GAAS,IAA0B,EACpD,IAAI,CAACA,EAAMC,IACN,OAAOD,GAAS,SACX,CACL,aAAcA,EACd,kBAAmBA,EACnB,IAAK,SAASC,CAAK,EAAA,EAGhBD,GAAQ,CAAA,CAChB,CACJ,EAEKE,EAAiBN,EAAS,IAE5BN,EAAM,OAAO,SAAS,iBAAmB,IACzCS,EAAc,MAAM,OAAS,CAEhC,EAEKI,EAAiBP,EAAS,IAE5BN,EAAM,OAAO,SAAS,qBAAuB,IAC7CS,EAAc,MAAM,OAAS,CAEhC"}
1
+ {"version":3,"file":"WidgetGalleria-CE2__qNK.js","sources":["../../src/renderer/extensions/vueNodes/widgets/components/WidgetGalleria.vue"],"sourcesContent":["<template>\n <div class=\"flex flex-col gap-1\">\n <Galleria\n v-model:active-index=\"activeIndex\"\n :value=\"galleryImages\"\n v-bind=\"filteredProps\"\n :show-thumbnails=\"showThumbnails\"\n :show-item-navigators=\"showNavButtons\"\n class=\"max-w-full\"\n :pt=\"{\n thumbnails: {\n class: 'overflow-hidden'\n },\n thumbnailContent: {\n class: 'py-4 px-2'\n },\n thumbnailPrevButton: {\n class: 'm-0'\n },\n thumbnailNextButton: {\n class: 'm-0'\n }\n }\"\n >\n <template #item=\"{ item }\">\n <img\n :src=\"item?.itemImageSrc || item?.src || ''\"\n :alt=\"\n item?.alt ||\n `${t('g.galleryImage')} ${activeIndex + 1} of ${galleryImages.length}`\n \"\n class=\"h-auto max-h-64 w-full object-contain\"\n />\n </template>\n <template #thumbnail=\"{ item }\">\n <div class=\"h-full w-full p-1\">\n <img\n :src=\"item?.thumbnailImageSrc || item?.src || ''\"\n :alt=\"\n item?.alt ||\n `${t('g.galleryThumbnail')} ${galleryImages.findIndex((img) => img === item) + 1} of ${galleryImages.length}`\n \"\n class=\"h-full w-full rounded-lg object-cover\"\n />\n </div>\n </template>\n </Galleria>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Galleria from 'primevue/galleria'\nimport { computed, ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport type { SimplifiedWidget } from '@/types/simplifiedWidget'\nimport {\n GALLERIA_EXCLUDED_PROPS,\n filterWidgetProps\n} from '@/utils/widgetPropFilter'\n\nexport interface GalleryImage {\n itemImageSrc?: string\n thumbnailImageSrc?: string\n src?: string\n alt?: string\n}\n\nexport type GalleryValue = string[] | GalleryImage[]\n\nconst value = defineModel<GalleryValue>({ required: true })\n\nconst props = defineProps<{\n widget: SimplifiedWidget<GalleryValue>\n}>()\n\nconst activeIndex = ref(0)\n\nconst { t } = useI18n()\n\nconst filteredProps = computed(() =>\n filterWidgetProps(props.widget.options, GALLERIA_EXCLUDED_PROPS)\n)\n\nconst galleryImages = computed(() => {\n if (!value.value || !Array.isArray(value.value)) return []\n\n return value.value\n .filter((item) => item !== null && item !== undefined) // Filter out null/undefined\n .map((item, index) => {\n if (typeof item === 'string') {\n return {\n itemImageSrc: item,\n thumbnailImageSrc: item,\n alt: `Image ${index}`\n }\n }\n return item ?? {} // Ensure we have at least an empty object\n })\n})\n\nconst showThumbnails = computed(() => {\n return (\n props.widget.options?.showThumbnails !== false &&\n galleryImages.value.length > 1\n )\n})\n\nconst showNavButtons = computed(() => {\n return (\n props.widget.options?.showItemNavigators !== false &&\n galleryImages.value.length > 1\n )\n})\n</script>\n\n<style scoped>\n/* Ensure thumbnail container doesn't overflow */\n:deep(.p-galleria-thumbnails) {\n overflow: hidden;\n}\n\n/* Constrain thumbnail items to prevent overlap */\n:deep(.p-galleria-thumbnail-item) {\n flex-shrink: 0;\n}\n\n/* Ensure thumbnail wrapper maintains aspect ratio */\n:deep(.p-galleria-thumbnail) {\n overflow: hidden;\n}\n</style>\n"],"names":["value","_useModel","__props","props","activeIndex","ref","t","useI18n","filteredProps","computed","filterWidgetProps","GALLERIA_EXCLUDED_PROPS","galleryImages","item","index","showThumbnails","showNavButtons"],"mappings":"wrBAsEA,MAAMA,EAAQC,EAAyBC,EAAA,YAAmB,EAEpDC,EAAQD,EAIRE,EAAcC,EAAI,CAAC,EAEnB,CAAE,EAAAC,CAAA,EAAMC,EAAA,EAERC,EAAgBC,EAAS,IAC7BC,EAAkBP,EAAM,OAAO,QAASQ,CAAuB,CAAA,EAG3DC,EAAgBH,EAAS,IACzB,CAACT,EAAM,OAAS,CAAC,MAAM,QAAQA,EAAM,KAAK,EAAU,CAAA,EAEjDA,EAAM,MACV,OAAQa,GAASA,GAAS,IAA0B,EACpD,IAAI,CAACA,EAAMC,IACN,OAAOD,GAAS,SACX,CACL,aAAcA,EACd,kBAAmBA,EACnB,IAAK,SAASC,CAAK,EAAA,EAGhBD,GAAQ,CAAA,CAChB,CACJ,EAEKE,EAAiBN,EAAS,IAE5BN,EAAM,OAAO,SAAS,iBAAmB,IACzCS,EAAc,MAAM,OAAS,CAEhC,EAEKI,EAAiBP,EAAS,IAE5BN,EAAM,OAAO,SAAS,qBAAuB,IAC7CS,EAAc,MAAM,OAAS,CAEhC"}
@@ -0,0 +1,2 @@
1
+ import{_ as o}from"./WidgetInputNumber.vue_vue_type_script_setup_true_lang-rPX1TIkC.js";import"./vendor-other-Dsj-QuOx.js";import"./vendor-vue-DNQSPQQ2.js";import"./index-U7jagKl8.js";import"./vendor-primevue-Cif--Rbw.js";import"./vendor-reka-ui-WjwjFuZo.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-ByuY8CdW.js";import"./vendor-tiptap-YMjM2h-Z.js";import"./widgetPropFilter-CygYoMQt.js";import"./index-BST1SetX.js";import"./WidgetLayoutField.vue_vue_type_script_setup_true_lang-BrNsu13j.js";import"./WidgetWithControl.vue_vue_type_script_setup_true_lang-CWBg5k0x.js";export{o as default};
2
+ //# sourceMappingURL=WidgetInputNumber-CR_vNT3l.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WidgetInputNumber-CR_vNT3l.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,2 +1,2 @@
1
- var ae=Object.defineProperty;var v=(n,i)=>ae(n,"name",{value:i,configurable:!0});import{a2 as W,dk as L,ea as T,r as S,dZ as ne,E as r,dl as R,h as oe,j as I,d as b,k as O,l as le,c as F,m as E,a8 as d,q as z,e as $,p as ie,s as C,I as y,J as h,L as ue,z as se,t as re}from"./vendor-other-Dsj-QuOx.js";import{b as de}from"./vendor-vue-DNQSPQQ2.js";import{c as g,cS as me,b9 as pe,d as ve}from"./index-Bc79VbnU.js";import{f as j,I as ce,S as fe}from"./widgetPropFilter-CygYoMQt.js";import{W as H}from"./index-BBvP0bLh.js";import{_ as q}from"./WidgetLayoutField.vue_vue_type_script_setup_true_lang-CYDaxuge.js";import{J as ge}from"./vendor-primevue-Cif--Rbw.js";import{_ as be}from"./WidgetWithControl.vue_vue_type_script_setup_true_lang-B5RYQ41H.js";const we=["aria-label"],Ve=["disabled"],xe={class:"relative min-w-[4ch] flex-1 py-1.5 my-0.25"},Ne=["aria-valuenow","aria-valuemin","aria-valuemax","value","disabled"],Me=["disabled"],G="w-8 bg-transparent border-0 text-sm text-smoke-700",X=W({__name:"WidgetInputNumberInput",props:L({widget:{}},{modelValue:{default:0},modelModifiers:{}}),emits:["update:modelValue"],setup(n){const{n:i}=de(),a=n,u=T("widgetContainer"),o=T("inputField"),l=S(!1);ne(u,()=>{l.value&&(l.value=!1)});const c=r(()=>i(1.1).replace(/\p{Number}/gu,"")),N=r(()=>i(11111).replace(/\p{Number}/gu,""));function k(e){return e.replaceAll(N.value,"").replaceAll(c.value,".")}v(k,"unformatValue");const s=R(n,"modelValue"),m=r(()=>{const e=f.value??s.value;return isFinite(e)?i(e,{useGrouping:Z.value,minimumFractionDigits:x.value,maximumFractionDigits:x.value}):`${e}`});function B(e){const{target:t}=e;if(!(t instanceof HTMLInputElement))return;const D=me(k(t.value));D!==void 0?s.value=Math.min(p.value.max,Math.max(p.value.min,D)):t.value=m.value,l.value=!1}v(B,"updateValue");const U=r(()=>s.value>p.value.min&&!a.widget.options?.disabled),A=r(()=>s.value<p.value.max&&!a.widget.options?.disabled),p=r(()=>j(a.widget.options,ce)),x=r(()=>{const e=a.widget.options?.precision;return typeof e=="number"&&e>=0?e:void 0}),w=r(()=>{if(a.widget.options?.step2!==void 0)return Number(a.widget.options.step2);const e=a.widget.options?.step;return e!==void 0&&e>10?Number(e)/10:x.value!==void 0?x.value===0?1:Number((1/Math.pow(10,x.value)).toFixed(x.value)):0}),Z=r(()=>a.widget.options?.useGrouping===!0),_=r(()=>{const e=s.value??0;return!Number.isFinite(e)||Math.abs(e)>Number.MAX_SAFE_INTEGER});function P(e){s.value=Math.min(p.value.max,Math.max(p.value.min,s.value+e))}v(P,"updateValueBy");const f=S(),V=S(0);function Q(e){if(a.widget.options?.disabled)return;const{target:t}=e;t instanceof HTMLElement&&(t.setPointerCapture(e.pointerId),f.value=s.value,V.value=0)}v(Q,"handleMouseDown");function Y(e){if(f.value===void 0)return;V.value+=e.movementX;const t=f.value+(V.value/10|0)*w.value;V.value%=10,f.value=Math.min(p.value.max,Math.max(p.value.min,t))}v(Y,"handleMouseMove");function ee(){const e=f.value;e!==void 0&&(s.value=e,f.value=void 0,V.value===0&&(l.value=!0,o.value?.focus(),o.value?.setSelectionRange(0,-1)),V.value=0)}v(ee,"handleMouseUp");const te=r(()=>_.value?"Increment/decrement disabled: value exceeds JavaScript precision limit (±2^53)":null);return(e,t)=>{const D=oe("tooltip");return b(),I(q,{widget:e.widget},{default:O(()=>[le((b(),F("div",E({ref_key:"widgetContainer",ref:u},p.value,{"aria-label":e.widget.name,class:d(g)(d(H),"grow text-xs flex h-7")}),[_.value?z("",!0):(b(),F("button",{key:0,"data-testid":"decrement",class:C(d(g)(G,"pi pi-minus",!U.value&&"opacity-60")),disabled:!U.value,tabindex:"-1",onClick:t[0]||(t[0]=M=>s.value-=w.value)},null,10,Ve)),$("div",xe,[$("input",{ref_key:"inputField",ref:o,"aria-valuenow":f.value??s.value,"aria-valuemin":p.value.min,"aria-valuemax":p.value.max,class:C(d(g)("bg-transparent border-0 focus:outline-0 p-1 truncate text-sm absolute inset-0")),inputmode:"decimal",value:m.value,role:"spinbutton",tabindex:"0",disabled:e.widget.options?.disabled,autocomplete:"off",autocorrect:"off",spellcheck:"false",onBlur:B,onKeyup:h(B,["enter"]),onKeydown:[t[1]||(t[1]=h(y(M=>P(w.value),["prevent"]),["up"])),t[2]||(t[2]=h(y(M=>P(-w.value),["prevent"]),["down"])),t[3]||(t[3]=h(y(M=>P(10*w.value),["prevent"]),["page-up"])),t[4]||(t[4]=h(y(M=>P(-10*w.value),["prevent"]),["page-down"]))],onDragstart:t[5]||(t[5]=y(()=>{},["prevent"]))},null,42,Ne),$("div",{class:C(d(g)("absolute inset-0 z-10 cursor-ew-resize",l.value&&"hidden pointer-events-none")),onPointerdown:Q,onPointermove:Y,onPointerup:ee,onPointercancel:t[6]||(t[6]=()=>{f.value=void 0,V.value=0})},null,34)]),ie(e.$slots,"default"),_.value?z("",!0):(b(),F("button",{key:1,"data-testid":"increment",class:C(d(g)(G,"pi pi-plus",!A.value&&"opacity-60")),disabled:!A.value,tabindex:"-1",onClick:t[7]||(t[7]=M=>s.value+=w.value)},null,10,Me))],16,we)),[[D,te.value]])]),_:3},8,["widget"])}}});function ye(n,i,a=!1){return r(()=>{const u=ue(i);if(n?.step2!==void 0)return Number(n.step2);const o=n?.step;if(o!==void 0&&o>10)return Number(o)/10;if(u===void 0)return a?void 0:0;if(u===0)return 1;const l=1/Math.pow(10,u);return a?l:Number(l.toFixed(u))})}v(ye,"useNumberStepCalculation");const J=g("inline-flex items-center justify-center border-0 bg-transparent text-inherit transition-colors duration-150 ease-in-out ","hover:bg-node-component-surface-hovered active:bg-node-component-surface-selected","disabled:bg-node-component-disabled disabled:text-node-icon-disabled disabled:cursor-not-allowed");function he(n){const{roundedLeft:i=!1,roundedRight:a=!1}=n??{},u=g(J,a&&"rounded-r-lg"),o=g(J,i&&"rounded-l-lg");return{incrementButton:{class:u},decrementButton:{class:o}}}v(he,"useNumberWidgetButtonPt");const Ce=W({__name:"WidgetInputNumberSlider",props:L({widget:{}},{modelValue:{default:0},modelModifiers:{}}),emits:["update:modelValue"],setup(n){const i=R(n,"modelValue"),a=S(0),u=v(m=>{m?.length&&(i.value=m[0])},"updateLocalValue"),o=v(m=>{if(m!==void 0){u([m]);return}a.value+=1},"handleNumberInputUpdate"),l=r(()=>j(n.widget.options,fe)),c=n.widget.options?.precision,N=typeof c=="number"&&c>=0?c:void 0,k=ye(n.widget.options,N,!0),s=he({roundedLeft:!0,roundedRight:!0});return(m,B)=>(b(),I(q,{widget:m.widget},{default:O(()=>[$("div",{class:C(d(g)(d(H),"flex items-center gap-2 pl-3 pr-2"))},[se(pe,E({"model-value":[i.value]},l.value,{class:"flex-grow text-xs",step:d(k),"aria-label":m.widget.name,"onUpdate:modelValue":u}),null,16,["model-value","step","aria-label"]),(b(),I(d(ge),E({key:a.value,"model-value":i.value},l.value,{step:d(k),"min-fraction-digits":d(N),"max-fraction-digits":d(N),"aria-label":m.widget.name,size:"small","pt:pc-input-text:root":"min-w-[4ch] bg-transparent border-none text-center truncate",class:"w-16",pt:d(s),"onUpdate:modelValue":o}),null,16,["model-value","step","min-fraction-digits","max-fraction-digits","aria-label","pt"]))],2)]),_:1},8,["widget"]))}}),K=ve(Ce,[["__scopeId","data-v-989ee2f9"]]),Fe=W({__name:"WidgetInputNumber",props:L({widget:{}},{modelValue:{default:0},modelModifiers:{}}),emits:["update:modelValue"],setup(n){const i=n,a=R(n,"modelValue"),u=r(()=>!!i.widget.controlWidget);return(o,l)=>u.value?(b(),I(be,{key:0,modelValue:a.value,"onUpdate:modelValue":l[0]||(l[0]=c=>a.value=c),widget:o.widget,component:o.widget.type==="slider"?K:X},null,8,["modelValue","widget","component"])):(b(),I(re(o.widget.type==="slider"?K:X),E({key:1,modelValue:a.value,"onUpdate:modelValue":l[1]||(l[1]=c=>a.value=c),widget:o.widget},o.$attrs),null,16,["modelValue","widget"]))}});export{Fe as _};
2
- //# sourceMappingURL=WidgetInputNumber.vue_vue_type_script_setup_true_lang-CdvBpGed.js.map
1
+ var ae=Object.defineProperty;var v=(n,i)=>ae(n,"name",{value:i,configurable:!0});import{a2 as W,dk as L,ea as T,r as S,dZ as ne,E as r,dl as R,h as oe,j as I,d as b,k as O,l as le,c as F,m as E,a8 as d,q as z,e as $,p as ie,s as C,I as y,J as h,L as ue,z as se,t as re}from"./vendor-other-Dsj-QuOx.js";import{b as de}from"./vendor-vue-DNQSPQQ2.js";import{c as g,cS as me,b9 as pe,d as ve}from"./index-U7jagKl8.js";import{f as j,I as ce,S as fe}from"./widgetPropFilter-CygYoMQt.js";import{W as H}from"./index-BST1SetX.js";import{_ as q}from"./WidgetLayoutField.vue_vue_type_script_setup_true_lang-BrNsu13j.js";import{J as ge}from"./vendor-primevue-Cif--Rbw.js";import{_ as be}from"./WidgetWithControl.vue_vue_type_script_setup_true_lang-CWBg5k0x.js";const we=["aria-label"],Ve=["disabled"],xe={class:"relative min-w-[4ch] flex-1 py-1.5 my-0.25"},Ne=["aria-valuenow","aria-valuemin","aria-valuemax","value","disabled"],Me=["disabled"],G="w-8 bg-transparent border-0 text-sm text-smoke-700",X=W({__name:"WidgetInputNumberInput",props:L({widget:{}},{modelValue:{default:0},modelModifiers:{}}),emits:["update:modelValue"],setup(n){const{n:i}=de(),a=n,u=T("widgetContainer"),o=T("inputField"),l=S(!1);ne(u,()=>{l.value&&(l.value=!1)});const c=r(()=>i(1.1).replace(/\p{Number}/gu,"")),N=r(()=>i(11111).replace(/\p{Number}/gu,""));function k(e){return e.replaceAll(N.value,"").replaceAll(c.value,".")}v(k,"unformatValue");const s=R(n,"modelValue"),m=r(()=>{const e=f.value??s.value;return isFinite(e)?i(e,{useGrouping:Z.value,minimumFractionDigits:x.value,maximumFractionDigits:x.value}):`${e}`});function B(e){const{target:t}=e;if(!(t instanceof HTMLInputElement))return;const D=me(k(t.value));D!==void 0?s.value=Math.min(p.value.max,Math.max(p.value.min,D)):t.value=m.value,l.value=!1}v(B,"updateValue");const U=r(()=>s.value>p.value.min&&!a.widget.options?.disabled),A=r(()=>s.value<p.value.max&&!a.widget.options?.disabled),p=r(()=>j(a.widget.options,ce)),x=r(()=>{const e=a.widget.options?.precision;return typeof e=="number"&&e>=0?e:void 0}),w=r(()=>{if(a.widget.options?.step2!==void 0)return Number(a.widget.options.step2);const e=a.widget.options?.step;return e!==void 0&&e>10?Number(e)/10:x.value!==void 0?x.value===0?1:Number((1/Math.pow(10,x.value)).toFixed(x.value)):0}),Z=r(()=>a.widget.options?.useGrouping===!0),_=r(()=>{const e=s.value??0;return!Number.isFinite(e)||Math.abs(e)>Number.MAX_SAFE_INTEGER});function P(e){s.value=Math.min(p.value.max,Math.max(p.value.min,s.value+e))}v(P,"updateValueBy");const f=S(),V=S(0);function Q(e){if(a.widget.options?.disabled)return;const{target:t}=e;t instanceof HTMLElement&&(t.setPointerCapture(e.pointerId),f.value=s.value,V.value=0)}v(Q,"handleMouseDown");function Y(e){if(f.value===void 0)return;V.value+=e.movementX;const t=f.value+(V.value/10|0)*w.value;V.value%=10,f.value=Math.min(p.value.max,Math.max(p.value.min,t))}v(Y,"handleMouseMove");function ee(){const e=f.value;e!==void 0&&(s.value=e,f.value=void 0,V.value===0&&(l.value=!0,o.value?.focus(),o.value?.setSelectionRange(0,-1)),V.value=0)}v(ee,"handleMouseUp");const te=r(()=>_.value?"Increment/decrement disabled: value exceeds JavaScript precision limit (±2^53)":null);return(e,t)=>{const D=oe("tooltip");return b(),I(q,{widget:e.widget},{default:O(()=>[le((b(),F("div",E({ref_key:"widgetContainer",ref:u},p.value,{"aria-label":e.widget.name,class:d(g)(d(H),"grow text-xs flex h-7")}),[_.value?z("",!0):(b(),F("button",{key:0,"data-testid":"decrement",class:C(d(g)(G,"pi pi-minus",!U.value&&"opacity-60")),disabled:!U.value,tabindex:"-1",onClick:t[0]||(t[0]=M=>s.value-=w.value)},null,10,Ve)),$("div",xe,[$("input",{ref_key:"inputField",ref:o,"aria-valuenow":f.value??s.value,"aria-valuemin":p.value.min,"aria-valuemax":p.value.max,class:C(d(g)("bg-transparent border-0 focus:outline-0 p-1 truncate text-sm absolute inset-0")),inputmode:"decimal",value:m.value,role:"spinbutton",tabindex:"0",disabled:e.widget.options?.disabled,autocomplete:"off",autocorrect:"off",spellcheck:"false",onBlur:B,onKeyup:h(B,["enter"]),onKeydown:[t[1]||(t[1]=h(y(M=>P(w.value),["prevent"]),["up"])),t[2]||(t[2]=h(y(M=>P(-w.value),["prevent"]),["down"])),t[3]||(t[3]=h(y(M=>P(10*w.value),["prevent"]),["page-up"])),t[4]||(t[4]=h(y(M=>P(-10*w.value),["prevent"]),["page-down"]))],onDragstart:t[5]||(t[5]=y(()=>{},["prevent"]))},null,42,Ne),$("div",{class:C(d(g)("absolute inset-0 z-10 cursor-ew-resize",l.value&&"hidden pointer-events-none")),onPointerdown:Q,onPointermove:Y,onPointerup:ee,onPointercancel:t[6]||(t[6]=()=>{f.value=void 0,V.value=0})},null,34)]),ie(e.$slots,"default"),_.value?z("",!0):(b(),F("button",{key:1,"data-testid":"increment",class:C(d(g)(G,"pi pi-plus",!A.value&&"opacity-60")),disabled:!A.value,tabindex:"-1",onClick:t[7]||(t[7]=M=>s.value+=w.value)},null,10,Me))],16,we)),[[D,te.value]])]),_:3},8,["widget"])}}});function ye(n,i,a=!1){return r(()=>{const u=ue(i);if(n?.step2!==void 0)return Number(n.step2);const o=n?.step;if(o!==void 0&&o>10)return Number(o)/10;if(u===void 0)return a?void 0:0;if(u===0)return 1;const l=1/Math.pow(10,u);return a?l:Number(l.toFixed(u))})}v(ye,"useNumberStepCalculation");const J=g("inline-flex items-center justify-center border-0 bg-transparent text-inherit transition-colors duration-150 ease-in-out ","hover:bg-node-component-surface-hovered active:bg-node-component-surface-selected","disabled:bg-node-component-disabled disabled:text-node-icon-disabled disabled:cursor-not-allowed");function he(n){const{roundedLeft:i=!1,roundedRight:a=!1}=n??{},u=g(J,a&&"rounded-r-lg"),o=g(J,i&&"rounded-l-lg");return{incrementButton:{class:u},decrementButton:{class:o}}}v(he,"useNumberWidgetButtonPt");const Ce=W({__name:"WidgetInputNumberSlider",props:L({widget:{}},{modelValue:{default:0},modelModifiers:{}}),emits:["update:modelValue"],setup(n){const i=R(n,"modelValue"),a=S(0),u=v(m=>{m?.length&&(i.value=m[0])},"updateLocalValue"),o=v(m=>{if(m!==void 0){u([m]);return}a.value+=1},"handleNumberInputUpdate"),l=r(()=>j(n.widget.options,fe)),c=n.widget.options?.precision,N=typeof c=="number"&&c>=0?c:void 0,k=ye(n.widget.options,N,!0),s=he({roundedLeft:!0,roundedRight:!0});return(m,B)=>(b(),I(q,{widget:m.widget},{default:O(()=>[$("div",{class:C(d(g)(d(H),"flex items-center gap-2 pl-3 pr-2"))},[se(pe,E({"model-value":[i.value]},l.value,{class:"flex-grow text-xs",step:d(k),"aria-label":m.widget.name,"onUpdate:modelValue":u}),null,16,["model-value","step","aria-label"]),(b(),I(d(ge),E({key:a.value,"model-value":i.value},l.value,{step:d(k),"min-fraction-digits":d(N),"max-fraction-digits":d(N),"aria-label":m.widget.name,size:"small","pt:pc-input-text:root":"min-w-[4ch] bg-transparent border-none text-center truncate",class:"w-16",pt:d(s),"onUpdate:modelValue":o}),null,16,["model-value","step","min-fraction-digits","max-fraction-digits","aria-label","pt"]))],2)]),_:1},8,["widget"]))}}),K=ve(Ce,[["__scopeId","data-v-989ee2f9"]]),Fe=W({__name:"WidgetInputNumber",props:L({widget:{}},{modelValue:{default:0},modelModifiers:{}}),emits:["update:modelValue"],setup(n){const i=n,a=R(n,"modelValue"),u=r(()=>!!i.widget.controlWidget);return(o,l)=>u.value?(b(),I(be,{key:0,modelValue:a.value,"onUpdate:modelValue":l[0]||(l[0]=c=>a.value=c),widget:o.widget,component:o.widget.type==="slider"?K:X},null,8,["modelValue","widget","component"])):(b(),I(re(o.widget.type==="slider"?K:X),E({key:1,modelValue:a.value,"onUpdate:modelValue":l[1]||(l[1]=c=>a.value=c),widget:o.widget},o.$attrs),null,16,["modelValue","widget"]))}});export{Fe as _};
2
+ //# sourceMappingURL=WidgetInputNumber.vue_vue_type_script_setup_true_lang-rPX1TIkC.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WidgetInputNumber.vue_vue_type_script_setup_true_lang-CdvBpGed.js","sources":["../../src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberInput.vue","../../src/renderer/extensions/vueNodes/widgets/composables/useNumberStepCalculation.ts","../../src/renderer/extensions/vueNodes/widgets/composables/useNumberWidgetButtonPt.ts","../../src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberSlider.vue","../../src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumber.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onClickOutside } from '@vueuse/core'\nimport { computed, ref, useTemplateRef } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport { evaluateInput } from '@/lib/litegraph/src/utils/widget'\nimport type { SimplifiedWidget } from '@/types/simplifiedWidget'\nimport { cn } from '@/utils/tailwindUtil'\nimport {\n INPUT_EXCLUDED_PROPS,\n filterWidgetProps\n} from '@/utils/widgetPropFilter'\n\nimport { WidgetInputBaseClass } from './layout'\nimport WidgetLayoutField from './layout/WidgetLayoutField.vue'\n\nconst { n } = useI18n()\n\nconst props = defineProps<{\n widget: SimplifiedWidget<number>\n}>()\n\nconst widgetContainer = useTemplateRef<HTMLDivElement>('widgetContainer')\nconst inputField = useTemplateRef<HTMLInputElement>('inputField')\nconst textEdit = ref(false)\nonClickOutside(widgetContainer, () => {\n if (textEdit.value) {\n textEdit.value = false\n }\n})\n\nconst decimalSeparator = computed(() => n(1.1).replace(/\\p{Number}/gu, ''))\nconst groupSeparator = computed(() => n(11111).replace(/\\p{Number}/gu, ''))\nfunction unformatValue(value: string) {\n return value\n .replaceAll(groupSeparator.value, '')\n .replaceAll(decimalSeparator.value, '.')\n}\n\nconst modelValue = defineModel<number>({ default: 0 })\n\nconst formattedValue = computed(() => {\n const unformattedValue = dragValue.value ?? modelValue.value\n if (!isFinite(unformattedValue)) return `${unformattedValue}`\n\n return n(unformattedValue, {\n useGrouping: useGrouping.value,\n minimumFractionDigits: precision.value,\n maximumFractionDigits: precision.value\n })\n})\n\nfunction updateValue(e: UIEvent) {\n const { target } = e\n if (!(target instanceof HTMLInputElement)) return\n const parsed = evaluateInput(unformatValue(target.value))\n if (parsed !== undefined)\n modelValue.value = Math.min(\n filteredProps.value.max,\n Math.max(filteredProps.value.min, parsed)\n )\n else target.value = formattedValue.value\n\n textEdit.value = false\n}\n\nconst sharedButtonClass = 'w-8 bg-transparent border-0 text-sm text-smoke-700'\nconst canDecrement = computed(\n () =>\n modelValue.value > filteredProps.value.min &&\n !props.widget.options?.disabled\n)\nconst canIncrement = computed(\n () =>\n modelValue.value < filteredProps.value.max &&\n !props.widget.options?.disabled\n)\n\nconst filteredProps = computed(() =>\n filterWidgetProps(props.widget.options, INPUT_EXCLUDED_PROPS)\n)\n\n// Get the precision value for proper number formatting\nconst precision = computed(() => {\n const p = props.widget.options?.precision\n // Treat negative or non-numeric precision as undefined\n return typeof p === 'number' && p >= 0 ? p : undefined\n})\n\n// Calculate the step value based on precision or widget options\nconst stepValue = computed(() => {\n // Use step2 (correct input spec value) if available\n if (props.widget.options?.step2 !== undefined) {\n return Number(props.widget.options.step2)\n }\n // Use step / 10 for custom large step values (> 10) to match litegraph behavior\n // This is important for extensions like Impact Pack that use custom step values (e.g., 640)\n // We skip default step values (1, 10) to avoid affecting normal widgets\n const step = props.widget.options?.step\n if (step !== undefined && step > 10) {\n return Number(step) / 10\n }\n // Otherwise, derive from precision\n if (precision.value !== undefined) {\n if (precision.value === 0) {\n return 1\n }\n // For precision > 0, step = 1 / (10^precision)\n // precision 1 → 0.1, precision 2 → 0.01, etc.\n return Number((1 / Math.pow(10, precision.value)).toFixed(precision.value))\n }\n // Default to 'any' for unrestricted stepping\n return 0\n})\n\n// Disable grouping separators by default unless explicitly enabled by the node author\nconst useGrouping = computed(() => {\n return props.widget.options?.useGrouping === true\n})\n\n// Check if increment/decrement buttons should be disabled due to precision limits\nconst buttonsDisabled = computed(() => {\n const currentValue = modelValue.value ?? 0\n return (\n !Number.isFinite(currentValue) ||\n Math.abs(currentValue) > Number.MAX_SAFE_INTEGER\n )\n})\n\nfunction updateValueBy(delta: number) {\n modelValue.value = Math.min(\n filteredProps.value.max,\n Math.max(filteredProps.value.min, modelValue.value + delta)\n )\n}\n\nconst dragValue = ref<number>()\nconst dragDelta = ref(0)\nfunction handleMouseDown(e: PointerEvent) {\n if (props.widget.options?.disabled) return\n const { target } = e\n if (!(target instanceof HTMLElement)) return\n target.setPointerCapture(e.pointerId)\n dragValue.value = modelValue.value\n dragDelta.value = 0\n}\nfunction handleMouseMove(e: PointerEvent) {\n if (dragValue.value === undefined) return\n dragDelta.value += e.movementX\n const unclippedValue =\n dragValue.value + ((dragDelta.value / 10) | 0) * stepValue.value\n dragDelta.value %= 10\n dragValue.value = Math.min(\n filteredProps.value.max,\n Math.max(filteredProps.value.min, unclippedValue)\n )\n}\nfunction handleMouseUp() {\n const newValue = dragValue.value\n if (newValue === undefined) return\n modelValue.value = newValue\n dragValue.value = undefined\n\n if (dragDelta.value === 0) {\n textEdit.value = true\n inputField.value?.focus()\n inputField.value?.setSelectionRange(0, -1)\n }\n dragDelta.value = 0\n}\n\nconst buttonTooltip = computed(() => {\n if (buttonsDisabled.value) {\n return 'Increment/decrement disabled: value exceeds JavaScript precision limit (±2^53)'\n }\n return null\n})\n</script>\n\n<template>\n <WidgetLayoutField :widget>\n <div\n ref=\"widgetContainer\"\n v-tooltip=\"buttonTooltip\"\n v-bind=\"filteredProps\"\n :aria-label=\"widget.name\"\n :class=\"cn(WidgetInputBaseClass, 'grow text-xs flex h-7')\"\n >\n <button\n v-if=\"!buttonsDisabled\"\n data-testid=\"decrement\"\n :class=\"\n cn(sharedButtonClass, 'pi pi-minus', !canDecrement && 'opacity-60')\n \"\n :disabled=\"!canDecrement\"\n tabindex=\"-1\"\n @click=\"modelValue -= stepValue\"\n />\n <div class=\"relative min-w-[4ch] flex-1 py-1.5 my-0.25\">\n <input\n ref=\"inputField\"\n :aria-valuenow=\"dragValue ?? modelValue\"\n :aria-valuemin=\"filteredProps.min\"\n :aria-valuemax=\"filteredProps.max\"\n :class=\"\n cn(\n 'bg-transparent border-0 focus:outline-0 p-1 truncate text-sm absolute inset-0'\n )\n \"\n inputmode=\"decimal\"\n :value=\"formattedValue\"\n role=\"spinbutton\"\n tabindex=\"0\"\n :disabled=\"widget.options?.disabled\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n @blur=\"updateValue\"\n @keyup.enter=\"updateValue\"\n @keydown.up.prevent=\"updateValueBy(stepValue)\"\n @keydown.down.prevent=\"updateValueBy(-stepValue)\"\n @keydown.page-up.prevent=\"updateValueBy(10 * stepValue)\"\n @keydown.page-down.prevent=\"updateValueBy(-10 * stepValue)\"\n @dragstart.prevent\n />\n <div\n :class=\"\n cn(\n 'absolute inset-0 z-10 cursor-ew-resize',\n textEdit && 'hidden pointer-events-none'\n )\n \"\n @pointerdown=\"handleMouseDown\"\n @pointermove=\"handleMouseMove\"\n @pointerup=\"handleMouseUp\"\n @pointercancel=\"\n () => {\n dragValue = undefined\n dragDelta = 0\n }\n \"\n />\n </div>\n\n <slot />\n <button\n v-if=\"!buttonsDisabled\"\n data-testid=\"increment\"\n :class=\"\n cn(sharedButtonClass, 'pi pi-plus', !canIncrement && 'opacity-60')\n \"\n :disabled=\"!canIncrement\"\n tabindex=\"-1\"\n @click=\"modelValue += stepValue\"\n />\n </div>\n </WidgetLayoutField>\n</template>\n","import { computed, toValue } from 'vue'\nimport type { MaybeRefOrGetter } from 'vue'\n\ninterface NumberWidgetOptions {\n step?: number\n step2?: number\n precision?: number\n}\n\n/**\n * Shared composable for calculating step values in number input widgets\n * Handles both explicit step2 values and precision-derived steps\n */\nexport function useNumberStepCalculation(\n options: NumberWidgetOptions | undefined,\n precisionArg: MaybeRefOrGetter<number | undefined>,\n returnUndefinedForDefault = false\n) {\n return computed(() => {\n const precision = toValue(precisionArg)\n // Use step2 (correct input spec value) if available\n if (options?.step2 !== undefined) {\n return Number(options.step2)\n }\n // Use step / 10 for custom large step values (> 10) to match litegraph behavior\n // This is important for extensions like Impact Pack that use custom step values (e.g., 640)\n // We skip default step values (1, 10) to avoid affecting normal widgets\n const step = options?.step\n if (step !== undefined && step > 10) {\n return Number(step) / 10\n }\n\n if (precision === undefined) {\n return returnUndefinedForDefault ? undefined : 0\n }\n\n if (precision === 0) return 1\n\n // For precision > 0, step = 1 / (10^precision)\n const calculatedStep = 1 / Math.pow(10, precision)\n return returnUndefinedForDefault\n ? calculatedStep\n : Number(calculatedStep.toFixed(precision))\n })\n}\n","import { cn } from '@comfyorg/tailwind-utils'\n\nconst sharedButtonClasses = cn(\n 'inline-flex items-center justify-center border-0 bg-transparent text-inherit transition-colors duration-150 ease-in-out ',\n 'hover:bg-node-component-surface-hovered active:bg-node-component-surface-selected',\n 'disabled:bg-node-component-disabled disabled:text-node-icon-disabled disabled:cursor-not-allowed'\n)\n\nexport function useNumberWidgetButtonPt(options?: {\n roundedLeft?: boolean\n roundedRight?: boolean\n}) {\n const { roundedLeft = false, roundedRight = false } = options ?? {}\n\n const increment = cn(sharedButtonClasses, roundedRight && 'rounded-r-lg')\n const decrement = cn(sharedButtonClasses, roundedLeft && 'rounded-l-lg')\n\n return {\n incrementButton: {\n class: increment\n },\n decrementButton: {\n class: decrement\n }\n }\n}\n","<template>\n <WidgetLayoutField :widget=\"widget\">\n <div :class=\"cn(WidgetInputBaseClass, 'flex items-center gap-2 pl-3 pr-2')\">\n <Slider\n :model-value=\"[modelValue]\"\n v-bind=\"filteredProps\"\n class=\"flex-grow text-xs\"\n :step=\"stepValue\"\n :aria-label=\"widget.name\"\n @update:model-value=\"updateLocalValue\"\n />\n <InputNumber\n :key=\"timesEmptied\"\n :model-value=\"modelValue\"\n v-bind=\"filteredProps\"\n :step=\"stepValue\"\n :min-fraction-digits=\"precision\"\n :max-fraction-digits=\"precision\"\n :aria-label=\"widget.name\"\n size=\"small\"\n pt:pc-input-text:root=\"min-w-[4ch] bg-transparent border-none text-center truncate\"\n class=\"w-16\"\n :pt=\"sliderNumberPt\"\n @update:model-value=\"handleNumberInputUpdate\"\n />\n </div>\n </WidgetLayoutField>\n</template>\n\n<script setup lang=\"ts\">\nimport InputNumber from 'primevue/inputnumber'\nimport { computed, ref } from 'vue'\n\nimport Slider from '@/components/ui/slider/Slider.vue'\nimport type { SimplifiedWidget } from '@/types/simplifiedWidget'\nimport { cn } from '@/utils/tailwindUtil'\nimport {\n STANDARD_EXCLUDED_PROPS,\n filterWidgetProps\n} from '@/utils/widgetPropFilter'\n\nimport { useNumberStepCalculation } from '../composables/useNumberStepCalculation'\nimport { useNumberWidgetButtonPt } from '../composables/useNumberWidgetButtonPt'\nimport { WidgetInputBaseClass } from './layout'\nimport WidgetLayoutField from './layout/WidgetLayoutField.vue'\n\nconst { widget } = defineProps<{\n widget: SimplifiedWidget<number>\n}>()\n\nconst modelValue = defineModel<number>({ default: 0 })\n\nconst timesEmptied = ref(0)\n\nconst updateLocalValue = (newValue: number[] | undefined): void => {\n if (newValue?.length) modelValue.value = newValue[0]\n}\n\nconst handleNumberInputUpdate = (newValue: number | undefined) => {\n if (newValue !== undefined) {\n updateLocalValue([newValue])\n return\n }\n timesEmptied.value += 1\n}\n\nconst filteredProps = computed(() =>\n filterWidgetProps(widget.options, STANDARD_EXCLUDED_PROPS)\n)\n\nconst p = widget.options?.precision\nconst precision = typeof p === 'number' && p >= 0 ? p : undefined\n\n// Calculate the step value based on precision or widget options\nconst stepValue = useNumberStepCalculation(widget.options, precision, true)\n\nconst sliderNumberPt = useNumberWidgetButtonPt({\n roundedLeft: true,\n roundedRight: true\n})\n</script>\n\n<style scoped>\n:deep(.p-inputnumber-button.p-disabled .pi),\n:deep(.p-inputnumber-button.p-disabled .p-icon) {\n color: var(--color-node-icon-disabled) !important;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport type {\n SimplifiedControlWidget,\n SimplifiedWidget\n} from '@/types/simplifiedWidget'\n\nimport WidgetInputNumberInput from './WidgetInputNumberInput.vue'\nimport WidgetInputNumberSlider from './WidgetInputNumberSlider.vue'\nimport WidgetWithControl from './WidgetWithControl.vue'\n\nconst props = defineProps<{\n widget: SimplifiedWidget<number>\n}>()\n\nconst modelValue = defineModel<number>({ default: 0 })\n\nconst hasControlAfterGenerate = computed(() => {\n return !!props.widget.controlWidget\n})\n</script>\n\n<template>\n <WidgetWithControl\n v-if=\"hasControlAfterGenerate\"\n v-model=\"modelValue\"\n :widget=\"widget as SimplifiedControlWidget<number>\"\n :component=\"\n widget.type === 'slider'\n ? WidgetInputNumberSlider\n : WidgetInputNumberInput\n \"\n />\n <component\n :is=\"\n widget.type === 'slider'\n ? WidgetInputNumberSlider\n : WidgetInputNumberInput\n \"\n v-else\n v-model=\"modelValue\"\n :widget=\"widget\"\n v-bind=\"$attrs\"\n />\n</template>\n"],"names":["sharedButtonClass","n","useI18n","props","__props","widgetContainer","useTemplateRef","inputField","textEdit","ref","onClickOutside","decimalSeparator","computed","groupSeparator","unformatValue","value","__name","modelValue","_useModel","formattedValue","unformattedValue","dragValue","useGrouping","precision","updateValue","target","parsed","evaluateInput","filteredProps","canDecrement","canIncrement","filterWidgetProps","INPUT_EXCLUDED_PROPS","p","stepValue","step","buttonsDisabled","currentValue","updateValueBy","delta","dragDelta","handleMouseDown","handleMouseMove","unclippedValue","handleMouseUp","newValue","buttonTooltip","useNumberStepCalculation","options","precisionArg","returnUndefinedForDefault","toValue","calculatedStep","sharedButtonClasses","cn","useNumberWidgetButtonPt","roundedLeft","roundedRight","increment","decrement","timesEmptied","updateLocalValue","handleNumberInputUpdate","STANDARD_EXCLUDED_PROPS","sliderNumberPt","hasControlAfterGenerate"],"mappings":"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"}
1
+ {"version":3,"file":"WidgetInputNumber.vue_vue_type_script_setup_true_lang-rPX1TIkC.js","sources":["../../src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberInput.vue","../../src/renderer/extensions/vueNodes/widgets/composables/useNumberStepCalculation.ts","../../src/renderer/extensions/vueNodes/widgets/composables/useNumberWidgetButtonPt.ts","../../src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberSlider.vue","../../src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumber.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onClickOutside } from '@vueuse/core'\nimport { computed, ref, useTemplateRef } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport { evaluateInput } from '@/lib/litegraph/src/utils/widget'\nimport type { SimplifiedWidget } from '@/types/simplifiedWidget'\nimport { cn } from '@/utils/tailwindUtil'\nimport {\n INPUT_EXCLUDED_PROPS,\n filterWidgetProps\n} from '@/utils/widgetPropFilter'\n\nimport { WidgetInputBaseClass } from './layout'\nimport WidgetLayoutField from './layout/WidgetLayoutField.vue'\n\nconst { n } = useI18n()\n\nconst props = defineProps<{\n widget: SimplifiedWidget<number>\n}>()\n\nconst widgetContainer = useTemplateRef<HTMLDivElement>('widgetContainer')\nconst inputField = useTemplateRef<HTMLInputElement>('inputField')\nconst textEdit = ref(false)\nonClickOutside(widgetContainer, () => {\n if (textEdit.value) {\n textEdit.value = false\n }\n})\n\nconst decimalSeparator = computed(() => n(1.1).replace(/\\p{Number}/gu, ''))\nconst groupSeparator = computed(() => n(11111).replace(/\\p{Number}/gu, ''))\nfunction unformatValue(value: string) {\n return value\n .replaceAll(groupSeparator.value, '')\n .replaceAll(decimalSeparator.value, '.')\n}\n\nconst modelValue = defineModel<number>({ default: 0 })\n\nconst formattedValue = computed(() => {\n const unformattedValue = dragValue.value ?? modelValue.value\n if (!isFinite(unformattedValue)) return `${unformattedValue}`\n\n return n(unformattedValue, {\n useGrouping: useGrouping.value,\n minimumFractionDigits: precision.value,\n maximumFractionDigits: precision.value\n })\n})\n\nfunction updateValue(e: UIEvent) {\n const { target } = e\n if (!(target instanceof HTMLInputElement)) return\n const parsed = evaluateInput(unformatValue(target.value))\n if (parsed !== undefined)\n modelValue.value = Math.min(\n filteredProps.value.max,\n Math.max(filteredProps.value.min, parsed)\n )\n else target.value = formattedValue.value\n\n textEdit.value = false\n}\n\nconst sharedButtonClass = 'w-8 bg-transparent border-0 text-sm text-smoke-700'\nconst canDecrement = computed(\n () =>\n modelValue.value > filteredProps.value.min &&\n !props.widget.options?.disabled\n)\nconst canIncrement = computed(\n () =>\n modelValue.value < filteredProps.value.max &&\n !props.widget.options?.disabled\n)\n\nconst filteredProps = computed(() =>\n filterWidgetProps(props.widget.options, INPUT_EXCLUDED_PROPS)\n)\n\n// Get the precision value for proper number formatting\nconst precision = computed(() => {\n const p = props.widget.options?.precision\n // Treat negative or non-numeric precision as undefined\n return typeof p === 'number' && p >= 0 ? p : undefined\n})\n\n// Calculate the step value based on precision or widget options\nconst stepValue = computed(() => {\n // Use step2 (correct input spec value) if available\n if (props.widget.options?.step2 !== undefined) {\n return Number(props.widget.options.step2)\n }\n // Use step / 10 for custom large step values (> 10) to match litegraph behavior\n // This is important for extensions like Impact Pack that use custom step values (e.g., 640)\n // We skip default step values (1, 10) to avoid affecting normal widgets\n const step = props.widget.options?.step\n if (step !== undefined && step > 10) {\n return Number(step) / 10\n }\n // Otherwise, derive from precision\n if (precision.value !== undefined) {\n if (precision.value === 0) {\n return 1\n }\n // For precision > 0, step = 1 / (10^precision)\n // precision 1 → 0.1, precision 2 → 0.01, etc.\n return Number((1 / Math.pow(10, precision.value)).toFixed(precision.value))\n }\n // Default to 'any' for unrestricted stepping\n return 0\n})\n\n// Disable grouping separators by default unless explicitly enabled by the node author\nconst useGrouping = computed(() => {\n return props.widget.options?.useGrouping === true\n})\n\n// Check if increment/decrement buttons should be disabled due to precision limits\nconst buttonsDisabled = computed(() => {\n const currentValue = modelValue.value ?? 0\n return (\n !Number.isFinite(currentValue) ||\n Math.abs(currentValue) > Number.MAX_SAFE_INTEGER\n )\n})\n\nfunction updateValueBy(delta: number) {\n modelValue.value = Math.min(\n filteredProps.value.max,\n Math.max(filteredProps.value.min, modelValue.value + delta)\n )\n}\n\nconst dragValue = ref<number>()\nconst dragDelta = ref(0)\nfunction handleMouseDown(e: PointerEvent) {\n if (props.widget.options?.disabled) return\n const { target } = e\n if (!(target instanceof HTMLElement)) return\n target.setPointerCapture(e.pointerId)\n dragValue.value = modelValue.value\n dragDelta.value = 0\n}\nfunction handleMouseMove(e: PointerEvent) {\n if (dragValue.value === undefined) return\n dragDelta.value += e.movementX\n const unclippedValue =\n dragValue.value + ((dragDelta.value / 10) | 0) * stepValue.value\n dragDelta.value %= 10\n dragValue.value = Math.min(\n filteredProps.value.max,\n Math.max(filteredProps.value.min, unclippedValue)\n )\n}\nfunction handleMouseUp() {\n const newValue = dragValue.value\n if (newValue === undefined) return\n modelValue.value = newValue\n dragValue.value = undefined\n\n if (dragDelta.value === 0) {\n textEdit.value = true\n inputField.value?.focus()\n inputField.value?.setSelectionRange(0, -1)\n }\n dragDelta.value = 0\n}\n\nconst buttonTooltip = computed(() => {\n if (buttonsDisabled.value) {\n return 'Increment/decrement disabled: value exceeds JavaScript precision limit (±2^53)'\n }\n return null\n})\n</script>\n\n<template>\n <WidgetLayoutField :widget>\n <div\n ref=\"widgetContainer\"\n v-tooltip=\"buttonTooltip\"\n v-bind=\"filteredProps\"\n :aria-label=\"widget.name\"\n :class=\"cn(WidgetInputBaseClass, 'grow text-xs flex h-7')\"\n >\n <button\n v-if=\"!buttonsDisabled\"\n data-testid=\"decrement\"\n :class=\"\n cn(sharedButtonClass, 'pi pi-minus', !canDecrement && 'opacity-60')\n \"\n :disabled=\"!canDecrement\"\n tabindex=\"-1\"\n @click=\"modelValue -= stepValue\"\n />\n <div class=\"relative min-w-[4ch] flex-1 py-1.5 my-0.25\">\n <input\n ref=\"inputField\"\n :aria-valuenow=\"dragValue ?? modelValue\"\n :aria-valuemin=\"filteredProps.min\"\n :aria-valuemax=\"filteredProps.max\"\n :class=\"\n cn(\n 'bg-transparent border-0 focus:outline-0 p-1 truncate text-sm absolute inset-0'\n )\n \"\n inputmode=\"decimal\"\n :value=\"formattedValue\"\n role=\"spinbutton\"\n tabindex=\"0\"\n :disabled=\"widget.options?.disabled\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n @blur=\"updateValue\"\n @keyup.enter=\"updateValue\"\n @keydown.up.prevent=\"updateValueBy(stepValue)\"\n @keydown.down.prevent=\"updateValueBy(-stepValue)\"\n @keydown.page-up.prevent=\"updateValueBy(10 * stepValue)\"\n @keydown.page-down.prevent=\"updateValueBy(-10 * stepValue)\"\n @dragstart.prevent\n />\n <div\n :class=\"\n cn(\n 'absolute inset-0 z-10 cursor-ew-resize',\n textEdit && 'hidden pointer-events-none'\n )\n \"\n @pointerdown=\"handleMouseDown\"\n @pointermove=\"handleMouseMove\"\n @pointerup=\"handleMouseUp\"\n @pointercancel=\"\n () => {\n dragValue = undefined\n dragDelta = 0\n }\n \"\n />\n </div>\n\n <slot />\n <button\n v-if=\"!buttonsDisabled\"\n data-testid=\"increment\"\n :class=\"\n cn(sharedButtonClass, 'pi pi-plus', !canIncrement && 'opacity-60')\n \"\n :disabled=\"!canIncrement\"\n tabindex=\"-1\"\n @click=\"modelValue += stepValue\"\n />\n </div>\n </WidgetLayoutField>\n</template>\n","import { computed, toValue } from 'vue'\nimport type { MaybeRefOrGetter } from 'vue'\n\ninterface NumberWidgetOptions {\n step?: number\n step2?: number\n precision?: number\n}\n\n/**\n * Shared composable for calculating step values in number input widgets\n * Handles both explicit step2 values and precision-derived steps\n */\nexport function useNumberStepCalculation(\n options: NumberWidgetOptions | undefined,\n precisionArg: MaybeRefOrGetter<number | undefined>,\n returnUndefinedForDefault = false\n) {\n return computed(() => {\n const precision = toValue(precisionArg)\n // Use step2 (correct input spec value) if available\n if (options?.step2 !== undefined) {\n return Number(options.step2)\n }\n // Use step / 10 for custom large step values (> 10) to match litegraph behavior\n // This is important for extensions like Impact Pack that use custom step values (e.g., 640)\n // We skip default step values (1, 10) to avoid affecting normal widgets\n const step = options?.step\n if (step !== undefined && step > 10) {\n return Number(step) / 10\n }\n\n if (precision === undefined) {\n return returnUndefinedForDefault ? undefined : 0\n }\n\n if (precision === 0) return 1\n\n // For precision > 0, step = 1 / (10^precision)\n const calculatedStep = 1 / Math.pow(10, precision)\n return returnUndefinedForDefault\n ? calculatedStep\n : Number(calculatedStep.toFixed(precision))\n })\n}\n","import { cn } from '@comfyorg/tailwind-utils'\n\nconst sharedButtonClasses = cn(\n 'inline-flex items-center justify-center border-0 bg-transparent text-inherit transition-colors duration-150 ease-in-out ',\n 'hover:bg-node-component-surface-hovered active:bg-node-component-surface-selected',\n 'disabled:bg-node-component-disabled disabled:text-node-icon-disabled disabled:cursor-not-allowed'\n)\n\nexport function useNumberWidgetButtonPt(options?: {\n roundedLeft?: boolean\n roundedRight?: boolean\n}) {\n const { roundedLeft = false, roundedRight = false } = options ?? {}\n\n const increment = cn(sharedButtonClasses, roundedRight && 'rounded-r-lg')\n const decrement = cn(sharedButtonClasses, roundedLeft && 'rounded-l-lg')\n\n return {\n incrementButton: {\n class: increment\n },\n decrementButton: {\n class: decrement\n }\n }\n}\n","<template>\n <WidgetLayoutField :widget=\"widget\">\n <div :class=\"cn(WidgetInputBaseClass, 'flex items-center gap-2 pl-3 pr-2')\">\n <Slider\n :model-value=\"[modelValue]\"\n v-bind=\"filteredProps\"\n class=\"flex-grow text-xs\"\n :step=\"stepValue\"\n :aria-label=\"widget.name\"\n @update:model-value=\"updateLocalValue\"\n />\n <InputNumber\n :key=\"timesEmptied\"\n :model-value=\"modelValue\"\n v-bind=\"filteredProps\"\n :step=\"stepValue\"\n :min-fraction-digits=\"precision\"\n :max-fraction-digits=\"precision\"\n :aria-label=\"widget.name\"\n size=\"small\"\n pt:pc-input-text:root=\"min-w-[4ch] bg-transparent border-none text-center truncate\"\n class=\"w-16\"\n :pt=\"sliderNumberPt\"\n @update:model-value=\"handleNumberInputUpdate\"\n />\n </div>\n </WidgetLayoutField>\n</template>\n\n<script setup lang=\"ts\">\nimport InputNumber from 'primevue/inputnumber'\nimport { computed, ref } from 'vue'\n\nimport Slider from '@/components/ui/slider/Slider.vue'\nimport type { SimplifiedWidget } from '@/types/simplifiedWidget'\nimport { cn } from '@/utils/tailwindUtil'\nimport {\n STANDARD_EXCLUDED_PROPS,\n filterWidgetProps\n} from '@/utils/widgetPropFilter'\n\nimport { useNumberStepCalculation } from '../composables/useNumberStepCalculation'\nimport { useNumberWidgetButtonPt } from '../composables/useNumberWidgetButtonPt'\nimport { WidgetInputBaseClass } from './layout'\nimport WidgetLayoutField from './layout/WidgetLayoutField.vue'\n\nconst { widget } = defineProps<{\n widget: SimplifiedWidget<number>\n}>()\n\nconst modelValue = defineModel<number>({ default: 0 })\n\nconst timesEmptied = ref(0)\n\nconst updateLocalValue = (newValue: number[] | undefined): void => {\n if (newValue?.length) modelValue.value = newValue[0]\n}\n\nconst handleNumberInputUpdate = (newValue: number | undefined) => {\n if (newValue !== undefined) {\n updateLocalValue([newValue])\n return\n }\n timesEmptied.value += 1\n}\n\nconst filteredProps = computed(() =>\n filterWidgetProps(widget.options, STANDARD_EXCLUDED_PROPS)\n)\n\nconst p = widget.options?.precision\nconst precision = typeof p === 'number' && p >= 0 ? p : undefined\n\n// Calculate the step value based on precision or widget options\nconst stepValue = useNumberStepCalculation(widget.options, precision, true)\n\nconst sliderNumberPt = useNumberWidgetButtonPt({\n roundedLeft: true,\n roundedRight: true\n})\n</script>\n\n<style scoped>\n:deep(.p-inputnumber-button.p-disabled .pi),\n:deep(.p-inputnumber-button.p-disabled .p-icon) {\n color: var(--color-node-icon-disabled) !important;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport type {\n SimplifiedControlWidget,\n SimplifiedWidget\n} from '@/types/simplifiedWidget'\n\nimport WidgetInputNumberInput from './WidgetInputNumberInput.vue'\nimport WidgetInputNumberSlider from './WidgetInputNumberSlider.vue'\nimport WidgetWithControl from './WidgetWithControl.vue'\n\nconst props = defineProps<{\n widget: SimplifiedWidget<number>\n}>()\n\nconst modelValue = defineModel<number>({ default: 0 })\n\nconst hasControlAfterGenerate = computed(() => {\n return !!props.widget.controlWidget\n})\n</script>\n\n<template>\n <WidgetWithControl\n v-if=\"hasControlAfterGenerate\"\n v-model=\"modelValue\"\n :widget=\"widget as SimplifiedControlWidget<number>\"\n :component=\"\n widget.type === 'slider'\n ? WidgetInputNumberSlider\n : WidgetInputNumberInput\n \"\n />\n <component\n :is=\"\n widget.type === 'slider'\n ? WidgetInputNumberSlider\n : WidgetInputNumberInput\n \"\n v-else\n v-model=\"modelValue\"\n :widget=\"widget\"\n v-bind=\"$attrs\"\n />\n</template>\n"],"names":["sharedButtonClass","n","useI18n","props","__props","widgetContainer","useTemplateRef","inputField","textEdit","ref","onClickOutside","decimalSeparator","computed","groupSeparator","unformatValue","value","__name","modelValue","_useModel","formattedValue","unformattedValue","dragValue","useGrouping","precision","updateValue","target","parsed","evaluateInput","filteredProps","canDecrement","canIncrement","filterWidgetProps","INPUT_EXCLUDED_PROPS","p","stepValue","step","buttonsDisabled","currentValue","updateValueBy","delta","dragDelta","handleMouseDown","handleMouseMove","unclippedValue","handleMouseUp","newValue","buttonTooltip","useNumberStepCalculation","options","precisionArg","returnUndefinedForDefault","toValue","calculatedStep","sharedButtonClasses","cn","useNumberWidgetButtonPt","roundedLeft","roundedRight","increment","decrement","timesEmptied","updateLocalValue","handleNumberInputUpdate","STANDARD_EXCLUDED_PROPS","sliderNumberPt","hasControlAfterGenerate"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{e as i}from"./vendor-primevue-Cif--Rbw.js";import{c as d}from"./index-Bc79VbnU.js";import{f as p,I as u}from"./widgetPropFilter-CygYoMQt.js";import{W as n}from"./index-BBvP0bLh.js";import{_ as f}from"./WidgetLayoutField.vue_vue_type_script_setup_true_lang-CYDaxuge.js";import{a2 as c,dk as g,dl as w,E as V,j as P,d as _,k as x,z as k,a8 as e,m as C}from"./vendor-other-Dsj-QuOx.js";import"./vendor-vue-DNQSPQQ2.js";import"./vendor-reka-ui-WjwjFuZo.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-ByuY8CdW.js";import"./vendor-tiptap-YMjM2h-Z.js";const T=c({__name:"WidgetInputText",props:g({widget:{}},{modelValue:{default:""},modelModifiers:{}}),emits:["update:modelValue"],setup(t){const l=t,a=w(t,"modelValue"),r=V(()=>p(l.widget.options,u));return(o,s)=>(_(),P(f,{widget:o.widget},{default:x(()=>[k(e(i),C({modelValue:a.value,"onUpdate:modelValue":s[0]||(s[0]=m=>a.value=m)},r.value,{class:e(d)(e(n),"w-full text-xs py-2 px-4"),"aria-label":o.widget.name,size:"small",pt:{root:"truncate min-w-[4ch]"}}),null,16,["modelValue","class","aria-label"])]),_:1},8,["widget"]))}});export{T as default};
2
- //# sourceMappingURL=WidgetInputText-B2YoBI4Y.js.map
1
+ import{e as i}from"./vendor-primevue-Cif--Rbw.js";import{c as d}from"./index-U7jagKl8.js";import{f as p,I as u}from"./widgetPropFilter-CygYoMQt.js";import{W as n}from"./index-BST1SetX.js";import{_ as f}from"./WidgetLayoutField.vue_vue_type_script_setup_true_lang-BrNsu13j.js";import{a2 as c,dk as g,dl as w,E as V,j as P,d as _,k as x,z as k,a8 as e,m as C}from"./vendor-other-Dsj-QuOx.js";import"./vendor-vue-DNQSPQQ2.js";import"./vendor-reka-ui-WjwjFuZo.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-ByuY8CdW.js";import"./vendor-tiptap-YMjM2h-Z.js";const T=c({__name:"WidgetInputText",props:g({widget:{}},{modelValue:{default:""},modelModifiers:{}}),emits:["update:modelValue"],setup(t){const l=t,a=w(t,"modelValue"),r=V(()=>p(l.widget.options,u));return(o,s)=>(_(),P(f,{widget:o.widget},{default:x(()=>[k(e(i),C({modelValue:a.value,"onUpdate:modelValue":s[0]||(s[0]=m=>a.value=m)},r.value,{class:e(d)(e(n),"w-full text-xs py-2 px-4"),"aria-label":o.widget.name,size:"small",pt:{root:"truncate min-w-[4ch]"}}),null,16,["modelValue","class","aria-label"])]),_:1},8,["widget"]))}});export{T as default};
2
+ //# sourceMappingURL=WidgetInputText-NnOJku4t.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WidgetInputText-B2YoBI4Y.js","sources":["../../src/renderer/extensions/vueNodes/widgets/components/WidgetInputText.vue"],"sourcesContent":["<template>\n <WidgetLayoutField :widget=\"widget\">\n <InputText\n v-model=\"modelValue\"\n v-bind=\"filteredProps\"\n :class=\"cn(WidgetInputBaseClass, 'w-full text-xs py-2 px-4')\"\n :aria-label=\"widget.name\"\n size=\"small\"\n :pt=\"{ root: 'truncate min-w-[4ch]' }\"\n />\n </WidgetLayoutField>\n</template>\n\n<script setup lang=\"ts\">\nimport InputText from 'primevue/inputtext'\nimport { computed } from 'vue'\n\nimport type { SimplifiedWidget } from '@/types/simplifiedWidget'\nimport { cn } from '@/utils/tailwindUtil'\nimport {\n INPUT_EXCLUDED_PROPS,\n filterWidgetProps\n} from '@/utils/widgetPropFilter'\n\nimport { WidgetInputBaseClass } from './layout'\nimport WidgetLayoutField from './layout/WidgetLayoutField.vue'\n\nconst props = defineProps<{\n widget: SimplifiedWidget<string>\n}>()\n\nconst modelValue = defineModel<string>({ default: '' })\n\nconst filteredProps = computed(() =>\n filterWidgetProps(props.widget.options, INPUT_EXCLUDED_PROPS)\n)\n</script>\n"],"names":["props","__props","modelValue","_useModel","filteredProps","computed","filterWidgetProps","INPUT_EXCLUDED_PROPS"],"mappings":"gsBA2BA,MAAMA,EAAQC,EAIRC,EAAaC,EAAmBF,EAAA,YAAgB,EAEhDG,EAAgBC,EAAS,IAC7BC,EAAkBN,EAAM,OAAO,QAASO,CAAoB,CAAA"}
1
+ {"version":3,"file":"WidgetInputText-NnOJku4t.js","sources":["../../src/renderer/extensions/vueNodes/widgets/components/WidgetInputText.vue"],"sourcesContent":["<template>\n <WidgetLayoutField :widget=\"widget\">\n <InputText\n v-model=\"modelValue\"\n v-bind=\"filteredProps\"\n :class=\"cn(WidgetInputBaseClass, 'w-full text-xs py-2 px-4')\"\n :aria-label=\"widget.name\"\n size=\"small\"\n :pt=\"{ root: 'truncate min-w-[4ch]' }\"\n />\n </WidgetLayoutField>\n</template>\n\n<script setup lang=\"ts\">\nimport InputText from 'primevue/inputtext'\nimport { computed } from 'vue'\n\nimport type { SimplifiedWidget } from '@/types/simplifiedWidget'\nimport { cn } from '@/utils/tailwindUtil'\nimport {\n INPUT_EXCLUDED_PROPS,\n filterWidgetProps\n} from '@/utils/widgetPropFilter'\n\nimport { WidgetInputBaseClass } from './layout'\nimport WidgetLayoutField from './layout/WidgetLayoutField.vue'\n\nconst props = defineProps<{\n widget: SimplifiedWidget<string>\n}>()\n\nconst modelValue = defineModel<string>({ default: '' })\n\nconst filteredProps = computed(() =>\n filterWidgetProps(props.widget.options, INPUT_EXCLUDED_PROPS)\n)\n</script>\n"],"names":["props","__props","modelValue","_useModel","filteredProps","computed","filterWidgetProps","INPUT_EXCLUDED_PROPS"],"mappings":"gsBA2BA,MAAMA,EAAQC,EAIRC,EAAaC,EAAmBF,EAAA,YAAgB,EAEhDG,EAAgBC,EAAS,IAC7BC,EAAkBN,EAAM,OAAO,QAASO,CAAoB,CAAA"}
@@ -1,2 +1,2 @@
1
- import{a2 as l,i as u,c as o,d as s,q as i,e as a,a8 as r,F as m,A as g,u as p,I as n,s as c,p as f}from"./vendor-other-Dsj-QuOx.js";import{c as w}from"./index-Bc79VbnU.js";const y={class:"grid grid-cols-subgrid min-w-0 justify-between gap-1 text-node-component-slot-text"},h={key:0,class:"truncate content-center-safe"},v={class:"relative min-w-0 flex-1"},_=l({__name:"WidgetLayoutField",props:{widget:{}},setup(b){const d=u("hideLayoutField",!1);return(t,e)=>(s(),o("div",y,[r(d)?i("",!0):(s(),o("div",h,[t.widget.name?(s(),o(m,{key:0},[g(p(t.widget.label||t.widget.name),1)],64)):i("",!0)])),a("div",v,[a("div",{class:c(r(w)("cursor-default min-w-0 rounded-lg focus-within:ring focus-within:ring-component-node-widget-background-highlighted transition-all",t.widget.borderStyle)),onPointerdown:e[0]||(e[0]=n(()=>{},["stop"])),onPointermove:e[1]||(e[1]=n(()=>{},["stop"])),onPointerup:e[2]||(e[2]=n(()=>{},["stop"]))},[f(t.$slots,"default")],34)])]))}});export{_};
2
- //# sourceMappingURL=WidgetLayoutField.vue_vue_type_script_setup_true_lang-CYDaxuge.js.map
1
+ import{a2 as l,i as u,c as o,d as s,q as i,e as a,a8 as r,F as m,A as g,u as p,I as n,s as c,p as f}from"./vendor-other-Dsj-QuOx.js";import{c as w}from"./index-U7jagKl8.js";const y={class:"grid grid-cols-subgrid min-w-0 justify-between gap-1 text-node-component-slot-text"},h={key:0,class:"truncate content-center-safe"},v={class:"relative min-w-0 flex-1"},_=l({__name:"WidgetLayoutField",props:{widget:{}},setup(b){const d=u("hideLayoutField",!1);return(t,e)=>(s(),o("div",y,[r(d)?i("",!0):(s(),o("div",h,[t.widget.name?(s(),o(m,{key:0},[g(p(t.widget.label||t.widget.name),1)],64)):i("",!0)])),a("div",v,[a("div",{class:c(r(w)("cursor-default min-w-0 rounded-lg focus-within:ring focus-within:ring-component-node-widget-background-highlighted transition-all",t.widget.borderStyle)),onPointerdown:e[0]||(e[0]=n(()=>{},["stop"])),onPointermove:e[1]||(e[1]=n(()=>{},["stop"])),onPointerup:e[2]||(e[2]=n(()=>{},["stop"]))},[f(t.$slots,"default")],34)])]))}});export{_};
2
+ //# sourceMappingURL=WidgetLayoutField.vue_vue_type_script_setup_true_lang-BrNsu13j.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WidgetLayoutField.vue_vue_type_script_setup_true_lang-CYDaxuge.js","sources":["../../src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { inject } from 'vue'\n\nimport type { SimplifiedWidget } from '@/types/simplifiedWidget'\nimport { cn } from '@/utils/tailwindUtil'\n\ndefineProps<{\n widget: Pick<\n SimplifiedWidget<string | number | undefined>,\n 'name' | 'label' | 'borderStyle'\n >\n}>()\n\nconst hideLayoutField = inject<boolean>('hideLayoutField', false)\n</script>\n\n<template>\n <div\n class=\"grid grid-cols-subgrid min-w-0 justify-between gap-1 text-node-component-slot-text\"\n >\n <div v-if=\"!hideLayoutField\" class=\"truncate content-center-safe\">\n <template v-if=\"widget.name\">\n {{ widget.label || widget.name }}\n </template>\n </div>\n <!-- basis-full grow -->\n <div class=\"relative min-w-0 flex-1\">\n <div\n :class=\"\n cn(\n 'cursor-default min-w-0 rounded-lg focus-within:ring focus-within:ring-component-node-widget-background-highlighted transition-all',\n widget.borderStyle\n )\n \"\n @pointerdown.stop\n @pointermove.stop\n @pointerup.stop\n >\n <slot />\n </div>\n </div>\n </div>\n</template>\n"],"names":["hideLayoutField","inject"],"mappings":"gaAaA,MAAMA,EAAkBC,EAAgB,kBAAmB,EAAK"}
1
+ {"version":3,"file":"WidgetLayoutField.vue_vue_type_script_setup_true_lang-BrNsu13j.js","sources":["../../src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { inject } from 'vue'\n\nimport type { SimplifiedWidget } from '@/types/simplifiedWidget'\nimport { cn } from '@/utils/tailwindUtil'\n\ndefineProps<{\n widget: Pick<\n SimplifiedWidget<string | number | undefined>,\n 'name' | 'label' | 'borderStyle'\n >\n}>()\n\nconst hideLayoutField = inject<boolean>('hideLayoutField', false)\n</script>\n\n<template>\n <div\n class=\"grid grid-cols-subgrid min-w-0 justify-between gap-1 text-node-component-slot-text\"\n >\n <div v-if=\"!hideLayoutField\" class=\"truncate content-center-safe\">\n <template v-if=\"widget.name\">\n {{ widget.label || widget.name }}\n </template>\n </div>\n <!-- basis-full grow -->\n <div class=\"relative min-w-0 flex-1\">\n <div\n :class=\"\n cn(\n 'cursor-default min-w-0 rounded-lg focus-within:ring focus-within:ring-component-node-widget-background-highlighted transition-all',\n widget.borderStyle\n )\n \"\n @pointerdown.stop\n @pointermove.stop\n @pointerup.stop\n >\n <slot />\n </div>\n </div>\n </div>\n</template>\n"],"names":["hideLayoutField","inject"],"mappings":"gaAaA,MAAMA,EAAkBC,EAAgB,kBAAmB,EAAK"}
@@ -1,2 +1,2 @@
1
- import{b3 as o}from"./index-Bc79VbnU.js";import"./vendor-primevue-Cif--Rbw.js";import"./vendor-other-Dsj-QuOx.js";import"./vendor-vue-DNQSPQQ2.js";import"./vendor-reka-ui-WjwjFuZo.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-ByuY8CdW.js";import"./vendor-tiptap-YMjM2h-Z.js";export{o as default};
2
- //# sourceMappingURL=WidgetLegacy-DgBI3-l2.js.map
1
+ import{b3 as o}from"./index-U7jagKl8.js";import"./vendor-primevue-Cif--Rbw.js";import"./vendor-other-Dsj-QuOx.js";import"./vendor-vue-DNQSPQQ2.js";import"./vendor-reka-ui-WjwjFuZo.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-ByuY8CdW.js";import"./vendor-tiptap-YMjM2h-Z.js";export{o as default};
2
+ //# sourceMappingURL=WidgetLegacy-3d5GSSgo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WidgetLegacy-3d5GSSgo.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,2 +1,2 @@
1
- var p=Object.defineProperty;var s=(l,a)=>p(l,"name",{value:a,configurable:!0});import{a2 as c,dk as v,dl as w,r as n,E as g,c as k,d as V,e as M,l as b,s as $,v as y,z as x,I as i,a8 as B,n as h}from"./vendor-other-Dsj-QuOx.js";import{aa as z}from"./vendor-primevue-Cif--Rbw.js";import{bt as E}from"./index-Bc79VbnU.js";import"./vendor-vue-DNQSPQQ2.js";import"./vendor-reka-ui-WjwjFuZo.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-ByuY8CdW.js";import"./vendor-tiptap-YMjM2h-Z.js";const H=["innerHTML"],U=c({__name:"WidgetMarkdown",props:v({widget:{}},{modelValue:{default:""},modelModifiers:{}}),emits:["update:modelValue"],setup(l){const a=w(l,"modelValue"),t=n(!1),r=n(),d=g(()=>E(a.value||"")),u=s(async()=>{t.value||l.widget.options?.read_only||(t.value=!0,await h(),r.value?.$el?.focus())},"startEditing"),m=s(()=>{t.value=!1},"handleBlur");return(o,e)=>(V(),k("div",{class:"widget-markdown relative w-full",onDblclick:u},[M("div",{class:$(["comfy-markdown-content size-full min-h-[60px] overflow-y-auto rounded-lg text-sm",t.value===!1?"visible":"invisible"]),innerHTML:d.value},null,10,H),b(x(B(z),{ref_key:"textareaRef",ref:r,modelValue:a.value,"onUpdate:modelValue":e[0]||(e[0]=f=>a.value=f),"aria-label":`${o.$t("g.edit")} ${o.widget.name||o.$t("g.markdown")} ${o.$t("g.content")}`,class:"absolute inset-0 min-h-[60px] w-full resize-none",pt:{root:{class:"text-sm w-full h-full",onBlur:m}},"data-capture-wheel":"true",onClick:e[1]||(e[1]=i(()=>{},["stop"])),onKeydown:e[2]||(e[2]=i(()=>{},["stop"]))},null,8,["modelValue","aria-label","pt"]),[[y,t.value]])],32))}});export{U as default};
2
- //# sourceMappingURL=WidgetMarkdown-Bqcf7Vpy.js.map
1
+ var p=Object.defineProperty;var s=(l,a)=>p(l,"name",{value:a,configurable:!0});import{a2 as c,dk as v,dl as w,r as n,E as g,c as k,d as V,e as M,l as b,s as $,v as y,z as x,I as i,a8 as B,n as h}from"./vendor-other-Dsj-QuOx.js";import{aa as z}from"./vendor-primevue-Cif--Rbw.js";import{bt as E}from"./index-U7jagKl8.js";import"./vendor-vue-DNQSPQQ2.js";import"./vendor-reka-ui-WjwjFuZo.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-ByuY8CdW.js";import"./vendor-tiptap-YMjM2h-Z.js";const H=["innerHTML"],U=c({__name:"WidgetMarkdown",props:v({widget:{}},{modelValue:{default:""},modelModifiers:{}}),emits:["update:modelValue"],setup(l){const a=w(l,"modelValue"),t=n(!1),r=n(),d=g(()=>E(a.value||"")),u=s(async()=>{t.value||l.widget.options?.read_only||(t.value=!0,await h(),r.value?.$el?.focus())},"startEditing"),m=s(()=>{t.value=!1},"handleBlur");return(o,e)=>(V(),k("div",{class:"widget-markdown relative w-full",onDblclick:u},[M("div",{class:$(["comfy-markdown-content size-full min-h-[60px] overflow-y-auto rounded-lg text-sm",t.value===!1?"visible":"invisible"]),innerHTML:d.value},null,10,H),b(x(B(z),{ref_key:"textareaRef",ref:r,modelValue:a.value,"onUpdate:modelValue":e[0]||(e[0]=f=>a.value=f),"aria-label":`${o.$t("g.edit")} ${o.widget.name||o.$t("g.markdown")} ${o.$t("g.content")}`,class:"absolute inset-0 min-h-[60px] w-full resize-none",pt:{root:{class:"text-sm w-full h-full",onBlur:m}},"data-capture-wheel":"true",onClick:e[1]||(e[1]=i(()=>{},["stop"])),onKeydown:e[2]||(e[2]=i(()=>{},["stop"]))},null,8,["modelValue","aria-label","pt"]),[[y,t.value]])],32))}});export{U as default};
2
+ //# sourceMappingURL=WidgetMarkdown-BTfwNVeV.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WidgetMarkdown-Bqcf7Vpy.js","sources":["../../src/renderer/extensions/vueNodes/widgets/components/WidgetMarkdown.vue"],"sourcesContent":["<template>\n <div class=\"widget-markdown relative w-full\" @dblclick=\"startEditing\">\n <!-- Display mode: Rendered markdown -->\n <div\n class=\"comfy-markdown-content size-full min-h-[60px] overflow-y-auto rounded-lg text-sm\"\n :class=\"isEditing === false ? 'visible' : 'invisible'\"\n v-html=\"renderedHtml\"\n />\n\n <!-- Edit mode: Textarea -->\n <Textarea\n v-show=\"isEditing\"\n ref=\"textareaRef\"\n v-model=\"modelValue\"\n :aria-label=\"`${$t('g.edit')} ${widget.name || $t('g.markdown')} ${$t('g.content')}`\"\n class=\"absolute inset-0 min-h-[60px] w-full resize-none\"\n :pt=\"{\n root: {\n class: 'text-sm w-full h-full',\n onBlur: handleBlur\n }\n }\"\n data-capture-wheel=\"true\"\n @click.stop\n @keydown.stop\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Textarea from 'primevue/textarea'\nimport { computed, nextTick, ref } from 'vue'\n\nimport type { SimplifiedWidget } from '@/types/simplifiedWidget'\nimport { renderMarkdownToHtml } from '@/utils/markdownRendererUtil'\n\nconst { widget } = defineProps<{\n widget: SimplifiedWidget<string>\n}>()\n\nconst modelValue = defineModel<string>({ default: '' })\n\n// State\nconst isEditing = ref(false)\nconst textareaRef = ref<InstanceType<typeof Textarea> | undefined>()\n\n// Computed\nconst renderedHtml = computed(() => {\n return renderMarkdownToHtml(modelValue.value || '')\n})\n\n// Methods\nconst startEditing = async () => {\n if (isEditing.value || widget.options?.read_only) return\n\n isEditing.value = true\n await nextTick()\n\n // Focus the textarea\n // @ts-expect-error - $el is an internal property of the Textarea component\n textareaRef.value?.$el?.focus()\n}\n\nconst handleBlur = () => {\n isEditing.value = false\n}\n</script>\n"],"names":["modelValue","_useModel","__props","isEditing","ref","textareaRef","renderedHtml","computed","renderMarkdownToHtml","startEditing","__name","nextTick","handleBlur"],"mappings":"yoBAwCA,MAAMA,EAAaC,EAAmBC,EAAA,YAAgB,EAGhDC,EAAYC,EAAI,EAAK,EACrBC,EAAcD,EAAA,EAGdE,EAAeC,EAAS,IACrBC,EAAqBR,EAAW,OAAS,EAAE,CACnD,EAGKS,EAAeC,EAAA,SAAY,CAC3BP,EAAU,OAASD,EAAA,OAAO,SAAS,YAEvCC,EAAU,MAAQ,GAClB,MAAMQ,EAAA,EAINN,EAAY,OAAO,KAAK,MAAA,EAC1B,EATqB,gBAWfO,EAAaF,EAAA,IAAM,CACvBP,EAAU,MAAQ,EACpB,EAFmB"}
1
+ {"version":3,"file":"WidgetMarkdown-BTfwNVeV.js","sources":["../../src/renderer/extensions/vueNodes/widgets/components/WidgetMarkdown.vue"],"sourcesContent":["<template>\n <div class=\"widget-markdown relative w-full\" @dblclick=\"startEditing\">\n <!-- Display mode: Rendered markdown -->\n <div\n class=\"comfy-markdown-content size-full min-h-[60px] overflow-y-auto rounded-lg text-sm\"\n :class=\"isEditing === false ? 'visible' : 'invisible'\"\n v-html=\"renderedHtml\"\n />\n\n <!-- Edit mode: Textarea -->\n <Textarea\n v-show=\"isEditing\"\n ref=\"textareaRef\"\n v-model=\"modelValue\"\n :aria-label=\"`${$t('g.edit')} ${widget.name || $t('g.markdown')} ${$t('g.content')}`\"\n class=\"absolute inset-0 min-h-[60px] w-full resize-none\"\n :pt=\"{\n root: {\n class: 'text-sm w-full h-full',\n onBlur: handleBlur\n }\n }\"\n data-capture-wheel=\"true\"\n @click.stop\n @keydown.stop\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Textarea from 'primevue/textarea'\nimport { computed, nextTick, ref } from 'vue'\n\nimport type { SimplifiedWidget } from '@/types/simplifiedWidget'\nimport { renderMarkdownToHtml } from '@/utils/markdownRendererUtil'\n\nconst { widget } = defineProps<{\n widget: SimplifiedWidget<string>\n}>()\n\nconst modelValue = defineModel<string>({ default: '' })\n\n// State\nconst isEditing = ref(false)\nconst textareaRef = ref<InstanceType<typeof Textarea> | undefined>()\n\n// Computed\nconst renderedHtml = computed(() => {\n return renderMarkdownToHtml(modelValue.value || '')\n})\n\n// Methods\nconst startEditing = async () => {\n if (isEditing.value || widget.options?.read_only) return\n\n isEditing.value = true\n await nextTick()\n\n // Focus the textarea\n // @ts-expect-error - $el is an internal property of the Textarea component\n textareaRef.value?.$el?.focus()\n}\n\nconst handleBlur = () => {\n isEditing.value = false\n}\n</script>\n"],"names":["modelValue","_useModel","__props","isEditing","ref","textareaRef","renderedHtml","computed","renderMarkdownToHtml","startEditing","__name","nextTick","handleBlur"],"mappings":"yoBAwCA,MAAMA,EAAaC,EAAmBC,EAAA,YAAgB,EAGhDC,EAAYC,EAAI,EAAK,EACrBC,EAAcD,EAAA,EAGdE,EAAeC,EAAS,IACrBC,EAAqBR,EAAW,OAAS,EAAE,CACnD,EAGKS,EAAeC,EAAA,SAAY,CAC3BP,EAAU,OAASD,EAAA,OAAO,SAAS,YAEvCC,EAAU,MAAQ,GAClB,MAAMQ,EAAA,EAINN,EAAY,OAAO,KAAK,MAAA,EAC1B,EATqB,gBAWfO,EAAaF,EAAA,IAAM,CACvBP,EAAU,MAAQ,EACpB,EAFmB"}
@@ -0,0 +1,2 @@
1
+ var $=Object.defineProperty;var a=(i,l)=>$(i,"name",{value:l,configurable:!0});import{ab as K,c as b,d as k,e as h,r as v,n as G,_ as F,fc as J,a2 as Q,dk as X,dP as Y,E as q,dl as Z,o as ee,q as U,z as D,k as ae,A as te,u as V,a8 as n,F as ne,y as oe,G as le}from"./vendor-other-Dsj-QuOx.js";import{r as H,t as R,f as N}from"./index-U7jagKl8.js";import{u as O}from"./audioService-C_4pv8R5.js";import{f as re}from"./audioUtils-CYVbzDGB.js";import{a3 as ie}from"./vendor-primevue-Cif--Rbw.js";import"./vendor-vue-DNQSPQQ2.js";import"./vendor-reka-ui-WjwjFuZo.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-ByuY8CdW.js";import"./vendor-tiptap-YMjM2h-Z.js";const ue={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"};function se(i,l){return k(),b("svg",ue,[...l[0]||(l[0]=[h("g",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[h("path",{d:"M12 19v3m7-12v2a7 7 0 0 1-14 0v-2"}),h("rect",{width:"6",height:"13",x:"9",y:"2",rx:"3"})],-1)])])}a(se,"render");const ce=K({name:"lucide-mic",render:se});function de(i,l={}){const o=v(!1),f=v(0),u=v(null);async function e(){if(!i.value)return!1;try{return await i.value.play(),o.value=!0,!0}catch(A){return console.warn("Audio playback failed:",A),o.value=!1,!1}}a(e,"play");function t(){i.value&&(i.value.pause(),i.value.currentTime=0),o.value=!1,l.onPlaybackEnded&&l.onPlaybackEnded()}a(t,"stop");function s(){o.value=!1,l.onPlaybackEnded&&l.onPlaybackEnded()}a(s,"onPlaybackEnded");function g(){i.value?.duration&&l.onMetadataLoaded&&l.onMetadataLoaded(i.value.duration)}a(g,"onMetadataLoaded");async function p(){f.value+=1,await G()}a(p,"resetAudioElement");function r(){return i.value?.currentTime||0}a(r,"getCurrentTime");function y(){return i.value?.duration||0}return a(y,"getDuration"),{isPlaying:o,audioElementKey:f,play:e,stop:t,onPlaybackEnded:s,onMetadataLoaded:g,resetAudioElement:p,getCurrentTime:r,getDuration:y,playbackTimerInterval:u}}a(de,"useAudioPlayback");function ve(i={}){const l=v(!1),o=v(null),f=v([]),u=v(null),e=v(null);async function t(){try{e.value?.startsWith("blob:")&&URL.revokeObjectURL(e.value),f.value=[],e.value=null,await O().registerWavEncoder(),u.value=await navigator.mediaDevices.getUserMedia({audio:!0}),o.value=new J(u.value,{mimeType:"audio/wav"}),o.value.ondataavailable=r=>{f.value.push(r.data)},o.value.onstop=async()=>{const r=new Blob(f.value,{type:"audio/wav"});e.value?.startsWith("blob:")&&URL.revokeObjectURL(e.value),e.value=URL.createObjectURL(r),i.onRecordingComplete&&await i.onRecordingComplete(r),g()},o.value.start(100),l.value=!0}catch(r){throw i.onError&&i.onError(r),r}}a(t,"startRecording");function s(){o.value&&o.value.state!=="inactive"?o.value.stop():g()}a(s,"stopRecording");function g(){l.value=!1,u.value&&(u.value.getTracks().forEach(r=>r.stop()),u.value=null)}a(g,"cleanup");function p(){s(),e.value&&(URL.revokeObjectURL(e.value),e.value=null)}return a(p,"dispose"),F(()=>{p()}),{isRecording:l,recordedURL:e,mediaRecorder:o,startRecording:t,stopRecording:s,dispose:p}}a(ve,"useAudioRecorder");function me(i={}){const{barCount:l=18,minHeight:o=4,maxHeight:f=32}=i,u=v(Array.from({length:l},()=>({height:16}))),e=v(null),t=v(null),s=v(null),g=v(null),p=v(null);function r(){u.value=Array.from({length:l},()=>({height:Math.random()*(f-o)+o}))}a(r,"initWaveform");function y(m){m.value&&(t.value&&s.value?A():w(),g.value=requestAnimationFrame(()=>y(m)))}a(y,"updateWaveform");function A(){if(!t.value||!s.value)return;t.value.getByteFrequencyData(s.value);const m=Math.floor(s.value.length/l);u.value=u.value.map((L,I)=>{let S=0;for(let C=0;C<m;C++)S+=s.value[I*m+C]||0;return{height:S/m/255*(f-o)+o}})}a(A,"updateWaveformFromAudio");function w(){u.value=u.value.map(m=>({height:Math.max(o,Math.min(f,m.height+(Math.random()-.5)*4))}))}a(w,"updateWaveformRandom");async function W(){e.value&&e.value.state!=="closed"&&await e.value.close(),e.value=null,p.value=null}a(W,"setupAudioContext");async function M(m){e.value=new window.AudioContext,t.value=e.value.createAnalyser(),e.value.createMediaStreamSource(m).connect(t.value),t.value.fftSize=256,s.value=new Uint8Array(t.value.frequencyBinCount)}a(M,"setupRecordingVisualization");async function P(m){return e.value&&e.value.state!=="closed"&&await e.value.close(),p.value=null,m?(e.value=new window.AudioContext,t.value=e.value.createAnalyser(),p.value=e.value.createMediaElementSource(m),p.value.connect(t.value),t.value.connect(e.value.destination),t.value.fftSize=256,s.value=new Uint8Array(t.value.frequencyBinCount),!0):!1}a(P,"setupPlaybackVisualization");function T(){g.value&&(cancelAnimationFrame(g.value),g.value=null)}a(T,"stopWaveform");function z(){T(),e.value&&e.value.state!=="closed"&&e.value.close(),e.value=null,p.value=null}return a(z,"dispose"),F(()=>{z()}),{waveformBars:u,initWaveform:r,updateWaveform:y,setupAudioContext:W,setupRecordingVisualization:M,setupPlaybackVisualization:P,stopWaveform:T,dispose:z}}a(me,"useAudioWaveform");const fe={class:"relative"},pe={class:"mb-4"},ge={key:0,class:"flex h-14 w-full min-w-0 items-center gap-2 rounded-lg px-3 bg-node-component-surface text-text-secondary"},ye={class:"flex shrink-0 items-center gap-1"},he={class:"text-xs"},be={class:"text-sm"},ke={class:"flex h-8 min-w-0 flex-1 items-center gap-2 overflow-hidden"},we=["title"],xe=["title"],Re=["title"],_e=["title"],Ae=["src"],Ue=Q({__name:"WidgetRecordAudio",props:X({readonly:{type:Boolean},nodeId:{}},{modelValue:{default:""},modelModifiers:{}}),emits:["update:modelValue"],setup(i){const l=i,o=v();let f="";const u=ve({onRecordingComplete:z,onError:a(()=>{N().addAlert(R("g.micPermissionDenied")||"Microphone permission denied")},"onError")}),e=me({barCount:18,minHeight:4,maxHeight:32}),t=de(o,{onPlaybackEnded:B,onMetadataLoaded:a(d=>{!w.value&&!r.value&&(s.value=Math.floor(d))},"onMetadataLoaded")}),s=v(0),{pause:g,resume:p}=Y(()=>{s.value+=1},1e3,{immediate:!1}),{isRecording:r,recordedURL:y}=u,{waveformBars:A}=e,{isPlaying:w,audioElementKey:W}=t,M=q(()=>r.value||w.value),P=Z(i,"modelValue"),T=q(()=>!l.nodeId||!H.canvas.graph?null:H.canvas.graph.getNodeById(l.nodeId));async function z(d){try{const c=await O().convertBlobToFileAndSubmit(d);P.value=c,f=c}catch{N().addAlert("Failed to upload recorded audio")}}a(z,"handleRecordingComplete");async function m(){if(!l.readonly)try{if(await e.setupAudioContext(),await u.startRecording(),u.mediaRecorder.value){const d=u.mediaRecorder.value.stream;d&&await e.setupRecordingVisualization(d)}s.value=0,p(),e.initWaveform(),e.updateWaveform(M)}catch(d){console.error("Failed to start recording:",d)}}a(m,"handleStartRecording");function L(){u.stopRecording(),g(),e.stopWaveform()}a(L,"handleStopRecording");async function I(){if(!y.value||(s.value=0,await t.resetAudioElement(),await new Promise(_=>setTimeout(_,50)),!o.value)||!await e.setupPlaybackVisualization(o.value))return;await t.play(),e.initWaveform(),e.updateWaveform(M);const c=setInterval(()=>{s.value=Math.floor(t.getCurrentTime())},100);t.playbackTimerInterval.value=c}a(I,"handlePlayRecording");function S(){t.stop(),B()}a(S,"handleStopPlayback");function B(){e.stopWaveform(),t.playbackTimerInterval.value!==null&&(clearInterval(t.playbackTimerInterval.value),t.playbackTimerInterval.value=null);const d=t.getDuration();d?s.value=Math.floor(d):s.value=0}a(B,"handlePlaybackEnded");async function j(){return r.value&&u.mediaRecorder.value&&(u.mediaRecorder.value.stop(),await new Promise((d,c)=>{let _=0;const x=50,E=a(()=>{!r.value&&P.value?d(void 0):++_>=x?c(new Error("Recording serialization timeout after 5 seconds")):setTimeout(E,100)},"checkRecording");E()})),P.value||f||""}a(j,"serializeValue");function C(){const d=T.value;if(!d?.widgets)return;const c=d.widgets.find(_=>_.name==="audio");c&&(c.serializeValue=j)}return a(C,"registerWidgetSerialization"),ee(()=>{e.initWaveform(),C()}),F(()=>{t.playbackTimerInterval.value!==null&&(clearInterval(t.playbackTimerInterval.value),t.playbackTimerInterval.value=null)}),(d,c)=>{const _=ce;return k(),b("div",fe,[h("div",pe,[D(n(ie),{class:"text-base-foreground w-full border-0 bg-secondary-background hover:bg-secondary-background-hover",disabled:n(r)||d.readonly,onClick:m},{default:ae(()=>[te(V(n(R)("g.startRecording","Start Recording"))+" ",1),D(_,{class:"ml-1"})]),_:1},8,["disabled"])]),n(r)||n(w)||n(y)?(k(),b("div",ge,[h("div",ye,[h("span",he,V(n(r)?n(R)("g.listening","Listening..."):n(w)?n(R)("g.playing","Playing..."):n(y)?n(R)("g.ready","Ready"):""),1),h("span",be,V(n(re)(s.value)),1)]),h("div",ke,[(k(!0),b(ne,null,oe(n(A),(x,E)=>(k(),b("div",{key:E,class:"max-h-8 min-h-1 w-0.75 rounded-[1.5px] bg-slate-100 transition-all duration-100",style:le({height:x.height+"px"}),title:`Bar ${E+1}: ${x.height}px`},null,12,we))),128))]),n(r)?(k(),b("button",{key:0,title:n(R)("g.stopRecording","Stop Recording"),class:"flex shrink-0 size-8 animate-pulse items-center justify-center rounded-full border-0 bg-smoke-500/33 transition-colors",onClick:L},c[2]||(c[2]=[h("div",{class:"size-2.5 rounded-sm bg-danger-100"},null,-1)]),8,xe)):!n(r)&&n(y)&&!n(w)?(k(),b("button",{key:1,title:n(R)("g.playRecording")||"Play Recording",class:"flex shrink-0 size-8 items-center justify-center rounded-full border-0 bg-smoke-500/33 transition-colors",onClick:I},c[3]||(c[3]=[h("i",{class:"text-text-secondary icon-[lucide--play] size-4"},null,-1)]),8,Re)):n(w)?(k(),b("button",{key:2,title:n(R)("g.stopPlayback")||"Stop Playback",class:"flex shrink-0 size-8 items-center justify-center rounded-full border-0 bg-smoke-500/33 transition-colors",onClick:S},c[4]||(c[4]=[h("i",{class:"text-text-secondary icon-[lucide--square] size-4"},null,-1)]),8,_e)):U("",!0)])):U("",!0),n(y)?(k(),b("audio",{ref_key:"audioRef",ref:o,key:n(W),src:n(y),class:"hidden",onEnded:c[0]||(c[0]=(...x)=>n(t).onPlaybackEnded&&n(t).onPlaybackEnded(...x)),onLoadedmetadata:c[1]||(c[1]=(...x)=>n(t).onMetadataLoaded&&n(t).onMetadataLoaded(...x))},null,40,Ae)):U("",!0)])}}});export{Ue as default};
2
+ //# sourceMappingURL=WidgetRecordAudio-X2n565MP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WidgetRecordAudio-X2n565MP.js","sources":["../../src/renderer/extensions/vueNodes/widgets/composables/audio/useAudioPlayback.ts","../../src/renderer/extensions/vueNodes/widgets/composables/audio/useAudioRecorder.ts","../../src/renderer/extensions/vueNodes/widgets/composables/audio/useAudioWaveform.ts","../../src/renderer/extensions/vueNodes/widgets/components/WidgetRecordAudio.vue"],"sourcesContent":["import { nextTick, ref } from 'vue'\nimport type { Ref } from 'vue'\n\ninterface AudioPlaybackOptions {\n onPlaybackEnded?: () => void\n onMetadataLoaded?: (duration: number) => void\n}\n\nexport function useAudioPlayback(\n audioRef: Ref<HTMLAudioElement | undefined>,\n options: AudioPlaybackOptions = {}\n) {\n const isPlaying = ref(false)\n const audioElementKey = ref(0)\n const playbackTimerInterval = ref<ReturnType<typeof setInterval> | null>(null)\n\n async function play() {\n if (!audioRef.value) return false\n\n try {\n await audioRef.value.play()\n isPlaying.value = true\n return true\n } catch (error) {\n console.warn('Audio playback failed:', error)\n isPlaying.value = false\n return false\n }\n }\n\n function stop() {\n if (audioRef.value) {\n audioRef.value.pause()\n audioRef.value.currentTime = 0\n }\n isPlaying.value = false\n if (options.onPlaybackEnded) {\n options.onPlaybackEnded()\n }\n }\n\n function onPlaybackEnded() {\n isPlaying.value = false\n if (options.onPlaybackEnded) {\n options.onPlaybackEnded()\n }\n }\n\n function onMetadataLoaded() {\n if (audioRef.value?.duration && options.onMetadataLoaded) {\n options.onMetadataLoaded(audioRef.value.duration)\n }\n }\n\n async function resetAudioElement() {\n audioElementKey.value += 1\n await nextTick()\n }\n\n function getCurrentTime() {\n return audioRef.value?.currentTime || 0\n }\n\n function getDuration() {\n return audioRef.value?.duration || 0\n }\n\n return {\n isPlaying,\n audioElementKey,\n play,\n stop,\n onPlaybackEnded,\n onMetadataLoaded,\n resetAudioElement,\n getCurrentTime,\n getDuration,\n playbackTimerInterval\n }\n}\n","import { MediaRecorder as ExtendableMediaRecorder } from 'extendable-media-recorder'\nimport { onUnmounted, ref } from 'vue'\n\nimport { useAudioService } from '@/services/audioService'\n\ninterface AudioRecorderOptions {\n onRecordingComplete?: (audioBlob: Blob) => Promise<void>\n onError?: (error: Error) => void\n}\n\nexport function useAudioRecorder(options: AudioRecorderOptions = {}) {\n const isRecording = ref(false)\n const mediaRecorder = ref<MediaRecorder | null>(null)\n const audioChunks = ref<Blob[]>([])\n const stream = ref<MediaStream | null>(null)\n const recordedURL = ref<string | null>(null)\n\n async function startRecording() {\n try {\n // Clean up previous recording\n if (recordedURL.value?.startsWith('blob:')) {\n URL.revokeObjectURL(recordedURL.value)\n }\n\n // Initialize\n audioChunks.value = []\n recordedURL.value = null\n\n // Register wav encoder and get media stream\n await useAudioService().registerWavEncoder()\n stream.value = await navigator.mediaDevices.getUserMedia({ audio: true })\n\n // Create media recorder\n mediaRecorder.value = new ExtendableMediaRecorder(stream.value, {\n mimeType: 'audio/wav'\n }) as unknown as MediaRecorder\n\n mediaRecorder.value.ondataavailable = (e) => {\n audioChunks.value.push(e.data)\n }\n\n mediaRecorder.value.onstop = async () => {\n const blob = new Blob(audioChunks.value, { type: 'audio/wav' })\n\n // Create blob URL for preview\n if (recordedURL.value?.startsWith('blob:')) {\n URL.revokeObjectURL(recordedURL.value)\n }\n recordedURL.value = URL.createObjectURL(blob)\n\n // Notify completion\n if (options.onRecordingComplete) {\n await options.onRecordingComplete(blob)\n }\n\n cleanup()\n }\n\n // Start recording\n mediaRecorder.value.start(100)\n isRecording.value = true\n } catch (err) {\n if (options.onError) {\n options.onError(err as Error)\n }\n throw err\n }\n }\n\n function stopRecording() {\n if (mediaRecorder.value && mediaRecorder.value.state !== 'inactive') {\n mediaRecorder.value.stop()\n } else {\n cleanup()\n }\n }\n\n function cleanup() {\n isRecording.value = false\n\n if (stream.value) {\n stream.value.getTracks().forEach((track) => track.stop())\n stream.value = null\n }\n }\n\n function dispose() {\n stopRecording()\n if (recordedURL.value) {\n URL.revokeObjectURL(recordedURL.value)\n recordedURL.value = null\n }\n }\n\n onUnmounted(() => {\n dispose()\n })\n\n return {\n isRecording,\n recordedURL,\n mediaRecorder,\n startRecording,\n stopRecording,\n dispose\n }\n}\n","import { onUnmounted, ref } from 'vue'\nimport type { Ref } from 'vue'\n\ninterface WaveformBar {\n height: number\n}\n\ninterface AudioWaveformOptions {\n barCount?: number\n minHeight?: number\n maxHeight?: number\n}\n\nexport function useAudioWaveform(options: AudioWaveformOptions = {}) {\n const { barCount = 18, minHeight = 4, maxHeight = 32 } = options\n\n const waveformBars = ref<WaveformBar[]>(\n Array.from({ length: barCount }, () => ({ height: 16 }))\n )\n const audioContext = ref<AudioContext | null>(null)\n const analyser = ref<AnalyserNode | null>(null)\n const dataArray = ref<Uint8Array | null>(null)\n const animationId = ref<number | null>(null)\n const mediaElementSource = ref<MediaElementAudioSourceNode | null>(null)\n\n function initWaveform() {\n waveformBars.value = Array.from({ length: barCount }, () => ({\n height: Math.random() * (maxHeight - minHeight) + minHeight\n }))\n }\n\n function updateWaveform(isActive: Ref<boolean>) {\n if (!isActive.value) return\n\n if (analyser.value && dataArray.value) {\n updateWaveformFromAudio()\n } else {\n updateWaveformRandom()\n }\n\n animationId.value = requestAnimationFrame(() => updateWaveform(isActive))\n }\n\n function updateWaveformFromAudio() {\n if (!analyser.value || !dataArray.value) return\n\n analyser.value.getByteFrequencyData(\n dataArray.value as Uint8Array<ArrayBuffer>\n )\n const samplesPerBar = Math.floor(dataArray.value.length / barCount)\n\n waveformBars.value = waveformBars.value.map((_, i) => {\n let sum = 0\n for (let j = 0; j < samplesPerBar; j++) {\n sum += dataArray.value![i * samplesPerBar + j] || 0\n }\n const average = sum / samplesPerBar\n const normalizedHeight =\n (average / 255) * (maxHeight - minHeight) + minHeight\n return { height: normalizedHeight }\n })\n }\n\n function updateWaveformRandom() {\n waveformBars.value = waveformBars.value.map((bar) => ({\n height: Math.max(\n minHeight,\n Math.min(maxHeight, bar.height + (Math.random() - 0.5) * 4)\n )\n }))\n }\n\n async function setupAudioContext() {\n if (audioContext.value && audioContext.value.state !== 'closed') {\n await audioContext.value.close()\n }\n audioContext.value = null\n mediaElementSource.value = null\n }\n\n async function setupRecordingVisualization(stream: MediaStream) {\n audioContext.value = new window.AudioContext()\n analyser.value = audioContext.value.createAnalyser()\n const source = audioContext.value.createMediaStreamSource(stream)\n source.connect(analyser.value)\n\n analyser.value.fftSize = 256\n dataArray.value = new Uint8Array(analyser.value.frequencyBinCount)\n }\n\n async function setupPlaybackVisualization(audioElement: HTMLAudioElement) {\n if (audioContext.value && audioContext.value.state !== 'closed') {\n await audioContext.value.close()\n }\n\n mediaElementSource.value = null\n\n if (!audioElement) return false\n\n audioContext.value = new window.AudioContext()\n analyser.value = audioContext.value.createAnalyser()\n\n mediaElementSource.value =\n audioContext.value.createMediaElementSource(audioElement)\n\n mediaElementSource.value.connect(analyser.value)\n analyser.value.connect(audioContext.value.destination)\n\n analyser.value.fftSize = 256\n dataArray.value = new Uint8Array(analyser.value.frequencyBinCount)\n\n return true\n }\n\n function stopWaveform() {\n if (animationId.value) {\n cancelAnimationFrame(animationId.value)\n animationId.value = null\n }\n }\n\n function dispose() {\n stopWaveform()\n if (audioContext.value && audioContext.value.state !== 'closed') {\n void audioContext.value.close()\n }\n audioContext.value = null\n mediaElementSource.value = null\n }\n\n onUnmounted(() => {\n dispose()\n })\n\n return {\n waveformBars,\n initWaveform,\n updateWaveform,\n setupAudioContext,\n setupRecordingVisualization,\n setupPlaybackVisualization,\n stopWaveform,\n dispose\n }\n}\n","<template>\n <div class=\"relative\">\n <div class=\"mb-4\">\n <Button\n class=\"text-base-foreground w-full border-0 bg-secondary-background hover:bg-secondary-background-hover\"\n :disabled=\"isRecording || readonly\"\n @click=\"handleStartRecording\"\n >\n {{ t('g.startRecording', 'Start Recording') }}\n <i-lucide:mic class=\"ml-1\" />\n </Button>\n </div>\n <div\n v-if=\"isRecording || isPlaying || recordedURL\"\n class=\"flex h-14 w-full min-w-0 items-center gap-2 rounded-lg px-3 bg-node-component-surface text-text-secondary\"\n >\n <!-- Recording Status -->\n <div class=\"flex shrink-0 items-center gap-1\">\n <span class=\"text-xs\">\n {{\n isRecording\n ? t('g.listening', 'Listening...')\n : isPlaying\n ? t('g.playing', 'Playing...')\n : recordedURL\n ? t('g.ready', 'Ready')\n : ''\n }}\n </span>\n <span class=\"text-sm\">{{ formatTime(timer) }}</span>\n </div>\n\n <!-- Waveform Visualization -->\n <div class=\"flex h-8 min-w-0 flex-1 items-center gap-2 overflow-hidden\">\n <div\n v-for=\"(bar, index) in waveformBars\"\n :key=\"index\"\n class=\"max-h-8 min-h-1 w-0.75 rounded-[1.5px] bg-slate-100 transition-all duration-100\"\n :style=\"{ height: bar.height + 'px' }\"\n :title=\"`Bar ${index + 1}: ${bar.height}px`\"\n />\n </div>\n\n <!-- Control Button -->\n <button\n v-if=\"isRecording\"\n :title=\"t('g.stopRecording', 'Stop Recording')\"\n class=\"flex shrink-0 size-8 animate-pulse items-center justify-center rounded-full border-0 bg-smoke-500/33 transition-colors\"\n @click=\"handleStopRecording\"\n >\n <div class=\"size-2.5 rounded-sm bg-danger-100\" />\n </button>\n\n <button\n v-else-if=\"!isRecording && recordedURL && !isPlaying\"\n :title=\"t('g.playRecording') || 'Play Recording'\"\n class=\"flex shrink-0 size-8 items-center justify-center rounded-full border-0 bg-smoke-500/33 transition-colors\"\n @click=\"handlePlayRecording\"\n >\n <i class=\"text-text-secondary icon-[lucide--play] size-4\" />\n </button>\n\n <button\n v-else-if=\"isPlaying\"\n :title=\"t('g.stopPlayback') || 'Stop Playback'\"\n class=\"flex shrink-0 size-8 items-center justify-center rounded-full border-0 bg-smoke-500/33 transition-colors\"\n @click=\"handleStopPlayback\"\n >\n <i class=\"text-text-secondary icon-[lucide--square] size-4\" />\n </button>\n </div>\n <audio\n v-if=\"recordedURL\"\n ref=\"audioRef\"\n :key=\"audioElementKey\"\n :src=\"recordedURL\"\n class=\"hidden\"\n @ended=\"playback.onPlaybackEnded\"\n @loadedmetadata=\"playback.onMetadataLoaded\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useIntervalFn } from '@vueuse/core'\nimport { Button } from 'primevue'\nimport { computed, onMounted, onUnmounted, ref } from 'vue'\n\nimport { t } from '@/i18n'\nimport type { LGraphNode } from '@/lib/litegraph/src/LGraphNode'\nimport type { IBaseWidget } from '@/lib/litegraph/src/types/widgets'\nimport { useToastStore } from '@/platform/updates/common/toastStore'\nimport { app } from '@/scripts/app'\nimport { useAudioService } from '@/services/audioService'\n\nimport { useAudioPlayback } from '../composables/audio/useAudioPlayback'\nimport { useAudioRecorder } from '../composables/audio/useAudioRecorder'\nimport { useAudioWaveform } from '../composables/audio/useAudioWaveform'\nimport { formatTime } from '../utils/audioUtils'\n\nconst props = defineProps<{\n readonly?: boolean\n nodeId: string\n}>()\n\n// Audio element ref\nconst audioRef = ref<HTMLAudioElement>()\n\n// Keep track of the last uploaded path as a backup\nlet lastUploadedPath = ''\n\n// Composables\nconst recorder = useAudioRecorder({\n onRecordingComplete: handleRecordingComplete,\n onError: () => {\n useToastStore().addAlert(\n t('g.micPermissionDenied') || 'Microphone permission denied'\n )\n }\n})\n\nconst waveform = useAudioWaveform({\n barCount: 18,\n minHeight: 4,\n maxHeight: 32\n})\n\nconst playback = useAudioPlayback(audioRef, {\n onPlaybackEnded: handlePlaybackEnded,\n onMetadataLoaded: (duration) => {\n if (!isPlaying.value && !isRecording.value) {\n timer.value = Math.floor(duration)\n }\n }\n})\n\n// Timer for recording\nconst timer = ref(0)\nconst { pause: pauseTimer, resume: resumeTimer } = useIntervalFn(\n () => {\n timer.value += 1\n },\n 1000,\n { immediate: false }\n)\n\n// Destructure for template access\nconst { isRecording, recordedURL } = recorder\nconst { waveformBars } = waveform\nconst { isPlaying, audioElementKey } = playback\n\n// Computed for waveform animation\nconst isWaveformActive = computed(() => isRecording.value || isPlaying.value)\n\nconst modelValue = defineModel<string>({ default: '' })\n\nconst litegraphNode = computed(() => {\n if (!props.nodeId || !app.canvas.graph) return null\n return app.canvas.graph.getNodeById(props.nodeId) as LGraphNode | null\n})\n\nasync function handleRecordingComplete(blob: Blob) {\n try {\n const path = await useAudioService().convertBlobToFileAndSubmit(blob)\n modelValue.value = path\n lastUploadedPath = path\n } catch (e) {\n useToastStore().addAlert('Failed to upload recorded audio')\n }\n}\n\nasync function handleStartRecording() {\n if (props.readonly) return\n\n try {\n await waveform.setupAudioContext()\n await recorder.startRecording()\n\n // Setup waveform visualization for recording\n if (recorder.mediaRecorder.value) {\n const stream = recorder.mediaRecorder.value.stream\n if (stream) {\n await waveform.setupRecordingVisualization(stream)\n }\n }\n\n // Start timer\n timer.value = 0\n resumeTimer()\n waveform.initWaveform()\n waveform.updateWaveform(isWaveformActive)\n } catch (err) {\n console.error('Failed to start recording:', err)\n }\n}\n\nfunction handleStopRecording() {\n recorder.stopRecording()\n pauseTimer()\n waveform.stopWaveform()\n}\n\nasync function handlePlayRecording() {\n if (!recordedURL.value) return\n\n // Reset timer\n timer.value = 0\n\n // Reset and setup audio element\n await playback.resetAudioElement()\n\n // Wait for audio element to be ready\n await new Promise((resolve) => setTimeout(resolve, 50))\n\n if (!audioRef.value) return\n\n // Setup waveform visualization for playback\n const setupSuccess = await waveform.setupPlaybackVisualization(audioRef.value)\n if (!setupSuccess) return\n\n // Start playback\n await playback.play()\n\n // Update waveform\n waveform.initWaveform()\n waveform.updateWaveform(isWaveformActive)\n\n // Update timer from audio current time\n const timerInterval = setInterval(() => {\n timer.value = Math.floor(playback.getCurrentTime())\n }, 100)\n\n // Store interval for cleanup\n playback.playbackTimerInterval.value = timerInterval\n}\n\nfunction handleStopPlayback() {\n playback.stop()\n handlePlaybackEnded()\n}\n\nfunction handlePlaybackEnded() {\n waveform.stopWaveform()\n\n // Clear playback timer interval\n if (playback.playbackTimerInterval.value !== null) {\n clearInterval(playback.playbackTimerInterval.value)\n playback.playbackTimerInterval.value = null\n }\n\n const duration = playback.getDuration()\n if (duration) {\n timer.value = Math.floor(duration)\n } else {\n timer.value = 0\n }\n}\n\n// Serialization function for workflow execution\nasync function serializeValue() {\n if (isRecording.value && recorder.mediaRecorder.value) {\n recorder.mediaRecorder.value.stop()\n\n await new Promise((resolve, reject) => {\n let attempts = 0\n const maxAttempts = 50 // 5 seconds max (50 * 100ms)\n const checkRecording = () => {\n if (!isRecording.value && modelValue.value) {\n resolve(undefined)\n } else if (++attempts >= maxAttempts) {\n reject(new Error('Recording serialization timeout after 5 seconds'))\n } else {\n setTimeout(checkRecording, 100)\n }\n }\n checkRecording()\n })\n }\n\n return modelValue.value || lastUploadedPath || ''\n}\n\nfunction registerWidgetSerialization() {\n const node = litegraphNode.value\n if (!node?.widgets) return\n const targetWidget = node.widgets.find((w: IBaseWidget) => w.name === 'audio')\n if (targetWidget) {\n targetWidget.serializeValue = serializeValue\n }\n}\n\nonMounted(() => {\n waveform.initWaveform()\n registerWidgetSerialization()\n})\n\nonUnmounted(() => {\n if (playback.playbackTimerInterval.value !== null) {\n clearInterval(playback.playbackTimerInterval.value)\n playback.playbackTimerInterval.value = null\n }\n})\n</script>\n"],"names":["useAudioPlayback","audioRef","options","isPlaying","ref","audioElementKey","playbackTimerInterval","play","error","__name","stop","onPlaybackEnded","onMetadataLoaded","resetAudioElement","nextTick","getCurrentTime","getDuration","useAudioRecorder","isRecording","mediaRecorder","audioChunks","stream","recordedURL","startRecording","useAudioService","ExtendableMediaRecorder","e","blob","cleanup","err","stopRecording","track","dispose","onUnmounted","useAudioWaveform","barCount","minHeight","maxHeight","waveformBars","audioContext","analyser","dataArray","animationId","mediaElementSource","initWaveform","updateWaveform","isActive","updateWaveformFromAudio","updateWaveformRandom","samplesPerBar","_","i","sum","j","bar","setupAudioContext","setupRecordingVisualization","setupPlaybackVisualization","audioElement","stopWaveform","props","__props","lastUploadedPath","recorder","handleRecordingComplete","useToastStore","t","waveform","playback","handlePlaybackEnded","duration","timer","pauseTimer","resumeTimer","useIntervalFn","isWaveformActive","computed","modelValue","_useModel","litegraphNode","app","path","handleStartRecording","handleStopRecording","handlePlayRecording","resolve","timerInterval","handleStopPlayback","serializeValue","reject","attempts","maxAttempts","checkRecording","registerWidgetSerialization","node","targetWidget","w","onMounted"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{_ as o}from"./WidgetSelect.vue_vue_type_script_setup_true_lang-DLMXofNs.js";import"./index-U7jagKl8.js";import"./vendor-primevue-Cif--Rbw.js";import"./vendor-other-Dsj-QuOx.js";import"./vendor-vue-DNQSPQQ2.js";import"./vendor-reka-ui-WjwjFuZo.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-ByuY8CdW.js";import"./vendor-tiptap-YMjM2h-Z.js";import"./widgetPropFilter-CygYoMQt.js";import"./index-BST1SetX.js";import"./WidgetLayoutField.vue_vue_type_script_setup_true_lang-BrNsu13j.js";import"./LazyImage.vue_vue_type_script_setup_true_lang-Bwob1r0X.js";import"./WidgetWithControl.vue_vue_type_script_setup_true_lang-CWBg5k0x.js";export{o as default};
2
+ //# sourceMappingURL=WidgetSelect-DsU3dEFm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WidgetSelect-DsU3dEFm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,2 +1,2 @@
1
- var ce=Object.defineProperty;var v=(t,e)=>ce(t,"name",{value:e,configurable:!0});import{c as U,_ as pe,f as le,t as B,P as fe,a as me,k as ve,cU as ge}from"./index-Bc79VbnU.js";import{E as u,a2 as L,dk as Q,dl as V,j as T,d as g,k as E,z as F,e as M,m as oe,a8 as h,p as ye,c as $,s as C,q as j,u as R,ea as J,r as P,F as Y,y as _,i as be,h as we,l as he,A as Se,M as ke,fb as Me,w as $e,Z as xe}from"./vendor-other-Dsj-QuOx.js";import{i as Ue,p as ae}from"./vendor-primevue-Cif--Rbw.js";import"./vendor-xterm-CWYFmgbN.js";import{f as se,P as ne}from"./widgetPropFilter-CygYoMQt.js";import{W as ie}from"./index-BBvP0bLh.js";import{_ as re}from"./WidgetLayoutField.vue_vue_type_script_setup_true_lang-CYDaxuge.js";import{b as Ce,a as Ve,d as Oe}from"./LazyImage.vue_vue_type_script_setup_true_lang-CX9YtPlM.js";import{_ as ze}from"./WidgetWithControl.vue_vue_type_script_setup_true_lang-B5RYQ41H.js";const Ae={name:"SelectPlus",extends:Ue,emits:["hide"],methods:{onOverlayLeave(){this.unbindOutsideClickListener(),this.unbindScrollListener(),this.unbindResizeListener(),this.$emit("hide"),this.overlay=null}}};function de(t={}){return u(()=>({appendTo:"self",...t}))}v(de,"useTransformCompatOverlayProps");const Ie={class:"absolute top-5 right-8 h-4 w-7 -translate-y-4/5 flex"},ee=L({__name:"WidgetSelectDefault",props:Q({widget:{}},{modelValue:{default(t){return t.widget.options?.values?.[0]||""}},modelModifiers:{}}),emits:["update:modelValue"],setup(t){const e=t,n=V(t,"modelValue"),b=de(),i=u(()=>{const a=e.widget.options;return a?.values&&Array.isArray(a.values)?a.values:[]}),y=u(()=>!!n.value&&!i.value.includes(n.value)),c=u(()=>({...se(e.widget.options,ne),...b.value,...y.value?{placeholder:`${n.value}`}:{}}));return(a,p)=>(g(),T(re,{widget:a.widget},{default:E(()=>[F(Ae,oe({modelValue:n.value,"onUpdate:modelValue":p[0]||(p[0]=f=>n.value=f),invalid:y.value,filter:i.value.length>4,"auto-filter-focus":"",options:i.value},c.value,{class:h(U)(h(ie),"w-full text-xs"),"aria-label":a.widget.name,size:"small",pt:{option:"text-xs",dropdown:"w-8",label:h(U)("truncate min-w-[4ch]",a.$slots.default&&"mr-5"),overlay:"w-fit min-w-full"},"data-capture-wheel":"true"}),null,16,["modelValue","invalid","filter","options","class","aria-label","pt"]),M("div",Ie,[ye(a.$slots,"default")])]),_:3},8,["widget"]))}}),De={class:"min-w-0 flex-1 px-1 py-2 text-left truncate"},Te={key:0},Le={key:1},Fe=["multiple","disabled","accept"],Pe=L({__name:"FormDropdownInput",props:{isOpen:{type:Boolean,default:!1},placeholder:{default:"Select..."},items:{},selected:{},maxSelectable:{},uploadable:{type:Boolean},disabled:{type:Boolean},accept:{}},emits:["select-click","file-change"],setup(t,{emit:e}){const n=t,b=e,i=u(()=>n.items.filter(c=>n.selected.has(c.id))),y=u(()=>U("border-0 bg-component-node-widget-background outline-none text-text-secondary",n.disabled?"cursor-not-allowed":"hover:bg-component-node-widget-background-hovered cursor-pointer",i.value.length>0&&"text-text-primary"));return(c,a)=>(g(),$("div",{class:C(h(U)(h(ie),"flex text-base leading-none",{"opacity-50 cursor-not-allowed !outline-zinc-300/10":c.disabled}))},[M("button",{class:C(h(U)(y.value,"flex justify-between items-center flex-1 min-w-0 h-8",{"rounded-l-lg":c.uploadable,"rounded-lg":!c.uploadable})),onClick:a[0]||(a[0]=p=>b("select-click",p))},[M("span",De,[i.value.length?(g(),$("span",Le,R(i.value.map(p=>p.label??p.name).join(", ")),1)):(g(),$("span",Te,R(c.placeholder),1))]),M("i",{class:C(["icon-[lucide--chevron-down]",h(U)("mr-2 size-4 transition-transform duration-200 flex-shrink-0 text-component-node-foreground-secondary",c.isOpen&&"rotate-180")])},null,2)],2),c.uploadable?(g(),$("label",{key:0,class:C(h(U)(y.value,"relative","size-8 flex justify-center items-center border-l rounded-r-lg border-zinc-300/10"))},[a[2]||(a[2]=M("i",{class:"icon-[lucide--folder-search] size-4"},null,-1)),M("input",{type:"file",class:"absolute inset-0 -z-1 opacity-0",multiple:c.maxSelectable>1,disabled:c.disabled,accept:c.accept,onChange:a[1]||(a[1]=p=>b("file-change",p))},null,40,Fe)],2)):j("",!0)],2))}}),Qe={class:"text-secondary flex gap-2 px-4"},je={key:0,class:"absolute top-[-2px] left-[-2px] size-2 rounded-full bg-component-node-widget-background-highlighted"},Be=["onClick"],Re={key:0,class:"icon-[lucide--check] size-4"},Z="bg-transparent border-0 outline-0 ring-0 text-left",te="size-6 flex justify-center items-center rounded-sm cursor-pointer transition-all duration-150 hover:scale-108 hover:text-base-foreground active:scale-95",Ke=L({__name:"FormDropdownMenuActions",props:Q({searcher:{type:Function},sortOptions:{}},{layoutMode:{},layoutModeModifiers:{},searchQuery:{},searchQueryModifiers:{},sortSelected:{},sortSelectedModifiers:{}}),emits:["update:layoutMode","update:searchQuery","update:sortSelected"],setup(t){const e=V(t,"layoutMode"),n=V(t,"searchQuery"),b=V(t,"sortSelected"),i=U("h-8 bg-zinc-500/20 rounded-lg outline outline-1 outline-offset-[-1px] outline-node-component-border transition-all duration-150"),y=J("sortPopoverRef"),c=J("sortTriggerRef"),a=P(!1);function p(s){!y.value||!c.value||(a.value=!a.value,y.value.toggle(s,c.value))}v(p,"toggleSortPopover");function f(){a.value=!1,y.value?.hide()}v(f,"closeSortPopover");function l(s){b.value=s.id,f()}return v(l,"handleSortSelected"),(s,d)=>(g(),$("div",Qe,[F(Ce,{modelValue:n.value,"onUpdate:modelValue":d[0]||(d[0]=S=>n.value=S),searcher:s.searcher,class:C(h(U)(h(i),"hover:outline-component-node-widget-background-highlighted/80","focus-within:outline-component-node-widget-background-highlighted/80 focus-within:ring-0"))},null,8,["modelValue","searcher","class"]),M("button",{ref_key:"sortTriggerRef",ref:c,class:C(h(U)(Z,h(i),"relative w-8 flex justify-center items-center cursor-pointer","hover:outline-component-node-widget-background-highlighted","active:!scale-95")),onClick:p},[b.value!=="default"?(g(),$("div",je)):j("",!0),d[4]||(d[4]=M("i",{class:"icon-[lucide--arrow-up-down] size-4"},null,-1))],2),F(h(ae),{ref_key:"sortPopoverRef",ref:y,dismissable:!0,"close-on-escape":!0,unstyled:"",pt:{root:{class:"absolute z-50"},content:{class:["bg-transparent border-none p-0 pt-2 rounded-lg shadow-lg"]}},onHide:d[1]||(d[1]=S=>a.value=!1)},{default:E(()=>[M("div",{class:C(h(U)("flex flex-col gap-2 p-2 min-w-32","bg-component-node-background","rounded-lg outline outline-offset-[-1px] outline-component-node-border"))},[(g(!0),$(Y,null,_(s.sortOptions,S=>(g(),$("button",{key:S.name,class:C(h(U)(Z,"flex justify-between items-center h-6 cursor-pointer","hover:!text-blue-500")),onClick:v(z=>l(S),"onClick")},[M("span",null,R(S.name),1),b.value===S.id?(g(),$("i",Re)):j("",!0)],10,Be))),128))],2)]),_:1},512),M("div",{class:C(h(U)(h(i),"flex justify-center items-center p-1 gap-1 hover:outline-component-node-widget-background-highlighted"))},[M("button",{class:C(h(U)(Z,te,e.value==="list"?"bg-neutral-500/50 text-base-foreground":"")),onClick:d[2]||(d[2]=S=>e.value="list")},d[5]||(d[5]=[M("i",{class:"icon-[lucide--list] size-4"},null,-1)]),2),M("button",{class:C(h(U)(Z,te,e.value==="grid"?"bg-neutral-500/50 text-base-foreground":"")),onClick:d[3]||(d[3]=S=>e.value="grid")},d[6]||(d[6]=[M("i",{class:"icon-[lucide--layout-grid] size-4"},null,-1)]),2)],2)]))}}),We={class:"text-secondary mb-4 flex gap-1 px-4 justify-start"},Ee=["disabled","onClick"],He=L({__name:"FormDropdownMenuFilter",props:Q({filterOptions:{}},{filterSelected:{},filterSelectedModifiers:{}}),emits:["update:filterSelected"],setup(t){const e=V(t,"filterSelected"),{isUploadButtonEnabled:n,showUploadDialog:b}=Ve(),i=u(()=>t.filterOptions.length===1);return(y,c)=>(g(),$("div",We,[(g(!0),$(Y,null,_(y.filterOptions,a=>(g(),$("button",{key:a.id,type:"button",disabled:i.value,class:C(h(U)("px-4 py-2 rounded-md inline-flex justify-center items-center select-none appearance-none border-0 text-base-foreground",!i.value&&"transition-all duration-150 hover:text-base-foreground hover:bg-interface-menu-component-surface-hovered cursor-pointer active:scale-95",!i.value&&e.value===a.id?"!bg-interface-menu-component-surface-selected text-base-foreground":"bg-transparent")),onClick:v(p=>e.value=a.id,"onClick")},R(a.name),11,Ee))),128)),h(n)&&i.value?(g(),T(pe,{key:0,class:"ml-auto",size:"md",variant:"textonly",onClick:h(b)},{default:E(()=>[c[0]||(c[0]=M("i",{class:"icon-[lucide--folder-input]"},null,-1)),M("span",null,R(y.$t("g.import")),1)]),_:1},8,["onClick"])):j("",!0)]))}}),ue=Symbol("assetKind"),Ne={key:0,class:"absolute top-1 left-1 size-4 rounded-full border-1 border-base-foreground bg-primary-background"},qe=["src"],Ze={key:3,class:"size-full bg-gradient-to-tr from-blue-400 via-teal-500 to-green-400"},Xe={class:"text-secondary block text-xs"},Ge=L({__name:"FormDropdownMenuItem",props:{index:{},selected:{type:Boolean},mediaSrc:{},name:{},label:{},metadata:{},layout:{}},emits:["click","mediaLoad"],setup(t,{emit:e}){const n=t,b=e,i=P(null),y=be(ue),c=u(()=>y?.value==="video");function a(){b("click",n.index)}v(a,"handleClick");function p(l){if(b("mediaLoad",l),!l.target||!(l.target instanceof HTMLImageElement))return;const s=l.target;s.naturalWidth&&s.naturalHeight&&(i.value=`${s.naturalWidth} x ${s.naturalHeight}`)}v(p,"handleImageLoad");function f(l){if(b("mediaLoad",l),!l.target||!(l.target instanceof HTMLVideoElement))return;const s=l.target;s.videoWidth&&s.videoHeight&&(i.value=`${s.videoWidth} x ${s.videoHeight}`)}return v(f,"handleVideoLoad"),(l,s)=>{const d=we("tooltip");return g(),$("div",{class:C(h(U)("flex gap-1 select-none group/item cursor-pointer bg-component-node-widget-background","transition-all duration-150",{"flex-col text-center":l.layout==="grid","flex-row text-left max-h-16 rounded-lg hover:scale-102 active:scale-98":l.layout==="list","flex-row text-left hover:bg-component-node-widget-background-hovered rounded-lg":l.layout==="list-small","ring-2 ring-component-node-widget-background-highlighted":l.layout==="list"&&l.selected})),onClick:a},[l.layout!=="list-small"?(g(),$("div",{key:0,class:C(h(U)("relative","w-full aspect-square overflow-hidden outline-1 outline-offset-[-1px] outline-interface-stroke","transition-all duration-150",{"min-w-16 max-w-16 rounded-l-lg":l.layout==="list","rounded-sm group-hover/item:scale-108 group-active/item:scale-95":l.layout==="grid","ring-2 ring-component-node-widget-background-highlighted":l.layout==="grid"&&l.selected}))},[l.selected?(g(),$("div",Ne,s[0]||(s[0]=[M("i",{class:"icon-[lucide--check] size-3 translate-y-[-0.5px] text-base-foreground bold"},null,-1)]))):j("",!0),l.mediaSrc&&c.value?(g(),$("video",{key:1,src:l.mediaSrc,class:"size-full object-cover",preload:"metadata",muted:"",onLoadeddata:f},null,40,qe)):l.mediaSrc?(g(),T(Oe,{key:2,src:l.mediaSrc,alt:l.name,"image-class":"size-full object-cover",onLoad:p},null,8,["src","alt"])):(g(),$("div",Ze))],2)):j("",!0),M("div",{class:C(h(U)("flex gap-1",{"flex-col":l.layout==="grid","flex-col px-4 py-1 w-full justify-center min-w-0":l.layout==="list","flex-row p-2 items-center justify-between w-full":l.layout==="list-small"}))},[he((g(),$("span",{class:C(h(U)("block text-xs line-clamp-2 break-words overflow-hidden","transition-colors duration-150",!!l.selected&&"text-base-foreground"))},[Se(R(l.label??l.name),1)],2)),[[d,l.layout==="grid"?l.label??l.name:void 0]]),M("span",Xe,R(l.metadata||i.value),1)],2)],2)}}}),Je={class:"flex max-h-[640px] w-103 flex-col rounded-lg bg-component-node-background pt-4 outline outline-offset-[-1px] outline-node-component-border"},Ye={class:"relative flex h-full mt-2 overflow-y-scroll"},_e={key:0,class:"h-50 col-span-full flex items-center justify-center"},et=["title","aria-label"],tt=L({__name:"FormDropdownMenu",props:Q({items:{},isSelected:{type:Function},filterOptions:{},sortOptions:{},searcher:{type:Function}},{filterSelected:{},filterSelectedModifiers:{},layoutMode:{},layoutModeModifiers:{},sortSelected:{},sortSelectedModifiers:{},searchQuery:{},searchQueryModifiers:{}}),emits:Q(["item-click"],["update:filterSelected","update:layoutMode","update:sortSelected","update:searchQuery"]),setup(t,{emit:e}){const n=e,b=V(t,"filterSelected"),i=V(t,"layoutMode"),y=V(t,"sortSelected"),c=V(t,"searchQuery");return(a,p)=>(g(),$("div",Je,[a.filterOptions.length>0?(g(),T(He,{key:0,"filter-selected":b.value,"onUpdate:filterSelected":p[0]||(p[0]=f=>b.value=f),"filter-options":a.filterOptions},null,8,["filter-selected","filter-options"])):j("",!0),F(Ke,{"layout-mode":i.value,"onUpdate:layoutMode":p[1]||(p[1]=f=>i.value=f),"sort-selected":y.value,"onUpdate:sortSelected":p[2]||(p[2]=f=>y.value=f),"search-query":c.value,"onUpdate:searchQuery":p[3]||(p[3]=f=>c.value=f),"sort-options":a.sortOptions,searcher:a.searcher},null,8,["layout-mode","sort-selected","search-query","sort-options","searcher"]),M("div",Ye,[M("div",{class:C(h(U)("h-full max-h-full grid gap-x-2 gap-y-4 overflow-y-auto px-4 pt-4 pb-4 w-full",{"grid-cols-4":i.value==="grid","grid-cols-1 gap-y-2":i.value==="list","grid-cols-1 gap-y-1":i.value==="list-small"}))},[p[4]||(p[4]=M("div",{class:"pointer-events-none absolute inset-x-3 top-0 z-10 h-5"},null,-1)),a.items.length===0?(g(),$("div",_e,[M("i",{title:a.$t("g.noItems"),"aria-label":a.$t("g.noItems"),class:"icon-[lucide--circle-off] size-30 text-zinc-500/20"},null,8,et)])):j("",!0),(g(!0),$(Y,null,_(a.items,(f,l)=>(g(),T(Ge,{key:f.id,index:l,selected:a.isSelected(f,l),"media-src":f.mediaSrc,name:f.name,label:f.label,metadata:f.metadata,layout:i.value,onClick:v(s=>n("item-click",f,l),"onClick")},null,8,["index","selected","media-src","name","label","metadata","layout","onClick"]))),128))],2)])]))}});async function lt(t,e){if(t.trim()==="")return e;const n=t.trim().toLowerCase().split(" ");return e.filter(b=>{const i=b.name.toLowerCase();return n.every(y=>i.includes(y))})}v(lt,"defaultSearcher");function ot(){return[{name:"Default",id:"default",sorter:v(({items:t})=>t.slice(),"sorter")},{name:"A-Z",id:"a-z",sorter:v(({items:t})=>t.slice().sort((e,n)=>e.name.localeCompare(n.name)),"sorter")}]}v(ot,"getDefaultSortOptions");const at=L({__name:"FormDropdown",props:Q({items:{},placeholder:{default:B("widgets.uploadSelect.placeholder")},multiple:{type:[Boolean,Number],default:!1},uploadable:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},accept:{},filterOptions:{default:v(()=>[],"default")},sortOptions:{default:v(()=>ot(),"default")},isSelected:{type:Function,default:v((t,e,n)=>t.has(e.id),"default")},searcher:{type:Function,default:lt}},{selected:{default:new Set},selectedModifiers:{},filterSelected:{default:""},filterSelectedModifiers:{},sortSelected:{default:"default"},sortSelectedModifiers:{},layoutMode:{default:"grid"},layoutModeModifiers:{},files:{default:[]},filesModifiers:{},searchQuery:{default:""},searchQueryModifiers:{}}),emits:["update:selected","update:filterSelected","update:sortSelected","update:layoutMode","update:files","update:searchQuery"],setup(t){const e=t,n=V(t,"selected"),b=V(t,"filterSelected"),i=V(t,"sortSelected"),y=V(t,"layoutMode"),c=V(t,"files"),a=V(t,"searchQuery"),p=le(),f=P(),l=J("triggerRef"),s=P(!1),d=u(()=>e.multiple===!0?1/0:typeof e.multiple=="number"?e.multiple:1),S=P([]),z=u(()=>e.sortOptions.find(w=>w.id==="default")?.sorter||(({items:w})=>w.slice())),W=u(()=>i.value==="default"?z.value:e.sortOptions.find(w=>w.id===i.value)?.sorter||z.value),A=u(()=>W.value({items:S.value})||[]);function I(k,w){return e.isSelected?.(n.value,k,w)??!1}v(I,"internalIsSelected");const H=v(k=>{e.disabled||f.value&&l.value&&(f.value.toggle(k,l.value),s.value=!s.value)},"toggleDropdown"),N=v(()=>{f.value&&(f.value.hide(),s.value=!1)},"closeDropdown");function q(k){if(e.disabled)return;const w=k.target;w.files&&(c.value=Array.from(w.files)),w.value=""}v(q,"handleFileChange");function X(k,w){if(e.disabled)return;const x=n.value;if(I(k,w))x.delete(k.id);else if(x.size<d.value)x.add(k.id);else if(d.value===1)x.clear(),x.add(k.id);else{p.addAlert("Maximum selection limit reached");return}n.value=new Set(x),d.value===1&&N()}v(X,"handleSelection");async function G(k,w){let x=!1,r;w(()=>{x=!0,r?.()}),await e.searcher(k,e.items,o=>r=o).then(o=>{x||(S.value=o)})}return v(G,"customSearcher"),(k,w)=>(g(),$("div",{ref_key:"triggerRef",ref:l},[F(Pe,{files:c.value,"is-open":s.value,placeholder:k.placeholder,items:k.items,"max-selectable":d.value,selected:n.value,uploadable:k.uploadable,disabled:k.disabled,accept:k.accept,onSelectClick:H,onFileChange:q},null,8,["files","is-open","placeholder","items","max-selectable","selected","uploadable","disabled","accept"]),F(h(ae),{ref_key:"popoverRef",ref:f,dismissable:!0,"close-on-escape":!0,unstyled:"",pt:{root:{class:"absolute z-50"},content:{class:["bg-transparent border-none p-0 pt-2 rounded-lg shadow-lg"]}},onHide:w[4]||(w[4]=x=>s.value=!1)},{default:E(()=>[F(tt,{"filter-selected":b.value,"onUpdate:filterSelected":w[0]||(w[0]=x=>b.value=x),"layout-mode":y.value,"onUpdate:layoutMode":w[1]||(w[1]=x=>y.value=x),"sort-selected":i.value,"onUpdate:sortSelected":w[2]||(w[2]=x=>i.value=x),"search-query":a.value,"onUpdate:searchQuery":w[3]||(w[3]=x=>a.value=x),"filter-options":k.filterOptions,"sort-options":k.sortOptions,disabled:k.disabled,searcher:G,items:A.value,"is-selected":I,"max-selectable":d.value,onClose:N,onItemClick:X},null,8,["filter-selected","layout-mode","sort-selected","search-query","filter-options","sort-options","disabled","items","max-selectable"])]),_:1},512)],512))}});function st(t){return{category:u(()=>{}),assets:u(()=>[]),dropdownItems:u(()=>[]),isLoading:u(()=>!1),error:u(()=>null)}}v(st,"useAssetWidgetData");const nt=L({__name:"WidgetSelectDropdown",props:Q({widget:{},nodeType:{},assetKind:{},allowUpload:{type:Boolean},uploadFolder:{},isAssetMode:{type:Boolean},defaultLayoutMode:{}},{modelValue:{default(t){return t.widget.options?.values?.[0]||""}},modelModifiers:{}}),emits:["update:modelValue"],setup(t){const e=t;ke(ue,u(()=>e.assetKind));const n=V(t,"modelValue"),b=le(),i=fe(),y=de(),c=u(()=>({...se(e.widget.options,ne),...y.value})),p=v(()=>{const r=e.widget.options?.nodeType??e.nodeType;return e.isAssetMode&&r?st(xe(r)):null},"getAssetData")(),f=P("all"),l=u(()=>{if(e.isAssetMode){const r=p?.category.value??"All";return[{id:"all",name:Me(r)}]}return[{id:"all",name:"All"},{id:"inputs",name:"Inputs"},{id:"outputs",name:"Outputs"}]}),s=P(new Set);function d(r){const o=e.widget.options?.getOptionLabel;if(!o)return r;try{return o(r)}catch(m){return console.error("Failed to map value:",m),r}}v(d,"getDisplayLabel");const S=u(()=>{const r=e.widget.options?.values||[];return Array.isArray(r)?r.map((o,m)=>({id:`input-${m}`,mediaSrc:x(o,"input"),name:o,label:d(o),metadata:""})):[]}),z=u(()=>{if(!["image","video"].includes(e.assetKind??""))return[];const r=new Set;return i.historyTasks.forEach(o=>{o.flatOutputs.forEach(m=>{const O=e.assetKind==="image"&&m.mediaType==="images"||e.assetKind==="video"&&m.mediaType==="video";if(m.type==="output"&&O){const K=`${m.subfolder?`${m.subfolder}/${m.filename}`:m.filename} [output]`;r.add(K)}})}),Array.from(r).map(o=>({id:`output-${o}`,mediaSrc:x(o.replace(" [output]",""),"output"),name:o,label:d(o),metadata:""}))}),W=u(()=>e.isAssetMode&&p?p.dropdownItems.value:[...S.value,...z.value]),A=u(()=>{if(e.isAssetMode)return W.value;switch(f.value){case"inputs":return S.value;case"outputs":return z.value;case"all":default:return[...S.value,...z.value]}}),I=u(()=>{const r=e.widget.options;if(r?.placeholder)return r.placeholder;switch(e.assetKind){case"image":return B("widgets.uploadSelect.placeholderImage");case"video":return B("widgets.uploadSelect.placeholderVideo");case"audio":return B("widgets.uploadSelect.placeholderAudio");case"model":return B("widgets.uploadSelect.placeholderModel");case"unknown":return B("widgets.uploadSelect.placeholderUnknown")}return B("widgets.uploadSelect.placeholder")}),H=u(()=>e.isAssetMode?!1:e.allowUpload===!0),N=u(()=>{switch(e.assetKind){case"image":return"image/*";case"video":return"video/*";case"audio":return"audio/*";default:return}}),q=P(e.defaultLayoutMode??"grid");$e([n,A],([r,o])=>{if(r===void 0){s.value.clear();return}const m=A.value.find(O=>O.name===r);m&&(s.value.clear(),s.value.add(m.id))},{immediate:!0});function X(r){let o;if(r.size>0&&(o=r.values().next().value),o==null){n.value=void 0;return}const m=A.value.find(O=>O.id===o)?.name;if(!m){n.value=void 0;return}n.value=m}v(X,"updateSelectedItems");const G=v(async(r,o=!1,m={})=>{const O=new FormData;O.append("image",r),o&&O.append("subfolder","pasted"),m.type&&O.append("type",m.type);const D=await me.fetchApi("/upload/image",{method:"POST",body:O});if(D.status!==200)return b.addAlert(D.status+" - "+D.statusText),null;const K=await D.json();return(m.type==="input"||!m.type&&!o)&&await ve().updateInputs(),K.subfolder?`${K.subfolder}/${K.name}`:K.name},"uploadFile"),k=v(async r=>{const o=e.uploadFolder??"input",m=r.map(D=>G(D,!1,{type:o}));return(await Promise.all(m)).filter(D=>D!==null)},"uploadFiles");async function w(r){if(!(!r||r.length===0))try{const o=await k(r);if(o.length===0){b.addAlert("File upload failed");return}e.widget.options?.values&&o.forEach(m=>{const O=e.widget.options.values;O.includes(m)||O.push(m)}),n.value=o[0],e.widget.callback&&e.widget.callback(o[0])}catch(o){console.error("Upload error:",o),b.addAlert(`Upload failed: ${o}`)}}v(w,"handleFilesUpdate");function x(r,o="input"){return["image","video"].includes(e.assetKind??"")?`/api/view?filename=${encodeURIComponent(r)}&type=${o}`:""}return v(x,"getMediaUrl"),(r,o)=>(g(),T(re,{widget:r.widget},{default:E(()=>[F(at,oe({selected:s.value,"onUpdate:selected":o[0]||(o[0]=m=>s.value=m),"filter-selected":f.value,"onUpdate:filterSelected":o[1]||(o[1]=m=>f.value=m),"layout-mode":q.value,"onUpdate:layoutMode":o[2]||(o[2]=m=>q.value=m),items:A.value,placeholder:I.value,multiple:!1,uploadable:H.value,accept:N.value,"filter-options":l.value},c.value,{class:"w-full","onUpdate:selected":X,"onUpdate:files":w}),null,16,["selected","filter-selected","layout-mode","items","placeholder","uploadable","accept","filter-options"])]),_:1},8,["widget"]))}}),bt=L({__name:"WidgetSelect",props:Q({widget:{},nodeType:{}},{modelValue:{},modelModifiers:{}}),emits:["update:modelValue"],setup(t){const e=t,n=V(t,"modelValue"),b=u(()=>{if(e.widget.spec&&ge(e.widget.spec))return e.widget.spec}),i=u(()=>{const s=b.value;if(!s)return{kind:"unknown",allowUpload:!1,folder:void 0};const{image_upload:d,animated_image_upload:S,video_upload:z,image_folder:W,audio_upload:A}=s;let I="unknown";return z?I="video":d||S?I="image":A&&(I="audio"),{kind:I,allowUpload:d===!0||S===!0||z===!0||A===!0,folder:W}}),y=u(()=>!1),c=u(()=>i.value.kind),a=u(()=>y.value||c.value!=="unknown"),p=u(()=>i.value.allowUpload),f=u(()=>i.value.folder??"input"),l=u(()=>y.value?"list":"grid");return(s,d)=>a.value?(g(),T(nt,{key:0,modelValue:n.value,"onUpdate:modelValue":d[0]||(d[0]=S=>n.value=S),widget:s.widget,"node-type":s.widget.nodeType??s.nodeType,"asset-kind":c.value,"allow-upload":p.value,"upload-folder":f.value,"is-asset-mode":y.value,"default-layout-mode":l.value},null,8,["modelValue","widget","node-type","asset-kind","allow-upload","upload-folder","is-asset-mode","default-layout-mode"])):s.widget.controlWidget?(g(),T(ze,{key:1,modelValue:n.value,"onUpdate:modelValue":d[1]||(d[1]=S=>n.value=S),component:ee,widget:s.widget},null,8,["modelValue","widget"])):(g(),T(ee,{key:2,modelValue:n.value,"onUpdate:modelValue":d[2]||(d[2]=S=>n.value=S),widget:s.widget},null,8,["modelValue","widget"]))}});export{bt as _};
2
- //# sourceMappingURL=WidgetSelect.vue_vue_type_script_setup_true_lang-Ua67RWUI.js.map
1
+ var ce=Object.defineProperty;var v=(t,e)=>ce(t,"name",{value:e,configurable:!0});import{c as U,_ as pe,f as le,t as B,P as fe,a as me,k as ve,cU as ge}from"./index-U7jagKl8.js";import{E as u,a2 as L,dk as Q,dl as V,j as T,d as g,k as E,z as F,e as M,m as oe,a8 as h,p as ye,c as $,s as C,q as j,u as R,ea as J,r as P,F as Y,y as _,i as be,h as we,l as he,A as Se,M as ke,fb as Me,w as $e,Z as xe}from"./vendor-other-Dsj-QuOx.js";import{i as Ue,p as ae}from"./vendor-primevue-Cif--Rbw.js";import"./vendor-xterm-CWYFmgbN.js";import{f as se,P as ne}from"./widgetPropFilter-CygYoMQt.js";import{W as ie}from"./index-BST1SetX.js";import{_ as re}from"./WidgetLayoutField.vue_vue_type_script_setup_true_lang-BrNsu13j.js";import{b as Ce,a as Ve,d as Oe}from"./LazyImage.vue_vue_type_script_setup_true_lang-Bwob1r0X.js";import{_ as ze}from"./WidgetWithControl.vue_vue_type_script_setup_true_lang-CWBg5k0x.js";const Ae={name:"SelectPlus",extends:Ue,emits:["hide"],methods:{onOverlayLeave(){this.unbindOutsideClickListener(),this.unbindScrollListener(),this.unbindResizeListener(),this.$emit("hide"),this.overlay=null}}};function de(t={}){return u(()=>({appendTo:"self",...t}))}v(de,"useTransformCompatOverlayProps");const Ie={class:"absolute top-5 right-8 h-4 w-7 -translate-y-4/5 flex"},ee=L({__name:"WidgetSelectDefault",props:Q({widget:{}},{modelValue:{default(t){return t.widget.options?.values?.[0]||""}},modelModifiers:{}}),emits:["update:modelValue"],setup(t){const e=t,n=V(t,"modelValue"),b=de(),i=u(()=>{const a=e.widget.options;return a?.values&&Array.isArray(a.values)?a.values:[]}),y=u(()=>!!n.value&&!i.value.includes(n.value)),c=u(()=>({...se(e.widget.options,ne),...b.value,...y.value?{placeholder:`${n.value}`}:{}}));return(a,p)=>(g(),T(re,{widget:a.widget},{default:E(()=>[F(Ae,oe({modelValue:n.value,"onUpdate:modelValue":p[0]||(p[0]=f=>n.value=f),invalid:y.value,filter:i.value.length>4,"auto-filter-focus":"",options:i.value},c.value,{class:h(U)(h(ie),"w-full text-xs"),"aria-label":a.widget.name,size:"small",pt:{option:"text-xs",dropdown:"w-8",label:h(U)("truncate min-w-[4ch]",a.$slots.default&&"mr-5"),overlay:"w-fit min-w-full"},"data-capture-wheel":"true"}),null,16,["modelValue","invalid","filter","options","class","aria-label","pt"]),M("div",Ie,[ye(a.$slots,"default")])]),_:3},8,["widget"]))}}),De={class:"min-w-0 flex-1 px-1 py-2 text-left truncate"},Te={key:0},Le={key:1},Fe=["multiple","disabled","accept"],Pe=L({__name:"FormDropdownInput",props:{isOpen:{type:Boolean,default:!1},placeholder:{default:"Select..."},items:{},selected:{},maxSelectable:{},uploadable:{type:Boolean},disabled:{type:Boolean},accept:{}},emits:["select-click","file-change"],setup(t,{emit:e}){const n=t,b=e,i=u(()=>n.items.filter(c=>n.selected.has(c.id))),y=u(()=>U("border-0 bg-component-node-widget-background outline-none text-text-secondary",n.disabled?"cursor-not-allowed":"hover:bg-component-node-widget-background-hovered cursor-pointer",i.value.length>0&&"text-text-primary"));return(c,a)=>(g(),$("div",{class:C(h(U)(h(ie),"flex text-base leading-none",{"opacity-50 cursor-not-allowed !outline-zinc-300/10":c.disabled}))},[M("button",{class:C(h(U)(y.value,"flex justify-between items-center flex-1 min-w-0 h-8",{"rounded-l-lg":c.uploadable,"rounded-lg":!c.uploadable})),onClick:a[0]||(a[0]=p=>b("select-click",p))},[M("span",De,[i.value.length?(g(),$("span",Le,R(i.value.map(p=>p.label??p.name).join(", ")),1)):(g(),$("span",Te,R(c.placeholder),1))]),M("i",{class:C(["icon-[lucide--chevron-down]",h(U)("mr-2 size-4 transition-transform duration-200 flex-shrink-0 text-component-node-foreground-secondary",c.isOpen&&"rotate-180")])},null,2)],2),c.uploadable?(g(),$("label",{key:0,class:C(h(U)(y.value,"relative","size-8 flex justify-center items-center border-l rounded-r-lg border-zinc-300/10"))},[a[2]||(a[2]=M("i",{class:"icon-[lucide--folder-search] size-4"},null,-1)),M("input",{type:"file",class:"absolute inset-0 -z-1 opacity-0",multiple:c.maxSelectable>1,disabled:c.disabled,accept:c.accept,onChange:a[1]||(a[1]=p=>b("file-change",p))},null,40,Fe)],2)):j("",!0)],2))}}),Qe={class:"text-secondary flex gap-2 px-4"},je={key:0,class:"absolute top-[-2px] left-[-2px] size-2 rounded-full bg-component-node-widget-background-highlighted"},Be=["onClick"],Re={key:0,class:"icon-[lucide--check] size-4"},Z="bg-transparent border-0 outline-0 ring-0 text-left",te="size-6 flex justify-center items-center rounded-sm cursor-pointer transition-all duration-150 hover:scale-108 hover:text-base-foreground active:scale-95",Ke=L({__name:"FormDropdownMenuActions",props:Q({searcher:{type:Function},sortOptions:{}},{layoutMode:{},layoutModeModifiers:{},searchQuery:{},searchQueryModifiers:{},sortSelected:{},sortSelectedModifiers:{}}),emits:["update:layoutMode","update:searchQuery","update:sortSelected"],setup(t){const e=V(t,"layoutMode"),n=V(t,"searchQuery"),b=V(t,"sortSelected"),i=U("h-8 bg-zinc-500/20 rounded-lg outline outline-1 outline-offset-[-1px] outline-node-component-border transition-all duration-150"),y=J("sortPopoverRef"),c=J("sortTriggerRef"),a=P(!1);function p(s){!y.value||!c.value||(a.value=!a.value,y.value.toggle(s,c.value))}v(p,"toggleSortPopover");function f(){a.value=!1,y.value?.hide()}v(f,"closeSortPopover");function l(s){b.value=s.id,f()}return v(l,"handleSortSelected"),(s,d)=>(g(),$("div",Qe,[F(Ce,{modelValue:n.value,"onUpdate:modelValue":d[0]||(d[0]=S=>n.value=S),searcher:s.searcher,class:C(h(U)(h(i),"hover:outline-component-node-widget-background-highlighted/80","focus-within:outline-component-node-widget-background-highlighted/80 focus-within:ring-0"))},null,8,["modelValue","searcher","class"]),M("button",{ref_key:"sortTriggerRef",ref:c,class:C(h(U)(Z,h(i),"relative w-8 flex justify-center items-center cursor-pointer","hover:outline-component-node-widget-background-highlighted","active:!scale-95")),onClick:p},[b.value!=="default"?(g(),$("div",je)):j("",!0),d[4]||(d[4]=M("i",{class:"icon-[lucide--arrow-up-down] size-4"},null,-1))],2),F(h(ae),{ref_key:"sortPopoverRef",ref:y,dismissable:!0,"close-on-escape":!0,unstyled:"",pt:{root:{class:"absolute z-50"},content:{class:["bg-transparent border-none p-0 pt-2 rounded-lg shadow-lg"]}},onHide:d[1]||(d[1]=S=>a.value=!1)},{default:E(()=>[M("div",{class:C(h(U)("flex flex-col gap-2 p-2 min-w-32","bg-component-node-background","rounded-lg outline outline-offset-[-1px] outline-component-node-border"))},[(g(!0),$(Y,null,_(s.sortOptions,S=>(g(),$("button",{key:S.name,class:C(h(U)(Z,"flex justify-between items-center h-6 cursor-pointer","hover:!text-blue-500")),onClick:v(z=>l(S),"onClick")},[M("span",null,R(S.name),1),b.value===S.id?(g(),$("i",Re)):j("",!0)],10,Be))),128))],2)]),_:1},512),M("div",{class:C(h(U)(h(i),"flex justify-center items-center p-1 gap-1 hover:outline-component-node-widget-background-highlighted"))},[M("button",{class:C(h(U)(Z,te,e.value==="list"?"bg-neutral-500/50 text-base-foreground":"")),onClick:d[2]||(d[2]=S=>e.value="list")},d[5]||(d[5]=[M("i",{class:"icon-[lucide--list] size-4"},null,-1)]),2),M("button",{class:C(h(U)(Z,te,e.value==="grid"?"bg-neutral-500/50 text-base-foreground":"")),onClick:d[3]||(d[3]=S=>e.value="grid")},d[6]||(d[6]=[M("i",{class:"icon-[lucide--layout-grid] size-4"},null,-1)]),2)],2)]))}}),We={class:"text-secondary mb-4 flex gap-1 px-4 justify-start"},Ee=["disabled","onClick"],He=L({__name:"FormDropdownMenuFilter",props:Q({filterOptions:{}},{filterSelected:{},filterSelectedModifiers:{}}),emits:["update:filterSelected"],setup(t){const e=V(t,"filterSelected"),{isUploadButtonEnabled:n,showUploadDialog:b}=Ve(),i=u(()=>t.filterOptions.length===1);return(y,c)=>(g(),$("div",We,[(g(!0),$(Y,null,_(y.filterOptions,a=>(g(),$("button",{key:a.id,type:"button",disabled:i.value,class:C(h(U)("px-4 py-2 rounded-md inline-flex justify-center items-center select-none appearance-none border-0 text-base-foreground",!i.value&&"transition-all duration-150 hover:text-base-foreground hover:bg-interface-menu-component-surface-hovered cursor-pointer active:scale-95",!i.value&&e.value===a.id?"!bg-interface-menu-component-surface-selected text-base-foreground":"bg-transparent")),onClick:v(p=>e.value=a.id,"onClick")},R(a.name),11,Ee))),128)),h(n)&&i.value?(g(),T(pe,{key:0,class:"ml-auto",size:"md",variant:"textonly",onClick:h(b)},{default:E(()=>[c[0]||(c[0]=M("i",{class:"icon-[lucide--folder-input]"},null,-1)),M("span",null,R(y.$t("g.import")),1)]),_:1},8,["onClick"])):j("",!0)]))}}),ue=Symbol("assetKind"),Ne={key:0,class:"absolute top-1 left-1 size-4 rounded-full border-1 border-base-foreground bg-primary-background"},qe=["src"],Ze={key:3,class:"size-full bg-gradient-to-tr from-blue-400 via-teal-500 to-green-400"},Xe={class:"text-secondary block text-xs"},Ge=L({__name:"FormDropdownMenuItem",props:{index:{},selected:{type:Boolean},mediaSrc:{},name:{},label:{},metadata:{},layout:{}},emits:["click","mediaLoad"],setup(t,{emit:e}){const n=t,b=e,i=P(null),y=be(ue),c=u(()=>y?.value==="video");function a(){b("click",n.index)}v(a,"handleClick");function p(l){if(b("mediaLoad",l),!l.target||!(l.target instanceof HTMLImageElement))return;const s=l.target;s.naturalWidth&&s.naturalHeight&&(i.value=`${s.naturalWidth} x ${s.naturalHeight}`)}v(p,"handleImageLoad");function f(l){if(b("mediaLoad",l),!l.target||!(l.target instanceof HTMLVideoElement))return;const s=l.target;s.videoWidth&&s.videoHeight&&(i.value=`${s.videoWidth} x ${s.videoHeight}`)}return v(f,"handleVideoLoad"),(l,s)=>{const d=we("tooltip");return g(),$("div",{class:C(h(U)("flex gap-1 select-none group/item cursor-pointer bg-component-node-widget-background","transition-all duration-150",{"flex-col text-center":l.layout==="grid","flex-row text-left max-h-16 rounded-lg hover:scale-102 active:scale-98":l.layout==="list","flex-row text-left hover:bg-component-node-widget-background-hovered rounded-lg":l.layout==="list-small","ring-2 ring-component-node-widget-background-highlighted":l.layout==="list"&&l.selected})),onClick:a},[l.layout!=="list-small"?(g(),$("div",{key:0,class:C(h(U)("relative","w-full aspect-square overflow-hidden outline-1 outline-offset-[-1px] outline-interface-stroke","transition-all duration-150",{"min-w-16 max-w-16 rounded-l-lg":l.layout==="list","rounded-sm group-hover/item:scale-108 group-active/item:scale-95":l.layout==="grid","ring-2 ring-component-node-widget-background-highlighted":l.layout==="grid"&&l.selected}))},[l.selected?(g(),$("div",Ne,s[0]||(s[0]=[M("i",{class:"icon-[lucide--check] size-3 translate-y-[-0.5px] text-base-foreground bold"},null,-1)]))):j("",!0),l.mediaSrc&&c.value?(g(),$("video",{key:1,src:l.mediaSrc,class:"size-full object-cover",preload:"metadata",muted:"",onLoadeddata:f},null,40,qe)):l.mediaSrc?(g(),T(Oe,{key:2,src:l.mediaSrc,alt:l.name,"image-class":"size-full object-cover",onLoad:p},null,8,["src","alt"])):(g(),$("div",Ze))],2)):j("",!0),M("div",{class:C(h(U)("flex gap-1",{"flex-col":l.layout==="grid","flex-col px-4 py-1 w-full justify-center min-w-0":l.layout==="list","flex-row p-2 items-center justify-between w-full":l.layout==="list-small"}))},[he((g(),$("span",{class:C(h(U)("block text-xs line-clamp-2 break-words overflow-hidden","transition-colors duration-150",!!l.selected&&"text-base-foreground"))},[Se(R(l.label??l.name),1)],2)),[[d,l.layout==="grid"?l.label??l.name:void 0]]),M("span",Xe,R(l.metadata||i.value),1)],2)],2)}}}),Je={class:"flex max-h-[640px] w-103 flex-col rounded-lg bg-component-node-background pt-4 outline outline-offset-[-1px] outline-node-component-border"},Ye={class:"relative flex h-full mt-2 overflow-y-scroll"},_e={key:0,class:"h-50 col-span-full flex items-center justify-center"},et=["title","aria-label"],tt=L({__name:"FormDropdownMenu",props:Q({items:{},isSelected:{type:Function},filterOptions:{},sortOptions:{},searcher:{type:Function}},{filterSelected:{},filterSelectedModifiers:{},layoutMode:{},layoutModeModifiers:{},sortSelected:{},sortSelectedModifiers:{},searchQuery:{},searchQueryModifiers:{}}),emits:Q(["item-click"],["update:filterSelected","update:layoutMode","update:sortSelected","update:searchQuery"]),setup(t,{emit:e}){const n=e,b=V(t,"filterSelected"),i=V(t,"layoutMode"),y=V(t,"sortSelected"),c=V(t,"searchQuery");return(a,p)=>(g(),$("div",Je,[a.filterOptions.length>0?(g(),T(He,{key:0,"filter-selected":b.value,"onUpdate:filterSelected":p[0]||(p[0]=f=>b.value=f),"filter-options":a.filterOptions},null,8,["filter-selected","filter-options"])):j("",!0),F(Ke,{"layout-mode":i.value,"onUpdate:layoutMode":p[1]||(p[1]=f=>i.value=f),"sort-selected":y.value,"onUpdate:sortSelected":p[2]||(p[2]=f=>y.value=f),"search-query":c.value,"onUpdate:searchQuery":p[3]||(p[3]=f=>c.value=f),"sort-options":a.sortOptions,searcher:a.searcher},null,8,["layout-mode","sort-selected","search-query","sort-options","searcher"]),M("div",Ye,[M("div",{class:C(h(U)("h-full max-h-full grid gap-x-2 gap-y-4 overflow-y-auto px-4 pt-4 pb-4 w-full",{"grid-cols-4":i.value==="grid","grid-cols-1 gap-y-2":i.value==="list","grid-cols-1 gap-y-1":i.value==="list-small"}))},[p[4]||(p[4]=M("div",{class:"pointer-events-none absolute inset-x-3 top-0 z-10 h-5"},null,-1)),a.items.length===0?(g(),$("div",_e,[M("i",{title:a.$t("g.noItems"),"aria-label":a.$t("g.noItems"),class:"icon-[lucide--circle-off] size-30 text-zinc-500/20"},null,8,et)])):j("",!0),(g(!0),$(Y,null,_(a.items,(f,l)=>(g(),T(Ge,{key:f.id,index:l,selected:a.isSelected(f,l),"media-src":f.mediaSrc,name:f.name,label:f.label,metadata:f.metadata,layout:i.value,onClick:v(s=>n("item-click",f,l),"onClick")},null,8,["index","selected","media-src","name","label","metadata","layout","onClick"]))),128))],2)])]))}});async function lt(t,e){if(t.trim()==="")return e;const n=t.trim().toLowerCase().split(" ");return e.filter(b=>{const i=b.name.toLowerCase();return n.every(y=>i.includes(y))})}v(lt,"defaultSearcher");function ot(){return[{name:"Default",id:"default",sorter:v(({items:t})=>t.slice(),"sorter")},{name:"A-Z",id:"a-z",sorter:v(({items:t})=>t.slice().sort((e,n)=>e.name.localeCompare(n.name)),"sorter")}]}v(ot,"getDefaultSortOptions");const at=L({__name:"FormDropdown",props:Q({items:{},placeholder:{default:B("widgets.uploadSelect.placeholder")},multiple:{type:[Boolean,Number],default:!1},uploadable:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},accept:{},filterOptions:{default:v(()=>[],"default")},sortOptions:{default:v(()=>ot(),"default")},isSelected:{type:Function,default:v((t,e,n)=>t.has(e.id),"default")},searcher:{type:Function,default:lt}},{selected:{default:new Set},selectedModifiers:{},filterSelected:{default:""},filterSelectedModifiers:{},sortSelected:{default:"default"},sortSelectedModifiers:{},layoutMode:{default:"grid"},layoutModeModifiers:{},files:{default:[]},filesModifiers:{},searchQuery:{default:""},searchQueryModifiers:{}}),emits:["update:selected","update:filterSelected","update:sortSelected","update:layoutMode","update:files","update:searchQuery"],setup(t){const e=t,n=V(t,"selected"),b=V(t,"filterSelected"),i=V(t,"sortSelected"),y=V(t,"layoutMode"),c=V(t,"files"),a=V(t,"searchQuery"),p=le(),f=P(),l=J("triggerRef"),s=P(!1),d=u(()=>e.multiple===!0?1/0:typeof e.multiple=="number"?e.multiple:1),S=P([]),z=u(()=>e.sortOptions.find(w=>w.id==="default")?.sorter||(({items:w})=>w.slice())),W=u(()=>i.value==="default"?z.value:e.sortOptions.find(w=>w.id===i.value)?.sorter||z.value),A=u(()=>W.value({items:S.value})||[]);function I(k,w){return e.isSelected?.(n.value,k,w)??!1}v(I,"internalIsSelected");const H=v(k=>{e.disabled||f.value&&l.value&&(f.value.toggle(k,l.value),s.value=!s.value)},"toggleDropdown"),N=v(()=>{f.value&&(f.value.hide(),s.value=!1)},"closeDropdown");function q(k){if(e.disabled)return;const w=k.target;w.files&&(c.value=Array.from(w.files)),w.value=""}v(q,"handleFileChange");function X(k,w){if(e.disabled)return;const x=n.value;if(I(k,w))x.delete(k.id);else if(x.size<d.value)x.add(k.id);else if(d.value===1)x.clear(),x.add(k.id);else{p.addAlert("Maximum selection limit reached");return}n.value=new Set(x),d.value===1&&N()}v(X,"handleSelection");async function G(k,w){let x=!1,r;w(()=>{x=!0,r?.()}),await e.searcher(k,e.items,o=>r=o).then(o=>{x||(S.value=o)})}return v(G,"customSearcher"),(k,w)=>(g(),$("div",{ref_key:"triggerRef",ref:l},[F(Pe,{files:c.value,"is-open":s.value,placeholder:k.placeholder,items:k.items,"max-selectable":d.value,selected:n.value,uploadable:k.uploadable,disabled:k.disabled,accept:k.accept,onSelectClick:H,onFileChange:q},null,8,["files","is-open","placeholder","items","max-selectable","selected","uploadable","disabled","accept"]),F(h(ae),{ref_key:"popoverRef",ref:f,dismissable:!0,"close-on-escape":!0,unstyled:"",pt:{root:{class:"absolute z-50"},content:{class:["bg-transparent border-none p-0 pt-2 rounded-lg shadow-lg"]}},onHide:w[4]||(w[4]=x=>s.value=!1)},{default:E(()=>[F(tt,{"filter-selected":b.value,"onUpdate:filterSelected":w[0]||(w[0]=x=>b.value=x),"layout-mode":y.value,"onUpdate:layoutMode":w[1]||(w[1]=x=>y.value=x),"sort-selected":i.value,"onUpdate:sortSelected":w[2]||(w[2]=x=>i.value=x),"search-query":a.value,"onUpdate:searchQuery":w[3]||(w[3]=x=>a.value=x),"filter-options":k.filterOptions,"sort-options":k.sortOptions,disabled:k.disabled,searcher:G,items:A.value,"is-selected":I,"max-selectable":d.value,onClose:N,onItemClick:X},null,8,["filter-selected","layout-mode","sort-selected","search-query","filter-options","sort-options","disabled","items","max-selectable"])]),_:1},512)],512))}});function st(t){return{category:u(()=>{}),assets:u(()=>[]),dropdownItems:u(()=>[]),isLoading:u(()=>!1),error:u(()=>null)}}v(st,"useAssetWidgetData");const nt=L({__name:"WidgetSelectDropdown",props:Q({widget:{},nodeType:{},assetKind:{},allowUpload:{type:Boolean},uploadFolder:{},isAssetMode:{type:Boolean},defaultLayoutMode:{}},{modelValue:{default(t){return t.widget.options?.values?.[0]||""}},modelModifiers:{}}),emits:["update:modelValue"],setup(t){const e=t;ke(ue,u(()=>e.assetKind));const n=V(t,"modelValue"),b=le(),i=fe(),y=de(),c=u(()=>({...se(e.widget.options,ne),...y.value})),p=v(()=>{const r=e.widget.options?.nodeType??e.nodeType;return e.isAssetMode&&r?st(xe(r)):null},"getAssetData")(),f=P("all"),l=u(()=>{if(e.isAssetMode){const r=p?.category.value??"All";return[{id:"all",name:Me(r)}]}return[{id:"all",name:"All"},{id:"inputs",name:"Inputs"},{id:"outputs",name:"Outputs"}]}),s=P(new Set);function d(r){const o=e.widget.options?.getOptionLabel;if(!o)return r;try{return o(r)}catch(m){return console.error("Failed to map value:",m),r}}v(d,"getDisplayLabel");const S=u(()=>{const r=e.widget.options?.values||[];return Array.isArray(r)?r.map((o,m)=>({id:`input-${m}`,mediaSrc:x(o,"input"),name:o,label:d(o),metadata:""})):[]}),z=u(()=>{if(!["image","video"].includes(e.assetKind??""))return[];const r=new Set;return i.historyTasks.forEach(o=>{o.flatOutputs.forEach(m=>{const O=e.assetKind==="image"&&m.mediaType==="images"||e.assetKind==="video"&&m.mediaType==="video";if(m.type==="output"&&O){const K=`${m.subfolder?`${m.subfolder}/${m.filename}`:m.filename} [output]`;r.add(K)}})}),Array.from(r).map(o=>({id:`output-${o}`,mediaSrc:x(o.replace(" [output]",""),"output"),name:o,label:d(o),metadata:""}))}),W=u(()=>e.isAssetMode&&p?p.dropdownItems.value:[...S.value,...z.value]),A=u(()=>{if(e.isAssetMode)return W.value;switch(f.value){case"inputs":return S.value;case"outputs":return z.value;case"all":default:return[...S.value,...z.value]}}),I=u(()=>{const r=e.widget.options;if(r?.placeholder)return r.placeholder;switch(e.assetKind){case"image":return B("widgets.uploadSelect.placeholderImage");case"video":return B("widgets.uploadSelect.placeholderVideo");case"audio":return B("widgets.uploadSelect.placeholderAudio");case"model":return B("widgets.uploadSelect.placeholderModel");case"unknown":return B("widgets.uploadSelect.placeholderUnknown")}return B("widgets.uploadSelect.placeholder")}),H=u(()=>e.isAssetMode?!1:e.allowUpload===!0),N=u(()=>{switch(e.assetKind){case"image":return"image/*";case"video":return"video/*";case"audio":return"audio/*";default:return}}),q=P(e.defaultLayoutMode??"grid");$e([n,A],([r,o])=>{if(r===void 0){s.value.clear();return}const m=A.value.find(O=>O.name===r);m&&(s.value.clear(),s.value.add(m.id))},{immediate:!0});function X(r){let o;if(r.size>0&&(o=r.values().next().value),o==null){n.value=void 0;return}const m=A.value.find(O=>O.id===o)?.name;if(!m){n.value=void 0;return}n.value=m}v(X,"updateSelectedItems");const G=v(async(r,o=!1,m={})=>{const O=new FormData;O.append("image",r),o&&O.append("subfolder","pasted"),m.type&&O.append("type",m.type);const D=await me.fetchApi("/upload/image",{method:"POST",body:O});if(D.status!==200)return b.addAlert(D.status+" - "+D.statusText),null;const K=await D.json();return(m.type==="input"||!m.type&&!o)&&await ve().updateInputs(),K.subfolder?`${K.subfolder}/${K.name}`:K.name},"uploadFile"),k=v(async r=>{const o=e.uploadFolder??"input",m=r.map(D=>G(D,!1,{type:o}));return(await Promise.all(m)).filter(D=>D!==null)},"uploadFiles");async function w(r){if(!(!r||r.length===0))try{const o=await k(r);if(o.length===0){b.addAlert("File upload failed");return}e.widget.options?.values&&o.forEach(m=>{const O=e.widget.options.values;O.includes(m)||O.push(m)}),n.value=o[0],e.widget.callback&&e.widget.callback(o[0])}catch(o){console.error("Upload error:",o),b.addAlert(`Upload failed: ${o}`)}}v(w,"handleFilesUpdate");function x(r,o="input"){return["image","video"].includes(e.assetKind??"")?`/api/view?filename=${encodeURIComponent(r)}&type=${o}`:""}return v(x,"getMediaUrl"),(r,o)=>(g(),T(re,{widget:r.widget},{default:E(()=>[F(at,oe({selected:s.value,"onUpdate:selected":o[0]||(o[0]=m=>s.value=m),"filter-selected":f.value,"onUpdate:filterSelected":o[1]||(o[1]=m=>f.value=m),"layout-mode":q.value,"onUpdate:layoutMode":o[2]||(o[2]=m=>q.value=m),items:A.value,placeholder:I.value,multiple:!1,uploadable:H.value,accept:N.value,"filter-options":l.value},c.value,{class:"w-full","onUpdate:selected":X,"onUpdate:files":w}),null,16,["selected","filter-selected","layout-mode","items","placeholder","uploadable","accept","filter-options"])]),_:1},8,["widget"]))}}),bt=L({__name:"WidgetSelect",props:Q({widget:{},nodeType:{}},{modelValue:{},modelModifiers:{}}),emits:["update:modelValue"],setup(t){const e=t,n=V(t,"modelValue"),b=u(()=>{if(e.widget.spec&&ge(e.widget.spec))return e.widget.spec}),i=u(()=>{const s=b.value;if(!s)return{kind:"unknown",allowUpload:!1,folder:void 0};const{image_upload:d,animated_image_upload:S,video_upload:z,image_folder:W,audio_upload:A}=s;let I="unknown";return z?I="video":d||S?I="image":A&&(I="audio"),{kind:I,allowUpload:d===!0||S===!0||z===!0||A===!0,folder:W}}),y=u(()=>!1),c=u(()=>i.value.kind),a=u(()=>y.value||c.value!=="unknown"),p=u(()=>i.value.allowUpload),f=u(()=>i.value.folder??"input"),l=u(()=>y.value?"list":"grid");return(s,d)=>a.value?(g(),T(nt,{key:0,modelValue:n.value,"onUpdate:modelValue":d[0]||(d[0]=S=>n.value=S),widget:s.widget,"node-type":s.widget.nodeType??s.nodeType,"asset-kind":c.value,"allow-upload":p.value,"upload-folder":f.value,"is-asset-mode":y.value,"default-layout-mode":l.value},null,8,["modelValue","widget","node-type","asset-kind","allow-upload","upload-folder","is-asset-mode","default-layout-mode"])):s.widget.controlWidget?(g(),T(ze,{key:1,modelValue:n.value,"onUpdate:modelValue":d[1]||(d[1]=S=>n.value=S),component:ee,widget:s.widget},null,8,["modelValue","widget"])):(g(),T(ee,{key:2,modelValue:n.value,"onUpdate:modelValue":d[2]||(d[2]=S=>n.value=S),widget:s.widget},null,8,["modelValue","widget"]))}});export{bt as _};
2
+ //# sourceMappingURL=WidgetSelect.vue_vue_type_script_setup_true_lang-DLMXofNs.js.map