<div> <h1>Single Image</h1> <div class="grid grid-rows-4 grid-cols-4 items-center justify-items-center gap-2"> <div> <turbo-frame id="multiple_image_full"> <div data-controller="images" data-images-editable-value="false" data-images-with-attached-value="false" data-images-turbo-frame-id-value="multiple_image_full" data-images-unique-id-value="multiple_image_full" data-images-list-view-value="false" data-images-has-many-value="false" data-images-force-new-value="false" data-images-urls-value="{"attach":"/loopos_ui/images","detach":"/loopos_ui/images"}"> <div class="lui-image lui-image--full" data-images-target="imageComponent" data-action="pubsub:action@window->images#executeAction"> <div role="status" class="hidden lui-image__loader" data-images-target="loader"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny lui-button--disabled w-fit w-fit" data-controller="lui--button" disabled="disabled"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-spinner" data-lui--button-target="leadingIcon"></i> </button> </div> <img class="hidden lui-image__image" data-images-target="image" src="" /> <div class="lui-image__placeholder flex" data-images-target="placeholder"> <div class="lui-icon h-[16px] w-[16px]"> <i class="fa-regular fa-image lui-icon__icon" style="font-size: 16px; color: white;"></i> </div> </div> </div> <span class="lui-image__error" data-images-target="error">Error message</span> </div> </turbo-frame> </div> <div> <turbo-frame id="multiple_image_image_pokemon_1_full"> <div data-controller="images" data-images-editable-value="true" data-images-with-attached-value="false" data-images-turbo-frame-id-value="multiple_image_image_pokemon_1_full" data-images-unique-id-value="multiple_image_image_pokemon_1_full" data-images-list-view-value="false" data-images-has-many-value="false" data-images-force-new-value="false" data-images-urls-value="{"attach":"/loopos_ui/images","detach":"/loopos_ui/images"}"> <div class="lui-image lui-image--full" data-images-target="imageComponent" data-action="pubsub:action@window->images#executeAction"> <div role="status" class="hidden lui-image__loader" data-images-target="loader"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny lui-button--disabled w-fit w-fit" data-controller="lui--button" disabled="disabled"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-spinner" data-lui--button-target="leadingIcon"></i> </button> </div> <img class="hidden lui-image__image" data-images-target="image" src="" /> <div class="lui-image__placeholder lui-image__placeholder--editable flex" data-images-target="placeholder"> <div class="lui-icon h-[16px] w-[16px]"> <i class="fa-regular fa-image lui-icon__icon" style="font-size: 16px; color: white;"></i> </div> </div> <div class="overflow-visible lui-image__image-edit"> <form data-images-target="form" enctype="multipart/form-data" action="#" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="J_DsGRNX0QPP6mxRlp0_WBEnuX23_2S1VEQFqqYvvx7yoSvR7axctl48s5-cKLF-6WLq7i6nw6sQcbCwPLFvgA" autocomplete="off" /> <input type="hidden" name="authenticity_token" id="authenticity_token" value="ePmvIRfmnXymG5Qo1rCM60pInKlgdkK4zCPutqyrM5mDVP0ZKCyyxwALpcwegRCKDm5-4_OCfFtuEx0IoM-kdg" autocomplete="off" /> <input type="hidden" name="context" id="context" value="zn6+ToRzlwNurj7hbKfkvc4y5Jy+RcXI2DX5bq5+SQMNqMnDqtCqZTQNw3WDIHkmJohXWrmq5yDSsHnsbmVSA8VX3ffWZ1U5lyw8Lb8aUvjPJP+rJcAzM3CgtpKWl2fSmyqUCB33YQ==--SjQqjLa+NWekzuGC--M9p07IhgGfRbWCqEK5SpmA==" autocomplete="off" /> <div class="hidden" data-images-target="noImageUploader"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny w-fit w-fit" data-controller="lui--button" data-action="click->images#openFilePicker"> <div class="lui-tooltip hidden" data-controller="tooltips" data-tooltips-tippy-target-id-value="" data-tooltips-position-value="top" data-tooltips-interactive-value="false" > <div class="lui-tooltip__title"> Upload image here </div> </div> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-upload" data-lui--button-target="leadingIcon"></i> </button> </div> <div class="hidden" data-images-target="withImageUploader"> <div data-controller="action-menu" data-action="modal:open@window->action-menu#disableTippy modal:close@window->action-menu#enableTippy" class="lui-action-menu"> <div data-action-menu-target="trigger"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny w-fit w-fit" data-controller="lui--button" type="button"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-ellipsis-vertical" data-lui--button-target="leadingIcon"></i> </button> </div> <div data-action-menu-target="menu" class="hidden lui-action-menu__wrapper" data-controller="modal form-submit pubsub"> <div class="lui-action-menu__options" role="menu" aria-orientation="vertical" aria-labelledby="options-menu"> <div class="lui-action-menu__option " data-action="click->pubsub#publish" data-pubsub-unique-id-param="multiple_image_image_pokemon_1_full" data-pubsub-action-param="openFilePicker"> <div class="lui-action-menu__option-text cursor-default"> <i class="fa-regular fa-arrows-rotate"></i> <span>Upload new image</span> </div> </div> <div class="lui-action-menu__option " data-action="click->pubsub#publish" data-pubsub-unique-id-param="multiple_image_image_pokemon_1_full" data-pubsub-action-param="detachImage"> <div class="lui-action-menu__option-text cursor-default"> <i class="fa-regular fa-trash"></i> <span>Remove image</span> </div> </div> </div> </div> </div> </div> <input accept="image/jpeg,image/png,image/webp" class="hidden" data-images-target="file" data-action="change->images#previewAndSubmit" data-direct-upload-url="https://loopos-ui.theloop.pt/rails/active_storage/direct_uploads" type="file" name="file" id="file" /> <input name="files[][]" type="hidden" value="" autocomplete="off" /><input accept="image/jpeg,image/png,image/webp" multiple="multiple" class="hidden" data-images-target="fileMultiple" data-action="change->images#previewAndSubmitMultiple" data-direct-upload-url="https://loopos-ui.theloop.pt/rails/active_storage/direct_uploads" type="file" name="files[][]" id="files[]" /> <input type="submit" name="commit" value="Save" data-images-target="submit" data-disable-with="Save" class="hidden" /> </form> </div> </div> <span class="lui-image__error" data-images-target="error">Error message</span> </div> </turbo-frame> </div> <div> <turbo-frame id="multiple_image_https://loopos-ui.theloop.pt/assets/loopos_ui/backgrounds/core-9ffeb853.png_full"> <div data-controller="images" data-images-editable-value="false" data-images-with-attached-value="true" data-images-turbo-frame-id-value="multiple_image_https://loopos-ui.theloop.pt/assets/loopos_ui/backgrounds/core-9ffeb853.png_full" data-images-unique-id-value="multiple_image_https://loopos-ui.theloop.pt/assets/loopos_ui/backgrounds/core-9ffeb853.png_full" data-images-list-view-value="false" data-images-has-many-value="false" data-images-force-new-value="false" data-images-urls-value="{"attach":"/loopos_ui/images","detach":"/loopos_ui/images"}"> <div class="lui-image lui-image--full" data-images-target="imageComponent" data-action="pubsub:action@window->images#executeAction"> <div role="status" class="hidden lui-image__loader" data-images-target="loader"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny lui-button--disabled w-fit w-fit" data-controller="lui--button" disabled="disabled"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-spinner" data-lui--button-target="leadingIcon"></i> </button> </div> <img class="lui-image__image" data-images-target="image" src="https://loopos-ui.theloop.pt/assets/loopos_ui/backgrounds/core-9ffeb853.png" /> <div class="lui-image__placeholder hidden" data-images-target="placeholder"> <div class="lui-icon h-[16px] w-[16px]"> <i class="fa-regular fa-image lui-icon__icon" style="font-size: 16px; color: white;"></i> </div> </div> </div> <span class="lui-image__error" data-images-target="error">Error message</span> </div> </turbo-frame> </div> <div> <turbo-frame id="multiple_image_image_pokemon_49_full"> <div data-controller="images" data-images-editable-value="true" data-images-with-attached-value="true" data-images-turbo-frame-id-value="multiple_image_image_pokemon_49_full" data-images-unique-id-value="multiple_image_image_pokemon_49_full" data-images-list-view-value="false" data-images-has-many-value="false" data-images-force-new-value="false" data-images-urls-value="{"attach":"/loopos_ui/images","detach":"/loopos_ui/images"}"> <div class="lui-image lui-image--full" data-images-target="imageComponent" data-action="pubsub:action@window->images#executeAction"> <div role="status" class="hidden lui-image__loader" data-images-target="loader"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny lui-button--disabled w-fit w-fit" data-controller="lui--button" disabled="disabled"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-spinner" data-lui--button-target="leadingIcon"></i> </button> </div> <img class="lui-image__image" data-images-target="image" data-blob-id="12" src="https://loopos-ui.theloop.pt/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTIsInB1ciI6ImJsb2JfaWQifX0=--6acfc7725e9eb862920b12bce8fb24b56b8faf16/metapod.png" /> <div class="lui-image__placeholder lui-image__placeholder--editable hidden" data-images-target="placeholder"> <div class="lui-icon h-[16px] w-[16px]"> <i class="fa-regular fa-image lui-icon__icon" style="font-size: 16px; color: white;"></i> </div> </div> <div class="overflow-visible lui-image__image-edit"> <form data-images-target="form" enctype="multipart/form-data" action="#" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="WVa06doRxTBaHeH98dzh-zRqkufN8EArSfJHcN-Js92MB3MhJOpIhcvLPjP7aW_dzC_BdFSo5zUNx_JqRRdjQw" autocomplete="off" /> <input type="hidden" name="authenticity_token" id="authenticity_token" value="veTaPvu_p6Cb46Q7UyGGIkECl8AABfBaaldT2m7dkOBGSYgGxHWIGz3zld-bEBpDBSR1ipPxzrnIZ6BkYrkHDw" autocomplete="off" /> <input type="hidden" name="context" id="context" value="rQoQykeeIkbEaTqkeaocV6ThxJ0LAs0wH91rGxBbsT96szzQHX6fT32Zv12tT0vkZPQo4tReN8l/vx9eH5LYRsZJC4tWJaOh9SOQSgPH/85R/V8iOruzJo4/rMY3WJEz/6Hg2P5nBrY=--ftu9EjU85cxTkogS--C/1bv7hut1AaDgPaVNeEXA==" autocomplete="off" /> <div class="hidden" data-images-target="noImageUploader"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny w-fit w-fit" data-controller="lui--button" data-action="click->images#openFilePicker"> <div class="lui-tooltip hidden" data-controller="tooltips" data-tooltips-tippy-target-id-value="" data-tooltips-position-value="top" data-tooltips-interactive-value="false" > <div class="lui-tooltip__title"> Upload image here </div> </div> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-upload" data-lui--button-target="leadingIcon"></i> </button> </div> <div class="hidden" data-images-target="withImageUploader"> <div data-controller="action-menu" data-action="modal:open@window->action-menu#disableTippy modal:close@window->action-menu#enableTippy" class="lui-action-menu"> <div data-action-menu-target="trigger"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny w-fit w-fit" data-controller="lui--button" type="button"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-ellipsis-vertical" data-lui--button-target="leadingIcon"></i> </button> </div> <div data-action-menu-target="menu" class="hidden lui-action-menu__wrapper" data-controller="modal form-submit pubsub"> <div class="lui-action-menu__options" role="menu" aria-orientation="vertical" aria-labelledby="options-menu"> <div class="lui-action-menu__option " data-action="click->pubsub#publish" data-pubsub-unique-id-param="multiple_image_image_pokemon_49_full" data-pubsub-action-param="openFilePicker"> <div class="lui-action-menu__option-text cursor-default"> <i class="fa-regular fa-arrows-rotate"></i> <span>Upload new image</span> </div> </div> <div class="lui-action-menu__option " data-action="click->pubsub#publish" data-pubsub-unique-id-param="multiple_image_image_pokemon_49_full" data-pubsub-action-param="detachImage"> <div class="lui-action-menu__option-text cursor-default"> <i class="fa-regular fa-trash"></i> <span>Remove image</span> </div> </div> </div> </div> </div> </div> <input accept="image/jpeg,image/png,image/webp" class="hidden" data-images-target="file" data-action="change->images#previewAndSubmit" data-direct-upload-url="https://loopos-ui.theloop.pt/rails/active_storage/direct_uploads" type="file" name="file" id="file" /> <input name="files[][]" type="hidden" value="" autocomplete="off" /><input accept="image/jpeg,image/png,image/webp" multiple="multiple" class="hidden" data-images-target="fileMultiple" data-action="change->images#previewAndSubmitMultiple" data-direct-upload-url="https://loopos-ui.theloop.pt/rails/active_storage/direct_uploads" type="file" name="files[][]" id="files[]" /> <input type="submit" name="commit" value="Save" data-images-target="submit" data-disable-with="Save" class="hidden" /> </form> </div> </div> <span class="lui-image__error" data-images-target="error">Error message</span> </div> </turbo-frame> </div> <div> <turbo-frame id="multiple_image_full"> <div data-controller="images" data-images-editable-value="false" data-images-with-attached-value="false" data-images-turbo-frame-id-value="multiple_image_full" data-images-unique-id-value="multiple_image_full" data-images-list-view-value="false" data-images-has-many-value="false" data-images-force-new-value="false" data-images-urls-value="{"attach":"/loopos_ui/images","detach":"/loopos_ui/images"}"> <div class="lui-image lui-image--full lui-image--rounded" data-images-target="imageComponent" data-action="pubsub:action@window->images#executeAction"> <div role="status" class="hidden lui-image__loader" data-images-target="loader"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny lui-button--disabled w-fit w-fit" data-controller="lui--button" disabled="disabled"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-spinner" data-lui--button-target="leadingIcon"></i> </button> </div> <img class="hidden lui-image__image" data-images-target="image" src="" /> <div class="lui-image__placeholder flex" data-images-target="placeholder"> <div class="lui-icon h-[16px] w-[16px]"> <i class="fa-regular fa-image lui-icon__icon" style="font-size: 16px; color: white;"></i> </div> </div> </div> <span class="lui-image__error" data-images-target="error">Error message</span> </div> </turbo-frame> </div> <div> <turbo-frame id="multiple_image_image_pokemon_1_full"> <div data-controller="images" data-images-editable-value="true" data-images-with-attached-value="false" data-images-turbo-frame-id-value="multiple_image_image_pokemon_1_full" data-images-unique-id-value="multiple_image_image_pokemon_1_full" data-images-list-view-value="false" data-images-has-many-value="false" data-images-force-new-value="false" data-images-urls-value="{"attach":"/loopos_ui/images","detach":"/loopos_ui/images"}"> <div class="lui-image lui-image--full lui-image--rounded" data-images-target="imageComponent" data-action="pubsub:action@window->images#executeAction"> <div role="status" class="hidden lui-image__loader" data-images-target="loader"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny lui-button--disabled w-fit w-fit" data-controller="lui--button" disabled="disabled"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-spinner" data-lui--button-target="leadingIcon"></i> </button> </div> <img class="hidden lui-image__image" data-images-target="image" src="" /> <div class="lui-image__placeholder lui-image__placeholder--editable flex" data-images-target="placeholder"> <div class="lui-icon h-[16px] w-[16px]"> <i class="fa-regular fa-image lui-icon__icon" style="font-size: 16px; color: white;"></i> </div> </div> <div class="overflow-visible lui-image__image-edit"> <form data-images-target="form" enctype="multipart/form-data" action="#" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="TeUpVyBITfQRA_yEyGtgDZrKodJGTgJB6jXeA7AcWwmYtO6f3rPAQYDVI0rC3u4rYo_yQd8WpV-uAGsZKoKLlw" autocomplete="off" /> <input type="hidden" name="authenticity_token" id="authenticity_token" value="if8i-yZNOCW97xyLIW9aFxOuGCaRZGu_vUVOtP_3L0JyUnDDGYcXnhv_LW_pXsZ2V4j6bAKQVVwfdb0K85O4rQ" autocomplete="off" /> <input type="hidden" name="context" id="context" value="uraBpAGIG6jzrXhj0EFbuxvdXyP9qkonwd/j2cfC3VcQYigr/b5uzAw+UwDZJ3fkMYad6uo0hYhB0fuh+5VvU1a6Qb4NdS1mwZNxQs+QQKe/rY3ajpsZ3ydZ5FgM0xMhoCwsmkPARg==--iHXVDHHYS6BmV6oh--jMFFBRyEgACdSY/0eeKqtg==" autocomplete="off" /> <div class="hidden" data-images-target="noImageUploader"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny w-fit w-fit" data-controller="lui--button" data-action="click->images#openFilePicker"> <div class="lui-tooltip hidden" data-controller="tooltips" data-tooltips-tippy-target-id-value="" data-tooltips-position-value="top" data-tooltips-interactive-value="false" > <div class="lui-tooltip__title"> Upload image here </div> </div> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-upload" data-lui--button-target="leadingIcon"></i> </button> </div> <div class="hidden" data-images-target="withImageUploader"> <div data-controller="action-menu" data-action="modal:open@window->action-menu#disableTippy modal:close@window->action-menu#enableTippy" class="lui-action-menu"> <div data-action-menu-target="trigger"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny w-fit w-fit" data-controller="lui--button" type="button"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-ellipsis-vertical" data-lui--button-target="leadingIcon"></i> </button> </div> <div data-action-menu-target="menu" class="hidden lui-action-menu__wrapper" data-controller="modal form-submit pubsub"> <div class="lui-action-menu__options" role="menu" aria-orientation="vertical" aria-labelledby="options-menu"> <div class="lui-action-menu__option " data-action="click->pubsub#publish" data-pubsub-unique-id-param="multiple_image_image_pokemon_1_full" data-pubsub-action-param="openFilePicker"> <div class="lui-action-menu__option-text cursor-default"> <i class="fa-regular fa-arrows-rotate"></i> <span>Upload new image</span> </div> </div> <div class="lui-action-menu__option " data-action="click->pubsub#publish" data-pubsub-unique-id-param="multiple_image_image_pokemon_1_full" data-pubsub-action-param="detachImage"> <div class="lui-action-menu__option-text cursor-default"> <i class="fa-regular fa-trash"></i> <span>Remove image</span> </div> </div> </div> </div> </div> </div> <input accept="image/jpeg,image/png,image/webp" class="hidden" data-images-target="file" data-action="change->images#previewAndSubmit" data-direct-upload-url="https://loopos-ui.theloop.pt/rails/active_storage/direct_uploads" type="file" name="file" id="file" /> <input name="files[][]" type="hidden" value="" autocomplete="off" /><input accept="image/jpeg,image/png,image/webp" multiple="multiple" class="hidden" data-images-target="fileMultiple" data-action="change->images#previewAndSubmitMultiple" data-direct-upload-url="https://loopos-ui.theloop.pt/rails/active_storage/direct_uploads" type="file" name="files[][]" id="files[]" /> <input type="submit" name="commit" value="Save" data-images-target="submit" data-disable-with="Save" class="hidden" /> </form> </div> </div> <span class="lui-image__error" data-images-target="error">Error message</span> </div> </turbo-frame> </div> <div> Default </div> <div> <turbo-frame id="multiple_image_image_pokemon_49_full"> <div data-controller="images" data-images-editable-value="true" data-images-with-attached-value="true" data-images-turbo-frame-id-value="multiple_image_image_pokemon_49_full" data-images-unique-id-value="multiple_image_image_pokemon_49_full" data-images-list-view-value="false" data-images-has-many-value="false" data-images-force-new-value="false" data-images-urls-value="{"attach":"/loopos_ui/images","detach":"/loopos_ui/images"}"> <div class="lui-image lui-image--full lui-image--rounded" data-images-target="imageComponent" data-action="pubsub:action@window->images#executeAction"> <div role="status" class="hidden lui-image__loader" data-images-target="loader"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny lui-button--disabled w-fit w-fit" data-controller="lui--button" disabled="disabled"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-spinner" data-lui--button-target="leadingIcon"></i> </button> </div> <img class="lui-image__image" data-images-target="image" data-blob-id="12" src="https://loopos-ui.theloop.pt/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTIsInB1ciI6ImJsb2JfaWQifX0=--6acfc7725e9eb862920b12bce8fb24b56b8faf16/metapod.png" /> <div class="lui-image__placeholder lui-image__placeholder--editable hidden" data-images-target="placeholder"> <div class="lui-icon h-[16px] w-[16px]"> <i class="fa-regular fa-image lui-icon__icon" style="font-size: 16px; color: white;"></i> </div> </div> <div class="overflow-visible lui-image__image-edit"> <form data-images-target="form" enctype="multipart/form-data" action="#" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="_bLH4wy5I7tswAalJf67MtoOc0Y8av-yWfi9FPY5cUoo4wAr8kKuDv0W2WsvSzUUIksg1aUyWKwdzQgObKeh1A" autocomplete="off" /> <input type="hidden" name="authenticity_token" id="authenticity_token" value="-yktiVV2kKk1qb-53epiO5timubp7SxZswNZTmeTA_QAhH-xary_EpO5jl0V2_5a30R4rHoZEroRM6rwa_eUGw" autocomplete="off" /> <input type="hidden" name="context" id="context" value="C2Mirtoa8dby99sJv0YFQKyXJnE6Z0LzYdFzcVmTKjaXTzSF4a9farOip6/AB1R0E7FcScreWKdHvorrF0jrjCf9cLYl0VpzZKabbRhJREOvLP438StB/qS0iu7MFVA8NtitBJHv7Jw=--ynJ9CxDg0p6RTc5S--cIfhpB3qIN3KRlChdngwTg==" autocomplete="off" /> <div class="hidden" data-images-target="noImageUploader"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny w-fit w-fit" data-controller="lui--button" data-action="click->images#openFilePicker"> <div class="lui-tooltip hidden" data-controller="tooltips" data-tooltips-tippy-target-id-value="" data-tooltips-position-value="top" data-tooltips-interactive-value="false" > <div class="lui-tooltip__title"> Upload image here </div> </div> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-upload" data-lui--button-target="leadingIcon"></i> </button> </div> <div class="hidden" data-images-target="withImageUploader"> <div data-controller="action-menu" data-action="modal:open@window->action-menu#disableTippy modal:close@window->action-menu#enableTippy" class="lui-action-menu"> <div data-action-menu-target="trigger"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny w-fit w-fit" data-controller="lui--button" type="button"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-ellipsis-vertical" data-lui--button-target="leadingIcon"></i> </button> </div> <div data-action-menu-target="menu" class="hidden lui-action-menu__wrapper" data-controller="modal form-submit pubsub"> <div class="lui-action-menu__options" role="menu" aria-orientation="vertical" aria-labelledby="options-menu"> <div class="lui-action-menu__option " data-action="click->pubsub#publish" data-pubsub-unique-id-param="multiple_image_image_pokemon_49_full" data-pubsub-action-param="openFilePicker"> <div class="lui-action-menu__option-text cursor-default"> <i class="fa-regular fa-arrows-rotate"></i> <span>Upload new image</span> </div> </div> <div class="lui-action-menu__option " data-action="click->pubsub#publish" data-pubsub-unique-id-param="multiple_image_image_pokemon_49_full" data-pubsub-action-param="detachImage"> <div class="lui-action-menu__option-text cursor-default"> <i class="fa-regular fa-trash"></i> <span>Remove image</span> </div> </div> </div> </div> </div> </div> <input accept="image/jpeg,image/png,image/webp" class="hidden" data-images-target="file" data-action="change->images#previewAndSubmit" data-direct-upload-url="https://loopos-ui.theloop.pt/rails/active_storage/direct_uploads" type="file" name="file" id="file" /> <input name="files[][]" type="hidden" value="" autocomplete="off" /><input accept="image/jpeg,image/png,image/webp" multiple="multiple" class="hidden" data-images-target="fileMultiple" data-action="change->images#previewAndSubmitMultiple" data-direct-upload-url="https://loopos-ui.theloop.pt/rails/active_storage/direct_uploads" type="file" name="files[][]" id="files[]" /> <input type="submit" name="commit" value="Save" data-images-target="submit" data-disable-with="Save" class="hidden" /> </form> </div> </div> <span class="lui-image__error" data-images-target="error">Error message</span> </div> </turbo-frame> </div> <div> <turbo-frame id="multiple_image_small"> <div data-controller="images" data-images-editable-value="false" data-images-with-attached-value="false" data-images-turbo-frame-id-value="multiple_image_small" data-images-unique-id-value="multiple_image_small" data-images-list-view-value="false" data-images-has-many-value="false" data-images-force-new-value="false" data-images-urls-value="{"attach":"/loopos_ui/images","detach":"/loopos_ui/images"}"> <div class="lui-image lui-image--small" data-images-target="imageComponent" data-action="pubsub:action@window->images#executeAction"> <div role="status" class="hidden lui-image__loader" data-images-target="loader"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny lui-button--disabled w-fit w-fit" data-controller="lui--button" disabled="disabled"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-spinner" data-lui--button-target="leadingIcon"></i> </button> </div> <img class="hidden lui-image__image" data-images-target="image" src="" /> <div class="lui-image__placeholder flex" data-images-target="placeholder"> <div class="lui-icon h-[16px] w-[16px]"> <i class="fa-regular fa-image lui-icon__icon" style="font-size: 16px; color: white;"></i> </div> </div> </div> <span class="lui-image__error" data-images-target="error">Error message</span> </div> </turbo-frame> </div> <div> <turbo-frame id="multiple_image_image_pokemon_1_small"> <div data-controller="images" data-images-editable-value="true" data-images-with-attached-value="false" data-images-turbo-frame-id-value="multiple_image_image_pokemon_1_small" data-images-unique-id-value="multiple_image_image_pokemon_1_small" data-images-list-view-value="false" data-images-has-many-value="false" data-images-force-new-value="false" data-images-urls-value="{"attach":"/loopos_ui/images","detach":"/loopos_ui/images"}"> <div class="lui-image lui-image--small" data-images-target="imageComponent" data-action="pubsub:action@window->images#executeAction"> <div role="status" class="hidden lui-image__loader" data-images-target="loader"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny lui-button--disabled w-fit w-fit" data-controller="lui--button" disabled="disabled"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-spinner" data-lui--button-target="leadingIcon"></i> </button> </div> <img class="hidden lui-image__image" data-images-target="image" src="" /> <div class="lui-image__placeholder lui-image__placeholder--editable flex" data-images-target="placeholder"> <div class="lui-icon h-[16px] w-[16px]"> <i class="fa-regular fa-image lui-icon__icon" style="font-size: 16px; color: white;"></i> </div> </div> <div class="overflow-visible lui-image__image-edit"> <form data-images-target="form" enctype="multipart/form-data" action="#" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="2DizKnP1q-7AGiI7YYTwx3c0TNqyj1y91k9wC0qvuBoNaXTijQ4mW1HM_fVrMX7hj3EfSSvX-6OSesUR0DFohA" autocomplete="off" /> <input type="hidden" name="authenticity_token" id="authenticity_token" value="UelKJSqEdWamhyy_jk2lTTQ3YQcyDKzzyixtmPyRb4KqRBgdFU5a3QCXHVtGfDkscBGDTaH4khBoHJ4m8PX4bQ" autocomplete="off" /> <input type="hidden" name="context" id="context" value="xNDAukWspS689tNdu//9qO2LAd6YkjMtnQc5sDL+pKYWDi2uCaZP3pCyxqcQelihfeVfVZ8Y++xPyqGhL2yt2yycvPRiNCW3iGactz0ktt6a3Nohtu8R/sVv/NgwsP9ewIpsl7pUcw==--8Z0y6slcsKtA35TS--lfMUfjKiEW9dugRmSBPiOQ==" autocomplete="off" /> <div class="hidden" data-images-target="noImageUploader"> <button class="lui-button lui-button--neutral--tertiary lui-button--size-tiny w-fit w-fit" data-controller="lui--button" data-action="click->images#openFilePicker"> <div class="lui-tooltip hidden" data-controller="tooltips" data-tooltips-tippy-target-id-value="" data-tooltips-position-value="top" data-tooltips-interactive-value="false" > <div class="lui-tooltip__title"> Upload image here </div> </div> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-upload" data-lui--button-target="leadingIcon"></i> </button> </div> <div class="hidden" data-images-target="withImageUploader"> <div data-controller="action-menu" data-action="modal:open@window->action-menu#disableTippy modal:close@window->action-menu#enableTippy" class="lui-action-menu"> <div data-action-menu-target="trigger"> <button class="lui-button lui-button--neutral--tertiary lui-button--size-tiny w-fit w-fit" data-controller="lui--button" type="button"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-ellipsis-vertical" data-lui--button-target="leadingIcon"></i> </button> </div> <div data-action-menu-target="menu" class="hidden lui-action-menu__wrapper" data-controller="modal form-submit pubsub"> <div class="lui-action-menu__options" role="menu" aria-orientation="vertical" aria-labelledby="options-menu"> <div class="lui-action-menu__option " data-action="click->pubsub#publish" data-pubsub-unique-id-param="multiple_image_image_pokemon_1_small" data-pubsub-action-param="openFilePicker"> <div class="lui-action-menu__option-text cursor-default"> <i class="fa-regular fa-arrows-rotate"></i> <span>Upload new image</span> </div> </div> <div class="lui-action-menu__option " data-action="click->pubsub#publish" data-pubsub-unique-id-param="multiple_image_image_pokemon_1_small" data-pubsub-action-param="detachImage"> <div class="lui-action-menu__option-text cursor-default"> <i class="fa-regular fa-trash"></i> <span>Remove image</span> </div> </div> </div> </div> </div> </div> <input accept="image/jpeg,image/png,image/webp" class="hidden" data-images-target="file" data-action="change->images#previewAndSubmit" data-direct-upload-url="https://loopos-ui.theloop.pt/rails/active_storage/direct_uploads" type="file" name="file" id="file" /> <input name="files[][]" type="hidden" value="" autocomplete="off" /><input accept="image/jpeg,image/png,image/webp" multiple="multiple" class="hidden" data-images-target="fileMultiple" data-action="change->images#previewAndSubmitMultiple" data-direct-upload-url="https://loopos-ui.theloop.pt/rails/active_storage/direct_uploads" type="file" name="files[][]" id="files[]" /> <input type="submit" name="commit" value="Save" data-images-target="submit" data-disable-with="Save" class="hidden" /> </form> </div> </div> <span class="lui-image__error" data-images-target="error">Error message</span> </div> </turbo-frame> </div> <div> Default </div> <div> <turbo-frame id="multiple_image_image_pokemon_49_small"> <div data-controller="images" data-images-editable-value="true" data-images-with-attached-value="true" data-images-turbo-frame-id-value="multiple_image_image_pokemon_49_small" data-images-unique-id-value="multiple_image_image_pokemon_49_small" data-images-list-view-value="false" data-images-has-many-value="false" data-images-force-new-value="false" data-images-urls-value="{"attach":"/loopos_ui/images","detach":"/loopos_ui/images"}"> <div class="lui-image lui-image--small" data-images-target="imageComponent" data-action="pubsub:action@window->images#executeAction"> <div role="status" class="hidden lui-image__loader" data-images-target="loader"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny lui-button--disabled w-fit w-fit" data-controller="lui--button" disabled="disabled"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-spinner" data-lui--button-target="leadingIcon"></i> </button> </div> <img class="lui-image__image" data-images-target="image" data-blob-id="12" src="https://loopos-ui.theloop.pt/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTIsInB1ciI6ImJsb2JfaWQifX0=--6acfc7725e9eb862920b12bce8fb24b56b8faf16/metapod.png" /> <div class="lui-image__placeholder lui-image__placeholder--editable hidden" data-images-target="placeholder"> <div class="lui-icon h-[16px] w-[16px]"> <i class="fa-regular fa-image lui-icon__icon" style="font-size: 16px; color: white;"></i> </div> </div> <div class="overflow-visible lui-image__image-edit"> <form data-images-target="form" enctype="multipart/form-data" action="#" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="REqVO7-ikXjGef9rCdjmnDqfmvo631O5vfzLeTcVmH-RG1LzQVkczVevIKUDbWi6wtrJaaOH9Kf5yX5jrYtI4Q" autocomplete="off" /> <input type="hidden" name="authenticity_token" id="authenticity_token" value="VUuPfZn9Z8Fv1_jx_kvKCxa8Wf7Q1pxa5WzpNxMRR_Su5t1FpjdIesnHyRU2elZqUpq7tEMiorlHXBqJH3XQGw" autocomplete="off" /> <input type="hidden" name="context" id="context" value="B2EwzbkCxdniEaC5s19V623ODJaLcEP50ATpDlRmHTJq/qfJ6qoaBFLy5CzwWNbHZEFQg6vA45cM0CfrVIfXz/kDkt/iyiwpATAQpaxq26W/ziHKYsV7AKewIkB194Lx5g66danHyR8=--sxRxMozoJpmv7g67--gwGgSFsJ6TCOKOTYeMQO/A==" autocomplete="off" /> <div class="hidden" data-images-target="noImageUploader"> <button class="lui-button lui-button--neutral--tertiary lui-button--size-tiny w-fit w-fit" data-controller="lui--button" data-action="click->images#openFilePicker"> <div class="lui-tooltip hidden" data-controller="tooltips" data-tooltips-tippy-target-id-value="" data-tooltips-position-value="top" data-tooltips-interactive-value="false" > <div class="lui-tooltip__title"> Upload image here </div> </div> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-upload" data-lui--button-target="leadingIcon"></i> </button> </div> <div class="hidden" data-images-target="withImageUploader"> <div data-controller="action-menu" data-action="modal:open@window->action-menu#disableTippy modal:close@window->action-menu#enableTippy" class="lui-action-menu"> <div data-action-menu-target="trigger"> <button class="lui-button lui-button--neutral--tertiary lui-button--size-tiny w-fit w-fit" data-controller="lui--button" type="button"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-ellipsis-vertical" data-lui--button-target="leadingIcon"></i> </button> </div> <div data-action-menu-target="menu" class="hidden lui-action-menu__wrapper" data-controller="modal form-submit pubsub"> <div class="lui-action-menu__options" role="menu" aria-orientation="vertical" aria-labelledby="options-menu"> <div class="lui-action-menu__option " data-action="click->pubsub#publish" data-pubsub-unique-id-param="multiple_image_image_pokemon_49_small" data-pubsub-action-param="openFilePicker"> <div class="lui-action-menu__option-text cursor-default"> <i class="fa-regular fa-arrows-rotate"></i> <span>Upload new image</span> </div> </div> <div class="lui-action-menu__option " data-action="click->pubsub#publish" data-pubsub-unique-id-param="multiple_image_image_pokemon_49_small" data-pubsub-action-param="detachImage"> <div class="lui-action-menu__option-text cursor-default"> <i class="fa-regular fa-trash"></i> <span>Remove image</span> </div> </div> </div> </div> </div> </div> <input accept="image/jpeg,image/png,image/webp" class="hidden" data-images-target="file" data-action="change->images#previewAndSubmit" data-direct-upload-url="https://loopos-ui.theloop.pt/rails/active_storage/direct_uploads" type="file" name="file" id="file" /> <input name="files[][]" type="hidden" value="" autocomplete="off" /><input accept="image/jpeg,image/png,image/webp" multiple="multiple" class="hidden" data-images-target="fileMultiple" data-action="change->images#previewAndSubmitMultiple" data-direct-upload-url="https://loopos-ui.theloop.pt/rails/active_storage/direct_uploads" type="file" name="files[][]" id="files[]" /> <input type="submit" name="commit" value="Save" data-images-target="submit" data-disable-with="Save" class="hidden" /> </form> </div> </div> <span class="lui-image__error" data-images-target="error">Error message</span> </div> </turbo-frame> </div> <div> <turbo-frame id="multiple_image_small"> <div data-controller="images" data-images-editable-value="false" data-images-with-attached-value="false" data-images-turbo-frame-id-value="multiple_image_small" data-images-unique-id-value="multiple_image_small" data-images-list-view-value="false" data-images-has-many-value="false" data-images-force-new-value="false" data-images-urls-value="{"attach":"/loopos_ui/images","detach":"/loopos_ui/images"}"> <div class="lui-image lui-image--small lui-image--rounded" data-images-target="imageComponent" data-action="pubsub:action@window->images#executeAction"> <div role="status" class="hidden lui-image__loader" data-images-target="loader"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny lui-button--disabled w-fit w-fit" data-controller="lui--button" disabled="disabled"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-spinner" data-lui--button-target="leadingIcon"></i> </button> </div> <img class="hidden lui-image__image" data-images-target="image" src="" /> <div class="lui-image__placeholder flex" data-images-target="placeholder"> <div class="lui-icon h-[16px] w-[16px]"> <i class="fa-regular fa-image lui-icon__icon" style="font-size: 16px; color: white;"></i> </div> </div> </div> <span class="lui-image__error" data-images-target="error">Error message</span> </div> </turbo-frame> </div> <div> <turbo-frame id="multiple_image_image_pokemon_1_small"> <div data-controller="images" data-images-editable-value="true" data-images-with-attached-value="false" data-images-turbo-frame-id-value="multiple_image_image_pokemon_1_small" data-images-unique-id-value="multiple_image_image_pokemon_1_small" data-images-list-view-value="false" data-images-has-many-value="false" data-images-force-new-value="false" data-images-urls-value="{"attach":"/loopos_ui/images","detach":"/loopos_ui/images"}"> <div class="lui-image lui-image--small lui-image--rounded" data-images-target="imageComponent" data-action="pubsub:action@window->images#executeAction"> <div role="status" class="hidden lui-image__loader" data-images-target="loader"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny lui-button--disabled w-fit w-fit" data-controller="lui--button" disabled="disabled"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-spinner" data-lui--button-target="leadingIcon"></i> </button> </div> <img class="hidden lui-image__image" data-images-target="image" src="" /> <div class="lui-image__placeholder lui-image__placeholder--editable flex" data-images-target="placeholder"> <div class="lui-icon h-[16px] w-[16px]"> <i class="fa-regular fa-image lui-icon__icon" style="font-size: 16px; color: white;"></i> </div> </div> <div class="overflow-visible lui-image__image-edit"> <form data-images-target="form" enctype="multipart/form-data" action="#" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="AK9uqCrU9Q-WsUHTXIs8nhxaltcCSTgwQoJw-vFjggLV_qlg1C94ugdnnh1WPrK45B_FRJsRny4Gt8Xga_1SnA" autocomplete="off" /> <input type="hidden" name="authenticity_token" id="authenticity_token" value="x1H5u_Ea1y3jSGvh-d_gfpui2ndW_dSZDMCEwiMivD48_KuDztD4lkVYWgUx7nwf34Q4PcUJ6nqu8Hd8L0Yr0Q" autocomplete="off" /> <input type="hidden" name="context" id="context" value="FXqY0jjwnDbabr/1eziMM18upKG9wBkTHtKtbjyBYlqISEHE2GhPAvD2AK4WQJiGsLzS0f9H6FrTRvdixk1/LZhJEi+0X6UHDJBrRiG4gR3KRLcwBuZZLQ1FDBxNT0fAUWG76D69Sw==--3afYeCpoYVcwGLFb--U499Uvvv2ra187ajypsgFA==" autocomplete="off" /> <div class="hidden" data-images-target="noImageUploader"> <button class="lui-button lui-button--neutral--tertiary lui-button--size-tiny w-fit w-fit" data-controller="lui--button" data-action="click->images#openFilePicker"> <div class="lui-tooltip hidden" data-controller="tooltips" data-tooltips-tippy-target-id-value="" data-tooltips-position-value="top" data-tooltips-interactive-value="false" > <div class="lui-tooltip__title"> Upload image here </div> </div> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-upload" data-lui--button-target="leadingIcon"></i> </button> </div> <div class="hidden" data-images-target="withImageUploader"> <div data-controller="action-menu" data-action="modal:open@window->action-menu#disableTippy modal:close@window->action-menu#enableTippy" class="lui-action-menu"> <div data-action-menu-target="trigger"> <button class="lui-button lui-button--neutral--tertiary lui-button--size-tiny w-fit w-fit" data-controller="lui--button" type="button"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-ellipsis-vertical" data-lui--button-target="leadingIcon"></i> </button> </div> <div data-action-menu-target="menu" class="hidden lui-action-menu__wrapper" data-controller="modal form-submit pubsub"> <div class="lui-action-menu__options" role="menu" aria-orientation="vertical" aria-labelledby="options-menu"> <div class="lui-action-menu__option " data-action="click->pubsub#publish" data-pubsub-unique-id-param="multiple_image_image_pokemon_1_small" data-pubsub-action-param="openFilePicker"> <div class="lui-action-menu__option-text cursor-default"> <i class="fa-regular fa-arrows-rotate"></i> <span>Upload new image</span> </div> </div> <div class="lui-action-menu__option " data-action="click->pubsub#publish" data-pubsub-unique-id-param="multiple_image_image_pokemon_1_small" data-pubsub-action-param="detachImage"> <div class="lui-action-menu__option-text cursor-default"> <i class="fa-regular fa-trash"></i> <span>Remove image</span> </div> </div> </div> </div> </div> </div> <input accept="image/jpeg,image/png,image/webp" class="hidden" data-images-target="file" data-action="change->images#previewAndSubmit" data-direct-upload-url="https://loopos-ui.theloop.pt/rails/active_storage/direct_uploads" type="file" name="file" id="file" /> <input name="files[][]" type="hidden" value="" autocomplete="off" /><input accept="image/jpeg,image/png,image/webp" multiple="multiple" class="hidden" data-images-target="fileMultiple" data-action="change->images#previewAndSubmitMultiple" data-direct-upload-url="https://loopos-ui.theloop.pt/rails/active_storage/direct_uploads" type="file" name="files[][]" id="files[]" /> <input type="submit" name="commit" value="Save" data-images-target="submit" data-disable-with="Save" class="hidden" /> </form> </div> </div> <span class="lui-image__error" data-images-target="error">Error message</span> </div> </turbo-frame> </div> <div> Default </div> <div> <turbo-frame id="multiple_image_image_pokemon_49_small"> <div data-controller="images" data-images-editable-value="true" data-images-with-attached-value="true" data-images-turbo-frame-id-value="multiple_image_image_pokemon_49_small" data-images-unique-id-value="multiple_image_image_pokemon_49_small" data-images-list-view-value="false" data-images-has-many-value="false" data-images-force-new-value="false" data-images-urls-value="{"attach":"/loopos_ui/images","detach":"/loopos_ui/images"}"> <div class="lui-image lui-image--small lui-image--rounded" data-images-target="imageComponent" data-action="pubsub:action@window->images#executeAction"> <div role="status" class="hidden lui-image__loader" data-images-target="loader"> <button class="lui-button lui-button--neutral--secondary lui-button--size-tiny lui-button--disabled w-fit w-fit" data-controller="lui--button" disabled="disabled"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-spinner" data-lui--button-target="leadingIcon"></i> </button> </div> <img class="lui-image__image" data-images-target="image" data-blob-id="12" src="https://loopos-ui.theloop.pt/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTIsInB1ciI6ImJsb2JfaWQifX0=--6acfc7725e9eb862920b12bce8fb24b56b8faf16/metapod.png" /> <div class="lui-image__placeholder lui-image__placeholder--editable hidden" data-images-target="placeholder"> <div class="lui-icon h-[16px] w-[16px]"> <i class="fa-regular fa-image lui-icon__icon" style="font-size: 16px; color: white;"></i> </div> </div> <div class="overflow-visible lui-image__image-edit"> <form data-images-target="form" enctype="multipart/form-data" action="#" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="0eaym0wnkNcMHYpf9HEDerZTxst17_ALrufcQ_rEFagEt3VTstwdYp3LVZH-xI1cThaVWOy3VxXq0mlZYFrFNg" autocomplete="off" /> <input type="hidden" name="authenticity_token" id="authenticity_token" value="aAg3S2oCbsyJz5FmXMqmTiH7g63-76tT9W6utQqPzaCTpWVzVchBdy_foIKU-zovZd1h520blbBXXl0LButaTw" autocomplete="off" /> <input type="hidden" name="context" id="context" value="AQKWcTnO83GkGsYM5pq3JnsqdNSDNuGdAAKa2QTr+w2VM9mKkT/i7qbM3SWfpL2jYBxaAExJMQnNiKAy+hqmOTQr130pp+Pe4XvxPlugk79IVgTU6o5HQv4aafQ4Y1iuddshM6bNx94=--tl4mk9PbgxONe0Yx--2laCOsEPNlHxOHV3KRNH5g==" autocomplete="off" /> <div class="hidden" data-images-target="noImageUploader"> <button class="lui-button lui-button--neutral--tertiary lui-button--size-tiny w-fit w-fit" data-controller="lui--button" data-action="click->images#openFilePicker"> <div class="lui-tooltip hidden" data-controller="tooltips" data-tooltips-tippy-target-id-value="" data-tooltips-position-value="top" data-tooltips-interactive-value="false" > <div class="lui-tooltip__title"> Upload image here </div> </div> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-upload" data-lui--button-target="leadingIcon"></i> </button> </div> <div class="hidden" data-images-target="withImageUploader"> <div data-controller="action-menu" data-action="modal:open@window->action-menu#disableTippy modal:close@window->action-menu#enableTippy" class="lui-action-menu"> <div data-action-menu-target="trigger"> <button class="lui-button lui-button--neutral--tertiary lui-button--size-tiny w-fit w-fit" data-controller="lui--button" type="button"> <i class="lui-button__icon lui-button__icon--tiny fa-regular fa-ellipsis-vertical" data-lui--button-target="leadingIcon"></i> </button> </div> <div data-action-menu-target="menu" class="hidden lui-action-menu__wrapper" data-controller="modal form-submit pubsub"> <div class="lui-action-menu__options" role="menu" aria-orientation="vertical" aria-labelledby="options-menu"> <div class="lui-action-menu__option " data-action="click->pubsub#publish" data-pubsub-unique-id-param="multiple_image_image_pokemon_49_small" data-pubsub-action-param="openFilePicker"> <div class="lui-action-menu__option-text cursor-default"> <i class="fa-regular fa-arrows-rotate"></i> <span>Upload new image</span> </div> </div> <div class="lui-action-menu__option " data-action="click->pubsub#publish" data-pubsub-unique-id-param="multiple_image_image_pokemon_49_small" data-pubsub-action-param="detachImage"> <div class="lui-action-menu__option-text cursor-default"> <i class="fa-regular fa-trash"></i> <span>Remove image</span> </div> </div> </div> </div> </div> </div> <input accept="image/jpeg,image/png,image/webp" class="hidden" data-images-target="file" data-action="change->images#previewAndSubmit" data-direct-upload-url="https://loopos-ui.theloop.pt/rails/active_storage/direct_uploads" type="file" name="file" id="file" /> <input name="files[][]" type="hidden" value="" autocomplete="off" /><input accept="image/jpeg,image/png,image/webp" multiple="multiple" class="hidden" data-images-target="fileMultiple" data-action="change->images#previewAndSubmitMultiple" data-direct-upload-url="https://loopos-ui.theloop.pt/rails/active_storage/direct_uploads" type="file" name="files[][]" id="files[]" /> <input type="submit" name="commit" value="Save" data-images-target="submit" data-disable-with="Save" class="hidden" /> </form> </div> </div> <span class="lui-image__error" data-images-target="error">Error message</span> </div> </turbo-frame> </div> </div></div>No Usage documentation to display.
<% # Mock data # Not attached, but editable pokemon = Pokemon.first # pokemon.image.detach if pokemon.image.attached? pokemon_args = { model: pokemon, association: :image, } pokemon_attached = Pokemon.last pokemon_attached.image.attach( io: File.open(Rails.root.join('test/fixtures/files/metapod.png')), filename: 'metapod.png', content_type: 'image/png') pokemon_attached_args = { model: pokemon_attached, association: :image, }%><div> <h1>Single Image</h1> <%# BIG %> <div class="grid grid-rows-4 grid-cols-4 items-center justify-items-center gap-2"> <%# Square %> <div> <%# Empty %> <%= render LooposUi::V2::Image.new %> </div> <div> <%= render LooposUi::V2::Image.new(**pokemon_args, editable: true) %> </div> <div> <%= render LooposUi::V2::Image.new(image_url: image_url("loopos_ui/backgrounds/core.png")) %> </div> <div> <%= render LooposUi::V2::Image.new(**pokemon_attached_args, editable: true) %> </div> <%# Circle %> <div> <%= render LooposUi::V2::Image.new(rounded: true) %> </div> <div> <%= render LooposUi::V2::Image.new(**pokemon_args, editable: true, rounded: true) %> </div> <div> Default </div> <div> <%= render LooposUi::V2::Image.new(**pokemon_attached_args, editable: true, rounded: true) %> </div> <%# SMALL %> <%# Square %> <div> <%= render LooposUi::V2::Image.new(size: :small) %> </div> <div> <%= render LooposUi::V2::Image.new(**pokemon_args, editable: true, size: :small) %> </div> <div> Default </div> <div> <%= render LooposUi::V2::Image.new(**pokemon_attached_args, editable: true, size: :small) %> </div> <%# Circle %> <div> <%= render LooposUi::V2::Image.new(size: :small, rounded: true) %> </div> <div> <%= render LooposUi::V2::Image.new(**pokemon_args, editable: true, size: :small, rounded: true) %> </div> <div> Default </div> <div> <%= render LooposUi::V2::Image.new(**pokemon_attached_args, editable: true, size: :small, rounded: true) %> </div> </div></div>No notes provided.
No params configured.
Description
The Image V2 component is an enhanced version of the base Image component that provides image upload and management capabilities. It supports both single and multiple image handling, with options for different sizes, shapes, and editing capabilities.
Arguments
| Property | Default | Description |
|---|---|---|
model |
nil |
ActiveRecord model that the image belongs to |
association |
nil |
Name of the image association on the model (:image or :images) |
editable |
false |
Enables image upload and management controls |
size |
:full |
Size of the image container (:full or :small) |
rounded |
false |
Makes the image circular when true |
image_url |
nil |
Direct URL to an image (alternative to model association) |
accept |
configurable | Array of accepted file types (e.g., [:jpeg, :png, "image/svg+xml"]), or :all for all registerer image MIME types |
list_view |
false |
Enables list view mode for multiple images |
path |
loopos_ui.images_path |
Path to backend controller. Use when you want to extend the current LoopOS UI one |
accept get its default value from LooposUi.config.image_default_accept_formats, by default it accepts png, jpeg and webp.
You can change this in the initializer.
When extending the LoopOS UI images controller, set the ActiveSupport::Callbacks needed in your own controller, and then call run_callbacks around the block you want your changes to act. These callbacks have to be named :create or :destroy, since those are the hooks available. Each of them allowing the programmer to insert operations before and after their respective methods.
# Your custom controllerclass LooposUi::ExtendedImagesController < LooposUi::ImagesController #We can declare using Lambda, or methods set_callback :create, :before, -> { Rails.logger.info "Before" } set_callback :destroy, :after, :foo def foo Rails.logger.info "After" endendFeatures
Single Image Upload
- Default placeholder for empty state
- Upload button appears on hover when editable
- Supports direct image URLs
- Configurable accepted file types
Multiple Image Upload
- Supports ActiveStorage has_many relationships
- Optional list view mode
- Bulk upload capability
- Image deletion functionality
Styling Options
- Two size options: full and small
- Optional rounded/circular display
- Responsive design
- Hover states for interactive elements
Validations
The accept option is used to validate the file type during upload.
- In the frontend: checking the declared MIME type
- In the backend: checking the actual uploaded content type
In the case of multiple upload, the accept option is applied to each uploaded file, and the upload will fail if any of the files does not match the declared MIME type.
Leaving the accept option empty will allow all image MIME types to be uploaded (image/*), and in the backend will check if the uploaded MIME type is an image.
Note: This component uses it's own controller to handle the upload, using Direct Uploads. It also modifies the blob directly, so the model validation will not trigger. In a future version, this can change.