From aea299d6695bc41cc52ce8bcdd0d42c06c694a3f Mon Sep 17 00:00:00 2001 From: Gordon Brander Date: Thu, 31 Oct 2024 15:34:27 -0700 Subject: [PATCH 1/7] Add gaps to vstack/hstack --- .../common-ui/src/components/common-hstack.ts | 38 ++++++------ .../common-ui/src/components/common-vstack.ts | 62 ++++++++++--------- 2 files changed, 51 insertions(+), 49 deletions(-) diff --git a/typescript/packages/common-ui/src/components/common-hstack.ts b/typescript/packages/common-ui/src/components/common-hstack.ts index 8caa13f6b..f69e3899f 100644 --- a/typescript/packages/common-ui/src/components/common-hstack.ts +++ b/typescript/packages/common-ui/src/components/common-hstack.ts @@ -1,38 +1,38 @@ import { LitElement, html, css } from "lit"; import { customElement } from "lit/decorators.js"; -import { view } from '../hyperscript/render.js'; +import { view } from "../hyperscript/render.js"; import { baseStyles } from "./style.js"; -export const hstack = view('common-hstack', {}); +export const hstack = view("common-hstack", {}); @customElement("common-hstack") export class CommonHstackElement extends LitElement { static override styles = [ baseStyles, css` - :host { - display: block; - } + :host { + display: block; + } - .stack { - display: flex; - flex-direction: row; - } + .hstack { + display: flex; + flex-direction: row; + align-items: center; + } - :host([gap="md"]) .stack { - gap: var(--gap); - } + :host([gap="md"]) .hstack { + gap: var(--gap); + } - :host([pad="md"]) .stack { - padding: var(--gap); - } - ` + :host([pad="md"]) .hstack { + padding: var(--gap); + } + `, ]; override render() { - return html` -
+ return html`
`; } -} \ No newline at end of file +} diff --git a/typescript/packages/common-ui/src/components/common-vstack.ts b/typescript/packages/common-ui/src/components/common-vstack.ts index d92a633dd..79383b579 100644 --- a/typescript/packages/common-ui/src/components/common-vstack.ts +++ b/typescript/packages/common-ui/src/components/common-vstack.ts @@ -1,13 +1,13 @@ import { LitElement, html, css } from "lit"; import { customElement } from "lit/decorators.js"; import { baseStyles } from "./style.js"; -import { view } from '../hyperscript/render.js'; +import { view } from "../hyperscript/render.js"; import { eventProps } from "../hyperscript/schema-helpers.js"; -export const vstack = view('common-vstack', { +export const vstack = view("common-vstack", { ...eventProps(), - gap: { type: 'string' }, - pad: { type: 'string' } + gap: { type: "string" }, + pad: { type: "string" }, }); @customElement("common-vstack") @@ -15,35 +15,37 @@ export class CommonVstackElement extends LitElement { static override styles = [ baseStyles, css` - :host { - display: block; - } - - .stack { - display: flex; - flex-direction: column; - gap: var(--pad); - - } - - :host([gap="none"]) .stack { - gap: 0; - } - - :host([gap="sm"]) .stack { - gap: var(--pad-sm); - } - - :host([pad="md"]) .stack { - padding: var(--pad); - } - ` + :host { + display: block; + } + + .stack { + display: flex; + flex-direction: column; + gap: var(--pad); + } + + :host([gap="none"]) .stack { + gap: 0; + } + + :host([gap="sm"]) .stack { + gap: var(--pad-sm); + } + + :host([gap="md"]) .stack { + gap: var(--pad); + } + + :host([pad="md"]) .stack { + padding: var(--pad); + } + `, ]; override render() { - return html` -
+ return html`
`; } -} \ No newline at end of file +} From ff50c0bc602e5dc34dadd365b83ffca2e17356e6 Mon Sep 17 00:00:00 2001 From: Gordon Brander Date: Thu, 31 Oct 2024 15:34:54 -0700 Subject: [PATCH 2/7] First pass on tweets recipe --- .../src/recipes/tweets.tsx | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 typescript/packages/lookslike-high-level/src/recipes/tweets.tsx diff --git a/typescript/packages/lookslike-high-level/src/recipes/tweets.tsx b/typescript/packages/lookslike-high-level/src/recipes/tweets.tsx new file mode 100644 index 000000000..1f0590409 --- /dev/null +++ b/typescript/packages/lookslike-high-level/src/recipes/tweets.tsx @@ -0,0 +1,65 @@ +import { h } from "@commontools/common-html"; +import { recipe, UI, NAME, lift, ifElse } from "@commontools/common-builder"; +import { z } from "zod"; +import { buildTransactionRequest, queryRecipe, schemaQuery } from "../query.js"; + +const Tweet = z + .object({ + id: z.string(), + full_text: z.string(), + favorited: z.boolean(), + favorite_count: z.string(), + in_reply_to_status_id_str: z.string(), + created_at: z.string(), + }) + .describe("Tweet"); + +const TweetItem = z.object({ + tweet: z.array(Tweet), +}); + +const Tweets = z + .object({ + title: z.string(), + items: z.array(TweetItem), + }) + .describe("Tweets"); + +const dateStringToNiceDateString = lift((dateString: string) => { + const date = new Date(dateString); + return date.toDateString(); +}); + +export const tweets = recipe(Tweets, ({ title }) => { + const { result: items } = schemaQuery(Tweet); + return { + [NAME]: "Tweets", + [UI]: ( + + + {items.map((item) => { + return ( + + + + +
{item.full_text}
+ + {ifElse( + item.favorited, + Favorite, + Not favorite, + )} + {item.favorite_count} +
{dateStringToNiceDateString(item.created_at)}
+
+
+ ); + })} +
+
+ ), + title, + items, + }; +}); From 14e52b65125cdb784d8a2b3cb9baf9a33ea08556 Mon Sep 17 00:00:00 2001 From: Gordon Brander Date: Thu, 31 Oct 2024 15:59:11 -0700 Subject: [PATCH 3/7] Get icons working --- .../src/components/shoelace/index.ts | 20 +++++++++++++++++++ typescript/packages/common-ui/src/example.ts | 6 ++++++ typescript/packages/common-ui/src/index.ts | 4 ++-- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/typescript/packages/common-ui/src/components/shoelace/index.ts b/typescript/packages/common-ui/src/components/shoelace/index.ts index 65113ce9e..1632d2db1 100644 --- a/typescript/packages/common-ui/src/components/shoelace/index.ts +++ b/typescript/packages/common-ui/src/components/shoelace/index.ts @@ -1,5 +1,6 @@ export * from "./components.js"; import theme from "./theme/light.styles.js"; +import { registerIconLibrary } from "@shoelace-style/shoelace"; /** * Adopt the styles for shoelace components. @@ -11,3 +12,22 @@ export const adoptShoelaceStyles = ( ) => { host.adoptedStyleSheets = [theme.styleSheet]; }; + +export const registerShoelaceIcons = () => { + registerIconLibrary("material", { + resolver: (name) => { + const match = name.match(/^(.*?)(_(round|sharp))?$/); + return `https://cdn.jsdelivr.net/npm/@material-icons/svg@1.0.5/svg/${match[1]}/${match[3] || "outline"}.svg`; + }, + mutator: (svg) => svg.setAttribute("fill", "currentColor"), + }); +}; + +export const setupShoelace = ({ + host = window.document, +}: { + host?: Document | ShadowRoot; +} = {}) => { + registerShoelaceIcons(); + adoptShoelaceStyles(host); +}; diff --git a/typescript/packages/common-ui/src/example.ts b/typescript/packages/common-ui/src/example.ts index cf4deeeb6..843953aae 100644 --- a/typescript/packages/common-ui/src/example.ts +++ b/typescript/packages/common-ui/src/example.ts @@ -4,6 +4,7 @@ import { state } from "@commontools/common-frp/signal"; import { datatable, dict, vstack, div, shoelace } from "./hyperscript/tags.js"; import { binding, repeat } from "./hyperscript/view.js"; import render from "./hyperscript/render.js"; +import library from "@shoelace-style/shoelace/dist/components/icon/library.default.js"; const datatableNode = datatable({ "@click": binding("clicks"), @@ -92,6 +93,11 @@ const tree = vstack({}, [ shoelace.breadcrumbItem({}, ["World"]), ]), shoelace.button({}, ["Button"]), + shoelace.icon({ + library: "material", + name: "settings", + label: "Settings", + }), datatableNode, dictNode, listNode, diff --git a/typescript/packages/common-ui/src/index.ts b/typescript/packages/common-ui/src/index.ts index 44c64dde7..8fd1ca97f 100644 --- a/typescript/packages/common-ui/src/index.ts +++ b/typescript/packages/common-ui/src/index.ts @@ -3,10 +3,10 @@ export * as view from "./hyperscript/view.js"; export * as tags from "./hyperscript/tags.js"; export * as render from "./hyperscript/render.js"; export * as style from "./components/style.js"; -import { adoptShoelaceStyles } from "./components/shoelace/index.js"; +import { setupShoelace } from "./components/shoelace/index.js"; const setup = () => { - adoptShoelaceStyles(); + setupShoelace(); }; setup(); From 82c2bc10c240be7e394d4a0a186023d918eeccec Mon Sep 17 00:00:00 2001 From: Gordon Brander Date: Thu, 31 Oct 2024 16:53:21 -0700 Subject: [PATCH 4/7] remove unused .js and .d.ts files ...we use .ts instead --- .../shoelace/theme/light.styles.d.ts | 2 - .../components/shoelace/theme/light.styles.js | 489 ------------------ 2 files changed, 491 deletions(-) delete mode 100644 typescript/packages/common-ui/src/components/shoelace/theme/light.styles.d.ts delete mode 100644 typescript/packages/common-ui/src/components/shoelace/theme/light.styles.js diff --git a/typescript/packages/common-ui/src/components/shoelace/theme/light.styles.d.ts b/typescript/packages/common-ui/src/components/shoelace/theme/light.styles.d.ts deleted file mode 100644 index b290bc199..000000000 --- a/typescript/packages/common-ui/src/components/shoelace/theme/light.styles.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare const _default: import("lit").CSSResult; -export default _default; diff --git a/typescript/packages/common-ui/src/components/shoelace/theme/light.styles.js b/typescript/packages/common-ui/src/components/shoelace/theme/light.styles.js deleted file mode 100644 index cd4b5b3d7..000000000 --- a/typescript/packages/common-ui/src/components/shoelace/theme/light.styles.js +++ /dev/null @@ -1,489 +0,0 @@ -import { css } from "lit"; - -export default css` - :root, - :host, - .sl-theme-light { - color-scheme: light; - - --sl-color-gray-50: hsl(0 0% 97.5%); - --sl-color-gray-100: hsl(240 4.8% 95.9%); - --sl-color-gray-200: hsl(240 5.9% 90%); - --sl-color-gray-300: hsl(240 4.9% 83.9%); - --sl-color-gray-400: hsl(240 5% 64.9%); - --sl-color-gray-500: hsl(240 3.8% 46.1%); - --sl-color-gray-600: hsl(240 5.2% 33.9%); - --sl-color-gray-700: hsl(240 5.3% 26.1%); - --sl-color-gray-800: hsl(240 3.7% 15.9%); - --sl-color-gray-900: hsl(240 5.9% 10%); - --sl-color-gray-950: hsl(240 7.3% 8%); - - --sl-color-red-50: hsl(0 85.7% 97.3%); - --sl-color-red-100: hsl(0 93.3% 94.1%); - --sl-color-red-200: hsl(0 96.3% 89.4%); - --sl-color-red-300: hsl(0 93.5% 81.8%); - --sl-color-red-400: hsl(0 90.6% 70.8%); - --sl-color-red-500: hsl(0 84.2% 60.2%); - --sl-color-red-600: hsl(0 72.2% 50.6%); - --sl-color-red-700: hsl(0 73.7% 41.8%); - --sl-color-red-800: hsl(0 70% 35.3%); - --sl-color-red-900: hsl(0 62.8% 30.6%); - --sl-color-red-950: hsl(0 60% 19.6%); - - --sl-color-orange-50: hsl(33.3 100% 96.5%); - --sl-color-orange-100: hsl(34.3 100% 91.8%); - --sl-color-orange-200: hsl(32.1 97.7% 83.1%); - --sl-color-orange-300: hsl(30.7 97.2% 72.4%); - --sl-color-orange-400: hsl(27 96% 61%); - --sl-color-orange-500: hsl(24.6 95% 53.1%); - --sl-color-orange-600: hsl(20.5 90.2% 48.2%); - --sl-color-orange-700: hsl(17.5 88.3% 40.4%); - --sl-color-orange-800: hsl(15 79.1% 33.7%); - --sl-color-orange-900: hsl(15.3 74.6% 27.8%); - --sl-color-orange-950: hsl(15.2 69.1% 19%); - - --sl-color-amber-50: hsl(48 100% 96.1%); - --sl-color-amber-100: hsl(48 96.5% 88.8%); - --sl-color-amber-200: hsl(48 96.6% 76.7%); - --sl-color-amber-300: hsl(45.9 96.7% 64.5%); - --sl-color-amber-400: hsl(43.3 96.4% 56.3%); - --sl-color-amber-500: hsl(37.7 92.1% 50.2%); - --sl-color-amber-600: hsl(32.1 94.6% 43.7%); - --sl-color-amber-700: hsl(26 90.5% 37.1%); - --sl-color-amber-800: hsl(22.7 82.5% 31.4%); - --sl-color-amber-900: hsl(21.7 77.8% 26.5%); - --sl-color-amber-950: hsl(22.9 74.1% 16.7%); - - --sl-color-yellow-50: hsl(54.5 91.7% 95.3%); - --sl-color-yellow-100: hsl(54.9 96.7% 88%); - --sl-color-yellow-200: hsl(52.8 98.3% 76.9%); - --sl-color-yellow-300: hsl(50.4 97.8% 63.5%); - --sl-color-yellow-400: hsl(47.9 95.8% 53.1%); - --sl-color-yellow-500: hsl(45.4 93.4% 47.5%); - --sl-color-yellow-600: hsl(40.6 96.1% 40.4%); - --sl-color-yellow-700: hsl(35.5 91.7% 32.9%); - --sl-color-yellow-800: hsl(31.8 81% 28.8%); - --sl-color-yellow-900: hsl(28.4 72.5% 25.7%); - --sl-color-yellow-950: hsl(33.1 69% 13.9%); - - --sl-color-lime-50: hsl(78.3 92% 95.1%); - --sl-color-lime-100: hsl(79.6 89.1% 89.2%); - --sl-color-lime-200: hsl(80.9 88.5% 79.6%); - --sl-color-lime-300: hsl(82 84.5% 67.1%); - --sl-color-lime-400: hsl(82.7 78% 55.5%); - --sl-color-lime-500: hsl(83.7 80.5% 44.3%); - --sl-color-lime-600: hsl(84.8 85.2% 34.5%); - --sl-color-lime-700: hsl(85.9 78.4% 27.3%); - --sl-color-lime-800: hsl(86.3 69% 22.7%); - --sl-color-lime-900: hsl(87.6 61.2% 20.2%); - --sl-color-lime-950: hsl(86.5 60.6% 13.9%); - - --sl-color-green-50: hsl(138.5 76.5% 96.7%); - --sl-color-green-100: hsl(140.6 84.2% 92.5%); - --sl-color-green-200: hsl(141 78.9% 85.1%); - --sl-color-green-300: hsl(141.7 76.6% 73.1%); - --sl-color-green-400: hsl(141.9 69.2% 58%); - --sl-color-green-500: hsl(142.1 70.6% 45.3%); - --sl-color-green-600: hsl(142.1 76.2% 36.3%); - --sl-color-green-700: hsl(142.4 71.8% 29.2%); - --sl-color-green-800: hsl(142.8 64.2% 24.1%); - --sl-color-green-900: hsl(143.8 61.2% 20.2%); - --sl-color-green-950: hsl(144.3 60.7% 12%); - - --sl-color-emerald-50: hsl(151.8 81% 95.9%); - --sl-color-emerald-100: hsl(149.3 80.4% 90%); - --sl-color-emerald-200: hsl(152.4 76% 80.4%); - --sl-color-emerald-300: hsl(156.2 71.6% 66.9%); - --sl-color-emerald-400: hsl(158.1 64.4% 51.6%); - --sl-color-emerald-500: hsl(160.1 84.1% 39.4%); - --sl-color-emerald-600: hsl(161.4 93.5% 30.4%); - --sl-color-emerald-700: hsl(162.9 93.5% 24.3%); - --sl-color-emerald-800: hsl(163.1 88.1% 19.8%); - --sl-color-emerald-900: hsl(164.2 85.7% 16.5%); - --sl-color-emerald-950: hsl(164.3 87.5% 9.4%); - - --sl-color-teal-50: hsl(166.2 76.5% 96.7%); - --sl-color-teal-100: hsl(167.2 85.5% 89.2%); - --sl-color-teal-200: hsl(168.4 83.8% 78.2%); - --sl-color-teal-300: hsl(170.6 76.9% 64.3%); - --sl-color-teal-400: hsl(172.5 66% 50.4%); - --sl-color-teal-500: hsl(173.4 80.4% 40%); - --sl-color-teal-600: hsl(174.7 83.9% 31.6%); - --sl-color-teal-700: hsl(175.3 77.4% 26.1%); - --sl-color-teal-800: hsl(176.1 69.4% 21.8%); - --sl-color-teal-900: hsl(175.9 60.8% 19%); - --sl-color-teal-950: hsl(176.5 58.6% 11.4%); - - --sl-color-cyan-50: hsl(183.2 100% 96.3%); - --sl-color-cyan-100: hsl(185.1 95.9% 90.4%); - --sl-color-cyan-200: hsl(186.2 93.5% 81.8%); - --sl-color-cyan-300: hsl(187 92.4% 69%); - --sl-color-cyan-400: hsl(187.9 85.7% 53.3%); - --sl-color-cyan-500: hsl(188.7 94.5% 42.7%); - --sl-color-cyan-600: hsl(191.6 91.4% 36.5%); - --sl-color-cyan-700: hsl(192.9 82.3% 31%); - --sl-color-cyan-800: hsl(194.4 69.6% 27.1%); - --sl-color-cyan-900: hsl(196.4 63.6% 23.7%); - --sl-color-cyan-950: hsl(196.8 61% 16.1%); - - --sl-color-sky-50: hsl(204 100% 97.1%); - --sl-color-sky-100: hsl(204 93.8% 93.7%); - --sl-color-sky-200: hsl(200.6 94.4% 86.1%); - --sl-color-sky-300: hsl(199.4 95.5% 73.9%); - --sl-color-sky-400: hsl(198.4 93.2% 59.6%); - --sl-color-sky-500: hsl(198.6 88.7% 48.4%); - --sl-color-sky-600: hsl(200.4 98% 39.4%); - --sl-color-sky-700: hsl(201.3 96.3% 32.2%); - --sl-color-sky-800: hsl(201 90% 27.5%); - --sl-color-sky-900: hsl(202 80.3% 23.9%); - --sl-color-sky-950: hsl(202.3 73.8% 16.5%); - - --sl-color-blue-50: hsl(213.8 100% 96.9%); - --sl-color-blue-100: hsl(214.3 94.6% 92.7%); - --sl-color-blue-200: hsl(213.3 96.9% 87.3%); - --sl-color-blue-300: hsl(211.7 96.4% 78.4%); - --sl-color-blue-400: hsl(213.1 93.9% 67.8%); - --sl-color-blue-500: hsl(217.2 91.2% 59.8%); - --sl-color-blue-600: hsl(221.2 83.2% 53.3%); - --sl-color-blue-700: hsl(224.3 76.3% 48%); - --sl-color-blue-800: hsl(225.9 70.7% 40.2%); - --sl-color-blue-900: hsl(224.4 64.3% 32.9%); - --sl-color-blue-950: hsl(226.2 55.3% 18.4%); - - --sl-color-indigo-50: hsl(225.9 100% 96.7%); - --sl-color-indigo-100: hsl(226.5 100% 93.9%); - --sl-color-indigo-200: hsl(228 96.5% 88.8%); - --sl-color-indigo-300: hsl(229.7 93.5% 81.8%); - --sl-color-indigo-400: hsl(234.5 89.5% 73.9%); - --sl-color-indigo-500: hsl(238.7 83.5% 66.7%); - --sl-color-indigo-600: hsl(243.4 75.4% 58.6%); - --sl-color-indigo-700: hsl(244.5 57.9% 50.6%); - --sl-color-indigo-800: hsl(243.7 54.5% 41.4%); - --sl-color-indigo-900: hsl(242.2 47.4% 34.3%); - --sl-color-indigo-950: hsl(243.5 43.6% 22.9%); - - --sl-color-violet-50: hsl(250 100% 97.6%); - --sl-color-violet-100: hsl(251.4 91.3% 95.5%); - --sl-color-violet-200: hsl(250.5 95.2% 91.8%); - --sl-color-violet-300: hsl(252.5 94.7% 85.1%); - --sl-color-violet-400: hsl(255.1 91.7% 76.3%); - --sl-color-violet-500: hsl(258.3 89.5% 66.3%); - --sl-color-violet-600: hsl(262.1 83.3% 57.8%); - --sl-color-violet-700: hsl(263.4 70% 50.4%); - --sl-color-violet-800: hsl(263.4 69.3% 42.2%); - --sl-color-violet-900: hsl(263.5 67.4% 34.9%); - --sl-color-violet-950: hsl(265.1 61.5% 21.4%); - - --sl-color-purple-50: hsl(270 100% 98%); - --sl-color-purple-100: hsl(268.7 100% 95.5%); - --sl-color-purple-200: hsl(268.6 100% 91.8%); - --sl-color-purple-300: hsl(269.2 97.4% 85.1%); - --sl-color-purple-400: hsl(270 95.2% 75.3%); - --sl-color-purple-500: hsl(270.7 91% 65.1%); - --sl-color-purple-600: hsl(271.5 81.3% 55.9%); - --sl-color-purple-700: hsl(272.1 71.7% 47.1%); - --sl-color-purple-800: hsl(272.9 67.2% 39.4%); - --sl-color-purple-900: hsl(273.6 65.6% 32%); - --sl-color-purple-950: hsl(276 59.5% 16.5%); - - --sl-color-fuchsia-50: hsl(289.1 100% 97.8%); - --sl-color-fuchsia-100: hsl(287 100% 95.5%); - --sl-color-fuchsia-200: hsl(288.3 95.8% 90.6%); - --sl-color-fuchsia-300: hsl(291.1 93.1% 82.9%); - --sl-color-fuchsia-400: hsl(292 91.4% 72.5%); - --sl-color-fuchsia-500: hsl(292.2 84.1% 60.6%); - --sl-color-fuchsia-600: hsl(293.4 69.5% 48.8%); - --sl-color-fuchsia-700: hsl(294.7 72.4% 39.8%); - --sl-color-fuchsia-800: hsl(295.4 70.2% 32.9%); - --sl-color-fuchsia-900: hsl(296.7 63.6% 28%); - --sl-color-fuchsia-950: hsl(297.1 56.8% 14.5%); - - --sl-color-pink-50: hsl(327.3 73.3% 97.1%); - --sl-color-pink-100: hsl(325.7 77.8% 94.7%); - --sl-color-pink-200: hsl(325.9 84.6% 89.8%); - --sl-color-pink-300: hsl(327.4 87.1% 81.8%); - --sl-color-pink-400: hsl(328.6 85.5% 70.2%); - --sl-color-pink-500: hsl(330.4 81.2% 60.4%); - --sl-color-pink-600: hsl(333.3 71.4% 50.6%); - --sl-color-pink-700: hsl(335.1 77.6% 42%); - --sl-color-pink-800: hsl(335.8 74.4% 35.3%); - --sl-color-pink-900: hsl(335.9 69% 30.4%); - --sl-color-pink-950: hsl(336.2 65.4% 15.9%); - - --sl-color-rose-50: hsl(355.7 100% 97.3%); - --sl-color-rose-100: hsl(355.6 100% 94.7%); - --sl-color-rose-200: hsl(352.7 96.1% 90%); - --sl-color-rose-300: hsl(352.6 95.7% 81.8%); - --sl-color-rose-400: hsl(351.3 94.5% 71.4%); - --sl-color-rose-500: hsl(349.7 89.2% 60.2%); - --sl-color-rose-600: hsl(346.8 77.2% 49.8%); - --sl-color-rose-700: hsl(345.3 82.7% 40.8%); - --sl-color-rose-800: hsl(343.4 79.7% 34.7%); - --sl-color-rose-900: hsl(341.5 75.5% 30.4%); - --sl-color-rose-950: hsl(341.3 70.1% 17.1%); - - --sl-color-primary-50: var(--sl-color-sky-50); - --sl-color-primary-100: var(--sl-color-sky-100); - --sl-color-primary-200: var(--sl-color-sky-200); - --sl-color-primary-300: var(--sl-color-sky-300); - --sl-color-primary-400: var(--sl-color-sky-400); - --sl-color-primary-500: var(--sl-color-sky-500); - --sl-color-primary-600: var(--sl-color-sky-600); - --sl-color-primary-700: var(--sl-color-sky-700); - --sl-color-primary-800: var(--sl-color-sky-800); - --sl-color-primary-900: var(--sl-color-sky-900); - --sl-color-primary-950: var(--sl-color-sky-950); - - --sl-color-success-50: var(--sl-color-green-50); - --sl-color-success-100: var(--sl-color-green-100); - --sl-color-success-200: var(--sl-color-green-200); - --sl-color-success-300: var(--sl-color-green-300); - --sl-color-success-400: var(--sl-color-green-400); - --sl-color-success-500: var(--sl-color-green-500); - --sl-color-success-600: var(--sl-color-green-600); - --sl-color-success-700: var(--sl-color-green-700); - --sl-color-success-800: var(--sl-color-green-800); - --sl-color-success-900: var(--sl-color-green-900); - --sl-color-success-950: var(--sl-color-green-950); - - --sl-color-warning-50: var(--sl-color-amber-50); - --sl-color-warning-100: var(--sl-color-amber-100); - --sl-color-warning-200: var(--sl-color-amber-200); - --sl-color-warning-300: var(--sl-color-amber-300); - --sl-color-warning-400: var(--sl-color-amber-400); - --sl-color-warning-500: var(--sl-color-amber-500); - --sl-color-warning-600: var(--sl-color-amber-600); - --sl-color-warning-700: var(--sl-color-amber-700); - --sl-color-warning-800: var(--sl-color-amber-800); - --sl-color-warning-900: var(--sl-color-amber-900); - --sl-color-warning-950: var(--sl-color-amber-950); - - --sl-color-danger-50: var(--sl-color-red-50); - --sl-color-danger-100: var(--sl-color-red-100); - --sl-color-danger-200: var(--sl-color-red-200); - --sl-color-danger-300: var(--sl-color-red-300); - --sl-color-danger-400: var(--sl-color-red-400); - --sl-color-danger-500: var(--sl-color-red-500); - --sl-color-danger-600: var(--sl-color-red-600); - --sl-color-danger-700: var(--sl-color-red-700); - --sl-color-danger-800: var(--sl-color-red-800); - --sl-color-danger-900: var(--sl-color-red-900); - --sl-color-danger-950: var(--sl-color-red-950); - - --sl-color-neutral-50: var(--sl-color-gray-50); - --sl-color-neutral-100: var(--sl-color-gray-100); - --sl-color-neutral-200: var(--sl-color-gray-200); - --sl-color-neutral-300: var(--sl-color-gray-300); - --sl-color-neutral-400: var(--sl-color-gray-400); - --sl-color-neutral-500: var(--sl-color-gray-500); - --sl-color-neutral-600: var(--sl-color-gray-600); - --sl-color-neutral-700: var(--sl-color-gray-700); - --sl-color-neutral-800: var(--sl-color-gray-800); - --sl-color-neutral-900: var(--sl-color-gray-900); - --sl-color-neutral-950: var(--sl-color-gray-950); - - --sl-color-neutral-0: hsl(0, 0%, 100%); - --sl-color-neutral-1000: hsl(0, 0%, 0%); - - --sl-border-radius-small: 0.1875rem; - --sl-border-radius-medium: 0.25rem; - --sl-border-radius-large: 0.5rem; - --sl-border-radius-x-large: 1rem; - - --sl-border-radius-circle: 50%; - --sl-border-radius-pill: 9999px; - - --sl-shadow-x-small: 0 1px 2px hsl(240 3.8% 46.1% / 6%); - --sl-shadow-small: 0 1px 2px hsl(240 3.8% 46.1% / 12%); - --sl-shadow-medium: 0 2px 4px hsl(240 3.8% 46.1% / 12%); - --sl-shadow-large: 0 2px 8px hsl(240 3.8% 46.1% / 12%); - --sl-shadow-x-large: 0 4px 16px hsl(240 3.8% 46.1% / 12%); - - --sl-spacing-3x-small: 0.125rem; - --sl-spacing-2x-small: 0.25rem; - --sl-spacing-x-small: 0.5rem; - --sl-spacing-small: 0.75rem; - --sl-spacing-medium: 1rem; - --sl-spacing-large: 1.25rem; - --sl-spacing-x-large: 1.75rem; - --sl-spacing-2x-large: 2.25rem; - --sl-spacing-3x-large: 3rem; - --sl-spacing-4x-large: 4.5rem; - - --sl-transition-x-slow: 1000ms; - --sl-transition-slow: 500ms; - --sl-transition-medium: 250ms; - --sl-transition-fast: 150ms; - --sl-transition-x-fast: 50ms; - - --sl-font-mono: SFMono-Regular, Consolas, "Liberation Mono", Menlo, - monospace; - --sl-font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, - Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", - "Segoe UI Symbol"; - --sl-font-serif: Georgia, "Times New Roman", serif; - - --sl-font-size-2x-small: 0.625rem; - --sl-font-size-x-small: 0.75rem; - --sl-font-size-small: 0.875rem; - --sl-font-size-medium: 1rem; - --sl-font-size-large: 1.25rem; - --sl-font-size-x-large: 1.5rem; - --sl-font-size-2x-large: 2.25rem; - --sl-font-size-3x-large: 3rem; - --sl-font-size-4x-large: 4.5rem; - - --sl-font-weight-light: 300; - --sl-font-weight-normal: 400; - --sl-font-weight-semibold: 500; - --sl-font-weight-bold: 700; - - --sl-letter-spacing-denser: -0.03em; - --sl-letter-spacing-dense: -0.015em; - --sl-letter-spacing-normal: normal; - --sl-letter-spacing-loose: 0.075em; - --sl-letter-spacing-looser: 0.15em; - - --sl-line-height-denser: 1; - --sl-line-height-dense: 1.4; - --sl-line-height-normal: 1.8; - --sl-line-height-loose: 2.2; - --sl-line-height-looser: 2.6; - - --sl-focus-ring-color: var(--sl-color-primary-600); - --sl-focus-ring-style: solid; - --sl-focus-ring-width: 3px; - --sl-focus-ring: var(--sl-focus-ring-style) var(--sl-focus-ring-width) - var(--sl-focus-ring-color); - --sl-focus-ring-offset: 1px; - - --sl-button-font-size-small: var(--sl-font-size-x-small); - --sl-button-font-size-medium: var(--sl-font-size-small); - --sl-button-font-size-large: var(--sl-font-size-medium); - - --sl-input-height-small: 1.875rem; - --sl-input-height-medium: 2.5rem; - --sl-input-height-large: 3.125rem; - - --sl-input-background-color: var(--sl-color-neutral-0); - --sl-input-background-color-hover: var(--sl-input-background-color); - --sl-input-background-color-focus: var(--sl-input-background-color); - --sl-input-background-color-disabled: var(--sl-color-neutral-100); - --sl-input-border-color: var(--sl-color-neutral-300); - --sl-input-border-color-hover: var(--sl-color-neutral-400); - --sl-input-border-color-focus: var(--sl-color-primary-500); - --sl-input-border-color-disabled: var(--sl-color-neutral-300); - --sl-input-border-width: 1px; - --sl-input-required-content: "*"; - --sl-input-required-content-offset: -2px; - --sl-input-required-content-color: var(--sl-input-label-color); - - --sl-input-border-radius-small: var(--sl-border-radius-medium); - --sl-input-border-radius-medium: var(--sl-border-radius-medium); - --sl-input-border-radius-large: var(--sl-border-radius-medium); - - --sl-input-font-family: var(--sl-font-sans); - --sl-input-font-weight: var(--sl-font-weight-normal); - --sl-input-font-size-small: var(--sl-font-size-small); - --sl-input-font-size-medium: var(--sl-font-size-medium); - --sl-input-font-size-large: var(--sl-font-size-large); - --sl-input-letter-spacing: var(--sl-letter-spacing-normal); - - --sl-input-color: var(--sl-color-neutral-700); - --sl-input-color-hover: var(--sl-color-neutral-700); - --sl-input-color-focus: var(--sl-color-neutral-700); - --sl-input-color-disabled: var(--sl-color-neutral-900); - --sl-input-icon-color: var(--sl-color-neutral-500); - --sl-input-icon-color-hover: var(--sl-color-neutral-600); - --sl-input-icon-color-focus: var(--sl-color-neutral-600); - --sl-input-placeholder-color: var(--sl-color-neutral-500); - --sl-input-placeholder-color-disabled: var(--sl-color-neutral-600); - --sl-input-spacing-small: var(--sl-spacing-small); - --sl-input-spacing-medium: var(--sl-spacing-medium); - --sl-input-spacing-large: var(--sl-spacing-large); - - --sl-input-focus-ring-color: hsl(198.6 88.7% 48.4% / 40%); - --sl-input-focus-ring-offset: 0; - - --sl-input-filled-background-color: var(--sl-color-neutral-100); - --sl-input-filled-background-color-hover: var(--sl-color-neutral-100); - --sl-input-filled-background-color-focus: var(--sl-color-neutral-100); - --sl-input-filled-background-color-disabled: var(--sl-color-neutral-100); - --sl-input-filled-color: var(--sl-color-neutral-800); - --sl-input-filled-color-hover: var(--sl-color-neutral-800); - --sl-input-filled-color-focus: var(--sl-color-neutral-700); - --sl-input-filled-color-disabled: var(--sl-color-neutral-800); - - --sl-input-label-font-size-small: var(--sl-font-size-small); - --sl-input-label-font-size-medium: var(--sl-font-size-medium); - --sl-input-label-font-size-large: var(--sl-font-size-large); - --sl-input-label-color: inherit; - - --sl-input-help-text-font-size-small: var(--sl-font-size-x-small); - --sl-input-help-text-font-size-medium: var(--sl-font-size-small); - --sl-input-help-text-font-size-large: var(--sl-font-size-medium); - --sl-input-help-text-color: var(--sl-color-neutral-500); - - --sl-toggle-size-small: 0.875rem; - --sl-toggle-size-medium: 1.125rem; - --sl-toggle-size-large: 1.375rem; - - --sl-overlay-background-color: hsl(240 3.8% 46.1% / 33%); - - --sl-panel-background-color: var(--sl-color-neutral-0); - --sl-panel-border-color: var(--sl-color-neutral-200); - --sl-panel-border-width: 1px; - - --sl-tooltip-border-radius: var(--sl-border-radius-medium); - --sl-tooltip-background-color: var(--sl-color-neutral-800); - --sl-tooltip-color: var(--sl-color-neutral-0); - --sl-tooltip-font-family: var(--sl-font-sans); - --sl-tooltip-font-weight: var(--sl-font-weight-normal); - --sl-tooltip-font-size: var(--sl-font-size-small); - --sl-tooltip-line-height: var(--sl-line-height-dense); - --sl-tooltip-padding: var(--sl-spacing-2x-small) var(--sl-spacing-x-small); - --sl-tooltip-arrow-size: 6px; - - --sl-z-index-drawer: 700; - --sl-z-index-dialog: 800; - --sl-z-index-dropdown: 900; - --sl-z-index-toast: 950; - --sl-z-index-tooltip: 1000; - } - - @supports (scrollbar-gutter: stable) { - .sl-scroll-lock { - scrollbar-gutter: var(--sl-scroll-lock-gutter) !important; - } - - .sl-scroll-lock body { - overflow: hidden !important; - } - } - - @supports not (scrollbar-gutter: stable) { - .sl-scroll-lock body { - padding-right: var(--sl-scroll-lock-size) !important; - overflow: hidden !important; - } - } - - .sl-toast-stack { - position: fixed; - top: 0; - inset-inline-end: 0; - z-index: var(--sl-z-index-toast); - width: 28rem; - max-width: 100%; - max-height: 100%; - overflow: auto; - } - - .sl-toast-stack sl-alert { - margin: var(--sl-spacing-medium); - } - - .sl-toast-stack sl-alert::part(base) { - box-shadow: var(--sl-shadow-large); - } -`; From 7fc86ddbe1504d7c686b8992e468eac469304a61 Mon Sep 17 00:00:00 2001 From: Gordon Brander Date: Thu, 31 Oct 2024 16:54:02 -0700 Subject: [PATCH 5/7] Remove unused AI-added import --- typescript/packages/common-ui/src/example.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/typescript/packages/common-ui/src/example.ts b/typescript/packages/common-ui/src/example.ts index 843953aae..9b473f579 100644 --- a/typescript/packages/common-ui/src/example.ts +++ b/typescript/packages/common-ui/src/example.ts @@ -4,7 +4,6 @@ import { state } from "@commontools/common-frp/signal"; import { datatable, dict, vstack, div, shoelace } from "./hyperscript/tags.js"; import { binding, repeat } from "./hyperscript/view.js"; import render from "./hyperscript/render.js"; -import library from "@shoelace-style/shoelace/dist/components/icon/library.default.js"; const datatableNode = datatable({ "@click": binding("clicks"), From bfd2168168d7bd13ef3d17069121be73a7f90002 Mon Sep 17 00:00:00 2001 From: Gordon Brander Date: Thu, 31 Oct 2024 16:54:33 -0700 Subject: [PATCH 6/7] Updates to tweets --- .../src/recipes/tweets.tsx | 70 ++++++++++++------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/typescript/packages/lookslike-high-level/src/recipes/tweets.tsx b/typescript/packages/lookslike-high-level/src/recipes/tweets.tsx index 1f0590409..bd74c5dea 100644 --- a/typescript/packages/lookslike-high-level/src/recipes/tweets.tsx +++ b/typescript/packages/lookslike-high-level/src/recipes/tweets.tsx @@ -1,7 +1,14 @@ import { h } from "@commontools/common-html"; -import { recipe, UI, NAME, lift, ifElse } from "@commontools/common-builder"; +import { + recipe, + UI, + NAME, + lift, + ifElse, + str, +} from "@commontools/common-builder"; import { z } from "zod"; -import { buildTransactionRequest, queryRecipe, schemaQuery } from "../query.js"; +import { schemaQuery } from "../query.js"; const Tweet = z .object({ @@ -14,14 +21,9 @@ const Tweet = z }) .describe("Tweet"); -const TweetItem = z.object({ - tweet: z.array(Tweet), -}); - const Tweets = z .object({ - title: z.string(), - items: z.array(TweetItem), + username: z.string().default(""), }) .describe("Tweets"); @@ -30,36 +32,52 @@ const dateStringToNiceDateString = lift((dateString: string) => { return date.toDateString(); }); -export const tweets = recipe(Tweets, ({ title }) => { +const tap = lift((x) => { + console.log("tap!", JSON.stringify(x)); + return x; +}); + +export const tweets = recipe(Tweets, ({ username }) => { const { result: items } = schemaQuery(Tweet); + return { - [NAME]: "Tweets", + [NAME]: str`Tweets: ${username}`, [UI]: ( - {items.map((item) => { - return ( - - - - -
{item.full_text}
- + {items.map((item) => ( + + + +
{username}
+
+
{item.full_text}
+ + {ifElse( item.favorited, - Favorite, - Not favorite, + , + , )} - {item.favorite_count} -
{dateStringToNiceDateString(item.created_at)}
+
{item.favorite_count}
-
- ); - })} +
{dateStringToNiceDateString(item.created_at)}
+
+
+ ))}
), - title, + username, items, }; }); From 53a356c014ec4524dcb61fc03c24a950f25d00cc Mon Sep 17 00:00:00 2001 From: Gordon Brander Date: Thu, 31 Oct 2024 16:56:50 -0700 Subject: [PATCH 7/7] Add tweet recipe --- .../packages/lookslike-high-level/src/data.ts | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/typescript/packages/lookslike-high-level/src/data.ts b/typescript/packages/lookslike-high-level/src/data.ts index 749302183..7500774a0 100644 --- a/typescript/packages/lookslike-high-level/src/data.ts +++ b/typescript/packages/lookslike-high-level/src/data.ts @@ -26,6 +26,7 @@ import { routine } from "./recipes/routine.js"; import { fetchExample } from "./recipes/fetchExample.js"; import { counter } from "./recipes/counter.js"; import { counters } from "./recipes/counters.js"; +import { tweets } from "./recipes/tweets.jsx"; // Necessary, so that suggestions are indexed. import "./recipes/todo-list-as-task.js"; @@ -69,14 +70,14 @@ export function addCharms(newCharms: CellImpl[]) { .get() .map(({ cell }) => JSON.stringify(cell.entityId)); const charmsToAdd = newCharms.filter( - (cell) => !currentCharmsIds.includes(JSON.stringify(cell.entityId)) + (cell) => !currentCharmsIds.includes(JSON.stringify(cell.entityId)), ); if (charmsToAdd.length > 0) charms.send([ ...charms.get(), ...charmsToAdd.map( - (cell) => ({ cell, path: [] } satisfies CellReference) + (cell) => ({ cell, path: [] }) satisfies CellReference, ), ]); } @@ -84,19 +85,19 @@ export function addCharms(newCharms: CellImpl[]) { export async function runPersistent( recipe: Recipe, inputs?: any, - cause?: any + cause?: any, ): Promise> { await idle(); return run( recipe, inputs, - await storage.syncCell(createRef({ recipe, inputs }, cause)) + await storage.syncCell(createRef({ recipe, inputs }, cause)), ); } export async function syncCharm( entityId: string | EntityId | CellImpl, - waitForStorage: boolean = false + waitForStorage: boolean = false, ): Promise> { return storage.syncCell(entityId, waitForStorage); } @@ -106,28 +107,20 @@ addCharms([ datalogQueryExample, { query: { - "select": { + select: { ".": "?item", - "title": "?title" + title: "?title", }, - "where": [ + where: [ { - "Case": [ - "?item", - "title", - "?title" - ] - } - ] - } + Case: ["?item", "title", "?title"], + }, + ], + }, }, - "Datalog Query Playground" - ), - await runPersistent( - shoelaceDemo, - { }, - "shoelace" + "Datalog Query Playground", ), + await runPersistent(shoelaceDemo, {}, "shoelace"), await runPersistent( iframe, { @@ -135,7 +128,7 @@ addCharms([ prompt: "counter", data: { counter: 0 }, }, - "iframe" + "iframe", ), await runPersistent( todoList, @@ -146,7 +139,7 @@ addCharms([ done: false, })), }, - "todoList" + "todoList", ), await runPersistent( todoList, @@ -157,7 +150,7 @@ addCharms([ done: false, })), }, - "todoList" + "todoList", ), await runPersistent( ticket, @@ -167,7 +160,7 @@ addCharms([ date: getFridayAndMondayDateStrings().startDate, location: "New York", }, - "ticket" + "ticket", ), await runPersistent( routine, @@ -176,9 +169,16 @@ addCharms([ // TODO: A lot more missing here, this is just to drive the suggestion. locations: ["coffee shop with great baristas"], }, - "routine" + "routine", ), await runPersistent(counters, {}, "counters"), + await runPersistent( + tweets, + { + username: "@gordonbrander", + }, + "tweets", + ), ]); export type RecipeManifest = { @@ -226,10 +226,10 @@ function getFridayAndMondayDateStrings() { const daysUntilFriday = (5 - today.getDay() + 7) % 7; const nextFriday = new Date( - today.getTime() + daysUntilFriday * 24 * 60 * 60 * 1000 + today.getTime() + daysUntilFriday * 24 * 60 * 60 * 1000, ); const followingMonday = new Date( - nextFriday.getTime() + 3 * 24 * 60 * 60 * 1000 + nextFriday.getTime() + 3 * 24 * 60 * 60 * 1000, ); const formatDate = (date: Date): string => { @@ -255,7 +255,7 @@ addModuleByRef( // HACK to follow the cell references to the entityId const entityId = getEntityId(inputsCell.getAsQueryResult([], log)); if (entityId) openCharm(JSON.stringify(entityId)); - }) + }), ); (window as any).recipes = recipes;