diff --git a/README.md b/README.md index bc31c3160..b1af04d91 100644 --- a/README.md +++ b/README.md @@ -20,13 +20,13 @@ If you're interested in contributing to Pushword, please read our [contributing ## Credits -- [PiedWeb](https://piedweb.com) -- [All Contributors](https://github.com/Pushword/Core/graphs/contributors) +- [PiedWeb](https://piedweb.com) +- [All Contributors](https://github.com/Pushword/Core/graphs/contributors) ## License The MIT License (MIT). Please see [License File](https://pushword.piedweb.com/license#license) for more information.

-PHP Packages Open Source +PHP Packages Open Source

diff --git a/composer.json b/composer.json index 3b08a32a0..7cd2f6093 100644 --- a/composer.json +++ b/composer.json @@ -34,7 +34,7 @@ "piedweb/render-html-attributes": "^2.0.1", "piedweb/url-harvester": "^0.0.27", "sensio/framework-extra-bundle": "^5.6", - "sonata-project/admin-bundle": "dev-master#3512d192562ca4ac48c306388f5579982e2faf43", + "sonata-project/admin-bundle": "dev-master#f34ae30d169132b17f3151fa294a80c57247a8a9", "sonata-project/doctrine-orm-admin-bundle": "4.x-dev", "spatie/image-optimizer": "^1.3", "spatie/yaml-front-matter": "^2.0", diff --git a/docs/404.html b/docs/404.html index 011959f2c..affcdd049 100644 --- a/docs/404.html +++ b/docs/404.html @@ -1 +1 @@ -Oops! Une erreur...

Oops! Une erreur...

Un écrou semble s'être dévisser.
Merci de nous informer sur votre environnement lorsque cette erreur c'est produite.

Retour

\ No newline at end of file +Oops! Une erreur...

Oops! Une erreur...

Un écrou semble s'être dévisser.
Merci de nous informer sur votre environnement lorsque cette erreur c'est produite.

Retour

\ No newline at end of file diff --git a/docs/architecture.html b/docs/architecture.html index eb056b7a1..5c277c8b4 100644 --- a/docs/architecture.html +++ b/docs/architecture.html @@ -1 +1 @@ - Puswhord Code Architecture

The Code Architecture

Are you searching for :

  • organizing your own app code : see symfony good practices or look at the demo app
  • organizing the code for a pushword extension : see create an extension

Else, you are at the good place.

The code for all officially maintained extension and the core is kept in an unique repository adopting the mono-repository.

The core contain the minimum features, then everything is done via extension.

Each extension are facultative.

Keeping all this extensions in one repository permit to test them easily, to understand the code easily and to code much quicker.

The skeleton isn't a real skeleton (copy and install).

It's used for testing, demo, using for generating the docs and a few class from skeleton are extracted by the default installer.

On top of Symfony

Each package (except skeleton, installer and js-helper) is built as a symfony bundle.

The core package required a symfony app instaled to be functionnel.

When you know that, you just have to learn how to make a bundle for symfony and you will know how to make an extension for pushword.

There is some simple example like flat or more complex like conversation (and more respecting the symfony best practices).

Learn more about create an extension for Puswhord

\ No newline at end of file + Puswhord Code Architecture

The Code Architecture

Are you searching for :

  • organizing your own app code : see symfony good practices or look at the demo app
  • organizing the code for a pushword extension : see create an extension

Else, you are at the good place.

The code for all officially maintained extension and the core is kept in an unique repository adopting the mono-repository.

The core contain the minimum features, then everything is done via extension.

Each extension are facultative.

Keeping all this extensions in one repository permit to test them easily, to understand the code easily and to code much quicker.

The skeleton isn't a real skeleton (copy and install).

It's used for testing, demo, using for generating the docs and a few class from skeleton are extracted by the default installer.

On top of Symfony

Each package (except skeleton, installer and js-helper) is built as a symfony bundle.

The core package required a symfony app instaled to be functionnel.

When you know that, you just have to learn how to make a bundle for symfony and you will know how to make an extension for pushword.

There is some simple example like flat or more complex like conversation (and more respecting the symfony best practices).

Learn more about create an extension for Puswhord

\ No newline at end of file diff --git a/docs/assets/tw.css b/docs/assets/tw.css index 71b454b4f..e9b7d914e 100644 --- a/docs/assets/tw.css +++ b/docs/assets/tw.css @@ -1 +1 @@ -/*! modern-normalize v1.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */:root{-moz-tab-size:4;-o-tab-size:4;tab-size:4}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji}hr{height:0;color:inherit}strong{font-weight:bolder}code,pre{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:1em}small{font-size:80%}button,input,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button{text-transform:none}[type=button],[type=submit],button{-webkit-appearance:button}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}blockquote,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}ol,ul{list-style:none;margin:0;padding:0}html{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{font-family:inherit;line-height:inherit}*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#9ca3af}input::placeholder,textarea::placeholder{color:#9ca3af}button{cursor:pointer}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,textarea{padding:0;line-height:inherit;color:inherit}code,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}iframe,img,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:#333;max-width:65ch}.prose [class~=lead]{color:#4b5563;font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose a{color:#111827;text-decoration:underline;font-weight:500}.prose strong{color:#111827;font-weight:600}.prose ol{counter-reset:list-counter;margin-top:1.25em;margin-bottom:1.25em}.prose ol>li{position:relative;counter-increment:list-counter;padding-left:1.75em}.prose ol>li:before{content:counter(list-counter) ".";position:absolute;font-weight:400;color:#6b7280;left:0}.prose ul>li{position:relative;padding-left:1.75em}.prose ul>li:before{content:"";position:absolute;background-color:#4b5563;border-radius:50%;width:.375em;height:.375em;top:.6875em;left:.25em}.prose hr{border-color:#e5e7eb;border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose blockquote{font-weight:500;font-style:italic;color:#111827;border-left-width:.25rem;border-left-color:#e5e7eb;quotes:"\201C""\201D""\2018""\2019";margin-top:1.6em;margin-bottom:1.6em;padding-left:1em}.prose blockquote p:first-of-type:before{content:open-quote}.prose blockquote p:last-of-type:after{content:close-quote}.prose h1{color:#111827;font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose h2{color:#111827;font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose h3{font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose h3,.prose h4{color:#111827;font-weight:600}.prose h4{margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose figure figcaption{color:#6b7280;font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose code{color:#111827;font-weight:400;font-size:85%;background-color:#e5e7eb;border-radius:.375rem;padding:.2em .4em;text-decoration:none}.prose a code{color:#111827}.prose pre{color:#e5e7eb;background-color:#1f2937;overflow-x:auto;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding:.8571429em 1.1428571em}.prose pre code{background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:400;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose pre code:after,.prose pre code:before{content:""}.prose thead{color:#111827;font-weight:600;border-bottom-width:1px;border-bottom-color:#d1d5db}.prose tbody tr{border-bottom-width:1px;border-bottom-color:#e5e7eb}.prose tbody tr:last-child{border-bottom-width:0}.prose{font-size:1rem;line-height:1.75}.prose p{margin-top:1.25em;margin-bottom:1.25em}.prose figure,.prose img,.prose video{margin-top:2em;margin-bottom:2em}.prose figure>*{margin-top:0;margin-bottom:0}.prose h2 code{font-size:.875em}.prose h3 code{font-size:.9em}.prose ul{margin-top:1.25em;margin-bottom:1.25em}.prose li{margin-top:.5em;margin-bottom:.5em}.prose>ul>li p{margin-top:.75em;margin-bottom:.75em}.prose>ul>li>:first-child{margin-top:1.25em}.prose>ul>li>:last-child{margin-bottom:1.25em}.prose>ol>li>:first-child{margin-top:1.25em}.prose>ol>li>:last-child{margin-bottom:1.25em}.prose ol ol,.prose ol ul,.prose ul ol,.prose ul ul{margin-top:.75em;margin-bottom:.75em}.prose>:first-child,.prose h2+*,.prose h3+*,.prose h4+*,.prose hr+*{margin-top:0}.prose>:last-child{margin-bottom:0}.prose a,.prose span[data-rot]{box-shadow:inset 0 -6px 0 #fde68a;color:#333;text-decoration:none}.prose a:hover,.prose span[data-rot]:hover{opacity:.75}.prose-sm{font-size:.875rem;line-height:1.7142857}.prose-sm p{margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm [class~=lead]{font-size:1.2857143em;line-height:1.5555556;margin-top:.8888889em;margin-bottom:.8888889em}.prose-sm blockquote{margin-top:1.3333333em;margin-bottom:1.3333333em;padding-left:1.1111111em}.prose-sm h1{font-size:2.1428571em;margin-top:0;margin-bottom:.8em;line-height:1.2}.prose-sm h2{font-size:1.4285714em;margin-top:1.6em;margin-bottom:.8em;line-height:1.4}.prose-sm h3{font-size:1.2857143em;margin-top:1.5555556em;margin-bottom:.4444444em;line-height:1.5555556}.prose-sm h4{margin-top:1.4285714em;margin-bottom:.5714286em;line-height:1.4285714}.prose-sm figure,.prose-sm img,.prose-sm video{margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm figure>*{margin-top:0;margin-bottom:0}.prose-sm figure figcaption{font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.prose-sm code{font-size:.8571429em}.prose-sm h2 code{font-size:.9em}.prose-sm h3 code{font-size:.8888889em}.prose-sm pre{font-size:.8571429em;line-height:1.6666667;margin-top:1.6666667em;margin-bottom:1.6666667em;border-radius:.25rem;padding:.6666667em 1em}.prose-sm ol,.prose-sm ul{margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm li{margin-top:.2857143em;margin-bottom:.2857143em}.prose-sm ol>li{padding-left:1.5714286em}.prose-sm ol>li:before{left:0}.prose-sm ul>li{padding-left:1.5714286em}.prose-sm ul>li:before{height:.3571429em;width:.3571429em;top:.67857em;left:.2142857em}.prose-sm>ul>li p{margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm>ul>li>:first-child{margin-top:1.1428571em}.prose-sm>ul>li>:last-child{margin-bottom:1.1428571em}.prose-sm>ol>li>:first-child{margin-top:1.1428571em}.prose-sm>ol>li>:last-child{margin-bottom:1.1428571em}.prose-sm ol ol,.prose-sm ol ul,.prose-sm ul ol,.prose-sm ul ul{margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm hr{margin-top:2.8571429em;margin-bottom:2.8571429em}.prose-sm>:first-child,.prose-sm h2+*,.prose-sm h3+*,.prose-sm h4+*,.prose-sm hr+*{margin-top:0}.prose-sm>:last-child{margin-bottom:0}.prose-lg{font-size:1.125rem;line-height:1.7777778}.prose-lg p{margin-top:1.3333333em;margin-bottom:1.3333333em}.prose-lg [class~=lead]{font-size:1.2222222em;line-height:1.4545455;margin-top:1.0909091em;margin-bottom:1.0909091em}.prose-lg blockquote{margin-top:1.6666667em;margin-bottom:1.6666667em;padding-left:1em}.prose-lg h1{font-size:2.6666667em;margin-top:0;margin-bottom:.8333333em;line-height:1}.prose-lg h2{font-size:1.6666667em;margin-top:1.8666667em;margin-bottom:1.0666667em;line-height:1.3333333}.prose-lg h3{font-size:1.3333333em;margin-top:1.6666667em;margin-bottom:.6666667em;line-height:1.5}.prose-lg h4{margin-top:1.7777778em;margin-bottom:.4444444em;line-height:1.5555556}.prose-lg figure,.prose-lg img,.prose-lg video{margin-top:1.7777778em;margin-bottom:1.7777778em}.prose-lg figure>*{margin-top:0;margin-bottom:0}.prose-lg figure figcaption{font-size:.8888889em;line-height:1.5;margin-top:1em}.prose-lg code{font-size:.8888889em}.prose-lg h2 code{font-size:.8666667em}.prose-lg h3 code{font-size:.875em}.prose-lg pre{font-size:.8888889em;line-height:1.75;margin-top:2em;margin-bottom:2em;border-radius:.375rem;padding:1em 1.5em}.prose-lg ol,.prose-lg ul{margin-top:1.3333333em;margin-bottom:1.3333333em}.prose-lg li{margin-top:.6666667em;margin-bottom:.6666667em}.prose-lg ol>li{padding-left:1.6666667em}.prose-lg ol>li:before{left:0}.prose-lg ul>li{padding-left:1.6666667em}.prose-lg ul>li:before{width:.3333333em;height:.3333333em;top:.72222em;left:.2222222em}.prose-lg>ul>li p{margin-top:.8888889em;margin-bottom:.8888889em}.prose-lg>ul>li>:first-child{margin-top:1.3333333em}.prose-lg>ul>li>:last-child{margin-bottom:1.3333333em}.prose-lg>ol>li>:first-child{margin-top:1.3333333em}.prose-lg>ol>li>:last-child{margin-bottom:1.3333333em}.prose-lg ol ol,.prose-lg ol ul,.prose-lg ul ol,.prose-lg ul ul{margin-top:.8888889em;margin-bottom:.8888889em}.prose-lg hr{margin-top:3.1111111em;margin-bottom:3.1111111em}.prose-lg>:first-child,.prose-lg h2+*,.prose-lg h3+*,.prose-lg h4+*,.prose-lg hr+*{margin-top:0}.prose-lg>:last-child{margin-bottom:0}.aspect-w-16{position:relative;padding-bottom:calc(var(--tw-aspect-h)/var(--tw-aspect-w)*100%)}.aspect-w-16>*{position:absolute;height:100%;width:100%;top:0;right:0;bottom:0;left:0}.aspect-w-16{--tw-aspect-w:16}.aspect-h-9{--tw-aspect-h:9}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0.25rem*var(--tw-space-x-reverse));margin-left:calc(0.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.-space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1px*var(--tw-space-y-reverse))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.bg-primary,.hover\:bg-primary:hover{background-color:var(--primary)}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-yellow-500{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.to-yellow-600{--tw-gradient-to:#d97706}.bg-opacity-25{--tw-bg-opacity:0.25}.bg-opacity-75,.hover\:bg-opacity-75:hover{--tw-bg-opacity:0.75}.bg-center{background-position:50%}.bg-contain{background-size:contain}.border-transparent{border-color:transparent}.border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.focus\:border-primary:focus{border-color:var(--primary)}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-full{border-radius:9999px}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.border-2{border-width:2px}.border{border-width:1px}.border-b-2{border-bottom-width:2px}.border-l-4{border-left-width:4px}.border-t{border-top-width:1px}.border-r{border-right-width:1px}.border-b{border-bottom-width:1px}.cursor-pointer{cursor:pointer}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.grid{display:grid}.hidden{display:none}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.items-stretch{align-items:stretch}.content-center{align-content:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-light{font-weight:300}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.h-1{height:.25rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-auto{height:auto}.h-full{height:100%}.text-xs{font-size:.75rem;line-height:1rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.leading-tight{line-height:1.25}.leading-relaxed{line-height:1.625}.list-inside{list-style-position:inside}.list-none{list-style-type:none}.list-disc{list-style-type:disc}.m-0{margin:0}.m-1{margin:.25rem}.m-2{margin:.5rem}.m-3{margin:.75rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-auto{margin-left:auto;margin-right:auto}.mt-0{margin-top:0}.mt-1{margin-top:.25rem}.mr-1{margin-right:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-2{margin-left:.5rem}.mt-3{margin-top:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mb-4{margin-bottom:1rem}.mt-5{margin-top:1.25rem}.mb-5{margin-bottom:1.25rem}.mt-6{margin-top:1.5rem}.mb-6{margin-bottom:1.5rem}.mt-8{margin-top:2rem}.mr-8{margin-right:2rem}.mb-8{margin-bottom:2rem}.mt-10{margin-top:2.5rem}.mt-16{margin-top:4rem}.mr-24{margin-right:6rem}.ml-auto{margin-left:auto}.-mt-1{margin-top:-.25rem}.-ml-6{margin-left:-1.5rem}.max-w-none{max-width:none}.max-w-md{max-width:28rem}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-5xl{max-width:64rem}.max-w-screen-sm{max-width:640px}.max-w-screen-md{max-width:768px}.max-w-screen-lg{max-width:1024px}.max-w-screen-xl{max-width:1280px}.max-w-screen-2xl{max-width:1536px}.min-h-screen{min-height:100vh}.hover\:opacity-75:hover{opacity:.75}.focus\:outline-none:focus,.outline-none{outline:2px solid transparent;outline-offset:2px}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.pt-1{padding-top:.25rem}.pl-1{padding-left:.25rem}.pr-3{padding-right:.75rem}.pl-3{padding-left:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.pb-10{padding-bottom:2.5rem}.pt-12{padding-top:3rem}.placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.placeholder-gray-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.inset-y-0{top:0;bottom:0}.top-0{top:0}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}*{--tw-shadow:0 0 transparent}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.shadow-inner,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}*{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 transparent)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:ring-primary:focus{--tw-ring-color:var(--primary)}.fill-current{fill:currentColor}.text-center{text-align:center}.text-right{text-align:right}.text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.group:hover .group-hover\:text-primary,.text-primary{color:var(--primary)}.hover\:text-white:hover{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.hover\:text-primary:hover{color:var(--primary)}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.uppercase{text-transform:uppercase}.hover\:underline:hover{text-decoration:underline}.tracking-wide{letter-spacing:.025em}.visible{visibility:visible}.w-0{width:0}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-20{width:5rem}.w-24{width:6rem}.w-60{width:15rem}.w-2\/5{width:40%}.w-full{width:100%}.focus\:w-60:focus{width:15rem}.z-40{z-index:40}.z-50{z-index:50}.focus\:z-10:focus{z-index:10}.gap-1{gap:.25rem}.gap-4{gap:1rem}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.col-span-2{grid-column:span 2/span 2}.transform{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-12{--tw-rotate:-12deg}.transition-colors{transition-property:background-color,border-color,color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}@-webkit-keyframes spin{to{transform:rotate(1turn)}}@keyframes spin{to{transform:rotate(1turn)}}@keyframes ping{75%,to{transform:scale(2);opacity:0}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}html{font-family:var(--font-family);scroll-behavior:smooth}.w-full-vw{width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw}@media (min-width:640px){.sm\:flex-row{flex-direction:row}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:w-1\/2{width:50%}}@media (min-width:768px){.md\:prose-lg{font-size:1.125rem;line-height:1.7777778}.md\:prose-lg p{margin-top:1.3333333em;margin-bottom:1.3333333em}.md\:prose-lg [class~=lead]{font-size:1.2222222em;line-height:1.4545455;margin-top:1.0909091em;margin-bottom:1.0909091em}.md\:prose-lg blockquote{margin-top:1.6666667em;margin-bottom:1.6666667em;padding-left:1em}.md\:prose-lg h1{font-size:2.6666667em;margin-top:0;margin-bottom:.8333333em;line-height:1}.md\:prose-lg h2{font-size:1.6666667em;margin-top:1.8666667em;margin-bottom:1.0666667em;line-height:1.3333333}.md\:prose-lg h3{font-size:1.3333333em;margin-top:1.6666667em;margin-bottom:.6666667em;line-height:1.5}.md\:prose-lg h4{margin-top:1.7777778em;margin-bottom:.4444444em;line-height:1.5555556}.md\:prose-lg figure,.md\:prose-lg img,.md\:prose-lg video{margin-top:1.7777778em;margin-bottom:1.7777778em}.md\:prose-lg figure>*{margin-top:0;margin-bottom:0}.md\:prose-lg figure figcaption{font-size:.8888889em;line-height:1.5;margin-top:1em}.md\:prose-lg code{font-size:.8888889em}.md\:prose-lg h2 code{font-size:.8666667em}.md\:prose-lg h3 code{font-size:.875em}.md\:prose-lg pre{font-size:.8888889em;line-height:1.75;margin-top:2em;margin-bottom:2em;border-radius:.375rem;padding:1em 1.5em}.md\:prose-lg ol,.md\:prose-lg ul{margin-top:1.3333333em;margin-bottom:1.3333333em}.md\:prose-lg li{margin-top:.6666667em;margin-bottom:.6666667em}.md\:prose-lg ol>li{padding-left:1.6666667em}.md\:prose-lg ol>li:before{left:0}.md\:prose-lg ul>li{padding-left:1.6666667em}.md\:prose-lg ul>li:before{width:.3333333em;height:.3333333em;top:.72222em;left:.2222222em}.md\:prose-lg>ul>li p{margin-top:.8888889em;margin-bottom:.8888889em}.md\:prose-lg>ul>li>:first-child{margin-top:1.3333333em}.md\:prose-lg>ul>li>:last-child{margin-bottom:1.3333333em}.md\:prose-lg>ol>li>:first-child{margin-top:1.3333333em}.md\:prose-lg>ol>li>:last-child{margin-bottom:1.3333333em}.md\:prose-lg ol ol,.md\:prose-lg ol ul,.md\:prose-lg ul ol,.md\:prose-lg ul ul{margin-top:.8888889em;margin-bottom:.8888889em}.md\:prose-lg hr{margin-top:3.1111111em;margin-bottom:3.1111111em}.md\:prose-lg>:first-child,.md\:prose-lg h2+*,.md\:prose-lg h3+*,.md\:prose-lg h4+*,.md\:prose-lg hr+*{margin-top:0}.md\:prose-lg>:last-child{margin-bottom:0}.md\:space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0.75rem*var(--tw-space-x-reverse));margin-left:calc(0.75rem*(1 - var(--tw-space-x-reverse)))}.md\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.md\:block{display:block}.md\:inline-block{display:inline-block}.md\:flex-row{flex-direction:row}.md\:mx-6{margin-left:1.5rem;margin-right:1.5rem}.md\:-mt-24{margin-top:-6rem}.md\:max-w-screen-2xl{max-width:1536px}.md\:p-6{padding:1.5rem}.md\:px-20{padding-left:5rem;padding-right:5rem}.md\:focus\:w-full:focus,.md\:w-full{width:100%}.md\:gap-3{gap:.75rem}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:col-span-4{grid-column:span 4/span 4}}@media (min-width:1024px){.lg\:block{display:block}.lg\:inline-block{display:inline-block}.lg\:hidden{display:none}.lg\:order-1{order:1}.lg\:order-2{order:2}.lg\:text-xs{font-size:.75rem;line-height:1rem}.lg\:mr-0{margin-right:0}.lg\:ml-0{margin-left:0}.lg\:mr-3{margin-right:.75rem}.lg\:mb-3{margin-bottom:.75rem}.lg\:-mb-3{margin-bottom:-.75rem}.lg\:-ml-10{margin-left:-2.5rem}.lg\:max-w-xs{max-width:20rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:absolute{position:absolute}.lg\:w-auto{width:auto}.lg\:w-3\/4{width:75%}.lg\:w-1\/5{width:20%}.lg\:w-4\/5{width:80%}}@media (min-width:1280px){.xl\:space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.xl\:flex-col{flex-direction:column}.xl\:mt-0{margin-top:0}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:col-span-2{grid-column:span 2/span 2}.xl\:col-start-auto{grid-column-start:auto}}@media (prefers-color-scheme:dark){.dark\:prose-light{color:#f3f4f6}.dark\:prose-light a,.dark\:prose-light span[data-rot]{color:#fff}.dark\:prose-light [class~=lead]{color:#d1d5db}.dark\:prose-light strong{color:#fff}.dark\:prose-light ol>li:before{color:#9ca3af}.dark\:prose-light ul>li:before{background-color:#4b5563}.dark\:prose-light hr{border-color:#e5e7eb}.dark\:prose-light blockquote{color:#e5e7eb;border-left-color:#4b5563}.dark\:prose-light h1,.dark\:prose-light h2,.dark\:prose-light h3,.dark\:prose-light h4{color:#f3f4f6}.dark\:prose-light figure figcaption{color:#9ca3af}.dark\:prose-light code{background-color:#4b5563;color:#f3f4f6}.dark\:prose-light a code{color:#f3f4f6}.dark\:prose-light pre{color:#e5e7eb;background-color:#4b5563}.dark\:prose-light thead{color:#f3f4f6;border-bottom-color:#9ca3af}.dark\:prose-light tbody tr{border-bottom-color:#4b5563}.dark\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.dark\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.dark\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.dark\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.dark\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.dark\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.dark\:hover\:text-gray-100:hover{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}} \ No newline at end of file +/*! modern-normalize v1.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */:root{-moz-tab-size:4;-o-tab-size:4;tab-size:4}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji}hr{height:0;color:inherit}strong{font-weight:bolder}code,pre{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:1em}small{font-size:80%}button,input,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button{text-transform:none}[type=button],[type=submit],button{-webkit-appearance:button}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}blockquote,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}ol,ul{list-style:none;margin:0;padding:0}html{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{font-family:inherit;line-height:inherit}*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#9ca3af}input::placeholder,textarea::placeholder{color:#9ca3af}button{cursor:pointer}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,textarea{padding:0;line-height:inherit;color:inherit}code,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}iframe,img,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:#333;max-width:65ch}.prose [class~=lead]{color:#4b5563;font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose a{color:#111827;text-decoration:underline;font-weight:500}.prose strong{color:#111827;font-weight:600}.prose ol{counter-reset:list-counter;margin-top:1.25em;margin-bottom:1.25em}.prose ol>li{position:relative;counter-increment:list-counter;padding-left:1.75em}.prose ol>li:before{content:counter(list-counter) ".";position:absolute;font-weight:400;color:#6b7280;left:0}.prose ul>li{position:relative;padding-left:1.75em}.prose ul>li:before{content:"";position:absolute;background-color:#4b5563;border-radius:50%;width:.375em;height:.375em;top:.6875em;left:.25em}.prose hr{border-color:#e5e7eb;border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose blockquote{font-weight:500;font-style:italic;color:#111827;border-left-width:.25rem;border-left-color:#e5e7eb;quotes:"\201C""\201D""\2018""\2019";margin-top:1.6em;margin-bottom:1.6em;padding-left:1em}.prose blockquote p:first-of-type:before{content:open-quote}.prose blockquote p:last-of-type:after{content:close-quote}.prose h1{color:#111827;font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose h2{color:#111827;font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose h3{font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose h3,.prose h4{color:#111827;font-weight:600}.prose h4{margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose figure figcaption{color:#6b7280;font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose code{color:#111827;font-weight:400;font-size:85%;background-color:#e5e7eb;border-radius:.375rem;padding:.2em .4em;text-decoration:none}.prose a code{color:#111827}.prose pre{color:#e5e7eb;background-color:#1f2937;overflow-x:auto;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding:.8571429em 1.1428571em}.prose pre code{background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:400;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose pre code:after,.prose pre code:before{content:""}.prose thead{color:#111827;font-weight:600;border-bottom-width:1px;border-bottom-color:#d1d5db}.prose tbody tr{border-bottom-width:1px;border-bottom-color:#e5e7eb}.prose tbody tr:last-child{border-bottom-width:0}.prose{font-size:1rem;line-height:1.75}.prose p{margin-top:1.25em;margin-bottom:1.25em}.prose figure,.prose img,.prose video{margin-top:2em;margin-bottom:2em}.prose figure>*{margin-top:0;margin-bottom:0}.prose h2 code{font-size:.875em}.prose h3 code{font-size:.9em}.prose ul{margin-top:1.25em;margin-bottom:1.25em}.prose li{margin-top:.5em;margin-bottom:.5em}.prose>ul>li p{margin-top:.75em;margin-bottom:.75em}.prose>ul>li>:first-child{margin-top:1.25em}.prose>ul>li>:last-child{margin-bottom:1.25em}.prose>ol>li>:first-child{margin-top:1.25em}.prose>ol>li>:last-child{margin-bottom:1.25em}.prose ol ol,.prose ol ul,.prose ul ol,.prose ul ul{margin-top:.75em;margin-bottom:.75em}.prose>:first-child,.prose h2+*,.prose h3+*,.prose h4+*,.prose hr+*{margin-top:0}.prose>:last-child{margin-bottom:0}.prose a,.prose span[data-rot]{box-shadow:inset 0 -6px 0 #fed7aa;color:#333;text-decoration:none}.prose a:hover,.prose span[data-rot]:hover{opacity:.75}.prose-sm{font-size:.875rem;line-height:1.7142857}.prose-sm p{margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm [class~=lead]{font-size:1.2857143em;line-height:1.5555556;margin-top:.8888889em;margin-bottom:.8888889em}.prose-sm blockquote{margin-top:1.3333333em;margin-bottom:1.3333333em;padding-left:1.1111111em}.prose-sm h1{font-size:2.1428571em;margin-top:0;margin-bottom:.8em;line-height:1.2}.prose-sm h2{font-size:1.4285714em;margin-top:1.6em;margin-bottom:.8em;line-height:1.4}.prose-sm h3{font-size:1.2857143em;margin-top:1.5555556em;margin-bottom:.4444444em;line-height:1.5555556}.prose-sm h4{margin-top:1.4285714em;margin-bottom:.5714286em;line-height:1.4285714}.prose-sm figure,.prose-sm img,.prose-sm video{margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm figure>*{margin-top:0;margin-bottom:0}.prose-sm figure figcaption{font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.prose-sm code{font-size:.8571429em}.prose-sm h2 code{font-size:.9em}.prose-sm h3 code{font-size:.8888889em}.prose-sm pre{font-size:.8571429em;line-height:1.6666667;margin-top:1.6666667em;margin-bottom:1.6666667em;border-radius:.25rem;padding:.6666667em 1em}.prose-sm ol,.prose-sm ul{margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm li{margin-top:.2857143em;margin-bottom:.2857143em}.prose-sm ol>li{padding-left:1.5714286em}.prose-sm ol>li:before{left:0}.prose-sm ul>li{padding-left:1.5714286em}.prose-sm ul>li:before{height:.3571429em;width:.3571429em;top:.67857em;left:.2142857em}.prose-sm>ul>li p{margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm>ul>li>:first-child{margin-top:1.1428571em}.prose-sm>ul>li>:last-child{margin-bottom:1.1428571em}.prose-sm>ol>li>:first-child{margin-top:1.1428571em}.prose-sm>ol>li>:last-child{margin-bottom:1.1428571em}.prose-sm ol ol,.prose-sm ol ul,.prose-sm ul ol,.prose-sm ul ul{margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm hr{margin-top:2.8571429em;margin-bottom:2.8571429em}.prose-sm>:first-child,.prose-sm h2+*,.prose-sm h3+*,.prose-sm h4+*,.prose-sm hr+*{margin-top:0}.prose-sm>:last-child{margin-bottom:0}.prose-lg{font-size:1.125rem;line-height:1.7777778}.prose-lg p{margin-top:1.3333333em;margin-bottom:1.3333333em}.prose-lg [class~=lead]{font-size:1.2222222em;line-height:1.4545455;margin-top:1.0909091em;margin-bottom:1.0909091em}.prose-lg blockquote{margin-top:1.6666667em;margin-bottom:1.6666667em;padding-left:1em}.prose-lg h1{font-size:2.6666667em;margin-top:0;margin-bottom:.8333333em;line-height:1}.prose-lg h2{font-size:1.6666667em;margin-top:1.8666667em;margin-bottom:1.0666667em;line-height:1.3333333}.prose-lg h3{font-size:1.3333333em;margin-top:1.6666667em;margin-bottom:.6666667em;line-height:1.5}.prose-lg h4{margin-top:1.7777778em;margin-bottom:.4444444em;line-height:1.5555556}.prose-lg figure,.prose-lg img,.prose-lg video{margin-top:1.7777778em;margin-bottom:1.7777778em}.prose-lg figure>*{margin-top:0;margin-bottom:0}.prose-lg figure figcaption{font-size:.8888889em;line-height:1.5;margin-top:1em}.prose-lg code{font-size:.8888889em}.prose-lg h2 code{font-size:.8666667em}.prose-lg h3 code{font-size:.875em}.prose-lg pre{font-size:.8888889em;line-height:1.75;margin-top:2em;margin-bottom:2em;border-radius:.375rem;padding:1em 1.5em}.prose-lg ol,.prose-lg ul{margin-top:1.3333333em;margin-bottom:1.3333333em}.prose-lg li{margin-top:.6666667em;margin-bottom:.6666667em}.prose-lg ol>li{padding-left:1.6666667em}.prose-lg ol>li:before{left:0}.prose-lg ul>li{padding-left:1.6666667em}.prose-lg ul>li:before{width:.3333333em;height:.3333333em;top:.72222em;left:.2222222em}.prose-lg>ul>li p{margin-top:.8888889em;margin-bottom:.8888889em}.prose-lg>ul>li>:first-child{margin-top:1.3333333em}.prose-lg>ul>li>:last-child{margin-bottom:1.3333333em}.prose-lg>ol>li>:first-child{margin-top:1.3333333em}.prose-lg>ol>li>:last-child{margin-bottom:1.3333333em}.prose-lg ol ol,.prose-lg ol ul,.prose-lg ul ol,.prose-lg ul ul{margin-top:.8888889em;margin-bottom:.8888889em}.prose-lg hr{margin-top:3.1111111em;margin-bottom:3.1111111em}.prose-lg>:first-child,.prose-lg h2+*,.prose-lg h3+*,.prose-lg h4+*,.prose-lg hr+*{margin-top:0}.prose-lg>:last-child{margin-bottom:0}.aspect-w-16{position:relative;padding-bottom:calc(var(--tw-aspect-h)/var(--tw-aspect-w)*100%)}.aspect-w-16>*{position:absolute;height:100%;width:100%;top:0;right:0;bottom:0;left:0}.aspect-w-16{--tw-aspect-w:16}.aspect-h-9{--tw-aspect-h:9}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0.25rem*var(--tw-space-x-reverse));margin-left:calc(0.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.-space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1px*var(--tw-space-y-reverse))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.bg-primary,.hover\:bg-primary:hover{background-color:var(--primary)}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-yellow-500{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.to-yellow-600{--tw-gradient-to:#d97706}.bg-opacity-25{--tw-bg-opacity:0.25}.bg-opacity-75,.hover\:bg-opacity-75:hover{--tw-bg-opacity:0.75}.bg-center{background-position:50%}.bg-contain{background-size:contain}.border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.focus\:border-primary:focus{border-color:var(--primary)}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-full{border-radius:9999px}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.border-2{border-width:2px}.border{border-width:1px}.border-b-2{border-bottom-width:2px}.border-l-4{border-left-width:4px}.border-t{border-top-width:1px}.border-r{border-right-width:1px}.border-b{border-bottom-width:1px}.cursor-pointer{cursor:pointer}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.grid{display:grid}.hidden{display:none}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.items-stretch{align-items:stretch}.content-center{align-content:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-light{font-weight:300}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.h-1{height:.25rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-auto{height:auto}.h-full{height:100%}.text-xs{font-size:.75rem;line-height:1rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.leading-tight{line-height:1.25}.leading-relaxed{line-height:1.625}.list-inside{list-style-position:inside}.list-none{list-style-type:none}.list-disc{list-style-type:disc}.m-0{margin:0}.m-1{margin:.25rem}.m-2{margin:.5rem}.m-3{margin:.75rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-auto{margin-left:auto;margin-right:auto}.mt-0{margin-top:0}.mt-1{margin-top:.25rem}.mr-1{margin-right:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-2{margin-left:.5rem}.mt-3{margin-top:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mb-4{margin-bottom:1rem}.mt-5{margin-top:1.25rem}.mb-5{margin-bottom:1.25rem}.mt-6{margin-top:1.5rem}.mb-6{margin-bottom:1.5rem}.mt-8{margin-top:2rem}.mr-8{margin-right:2rem}.mb-8{margin-bottom:2rem}.mt-10{margin-top:2.5rem}.mt-16{margin-top:4rem}.mr-24{margin-right:6rem}.ml-auto{margin-left:auto}.-mt-1{margin-top:-.25rem}.-ml-6{margin-left:-1.5rem}.max-w-none{max-width:none}.max-w-md{max-width:28rem}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-5xl{max-width:64rem}.max-w-screen-sm{max-width:640px}.max-w-screen-md{max-width:768px}.max-w-screen-lg{max-width:1024px}.max-w-screen-2xl{max-width:1536px}.min-h-screen{min-height:100vh}.hover\:opacity-75:hover{opacity:.75}.focus\:outline-none:focus,.outline-none{outline:2px solid transparent;outline-offset:2px}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.pt-1{padding-top:.25rem}.pl-1{padding-left:.25rem}.pr-3{padding-right:.75rem}.pl-3{padding-left:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.pb-10{padding-bottom:2.5rem}.pt-12{padding-top:3rem}.placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.placeholder-gray-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.inset-y-0{top:0;bottom:0}.top-0{top:0}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}*{--tw-shadow:0 0 transparent}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.shadow-inner,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}*{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 transparent)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:ring-primary:focus{--tw-ring-color:var(--primary)}.fill-current{fill:currentColor}.text-center{text-align:center}.text-right{text-align:right}.text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.group:hover .group-hover\:text-primary,.text-primary{color:var(--primary)}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.hover\:text-primary:hover{color:var(--primary)}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.uppercase{text-transform:uppercase}.hover\:underline:hover{text-decoration:underline}.tracking-wide{letter-spacing:.025em}.visible{visibility:visible}.w-0{width:0}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-20{width:5rem}.w-24{width:6rem}.w-60{width:15rem}.w-2\/5{width:40%}.w-full{width:100%}.focus\:w-60:focus{width:15rem}.z-40{z-index:40}.z-50{z-index:50}.focus\:z-10:focus{z-index:10}.gap-1{gap:.25rem}.gap-4{gap:1rem}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.col-span-2{grid-column:span 2/span 2}.transform{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-12{--tw-rotate:-12deg}.transition-colors{transition-property:background-color,border-color,color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}@-webkit-keyframes spin{to{transform:rotate(1turn)}}@keyframes spin{to{transform:rotate(1turn)}}@keyframes ping{75%,to{transform:scale(2);opacity:0}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}html{font-family:var(--font-family);scroll-behavior:smooth}.w-full-vw{width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw}@media (min-width:640px){.sm\:flex-row{flex-direction:row}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:w-1\/2{width:50%}}@media (min-width:768px){.md\:prose-lg{font-size:1.125rem;line-height:1.7777778}.md\:prose-lg p{margin-top:1.3333333em;margin-bottom:1.3333333em}.md\:prose-lg [class~=lead]{font-size:1.2222222em;line-height:1.4545455;margin-top:1.0909091em;margin-bottom:1.0909091em}.md\:prose-lg blockquote{margin-top:1.6666667em;margin-bottom:1.6666667em;padding-left:1em}.md\:prose-lg h1{font-size:2.6666667em;margin-top:0;margin-bottom:.8333333em;line-height:1}.md\:prose-lg h2{font-size:1.6666667em;margin-top:1.8666667em;margin-bottom:1.0666667em;line-height:1.3333333}.md\:prose-lg h3{font-size:1.3333333em;margin-top:1.6666667em;margin-bottom:.6666667em;line-height:1.5}.md\:prose-lg h4{margin-top:1.7777778em;margin-bottom:.4444444em;line-height:1.5555556}.md\:prose-lg figure,.md\:prose-lg img,.md\:prose-lg video{margin-top:1.7777778em;margin-bottom:1.7777778em}.md\:prose-lg figure>*{margin-top:0;margin-bottom:0}.md\:prose-lg figure figcaption{font-size:.8888889em;line-height:1.5;margin-top:1em}.md\:prose-lg code{font-size:.8888889em}.md\:prose-lg h2 code{font-size:.8666667em}.md\:prose-lg h3 code{font-size:.875em}.md\:prose-lg pre{font-size:.8888889em;line-height:1.75;margin-top:2em;margin-bottom:2em;border-radius:.375rem;padding:1em 1.5em}.md\:prose-lg ol,.md\:prose-lg ul{margin-top:1.3333333em;margin-bottom:1.3333333em}.md\:prose-lg li{margin-top:.6666667em;margin-bottom:.6666667em}.md\:prose-lg ol>li{padding-left:1.6666667em}.md\:prose-lg ol>li:before{left:0}.md\:prose-lg ul>li{padding-left:1.6666667em}.md\:prose-lg ul>li:before{width:.3333333em;height:.3333333em;top:.72222em;left:.2222222em}.md\:prose-lg>ul>li p{margin-top:.8888889em;margin-bottom:.8888889em}.md\:prose-lg>ul>li>:first-child{margin-top:1.3333333em}.md\:prose-lg>ul>li>:last-child{margin-bottom:1.3333333em}.md\:prose-lg>ol>li>:first-child{margin-top:1.3333333em}.md\:prose-lg>ol>li>:last-child{margin-bottom:1.3333333em}.md\:prose-lg ol ol,.md\:prose-lg ol ul,.md\:prose-lg ul ol,.md\:prose-lg ul ul{margin-top:.8888889em;margin-bottom:.8888889em}.md\:prose-lg hr{margin-top:3.1111111em;margin-bottom:3.1111111em}.md\:prose-lg>:first-child,.md\:prose-lg h2+*,.md\:prose-lg h3+*,.md\:prose-lg h4+*,.md\:prose-lg hr+*{margin-top:0}.md\:prose-lg>:last-child{margin-bottom:0}.md\:space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0.75rem*var(--tw-space-x-reverse));margin-left:calc(0.75rem*(1 - var(--tw-space-x-reverse)))}.md\:rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.md\:block{display:block}.md\:inline-block{display:inline-block}.md\:flex-row{flex-direction:row}.md\:mx-6{margin-left:1.5rem;margin-right:1.5rem}.md\:-mt-24{margin-top:-6rem}.md\:max-w-screen-2xl{max-width:1536px}.md\:p-6{padding:1.5rem}.md\:py-9{padding-top:2.25rem;padding-bottom:2.25rem}.md\:px-20{padding-left:5rem;padding-right:5rem}.md\:focus\:w-full:focus,.md\:w-full{width:100%}.md\:gap-3{gap:.75rem}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:col-span-4{grid-column:span 4/span 4}}@media (min-width:1024px){.lg\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.lg\:border-r-0{border-right-width:0}.lg\:border-l{border-left-width:1px}.lg\:block{display:block}.lg\:inline-block{display:inline-block}.lg\:hidden{display:none}.lg\:order-1{order:1}.lg\:order-2{order:2}.lg\:text-xs{font-size:.75rem;line-height:1rem}.lg\:mx-auto{margin-left:auto;margin-right:auto}.lg\:mr-0{margin-right:0}.lg\:ml-0{margin-left:0}.lg\:mr-3{margin-right:.75rem}.lg\:mb-3{margin-bottom:.75rem}.lg\:-mb-3{margin-bottom:-.75rem}.lg\:-ml-10{margin-left:-2.5rem}.lg\:max-w-xs{max-width:20rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:absolute{position:absolute}.lg\:w-1\/4{width:25%}.lg\:w-3\/4{width:75%}.lg\:w-1\/5{width:20%}.lg\:w-4\/5{width:80%}}@media (min-width:1280px){.xl\:space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.xl\:flex-col{flex-direction:column}.xl\:mt-0{margin-top:0}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:col-span-2{grid-column:span 2/span 2}.xl\:col-start-auto{grid-column-start:auto}}@media (prefers-color-scheme:dark){.dark\:prose-light{color:#f3f4f6}.dark\:prose-light a,.dark\:prose-light span[data-rot]{color:#fff;box-shadow:inset 0 -6px 0 #9a3412}.dark\:prose-light [class~=lead]{color:#d1d5db}.dark\:prose-light strong{color:#fff}.dark\:prose-light ol>li:before{color:#9ca3af}.dark\:prose-light ul>li:before{background-color:#4b5563}.dark\:prose-light hr{border-color:#e5e7eb}.dark\:prose-light blockquote{color:#e5e7eb;border-left-color:#4b5563}.dark\:prose-light h1,.dark\:prose-light h2,.dark\:prose-light h3,.dark\:prose-light h4{color:#f3f4f6}.dark\:prose-light figure figcaption{color:#9ca3af}.dark\:prose-light code{background-color:#4b5563;color:#f3f4f6}.dark\:prose-light a code{color:#f3f4f6}.dark\:prose-light pre{color:#e5e7eb;background-color:#4b5563}.dark\:prose-light thead{color:#f3f4f6;border-bottom-color:#9ca3af}.dark\:prose-light tbody tr{border-bottom-color:#4b5563}.dark\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.dark\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.dark\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.dark\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.dark\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.dark\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.dark\:hover\:text-gray-100:hover{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}} \ No newline at end of file diff --git a/docs/command.html b/docs/command.html index ca935f093..16965dcf1 100644 --- a/docs/command.html +++ b/docs/command.html @@ -1,4 +1,4 @@ - Manage your Pushword CMS with command

Command

At any moment, you can get the avalaible command from symfony by typing php bin/console list.

Now, let's see what command we have and how useful there are.

The list above may vary depending on installed extensions

To get more details on each command line, just type -h (eg php bin/console pushword:user:create -h)

 pushword
+	Manage your Pushword CMS with command  

Command

At any moment, you can get the avalaible command from symfony by typing php bin/console list.

Now, let's see what command we have and how useful there are.

The list above may vary depending on installed extensions

To get more details on each command line, just type -h (eg php bin/console pushword:user:create -h)

 pushword
   pushword:conversation:notify               Send a mail (notification) with the latests messages stored (this comand is useful to program a cron).
   pushword:flat:import                       Syncing flat file inside database
   pushword:flat:export                       Export database toward file (yaml+json)
@@ -7,4 +7,4 @@
   pushword:page:scan                         Find dead links, 404, 301 and more in your content.
   pushword:static:generate                   Generate a static version for your website(s)
   pushword:user:create                       Create a new user
-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/configuration.html b/docs/configuration.html index e36ebf10c..425dcdc65 100644 --- a/docs/configuration.html +++ b/docs/configuration.html @@ -1,2 +1,2 @@ - Configure a fresh install of Pushword

Configuration

If you use the automatic installer, just open config/packages/pushword.yaml and start configure your app(s).

The only important property to configure now is hosts (hosts: [localhost.dev]). Then you are ready to use your website.

To get the up to date configuration's options :

php bin/console config:dump-reference PushwordCoreBundle
-
\ No newline at end of file + Configure a fresh install of Pushword

Configuration

If you use the automatic installer, just open config/packages/pushword.yaml and start configure your app(s).

The only important property to configure now is hosts (hosts: [localhost.dev]). Then you are ready to use your website.

To get the up to date configuration's options :

php bin/console config:dump-reference PushwordCoreBundle
+
\ No newline at end of file diff --git a/docs/contribute.html b/docs/contribute.html index 3a861ef8c..f41f126c0 100644 --- a/docs/contribute.html +++ b/docs/contribute.html @@ -1,6 +1,6 @@ - Contribute to Pushword : Documention, Core or Extension

Contribute

Source code is host on github.

Signale an issue

Use the github issue tracker to signal an issue.

This project is open source, and as such, the maintainers give their free time to build and maintain the source code held within. They make the code freely available in the hope that it will be of use to other developers. It would be extremely unfair for them to suffer abuse or anger for their hard work.

Contribute

Contributions are welcome.

Please, send your contribution via a github pull request on Puswhord/Puswhord.

The code is mainly organised in a mono-repo, learn more about the code architecture

Contribute to the documentation

The docs is inside the main repo, you will find write in markdown in packages/docs/content.

On each PR, the docs is compiled and published pushword.piedweb.com by a github action.

Pull Requests

New Features

When requesting or submitting new features, first consider to create a dedicated extension.

If your extension reply to an important community need, you can create a pull request to merge it in this Mono Repo. It will permit to maintain easily it compatibility in next Puswhord update. Moreover, extension will be tested at each commit on one of Pushword's package.

Else, consider create it own git repo and create a Pull Request on the doc to add a link to this fresh extension. The link will be accepted if your extension is well tested and fully functionnal.

Coding standards

This project respect PSR-12 Coding standard. Before your pull-request, run php-cs-fixer.

composer format
+	Contribute to Pushword : Documention, Core or Extension  

Contribute

Source code is host on github.

Signale an issue

Use the github issue tracker to signal an issue.

This project is open source, and as such, the maintainers give their free time to build and maintain the source code held within. They make the code freely available in the hope that it will be of use to other developers. It would be extremely unfair for them to suffer abuse or anger for their hard work.

Contribute

Contributions are welcome.

Please, send your contribution via a github pull request on Puswhord/Puswhord.

The code is mainly organised in a mono-repo, learn more about the code architecture

Contribute to the documentation

The docs is inside the main repo, you will find write in markdown in packages/docs/content.

On each PR, the docs is compiled and published pushword.piedweb.com by a github action.

Pull Requests

New Features

When requesting or submitting new features, first consider to create a dedicated extension.

If your extension reply to an important community need, you can create a pull request to merge it in this Mono Repo. It will permit to maintain easily it compatibility in next Puswhord update. Moreover, extension will be tested at each commit on one of Pushword's package.

Else, consider create it own git repo and create a Pull Request on the doc to add a link to this fresh extension. The link will be accepted if your extension is well tested and fully functionnal.

Coding standards

This project respect PSR-12 Coding standard. Before your pull-request, run php-cs-fixer.

composer format
 

Tests

composer test
 
 # and to test with --prefer-lowest
 composer tests
-

Other Requirements

This attention would be nice :

  • Add tests

  • Document any change in behaviour - Make sure the documentation are kept up-to-date.

  • Consider our release cycle - We try to follow SemVer v2.0.0. Randomly breaking public APIs is not an option.

  • One pull request per feature - If you want to do more than one thing, send multiple pull requests.

  • Send coherent history - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please squash them before submitting.

Happy coding!

\ No newline at end of file +

Other Requirements

This attention would be nice :

  • Add tests

  • Document any change in behaviour - Make sure the documentation are kept up-to-date.

  • Consider our release cycle - We try to follow SemVer v2.0.0. Randomly breaking public APIs is not an option.

  • One pull request per feature - If you want to do more than one thing, send multiple pull requests.

  • Send coherent history - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please squash them before submitting.

Happy coding!

\ No newline at end of file diff --git a/docs/create-extension.html b/docs/create-extension.html index b73c6f2f3..7b9bc8719 100644 --- a/docs/create-extension.html +++ b/docs/create-extension.html @@ -1 +1 @@ - Create a Pushword Extension the easy way

Create an extension

Each extension is built as a symfony bundle.

When you know that, you just have to learn how to create a bundle for symfony and you will know how to make an extension for Pushword.

There is some simple example like flat or more complex like conversation.

If you don't want to share your extension, you don't need to build a bundle, just go in ./src and start coding following symfony concept.

\ No newline at end of file + Create a Pushword Extension the easy way

Create an extension

Each extension is built as a symfony bundle.

When you know that, you just have to learn how to create a bundle for symfony and you will know how to make an extension for Pushword.

There is some simple example like flat or more complex like conversation.

If you don't want to share your extension, you don't need to build a bundle, just go in ./src and start coding following symfony concept.

\ No newline at end of file diff --git a/docs/editor.html b/docs/editor.html index 4e2da5e6a..9d8d3bb8e 100644 --- a/docs/editor.html +++ b/docs/editor.html @@ -1,4 +1,4 @@ - Editor Hidden Super Power - Cheatsheet Pushword

Editor Hidden Super Power
and Markdown Cheatsheet

After installing the admin, you will be able to read this doc directly from your Pushword installation at /admin/markdown-cheatsheet.

Title and subtitle

Title 2 (h2)

Title 3 (h3)

Title 4 (h4)

Title 5 (h5)

Title 6 (h6)

## Title 2 (h2)
+ Editor Hidden Super Power - Cheatsheet Pushword

Editor Hidden Super Power
and Markdown Cheatsheet

After installing the admin, you will be able to read this doc directly from your Pushword installation at /admin/markdown-cheatsheet.

Title and subtitle

Title 2 (h2)

Title 3 (h3)

Title 4 (h4)

Title 5 (h5)

Title 6 (h6)

## Title 2 (h2)
### Title 3 (h3)
### Title 4 (h4)
#### Title 5 (h5)
@@ -41,4 +41,4 @@ {{ children(page, $number = 3)|unprose }}
{{ cardchildren(page, $number = 3)|unprose }}

Redirection

Votre contenu doit contenir uniquement :

Location: http://example.eg/

Others

  • container
    class pour le contenant du contenu.

  • feeds array(type, uri, title)

  • template (default: /page/page.html.twig)

  • main_image_multiple
    -Plusieurs images en fonction d'un hash contenu dans l'url (ex: winter:/media/defaut/winter.jpg;summer:/media/defaut/summer.jpg)

  • toc (: true) : active le sommaire

  • Tout autre Autres Paramètres peut êgalement être appelé directement dans la page {{ page.customParam }}

\ No newline at end of file +Plusieurs images en fonction d'un hash contenu dans l'url (ex: winter:/media/defaut/winter.jpg;summer:/media/defaut/summer.jpg)
  • toc (: true) : active le sommaire

  • Tout autre Autres Paramètres peut êgalement être appelé directement dans la page {{ page.customParam }}

  • \ No newline at end of file diff --git a/docs/extension.html b/docs/extension.html index dc15f9b04..86ed64bd0 100644 --- a/docs/extension.html +++ b/docs/extension.html @@ -1 +1 @@ - Redirect to extensions

    Redirect to extensions

    Location: /extensions

    \ No newline at end of file + Redirect to extensions

    Redirect to extensions

    Location: /extensions

    \ No newline at end of file diff --git a/docs/extension/admin.html b/docs/extension/admin.html index 6716dc0fe..3c9e8184e 100644 --- a/docs/extension/admin.html +++ b/docs/extension/admin.html @@ -1,6 +1,6 @@ - Standard Admin for Pushword : Admin User Interface

    Admin

    Create, edit, delete Page, Media, User with an interface built on top of Sonata Admin.

    Contents

    Install

    composer require pushword/admin
    +	Standard Admin for Pushword : Admin User Interface  

    Admin

    Create, edit, delete Page, Media, User with an interface built on top of Sonata Admin.

    Contents

    Install

    composer require pushword/admin
     

    Add Routes

    admin:
       resource: '@PushwordAdminBundle/AdminRoutes.yaml'
     # or do it in 1 command line
     # $ sed -i '1s/^/admin:\n    resource: "@PushwordAdminBundle\/AdminRoutes.yaml"\n/' config/routes.yaml
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/extension/conversation.html b/docs/extension/conversation.html index ef15e5a94..bac0160dc 100644 --- a/docs/extension/conversation.html +++ b/docs/extension/conversation.html @@ -1,4 +1,4 @@ - Conversation: Add Comment, Newsletter Form or Contact For

    Conversation

    Extend your Pushword website with comments, a contact form or just an user input.

    Install

    Via Packagist :

    # Get the Bundle
    +	Conversation: Add Comment, Newsletter Form or Contact For  

    Conversation

    Extend your Pushword website with comments, a contact form or just an user input.

    Install

    Via Packagist :

    # Get the Bundle
     composer require pushword/conversation
     
     # Add the route to your Routes:
    @@ -31,4 +31,4 @@
     

    Get mail notification for new message

    Configure the bundle (piedweb_conversation.notification_email_to) and programm a cron :

    bin/console pushword:conversation:notify
     

    Customization

    Small rendering customization

    By overriding @PushwordConversation/conversation/conversation.html.twig (or '@PushwordConversation/conversation/'.$type.'Step'.$step.'.html.twig -or '@PushwordConversation/conversation/'.$type.$referring.'Step'.$step.'.html.twig).

    Create a new form

    Per default, there is 3 form types : newsletter, message and multiStepMessage.

    Add a new class in config piedweb_conversation.form.myNewType: myNewFormClass.

    \ No newline at end of file +or '@PushwordConversation/conversation/'.$type.$referring.'Step'.$step.'.html.twig).

    Create a new form

    Per default, there is 3 form types : newsletter, message and multiStepMessage.

    Add a new class in config piedweb_conversation.form.myNewType: myNewFormClass.

    \ No newline at end of file diff --git a/docs/extension/facebook.html b/docs/extension/facebook.html index ae902a8ed..a7bed2618 100644 --- a/docs/extension/facebook.html +++ b/docs/extension/facebook.html @@ -1,7 +1,7 @@ - Write from Facebook on Pushword CMS

    Facebook

    Write from Facebook on your page managed by Pushword.

    Install

    composer require pushword/facebook
    +	Write from Facebook on Pushword CMS  

    Facebook

    Write from Facebook on your page managed by Pushword.

    Install

    composer require pushword/facebook
     

    Usage

    For now, this extension just permit to show last post from a page.

    {{ facebook_last_post('Google') }}
     # will return the last post from Google's Facebook Page render via /component/FacebookLastPost.html.twig
     
     {% set fb_last_post_meta_data = facebook_last_post('Google', '') %}
     # will return an array
    -

    Override default theme

    Create a /component/FacebookLastPost.html.twig in your app template directory.

    \ No newline at end of file +

    Override default theme

    Create a /component/FacebookLastPost.html.twig in your app template directory.

    \ No newline at end of file diff --git a/docs/extension/flat.html b/docs/extension/flat.html index 1f89510af..f0f2e332d 100644 --- a/docs/extension/flat.html +++ b/docs/extension/flat.html @@ -1,4 +1,4 @@ - Puswhord Flat File CMS - Markdown and Twig Ready

    Flat

    Transform Pushword in a FlatFile CMS.

    Install

    composer require pushword/flat-file
    +	Puswhord Flat File CMS - Markdown and Twig Ready  

    Flat

    Transform Pushword in a FlatFile CMS.

    Install

    composer require pushword/flat-file
     

    Configure (if needed)

    Globally under pushword_static_generator (in config/packages).

    Or for multi-sites in config/package/pushword.yaml.

    ...:
       flat_content_dir: content #default value
     

    Usage

    Command Line

    php bin/console pushword:flat:import $host
    @@ -37,4 +37,4 @@
       "createdAt": "now",
       "updatedAt": "now"
     }
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/extension/page-scanner.html b/docs/extension/page-scanner.html index 59a608abd..5992a05f2 100644 --- a/docs/extension/page-scanner.html +++ b/docs/extension/page-scanner.html @@ -1,7 +1,7 @@ - Pushword Page Scanner : Find dead links, 404, 301 and more.

    Page Scanner

    Find dead links, 404, 301 and more (command line or admin).

    Contents

    Install

    composer require pushword/page-scanner
    +	Pushword Page Scanner : Find dead links, 404, 301 and more.  

    Page Scanner

    Find dead links, 404, 301 and more (command line or admin).

    Contents

    Install

    composer require pushword/page-scanner
     

    Add Routes

    page_scanner:
       resource: '@PushwordPageScannerBundle/PageScannerRoutes.yaml'
     # or do it in 1 command line
     # $ sed -i '1s/^/page_scanner:\n    resource: "@PushwordPageScannerBundle\/PageScannerRoutes.yaml"\n/' config/routes.yaml
     

    Command

    php bin/console pushword:page:scan $host
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/extension/page-update-notifier.html b/docs/extension/page-update-notifier.html index bfeec95f3..ad5762b0d 100644 --- a/docs/extension/page-update-notifier.html +++ b/docs/extension/page-update-notifier.html @@ -1,5 +1,5 @@ - Be notify when a page is edited on your Pushword CMS

    Page Update Notifier

    Get mail notification when your pushword content (page) is edited.

    Install

    composer require pushword/page-update-notifier
    +	Be notify when a page is edited on your Pushword CMS  

    Page Update Notifier

    Get mail notification when your pushword content (page) is edited.

    Install

    composer require pushword/page-update-notifier
     

    Configure

    Add in your current config/package/pushword.yaml for an App or globally under pushword_page_update_notifier:

        notifier_email: fromMe@example.tld
         page_update_notification_mail: NotificationForMe@example.tld
         interval: 'P1D' #See PHP DateInterval format https://www.php.net/manual/fr/class.dateinterval.php
    -

    Usage

    Nothing to do, just get notify. On postPersist/postUpdate, the extension check if you didn't get notify till too long (interval), then, send the last edit since interval.

    \ No newline at end of file +

    Usage

    Nothing to do, just get notify. On postPersist/postUpdate, the extension check if you didn't get notify till too long (interval), then, send the last edit since interval.

    \ No newline at end of file diff --git a/docs/extension/static-generator.html b/docs/extension/static-generator.html index 941c27a17..8b90c75fc 100644 --- a/docs/extension/static-generator.html +++ b/docs/extension/static-generator.html @@ -1,4 +1,4 @@ - Static Website Generator with Pushword CMS

    Static Generator

    Generate a static website serve by github pages, apaches with one command or via the admin.

    Install

    composer require pushword/template-editor
    +	Static Website Generator with Pushword CMS  

    Static Generator

    Generate a static website serve by github pages, apaches with one command or via the admin.

    Install

    composer require pushword/template-editor
     

    Add Routes

    static:
       resource: '@PushwordStaticGeneratorBundle/StaticRoutes.yaml'
     # or do it in 1 command line
    @@ -14,4 +14,4 @@
     
     # (re)Generate only one page
     php bin/console pushword:static:generate $host $slug
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/extension/svg.html b/docs/extension/svg.html index 146e05d1d..575b212f4 100644 --- a/docs/extension/svg.html +++ b/docs/extension/svg.html @@ -1,3 +1,3 @@ - Insert SVG/Icon in your content - Pushword CMS

    SVG

    Add SVG with ease in your main content or in a template file via a twig function.

    Install

    composer require pushword/svg
    +	Insert SVG/Icon in your content - Pushword CMS  

    SVG

    Add SVG with ease in your main content or in a template file via a twig function.

    Install

    composer require pushword/svg
     

    Usage

    By default, this extension use FontAwesome 5.15. You just need to use twig svg function :

    svg('surprise')
    -

    Will show

    Configure

    By default, this extension load FontAwesome 5.15's icons. You can choose to use your custom SVG icons by specifyng the svg_dir in your app config or under pushword_svg.

    \ No newline at end of file +

    Will show

    Configure

    By default, this extension load FontAwesome 5.15's icons. You can choose to use your custom SVG icons by specifyng the svg_dir in your app config or under pushword_svg.

    \ No newline at end of file diff --git a/docs/extension/template-editor.html b/docs/extension/template-editor.html index fbd099344..2e2190323 100644 --- a/docs/extension/template-editor.html +++ b/docs/extension/template-editor.html @@ -1,6 +1,6 @@ - Template Editor with Pushword CMS

    Template Editor

    Edit view file online in the admin.

    Contents

    Install

    composer require pushword/template-editor
    +	Template Editor with Pushword CMS  

    Template Editor

    Edit view file online in the admin.

    Contents

    Install

    composer require pushword/template-editor
     

    Add Routes

    template_editor:
       resource: '@PushwordTemplateEditorBundle/TemplateEditorRoutes.yaml'
     # or do it in 1 command line
     # $ sed -i '1s/^/template_editor:\n    resource: "@PushwordTemplateEditorBundle\/TemplateEditorRoutes.yaml"\n/' config/routes.yaml
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/extension/version.html b/docs/extension/version.html index c5e22fcb2..c618c8cca 100644 --- a/docs/extension/version.html +++ b/docs/extension/version.html @@ -1,6 +1,6 @@ - Page Versioning for Pushword CMS

    Version

    Versioning pages with Pushword CMS.

    Install

    composer require pushword/version
    +	Page Versioning for Pushword CMS  

    Version

    Versioning pages with Pushword CMS.

    Install

    composer require pushword/version
     

    Add Routes

    admin:
         resource: "@PushwordVersionBundle/VersionRoutes.yaml"
     # or do it in 1 command line
     # $ sed -i '1s/^/version:\n    resource: "@PushwordVersionBundle\/VersionRoutes.yaml"\n/' config/routes.yaml
    -

    Usage

    This extension automatically (event sucriber on page update and persist) store a serialized version of the current page.

    It adds a new admin (reachable for each page under created at field) wich list all versions for a page.

    Then you can switch from one or an other version (identified by it h1 and the *_updated date_).

     Does it work with Flat ?

    Yes, but you need to install admin extension to able to restore a previous version from a page. Else you can use a Versioning tool like git.

    \ No newline at end of file +

    Usage

    This extension automatically (event sucriber on page update and persist) store a serialized version of the current page.

    It adds a new admin (reachable for each page under created at field) wich list all versions for a page.

    Then you can switch from one or an other version (identified by it h1 and the *_updated date_).

     Does it work with Flat ?

    Yes, but you need to install admin extension to able to restore a previous version from a page. Else you can use a Versioning tool like git.

    \ No newline at end of file diff --git a/docs/extensions.html b/docs/extensions.html index a45d87ce2..704d85d16 100644 --- a/docs/extensions.html +++ b/docs/extensions.html @@ -1 +1 @@ - Extensions

    Find your missing feature with a Pushword Extension

    • Admin Create, edit, delete Page, Media, User with an interface built on top of Sonata Admin.
    • Conversation Extend your Pushword website with comments, a contact form or just an user input.
    • Flat Transform Pushword in a FlatFile CMS.
    • Facebook Write from Facebook on your page managed by Pushword.
    • Page Scanner Find dead links, 404, 301 and more (command line or admin).
    • Page Update Notifier Get mail notification when your pushword content (page) is edited.
    • Static Generator Generate a static website serve by github pages, apaches with one command or via the admin.
    • Svg Add SVG with ease in your main content or in a template file via a twig function.
    • Template Editor Edit view file online in the admin.
    • Version Versioning pages with Pushword CMS.

    Add your own extension editing this file on github.

    \ No newline at end of file + Extensions

    Find your missing feature with a Pushword Extension

    • Admin Create, edit, delete Page, Media, User with an interface built on top of Sonata Admin.
    • Conversation Extend your Pushword website with comments, a contact form or just an user input.
    • Flat Transform Pushword in a FlatFile CMS.
    • Facebook Write from Facebook on your page managed by Pushword.
    • Page Scanner Find dead links, 404, 301 and more (command line or admin).
    • Page Update Notifier Get mail notification when your pushword content (page) is edited.
    • Static Generator Generate a static website serve by github pages, apaches with one command or via the admin.
    • Svg Add SVG with ease in your main content or in a template file via a twig function.
    • Template Editor Edit view file online in the admin.
    • Version Versioning pages with Pushword CMS.

    Add your own extension editing this file on github.

    \ No newline at end of file diff --git a/docs/homepage.html b/docs/homepage.html index 03a88fa6e..afd80afcf 100644 --- a/docs/homepage.html +++ b/docs/homepage.html @@ -1 +1 @@ - Pushword - Modern CMS to build rapidly Websites (powered by Symfony)

    Build modern Content First websites rapidly
    Manage and maintain it as quickly

    Puswhord is a PHP CMS to rapidly create, manage and maintain extandable Website(s).

    It’s

    • easily editable via flat files or full featured admin
    • fully configurable, customizable and extandable. Configure it via one config file in yaml, edit the default theme built with Tailwind in an instant, extend it with extension
    • searchable : be findable on google and other search engine
    • build on top one of the most popular PHP framework symfony. And you don’t need to know about it to install Pushword.

    With Pushword managing multi-site, internationalization and page vesioning is so simple.

    Want a demo ? This website is built with Pushword with flat file management, see the # source code.

    See how to install and test Pushword in less than one minute :

    Get started

    Or look at the detailled features or directly the source code (monorepo).

    Easy to install
    Run it in a second

    Pushword run on a classic PHP environnement (and Composer). You have this on your machine or just a cheap shared host ? So you are able to install it in a few seconds.

    Learn more about requirements and installation.

    By default, it works without dirty work. It looks so simple. But don't be wrong, you can do amazing custom thing with it !

    Easy to extend
    Extend it as a symfony application

    To create Multiple sites with multiple languages (i18n) and managing them on multiple domains you don't need to extend the core. Simple site and complex content network can be managed easily with Pushword without extension.

    You want a blog or a documentation website ? Just install Pushword and play.

    Want another feature ? Look at the  extensions.

    Not finding the one you want ? Pushword is built as a symfony bundle so just extend your research to them or find an expert developper to make your wish reality.

    Easy to edit
    Are you more Flat-file CMS or Full Featured Admin  ?

    Pushword offers the two ways to manage a site : a simple, functionnable and efficient default Admin, if you come from Wordpress, you will find your way easily or a powerfull flat-file CMS, you will be able to edit your content or your template files from where you want (nextcloud folder, custom editor, git compatible...).

    Default editor use Markdown/Html with extended features (video, responsive image, encrypted link...).

    A block editor is planned and will be released soon.

    Easy to theme
    Do you know Tailwind CSS and Twig ?

    Thanks to Tailwind CSS and the Twig Template Engine, you will be able to customize the default theme rapidly if you master html and css.

    Maybe you will prefer rebuild your own custom theme. Do as you wish, you use Pushword.

    Want to see how easy it is ? See this documentation website grzcyngr -->

    Easy to theme
    Do you know Tailwind CSS and Twig ?

    Thanks to Tailwind CSS and the Twig Template Engine, you will be able to customize the default theme rapidly if you master html and css.

    Maybe you will prefer rebuild your own custom theme. Do as you wish, you use Pushword.

    Want to see how easy it is ? See this documentation website assets and template files.

    - Customize the default theme with ease, it's built with Tailwind CSS (you never use it ? It's amazing). - Create new theme extending other or just override default theme, see how it's simple for this website assets/template) - Stack : Twig / WhatYouWant (Webpack/Encore per default, you can use whatever you want and just copy your generated assets inside public folder)

    Extend
    Feel at home if you ever used Symfony and composer

    Symfony upgrade your developpement process : the famous framework come with autowiring, event suscriber, large community and good documentation !

    Be visible on Search Engine
    SEO : feel like wikipedia

    • Title / H1 / Description / Url Rewriting
    • i18n (link alternate hreflang) easy way
    • Links Watcher (dead links, redirection, etc.)
    • Links Improver (links suggestion on writing, or automatic adding)
    • Blazing Fast (static website generator with dynamic possibilities)

    ... and more to discover, just install it in a few seconds, browse the code or read the docs.

    \ No newline at end of file + Pushword - Modern CMS to build rapidly Websites (powered by Symfony)

    Build modern Content First websites rapidly
    Manage and maintain it as quickly

    Puswhord is a PHP CMS to rapidly create, manage and maintain extandable Website(s).

    It’s

    • easily editable via flat files or full featured admin
    • fully configurable, customizable and extandable. Configure it via one config file in yaml, edit the default theme built with Tailwind in an instant, extend it with extension
    • searchable : be findable on google and other search engine
    • build on top one of the most popular PHP framework symfony. And you don’t need to know about it to install Pushword.

    With Pushword managing multi-site, internationalization and page vesioning is so simple.

    Want a demo ? This website is built with Pushword with flat file management, see the # source code.

    See how to install and test Pushword in less than one minute :

    Get started

    Or look at the detailled features or directly the source code (monorepo).

    Easy to install
    Run it in a second

    Pushword run on a classic PHP environnement (and Composer). You have this on your machine or just a cheap shared host ? So you are able to install it in a few seconds.

    Learn more about requirements and installation.

    By default, it works without dirty work. It looks so simple. But don't be wrong, you can do amazing custom thing with it !

    Easy to extend
    Extend it as a symfony application

    To create Multiple sites with multiple languages (i18n) and managing them on multiple domains you don't need to extend the core. Simple site and complex content network can be managed easily with Pushword without extension.

    You want a blog or a documentation website ? Just install Pushword and play.

    Want another feature ? Look at the  extensions.

    Not finding the one you want ? Pushword is built as a symfony bundle so just extend your research to them or find an expert developper to make your wish reality.

    Easy to edit
    Are you more Flat-file CMS or Full Featured Admin  ?

    Pushword offers the two ways to manage a site : a simple, functionnable and efficient default Admin, if you come from Wordpress, you will find your way easily or a powerfull flat-file CMS, you will be able to edit your content or your template files from where you want (nextcloud folder, custom editor, git compatible...).

    Default editor use Markdown/Html with extended features (video, responsive image, encrypted link...).

    A block editor is planned and will be released soon.

    Easy to theme
    Do you know Tailwind CSS and Twig ?

    Thanks to Tailwind CSS and the Twig Template Engine, you will be able to customize the default theme rapidly if you master html and css.

    Maybe you will prefer rebuild your own custom theme. Do as you wish, you use Pushword.

    Want to see how easy it is ? See this documentation website grzcyngr -->

    Easy to theme
    Do you know Tailwind CSS and Twig ?

    Thanks to Tailwind CSS and the Twig Template Engine, you will be able to customize the default theme rapidly if you master html and css.

    Maybe you will prefer rebuild your own custom theme. Do as you wish, you use Pushword.

    Want to see how easy it is ? See this documentation website assets and template files.

    - Customize the default theme with ease, it's built with Tailwind CSS (you never use it ? It's amazing). - Create new theme extending other or just override default theme, see how it's simple for this website assets/template) - Stack : Twig / WhatYouWant (Webpack/Encore per default, you can use whatever you want and just copy your generated assets inside public folder)

    Extend
    Feel at home if you ever used Symfony and composer

    Symfony upgrade your developpement process : the famous framework come with autowiring, event suscriber, large community and good documentation !

    Be visible on Search Engine
    SEO : feel like wikipedia

    • Title / H1 / Description / Url Rewriting
    • i18n (link alternate hreflang) easy way
    • Links Watcher (dead links, redirection, etc.)
    • Links Improver (links suggestion on writing, or automatic adding)
    • Blazing Fast (static website generator with dynamic possibilities)

    ... and more to discover, just install it in a few seconds, browse the code or read the docs.

    \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 77147e504..8b84fdbe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1 +1 @@ - Pushword - Modern CMS to build rapidly Websites (powered by Symfony)

    Build modern Content First websites rapidly
    Manage and maintain it as quickly

    Puswhord is a PHP CMS to rapidly create, manage and maintain extandable Website(s).

    It make it easy to create amazing searchable websites findable on google.

    Bonus, managing multi-site, internationalization and page vesioning is so simple.

    Want a demo ? This website is built with Pushword with flat file management !

    See how to install and test Pushword in less than one minute...

    Or look at the detailled features :

    Easy to install
    Run it in a few seconds

    Pushword run on a classic up to date PHP environnement (and Composer). You have this on your machine or just a cheap shared host ? So you are able to install it in a few seconds.

    Learn more about requirements and installation.

    By default, it works without dirty work. It looks so simple. But don't be wrong, you can do amazing custom thing with it !

    PHP 7 // PHP 8 // Symfony5

    Extendable
    Look ! It's a symfony application under the hood

    To create Multiple sites with multiple languages (i18n) and managing them on multiple domains you don't need to extend the core. Simple site and complex content network can be managed easily with Pushword without extension.

    You want a blog or a documentation website ? Just install Pushword and play.

    Want another feature ? Look at the  extensions.

    Not finding the one you want ? Pushword is built as a symfony bundle so just extend your research to them or find an expert developper to make your wish reality.

    Just Write
    Are you more Flat-file CMS or Full Featured Admin  ?

    Pushword offers the two ways to manage a site : a simple, functionnable and efficient default Admin, if you come from Wordpress, you will find your way easily or a powerfull flat-file CMS, you will be able to edit your content or your template files from where you want (nextcloud folder, custom editor, git compatible...).

    Default editor use Markdown/Html with extended features (video, responsive image, encrypted link...).

    A block editor is planned and will be released soon.

    Be unique : theme it quickly
    Do you know Tailwind CSS and Twig ?

    Thanks to Tailwind CSS and Twig, you will be able to customize the default theme rapidly if you master html and css.

    Maybe you will prefer rebuild your own custom theme. Do as you wish, you use Pushword.

    Want to see how easy it is ? See this documentation website assets and template files.

    Searchable website
    Want to be found on google ?

    Pushword was first crafted by a seo and developper guy. Being on the first page of search result matters !

    So, of course, Pushword manage title, h1, description, nice url.

    But discover more SEO feature like health checker (dead links checker), internal links improver (suggest links to add in your content) and more...

    Woring about speed ? If default installation is not fast enough for you, you will fall in love with the Static Website Generator.

    Design to last
    Do you want to rebuild a new fancy website each year  ?

    Pushword is crafted to last. Source code is hight quality, open source and well tested.

    Bringing a new feature or refactor your code will be painless. Thanks to symfony best practices, it will last in the time.

    Time to read the docs or maybe have a look to the source code.
    \ No newline at end of file + Pushword - Modern CMS to build rapidly Websites (powered by Symfony)

    Build modern Content First websites rapidly
    Manage and maintain it as quickly

    Puswhord is a PHP CMS to rapidly create, manage and maintain extandable Website(s).

    It make it easy to create amazing searchable websites findable on google.

    Bonus, managing multi-site, internationalization and page vesioning is so simple.

    Want a demo ? This website is built with Pushword with flat file management !

    See how to install and test Pushword in less than one minute...

    Or look at the detailled features :

    Easy to install
    Run it in a few seconds

    Pushword run on a classic up to date PHP environnement (and Composer). You have this on your machine or just a cheap shared host ? So you are able to install it in a few seconds.

    Learn more about requirements and installation.

    By default, it works without dirty work. It looks so simple. But don't be wrong, you can do amazing custom thing with it !

    PHP 7 // PHP 8 // Symfony5

    Extendable
    Look ! It's a symfony application under the hood

    To create Multiple sites with multiple languages (i18n) and managing them on multiple domains you don't need to extend the core. Simple site and complex content network can be managed easily with Pushword without extension.

    You want a blog or a documentation website ? Just install Pushword and play.

    Want another feature ? Look at the  extensions.

    Not finding the one you want ? Pushword is built as a symfony bundle so just extend your research to them or find an expert developper to make your wish reality.

    Just Write
    Are you more Flat-file CMS or Full Featured Admin  ?

    Pushword offers the two ways to manage a site : a simple, functionnable and efficient default Admin, if you come from Wordpress, you will find your way easily or a powerfull flat-file CMS, you will be able to edit your content or your template files from where you want (nextcloud folder, custom editor, git compatible...).

    Default editor use Markdown/Html with extended features (video, responsive image, encrypted link...).

    A block editor is planned and will be released soon.

    Be unique : theme it quickly
    Do you know Tailwind CSS and Twig ?

    Thanks to Tailwind CSS and Twig, you will be able to customize the default theme rapidly if you master html and css.

    Maybe you will prefer rebuild your own custom theme. Do as you wish, you use Pushword.

    Want to see how easy it is ? See this documentation website assets and template files.

    Searchable website
    Want to be found on google ?

    Pushword was first crafted by a seo and developper guy. Being on the first page of search result matters !

    So, of course, Pushword manage title, h1, description, nice url.

    But discover more SEO feature like health checker (dead links checker), internal links improver (suggest links to add in your content) and more...

    Woring about speed ? If default installation is not fast enough for you, you will fall in love with the Static Website Generator.

    Design to last
    Do you want to rebuild a new fancy website each year  ?

    Pushword is crafted to last. Source code is hight quality, open source and well tested.

    Bringing a new feature or refactor your code will be painless. Thanks to symfony best practices, it will last in the time.

    Time to read the docs or maybe have a look to the source code.
    \ No newline at end of file diff --git a/docs/installation.html b/docs/installation.html index 1ba2b7dd9..a1afa1ef3 100644 --- a/docs/installation.html +++ b/docs/installation.html @@ -1,4 +1,4 @@ - Install Pushword in a few seconds (automatic installer)

    Installation

    Requirements

    • PHP 7.4
    • PHP extensions : dom, curl, libxml, mbstring, zip, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, fileinfo
    • Composer (how to install composer)

    Automatic installer via CLI (unix)


    curl https://raw.githubusercontent.com/Pushword/Pushword/main/packages/installer/src/installer >> installer && chmod +x installer && ./installer ./my-folder + Install Pushword in a few seconds (automatic installer)

    Installation

    Requirements

    • PHP 7.4
    • PHP extensions : dom, curl, libxml, mbstring, zip, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, fileinfo
    • Composer (how to install composer)

    Automatic installer via CLI (unix)


    curl https://raw.githubusercontent.com/Pushword/Pushword/main/packages/installer/src/installer >> installer && chmod +x installer && ./installer ./my-folder

    Manual installation

    Look in the shell script installer where each step is describe.

    ...

    Update

    Stay up to date with only one command :

    composer update
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/license.html b/docs/license.html index b2a66a568..934131961 100644 --- a/docs/license.html +++ b/docs/license.html @@ -1 +1 @@ - Pushword CMS License and contributors

    License and contributors

    Contributors

    MIT License

    Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    \ No newline at end of file + Pushword CMS License and contributors

    License and contributors

    Contributors

    MIT License

    Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    \ No newline at end of file diff --git a/docs/manage-assets.html b/docs/manage-assets.html index 35d1bcfea..150b36800 100644 --- a/docs/manage-assets.html +++ b/docs/manage-assets.html @@ -1,2 +1,2 @@ - How to manage assets CSS / Javascript in Pushword CMS ?

    Managing Assets (css/js)

    The default installer copy/paste a skeleton for a website colored with tailwindcss.

    To update it juste go in ./assets and edit app.js, app.css, directly the tailwind configuration or the webpack.config.js.

    Then run wepback :

    yarn && yarn encore (dev|production)
    -

    If you want to change the default location for assets, just edit ./config/packages/pushword.yaml and configure apps.0.assets (eg)

    \ No newline at end of file + How to manage assets CSS / Javascript in Pushword CMS ?

    Managing Assets (css/js)

    The default installer copy/paste a skeleton for a website colored with tailwindcss.

    To update it juste go in ./assets and edit app.js, app.css, directly the tailwind configuration or the webpack.config.js.

    Then run wepback :

    yarn && yarn encore (dev|production)
    +

    If you want to change the default location for assets, just edit ./config/packages/pushword.yaml and configure apps.0.assets (eg)

    \ No newline at end of file diff --git a/docs/override-theme.html b/docs/override-theme.html index 61727e849..4b1af6bfa 100644 --- a/docs/override-theme.html +++ b/docs/override-theme.html @@ -1 +1 @@ - How to override default theme with Pushword CMS ?

    Customize/Override the current theme

    There is multiple way to override the default theme.

    Simplest way is to override it (partially or completly) by create a new file in ./templates/{$host}/page naming it like the default one

    Eg: Overriding the default navbar can be done creating a file ./templates/{$host}/page/_navbar.html.twig.

    You can see how it's handle for the documentation.

    \ No newline at end of file + How to override default theme with Pushword CMS ?

    Customize/Override the current theme

    There is multiple way to override the default theme.

    Simplest way is to override it (partially or completly) by create a new file in ./templates/{$host}/page naming it like the default one

    Eg: Overriding the default navbar can be done creating a file ./templates/{$host}/page/_navbar.html.twig.

    You can see how it's handle for the documentation.

    \ No newline at end of file diff --git a/docs/roadmap.html b/docs/roadmap.html index 1c39734b1..ab90289e6 100644 --- a/docs/roadmap.html +++ b/docs/roadmap.html @@ -1 +1 @@ - Where Pushword is going ? Roadmap, TODO and Ideas

    ROADMAP Just TODO and IDEA

    TODO before v1

    • release de sonata 4
    • Issue : User Password Edit don't work from admin
    • installer via composer-create (command pushword:new creating a new app config array)

    TODO Extension

    • Intégrer Schema.org dans le backend d'une page
    • Static: copy only used media in public
    • FacebookManager (post from facebook and ~~show last facebook status~~ )
    • Flat: Transform markdown link to page link (useful for navigate in docs from editor)
    • Flat: Throw error when the content is more up to date in database... add export (and maintain ID)
    • Wordpress To Pushword/Core (and vice versa)
    • Intégrer LinksImprover (+ UX), après précédent
    • name suggester : parse content, find words or multiple words used only in this doc, suggest it as potential name
    • export/import FLAT FILES (spatie/yaml-front-matter, vérif à chaque requête pour une sync constante admin -> flat files)
    • Create a page from a Media (media edit) => button to create a new page with title = name and mainImage = Media (useful for photographer website)... or create a dynamic page /media/[slug]/ showing data from Media
    • Settings Manager (simple textarea permitting to edit pushword config and parameters ? and rebooting cache)
    • smart image optimizer (using all otpimizer avalaible and choosing the smallest file)
    • interventionImageBundle (sortir mediaManager du bundle principal)

    To plan

    • Media Management v2 : utiliser IPTC&exif pour stocker toutes les infos stockées en bdd (static power)
    • CI : Test Installer
    • Author for page (will permit to manage page view right later)
    • Archive edit (page) (extension or core ?)
    • Multi-user editor Multi-site but not everybody can edit everything (see draft.md) (extension or core ?)
    • Look for a better writer experience (https://github.com/front/g-editor or https://editorjs.io) (1/2)
    • Gérer un système d'extension viable pour l'admin : à l'install, créer les fichiers Admin qui étendent l'admin de base L'ajout d'un plugin modifie automatiquement ce nouveau fichier en ajoutant le code nécessaire (ajout d'une trait + édition d'une fonction) Retro-compatibilité : créer le fichier admin + le services (autowire) si il n'existe pas
    • Scan : scanner une page en direct + scanner plus de choses (liens externes, texte alternative manquant, etc.)
    • Multi upload
    • Test the code, search for all "todo" in the code,
    • Installation without composer (download composer if not installed)
    • Pagination children/list (molto idea : PageController capture les pages /slug/[0-0]*/ et renvoie si existe)
    • Page with dynamic slug ?!
    • Add https://github.com/nan-guo/Sonata-Menu-Bundle
    • Move route to annotation (less extendable but more pratical with priority)
    • Move media to var (and create a link ?!)
    \ No newline at end of file + Where Pushword is going ? Roadmap, TODO and Ideas

    ROADMAP Just TODO and IDEA

    TODO before v1

    • release de sonata 4
    • Issue : User Password Edit don't work from admin
    • installer via composer-create (command pushword:new creating a new app config array)

    TODO Extension

    • Intégrer Schema.org dans le backend d'une page
    • Static: copy only used media in public
    • FacebookManager (post from facebook and ~~show last facebook status~~ )
    • Flat: Transform markdown link to page link (useful for navigate in docs from editor)
    • Flat: Throw error when the content is more up to date in database... add export (and maintain ID)
    • Wordpress To Pushword/Core (and vice versa)
    • Intégrer LinksImprover (+ UX), après précédent
    • name suggester : parse content, find words or multiple words used only in this doc, suggest it as potential name
    • export/import FLAT FILES (spatie/yaml-front-matter, vérif à chaque requête pour une sync constante admin -> flat files)
    • Create a page from a Media (media edit) => button to create a new page with title = name and mainImage = Media (useful for photographer website)... or create a dynamic page /media/[slug]/ showing data from Media
    • Settings Manager (simple textarea permitting to edit pushword config and parameters ? and rebooting cache)

    To plan

    • smart image optimizer (using all otpimizer avalaible and choosing the smallest file)
    • interventionImageBundle (sortir mediaManager du bundle principal)
    • CI : Test Installer
    • Author for page (will permit to manage page view right later)
    • Archive edit (page) (extension or core ?)
    • Multi-user editor Multi-site but not everybody can edit everything (see draft.md) (extension or core ?)
    • Look for a better writer experience (https://github.com/front/g-editor or https://editorjs.io) (1/2)
    • Gérer un système d'extension viable pour l'admin : à l'install, créer les fichiers Admin qui étendent l'admin de base L'ajout d'un plugin modifie automatiquement ce nouveau fichier en ajoutant le code nécessaire (ajout d'une trait + édition d'une fonction) Retro-compatibilité : créer le fichier admin + le services (autowire) si il n'existe pas
    • Scan : scanner une page en direct + scanner plus de choses (liens externes, texte alternative manquant, etc.)
    • Multi upload
    • Test the code, search for all "todo" in the code,
    • Pagination children/list (molto idea : PageController capture les pages /slug/[0-0]*/ et renvoie si existe)
    • Page with dynamic slug ?!
    • Add https://github.com/nan-guo/Sonata-Menu-Bundle
    • Move route to annotation (less extendable but more pratical with priority)
    \ No newline at end of file diff --git a/docs/themes.html b/docs/themes.html index ed1168263..e3d309701 100644 --- a/docs/themes.html +++ b/docs/themes.html @@ -1 +1 @@ - Themes

    Find your missing themes with a Pushword CMS

    0 theme avalaible, it's so easy to customize your website using tailwind and overriding template files.

    If you create a theme, felle free to edit this file on github to list it on this page.

    Create a theme

    It's exactly like creating an extension.

    \ No newline at end of file + Themes

    Find your missing themes with a Pushword CMS

    0 theme avalaible, it's so easy to customize your website using tailwind and overriding template files.

    If you create a theme, felle free to edit this file on github to list it on this page.

    Create a theme

    It's exactly like creating an extension.

    \ No newline at end of file diff --git a/docs/upgrade.html b/docs/upgrade.html index 7634882f1..204dd82d1 100644 --- a/docs/upgrade.html +++ b/docs/upgrade.html @@ -1,5 +1,5 @@ - Upgrade a Pushword installation

    Upgrade Guide

    Smooth way is to use composer, a dependency manager for PHP.

    Run composer update and the job is done (almost).

    If you are doing a major upgrade, find the upgrade guide down there.

    From PiedWeb/CMS 0.0.86 to Pushword

    • switch dependencies from piedweb/cms to pushword/core (composer + src/Entity)
    • install required extension (like pushword/admin, have a look in the extensions list)
    • Delete symlinks in config/packages

    • Update database

      bin/console make:migration && bin/console doctrine:migrations:migrate
      +	Upgrade a Pushword installation  

      Upgrade Guide

      Smooth way is to use composer, a dependency manager for PHP.

      Run composer update and the job is done (almost).

      If you are doing a major upgrade, find the upgrade guide down there.

      From PiedWeb/CMS 0.0.86 to Pushword

      • switch dependencies from piedweb/cms to pushword/core (composer + src/Entity)
      • install required extension (like pushword/admin, have a look in the extensions list)
      • Delete symlinks in config/packages

      • Update database

        bin/console make:migration && bin/console doctrine:migrations:migrate
         
      • Update config by moving static under apps where first host is static.domain.

        ...
         apps:
          - {hosts: [mywebsite.com, preprod.mywebsite.com], base_url: https://mywebsite.com}
        -
      • Delete feed*.xml and sitemap* files in public

      • Maybe twig config file throw an error, read & fix

      • Search for all <!-- in mainContent and put them in customProperties's textarea

      \ No newline at end of file +
    • Delete feed*.xml and sitemap* files in public

    • Maybe twig config file throw an error, read & fix

    • Search for all <!-- in mainContent and put them in customProperties's textarea

    \ No newline at end of file diff --git a/packages/admin/README.md b/packages/admin/README.md index 71c2cb6c5..430134520 100644 --- a/packages/admin/README.md +++ b/packages/admin/README.md @@ -20,13 +20,13 @@ If you're interested in contributing to Pushword, please read our [contributing ## Credits -- [PiedWeb](https://piedweb.com) -- [All Contributors](https://github.com/Pushword/Core/graphs/contributors) +- [PiedWeb](https://piedweb.com) +- [All Contributors](https://github.com/Pushword/Core/graphs/contributors) ## License The MIT License (MIT). Please see [License File](https://pushword.piedweb.com/license#license) for more information.

    -PHP Packages Open Source +PHP Packages Open Source

    diff --git a/packages/admin/composer.json b/packages/admin/composer.json index 66e1dc3fe..0a8d0616c 100644 --- a/packages/admin/composer.json +++ b/packages/admin/composer.json @@ -7,7 +7,7 @@ "license": "MIT", "require": { "pushword/core": "^0.0", - "sonata-project/admin-bundle": "dev-master#3512d192562ca4ac48c306388f5579982e2faf43", + "sonata-project/admin-bundle": "dev-master#f34ae30d169132b17f3151fa294a80c57247a8a9", "sonata-project/doctrine-orm-admin-bundle": "4.x-dev" }, "extra": { diff --git a/packages/conversation/README.md b/packages/conversation/README.md index 0142487e4..e8b5d7720 100644 --- a/packages/conversation/README.md +++ b/packages/conversation/README.md @@ -20,13 +20,13 @@ If you're interested in contributing to Pushword, please read our [contributing ## Credits -- [PiedWeb](https://piedweb.com) -- [All Contributors](https://github.com/Pushword/Core/graphs/contributors) +- [PiedWeb](https://piedweb.com) +- [All Contributors](https://github.com/Pushword/Core/graphs/contributors) ## License The MIT License (MIT). Please see [License File](https://pushword.piedweb.com/license#license) for more information.

    -PHP Packages Open Source +PHP Packages Open Source

    diff --git a/packages/core/README.md b/packages/core/README.md index bc31c3160..b1af04d91 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -20,13 +20,13 @@ If you're interested in contributing to Pushword, please read our [contributing ## Credits -- [PiedWeb](https://piedweb.com) -- [All Contributors](https://github.com/Pushword/Core/graphs/contributors) +- [PiedWeb](https://piedweb.com) +- [All Contributors](https://github.com/Pushword/Core/graphs/contributors) ## License The MIT License (MIT). Please see [License File](https://pushword.piedweb.com/license#license) for more information.

    -PHP Packages Open Source +PHP Packages Open Source

    diff --git a/packages/core/src/templates/base.html.twig b/packages/core/src/templates/base.html.twig index 3ab3b46a0..ef43ccf69 100644 --- a/packages/core/src/templates/base.html.twig +++ b/packages/core/src/templates/base.html.twig @@ -32,7 +32,7 @@ {% block css_var %}