Skip to content

Instantly share code, notes, and snippets.

View kmelve's full-sized avatar
💬
is typing

Knut Melvær kmelve

💬
is typing
View GitHub Profile
@kmelve
kmelve / LinkedInEmbedInput.tsx
Last active September 18, 2024 15:19
LinkedIn Embed Input for Sanity Studio
import React, { useState } from "react"
import { TextInput, Stack } from "@sanity/ui"
import { set, unset } from "sanity"
interface LinkedInEmbed {
_key: string
_type: string
postUrl: string
height: number
}
@kmelve
kmelve / BlockEditor.ts
Created May 24, 2024 11:10
Markdown to Portable Text paste handler
import { toPlainText } from "@portabletext/react"
import { BlockEditor as DefaultBlockEditor } from "sanity"
import { handlePaste } from "~/studio/components/blockEditor/handlePaste"
const wordsPerMinute = 200
export default function BlockEditor(props: any, ref) {
const value = props.value ?? []
const plainText = toPlainText(value)
const characterCount = plainText.length
@kmelve
kmelve / page.tsx
Created May 17, 2024 17:39
Minimal totally-not-ready-for-prod Todo list example using Sanity Live Content API and Next.js Server Actions
import { redirect } from "next/navigation"
import { createClient } from "next-sanity"
const client = createClient({
apiVersion: "vX",
dataset: process.env.NEXT_PUBLIC_SANITY_DATASET,
projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID,
token: process.env.SANITY_WRITE_TOKEN,
useCdn: true,
})
@kmelve
kmelve / post.groq
Created June 23, 2023 06:22
How to join referenced category documents for a post with GROQ
// Try it out here: https://groq.dev/iZPFWScPZXANqgFGQgoUH2
*[_type == "post"]{
...,
// join into an array of just the titles
"categoryTitles": categories[]->title,
// join the completedocuments
"categoryDocs": categories[]->,
// join and project specific fields
categories[]->{
import {defineConfig, type Role} from 'sanity'
import {deskTool} from 'sanity/desk'
import {visionTool} from '@sanity/vision'
import {schemaTypes} from './schemas'
export const EDITOR_TYPES = ['post']
const isAdmin = (roles: Role[]) => !roles?.find(({name = ''}) => name === 'administrator')
export default defineConfig({
@kmelve
kmelve / handlePaste.js
Last active October 7, 2022 21:38
Markdown Paste Handling for Sanity Studio v2 using micromark
/* Remember:
sanity install @sanity/code-input
yarn add micromark 
*/
import { micromark } from 'micromark'
import { htmlToBlocks } from '@sanity/block-tools'
export async function handlePaste(input) {
const { event, type, path } = input
const text = event.clipboardData.getData('text/plain')
@kmelve
kmelve / import_json_from_sanity_appsscript.js
Last active September 22, 2022 07:31 — forked from paulgambill/import_json_appsscript.js
Adjusted script for working with the Sanity API
/**
* Retrieves all the rows in the active spreadsheet that contain data and logs the
* values for each row.
* For more information on using the Spreadsheet API, see
* https://developers.google.com/apps-script/service_spreadsheet
*/
function readRows() {
var sheet = SpreadsheetApp.getActiveSheet();
var rows = sheet.getDataRange();
var numRows = rows.getNumRows();
#!/bin/bash
# Assumes that you have the Netlify and jq CLI tools installed and that you are logged in.
# Only been tested on macOS and zsh
# Will change the build image for all sites in a Netlify account to the specified image
#
# Usage: sh ./netlify-build-image-bulk.sh
# This assumes that you have logged in with the CLI fairly recently and that you're on macOS
# For other systems: https://github.com/sindresorhus/env-paths#pathsconfig
NETLIFY_AUTH=$(cat ~/Library/Preferences/netlify/config.json|jq -r ".users[].auth.token")
@kmelve
kmelve / posts.blade.php
Created August 10, 2022 11:51
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
<!-- 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 -->
@kmelve
kmelve / TheProject.html
Created April 6, 2022 07:05
The HTML for The World Wide Web project (http://info.cern.ch/hypertext/WWW/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