feat: Add comprehensive documentation suite and reorganize project structure

- Created complete documentation in docs/ directory
- Added PROJECT_OVERVIEW.md with feature highlights and getting started guide
- Added ARCHITECTURE.md with system design and technical details
- Added SECURITY.md with comprehensive security implementation guide
- Added DEVELOPMENT.md with development workflows and best practices
- Added DEPLOYMENT.md with production deployment instructions
- Added API.md with complete REST API documentation
- Added CONTRIBUTING.md with contribution guidelines
- Added CHANGELOG.md with version history and migration notes
- Reorganized all documentation files into docs/ directory for better organization
- Updated README.md with proper documentation links and quick navigation
- Enhanced project structure with professional documentation standards
This commit is contained in:
SamiAhmed7777
2025-10-21 00:39:45 -07:00
commit 0b7e2d0a5b
6080 changed files with 1332936 additions and 0 deletions

View File

@@ -0,0 +1,379 @@
/*!
* Cropper v2.2.5
* https://github.com/fengyuanchen/cropper
*
* Copyright (c) 2014-2016 Fengyuan Chen and contributors
* Released under the MIT license
*
* Date: 2016-01-18T05:42:29.639Z
*/
.cropper-container {
font-size: 0;
line-height: 0;
position: relative;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
direction: ltr !important;
-ms-touch-action: none;
touch-action: none;
-webkit-tap-highlight-color: transparent;
-webkit-touch-callout: none;
}
.cropper-container img {
display: block;
width: 100%;
min-width: 0 !important;
max-width: none !important;
height: 100%;
min-height: 0 !important;
max-height: none !important;
image-orientation: 0deg !important;
}
.cropper-wrap-box,
.cropper-canvas,
.cropper-drag-box,
.cropper-crop-box,
.cropper-modal {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.cropper-wrap-box {
overflow: hidden;
}
.cropper-drag-box {
opacity: 0;
background-color: #fff;
filter: alpha(opacity=0);
}
.cropper-modal {
opacity: .5;
background-color: #000;
filter: alpha(opacity=50);
}
.cropper-view-box {
display: block;
overflow: hidden;
width: 100%;
height: 100%;
outline: 1px solid #39f;
outline-color: rgba(51, 153, 255, .75);
}
.cropper-dashed {
position: absolute;
display: block;
opacity: .5;
border: 0 dashed #eee;
filter: alpha(opacity=50);
}
.cropper-dashed.dashed-h {
top: 33.33333%;
left: 0;
width: 100%;
height: 33.33333%;
border-top-width: 1px;
border-bottom-width: 1px;
}
.cropper-dashed.dashed-v {
top: 0;
left: 33.33333%;
width: 33.33333%;
height: 100%;
border-right-width: 1px;
border-left-width: 1px;
}
.cropper-center {
position: absolute;
top: 50%;
left: 50%;
display: block;
width: 0;
height: 0;
opacity: .75;
filter: alpha(opacity=75);
}
.cropper-center:before,
.cropper-center:after {
position: absolute;
display: block;
content: ' ';
background-color: #eee;
}
.cropper-center:before {
top: 0;
left: -3px;
width: 7px;
height: 1px;
}
.cropper-center:after {
top: -3px;
left: 0;
width: 1px;
height: 7px;
}
.cropper-face,
.cropper-line,
.cropper-point {
position: absolute;
display: block;
width: 100%;
height: 100%;
opacity: .1;
filter: alpha(opacity=10);
}
.cropper-face {
top: 0;
left: 0;
background-color: #fff;
}
.cropper-line {
background-color: #39f;
}
.cropper-line.line-e {
top: 0;
right: -3px;
width: 5px;
cursor: e-resize;
}
.cropper-line.line-n {
top: -3px;
left: 0;
height: 5px;
cursor: n-resize;
}
.cropper-line.line-w {
top: 0;
left: -3px;
width: 5px;
cursor: w-resize;
}
.cropper-line.line-s {
bottom: -3px;
left: 0;
height: 5px;
cursor: s-resize;
}
.cropper-point {
width: 5px;
height: 5px;
opacity: .75;
background-color: #39f;
filter: alpha(opacity=75);
}
.cropper-point.point-e {
top: 50%;
right: -3px;
margin-top: -3px;
cursor: e-resize;
}
.cropper-point.point-n {
top: -3px;
left: 50%;
margin-left: -3px;
cursor: n-resize;
}
.cropper-point.point-w {
top: 50%;
left: -3px;
margin-top: -3px;
cursor: w-resize;
}
.cropper-point.point-s {
bottom: -3px;
left: 50%;
margin-left: -3px;
cursor: s-resize;
}
.cropper-point.point-ne {
top: -3px;
right: -3px;
cursor: ne-resize;
}
.cropper-point.point-nw {
top: -3px;
left: -3px;
cursor: nw-resize;
}
.cropper-point.point-sw {
bottom: -3px;
left: -3px;
cursor: sw-resize;
}
.cropper-point.point-se {
right: -3px;
bottom: -3px;
width: 20px;
height: 20px;
cursor: se-resize;
opacity: 1;
filter: alpha(opacity=100);
}
.cropper-point.point-se:before {
position: absolute;
right: -50%;
bottom: -50%;
display: block;
width: 200%;
height: 200%;
content: ' ';
opacity: 0;
background-color: #39f;
filter: alpha(opacity=0);
}
@media (min-width: 768px) {
.cropper-point.point-se {
width: 15px;
height: 15px;
}
}
@media (min-width: 992px) {
.cropper-point.point-se {
width: 10px;
height: 10px;
}
}
@media (min-width: 1200px) {
.cropper-point.point-se {
width: 5px;
height: 5px;
opacity: .75;
filter: alpha(opacity=75);
}
}
.cropper-invisible {
opacity: 0;
filter: alpha(opacity=0);
}
.cropper-bg {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC');
}
.cropper-hide {
position: absolute;
display: block;
width: 0;
height: 0;
}
.cropper-hidden {
display: none !important;
}
.cropper-move {
cursor: move;
}
.cropper-crop {
cursor: crosshair;
}
.cropper-disabled .cropper-drag-box,
.cropper-disabled .cropper-face,
.cropper-disabled .cropper-line,
.cropper-disabled .cropper-point {
cursor: not-allowed;
}

View File

@@ -0,0 +1,162 @@
if (!HTMLCanvasElement.prototype.toBlob) {
Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {
value: function (callback, type, quality) {
type = 'image/jpeg';
quality = 1;
var binStr = atob(this.toDataURL(type, quality).split(',')[1]),
len = binStr.length,
arr = new Uint8Array(len);
for (var i = 0; i < len; i++) {
arr[i] = binStr.charCodeAt(i);
}
callback(new Blob([arr], {type: type || 'image/jpeg'}));
}
});
}
function pad(num, size) {
return ('000000000' + num).substr(-size);
}
String.prototype.chunk = function (n) {
var ret = [];
for (var i = 0, len = this.length; i < len; i += n) {
ret.push(this.substr(i, n))
}
return ret
};
$(document).ready(function() {
var $image = $(".cropper img");
$image.cropper({
aspectRatio: 512 / 85,
resizable: true,
rotatable: true,
responsive: true,
minCropBoxWidth: Math.round(2048),
minCropBoxHeight: Math.round(340),
done: function (data) {
}
});
var $inputImage = $('#fedit-image');
var URL = window.URL || window.webkitURL;
var blobURL;
if (URL) {
$inputImage.change(function () {
var files = this.files;
var file;
if (!$image.data('cropper')) {
return;
}
if (files && files.length) {
file = files[0];
if (/^image\/\w+$/.test(file.type)) {
blobURL = URL.createObjectURL(file);
$image.one('built.cropper', function () {
URL.revokeObjectURL(blobURL);
}).cropper('reset').cropper('replace', blobURL);
} else {
$body.tooltip('Please choose an image file.', 'warning');
}
}
});
} else {
$inputImage.prop('disabled', true).parent().addClass('disabled');
}
$("a[class='c-zoomin']").click(function () {
$image.cropper('zoom', '.1');
});
$("a[class='c-zoomout']").click(function () {
$image.cropper('zoom', '-.1');
});
$("a[class='c-moveup']").click(function () {
$image.cropper('move', '0', '-10');
});
$("a[class='c-movedown']").click(function () {
$image.cropper('move', '0', '10');
});
$("a[class='c-moveleft']").click(function () {
$image.cropper('move', '-10', '0');
});
$("a[class='c-moveright']").click(function () {
$image.cropper('move', '10', '0');
});
$("button[id='done']").click(function () {
if (typeof ($(".cropper-container").html()) != "undefined") {
$image.cropper('getCroppedCanvas').toBlob(function (blob) {
var reader = new window.FileReader();
reader.readAsDataURL(blob);
reader.onloadend = function () {
base64data = reader.result.replace('png', 'jpeg');
$("input[name='crop_data']").val(base64data);
$("#fedit-image-form").mask(" ");
jQuery.post(current_url + menu_section + "?s=channel-menu-entry3&do=save", $("#fedit-image-form").serialize(), function (data) {
window.location = current_url + menu_section + "?r=confirm";
return false;
});
}
});
} else {
}
});
$("button[id='update']").click(function () {
if (typeof ($(".cropper-container").html()) != "undefined") {
$image.cropper('getCroppedCanvas').toBlob(function (blob) {
var reader = new window.FileReader();
reader.readAsDataURL(blob);
reader.onloadend = function () {
t = $("#crop-string").val();
base64data = reader.result.replace('png', 'jpeg');
$("input[name='crop_data']").val(base64data);
$(".fancybox-inner").mask(" ");
jQuery.post(current_url + menu_section + "?s=channel-menu-entry3&do=save_crop&t=" + t, $("#fedit-image-form").serialize(), function (data) {
if (t > 24) {
$(".fancybox-inner #upload-response").html(data);
$(".fancybox-inner").unmask("");
} else {
window.location = current_url + menu_section + "?r=confirm";
return false;
}
});
}
});
} else {
}
});
$("button[id='default']").click(function () {
t = $("#crop-string").val();
$(".fancybox-inner").mask(" ");
jQuery.post(current_url + menu_section + "?s=channel-menu-entry3&do=save_default&t=" + t, $("#fedit-image-form").serialize(), function (data) {
$("#channel-own-photos img").removeClass("own");
$("#channel-own-photos #li-" + t + " img").addClass("own");
$(".fancybox-inner #upload-response").html(data);
$(".fancybox-inner").unmask("");
});
});
});

View File

@@ -0,0 +1 @@
if(!HTMLCanvasElement.prototype.toBlob){Object.defineProperty(HTMLCanvasElement.prototype,"toBlob",{value:function(callback,type,quality){type="image/jpeg";quality=1;var binStr=atob(this.toDataURL(type,quality).split(",")[1]),len=binStr.length,arr=new Uint8Array(len);for(var i=0;i<len;i++){arr[i]=binStr.charCodeAt(i)}callback(new Blob([arr],{type:type||"image/jpeg"}))}})}function pad(num,size){return("000000000"+num).substr(-size)}String.prototype.chunk=function(n){var ret=[];for(var i=0,len=this.length;i<len;i+=n){ret.push(this.substr(i,n))}return ret};$(document).ready(function(){var $image=$(".cropper img");$image.cropper({aspectRatio:512/85,resizable:true,rotatable:true,responsive:true,minCropBoxWidth:Math.round(2048),minCropBoxHeight:Math.round(340),done:function(data){}});var $inputImage=$("#fedit-image");var URL=window.URL||window.webkitURL;var blobURL;if(URL){$inputImage.change(function(){var files=this.files;var file;if(!$image.data("cropper")){return}if(files&&files.length){file=files[0];if(/^image\/\w+$/.test(file.type)){blobURL=URL.createObjectURL(file);$image.one("built.cropper",function(){URL.revokeObjectURL(blobURL)}).cropper("reset").cropper("replace",blobURL)}else{$body.tooltip("Please choose an image file.","warning")}}})}else{$inputImage.prop("disabled",true).parent().addClass("disabled")}$("a[class='c-zoomin']").click(function(){$image.cropper("zoom",".1")});$("a[class='c-zoomout']").click(function(){$image.cropper("zoom","-.1")});$("a[class='c-moveup']").click(function(){$image.cropper("move","0","-10")});$("a[class='c-movedown']").click(function(){$image.cropper("move","0","10")});$("a[class='c-moveleft']").click(function(){$image.cropper("move","-10","0")});$("a[class='c-moveright']").click(function(){$image.cropper("move","10","0")});$("button[id='done']").click(function(){if(typeof $(".cropper-container").html()!="undefined"){$image.cropper("getCroppedCanvas").toBlob(function(blob){var reader=new window.FileReader;reader.readAsDataURL(blob);reader.onloadend=function(){base64data=reader.result.replace("png","jpeg");$("input[name='crop_data']").val(base64data);$("#fedit-image-form").mask(" ");jQuery.post(current_url+menu_section+"?s=channel-menu-entry3&do=save",$("#fedit-image-form").serialize(),function(data){window.location=current_url+menu_section+"?r=confirm";return false})}})}else{}});$("button[id='update']").click(function(){if(typeof $(".cropper-container").html()!="undefined"){$image.cropper("getCroppedCanvas").toBlob(function(blob){var reader=new window.FileReader;reader.readAsDataURL(blob);reader.onloadend=function(){t=$("#crop-string").val();base64data=reader.result.replace("png","jpeg");$("input[name='crop_data']").val(base64data);$(".fancybox-inner").mask(" ");jQuery.post(current_url+menu_section+"?s=channel-menu-entry3&do=save_crop&t="+t,$("#fedit-image-form").serialize(),function(data){if(t>24){$(".fancybox-inner #upload-response").html(data);$(".fancybox-inner").unmask("")}else{window.location=current_url+menu_section+"?r=confirm";return false}})}})}else{}});$("button[id='default']").click(function(){t=$("#crop-string").val();$(".fancybox-inner").mask(" ");jQuery.post(current_url+menu_section+"?s=channel-menu-entry3&do=save_default&t="+t,$("#fedit-image-form").serialize(),function(data){$("#channel-own-photos img").removeClass("own");$("#channel-own-photos #li-"+t+" img").addClass("own");$(".fancybox-inner #upload-response").html(data);$(".fancybox-inner").unmask("")})})});

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,9 @@
/*!
* Cropper v2.2.5
* https://github.com/fengyuanchen/cropper
*
* Copyright (c) 2014-2016 Fengyuan Chen and contributors
* Released under the MIT license
*
* Date: 2016-01-18T05:42:29.639Z
*/.cropper-container{font-size:0;line-height:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;direction:ltr!important;-ms-touch-action:none;touch-action:none;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}.cropper-container img{display:block;width:100%;min-width:0!important;max-width:none!important;height:100%;min-height:0!important;max-height:none!important;image-orientation:0deg!important}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{position:absolute;top:0;right:0;bottom:0;left:0}.cropper-wrap-box{overflow:hidden}.cropper-drag-box{opacity:0;background-color:#fff;filter:alpha(opacity=0)}.cropper-dashed,.cropper-modal{opacity:.5;filter:alpha(opacity=50)}.cropper-modal{background-color:#000}.cropper-view-box{display:block;overflow:hidden;width:100%;height:100%;outline:#39f solid 1px;outline-color:rgba(51,153,255,.75)}.cropper-dashed{position:absolute;display:block;border:0 dashed #eee}.cropper-dashed.dashed-h{top:33.33333%;left:0;width:100%;height:33.33333%;border-top-width:1px;border-bottom-width:1px}.cropper-dashed.dashed-v{top:0;left:33.33333%;width:33.33333%;height:100%;border-right-width:1px;border-left-width:1px}.cropper-center{position:absolute;top:50%;left:50%;display:block;width:0;height:0;opacity:.75;filter:alpha(opacity=75)}.cropper-center:after,.cropper-center:before{position:absolute;display:block;content:' ';background-color:#eee}.cropper-center:before{top:0;left:-3px;width:7px;height:1px}.cropper-center:after{top:-3px;left:0;width:1px;height:7px}.cropper-face,.cropper-line,.cropper-point{position:absolute;display:block;width:100%;height:100%;opacity:.1;filter:alpha(opacity=10)}.cropper-face{top:0;left:0;background-color:#fff}.cropper-line,.cropper-point{background-color:#39f}.cropper-line.line-e{top:0;right:-3px;width:5px;cursor:e-resize}.cropper-line.line-n{top:-3px;left:0;height:5px;cursor:n-resize}.cropper-line.line-w{top:0;left:-3px;width:5px;cursor:w-resize}.cropper-line.line-s{bottom:-3px;left:0;height:5px;cursor:s-resize}.cropper-point{width:5px;height:5px;opacity:.75;filter:alpha(opacity=75)}.cropper-point.point-e{top:50%;right:-3px;margin-top:-3px;cursor:e-resize}.cropper-point.point-n{top:-3px;left:50%;margin-left:-3px;cursor:n-resize}.cropper-point.point-w{top:50%;left:-3px;margin-top:-3px;cursor:w-resize}.cropper-point.point-s{bottom:-3px;left:50%;margin-left:-3px;cursor:s-resize}.cropper-point.point-ne{top:-3px;right:-3px;cursor:ne-resize}.cropper-point.point-nw{top:-3px;left:-3px;cursor:nw-resize}.cropper-point.point-sw{bottom:-3px;left:-3px;cursor:sw-resize}.cropper-point.point-se{right:-3px;bottom:-3px;width:20px;height:20px;cursor:se-resize;opacity:1;filter:alpha(opacity=100)}.cropper-point.point-se:before{position:absolute;right:-50%;bottom:-50%;display:block;width:200%;height:200%;content:' ';opacity:0;background-color:#39f;filter:alpha(opacity=0)}@media (min-width:768px){.cropper-point.point-se{width:15px;height:15px}}@media (min-width:992px){.cropper-point.point-se{width:10px;height:10px}}@media (min-width:1200px){.cropper-point.point-se{width:5px;height:5px;opacity:.75;filter:alpha(opacity=75)}}.cropper-invisible{opacity:0;filter:alpha(opacity=0)}.cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}.cropper-hide{position:absolute;display:block;width:0;height:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}

10
f_scripts/shared/cropper/cropper.min.js vendored Normal file

File diff suppressed because one or more lines are too long