From 998297f5047f6f7b6142aa567e7c18f817b3c5c6 Mon Sep 17 00:00:00 2001 From: HouseOfHawks Date: Tue, 9 Jun 2026 13:50:33 -0400 Subject: [PATCH] feat(many): poc for parchment consumers poc which shows extractions of component anatomy and reimplementations --- packages/__docs__/buildScripts/build-docs.mts | 3 + .../buildScripts/build-storybooks.mts | 92 ++ packages/__docs__/package.json | 3 +- packages/__docs__/src/App/index.tsx | 34 + packages/__docs__/src/Nav/index.tsx | 18 +- packages/ui-alerts/src/Alert/v2/behavior.ts | 204 +++ packages/ui-alerts/src/Alert/v2/index.tsx | 129 +- packages/ui-alerts/src/Alert/v2/props.ts | 115 +- packages/ui-alerts/src/Alert/v2/styles.ts | 15 +- packages/ui-alerts/src/Alert/v2/types.ts | 97 ++ .../src/Drilldown/__tests__/behavior.test.tsx | 303 ++++ .../ui-drilldown/src/Drilldown/v2/behavior.ts | 359 +++++ .../ui-drilldown/src/Drilldown/v2/index.tsx | 308 ++-- .../ui-drilldown/src/Drilldown/v2/styles.ts | 25 +- .../ui-drilldown/src/Drilldown/v2/types.ts | 117 ++ .../src/Menu/__tests__/behavior.test.tsx | 143 ++ .../ui-menu/src/Menu/v2/MenuItem/index.tsx | 6 +- .../ui-menu/src/Menu/v2/MenuItem/styles.ts | 5 +- .../src/Menu/v2/MenuItemGroup/index.tsx | 38 +- packages/ui-menu/src/Menu/v2/behavior.ts | 130 ++ packages/ui-menu/src/Menu/v2/index.tsx | 10 +- packages/ui-menu/src/Menu/v2/styles.ts | 5 +- packages/ui-menu/src/Menu/v2/types.ts | 123 ++ .../src/Popover/__tests__/behavior.test.tsx | 208 +++ .../ui-popover/src/Popover/v2/behavior.ts | 131 ++ packages/ui-popover/src/Popover/v2/index.tsx | 105 +- packages/ui-popover/src/Popover/v2/styles.ts | 16 +- packages/ui-popover/src/Popover/v2/types.ts | 110 ++ packages/ui-web-core/.gitignore | 5 + packages/ui-web-core/.storybook/main.ts | 57 + packages/ui-web-core/.storybook/preview.ts | 50 + packages/ui-web-core/README.md | 50 + packages/ui-web-core/aliases.mjs | 50 + packages/ui-web-core/babel.config.cjs | 36 + packages/ui-web-core/package.json | 92 ++ .../ui-web-core/src/Alert/Alert.stories.ts | 180 +++ packages/ui-web-core/src/Alert/Alert.ts | 311 ++++ packages/ui-web-core/src/Alert/README.md | 76 + packages/ui-web-core/src/Alert/icons.ts | 90 ++ packages/ui-web-core/src/Alert/index.ts | 25 + .../src/Drilldown/Drilldown.stories.ts | 244 ++++ .../ui-web-core/src/Drilldown/Drilldown.ts | 602 ++++++++ packages/ui-web-core/src/Drilldown/README.md | 83 ++ packages/ui-web-core/src/Drilldown/icons.ts | 67 + packages/ui-web-core/src/Drilldown/index.ts | 32 + packages/ui-web-core/src/Menu/Menu.stories.ts | 180 +++ packages/ui-web-core/src/Menu/Menu.ts | 725 +++++++++ packages/ui-web-core/src/Menu/README.md | 70 + packages/ui-web-core/src/Menu/icons.ts | 53 + packages/ui-web-core/src/Menu/index.ts | 32 + .../src/Popover/Popover.stories.ts | 119 ++ packages/ui-web-core/src/Popover/Popover.ts | 479 ++++++ packages/ui-web-core/src/Popover/README.md | 61 + packages/ui-web-core/src/Popover/index.ts | 26 + .../ui-web-core/src/ThemeProvider/README.md | 79 + .../ThemeProvider/ThemeProvider.stories.ts | 171 +++ .../src/ThemeProvider/ThemeProvider.ts | 244 ++++ .../ui-web-core/src/ThemeProvider/index.ts | 25 + packages/ui-web-core/src/Welcome.stories.ts | 73 + packages/ui-web-core/src/angular/index.ts | 28 + packages/ui-web-core/src/index.ts | 45 + packages/ui-web-core/src/react/index.ts | 95 ++ packages/ui-web-core/src/ssr/index.ts | 97 ++ packages/ui-web-core/src/theme/index.ts | 38 + .../ui-web-core/src/theme/styleObjectToCss.ts | 137 ++ packages/ui-web-core/src/theme/themes.ts | 135 ++ .../ui-web-core/src/theme/toCssVariables.ts | 86 ++ packages/ui-web-core/tsconfig.build.json | 14 + packages/ui-web-core/tsconfig.json | 17 + packages/ui-web-core/vite.config.ts | 92 ++ pnpm-lock.yaml | 1292 ++++++++++++++++- 71 files changed, 8762 insertions(+), 553 deletions(-) create mode 100644 packages/__docs__/buildScripts/build-storybooks.mts create mode 100644 packages/ui-alerts/src/Alert/v2/behavior.ts create mode 100644 packages/ui-alerts/src/Alert/v2/types.ts create mode 100644 packages/ui-drilldown/src/Drilldown/__tests__/behavior.test.tsx create mode 100644 packages/ui-drilldown/src/Drilldown/v2/behavior.ts create mode 100644 packages/ui-drilldown/src/Drilldown/v2/types.ts create mode 100644 packages/ui-menu/src/Menu/__tests__/behavior.test.tsx create mode 100644 packages/ui-menu/src/Menu/v2/behavior.ts create mode 100644 packages/ui-menu/src/Menu/v2/types.ts create mode 100644 packages/ui-popover/src/Popover/__tests__/behavior.test.tsx create mode 100644 packages/ui-popover/src/Popover/v2/behavior.ts create mode 100644 packages/ui-popover/src/Popover/v2/types.ts create mode 100644 packages/ui-web-core/.gitignore create mode 100644 packages/ui-web-core/.storybook/main.ts create mode 100644 packages/ui-web-core/.storybook/preview.ts create mode 100644 packages/ui-web-core/README.md create mode 100644 packages/ui-web-core/aliases.mjs create mode 100644 packages/ui-web-core/babel.config.cjs create mode 100644 packages/ui-web-core/package.json create mode 100644 packages/ui-web-core/src/Alert/Alert.stories.ts create mode 100644 packages/ui-web-core/src/Alert/Alert.ts create mode 100644 packages/ui-web-core/src/Alert/README.md create mode 100644 packages/ui-web-core/src/Alert/icons.ts create mode 100644 packages/ui-web-core/src/Alert/index.ts create mode 100644 packages/ui-web-core/src/Drilldown/Drilldown.stories.ts create mode 100644 packages/ui-web-core/src/Drilldown/Drilldown.ts create mode 100644 packages/ui-web-core/src/Drilldown/README.md create mode 100644 packages/ui-web-core/src/Drilldown/icons.ts create mode 100644 packages/ui-web-core/src/Drilldown/index.ts create mode 100644 packages/ui-web-core/src/Menu/Menu.stories.ts create mode 100644 packages/ui-web-core/src/Menu/Menu.ts create mode 100644 packages/ui-web-core/src/Menu/README.md create mode 100644 packages/ui-web-core/src/Menu/icons.ts create mode 100644 packages/ui-web-core/src/Menu/index.ts create mode 100644 packages/ui-web-core/src/Popover/Popover.stories.ts create mode 100644 packages/ui-web-core/src/Popover/Popover.ts create mode 100644 packages/ui-web-core/src/Popover/README.md create mode 100644 packages/ui-web-core/src/Popover/index.ts create mode 100644 packages/ui-web-core/src/ThemeProvider/README.md create mode 100644 packages/ui-web-core/src/ThemeProvider/ThemeProvider.stories.ts create mode 100644 packages/ui-web-core/src/ThemeProvider/ThemeProvider.ts create mode 100644 packages/ui-web-core/src/ThemeProvider/index.ts create mode 100644 packages/ui-web-core/src/Welcome.stories.ts create mode 100644 packages/ui-web-core/src/angular/index.ts create mode 100644 packages/ui-web-core/src/index.ts create mode 100644 packages/ui-web-core/src/react/index.ts create mode 100644 packages/ui-web-core/src/ssr/index.ts create mode 100644 packages/ui-web-core/src/theme/index.ts create mode 100644 packages/ui-web-core/src/theme/styleObjectToCss.ts create mode 100644 packages/ui-web-core/src/theme/themes.ts create mode 100644 packages/ui-web-core/src/theme/toCssVariables.ts create mode 100644 packages/ui-web-core/tsconfig.build.json create mode 100644 packages/ui-web-core/tsconfig.json create mode 100644 packages/ui-web-core/vite.config.ts diff --git a/packages/__docs__/buildScripts/build-docs.mts b/packages/__docs__/buildScripts/build-docs.mts index 155f121db0..16236802cd 100644 --- a/packages/__docs__/buildScripts/build-docs.mts +++ b/packages/__docs__/buildScripts/build-docs.mts @@ -105,6 +105,9 @@ const pathsToIgnore = [ '**/ui-theme-tokens/**', '**/ui-test-*/src/**', '**/ui-scripts/src/**', + // ui-web-core ships Lit Web Components with their own embedded Storybook at + // /parchment; the React docs builder's per-component shape doesn't apply. + '**/ui-web-core/**', // large generated files: '**/lucide/**', // Lucide icons directory (large generated file) diff --git a/packages/__docs__/buildScripts/build-storybooks.mts b/packages/__docs__/buildScripts/build-storybooks.mts new file mode 100644 index 0000000000..41a65a8756 --- /dev/null +++ b/packages/__docs__/buildScripts/build-storybooks.mts @@ -0,0 +1,92 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2015 - present Instructure, Inc. + * + * 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. + */ + +/* + * Builds the ui-web-core (Lit + Web Components) Storybook and copies its + * static output to packages/__docs__/__build__/storybook/parchment/, so the + * docs app can iframe it at the `/parchment` route. + * + * Dev workflow is unaffected: `pnpm --filter @instructure/ui-web-core + * storybook` runs at port 6006 for live development. + */ + +import { spawnSync } from 'child_process' +import fs from 'fs' +import path from 'path' +import { fileURLToPath } from 'url' + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) + +const projectRoot = path.resolve(__dirname, '../../../') +const docsBuildDir = path.resolve(__dirname, '../__build__') +const storybookOutDir = path.join(docsBuildDir, 'storybook') + +const packages = [ + { + name: '@instructure/ui-web-core', + dir: 'ui-web-core', + mountAs: 'parchment' + } +] + +function runBuildStorybook(packageName: string): void { + // eslint-disable-next-line no-console + console.log(`Building Storybook: ${packageName}`) + const result = spawnSync( + 'pnpm', + ['--filter', packageName, 'build-storybook'], + { cwd: projectRoot, stdio: 'inherit' } + ) + if (result.status !== 0) { + throw new Error( + `build-storybook failed for ${packageName} (exit ${result.status})` + ) + } +} + +function copyStorybookOutput(packageDir: string, mountAs: string): void { + const src = path.join(projectRoot, 'packages', packageDir, 'storybook-static') + const dest = path.join(storybookOutDir, mountAs) + if (!fs.existsSync(src)) { + throw new Error(`Expected Storybook output at ${src}`) + } + fs.rmSync(dest, { recursive: true, force: true }) + fs.mkdirSync(dest, { recursive: true }) + fs.cpSync(src, dest, { recursive: true }) + // eslint-disable-next-line no-console + console.log(`Copied ${src} -> ${dest}`) +} + +function main(): void { + fs.mkdirSync(storybookOutDir, { recursive: true }) + for (const pkg of packages) { + runBuildStorybook(pkg.name) + copyStorybookOutput(pkg.dir, pkg.mountAs) + } + // eslint-disable-next-line no-console + console.log('Storybook(s) built and copied under', storybookOutDir) +} + +main() diff --git a/packages/__docs__/package.json b/packages/__docs__/package.json index b481a7ba27..2161c24eb3 100644 --- a/packages/__docs__/package.json +++ b/packages/__docs__/package.json @@ -16,7 +16,8 @@ "start:watch": "pnpm run prestart && concurrently -n markdown,webpack -c cyan,yellow \"node buildScripts/watch-markdown.mjs\" \"ui-scripts bundle --watch\"", "start-watch-just-app": "ui-scripts bundle --watch", "watch:markdown": "node buildScripts/watch-markdown.mjs", - "bundle": "pnpm run prestart && ui-scripts bundle", + "build:storybooks": "pnpm run build:scripts:ts && node lib/build-storybooks.mjs", + "bundle": "pnpm run prestart && pnpm run build:storybooks && ui-scripts bundle", "lint": "ui-scripts lint", "lint:fix": "ui-scripts lint --fix", "build:scripts:ts": "tsc -b tsconfig.node.build.json", diff --git a/packages/__docs__/src/App/index.tsx b/packages/__docs__/src/App/index.tsx index da4a7589d4..4e0342bbf6 100644 --- a/packages/__docs__/src/App/index.tsx +++ b/packages/__docs__/src/App/index.tsx @@ -650,6 +650,29 @@ class App extends Component { return
{this.renderWrappedContent(iconContent)}
} + renderParchmentStorybook(key: string) { + // The ui-web-core Storybook (Lit + Web Components) is built by the docs + // app's `build:storybooks` script and copied to + // `__build__/storybook/parchment/` during `bundle`. If that step hasn't + // run locally (e.g. `pnpm run dev`), the iframe will 404 — expected for + // the unbundled dev path. + const src = `${getDeployBase()}/storybook/parchment/` + const content = ( + +