diff --git a/.cursor/rules/ms1reader-workflow.mdc b/.cursor/rules/ms1reader-workflow.mdc
index e75d3b0..c988df5 100644
--- a/.cursor/rules/ms1reader-workflow.mdc
+++ b/.cursor/rules/ms1reader-workflow.mdc
@@ -21,8 +21,9 @@ alwaysApply: true
- Développement sur branche **`dev`** ; **`master`** = référence prod.
- Le serveur = **déploiement uniquement** (pas de commits sur le serveur).
-- Flux : push Windows → Gitea → webhook → `deploy_dev.php` → `deploy_dev.sh` (`fetch` + `reset --hard` + `clean -fd`).
-- Tout fichier nécessaire sur le serveur après un deploy (ex. `deploy_dev.php`) **doit être versionné**.
+- Sur le serveur Reader, le dépôt Git est à **`$HOME`** (`/home/ms1reader`) : `ci4app/` et `public_html/` sont frères ; `www` → symlink vers `public_html`.
+- Flux : push Windows → Gitea → webhook → `public_html/deploy_dev.php` → `~/deploy/deploy_dev.sh` (`fetch` + `reset --hard` + `clean -fd` **limité** à `ci4app` et `public_html`).
+- Tout fichier nécessaire après un deploy (ex. `public_html/deploy_dev.php`) **doit être versionné**.
## Incohérences repérées
diff --git a/.gitignore b/.gitignore
index 2084b34..b71d6a2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,4 @@
-# Secrets / env local
+# Secrets / env local (serveur: souvent /home/ms1reader/.env)
ci4app/.env
.env
.env.*
@@ -30,9 +30,39 @@ ci4app/writable/uploads/*
ci4app/writable/debugbar/
ci4app/writable/*.json
-# Composer (si vendor est installé localement)
+# Composer
ci4app/vendor/
# Node
node_modules/
dist/
+
+# Doublons locaux / symlink serveur (www -> public_html)
+www/
+home/
+
+# cPanel / compte hébergement (git root = $HOME)
+mail/
+ssl/
+logs/
+tmp/
+etc/
+.cagefs/
+.caldav/
+.cache/
+.cl.selector/
+.cpanel/
+.htpasswds/
+.koality/
+.spamassassin/
+.trash/
+public_ftp/
+access-logs
+ci4writable/
+reader/
+.wp-toolkit-identifier
+.imunify_patch_id
+.myimunify_id
+.bash_history
+.mysql_history
+.lastlogin
diff --git a/deploy/deploy_dev.sh.example b/deploy/deploy_dev.sh.example
index a5ad4d0..722d413 100644
--- a/deploy/deploy_dev.sh.example
+++ b/deploy/deploy_dev.sh.example
@@ -1,18 +1,25 @@
#!/bin/bash
-# À placer sur le serveur : ~/deploy/deploy_dev.sh
-# Le dépôt applicatif est typiquement ~/public_html (ou le docroot Git).
+# Emplacement serveur : /home/ms1reader/deploy/deploy_dev.sh
+# chmod +x ~/deploy/deploy_dev.sh
#
-# Philosophie MS1 : serveur = déploiement uniquement (pas de commits).
-# Nécessite un remote Gitea (souvent http://127.0.0.1:3000/stephan/ms1readerv4.git).
+# Git root = $HOME (ci4app + public_html sont frères, pas un clone dans public_html).
+# IMPORTANT : ne jamais `git clean -fd` sur tout le home (mail, ssl, etc.).
set -euo pipefail
-REPO_DIR="${HOME}/public_html"
+REPO_DIR="${HOME}"
BRANCH="dev"
cd "$REPO_DIR"
git fetch origin "$BRANCH"
git reset --hard "FETCH_HEAD"
-git clean -fd
+# Nettoyer uniquement les chemins applicatifs versionnés
+git clean -fd -- ci4app public_html
+
+# Garantir le symlink cPanel (au cas où un vieux commit aurait créé un dossier www)
+if [ ! -L www ]; then
+ rm -rf www
+ ln -s public_html www
+fi
echo "Deploy OK: $(git rev-parse --short HEAD) on ${BRANCH}"
diff --git a/home/ms1reader/ci4app/public/.htaccess b/home/ms1reader/ci4app/public/.htaccess
deleted file mode 100644
index 997a9b8..0000000
--- a/home/ms1reader/ci4app/public/.htaccess
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-# php -- BEGIN cPanel-generated handler, do not edit
-# Set the “ea-php81” package as the default “PHP” programming language.
-
- AddHandler application/x-httpd-ea-php81 .php .php8 .phtml
-
-# php -- END cPanel-generated handler, do not edit
diff --git a/deploy_dev.php b/public_html/deploy_dev.php
similarity index 51%
rename from deploy_dev.php
rename to public_html/deploy_dev.php
index 942a753..5bf6905 100644
--- a/deploy_dev.php
+++ b/public_html/deploy_dev.php
@@ -3,9 +3,7 @@
* Webhook Gitea → déploiement branche dev.
* Appelé par le webhook ; exécute le script shell hors webroot.
*
- * IMPORTANT : ce fichier DOIT être versionné, sinon `git clean -fd`
- * le supprime à chaque déploiement.
- *
- * Ajuster le chemin si le user cPanel / home diffère sur le serveur.
+ * Emplacement : public_html/ (docroot) pour le webhook.
+ * IMPORTANT : versionné — sinon un clean le supprimerait.
*/
echo shell_exec('/home/ms1reader/deploy/deploy_dev.sh 2>&1');
diff --git a/www/.htaccess b/www/.htaccess
deleted file mode 100644
index fe76833..0000000
--- a/www/.htaccess
+++ /dev/null
@@ -1,56 +0,0 @@
-# Disable directory browsing
-Options -Indexes
-
-# ----------------------------------------------------------------------
-# Rewrite engine
-# ----------------------------------------------------------------------
-
-# Turning on the rewrite engine is necessary for the following rules and features.
-# FollowSymLinks must be enabled for this to work.
-
- Options +FollowSymlinks
- RewriteEngine On
-
- # If you installed CodeIgniter in a subfolder, you will need to
- # change the following line to match the subfolder you need.
- # http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase
- # RewriteBase /
-
- # Redirect Trailing Slashes...
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteCond %{REQUEST_URI} (.+)/$
- RewriteRule ^ %1 [L,R=301]
-
- # Rewrite "www.example.com -> example.com"
- RewriteCond %{HTTPS} !=on
- RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
- RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
-
- # Checks to see if the user is attempting to access a valid file,
- # such as an image or css document, if this isn't true it sends the
- # request to the front controller, index.php
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteRule ^([\s\S]*)$ index.php/$1 [L,NC,QSA]
-
- # Ensure Authorization header is passed along
- RewriteCond %{HTTP:Authorization} .
- RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
-
-
-
- # If we don't have mod_rewrite installed, all 404's
- # can be sent to index.php, and everything works as normal.
- ErrorDocument 404 index.php
-
-
-# Disable server signature start
-ServerSignature Off
-# Disable server signature end
-
-# php -- BEGIN cPanel-generated handler, do not edit
-# Set the “ea-php81” package as the default “PHP” programming language.
-
- AddHandler application/x-httpd-ea-php81___lsphp .php .php8 .phtml
-
-# php -- END cPanel-generated handler, do not edit
diff --git a/www/check_paths.php b/www/check_paths.php
deleted file mode 100644
index 9f7ab0d..0000000
--- a/www/check_paths.php
+++ /dev/null
@@ -1,3 +0,0 @@
-systemDirectory . '/Boot.php';
-
-exit(Boot::bootWeb($paths));
diff --git a/www/phpinfo.php b/www/phpinfo.php
deleted file mode 100644
index bfd863b..0000000
--- a/www/phpinfo.php
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis eget pharetra
- felis, sed ullamcorper dui. Sed et elementum neque. Vestibulum pellente viverra
- ultrices. Etiam justo augue, vehicula ac gravida a, interdum sit amet nisl.
- Integer vitae nisi id nibh dictum mollis in vitae tortor.
-
-
-
-
-
-
-
-
Work
-
-
-
- Occupation
-
Full stack developer
-
-
- Jobs
-
-
-
-
- Self-Employed
-
-
- 2018 - Now
-
-
-
-
- Codemoore
-
-
- 2014 - 2018
-
-
-
-
-
-
-
-
-
-
-
-
-
Skills
-
-
- Product Development
- Webflow
- Management
- Figma
- Web Design
- Html / Css
- Angular
- Figma
- React
- Vue
-
- That’s a wonderful design. Lorem ipsum dolor sit amet, consectetur
- adipiscing elit. Fusce et eleifend ligula. Fusce posuere in sapien ac
- facilisis. Etiam sit amet justo non felis ornare feugiat.
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin tincidunt,
- lacus ut blandit dapibus, justo lorem laoreet arcu, sit amet ultricies nunc
- lectus eget neque. Sed non mattis ipsum, sed convallis nunc. In hac
- habitasse platea dictumst. Quisque imperdiet, lacus id malesuada vestibulum,
- turpis metus pretium est, nec suscipit arcu ex sed elit.
-
-
- Praesent facilisis, sapien nec faucibus aliquet, arcu est mattis lorem, eget
- vestibulum risus mauris sit amet urna. Ut rhoncus ante eget orci vehicula,
- at accumsan felis rhoncus. Integer sagittis, erat ut euismod varius, justo
- mauris fringilla erat, et elementum metus augue a sapien. Donec sed lorem a
- justo dignissim condimentum nec ut libero.
-
- I want to set default theme to 'light' - I am unable to set the page theme
- to light using the HTML - so I modified the theme.bundle.js to default to
- 'light' - is there a better way to do this?
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
- tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
- quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
- cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat
- non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
- eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
- ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
- aliquip ex ea commodo consequat.
-
-
-
-
-
-
- 12:30PM
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Michael Smith
-
-
- From its medieval origins to the digital era
-
-
- From its medieval origins to the digital era, learn everything there is to know about the ubiquitous lorem ipsum passage.
-
-
-
-
-
-
- Yesterday
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- David Wilson
-
-
- Lorem ipsum, or lipsum as it is sometimes known
-
-
- Lorem ipsum, or lipsum as it is sometimes known, is dummy text used in laying out print, graphic or web designs. The passage is attributed to an unknown typesetter in the 15th century who is thought to have scrambled parts of Cicero's De Finibus Bonorum et Malorum for use in a type specimen book.
-
-
-
-
-
-
- 2d
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- E
-
- Emma Claire
-
-
- The passage is attributed to an unknown typesetter
-
-
- The passage is attributed to an unknown typesetter in the 15th century who is thought to have scrambled parts of Cicero's De Finibus Bonorum et Malorum for use in a type specimen book.
-
-
-
-
-
- 3d
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Sophia Anne White
-
-
- The passage experienced a surge in popularity during the 1960s
-
-
- The passage experienced a surge in popularity during the 1960s when Letraset used it on their dry-transfer sheets, and again during the 90s as desktop publishers bundled the text with their software.
-
-
-
-
-
-
- 4d
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Benjamin Joseph
-
-
- Until recently, the prevailing view assumed
-
-
- The placeholder text, beginning with the line “Lorem ipsum dolor sit amet, consectetur adipiscing elit”, looks like Latin because in its youth, centuries ago, it was Latin.
-
-
-
-
-
- 1w
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- David Wilson
-
-
- Lorem ipsum, or lipsum as it is sometimes known
-
-
- Lorem ipsum, or lipsum as it is sometimes known, is dummy text used in laying out print, graphic or web designs. The passage is attributed to an unknown typesetter in the 15th century who is thought to have scrambled parts of Cicero's De Finibus Bonorum et Malorum for use in a type specimen book.
-
-
-
-
-
-
- 2w
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- S
-
- Sarah Elizabeth Davis
-
-
- The passage is attributed to an unknown typesetter
-
-
- The passage is attributed to an unknown typesetter in the 15th century who is thought to have scrambled parts of Cicero's De Finibus Bonorum et Malorum for use in a type specimen book.
-
-
-
-
-
- 3w
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Olivia Rose
-
-
- The passage experienced a surge in popularity during the 1960s
-
-
- The passage experienced a surge in popularity during the 1960s when Letraset used it on their dry-transfer sheets, and again during the 90s as desktop publishers bundled the text with their software.
-
-
-
-
-
-
- 1m
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Matthew Thomas
-
-
- Until recently, the prevailing view assumed
-
-
- The placeholder text, beginning with the line “Lorem ipsum dolor sit amet, consectetur adipiscing elit”, looks like Latin because in its youth, centuries ago, it was Latin.
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
-
-
-
-
-
-
-<!--alert-->
-<div role="alert"
- class="flex gap-2.5 items-start px-4 py-2.5 rounded-lg bg-green-500/20 text-green-800 dark:text-green-200">
- <span class="icon-[lucide--database-zap] text-xl shrink-0 mt-1"></span>
- <div class="flex-grow">
- <span class="text-lg font-semibold">
- Database fetched successfully
- </span>
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
- magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat.
- </p>
- </div>
-</div>
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
- incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
- nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
- Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
- fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
- culpa qui officia deserunt mollit anim id est laborum.
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
- labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
- laboris nisi ut aliquip ex ea commodo consequat.
-
-
-
-
-
-<!--:Collapse trigger button:-->
-<button type="button" class="btn btn-default mb-2" data-bs-toggle="collapse" data-bs-target="#collapseBasic">Show
- collapse
-</button>
-<!--:Collapse:-->
-<div class="collapse" id="collapseBasic">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
- aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
-</div>
-
-
-
-
-
-
-
Show more/less
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
- labore et dolore magna aliqua Ut enim
-
-
- minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
- commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum
- dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
- culpa qui officia deserunt mollit anim id est laborum.
-
-
-
-
-
-
-
-
-<!--:Show more less content:-->
-<div>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
- labore et dolore magna aliqua Ut enim
- <!--:More content:-->
- <p class="collapse" id="collapseMore">
- minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
- commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum
- dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
- culpa qui officia deserunt mollit anim id est laborum.
- </p>
-</div>
-<!--:Button:-->
-<button class="border-b border-dashed border-zinc-200 cursor-pointer" data-bs-toggle="collapse" data-bs-target="#collapseMore">
- <span class="show-more text-primary inline-flex items-center">
- Show more <span class="icon-[lucide--plus]"></span>
- </span>
- <span class="show-less items-center">
- Show less <span class="icon-[iconoir--minus]"></span>
- </span>
-</button>
-
-
-
-
-
-
-
Group
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
- incididunt ut labore et dolore magna
- aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
- aliquip ex ea commodo consequat.
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
- incididunt ut labore et dolore magna
- aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
- aliquip ex ea commodo consequat.
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
- incididunt ut labore et dolore magna
- aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
- aliquip ex ea commodo consequat.
-
- Iconify is a open source
- icon sets which offers 200,000+ icons including different icons library. Raven theme uses Lucide icons from iconify -
- Lucide
- by Lucide Contributors
-
- Example
-
- Iconoir
-
-
-
-
Visit icons site > Select icon > Select CSS / TailwindCss from tabs > Copy and paste
-<!--:Modal trigger:-->
-<button type="button" class="btn btn-default" data-bs-toggle="modal" data-bs-target="#modalDefault">
- Show modal
-</button>
-
-<!--:Modal Default:-->
-<div id="modalDefault" role="dialog"
- class="modal fade fixed w-full h-full left-0 top-0" tabindex="-1">
- <div class="modal-dialog relative m-4 min-h-[calc(100%-2rem)] pointer-events-none">
- <!--:Modal content:-->
- <div
- class="modal-content relative max-w-[30rem] mx-auto bg-white dark:bg-zinc-900 rounded-xl w-full pointer-events-auto">
- <!--:Close:-->
- <button type="button"
- class="absolute right-2 top-2 btn btn-default !p-0 !rounded-full size-8"
- data-bs-dismiss="modal">
- <span class="icon-[lucide--x] text-xl"></span>
- </button>
- <div class="p-4 lg:p-6">
- <h5 class="text-lg mb-2">Modal Title</h5>
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
- labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
- laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
- voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat
- non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
- </p>
- </div>
- </div>
- </div>
-</div>
-
-
-
-
-
-
-
Full width
-
-
-
-
-
-
-
-<!--:Modal trigger:-->
-<button type="button" class="btn btn-default" data-bs-toggle="modal" data-bs-target="#modalFullWidth">
- Show modal
-</button>
-
-<!--:Modal Full Width:-->
-<div id="modalFullWidth" role="dialog"
- class="modal fade fixed w-full h-full left-0 top-0" tabindex="-1">
- <div class="modal-dialog relative m-4 min-h-[calc(100%-2rem)] pointer-events-none">
- <!--:Modal content:-->
- <div class="modal-content relative max-w-full mx-auto bg-white dark:bg-zinc-900 rounded-xl w-full pointer-events-auto">
- <!--:Close:-->
- <button type="button"
- class="absolute right-2 top-2 btn btn-default !p-0 !rounded-full size-8"
- data-bs-dismiss="modal">
- <span class="icon-[lucide--x] text-xl"></span>
- </button>
- <div class="p-4 lg:p-6">
- <h5 class="text-lg mb-2">Modal Title</h5>
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
- labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
- laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
- voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat
- non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
- </p>
- </div>
- </div>
- </div>
-</div>
-
-
-
-
-
-
-
Center aligned + scrollable
-
-
-
-
-
-
-
-<!--:Modal trigger:-->
-<button type="button" class="btn btn-default" data-bs-toggle="modal" data-bs-target="#modalCenter">
- Show modal
-</button>
-
-<!--:Modal Center + scroll:-->
-<div id="modalCenter" role="dialog" class="modal fixed w-full h-full left-0 top-0"
- tabindex="-1">
- <div class="modal-dialog relative flex items-center justify-center m-4 h-[calc(100vh-2rem)] pointer-events-none">
- <!--:Modal content:-->
- <div
- class="modal-content relative overflow-hidden max-w-[30rem] mx-auto bg-white dark:bg-zinc-900 rounded-xl w-full pointer-events-auto">
- <div class="p-4 border-b border-zinc-100 dark:border-zinc-800 flex items-center justify-between">
- <h5 class="text-lg">Modal Title</h5>
- <!--:Close:-->
- <button type="button"
- class="btn btn-default !p-0 !rounded-full size-8"
- data-bs-dismiss="modal">
- <span class="icon-[lucide--x] text-xl"></span>
- </button>
- </div>
- <div class="h-[60vh] overflow-y-auto p-4">
- <p class="mb-4 text-lg">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
- labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
- laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
- voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
- cupidatat
- non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
- </p>
- <p class="mb-4">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
- labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
- laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
- voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
- cupidatat
- non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
- </p>
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
- labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
- laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
- voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
- cupidatat
- non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
- </p>
- </div>
- </div>
- </div>
-</div>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Modal Title
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
- labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
- laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
- voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat
- non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Modal Title
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
- labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
- laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
- voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat
- non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
-
-
-
-
-
-
-
-
-
-
-
-
Modal Title
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
- labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
- laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
- voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
- cupidatat
- non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
- labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
- laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
- voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
- cupidatat
- non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
- labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
- laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
- voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
- cupidatat
- non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
- Some text as placeholder. In real life you can have the elements you have chosen. Like, text, images, lists, etc. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
-
-
-
-
-
-
-
-
-
Offcanvas large title
-
-
-
-
-
- Some text as placeholder. In real life you can have the elements you have chosen. Like, text, images, lists, etc. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
-
-
-
-
-
-
-
-
-
Offcanvas top title
-
-
-
-
-
- Some text as placeholder. In real life you can have the elements you have chosen. Like, text, images, lists, etc. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
-
-
-
-
-
-
-
-
-
Offcanvas bottom title
-
-
-
-
-
- Some text as placeholder. In real life you can have the elements you have chosen. Like, text, images, lists, etc. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
-<p>The quick brown fox jumps over the lazy dog.</p>
-
-<p class="underline">The quick brown fox jumps over the lazy dog.</p>
-
-<p class="italic">The quick brown fox jumps over the lazy dog.</p>
-
-<p class="overline">The quick brown fox jumps over the lazy dog.</p>
-
-<p class="line-through">The quick brown fox jumps over the lazy dog.</p>
-
-
-
-
-
-
-
Font weight
-
-
- Normal Default
-
The quick brown fox jumps over the lazy dog.
- Medium
-
The quick brown fox jumps over the lazy dog.
- Semibold
-
The quick brown fox jumps over the lazy dog.
- Bold
-
The quick brown fox jumps over the lazy dog.
-
-
-
-<p>The quick brown fox jumps over the lazy dog.</p>
-
-<p class="font-semibold">The quick brown fox jumps over the lazy dog.</p>
-
-<p class="font-semibold">The quick brown fox jumps over the lazy dog.</p>
-
-<p class="font-semibold">The quick brown fox jumps over the lazy dog.</p>
-
-
-
-
-
-
-
List
-
-
- list-disc
-
-
Now this is a story all about how, my life got flipped-turned upside down
-
Lorem ipsum is placeholder text commonly used in the graphic
-
Publishing industries for previewing layouts and visual mockups.
-
- list-decimal
-
-
Now this is a story all about how, my life got flipped-turned upside down
-
Lorem ipsum is placeholder text commonly used in the graphic
-
Publishing industries for previewing layouts and visual mockups.
-
- list-none
-
-
Now this is a story all about how, my life got flipped-turned upside down
-
Lorem ipsum is placeholder text commonly used in the graphic
-
Publishing industries for previewing layouts and visual mockups.
-
- Custom Icon
-
-
24/7 Support
-
Lifetime free updates
-
-
New demos weekly
-
-
-
-
-<ul class="list-disc">
- <li>Now this is a story all about how, my life got flipped-turned upside down</li>
- <li>Lorem ipsum is placeholder text commonly used in the graphic</li>
- <li>Publishing industries for previewing layouts and visual mockups.</li>
-</ul>
-
-<ul class="list-decimal">
- <li>Now this is a story all about how, my life got flipped-turned upside down</li>
- <li>Lorem ipsum is placeholder text commonly used in the graphic</li>
- <li>Publishing industries for previewing layouts and visual mockups.</li>
-</ul>
-
-<ul class="list-none">
- <li>Now this is a story all about how, my life got flipped-turned upside down</li>
- <li>Lorem ipsum is placeholder text commonly used in the graphic</li>
- <li>Publishing industries for previewing layouts and visual mockups.</li>
-</ul>
-
-<ul class="space-y-2">
- <li class="flex items-center">
- <span class="icon-[lucide--check] text-xl me-2 text-primary"></span>
- 24/7 Support
- </li>
- <li class="flex items-center">
- <span class="icon-[lucide--check] text-xl me-2 text-primary"></span>
- Lifetime free updates
- </li>
- <li class="flex items-center">
- <span class="icon-[lucide--check] text-xl me-2 text-primary"></span>
- New demos weekly
- </li>
-</ul>
-
-
-
-
-
-
-
Text overflow
-
-
- Truncate
-
The longest word in any of the major English language dictionaries
- is pneumonoultramicroscopicsilicovolcanoconiosis, a word that
- refers to a lung disease contracted from the inhalation of very fine silica particles,
- specifically from a volcano; medically, it is the same as silicosis.
- Ellipsis
-
- The longest word in any of the major English language dictionaries is pneumonoultramicroscopicsilicovolcanoconiosis, a word that refers
- to a lung disease contracted from the inhalation of very fine silica particles, specifically
- from a volcano; medically, it is the same as silicosis
-
- Line Clamp
-
- The longest word in any of the major English language dictionaries is a word that refers to a
- lung disease contracted from the inhalation of very fine silica particles, specifically from a
- volcano; medically, it is the same as silicosis
-
-
-
-
-
-<p class="max-w-xs truncate">The longest word in any of the major English language dictionaries is
- <span class="font-semibold">pneumonoultramicroscopicsilicovolcanoconiosis,</span>
- a word that refers to a lung disease
- contracted from the inhalation of very fine silica particles, specifically from a volcano; medically, it is the same
- as silicosis.</p>
-
-<p class="max-w-xs overflow-hidden text-ellipsis">
- The longest word in any of the major English language dictionaries is
- <span class="font-semibold">pneumonoultramicroscopicsilicovolcanoconiosis,</span>
- a word that refers to a lung disease
- contracted from the inhalation of very fine silica particles, specifically from a volcano; medically, it is the same
- as silicosis
-</p>
-
-<p class="max-w-xs overflow-hidden line-clamp-2">
- The longest word in any of the major English language dictionaries is a word that refers to a lung disease
- contracted from the inhalation of very fine silica particles, specifically from a volcano; medically, it is the same
- as silicosis
-</p>
-
-<!--:Import Google font of your choice in <head></head>:-->
-<link rel="preconnect" href="https://fonts.googleapis.com">
-<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
-<link href="https://fonts.googleapis.com/css2?family=Inter:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet">
-
-<!--:Update the font variable in css file:-->
---font-theme: "Inter", "system-ui", "sans-serif","Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
-
-
-
Primary theme Color
-
Open Css file and update the color values
-
-<!--:Change the values according to your brand color:-->
---color-primary:#42C088 [Main color];
---color-primary-deep:#32B379 [:Hover];
---color-primary-subtle:#42C0881f [Light, Keep the last 2 digits 1F with main color, or add your own primary dark];
-
- Info: Please note, the use of Node, Gulp and their advanced settings are totally optional. You can use and customize the template without using them too.
-
-
-
- First of all, make sure you have installed
- Node (LTS). If Node.js is already installed in your system, make sure the installed version is LTS and jump to step 2.
-
-
-
- Install the Gulp CLI: Open Terminal/Command Prompt and run the following command and wait until it finishes. If you have already installed Gulp CLI, you can skip this step.
-
-
-npm install --global gulp-cli
-
-
-
-
- Navigate to the Raven root directory and run following command to install our local dependencies listed in package.json.
-
-
-npm install
-
-
-
-
- Now, you are ready to run npm tasks, below command will start the server and watch the code using browsersync.
- Open http://localhost:3000/ to check your development 🚀
-
Learn modern web design from scratch to professional level
- UI UX
-
-
-
-
-
-
-
-
-
-
-
-
About this course
-
- This course covers everything you need to become a professional web designer. From
- HTML, CSS, JavaScript fundamentals to advanced responsive design, UI/UX best
- practices, and hands-on projects. Perfect for beginners and those looking to upgrade
- their skills ipsum dolor sit amet.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
- incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
- exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
- irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
- pariatur.
-
-
-
-
Course in numbers
-
-
-
-
Skill levels :
Beginners
-
-
-
-
-
Students :
4938
-
-
-
-
-
Lectures :
44
-
-
-
-
-
Language :
English
-
-
-
-
-
-
What You’ll Learn
-
-
Understand HTML5, CSS3, and JavaScript basics
-
Build modern responsive websites
-
Learn Flexbox & CSS Grid for layouts
-
Apply UI/UX principles in real projects
-
Work with design tools like Figma
-
Build a complete portfolio website
-
-
-
-
-
- Instructor
-
-
-
-
-
Emily doe
-
Front end developer
-
-
- 4.7 (3.5K)
-
-
-
-
-
-
-
-
Requirements
-
-
-
-
- No coding or design experience necessary
-
-
- Any computer works - Windows, macOS or Linux
-
-
- You don’t need to buy any software - we will use the best free code editor in the world
-
24" iMac® with Retina 4.5K display - Apple M1 8GB Memory - 256GB SSD -
- w/Touch ID (Latest Model) - Blue
-
CUPERTINO, CA , The M1 CPU allows Apple to deliver an all-new iMac with a lot
- more compact
- and impressively thin design. The new iMac delivers tremendous performance in an
- 11.5-millimeter-thin design with a stunning side profile that almost vanishes. iMac includes
- a 24-inch 4.5K Retina display with 11.3 million pixels, 500 nits of brightness, and over a
- billion colors, giving a beautiful and vivid viewing experience. It is available in a
- variety of striking colors to match a user's own style and brighten any area. A 1080p
- FaceTime HD camera, studio-quality mics, and a six-speaker sound system are all included in
- the new iMac, making it the greatest camera and audio system ever in a Mac.
-
-
- Category
-
Desktop
-
-
- Stock
-
3453
-
-
- Sales
-
49382
-
-
- Color
-
Blue
-
-
-
-
Latest reviews
-
-
-
-
-
-
-
-
Lana Rose
- 3d
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Great product, would buy again!
-
"This mackboonk desktop is amazing, the quality is top-notch. Totally worth the
- price and lorem ipsum scally utter shambles blighty squirrel"
-
-
-
-
-
-
-
-
Lana Rose
- 3d
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Great product, would buy again!
-
"This mackboonk desktop is amazing, the quality is top-notch. Totally worth the
- price and lorem ipsum scally utter shambles blighty squirrel"
- CUPERTINO, CA , The M1 CPU allows Apple to deliver an all-new iMac with a lot more
- compact and impressively thin design. The new iMac delivers tremendous performance
- in an 11.5-millimeter-thin design with a stunning side profile that almost vanishes.
- iMac includes a 24-inch 4.5K Retina display with 11.3 million pixels, 500 nits of
- brightness, and over a billion colors, giving a beautiful and vivid viewing
- experience. It is available in a variety of striking colors to match a user's own
- style and brighten any area. A 1080p FaceTime HD camera, studio-quality mics, and a
- six-speaker sound system are all included in the new iMac, making it the greatest
- camera and audio system ever in a Mac.
-
-
-
-
-
-
-
-
-
-
Pricing
-
Pricing details of product
-
-
-
-
-
-
- $
-
-
-
-
-
-
- $
-
-
-
-
-
-
- $
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Product Image
-
- Choose a product photo or simply drag and drop up to 5 photos here.
-
-
- Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae
- pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu
- aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum
- egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper
- vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos
- himenaeos.
-
-
- Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus
- bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut
- hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra
- inceptos himenaeos.
-
-
-
Information
-
-
- Client
-
Acme Agency inc.
-
-
- Start date
-
09 Mar 2025
-
-
- Budget
-
$35K-40K
-
-
- Created by
-
-
-
Emily Grace
-
-
-
-
-
-
-
-
Recent activity
-
-
-
- Today
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Angelina
- Gotelli has changed #ts-212
- status to Completed
- 10:15
- AM
-
- Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae
- pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu
- aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas.
-
-
-
What's inside?
-
- Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae
- pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu
- aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum
- egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper
- vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos
- himenaeos.
-
-
- It is a long established fact that a reader will be distracted by the readable content
- of a page when looking at its layout. The point of using Lorem Ipsum is that it has a
- more-or-less normal distribution of letters, as opposed to using 'Content here, content
- here', making it look like readable English. Many desktop publishing packages and web
- page editors now use Lorem Ipsum as their default model text, and a search for 'lorem
- ipsum' will uncover many web sites still in their infancy.
-
-
-
Lorem ipsum dolor sit amet consectetur
-
Quisque faucibus ex sapien
-
In id cursus mi pretium tellus duis
-
Tempus leo eu aenean sed diam urna
-
-
-
-
Installation
-
- It is a long established fact that a reader will be distracted by the readable content
- of a page when looking at its layout. The point of using Lorem Ipsum is that it has a
- more-or-less normal distribution of letters, as opposed to using 'Content here, content
- here', making it look like readable English. Many desktop publishing packages and web
- page editors now use Lorem Ipsum as their default model text, and a search for 'lorem
- ipsum' will uncover many web sites still in their infancy.
-
-
- Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae
- pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu
- aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum
- egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper
- vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos
- himenaeos.
-
-
-
Lorem ipsum dolor sit amet consectetur
-
Quisque faucibus ex sapien
-
In id cursus mi pretium tellus duis
-
Tempus leo eu aenean sed diam urna
-
-
-
-
Customization
-
- Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae
- pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu
- aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum
- egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper
- vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos
- himenaeos.
-
-
- It is a long established fact that a reader will be distracted by the readable content
- of a page when looking at its layout. The point of using Lorem Ipsum is that it has a
- more-or-less normal distribution of letters, as opposed to using 'Content here, content
- here', making it look like readable English. Many desktop publishing packages and web
- page editors now use Lorem Ipsum as their default model text, and a search for 'lorem
- ipsum' will uncover many web sites still in their infancy.
-
-
-
-
Theming
-
- It is a long established fact that a reader will be distracted by the readable content
- of a page when looking at its layout. The point of using Lorem Ipsum is that it has a
- more-or-less normal distribution of letters, as opposed to using 'Content here, content
- here', making it look like readable English. Many desktop publishing packages and web
- page editors now use Lorem Ipsum as their default model text, and a search for 'lorem
- ipsum' will uncover many web sites still in their infancy.
-
-
- Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae
- pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu
- aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum
- egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper
- vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos
- himenaeos.
-
';
- html += '';
- html += '';
-
- //adjust maxDate to reflect the maxSpan setting in order to
- //grey out end dates beyond the maxSpan
- if (this.endDate == null && this.maxSpan) {
- var maxLimit = this.startDate.clone().add(this.maxSpan).endOf('day');
- if (!maxDate || maxLimit.isBefore(maxDate)) {
- maxDate = maxLimit;
- }
- }
-
- for (var row = 0; row < 6; row++) {
- html += '
';
-
- // add week number
- if (this.showWeekNumbers)
- html += '
' + calendar[row][0].week() + '
';
- else if (this.showISOWeekNumbers)
- html += '
' + calendar[row][0].isoWeek() + '
';
-
- for (var col = 0; col < 7; col++) {
-
- var classes = [];
-
- //highlight today's date
- if (calendar[row][col].isSame(new Date(), "day"))
- classes.push('today');
-
- //highlight weekends
- if (calendar[row][col].isoWeekday() > 5)
- classes.push('weekend');
-
- //grey out the dates in other months displayed at beginning and end of this calendar
- if (calendar[row][col].month() != calendar[1][1].month())
- classes.push('off', 'ends');
-
- //don't allow selection of dates before the minimum date
- if (this.minDate && calendar[row][col].isBefore(this.minDate, 'day'))
- classes.push('off', 'disabled');
-
- //don't allow selection of dates after the maximum date
- if (maxDate && calendar[row][col].isAfter(maxDate, 'day'))
- classes.push('off', 'disabled');
-
- //don't allow selection of date if a custom function decides it's invalid
- if (this.isInvalidDate(calendar[row][col]))
- classes.push('off', 'disabled');
-
- //highlight the currently selected start date
- if (calendar[row][col].format('YYYY-MM-DD') == this.startDate.format('YYYY-MM-DD'))
- classes.push('active', 'start-date');
-
- //highlight the currently selected end date
- if (this.endDate != null && calendar[row][col].format('YYYY-MM-DD') == this.endDate.format('YYYY-MM-DD'))
- classes.push('active', 'end-date');
-
- //highlight dates in-between the selected dates
- if (this.endDate != null && calendar[row][col] > this.startDate && calendar[row][col] < this.endDate)
- classes.push('in-range');
-
- //apply custom classes for this date
- var isCustom = this.isCustomDate(calendar[row][col]);
- if (isCustom !== false) {
- if (typeof isCustom === 'string')
- classes.push(isCustom);
- else
- Array.prototype.push.apply(classes, isCustom);
- }
-
- var cname = '', disabled = false;
- for (var i = 0; i < classes.length; i++) {
- cname += classes[i] + ' ';
- if (classes[i] == 'disabled')
- disabled = true;
- }
- if (!disabled)
- cname += 'available';
-
- html += '
' + calendar[row][col].date() + '
';
-
- }
- html += '
';
- }
-
- html += '';
- html += '
';
-
- this.container.find('.drp-calendar.' + side + ' .calendar-table').html(html);
-
- },
-
- renderTimePicker: function(side) {
-
- // Don't bother updating the time picker if it's currently disabled
- // because an end date hasn't been clicked yet
- if (side == 'right' && !this.endDate) return;
-
- var html, selected, minDate, maxDate = this.maxDate;
-
- if (this.maxSpan && (!this.maxDate || this.startDate.clone().add(this.maxSpan).isBefore(this.maxDate)))
- maxDate = this.startDate.clone().add(this.maxSpan);
-
- if (side == 'left') {
- selected = this.startDate.clone();
- minDate = this.minDate;
- } else if (side == 'right') {
- selected = this.endDate.clone();
- minDate = this.startDate;
-
- //Preserve the time already selected
- var timeSelector = this.container.find('.drp-calendar.right .calendar-time');
- if (timeSelector.html() != '') {
-
- selected.hour(!isNaN(selected.hour()) ? selected.hour() : timeSelector.find('.hourselect option:selected').val());
- selected.minute(!isNaN(selected.minute()) ? selected.minute() : timeSelector.find('.minuteselect option:selected').val());
- selected.second(!isNaN(selected.second()) ? selected.second() : timeSelector.find('.secondselect option:selected').val());
-
- if (!this.timePicker24Hour) {
- var ampm = timeSelector.find('.ampmselect option:selected').val();
- if (ampm === 'PM' && selected.hour() < 12)
- selected.hour(selected.hour() + 12);
- if (ampm === 'AM' && selected.hour() === 12)
- selected.hour(0);
- }
-
- }
-
- if (selected.isBefore(this.startDate))
- selected = this.startDate.clone();
-
- if (maxDate && selected.isAfter(maxDate))
- selected = maxDate.clone();
-
- }
-
- //
- // hours
- //
-
- html = ' ';
-
- //
- // minutes
- //
-
- html += ': ';
-
- //
- // seconds
- //
-
- if (this.timePickerSeconds) {
- html += ': ';
- }
-
- //
- // AM/PM
- //
-
- if (!this.timePicker24Hour) {
- html += '';
- }
-
- this.container.find('.drp-calendar.' + side + ' .calendar-time').html(html);
-
- },
-
- updateFormInputs: function() {
-
- if (this.singleDatePicker || (this.endDate && (this.startDate.isBefore(this.endDate) || this.startDate.isSame(this.endDate)))) {
- this.container.find('button.applyBtn').prop('disabled', false);
- } else {
- this.container.find('button.applyBtn').prop('disabled', true);
- }
-
- },
-
- move: function() {
- var parentOffset = { top: 0, left: 0 },
- containerTop,
- drops = this.drops;
-
- var parentRightEdge = $(window).width();
- if (!this.parentEl.is('body')) {
- parentOffset = {
- top: this.parentEl.offset().top - this.parentEl.scrollTop(),
- left: this.parentEl.offset().left - this.parentEl.scrollLeft()
- };
- parentRightEdge = this.parentEl[0].clientWidth + this.parentEl.offset().left;
- }
-
- switch (drops) {
- case 'auto':
- containerTop = this.element.offset().top + this.element.outerHeight() - parentOffset.top;
- if (containerTop + this.container.outerHeight() >= this.parentEl[0].scrollHeight) {
- containerTop = this.element.offset().top - this.container.outerHeight() - parentOffset.top;
- drops = 'up';
- }
- break;
- case 'up':
- containerTop = this.element.offset().top - this.container.outerHeight() - parentOffset.top;
- break;
- default:
- containerTop = this.element.offset().top + this.element.outerHeight() - parentOffset.top;
- break;
- }
-
- // Force the container to it's actual width
- this.container.css({
- top: 0,
- left: 0,
- right: 'auto'
- });
- var containerWidth = this.container.outerWidth();
-
- this.container.toggleClass('drop-up', drops == 'up');
-
- if (this.opens == 'left') {
- var containerRight = parentRightEdge - this.element.offset().left - this.element.outerWidth();
- if (containerWidth + containerRight > $(window).width()) {
- this.container.css({
- top: containerTop,
- right: 'auto',
- left: 9
- });
- } else {
- this.container.css({
- top: containerTop,
- right: containerRight,
- left: 'auto'
- });
- }
- } else if (this.opens == 'center') {
- var containerLeft = this.element.offset().left - parentOffset.left + this.element.outerWidth() / 2
- - containerWidth / 2;
- if (containerLeft < 0) {
- this.container.css({
- top: containerTop,
- right: 'auto',
- left: 9
- });
- } else if (containerLeft + containerWidth > $(window).width()) {
- this.container.css({
- top: containerTop,
- left: 'auto',
- right: 0
- });
- } else {
- this.container.css({
- top: containerTop,
- left: containerLeft,
- right: 'auto'
- });
- }
- } else {
- var containerLeft = this.element.offset().left - parentOffset.left;
- if (containerLeft + containerWidth > $(window).width()) {
- this.container.css({
- top: containerTop,
- left: 'auto',
- right: 0
- });
- } else {
- this.container.css({
- top: containerTop,
- left: containerLeft,
- right: 'auto'
- });
- }
- }
- },
-
- show: function(e) {
- if (this.isShowing) return;
-
- // Create a click proxy that is private to this instance of datepicker, for unbinding
- this._outsideClickProxy = $.proxy(function(e) { this.outsideClick(e); }, this);
-
- // Bind global datepicker mousedown for hiding and
- $(document)
- .on('mousedown.daterangepicker', this._outsideClickProxy)
- // also support mobile devices
- .on('touchend.daterangepicker', this._outsideClickProxy)
- // also explicitly play nice with Bootstrap dropdowns, which stopPropagation when clicking them
- .on('click.daterangepicker', '[data-toggle=dropdown]', this._outsideClickProxy)
- // and also close when focus changes to outside the picker (eg. tabbing between controls)
- .on('focusin.daterangepicker', this._outsideClickProxy);
-
- // Reposition the picker if the window is resized while it's open
- $(window).on('resize.daterangepicker', $.proxy(function(e) { this.move(e); }, this));
-
- this.oldStartDate = this.startDate.clone();
- this.oldEndDate = this.endDate.clone();
- this.previousRightTime = this.endDate.clone();
-
- this.updateView();
- this.container.show();
- this.move();
- this.element.trigger('show.daterangepicker', this);
- this.isShowing = true;
- },
-
- hide: function(e) {
- if (!this.isShowing) return;
-
- //incomplete date selection, revert to last values
- if (!this.endDate) {
- this.startDate = this.oldStartDate.clone();
- this.endDate = this.oldEndDate.clone();
- }
-
- //if a new date range was selected, invoke the user callback function
- if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate))
- this.callback(this.startDate.clone(), this.endDate.clone(), this.chosenLabel);
-
- //if picker is attached to a text input, update it
- this.updateElement();
-
- $(document).off('.daterangepicker');
- $(window).off('.daterangepicker');
- this.container.hide();
- this.element.trigger('hide.daterangepicker', this);
- this.isShowing = false;
- },
-
- toggle: function(e) {
- if (this.isShowing) {
- this.hide();
- } else {
- this.show();
- }
- },
-
- outsideClick: function(e) {
- var target = $(e.target);
- // if the page is clicked anywhere except within the daterangerpicker/button
- // itself then call this.hide()
- if (
- // ie modal dialog fix
- e.type == "focusin" ||
- target.closest(this.element).length ||
- target.closest(this.container).length ||
- target.closest('.calendar-table').length
- ) return;
- this.hide();
- this.element.trigger('outsideClick.daterangepicker', this);
- },
-
- showCalendars: function() {
- this.container.addClass('show-calendar');
- this.move();
- this.element.trigger('showCalendar.daterangepicker', this);
- },
-
- hideCalendars: function() {
- this.container.removeClass('show-calendar');
- this.element.trigger('hideCalendar.daterangepicker', this);
- },
-
- clickRange: function(e) {
- var label = e.target.getAttribute('data-range-key');
- this.chosenLabel = label;
- if (label == this.locale.customRangeLabel) {
- this.showCalendars();
- } else {
- var dates = this.ranges[label];
- this.startDate = dates[0];
- this.endDate = dates[1];
-
- if (!this.timePicker) {
- this.startDate.startOf('day');
- this.endDate.endOf('day');
- }
-
- if (!this.alwaysShowCalendars)
- this.hideCalendars();
- this.clickApply();
- }
- },
-
- clickPrev: function(e) {
- var cal = $(e.target).parents('.drp-calendar');
- if (cal.hasClass('left')) {
- this.leftCalendar.month.subtract(1, 'month');
- if (this.linkedCalendars)
- this.rightCalendar.month.subtract(1, 'month');
- } else {
- this.rightCalendar.month.subtract(1, 'month');
- }
- this.updateCalendars();
- },
-
- clickNext: function(e) {
- var cal = $(e.target).parents('.drp-calendar');
- if (cal.hasClass('left')) {
- this.leftCalendar.month.add(1, 'month');
- } else {
- this.rightCalendar.month.add(1, 'month');
- if (this.linkedCalendars)
- this.leftCalendar.month.add(1, 'month');
- }
- this.updateCalendars();
- },
-
- hoverDate: function(e) {
-
- //ignore dates that can't be selected
- if (!$(e.target).hasClass('available')) return;
-
- var title = $(e.target).attr('data-title');
- var row = title.substr(1, 1);
- var col = title.substr(3, 1);
- var cal = $(e.target).parents('.drp-calendar');
- var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col];
-
- //highlight the dates between the start date and the date being hovered as a potential end date
- var leftCalendar = this.leftCalendar;
- var rightCalendar = this.rightCalendar;
- var startDate = this.startDate;
- if (!this.endDate) {
- this.container.find('.drp-calendar tbody td').each(function(index, el) {
-
- //skip week numbers, only look at dates
- if ($(el).hasClass('week')) return;
-
- var title = $(el).attr('data-title');
- var row = title.substr(1, 1);
- var col = title.substr(3, 1);
- var cal = $(el).parents('.drp-calendar');
- var dt = cal.hasClass('left') ? leftCalendar.calendar[row][col] : rightCalendar.calendar[row][col];
-
- if ((dt.isAfter(startDate) && dt.isBefore(date)) || dt.isSame(date, 'day')) {
- $(el).addClass('in-range');
- } else {
- $(el).removeClass('in-range');
- }
-
- });
- }
-
- },
-
- clickDate: function(e) {
-
- if (!$(e.target).hasClass('available')) return;
-
- var title = $(e.target).attr('data-title');
- var row = title.substr(1, 1);
- var col = title.substr(3, 1);
- var cal = $(e.target).parents('.drp-calendar');
- var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col];
-
- //
- // this function needs to do a few things:
- // * alternate between selecting a start and end date for the range,
- // * if the time picker is enabled, apply the hour/minute/second from the select boxes to the clicked date
- // * if autoapply is enabled, and an end date was chosen, apply the selection
- // * if single date picker mode, and time picker isn't enabled, apply the selection immediately
- // * if one of the inputs above the calendars was focused, cancel that manual input
- //
-
- if (this.endDate || date.isBefore(this.startDate, 'day')) { //picking start
- if (this.timePicker) {
- var hour = parseInt(this.container.find('.left .hourselect').val(), 10);
- if (!this.timePicker24Hour) {
- var ampm = this.container.find('.left .ampmselect').val();
- if (ampm === 'PM' && hour < 12)
- hour += 12;
- if (ampm === 'AM' && hour === 12)
- hour = 0;
- }
- var minute = parseInt(this.container.find('.left .minuteselect').val(), 10);
- if (isNaN(minute)) {
- minute = parseInt(this.container.find('.left .minuteselect option:last').val(), 10);
- }
- var second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0;
- date = date.clone().hour(hour).minute(minute).second(second);
- }
- this.endDate = null;
- this.setStartDate(date.clone());
- } else if (!this.endDate && date.isBefore(this.startDate)) {
- //special case: clicking the same date for start/end,
- //but the time of the end date is before the start date
- this.setEndDate(this.startDate.clone());
- } else { // picking end
- if (this.timePicker) {
- var hour = parseInt(this.container.find('.right .hourselect').val(), 10);
- if (!this.timePicker24Hour) {
- var ampm = this.container.find('.right .ampmselect').val();
- if (ampm === 'PM' && hour < 12)
- hour += 12;
- if (ampm === 'AM' && hour === 12)
- hour = 0;
- }
- var minute = parseInt(this.container.find('.right .minuteselect').val(), 10);
- if (isNaN(minute)) {
- minute = parseInt(this.container.find('.right .minuteselect option:last').val(), 10);
- }
- var second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0;
- date = date.clone().hour(hour).minute(minute).second(second);
- }
- this.setEndDate(date.clone());
- if (this.autoApply) {
- this.calculateChosenLabel();
- this.clickApply();
- }
- }
-
- if (this.singleDatePicker) {
- this.setEndDate(this.startDate);
- if (!this.timePicker && this.autoApply)
- this.clickApply();
- }
-
- this.updateView();
-
- //This is to cancel the blur event handler if the mouse was in one of the inputs
- e.stopPropagation();
-
- },
-
- calculateChosenLabel: function () {
- var customRange = true;
- var i = 0;
- for (var range in this.ranges) {
- if (this.timePicker) {
- var format = this.timePickerSeconds ? "YYYY-MM-DD HH:mm:ss" : "YYYY-MM-DD HH:mm";
- //ignore times when comparing dates if time picker seconds is not enabled
- if (this.startDate.format(format) == this.ranges[range][0].format(format) && this.endDate.format(format) == this.ranges[range][1].format(format)) {
- customRange = false;
- this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').attr('data-range-key');
- break;
- }
- } else {
- //ignore times when comparing dates if time picker is not enabled
- if (this.startDate.format('YYYY-MM-DD') == this.ranges[range][0].format('YYYY-MM-DD') && this.endDate.format('YYYY-MM-DD') == this.ranges[range][1].format('YYYY-MM-DD')) {
- customRange = false;
- this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').attr('data-range-key');
- break;
- }
- }
- i++;
- }
- if (customRange) {
- if (this.showCustomRangeLabel) {
- this.chosenLabel = this.container.find('.ranges li:last').addClass('active').attr('data-range-key');
- } else {
- this.chosenLabel = null;
- }
- this.showCalendars();
- }
- },
-
- clickApply: function(e) {
- this.hide();
- this.element.trigger('apply.daterangepicker', this);
- },
-
- clickCancel: function(e) {
- this.startDate = this.oldStartDate;
- this.endDate = this.oldEndDate;
- this.hide();
- this.element.trigger('cancel.daterangepicker', this);
- },
-
- monthOrYearChanged: function(e) {
- var isLeft = $(e.target).closest('.drp-calendar').hasClass('left'),
- leftOrRight = isLeft ? 'left' : 'right',
- cal = this.container.find('.drp-calendar.'+leftOrRight);
-
- // Month must be Number for new moment versions
- var month = parseInt(cal.find('.monthselect').val(), 10);
- var year = cal.find('.yearselect').val();
-
- if (!isLeft) {
- if (year < this.startDate.year() || (year == this.startDate.year() && month < this.startDate.month())) {
- month = this.startDate.month();
- year = this.startDate.year();
- }
- }
-
- if (this.minDate) {
- if (year < this.minDate.year() || (year == this.minDate.year() && month < this.minDate.month())) {
- month = this.minDate.month();
- year = this.minDate.year();
- }
- }
-
- if (this.maxDate) {
- if (year > this.maxDate.year() || (year == this.maxDate.year() && month > this.maxDate.month())) {
- month = this.maxDate.month();
- year = this.maxDate.year();
- }
- }
-
- if (isLeft) {
- this.leftCalendar.month.month(month).year(year);
- if (this.linkedCalendars)
- this.rightCalendar.month = this.leftCalendar.month.clone().add(1, 'month');
- } else {
- this.rightCalendar.month.month(month).year(year);
- if (this.linkedCalendars)
- this.leftCalendar.month = this.rightCalendar.month.clone().subtract(1, 'month');
- }
- this.updateCalendars();
- },
-
- timeChanged: function(e) {
-
- var cal = $(e.target).closest('.drp-calendar'),
- isLeft = cal.hasClass('left');
-
- var hour = parseInt(cal.find('.hourselect').val(), 10);
- var minute = parseInt(cal.find('.minuteselect').val(), 10);
- if (isNaN(minute)) {
- minute = parseInt(cal.find('.minuteselect option:last').val(), 10);
- }
- var second = this.timePickerSeconds ? parseInt(cal.find('.secondselect').val(), 10) : 0;
-
- if (!this.timePicker24Hour) {
- var ampm = cal.find('.ampmselect').val();
- if (ampm === 'PM' && hour < 12)
- hour += 12;
- if (ampm === 'AM' && hour === 12)
- hour = 0;
- }
-
- if (isLeft) {
- var start = this.startDate.clone();
- start.hour(hour);
- start.minute(minute);
- start.second(second);
- this.setStartDate(start);
- if (this.singleDatePicker) {
- this.endDate = this.startDate.clone();
- } else if (this.endDate && this.endDate.format('YYYY-MM-DD') == start.format('YYYY-MM-DD') && this.endDate.isBefore(start)) {
- this.setEndDate(start.clone());
- }
- } else if (this.endDate) {
- var end = this.endDate.clone();
- end.hour(hour);
- end.minute(minute);
- end.second(second);
- this.setEndDate(end);
- }
-
- //update the calendars so all clickable dates reflect the new time component
- this.updateCalendars();
-
- //update the form inputs above the calendars with the new time
- this.updateFormInputs();
-
- //re-render the time pickers because changing one selection can affect what's enabled in another
- this.renderTimePicker('left');
- this.renderTimePicker('right');
-
- },
-
- elementChanged: function() {
- if (!this.element.is('input')) return;
- if (!this.element.val().length) return;
-
- var dateString = this.element.val().split(this.locale.separator),
- start = null,
- end = null;
-
- if (dateString.length === 2) {
- start = moment(dateString[0], this.locale.format);
- end = moment(dateString[1], this.locale.format);
- }
-
- if (this.singleDatePicker || start === null || end === null) {
- start = moment(this.element.val(), this.locale.format);
- end = start;
- }
-
- if (!start.isValid() || !end.isValid()) return;
-
- this.setStartDate(start);
- this.setEndDate(end);
- this.updateView();
- },
-
- keydown: function(e) {
- //hide on tab or enter
- if ((e.keyCode === 9) || (e.keyCode === 13)) {
- this.hide();
- }
-
- //hide on esc and prevent propagation
- if (e.keyCode === 27) {
- e.preventDefault();
- e.stopPropagation();
-
- this.hide();
- }
- },
-
- updateElement: function() {
- if (this.element.is('input') && this.autoUpdateInput) {
- var newValue = this.startDate.format(this.locale.format);
- if (!this.singleDatePicker) {
- newValue += this.locale.separator + this.endDate.format(this.locale.format);
- }
- if (newValue !== this.element.val()) {
- this.element.val(newValue).trigger('change');
- }
- }
- },
-
- remove: function() {
- this.container.remove();
- this.element.off('.daterangepicker');
- this.element.removeData();
- }
-
- };
-
- $.fn.daterangepicker = function(options, callback) {
- var implementOptions = $.extend(true, {}, $.fn.daterangepicker.defaultOptions, options);
- this.each(function() {
- var el = $(this);
- if (el.data('daterangepicker'))
- el.data('daterangepicker').remove();
- el.data('daterangepicker', new DateRangePicker(el, implementOptions, callback));
- });
- return this;
- };
-
- return DateRangePicker;
-
-}));
diff --git a/www/raven-demo/vendor/js/dropzone-min.js b/www/raven-demo/vendor/js/dropzone-min.js
deleted file mode 100644
index cfced12..0000000
--- a/www/raven-demo/vendor/js/dropzone-min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-!function(){function e(e){return e&&e.__esModule?e.default:e}function t(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){for(var i=0;i1?t-1:0),n=1;n
'),this.element.appendChild(e));var l=e.getElementsByTagName("span")[0];return l&&(null!=l.textContent?l.textContent=this.options.dictFallbackMessage:null!=l.innerText&&(l.innerText=this.options.dictFallbackMessage)),this.element.appendChild(this.getFallbackForm())},resize:function(e,t,i,n){var r={srcX:0,srcY:0,srcWidth:e.width,srcHeight:e.height},a=e.width/e.height;null==t&&null==i?(t=r.srcWidth,i=r.srcHeight):null==t?t=i*a:null==i&&(i=t/a);var o=(t=Math.min(t,r.srcWidth))/(i=Math.min(i,r.srcHeight));if(r.srcWidth>t||r.srcHeight>i)if("crop"===n)a>o?(r.srcHeight=e.height,r.srcWidth=r.srcHeight*o):(r.srcWidth=e.width,r.srcHeight=r.srcWidth/o);else{if("contain"!==n)throw new Error("Unknown resizeMethod '".concat(n,"'"));a>o?i=t/a:t=i*a}return r.srcX=(e.width-r.srcWidth)/2,r.srcY=(e.height-r.srcHeight)/2,r.trgWidth=t,r.trgHeight=i,r},transformFile:function(e,t){return(this.options.resizeWidth||this.options.resizeHeight)&&e.type.match(/image.*/)?this.resizeImage(e,this.options.resizeWidth,this.options.resizeHeight,this.options.resizeMethod,t):t(e)},previewTemplate:e('