feat: add S3-compatible storage provider (MinIO, Ceph, R2, etc.)

Adds a new 'S3-Compatible Storage' provider that works with any
S3-API-compatible object storage service, including MinIO, Ceph,
Cloudflare R2, Backblaze B2, and others.

Changes:
- New provider class: classes/providers/storage/s3-compatible-provider.php
  - Provider key: s3compatible
  - Reads user-configured endpoint URL from settings
  - Uses path-style URL access (required by most S3-compatible services)
  - Supports credentials via AS3CF_S3COMPAT_ACCESS_KEY_ID /
    AS3CF_S3COMPAT_SECRET_ACCESS_KEY wp-config.php constants
  - Disables AWS-specific features (Block Public Access, Object Ownership)
- New provider SVG icons (s3compatible.svg, -link.svg, -round.svg)
- Registered provider in main plugin class with endpoint setting support
- Updated StorageProviderSubPage to show endpoint URL input for S3-compatible
- Built pro settings bundle with rollup (Svelte 4.2.19)
- Added package.json and updated rollup.config.mjs for pro-only builds
This commit is contained in:
2026-03-03 12:30:18 +01:00
commit 3248cbb029
2086 changed files with 359427 additions and 0 deletions

View File

@@ -0,0 +1,8 @@
<svg id="ekdzsxfyrt9t1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 22 22" shape-rendering="geometricPrecision" text-rendering="geometricPrecision"><style><![CDATA[#ekdzsxfyrt9t7_ts {animation: ekdzsxfyrt9t7_ts__ts 2000ms linear 1 normal forwards}@keyframes ekdzsxfyrt9t7_ts__ts { 0% {transform: translate(11px,11px) scale(0.500000,0.500000);animation-timing-function: cubic-bezier(0.420000,0,1,1)} 30% {transform: translate(11px,11px) scale(1,1)} 100% {transform: translate(11px,11px) scale(1,1)} }#ekdzsxfyrt9t7 {animation: ekdzsxfyrt9t7_c_o 2000ms linear 1 normal forwards}@keyframes ekdzsxfyrt9t7_c_o { 0% {opacity: 0} 20% {opacity: 1} 100% {opacity: 1} }#ekdzsxfyrt9t9 {
animation-name: ekdzsxfyrt9t9_c_o, ekdzsxfyrt9t9_s_do;
animation-duration: 2000ms;
animation-fill-mode: forwards;
animation-timing-function: linear;
animation-direction: normal;
animation-iteration-count: 1;
}@keyframes ekdzsxfyrt9t9_c_o { 0% {opacity: 1} 20% {opacity: 1} 100% {opacity: 1} }@keyframes ekdzsxfyrt9t9_s_do { 0% {stroke-dashoffset: 3.890000} 40% {stroke-dashoffset: 3.890000;animation-timing-function: cubic-bezier(0.420000,0,1,1)} 55% {stroke-dashoffset: 0} 100% {stroke-dashoffset: 0} }#ekdzsxfyrt9t10 {animation: ekdzsxfyrt9t10_s_do 2000ms linear 1 normal forwards}@keyframes ekdzsxfyrt9t10_s_do { 0% {stroke-dashoffset: 8.250000} 55% {stroke-dashoffset: 8.250000;animation-timing-function: cubic-bezier(0.420000,0,1,1)} 70% {stroke-dashoffset: 0} 100% {stroke-dashoffset: 0} }]]></style><defs><circle id="ekdzsxfyrt9t2" r="11"/></defs><g id="ekdzsxfyrt9t3"><g id="ekdzsxfyrt9t4"><mask id="ekdzsxfyrt9t5" mask-type="luminance"><use id="ekdzsxfyrt9t6" width="22" height="22" xlink:href="#ekdzsxfyrt9t2" transform="matrix(1 0 0 1 11 11)" fill="rgb(255,255,255)" fill-rule="evenodd" stroke="none" stroke-width="1"/></mask></g><g id="ekdzsxfyrt9t7_ts" transform="translate(11,11) scale(0.500000,0.500000)"><use id="ekdzsxfyrt9t7" width="22" height="22" xlink:href="#ekdzsxfyrt9t2" transform="translate(0,0)" opacity="0" fill="rgb(82,170,89)" fill-rule="evenodd" stroke="none" stroke-width="1" stroke-dashoffset="88" stroke-dasharray="88"/></g><g id="ekdzsxfyrt9t8" transform="matrix(1 0 0 1 7 8)"><path id="ekdzsxfyrt9t9" d="M0,3.083631L2.750000,5.833631" fill="none" fill-rule="evenodd" stroke="rgb(255,255,255)" stroke-width="2.750000" stroke-linecap="round" stroke-linejoin="round" stroke-dashoffset="3.890000" stroke-dasharray="3.890000"/><line id="ekdzsxfyrt9t10" x1="2.750000" y1="5.833631" x2="8.583631" y2="0" fill="none" fill-rule="evenodd" stroke="rgb(255,255,255)" stroke-width="2.750000" stroke-linecap="round" stroke-linejoin="round" stroke-dashoffset="8.250000" stroke-dasharray="8.250000"/></g></g></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB