{"id":49085649,"url":"https://github.com/takapi327/melt","last_synced_at":"2026-04-20T15:30:54.629Z","repository":{"id":349790747,"uuid":"1201834960","full_name":"takapi327/melt","owner":"takapi327","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-14T15:35:46.000Z","size":852,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-04-14T17:25:21.233Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/takapi327.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-05T08:23:02.000Z","updated_at":"2026-04-14T11:19:29.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/takapi327/melt","commit_stats":null,"previous_names":["takapi327/melt"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/takapi327/melt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takapi327%2Fmelt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takapi327%2Fmelt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takapi327%2Fmelt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takapi327%2Fmelt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/takapi327","download_url":"https://codeload.github.com/takapi327/melt/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takapi327%2Fmelt/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32053158,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-20T11:35:06.609Z","status":"ssl_error","status_checked_at":"2026-04-20T11:34:48.899Z","response_time":94,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-20T15:30:53.980Z","updated_at":"2026-04-20T15:30:54.616Z","avatar_url":"https://github.com/takapi327.png","language":"Scala","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Melt\n\n\u003e Scala を溶かして JS にするコンパイラ\n\nMelt は Scala.js 向けのシングルファイルコンポーネント（SFC）フレームワークです。Svelte にインスパイアされた `.melt` ファイルに Scala・HTML・CSS を1ファイルで記述し、コンパイラが素の DOM 操作コードへ変換します。\n\n```html\n\u003c!-- Counter.melt --\u003e\n\u003cscript lang=\"scala\"\u003e\n  val count = Var(0)\n\u003c/script\u003e\n\n\u003cdiv\u003e\n  \u003cbutton onclick={_ =\u003e count += 1}\u003eCount: {count}\u003c/button\u003e\n\u003c/div\u003e\n\n\u003cstyle\u003e\nbutton { font-size: 1.5rem; cursor: pointer; }\n\u003c/style\u003e\n```\n\n## コンセプト\n\n- **コンパイラがフレームワーク** — Svelte と同様、ランタイムフレームワーク不要。コンパイラが DOM 操作コードを直接生成\n- **Scala の型システムを完全保持** — テンプレート内の式も含め、型チェックはすべて scalac が行う\n- **ランタイムは最小限** — `Var` / `Signal` / `Bind` を提供する小さなランタイムのみ\n- **SSR 対応** — 同じ `.melt` ファイルを JVM 側で HTML 文字列として出力可能（`CompileMode.SSR`）\n\n## Status\n\n| フェーズ | 内容 | 状態 |\n|---------|------|------|\n| Phase 0 | モノレポスケルトン | ✅ 完了 |\n| Phase 1 | `melt-runtime` コア（`Var` / `Signal`） | ✅ 完了 |\n| Phase 2 | `meltc` パーサー | ✅ 完了 |\n| Phase 3 | コード生成 + sbt プラグイン | ✅ 完了 |\n| Phase 4 | リアクティブバインディング | ✅ 完了 |\n| Phase 5 | コンポーネントシステム + CSS スコーピング | ✅ 完了 |\n| Phase 6 | テンプレート完全対応 | ✅ 完了 |\n| Phase 7 | ライフサイクル \u0026 状態管理 | ✅ 完了 |\n| Phase 8 | 高度な機能 | ✅ 完了 |\n| Phase 9 | トランジション \u0026 アニメーション | ✅ 完了 |\n| Phase 10 | テストキット（`melt-testkit`） | 🚧 開発中 |\n| Phase 11 | IDE サポート / LSP | 🚧 開発中 |\n| Phase 12+ | フォームライブラリ・ドキュメント・リリース | 📋 予定 |\n\n---\n\n## モジュール構成\n\n| モジュール | 説明 | プラットフォーム |\n|-----------|------|----------------|\n| `meltc` | `.melt` → `.scala` コンパイラ | JVM / JS / Native |\n| `sbt-meltc` | sbt プラグイン（`.melt` 自動コンパイル） | JVM (Scala 2.12) |\n| `melt-runtime` | リアクティブランタイム（`Var` / `Signal` / `Bind`） | JVM / JS |\n| `melt-testkit` | コンポーネントテストユーティリティ | JS |\n| `melt-language-server` | LSP サーバー（IDE 統合） | JVM |\n\n---\n\n## `.melt` ファイル構文\n\n`.melt` ファイルは 3 つのセクションで構成されます。\n\n```html\n\u003cscript lang=\"scala\" props=\"Props\"\u003e\n  case class Props(title: String = \"Hello\", count: Var[Int])\n  val doubled = count.map(_ * 2)\n\u003c/script\u003e\n\n\u003cdiv\u003e\n  \u003ch1\u003e{title}\u003c/h1\u003e\n  \u003cp\u003eCount: {count} / Doubled: {doubled}\u003c/p\u003e\n  \u003cbutton onclick={_ =\u003e count += 1}\u003e+1\u003c/button\u003e\n\u003c/div\u003e\n\n\u003cstyle\u003e\n  h1 { color: #ff3e00; }\n\u003c/style\u003e\n```\n\n### テンプレート構文\n\n#### 式展開\n\n```html\n\u003cp\u003e{message}\u003c/p\u003e\n\u003cp\u003e{count * 2}\u003c/p\u003e\n\u003cp\u003e{if isActive then \"active\" else \"inactive\"}\u003c/p\u003e\n```\n\n#### 生 HTML の挿入（XSS 注意）\n\n`TrustedHtml.unsafe` でマークした文字列のみ raw HTML として挿入できます。コメントアンカー方式で挿入されるため、ラッパー要素は生成されません。\n\n```html\n\u003c!-- 静的 --\u003e\n\u003cdiv\u003e{TrustedHtml.unsafe(\"\u003cstrong\u003eBold\u003c/strong\u003e\")}\u003c/div\u003e\n\n\u003c!-- リアクティブ（if/else で切り替え） --\u003e\n\u003cdiv\u003e{if show then TrustedHtml.unsafe(\"\u003cb\u003eyes\u003c/b\u003e\") else TrustedHtml.unsafe(\"\u003cem\u003eno\u003c/em\u003e\")}\u003c/div\u003e\n```\n\n#### イベントハンドラー\n\n```html\n\u003cbutton onclick={_ =\u003e count += 1}\u003e+1\u003c/button\u003e\n\u003cinput onchange={e =\u003e name.set(e.target.value)} /\u003e\n\u003c!-- on: ディレクティブ（修飾子付き） --\u003e\n\u003cform on:submit|preventDefault={_ =\u003e handleSubmit()}\u003e...\u003c/form\u003e\n```\n\n#### データバインディング\n\n```html\n\u003c!-- テキスト入力 --\u003e\n\u003cinput bind:value={name} /\u003e\n\u003cinput bind:value-int={age} /\u003e\n\u003cinput bind:value-double={price} /\u003e\n\n\u003c!-- チェックボックス --\u003e\n\u003cinput type=\"checkbox\" bind:checked={enabled} /\u003e\n\n\u003c!-- ラジオ / チェックボックスグループ --\u003e\n\u003cinput type=\"radio\"    value=\"a\" bind:group={selected} /\u003e\n\u003cinput type=\"checkbox\" value=\"x\" bind:group={selectedItems} /\u003e\n\n\u003c!-- セレクトボックス --\u003e\n\u003cselect bind:value={selectedOption}\u003e\n  \u003coption value=\"a\"\u003eA\u003c/option\u003e\n  \u003coption value=\"b\"\u003eB\u003c/option\u003e\n\u003c/select\u003e\n\n\u003c!-- textarea --\u003e\n\u003ctextarea bind:value={content}\u003e\u003c/textarea\u003e\n\n\u003c!-- 要素参照 --\u003e\n\u003ccanvas bind:this={canvasRef}\u003e\u003c/canvas\u003e\n\n\u003c!-- innerHTML / textContent --\u003e\n\u003cdiv bind:innerHTML={trustedHtml}\u003e\u003c/div\u003e\n\u003cdiv bind:textContent={text}\u003e\u003c/div\u003e\n\n\u003c!-- 要素寸法 --\u003e\n\u003cdiv bind:clientWidth={w} bind:clientHeight={h}\u003e\u003c/div\u003e\n\n\u003c!-- メディア --\u003e\n\u003cvideo bind:currentTime={t} bind:paused={paused} bind:volume={vol} src=\"...\"\u003e\u003c/video\u003e\n```\n\n#### クラス・スタイルディレクティブ\n\n```html\n\u003cdiv class:active={isActive} class:disabled={!isEnabled}\u003e...\u003c/div\u003e\n\u003cp style:color={textColor} style:font-size=\"{fontSize}px\"\u003e...\u003c/p\u003e\n\u003cdiv {...attrs}\u003e\u003c/div\u003e\n```\n\n#### スニペット（コンテンツ投影）\n\n親コンポーネントでスニペットを定義し、子コンポーネントへ渡せます。\n\n```html\n\u003c!-- 親コンポーネント --\u003e\n\u003cList items={todos}\u003e\n  {#snippet renderItem(item: Todo)}\n    \u003cinput type=\"checkbox\" bind:checked={item.done} /\u003e\n    \u003cspan\u003e{item.text}\u003c/span\u003e\n  {/snippet}\n\u003c/List\u003e\n\n\u003c!-- 子コンポーネント（List.melt） --\u003e\n\u003cscript lang=\"scala\" props=\"Props\"\u003e\ncase class Props(items: Var[List[Todo]], renderItem: Snippet[Todo])\n\u003c/script\u003e\n\n\u003cul\u003e\n  {props.items.map((item: Todo) =\u003e\n    \u003cli\u003e{@render props.renderItem(item)}\u003c/li\u003e\n  )}\n\u003c/ul\u003e\n```\n\n#### トランジション・アニメーション\n\n```html\n\u003cdiv transition:fade\u003e...\u003c/div\u003e\n\u003cdiv transition:fly=\"{{x: 200, duration: 300}}\"\u003e...\u003c/div\u003e\n\u003cdiv in:slide out:fade\u003e...\u003c/div\u003e\n\u003cdiv animate:flip=\"{{duration: 200}}\"\u003e...\u003c/div\u003e\n```\n\n利用可能なトランジション: `fade`, `slide`, `fly`, `scale`, `blur`, `draw`, `crossfade`\n\nイージング関数（31種）: `linear`, `cubicIn/Out/InOut`, `quadIn/Out/InOut`, `quartIn/Out/InOut`, `quintIn/Out/InOut`, `sineIn/Out/InOut`, `backIn/Out/InOut`, `elasticIn/Out/InOut`, `bounceIn/Out/InOut`, `circIn/Out/InOut`, `expoIn/Out/InOut`\n\n#### アクション\n\n```html\n\u003cbutton use:tooltip=\"{{text: 'Click me'}}\"\u003e...\u003c/button\u003e\n\u003cinput use:autoFocus /\u003e\n\u003cdiv use:clickOutside={handler}\u003e...\u003c/div\u003e\n```\n\n#### 特殊要素\n\n```html\n\u003c!-- \u003chead\u003e コンテンツ --\u003e\n\u003cmelt:head\u003e\n  \u003ctitle\u003e{pageTitle}\u003c/title\u003e\n  \u003cmeta name=\"description\" content={description} /\u003e\n\u003c/melt:head\u003e\n\n\u003c!-- ウィンドウイベント・バインディング --\u003e\n\u003cmelt:window\n  on:keydown={handleKeydown}\n  bind:innerWidth={width}\n  bind:scrollY={scrollY}\n/\u003e\n\n\u003c!-- body クラス・スタイル --\u003e\n\u003cmelt:body class:dark-mode={isDarkMode} /\u003e\n\n\u003c!-- document タイトル・lang --\u003e\n\u003cmelt:document bind:visibilityState={visibility} /\u003e\n\n\u003c!-- 動的タグ --\u003e\n\u003cmelt:element this={tagName} class=\"wrapper\"\u003e...\u003c/melt:element\u003e\n\n\u003c!-- 強制再マウント --\u003e\n\u003cmelt:key this={id}\u003e\n  \u003cComponent /\u003e\n\u003c/melt:key\u003e\n\n\u003c!-- Error Boundary --\u003e\n\u003cmelt:boundary\u003e\n  \u003cAsyncComponent /\u003e\n  {#pending}\n    \u003cp\u003eLoading…\u003c/p\u003e\n  {/pending}\n  {#failed error}\n    \u003cp\u003eError: {error.getMessage()}\u003c/p\u003e\n  {/failed}\n\u003c/melt:boundary\u003e\n```\n\n#### ジェネリックコンポーネント\n\n```html\n\u003cscript lang=\"scala\" props=\"Props[T]\"\u003e\ncase class Props[T](items: Var[List[T]], render: Snippet[T])\n\u003c/script\u003e\n```\n\n---\n\n## Runtime API\n\n### リアクティブプリミティブ\n\n#### `Var[A]` — ミュータブルなリアクティブ変数\n\n```scala\nval count = Var(0)\n\n// 読み取り\nval current: Int = count.value  // または count.now()\n\n// 更新\ncount.set(5)\ncount.update(_ + 1)\n\n// 算術拡張メソッド\ncount += 1   // Int / Long / Double / String\ncount -= 1\ncount *= 2\n\n// コレクション拡張（Var[List[A]]）\nitems.append(newItem)\nitems.prepend(first)\nitems.removeWhere(_.id == id)\nitems.removeAt(0)\nitems.updateWhere(_.id == id)(_.copy(done = true))\nitems.clear()\nitems.sortBy(_.name)\n\n// 派生\nval doubled: Signal[Int] = count.map(_ * 2)\n\n// 購読\nval unsubscribe = count.subscribe(n =\u003e println(s\"Changed to: $n\"))\nunsubscribe()\n```\n\n#### `Signal[A]` — 読み取り専用のリアクティブ値\n\n```scala\nval doubled: Signal[Int] = count.map(_ * 2)\nval frozen: Signal[Int]  = Signal.pure(42)\n\ndoubled.value\ndoubled.subscribe(n =\u003e println(n))\n```\n\n### エフェクト・メモ化\n\n```scala\n// エフェクト（依存値変化時に実行）\neffect(count) { n =\u003e\n  dom.document.title = s\"Count: $n\"\n}\n\n// 2変数\neffect(a, b) { (va, vb) =\u003e ... }\n\n// レイアウトエフェクト（DOM 更新前に実行）\nlayoutEffect(count) { n =\u003e\n  el.getBoundingClientRect().height\n}\n\n// メモ化（依存値が変化したときのみ再計算）\nval isEven = memo(count)(_ % 2 == 0)\n```\n\n### ライフサイクル\n\n```scala\nonMount { () =\u003e\n  fetchData()\n  () =\u003e cleanup()  // アンマウント時のクリーンアップを返せる\n}\n\nonCleanup { () =\u003e\n  subscription.cancel()\n}\n\n// 次の DOM 更新を待つ\ntick().foreach { _ =\u003e ... }\n```\n\n### コンテキスト API\n\n```scala\nval ThemeCtx = Context.create(\"light\")\n\n// 提供側\nThemeCtx.provide(\"dark\")\n\n// 消費側\nval theme = ThemeCtx.inject()  // \"dark\"\n```\n\n### バッチ更新\n\n```scala\nbatch {\n  firstName.set(\"John\")\n  lastName.set(\"Doe\")\n  // DOM 更新は1回にまとめられる\n}\n```\n\n### Tween / Spring\n\n```scala\nval pos   = Tween(0.0, TweenOptions(duration = 400, easing = Easing.cubicOut))\nval scale = Spring(1.0, SpringOptions(stiffness = 0.1, damping = 0.25))\n\npos.set(100.0)    // アニメーション付きで更新\nscale.set(1.5)\n```\n\n### セキュリティユーティリティ\n\n```scala\n// HTML エスケープ\nEscape.html(\"\u003cscript\u003ealert(1)\u003c/script\u003e\")  // \"\u0026lt;script\u0026gt;...\"\n\n// 属性エスケープ\nEscape.attr(userInput)\n\n// URL 検証（javascript:, vbscript:, file: をブロック）\nEscape.url(hrefValue)\n\n// CSS 値エスケープ\nEscape.cssValue(styleValue)\n\n// 信頼済み HTML（エスケープをバイパス）\nval safe = TrustedHtml.unsafe(\"\u003cstrong\u003evalidated\u003c/strong\u003e\")\n```\n\n---\n\n## セキュリティ機能\n\nコンパイル時・ランタイムの2段階でセキュリティを担保します。\n\n### コンパイル時チェック（`SecurityChecker`）\n\n| パターン | 種別 | 説明 |\n|---------|------|------|\n| `\u003ciframe srcdoc={...}\u003e` | **エラー**（コンパイル失敗） | 任意 HTML の XSS 防止 |\n| `\u003ciframe src={...}\u003e` | 警告 | URL バリデーション推奨 |\n| `\u003cobject data={...}\u003e` / `\u003cembed src={...}\u003e` | 警告 | プラグイン実行リスク |\n| `\u003cform action={...}\u003e` | 警告 | 動的フォームターゲット |\n| `\u003cbutton formaction={...}\u003e` | 警告 | 動的フォームターゲット |\n| `\u003cmeta http-equiv=\"refresh\" content={...}\u003e` | 警告 | オープンリダイレクト |\n| `\u003ca target=\"_blank\"\u003e` without `rel=\"noopener\"` | 警告 | タブナッビング |\n\n### ランタイムエスケープ\n\n- `Escape.html` — `\u0026`, `\u003c`, `\u003e` をエスケープ\n- `Escape.attr` — `\u0026`, `\u003c`, `\u003e`, `\"`, `\\n`, `\\r`, `\\t` をエスケープ\n- `Escape.url` — `javascript:`, `vbscript:`, `file:` をブロック。`data:` URL は `data:image/*`（SVG 除く）のみ許可\n- `Escape.cssValue` — `expression(`, `@import`, `javascript:` 等をブロック\n\n---\n\n## 使い方\n\n### 1. sbt セットアップ\n\n```scala\n// project/plugins.sbt\naddSbtPlugin(\"io.github.takapi327\" % \"sbt-meltc\" % \"0.1.0-SNAPSHOT\")\n\n// build.sbt\nenablePlugins(ScalaJSPlugin, MeltcPlugin)\n\nscalaVersion := \"3.3.7\"\n\nlibraryDependencies += \"io.github.takapi327\" %%% \"melt-runtime\" % \"0.1.0-SNAPSHOT\"\n\nmeltcPackage   := \"components\"  // 生成コードのパッケージ\nmeltcHydration := false         // SSR+Hydration を使う場合は true\n```\n\n### 2. コンポーネント作成\n\n```\nsrc/main/scala/components/App.melt\nsrc/main/scala/components/Counter.melt\nsrc/main/scala/components/TodoList.melt\n```\n\n### 3. エントリーポイント\n\n```scala\n// Main.scala\nimport org.scalajs.dom\n\nobject Main:\n  def main(args: Array[String]): Unit =\n    val root = dom.document.getElementById(\"app\")\n    components.App.mount(root)\n```\n\n### 4. ビルド\n\n```bash\nsbt fastLinkJS   # 開発用（ウォッチモード: sbt ~fastLinkJS）\nsbt fullLinkJS   # 本番用\n```\n\n### SSR（サーバーサイドレンダリング）\n\n```scala\n// build.sbt — JVM ターゲット側で\nlibraryDependencies += \"io.github.takapi327\" %% \"melt-runtime\" % \"0.1.0-SNAPSHOT\"\n\nmeltcMode := \"ssr\"\n```\n\n```scala\n// サーバー側（http4s など）\nimport components.Home\n\nval html = Home(Home.Props(userName = \"Alice\", count = 42))\nOk(html.body)\n```\n\n---\n\n## サンプル\n\n| サンプル | 説明 |\n|---------|------|\n| [hello-world](examples/hello-world) | 最小構成 |\n| [counter](examples/counter) | リアクティブ状態・双方向バインディング・コンテキスト |\n| [todo-app](examples/todo-app) | コンポーネント合成・スニペット・リスト操作 |\n| [transitions](examples/transitions) | トランジション・アニメーション・FLIP |\n| [special-elements](examples/special-elements) | `melt:head` / `melt:window` / `melt:body` / `melt:element` / `melt:key` |\n| [boundary](examples/boundary) | Error Boundary・非同期レンダリング |\n| [layout-effect](examples/layout-effect) | DOM 計測・レイアウトエフェクト |\n| [reactive-scope](examples/reactive-scope) | リソース管理パターン |\n| [dynamic-element](examples/dynamic-element) | 動的タグ名 |\n| [media-binding](examples/media-binding) | メディア要素バインディング |\n| [dimension-binding](examples/dimension-binding) | 要素寸法バインディング |\n| [select-textarea-bind](examples/select-textarea-bind) | セレクト・テキストエリアバインディング |\n| [trusted-html](examples/trusted-html) | 生 HTML 挿入（`TrustedHtml`） |\n| [http4s-spa](examples/http4s-spa) | SPA + API（http4s） |\n| [http4s-ssr](examples/http4s-ssr) | SSR + Hydration + API（http4s） |\n\n---\n\n## 開発\n\n```bash\n# コンパイル\nsbt compile\n\n# テスト（全プラットフォーム）\nsbt test\n\n# JVM のみ\nsbt meltcJVM/test runtimeJVM/test\n\n# コードフォーマット\nsbt scalafmtAll\n\n# ヘッダーチェック\nsbt headerCheckAll\n```\n\n### Scala バージョン\n\n| Scala | 用途 |\n|-------|------|\n| 3.3.7 | メイン（LTS） |\n| 3.8.3 | 追加テスト |\n| 2.12.21 | `sbt-meltc` プラグインのみ |\n\n### Java バージョン\n\nJava 17 / 21 / 25（Corretto）で CI テストを実施しています。\n\n---\n\n## ライセンス\n\nApache 2.0 — 詳細は [LICENSE](LICENSE) を参照してください。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftakapi327%2Fmelt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftakapi327%2Fmelt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftakapi327%2Fmelt/lists"}