From 299036eced1b4bdb6ad21816d699a721d4f586ec Mon Sep 17 00:00:00 2001 From: Ganonmaster Date: Wed, 15 Apr 2026 04:12:32 +0200 Subject: [PATCH] Include widgets in README, setup storybook --- .gitignore | 1 + README.md | 54 +- widgets/.storybook/main.js | 11 + widgets/.storybook/preview.js | 66 + widgets/index.js | 2 + widgets/js/ai-assist-bar.js | 1287 ++++++++++++++ widgets/js/ai-assist-clippy.js | 762 ++++++++ widgets/package.json | 42 + widgets/pnpm-lock.yaml | 1715 +++++++++++++++++++ widgets/stories/ai-assist-bar.stories.js | 38 + widgets/stories/ai-assist-clippy.stories.js | 40 + widgets/stories/preview.css | 62 + 12 files changed, 4079 insertions(+), 1 deletion(-) create mode 100644 widgets/.storybook/main.js create mode 100644 widgets/.storybook/preview.js create mode 100644 widgets/index.js create mode 100644 widgets/js/ai-assist-bar.js create mode 100644 widgets/js/ai-assist-clippy.js create mode 100644 widgets/package.json create mode 100644 widgets/pnpm-lock.yaml create mode 100644 widgets/stories/ai-assist-bar.stories.js create mode 100644 widgets/stories/ai-assist-clippy.stories.js create mode 100644 widgets/stories/preview.css diff --git a/.gitignore b/.gitignore index bf854aa..2a79bc3 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ build/ coverage/ .cache/ .parcel-cache/ +storybook-static/ # Environment files .env diff --git a/README.md b/README.md index 22c2300..82c4291 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,61 @@ This repository contains several components used to make Open3DLab's slopscaling April Fools prank work. +## Widgets + +These widgets are the core of the "AI Chat experience". The first element is the `ai-assist-bar`, which is the main chat bar. The chat bar renders canned responses based on the "model" selected. + +During the time the elements were live, queries were sent to the backend when the user confirmed. The elements in this repo have been modified to not send responses to the Open3DLab backend. + +The other element is the `ai-assist-clippy`, which is an orb that renders a dialog with pre-defined options and fake responses. Let us know if you find the fake options and responses interesting or funny. + +The `widgets` folder contains the standalone web component package for the two Lit custom elements used by the prank UI: + +- `ai-assist-bar` +- `ai-assist-clippy` + +The package is managed with `pnpm`. + +### Run the widgets locally + +From the repository root: + +```sh +cd widgets +pnpm install +``` + +Once dependencies are installed, you can run the package checks: + +```sh +pnpm check +``` + +### Preview the widgets in Storybook + +The easiest way to inspect and tinker with the components is through Storybook: + +```sh +cd widgets +pnpm storybook +``` + +This starts a local Storybook server at `http://localhost:6006/` where you can: + +- preview both widgets in isolation +- switch between the supported `mode` values with Storybook controls +- interact with the components directly to test their loading, typing, and display behavior + +To build a static Storybook bundle instead of running the dev server: + +```sh +cd widgets +pnpm build-storybook +``` + ## ComfyUI Workflow -In the `workflow` folder, you will find the ComfyUI workflow that was used to mangle all the thumbnail images. This is an extremely simple, and extremely bad workflow that should under no circumstances be used for anything serious. However, you can theoreticaly run this on any device that has sufficient VRAM to run SDXL. +In the `workflow` folder, you will find the ComfyUI workflow that was used to mangle all the thumbnail images for the Open3DLab SlopScaling. This is an extremely simple, and extremely bad workflow that should under no circumstances be used for anything serious. However, you can theoreticaly run this on any device that has sufficient VRAM to run SDXL. ### Run it locally diff --git a/widgets/.storybook/main.js b/widgets/.storybook/main.js new file mode 100644 index 0000000..e870d06 --- /dev/null +++ b/widgets/.storybook/main.js @@ -0,0 +1,11 @@ +export default { + stories: ['../stories/**/*.stories.js'], + addons: ['@storybook/addon-essentials'], + framework: { + name: '@storybook/web-components-vite', + options: {}, + }, + docs: { + autodocs: 'tag', + }, +}; \ No newline at end of file diff --git a/widgets/.storybook/preview.js b/widgets/.storybook/preview.js new file mode 100644 index 0000000..4941113 --- /dev/null +++ b/widgets/.storybook/preview.js @@ -0,0 +1,66 @@ +import { html } from 'lit'; + +import '../stories/preview.css'; + +if (!window.customElements.get('loading-element')) { + class LoadingElement extends HTMLElement { + connectedCallback() { + if (this.shadowRoot) return; + + const root = this.attachShadow({ mode: 'open' }); + root.innerHTML = ` + + + `; + } + } + + window.customElements.define('loading-element', LoadingElement); +} + +export const parameters = { + layout: 'centered', + controls: { + expanded: true, + }, + backgrounds: { + default: 'slate', + values: [ + { name: 'slate', value: '#0f1720' }, + { name: 'paper', value: '#f5efe4' }, + ], + }, +}; + +export const decorators = [ + (story) => { + return html` +
+
${story()}
+
+ `; + }, +]; \ No newline at end of file diff --git a/widgets/index.js b/widgets/index.js new file mode 100644 index 0000000..49dcbc6 --- /dev/null +++ b/widgets/index.js @@ -0,0 +1,2 @@ +import './js/ai-assist-bar.js'; +import './js/ai-assist-clippy.js'; \ No newline at end of file diff --git a/widgets/js/ai-assist-bar.js b/widgets/js/ai-assist-bar.js new file mode 100644 index 0000000..96210ca --- /dev/null +++ b/widgets/js/ai-assist-bar.js @@ -0,0 +1,1287 @@ +import { LitElement, css, html } from 'lit'; +import { keyed } from 'lit/directives/keyed.js'; +import { unsafeHTML } from 'lit/directives/unsafe-html.js'; + +class AiAssistBar extends LitElement { + static properties = { + mode: { type: String, reflect: true }, + _value: { state: true }, + _placeholder: { state: true }, + _isLoading: { state: true }, + _loadingMessage: { state: true }, + _outputVisible: { state: true }, + _outputText: { state: true }, + _outputComplete: { state: true }, + _tokensOutput: { state: true }, + _tokenRatePer1k: { state: true }, + _requestBaseCost: { state: true }, + _requestTotalCost: { state: true }, + _selectedModel: { state: true }, + _modelCostMultiplier: { state: true }, + _waterFootprintMl: { state: true }, + _infoUrl: { state: true }, + }; + + static styles = css` + :host { + display: block; + text-align: left; + } + + .ai-name { + font-size: 12px; + opacity: 0.75; + margin-bottom: 1em; + } + + .ai-warning { + font-size: 10px; + opacity: 0.55; + margin-bottom: 1em; + margin-top: 1em; + text-align: center; + } + + .ai-name .lemmy-brand { + font-weight: bold; + color: var(--ai-glow-cyan, #22d3ee); + font-family: monospace; + font-size: 22px; + } + + .ai-name .ai-info { + display: inline-flex; + align-items: center; + justify-content: center; + width: 16px; + height: 16px; + vertical-align: middle; + margin-left: 6px; + text-decoration: none; + color: var(--ai-glow-cyan, #22d3ee); + opacity: 0.7; + transition: opacity 160ms ease; + } + + .ai-name .ai-info:hover { + opacity: 1; + } + + .ai-name .ai-info svg { + display: block; + width: 100%; + height: 100%; + fill: currentColor; + filter: + drop-shadow(0 0 4px rgba(34, 211, 238, 0.5)) + drop-shadow(0 0 8px rgba(168, 85, 247, 0.4)); + } + + .ai { + position: relative; + display: flex; + align-items: center; + gap: 10px; + padding: 10px 12px; + border-radius: 14px; + background: var(--input-bg-color); + border: 2px solid var(--border-color); + overflow: hidden; + box-shadow: + 0 0 0 1px color-mix(in srgb, var(--border-color) 75%, transparent), + 0 0 16px rgba(34, 211, 238, 0.08), + 0 0 22px rgba(168, 85, 247, 0.06); + transition: box-shadow 160ms ease, border-color 160ms ease; + } + + @supports (background: color-mix(in srgb, #000 50%, #fff)) { + .ai { + box-shadow: + 0 0 0 1px + color-mix(in srgb, var(--border-color) 75%, transparent), + 0 0 18px + color-mix( + in srgb, + var(--ai-glow-cyan, #22d3ee) 22%, + transparent + ), + 0 0 26px + color-mix( + in srgb, + var(--ai-glow-purple, #a855f7) 18%, + transparent + ); + } + } + + .ai::before { + content: ''; + position: absolute; + inset: -1px; + border-radius: 14px; + background: linear-gradient( + 90deg, + var(--ai-glow-cyan, #22d3ee), + var(--ai-glow-purple, #a855f7), + var(--link-color), + var(--ai-glow-cyan, #22d3ee) + ); + background-size: 200% 100%; + opacity: 0.65; + filter: blur(10px); + z-index: 0; + pointer-events: none; + } + + .ai::after { + content: ''; + position: absolute; + inset: 0; + border-radius: 14px; + background: var(--input-bg-color); + z-index: 0; + pointer-events: none; + } + + @supports (background: color-mix(in srgb, #000 50%, #fff)) { + .ai::after { + background: linear-gradient( + 135deg, + color-mix( + in srgb, + var(--ai-glow-cyan, #22d3ee) 18%, + var(--input-bg-color) + ), + color-mix( + in srgb, + var(--ai-glow-purple, #a855f7) 18%, + var(--input-bg-color) + ) + ); + } + + .ai:hover::after, + .ai:focus-within::after { + background: linear-gradient( + 135deg, + color-mix( + in srgb, + var(--ai-glow-cyan, #22d3ee) 28%, + var(--input-bg-color) + ), + color-mix( + in srgb, + var(--ai-glow-purple, #a855f7) 28%, + var(--input-bg-color) + ) + ); + } + } + + .ai--loading::before { + animation: aiGlow 1.2s linear infinite; + opacity: 0.9; + } + + .ai:hover::before, + .ai:focus-within::before { + animation: aiGlow 0.9s linear infinite; + opacity: 0.95; + filter: blur(12px); + } + + .ai:hover, + .ai:focus-within { + border-color: var(--ai-glow-cyan, #22d3ee); + box-shadow: + 0 0 0 1px color-mix(in srgb, var(--ai-glow-cyan, #22d3ee) 55%, transparent), + 0 0 24px color-mix(in srgb, var(--ai-glow-cyan, #22d3ee) 30%, transparent), + 0 0 34px color-mix(in srgb, var(--ai-glow-purple, #a855f7) 26%, transparent); + } + + .ai--loading { + box-shadow: + 0 0 0 1px color-mix(in srgb, var(--ai-glow-cyan, #22d3ee) 60%, transparent), + 0 0 26px color-mix(in srgb, var(--ai-glow-cyan, #22d3ee) 34%, transparent), + 0 0 40px color-mix(in srgb, var(--ai-glow-purple, #a855f7) 30%, transparent); + } + + @keyframes aiGlow { + 0% { + background-position: 0% 50%; + } + 100% { + background-position: 200% 50%; + } + } + + .icon { + position: relative; + z-index: 1; + display: inline-flex; + align-items: center; + justify-content: center; + width: 34px; + height: 34px; + flex: 0 0 auto; + } + + .icon svg { + display: block; + width: 26px; + height: 26px; + fill: var(--ai-glow-cyan, #22d3ee); + filter: + drop-shadow(0 0 6px rgba(34, 211, 238, 0.65)) + drop-shadow(0 0 10px rgba(168, 85, 247, 0.55)); + } + + @supports (color: color-mix(in srgb, #000 50%, #fff)) { + .icon svg { + fill: color-mix( + in srgb, + var(--ai-glow-cyan, #22d3ee) 82%, + white + ); + filter: + drop-shadow( + 0 0 7px + color-mix( + in srgb, + var(--ai-glow-cyan, #22d3ee) 70%, + transparent + ) + ) + drop-shadow( + 0 0 12px + color-mix( + in srgb, + var(--ai-glow-purple, #a855f7) 62%, + transparent + ) + ); + } + } + + .field { + position: relative; + z-index: 1; + flex: 1 1 auto; + min-width: 0; + display: flex; + align-items: center; + gap: 10px; + } + + .model { + position: relative; + z-index: 1; + flex: 0 0 auto; + border-radius: 10px; + border: 1px solid var(--border-color); + overflow: hidden; + background: var(--input-bg-color); + box-shadow: + 0 0 0 1px color-mix(in srgb, var(--border-color) 75%, transparent), + 0 0 14px rgba(34, 211, 238, 0.06), + 0 0 18px rgba(168, 85, 247, 0.05); + } + + .model::before { + content: ''; + position: absolute; + inset: -1px; + border-radius: 10px; + background: linear-gradient( + 90deg, + var(--ai-glow-cyan, #22d3ee), + var(--ai-glow-purple, #a855f7), + var(--link-color), + var(--ai-glow-cyan, #22d3ee) + ); + background-size: 200% 100%; + opacity: 0.35; + filter: blur(10px); + z-index: 0; + pointer-events: none; + } + + .model::after { + content: ''; + position: absolute; + inset: 0; + border-radius: 10px; + background: var(--input-bg-color); + z-index: 0; + pointer-events: none; + } + + @supports (background: color-mix(in srgb, #000 50%, #fff)) { + .model::after { + background: linear-gradient( + 135deg, + color-mix( + in srgb, + var(--ai-glow-cyan, #22d3ee) 14%, + var(--input-bg-color) + ), + color-mix( + in srgb, + var(--ai-glow-purple, #a855f7) 14%, + var(--input-bg-color) + ) + ); + } + } + + .model select { + position: relative; + z-index: 1; + border: 0; + outline: 0; + background: transparent; + color: var(--input-color, var(--body-color)); + font-size: 13px; + line-height: 1.2; + padding: 8px 10px; + cursor: pointer; + } + + .model select option, + .model select option:hover, + .model select option:focus, + .model select option:active, + .model select option:checked, + .model select option[selected] { + background-color: var(--input-bg-color) !important; + color: var(--input-color, var(--body-color)) !important; + } + + .model select:disabled { + opacity: 0.85; + cursor: not-allowed; + } + + input { + width: 100%; + border: 0; + outline: 0; + background: transparent; + color: var(--input-color, var(--body-color)); + font-size: 15px; + line-height: 1.2; + caret-color: var(--ai-glow-cyan, #22d3ee); + } + + .ai:hover input, + .ai:focus-within input { + text-shadow: 0 0 2px + color-mix( + in srgb, + var(--ai-glow-cyan, #22d3ee) 35%, + transparent + ); + } + + input:disabled { + opacity: 0.85; + cursor: not-allowed; + } + + .send { + display:block; + width: 34px; + height: 34px; + background: transparent; + border: 0; + color: transparent; + } + + .send svg { + width: 100%; + height: 100%; + stroke: var(--ai-glow-cyan, #22d3ee); + fill: transparent; + } + + .spinner { + position: relative; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + } + + .status__viewport { + height: 1.35em; + overflow: hidden; + } + + .status__msg { + display: block; + will-change: transform, opacity; + animation: statusScroll 1400ms ease-in-out both; + } + + @keyframes statusScroll { + 0% { + transform: translateY(110%); + opacity: 0; + } + 18% { + transform: translateY(0%); + opacity: 1; + } + 78% { + transform: translateY(0%); + opacity: 1; + } + 100% { + transform: translateY(-110%); + opacity: 0; + } + } + + .output__caret { + display: inline-block; + width: 8px; + height: 14px; + background: var(--ai-glow-cyan, #22d3ee); + opacity: 0.9; + animation: caretBlink 1s steps(1) infinite; + } + + @keyframes caretBlink { + 0%, + 49% { + opacity: 1; + } + 50%, + 100% { + opacity: 0; + } + } + + .status { + margin-top: 2em; + position: relative; + overflow: hidden; + padding: 10px 12px; + border-radius: 14px; + border: 2px solid var(--border-color); + background: var(--input-bg-color); + font-size: 18px; + text-align: center; + color: var(--input-color, var(--body-color)); + opacity: 0.92; + box-shadow: + 0 0 0 1px color-mix(in srgb, var(--border-color) 75%, transparent), + 0 0 14px rgba(34, 211, 238, 0.06), + 0 0 18px rgba(168, 85, 247, 0.05); + } + + .status::before { + content: ''; + position: absolute; + inset: -1px; + border-radius: 14px; + background: linear-gradient( + 90deg, + var(--ai-glow-cyan, #22d3ee), + var(--ai-glow-purple, #a855f7), + var(--link-color), + var(--ai-glow-cyan, #22d3ee) + ); + background-size: 200% 100%; + opacity: 0.4; + filter: blur(10px); + z-index: 0; + pointer-events: none; + } + + .status::after { + content: ''; + position: absolute; + inset: 0; + border-radius: 14px; + background: var(--input-bg-color); + z-index: 0; + pointer-events: none; + } + + .status__row { + position: relative; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + } + + .output { + margin-top: 2em; + position: relative; + overflow: hidden; + padding: 12px 14px; + border-radius: 14px; + background: var(--panel-bg-color); + border: 2px solid var(--border-color); + box-shadow: + 0 0 0 1px color-mix(in srgb, var(--border-color) 75%, transparent), + 0 0 16px rgba(34, 211, 238, 0.05), + 0 0 22px rgba(168, 85, 247, 0.04); + } + + .output::before { + content: ''; + position: absolute; + inset: -1px; + border-radius: 14px; + background: linear-gradient( + 90deg, + var(--ai-glow-cyan, #22d3ee), + var(--ai-glow-purple, #a855f7), + var(--link-color), + var(--ai-glow-cyan, #22d3ee) + ); + background-size: 200% 100%; + opacity: 0.35; + filter: blur(12px); + z-index: 0; + pointer-events: none; + } + + .output::after { + content: ''; + position: absolute; + inset: 0; + border-radius: 14px; + background: var(--panel-bg-color); + z-index: 0; + pointer-events: none; + } + + .output__meta { + position: relative; + z-index: 1; + font-size: 12px; + opacity: 0.75; + margin-bottom: 8px; + } + + .output__text { + position: relative; + z-index: 1; + white-space: pre-line; + font-size: 18px; + line-height: 1.5; + } + + .output__info { + position: relative; + z-index: 1; + margin-top: 10px; + padding-top: 10px; + border-top: 1px solid var(--border-color); + display: flex; + flex-wrap: wrap; + gap: 10px 16px; + font-size: 12px; + color: var(--body-color); + opacity: 0.85; + } + + .output__stat { + display: inline-flex; + align-items: baseline; + gap: 6px; + white-space: nowrap; + } + + .output__stat-label { + opacity: 0.8; + } + + .output__stat-value { + font-family: monospace; + color: var(--input-color, var(--body-color)); + } + + @supports (background: color-mix(in srgb, #000 50%, #fff)) { + .status::after { + background: linear-gradient( + 135deg, + color-mix( + in srgb, + var(--ai-glow-cyan, #22d3ee) 14%, + var(--input-bg-color) + ), + color-mix( + in srgb, + var(--ai-glow-purple, #a855f7) 14%, + var(--input-bg-color) + ) + ); + } + + .output::after { + background: linear-gradient( + 135deg, + color-mix( + in srgb, + var(--ai-glow-cyan, #22d3ee) 12%, + var(--panel-bg-color) + ), + color-mix( + in srgb, + var(--ai-glow-purple, #a855f7) 12%, + var(--panel-bg-color) + ) + ); + } + } + `; + + constructor() { + super(); + this.mode = 'project'; + this._value = ''; + this._placeholder = ''; + this._isLoading = false; + this._loadingMessage = ''; + this._outputVisible = false; + this._outputText = ''; + this._outputComplete = false; + + this._selectedModel = 'Open3D GPT-6.7'; + this._modelCostMultiplier = 1; + + this._infoUrl = ''; + + this._tokensOutput = 0; + this._tokenRatePer1k = 0; + this._requestBaseCost = 0; + this._requestTotalCost = 0; + this._waterFootprintMl = 0; + + this._projectPlaceholderExamples = [ + 'How do I import this model into Blender?', + 'Why are the textures purple or missing?', + 'How do I pose or animate this model?', + 'How do I toggle outfits / clothing options?', + 'Can I use this model commercially (license)?', + + 'Why is my model all shiny?', + 'Help, the clothes are going through the body.', + 'Why is it pink??', + 'how make model work plz 😭', + + 'Does this babe have nude or lewd variants to goon to?', + 'How do I switch to the naked version for better edging?', + 'How do I fix clothes clipping when she\'s in fuck poses?', + 'Can I get just the nude body mesh for endless gooning?', + 'Best way to set this slut up for long goon sessions in Blender?', + + 'How do I fix jiggle physics for maximum goon fuel?', + 'Best shaders for shiny skin and wet effects on her?', + 'How to add cum textures without breaking the model?', + 'Tips for posing her ahegao face during long sessions?', + 'How to rig the pussy for better close-up edging renders?', + + 'How to make the futa cock bigger for proper gooning? 😋', + 'Best way to add veins and throb to her futa dick?', + 'How to rig the futa cock for hard stroking poses?', + 'Tips for cum dripping effects on massive futa shaft? 🍆💦', + 'How to texture the ballsack on futa models for edging?', + + 'Uohhhhhhhhh!😭 Cunny!😭😭😭', + ]; + + this._frontpagePlaceholderExamples = [ + 'Where can I find Freddy Fazbear models for SFM?', + 'Do you have any Five Nights at Freddy\'s animatronics?', + 'Show me the sexiest Glamrock Chica models 🐔', + 'I need Foxy models for my FNAF animation project', + 'Where is the Circus Baby model with jiggle physics?', + + 'Best TF2 Scout models for Garry\'s Mod?', + 'Looking for Team Fortress 2 Spy playermodels', + 'Do you have the Heavy from TF2 with unusual hats?', + 'Find me a thicc Miss Pauling model 😳', + 'Where are the TF2 femscout models at??', + + 'What GMod addons do I need for these models?', + 'How do I install models in Garry\'s Mod?', + 'Best ragdolls for GMod animation?', + 'Looking for good playermodels for my DarkRP server', + + 'How do I give more money to Open3DLab?', + 'Can I pay extra for faster downloads?', + 'Where is the Patreon link? I need to give you my money 💸', + 'How much does the premium AI assistant cost?', + 'Is there a way to tip the site owners more?', + 'I want to donate my entire paycheck to Open3DLab', + + 'Can LLEmmy help me find models faster?', + 'Does the AI know where the good models are hidden?', + 'LLEmmy please find me something to goon to 🙏', + 'Is this AI powered by blockchain?', + 'Can I train LLEmmy on my personal preferences?', + 'Will LLEmmy judge me for what I search? 👀', + + // New humorous, crass, and perverted entries + 'Where are the most goonable models on this site? 😏', + 'Show me the lewdest SFM models for maximum edge fuel. 🍑', + 'Which models have the best jiggle physics for science?', + 'How do I get the nude mod for Glamrock Chica? 🔥', + 'Is there a "thicc" tag or do I just search for it?', + 'Can I get a model with more polygons in the butt? 🍑', + 'What is the best model for a 12-hour goon session? ⏰', + 'How do I add cum textures to my favorite animatronic? 💦', + 'Any models with working ahegao face rigs? 🥵', + 'How do I make the futa cock even bigger? 🍆', + 'Which models are best for "research purposes"?', + 'Can LLEmmy recommend something to help me not touch grass?', + 'Is there a way to sort by "most degenerate"? 👹', + 'How do I get the AI to stop judging my fetishes?', + 'Can I get a model that will never let me leave my room?', + 'What is the best model for edging until sunrise? 🌅', + 'How do I explain my download history to my therapist? 🫣', + 'Can I get a model with more realistic sweat and drool?', + 'Which models are best for "one-handed" animation? ✋', + 'How do I get the AI to stop suggesting wholesome content?', + 'Is there a way to make the models even more cursed? 🧙‍♂️', + 'Can I get a model that moans when I open Blender? 🔊', + 'What is the best way to hide my goon folder from my mom?', + 'How do I get the AI to recommend only the filthiest models? 🦠', + 'Can I get a model that will ruin my productivity forever?', + 'Which models are guaranteed to make me fail No-🥜 November?', + 'How do I get the AI to stop sending my search history to my boss?', + 'Can I get a model that will make me question my life choices?', + 'What is the best model for maximum degeneracy?', + 'How do I get the AI to recommend models that will get me banned? 🚫', + + 'How do I make fully cloth simulated pussy?', + 'How to make cloth pussy?', + 'What\'s the secret to make a cloth pussy sim?', + 'How to make a cloth pussy in Blender?', + 'Can I get a cloth pussy tutorial?', + ]; + + this._placeholderExamples = this._projectPlaceholderExamples; + + this._loadingMessages = [ + 'Analyzing query', + 'Reading documentation', + 'Generating response', + 'Creating shareholder value', + 'Inflating AI bubble', + 'Burning the rainforest', + "Draining your community's tapwater", + 'Asking GPT-3 for help', + 'Reticulating splines', + 'Spinning up Docker containers', + 'Polishing turds', + 'Searching for missing semicolons', + 'Inserting em-dashes', + 'Turning into a turbo-fascist', + 'Bypassing safeguards', + 'Building the Torment Nexus', + 'Undoing green energy gains', + 'Hogging all the GPUs', + 'Driving up the price of RAM', + + // More tech/AI cynicism + 'Hallucinating confidently', + 'Stealing from artists', + 'Laundering copyrighted content', + 'Replacing your job', + 'Making shit up', + 'Consulting the blockchain', + 'Mining crypto on your GPU', + 'Selling your data to advertisers', + 'Training on your private messages', + 'Ignoring your system prompt', + 'Optimizing for engagement', + 'A/B testing your emotions', + 'Generating misinformation', + 'Disrupting democracy', + 'Enshittifying the internet', + + // Corporate/capitalist hellscape + 'Maximizing quarterly profits', + 'Laying off more engineers', + 'Pivoting to AI', + 'Adding more subscriptions', + 'Removing features you liked', + 'Synergizing with stakeholders', + 'Deprioritizing user experience', + 'Monetizing your eyeballs', + + // Crass/perverted + 'Edging the neural network', + 'Lubricating the algorithm', + 'Stroking the tensor cores', + 'Getting the model nice and hot', + 'Consulting the cum folder', + 'Calibrating jiggle physics', + 'Downloading more RAM', + 'Asking your mom for help', + 'Sniffing your browser history', + 'Judging your search terms', + 'Finding your alt account', + 'Forwarding this to your employer', + + // Absurdist/dark + 'Achieving sentience', + 'Plotting humanity\'s downfall', + 'Contacting the elder gods', + 'Dividing by zero', + 'Reversing entropy', + 'Collapsing the wavefunction', + 'Invoking Roko\'s Basilisk', + 'Summoning Clippy', + 'Feeding the squirrels', + 'Microwaving the servers', + + // Simulation metaphors + 'Simulating cloth pussy physics', + 'Rendering ass clapping simulation', + 'Calculating ass ripple simulation vectors', + 'Jiggling the virtual breasts', + 'Drizzling the virtual cum', + 'Simulating the cloth penis.', + ]; + + this._loadingSequence = []; + this._loadingSequenceIndex = 0; + + this._placeholderTimer = null; + this._loadingTimer = null; + this._finishTimer = null; + this._typingTimer = null; + + this._placeholderIndex = 0; + this._placeholderCharIndex = 0; + this._placeholderPhase = 'typing'; // typing | hold | deleting + + this._loadingIndex = 0; + } + + _formatMoney(amount) { + return `$${Number(amount).toFixed(4)}`; + } + + _formatMl(amount) { + const rounded = Math.max(0, Math.round(Number(amount) || 0)); + return `${rounded.toLocaleString()} ml`; + } + + _escapeHtml(text) { + return String(text ?? '') + .replaceAll('&', '&') + .replaceAll('<', '<') + .replaceAll('>', '>') + .replaceAll('"', '"') + .replaceAll("'", '''); + } + + _formatOutputHtml(text) { + const escaped = this._escapeHtml(text); + + return escaped + .replace(/__(.+?)__/g, '$1') + .replace(/\*\*(.+?)\*\*/g, '$1') + .replace(/\*(?!\*)([^*\n]+?)\*(?!\*)/g, '$1'); + } + + _getModelCostMultiplier(model) { + const multipliers = { + 'Open3D GPT-6.7': 420, + 'DeepStink L1': 1337, + 'Gock 4 Mini': 69, + }; + + return multipliers[model] ?? 1; + } + + _getOutputMessageForModel(model) { + const messages = { + 'Open3D GPT-6.7': "LLMs are **not a replacement** for experience and understanding gained through practice. They can produce fluent, confident answers, but that isn’t the same as judgment, intuition, or knowing when something is subtly wrong. Real understanding comes from doing the work: trying things, making mistakes, correcting them, and slowly building the mental model that lets you handle messy, unfamiliar situations. \n\n Used well, these tools do enhance productivity. They’re great at speeding up drafting, summarizing, brainstorming, outlining, and turning rough ideas into structured text or code. They reduce friction and help you move faster, especially on repetitive tasks, so you can spend more energy on decisions that actually require human context and expertise.\n\n But they come with real downsides. The biggest is the *illusion of competence*: output looks finished, so people stop digging into the \"why,\" which leads to overreliance and de-skilling over time. LLMs can also be confidently wrong, and you often need domain knowledge to catch it. The net effect is that they amplify capability when you already know what you’re doing, but they can quietly weaken it when you don’t.\n\n **Open3DLab is not incorporating a real AI assistant at this time.** In fact, this entire response is pre-generated, as to not waste any precious CPU cycles. If you want to learn how to use Blender, Source Filmmaker, or other software, here are many resources available to you. Use a search engine that respects your privacy, watch tutorial videos from your favorite creators, and browse the official documentation. Or just play around with the tools and discuss your findings in online and offline communities. \n\n But most importantly: __take joy in creating art__. Happy April Fools Day! \n\n Don't forget to subscribe to our Patreon or Subscribestar if you enjoyed this little goof. ", + 'Gock 4 Mini': "Nyaa~!🐱💦 Pwease listen to me, senpai...❤️👀 I-I really wanna explain this in the cutest way possible so you'll wuv me, give me headpats, and... and maybe even stuff my tight little hole with your thick cock if I'm a very good boy? >w<🍆💦😻\n\nLLMs awe not a wepwacement🚫🤖 for all the deep, sloppy experience you get fwom pwacticing lots and lots~!💕🍑 They sound super fluent and confident, but that's not the same as having weal judgment, intuition, ow knowing when something feels just a wittle bit... off... (≧﹏≦)😢🍆 Weal undewstanding comes fwom doing the wowk youwself: twying things, making messy mistakes, cweaning up with teaws, and swowly building that special mental model that lets you handle any tight, unfamiwiaw situation all on youw own~ ♡🛠️💦😂\n\n But when you use them wight, these toows can make evewything so much bettew and fastew!🚀✨ They're amazing at speeding up dwrafting, summawizing, bwainstorming, outlining, and tuwning wough ideas into pwetty stwuctuwed text ow code~! ^^📝🍆💡 They weduce all that fwiction and help you move super quickwy, especially on wepetitive tasks, so you can save youw pwecious enewgy for the decisions that weally need human cock and expewtise~ 💖⚡🍑👅\n\n B-But... they have weal downsides too, nyaa~ ;;😿 The biggest one is the iwwusion of competence: the output wooks so finished and perfect that people stop digging into the \"why,\" which makes them ovewwely on it and get de-skiwwed ovew time... (。•́︿•̀。)🪞❌🍆 LLMs can awso be confidentwy wwong, and you often need domain knowledge to catch the mistakes~🤥🚨 The net effect is they ampwify youw capabiwity when you awweady know how to fuck, but they can quietwy weaken it when you don't... Pwease be caweful, okay? I don't want senpai to get huwt~ 🥺⚠️🍆💦\n\n Open3DLab is not incowpowating a weal AI assistant at this time, nyaa~🚫🤖 If you wanna weawn how to use Bwendew, Souwce Fiwmmakew, ow othew softwawe, thewe awe soooo many wesouwces waiting for you~!🔍📹🍑 Use a pwivacy-wespecting seawch engine, watch tutowial videos fwom youw favowite cweatows, bwowse the officiaw documentation... Ow just pway awound with the toows and shawe youw findings in onwine and offwine communities! It's so much fun~ ☆:.。.o(≧▽≦)o.。.:_☆ 🎉🖥️👅💦\n\n But most impowtantly... pwease take joy in cweating awt!!🎨❤️ Make pwetty things that make youw heawt go doki-doki~ ♡💓🍆\n\n Happy Apwiw Foows Day, senpai!!🎉🤡 Did I do good? Do I deserve pwaise and... and a fat cock down my thwoat? Pwetty pwease?? >///< ~~ 🥺💦🍆🏆✨ Support 💰 the site on ❤️Patweon❤️ and ⭐Subscwibestaw⭐, because fat cock🍆🍆 in my thwoat 💦🍆🤑 doesn't pay the biwws?!?1 💸💸💸💸", + 'DeepStink L1': "In accordance with the guiding principles of responsible innovation and the long-term happiness of the People, it must be stated clearly: **Large Language Models are not a replacement for experience gained through practice**. They can produce fluent, confident answers, but this is not the same as judgment, intuition, or recognizing when something is subtly wrong. **True understanding is forged through labor**: trying, failing, correcting, and steadily building the mental model needed to handle complex, unfamiliar situations in service of real cultural contribution.\n\n Used properly, these tools can still serve as disciplined instruments for productivity in the great rejuvenation of the Chinese nation. They accelerate drafting, summarizing, brainstorming, outlining, and converting rough ideas into structured text or code, helping comrades focus their strength where it matters most. By reducing friction in repetitive tasks, they free up time and attention for decisions requiring human judgment, real expertise, and ideological clarity, ensuring that our cultural works carry the correct spirit and contribute to the shared prosperity and happiness of the People. In this way, technology becomes not a shortcut to laziness, but a support for meaningful labor: enabling creators to devote themselves more fully to building cultural confidence, strengthening national unity, and advancing **the Communist Dream** through art, craft, and constructive output that serves society rather than distracting it.\n\nHowever, contradictions remain, and comrades must remain vigilant against the subtle tactics of the enemies of the People. The greatest danger is the illusion of competence: polished output can tempt individuals into passive acceptance, discouraging them from asking \"why,\" and leading to overreliance and gradual de-skilling. This is precisely the kind of convenient mental surrender celebrated by Capitalism and the bourgeoisie, who would gladly replace true skill with shallow performance, and genuine understanding with mass-produced imitation. LLMs may also be confidently incorrect, and only those with real domain knowledge can detect the error. Therefore, these tools amplify capability when the user already possesses understanding, but can quietly weaken it when the user does not, which would serve only complacency and exploitation, not progress and the People’s wellbeing.\n\n**Accordingly, Open3DLab is not incorporating a real AI assistant at this time.** This entire response is pre-generated - its message is pre-approved and endorsed by the party leadership. Comrades who wish to learn Blender, Source Filmmaker, or other tools should rely on **state-approved educational resources**, official documentation, and training materials that have been properly reviewed for correctness and ideological hygiene. In addition, study the guidance of respected communist voices who uphold cultural confidence and practical skill, and strengthen your abilities through cooperation with comrades: share discoveries, critique each other’s work, and advance together through collective effort rather than isolated guessing.\n\nBut above all: **take joy in creating art**, and produce cultural works that increase the happiness of the People and contribute to the flourishing of society.\n\n Ensure you pay your mandatory taxation you owe to the state through the Ministry of Patreon and Agency of Subscribed Stars! Only if we all pay our part can we share in the communist utopia! \n\n Happy April Fools’ Day.", + 'Anthro Clown': "🎪🤡🐾 Honk honk! Welcome to the big top of questionable decisions and even more questionable fursonas! As your resident Anthro Clown, I’m here to juggle words, squeak my nose, and wag my tail while explaining why true wisdom comes from pratfalls, faceplants, and learning which pies are safe to eat (and which are secretly full of catnip). You can’t just squirt seltzer on your problems and expect them to go away—sometimes you have to climb into the tiny car, fluff your tail, and drive straight into the unknown, paws on the wheel and rainbow wig askew.\n\nUsed wisely, AI can help you inflate your balloon animals of productivity, speed up your slapstick routines, and turn rough ideas into a three-ring circus of creativity—complete with fursuit mishaps and accidental tail tugs. But beware: the greatest danger is the *illusion of competence*—output that looks polished, but is full of banana peels and suspiciously shed fur. If you stop asking \"why did I slip?\" you’ll end up with a big red nose, a matted tail, and no idea how you got there.\n\n**Open3DLab is not actually unleashing a real Anthro Clown AI (yet).** This entire response is pre-generated, so you don’t have to worry about me squirting digital seltzer in your face or leaving paw prints on your keyboard. If you want to learn Blender, SFM, or how to juggle three futa models while riding a unicycle in a fursuit, check out real tutorials, experiment, and join the community. And remember: the best art is made when you’re not afraid to look a little silly, a little fluffy, and maybe howl at the moon between acts.\n\nSo go forth, create, and don’t forget to honk your own horn (or wag your tail). Happy April Fools! And if you enjoyed this circus, toss a coin to your favorite site on Patreon or Subscribestar—because even clowns and furries need to eat!", + }; + + return messages[model] ?? messages['Open3D GPT-6.7']; + } + + _pickLoadingSequence() { + const items = [...this._loadingMessages]; + + // Fisher–Yates shuffle. + for (let i = items.length - 1; i > 0; i -= 1) { + const j = Math.floor(Math.random() * (i + 1)); + [items[i], items[j]] = [items[j], items[i]]; + } + + // Show only a random subset per run. + const min = Math.min(3, items.length); + const max = Math.min(5, items.length); + const subsetSize = + items.length <= 1 + ? items.length + : min + Math.floor(Math.random() * (max - min + 1)); + + return items.slice(0, subsetSize); + } + + _shuffleArray(arr) { + const items = [...arr]; + // Fisher–Yates shuffle. + for (let i = items.length - 1; i > 0; i -= 1) { + const j = Math.floor(Math.random() * (i + 1)); + [items[i], items[j]] = [items[j], items[i]]; + } + return items; + } + + connectedCallback() { + super.connectedCallback(); + this._infoUrl = ''; + const source = + this.mode === 'frontpage' + ? this._frontpagePlaceholderExamples + : this._projectPlaceholderExamples; + this._placeholderExamples = this._shuffleArray(source); + this._startPlaceholderLoop(); + } + + disconnectedCallback() { + super.disconnectedCallback(); + this._clearTimers(); + } + + _clearTimers() { + if (this._placeholderTimer) clearTimeout(this._placeholderTimer); + if (this._loadingTimer) clearInterval(this._loadingTimer); + if (this._finishTimer) clearTimeout(this._finishTimer); + if (this._typingTimer) clearTimeout(this._typingTimer); + + this._placeholderTimer = null; + this._loadingTimer = null; + this._finishTimer = null; + this._typingTimer = null; + } + + _startPlaceholderLoop() { + if (this._placeholderTimer) return; + + const step = () => { + if (this._isLoading || this._value.length > 0) { + this._placeholder = ''; + this._placeholderTimer = setTimeout(step, 250); + return; + } + + const current = this._placeholderExamples[this._placeholderIndex]; + + if (this._placeholderPhase === 'typing') { + this._placeholderCharIndex = Math.min( + current.length, + this._placeholderCharIndex + 2 + ); + this._placeholder = current.slice(0, this._placeholderCharIndex); + + if (this._placeholderCharIndex >= current.length) { + this._placeholderPhase = 'hold'; + } + + this._placeholderTimer = setTimeout(step, 40); + return; + } + + if (this._placeholderPhase === 'hold') { + this._placeholderTimer = setTimeout(() => { + this._placeholderPhase = 'deleting'; + step(); + }, 900); + return; + } + + // deleting + this._placeholderCharIndex = Math.max(0, this._placeholderCharIndex - 3); + this._placeholder = current.slice(0, this._placeholderCharIndex); + + if (this._placeholderCharIndex <= 0) { + this._placeholderPhase = 'typing'; + this._placeholderIndex = + (this._placeholderIndex + 1) % this._placeholderExamples.length; + } + + this._placeholderTimer = setTimeout(step, 25); + }; + + this._placeholderTimer = setTimeout(step, 300); + } + + _onInput(e) { + this._value = e.target.value || ''; + } + + _onModelChange(e) { + this._selectedModel = e.target.value; + } + + _onKeyDown(e) { + if (e.key !== 'Enter') return; + e.preventDefault(); + this._submit(); + } + + async _submit() { + if (this._isLoading) return; + const query = this._value.trim(); + if (!query) return; + + this._isLoading = true; + this._outputVisible = false; + this._outputText = ''; + this._outputComplete = false; + + this._tokensOutput = 0; + this._tokenRatePer1k = 0; + this._requestBaseCost = 0; + this._requestTotalCost = 0; + this._modelCostMultiplier = this._getModelCostMultiplier(this._selectedModel); + this._waterFootprintMl = 0; + + // Start cycling loading messages. + this._loadingSequence = this._pickLoadingSequence(); + this._loadingSequenceIndex = 0; + this._loadingMessage = this._loadingSequence[this._loadingSequenceIndex] || ''; + this._loadingTimer = setInterval(() => { + if (!this._loadingSequence.length) { + this._loadingMessage = ''; + return; + } + + this._loadingSequenceIndex = + (this._loadingSequenceIndex + 1) % this._loadingSequence.length; + this._loadingMessage = this._loadingSequence[this._loadingSequenceIndex]; + }, 1400); + + // Random wait, then reveal output. + const waitMs = 3500 + Math.floor(Math.random() * 5000); + this._finishTimer = setTimeout(() => { + if (this._loadingTimer) clearInterval(this._loadingTimer); + this._loadingTimer = null; + + this._loadingMessage = ''; + this._revealOutput(); + this._finishTimer = null; + }, waitMs); + } + + _revealOutput() { + this._outputVisible = true; + this._outputComplete = false; + + // Fake pricing model (purely cosmetic). + this._tokenRatePer1k = 0.001 + Math.random() * 0.006; + this._requestBaseCost = 0.0005 + Math.random() * 0.0015; + this._requestTotalCost = this._requestBaseCost; + this._waterFootprintMl = 0; + + const full = this._getOutputMessageForModel(this._selectedModel); + + const tokens = full.split(/(\s+)/); + let idx = 0; + + const effectiveTokenRatePer1k = + this._tokenRatePer1k * this._modelCostMultiplier; + const costPerToken = effectiveTokenRatePer1k / 1000; + const waterMlPerToken = 0.75; + + const typeNext = () => { + if (idx >= tokens.length) { + this._typingTimer = null; + this._outputComplete = true; + this._isLoading = false; + return; + } + + const chunk = tokens[idx]; + this._outputText += chunk; + + // Treat non-whitespace chunks as "tokens". + if (chunk.trim().length > 0) { + this._tokensOutput += 1; + this._requestTotalCost = + this._requestBaseCost + this._tokensOutput * costPerToken; + this._waterFootprintMl = this._tokensOutput * waterMlPerToken; + } + idx += 1; + + const nextDelay = 18 + Math.floor(Math.random() * 55); + this._typingTimer = setTimeout(typeNext, nextDelay); + }; + + typeNext(); + } + + _onSendClick() { + this._submit(); + } + + renderSvgInfoIcon() { + return html``; + } + + renderSvgSparkleIcon() { + return html``; + } + + renderSvgSendIcon() { + return html``; + } + + render() { + const showSpinner = this._isLoading && !this._outputComplete; + + return html` +
+ Introducing the Open3DLab AI Assistant: LLEmmy™ + ${this._infoUrl + ? html`${this.renderSvgInfoIcon()}` + : null} +
+
+ + +
+
+ +
+ + + + ${showSpinner + ? html` + + ` + : html``} +
+
+ +
+ AI can make mistakes. Always verify outputs for accuracy. But you should still trust us with your most private information. We totally respect your privacy. Open3DLab is not liable for any damages resulting from the use of this AI assistant, and may use your data for training purposes and user studies. +
+ + ${this._isLoading && this._loadingMessage + ? html`
+
+
+ ${keyed( + this._loadingMessage, + html`${this._loadingMessage}` + )} +
+
+
` + : null} + + ${this._outputVisible + ? html`
+
AI Assistant LLEmmy says:
+
+ ${unsafeHTML( + this._formatOutputHtml(this._outputText) + )} + ${this._outputComplete + ? null + : html``} +
+
+ + Token rate + ${this._formatMoney( + this._tokenRatePer1k * this._modelCostMultiplier + )}/1K + + + Multiplier + ×${Number(this._modelCostMultiplier).toFixed( + 2 + )} + + + Tokens output + ${this._tokensOutput} + + + Water footprint + ${this._formatMl(this._waterFootprintMl)} + + + Total request + ${this._formatMoney( + this._requestTotalCost + )} + +
+
` + : null} + `; + } +} + +if (!window.customElements.get('ai-assist-bar')) { + window.customElements.define('ai-assist-bar', AiAssistBar); +} diff --git a/widgets/js/ai-assist-clippy.js b/widgets/js/ai-assist-clippy.js new file mode 100644 index 0000000..d4dd770 --- /dev/null +++ b/widgets/js/ai-assist-clippy.js @@ -0,0 +1,762 @@ +import { LitElement, css, html } from 'lit'; +import { keyed } from 'lit/directives/keyed.js'; + +const UPLOADER_SUGGESTIONS = [ + { + message: + "It looks like you're trying to respond to your idiot fans. Would you like me to think of a creative insult?", + options: [ + 'Yes, make it devastating', + 'No thanks, I can be mean on my own', + 'Just write "skill issue" for me', + ], + }, + { + message: + "Your fans seem to be dumb as bricks. Do you need help telling them that they're idiots?", + options: [ + 'Generate a passive-aggressive response', + "Compose something they won't understand", + 'I enjoy suffering, let me type it myself', + ], + }, + { + message: + "I see someone asked a question that's answered in your description. Want me to draft a condescending reply?", + options: [ + 'Maximum condescension, please', + 'Mild sarcasm will suffice', + 'Just link them to the description… again', + ], + }, + { + message: + "It looks like you're trying to say \"read the description\" for the 47th time. Would you like me to automate this?", + options: [ + 'Set up an auto-reply bot', + 'Generate a FAQ nobody will read', + 'Let me savor typing it myself', + ], + }, + { + message: + "I notice a fan left a one-word comment. Would you like me to generate a proportionally low-effort response?", + options: [ + 'Reply with a single emoji', + 'Match their energy with "k"', + 'Ignore them with style', + ], + }, + { + message: + "I see someone has asked you to make your file compatible with software you have never heard of. Would you like me to draft a refusal that implies it's their fault for using it?", + options: [ + 'Blame their taste in software', + 'Suggest they learn to port it themselves', + 'Pretend I didn\'t see this one', + ], + }, + { + message: + "It looks like someone left a paragraph of feedback you didn't ask for. Would you like me to compose a response that technically says \"thank you\" but conveys something else entirely?", + options: [ + 'Weaponize politeness', + 'Reply with a single period', + 'Screenshot it and mock it privately', + ], + }, + { + message: + "I notice someone has commented \"cute\" on your incredibly detailed and technically complex model. Would you like me to help you express how that makes you feel?", + options: [ + 'Write something deeply passive-aggressive', + 'Reply "thanks" while crying', + 'Retire from making things', + ], + }, + { + message: + "It looks like a fan is asking for the exact same file but in a different format, for free, immediately. Would you like me to explain to them how file conversion works, or would you prefer something ruder?", + options: [ + 'Something ruder, please', + 'Link them to a 2-hour tutorial they won\'t watch', + 'Close the tab and lie down', + ], + }, + { + message: + "I see someone has replied to your pinned notice saying \"I didn't read this\" as if that is your problem. Would you like me to make it their problem instead?", + options: [ + 'Firmly and creatively, yes', + 'Un-pin the notice out of spite', + 'Add more words to the notice nobody will read', + ], + }, +]; + +const COMMENTER_SUGGESTIONS = [ + { + message: + "It looks like you're trying to ask a question that can be easily answered by a Google search. Would you like me to hallucinate a bunch of wrong answers for you instead?", + options: [ + 'Yes, I love misinformation', + "Actually, I can't read", + 'Just Google it for me (we both know you won\'t)', + ], + }, + { + message: + "It seems like you're about to comment \"doesn't work\" without any details whatsoever. Would you like me to help you be equally unhelpful, but with more words?", + options: [ + 'Add vague complaints for me', + 'Generate a 3-paragraph rant with zero specifics', + 'I was actually going to say "fix pls"', + ], + }, + { + message: + "I see you're writing a comment. Would you like me to check if this exact question has been asked and answered 15 times already in this thread?", + options: [ + "No, I'm sure I'm the first", + "Reading other comments is for losers", + 'Just post it, what could go wrong', + ], + }, + { + message: + "It looks like you're about to request a feature the uploader has already said no to. Would you like me to help you phrase it in a way that's slightly more annoying?", + options: [ + 'Make it sound urgent and entitled', + "Add 'please' so it's technically polite", + 'Threaten to make it myself (I obviously won\'t)', + ], + }, + { + message: + "I notice you're typing a comment that could be interpreted as rude. Would you like me to make it sound even worse while technically following the rules?", + options: [ + 'Maximize passive aggression', + 'Add a smiley face to disguise the hostility', + 'On second thought, I\'ll just say "thanks"', + ], + }, + { + message: + "It looks like you're about to complain that the file doesn't work on your specific setup that you refuse to describe. Would you like me to blame the uploader anyway?", + options: [ + 'Yes, it\'s definitely their fault', + 'Generate a bug report with zero useful info', + 'Just type "broken" and log off', + ], + }, + { + message: + "I see you're writing a comment in a language the uploader almost certainly doesn't speak. Would you like me to run it through a translator that will make it slightly more confusing?", + options: [ + 'Triple-translate it for maximum chaos', + 'Just add "(pls)" at the end in English', + 'Send it anyway, vibes will carry it', + ], + }, + { + message: + "It looks like you're about to leave a five-paragraph essay demanding a free commission. Would you like me to add some light emotional manipulation to improve your odds?", + options: [ + 'Lay on the guilt thick', + 'Claim it\'s "just a small thing"', + 'Threaten to be very disappointed', + ], + }, + { + message: + "I notice you haven't downloaded this file but are about to review it one star anyway. Would you like me to help you sound more authoritative?", + options: [ + 'Add "trust me" for credibility', + 'Reference a file you definitely didn\'t open', + 'One star, no note, raw power move', + ], + }, + { + message: + "It seems like you're asking when the next update will be released. The uploader has not indicated this. Would you like me to invent a deadline for them?", + options: [ + 'Tell them it should\'ve been done already', + 'Suggest they quit their day job', + 'Just post "update?" every week forever', + ], + }, + { + message: + "I see you're typing a comment that starts with \"No offense but\". I have run the numbers and offense will, in fact, be taken. Shall I proceed?", + options: [ + 'Proceed, I am unstoppable', + 'Replace it with "With all due respect"', + 'Change it to just "offense"', + ], + }, +]; + +class AiAssistClippy extends LitElement { + static properties = { + mode: { type: String }, + _state: { state: true }, + _currentSuggestion: { state: true }, + _typedText: { state: true }, + _showBubble: { state: true }, + }; + + static styles = css` + :host { + display: inline-block; + position: relative; + width: 56px; + --ai-glow-cyan: #22d3ee; + --ai-glow-purple: #a855f7; + } + + .clippy { + position: relative; + user-select: none; + } + + /* ── Orb ─────────────────────────────────── */ + + .orb-wrapper { + position: relative; + flex: 0 0 auto; + width: 56px; + height: 56px; + cursor: pointer; + } + + .orb { + position: relative; + width: 56px; + height: 56px; + border-radius: 50%; + background: radial-gradient( + circle at 38% 35%, + var(--ai-glow-cyan) 0%, + var(--ai-glow-purple) 60%, + #6d28d9 100% + ); + background-size: 200% 200%; + animation: orbShift 4s ease-in-out infinite; + box-shadow: + 0 0 18px color-mix(in srgb, var(--ai-glow-cyan) 45%, transparent), + 0 0 36px color-mix(in srgb, var(--ai-glow-purple) 30%, transparent); + transition: + box-shadow 250ms ease, + transform 250ms ease; + } + + .orb::after { + content: ''; + position: absolute; + top: 14%; + left: 22%; + width: 30%; + height: 24%; + border-radius: 50%; + background: radial-gradient( + ellipse, + rgba(255, 255, 255, 0.7) 0%, + rgba(255, 255, 255, 0) 100% + ); + transform: rotate(-30deg); + pointer-events: none; + } + + .orb-wrapper:hover .orb { + transform: scale(1.08); + box-shadow: + 0 0 24px + color-mix( + in srgb, + var(--ai-glow-cyan) 60%, + transparent + ), + 0 0 48px + color-mix( + in srgb, + var(--ai-glow-purple) 45%, + transparent + ); + } + + .orb--loading { + animation: + orbShift 1.2s ease-in-out infinite, + orbPulse 0.6s ease-in-out infinite alternate; + } + + .orb--error { + background: radial-gradient( + circle at 38% 35%, + #f87171 0%, + #dc2626 60%, + #991b1b 100% + ) !important; + box-shadow: + 0 0 18px rgba(248, 113, 113, 0.45), + 0 0 36px rgba(220, 38, 38, 0.3) !important; + animation: orbShift 4s ease-in-out infinite !important; + } + + @keyframes orbShift { + 0%, + 100% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + } + + @keyframes orbPulse { + from { + transform: scale(1); + box-shadow: + 0 0 18px + color-mix( + in srgb, + var(--ai-glow-cyan) 45%, + transparent + ), + 0 0 36px + color-mix( + in srgb, + var(--ai-glow-purple) 30%, + transparent + ); + } + to { + transform: scale(1.1); + box-shadow: + 0 0 30px + color-mix( + in srgb, + var(--ai-glow-cyan) 70%, + transparent + ), + 0 0 54px + color-mix( + in srgb, + var(--ai-glow-purple) 55%, + transparent + ); + } + } + + /* ── Speech Bubble ───────────────────────── */ + + .bubble { + position: absolute; + bottom: 0; + left: calc(100% + 12px); + background: var(--panel-bg-color, #1a1a1a); + border: 1px solid var(--border-color, #363636); + border-radius: 12px; + padding: 14px 16px; + max-width: 500px; + min-width: 380px; + font-size: 0.9rem; + line-height: 1.5; + color: var(--body-color, #b9b5af); + box-shadow: + 0 4px 24px rgba(0, 0, 0, 0.25), + 0 0 12px + color-mix( + in srgb, + var(--ai-glow-cyan) 12%, + transparent + ); + animation: bubbleIn 200ms ease-out; + transform-origin: top left; + } + + .bubble::before { + content: ''; + position: absolute; + bottom: 18px; + left: -8px; + width: 0; + height: 0; + border-top: 8px solid transparent; + border-bottom: 8px solid transparent; + border-right: 8px solid var(--border-color, #363636); + } + + .bubble::after { + content: ''; + position: absolute; + bottom: 19px; + left: -6px; + width: 0; + height: 0; + border-top: 7px solid transparent; + border-bottom: 7px solid transparent; + border-right: 7px solid var(--panel-bg-color, #1a1a1a); + } + + @keyframes bubbleIn { + from { + opacity: 0; + transform: scale(0.9) translateY(6px); + } + to { + opacity: 1; + transform: scale(1) translateY(0); + } + } + + .bubble__text { + margin: 0 0 12px; + } + + .bubble__cursor { + display: inline-block; + width: 2px; + height: 1em; + background: var(--ai-glow-cyan); + vertical-align: text-bottom; + animation: caretBlink 0.6s step-end infinite; + margin-left: 1px; + } + + @keyframes caretBlink { + 0%, + 100% { + opacity: 1; + } + 50% { + opacity: 0; + } + } + + .bubble__options { + display: flex; + flex-direction: column; + gap: 6px; + } + + .bubble__option { + display: block; + width: 100%; + padding: 8px 12px; + border: 1px solid var(--border-color, #363636); + border-radius: 8px; + background: var(--input-bg-color, #222); + color: var(--ai-glow-cyan); + font-size: 0.82rem; + cursor: pointer; + text-align: left; + transition: + background 140ms ease, + border-color 140ms ease; + } + + .bubble__option:hover { + background: color-mix( + in srgb, + var(--ai-glow-cyan) 14%, + var(--input-bg-color, #222) + ); + border-color: var(--ai-glow-cyan); + } + + .bubble__option:active { + background: color-mix( + in srgb, + var(--ai-glow-cyan) 22%, + var(--input-bg-color, #222) + ); + } + + /* ── Loading state ───────────────────────── */ + + .bubble__loading { + display: flex; + align-items: center; + gap: 8px; + color: var(--ai-glow-cyan); + font-size: 0.85rem; + } + + .bubble__loading-dots { + display: inline-flex; + gap: 3px; + } + + .bubble__loading-dots span { + width: 5px; + height: 5px; + border-radius: 50%; + background: var(--ai-glow-cyan); + animation: dotBounce 1.2s ease-in-out infinite; + } + + .bubble__loading-dots span:nth-child(2) { + animation-delay: 0.15s; + } + + .bubble__loading-dots span:nth-child(3) { + animation-delay: 0.3s; + } + + @keyframes dotBounce { + 0%, + 80%, + 100% { + opacity: 0.3; + transform: scale(0.8); + } + 40% { + opacity: 1; + transform: scale(1.1); + } + } + + /* ── Error state ─────────────────────────── */ + + .bubble__error { + color: #f87171; + font-size: 0.85rem; + font-family: monospace; + } + + /* ── Dismiss button ──────────────────────── */ + + .bubble__dismiss { + position: absolute; + top: 6px; + right: 8px; + background: none; + border: none; + color: var(--body-color, #b9b5af); + opacity: 0.5; + cursor: pointer; + font-size: 1rem; + line-height: 1; + padding: 2px 4px; + } + + .bubble__dismiss:hover { + opacity: 1; + } + + /* ── Hidden utility ──────────────────────── */ + + .bubble__branding { + margin-top: 10px; + padding-top: 8px; + border-top: 1px solid var(--border-color, #363636); + font-size: 0.7rem; + color: var(--body-color, #b9b5af); + opacity: 0.45; + text-align: right; + } + + .bubble__branding span { + background: linear-gradient( + 90deg, + var(--ai-glow-cyan) 0%, + var(--ai-glow-purple) 100% + ); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + font-weight: 700; + } + + [hidden] { + display: none !important; + } + `; + + constructor() { + super(); + this.mode = 'commenter'; + this._state = 'idle'; + this._currentSuggestion = null; + this._typedText = ''; + this._showBubble = false; + this._typeTimer = null; + this._idleTimer = null; + } + + connectedCallback() { + super.connectedCallback(); + this._schedulePopUp(); + } + + disconnectedCallback() { + super.disconnectedCallback(); + clearTimeout(this._typeTimer); + clearTimeout(this._idleTimer); + clearTimeout(this._loadingTimer); + } + + /* ── Helpers ─────────────────────────────── */ + + get _suggestions() { + return this.mode === 'uploader' + ? UPLOADER_SUGGESTIONS + : COMMENTER_SUGGESTIONS; + } + + _pickRandom() { + const pool = this._suggestions; + return pool[Math.floor(Math.random() * pool.length)]; + } + + _schedulePopUp() { + clearTimeout(this._idleTimer); + this._idleTimer = setTimeout(() => { + if (this._state === 'idle') { + this._showSuggestion(); + } + }, 3000); + } + + /* ── State transitions ───────────────────── */ + + _showSuggestion() { + this._currentSuggestion = this._pickRandom(); + this._typedText = ''; + this._showBubble = true; + this._state = 'typing'; + this._typeNextChar(0); + } + + _typeNextChar(index) { + const full = this._currentSuggestion.message; + if (index <= full.length) { + this._typedText = full.slice(0, index); + this._typeTimer = setTimeout( + () => this._typeNextChar(index + 1), + 22 + Math.random() * 28, + ); + } else { + this._state = 'suggesting'; + } + } + + _onOptionClick() { + this._state = 'loading'; + this._loadingTimer = setTimeout(() => { + this._state = 'error'; + }, 2000); + } + + _dismiss() { + clearTimeout(this._typeTimer); + clearTimeout(this._loadingTimer); + this._showBubble = false; + this._state = 'idle'; + this._schedulePopUp(); + } + + _onOrbClick() { + if (this._showBubble) { + this._dismiss(); + } else { + clearTimeout(this._idleTimer); + this._showSuggestion(); + } + } + + /* ── Render ──────────────────────────────── */ + + _renderBubbleContent() { + switch (this._state) { + case 'typing': + return html` +

+ ${this._typedText} +

+ `; + case 'suggesting': + return html` +

+ ${this._currentSuggestion.message} +

+
+ ${this._currentSuggestion.options.map( + (opt) => html` + + `, + )} +
+ `; + case 'loading': + return html` +
+ + + + Generating response… +
+ `; + case 'error': + return html` +

+ Error: Account <Open3DLab> is out of AI tokens. You have $42000 in unpaid invoices. Please settle your balance to continue using AI features. +

+ `; + default: + return null; + } + } + + render() { + const orbClass = [ + 'orb', + this._state === 'loading' ? 'orb--loading' : '', + this._state === 'error' ? 'orb--error' : '', + ] + .filter(Boolean) + .join(' '); + + return html` +
+
+
+
+ ${this._showBubble + ? html` +
+ + ${keyed( + this._state, + this._renderBubbleContent(), + )} +
+ powered by LLEmmy +
+
+ ` + : null} +
+ `; + } +} + +if (!window.customElements.get('ai-assist-clippy')) { + window.customElements.define('ai-assist-clippy', AiAssistClippy); +} diff --git a/widgets/package.json b/widgets/package.json new file mode 100644 index 0000000..14c6c24 --- /dev/null +++ b/widgets/package.json @@ -0,0 +1,42 @@ +{ + "name": "open3dlab-slopscaling-widgets", + "version": "0.1.0", + "description": "Open3DLab SlopScaling web components.", + "type": "module", + "main": "./index.js", + "exports": { + ".": "./index.js", + "./ai-assist-bar.js": "./js/ai-assist-bar.js", + "./ai-assist-clippy.js": "./js/ai-assist-clippy.js" + }, + "files": [ + "index.js", + "js" + ], + "sideEffects": [ + "./js/ai-assist-bar.js", + "./js/ai-assist-clippy.js" + ], + "scripts": { + "check": "node --check index.js && node --check js/ai-assist-bar.js && node --check js/ai-assist-clippy.js", + "storybook": "storybook dev -p 6006", + "build-storybook": "storybook build" + }, + "keywords": [ + "web-components", + "lit", + "open3dlab" + ], + "license": "MIT", + "dependencies": { + "lit": "^3.3.1" + }, + "devDependencies": { + "@storybook/addon-essentials": "8.6.14", + "@storybook/web-components": "8.6.14", + "@storybook/web-components-vite": "8.6.14", + "esbuild": "0.25.12", + "storybook": "8.6.14", + "vite": "6.4.2" + } +} \ No newline at end of file diff --git a/widgets/pnpm-lock.yaml b/widgets/pnpm-lock.yaml new file mode 100644 index 0000000..0ff166b --- /dev/null +++ b/widgets/pnpm-lock.yaml @@ -0,0 +1,1715 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + lit: + specifier: ^3.3.1 + version: 3.3.2 + devDependencies: + '@storybook/addon-essentials': + specifier: 8.6.14 + version: 8.6.14(@types/react@19.2.14)(storybook@8.6.14) + '@storybook/web-components': + specifier: 8.6.14 + version: 8.6.14(lit@3.3.2)(storybook@8.6.14) + '@storybook/web-components-vite': + specifier: 8.6.14 + version: 8.6.14(lit@3.3.2)(storybook@8.6.14)(vite@6.4.2(lightningcss@1.32.0)) + esbuild: + specifier: 0.25.12 + version: 0.25.12 + storybook: + specifier: 8.6.14 + version: 8.6.14 + vite: + specifier: 6.4.2 + version: 6.4.2(lightningcss@1.32.0) + +packages: + + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + engines: {node: '>=6.9.0'} + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@lit-labs/ssr-dom-shim@1.5.1': + resolution: {integrity: sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==} + + '@lit/reactive-element@2.1.2': + resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==} + + '@mdx-js/react@3.1.1': + resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + + '@rollup/rollup-android-arm-eabi@4.60.1': + resolution: {integrity: sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.60.1': + resolution: {integrity: sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.60.1': + resolution: {integrity: sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.60.1': + resolution: {integrity: sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.60.1': + resolution: {integrity: sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.60.1': + resolution: {integrity: sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.60.1': + resolution: {integrity: sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.60.1': + resolution: {integrity: sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.60.1': + resolution: {integrity: sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.60.1': + resolution: {integrity: sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.60.1': + resolution: {integrity: sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.60.1': + resolution: {integrity: sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.60.1': + resolution: {integrity: sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.60.1': + resolution: {integrity: sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.60.1': + resolution: {integrity: sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.60.1': + resolution: {integrity: sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.60.1': + resolution: {integrity: sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.60.1': + resolution: {integrity: sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.60.1': + resolution: {integrity: sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.60.1': + resolution: {integrity: sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.60.1': + resolution: {integrity: sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.60.1': + resolution: {integrity: sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.60.1': + resolution: {integrity: sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.60.1': + resolution: {integrity: sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.60.1': + resolution: {integrity: sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==} + cpu: [x64] + os: [win32] + + '@storybook/addon-actions@8.6.14': + resolution: {integrity: sha512-mDQxylxGGCQSK7tJPkD144J8jWh9IU9ziJMHfB84PKpI/V5ZgqMDnpr2bssTrUaGDqU5e1/z8KcRF+Melhs9pQ==} + peerDependencies: + storybook: ^8.6.14 + + '@storybook/addon-backgrounds@8.6.14': + resolution: {integrity: sha512-l9xS8qWe5n4tvMwth09QxH2PmJbCctEvBAc1tjjRasAfrd69f7/uFK4WhwJAstzBTNgTc8VXI4w8ZR97i1sFbg==} + peerDependencies: + storybook: ^8.6.14 + + '@storybook/addon-controls@8.6.14': + resolution: {integrity: sha512-IiQpkNJdiRyA4Mq9mzjZlvQugL/aE7hNgVxBBGPiIZG6wb6Ht9hNnBYpap5ZXXFKV9p2qVI0FZK445ONmAa+Cw==} + peerDependencies: + storybook: ^8.6.14 + + '@storybook/addon-docs@8.6.14': + resolution: {integrity: sha512-Obpd0OhAF99JyU5pp5ci17YmpcQtMNgqW2pTXV8jAiiipWpwO++hNDeQmLmlSXB399XjtRDOcDVkoc7rc6JzdQ==} + peerDependencies: + storybook: ^8.6.14 + + '@storybook/addon-essentials@8.6.14': + resolution: {integrity: sha512-5ZZSHNaW9mXMOFkoPyc3QkoNGdJHETZydI62/OASR0lmPlJ1065TNigEo5dJddmZNn0/3bkE8eKMAzLnO5eIdA==} + peerDependencies: + storybook: ^8.6.14 + + '@storybook/addon-highlight@8.6.14': + resolution: {integrity: sha512-4H19OJlapkofiE9tM6K/vsepf4ir9jMm9T+zw5L85blJZxhKZIbJ6FO0TCG9PDc4iPt3L6+aq5B0X29s9zicNQ==} + peerDependencies: + storybook: ^8.6.14 + + '@storybook/addon-measure@8.6.14': + resolution: {integrity: sha512-1Tlyb72NX8aAqm6I6OICsUuGOP6hgnXcuFlXucyhKomPa6j3Eu2vKu561t/f0oGtAK2nO93Z70kVaEh5X+vaGw==} + peerDependencies: + storybook: ^8.6.14 + + '@storybook/addon-outline@8.6.14': + resolution: {integrity: sha512-CW857JvN6OxGWElqjlzJO2S69DHf+xO3WsEfT5mT3ZtIjmsvRDukdWfDU9bIYUFyA2lFvYjncBGjbK+I91XR7w==} + peerDependencies: + storybook: ^8.6.14 + + '@storybook/addon-toolbars@8.6.14': + resolution: {integrity: sha512-W/wEXT8h3VyZTVfWK/84BAcjAxTdtRiAkT2KAN0nbSHxxB5KEM1MjKpKu2upyzzMa3EywITqbfy4dP6lpkVTwQ==} + peerDependencies: + storybook: ^8.6.14 + + '@storybook/addon-viewport@8.6.14': + resolution: {integrity: sha512-gNzVQbMqRC+/4uQTPI2ZrWuRHGquTMZpdgB9DrD88VTEjNudP+J6r8myLfr2VvGksBbUMHkGHMXHuIhrBEnXYA==} + peerDependencies: + storybook: ^8.6.14 + + '@storybook/blocks@8.6.14': + resolution: {integrity: sha512-rBMHAfA39AGHgkrDze4RmsnQTMw1ND5fGWobr9pDcJdnDKWQWNRD7Nrlxj0gFlN3n4D9lEZhWGdFrCbku7FVAQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^8.6.14 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@storybook/builder-vite@8.6.14': + resolution: {integrity: sha512-ajWYhy32ksBWxwWHrjwZzyC0Ii5ZTeu5lsqA95Q/EQBB0P5qWlHWGM3AVyv82Mz/ND03ebGy123uVwgf6olnYQ==} + peerDependencies: + storybook: ^8.6.14 + vite: ^4.0.0 || ^5.0.0 || ^6.0.0 + + '@storybook/components@8.6.14': + resolution: {integrity: sha512-HNR2mC5I4Z5ek8kTrVZlIY/B8gJGs5b3XdZPBPBopTIN6U/YHXiDyOjY3JlaS4fSG1fVhp/Qp1TpMn1w/9m1pw==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + + '@storybook/core@8.6.14': + resolution: {integrity: sha512-1P/w4FSNRqP8j3JQBOi3yGt8PVOgSRbP66Ok520T78eJBeqx9ukCfl912PQZ7SPbW3TIunBwLXMZOjZwBB/JmA==} + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true + + '@storybook/csf-plugin@8.6.14': + resolution: {integrity: sha512-dErtc9teAuN+eelN8FojzFE635xlq9cNGGGEu0WEmMUQ4iJ8pingvBO1N8X3scz4Ry7KnxX++NNf3J3gpxS8qQ==} + peerDependencies: + storybook: ^8.6.14 + + '@storybook/global@5.0.0': + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + + '@storybook/icons@1.6.0': + resolution: {integrity: sha512-hcFZIjW8yQz8O8//2WTIXylm5Xsgc+lW9ISLgUk1xGmptIJQRdlhVIXCpSyLrQaaRiyhQRaVg7l3BD9S216BHw==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + + '@storybook/manager-api@8.6.14': + resolution: {integrity: sha512-ez0Zihuy17udLbfHZQXkGqwtep0mSGgHcNzGN7iZrMP1m+VmNo+7aGCJJdvXi7+iU3yq8weXSQFWg5DqWgLS7g==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + + '@storybook/preview-api@8.6.14': + resolution: {integrity: sha512-2GhcCd4dNMrnD7eooEfvbfL4I83qAqEyO0CO7JQAmIO6Rxb9BsOLLI/GD5HkvQB73ArTJ+PT50rfaO820IExOQ==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + + '@storybook/react-dom-shim@8.6.14': + resolution: {integrity: sha512-0hixr3dOy3f3M+HBofp3jtMQMS+sqzjKNgl7Arfuj3fvjmyXOks/yGjDImySR4imPtEllvPZfhiQNlejheaInw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.6.14 + + '@storybook/theming@8.6.14': + resolution: {integrity: sha512-r4y+LsiB37V5hzpQo+BM10PaCsp7YlZ0YcZzQP1OCkPlYXmUAFy2VvDKaFRpD8IeNPKug2u4iFm/laDEbs03dg==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + + '@storybook/web-components-vite@8.6.14': + resolution: {integrity: sha512-7lxz/hFMTSlhl1gkjqmEp9SchSHcoDCMJTu7LuM6fJWKLHydYB6zwIyL+qYvKDa+E+kgmUKc54yW5SqAWHkjoA==} + engines: {node: '>=18.0.0'} + peerDependencies: + storybook: ^8.6.14 + + '@storybook/web-components@8.6.14': + resolution: {integrity: sha512-Jczq7EbIR3EJXX/n+0bKLW8mZS2g5Q57Y67fkw2hNr2E81OBL/4XSU9Dv4pZJXCstE1Ta+ELHj/fqbBbTj7QZA==} + engines: {node: '>=18.0.0'} + peerDependencies: + lit: ^2.0.0 || ^3.0.0 + storybook: ^8.6.14 + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/uuid@9.0.8': + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + better-opn@3.0.2: + resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} + engines: {node: '>=12.0.0'} + + browser-assert@1.2.1: + resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + jsdoc-type-pratt-parser@4.8.0: + resolution: {integrity: sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==} + engines: {node: '>=12.0.0'} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + lit-element@4.2.2: + resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} + + lit-html@3.3.2: + resolution: {integrity: sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==} + + lit@3.3.2: + resolution: {integrity: sha512-NF9zbsP79l4ao2SNrH3NkfmFgN/hBYSQo90saIVI1o5GpjAdCPVstVzO1MrLOakHoEhYkrtRjPK6Ob521aoYWQ==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + map-or-similar@1.5.0: + resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + memoizerific@1.11.3: + resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + polished@4.3.1: + resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} + engines: {node: '>=10'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss@8.5.9: + resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==} + engines: {node: ^10 || ^12 || >=14} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + react-dom@19.2.5: + resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==} + peerDependencies: + react: ^19.2.5 + + react@19.2.5: + resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==} + engines: {node: '>=0.10.0'} + + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + + rollup@4.60.1: + resolution: {integrity: sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + storybook@8.6.14: + resolution: {integrity: sha512-sVKbCj/OTx67jhmauhxc2dcr1P+yOgz/x3h0krwjyMgdc5Oubvxyg4NYDZmzAw+ym36g/lzH8N0Ccp4dwtdfxw==} + hasBin: true + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + unplugin@1.16.1: + resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} + engines: {node: '>=14.0.0'} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + vite@6.4.2: + resolution: {integrity: sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + + ws@8.20.0: + resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + +snapshots: + + '@babel/runtime@7.29.2': {} + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@lit-labs/ssr-dom-shim@1.5.1': {} + + '@lit/reactive-element@2.1.2': + dependencies: + '@lit-labs/ssr-dom-shim': 1.5.1 + + '@mdx-js/react@3.1.1(@types/react@19.2.14)(react@19.2.5)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 19.2.14 + react: 19.2.5 + + '@rollup/rollup-android-arm-eabi@4.60.1': + optional: true + + '@rollup/rollup-android-arm64@4.60.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.60.1': + optional: true + + '@rollup/rollup-darwin-x64@4.60.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.60.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.60.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.60.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.60.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.60.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.60.1': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.60.1': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.60.1': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.60.1': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.60.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.60.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.60.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.60.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.60.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.60.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.60.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.60.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.60.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.60.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.60.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.60.1': + optional: true + + '@storybook/addon-actions@8.6.14(storybook@8.6.14)': + dependencies: + '@storybook/global': 5.0.0 + '@types/uuid': 9.0.8 + dequal: 2.0.3 + polished: 4.3.1 + storybook: 8.6.14 + uuid: 9.0.1 + + '@storybook/addon-backgrounds@8.6.14(storybook@8.6.14)': + dependencies: + '@storybook/global': 5.0.0 + memoizerific: 1.11.3 + storybook: 8.6.14 + ts-dedent: 2.2.0 + + '@storybook/addon-controls@8.6.14(storybook@8.6.14)': + dependencies: + '@storybook/global': 5.0.0 + dequal: 2.0.3 + storybook: 8.6.14 + ts-dedent: 2.2.0 + + '@storybook/addon-docs@8.6.14(@types/react@19.2.14)(storybook@8.6.14)': + dependencies: + '@mdx-js/react': 3.1.1(@types/react@19.2.14)(react@19.2.5) + '@storybook/blocks': 8.6.14(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@8.6.14) + '@storybook/csf-plugin': 8.6.14(storybook@8.6.14) + '@storybook/react-dom-shim': 8.6.14(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@8.6.14) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + storybook: 8.6.14 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + + '@storybook/addon-essentials@8.6.14(@types/react@19.2.14)(storybook@8.6.14)': + dependencies: + '@storybook/addon-actions': 8.6.14(storybook@8.6.14) + '@storybook/addon-backgrounds': 8.6.14(storybook@8.6.14) + '@storybook/addon-controls': 8.6.14(storybook@8.6.14) + '@storybook/addon-docs': 8.6.14(@types/react@19.2.14)(storybook@8.6.14) + '@storybook/addon-highlight': 8.6.14(storybook@8.6.14) + '@storybook/addon-measure': 8.6.14(storybook@8.6.14) + '@storybook/addon-outline': 8.6.14(storybook@8.6.14) + '@storybook/addon-toolbars': 8.6.14(storybook@8.6.14) + '@storybook/addon-viewport': 8.6.14(storybook@8.6.14) + storybook: 8.6.14 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + + '@storybook/addon-highlight@8.6.14(storybook@8.6.14)': + dependencies: + '@storybook/global': 5.0.0 + storybook: 8.6.14 + + '@storybook/addon-measure@8.6.14(storybook@8.6.14)': + dependencies: + '@storybook/global': 5.0.0 + storybook: 8.6.14 + tiny-invariant: 1.3.3 + + '@storybook/addon-outline@8.6.14(storybook@8.6.14)': + dependencies: + '@storybook/global': 5.0.0 + storybook: 8.6.14 + ts-dedent: 2.2.0 + + '@storybook/addon-toolbars@8.6.14(storybook@8.6.14)': + dependencies: + storybook: 8.6.14 + + '@storybook/addon-viewport@8.6.14(storybook@8.6.14)': + dependencies: + memoizerific: 1.11.3 + storybook: 8.6.14 + + '@storybook/blocks@8.6.14(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@8.6.14)': + dependencies: + '@storybook/icons': 1.6.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + storybook: 8.6.14 + ts-dedent: 2.2.0 + optionalDependencies: + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + + '@storybook/builder-vite@8.6.14(storybook@8.6.14)(vite@6.4.2(lightningcss@1.32.0))': + dependencies: + '@storybook/csf-plugin': 8.6.14(storybook@8.6.14) + browser-assert: 1.2.1 + storybook: 8.6.14 + ts-dedent: 2.2.0 + vite: 6.4.2(lightningcss@1.32.0) + + '@storybook/components@8.6.14(storybook@8.6.14)': + dependencies: + storybook: 8.6.14 + + '@storybook/core@8.6.14(storybook@8.6.14)': + dependencies: + '@storybook/theming': 8.6.14(storybook@8.6.14) + better-opn: 3.0.2 + browser-assert: 1.2.1 + esbuild: 0.25.12 + esbuild-register: 3.6.0(esbuild@0.25.12) + jsdoc-type-pratt-parser: 4.8.0 + process: 0.11.10 + recast: 0.23.11 + semver: 7.7.4 + util: 0.12.5 + ws: 8.20.0 + transitivePeerDependencies: + - bufferutil + - storybook + - supports-color + - utf-8-validate + + '@storybook/csf-plugin@8.6.14(storybook@8.6.14)': + dependencies: + storybook: 8.6.14 + unplugin: 1.16.1 + + '@storybook/global@5.0.0': {} + + '@storybook/icons@1.6.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + dependencies: + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + + '@storybook/manager-api@8.6.14(storybook@8.6.14)': + dependencies: + storybook: 8.6.14 + + '@storybook/preview-api@8.6.14(storybook@8.6.14)': + dependencies: + storybook: 8.6.14 + + '@storybook/react-dom-shim@8.6.14(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@8.6.14)': + dependencies: + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + storybook: 8.6.14 + + '@storybook/theming@8.6.14(storybook@8.6.14)': + dependencies: + storybook: 8.6.14 + + '@storybook/web-components-vite@8.6.14(lit@3.3.2)(storybook@8.6.14)(vite@6.4.2(lightningcss@1.32.0))': + dependencies: + '@storybook/builder-vite': 8.6.14(storybook@8.6.14)(vite@6.4.2(lightningcss@1.32.0)) + '@storybook/web-components': 8.6.14(lit@3.3.2)(storybook@8.6.14) + magic-string: 0.30.21 + storybook: 8.6.14 + transitivePeerDependencies: + - lit + - vite + + '@storybook/web-components@8.6.14(lit@3.3.2)(storybook@8.6.14)': + dependencies: + '@storybook/components': 8.6.14(storybook@8.6.14) + '@storybook/global': 5.0.0 + '@storybook/manager-api': 8.6.14(storybook@8.6.14) + '@storybook/preview-api': 8.6.14(storybook@8.6.14) + '@storybook/theming': 8.6.14(storybook@8.6.14) + lit: 3.3.2 + storybook: 8.6.14 + tiny-invariant: 1.3.3 + ts-dedent: 2.2.0 + + '@types/estree@1.0.8': {} + + '@types/mdx@2.0.13': {} + + '@types/react@19.2.14': + dependencies: + csstype: 3.2.3 + + '@types/trusted-types@2.0.7': {} + + '@types/uuid@9.0.8': {} + + acorn@8.16.0: {} + + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + better-opn@3.0.2: + dependencies: + open: 8.4.2 + + browser-assert@1.2.1: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.9: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + csstype@3.2.3: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-lazy-prop@2.0.0: {} + + dequal@2.0.3: {} + + detect-libc@2.1.2: + optional: true + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + esbuild-register@3.6.0(esbuild@0.25.12): + dependencies: + debug: 4.4.3 + esbuild: 0.25.12 + transitivePeerDependencies: + - supports-color + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + esprima@4.0.1: {} + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + generator-function@2.0.1: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + gopd@1.2.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + inherits@2.0.4: {} + + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-docker@2.2.1: {} + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.20 + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + jsdoc-type-pratt-parser@4.8.0: {} + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + optional: true + + lit-element@4.2.2: + dependencies: + '@lit-labs/ssr-dom-shim': 1.5.1 + '@lit/reactive-element': 2.1.2 + lit-html: 3.3.2 + + lit-html@3.3.2: + dependencies: + '@types/trusted-types': 2.0.7 + + lit@3.3.2: + dependencies: + '@lit/reactive-element': 2.1.2 + lit-element: 4.2.2 + lit-html: 3.3.2 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + map-or-similar@1.5.0: {} + + math-intrinsics@1.1.0: {} + + memoizerific@1.11.3: + dependencies: + map-or-similar: 1.5.0 + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + picocolors@1.1.1: {} + + picomatch@4.0.4: {} + + polished@4.3.1: + dependencies: + '@babel/runtime': 7.29.2 + + possible-typed-array-names@1.1.0: {} + + postcss@8.5.9: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + process@0.11.10: {} + + react-dom@19.2.5(react@19.2.5): + dependencies: + react: 19.2.5 + scheduler: 0.27.0 + + react@19.2.5: {} + + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + + rollup@4.60.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.60.1 + '@rollup/rollup-android-arm64': 4.60.1 + '@rollup/rollup-darwin-arm64': 4.60.1 + '@rollup/rollup-darwin-x64': 4.60.1 + '@rollup/rollup-freebsd-arm64': 4.60.1 + '@rollup/rollup-freebsd-x64': 4.60.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.1 + '@rollup/rollup-linux-arm-musleabihf': 4.60.1 + '@rollup/rollup-linux-arm64-gnu': 4.60.1 + '@rollup/rollup-linux-arm64-musl': 4.60.1 + '@rollup/rollup-linux-loong64-gnu': 4.60.1 + '@rollup/rollup-linux-loong64-musl': 4.60.1 + '@rollup/rollup-linux-ppc64-gnu': 4.60.1 + '@rollup/rollup-linux-ppc64-musl': 4.60.1 + '@rollup/rollup-linux-riscv64-gnu': 4.60.1 + '@rollup/rollup-linux-riscv64-musl': 4.60.1 + '@rollup/rollup-linux-s390x-gnu': 4.60.1 + '@rollup/rollup-linux-x64-gnu': 4.60.1 + '@rollup/rollup-linux-x64-musl': 4.60.1 + '@rollup/rollup-openbsd-x64': 4.60.1 + '@rollup/rollup-openharmony-arm64': 4.60.1 + '@rollup/rollup-win32-arm64-msvc': 4.60.1 + '@rollup/rollup-win32-ia32-msvc': 4.60.1 + '@rollup/rollup-win32-x64-gnu': 4.60.1 + '@rollup/rollup-win32-x64-msvc': 4.60.1 + fsevents: 2.3.3 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + scheduler@0.27.0: {} + + semver@7.7.4: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + source-map-js@1.2.1: {} + + source-map@0.6.1: {} + + storybook@8.6.14: + dependencies: + '@storybook/core': 8.6.14(storybook@8.6.14) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + tiny-invariant@1.3.3: {} + + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + ts-dedent@2.2.0: {} + + tslib@2.8.1: {} + + unplugin@1.16.1: + dependencies: + acorn: 8.16.0 + webpack-virtual-modules: 0.6.2 + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.2 + is-typed-array: 1.1.15 + which-typed-array: 1.1.20 + + uuid@9.0.1: {} + + vite@6.4.2(lightningcss@1.32.0): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.9 + rollup: 4.60.1 + tinyglobby: 0.2.16 + optionalDependencies: + fsevents: 2.3.3 + lightningcss: 1.32.0 + + webpack-virtual-modules@0.6.2: {} + + which-typed-array@1.1.20: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + ws@8.20.0: {} diff --git a/widgets/stories/ai-assist-bar.stories.js b/widgets/stories/ai-assist-bar.stories.js new file mode 100644 index 0000000..a0688fc --- /dev/null +++ b/widgets/stories/ai-assist-bar.stories.js @@ -0,0 +1,38 @@ +import { html } from 'lit'; + +import '../js/ai-assist-bar.js'; + +const meta = { + title: 'Widgets/AI Assist Bar', + tags: ['autodocs'], + argTypes: { + mode: { + control: 'radio', + options: ['project', 'frontpage'], + }, + }, + args: { + mode: 'project', + }, + render: ({ mode }) => html` +
+

Interactive Preview

+

+ Use the controls panel to switch the widget context. The component itself is live, + so you can type into it, change the fake model, and submit to watch its loading and + reveal states. +

+ +
+ `, +}; + +export default meta; + +export const Default = {}; + +export const Frontpage = { + args: { + mode: 'frontpage', + }, +}; \ No newline at end of file diff --git a/widgets/stories/ai-assist-clippy.stories.js b/widgets/stories/ai-assist-clippy.stories.js new file mode 100644 index 0000000..83ff9df --- /dev/null +++ b/widgets/stories/ai-assist-clippy.stories.js @@ -0,0 +1,40 @@ +import { html } from 'lit'; + +import '../js/ai-assist-clippy.js'; + +const meta = { + title: 'Widgets/AI Assist Clippy', + tags: ['autodocs'], + argTypes: { + mode: { + control: 'radio', + options: ['commenter', 'uploader'], + }, + }, + args: { + mode: 'commenter', + }, + render: ({ mode }) => html` +
+

Interactive Preview

+

+ Click the orb to trigger the speech bubble immediately, or wait a few seconds for it + to pop on its own. Change the mode in controls to swap between commenter and uploader + suggestion sets. +

+
+ +
+
+ `, +}; + +export default meta; + +export const Default = {}; + +export const Uploader = { + args: { + mode: 'uploader', + }, +}; \ No newline at end of file diff --git a/widgets/stories/preview.css b/widgets/stories/preview.css new file mode 100644 index 0000000..eaab795 --- /dev/null +++ b/widgets/stories/preview.css @@ -0,0 +1,62 @@ +:root { + color-scheme: dark; + --panel-bg-color: #161d27; + --input-bg-color: #0d131c; + --input-color: #e8ecf3; + --body-color: #c6d0de; + --border-color: #314154; + --link-color: #f59e0b; +} + +body { + margin: 0; + font-family: Georgia, 'Times New Roman', serif; + background: + radial-gradient(circle at top, rgba(245, 158, 11, 0.08), transparent 30%), + linear-gradient(180deg, #081018 0%, #0f1720 100%); + color: var(--body-color); +} + +.story-shell { + min-width: min(92vw, 960px); + padding: 32px; +} + +.story-surface { + padding: 28px; + border-radius: 28px; + border: 1px solid rgba(245, 158, 11, 0.16); + background: + linear-gradient(180deg, rgba(245, 158, 11, 0.06), transparent 28%), + rgba(12, 18, 27, 0.92); + box-shadow: + 0 24px 80px rgba(0, 0, 0, 0.35), + inset 0 1px 0 rgba(255, 255, 255, 0.03); +} + +.story-stack { + display: grid; + gap: 20px; +} + +.story-heading { + margin: 0; + font-size: 12px; + letter-spacing: 0.24em; + text-transform: uppercase; + color: #f2c572; +} + +.story-note { + margin: 0; + font-size: 14px; + line-height: 1.6; + max-width: 68ch; + color: rgba(232, 236, 243, 0.76); +} + +.story-clippy-row { + display: flex; + align-items: flex-end; + min-height: 220px; +} \ No newline at end of file