Tailwind コンポーネントシステム · 新しいリソース

Preline UI デザインシステム.

タブを連動させたネイティブのPrelineセッションプランナー。入力数値を制限するプラグイン、インストール済みのテーマエイリアス、実際のTailwindスケールを備え、選択したセッションに応じてローカルの教材費見積もりが更新されます。

OpenDesign ガイド9 章31件のリファレンス項目オリジナルアプリケーションガイド
01

Preline UI デザインシステムのインターフェースプレビュー

オリジナルのクリエイティブセッション3つを比較し、グループの人数を変更して、素材費の概算をページ内限定の情報として明示して保存できます。

スタジオの土曜日プランナー完全な例を開く
Tailwind CSS 4.3.3とパッケージのデフォルトテーマを使用したPreline 4.2.0のHSTabsとHSInputNumber。· 実装リファレンス
02

Preline UI デザインシステムのデザインリファレンス

Preline npm 4.2.0とTailwind CSS 4.3.3を使用し、インストール済みパッケージのデフォルトテーマを適用しています。マーケティング/ドキュメントサイトには、より新しいリリースの案内が表示される場合があるため、実行可能な例ではバージョンを明示的に固定しています。テーマのエイリアスはエイリアスのまま使用し、推測した16進数への変換は行いません。

デフォルトのライトセマンティックテーマ

ソース
名前 / ルール値 / 設定用途
--backgroundvar(--color-white)デフォルトの背景の役割。
--foregroundvar(--color-gray-800)メインテキストの役割。
--bordervar(--color-gray-200)共通ボーダーの役割。
--primaryvar(--color-primary-600)アクティブなタブと主操作。
--primary-foregroundvar(--color-white)プライマリカラー上のテキスト。
--primary-hovervar(--color-primary-700)ホバー状態。
--primary-focusvar(--color-primary-700)フォーカス状態。
--primary-activevar(--color-primary-700)アクティブ状態。
--layervar(--color-white)数量コントロールの界面表面。
--layer-linevar(--color-gray-200)数量コントロールの境界。
--layer-hovervar(--color-gray-50)ホバー時の背景。
--cardvar(--color-white)セッションカードとグループカード。
--card-linevar(--color-gray-200)カードの境界線。
--muted-foreground-1var(--color-gray-500)補助テキスト。

実際に使用するTailwindのスケール

ソース
名前 / ルール値 / 設定用途
p-2 / gap-20.5rem数量入力の外枠とタブ間の余白。
px-3 / gap-30.75remタブのパディングと数値入力の間隔。
p-51.25remカードとデフォルトのページ余白。
sm:p-82rem from 640px小画面ブレークポイントでのページ余白。
mt-71.75remプランナーの前の余白。
text-xs0.75rem / 1rem補足ラベル。
text-sm0.875rem / 1.25rem操作要素と説明文。
text-lg1.125rem / 1.75remグループ見出し。
text-2xl1.5rem / 2remセッション名。
text-3xl1.875rem / 2.25remページ見出しと合計。
rounded-lg / rounded-xl0.5rem / 0.75rem操作要素/カード。デフォルトのTailwindの角丸値。

元のアプリケーションとプラグインの制約

ソース
名前 / ルール値 / 設定用途
Group sizemin 1 / max 6 / step 1HSInputNumberのデータオプションとHTMLの入力制約を一致させます。
Print studio allowance$12 per participant架空の素材費の見積もり。
Clay workshop allowance$18 per participant架空の素材費の見積もり。
Drawing walk allowance$5 per participant架空の素材費の見積もり。
LayoutFlexible session + 280px group card; stack at 760px元のレスポンシブ構成。
Theme mappingbg-primary → --color-primary → --primaryセマンティックなTailwindユーティリティはPrelineのエイリアスを通じて解決されます。
03

Preline UIデザインシステム完全ガイド

実際のインターフェースで、このデザインシステムを選び、適用し、レビューするための実践ガイドです。

DESIGN-preline-ui.md

詳しいガイダンス、実装の出発点、ソースへのリンクをまとめています。

ガイドをダウンロード

Preline UIデザインシステム:Prelineはユーティリティマークアップと動作プラグインを組み合わせる

Prelineはユーティリティのマークアップと動作プラグインを組み合わせる

このプランナーは、Prelineのネイティブプラグインを2つ使用します。HSTabsがセッションパネルを切り替え、HSInputNumberが上限・下限付きの増減操作を管理します。見た目の大部分はTailwindクラスで設定します。元のセッションイラストと予算計算はアプリケーション固有のものであり、架空のオールインワン予約コンポーネントの機能ではありません。

この OpenDesign ガイドから

この違いは、サンプルをコピーする際に重要です。JavaScriptパッケージをインストールしただけでは、ユーティリティクラスはコンパイルされず、アプリケーションのマークアップも提供されません。逆に、HTMLをコピーしてもプラグインを初期化しなければ、タブと数値入力の動作は不完全です。以下の完全な統合例では、それぞれの要素を明示的に組み込んでいます。

関連する仕様を確認する

Preline UIデザインシステム:セマンティックエイリアスからパレットの役割を確認する

セマンティックエイリアスからパレットの役割までたどる

パッケージのデフォルトのライトテーマでは、--primaryは--color-primary-600を参照し、その基となるプライマリーの色階調は青です。プライマリーの前景色は白に解決され、ホバー、フォーカス、アクティブには700の役割が使われます。選択中のタブと保存操作は、セマンティックユーティリティクラスを通じて同じ色系統を共有します。

カードには--cardと--card-line、数量入力欄には--layerと--layer-lineを使用します。これらの役割を分けておくと、白やグレーのクラスをあちこちに直接指定するより、将来のテーマ変更に対応しやすくなります。この表では、計算上の近似値を元のトークンとして示すのではなく、公式のエイリアスをそのまま記載しています。

関連する仕様を確認する

Preline UIデザインシステム:Tailwindの実際のスケールを使い、独自の例外を明示する

Tailwindの実際のスケールを使い、独自の例外を明記する

ページタイトルと見積もりにはtext-3xl、セッション名にはtext-2xl、フォームの説明にはtext-smを使用します。カードのパディングp-5は、デフォルトのスペーシング単位で1.25remに相当します。ページの余白を広げるsm:p-8はTailwindの640pxのsmallブレークポイントから適用されます。一方、元のグリッドが1列に切り替わる幅は760pxです。

ローカルのスタイルシートではsystem-uiを使用し、Prelineのテーマファイルに記載されているオプションのカスタムフォントは読み込みません。280pxではタブが2段に折り返され、グループカードはセッションの下に配置されます。これはアプリケーション固有の意図的な構成であり、すべてのPrelineレイアウトが同じ形状になるという意味ではありません。

関連する仕様を確認する

Preline UIデザインシステム:安定したIDでタブとパネルを関連付ける

タブコントロールとパネルを安定したIDで関連付ける

各タブのdata-hs-tabは、それぞれ一意のパネルを指します。支援技術でも同じ関連付けを認識できるよう、タブのaria-controlsとパネルのaria-labelledbyにも対応する値を設定します。初期状態でactiveとaria-selected=trueを持つタブは1つだけにし、ほかのパネルは非表示にします。ネイティブのHSTabsは、ユーザーの操作に応じてこれらの状態を更新します。

選択中のタブの見た目には、hs-tab-active:bg-primaryとhs-tab-active:text-primary-foregroundを使用します。これらのバリアントはPrelineのvariants.cssで定義されているため、読み込みを省くと、JavaScriptがクラスを正しく変更しても選択状態が見分けにくくなることがあります。アプリケーションは選択状態の変更を監視し、隣接する概要を更新します。

  1. Clay workshopを選択し、タイトル、素材、所要時間が正しいことを確認します。
  2. Participantsを2人から3人に増やし、見積もりが$54であることを確認します。
  3. プランを保存した後、タブを切り替えて以前の確認メッセージが消えることを確認します。

関連する仕様を確認する

Preline UIデザインシステム:プラグインのオプションと入力制約を一致させる

プラグインのオプションと入力制約を一致させる

数量入力のラッパーでは、data-hs-input-numberに最小値1、最大値6、増減幅1を設定します。ネイティブの数値入力にも同じ制約を設定します。これにより、プラグインのボタン操作とブラウザーの入力検証で許容範囲が一致し、ボタンのイベント処理にしか制約がなく、手入力で上限を超えられる状態を防ぎます。

概要の更新では、input、change、プラグインのchangeコールバックを監視します。手入力の値が無効な場合、合計をダッシュで表示して保存を無効にします。保存処理でも値を読み取る前にreportValidityを呼び出します。6人という上限はサンプルのプランニング上の制約であり、実際の空き状況を示すものではありません。

関連する仕様を確認する

Preline UIデザインシステム:古いラベルではなく選択中のパネルを基に計算する

古いラベルではなく、アクティブなパネルから計算する

各パネルには、変更されないセッション名、料金、所要時間をデータ属性として保存します。更新関数は表示中のパネルを読み取り、許容範囲内のグループ人数に料金を掛けます。これにより、Print studio、Clay workshop、Drawing walkは同じ仮のカードを表示するだけでなく、それぞれ異なる選択肢として機能します。

表示される見積もりに含まれるのは素材費のみです。元の説明文でその内訳を示し、このページから場所の予約はできないことも明記しています。金額の背後に、支払い、在庫確認、外部スケジュールとの連携はありません。実際の予約フローには、これらの個別システムとサーバー側の検証が必要です。

関連する仕様を確認する

Preline UIデザインシステム:このパッケージバージョンで公開されている手動エントリーポイントを使う

このパッケージのバージョンでエクスポートされた手動エントリーを使う

検証済みの4.2.0パッケージでは、preline/non-autoからHSTabsとHSInputNumberを名前付きエクスポートとして利用できます。この例では両方をインポートし、マークアップの生成後にそれぞれのautoInitメソッドを呼び出します。ここでのautoInitは名前に反して、暗黙的にページ全体の読み込み時に実行されるフックではなく、アプリケーションが明示的に呼び出すスキャン処理です。

検証時、プラグインごとの.mjsパスからはデフォルトクラスを取得できず、パッケージの副作用メタデータによって、それらのパスからの直接インポートが削除される場合がありました。公開されている手動エントリーポイントを使うことで、この具体的なビルド上の問題を解決しました。そのため、セットアップ例には、未検証の汎用的なプラグインインポートではなく、実際に動作するバージョン指定のインポートを示しています。

関連する仕様を確認する

Preline UIデザインシステム:プランが変更されたら確認メッセージを無効にする

プランが変更されたら確認メッセージを無効にする

「ローカルプランを保存」を押すと、セッション名、人数、材料費の合計を正確に含むステータス文が表示され、ボタンは無効になります。人数の変更または選択中のタブの変更時には update が呼び出され、通常の説明メッセージに戻るとともに、保存可能かどうかが再計算されます。以前に保存したステータス文が新しいプランに引き継がれることはありません。

ローカルテストでは「Clay workshop」を選択し、人数を3人に増やして、合計が$54と表示されることを確認しました。また、280pxで実際に描画されたページも検査しています。固定の合計金額や、ラベルだけが変わるボタンでは、2つのネイティブプラグインとアプリケーションの状態が連携していることを確認できません。

  • 正確なローカル結果を表示するステータス領域を使用します。
  • 無効な値が計算結果に含まれないようにします。
  • マークアップを変更する場合も、タブとパネルのIDを安定して維持します。

関連する仕様を確認する

Preline UI デザインシステム:テーマ、バリアント、実際のソースマークアップをコンパイルする

テーマ、バリエーション、実際のソースマークアップをコンパイルする

スタイルシートでは、最初にTailwind、次にPrelineのバリアントとパッケージに含まれるデフォルトテーマを読み込みます。ソースパスには、ローカルのHTML、アプリケーションのJavaScript、Prelineの配布ファイルを明示的に指定します。これにより、状態に応じて変化するユーティリティクラスを生成後のCSSで使用できます。これらのインポートの後に、元のレイアウト用スタイルシートを読み込みます。

単体プレビューでは、コンパイル済みのCSSとバンドル済みのJavaScriptをインライン化し、CDNへのリクエストは行いません。本番環境では、同じ出力を個別のファイルとして配信できます。実際のCSSエントリを基準とした相対パスを使用してください。以下の再現可能なサンプルでは、一時的なワークスペースに依存しないよう、すべてのソースファイルをプロジェクトのルートに配置しています。

関連する仕様を確認する

Preline UI デザインシステムのコンポーネント例

セマンティクスを備えたプランナーの完全なマークアップ

タブID、パネルとの関連付け、数値入力のフック、明示的なローカルステータス領域。

html
<main class="max-w-5xl mx-auto p-5 sm:p-8"><header><p class="text-xs font-semibold tracking-widest text-muted-foreground-1">STUDIO SATURDAY · SAMPLE PROGRAM</p><h1 class="text-3xl font-semibold tracking-tight mt-3">Choose a different kind of afternoon.</h1><p class="text-sm text-muted-foreground-1 leading-6 mt-3 max-w-2xl">Explore three creative sessions and calculate a sample materials budget for your group. This planner does not book a place.</p></header><div class="planner-grid mt-7"><section class="min-w-0"><nav class="flex flex-wrap gap-2 mb-5" role="tablist" aria-label="Creative sessions"><button type="button" id="tab-print" data-hs-tab="#panel-print" role="tab" aria-controls="panel-print" aria-selected="true" class="active hs-tab-active:bg-primary hs-tab-active:text-primary-foreground py-2 px-3 text-sm rounded-lg border border-border text-foreground hover:bg-layer-hover focus-visible:outline-2 focus-visible:outline-primary">Print studio</button><button type="button" id="tab-ceramics" data-hs-tab="#panel-ceramics" role="tab" aria-controls="panel-ceramics" aria-selected="false" class=" hs-tab-active:bg-primary hs-tab-active:text-primary-foreground py-2 px-3 text-sm rounded-lg border border-border text-foreground hover:bg-layer-hover focus-visible:outline-2 focus-visible:outline-primary">Clay workshop</button><button type="button" id="tab-drawing" data-hs-tab="#panel-drawing" role="tab" aria-controls="panel-drawing" aria-selected="false" class=" hs-tab-active:bg-primary hs-tab-active:text-primary-foreground py-2 px-3 text-sm rounded-lg border border-border text-foreground hover:bg-layer-hover focus-visible:outline-2 focus-visible:outline-primary">Drawing walk</button></nav><div id="panel-print" role="tabpanel" aria-labelledby="tab-print" class="" data-name="Print studio" data-price="12" data-duration="90 minutes"><div class="session-art print" aria-hidden="true"><i></i><b></b><span></span></div><div class="p-5 bg-card rounded-b-xl border border-card-line border-t-0"><p class="text-xs text-muted-foreground-1 font-medium">09:30–11:00 · 90 minutes</p><h2 class="text-2xl mt-3 font-semibold">Ink, paper, repeat.</h2><p class="text-sm leading-6 mt-3 text-muted-foreground-1">Make a two-color print from a simple cut-paper composition.</p><h3 class="text-sm font-semibold mt-5">Materials included in the estimate</h3><ul class="mt-3 space-y-2 text-sm"><li class="flex gap-2"><span aria-hidden="true">↗</span>Cobalt ink</li><li class="flex gap-2"><span aria-hidden="true">↗</span>Warm white stock</li><li class="flex gap-2"><span aria-hidden="true">↗</span>Registration guide</li></ul><p class="mt-5 text-sm font-medium">Sample materials allowance: $12 per person</p></div></div><div id="panel-ceramics" role="tabpanel" aria-labelledby="tab-ceramics" class="hidden" data-name="Clay workshop" data-price="18" data-duration="120 minutes"><div class="session-art ceramics" aria-hidden="true"><i></i><b></b><span></span></div><div class="p-5 bg-card rounded-b-xl border border-card-line border-t-0"><p class="text-xs text-muted-foreground-1 font-medium">13:00–15:00 · 120 minutes</p><h2 class="text-2xl mt-3 font-semibold">A shape held by hand.</h2><p class="text-sm leading-6 mt-3 text-muted-foreground-1">Build a small pinch vessel and explore three surface textures.</p><h3 class="text-sm font-semibold mt-5">Materials included in the estimate</h3><ul class="mt-3 space-y-2 text-sm"><li class="flex gap-2"><span aria-hidden="true">↗</span>Stoneware clay</li><li class="flex gap-2"><span aria-hidden="true">↗</span>Wooden modeling tool</li><li class="flex gap-2"><span aria-hidden="true">↗</span>Texture samples</li></ul><p class="mt-5 text-sm font-medium">Sample materials allowance: $18 per person</p></div></div><div id="panel-drawing" role="tabpanel" aria-labelledby="tab-drawing" class="hidden" data-name="Drawing walk" data-price="5" data-duration="60 minutes"><div class="session-art drawing" aria-hidden="true"><i></i><b></b><span></span></div><div class="p-5 bg-card rounded-b-xl border border-card-line border-t-0"><p class="text-xs text-muted-foreground-1 font-medium">16:00–17:00 · 60 minutes</p><h2 class="text-2xl mt-3 font-semibold">Notice the edges.</h2><p class="text-sm leading-6 mt-3 text-muted-foreground-1">Make a sequence of quick drawings along an original sample walking route.</p><h3 class="text-sm font-semibold mt-5">Materials included in the estimate</h3><ul class="mt-3 space-y-2 text-sm"><li class="flex gap-2"><span aria-hidden="true">↗</span>Pocket sketchbook</li><li class="flex gap-2"><span aria-hidden="true">↗</span>Soft graphite pencil</li><li class="flex gap-2"><span aria-hidden="true">↗</span>Portable drawing board</li></ul><p class="mt-5 text-sm font-medium">Sample materials allowance: $5 per person</p></div></div></section><aside class="bg-card border border-card-line rounded-xl p-5 self-start"><h2 class="text-lg font-semibold">Your group</h2><label for="people" class="block text-sm mt-5 mb-2">Participants</label><div id="quantity" data-hs-input-number='{"min":1,"max":6,"step":1}' class="flex items-center gap-3 border border-layer-line rounded-lg p-2 bg-layer"><button type="button" data-hs-input-number-decrement aria-label="Decrease participants" class="size-9 shrink-0 rounded-md border border-border disabled:opacity-40">−</button><input id="people" type="number" value="2" min="1" max="6" step="1" data-hs-input-number-input class="w-full min-w-0 text-center bg-transparent"/><button type="button" data-hs-input-number-increment aria-label="Increase participants" class="size-9 shrink-0 rounded-md border border-border disabled:opacity-40">+</button></div><p class="text-xs text-muted-foreground-1 mt-2">1–6 participants · sample planning limit</p><dl class="mt-6 space-y-3 text-sm"><div><dt class="text-muted-foreground-1">Selected session</dt><dd id="selected-name" class="font-semibold mt-1"></dd></div><div><dt class="text-muted-foreground-1">Duration</dt><dd id="selected-duration" class="font-semibold mt-1"></dd></div><div class="pt-4 border-t border-border"><dt class="text-muted-foreground-1">Materials estimate</dt><dd id="total" class="text-3xl font-semibold mt-1"></dd></div></dl><button id="save" class="mt-6 w-full py-3 px-4 bg-primary text-primary-foreground rounded-lg font-medium text-sm hover:bg-primary-hover disabled:opacity-50" type="button">Save local plan</button><p id="feedback" role="status" class="text-xs leading-5 mt-3 text-muted-foreground-1">No booking or payment is created.</p></aside></div></main>

コードリファレンス

  • 3つのセッションと料金は、オリジナルのサンプルデータです。
  • ネイティブ入力にもプラグインと同じ制約を設定します。

プラグインの初期化と計算の全体

エクスポートされた自動初期化なしのエントリから手動で初期化します。選択内容と人数を使って、要約を1つにまとめて計算します。

JavaScript
import {HSTabs,HSInputNumber} from 'preline/non-auto';
HSTabs.autoInit();HSInputNumber.autoInit();
const quantity=document.querySelector('#people'),save=document.querySelector('#save'),feedback=document.querySelector('#feedback');
function selected(){return document.querySelector('[role=tabpanel]:not(.hidden)')}
function update(){const panel=selected(),count=Number(quantity.value);document.querySelector('#selected-name').textContent=panel.dataset.name;document.querySelector('#selected-duration').textContent=panel.dataset.duration;document.querySelector('#total').textContent=quantity.checkValidity()&&count>=1?'$'+count*Number(panel.dataset.price):'—';save.disabled=!quantity.checkValidity()||count<1;feedback.textContent='No booking or payment is created.'}
document.querySelectorAll('[data-hs-tab]').forEach(button=>button.addEventListener('click',()=>queueMicrotask(update)));
new MutationObserver(update).observe(document.querySelector('nav'),{subtree:true,attributes:true,attributeFilter:['aria-selected']});
quantity.addEventListener('input',update);quantity.addEventListener('change',update);
const instance=HSInputNumber.getInstance('#quantity');instance.on('change',update);
save.addEventListener('click',()=>{if(!quantity.reportValidity())return;const panel=selected();feedback.textContent=`Saved locally: ${panel.dataset.name}, ${quantity.value} people, $${Number(quantity.value)*Number(panel.dataset.price)} materials estimate.`;save.disabled=true});update();

コードリファレンス

  • preline/non-auto の名前付きエクスポートを使用します。
  • バージョン付きプラグインのサブパスにある .mjs ファイルは、デフォルトクラスをエクスポートしません。
  • 入力変更イベントとプラグインの変更コールバックの両方から、要約を更新します。

オリジナルのレスポンシブなレイアウト全体

ネイティブのタブと数値入力プラグインを囲む、版画、陶芸、ドローイングをモチーフにした装飾イラスト。

CSS
html,body{margin:0;height:auto;min-height:0}body{background:#f7f8fb;font-family:ui-sans-serif,system-ui,sans-serif;color:var(--foreground)}button{cursor:pointer}button:disabled{cursor:default}.planner-grid{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:24px}.session-art{height:200px;position:relative;overflow:hidden;border-radius:12px 12px 0 0}.session-art i,.session-art b,.session-art span{display:block;position:absolute}.print{background:#e2e9f4}.print i{width:160px;height:140px;left:15%;top:45px;background:#2456a7;transform:rotate(-13deg)}.print b{width:150px;height:150px;right:14%;top:30px;background:#f0a979;border-radius:50%;mix-blend-mode:multiply}.print span{width:180px;height:8px;left:20%;top:160px;background:#f9f8ef;transform:rotate(-13deg)}.ceramics{background:#e8d9c8}.ceramics i{width:150px;height:100px;left:25%;top:65px;border-radius:15% 15% 50% 50%;background:#a87862}.ceramics b{width:150px;height:32px;border-radius:50%;left:25%;top:53px;background:#704a3d;box-shadow:inset 0 0 0 10px #bd8f78}.ceramics span{width:150px;height:12px;left:25%;top:171px;background:#c7b39e;border-radius:50%}.drawing{background:#e2e8de}.drawing i{width:160px;height:145px;left:23%;top:25px;background:#fffdf4;transform:rotate(8deg);border:1px solid #d6d8cb}.drawing b{height:90px;width:80px;left:33%;top:49px;border:2px solid #4d655b;transform:rotate(-18deg);border-radius:50% 50% 10% 10%}.drawing span{width:130px;height:7px;background:#ad754c;left:45%;top:145px;transform:rotate(-33deg)}@media(max-width:760px){.planner-grid{grid-template-columns:minmax(0,1fr)}.session-art{height:170px}}@media(max-width:360px){main{padding:14px!important}.session-art i,.session-art b,.session-art span{transform:scale(.8)}.session-art{height:150px}h1{font-size:26px!important}}

コードリファレンス

  • イラストはオリジナルのCSSで、aria-hidden に設定されています。
  • このスタイルシートはTailwindとPrelineのインポートの後に読み込みます。
04

Preline UI デザインシステムのエージェント設定

実装の出発点

Preline 4.2.0のネイティブ実装を確認済みです。マークアップ、ロジック、CSSの全体を上記に示しています。input.cssのソースパスは、4つのソースファイルすべてがプロジェクトのルートにあることを前提としています。

bash
# Create an empty directory and run:
npm init -y
npm install [email protected] [email protected] @tailwindcss/[email protected] esbuild
# Save the complete examples above as body.html, app.js and style.css.
# Create input.css with exactly:
# @import "tailwindcss" source(none);
# @import "./node_modules/preline/variants.css";
# @import "./node_modules/preline/css/themes/theme.css";
# @source "./body.html";
# @source "./app.js";
# @source "./node_modules/preline/dist/*.js";
# @import "./style.css";
npx @tailwindcss/cli -i input.css -o bundle.css --minify
npx esbuild app.js --bundle --format=iife --outfile=bundle.js
# Assemble the actual root document without placeholder markup:
node -e 'const f=require("fs");f.writeFileSync("index.html",`<!doctype html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Studio planner</title><link rel="stylesheet" href="bundle.css"></head><body>${f.readFileSync("body.html","utf8")}<script src="bundle.js"></script></body></html>`)'
# Serve this directory with your existing static server.

あなたのプロジェクト向けプロンプト

AI エージェント用プロンプト
Preline 4.2.0を使用し、preline/non-auto からHSTabsとHSInputNumberを名前付きインポートして、両方のプラグインを明示的に初期化してください。Studio Saturdayの3つのワークショップ、人数の範囲(1~6人)、選択したワークショップの材料費を維持します。選択中のパネルと人数から合計を算出し、どちらかが変更されたら保存済みプランを無効にしてください。また、ローカルに保存する前に人数が数値の範囲内であることを検証します。指定されたTailwindのテーマとバリアントの設定、およびオリジナルのレイアウトも含めてください。ローカルのスタジオプランを予約や支払いの確認に変えてはいけません。
05

Preline UI デザインシステムのソースと対象範囲

npm版Preline 4.2.0とTailwind CSS 4.3.3を使用。セッションの説明、イラスト、架空の材料費はオリジナルです。保存されるのはページ内のローカル状態のみで、予約、支払い、外部へのメッセージ送信は発生しません。