Merge pull request #220 from jonnybarnes/develop
MTM: PHP8 support, and PostCSS Webpack work
This commit is contained in:
commit
38f3244e31
142 changed files with 8274 additions and 9964 deletions
7
.github/workflows/run-tests.yml
vendored
7
.github/workflows/run-tests.yml
vendored
|
|
@ -28,14 +28,11 @@ jobs:
|
|||
key: ${{ runner.os }}-${{ hashFiles('**/package.json') }}
|
||||
- name: Install npm dependencies
|
||||
run: npm install
|
||||
- name: Install ImageMagick
|
||||
run: sudo apt install imagemagick
|
||||
- name: Setup PHP with pecl extension
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: '7.4'
|
||||
tools: pecl, phpcs
|
||||
extensions: imagick
|
||||
php-version: '8.0'
|
||||
tools: phpcs
|
||||
- name: Copy .env
|
||||
run: php -r "file_exists('.env') || copy('.env.github', '.env');"
|
||||
- name: Install dependencies
|
||||
|
|
|
|||
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -18,3 +18,4 @@ _ide_helper.php
|
|||
/public/fonts
|
||||
/public/files
|
||||
/public/keybase.txt
|
||||
/public/assets/*.map
|
||||
|
|
|
|||
|
|
@ -1,13 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace App\Exceptions;
|
||||
|
||||
use Exception;
|
||||
|
||||
class InvalidTokenException extends Exception
|
||||
{
|
||||
public function __construct($message, $code = 0, Exception $previous = null)
|
||||
{
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
}
|
||||
|
|
@ -4,12 +4,13 @@ declare(strict_types=1);
|
|||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Exceptions\InvalidTokenException;
|
||||
use App\Http\Responses\MicropubResponses;
|
||||
use App\Models\Place;
|
||||
use App\Services\Micropub\{HCardService, HEntryService, UpdateService};
|
||||
use App\Services\TokenService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Lcobucci\JWT\Token\InvalidTokenStructure;
|
||||
use Lcobucci\JWT\Validation\RequiredConstraintsViolated;
|
||||
use Monolog\Handler\StreamHandler;
|
||||
use Monolog\Logger;
|
||||
|
||||
|
|
@ -37,19 +38,18 @@ class MicropubController extends Controller
|
|||
* then passes over the info to the relevant Service class.
|
||||
*
|
||||
* @return JsonResponse
|
||||
* @throws InvalidTokenException
|
||||
*/
|
||||
public function post(): JsonResponse
|
||||
{
|
||||
try {
|
||||
$tokenData = $this->tokenService->validateToken(request()->input('access_token'));
|
||||
} catch (InvalidTokenException $e) {
|
||||
} catch (RequiredConstraintsViolated | InvalidTokenStructure $exception) {
|
||||
$micropubResponses = new MicropubResponses();
|
||||
|
||||
return $micropubResponses->invalidTokenResponse();
|
||||
}
|
||||
|
||||
if ($tokenData->hasClaim('scope') === false) {
|
||||
if ($tokenData->claims()->has('scope') === false) {
|
||||
$micropubResponses = new MicropubResponses();
|
||||
|
||||
return $micropubResponses->tokenHasNoScopeResponse();
|
||||
|
|
@ -58,7 +58,7 @@ class MicropubController extends Controller
|
|||
$this->logMicropubRequest(request()->all());
|
||||
|
||||
if ((request()->input('h') == 'entry') || (request()->input('type.0') == 'h-entry')) {
|
||||
if (stristr($tokenData->getClaim('scope'), 'create') === false) {
|
||||
if (stristr($tokenData->claims()->get('scope'), 'create') === false) {
|
||||
$micropubResponses = new MicropubResponses();
|
||||
|
||||
return $micropubResponses->insufficientScopeResponse();
|
||||
|
|
@ -72,7 +72,7 @@ class MicropubController extends Controller
|
|||
}
|
||||
|
||||
if (request()->input('h') == 'card' || request()->input('type.0') == 'h-card') {
|
||||
if (stristr($tokenData->getClaim('scope'), 'create') === false) {
|
||||
if (stristr($tokenData->claims()->get('scope'), 'create') === false) {
|
||||
$micropubResponses = new MicropubResponses();
|
||||
|
||||
return $micropubResponses->insufficientScopeResponse();
|
||||
|
|
@ -86,7 +86,7 @@ class MicropubController extends Controller
|
|||
}
|
||||
|
||||
if (request()->input('action') == 'update') {
|
||||
if (stristr($tokenData->getClaim('scope'), 'update') === false) {
|
||||
if (stristr($tokenData->claims()->get('scope'), 'update') === false) {
|
||||
$micropubResponses = new MicropubResponses();
|
||||
|
||||
return $micropubResponses->insufficientScopeResponse();
|
||||
|
|
@ -115,7 +115,7 @@ class MicropubController extends Controller
|
|||
{
|
||||
try {
|
||||
$tokenData = $this->tokenService->validateToken(request()->input('access_token'));
|
||||
} catch (InvalidTokenException $e) {
|
||||
} catch (RequiredConstraintsViolated | InvalidTokenStructure $exception) {
|
||||
$micropubResponses = new MicropubResponses();
|
||||
|
||||
return $micropubResponses->invalidTokenResponse();
|
||||
|
|
@ -156,9 +156,9 @@ class MicropubController extends Controller
|
|||
return response()->json([
|
||||
'response' => 'token',
|
||||
'token' => [
|
||||
'me' => $tokenData->getClaim('me'),
|
||||
'scope' => $tokenData->getClaim('scope'),
|
||||
'client_id' => $tokenData->getClaim('client_id'),
|
||||
'me' => $tokenData->claims()->get('me'),
|
||||
'scope' => $tokenData->claims()->get('scope'),
|
||||
'client_id' => $tokenData->claims()->get('client_id'),
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
|
@ -167,13 +167,13 @@ class MicropubController extends Controller
|
|||
* Determine the client id from the access token sent with the request.
|
||||
*
|
||||
* @return string
|
||||
* @throws InvalidTokenException
|
||||
* @throws RequiredConstraintsViolated
|
||||
*/
|
||||
private function getClientId(): string
|
||||
{
|
||||
return resolve(TokenService::class)
|
||||
->validateToken(request()->input('access_token'))
|
||||
->getClaim('client_id');
|
||||
->claims()->get('client_id');
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ declare(strict_types=1);
|
|||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Exceptions\InvalidTokenException;
|
||||
use App\Http\Responses\MicropubResponses;
|
||||
use App\Jobs\ProcessMedia;
|
||||
use App\Models\Media;
|
||||
|
|
@ -21,6 +20,8 @@ use Illuminate\Support\Facades\Storage;
|
|||
use Illuminate\Support\Str;
|
||||
use Intervention\Image\Exception\NotReadableException;
|
||||
use Intervention\Image\ImageManager;
|
||||
use Lcobucci\JWT\Token\InvalidTokenStructure;
|
||||
use Lcobucci\JWT\Validation\RequiredConstraintsViolated;
|
||||
use Ramsey\Uuid\Uuid;
|
||||
|
||||
class MicropubMediaController extends Controller
|
||||
|
|
@ -36,19 +37,19 @@ class MicropubMediaController extends Controller
|
|||
{
|
||||
try {
|
||||
$tokenData = $this->tokenService->validateToken(request()->input('access_token'));
|
||||
} catch (InvalidTokenException $e) {
|
||||
} catch (RequiredConstraintsViolated | InvalidTokenStructure $exception) {
|
||||
$micropubResponses = new MicropubResponses();
|
||||
|
||||
return $micropubResponses->invalidTokenResponse();
|
||||
}
|
||||
|
||||
if ($tokenData->hasClaim('scope') === false) {
|
||||
if ($tokenData->claims()->has('scope') === false) {
|
||||
$micropubResponses = new MicropubResponses();
|
||||
|
||||
return $micropubResponses->tokenHasNoScopeResponse();
|
||||
}
|
||||
|
||||
if (Str::contains($tokenData->getClaim('scope'), 'create') === false) {
|
||||
if (Str::contains($tokenData->claims()->get('scope'), 'create') === false) {
|
||||
$micropubResponses = new MicropubResponses();
|
||||
|
||||
return $micropubResponses->insufficientScopeResponse();
|
||||
|
|
@ -103,19 +104,19 @@ class MicropubMediaController extends Controller
|
|||
{
|
||||
try {
|
||||
$tokenData = $this->tokenService->validateToken(request()->input('access_token'));
|
||||
} catch (InvalidTokenException $e) {
|
||||
} catch (RequiredConstraintsViolated | InvalidTokenStructure $exception) {
|
||||
$micropubResponses = new MicropubResponses();
|
||||
|
||||
return $micropubResponses->invalidTokenResponse();
|
||||
}
|
||||
|
||||
if ($tokenData->hasClaim('scope') === false) {
|
||||
if ($tokenData->claims()->has('scope') === false) {
|
||||
$micropubResponses = new MicropubResponses();
|
||||
|
||||
return $micropubResponses->tokenHasNoScopeResponse();
|
||||
}
|
||||
|
||||
if (Str::contains($tokenData->getClaim('scope'), 'create') === false) {
|
||||
if (Str::contains($tokenData->claims()->get('scope'), 'create') === false) {
|
||||
$micropubResponses = new MicropubResponses();
|
||||
|
||||
return $micropubResponses->insufficientScopeResponse();
|
||||
|
|
|
|||
|
|
@ -1,22 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
class SessionStoreController extends Controller
|
||||
{
|
||||
/**
|
||||
* Save the selected colour scheme in the session.
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
public function saveColour(): array
|
||||
{
|
||||
$css = request()->input('css');
|
||||
|
||||
session(['css' => $css]);
|
||||
|
||||
return ['status' => 'ok'];
|
||||
}
|
||||
}
|
||||
|
|
@ -11,6 +11,10 @@ use Illuminate\Support\Collection;
|
|||
use Illuminate\Support\ServiceProvider;
|
||||
use Illuminate\Support\Str;
|
||||
use Laravel\Dusk\DuskServiceProvider;
|
||||
use Lcobucci\JWT\Configuration;
|
||||
use Lcobucci\JWT\Signer\Hmac\Sha256;
|
||||
use Lcobucci\JWT\Signer\Key\InMemory;
|
||||
use Lcobucci\JWT\Validation\Constraint\SignedWith;
|
||||
|
||||
class AppServiceProvider extends ServiceProvider
|
||||
{
|
||||
|
|
@ -73,6 +77,17 @@ class AppServiceProvider extends ServiceProvider
|
|||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Configure JWT builder
|
||||
$this->app->bind('Lcobucci\JWT\Configuration', function () {
|
||||
$key = InMemory::plainText('testing');
|
||||
|
||||
$config = Configuration::forSymmetricSigner(new Sha256(), $key);
|
||||
|
||||
$config->setValidationConstraints(new SignedWith(new Sha256(), $key));
|
||||
|
||||
return $config;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -4,10 +4,9 @@ declare(strict_types=1);
|
|||
|
||||
namespace App\Services;
|
||||
|
||||
use App\Exceptions\InvalidTokenException;
|
||||
use App\Jobs\AddClientToDatabase;
|
||||
use Lcobucci\JWT\Signer\Hmac\Sha256;
|
||||
use Lcobucci\JWT\{Builder, Parser, Token};
|
||||
use DateTimeImmutable;
|
||||
use Lcobucci\JWT\{Configuration, Token};
|
||||
|
||||
class TokenService
|
||||
{
|
||||
|
|
@ -19,17 +18,19 @@ class TokenService
|
|||
*/
|
||||
public function getNewToken(array $data): string
|
||||
{
|
||||
$signer = new Sha256();
|
||||
$token = (new Builder())->set('me', $data['me'])
|
||||
->set('client_id', $data['client_id'])
|
||||
->set('scope', $data['scope'])
|
||||
->set('date_issued', time())
|
||||
->set('nonce', bin2hex(random_bytes(8)))
|
||||
->sign($signer, config('app.key'))
|
||||
->getToken();
|
||||
$config = resolve(Configuration::class);
|
||||
|
||||
$token = $config->builder()
|
||||
->issuedAt(new DateTimeImmutable())
|
||||
->withClaim('client_id', $data['client_id'])
|
||||
->withClaim('me', $data['me'])
|
||||
->withClaim('scope', $data['scope'])
|
||||
->withClaim('nonce', bin2hex(random_bytes(8)))
|
||||
->getToken($config->signer(), $config->signingKey());
|
||||
|
||||
dispatch(new AddClientToDatabase($data['client_id']));
|
||||
|
||||
return (string) $token;
|
||||
return $token->toString();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -40,15 +41,13 @@ class TokenService
|
|||
*/
|
||||
public function validateToken(string $bearerToken): Token
|
||||
{
|
||||
$signer = new Sha256();
|
||||
try {
|
||||
$token = (new Parser())->parse((string) $bearerToken);
|
||||
} catch (\InvalidArgumentException $e) {
|
||||
throw new InvalidTokenException('Token could not be parsed');
|
||||
}
|
||||
if (! $token->verify($signer, config('app.key'))) {
|
||||
throw new InvalidTokenException('Token failed validation');
|
||||
}
|
||||
$config = resolve('Lcobucci\JWT\Configuration');
|
||||
|
||||
$token = $config->parser()->parse($bearerToken);
|
||||
|
||||
$constraints = $config->validationConstraints();
|
||||
|
||||
$config->validator()->assert($token, ...$constraints);
|
||||
|
||||
return $token;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
],
|
||||
"license": "CC0-1.0",
|
||||
"require": {
|
||||
"php": "^7.4",
|
||||
"php": "^7.4|^8.0",
|
||||
"ext-intl": "*",
|
||||
"ext-json": "*",
|
||||
"ext-dom": "*",
|
||||
|
|
@ -17,7 +17,7 @@
|
|||
"fideloper/proxy": "~4.0",
|
||||
"fruitcake/laravel-cors": "^2.0",
|
||||
"guzzlehttp/guzzle": "^7.0.1",
|
||||
"indieauth/client": "~0.1",
|
||||
"indieauth/client": "^1.1",
|
||||
"intervention/image": "^2.4",
|
||||
"jonnybarnes/indieweb": "~0.2",
|
||||
"jonnybarnes/webmentions-parser": "~0.5",
|
||||
|
|
@ -27,11 +27,11 @@
|
|||
"laravel/scout": "^8.0",
|
||||
"laravel/telescope": "^4.0",
|
||||
"laravel/tinker": "^2.0",
|
||||
"lcobucci/jwt": "^3.1",
|
||||
"lcobucci/jwt": "^4.0",
|
||||
"league/commonmark": "^1.0",
|
||||
"league/flysystem-aws-s3-v3": "^1.0",
|
||||
"mf2/mf2": "~0.3",
|
||||
"pmatseykanets/laravel-scout-postgres": "^7.0",
|
||||
"pmatseykanets/laravel-scout-postgres": "dev-php8",
|
||||
"predis/predis": "~1.0",
|
||||
"sensiolabs/security-checker": "^6.0",
|
||||
"spatie/browsershot": "~3.0",
|
||||
|
|
@ -43,10 +43,11 @@
|
|||
"barryvdh/laravel-ide-helper": "^2.6",
|
||||
"beyondcode/laravel-dump-server": "^1.0",
|
||||
"facade/ignition": "^2.3.6",
|
||||
"fzaninotto/faker": "^1.9.1",
|
||||
"fakerphp/faker": "^1.9.2",
|
||||
"laravel/dusk": "^6.0",
|
||||
"mockery/mockery": "^1.0",
|
||||
"nunomaduro/collision": "^5.0",
|
||||
"phpunit/php-code-coverage": "^9.2",
|
||||
"phpunit/phpunit": "^9.0",
|
||||
"vimeo/psalm": "^4.0"
|
||||
},
|
||||
|
|
@ -91,5 +92,11 @@
|
|||
"test": [
|
||||
"vendor/bin/phpunit --stop-on-failure"
|
||||
]
|
||||
}
|
||||
},
|
||||
"repositories": [
|
||||
{
|
||||
"type": "vcs",
|
||||
"url": "https://github.com/jonnybarnes/laravel-scout-postgres"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
1348
composer.lock
generated
1348
composer.lock
generated
File diff suppressed because it is too large
Load diff
|
|
@ -15,6 +15,6 @@ return [
|
|||
|
|
||||
*/
|
||||
|
||||
'driver' => 'imagick',
|
||||
'driver' => 'gd',
|
||||
|
||||
];
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ class ArticlesTableSeeder extends Seeder
|
|||
*/
|
||||
public function run()
|
||||
{
|
||||
$now = Carbon::now()->subMonth();
|
||||
$now = Carbon::now()->subMonth()->subDays(5);
|
||||
$articleFirst = Article::create([
|
||||
'title' => 'My New Blog',
|
||||
'main' => 'This is *my* new blog. It uses `Markdown`.',
|
||||
|
|
|
|||
11851
package-lock.json
generated
11851
package-lock.json
generated
File diff suppressed because it is too large
Load diff
22
package.json
22
package.json
|
|
@ -10,10 +10,24 @@
|
|||
"stylelint-a11y": "^1.2.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.12.3",
|
||||
"@babel/preset-env": "^7.12.1",
|
||||
"autoprefixer": "^9.8.6",
|
||||
"babel-loader": "^8.2.1",
|
||||
"browserlist": "^1.0.1",
|
||||
"compression-webpack-plugin": "^6.1.1",
|
||||
"css-loader": "^5.0.0",
|
||||
"cssnano": "^4.1.10",
|
||||
"eslint": "^7.13.0",
|
||||
"eslint-webpack-plugin": "^2.3.0",
|
||||
"husky": "^4.3.0",
|
||||
"lint-staged": "^10.4.0",
|
||||
"mini-css-extract-plugin": "^1.0.0",
|
||||
"postcss": "^8.1.6",
|
||||
"postcss-combine-duplicated-selectors": "^10.0.2",
|
||||
"postcss-combine-media-query": "^1.0.1",
|
||||
"postcss-import": "^13.0.0",
|
||||
"postcss-loader": "^4.0.4",
|
||||
"pre-commit": "^1.1.3",
|
||||
"stylelint": "^13.7.2",
|
||||
"stylelint-config-standard": "^20.0.0",
|
||||
|
|
@ -44,5 +58,11 @@
|
|||
"*.scss": [
|
||||
"stylelint --syntax=scss"
|
||||
]
|
||||
}
|
||||
},
|
||||
"browserslist": [
|
||||
"last 2 versions",
|
||||
"> 1%",
|
||||
"not IE 11",
|
||||
"not IE_Mob 11"
|
||||
]
|
||||
}
|
||||
|
|
|
|||
14
phpunit.xml
14
phpunit.xml
|
|
@ -19,11 +19,6 @@
|
|||
<directory suffix="Test.php">./tests/Feature</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
<filter>
|
||||
<whitelist processUncoveredFilesFromWhitelist="true">
|
||||
<directory suffix=".php">./app</directory>
|
||||
</whitelist>
|
||||
</filter>
|
||||
<php>
|
||||
<env name="APP_ENV" value="testing"/>
|
||||
<env name="BCRYPT_ROUNDS" value="4"/>
|
||||
|
|
@ -32,5 +27,14 @@
|
|||
<env name="QUEUE_CONNECTION" value="sync"/>
|
||||
<env name="SESSION_DRIVER" value="array"/>
|
||||
<env name="TELESCOPE_ENABLED" value="false"/>
|
||||
<ini name="memory_limit" value="512M"/>
|
||||
</php>
|
||||
<coverage pathCoverage="true" includeUncoveredFiles="true" processUncoveredFiles="true">
|
||||
<include>
|
||||
<directory suffix=".php">./app</directory>
|
||||
</include>
|
||||
<report>
|
||||
<html outputDirectory="./public/coverage"/>
|
||||
</report>
|
||||
</coverage>
|
||||
</phpunit>
|
||||
|
|
|
|||
12
postcss.config.js
vendored
Normal file
12
postcss.config.js
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
module.exports = {
|
||||
plugins: {
|
||||
'postcss-import': {},
|
||||
'autoprefixer': {},
|
||||
'postcss-combine-media-query': {},
|
||||
'postcss-combine-duplicated-selectors': {
|
||||
removeDuplicatedProperties: true,
|
||||
removeDuplicatedValues: true
|
||||
},
|
||||
'cssnano': { preset: 'default' },
|
||||
}
|
||||
};
|
||||
201
public/assets/app.css
vendored
201
public/assets/app.css
vendored
|
|
@ -1,202 +1,3 @@
|
|||
:root {
|
||||
/* fonts */
|
||||
--font-stack-body: "Whitney SSm A", "Whitney SSm B", sans-serif;
|
||||
--font-stack-headings: "Quarto A", "Quarto B", serif;
|
||||
--font-stack-monospace: "Operator Mono SSm A", "Operator Mono SSm B", monospace;
|
||||
|
||||
/* colours */
|
||||
--color-background: #004643;
|
||||
--color-headline: #fffffe;
|
||||
--color-paragraph: #abd1c6;
|
||||
--color-button: #f9bc60;
|
||||
--color-button-text: #001e1d;
|
||||
|
||||
/* colours - illustrations */
|
||||
--color-stroke: #001e1d;
|
||||
--color-main: #e8e4e6;
|
||||
--color-highlight: #f9bc60;
|
||||
--color-secondary: #abd1c6;
|
||||
--color-tertiary: #e16162;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: var(--font-stack-body);
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-size: 2rem;
|
||||
background-color: var(--color-background);
|
||||
color: var(--color-paragraph);
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
font-family: var(--font-stack-headings);
|
||||
font-style: normal;
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
pre,
|
||||
code {
|
||||
font-family: var(--font-stack-monospace);
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--color-highlight);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.h-feed > .note,
|
||||
.h-feed > .h-entry {
|
||||
margin-top: 4rem;
|
||||
}
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 699px) {
|
||||
main {
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-width: 700px) {
|
||||
main {
|
||||
max-width: 700px;
|
||||
}
|
||||
|
||||
main > .note,
|
||||
main > .h-entry {
|
||||
padding: 0 1rem;
|
||||
}
|
||||
}
|
||||
|
||||
main {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
main img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
main .h-entry:first-child > .bookmark-link {
|
||||
padding-top: 2rem;
|
||||
}
|
||||
|
||||
.note {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.note-metadata {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.note .client {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.note .syndication-links svg {
|
||||
height: 1em;
|
||||
width: 1em;
|
||||
}
|
||||
|
||||
.note > .e-content > .naked-link .u-photo {
|
||||
margin: 2rem 0;
|
||||
}
|
||||
|
||||
article header > h1 {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.post-info {
|
||||
font-size: 1.4rem;
|
||||
}
|
||||
|
||||
.pagination {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-evenly;
|
||||
max-width: 90vw;
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
.personal-bio {
|
||||
padding: 0 2rem;
|
||||
}
|
||||
|
||||
footer {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
margin-top: 1.5rem;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 699px) {
|
||||
input {
|
||||
max-width: 95vw;
|
||||
}
|
||||
}
|
||||
|
||||
.iwc-logo {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 699px) {
|
||||
footer {
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
#top-header {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
#top-header h1 {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
nav {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
nav a {
|
||||
margin: 0 0.5rem;
|
||||
}
|
||||
|
||||
.post-info a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.syndication-links .u-syndication {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.p-bridgy-facebook-content,
|
||||
.p-bridgy-twitter-content {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
|
||||
:root{--font-stack-body:"Whitney SSm A","Whitney SSm B",sans-serif;--font-stack-headings:"Quarto A","Quarto B",serif;--font-stack-monospace:"Operator Mono SSm A","Operator Mono SSm B",monospace;--color-background:#004643;--color-headline:#fffffe;--color-paragraph:#abd1c6;--color-button:#f9bc60;--color-button-text:#001e1d;--color-stroke:#001e1d;--color-main:#e8e4e6;--color-highlight:#f9bc60;--color-secondary:#abd1c6;--color-tertiary:#e16162}body{font-family:var(--font-stack-body);font-style:normal;font-weight:400;font-size:2rem;background-color:var(--color-background);color:var(--color-paragraph)}h1,h2,h3,h4,h5,h6{font-family:var(--font-stack-headings);font-style:normal;font-weight:800}code,pre{font-family:var(--font-stack-monospace);font-style:normal;font-weight:400}a{color:var(--color-highlight);text-decoration:none}.h-feed>.h-entry,.h-feed>.note{margin-top:4rem}body,main{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}main{margin:auto}main img{max-width:100%}main .h-entry:first-child>.bookmark-link{padding-top:2rem}.note{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.note,.note-metadata{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-direction:normal}.note-metadata{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.note .client{word-break:break-all}.note .syndication-links svg{height:1em;width:1em}.note>.e-content>.naked-link .u-photo{margin:2rem 0}article header>h1{margin-bottom:0}.post-info{font-size:1.4rem}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:space-evenly;-ms-flex-pack:space-evenly;justify-content:space-evenly;max-width:90vw;list-style-type:none}.personal-bio{padding:0 2rem}footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-top:1.5rem}.iwc-logo{max-width:100%}#top-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}#top-header h1{width:100%;text-align:center}nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap}nav a{margin:0 .5rem}.post-info a,.syndication-links .u-syndication{text-decoration:none}.p-bridgy-facebook-content,.p-bridgy-twitter-content{display:none}@media screen and (max-width:699px){main{margin-left:5px;margin-right:5px}input{max-width:95vw}footer{margin-left:5px;margin-right:5px}}@media screen and (min-width:700px){main{max-width:700px}main>.h-entry,main>.note{padding:0 1rem}}
|
||||
|
||||
/*# sourceMappingURL=app.css.map*/
|
||||
BIN
public/assets/app.css.br
Normal file
BIN
public/assets/app.css.br
Normal file
Binary file not shown.
File diff suppressed because one or more lines are too long
41
public/assets/app.js
vendored
41
public/assets/app.js
vendored
|
|
@ -1,22 +1,7 @@
|
|||
/******/ (() => { // webpackBootstrap
|
||||
/******/ (function() { // webpackBootstrap
|
||||
/******/ "use strict";
|
||||
/******/ var __webpack_modules__ = ({
|
||||
|
||||
/***/ "./resources/css/app.css":
|
||||
/*!*******************************!*\
|
||||
!*** ./resources/css/app.css ***!
|
||||
\*******************************/
|
||||
/*! namespace exports */
|
||||
/*! exports [not provided] [no usage info] */
|
||||
/*! runtime requirements: __webpack_require__.r, __webpack_exports__, __webpack_require__.* */
|
||||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||||
|
||||
__webpack_require__.r(__webpack_exports__);
|
||||
// extracted by mini-css-extract-plugin
|
||||
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ "./resources/js/app.js":
|
||||
/*!*****************************!*\
|
||||
!*** ./resources/js/app.js ***!
|
||||
|
|
@ -24,11 +9,27 @@ __webpack_require__.r(__webpack_exports__);
|
|||
/*! namespace exports */
|
||||
/*! exports [not provided] [no usage info] */
|
||||
/*! runtime requirements: __webpack_require__, __webpack_require__.r, __webpack_exports__, __webpack_require__.* */
|
||||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||||
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
||||
|
||||
__webpack_require__.r(__webpack_exports__);
|
||||
/* harmony import */ var _css_app_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../css/app.css */ "./resources/css/app.css");
|
||||
;
|
||||
console.warn('this isn’t allowed');
|
||||
var a;
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ "./resources/css/app.css":
|
||||
/*!*******************************!*\
|
||||
!*** ./resources/css/app.css ***!
|
||||
\*******************************/
|
||||
/*! namespace exports */
|
||||
/*! exports [not provided] [no usage info] */
|
||||
/*! runtime requirements: __webpack_require__.r, __webpack_exports__, __webpack_require__.* */
|
||||
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
||||
|
||||
__webpack_require__.r(__webpack_exports__);
|
||||
// extracted by mini-css-extract-plugin
|
||||
|
||||
|
||||
/***/ })
|
||||
|
|
@ -60,15 +61,15 @@ __webpack_require__.r(__webpack_exports__);
|
|||
/******/
|
||||
/************************************************************************/
|
||||
/******/ /* webpack/runtime/make namespace object */
|
||||
/******/ (() => {
|
||||
/******/ !function() {
|
||||
/******/ // define __esModule on exports
|
||||
/******/ __webpack_require__.r = (exports) => {
|
||||
/******/ __webpack_require__.r = function(exports) {
|
||||
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
||||
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
||||
/******/ }
|
||||
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
||||
/******/ };
|
||||
/******/ })();
|
||||
/******/ }();
|
||||
/******/
|
||||
/************************************************************************/
|
||||
/******/ // startup
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue