Skip to content

Instantly share code, notes, and snippets.

Avatar
💬
is typing

Knut Melvær kmelve

💬
is typing
View GitHub Profile
@kmelve
kmelve / posts.blade.php
Created Aug 10, 2022
Minimal implementation of Sanity.io content in Laraval using the offical example app as a starting point. https://laravel.com/docs/9.x/installation#your-first-laravel-project
View posts.blade.php
<!-- resources/views/posts.blade.php -->
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Laravel</title>
<!-- Fonts -->
View TheProject.html
<HEADER>
<TITLE>The World Wide Web project</TITLE>
<NEXTID N="55">
</HEADER>
<BODY>
<H1>World Wide Web</H1>The WorldWideWeb (W3) is a wide-area<A
NAME=0 HREF="WhatIs.html">
hypermedia</A> information retrieval
initiative aiming to give universal
@kmelve
kmelve / route.js
Created Feb 11, 2022
Simple A/B testing abstraction used on Sanity.io
View route.js
export default {
name: 'route',
type: 'document',
title: 'Route',
fields: [
{
name: 'title',
type: 'string',
description: 'This title populates meta-tags on the webpage'
},
@kmelve
kmelve / _middleware.js
Created Nov 12, 2021
Proof of concepts simple page views with Next.js middleware
View _middleware.js
// posts/_middleware.js
import { NextResponse } from 'next/server'
const config = {
dataset: process.env.NEXT_PUBLIC_SANITY_DATASET || 'production',
projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID,
apiVersion: '2021-10-21',
}
const baseUrl = cdn => `https://${config.projectId}.api${cdn ? 'cdn' : ''}.sanity.io/v${config.apiVersion}`
const queryUrl = baseUrl() + `/data/query/${config.dataset}/`
@kmelve
kmelve / migration.js
Created Nov 10, 2021
Simple migration script that can be run with `sanity exec` in a Sanity Studio
View migration.js
// migration.js
/**
* Run:
* sanity exec --with-user-token migration.js
*
*/
import sanityClient from 'part:@sanity/base/client'
const client = sanityClient.withConfig({ apiVersion: '2021-11-10' })
// Patch 1000 at a time
const query = `*[_type == "stream"][0...999]{title, publishedDate, _id, _rev}`
@kmelve
kmelve / blurhash.js
Last active Feb 19, 2022
Retroactively add Blurhash strings to image assets in your Sanity Content Lake.
View blurhash.js
/**
* Retroactively add Blurhash strings to image assets in your Sanity Content Lake.
* 1. yarn add got sharp blurhash
* 2. run sanity exec blurhash --with-user-token
* 3. repeat (patches 100 assets in 1 transaction pr run)
*
* Some images might take a while to process.
*/
import client from 'part:@sanity/base/client'
import got from 'got'
@kmelve
kmelve / parseHTML.js
Created Sep 15, 2021
Deserializing Transcript HTML into Portable Text
View parseHTML.js
const blockTools = require("@sanity/block-tools").default;
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const HTML_SPAN_TAGS = {
span: {object: 'text'},
}
const defaultSchema = require("./defaultSchema");
function tagName(el) {
@kmelve
kmelve / create-community-newsletter.js
Created Dec 8, 2020
Create Mailchimp campaign document action proof of concept
View create-community-newsletter.js
const fetch = require('got');
const client = require('../client');
const HTML = require('../lib/newsletter-template');
const MAILCHIMP_URL = 'https://us3.api.mailchimp.com/3.0/campaigns';
const API_TOKEN = process.env.MAILCHIMP_TOKEN;
const QUERY = `//groq
*[
@kmelve
kmelve / disable-js.html
Last active Nov 30, 2020
JavaScript-less no JS please. Inspired by https://heydonworks.com/
View disable-js.html
<html>
<head>
<title>No JS please</title>
</head>
<body>
<main>
<noscript>
Content!
<style>
@kmelve
kmelve / PTEditor.js
Last active Nov 25, 2020
Handle pasting of Github flavored markdown for the Portable Text array.
View PTEditor.js
import React, { useState, forwardRef, Fragment } from 'react'
import { BlockEditor } from 'part:@sanity/form-builder'
import Switch from 'part:@sanity/components/toggles/switch'
import css from './PTeditor.module.css'
import { handlePaste } from './handlePaste'
function CustomEditor(props, ref){
const [customPaste, setCustomPaste] = useState(false)
function handleCustomPaste () {