config.php', $actual);
32 | $this->assertResponseCode(200);
33 | }
34 | /**
35 | * Test no page to show
36 | */
37 | public function testDisplayNoPage(): void
38 | {
39 | $this->expectWarning();
40 | $this->expectWarningMessageMatches('/No such file or directory/');
41 |
42 | $actual = $this->get('/pages/no_page/');
43 |
44 | $this->expectException(KumbiaException::class);
45 | $this->assertResponseCode(404);
46 | $this->assertStringContainsString('Vista "pages/no_page.phtml" no encontrada
', $actual);
47 | }
48 |
49 | /**
50 | * Test for bad people
51 | */
52 | public function testBadPeople(): void
53 | {
54 | $this->expectException(KumbiaException::class);
55 | $actual = $this->get('/pages/../no_page/');
56 |
57 | $this->assertResponseCode(404);
58 | $this->assertStringContainsString("Posible intento de hack en URL: '/pages/../no_page/'", $actual);
59 | }
60 |
61 | public function testObLevel(): void
62 | {
63 | $this->assertEquals(1, ob_get_level());
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/koot/tests/KumbiaTestTrait.php:
--------------------------------------------------------------------------------
1 | assertSame(
29 | $code,
30 | $actual,
31 | "Status code is not $code but $actual."
32 | );
33 | }
34 | /**
35 | * Request to Controller
36 | *
37 | * @param string $method HTTP method
38 | * @param string $url controller/method/arg|uri
39 | * @param array $params POST parameters/Query string
40 | */
41 | protected function request($method, $url, $params = [])
42 | {
43 | $_SERVER['REQUEST_METHOD'] = $method;
44 |
45 | ob_start();
46 | $start_ob_level = ob_get_level();
47 | ob_start();
48 | View::render(Router::execute($url));
49 | while (ob_get_level() > $start_ob_level) {
50 | ob_end_flush();
51 | }
52 |
53 | //$content = $this->getActualOutput();
54 | return ob_get_clean();
55 | }
56 | /**
57 | * GET Request to Controller
58 | *
59 | * @param string $url controller/method/arg|uri
60 | * @param array $params Query string
61 | */
62 | public function get($url, $params = [])
63 | {
64 | return $this->request('GET', $url, $params);
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/koot/tests/bootstrap.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | ERROR 404
6 |
7 |
8 |
40 |
41 |
42 |
48 |
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/koot/views/_shared/partials/kumbia/footer.phtml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/koot/views/_shared/partials/paginators/classic.phtml:
--------------------------------------------------------------------------------
1 | totalPages();
31 | $prev = $page->prevPage();
32 | $next = $page->nextPage();
33 | $page = $page->page();
34 | // Calculando el inicio de paginador centrado
35 | if ($page <= $half) {
36 | $start = 1;
37 | } elseif (($pagetotal - $page) < $half) {
38 | $start = $pagetotal - $show + 1;
39 | if ($start < 1) {
40 | $start = 1;
41 | }
42 | } else {
43 | $start = $page - $half;
44 | }
45 |
46 | if ($pagetotal > 1) : ?>
47 |
66 |
67 | count(), ' items.' ?>
--------------------------------------------------------------------------------
/koot/views/_shared/partials/paginators/digg.phtml:
--------------------------------------------------------------------------------
1 | page() <= $half) {
34 | $start = 1;
35 | } elseif (($page->totalPages() - $page->page()) < $half) {
36 | $start = $page->totalPages() - $show + 1;
37 | if ($start < 1) {
38 | $start = 1;
39 | }
40 | } else {
41 | $start = $page->page() - $half;
42 | }
43 | $last = false;
44 | if ($start === $page->totalPages()) {
45 | if ($start - 1 > 0) {
46 | $start -= 1;
47 | }
48 |
49 | $last = true;
50 | }
51 | ?>
52 |
53 |
--------------------------------------------------------------------------------
/koot/views/_shared/scaffolds/kumbia/crear.phtml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
= ucwords("$model"), ": $action_name" ?>
4 |
5 |
6 |
7 |
8 |
9 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/koot/views/_shared/scaffolds/kumbia/index.phtml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
= ucwords("$model"), ": $action_name" ?>
4 |
5 | = Html::linkAction("crear/", 'Crear registro', 'class="btn btn-primary"')?>
6 |
7 | items) && (count($data->items) > 0)) : ?>
8 |
9 |
10 | items)->fields as $field) : ?>
11 | | = (current($data->items)->get_alias($field))?> |
12 |
13 | Acciones |
14 |
15 |
16 | items as $item) : ?>
17 |
18 | fields as $field) : ?>
19 | | = h($item->$field)?> |
20 |
21 | = Html::linkAction("ver/$item->id", 'Ver')?> |
22 | = Html::linkAction("editar/$item->id", 'Editar')?> |
23 | = Html::linkAction("borrar/$item->id", 'Borrar', 'onclick="return confirm(\'¿Está seguro?\')"') ?>
24 | |
25 |
26 |
27 |
28 |
29 | $data ,'url' => Router::get('controller_path').'/index')) ?>
30 |
31 |
32 |
No hay ningún registro
33 |
34 |
35 |
--------------------------------------------------------------------------------
/koot/views/_shared/scaffolds/kumbia/ver.phtml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
= ucwords("$model"),": $action_name" ?>
5 |
6 | fields as $field) : ?>
7 | - = $data->alias[$field]?> : = h($data->$field) ?>
8 |
9 |
10 |
11 |
17 |
18 |
19 |
No existe
20 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/koot/views/_shared/scaffolds/lite/page.phtml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
= ucwords("$model") ?> = _('List') ?>
4 |
5 | = Html::linkAction("create/", _('Create'), 'role="button"') ?>
6 |
7 |
8 |
= _('No records') ?>
9 |
10 |
11 |
12 |
13 |
37 |
38 | $data]) ?>
39 |
40 |
--------------------------------------------------------------------------------
/koot/views/_shared/scaffolds/lite/show.phtml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
_('Record not found')
6 |
10 |
11 | = ucwords("$model") ?> = _('Show') ?>
12 |
13 | getFields() as $key => $field) : ?>
14 | - = $data->getAlias()[$key] ?> = h($data->$field) ?>
15 |
16 |
17 |
18 |
24 |
25 |
--------------------------------------------------------------------------------
/koot/views/_shared/templates/admin.phtml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | >
5 | Koot Fast App
6 |
7 |
8 |
9 |
10 |
11 |
12 |
27 |
28 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/koot/views/_shared/templates/csv.phtml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | >
5 | Koot Fast App
6 |
7 |
8 |
9 |
10 |
11 |
12 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/koot/views/_shared/templates/json.phtml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 |
8 | Login KuAdmin
9 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
251 |
252 |
253 |
254 |
--------------------------------------------------------------------------------
/koot/views/_shared/templates/xml.phtml:
--------------------------------------------------------------------------------
1 | $value) {
9 | if (is_numeric($key)) {
10 | $key = $nodeName;
11 | }
12 | $xml .= '<' . $key . '>' . "\n" . generate_xml_from_array($value, $nodeName) . '' . $key . '>' . "\n";
13 | }
14 | } else {
15 | $xml = htmlspecialchars($array, ENT_QUOTES) . "\n";
16 | }
17 | return $xml;
18 | }
19 |
20 | function generate_valid_xml_from_array($array, $nodeBlock = 'nodes', $nodeName = 'node')
21 | {
22 | $xml = '' . "\n";
23 | $xml .= '<' . $nodeBlock . '>' . "\n";
24 | $xml .= generate_xml_from_array($array, $nodeName);
25 | $xml .= '' . $nodeBlock . '>' . "\n";
26 | return $xml;
27 | }
28 |
29 | //First element
30 | $first = is_array($data) ? $data[key($data)] : $data;
31 | $block = $first == $data && is_object($first) ? strtolower(get_class($first)) : 'data';
32 | $node = is_object($first) ? strtolower(get_class($first)) : 'node';
33 |
34 | echo generate_valid_xml_from_array($data, $block, $node);
35 | /*
36 | TODO use Simple XML
37 | function printElem($xml, $elem){
38 | $xml->startElement();
39 | $a = get_object_vars($elem);
40 | foreach($a as $key=>$value) {
41 | $xml->startElement($key);
42 | $xml->text($value);
43 | $xml->endElement();
44 | }
45 | $xml->endElement();
46 | }
47 |
48 | $xml=new XMLWriter();
49 | $xml->openMemory();
50 | $xml->startDocument('1.0','UTF-8');
51 | $xml->startElement('xml');
52 | $xml->setIndent(true);
53 |
54 | if(is_array($data)){
55 | foreach($data as $elem) {
56 | printElem($xml, $elem);
57 | }
58 | }else{
59 | printElem($xml, $data);
60 | }
61 |
62 | $xml->endElement();
63 | echo $xml->outputMemory(true);
64 | */
65 |
--------------------------------------------------------------------------------
/koot/views/admin/resources/create.phtml:
--------------------------------------------------------------------------------
1 |
2 | = ucwords("$model") ?> = _('Create') ?>
3 |
4 |
5 | = Form::open(); ?>
6 |
7 | = Form::text('data.name', 'required') ?>
8 |
9 | = Form::text('data.description') ?>
10 |
11 | = Form::text('data.module') ?>
12 |
13 | = Form::text('data.controller', 'required') ?>
14 |
15 | = Form::text('data.action', 'required') ?>
16 |
17 | = Form::text('data.url', 'required') ?>
18 | = Form::submit(_('Save'), 'class="btn btn-primary"') ?>
19 | = Form::close(); ?>
20 |
21 |
22 |
--------------------------------------------------------------------------------
/koot/views/admin/roles/create.phtml:
--------------------------------------------------------------------------------
1 |
2 | = ucwords("$model") ?> = _('Create') ?>
3 |
4 | = Form::open() ?>
5 |
8 |
9 | = Form::submit(_('Save')) ?>
10 | = Form::close() ?>
11 |
12 |
--------------------------------------------------------------------------------
/koot/views/admin/users/create.phtml:
--------------------------------------------------------------------------------
1 |
2 | = _('Users') ?> = _('Create') ?>
3 |
4 | = Form::open() ?>
5 |
6 |
9 |
10 |
13 |
14 |
17 |
18 | = Form::submit(_('Save')) ?>
19 | = Form::close() ?>
20 |
21 |
--------------------------------------------------------------------------------
/koot/views/index/index.phtml:
--------------------------------------------------------------------------------
1 |
2 | Welcome to Koot
3 | Koot is your go-to community backend solution, built on the robust and fast KumbiaPHP framework.
4 |
5 |
6 |
7 | Features
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
User Management
17 |
Handle user registrations, logins, and profiles efficiently.
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
Role-Based Access Control
27 |
Define roles and assign them to users for granular access control.
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
Resource Management
37 |
Manage your application's resources with ease.
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
Permission Handling
47 |
Fine-tune permissions for different user roles.
48 |
49 |
50 |
51 |
52 |
53 | About Koot
54 | Koot is designed to streamline backend development, minimizing repetitive tasks and focusing on unique features of your applications.
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/koot/views/pages/kumbia/status.phtml:
--------------------------------------------------------------------------------
1 |
2 | ';
6 | } else {
7 | echo strftime("%e de %B del %Y") , '
';
8 | }
9 |
10 |
11 | /**
12 | * Verificando permisos del dir temp/
13 | */
14 | if (!is_writable(APP_PATH.'temp')) {
15 | $tmp = "Debes darle permiso a: '".basename(APP_PATH)."/temp/'";
16 | } else {
17 | $tmp = 'Directorio temp... ok';
18 | }
19 |
20 | $status = PRODUCTION ? 'Production' : 'Development';
21 |
22 |
23 | /**
24 | * Configuracion del config.ini
25 | */
26 | $config = Config::read('config');
27 |
28 | if (isset($config['application']['cache_driver'])) {
29 | $cahe_driver = $config['application']['cache_driver'];
30 | } else {
31 | $cache_driver = 'No ha seleccionado un driver para la cache';
32 | }
33 |
34 | $locale = str_replace(';', '
', setlocale(LC_ALL, '0'));
35 |
36 | if (! $timezone = date_default_timezone_get()) {
37 | $timezone = 'No se ha especificado un Timezone.';
38 | }
39 | ?>
40 |
config.php de = basename(dirname(APP_PATH)) ?>
41 |
42 |
43 |
Directorio temp/:
44 |
= $tmp ?>
45 |
46 |
Estado Actual del Framework: = $status ?>
47 |
Ver Modos de ejecución
48 |
49 |
Base de Datos: = $config['application']['database'] ?>
50 |
Datos de la conexión a la BD que será utilizada, ver configuración databases.ini.
51 |
52 |
Cache Driver: = $cahe_driver ?>
53 |
Driver que se utilizará para realizar las operaciones de cache.
54 |
55 |
Charset: = APP_CHARSET ?>
56 |
Codificación de caracteres. Recomendado UTF-8
57 |
58 |
Valores del servidor
59 |
Como cambiar estos valores enlace TODO
60 |
61 |
TimeZone: = $timezone ?>
62 |
Zona horaria que usará la aplicación.
63 |
64 |
Locale:
65 |
= $locale ?>
66 |
Localización. Característica que depende de los locale instalados en el servidor.
67 |
68 |
69 |
--------------------------------------------------------------------------------
/phpunit.xml.dist:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
13 | .
14 |
15 |
16 | app/tests
17 | app/temp
18 | vendor
19 | app/config
20 |
21 |
22 |
23 |
24 | app/tests/
25 |
26 |
27 |
28 |
30 |
31 |
32 |
33 |
34 |
37 |
38 |
--------------------------------------------------------------------------------
/public/.htaccess:
--------------------------------------------------------------------------------
1 | DirectoryIndex index.php
2 | # Si esta mod_rewrite habilitado
3 |
4 | # Activar modo de reescritura
5 | RewriteEngine On
6 |
7 | # Directorio de instalacion, puede ser necesario si
8 | # la aplicacion se ubica en public_html
9 | #RewriteBase /
10 |
11 | # No permite reescritura si el archivo o directorio existe
12 | RewriteCond %{REQUEST_FILENAME} !-f
13 | RewriteCond %{REQUEST_FILENAME} !-d
14 |
15 | # Para peticiones que no son archivos ni directorios
16 | # Reescribe a index.php/
17 | RewriteRule (.*) index.php/$1 [L]
18 |
19 | # Reescribe a index.php?_url=URL
20 | #RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
21 |
22 |
--------------------------------------------------------------------------------
/public/.user.ini:
--------------------------------------------------------------------------------
1 | ; Config PHP for FastCGi, FPM,... (nginx for example)
2 | ; like .htaccess but better
3 | ; see http://php.net/manual/en/configuration.file.per-user.php
4 | ; see http://php.net/manual/en/ini.core.php
5 | ; check your php.ini for:
6 | ;user_ini.filename
7 | ;user_ini.cache_ttl
8 |
9 | display_errors = On ; OFF in production
10 | ;html_errors = On
11 | ;error_reporting = -1
12 | ;default_charset = "UTF-8" ; before PHP 5.6
13 | ;date.timezone = "Europe/Madrid"
14 | ;magic_quotes_gpc = Off
15 | ;open_basedir = "/your-path"
16 |
17 |
18 | ;upload_max_filesize = 1000M
19 | ;post_max_size = 1005M
20 | ;memory_limit = 64M
21 | ;max_execution_time = 120
22 |
23 | ;session see http://php.net/manual/en/session.configuration.php
24 | ;session.name = "SSID"
25 | session.cookie_httponly = 1 ; No access from DOM (js)
26 | ;session.cookie_secure = 1 ;only send with https
27 | ;session.save_handler=memcache ; handler (redis, rediscluster, memcache, ...)
28 | ;session.auto_start = 1 ; always start session automatically
29 | ;session.cookie_lifetime = 84600 ; session lifetime to 1 day
30 | ;session.gc_maxlifetime = 84600 ; session lifetime to 1 day
--------------------------------------------------------------------------------
/public/css/index.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/css/index.html
--------------------------------------------------------------------------------
/public/css/koot.scss:
--------------------------------------------------------------------------------
1 | // Import Flash
2 | @import "koot/flash";
3 |
4 | // Import Icons
5 | @import "koot/icons";
6 |
7 | // Import Admin
8 | @import "koot/admin";
9 |
10 | // Import Paginator
11 | @import "koot/paginator";
12 |
13 | // Import Pico
14 | @import "koot/pico";
15 |
16 | // Import Scaffold
17 | @import "koot/scaffold";
18 |
19 | // Import Logo
20 | @import "koot/logo";
--------------------------------------------------------------------------------
/public/css/koot/_koot.css:
--------------------------------------------------------------------------------
1 | /*! Koot 2024 */
2 | @import "pico.css";
3 | /* @import "admin.css"; */
4 | @import "flash.css";
5 | @import "icons.css";
6 | @import "logo.css";
7 | @import "paginator.css";
8 |
--------------------------------------------------------------------------------
/public/css/koot/admin.css:
--------------------------------------------------------------------------------
1 | @media (min-width: 992px) {
2 | #develop {
3 | --block-spacing-horizontal: calc(var(--spacing) * 1.75);
4 | grid-column-gap: calc(var(--block-spacing-horizontal));
5 | display: grid;
6 | grid-template-columns:200px auto;
7 | height: 100vh;
8 | padding: 0
9 | }
10 |
11 | #develop > aside {
12 | border-right: 1px solid var(--muted-border-color)
13 | }
14 |
15 | #doc > nav {
16 | border-bottom: 1px solid var(--muted-border-color)
17 | }
18 |
19 | #menu {
20 | background-color: var();
21 | }
22 |
23 | .settings {
24 | text-decoration: none;
25 | position: absolute;
26 | bottom: 0;
27 | padding-bottom: 1em;
28 | width: 200px;
29 | border-top: 1px solid solid var(--muted-border-color)
30 | }
31 | }
--------------------------------------------------------------------------------
/public/css/koot/flash.css:
--------------------------------------------------------------------------------
1 | /* Formatea los mensajes Flash::xxx() de KumbiaPHP */
2 |
3 | .flash {
4 | margin: 5px 0;
5 | min-height: 32px;
6 | padding: 3px 10px 3px 50px;
7 | background-repeat: no-repeat;
8 | background-position: 10px center;
9 | line-height: 32px;
10 | border-radius: 2px;
11 | }
12 |
13 | .error {
14 | color: #D8000C;
15 | background-color: #FFBABA;
16 | }
17 |
18 | .info {
19 | color: #00529B;
20 | background-color: #BDE5F8;
21 | }
22 |
23 | .valid {
24 | color: #4F8A10;
25 | background-color: #DFF2BF;
26 | }
27 |
28 | .warning {
29 | color: #9F6000;
30 | background-color: #FEEFB3;
31 | }
--------------------------------------------------------------------------------
/public/css/koot/icons.css:
--------------------------------------------------------------------------------
1 | /* Using https://feathericons.com/ */
2 | .icon {
3 | filter: invert(0.5);
4 | }
5 |
6 | .icon:hover {
7 | filter: none
8 | }
9 |
10 | /* .actions .icon {
11 | border: 1px solid gray;
12 | padding: .5em;
13 | border-radius: 6px;
14 | } */
15 | /* .delete {
16 |
17 | }
18 |
19 | .edit {
20 | /* background-image: url("data:image/svg+xml;utf8,")
21 | background-image: url(/img/edit.svg);
22 | } */
--------------------------------------------------------------------------------
/public/css/koot/logo.css:
--------------------------------------------------------------------------------
1 | /* Dark color scheme (Auto) */
2 | /* Automatically enabled if user has Dark mode enabled */
3 | @media only screen and (prefers-color-scheme: dark) {
4 | :root:not([data-theme]) {
5 | --koot-logo-wordmark: #bdecee;
6 | }
7 | }
8 |
9 | /* Can be forced with data-theme="light" */
10 | [data-theme="light"],
11 | :root:not([data-theme="dark"]) {
12 | --koot-logo-wordmark: #002741;
13 | }
14 |
15 | [data-theme="dark"],
16 | :root:not([data-theme="light"]) {
17 | --koot-logo-wordmark: #bdecee;
18 | }
19 |
20 | svg.logo {
21 | width: 5rem;
22 | height: auto;
23 | margin: -.5rem;
24 | }
25 |
26 | @media (min-width: 576px) {
27 | svg.logo {
28 | width: 10rem;
29 | margin: -1rem;
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/public/css/koot/paginator.css:
--------------------------------------------------------------------------------
1 | .paginator {
2 | justify-content: flex-start;
3 | }
4 |
5 | .paginator .nextprev {
6 | color: #000;
7 | }
8 |
9 | .paginator a {
10 | border: 1px solid #e8ebf1;
11 | padding: .5em;
12 | text-decoration: none;
13 | margin: .5em .1em;
14 | background: #FFF;
15 | }
16 |
17 | .paginator a:hover {
18 | background: #e8ebf1;
19 | }
20 |
21 | .paginator strong {
22 | background: #e8ebf1;
23 | border: 1px solid #e8ebf1;
24 | padding: .5em;
25 | margin: .5em .1em;
26 | }
--------------------------------------------------------------------------------
/public/css/koot/scaffold.css:
--------------------------------------------------------------------------------
1 | /* #scaffold table a {
2 | color: #333;
3 | font-weight: normal;
4 | }
5 |
6 | #scaffold table a:hover {
7 | color: #0ac;
8 | text-decoration: none;
9 | } */
10 |
11 | #scaffold table {
12 | width: 100%
13 | }
14 |
15 | #scaffold th {
16 | text-align: left;
17 | }
18 |
19 | #scaffold caption {
20 | font-size: 2em;
21 | text-align: left;
22 | }
23 |
24 | #scaffold .show {
25 | list-style: none;
26 | padding: 1em
27 | }
28 |
29 | #scaffold .show strong {
30 | width: 30%;
31 | display: inline-block;
32 | }
33 |
34 | #scaffold .show li {
35 | padding: 8px;
36 | line-height: 1.5;
37 | border-top: 1px solid #ddd;
38 | }
39 |
40 | #scaffold .show li:hover {
41 | background-color: #f5f5f5
42 | }
43 |
--------------------------------------------------------------------------------
/public/css/kumbia.min.css:
--------------------------------------------------------------------------------
1 | .flash{margin:5px 0;min-height:32px;padding:3px 10px 3px 50px;background-repeat:no-repeat;background-position:10px center;line-height:32px;border-radius:2px}.error{color:#d8000c;background-color:#ffbaba}.info{color:#00529b;background-color:#bde5f8}.valid{color:#4f8a10;background-color:#dff2bf}.warning{color:#9f6000;background-color:#feefb3}.icon{filter:invert(.5)}.icon:hover{filter:none}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted}a:active,a:hover{outline:0}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{font-family:Helvetica,Arial,sans-serif;font-size:15px;line-height:1.5;color:#333;background-color:#fff;margin:0}a{color:#0ac;font-weight:700;text-decoration:none}a:focus,a:hover{color:#ff4d4d;text-decoration:underline}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-rounded{border-radius:9px}.img-circle{border-radius:50%}hr{margin-top:22px;margin-bottom:22px;border:0;border-top:1px solid #eee}p{margin:0 0 11px}small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{font-family:Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:400;line-height:1;color:#999;font-size:60%}h1,h2,h3,h4,h5,h6{margin-top:22px;margin-bottom:11px}h1{font-size:42px}h2{font-size:36px}h3{font-size:29px}h4{font-size:22px}h5{font-size:19px}h6{font-size:16px}header.top{padding-bottom:10px;margin:44px 0 22px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:11px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}ul.unstyled{padding-left:0;list-style:none}ul.inline{padding-left:0;list-style:none}ul.inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-bottom:22px}dd,dt{line-height:1.5}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){dl.horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}dl.horizontal dd{margin-left:180px}dl.horizontal dd:after,dl.horizontal dd:before{content:" ";display:table}dl.horizontal dd:after{clear:both}}blockquote{padding:11px 22px;margin:0 0 22px;border-left:5px solid #eee}blockquote p{font-size:18.75px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{display:block;line-height:1.5;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote:after,blockquote:before,q:after,q:before{content:""}address{display:block;margin-bottom:22px;font-style:normal;line-height:1.5}code,pre{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}code{padding:2px 4px;color:#c7254e;white-space:nowrap;border-radius:6px}pre{display:block;padding:10.5px;margin:0 0 11px;line-height:1.5;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border-radius:5px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border:0}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container:after,.container:before{content:" ";display:table}.container:after{clear:both}.row{margin-left:15px;margin-right:15px}.row:after,.row:before{content:" ";display:table}.row:after{clear:both}.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px;float:left}.col-1{width:8.333333333333332%}.col-2{width:16.666666666666664%}.col-3{width:25%}.col-4{width:33.33333333333333%}.col-5{width:41.66666666666667%}.col-6{width:50%}.col-7{width:58.333333333333336%}.col-8{width:66.66666666666666%}.col-9{width:75%}.col-10{width:83.33333333333334%}.col-11{width:91.66666666666666%}.col-12{width:100%}.offset-0{margin-left:0}.offset-1{margin-left:8.333333333333332%}.offset-2{margin-left:16.666666666666664%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333333333%}.offset-5{margin-left:41.66666666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333333333336%}.offset-8{margin-left:66.66666666666666%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333333334%}.offset-11{margin-left:91.66666666666666%}@media (min-width:992px){.container{max-width:970px}}@media (min-width:1200px){.container{max-width:1170px}}table{max-width:100%;border-collapse:collapse}table{margin:auto;margin-bottom:22px}table tr>td,table tr>th{padding:8px;line-height:1.5;border-top:1px solid #ddd}table thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}table.condensed td,table.condensed th{padding:5px}table.border{border:1px solid #ddd}table.border td,table.border th{border:1px solid #ddd}table.zebra>tbody>tr:nth-child(odd)>td,table.zebra>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}table.hover>tbody>tr:hover{background-color:#f5f5f5}legend{display:block;width:100%;padding:0;margin-bottom:22px;font-size:22.5px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}fieldset{border:0}label{display:inline-block;margin-bottom:5px;font-weight:700}.control::-moz-placeholder{color:#999}.control:-ms-input-placeholder{color:#999}.control::-webkit-input-placeholder{color:#999}input.control,select.control,textarea.control{display:block;width:100%;height:36px;padding:6px 12px;line-height:1.5;color:#555;background-color:#fff;border:1px solid #ccc;border-radius:6px;-webkit-transition:all ease-in .4s;transition:all ease-in .4s}input.control:focus,select.control:focus,textarea.control:focus{border-color:#66afe9;outline:0}fieldset[disabled] input.control,fieldset[disabled] select.control,fieldset[disabled] textarea.control,input.control[disabled],input.control[readonly],select.control[disabled],select.control[readonly],textarea.control[disabled],textarea.control[readonly]{cursor:not-allowed;background-color:#eee}textareainput.control,textareaselect.control,textareatextarea.control{height:auto}@media (min-width:768px){form.inline .form-group,form.inline input.control,form.inline select.control,form.inline textarea.control{display:inline-block}form.inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}form.inline .control{display:inline-block}}.form-group{margin-bottom:15px}form.horizontal .form-group{margin-left:-15px;margin-right:-15px}form.horizontal .form-group:after,form.horizontal .form-group:before{content:" ";display:table}form.horizontal .form-group:after{clear:both}.form-horizontal{padding-top:6px}@media (min-width:768px){form.horizontal .control-label{text-align:right}}.btn{display:inline-block;text-decoration:none;color:#fff;border-radius:6px;border-width:1px;line-height:1.5;padding:6px 12px;-webkit-box-shadow:1px 1px 3px #555;box-shadow:1px 1px 3px #555}.btn:hover{text-decoration:none;-webkit-box-shadow:1px 2px 5px #777;box-shadow:1px 2px 5px #777}.btn-default{color:#000;border-color:#ccc;border-bottom-color:#b3b3b3;background-repeat:repeat-x;background-image:-webkit-linear-gradient(45deg,#fff,#e6e6e6);background-image:-moz-linear-gradient(45deg,#fff,#e6e6e6);background-image:linear-gradient(45deg,#fff,#e6e6e6)}.btn-default:hover{background:#ccc}.btn-inverse{border-color:#222;border-bottom-color:#080808;background-repeat:repeat-x;background-image:-webkit-linear-gradient(45deg,#555,#3b3b3b);background-image:-moz-linear-gradient(45deg,#555,#3b3b3b);background-image:linear-gradient(45deg,#555,#3b3b3b)}.btn-inverse:hover{background:#222}.btn-danger{border-color:#a02622;border-bottom-color:#761c19;background-repeat:repeat-x;background-image:-webkit-linear-gradient(45deg,#d9534f,#c9302c);background-image:-moz-linear-gradient(45deg,#d9534f,#c9302c);background-image:linear-gradient(45deg,#d9534f,#c9302c)}.btn-danger:hover{background:#a02622}.btn-info{border-color:#2390b0;border-bottom-color:#1b6d85;background-repeat:repeat-x;background-image:-webkit-linear-gradient(45deg,#5bc0de,#31b0d5);background-image:-moz-linear-gradient(45deg,#5bc0de,#31b0d5);background-image:linear-gradient(45deg,#5bc0de,#31b0d5)}.btn-info:hover{background:#2390b0}.btn-success{border-color:#357935;border-bottom-color:#255625;background-repeat:repeat-x;background-image:-webkit-linear-gradient(45deg,#5cb85c,#449d44);background-image:-moz-linear-gradient(45deg,#5cb85c,#449d44);background-image:linear-gradient(45deg,#5cb85c,#449d44)}.btn-success:hover{background:#357935}.btn-primary{border-color:#245682;border-bottom-color:#193c5a;background-repeat:repeat-x;background-image:-webkit-linear-gradient(45deg,#428bca,#3071a9);background-image:-moz-linear-gradient(45deg,#428bca,#3071a9);background-image:linear-gradient(45deg,#428bca,#3071a9)}.btn-primary:hover{background:#245682}.btn-warning{border-color:#c77c11;border-bottom-color:#985f0d;background-repeat:repeat-x;background-image:-webkit-linear-gradient(45deg,#f0ad4e,#ec971f);background-image:-moz-linear-gradient(45deg,#f0ad4e,#ec971f);background-image:linear-gradient(45deg,#f0ad4e,#ec971f)}.btn-warning:hover{background:#c77c11}.btn-sm{font-size:.7em}.btn-lg{font-size:1.2em}.btn-round{border-radius:20px}.btn-active,.btn-active:hover,.btn-disabled,.btn-disabled:hover,.btn.disabled,.btn[disabled]{opacity:1;background:#d1d1d1;border:1px solid #b3b3b3;text-shadow:0 1px 1px #fff}.btn.disabled,.btn[disabled]{color:#999}.hero{padding:30px;margin-bottom:30px;font-size:22.5px;font-weight:200;line-height:2.25;color:#fff;background-color:#0ac;border-radius:6px}.hero h1{line-height:1;color:inherit}.hero p{line-height:1.4}@media screen and (min-width:768px){.hero{padding-top:50px;padding-bottom:50px}.hero h1{font-size:67.5px}}.actions{border-top:dotted 1px grey;padding-top:1em;margin:.5em 0 0}input,label,select,textarea{display:block}footer{padding-top:1em;margin-top:2em;border-top:1px solid #ccc}.paginator .nextprev{color:#000}.paginator a{border:1px solid #e8ebf1;padding:.5em;text-decoration:none;margin:.5em .1em;background:#fff}.paginator a:hover{background:#e8ebf1}.paginator strong{background:#e8ebf1;border:1px solid #e8ebf1;padding:.5em;margin:.5em .1em}#scaffold table a{color:#333;font-weight:400}#scaffold table a:hover{color:#0ac;text-decoration:none}#scaffold table{width:100%}#scaffold th{text-align:left}#scaffold caption{font-size:2em;text-align:left}#scaffold .show{list-style:none;padding:1em}#scaffold .show strong{width:30%;display:inline-block}#scaffold .show li{padding:8px;line-height:1.5;border-top:1px solid #ddd}#scaffold .show li:hover{background-color:#f5f5f5}
--------------------------------------------------------------------------------
/public/css/kumbia/flash.css:
--------------------------------------------------------------------------------
1 | /* Formatea los mensajes Flash::xxx() de KumbiaPHP */
2 |
3 | .flash {
4 | margin: 5px 0;
5 | min-height: 32px;
6 | padding: 3px 10px 3px 50px;
7 | background-repeat: no-repeat;
8 | background-position: 10px center;
9 | line-height: 32px;
10 | border-radius: 2px;
11 | }
12 |
13 | .error {
14 | color: #D8000C;
15 | background-color: #FFBABA;
16 | }
17 |
18 | .info {
19 | color: #00529B;
20 | background-color: #BDE5F8;
21 | }
22 |
23 | .valid {
24 | color: #4F8A10;
25 | background-color: #DFF2BF;
26 | }
27 |
28 | .warning {
29 | color: #9F6000;
30 | background-color: #FEEFB3;
31 | }
--------------------------------------------------------------------------------
/public/css/kumbia/icons.css:
--------------------------------------------------------------------------------
1 | /* Using https://feathericons.com/ */
2 | .icon {
3 | filter: invert(0.5);
4 | }
5 |
6 | .icon:hover {
7 | filter: none
8 | }
9 |
10 | /* .actions .icon {
11 | border: 1px solid gray;
12 | padding: .5em;
13 | border-radius: 6px;
14 | } */
15 | /* .delete {
16 |
17 | }
18 |
19 | .edit {
20 | /* background-image: url("data:image/svg+xml;utf8,")
21 | background-image: url(/img/edit.svg);
22 | } */
--------------------------------------------------------------------------------
/public/css/kumbia/kumbia.css:
--------------------------------------------------------------------------------
1 | article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary {
2 | display: block
3 | }
4 |
5 | audio, canvas, video {
6 | display: inline-block
7 | }
8 |
9 | audio:not([controls]) {
10 | display: none;
11 | height: 0
12 | }
13 |
14 | [hidden] {
15 | display: none
16 | }
17 |
18 | html {
19 | font-family: sans-serif;
20 | -webkit-text-size-adjust: 100%;
21 | -ms-text-size-adjust: 100%
22 | }
23 |
24 | a:focus {
25 | outline: thin dotted
26 | }
27 |
28 | a:active, a:hover {
29 | outline: 0
30 | }
31 |
32 | mark {
33 | background: #ff0;
34 | color: #000
35 | }
36 |
37 | code, kbd, pre, samp {
38 | font-family: monospace, serif;
39 | font-size: 1em
40 | }
41 |
42 | pre {
43 | white-space: pre-wrap
44 | }
45 |
46 | sub, sup {
47 | font-size: 75%;
48 | line-height: 0;
49 | position: relative;
50 | vertical-align: baseline
51 | }
52 |
53 | sup {
54 | top: -0.5em
55 | }
56 |
57 | sub {
58 | bottom: -0.25em
59 | }
60 |
61 | img {
62 | border: 0
63 | }
64 |
65 | svg:not(:root) {
66 | overflow: hidden
67 | }
68 |
69 | figure {
70 | margin: 0
71 | }
72 |
73 | input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration {
74 | -webkit-appearance: none
75 | }
76 |
77 | *, *:before, *:after {
78 | -webkit-box-sizing: border-box;
79 | -moz-box-sizing: border-box;
80 | box-sizing: border-box
81 | }
82 |
83 | body {
84 | font-family: Helvetica, Arial, sans-serif;
85 | font-size: 15px;
86 | line-height: 1.5;
87 | color: #333;
88 | background-color: #fff;
89 | margin: 0
90 | }
91 |
92 | a {
93 | color: #0ac;
94 | font-weight: bold;
95 | text-decoration: none
96 | }
97 |
98 | a:hover, a:focus {
99 | color: #ff4d4d;
100 | text-decoration: underline
101 | }
102 |
103 | a:focus {
104 | outline: thin dotted #333;
105 | outline: 5px auto -webkit-focus-ring-color;
106 | outline-offset: -2px
107 | }
108 |
109 | img {
110 | vertical-align: middle
111 | }
112 |
113 | .img-rounded {
114 | border-radius: 9px
115 | }
116 |
117 | .img-circle {
118 | border-radius: 50%
119 | }
120 |
121 | hr {
122 | margin-top: 22px;
123 | margin-bottom: 22px;
124 | border: 0;
125 | border-top: 1px solid #eee
126 | }
127 |
128 | p {
129 | margin: 0 0 11px
130 | }
131 |
132 | small {
133 | font-size: 85%
134 | }
135 |
136 | cite {
137 | font-style: normal
138 | }
139 |
140 | .text-left {
141 | text-align: left
142 | }
143 |
144 | .text-right {
145 | text-align: right
146 | }
147 |
148 | .text-center {
149 | text-align: center
150 | }
151 |
152 | h1, h2, h3, h4, h5, h6 {
153 | font-family: Helvetica, Arial, sans-serif;
154 | font-weight: 500;
155 | line-height: 1.1
156 | }
157 |
158 | h1 small, h2 small, h3 small, h4 small, h5 small, h6 small {
159 | font-weight: normal;
160 | line-height: 1;
161 | color: #999;
162 | font-size: 60%
163 | }
164 |
165 | h1, h2, h3, h4, h5, h6 {
166 | margin-top: 22px;
167 | margin-bottom: 11px
168 | }
169 |
170 | h1 {
171 | font-size: 42px
172 | }
173 |
174 | h2 {
175 | font-size: 36px
176 | }
177 |
178 | h3 {
179 | font-size: 29px
180 | }
181 |
182 | h4 {
183 | font-size: 22px
184 | }
185 |
186 | h5 {
187 | font-size: 19px
188 | }
189 |
190 | h6 {
191 | font-size: 16px
192 | }
193 |
194 | header.top {
195 | padding-bottom: 10px;
196 | margin: 44px 0 22px;
197 | border-bottom: 1px solid #eee
198 | }
199 |
200 | ul, ol {
201 | margin-top: 0;
202 | margin-bottom: 11px
203 | }
204 |
205 | ul ul, ol ul, ul ol, ol ol {
206 | margin-bottom: 0
207 | }
208 |
209 | ul.unstyled {
210 | padding-left: 0;
211 | list-style: none
212 | }
213 |
214 | ul.inline {
215 | padding-left: 0;
216 | list-style: none
217 | }
218 |
219 | ul.inline>li {
220 | display: inline-block;
221 | padding-left: 5px;
222 | padding-right: 5px
223 | }
224 |
225 | dl {
226 | margin-bottom: 22px
227 | }
228 |
229 | dt, dd {
230 | line-height: 1.5
231 | }
232 |
233 | dt {
234 | font-weight: bold
235 | }
236 |
237 | dd {
238 | margin-left: 0
239 | }
240 |
241 | @media (min-width:768px) {
242 | dl.horizontal dt {
243 | float: left;
244 | width: 160px;
245 | clear: left;
246 | text-align: right;
247 | overflow: hidden;
248 | text-overflow: ellipsis;
249 | white-space: nowrap
250 | }
251 | dl.horizontal dd {
252 | margin-left: 180px
253 | }
254 | dl.horizontal dd:before, dl.horizontal dd:after {
255 | content: " ";
256 | display: table;
257 | }
258 | dl.horizontal dd:after {
259 | clear: both
260 | }
261 | }
262 |
263 | blockquote {
264 | padding: 11px 22px;
265 | margin: 0 0 22px;
266 | border-left: 5px solid #eee
267 | }
268 |
269 | blockquote p {
270 | font-size: 18.75px;
271 | font-weight: 300;
272 | line-height: 1.25
273 | }
274 |
275 | blockquote p:last-child {
276 | margin-bottom: 0
277 | }
278 |
279 | blockquote small {
280 | display: block;
281 | line-height: 1.5;
282 | color: #999
283 | }
284 |
285 | blockquote small:before {
286 | content: '\2014 \00A0'
287 | }
288 |
289 | q:before, q:after, blockquote:before, blockquote:after {
290 | content: ""
291 | }
292 |
293 | address {
294 | display: block;
295 | margin-bottom: 22px;
296 | font-style: normal;
297 | line-height: 1.5
298 | }
299 |
300 | code, pre {
301 | font-family: Monaco, Menlo, Consolas, "Courier New", monospace
302 | }
303 |
304 | code {
305 | padding: 2px 4px;
306 | color: #c7254e;
307 | white-space: nowrap;
308 | border-radius: 6px
309 | }
310 |
311 | pre {
312 | display: block;
313 | padding: 10.5px;
314 | margin: 0 0 11px;
315 | line-height: 1.5;
316 | word-break: break-all;
317 | word-wrap: break-word;
318 | color: #333;
319 | background-color: #f5f5f5;
320 | border-radius: 5px;
321 | }
322 |
323 | pre code {
324 | padding: 0;
325 | font-size: inherit;
326 | color: inherit;
327 | white-space: pre-wrap;
328 | border: 0
329 | }
330 |
331 | .container {
332 | margin-right: auto;
333 | margin-left: auto;
334 | padding-left: 15px;
335 | padding-right: 15px
336 | }
337 |
338 | .container:before, .container:after {
339 | content: " ";
340 | display: table;
341 | }
342 |
343 | .container:after {
344 | clear: both
345 | }
346 |
347 | .row {
348 | margin-left: 15px;
349 | margin-right: 15px
350 | }
351 |
352 | .row:before, .row:after {
353 | content: " ";
354 | display: table;
355 | }
356 |
357 | .row:after {
358 | clear: both
359 | }
360 |
361 | .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12 {
362 | position: relative;
363 | min-height: 1px;
364 | padding-left: 15px;
365 | padding-right: 15px;
366 | float: left
367 | }
368 |
369 | .col-1 {
370 | width: 8.333333333333332%
371 | }
372 |
373 | .col-2 {
374 | width: 16.666666666666664%
375 | }
376 |
377 | .col-3 {
378 | width: 25%
379 | }
380 |
381 | .col-4 {
382 | width: 33.33333333333333%
383 | }
384 |
385 | .col-5 {
386 | width: 41.66666666666667%
387 | }
388 |
389 | .col-6 {
390 | width: 50%
391 | }
392 |
393 | .col-7 {
394 | width: 58.333333333333336%
395 | }
396 |
397 | .col-8 {
398 | width: 66.66666666666666%
399 | }
400 |
401 | .col-9 {
402 | width: 75%
403 | }
404 |
405 | .col-10 {
406 | width: 83.33333333333334%
407 | }
408 |
409 | .col-11 {
410 | width: 91.66666666666666%
411 | }
412 |
413 | .col-12 {
414 | width: 100%
415 | }
416 |
417 | .offset-0 {
418 | margin-left: 0
419 | }
420 |
421 | .offset-1 {
422 | margin-left: 8.333333333333332%
423 | }
424 |
425 | .offset-2 {
426 | margin-left: 16.666666666666664%
427 | }
428 |
429 | .offset-3 {
430 | margin-left: 25%
431 | }
432 |
433 | .offset-4 {
434 | margin-left: 33.33333333333333%
435 | }
436 |
437 | .offset-5 {
438 | margin-left: 41.66666666666667%
439 | }
440 |
441 | .offset-6 {
442 | margin-left: 50%
443 | }
444 |
445 | .offset-7 {
446 | margin-left: 58.333333333333336%
447 | }
448 |
449 | .offset-8 {
450 | margin-left: 66.66666666666666%
451 | }
452 |
453 | .offset-9 {
454 | margin-left: 75%
455 | }
456 |
457 | .offset-10 {
458 | margin-left: 83.33333333333334%
459 | }
460 |
461 | .offset-11 {
462 | margin-left: 91.66666666666666%
463 | }
464 |
465 | @media (min-width:992px) {
466 | .container {
467 | max-width: 970px
468 | }
469 | }
470 |
471 | @media (min-width:1200px) {
472 | .container {
473 | max-width: 1170px
474 | }
475 | }
476 |
477 | table {
478 | max-width: 100%;
479 | border-collapse: collapse
480 | }
481 |
482 | table {
483 | margin: auto;
484 | margin-bottom: 22px
485 | }
486 |
487 | table tr>th, table tr>td {
488 | padding: 8px;
489 | line-height: 1.5;
490 | border-top: 1px solid #ddd
491 | }
492 |
493 | table thead>tr>th {
494 | vertical-align: bottom;
495 | border-bottom: 2px solid #ddd
496 | }
497 |
498 | table.condensed th, table.condensed td {
499 | padding: 5px
500 | }
501 |
502 | table.border {
503 | border: 1px solid #ddd
504 | }
505 |
506 | table.border th, table.border td {
507 | border: 1px solid #ddd
508 | }
509 |
510 | table.zebra>tbody>tr:nth-child(odd)>td, table.zebra>tbody>tr:nth-child(odd)>th {
511 | background-color: #f9f9f9
512 | }
513 |
514 | table.hover>tbody>tr:hover {
515 | background-color: #f5f5f5
516 | }
517 |
518 | legend {
519 | display: block;
520 | width: 100%;
521 | padding: 0;
522 | margin-bottom: 22px;
523 | font-size: 22.5px;
524 | line-height: inherit;
525 | color: #333;
526 | border: 0;
527 | border-bottom: 1px solid #e5e5e5
528 | }
529 |
530 | fieldset {
531 | border: 0
532 | }
533 |
534 | label {
535 | display: inline-block;
536 | margin-bottom: 5px;
537 | font-weight: bold
538 | }
539 |
540 | .control::-moz-placeholder {
541 | color: #999
542 | }
543 |
544 | .control:-ms-input-placeholder {
545 | color: #999
546 | }
547 |
548 | .control::-webkit-input-placeholder {
549 | color: #999
550 | }
551 |
552 | input.control, select.control, textarea.control {
553 | display: block;
554 | width: 100%;
555 | height: 36px;
556 | padding: 6px 12px;
557 | line-height: 1.5;
558 | color: #555;
559 | background-color: #fff;
560 | border: 1px solid #ccc;
561 | border-radius: 6px;
562 | -webkit-transition: all ease-in .4s;
563 | transition: all ease-in .4s
564 | }
565 |
566 | input.control:focus, select.control:focus, textarea.control:focus {
567 | border-color: #66afe9;
568 | outline: 0
569 | }
570 |
571 | input.control[disabled], select.control[disabled], textarea.control[disabled], input.control[readonly], select.control[readonly], textarea.control[readonly], fieldset[disabled] input.control, fieldset[disabled] select.control, fieldset[disabled] textarea.control {
572 | cursor: not-allowed;
573 | background-color: #eee
574 | }
575 |
576 | textareainput.control, textareaselect.control, textareatextarea.control {
577 | height: auto
578 | }
579 |
580 | @media (min-width:768px) {
581 | form.inline input.control, form.inline select.control, form.inline textarea.control, form.inline .form-group {
582 | display: inline-block
583 | }
584 | form.inline .form-group {
585 | display: inline-block;
586 | margin-bottom: 0;
587 | vertical-align: middle
588 | }
589 | form.inline .control {
590 | display: inline-block
591 | }
592 | }
593 |
594 | .form-group {
595 | margin-bottom: 15px
596 | }
597 |
598 | form.horizontal .form-group {
599 | margin-left: -15px;
600 | margin-right: -15px
601 | }
602 |
603 | form.horizontal .form-group:before, form.horizontal .form-group:after {
604 | content: " ";
605 | display: table;
606 | }
607 |
608 | form.horizontal .form-group:after {
609 | clear: both
610 | }
611 |
612 | .form-horizontal {
613 | padding-top: 6px
614 | }
615 |
616 | @media (min-width:768px) {
617 | form.horizontal .control-label {
618 | text-align: right
619 | }
620 | }
621 |
622 | .btn {
623 | display: inline-block;
624 | text-decoration: none;
625 | color: #fff;
626 | border-radius: 6px;
627 | border-width: 1px;
628 | line-height: 1.5;
629 | padding: 6px 12px;
630 | -webkit-box-shadow: 1px 1px 3px #555;
631 | box-shadow: 1px 1px 3px #555
632 | }
633 |
634 | .btn:hover {
635 | text-decoration: none;
636 | -webkit-box-shadow: 1px 2px 5px #777;
637 | box-shadow: 1px 2px 5px #777
638 | }
639 |
640 | .btn-default {
641 | color: #000;
642 | border-color: #ccc;
643 | border-bottom-color: #b3b3b3;
644 | background-repeat: repeat-x;
645 | background-image: -webkit-linear-gradient(45deg, #fff, #e6e6e6);
646 | background-image: -moz-linear-gradient(45deg, #fff, #e6e6e6);
647 | background-image: linear-gradient(45deg, #fff, #e6e6e6)
648 | }
649 |
650 | .btn-default:hover {
651 | background: #ccc
652 | }
653 |
654 | .btn-inverse {
655 | border-color: #222;
656 | border-bottom-color: #080808;
657 | background-repeat: repeat-x;
658 | background-image: -webkit-linear-gradient(45deg, #555, #3b3b3b);
659 | background-image: -moz-linear-gradient(45deg, #555, #3b3b3b);
660 | background-image: linear-gradient(45deg, #555, #3b3b3b)
661 | }
662 |
663 | .btn-inverse:hover {
664 | background: #222
665 | }
666 |
667 | .btn-danger {
668 | border-color: #a02622;
669 | border-bottom-color: #761c19;
670 | background-repeat: repeat-x;
671 | background-image: -webkit-linear-gradient(45deg, #d9534f, #c9302c);
672 | background-image: -moz-linear-gradient(45deg, #d9534f, #c9302c);
673 | background-image: linear-gradient(45deg, #d9534f, #c9302c)
674 | }
675 |
676 | .btn-danger:hover {
677 | background: #a02622
678 | }
679 |
680 | .btn-info {
681 | border-color: #2390b0;
682 | border-bottom-color: #1b6d85;
683 | background-repeat: repeat-x;
684 | background-image: -webkit-linear-gradient(45deg, #5bc0de, #31b0d5);
685 | background-image: -moz-linear-gradient(45deg, #5bc0de, #31b0d5);
686 | background-image: linear-gradient(45deg, #5bc0de, #31b0d5)
687 | }
688 |
689 | .btn-info:hover {
690 | background: #2390b0
691 | }
692 |
693 | .btn-success {
694 | border-color: #357935;
695 | border-bottom-color: #255625;
696 | background-repeat: repeat-x;
697 | background-image: -webkit-linear-gradient(45deg, #5cb85c, #449d44);
698 | background-image: -moz-linear-gradient(45deg, #5cb85c, #449d44);
699 | background-image: linear-gradient(45deg, #5cb85c, #449d44)
700 | }
701 |
702 | .btn-success:hover {
703 | background: #357935
704 | }
705 |
706 | .btn-primary {
707 | border-color: #245682;
708 | border-bottom-color: #193c5a;
709 | background-repeat: repeat-x;
710 | background-image: -webkit-linear-gradient(45deg, #428bca, #3071a9);
711 | background-image: -moz-linear-gradient(45deg, #428bca, #3071a9);
712 | background-image: linear-gradient(45deg, #428bca, #3071a9)
713 | }
714 |
715 | .btn-primary:hover {
716 | background: #245682
717 | }
718 |
719 | .btn-warning {
720 | border-color: #c77c11;
721 | border-bottom-color: #985f0d;
722 | background-repeat: repeat-x;
723 | background-image: -webkit-linear-gradient(45deg, #f0ad4e, #ec971f);
724 | background-image: -moz-linear-gradient(45deg, #f0ad4e, #ec971f);
725 | background-image: linear-gradient(45deg, #f0ad4e, #ec971f)
726 | }
727 |
728 | .btn-warning:hover {
729 | background: #c77c11
730 | }
731 |
732 | .btn-sm {
733 | font-size: .7em
734 | }
735 |
736 | .btn-lg {
737 | font-size: 1.2em
738 | }
739 |
740 | .btn-round {
741 | border-radius: 20px
742 | }
743 |
744 | .btn-active, .btn-active:hover, .btn.disabled, .btn[disabled], .btn-disabled, .btn-disabled:hover {
745 | opacity: 1;
746 | filter: alpha(opacity=100);
747 | background: #d1d1d1;
748 | border: 1px solid #b3b3b3;
749 | text-shadow: 0 1px 1px #fff
750 | }
751 |
752 | .btn.disabled, .btn[disabled] {
753 | color: #999
754 | }
755 |
756 | .hero {
757 | padding: 30px;
758 | margin-bottom: 30px;
759 | font-size: 22.5px;
760 | font-weight: 200;
761 | line-height: 2.25;
762 | color: #fff;
763 | background-color: #0ac;
764 | border-radius: 6px
765 | }
766 |
767 | .hero h1 {
768 | line-height: 1;
769 | color: inherit
770 | }
771 |
772 | .hero p {
773 | line-height: 1.4
774 | }
775 |
776 | @media screen and (min-width:768px) {
777 | .hero {
778 | padding-top: 50px;
779 | padding-bottom: 50px
780 | }
781 | .hero h1 {
782 | font-size: 67.5px
783 | }
784 | }
785 |
786 | .actions {
787 | border-top: dotted 1px grey;
788 | padding-top: 1em;
789 | margin: .5em 0 0;
790 | }
791 |
792 | label, input, textarea, select {
793 | display: block;
794 | }
795 |
796 | footer {
797 | padding-top: 1em;
798 | margin-top: 2em;
799 | border-top: 1px solid #ccc;
800 | }
801 |
802 |
--------------------------------------------------------------------------------
/public/css/kumbia/paginator.css:
--------------------------------------------------------------------------------
1 | .paginator .nextprev {
2 | color: #000;
3 | }
4 |
5 | .paginator a {
6 | border: 1px solid #e8ebf1;
7 | padding: .5em;
8 | text-decoration: none;
9 | margin: .5em .1em;
10 | background: #FFF;
11 | }
12 |
13 | .paginator a:hover {
14 | background: #e8ebf1;
15 | }
16 |
17 | .paginator strong {
18 | background: #e8ebf1;
19 | border: 1px solid #e8ebf1;
20 | padding: .5em;
21 | margin: .5em .1em;
22 | }
--------------------------------------------------------------------------------
/public/css/kumbia/scaffold.css:
--------------------------------------------------------------------------------
1 | #scaffold table a {
2 | color: #333;
3 | font-weight: normal;
4 | }
5 |
6 | #scaffold table a:hover {
7 | color: #0ac;
8 | text-decoration: none;
9 | }
10 |
11 | #scaffold table {
12 | width: 100%
13 | }
14 |
15 | #scaffold th {
16 | text-align: left;
17 | }
18 |
19 | #scaffold caption {
20 | font-size: 2em;
21 | text-align: left;
22 | }
23 |
24 | #scaffold .show {
25 | list-style: none;
26 | padding: 1em
27 | }
28 |
29 | #scaffold .show strong {
30 | width: 30%;
31 | display: inline-block;
32 | }
33 |
34 | #scaffold .show li {
35 | padding: 8px;
36 | line-height: 1.5;
37 | border-top: 1px solid #ddd;
38 | }
39 |
40 | #scaffold .show li:hover {
41 | background-color: #f5f5f5
42 | }
43 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/favicon.ico
--------------------------------------------------------------------------------
/public/files/index.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/files/index.html
--------------------------------------------------------------------------------
/public/files/upload/index.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/files/upload/index.html
--------------------------------------------------------------------------------
/public/img/datepicker/backstripes.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/datepicker/backstripes.gif
--------------------------------------------------------------------------------
/public/img/datepicker/bg_header.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/datepicker/bg_header.jpg
--------------------------------------------------------------------------------
/public/img/datepicker/bullet1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/datepicker/bullet1.gif
--------------------------------------------------------------------------------
/public/img/datepicker/bullet2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/datepicker/bullet2.gif
--------------------------------------------------------------------------------
/public/img/datepicker/cal-grey.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/datepicker/cal-grey.gif
--------------------------------------------------------------------------------
/public/img/datepicker/cal.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/datepicker/cal.gif
--------------------------------------------------------------------------------
/public/img/datepicker/gradient-e5e5e5-ffffff.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/datepicker/gradient-e5e5e5-ffffff.gif
--------------------------------------------------------------------------------
/public/img/icons/delete.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/public/img/icons/edit.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/public/img/index.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/index.html
--------------------------------------------------------------------------------
/public/img/koot.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/public/img/kumbia.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/public/img/kumbiaphp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/public/img/login.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/login.jpg
--------------------------------------------------------------------------------
/public/img/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/logo.png
--------------------------------------------------------------------------------
/public/img/php7.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/public/img/upload/index.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/upload/index.html
--------------------------------------------------------------------------------
/public/img/welcome/permission_handling.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/welcome/permission_handling.avif
--------------------------------------------------------------------------------
/public/img/welcome/permission_handling.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/welcome/permission_handling.png
--------------------------------------------------------------------------------
/public/img/welcome/resource_management.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/welcome/resource_management.avif
--------------------------------------------------------------------------------
/public/img/welcome/resource_management.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/welcome/resource_management.png
--------------------------------------------------------------------------------
/public/img/welcome/role_based_access_control.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/welcome/role_based_access_control.avif
--------------------------------------------------------------------------------
/public/img/welcome/role_based_access_control.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/welcome/role_based_access_control.png
--------------------------------------------------------------------------------
/public/img/welcome/user_management.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/welcome/user_management.avif
--------------------------------------------------------------------------------
/public/img/welcome/user_management.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/welcome/user_management.png
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/index.html
--------------------------------------------------------------------------------
/public/index.php:
--------------------------------------------------------------------------------
1 | ').text(d[i]).val(i);
117 | $u.append(a);
118 | }
119 | }, 'json');
120 | },
121 |
122 | /**
123 | * Enlaza a las clases por defecto
124 | *
125 | */
126 | bind : function() {
127 | // Enlace y boton con confirmacion
128 | $("body").on('click', "a.js-confirm, input.js-confirm",this.cConfirm);
129 |
130 | // Enlace ajax
131 | $("body").on('click', "a.js-remote",this.cRemote);
132 |
133 | // Enlace ajax con confirmacion
134 | $("body").on('click', "a.js-remote-confirm",this.cRemoteConfirm);
135 |
136 | // Efecto show
137 | $("body").on('click', "a.js-show",this.cFx('show'));
138 |
139 | // Efecto hide
140 | $("body").on('click', "a.js-hide",this.cFx('hide'));
141 |
142 | // Efecto toggle
143 | $("body").on('click', "a.js-toggle",this.cFx('toggle'));
144 |
145 | // Efecto fadeIn
146 | $("body").on('click', "a.js-fade-in",this.cFx('fadeIn'));
147 |
148 | // Efecto fadeOut
149 | $("body").on('click', "a.js-fade-out",this.cFx('fadeOut'));
150 |
151 | // Formulario ajax
152 | $("body").on('submit',"form.js-remote", this.cFRemote);
153 |
154 | // Lista desplegable que actualiza con ajax
155 | $("body").on('change',"select.js-remote", this.cUpdaterSelect);
156 |
157 | // Enlazar DatePicker
158 | $.KumbiaPHP.bindDatePicker();
159 |
160 | },
161 |
162 | /**
163 | * Implementa la autocarga de plugins, estos deben seguir
164 | * una convención para que pueda funcionar correctamente
165 | */
166 | autoload: function(){
167 | var elem = $("[class*='jp-']");
168 | $.each(elem, function(i, val){
169 | var este = $(this); //apunta al elemento con clase jp-*
170 | var classes = este.attr('class').split(' ');
171 | for (i in classes){
172 | if(classes[i].substr(0, 3) == 'jp-'){
173 | if($.inArray(classes[i].substr(3),$.KumbiaPHP.plugin) != -1)
174 | continue;
175 | $.KumbiaPHP.plugin.push(classes[i].substr(3))
176 | }
177 | }
178 | });
179 | var head = $('head');
180 | for(i in $.KumbiaPHP.plugin){
181 | $.ajaxSetup({ cache: true});
182 | head.append('');
183 | $.getScript($.KumbiaPHP.publicPath + 'javascript/jquery/jquery.' + $.KumbiaPHP.plugin[i] + '.js', function(data, text){});
184 | }
185 | },
186 |
187 | /**
188 | * Carga y Enlaza Unobstrusive DatePicker en caso de ser necesario
189 | *
190 | */
191 | bindDatePicker: function() {
192 |
193 | // Selecciona los campos input
194 | var inputs = $('input.js-datepicker');
195 | /**
196 | * Funcion encargada de enlazar el DatePicker a los Input
197 | *
198 | */
199 | var bindInputs = function() {
200 | inputs.each(function() {
201 | var opts = {monthSelector: true,yearSelector:true};
202 | var input = $(this);
203 | // Verifica si hay mínimo
204 | if(input.attr('min') != undefined) {
205 | opts.dateMin = input.attr('min').split('-');
206 | }
207 | // Verifica si ha máximo
208 | if(input.attr('max') != undefined) {
209 | opts.dateMax = input.attr('max').split('-');
210 | }
211 |
212 | // Crea el calendario
213 | input.pickadate(opts);
214 | });
215 | }
216 |
217 | // Si ya esta cargado Unobstrusive DatePicker, lo integra de una vez
218 | if(typeof($.pickadate) != "undefined") {
219 | return bindInputs();
220 | }
221 |
222 | // Carga la hoja de estilos
223 | $('head').append('');
224 |
225 | // Carga Unobstrusive DatePicker, para poder usar cache
226 | jQuery.ajax({ dataType: "script",cache: true, url: this.publicPath + 'javascript/jquery/pickadate.js'}).done(function(){
227 | bindInputs();
228 | });
229 | },
230 |
231 | /**
232 | * Inicializa el plugin
233 | *
234 | */
235 | initialize: function() {
236 | // Obtiene el publicPath, restando los caracteres que sobran
237 | // de la ruta, respecto a la ruta de ubicacion del plugin de KumbiaPHP
238 | // "javascript/jquery/jquery.kumbiaphp.js"
239 | var src = $('script:last').attr('src');
240 | this.publicPath = src.substr(0, src.length - 37);
241 |
242 | // Enlaza a las clases por defecto
243 | $(function(){
244 | $.KumbiaPHP.bind();
245 | $.KumbiaPHP.autoload();
246 |
247 | });
248 | }
249 | }
250 |
251 | // Inicializa el plugin
252 | $.KumbiaPHP.initialize();
253 | })(jQuery);
254 |
--------------------------------------------------------------------------------
/public/javascript/jquery/jquery.kumbiaphp.min.js:
--------------------------------------------------------------------------------
1 | /*
2 | http://wiki.kumbiaphp.com/Licencia New BSD License
3 | */
4 | (function(a){a.KumbiaPHP={publicPath:null,plugin:[],cConfirm:function(b){var c=a(this);confirm(c.data("msg"))||b.preventDefault()},cFx:function(b){return function(c){c.preventDefault();c=a(this);a("#"+c.data("to"))[b]()}},cRemote:function(b){var c=a(this),c=a("#"+c.data("to"));b.preventDefault();c.load(this.href)},cRemoteConfirm:function(b){var c=a(this),d=a("#"+c.data("to"));b.preventDefault();confirm(c.data("msg"))&&d.load(this.href)},cFRemote:function(b){b.preventDefault();este=a(this);var c=a("[type=submit]",
5 | este);c.attr("disabled","disabled");b=este.attr("action");var d=este.attr("data-to");a.post(b,este.serialize(),function(b){var e=a("#"+d);e.html(b);e.hide();e.show("slow");c.attr("disabled",null)})},cUpdaterSelect:function(){var b=a(this),c=a("#"+b.data("update"));url=b.data("url");c.empty();a.get(url,{id:b.val()},function(b){for(i in b){var f=a("").text(b[i]).val(i);c.append(f)}},"json")},bind:function(){a("a.js-confirm, input.js-confirm").on("click",this.cConfirm);a("a.js-remote").on("click",
6 | this.cRemote);a("a.js-remote-confirm").on("click",this.cRemoteConfirm);a("a.js-show").on("click",this.cFx("show"));a("a.js-hide").on("click",this.cFx("hide"));a("a.js-toggle").on("click",this.cFx("toggle"));a("a.js-fade-in").on("click",this.cFx("fadeIn"));a("a.js-fade-out").on("click",this.cFx("fadeOut"));a("form.js-remote").on("submit",this.cFRemote);a("select.js-remote").on("change",this.cUpdaterSelect);a.KumbiaPHP.bindDatePicker()},autoload:function(){var b=a("[class*='jp-']");a.each(b,function(b){var d=
7 | a(this).attr("class").split(" ");for(b in d)"jp-"==d[b].substr(0,3)&&-1==a.inArray(d[b].substr(3),a.KumbiaPHP.plugin)&&a.KumbiaPHP.plugin.push(d[b].substr(3))});b=a("head");for(i in a.KumbiaPHP.plugin)a.ajaxSetup({cache:!0}),b.append(''),a.getScript(a.KumbiaPHP.publicPath+"javascript/jquery/jquery."+a.KumbiaPHP.plugin[i]+".js",function(){})},bindDatePicker:function(){var b=a("input.js-datepicker"),
8 | c=function(){b.each(function(){var b={monthSelector:!0,yearSelector:!0},c=a(this);void 0!=c.attr("min")&&(b.dateMin=c.attr("min").split("-"));void 0!=c.attr("max")&&(b.dateMax=c.attr("max").split("-"));c.pickadate(b)})};if("undefined"!=typeof a.pickadate)return c();a("head").append('');jQuery.ajax({dataType:"script",cache:!0,url:this.publicPath+"javascript/jquery/pickadate.js"}).done(function(){c()})},initialize:function(){var b=
9 | a("script:last").attr("src");this.publicPath=b.substr(0,b.length-37);a(function(){a.KumbiaPHP.bind();a.KumbiaPHP.autoload()})}};a.KumbiaPHP.initialize()})(jQuery);
10 |
--------------------------------------------------------------------------------
/public/js/app.js:
--------------------------------------------------------------------------------
1 | // New KumbiaJS
2 |
--------------------------------------------------------------------------------
/public/js/minimal-theme-switcher.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Minimal theme switcher
3 | *
4 | * Pico.css - https://picocss.com
5 | * Copyright 2019-2023 - Licensed under MIT
6 | * Copyright 2024 Updated for Koot
7 | */
8 |
9 | const themeSwitcher = {
10 | // Config
11 | buttonsTarget: ".theme-switcher",
12 | rootAttribute: "data-theme",
13 | localStorageKey: "kootPreferredColorScheme",
14 |
15 | // Init
16 | init() {
17 | this.scheme = this.schemeFromLocalStorage ?? this.preferredColorScheme
18 | this.initSwitchers()
19 | },
20 |
21 | // Get color scheme from local storage
22 | get schemeFromLocalStorage() {
23 | return window.localStorage?.getItem(this.localStorageKey)
24 | },
25 |
26 | // Preferred color scheme
27 | get preferredColorScheme() {
28 | return window.matchMedia?.("(prefers-color-scheme: dark)").matches ? "dark" : "light";
29 | },
30 |
31 | // Init switchers
32 | initSwitchers() {
33 | const buttons = document.querySelectorAll(this.buttonsTarget)
34 | buttons.forEach((button) => {
35 | button.addEventListener(
36 | "click",
37 | (event) => {
38 | event.preventDefault()
39 | // Set scheme
40 | this.toogleScheme()
41 | },
42 | false
43 | )
44 | })
45 | },
46 |
47 | // Set scheme
48 | set scheme(scheme) {
49 | if (! scheme in ["dark", "light"]) {
50 | return
51 | }
52 | this._scheme = scheme
53 | this.applyScheme()
54 | this.schemeToLocalStorage()
55 | },
56 |
57 | // Get scheme
58 | get scheme() {
59 | return this._scheme
60 | },
61 |
62 | toogleScheme() {
63 | this.scheme = "dark" == this.scheme ? "light" : "dark"
64 | },
65 | // Apply scheme
66 | applyScheme() {
67 | document.querySelector("html").setAttribute(this.rootAttribute, this.scheme)
68 | },
69 |
70 | // Store scheme to local storage
71 | schemeToLocalStorage() {
72 | window.localStorage?.setItem(this.localStorageKey, this.scheme)
73 | },
74 | }
75 |
76 | // Init
77 | themeSwitcher.init()
78 |
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | User-agent: *
2 | Disallow:
3 |
--------------------------------------------------------------------------------
/public/temp/index.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/temp/index.html
--------------------------------------------------------------------------------
/public/web.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------