From b1089b45ba940cff83a24f9d1605e4cc76434b8b Mon Sep 17 00:00:00 2001 From: Seokju Na Date: Sun, 14 Jun 2026 18:32:18 +0900 Subject: [PATCH 1/3] init demo webview --- .github/actions/node-setup/action.yaml | 21 + .github/workflows/ci.yaml | 31 + .gitignore | 10 + .yarnrc.yml | 16 + biome.json | 66 + mise.toml | 2 + package.json | 15 +- tsconfig.json | 19 + webviews/hacker-news/design/.thumbnail | Bin 0 -> 9024 bytes webviews/hacker-news/design/BundleApp.dc.html | 598 ++++++ .../hacker-news/design/Community Demo.dc.html | 112 ++ .../README.md | 173 ++ .../_adherence.oxlintrc.json | 216 ++ .../_ds_bundle.js | 11 + .../_ds_manifest.json | 513 +++++ .../colors_and_type.css | 219 +++ .../hacker-news/design/assets/logo-symbol.svg | 23 + .../design/screenshots/demo-full.png | Bin 0 -> 36982 bytes .../hacker-news/design/screenshots/detail.png | Bin 0 -> 37782 bytes .../hacker-news/design/screenshots/mobile.png | Bin 0 -> 36249 bytes .../design/screenshots/mobile2.png | Bin 0 -> 22451 bytes .../design/screenshots/native-statusbar.png | Bin 0 -> 42959 bytes webviews/hacker-news/design/support.js | 1466 ++++++++++++++ webviews/hacker-news/index.html | 19 + webviews/hacker-news/package.json | 32 + webviews/hacker-news/scripts/prerender.mjs | 37 + .../src/components/CommentTree.tsx | 99 + .../hacker-news/src/components/Composer.tsx | 44 + .../hacker-news/src/components/Header.tsx | 118 ++ .../src/components/LeftSidebar.tsx | 61 + .../hacker-news/src/components/MobileNav.tsx | 45 + .../hacker-news/src/components/PostRow.tsx | 105 + .../hacker-news/src/components/RightRail.tsx | 69 + .../hacker-news/src/components/StatusBar.tsx | 15 + .../hacker-news/src/components/TagBadge.tsx | 19 + .../hacker-news/src/components/VoteColumn.tsx | 54 + webviews/hacker-news/src/data/comments.ts | 80 + webviews/hacker-news/src/data/index.ts | 154 ++ webviews/hacker-news/src/data/posts.ts | 134 ++ webviews/hacker-news/src/data/types.ts | 37 + webviews/hacker-news/src/data/users.ts | 39 + webviews/hacker-news/src/entry-server.tsx | 30 + webviews/hacker-news/src/lib/cn.ts | 4 + webviews/hacker-news/src/lib/store.tsx | 92 + webviews/hacker-news/src/main.tsx | 28 + webviews/hacker-news/src/routeTree.gen.ts | 95 + webviews/hacker-news/src/router.tsx | 28 + webviews/hacker-news/src/routes/__root.tsx | 39 + webviews/hacker-news/src/routes/index.tsx | 166 ++ .../hacker-news/src/routes/post.$postId.tsx | 99 + .../hacker-news/src/routes/u.$username.tsx | 140 ++ webviews/hacker-news/src/styles.css | 128 ++ webviews/hacker-news/src/vite-env.d.ts | 4 + webviews/hacker-news/tsconfig.json | 9 + webviews/hacker-news/vite.config.ts | 14 + yarn.lock | 1734 +++++++++++++++++ 56 files changed, 7281 insertions(+), 1 deletion(-) create mode 100644 .github/actions/node-setup/action.yaml create mode 100644 .github/workflows/ci.yaml create mode 100644 .yarnrc.yml create mode 100644 biome.json create mode 100644 mise.toml create mode 100644 tsconfig.json create mode 100755 webviews/hacker-news/design/.thumbnail create mode 100755 webviews/hacker-news/design/BundleApp.dc.html create mode 100755 webviews/hacker-news/design/Community Demo.dc.html create mode 100755 webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/README.md create mode 100755 webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_adherence.oxlintrc.json create mode 100755 webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_ds_bundle.js create mode 100755 webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_ds_manifest.json create mode 100755 webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/colors_and_type.css create mode 100755 webviews/hacker-news/design/assets/logo-symbol.svg create mode 100755 webviews/hacker-news/design/screenshots/demo-full.png create mode 100755 webviews/hacker-news/design/screenshots/detail.png create mode 100755 webviews/hacker-news/design/screenshots/mobile.png create mode 100755 webviews/hacker-news/design/screenshots/mobile2.png create mode 100755 webviews/hacker-news/design/screenshots/native-statusbar.png create mode 100755 webviews/hacker-news/design/support.js create mode 100644 webviews/hacker-news/index.html create mode 100644 webviews/hacker-news/package.json create mode 100644 webviews/hacker-news/scripts/prerender.mjs create mode 100644 webviews/hacker-news/src/components/CommentTree.tsx create mode 100644 webviews/hacker-news/src/components/Composer.tsx create mode 100644 webviews/hacker-news/src/components/Header.tsx create mode 100644 webviews/hacker-news/src/components/LeftSidebar.tsx create mode 100644 webviews/hacker-news/src/components/MobileNav.tsx create mode 100644 webviews/hacker-news/src/components/PostRow.tsx create mode 100644 webviews/hacker-news/src/components/RightRail.tsx create mode 100644 webviews/hacker-news/src/components/StatusBar.tsx create mode 100644 webviews/hacker-news/src/components/TagBadge.tsx create mode 100644 webviews/hacker-news/src/components/VoteColumn.tsx create mode 100644 webviews/hacker-news/src/data/comments.ts create mode 100644 webviews/hacker-news/src/data/index.ts create mode 100644 webviews/hacker-news/src/data/posts.ts create mode 100644 webviews/hacker-news/src/data/types.ts create mode 100644 webviews/hacker-news/src/data/users.ts create mode 100644 webviews/hacker-news/src/entry-server.tsx create mode 100644 webviews/hacker-news/src/lib/cn.ts create mode 100644 webviews/hacker-news/src/lib/store.tsx create mode 100644 webviews/hacker-news/src/main.tsx create mode 100644 webviews/hacker-news/src/routeTree.gen.ts create mode 100644 webviews/hacker-news/src/router.tsx create mode 100644 webviews/hacker-news/src/routes/__root.tsx create mode 100644 webviews/hacker-news/src/routes/index.tsx create mode 100644 webviews/hacker-news/src/routes/post.$postId.tsx create mode 100644 webviews/hacker-news/src/routes/u.$username.tsx create mode 100644 webviews/hacker-news/src/styles.css create mode 100644 webviews/hacker-news/src/vite-env.d.ts create mode 100644 webviews/hacker-news/tsconfig.json create mode 100644 webviews/hacker-news/vite.config.ts create mode 100644 yarn.lock diff --git a/.github/actions/node-setup/action.yaml b/.github/actions/node-setup/action.yaml new file mode 100644 index 0000000..02797c9 --- /dev/null +++ b/.github/actions/node-setup/action.yaml @@ -0,0 +1,21 @@ +name: "node setup" +description: "node setup" +runs: + using: "composite" + steps: + - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # 4.0.1 + with: + install_args: "node" + - run: | + corepack enable + corepack prepare --activate + shell: bash + - id: yarn-cache-dir + run: echo "YARN_CACHE_DIR=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT + shell: bash + - uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # 5.0.3 + with: + path: ${{ steps.yarn-cache-dir.outputs.YARN_CACHE_DIR }} + key: ${{ runner.os }}-node-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-node-yarn- diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..9e0139f --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,31 @@ +name: ci +on: + pull_request: +concurrency: + group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: true +jobs: + check: + runs-on: ubuntu-latest + if: "!contains(github.event.head_commit.message, '[skip ci]')" + steps: + - name: Git checkout + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # 6.0.1 + - name: Setup Node.js + uses: ./.github/actions/node-setup + - run: yarn install --immutable + - name: Run biome + run: yarn check + - name: Run typecheck + run: yarn typecheck + build: + runs-on: ubuntu-latest + if: "!contains(github.event.head_commit.message, '[skip ci]')" + steps: + - name: Git checkout + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # 6.0.1 + - name: Setup Node.js + uses: ./.github/actions/node-setup + - run: yarn install --immutable + - name: Run build + run: yarn workspaces foreach -Apt run build diff --git a/.gitignore b/.gitignore index f03eaec..8de6bd0 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,13 @@ node_modules #!.yarn/cache .pnp.* + +# IDE +.idea/ +.vscode/ + +# outputs +dist/ +dist-ssr/ +.tanstack/ +.wvb/ diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 0000000..caa687d --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1,16 @@ +nodeLinker: node-modules + +preferReuse: true + +supportedArchitectures: + cpu: + - x64 + - ia32 + - arm64 + libc: + - glibc + - musl + os: + - darwin + - linux + - win32 diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..f9299c9 --- /dev/null +++ b/biome.json @@ -0,0 +1,66 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.5.0/schema.json", + "assist": { "actions": { "source": { "organizeImports": "on" } } }, + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "includes": [ + "**/*.ts", + "**/*.cts", + "**/*.tsx", + "**/*.js", + "**/*.cjs", + "**/*.json", + "**/*.mjs", + "!**/*.js", + "!**/*.cjs", + "!**/*.d.ts", + "!**/*.d.cts", + "!**/routeTree.gen.ts", + "!**/dist", + "!**/dist-ssr" + ] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2, + "lineWidth": 100, + "trailingNewline": true + }, + "linter": { + "enabled": true, + "rules": { + "preset": "recommended", + "suspicious": { + "noExplicitAny": "off", + "noEmptyInterface": "off", + "noArrayIndexKey": "off", + "noConfusingVoidType": "off" + }, + "style": { + "noNonNullAssertion": "off", + "noCommonJs": "error" + }, + "a11y": { + "noSvgWithoutTitle": "off" + }, + "security": { + "noDangerouslySetInnerHtml": "off" + }, + "correctness": { + "noUnusedImports": "error" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "trailingCommas": "es5", + "arrowParentheses": "asNeeded" + } + } +} diff --git a/mise.toml b/mise.toml new file mode 100644 index 0000000..4581550 --- /dev/null +++ b/mise.toml @@ -0,0 +1,2 @@ +[tools] +node = "24.15.0" diff --git a/package.json b/package.json index b6a3b22..a50d858 100644 --- a/package.json +++ b/package.json @@ -1,4 +1,17 @@ { "name": "webview-bundle-playground", - "packageManager": "yarn@4.14.1" + "private": true, + "workspaces": [ + "webviews/*" + ], + "packageManager": "yarn@4.16.0", + "scripts": { + "check": "biome check", + "check:fix": "biome check --write --unsafe", + "typecheck": "yarn workspaces foreach -Apt run typecheck" + }, + "devDependencies": { + "@biomejs/biome": "2.5.0", + "typescript": "6.0.3" + } } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..c36fb48 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "noUnusedParameters": true, + "forceConsistentCasingInFileNames": true, + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "declaration": true + } +} diff --git a/webviews/hacker-news/design/.thumbnail b/webviews/hacker-news/design/.thumbnail new file mode 100755 index 0000000000000000000000000000000000000000..b9efe2c481d1b22f01656fe1c90964d4917d8feb GIT binary patch literal 9024 zcmaKuV|X3Rw#WC5t;V*~*tXFajoH|4Y}>Z&q)}t5VdFI3jg5Wtp7Y_H5BJ_R&sy`F zHUDR3&CHikm6ej>p#T81B*j!TRd}=!0002#hYJG%=Kz4LxVXv~@M8!7j{Os%SO5S! zdsk;wX)#i59bHn`9RTp7{mYC^T^#>S|7-kE-7o)JyU6svD*pc@yqUR+>4)UZ;-&Z1%ylmjA^j|HY<`&j09RJ~RS$ zwr>CI^^g5?IwW&@4YiLR?!yTIE&x@4G(ha1^M8y#%%KPX;JE_;AQS$RGsy%1+Cu>V z-1YzDC<_1p)DQrmZT3I8|J;eAv9s~NmV^3;5Ed2yz;!tQfUE-me3}CQ5cK{v_YwY& z+DJd92tVp__-K{@TYx!$6d((*2bcmre-Imh1;7g6`gmbdIWho%B@B=Yq!$5#077c(D`LsPYTc&*Ge+MpqUAXVOQ+@~E2?P2Xd$WXJfAsn7 z`-8!)mx(V}VArlf-t95sV)9jldMcxn9GwvEbf+98dOyTG=Wbeg)KyfePw zc$a;3ruSj_;7^d)IBM=eQViCd_+HtSGOgabed}G1weEL=jMKec>GXkn z2)KcXUDw#U5wB)N0U>%G@MIv$easMZz(|;G<9`-zwDf( zT57Mk_BB)0UM4ub^Oc_Op?Eb4r%4r;x?I_+N8G3ev9ihB+6@Bl8!5OY#H+(cX&sk;vqwRhIq4(r|nZV=!92NQAzp4U+Y}y08YRQJg9Fm z?MLmK=z4p#+te|f6J}oX6(Py8=hVThA^v7Qe&^fyT)>rB+!rK$n_v+n2WHInw4;2= zGGHmi_n$hxFXMi(Qtd9y@%ow>Zu*91lefZGyU-Lu8%O+mys;d=Diep4zGI!lXrHTq z9Faj2A13no+VnateK7JHBO8j+xMUKVZQW?pKu>jYEWJL5(t>Q59;3wRt_Xq=yRff_ z8CEPa*OZfsmg@25#=hZN^k0f3JHUEI%epM;CwPVO_P%w;h9@Kck-rO08#6`BO{A>O3j^LTsNZI7s*9)YM!K;IfcAI>q*pXL2H z$Xnuq^UeZ>K%H7%qcew?VDXM%==n)EH0Y+a0q}kcDiiSG;G%UDcD5HHvK#yb!&QV~ zO=lny%1XwTMgN7 z&kJ&Zvb0Dkxa62*<6WIc>aGp?g5~E9ovvwR%fX5|=pRINzXT2mR!s>45!u8k;KHhY zsi?^44Eqad%=`?noVG=$wm{J{%X&9d#SZN64}BLjhotO~du_O@tBl<#M(adEaS5qx zw;HMvuDt1?JUiO*qG3+qeUGO<>8l5>&EtifDQ=_{(2{J|%iFw@KU(g$G_;HkIB$_< zBf=^YB*tV#RiK48I9w4}R?tU{F{ouFrFTMzZRZc6b@u6=iqVE7G~IZMc`|@EAz@7( zr}wCKz`Y3&HD zP3?9{Op`So;eFTv0PRAuULuW;&S`Gf0u;*41DJjrPEw6t!MgLF88v^pC8gECHF5Fh zpV47UG0c@bwBqg!U#wqD>MSf&6w;Oqjp#BHqTk6%2{1Zpl3cKyqfg)6;`R(L=@4iM z+eB?IciT?S5tqU;V=d$pcDh# zjXr+q)9KJ<6*4^|eNrZ}4hxn~S#&(fuF|;<9SKF2q;$=U8iP&TEyN16>;HOWIH;sB zPl~6rG_@`|`SO}R_Xlr0drB(zJCE0jUnTf=i5HZ`O1)ipP*9phJO!`z9)yYqo{DYe zBk6O-_d4C=`}CS;Nsg~CFpnY*TpD_uS7hp{5ysgQcW7OI%)=%O`FK{xhQ?u%DM(0V zP<1xWjPW8VSIA?izTK^9OAUm;iXuF3;3EmUQvdPXSZ+d`KvHF3MM{D9xpajd%Fdd> z5^75|ih&fJ)1p@1sdwUz6mSuU=D4`Ek3~7xUrjaaAZAvi9<0OM;)t)+MtyRI2|qi$ zYP@`q_B^mu5$peh=VcjBnr+v__!33q&BPpqokl-C4Z`9oc-bUC*6^?aF^TH@&xn~t|1jAcDG27S@PP{|8V@?rIHUmki3 zoM5#ip$EN-2J>M(;6}0^czun77IgGx1ZXA_~aSiQnf~B+7nigdNA4ah^FSPAxgL_ibC1XS_0+33ufT>gD>$S&0aZ4Uvvn@^R%pSI7v1*s)J* z(f1(%w3(3$5^mQ&n3-b?hlfXztS*XHEZE`0;=Fb|(X%WN3b3<5s2?5_tY6EEon+1W zN@pVdH87Fzu&8P*)IdVp_?K>X&DtntP^Avp!frZZ;UU^&NCR2^z;`{!1|5-&qePsD z;md+fDoMQNb0*3(Js__2B6zY0J`{@ zY@FnavHZUY6Wun%Aj0S!i+y9p@7Mwjhldk9g)|f?Y6rG-ebYB7VI)D$<}(7tv)bY?AuwzIS%RuO^O;s!2C@Cl~ZMrRi`e#@f{ z26O=J@hTzWD0W{)2h4ZHM4rb2fKMJ6ojt74r|GEO3H_cQwnpX|bNPXOn%(;PuUf{3H%V3<8y|sORRC-6}52TV^M&a%1rSP|TWaUwlaviYA5T zy8!bPhP}8iLc=zlx>g8n>)E%<9~*>;qOG}DG?&-5Q6S~H#yJP`3MbDZZ=1$*r-G%o zg3g-oDc%j5jHAzK>$FYhGMY)hMD+*QR}0t9u*cfoWjZ;tMJ_CAYXqY^4rZS$jM z%X+@U=HN#-7VXAIte)HUy+-eMKduEQ9m$u}p?v1D`iT|(K4r+SVPIO|`7#rXi``_-By=Ua0PB}9%vJN#M4ddvxtnS>=`;*E`kU zl2r}4+3n2bzO=`+5tYo5W8u$}Gz_cSeLI7d-OPy+jZ$-D1Z&CmS4QLz=S(W|s938K zNoK%2gDt!2?%t~;bvx=x1~$UdX5b*`^x|M7E3z{M$?y+24~Js&M5d<6I<*Yx z_(o2Z7s=8efY9Mnoge++Fj-J8r6RbDd5JEKuErJfbVssKL|jg-$AJ|B_Y5TiyN5}o zPEp`j7!FGnq`1kr0ra^;~~ERjEnu6Fpse3EaSPUc2J)Xnv9-_ zo?MZ8i!{gVj9x{PID%N0YXL33dydMvfGekN2B*6|l>Q1G(P?N~uAJ`=s4VpAR$uGr z;)R>(Q*XRFyD-O$g~YRU`+Vdh=M)MwU_ZN5GH}`%G~fKoZU@PWB5>x;!R6e9QFW3V-eKC(x!4!Ix$&Ip<`p!tndS% zqgAIFDa}%FEG$pzf)wzZ`+np7Zgno>oarTZnzekR-o3CH$`fycc^)!w=w^YDuZ%>W z9CWJxOltAX=l&CQ(36Y*^wm)oY+jG7x9`!C`CyVv+oS1~tq824eHl{U66Cr!Vwq$8 zo1Qrv=If}YcOA-D;dhyKXzCR!TStog3U`yXX^Af6#!YU9Q`tSWxx1NZMpFf1v*?7} zq3<~S0&)0d)%l1`qqPc^8`6ge@;9E%$XJ7+pW%cscFY>3sF=e?C6`Hss4$8bBl=O} zf4C7`B(v(X5-)EALo#BEe(K~f4}ADF)e0u>F*h#c1=$9kE=hbX=CjlQr!?62ItagDWR9`CW=7FSkpGff$5i<~ zE)Gxqmv*(&rC%Hyg_k1>CmL(&;-@^mV5tuAd`r^OC4!HCvg}t_?XB@*RQr{<6H01% z?E?SePkcID)4;Z*rJobNi$ zX>I`F=^?mL)Ckl3&Mx~D^04s;8kdJtq(9ag(;L-`->7686xOOWN-ds}q5cEHW!XoUwJKKvZXru`vDs#pYE0_^>l7K0gHcZ)PyRgp!Ei1?vFL>U2&zJ z*IvIhQz1ClB*R&r^Q`^H@@Nn7t<6#%14RJtQHDmwu+rmMhh_q|fRejPJg>Qr$&x32 zl`kL7W|BMTN-Y7-P3h4F`Sm(jZ1c17=+lklP3Pwyg(23a)S31)W`iYv$Xf{N0^wYm za@zxpYI_U{4s`% zQ|Jko(C9I*n4F39%l&Tu2F%VkMV8WX`C_Q#i?E$Z(hG<=&aR;H`F>ud^&$k5ZBJ2I zB_;c+Nk`^c<2Qt(Fb`@&6S)|bJ69;M#q9rqkebq!81tp4ODBBUiTJxutzA>V0X-~u zSI$B5t{+XSFHo|{Lf!u~gk-)X1pOFg{~;qOn-QBdET}egzHG?!>ituFj8QeM0mvkV zD%yzCC17(JLIY3h+bXpK2{GmIB{v90Lxm}dh1fuiNjn>p^@gg=i4a|CYs8x6Y{T5I zI@5FgOUHsJ8393A^VH!Cc*qNsfpVA*iloK9p~oaE-rGcSviDZI)6pxL_RQt`&mzwY z6Q|vb{Sy8U7p^!J#V|;|?QrYK#|6eIZHqbp0_;8F$yl~(wNrM}voz*8ZZMxr>{&1;b2)&-Gix`gTJ@E$c4hdn&X44yP%FHb<@@T+%3 zM|M-cG_9qxAj{VbxNLA=0Y~f)mfBhp=V+T-31ZU530n=pN3E%;t~TYcHU5NR>x#nD z4Qg#p%!@W%Tz0vnCuD7-3Vg`ww4*aOWtf&&3u7y-#`a{n5Lc*W2sa*SCOhjtfkW4q zmTEEbGB^NnbQ#PVTqSyZ83SB;6K&lXgKmhJhqK=OgN9!|Uz#m@P8GE-W)7elFxytn zL~!qV@Sr!IVIiDEfj!{pyH2!E704E#oW7=YkCW{NO6oJBnUsJV<;vGT(bWs7P`hN7 zk0>mM1Ddn1Co8hdvr5o+zI)aRIIjwEQZ?VLyDuq+O2*5TB;j%x05{Bw^Z_Tg?$< z%PGXlJ(A9Nxzu@Ro0zEknEt zpOVsI2U@xkK?*p8VF?FqUUt}i`Na)b@=cpqk&`>GVjaKotryi(x|~f~mBp0{(Ee)p zjt95T8GtOr2ON)XS@PV@dEoJ>k8o`d2u3#ZvUll)Sg5b2${{o$WZH$EB;x5Ci^B8 zeHn_wNzrq`y)1^_O6(}Vye5z@d`&30Fvr#|(?{ct zX}xClC?6ADQc3(YsnVGckH}d5qnF&-FXcd0>Amy0c8n^um?Grp-=fMI_e>#en?&M0QyWQrvnU5$@H@ih z;ORQORX@dFD_ku=-6i~}El%oCSB&xM5!>_PC_Lf;2O!=)%FKJvbz~xX&}*G|YvCl9 z_ic7tq-8rxyD!@7tiSbx6Z|KOp0*iFr=TF17&e!7F5dKsRM~`#@_|S^TpIm==O@@C z!TX<4EP19*%YVcJ~6ck~D=WsmnEOMsJO~)O>ab9QGzYyrBY>gHOcgjOOl-BO(OE(^Bz)$tp zF5KIPog0gg0n*8ewIexL-jz%=vT@a004Vk_Oq@9t4uzE)ftxGmJl{ZZWl;sd9!E8MXMhpOv`RvXOl1Dbc&|Un#WSco}-iA2ls*$grtQ~Q2z^5Tz1 zJ$Ut9E$?uxy)_&P^XA6w5;eVo34K&#$Lq#@r78)QNZlS2zi|P5yW$<=FV67`sCh~g zge$9~x9Af%T1p}zC^2x(hjEMGV0HHM7sekoEL`(XHl^)LCdT=;)WvwiF4qbJk)1-{ zC!FtLxaDwr5d+%Mhd8pu_^eG_HJKn%_vP*aKj(mC#Azw=M8u6vlNbc$e?t86bCd7)KV>z@ev9Q`H z@HFry!nGAjuwCKq6pL#lEteU&xvOS9aBA=xLK2i~$_JvE;J=fg#!$1raj_H~ZRi(S zoJ|QBT@$)mGT7Ct86>2@$ChtF7htpXZ`zin^N($Z74$}=5G`o^z-xU>*BDohZm;gm zdG{H)`lNL}^BAaULh-z5KpJM=?lDxfV!Ql??c1P8wEx9Q@PQI$7H$^)Th7P@df1AL z_e9++n~xvtR6Y@_H6s8jX)y=Wufq}5V3f0Wf7NuW-Y&;46iU+imJ7({t?hI}6lf~n zB$sIUi0>b8w+f-bpPhseju?Dj@jPzx%#7U_|2i)@>RjCV2~YCKJ9CyWRm~*x5-AAe zLiR{8_!IW0fTEztpuu_FZ^y&AK&7C$Rak&K_V*c7Rq%X`yYv7P&L1wQBhjMZv2y zoQ&J<7*ls#azs02Ku4vMp#!fwxasBk&LG=H!isR~_l#>mQUqnj_U*x)kd*!WyqnI- z%^K4ko-WcdpE#0$(tG-yreZO;Gkg_sZB_meWo}nYW?C{Ne?RBVsX-@yBNRrg^bl&#$`JK)EKaO`dSsD~hlL^=2hM!;Dk?^PlrTN7j9xL#`NFoO5qQJhWb3fMg~ z?-;+c8OY1--FqDncqZU!rp+-GA+KvSsbxJkV?w zep1apEvj=v!6y1X^x48^Iy$xWpy>eXXLCojZ#Ct-Not&*aCZ--xpa)`I$9@1@@DI) zpwPmI8}$ozM;#VbSpI~%GNey?Zi4RTfIkL%oHdtwZ~69S3AV=XC6kck_D4Q|dJt0C z-+4+huMxM{>`eV!w-#C_r&Y9_%P+dRz8;pimpsdwGt+RieEmkd7Snhz(TgW*X%l{5 zWcJWH-W?pZ3LaxPGW+>2Y7fo?nHrVUXn82PF4qQhv+^{=bDK~Rm!FA!fiGViy{fo{ z=R^k0?h#7VLuy}H)38P^QFeqdrjG1zmc;tdAyfwM(ujrfC!P|`>|z!lu0lx@Z&(F} zGxasWi&H5oKM8)LbU{U%{0>*|lTKc8L%K#Smag@UZmtN9u`;ADGtWA%%F3!I#*(v$ zZWDLV_U!{;6Vu}lLC(r^`2EqpoI}AcE3|pvKwz?yHRQ(E&(G91dfLv4Vm!_Gl_=L= z$7nW{O;cc;4S`yeAtRwwn#q^kU7V84_YO}^IW)Fni1mtZ2bKTK0sn18;YWcq_tSJW zIsHE4%(IrWuKYeGkx$1)jyhq{}HdT_H}Vp!cb3UeA7=L=9RPx$phA zZoVNrnOJ~9c#7PnBURN wFsM6S{$Qp}X*4hY2pr<*nwgs=!p3YJz07I``6C06zQ-wekp(~-&IbVg2haKaoB#j- literal 0 HcmV?d00001 diff --git a/webviews/hacker-news/design/BundleApp.dc.html b/webviews/hacker-news/design/BundleApp.dc.html new file mode 100755 index 0000000..b0cfe1c --- /dev/null +++ b/webviews/hacker-news/design/BundleApp.dc.html @@ -0,0 +1,598 @@ + + + + + + + + + + + + + + +
+ + + +
+ +
+ + + +
+
+
+ +
+ BUNDLE + // news +
+
+
+ + +
+
+ + +
CD
+
+
+ + + +
+ + + BUNDLE + + + + {{ mobileTitle }} + + +
CD
+
+
+ + +
+ + + + + + + +
+ + + +
+
+ + +
+
+ + + + +
+
+
+ + + +
+ + +
+
create a post
+ + +
+ + +
+
+
+ +
+
+ + + +
+ {{ resultLabel }} +
+ + + + + +
+ {{ post.rank }} +
+ + {{ post.score }} + +
+
+
+ {{ post.title }} + ({{ post.domain }}) +
+
+ #{{ post.tag }} + {{ post.score }} pts + by {{ post.author }} + {{ post.age }} + ✦ {{ post.comments }} comments +
+
+
+
+ + + +
+
+ + {{ post.score }} + +
+
+
+ #{{ post.tag }} + posted by {{ post.author }} · {{ post.age }} +
+
{{ post.title }}
+
→ {{ post.domain }}
+
{{ post.snippet }}
+
+ ▭ {{ post.comments }} comments + ↗ share + ✦ save +
+
+
+
+ +
+
+
+ + + +
+ + ← back to feed + +
+
+ + {{ cur.score }} + +
+
+
+ #{{ cur.tag }} + by {{ cur.author }} + {{ cur.age }} + {{ cur.domain }} +
+

{{ cur.title }}

+

{{ cur.body }}

+
+ ▭ {{ cur.comments }} comments + ↗ share + ✦ save +
+
+
+ +
+ +
+
{{ commentCountLabel }} · sorted by best
+ + +
+
+ {{ c.toggleGlyph }} + {{ c.author }} + OP + {{ c.score }} pts · {{ c.age }} + · +{{ c.childCount }} hidden +
+ +
{{ c.body }}
+
+ + + reply +
+
+
+
+
+
+ + + +
+ + ← back to feed + +
+
{{ prof.monogram }}
+
+
{{ prof.user }}
+
{{ prof.bio }}
+
+ {{ prof.karma }} karma + {{ prof.postCount }} posts + joined {{ prof.joined }} +
+
+
+
+ + +
+ + + +
+
+ + {{ post.score }} + +
+
+ {{ post.title }} +
#{{ post.tag }} · {{ post.score }} pts · {{ post.age }} · {{ post.comments }} comments
+
+
+
+
+ + +
+
commented · {{ c.score }} pts · {{ c.age }}
+
{{ c.body }}
+
+
+
+
+
+ +
+ + + + + + +
+ + + +
+ connected + remote Source · news.wvb.dev + builtin fallback ready + ⟳ synced 2m ago + @wvb/web v1.4.0 +
+
+ + + + + + +
+
+ + + diff --git a/webviews/hacker-news/design/Community Demo.dc.html b/webviews/hacker-news/design/Community Demo.dc.html new file mode 100755 index 0000000..16c4e0a --- /dev/null +++ b/webviews/hacker-news/design/Community Demo.dc.html @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + +
+ + +
+ +
+ BUNDLE + // adaptive community demo +
+ +
+ FEED STYLE +
+ + +
+
+ one component · two surfaces +
+
+ + +
+ + +
+
+ DESKTOP + · Electron / Tauri · frameless native window · light +
+
+
+ +
+
+
+ + +
+
+ MOBILE + · iOS / Android webview · dark +
+
+
+
+ 9:41 +
+ 5G ▰▰▰ ▮ +
+
+ +
+
+
+
+ +
+ + +
+
+ Both surfaces render the same Design Component — only mode differs. Vote, sort, filter by tag, open a thread, collapse comments, visit a profile, and toggle each surface’s own light/dark theme — every interaction is live. +
+
+ +
+
+ + + diff --git a/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/README.md b/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/README.md new file mode 100755 index 0000000..cddaed1 --- /dev/null +++ b/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/README.md @@ -0,0 +1,173 @@ +# Webview Bundle — Design System + +This folder is a reference design system for **Webview Bundle** (`webview-bundle`), +an open-source offline-first web-resources delivery library for webview-mounted +frameworks/platforms (Electron, Tauri, Android and iOS planned). + +> **What is Webview Bundle?** A format + runtime + CLI for shipping the entire +> web layer of a desktop or mobile app as a single verified, compressed archive +> (`.wvb`). An app can ship "builtin" bundles with its installer and +> hot-swap them at runtime from a `remote` Source (HTTP server) — updates +> without an App Store round-trip. + +--- + +## Sources + +Everything in this system was derived from these two repositories. Nothing is +pre-loaded in the project — assets were imported from them on demand. + +| Repo | Role | Notes | +| --- | --- | --- | +| `github.com/webview-bundle/webview-bundle` | Core monorepo (Rust + TS): `packages/{core,cli,config,electron,tauri,node,remote}`, `examples/`, protocol spec in `packages/core/README.md` | Public | +| `github.com/webview-bundle/website` | Docs site — `fumadocs-ui` + TanStack Start on Cloudflare Workers, deployed via Wrangler | Private; view access required | + +Key files that shaped this system: + +- **`website/src/styles.css`** — type setup: Inter (sans) + JetBrains Mono (mono), Fumadocs "black" preset, Tailwind v4. +- **`website/src/layouts/home/components/Header.tsx`** — the only custom UI; uses the logo + wordmark "WEBVIEW BUNDLE" (uppercase, bold). +- **`website/public/logo.png`** — the blue 3D cube logo (imported to `assets/logo.png`). +- **`webview-bundle/packages/core/README.md`** — the `.wvb` binary format spec, Source layout, and the Remote HTTP protocol (`GET/HEAD /bundles/...`). Drives technical-doc copy style. + +## Products + +Webview Bundle is a **developer library**, not a consumer product. There is effectively **one surface**: the docs website (`webview-bundle/website`), built with `fumadocs-ui`. That's the only place the brand is expressed visually — everything else is code. + +- **Marketing home** (`/`) — currently a placeholder ("Hello World"), sticky minimal header with logo + wordmark. +- **Docs** (`/docs/*`) — Fumadocs layout: left sidebar tree, content, right TOC. + +Because the real site is barely past scaffolding, **this design system proposes a concrete, opinionated direction** for what the marketing home and docs could look like, staying faithful to Inter + JetBrains Mono + the Fumadocs "black" preset + the blue cube. + +--- + +## Content Fundamentals + +Copy in this project is **terse, technical, and neutral** — written for +developers integrating a library, not for end-users. Match this voice when +creating pages or mocks. + +**Voice & tone** +- **Declarative, not marketing-y.** State what the thing is and moves on. + From the root README: *"Webview Bundle is offline-first web resources delivery system for webview mounted frameworks/platforms."* That's the whole pitch. +- **WIP-honest.** The README includes a literal `> [!NOTE] This project is under development.` callout. Don't paper over incompleteness. +- **Third-person / imperative.** "The checksum is the result of…", "Get a bundle metadata with the specified name." Avoid "we" and "you" in reference docs; conversational "you" is okay in guides/tutorials. + +**Casing** +- **Product name:** `Webview Bundle` in prose, `webview-bundle` in code and repo slugs. +- **Wordmark:** `WEBVIEW BUNDLE` — **uppercase, bold, slightly tracked** (this is how the site header renders it). +- **Package names:** lowercase npm-scoped — `@wvb/cli`, `@wvb/electron`, `@wvb/core`. +- **Headings:** Sentence case (`## Webview Bundle Format (.wvb)`), not Title Case. + +**Technical vocabulary — use verbatim** +- `.wvb` — the bundle file extension. +- **Bundle** — one `.wvb` archive for one app/module at one version. +- **Source** — a directory of bundles + `manifest.json` (a store of bundles). +- **builtin** / **remote** — the two Source types (always lowercase, as identifiers). +- **Magic Number**, **Index**, **Data** — the three regions of the binary header (title-cased). +- **xxHash-32**, **lz4 block format** — the exact names of the checksum and compression algorithms; link to specs on first mention. + +**Formatting patterns** +- Spec sections are tables (binary layout) followed by a `### Field` list. +- Protocol endpoints are formatted as HTTP request/response pairs in fenced code blocks tagged ```http request``` with `### Response` as a separator inside the block. +- JSON schemas are shown as examples, not as JSON Schema. +- Use GitHub-flavored callouts: `> [!NOTE]`, `> [!WARNING]`. + +**Emoji** — effectively not used in UI or prose. The one exception is in the **binary format itself**: the magic number `0xf09f8c90 0xf09f8e81` encodes 🌐🎁 as UTF-8. Worth mentioning in docs as a piece of flavor; don't scatter emoji elsewhere. + +**Examples to emulate** (lifted from the source): +> "This returns a list of bundles. Remote bundles must be version-specified. Therefore, bundles with un-deployed versions should be excluded from the response." + +> "It is used as a fallback when the latest bundles cannot be downloaded from the remote, such as during the application's first launch. It is generally treated as **read-only**." + +Short sentences. One fact per sentence. Bold the term being defined. That's the voice. + +--- + +## Visual Foundations + +**Palette.** Monochrome base (pure black/white, Fumadocs "black" preset — `--color-fd-background: hsl(0 0% 0%)` in dark mode, `hsl(0 0% 100%)` in light mode) plus a **single brand accent**: the blue spectrum from the cube logo, anchored at `--wvb-blue-500: #1286F5`. Everything else is zinc-style neutrals. No secondary brand hue. No gradient backgrounds beyond what exists inside the logo itself. + +**Type.** +- `Inter` (variable) for all UI and body copy. Weights used: 400, 500, 600, 700. +- `JetBrains Mono` (variable) for code, terminal output, `.wvb` field names, HTTP specs. +- Sans-serif is the default; mono is reserved for code contexts. +- The wordmark uses Inter **bold uppercase with `letter-spacing: 0.04em`** — see `Header.tsx`. +- `text-rendering: optimizeLegibility`, `-webkit-font-smoothing: antialiased`, `font-synthesis: style`, and `text-autospace: normal` are set globally — preserve these in any mockup. + +**Spacing.** 4px base scale (Tailwind default: 4, 8, 12, 16, 24, 32, 48, 64). Header is **h-12 (48px)**. Content gutters are `p-4` (16px). Breathe — this is a docs site, not an ad. + +**Backgrounds.** Flat solids only. Light mode = `#FFFFFF`; dark mode = pure `#000000` (not `#0A0A0A` — Fumadocs "black" preset is **true black** for OLED). The header uses `backdrop-blur-lg` over a translucent surface when sticky — that's the only transparency effect. + +**Borders.** Single-pixel hairline borders in `--border-1` (`#E4E4E7` light, `#1F1F22` dark). No double borders. No colored borders except for the `--accent` color on focus rings. + +**Shadows.** Minimal. `--shadow-sm` on inputs and dropdown menus; `--shadow-lg` on floating popovers. No soft "Material" glow. **No colored shadows.** + +**Corner radii.** 6px is the default (`--radius-md`, shadcn-style). 4px on badges/code chips, 8px on cards, 12px on modal-scale surfaces, `9999px` on pills/avatars. + +**Animation.** Short, functional. 150–200ms ease-out for hover state fades, 200–300ms ease-in-out for menu open/close. No bounces, no parallax, no scroll-jacking. Match Fumadocs' defaults. + +**Hover states.** Text links: color shifts from `--fg-2` to `--accent` (and underline appears). Surfaces: `--bg-2` → `--bg-3`. Buttons: background darkens one step (`--accent` → `--accent-hover`). + +**Press states.** Brief `scale(0.98)` for primary buttons; otherwise just a darker background step. Nothing flashy. + +**Imagery.** Almost none in-product. The logo is the only brand image. For hero/marketing mocks, favor **monochrome code screenshots** and **isometric/flat diagrams** over photography. If photography is needed, prefer cool-toned, high-contrast, slightly desaturated. + +**Iconography.** Lucide icons (see `ICONOGRAPHY` below) — outline style, 1.5px stroke, 20×20 default. + +**Layout rules.** Docs pages use the classic 3-column Fumadocs layout: sidebar (260px) / content (max 740px for prose) / TOC (220px). Marketing pages should stay within `--container-max: 1400px`, centered, with generous vertical rhythm. + +--- + +## Iconography + +**No custom icon font ships in the codebase.** Fumadocs UI ships with +[Lucide](https://lucide.dev) as its default icon set, and that's what this +project uses. + +- **Primary icon set:** Lucide (outline, 1.5px stroke, currentColor). + Loaded from CDN in mocks: `https://unpkg.com/lucide@latest/dist/umd/lucide.js`. +- **Style:** outline only. 20×20 at default text size, 16×16 inline with small text, 24×24 on nav headers. +- **Color:** always `currentColor` so icons inherit `--fg-2` / `--fg-3`. Use `--accent` sparingly, only to indicate interactive affordance. +- **Emoji:** do not use in UI. The only documented emoji reference is the + `.wvb` magic number (🌐🎁), which is a protocol-level Easter egg and should + only appear when explicitly talking about the magic number. +- **Custom iconography:** the blue cube logo (`assets/logo.png`, cleaned up in + `assets/logo-symbol.svg`) is the product mark. Use it at 32×32 in headers, + 64–128px in hero sections, never smaller than 16×16. +- **Unicode chars as icons:** avoided. Use Lucide. + +> **Substitution flag.** The reference `logo.png` is a detailed 3D illustration +> (dimensional gradient rendering). For UI uses at small sizes, we ship a +> simplified flat vector at `assets/logo-symbol.svg`. **Please review the +> simplified symbol** — swap in your own vector if you'd like a tighter match. + +--- + +## Fonts + +- **Inter** — loaded via Google Fonts CDN in `colors_and_type.css`. The real project uses `@fontsource/inter` (identical files, just self-hosted). Weights 300, 400, 500, 600, 700, 800. +- **JetBrains Mono** — same story; `@fontsource-variable/jetbrains-mono` in code, Google Fonts in mocks. + +> **Substitution flag.** We don't ship the actual `.woff2` files in this design +> system — we link Google Fonts. If you want offline/self-hosted fonts for +> standalone HTML deliverables, download the files from +> `https://fonts.google.com/specimen/Inter` and +> `https://fonts.google.com/specimen/JetBrains+Mono` and drop them into +> `fonts/`. + +--- + +## Index + +``` +colors_and_type.css CSS variables for colors, type, spacing, radii, shadows +assets/ + logo.png Original 3D blue-cube logo (from website/public/logo.png) + logo-symbol.svg Flat simplified cube symbol (for small-scale use) + logo-reference.png Higher-fidelity 3D reference provided by the user +preview/ HTML cards rendered in the Design System tab +ui_kits/ + docs-website/ Fumadocs-style docs + marketing home recreation +SKILL.md Agent Skill entrypoint (Claude Code-compatible) +README.md This file +``` diff --git a/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_adherence.oxlintrc.json b/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_adherence.oxlintrc.json new file mode 100755 index 0000000..fecd168 --- /dev/null +++ b/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_adherence.oxlintrc.json @@ -0,0 +1,216 @@ +{ + "plugins": ["react", "import"], + "rules": { + "react/forbid-elements": [ + "warn", + { + "forbid": [] + } + ], + "no-restricted-imports": [ + "warn", + { + "patterns": [] + } + ], + "no-restricted-syntax": [ + "warn", + { + "selector": "Literal[value=/#[0-9a-fA-F]{3,8}\\b/]", + "message": "Raw hex color — use a design-system color token via var()." + }, + { + "selector": "Literal[value=/\\b\\d+px\\b/]", + "message": "Raw px value — use a design-system spacing token via var()." + }, + { + "selector": "Literal[value=/font-family\\s*:\\s*(?!['\\\"]?(?:Inter|JetBrains Mono))/i]", + "message": "Font not provided by the design system. Available: Inter, JetBrains Mono." + } + ] + }, + "overrides": [ + { + "files": ["**/index.js"], + "rules": { + "no-restricted-imports": "off" + } + } + ], + "x-omelette": { + "components": {}, + "tokens": [ + "--accent", + "--accent-fg", + "--accent-hover", + "--accent-subtle", + "--bg-1", + "--bg-2", + "--bg-3", + "--bg-inverse", + "--border-1", + "--border-2", + "--container-max", + "--danger", + "--fg-1", + "--fg-2", + "--fg-3", + "--fg-4", + "--font-mono", + "--font-sans", + "--header-h", + "--info", + "--leading-normal", + "--leading-relaxed", + "--leading-snug", + "--leading-tight", + "--radius-2xl", + "--radius-full", + "--radius-lg", + "--radius-md", + "--radius-sm", + "--radius-xl", + "--shadow-lg", + "--shadow-md", + "--shadow-sm", + "--space-1", + "--space-10", + "--space-12", + "--space-16", + "--space-2", + "--space-3", + "--space-4", + "--space-5", + "--space-6", + "--space-8", + "--success", + "--text-2xl", + "--text-3xl", + "--text-4xl", + "--text-5xl", + "--text-6xl", + "--text-base", + "--text-lg", + "--text-sm", + "--text-xl", + "--text-xs", + "--tracking-normal", + "--tracking-tight", + "--tracking-wide", + "--warning", + "--weight-bold", + "--weight-medium", + "--weight-regular", + "--weight-semibold", + "--wvb-blue-100", + "--wvb-blue-200", + "--wvb-blue-300", + "--wvb-blue-400", + "--wvb-blue-50", + "--wvb-blue-500", + "--wvb-blue-600", + "--wvb-blue-700", + "--wvb-blue-800", + "--wvb-blue-900", + "--wvb-neutral-0", + "--wvb-neutral-100", + "--wvb-neutral-200", + "--wvb-neutral-300", + "--wvb-neutral-400", + "--wvb-neutral-50", + "--wvb-neutral-500", + "--wvb-neutral-600", + "--wvb-neutral-700", + "--wvb-neutral-800", + "--wvb-neutral-900", + "--wvb-neutral-950" + ], + "tokenKinds": { + "--wvb-blue-50": "color", + "--wvb-blue-100": "color", + "--wvb-blue-200": "color", + "--wvb-blue-300": "color", + "--wvb-blue-400": "color", + "--wvb-blue-500": "color", + "--wvb-blue-600": "color", + "--wvb-blue-700": "color", + "--wvb-blue-800": "color", + "--wvb-blue-900": "color", + "--wvb-neutral-0": "color", + "--wvb-neutral-50": "color", + "--wvb-neutral-100": "color", + "--wvb-neutral-200": "color", + "--wvb-neutral-300": "color", + "--wvb-neutral-400": "color", + "--wvb-neutral-500": "color", + "--wvb-neutral-600": "color", + "--wvb-neutral-700": "color", + "--wvb-neutral-800": "color", + "--wvb-neutral-900": "color", + "--wvb-neutral-950": "color", + "--fg-1": "color", + "--fg-2": "color", + "--fg-3": "color", + "--fg-4": "color", + "--bg-1": "color", + "--bg-2": "color", + "--bg-3": "color", + "--bg-inverse": "color", + "--border-1": "color", + "--border-2": "color", + "--accent": "color", + "--accent-hover": "color", + "--accent-fg": "color", + "--accent-subtle": "color", + "--success": "color", + "--warning": "color", + "--danger": "color", + "--info": "color", + "--font-sans": "font", + "--font-mono": "font", + "--text-xs": "font", + "--text-sm": "font", + "--text-base": "font", + "--text-lg": "font", + "--text-xl": "font", + "--text-2xl": "font", + "--text-3xl": "font", + "--text-4xl": "font", + "--text-5xl": "font", + "--text-6xl": "font", + "--leading-tight": "font", + "--leading-snug": "font", + "--leading-normal": "font", + "--leading-relaxed": "font", + "--weight-regular": "font", + "--weight-medium": "font", + "--weight-semibold": "font", + "--weight-bold": "font", + "--tracking-tight": "font", + "--tracking-normal": "font", + "--tracking-wide": "font", + "--space-1": "spacing", + "--space-2": "spacing", + "--space-3": "spacing", + "--space-4": "spacing", + "--space-5": "spacing", + "--space-6": "spacing", + "--space-8": "spacing", + "--space-10": "spacing", + "--space-12": "spacing", + "--space-16": "spacing", + "--radius-sm": "radius", + "--radius-md": "radius", + "--radius-lg": "radius", + "--radius-xl": "radius", + "--radius-2xl": "radius", + "--radius-full": "radius", + "--shadow-sm": "shadow", + "--shadow-md": "shadow", + "--shadow-lg": "shadow", + "--header-h": "spacing", + "--container-max": "spacing" + }, + "fontFamilies": ["Inter", "JetBrains Mono"] + } +} diff --git a/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_ds_bundle.js b/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_ds_bundle.js new file mode 100755 index 0000000..f91b93a --- /dev/null +++ b/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_ds_bundle.js @@ -0,0 +1,11 @@ +/* @ds-bundle: {"format":3,"namespace":"WebviewBundleDesignSystem_6b8904","components":[],"sourceHashes":{},"inlinedExternals":[],"unexposedExports":[]} */ + +(() => { + +const __ds_ns = (window.WebviewBundleDesignSystem_6b8904 = window.WebviewBundleDesignSystem_6b8904 || {}); + +const __ds_scope = {}; + +(__ds_ns.__errors = __ds_ns.__errors || []); + +})(); diff --git a/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_ds_manifest.json b/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_ds_manifest.json new file mode 100755 index 0000000..d17ca19 --- /dev/null +++ b/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_ds_manifest.json @@ -0,0 +1,513 @@ +{ + "namespace": "WebviewBundleDesignSystem_6b8904", + "components": [], + "startingPoints": [], + "cards": [], + "globalCssPaths": ["colors_and_type.css"], + "tokens": [ + { + "name": "--wvb-blue-50", + "value": "#EAF5FF", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-blue-100", + "value": "#CFE8FF", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-blue-200", + "value": "#9DD1FF", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-blue-300", + "value": "#65B8FF", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-blue-400", + "value": "#2E9FFF", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-blue-500", + "value": "#1286F5", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-blue-600", + "value": "#0B6AD6", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-blue-700", + "value": "#0A55B0", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-blue-800", + "value": "#093E84", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-blue-900", + "value": "#08285A", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-neutral-0", + "value": "#FFFFFF", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-neutral-50", + "value": "#FAFAFA", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-neutral-100", + "value": "#F4F4F5", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-neutral-200", + "value": "#E4E4E7", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-neutral-300", + "value": "#D4D4D8", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-neutral-400", + "value": "#A1A1AA", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-neutral-500", + "value": "#71717A", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-neutral-600", + "value": "#52525B", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-neutral-700", + "value": "#3F3F46", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-neutral-800", + "value": "#27272A", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-neutral-900", + "value": "#18181B", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--wvb-neutral-950", + "value": "#0A0A0A", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--fg-1", + "value": "var(--wvb-neutral-950)", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--fg-2", + "value": "var(--wvb-neutral-700)", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--fg-3", + "value": "var(--wvb-neutral-500)", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--fg-4", + "value": "var(--wvb-neutral-400)", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--bg-1", + "value": "var(--wvb-neutral-0)", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--bg-2", + "value": "var(--wvb-neutral-50)", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--bg-3", + "value": "var(--wvb-neutral-100)", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--bg-inverse", + "value": "var(--wvb-neutral-950)", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--border-1", + "value": "var(--wvb-neutral-200)", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--border-2", + "value": "var(--wvb-neutral-300)", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--accent", + "value": "var(--wvb-blue-500)", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--accent-hover", + "value": "var(--wvb-blue-600)", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--accent-fg", + "value": "#FFFFFF", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--accent-subtle", + "value": "var(--wvb-blue-50)", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--success", + "value": "#16A34A", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--warning", + "value": "#D97706", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { "name": "--danger", "value": "#DC2626", "kind": "color", "definedIn": "colors_and_type.css" }, + { + "name": "--info", + "value": "var(--wvb-blue-500)", + "kind": "color", + "definedIn": "colors_and_type.css" + }, + { + "name": "--font-sans", + "value": "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif", + "kind": "font", + "definedIn": "colors_and_type.css" + }, + { + "name": "--font-mono", + "value": "'JetBrains Mono', 'SF Mono', Menlo, Consolas, monospace", + "kind": "font", + "definedIn": "colors_and_type.css" + }, + { "name": "--text-xs", "value": "12px", "kind": "font", "definedIn": "colors_and_type.css" }, + { "name": "--text-sm", "value": "14px", "kind": "font", "definedIn": "colors_and_type.css" }, + { "name": "--text-base", "value": "16px", "kind": "font", "definedIn": "colors_and_type.css" }, + { "name": "--text-lg", "value": "18px", "kind": "font", "definedIn": "colors_and_type.css" }, + { "name": "--text-xl", "value": "20px", "kind": "font", "definedIn": "colors_and_type.css" }, + { "name": "--text-2xl", "value": "24px", "kind": "font", "definedIn": "colors_and_type.css" }, + { "name": "--text-3xl", "value": "30px", "kind": "font", "definedIn": "colors_and_type.css" }, + { "name": "--text-4xl", "value": "36px", "kind": "font", "definedIn": "colors_and_type.css" }, + { "name": "--text-5xl", "value": "48px", "kind": "font", "definedIn": "colors_and_type.css" }, + { "name": "--text-6xl", "value": "60px", "kind": "font", "definedIn": "colors_and_type.css" }, + { + "name": "--leading-tight", + "value": "1.15", + "kind": "font", + "definedIn": "colors_and_type.css" + }, + { + "name": "--leading-snug", + "value": "1.35", + "kind": "font", + "definedIn": "colors_and_type.css" + }, + { + "name": "--leading-normal", + "value": "1.55", + "kind": "font", + "definedIn": "colors_and_type.css" + }, + { + "name": "--leading-relaxed", + "value": "1.7", + "kind": "font", + "definedIn": "colors_and_type.css" + }, + { + "name": "--weight-regular", + "value": "400", + "kind": "font", + "definedIn": "colors_and_type.css" + }, + { + "name": "--weight-medium", + "value": "500", + "kind": "font", + "definedIn": "colors_and_type.css" + }, + { + "name": "--weight-semibold", + "value": "600", + "kind": "font", + "definedIn": "colors_and_type.css" + }, + { "name": "--weight-bold", "value": "700", "kind": "font", "definedIn": "colors_and_type.css" }, + { + "name": "--tracking-tight", + "value": "-0.022em", + "kind": "font", + "definedIn": "colors_and_type.css" + }, + { + "name": "--tracking-normal", + "value": "0", + "kind": "font", + "definedIn": "colors_and_type.css" + }, + { + "name": "--tracking-wide", + "value": "0.04em", + "kind": "font", + "definedIn": "colors_and_type.css" + }, + { "name": "--space-1", "value": "4px", "kind": "spacing", "definedIn": "colors_and_type.css" }, + { "name": "--space-2", "value": "8px", "kind": "spacing", "definedIn": "colors_and_type.css" }, + { "name": "--space-3", "value": "12px", "kind": "spacing", "definedIn": "colors_and_type.css" }, + { "name": "--space-4", "value": "16px", "kind": "spacing", "definedIn": "colors_and_type.css" }, + { "name": "--space-5", "value": "20px", "kind": "spacing", "definedIn": "colors_and_type.css" }, + { "name": "--space-6", "value": "24px", "kind": "spacing", "definedIn": "colors_and_type.css" }, + { "name": "--space-8", "value": "32px", "kind": "spacing", "definedIn": "colors_and_type.css" }, + { + "name": "--space-10", + "value": "40px", + "kind": "spacing", + "definedIn": "colors_and_type.css" + }, + { + "name": "--space-12", + "value": "48px", + "kind": "spacing", + "definedIn": "colors_and_type.css" + }, + { + "name": "--space-16", + "value": "64px", + "kind": "spacing", + "definedIn": "colors_and_type.css" + }, + { "name": "--radius-sm", "value": "4px", "kind": "radius", "definedIn": "colors_and_type.css" }, + { "name": "--radius-md", "value": "6px", "kind": "radius", "definedIn": "colors_and_type.css" }, + { "name": "--radius-lg", "value": "8px", "kind": "radius", "definedIn": "colors_and_type.css" }, + { + "name": "--radius-xl", + "value": "12px", + "kind": "radius", + "definedIn": "colors_and_type.css" + }, + { + "name": "--radius-2xl", + "value": "16px", + "kind": "radius", + "definedIn": "colors_and_type.css" + }, + { + "name": "--radius-full", + "value": "9999px", + "kind": "radius", + "definedIn": "colors_and_type.css" + }, + { + "name": "--shadow-sm", + "value": "0 1px 2px 0 rgb(0 0 0 / 0.04)", + "kind": "shadow", + "definedIn": "colors_and_type.css" + }, + { + "name": "--shadow-md", + "value": "0 1px 3px 0 rgb(0 0 0 / 0.08), 0 1px 2px -1px rgb(0 0 0 / 0.06)", + "kind": "shadow", + "definedIn": "colors_and_type.css" + }, + { + "name": "--shadow-lg", + "value": "0 10px 20px -8px rgb(0 0 0 / 0.12), 0 4px 6px -4px rgb(0 0 0 / 0.06)", + "kind": "shadow", + "definedIn": "colors_and_type.css" + }, + { + "name": "--header-h", + "value": "48px", + "kind": "spacing", + "definedIn": "colors_and_type.css" + }, + { + "name": "--container-max", + "value": "1400px", + "kind": "spacing", + "definedIn": "colors_and_type.css" + }, + { + "name": "--fg-1", + "value": "var(--wvb-neutral-50)", + "kind": "color", + "definedIn": "colors_and_type.css", + "scope": ".dark" + }, + { + "name": "--fg-2", + "value": "var(--wvb-neutral-300)", + "kind": "color", + "definedIn": "colors_and_type.css", + "scope": ".dark" + }, + { + "name": "--fg-3", + "value": "var(--wvb-neutral-400)", + "kind": "color", + "definedIn": "colors_and_type.css", + "scope": ".dark" + }, + { + "name": "--fg-4", + "value": "var(--wvb-neutral-600)", + "kind": "color", + "definedIn": "colors_and_type.css", + "scope": ".dark" + }, + { + "name": "--bg-1", + "value": "#000000", + "kind": "color", + "definedIn": "colors_and_type.css", + "scope": ".dark" + }, + { + "name": "--bg-2", + "value": "#0A0A0A", + "kind": "color", + "definedIn": "colors_and_type.css", + "scope": ".dark" + }, + { + "name": "--bg-3", + "value": "#141414", + "kind": "color", + "definedIn": "colors_and_type.css", + "scope": ".dark" + }, + { + "name": "--bg-inverse", + "value": "var(--wvb-neutral-50)", + "kind": "color", + "definedIn": "colors_and_type.css", + "scope": ".dark" + }, + { + "name": "--border-1", + "value": "#1F1F22", + "kind": "color", + "definedIn": "colors_and_type.css", + "scope": ".dark" + }, + { + "name": "--border-2", + "value": "#2A2A2E", + "kind": "color", + "definedIn": "colors_and_type.css", + "scope": ".dark" + }, + { + "name": "--accent", + "value": "var(--wvb-blue-400)", + "kind": "color", + "definedIn": "colors_and_type.css", + "scope": ".dark" + }, + { + "name": "--accent-hover", + "value": "var(--wvb-blue-300)", + "kind": "color", + "definedIn": "colors_and_type.css", + "scope": ".dark" + }, + { + "name": "--accent-fg", + "value": "var(--wvb-neutral-950)", + "kind": "color", + "definedIn": "colors_and_type.css", + "scope": ".dark" + }, + { + "name": "--accent-subtle", + "value": "rgba(46, 159, 255, 0.08)", + "kind": "color", + "definedIn": "colors_and_type.css", + "scope": ".dark" + } + ], + "themes": [{ "selector": ".dark", "label": "Dark" }], + "fonts": [], + "brandFonts": [ + { "family": "Inter", "status": "ok", "tokens": ["--font-sans"], "path": "colors_and_type.css" }, + { + "family": "JetBrains Mono", + "status": "ok", + "tokens": ["--font-mono"], + "path": "colors_and_type.css" + } + ], + "source": "spa" +} diff --git a/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/colors_and_type.css b/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/colors_and_type.css new file mode 100755 index 0000000..58df265 --- /dev/null +++ b/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/colors_and_type.css @@ -0,0 +1,219 @@ +/* ========================================================================== + Webview Bundle — Colors & Type + + Based on the Fumadocs "black" preset + the project's blue cube identity. + The product is a Rust/TypeScript open-source library and docs site — + the vibe is minimal, technical, developer-tooling. + ========================================================================== */ + +/* Webfonts (Google Fonts fallbacks — the real repo uses @fontsource/inter and + @fontsource-variable/jetbrains-mono which are identical to the Google + Fonts versions.) */ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap'); + +:root { + /* -------- BRAND -------- */ + /* The cube logo's blue spectrum, from light (top face) to deep (right face). */ + --wvb-blue-50: #EAF5FF; + --wvb-blue-100: #CFE8FF; + --wvb-blue-200: #9DD1FF; + --wvb-blue-300: #65B8FF; + --wvb-blue-400: #2E9FFF; /* cube top highlight */ + --wvb-blue-500: #1286F5; /* brand primary */ + --wvb-blue-600: #0B6AD6; + --wvb-blue-700: #0A55B0; + --wvb-blue-800: #093E84; + --wvb-blue-900: #08285A; + + /* -------- NEUTRAL (grayscale — Fumadocs "black" theme is pure neutral) -------- */ + --wvb-neutral-0: #FFFFFF; + --wvb-neutral-50: #FAFAFA; + --wvb-neutral-100: #F4F4F5; + --wvb-neutral-200: #E4E4E7; + --wvb-neutral-300: #D4D4D8; + --wvb-neutral-400: #A1A1AA; + --wvb-neutral-500: #71717A; + --wvb-neutral-600: #52525B; + --wvb-neutral-700: #3F3F46; + --wvb-neutral-800: #27272A; + --wvb-neutral-900: #18181B; + --wvb-neutral-950: #0A0A0A; + + /* -------- SEMANTIC (light mode — follows Fumadocs black preset) -------- */ + --fg-1: var(--wvb-neutral-950); /* primary text */ + --fg-2: var(--wvb-neutral-700); /* secondary text */ + --fg-3: var(--wvb-neutral-500); /* muted text / captions */ + --fg-4: var(--wvb-neutral-400); /* placeholder / disabled */ + + --bg-1: var(--wvb-neutral-0); /* page background */ + --bg-2: var(--wvb-neutral-50); /* subtle surface (card on page) */ + --bg-3: var(--wvb-neutral-100); /* raised surface (code block, input) */ + --bg-inverse: var(--wvb-neutral-950); + + --border-1: var(--wvb-neutral-200); /* default border */ + --border-2: var(--wvb-neutral-300); /* stronger border */ + + --accent: var(--wvb-blue-500); /* interactive/brand accent */ + --accent-hover: var(--wvb-blue-600); + --accent-fg: #FFFFFF; + --accent-subtle: var(--wvb-blue-50); /* tinted background for callouts */ + + --success: #16A34A; + --warning: #D97706; + --danger: #DC2626; + --info: var(--wvb-blue-500); + + /* -------- TYPE SCALE -------- */ + --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + --font-mono: 'JetBrains Mono', 'SF Mono', Menlo, Consolas, monospace; + + /* Fluid-ish scale rooted in 16px base (Tailwind-like) */ + --text-xs: 12px; + --text-sm: 14px; + --text-base: 16px; + --text-lg: 18px; + --text-xl: 20px; + --text-2xl: 24px; + --text-3xl: 30px; + --text-4xl: 36px; + --text-5xl: 48px; + --text-6xl: 60px; + + --leading-tight: 1.15; + --leading-snug: 1.35; + --leading-normal: 1.55; + --leading-relaxed: 1.7; + + --weight-regular: 400; + --weight-medium: 500; + --weight-semibold: 600; + --weight-bold: 700; + + --tracking-tight: -0.022em; + --tracking-normal: 0; + --tracking-wide: 0.04em; /* used on the header "WEBVIEW BUNDLE" wordmark */ + + /* -------- SPACING / RADII / SHADOWS -------- */ + --space-1: 4px; + --space-2: 8px; + --space-3: 12px; + --space-4: 16px; + --space-5: 20px; + --space-6: 24px; + --space-8: 32px; + --space-10: 40px; + --space-12: 48px; + --space-16: 64px; + + --radius-sm: 4px; + --radius-md: 6px; /* shadcn-style default */ + --radius-lg: 8px; + --radius-xl: 12px; + --radius-2xl: 16px; + --radius-full: 9999px; + + --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.04); + --shadow-md: 0 1px 3px 0 rgb(0 0 0 / 0.08), 0 1px 2px -1px rgb(0 0 0 / 0.06); + --shadow-lg: 0 10px 20px -8px rgb(0 0 0 / 0.12), 0 4px 6px -4px rgb(0 0 0 / 0.06); + + /* -------- LAYOUT -------- */ + --header-h: 48px; /* Header.tsx uses h-12 (48px) */ + --container-max: 1400px; +} + +/* -------- DARK MODE (Fumadocs "black" = pure #000 canvas) -------- */ +.dark, [data-theme="dark"] { + --fg-1: var(--wvb-neutral-50); + --fg-2: var(--wvb-neutral-300); + --fg-3: var(--wvb-neutral-400); + --fg-4: var(--wvb-neutral-600); + + --bg-1: #000000; + --bg-2: #0A0A0A; + --bg-3: #141414; + --bg-inverse: var(--wvb-neutral-50); + + --border-1: #1F1F22; + --border-2: #2A2A2E; + + --accent: var(--wvb-blue-400); + --accent-hover: var(--wvb-blue-300); + --accent-fg: var(--wvb-neutral-950); + --accent-subtle: rgba(46, 159, 255, 0.08); +} + +/* ========================================================================== + SEMANTIC ELEMENT STYLES + ========================================================================== */ + +.wvb-h1 { + font-family: var(--font-sans); + font-size: var(--text-4xl); + font-weight: var(--weight-bold); + line-height: var(--leading-tight); + letter-spacing: var(--tracking-tight); + color: var(--fg-1); +} +.wvb-h2 { + font-family: var(--font-sans); + font-size: var(--text-3xl); + font-weight: var(--weight-semibold); + line-height: var(--leading-tight); + letter-spacing: var(--tracking-tight); + color: var(--fg-1); +} +.wvb-h3 { + font-family: var(--font-sans); + font-size: var(--text-2xl); + font-weight: var(--weight-semibold); + line-height: var(--leading-snug); + color: var(--fg-1); +} +.wvb-h4 { + font-family: var(--font-sans); + font-size: var(--text-xl); + font-weight: var(--weight-semibold); + line-height: var(--leading-snug); + color: var(--fg-1); +} +.wvb-p { + font-family: var(--font-sans); + font-size: var(--text-base); + font-weight: var(--weight-regular); + line-height: var(--leading-relaxed); + color: var(--fg-2); +} +.wvb-small { + font-family: var(--font-sans); + font-size: var(--text-sm); + color: var(--fg-3); +} +.wvb-wordmark { + font-family: var(--font-sans); + font-weight: var(--weight-bold); + letter-spacing: var(--tracking-wide); + text-transform: uppercase; +} +.wvb-code, +code { + font-family: var(--font-mono); + font-size: 0.9em; + font-weight: var(--weight-regular); + background: var(--bg-3); + border: 1px solid var(--border-1); + border-radius: var(--radius-sm); + padding: 2px 6px; + color: var(--fg-1); +} +.wvb-pre { + font-family: var(--font-mono); + font-size: var(--text-sm); + background: var(--bg-3); + border: 1px solid var(--border-1); + border-radius: var(--radius-lg); + padding: var(--space-4); + overflow-x: auto; + line-height: var(--leading-normal); + color: var(--fg-1); +} diff --git a/webviews/hacker-news/design/assets/logo-symbol.svg b/webviews/hacker-news/design/assets/logo-symbol.svg new file mode 100755 index 0000000..2b44987 --- /dev/null +++ b/webviews/hacker-news/design/assets/logo-symbol.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/webviews/hacker-news/design/screenshots/demo-full.png b/webviews/hacker-news/design/screenshots/demo-full.png new file mode 100755 index 0000000000000000000000000000000000000000..bb42eff650ee4002bb621ec8900c754f4b219e89 GIT binary patch literal 36982 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 literal 0 HcmV?d00001 diff --git a/webviews/hacker-news/design/screenshots/detail.png b/webviews/hacker-news/design/screenshots/detail.png new file mode 100755 index 0000000000000000000000000000000000000000..e69b90dfea360a9b92066a4850550fe025724e1e GIT binary patch literal 37782 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 literal 0 HcmV?d00001 diff --git a/webviews/hacker-news/design/screenshots/mobile2.png b/webviews/hacker-news/design/screenshots/mobile2.png new file mode 100755 index 0000000000000000000000000000000000000000..0a3fcfd0d4d876903573c4717263e7cff1296f78 GIT binary patch literal 22451 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 AK>z>% literal 0 HcmV?d00001 diff --git a/webviews/hacker-news/design/screenshots/native-statusbar.png b/webviews/hacker-news/design/screenshots/native-statusbar.png new file mode 100755 index 0000000000000000000000000000000000000000..f8914593736817ad7ae96f18a4341db11e292924 GIT binary patch literal 42959 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 { + var __defProp = Object.defineProperty; + var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; + var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + + // src/react.ts + function getReact() { + const R = window.React; + if (!R) throw new Error("dc-runtime: window.React is not available yet"); + return R; + } + function getReactDOM() { + const RD = window.ReactDOM; + if (!RD) throw new Error("dc-runtime: window.ReactDOM is not available yet"); + return RD; + } + var h = ((...args) => getReact().createElement( + ...args + )); + + // src/parse.ts + function parseDcDocument(doc) { + const dc = doc.querySelector("x-dc"); + if (!dc) return null; + const scriptEl = doc.querySelector("script[data-dc-script]"); + const { props, preview } = parseDataProps( + scriptEl?.getAttribute("data-props") ?? null + ); + return { + template: dc.innerHTML, + js: scriptEl ? scriptEl.textContent || "" : "", + props, + preview + }; + } + function parseDcText(src) { + const openMatch = /]*)?>/.exec(src); + if (!openMatch) return null; + const close = src.lastIndexOf(""); + if (close === -1 || close < openMatch.index) return null; + const template = src.slice(openMatch.index + openMatch[0].length, close); + const doc = new DOMParser().parseFromString(src, "text/html"); + const scriptEl = doc.querySelector("script[data-dc-script]"); + const { props, preview } = parseDataProps( + scriptEl?.getAttribute("data-props") ?? null + ); + return { + template, + js: scriptEl ? scriptEl.textContent || "" : "", + props, + preview + }; + } + function parseDataProps(raw) { + if (!raw) return { props: null, preview: null }; + let parsed; + try { + parsed = JSON.parse(raw); + } catch { + return { props: null, preview: null }; + } + if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) { + return { props: null, preview: null }; + } + const obj = parsed; + const preview = obj.$preview && typeof obj.$preview === "object" ? obj.$preview : null; + const rest = {}; + for (const k of Object.keys(obj)) { + if (k[0] !== "$") rest[k] = obj[k]; + } + return { props: Object.keys(rest).length ? rest : null, preview }; + } + function dcNameFromPath(pathname) { + let p = pathname || ""; + try { + p = decodeURIComponent(p); + } catch { + } + const base = p.split("/").pop() || "Root"; + return base.replace(/\.dc\.html$/, "").replace(/\.html?$/, "") || "Root"; + } + + // src/boot.ts + var BASE_CSS = ` + .sc-placeholder{background:rgba(255,255,255,.3);border:1px solid rgba(0,0,0,.5); + border-radius:2px;box-sizing:border-box;overflow:hidden} + @keyframes sc-shine{0%{background-position:100% 50%}100%{background-position:0% 50%}} + @keyframes sc-veil-pulse{0%,100%{opacity:.4}50%{opacity:1}} + html.sc-dc-streaming .sc-placeholder, + html.sc-dc-streaming .sc-interp.sc-missing{position:relative; + background:color-mix(in srgb,currentColor 5%,transparent); + border-color:transparent} + html.sc-dc-streaming .sc-placeholder::before, + html.sc-dc-streaming .sc-interp.sc-missing::before{content:''; + position:absolute;inset:0;pointer-events:none; + background:linear-gradient(90deg,rgba(217,119,87,0) 25%,rgba(247,225,211,.95) 37%,rgba(217,119,87,0) 63%); + background-size:400% 100%;animation:sc-shine .73s ease infinite} + html.sc-dc-streaming::after{content:'';position:fixed;inset:0; + z-index:2147483646;pointer-events:none; + box-shadow:inset 0 0 90px rgba(217,119,87,.16),inset 0 0 22px rgba(217,119,87,.1); + animation:sc-veil-pulse 1.36s ease-in-out infinite} + .sc-placeholder-error{padding:4px 8px;font:11px/1.4 ui-monospace,monospace; + color:rgba(0,0,0,.7);word-break:break-word} + .sc-interp.sc-missing{display:inline-block;width:2em;height:1em;overflow:hidden; + vertical-align:text-bottom;background:rgba(255,255,255,.3);border:1px solid rgba(0,0,0,.5); + border-radius:2px;box-sizing:border-box;color:transparent; + user-select:none} + .sc-interp.sc-unresolved{font-family:ui-monospace,monospace;font-size:.85em; + color:rgba(0,0,0,.5);background:rgba(0,0,0,.05);border-radius:3px; + padding:0 3px} + .sc-host.sc-has-error{position:relative} + .sc-logic-error{position:absolute;top:8px;left:8px;z-index:2147483647;max-width:60ch; + padding:6px 10px;background:#b00020;color:#fff;font:12px/1.4 ui-monospace,monospace; + border-radius:4px;white-space:pre-wrap;pointer-events:none} + /* Mirrors PRINT_BASELINE_CSS in apps/web deck-stage-export.ts \u2014 keep both + in sync until dc-runtime regains a build step. */ + @media print { + @page { margin: 0.5cm; } + html, body { print-color-adjust: exact; -webkit-print-color-adjust: exact; } + section, article, figure, table { break-inside: avoid; } + *, *::before, *::after { + animation-delay: -99s !important; animation-duration: .001s !important; + animation-iteration-count: 1 !important; animation-fill-mode: both !important; + animation-play-state: running !important; transition-duration: 0s !important; + } + } + `; + var FULL_PAGE_CSS = "html,body{height:100%;margin:0}#dc-root,#dc-root>.sc-host{height:100%}"; + function rootNameForDocument(doc, loc) { + let bootPath = loc.pathname || ""; + if (!/\.dc\.html?$/i.test(safeDecode(bootPath))) { + try { + bootPath = new URL(doc.baseURI || "/").pathname; + } catch { + } + } + return dcNameFromPath(bootPath); + } + function safeDecode(s) { + try { + return decodeURIComponent(s); + } catch { + return s; + } + } + function boot(runtime, doc = document) { + const parsed = parseDcDocument(doc); + if (!parsed) return null; + const React = getReact(); + const rootName = rootNameForDocument(doc, location); + runtime.markFetched(rootName); + runtime.adoptParsed(rootName, parsed); + fetch(location.href).then((res) => res.ok ? res.text() : "").then((t) => { + const raw = t ? parseDcText(t) : null; + if (raw?.template) runtime.updateHtml(rootName, raw.template); + }).catch(() => { + }); + const dc = doc.querySelector("x-dc"); + const hostEl = doc.createElement("div"); + hostEl.id = "dc-root"; + dc.replaceWith(hostEl); + if (!parsed.preview) { + const s = doc.createElement("style"); + s.textContent = FULL_PAGE_CSS; + doc.head.appendChild(s); + } + const Root = runtime.getDC(rootName); + const entry = runtime.registry.get(rootName); + function StandaloneRoot() { + const [, setTick] = React.useState(0); + React.useEffect(() => { + const sub = () => setTick((n) => n + 1); + entry.subs.add(sub); + return () => { + entry.subs.delete(sub); + }; + }, []); + return h(Root, entry.propOverrides || null); + } + const ReactDOM = getReactDOM(); + if (ReactDOM.createRoot) + ReactDOM.createRoot(hostEl).render(h(StandaloneRoot)); + else ReactDOM.render(h(StandaloneRoot), hostEl); + return rootName; + } + + // src/expr.ts + var IDENT_RE = /^[A-Za-z_$][A-Za-z0-9_$]*/; + var NUMBER_RE = /^-?\d+(\.\d+)?$/; + function resolve(vals, src) { + const expr = String(src).trim(); + if (!expr) return void 0; + if (expr[0] === "(" && expr[expr.length - 1] === ")" && parensWrapWhole(expr)) { + return resolve(vals, expr.slice(1, -1)); + } + const eq = findTopLevelEquality(expr); + if (eq) { + const lv = resolve(vals, expr.slice(0, eq.index)); + const rv = resolve(vals, expr.slice(eq.index + eq.op.length)); + switch (eq.op) { + case "===": + return lv === rv; + case "!==": + return lv !== rv; + case "==": + return lv == rv; + default: + return lv != rv; + } + } + if (expr[0] === "!") return !resolve(vals, expr.slice(1)); + if (expr === "true") return true; + if (expr === "false") return false; + if (expr === "null") return null; + if (expr === "undefined") return void 0; + if (NUMBER_RE.test(expr)) return Number(expr); + if (expr.length >= 2 && (expr[0] === '"' || expr[0] === "'") && expr[expr.length - 1] === expr[0]) { + return expr.slice(1, -1); + } + return resolvePath(vals, expr); + } + function parensWrapWhole(expr) { + let depth = 0; + for (let i = 0; i < expr.length - 1; i++) { + if (expr[i] === "(") depth++; + else if (expr[i] === ")") { + depth--; + if (depth === 0) return false; + } + } + return true; + } + function findTopLevelEquality(expr) { + let depth = 0; + for (let i = 0; i < expr.length; i++) { + const c = expr[i]; + if (c === "[" || c === "(") depth++; + else if (c === "]" || c === ")") depth--; + else if (depth === 0 && (c === "=" || c === "!") && expr[i + 1] === "=") { + if (i > 0 && (expr[i - 1] === "=" || expr[i - 1] === "!")) continue; + if (!expr.slice(0, i).trim()) continue; + const op = expr[i + 2] === "=" ? c + "==" : c + "="; + return { index: i, op }; + } + } + return null; + } + function resolvePath(vals, expr) { + const head = expr.match(IDENT_RE); + if (!head) return void 0; + let cur = vals == null ? void 0 : vals[head[0]]; + let i = head[0].length; + while (i < expr.length) { + if (expr[i] === ".") { + const m = expr.slice(i + 1).match(IDENT_RE) || expr.slice(i + 1).match(/^\d+/); + if (!m) return void 0; + cur = cur == null ? void 0 : cur[m[0]]; + i += 1 + m[0].length; + } else if (expr[i] === "[") { + let depth = 1; + let j = i + 1; + while (j < expr.length && depth > 0) { + if (expr[j] === "[") depth++; + else if (expr[j] === "]") { + depth--; + if (depth === 0) break; + } + j++; + } + if (depth !== 0) return void 0; + const key = resolve(vals, expr.slice(i + 1, j)); + cur = cur == null ? void 0 : cur[key]; + i = j + 1; + } else { + return void 0; + } + } + return cur; + } + + // src/encode.ts + var CAMEL_ATTR = "sc-camel-"; + var RAW_WRAP = { + select: "sc-raw-select", + table: "sc-raw-table", + tbody: "sc-raw-tbody", + thead: "sc-raw-thead", + tfoot: "sc-raw-tfoot", + tr: "sc-raw-tr", + td: "sc-raw-td", + th: "sc-raw-th", + caption: "sc-raw-caption" + }; + var RAW_UNWRAP = Object.fromEntries( + Object.entries(RAW_WRAP).map(([k, v]) => [v, k]) + ); + var EVENT_MAP = { + onclick: "onClick", + onchange: "onChange", + oninput: "onInput", + onsubmit: "onSubmit", + onkeydown: "onKeyDown", + onkeyup: "onKeyUp", + onkeypress: "onKeyPress", + onmousedown: "onMouseDown", + onmouseup: "onMouseUp", + onmouseenter: "onMouseEnter", + onmouseleave: "onMouseLeave", + onfocus: "onFocus", + onblur: "onBlur", + ondoubleclick: "onDoubleClick", + oncontextmenu: "onContextMenu" + }; + var ATTRS = `(?:[^>"']|"[^"]*"|'[^']*')*`; + var IMPORT_SELF_CLOSE_RE = new RegExp( + "<(x-import|dc-import)(" + ATTRS + ")/>", + "gi" + ); + var CAMEL_ATTR_RE = /(\s)([a-z]+[A-Z][A-Za-z0-9]*)(\s*=)/g; + function encodeCase(html) { + html = html.replace( + IMPORT_SELF_CLOSE_RE, + (_, t, a) => "<" + t + a + ">" + ); + html = html.replace(/)/gi, "/gi, ""); + html = html.replace( + CAMEL_ATTR_RE, + (_, sp, name, eq) => sp + CAMEL_ATTR + name.replace(/[A-Z]/g, (c) => "-" + c.toLowerCase()) + eq + ); + for (const [real, alias] of Object.entries(RAW_WRAP)) { + html = html.replace( + new RegExp("(])", "gi"), + "$1" + alias + ); + } + return html; + } + function kebabToCamel(s) { + return s.replace(/-([a-z])/g, (_, c) => c.toUpperCase()); + } + function cssToObj(css) { + const o = {}; + for (const decl of css.split(";")) { + const i = decl.indexOf(":"); + if (i < 0) continue; + const prop = decl.slice(0, i).trim(); + o[prop.startsWith("--") ? prop : kebabToCamel(prop)] = decl.slice(i + 1).trim(); + } + return o; + } + function compileAttr(raw) { + const whole = raw.match(/^\s*\{\{([\s\S]+?)\}\}\s*$/); + if (whole) { + const path = whole[1]; + return (vals) => resolve(vals, path); + } + if (raw.includes("{{")) { + const parts = raw.split(/\{\{([\s\S]+?)\}\}/g); + return (vals) => parts.map((s, i) => i & 1 ? resolve(vals, s) ?? "" : s).join(""); + } + return () => raw; + } + + // src/compile.ts + function collectProps(node, isComponent, host) { + const propGetters = []; + const pseudoClasses = []; + let hintSize = null; + for (const { name, value } of [...node.attributes]) { + if (name === "sc-name" || name === "data-dc-tpl") continue; + let key = name; + if (key.startsWith(CAMEL_ATTR)) + key = kebabToCamel(key.slice(CAMEL_ATTR.length)); + if (key === "hint-size") { + hintSize = value; + continue; + } + if (key.startsWith("style-")) { + pseudoClasses.push(host.pseudoClass(key.slice(6), value)); + continue; + } + if (isComponent) { + if (key.includes("-")) key = kebabToCamel(key); + } else { + if (key === "class") key = "className"; + else if (key === "for") key = "htmlFor"; + else if (key.startsWith("on")) + key = EVENT_MAP[key] || "on" + key[2].toUpperCase() + key.slice(3); + } + propGetters.push([key, compileAttr(value)]); + } + return { propGetters, pseudoClasses, hintSize }; + } + var HOST_STYLE_PROPS = /* @__PURE__ */ new Set([ + "position", + "left", + "right", + "top", + "bottom", + "inset", + "width", + "height", + "z-index", + "transform" + ]); + function hostPositionStyle(style) { + const all = typeof style === "string" ? cssToObj(style) : style != null && typeof style === "object" ? style : null; + if (!all) return void 0; + const out = {}; + for (const [k, v] of Object.entries(all)) { + const kebab = k.replace(/[A-Z]/g, (c) => "-" + c.toLowerCase()); + if (HOST_STYLE_PROPS.has(kebab)) out[k] = v; + } + return Object.keys(out).length ? out : void 0; + } + function compileTemplate(html, host) { + const tpl = document.createElement("template"); + //! nosemgrep: direct-inner-html-assignment + tpl.innerHTML = encodeCase(html); + let tplN = 0; + (function stamp(node) { + if (node.nodeType === Node.ELEMENT_NODE) { + node.setAttribute("data-dc-tpl", String(tplN++)); + } + for (const c of node.childNodes) stamp(c); + })(tpl.content); + const builders = walkChildren(tpl.content, host); + const render = ((vals, ctx) => builders.map((b, i) => b(vals || {}, ctx, i))); + render.__annotated = tpl.innerHTML; + return render; + } + function walkChildren(node, host) { + return [...node.childNodes].map((c) => walk(c, host)).filter((b) => b != null); + } + function walk(node, host) { + if (node.nodeType === Node.TEXT_NODE) return walkText(node); + if (node.nodeType !== Node.ELEMENT_NODE) return null; + const el = node; + const tag = el.tagName.toLowerCase(); + if (tag === "sc-for") return walkFor(el, host); + if (tag === "sc-if") return walkIf(el, host); + if (tag === "x-import") return walkXImport(el, host); + if (tag === "sc-helmet") return host.helmet(el); + if (tag === "dc-import") return walkComponent(el, host); + return walkElement(el, host); + } + var warnedHoles = /* @__PURE__ */ new Set(); + function warnUnresolved(ctx, what) { + const key = (ctx?.__name || "?") + "\0" + what; + if (warnedHoles.has(key)) return; + warnedHoles.add(key); + console.warn("[dc-runtime] " + (ctx?.__name || "template") + ": " + what); + } + function walkText(node) { + const txt = node.nodeValue ?? ""; + if (!txt.includes("{{")) { + if (!txt.trim() && !txt.includes(" ")) return null; + return () => txt; + } + const parts = txt.split(/\{\{([\s\S]+?)\}\}/g); + return (vals, ctx, key) => h( + getReact().Fragment, + { key }, + ...parts.map((p, i) => { + if (!(i & 1)) return p; + const v = resolve(vals, p); + if (v === void 0) { + if (!ctx?.__streamingNow) { + if (document.body?.hasAttribute("data-dc-editor-on")) { + return h( + "span", + { key: i, className: "sc-interp sc-unresolved" }, + "{{ " + p.trim() + " }}" + ); + } + warnUnresolved( + ctx, + "{{ " + p.trim() + " }} never resolved \u2014 rendered as empty" + ); + return null; + } + return h( + "span", + { key: i, className: "sc-interp sc-missing" }, + p.trim() + ); + } + if (getReact().isValidElement(v) || Array.isArray(v)) { + return h(getReact().Fragment, { key: i }, v); + } + if (v === null || typeof v === "boolean") return null; + return h("span", { key: i, className: "sc-interp" }, String(v)); + }) + ); + } + function walkFor(el, host) { + const listGet = compileAttr(el.getAttribute("list") || ""); + const asName = el.getAttribute("as") || "item"; + const hintN = parseInt(el.getAttribute("hint-placeholder-count") || "0", 10); + const kids = walkChildren(el, host); + const listSrc = el.getAttribute("list") || ""; + return (vals, ctx, key) => { + let list = listGet(vals); + if (!Array.isArray(list)) { + if (!ctx?.__streamingNow) { + if (list !== void 0 && list !== null) { + warnUnresolved( + ctx, + 'sc-for list="' + listSrc + '" is not an array (' + typeof list + ")" + ); + } + list = []; + } else { + list = hintN > 0 ? Array(hintN).fill(void 0) : []; + } + } + return h( + getReact().Fragment, + { key }, + list.map((item, i) => { + const sub = { ...vals, [asName]: item, $index: i }; + return h( + getReact().Fragment, + { key: i }, + kids.map((b, j) => b(sub, ctx, j)) + ); + }) + ); + }; + } + function walkIf(el, host) { + const valGet = compileAttr(el.getAttribute("value") || ""); + const hintRaw = el.getAttribute("hint-placeholder-val"); + const hintGet = hintRaw != null ? compileAttr(hintRaw) : null; + const kids = walkChildren(el, host); + return (vals, ctx, key) => { + let v = valGet(vals); + if (v === void 0 && hintGet && ctx?.__streamingNow) v = hintGet(vals); + return v ? h( + getReact().Fragment, + { key }, + kids.map((b, j) => b(vals, ctx, j)) + ) : null; + }; + } + function walkComponent(el, host) { + const name = el.getAttribute("name") || el.getAttribute("component") || ""; + el.removeAttribute("name"); + el.removeAttribute("component"); + const tplId = el.getAttribute("data-dc-tpl"); + const styleRaw = el.getAttribute("style"); + el.removeAttribute("style"); + const styleGet = styleRaw != null ? compileAttr(styleRaw) : null; + const { propGetters, hintSize } = collectProps(el, true, host); + const kids = walkChildren(el, host); + return (vals, ctx, key) => { + const props = { + key, + __hintSize: hintSize, + __tplId: tplId, + __hostStyle: styleGet ? hostPositionStyle(styleGet(vals)) : void 0 + }; + for (const [k, g] of propGetters) props[k] = g(vals); + if (kids.length) props.children = kids.map((b, j) => b(vals, ctx, j)); + return h(host.component(name), props); + }; + } + function walkXImport(el, host) { + const globalNameGet = compileAttr( + el.getAttribute("component-from-global-scope") || "" + ); + const exportNameGet = compileAttr( + el.getAttribute("component") || el.getAttribute("name") || "" + ); + const url = el.getAttribute("from") || el.getAttribute("src") || el.getAttribute("import") || ""; + const kind = /\.(jsx|tsx)(\?|#|$)/i.test(url) ? "jsx" : "js"; + const tplId = el.getAttribute("data-dc-tpl"); + const styleRaw = el.getAttribute("style"); + el.removeAttribute("style"); + const styleGet = styleRaw != null ? compileAttr(styleRaw) : null; + const wrap = tplId != null || styleGet != null; + const { propGetters, hintSize } = collectProps(el, true, host); + const hasContent = el.children.length > 0 || !!(el.textContent || "").trim(); + const kids = hasContent ? walkChildren(el, host) : []; + const urlBindable = url.includes("{{"); + if (url && !urlBindable) host.loadExternal(kind, url); + const evalName = (g, vals) => { + const v = g(vals); + const s = v == null ? "" : String(v); + return s.includes("{{") ? "" : s; + }; + return (vals, ctx, key) => { + const globalName = evalName(globalNameGet, vals); + const name = globalName || evalName(exportNameGet, vals); + const C = !name || urlBindable ? null : globalName ? host.resolveExternalGlobal(url, globalName) : host.resolveExternal(url, name); + const hostStyle = styleGet ? hostPositionStyle(styleGet(vals)) : void 0; + const wrapper = wrap ? { + key, + className: "sc-host-x", + "data-dc-tpl": tplId, + style: hostStyle || { display: "contents" } + } : null; + if (!C) { + const error = urlBindable ? "x-import `from` cannot contain {{ \u2026 }} \u2014 module URLs are resolved at parse time; use a literal URL" : host.resolveExternalError(url, name); + const ph = host.placeholder({ + key: wrapper ? void 0 : key, + name, + hintSize, + error + }); + return wrapper ? h("div", wrapper, ph) : ph; + } + const props = wrapper ? {} : { key }; + for (const [k, g] of propGetters) { + if (k === "component" || k === "componentFromGlobalScope" || k === "name" || k === "from" || k === "src" || k === "import") { + continue; + } + props[k] = g(vals); + } + if (kids.length) props.children = kids.map((b, j) => b(vals, ctx, j)); + return wrapper ? h("div", wrapper, h(C, props)) : h(C, props); + }; + } + function walkElement(el, host) { + const realTag = RAW_UNWRAP[el.localName] || el.localName; + const tplId = el.getAttribute("data-dc-tpl"); + const { propGetters, pseudoClasses } = collectProps(el, false, host); + const kids = walkChildren(el, host); + return (vals, ctx, key) => { + const props = { key, "data-dc-tpl": tplId }; + for (const [k, g] of propGetters) { + let v = g(vals); + if (k === "style" && typeof v === "string") v = cssToObj(v); + if ((k === "value" || k === "checked") && v === void 0) { + v = k === "checked" ? false : ""; + } + props[k] = v; + } + if (pseudoClasses.length) { + props.className = [props.className, ...pseudoClasses].filter(Boolean).join(" "); + } + return h(realTag, props, ...kids.map((b, j) => b(vals, ctx, j))); + }; + } + + // src/logic.ts + var StreamableLogic = class { + constructor(props) { + __publicField(this, "props"); + __publicField(this, "state", {}); + /** Back-pointer to the wrapper component, installed after construction. */ + __publicField(this, "__host"); + this.props = props || {}; + } + setState(update, cb) { + this.__host && this.__host.__setLogicState(update, cb); + } + forceUpdate() { + this.__host && this.__host.forceUpdate(); + } + componentDidMount() { + } + componentDidUpdate(_prevProps) { + } + componentWillUnmount() { + } + /** The flat object the template renders against (merged over props). */ + renderVals() { + return {}; + } + }; + function evalDcLogic(src) { + //! nosemgrep: eval-and-function-constructor + const fn = new Function( + "DCLogic", + "StreamableLogic", + "React", + src + '\n;return (typeof Component!=="undefined"&&Component)||undefined;' + ); + return fn(StreamableLogic, StreamableLogic, getReact()); + } + + // src/component.ts + function Placeholder({ + name, + hintSize, + streaming, + error + }) { + const [w, hgt] = (hintSize || "100%,60px").split(","); + return h( + "div", + { + className: "sc-placeholder" + (streaming ? " sc-streaming" : ""), + style: { width: w.trim(), height: hgt && hgt.trim() }, + title: name + }, + error ? h( + "div", + { className: "sc-placeholder-error" }, + (name ? name + ": " : "") + error + ) : null + ); + } + function hintToMin(hint) { + if (!hint) return void 0; + const [w, hgt] = hint.split(","); + return { minWidth: w.trim(), minHeight: hgt && hgt.trim() }; + } + function createComponentFactory(registry, ensureFetched) { + const React = getReact(); + const AncestorContext = React.createContext([]); + class StreamableComponent extends React.Component { + constructor(props) { + super(props); + __publicField(this, "__name"); + __publicField(this, "__sub"); + __publicField(this, "__needsDidMount", false); + /** Snapshot of the registry's streaming flags taken at render time — + * builders read it off the RenderCtx (this) to pick placeholder vs + * render-nothing for unresolved values. */ + __publicField(this, "__streamingNow", false); + __publicField(this, "logic"); + this.__name = props.__name; + this.state = { __v: 0, __err: null }; + this.__sub = () => { + this.__reconcileLogic(); + if (this.state.__err) this.setState({ __err: null }); + this.forceUpdate(); + }; + this.__makeLogic(registry.get(this.__name).Logic, null); + ensureFetched(this.__name); + } + /** Error-boundary hook: a render crash anywhere in this DC's subtree + * (its own template, an x-import'd component, a child DC without its + * own deeper boundary) lands here instead of unmounting the page. */ + static getDerivedStateFromError(e) { + return { __err: e instanceof Error && e.message ? e.message : String(e) }; + } + componentDidCatch(e, info) { + console.error( + "[dc-runtime] render error in <" + this.__name + ">:", + e, + info?.componentStack || "" + ); + } + /** Instantiate the logic class (or the no-op base) and adopt `prevState` + * over its initial state — used both at mount and on hot-swap. */ + __makeLogic(Logic, prevState) { + const L = Logic || StreamableLogic; + try { + this.logic = new L(this.__userProps()); + } catch (e) { + console.error(e); + registry.get(this.__name).logicError = this.__name + ": " + (e instanceof Error && e.message ? e.message : String(e)); + this.logic = new StreamableLogic( + this.__userProps() + ); + } + this.logic.__host = this; + if (prevState) + this.logic.state = { ...this.logic.state || {}, ...prevState }; + } + /** The props the author's logic + template see — internal __-prefixed + * wiring stripped. */ + __userProps() { + const { __name, __hintSize, __tplId, __hostStyle, ...rest } = this.props; + return rest; + } + __setLogicState(update, cb) { + const prev = this.logic.state; + const patch = typeof update === "function" ? update(prev) : update; + this.logic.state = { ...prev, ...patch }; + this.setState((s) => ({ __v: s.__v + 1 }), cb); + } + /** Swap the logic instance when the registry's Logic class changed + * (streaming completion, hot reload). State carries over; didMount + * re-fires after the swap commits so refs exist. */ + __reconcileLogic() { + const Next = registry.get(this.__name).Logic; + const Cur = this.logic.constructor; + if (Next === Cur || !Next && Cur === StreamableLogic) + return; + try { + this.logic.componentWillUnmount(); + } catch (e) { + console.error(e); + } + this.__makeLogic(Next, this.logic.state); + this.__needsDidMount = true; + } + componentDidMount() { + registry.get(this.__name).subs.add(this.__sub); + try { + this.logic.componentDidMount(); + } catch (e) { + console.error(e); + } + } + componentDidUpdate(prevProps) { + this.logic.props = this.__userProps(); + if (this.__needsDidMount) { + this.__needsDidMount = false; + try { + this.logic.componentDidMount(); + } catch (e) { + console.error(e); + } + } else { + try { + this.logic.componentDidUpdate(prevProps); + } catch (e) { + console.error(e); + } + } + } + componentWillUnmount() { + registry.get(this.__name).subs.delete(this.__sub); + try { + this.logic.componentWillUnmount(); + } catch (e) { + console.error(e); + } + } + render() { + const r = registry.get(this.__name); + const cls = "sc-host" + (r.htmlStreaming ? " sc-streaming-html" : "") + (r.jsStreaming ? " sc-streaming-js" : ""); + const hintStyle = r.htmlStreaming ? hintToMin(this.props.__hintSize) : void 0; + const hostStyle = this.props.__hostStyle || hintStyle ? { ...hintStyle || {}, ...this.props.__hostStyle || {} } : void 0; + const hostBase = { + className: cls, + style: hostStyle, + "data-sc-name": this.__name, + "data-dc-tpl": this.props.__tplId + }; + const chain = Array.isArray(this.context) ? this.context : []; + if (chain.includes(this.__name)) { + const cycle = [ + ...chain.slice(chain.indexOf(this.__name)), + this.__name + ].join(" \u2192 "); + return h( + "div", + { ...hostBase, className: cls + " sc-has-error" }, + h(Placeholder, { + name: this.__name, + hintSize: this.props.__hintSize, + error: "circular import: " + cycle + }) + ); + } + if (this.state.__err) { + return h( + "div", + { ...hostBase, className: cls + " sc-has-error" }, + h( + "div", + { className: "sc-logic-error" }, + this.__name + ": " + this.state.__err + ), + h(Placeholder, { + name: this.__name, + hintSize: this.props.__hintSize, + error: this.state.__err + }) + ); + } + if (!r.tpl) { + return h( + "div", + hostBase, + h(Placeholder, { name: this.__name, hintSize: this.props.__hintSize }) + ); + } + const userProps = this.__userProps(); + this.logic.props = userProps; + let vals = userProps; + let renderErr = r.logicError; + try { + vals = { ...userProps, ...this.logic.renderVals() || {} }; + } catch (e) { + console.error(e); + renderErr = this.__name + ".renderVals(): " + (e instanceof Error && e.message ? e.message : String(e)); + } + this.__streamingNow = !!(r.htmlStreaming || r.jsStreaming); + return h( + "div", + { ...hostBase, className: cls + (renderErr ? " sc-has-error" : "") }, + renderErr && h("div", { className: "sc-logic-error" }, renderErr), + h( + AncestorContext.Provider, + { value: [...chain, this.__name] }, + r.tpl(vals, this) + ) + ); + } + } + __publicField(StreamableComponent, "contextType", AncestorContext); + const named = /* @__PURE__ */ new Map(); + function getDC(name) { + const hit = named.get(name); + if (hit) return hit; + function Dispatcher(p) { + const [, setTick] = React.useState(0); + React.useEffect(() => { + const sub = () => setTick((n) => n + 1); + registry.get(name).subs.add(sub); + return () => { + registry.get(name).subs.delete(sub); + }; + }, []); + ensureFetched(name); + return h(StreamableComponent, { ...p, __name: name }); + } + Dispatcher.displayName = name; + named.set(name, Dispatcher); + return Dispatcher; + } + return { + getDC, + StreamableComponent + }; + } + + // src/external.ts + var isCustomElementName = (n) => !n.includes(".") && n.includes("-"); + function isRenderableType(g) { + if (typeof g === "function") return !isElementClass(g); + return typeof g === "object" && g !== null && typeof g.$$typeof === "symbol"; + } + function resolveDottedPath(root, name) { + let cur = root; + for (const seg of name.split(".")) { + if (cur == null) return void 0; + cur = cur[seg]; + } + return cur; + } + var BABEL_URL = "https://unpkg.com/@babel/standalone@7.26.4/babel.min.js"; + var GLOBAL_POLL_INTERVAL_MS = 50; + var GLOBAL_POLL_TIMEOUT_MS = 3e4; + function createExternalModules(onResolved) { + const cache = /* @__PURE__ */ new Map(); + let babelLoading = null; + const reportedMissing = /* @__PURE__ */ new Map(); + const polling = /* @__PURE__ */ new Set(); + function ensureBabel() { + if (window.Babel) return Promise.resolve(); + if (babelLoading) return babelLoading; + babelLoading = new Promise((res, rej) => { + const s = document.createElement("script"); + s.src = BABEL_URL; + s.crossOrigin = "anonymous"; + s.onload = () => res(); + s.onerror = rej; + document.head.appendChild(s); + }); + return babelLoading; + } + function load(kind, url) { + if (cache.has(url)) return; + cache.set(url, null); + console.info("[dc-runtime] x-import: loading", url, "(" + kind + ")"); + const ready = kind === "jsx" ? ensureBabel() : Promise.resolve(); + ready.then(() => fetch(url)).then((r) => { + if (!r.ok) throw new Error("HTTP " + r.status); + return r.text(); + }).then((src) => { + const code = kind === "jsx" ? window.Babel.transform(src, { + filename: url, + presets: ["react", "typescript"] + }).code : src; + const module = { exports: {} }; + const before = new Set(Object.keys(window)); + //! nosemgrep: eval-and-function-constructor + new Function("React", "module", "exports", "require", code)( + getReact(), + module, + module.exports, + () => ({}) + ); + const globals = {}; + for (const k of Object.keys(window)) { + if (!before.has(k) && typeof window[k] === "function") { + globals[k] = window[k]; + } + } + cache.set(url, { mod: module.exports, globals }); + console.info( + "[dc-runtime] x-import: loaded", + url, + "\u2014 exports:", + Object.keys(module.exports), + "window globals:", + Object.keys(globals) + ); + onResolved(); + }).catch((e) => { + cache.set(url, { + mod: {}, + globals: {}, + error: "failed to load: " + (e instanceof Error && e.message ? e.message : String(e)) + }); + console.error( + "[dc-runtime] x-import: FAILED to load", + url, + "(" + kind + ")", + e + ); + onResolved(); + }); + } + function resolve2(url, name) { + const entry = cache.get(url); + if (!entry) return null; + const { mod, globals } = entry; + const C = mod && mod[name] || globals && globals[name] || typeof window !== "undefined" && window[name] || mod && mod.default; + if (typeof C === "function") return C; + const key = url + "\0" + name; + if (!reportedMissing.has(key)) { + reportedMissing.set( + key, + entry.error || 'no export named "' + name + '" (has: ' + Object.keys(mod).join(", ") + ")" + ); + console.error( + "[dc-runtime] x-import: module", + url, + "loaded but has no component named", + JSON.stringify(name), + "\u2014 available exports:", + Object.keys(mod), + "window globals:", + Object.keys(globals), + ". The module must `module.exports = {" + name + "}` or set `window." + name + "`." + ); + } + return null; + } + function waitForGlobal(name) { + if (polling.has(name)) return; + polling.add(name); + const started = Date.now(); + const isCE = isCustomElementName(name); + const tick = () => { + const found = isCE ? customElements.get(name) : isRenderableType(resolveDottedPath(window, name)); + if (found) { + polling.delete(name); + onResolved(); + return; + } + if (Date.now() - started >= GLOBAL_POLL_TIMEOUT_MS) { + console.warn( + "[dc-runtime] x-import: global", + JSON.stringify(name), + "never appeared on window after " + GLOBAL_POLL_TIMEOUT_MS + "ms" + ); + return; + } + setTimeout(tick, GLOBAL_POLL_INTERVAL_MS); + }; + setTimeout(tick, GLOBAL_POLL_INTERVAL_MS); + } + function resolveGlobal(url, name) { + const isCE = isCustomElementName(name); + if (!url) { + if (isCE) { + if (customElements.get(name)) return name; + waitForGlobal(name); + return null; + } + const g2 = resolveDottedPath(window, name); + if (isRenderableType(g2)) return g2; + waitForGlobal(name); + return null; + } + const entry = cache.get(url); + if (!entry) return null; + if (isCE && customElements.get(name)) return name; + const g = entry.globals[name] ?? resolveDottedPath(window, name); + if (isRenderableType(g)) return g; + if (name.includes(".")) return null; + const key = url + "\0global\0" + name; + if (!reportedMissing.has(key)) { + reportedMissing.set(key, null); + if (isCE && !customElements.get(name)) { + console.warn( + "[dc-runtime] x-import:", + url, + "loaded but no custom element", + JSON.stringify(name), + "is registered and window." + name + " is not a function \u2014 rendering <" + name + "> as an unknown element." + ); + } + } + return name; + } + function getError(url, name) { + const entry = cache.get(url); + if (entry?.error) return entry.error; + return reportedMissing.get(url + "\0" + name) || null; + } + return { load, resolve: resolve2, resolveGlobal, getError }; + } + function isElementClass(g) { + try { + return typeof g === "function" && typeof HTMLElement !== "undefined" && g.prototype instanceof HTMLElement; + } catch { + return false; + } + } + + // src/helmet.ts + function createHelmetManager(doc, isStreaming) { + const mounted = /* @__PURE__ */ new Set(); + const live = /* @__PURE__ */ new Map(); + function compile(node) { + const raw = [...node.children]; + const helmetClosed = node.nextSibling != null || node.parentNode?.nextSibling != null; + return (_vals, ctx) => { + const name = ctx && ctx.__name || ""; + const streaming = !!(name && isStreaming(name)); + for (let i = 0; i < raw.length; i++) { + const child = raw[i]; + const tag = child.tagName; + const mayBePartial = streaming && !helmetClosed && i === raw.length - 1; + if (tag === "SCRIPT") { + if (mayBePartial) continue; + const key = "SCRIPT|" + (child.getAttribute("src") || child.textContent || ""); + if (mounted.has(key)) continue; + mounted.add(key); + const el = doc.createElement("script"); + for (const { name: an, value } of [...child.attributes]) + el.setAttribute(an, value); + if (child.textContent) el.textContent = child.textContent; + doc.head.appendChild(el); + } else if (tag === "LINK" || tag === "META") { + if (mayBePartial) continue; + const key = tag + "|" + (child.getAttribute("href") || child.getAttribute("src") || child.outerHTML); + if (mounted.has(key)) continue; + mounted.add(key); + doc.head.appendChild(child.cloneNode(true)); + } else { + const key = name + "|" + i; + let el = live.get(key); + if (!el || el.tagName !== tag) { + if (el) el.remove(); + el = doc.createElement(tag.toLowerCase()); + live.set(key, el); + doc.head.appendChild(el); + } + for (const { name: an, value } of [...child.attributes]) { + if (el.getAttribute(an) !== value) el.setAttribute(an, value); + } + if (el.textContent !== child.textContent) + el.textContent = child.textContent; + } + } + return null; + }; + } + return { compile }; + } + + // src/pseudo.ts + function createPseudoSheet(doc) { + let el = null; + const cache = /* @__PURE__ */ new Map(); + let n = 0; + return (pseudo, css) => { + const k = pseudo + "|" + css; + const hit = cache.get(k); + if (hit) return hit; + if (!el) { + el = doc.createElement("style"); + doc.head.appendChild(el); + } + const cls = "scp" + (n++).toString(36); + const sel = pseudo === "before" || pseudo === "after" ? "." + cls + "::" + pseudo : "." + cls + ":" + pseudo; + el.sheet.insertRule(sel + "{" + css + "}", el.sheet.cssRules.length); + cache.set(k, cls); + return cls; + }; + } + + // src/registry.ts + function createRegistry() { + const entries = /* @__PURE__ */ Object.create(null); + function get(name) { + return entries[name] || (entries[name] = { + html: "", + tpl: null, + Logic: null, + jsStreaming: false, + htmlStreaming: false, + ver: 0, + subs: /* @__PURE__ */ new Set(), + fetched: false + }); + } + function bump(name) { + const r = get(name); + r.ver++; + for (const fn of r.subs) fn(); + } + return { + entries, + get, + bump, + bumpAll() { + for (const n in entries) bump(n); + } + }; + } + + // src/runtime.ts + var COMPONENT_DIR = "."; + function createRuntime(doc = document) { + const registry = createRegistry(); + const pseudoClass = createPseudoSheet(doc); + const helmet = createHelmetManager( + doc, + (name) => registry.get(name).htmlStreaming + ); + const external = createExternalModules(() => registry.bumpAll()); + const factory = createComponentFactory(registry, ensureFetched); + const host = { + component: (name) => factory.getDC(name), + placeholder: (props) => h(Placeholder, props), + helmet: (node) => helmet.compile(node), + loadExternal: (kind, url) => external.load(kind, url), + resolveExternal: (url, name) => external.resolve(url, name), + resolveExternalGlobal: (url, name) => external.resolveGlobal(url, name), + resolveExternalError: (url, name) => external.getError(url, name), + pseudoClass + }; + function ensureFetched(name) { + const r = registry.get(name); + if (r.fetched) return; + r.fetched = true; + const url = COMPONENT_DIR + "/" + name + ".dc.html"; + fetch(url).then((res) => { + if (!res.ok) { + console.error( + "[dc-runtime] sibling fetch for <" + name + "/> failed:", + url, + "returned", + res.status, + "\u2014 the reference renders as an empty placeholder." + ); + return ""; + } + return res.text(); + }).then((t) => { + if (!t) return; + const parsed = parseDcText(t); + if (!parsed) { + console.error( + "[dc-runtime] sibling fetch for <" + name + "/>:", + url, + "has no block \u2014 not a Design Component." + ); + return; + } + if (parsed.props) r.propsMeta = parsed.props; + if (parsed.preview) r.preview = parsed.preview; + if (parsed.template && !r.html) updateHtml(name, parsed.template); + if (parsed.js && !r.Logic) updateJs(name, parsed.js); + }).catch( + (e) => console.error( + "[dc-runtime] sibling fetch for <" + name + "/> threw:", + url, + e + ) + ); + } + function updateHtml(name, html) { + const r = registry.get(name); + r.html = html; + try { + r.tpl = compileTemplate(html, host); + } catch (e) { + console.error("[dc-runtime] template compile FAILED for", name, e); + } + registry.bump(name); + } + function updateJs(name, src) { + const r = registry.get(name); + const seq = r.jsSeq = (r.jsSeq || 0) + 1; + try { + const Cls = evalDcLogic(src); + if (r.jsSeq !== seq) return; + if (typeof Cls !== "function") { + r.logicError = name + ".dc.html: + + diff --git a/webviews/hacker-news/package.json b/webviews/hacker-news/package.json new file mode 100644 index 0000000..bd18e93 --- /dev/null +++ b/webviews/hacker-news/package.json @@ -0,0 +1,32 @@ +{ + "name": "@wvb-playground/hacker-news", + "version": "0.0.1", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "yarn build:client && yarn build:ssr && yarn prerender", + "build:client": "vite build", + "build:ssr": "vite build --ssr src/entry-server.tsx --outDir dist-ssr --emptyOutDir", + "prerender": "node scripts/prerender.mjs", + "preview": "vite preview", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@fontsource-variable/inter": "^5.2.8", + "@fontsource-variable/jetbrains-mono": "^5.2.8", + "@tanstack/react-router": "1.170.15", + "react": "19.2.7", + "react-dom": "19.2.7" + }, + "devDependencies": { + "@tailwindcss/vite": "4.3.1", + "@tanstack/router-plugin": "1.168.18", + "@types/react": "^19", + "@types/react-dom": "^19", + "@vitejs/plugin-react": "6.0.2", + "tailwindcss": "4.3.1", + "typescript": "6.0.3", + "vite": "8.0.16" + } +} diff --git a/webviews/hacker-news/scripts/prerender.mjs b/webviews/hacker-news/scripts/prerender.mjs new file mode 100644 index 0000000..e9c58d3 --- /dev/null +++ b/webviews/hacker-news/scripts/prerender.mjs @@ -0,0 +1,37 @@ +// Static-site generation step. Runs after the client + SSR builds: +// 1. client build -> dist/ (hashed assets + index.html template) +// 2. ssr build -> dist-ssr/entry-server.js +// 3. this script -> writes dist//index.html for every known route +import { mkdir, readFile, writeFile } from 'node:fs/promises'; +import { dirname, join, resolve } from 'node:path'; +import { getStaticPaths, render } from '../dist-ssr/entry-server.js'; + +const distDir = resolve(process.cwd(), 'dist'); +const template = await readFile(join(distDir, 'index.html'), 'utf8'); + +function escapeHtml(value) { + return value.replace(/&/g, '&').replace(//g, '>'); +} + +function buildPage(appHtml, title) { + let html = template; + html = html.includes('') + ? html.replace('', appHtml) + : html.replace(/(
)(<\/div>)/, `$1${appHtml}$2`); + html = html.replace(/[\s\S]*?<\/title>/, `<title>${escapeHtml(title)}`); + return html; +} + +const paths = getStaticPaths(); +for (const { url, title } of paths) { + const appHtml = await render(url); + const outPath = url === '/' ? join(distDir, 'index.html') : join(distDir, url, 'index.html'); + await mkdir(dirname(outPath), { recursive: true }); + await writeFile(outPath, buildPage(appHtml, title), 'utf8'); +} + +// SPA fallback for any deep link that wasn't prerendered: ship an empty shell +// that the client boots and routes on its own. +await writeFile(join(distDir, '404.html'), buildPage('', 'BUNDLE // news'), 'utf8'); + +console.log(`✓ prerendered ${paths.length} routes + 404.html → dist/`); diff --git a/webviews/hacker-news/src/components/CommentTree.tsx b/webviews/hacker-news/src/components/CommentTree.tsx new file mode 100644 index 0000000..d869fad --- /dev/null +++ b/webviews/hacker-news/src/components/CommentTree.tsx @@ -0,0 +1,99 @@ +import { Link } from '@tanstack/react-router'; +import type { FlatComment } from '../data'; +import { ageLabel, flattenComments } from '../data'; +import { cn } from '../lib/cn'; +import { useAppState, useVote } from '../lib/store'; + +export function CommentTree() { + const { collapsed, toggleCollapse } = useAppState(); + const list = flattenComments(collapsed); + return ( +
+ {list.map(c => ( + toggleCollapse(c.id)} + /> + ))} +
+ ); +} + +function CommentItem({ + c, + collapsed, + onToggle, +}: { + c: FlatComment; + collapsed: boolean; + onToggle: () => void; +}) { + const v = useVote(`c:${c.id}`, c.base); + return ( +
0 ? 12 : 0, + borderLeft: c.depth > 0 ? '1px solid var(--border-1)' : 'none', + }} + > +
+ + + {c.author} + + {c.op && ( + + OP + + )} + + {v.score} pts · {ageLabel(c.age)} + + {collapsed && c.childCount > 0 && ( + · +{c.childCount} hidden + )} +
+ {!collapsed && ( + <> +
+ {c.body} +
+
+ + + reply +
+ + )} +
+ ); +} diff --git a/webviews/hacker-news/src/components/Composer.tsx b/webviews/hacker-news/src/components/Composer.tsx new file mode 100644 index 0000000..96c6534 --- /dev/null +++ b/webviews/hacker-news/src/components/Composer.tsx @@ -0,0 +1,44 @@ +import { useNavigate } from '@tanstack/react-router'; + +const fieldClass = + 'w-full rounded-md border border-border-2 bg-bg-1 px-2.5 py-2 text-[13px] text-fg-1 outline-none transition focus:border-accent focus:ring-[3px] focus:ring-accent/15'; + +/** Inline "create a post" form, opened via the `?compose=true` search param. */ +export function Composer() { + const navigate = useNavigate(); + const close = () => navigate({ to: '/', search: prev => ({ ...prev, compose: undefined }) }); + + return ( +
{ + e.preventDefault(); + close(); + }} + className="mb-3.5 rounded-lg border border-border-1 bg-bg-2 p-3" + > +
create a post
+ + -
- - -
-
- - -
-
- - - -
- {{ resultLabel }} -
- - - - - -
- {{ post.rank }} -
- - {{ post.score }} - -
-
-
- {{ post.title }} - ({{ post.domain }}) -
-
- #{{ post.tag }} - {{ post.score }} pts - by {{ post.author }} - {{ post.age }} - ✦ {{ post.comments }} comments -
-
-
-
- - - -
-
- - {{ post.score }} - -
-
-
- #{{ post.tag }} - posted by {{ post.author }} · {{ post.age }} -
-
{{ post.title }}
-
→ {{ post.domain }}
-
{{ post.snippet }}
-
- ▭ {{ post.comments }} comments - ↗ share - ✦ save -
-
-
-
- -
- - - - - -
- - ← back to feed - -
-
- - {{ cur.score }} - -
-
-
- #{{ cur.tag }} - by {{ cur.author }} - {{ cur.age }} - {{ cur.domain }} -
-

{{ cur.title }}

-

{{ cur.body }}

-
- ▭ {{ cur.comments }} comments - ↗ share - ✦ save -
-
-
- -
- -
-
{{ commentCountLabel }} · sorted by best
- - -
-
- {{ c.toggleGlyph }} - {{ c.author }} - OP - {{ c.score }} pts · {{ c.age }} - · +{{ c.childCount }} hidden -
- -
{{ c.body }}
-
- - - reply -
-
-
-
-
-
- - - -
- - ← back to feed - -
-
{{ prof.monogram }}
-
-
{{ prof.user }}
-
{{ prof.bio }}
-
- {{ prof.karma }} karma - {{ prof.postCount }} posts - joined {{ prof.joined }} -
-
-
-
- - -
- - - -
-
- - {{ post.score }} - -
-
- {{ post.title }} -
#{{ post.tag }} · {{ post.score }} pts · {{ post.age }} · {{ post.comments }} comments
-
-
-
-
- - -
-
commented · {{ c.score }} pts · {{ c.age }}
-
{{ c.body }}
-
-
-
-
-
- - - - - - - - - - - - -
- connected - remote Source · news.wvb.dev - builtin fallback ready - ⟳ synced 2m ago - @wvb/web v1.4.0 -
-
- - - - - - - -
- - - diff --git a/webviews/hacker-news/design/Community Demo.dc.html b/webviews/hacker-news/design/Community Demo.dc.html deleted file mode 100755 index 16c4e0a..0000000 --- a/webviews/hacker-news/design/Community Demo.dc.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - - - - - - - - -
- - -
- -
- BUNDLE - // adaptive community demo -
- -
- FEED STYLE -
- - -
-
- one component · two surfaces -
-
- - -
- - -
-
- DESKTOP - · Electron / Tauri · frameless native window · light -
-
-
- -
-
-
- - -
-
- MOBILE - · iOS / Android webview · dark -
-
-
-
- 9:41 -
- 5G ▰▰▰ ▮ -
-
- -
-
-
-
- -
- - -
-
- Both surfaces render the same Design Component — only mode differs. Vote, sort, filter by tag, open a thread, collapse comments, visit a profile, and toggle each surface’s own light/dark theme — every interaction is live. -
-
- -
-
- - - diff --git a/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/README.md b/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/README.md deleted file mode 100755 index cddaed1..0000000 --- a/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/README.md +++ /dev/null @@ -1,173 +0,0 @@ -# Webview Bundle — Design System - -This folder is a reference design system for **Webview Bundle** (`webview-bundle`), -an open-source offline-first web-resources delivery library for webview-mounted -frameworks/platforms (Electron, Tauri, Android and iOS planned). - -> **What is Webview Bundle?** A format + runtime + CLI for shipping the entire -> web layer of a desktop or mobile app as a single verified, compressed archive -> (`.wvb`). An app can ship "builtin" bundles with its installer and -> hot-swap them at runtime from a `remote` Source (HTTP server) — updates -> without an App Store round-trip. - ---- - -## Sources - -Everything in this system was derived from these two repositories. Nothing is -pre-loaded in the project — assets were imported from them on demand. - -| Repo | Role | Notes | -| --- | --- | --- | -| `github.com/webview-bundle/webview-bundle` | Core monorepo (Rust + TS): `packages/{core,cli,config,electron,tauri,node,remote}`, `examples/`, protocol spec in `packages/core/README.md` | Public | -| `github.com/webview-bundle/website` | Docs site — `fumadocs-ui` + TanStack Start on Cloudflare Workers, deployed via Wrangler | Private; view access required | - -Key files that shaped this system: - -- **`website/src/styles.css`** — type setup: Inter (sans) + JetBrains Mono (mono), Fumadocs "black" preset, Tailwind v4. -- **`website/src/layouts/home/components/Header.tsx`** — the only custom UI; uses the logo + wordmark "WEBVIEW BUNDLE" (uppercase, bold). -- **`website/public/logo.png`** — the blue 3D cube logo (imported to `assets/logo.png`). -- **`webview-bundle/packages/core/README.md`** — the `.wvb` binary format spec, Source layout, and the Remote HTTP protocol (`GET/HEAD /bundles/...`). Drives technical-doc copy style. - -## Products - -Webview Bundle is a **developer library**, not a consumer product. There is effectively **one surface**: the docs website (`webview-bundle/website`), built with `fumadocs-ui`. That's the only place the brand is expressed visually — everything else is code. - -- **Marketing home** (`/`) — currently a placeholder ("Hello World"), sticky minimal header with logo + wordmark. -- **Docs** (`/docs/*`) — Fumadocs layout: left sidebar tree, content, right TOC. - -Because the real site is barely past scaffolding, **this design system proposes a concrete, opinionated direction** for what the marketing home and docs could look like, staying faithful to Inter + JetBrains Mono + the Fumadocs "black" preset + the blue cube. - ---- - -## Content Fundamentals - -Copy in this project is **terse, technical, and neutral** — written for -developers integrating a library, not for end-users. Match this voice when -creating pages or mocks. - -**Voice & tone** -- **Declarative, not marketing-y.** State what the thing is and moves on. - From the root README: *"Webview Bundle is offline-first web resources delivery system for webview mounted frameworks/platforms."* That's the whole pitch. -- **WIP-honest.** The README includes a literal `> [!NOTE] This project is under development.` callout. Don't paper over incompleteness. -- **Third-person / imperative.** "The checksum is the result of…", "Get a bundle metadata with the specified name." Avoid "we" and "you" in reference docs; conversational "you" is okay in guides/tutorials. - -**Casing** -- **Product name:** `Webview Bundle` in prose, `webview-bundle` in code and repo slugs. -- **Wordmark:** `WEBVIEW BUNDLE` — **uppercase, bold, slightly tracked** (this is how the site header renders it). -- **Package names:** lowercase npm-scoped — `@wvb/cli`, `@wvb/electron`, `@wvb/core`. -- **Headings:** Sentence case (`## Webview Bundle Format (.wvb)`), not Title Case. - -**Technical vocabulary — use verbatim** -- `.wvb` — the bundle file extension. -- **Bundle** — one `.wvb` archive for one app/module at one version. -- **Source** — a directory of bundles + `manifest.json` (a store of bundles). -- **builtin** / **remote** — the two Source types (always lowercase, as identifiers). -- **Magic Number**, **Index**, **Data** — the three regions of the binary header (title-cased). -- **xxHash-32**, **lz4 block format** — the exact names of the checksum and compression algorithms; link to specs on first mention. - -**Formatting patterns** -- Spec sections are tables (binary layout) followed by a `### Field` list. -- Protocol endpoints are formatted as HTTP request/response pairs in fenced code blocks tagged ```http request``` with `### Response` as a separator inside the block. -- JSON schemas are shown as examples, not as JSON Schema. -- Use GitHub-flavored callouts: `> [!NOTE]`, `> [!WARNING]`. - -**Emoji** — effectively not used in UI or prose. The one exception is in the **binary format itself**: the magic number `0xf09f8c90 0xf09f8e81` encodes 🌐🎁 as UTF-8. Worth mentioning in docs as a piece of flavor; don't scatter emoji elsewhere. - -**Examples to emulate** (lifted from the source): -> "This returns a list of bundles. Remote bundles must be version-specified. Therefore, bundles with un-deployed versions should be excluded from the response." - -> "It is used as a fallback when the latest bundles cannot be downloaded from the remote, such as during the application's first launch. It is generally treated as **read-only**." - -Short sentences. One fact per sentence. Bold the term being defined. That's the voice. - ---- - -## Visual Foundations - -**Palette.** Monochrome base (pure black/white, Fumadocs "black" preset — `--color-fd-background: hsl(0 0% 0%)` in dark mode, `hsl(0 0% 100%)` in light mode) plus a **single brand accent**: the blue spectrum from the cube logo, anchored at `--wvb-blue-500: #1286F5`. Everything else is zinc-style neutrals. No secondary brand hue. No gradient backgrounds beyond what exists inside the logo itself. - -**Type.** -- `Inter` (variable) for all UI and body copy. Weights used: 400, 500, 600, 700. -- `JetBrains Mono` (variable) for code, terminal output, `.wvb` field names, HTTP specs. -- Sans-serif is the default; mono is reserved for code contexts. -- The wordmark uses Inter **bold uppercase with `letter-spacing: 0.04em`** — see `Header.tsx`. -- `text-rendering: optimizeLegibility`, `-webkit-font-smoothing: antialiased`, `font-synthesis: style`, and `text-autospace: normal` are set globally — preserve these in any mockup. - -**Spacing.** 4px base scale (Tailwind default: 4, 8, 12, 16, 24, 32, 48, 64). Header is **h-12 (48px)**. Content gutters are `p-4` (16px). Breathe — this is a docs site, not an ad. - -**Backgrounds.** Flat solids only. Light mode = `#FFFFFF`; dark mode = pure `#000000` (not `#0A0A0A` — Fumadocs "black" preset is **true black** for OLED). The header uses `backdrop-blur-lg` over a translucent surface when sticky — that's the only transparency effect. - -**Borders.** Single-pixel hairline borders in `--border-1` (`#E4E4E7` light, `#1F1F22` dark). No double borders. No colored borders except for the `--accent` color on focus rings. - -**Shadows.** Minimal. `--shadow-sm` on inputs and dropdown menus; `--shadow-lg` on floating popovers. No soft "Material" glow. **No colored shadows.** - -**Corner radii.** 6px is the default (`--radius-md`, shadcn-style). 4px on badges/code chips, 8px on cards, 12px on modal-scale surfaces, `9999px` on pills/avatars. - -**Animation.** Short, functional. 150–200ms ease-out for hover state fades, 200–300ms ease-in-out for menu open/close. No bounces, no parallax, no scroll-jacking. Match Fumadocs' defaults. - -**Hover states.** Text links: color shifts from `--fg-2` to `--accent` (and underline appears). Surfaces: `--bg-2` → `--bg-3`. Buttons: background darkens one step (`--accent` → `--accent-hover`). - -**Press states.** Brief `scale(0.98)` for primary buttons; otherwise just a darker background step. Nothing flashy. - -**Imagery.** Almost none in-product. The logo is the only brand image. For hero/marketing mocks, favor **monochrome code screenshots** and **isometric/flat diagrams** over photography. If photography is needed, prefer cool-toned, high-contrast, slightly desaturated. - -**Iconography.** Lucide icons (see `ICONOGRAPHY` below) — outline style, 1.5px stroke, 20×20 default. - -**Layout rules.** Docs pages use the classic 3-column Fumadocs layout: sidebar (260px) / content (max 740px for prose) / TOC (220px). Marketing pages should stay within `--container-max: 1400px`, centered, with generous vertical rhythm. - ---- - -## Iconography - -**No custom icon font ships in the codebase.** Fumadocs UI ships with -[Lucide](https://lucide.dev) as its default icon set, and that's what this -project uses. - -- **Primary icon set:** Lucide (outline, 1.5px stroke, currentColor). - Loaded from CDN in mocks: `https://unpkg.com/lucide@latest/dist/umd/lucide.js`. -- **Style:** outline only. 20×20 at default text size, 16×16 inline with small text, 24×24 on nav headers. -- **Color:** always `currentColor` so icons inherit `--fg-2` / `--fg-3`. Use `--accent` sparingly, only to indicate interactive affordance. -- **Emoji:** do not use in UI. The only documented emoji reference is the - `.wvb` magic number (🌐🎁), which is a protocol-level Easter egg and should - only appear when explicitly talking about the magic number. -- **Custom iconography:** the blue cube logo (`assets/logo.png`, cleaned up in - `assets/logo-symbol.svg`) is the product mark. Use it at 32×32 in headers, - 64–128px in hero sections, never smaller than 16×16. -- **Unicode chars as icons:** avoided. Use Lucide. - -> **Substitution flag.** The reference `logo.png` is a detailed 3D illustration -> (dimensional gradient rendering). For UI uses at small sizes, we ship a -> simplified flat vector at `assets/logo-symbol.svg`. **Please review the -> simplified symbol** — swap in your own vector if you'd like a tighter match. - ---- - -## Fonts - -- **Inter** — loaded via Google Fonts CDN in `colors_and_type.css`. The real project uses `@fontsource/inter` (identical files, just self-hosted). Weights 300, 400, 500, 600, 700, 800. -- **JetBrains Mono** — same story; `@fontsource-variable/jetbrains-mono` in code, Google Fonts in mocks. - -> **Substitution flag.** We don't ship the actual `.woff2` files in this design -> system — we link Google Fonts. If you want offline/self-hosted fonts for -> standalone HTML deliverables, download the files from -> `https://fonts.google.com/specimen/Inter` and -> `https://fonts.google.com/specimen/JetBrains+Mono` and drop them into -> `fonts/`. - ---- - -## Index - -``` -colors_and_type.css CSS variables for colors, type, spacing, radii, shadows -assets/ - logo.png Original 3D blue-cube logo (from website/public/logo.png) - logo-symbol.svg Flat simplified cube symbol (for small-scale use) - logo-reference.png Higher-fidelity 3D reference provided by the user -preview/ HTML cards rendered in the Design System tab -ui_kits/ - docs-website/ Fumadocs-style docs + marketing home recreation -SKILL.md Agent Skill entrypoint (Claude Code-compatible) -README.md This file -``` diff --git a/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_adherence.oxlintrc.json b/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_adherence.oxlintrc.json deleted file mode 100755 index fecd168..0000000 --- a/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_adherence.oxlintrc.json +++ /dev/null @@ -1,216 +0,0 @@ -{ - "plugins": ["react", "import"], - "rules": { - "react/forbid-elements": [ - "warn", - { - "forbid": [] - } - ], - "no-restricted-imports": [ - "warn", - { - "patterns": [] - } - ], - "no-restricted-syntax": [ - "warn", - { - "selector": "Literal[value=/#[0-9a-fA-F]{3,8}\\b/]", - "message": "Raw hex color — use a design-system color token via var()." - }, - { - "selector": "Literal[value=/\\b\\d+px\\b/]", - "message": "Raw px value — use a design-system spacing token via var()." - }, - { - "selector": "Literal[value=/font-family\\s*:\\s*(?!['\\\"]?(?:Inter|JetBrains Mono))/i]", - "message": "Font not provided by the design system. Available: Inter, JetBrains Mono." - } - ] - }, - "overrides": [ - { - "files": ["**/index.js"], - "rules": { - "no-restricted-imports": "off" - } - } - ], - "x-omelette": { - "components": {}, - "tokens": [ - "--accent", - "--accent-fg", - "--accent-hover", - "--accent-subtle", - "--bg-1", - "--bg-2", - "--bg-3", - "--bg-inverse", - "--border-1", - "--border-2", - "--container-max", - "--danger", - "--fg-1", - "--fg-2", - "--fg-3", - "--fg-4", - "--font-mono", - "--font-sans", - "--header-h", - "--info", - "--leading-normal", - "--leading-relaxed", - "--leading-snug", - "--leading-tight", - "--radius-2xl", - "--radius-full", - "--radius-lg", - "--radius-md", - "--radius-sm", - "--radius-xl", - "--shadow-lg", - "--shadow-md", - "--shadow-sm", - "--space-1", - "--space-10", - "--space-12", - "--space-16", - "--space-2", - "--space-3", - "--space-4", - "--space-5", - "--space-6", - "--space-8", - "--success", - "--text-2xl", - "--text-3xl", - "--text-4xl", - "--text-5xl", - "--text-6xl", - "--text-base", - "--text-lg", - "--text-sm", - "--text-xl", - "--text-xs", - "--tracking-normal", - "--tracking-tight", - "--tracking-wide", - "--warning", - "--weight-bold", - "--weight-medium", - "--weight-regular", - "--weight-semibold", - "--wvb-blue-100", - "--wvb-blue-200", - "--wvb-blue-300", - "--wvb-blue-400", - "--wvb-blue-50", - "--wvb-blue-500", - "--wvb-blue-600", - "--wvb-blue-700", - "--wvb-blue-800", - "--wvb-blue-900", - "--wvb-neutral-0", - "--wvb-neutral-100", - "--wvb-neutral-200", - "--wvb-neutral-300", - "--wvb-neutral-400", - "--wvb-neutral-50", - "--wvb-neutral-500", - "--wvb-neutral-600", - "--wvb-neutral-700", - "--wvb-neutral-800", - "--wvb-neutral-900", - "--wvb-neutral-950" - ], - "tokenKinds": { - "--wvb-blue-50": "color", - "--wvb-blue-100": "color", - "--wvb-blue-200": "color", - "--wvb-blue-300": "color", - "--wvb-blue-400": "color", - "--wvb-blue-500": "color", - "--wvb-blue-600": "color", - "--wvb-blue-700": "color", - "--wvb-blue-800": "color", - "--wvb-blue-900": "color", - "--wvb-neutral-0": "color", - "--wvb-neutral-50": "color", - "--wvb-neutral-100": "color", - "--wvb-neutral-200": "color", - "--wvb-neutral-300": "color", - "--wvb-neutral-400": "color", - "--wvb-neutral-500": "color", - "--wvb-neutral-600": "color", - "--wvb-neutral-700": "color", - "--wvb-neutral-800": "color", - "--wvb-neutral-900": "color", - "--wvb-neutral-950": "color", - "--fg-1": "color", - "--fg-2": "color", - "--fg-3": "color", - "--fg-4": "color", - "--bg-1": "color", - "--bg-2": "color", - "--bg-3": "color", - "--bg-inverse": "color", - "--border-1": "color", - "--border-2": "color", - "--accent": "color", - "--accent-hover": "color", - "--accent-fg": "color", - "--accent-subtle": "color", - "--success": "color", - "--warning": "color", - "--danger": "color", - "--info": "color", - "--font-sans": "font", - "--font-mono": "font", - "--text-xs": "font", - "--text-sm": "font", - "--text-base": "font", - "--text-lg": "font", - "--text-xl": "font", - "--text-2xl": "font", - "--text-3xl": "font", - "--text-4xl": "font", - "--text-5xl": "font", - "--text-6xl": "font", - "--leading-tight": "font", - "--leading-snug": "font", - "--leading-normal": "font", - "--leading-relaxed": "font", - "--weight-regular": "font", - "--weight-medium": "font", - "--weight-semibold": "font", - "--weight-bold": "font", - "--tracking-tight": "font", - "--tracking-normal": "font", - "--tracking-wide": "font", - "--space-1": "spacing", - "--space-2": "spacing", - "--space-3": "spacing", - "--space-4": "spacing", - "--space-5": "spacing", - "--space-6": "spacing", - "--space-8": "spacing", - "--space-10": "spacing", - "--space-12": "spacing", - "--space-16": "spacing", - "--radius-sm": "radius", - "--radius-md": "radius", - "--radius-lg": "radius", - "--radius-xl": "radius", - "--radius-2xl": "radius", - "--radius-full": "radius", - "--shadow-sm": "shadow", - "--shadow-md": "shadow", - "--shadow-lg": "shadow", - "--header-h": "spacing", - "--container-max": "spacing" - }, - "fontFamilies": ["Inter", "JetBrains Mono"] - } -} diff --git a/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_ds_bundle.js b/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_ds_bundle.js deleted file mode 100755 index f91b93a..0000000 --- a/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_ds_bundle.js +++ /dev/null @@ -1,11 +0,0 @@ -/* @ds-bundle: {"format":3,"namespace":"WebviewBundleDesignSystem_6b8904","components":[],"sourceHashes":{},"inlinedExternals":[],"unexposedExports":[]} */ - -(() => { - -const __ds_ns = (window.WebviewBundleDesignSystem_6b8904 = window.WebviewBundleDesignSystem_6b8904 || {}); - -const __ds_scope = {}; - -(__ds_ns.__errors = __ds_ns.__errors || []); - -})(); diff --git a/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_ds_manifest.json b/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_ds_manifest.json deleted file mode 100755 index d17ca19..0000000 --- a/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/_ds_manifest.json +++ /dev/null @@ -1,513 +0,0 @@ -{ - "namespace": "WebviewBundleDesignSystem_6b8904", - "components": [], - "startingPoints": [], - "cards": [], - "globalCssPaths": ["colors_and_type.css"], - "tokens": [ - { - "name": "--wvb-blue-50", - "value": "#EAF5FF", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-blue-100", - "value": "#CFE8FF", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-blue-200", - "value": "#9DD1FF", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-blue-300", - "value": "#65B8FF", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-blue-400", - "value": "#2E9FFF", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-blue-500", - "value": "#1286F5", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-blue-600", - "value": "#0B6AD6", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-blue-700", - "value": "#0A55B0", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-blue-800", - "value": "#093E84", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-blue-900", - "value": "#08285A", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-neutral-0", - "value": "#FFFFFF", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-neutral-50", - "value": "#FAFAFA", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-neutral-100", - "value": "#F4F4F5", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-neutral-200", - "value": "#E4E4E7", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-neutral-300", - "value": "#D4D4D8", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-neutral-400", - "value": "#A1A1AA", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-neutral-500", - "value": "#71717A", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-neutral-600", - "value": "#52525B", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-neutral-700", - "value": "#3F3F46", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-neutral-800", - "value": "#27272A", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-neutral-900", - "value": "#18181B", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--wvb-neutral-950", - "value": "#0A0A0A", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--fg-1", - "value": "var(--wvb-neutral-950)", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--fg-2", - "value": "var(--wvb-neutral-700)", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--fg-3", - "value": "var(--wvb-neutral-500)", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--fg-4", - "value": "var(--wvb-neutral-400)", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--bg-1", - "value": "var(--wvb-neutral-0)", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--bg-2", - "value": "var(--wvb-neutral-50)", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--bg-3", - "value": "var(--wvb-neutral-100)", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--bg-inverse", - "value": "var(--wvb-neutral-950)", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--border-1", - "value": "var(--wvb-neutral-200)", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--border-2", - "value": "var(--wvb-neutral-300)", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--accent", - "value": "var(--wvb-blue-500)", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--accent-hover", - "value": "var(--wvb-blue-600)", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--accent-fg", - "value": "#FFFFFF", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--accent-subtle", - "value": "var(--wvb-blue-50)", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--success", - "value": "#16A34A", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--warning", - "value": "#D97706", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { "name": "--danger", "value": "#DC2626", "kind": "color", "definedIn": "colors_and_type.css" }, - { - "name": "--info", - "value": "var(--wvb-blue-500)", - "kind": "color", - "definedIn": "colors_and_type.css" - }, - { - "name": "--font-sans", - "value": "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif", - "kind": "font", - "definedIn": "colors_and_type.css" - }, - { - "name": "--font-mono", - "value": "'JetBrains Mono', 'SF Mono', Menlo, Consolas, monospace", - "kind": "font", - "definedIn": "colors_and_type.css" - }, - { "name": "--text-xs", "value": "12px", "kind": "font", "definedIn": "colors_and_type.css" }, - { "name": "--text-sm", "value": "14px", "kind": "font", "definedIn": "colors_and_type.css" }, - { "name": "--text-base", "value": "16px", "kind": "font", "definedIn": "colors_and_type.css" }, - { "name": "--text-lg", "value": "18px", "kind": "font", "definedIn": "colors_and_type.css" }, - { "name": "--text-xl", "value": "20px", "kind": "font", "definedIn": "colors_and_type.css" }, - { "name": "--text-2xl", "value": "24px", "kind": "font", "definedIn": "colors_and_type.css" }, - { "name": "--text-3xl", "value": "30px", "kind": "font", "definedIn": "colors_and_type.css" }, - { "name": "--text-4xl", "value": "36px", "kind": "font", "definedIn": "colors_and_type.css" }, - { "name": "--text-5xl", "value": "48px", "kind": "font", "definedIn": "colors_and_type.css" }, - { "name": "--text-6xl", "value": "60px", "kind": "font", "definedIn": "colors_and_type.css" }, - { - "name": "--leading-tight", - "value": "1.15", - "kind": "font", - "definedIn": "colors_and_type.css" - }, - { - "name": "--leading-snug", - "value": "1.35", - "kind": "font", - "definedIn": "colors_and_type.css" - }, - { - "name": "--leading-normal", - "value": "1.55", - "kind": "font", - "definedIn": "colors_and_type.css" - }, - { - "name": "--leading-relaxed", - "value": "1.7", - "kind": "font", - "definedIn": "colors_and_type.css" - }, - { - "name": "--weight-regular", - "value": "400", - "kind": "font", - "definedIn": "colors_and_type.css" - }, - { - "name": "--weight-medium", - "value": "500", - "kind": "font", - "definedIn": "colors_and_type.css" - }, - { - "name": "--weight-semibold", - "value": "600", - "kind": "font", - "definedIn": "colors_and_type.css" - }, - { "name": "--weight-bold", "value": "700", "kind": "font", "definedIn": "colors_and_type.css" }, - { - "name": "--tracking-tight", - "value": "-0.022em", - "kind": "font", - "definedIn": "colors_and_type.css" - }, - { - "name": "--tracking-normal", - "value": "0", - "kind": "font", - "definedIn": "colors_and_type.css" - }, - { - "name": "--tracking-wide", - "value": "0.04em", - "kind": "font", - "definedIn": "colors_and_type.css" - }, - { "name": "--space-1", "value": "4px", "kind": "spacing", "definedIn": "colors_and_type.css" }, - { "name": "--space-2", "value": "8px", "kind": "spacing", "definedIn": "colors_and_type.css" }, - { "name": "--space-3", "value": "12px", "kind": "spacing", "definedIn": "colors_and_type.css" }, - { "name": "--space-4", "value": "16px", "kind": "spacing", "definedIn": "colors_and_type.css" }, - { "name": "--space-5", "value": "20px", "kind": "spacing", "definedIn": "colors_and_type.css" }, - { "name": "--space-6", "value": "24px", "kind": "spacing", "definedIn": "colors_and_type.css" }, - { "name": "--space-8", "value": "32px", "kind": "spacing", "definedIn": "colors_and_type.css" }, - { - "name": "--space-10", - "value": "40px", - "kind": "spacing", - "definedIn": "colors_and_type.css" - }, - { - "name": "--space-12", - "value": "48px", - "kind": "spacing", - "definedIn": "colors_and_type.css" - }, - { - "name": "--space-16", - "value": "64px", - "kind": "spacing", - "definedIn": "colors_and_type.css" - }, - { "name": "--radius-sm", "value": "4px", "kind": "radius", "definedIn": "colors_and_type.css" }, - { "name": "--radius-md", "value": "6px", "kind": "radius", "definedIn": "colors_and_type.css" }, - { "name": "--radius-lg", "value": "8px", "kind": "radius", "definedIn": "colors_and_type.css" }, - { - "name": "--radius-xl", - "value": "12px", - "kind": "radius", - "definedIn": "colors_and_type.css" - }, - { - "name": "--radius-2xl", - "value": "16px", - "kind": "radius", - "definedIn": "colors_and_type.css" - }, - { - "name": "--radius-full", - "value": "9999px", - "kind": "radius", - "definedIn": "colors_and_type.css" - }, - { - "name": "--shadow-sm", - "value": "0 1px 2px 0 rgb(0 0 0 / 0.04)", - "kind": "shadow", - "definedIn": "colors_and_type.css" - }, - { - "name": "--shadow-md", - "value": "0 1px 3px 0 rgb(0 0 0 / 0.08), 0 1px 2px -1px rgb(0 0 0 / 0.06)", - "kind": "shadow", - "definedIn": "colors_and_type.css" - }, - { - "name": "--shadow-lg", - "value": "0 10px 20px -8px rgb(0 0 0 / 0.12), 0 4px 6px -4px rgb(0 0 0 / 0.06)", - "kind": "shadow", - "definedIn": "colors_and_type.css" - }, - { - "name": "--header-h", - "value": "48px", - "kind": "spacing", - "definedIn": "colors_and_type.css" - }, - { - "name": "--container-max", - "value": "1400px", - "kind": "spacing", - "definedIn": "colors_and_type.css" - }, - { - "name": "--fg-1", - "value": "var(--wvb-neutral-50)", - "kind": "color", - "definedIn": "colors_and_type.css", - "scope": ".dark" - }, - { - "name": "--fg-2", - "value": "var(--wvb-neutral-300)", - "kind": "color", - "definedIn": "colors_and_type.css", - "scope": ".dark" - }, - { - "name": "--fg-3", - "value": "var(--wvb-neutral-400)", - "kind": "color", - "definedIn": "colors_and_type.css", - "scope": ".dark" - }, - { - "name": "--fg-4", - "value": "var(--wvb-neutral-600)", - "kind": "color", - "definedIn": "colors_and_type.css", - "scope": ".dark" - }, - { - "name": "--bg-1", - "value": "#000000", - "kind": "color", - "definedIn": "colors_and_type.css", - "scope": ".dark" - }, - { - "name": "--bg-2", - "value": "#0A0A0A", - "kind": "color", - "definedIn": "colors_and_type.css", - "scope": ".dark" - }, - { - "name": "--bg-3", - "value": "#141414", - "kind": "color", - "definedIn": "colors_and_type.css", - "scope": ".dark" - }, - { - "name": "--bg-inverse", - "value": "var(--wvb-neutral-50)", - "kind": "color", - "definedIn": "colors_and_type.css", - "scope": ".dark" - }, - { - "name": "--border-1", - "value": "#1F1F22", - "kind": "color", - "definedIn": "colors_and_type.css", - "scope": ".dark" - }, - { - "name": "--border-2", - "value": "#2A2A2E", - "kind": "color", - "definedIn": "colors_and_type.css", - "scope": ".dark" - }, - { - "name": "--accent", - "value": "var(--wvb-blue-400)", - "kind": "color", - "definedIn": "colors_and_type.css", - "scope": ".dark" - }, - { - "name": "--accent-hover", - "value": "var(--wvb-blue-300)", - "kind": "color", - "definedIn": "colors_and_type.css", - "scope": ".dark" - }, - { - "name": "--accent-fg", - "value": "var(--wvb-neutral-950)", - "kind": "color", - "definedIn": "colors_and_type.css", - "scope": ".dark" - }, - { - "name": "--accent-subtle", - "value": "rgba(46, 159, 255, 0.08)", - "kind": "color", - "definedIn": "colors_and_type.css", - "scope": ".dark" - } - ], - "themes": [{ "selector": ".dark", "label": "Dark" }], - "fonts": [], - "brandFonts": [ - { "family": "Inter", "status": "ok", "tokens": ["--font-sans"], "path": "colors_and_type.css" }, - { - "family": "JetBrains Mono", - "status": "ok", - "tokens": ["--font-mono"], - "path": "colors_and_type.css" - } - ], - "source": "spa" -} diff --git a/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/colors_and_type.css b/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/colors_and_type.css deleted file mode 100755 index 58df265..0000000 --- a/webviews/hacker-news/design/_ds/webview-bundle-design-system-6b89043d-0f74-4d07-a1c4-474c5f77300e/colors_and_type.css +++ /dev/null @@ -1,219 +0,0 @@ -/* ========================================================================== - Webview Bundle — Colors & Type - - Based on the Fumadocs "black" preset + the project's blue cube identity. - The product is a Rust/TypeScript open-source library and docs site — - the vibe is minimal, technical, developer-tooling. - ========================================================================== */ - -/* Webfonts (Google Fonts fallbacks — the real repo uses @fontsource/inter and - @fontsource-variable/jetbrains-mono which are identical to the Google - Fonts versions.) */ -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap'); -@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap'); - -:root { - /* -------- BRAND -------- */ - /* The cube logo's blue spectrum, from light (top face) to deep (right face). */ - --wvb-blue-50: #EAF5FF; - --wvb-blue-100: #CFE8FF; - --wvb-blue-200: #9DD1FF; - --wvb-blue-300: #65B8FF; - --wvb-blue-400: #2E9FFF; /* cube top highlight */ - --wvb-blue-500: #1286F5; /* brand primary */ - --wvb-blue-600: #0B6AD6; - --wvb-blue-700: #0A55B0; - --wvb-blue-800: #093E84; - --wvb-blue-900: #08285A; - - /* -------- NEUTRAL (grayscale — Fumadocs "black" theme is pure neutral) -------- */ - --wvb-neutral-0: #FFFFFF; - --wvb-neutral-50: #FAFAFA; - --wvb-neutral-100: #F4F4F5; - --wvb-neutral-200: #E4E4E7; - --wvb-neutral-300: #D4D4D8; - --wvb-neutral-400: #A1A1AA; - --wvb-neutral-500: #71717A; - --wvb-neutral-600: #52525B; - --wvb-neutral-700: #3F3F46; - --wvb-neutral-800: #27272A; - --wvb-neutral-900: #18181B; - --wvb-neutral-950: #0A0A0A; - - /* -------- SEMANTIC (light mode — follows Fumadocs black preset) -------- */ - --fg-1: var(--wvb-neutral-950); /* primary text */ - --fg-2: var(--wvb-neutral-700); /* secondary text */ - --fg-3: var(--wvb-neutral-500); /* muted text / captions */ - --fg-4: var(--wvb-neutral-400); /* placeholder / disabled */ - - --bg-1: var(--wvb-neutral-0); /* page background */ - --bg-2: var(--wvb-neutral-50); /* subtle surface (card on page) */ - --bg-3: var(--wvb-neutral-100); /* raised surface (code block, input) */ - --bg-inverse: var(--wvb-neutral-950); - - --border-1: var(--wvb-neutral-200); /* default border */ - --border-2: var(--wvb-neutral-300); /* stronger border */ - - --accent: var(--wvb-blue-500); /* interactive/brand accent */ - --accent-hover: var(--wvb-blue-600); - --accent-fg: #FFFFFF; - --accent-subtle: var(--wvb-blue-50); /* tinted background for callouts */ - - --success: #16A34A; - --warning: #D97706; - --danger: #DC2626; - --info: var(--wvb-blue-500); - - /* -------- TYPE SCALE -------- */ - --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; - --font-mono: 'JetBrains Mono', 'SF Mono', Menlo, Consolas, monospace; - - /* Fluid-ish scale rooted in 16px base (Tailwind-like) */ - --text-xs: 12px; - --text-sm: 14px; - --text-base: 16px; - --text-lg: 18px; - --text-xl: 20px; - --text-2xl: 24px; - --text-3xl: 30px; - --text-4xl: 36px; - --text-5xl: 48px; - --text-6xl: 60px; - - --leading-tight: 1.15; - --leading-snug: 1.35; - --leading-normal: 1.55; - --leading-relaxed: 1.7; - - --weight-regular: 400; - --weight-medium: 500; - --weight-semibold: 600; - --weight-bold: 700; - - --tracking-tight: -0.022em; - --tracking-normal: 0; - --tracking-wide: 0.04em; /* used on the header "WEBVIEW BUNDLE" wordmark */ - - /* -------- SPACING / RADII / SHADOWS -------- */ - --space-1: 4px; - --space-2: 8px; - --space-3: 12px; - --space-4: 16px; - --space-5: 20px; - --space-6: 24px; - --space-8: 32px; - --space-10: 40px; - --space-12: 48px; - --space-16: 64px; - - --radius-sm: 4px; - --radius-md: 6px; /* shadcn-style default */ - --radius-lg: 8px; - --radius-xl: 12px; - --radius-2xl: 16px; - --radius-full: 9999px; - - --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.04); - --shadow-md: 0 1px 3px 0 rgb(0 0 0 / 0.08), 0 1px 2px -1px rgb(0 0 0 / 0.06); - --shadow-lg: 0 10px 20px -8px rgb(0 0 0 / 0.12), 0 4px 6px -4px rgb(0 0 0 / 0.06); - - /* -------- LAYOUT -------- */ - --header-h: 48px; /* Header.tsx uses h-12 (48px) */ - --container-max: 1400px; -} - -/* -------- DARK MODE (Fumadocs "black" = pure #000 canvas) -------- */ -.dark, [data-theme="dark"] { - --fg-1: var(--wvb-neutral-50); - --fg-2: var(--wvb-neutral-300); - --fg-3: var(--wvb-neutral-400); - --fg-4: var(--wvb-neutral-600); - - --bg-1: #000000; - --bg-2: #0A0A0A; - --bg-3: #141414; - --bg-inverse: var(--wvb-neutral-50); - - --border-1: #1F1F22; - --border-2: #2A2A2E; - - --accent: var(--wvb-blue-400); - --accent-hover: var(--wvb-blue-300); - --accent-fg: var(--wvb-neutral-950); - --accent-subtle: rgba(46, 159, 255, 0.08); -} - -/* ========================================================================== - SEMANTIC ELEMENT STYLES - ========================================================================== */ - -.wvb-h1 { - font-family: var(--font-sans); - font-size: var(--text-4xl); - font-weight: var(--weight-bold); - line-height: var(--leading-tight); - letter-spacing: var(--tracking-tight); - color: var(--fg-1); -} -.wvb-h2 { - font-family: var(--font-sans); - font-size: var(--text-3xl); - font-weight: var(--weight-semibold); - line-height: var(--leading-tight); - letter-spacing: var(--tracking-tight); - color: var(--fg-1); -} -.wvb-h3 { - font-family: var(--font-sans); - font-size: var(--text-2xl); - font-weight: var(--weight-semibold); - line-height: var(--leading-snug); - color: var(--fg-1); -} -.wvb-h4 { - font-family: var(--font-sans); - font-size: var(--text-xl); - font-weight: var(--weight-semibold); - line-height: var(--leading-snug); - color: var(--fg-1); -} -.wvb-p { - font-family: var(--font-sans); - font-size: var(--text-base); - font-weight: var(--weight-regular); - line-height: var(--leading-relaxed); - color: var(--fg-2); -} -.wvb-small { - font-family: var(--font-sans); - font-size: var(--text-sm); - color: var(--fg-3); -} -.wvb-wordmark { - font-family: var(--font-sans); - font-weight: var(--weight-bold); - letter-spacing: var(--tracking-wide); - text-transform: uppercase; -} -.wvb-code, -code { - font-family: var(--font-mono); - font-size: 0.9em; - font-weight: var(--weight-regular); - background: var(--bg-3); - border: 1px solid var(--border-1); - border-radius: var(--radius-sm); - padding: 2px 6px; - color: var(--fg-1); -} -.wvb-pre { - font-family: var(--font-mono); - font-size: var(--text-sm); - background: var(--bg-3); - border: 1px solid var(--border-1); - border-radius: var(--radius-lg); - padding: var(--space-4); - overflow-x: auto; - line-height: var(--leading-normal); - color: var(--fg-1); -} diff --git a/webviews/hacker-news/design/assets/logo-symbol.svg b/webviews/hacker-news/design/assets/logo-symbol.svg deleted file mode 100755 index 2b44987..0000000 --- a/webviews/hacker-news/design/assets/logo-symbol.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/webviews/hacker-news/design/screenshots/demo-full.png b/webviews/hacker-news/design/screenshots/demo-full.png deleted file mode 100755 index bb42eff650ee4002bb621ec8900c754f4b219e89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36982 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 diff --git a/webviews/hacker-news/design/screenshots/detail.png b/webviews/hacker-news/design/screenshots/detail.png deleted file mode 100755 index e69b90dfea360a9b92066a4850550fe025724e1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37782 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 diff --git a/webviews/hacker-news/design/screenshots/mobile2.png b/webviews/hacker-news/design/screenshots/mobile2.png deleted file mode 100755 index 0a3fcfd0d4d876903573c4717263e7cff1296f78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22451 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 AK>z>% diff --git a/webviews/hacker-news/design/screenshots/native-statusbar.png b/webviews/hacker-news/design/screenshots/native-statusbar.png deleted file mode 100755 index f8914593736817ad7ae96f18a4341db11e292924..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42959 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 { - var __defProp = Object.defineProperty; - var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; - var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); - - // src/react.ts - function getReact() { - const R = window.React; - if (!R) throw new Error("dc-runtime: window.React is not available yet"); - return R; - } - function getReactDOM() { - const RD = window.ReactDOM; - if (!RD) throw new Error("dc-runtime: window.ReactDOM is not available yet"); - return RD; - } - var h = ((...args) => getReact().createElement( - ...args - )); - - // src/parse.ts - function parseDcDocument(doc) { - const dc = doc.querySelector("x-dc"); - if (!dc) return null; - const scriptEl = doc.querySelector("script[data-dc-script]"); - const { props, preview } = parseDataProps( - scriptEl?.getAttribute("data-props") ?? null - ); - return { - template: dc.innerHTML, - js: scriptEl ? scriptEl.textContent || "" : "", - props, - preview - }; - } - function parseDcText(src) { - const openMatch = /]*)?>/.exec(src); - if (!openMatch) return null; - const close = src.lastIndexOf(""); - if (close === -1 || close < openMatch.index) return null; - const template = src.slice(openMatch.index + openMatch[0].length, close); - const doc = new DOMParser().parseFromString(src, "text/html"); - const scriptEl = doc.querySelector("script[data-dc-script]"); - const { props, preview } = parseDataProps( - scriptEl?.getAttribute("data-props") ?? null - ); - return { - template, - js: scriptEl ? scriptEl.textContent || "" : "", - props, - preview - }; - } - function parseDataProps(raw) { - if (!raw) return { props: null, preview: null }; - let parsed; - try { - parsed = JSON.parse(raw); - } catch { - return { props: null, preview: null }; - } - if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) { - return { props: null, preview: null }; - } - const obj = parsed; - const preview = obj.$preview && typeof obj.$preview === "object" ? obj.$preview : null; - const rest = {}; - for (const k of Object.keys(obj)) { - if (k[0] !== "$") rest[k] = obj[k]; - } - return { props: Object.keys(rest).length ? rest : null, preview }; - } - function dcNameFromPath(pathname) { - let p = pathname || ""; - try { - p = decodeURIComponent(p); - } catch { - } - const base = p.split("/").pop() || "Root"; - return base.replace(/\.dc\.html$/, "").replace(/\.html?$/, "") || "Root"; - } - - // src/boot.ts - var BASE_CSS = ` - .sc-placeholder{background:rgba(255,255,255,.3);border:1px solid rgba(0,0,0,.5); - border-radius:2px;box-sizing:border-box;overflow:hidden} - @keyframes sc-shine{0%{background-position:100% 50%}100%{background-position:0% 50%}} - @keyframes sc-veil-pulse{0%,100%{opacity:.4}50%{opacity:1}} - html.sc-dc-streaming .sc-placeholder, - html.sc-dc-streaming .sc-interp.sc-missing{position:relative; - background:color-mix(in srgb,currentColor 5%,transparent); - border-color:transparent} - html.sc-dc-streaming .sc-placeholder::before, - html.sc-dc-streaming .sc-interp.sc-missing::before{content:''; - position:absolute;inset:0;pointer-events:none; - background:linear-gradient(90deg,rgba(217,119,87,0) 25%,rgba(247,225,211,.95) 37%,rgba(217,119,87,0) 63%); - background-size:400% 100%;animation:sc-shine .73s ease infinite} - html.sc-dc-streaming::after{content:'';position:fixed;inset:0; - z-index:2147483646;pointer-events:none; - box-shadow:inset 0 0 90px rgba(217,119,87,.16),inset 0 0 22px rgba(217,119,87,.1); - animation:sc-veil-pulse 1.36s ease-in-out infinite} - .sc-placeholder-error{padding:4px 8px;font:11px/1.4 ui-monospace,monospace; - color:rgba(0,0,0,.7);word-break:break-word} - .sc-interp.sc-missing{display:inline-block;width:2em;height:1em;overflow:hidden; - vertical-align:text-bottom;background:rgba(255,255,255,.3);border:1px solid rgba(0,0,0,.5); - border-radius:2px;box-sizing:border-box;color:transparent; - user-select:none} - .sc-interp.sc-unresolved{font-family:ui-monospace,monospace;font-size:.85em; - color:rgba(0,0,0,.5);background:rgba(0,0,0,.05);border-radius:3px; - padding:0 3px} - .sc-host.sc-has-error{position:relative} - .sc-logic-error{position:absolute;top:8px;left:8px;z-index:2147483647;max-width:60ch; - padding:6px 10px;background:#b00020;color:#fff;font:12px/1.4 ui-monospace,monospace; - border-radius:4px;white-space:pre-wrap;pointer-events:none} - /* Mirrors PRINT_BASELINE_CSS in apps/web deck-stage-export.ts \u2014 keep both - in sync until dc-runtime regains a build step. */ - @media print { - @page { margin: 0.5cm; } - html, body { print-color-adjust: exact; -webkit-print-color-adjust: exact; } - section, article, figure, table { break-inside: avoid; } - *, *::before, *::after { - animation-delay: -99s !important; animation-duration: .001s !important; - animation-iteration-count: 1 !important; animation-fill-mode: both !important; - animation-play-state: running !important; transition-duration: 0s !important; - } - } - `; - var FULL_PAGE_CSS = "html,body{height:100%;margin:0}#dc-root,#dc-root>.sc-host{height:100%}"; - function rootNameForDocument(doc, loc) { - let bootPath = loc.pathname || ""; - if (!/\.dc\.html?$/i.test(safeDecode(bootPath))) { - try { - bootPath = new URL(doc.baseURI || "/").pathname; - } catch { - } - } - return dcNameFromPath(bootPath); - } - function safeDecode(s) { - try { - return decodeURIComponent(s); - } catch { - return s; - } - } - function boot(runtime, doc = document) { - const parsed = parseDcDocument(doc); - if (!parsed) return null; - const React = getReact(); - const rootName = rootNameForDocument(doc, location); - runtime.markFetched(rootName); - runtime.adoptParsed(rootName, parsed); - fetch(location.href).then((res) => res.ok ? res.text() : "").then((t) => { - const raw = t ? parseDcText(t) : null; - if (raw?.template) runtime.updateHtml(rootName, raw.template); - }).catch(() => { - }); - const dc = doc.querySelector("x-dc"); - const hostEl = doc.createElement("div"); - hostEl.id = "dc-root"; - dc.replaceWith(hostEl); - if (!parsed.preview) { - const s = doc.createElement("style"); - s.textContent = FULL_PAGE_CSS; - doc.head.appendChild(s); - } - const Root = runtime.getDC(rootName); - const entry = runtime.registry.get(rootName); - function StandaloneRoot() { - const [, setTick] = React.useState(0); - React.useEffect(() => { - const sub = () => setTick((n) => n + 1); - entry.subs.add(sub); - return () => { - entry.subs.delete(sub); - }; - }, []); - return h(Root, entry.propOverrides || null); - } - const ReactDOM = getReactDOM(); - if (ReactDOM.createRoot) - ReactDOM.createRoot(hostEl).render(h(StandaloneRoot)); - else ReactDOM.render(h(StandaloneRoot), hostEl); - return rootName; - } - - // src/expr.ts - var IDENT_RE = /^[A-Za-z_$][A-Za-z0-9_$]*/; - var NUMBER_RE = /^-?\d+(\.\d+)?$/; - function resolve(vals, src) { - const expr = String(src).trim(); - if (!expr) return void 0; - if (expr[0] === "(" && expr[expr.length - 1] === ")" && parensWrapWhole(expr)) { - return resolve(vals, expr.slice(1, -1)); - } - const eq = findTopLevelEquality(expr); - if (eq) { - const lv = resolve(vals, expr.slice(0, eq.index)); - const rv = resolve(vals, expr.slice(eq.index + eq.op.length)); - switch (eq.op) { - case "===": - return lv === rv; - case "!==": - return lv !== rv; - case "==": - return lv == rv; - default: - return lv != rv; - } - } - if (expr[0] === "!") return !resolve(vals, expr.slice(1)); - if (expr === "true") return true; - if (expr === "false") return false; - if (expr === "null") return null; - if (expr === "undefined") return void 0; - if (NUMBER_RE.test(expr)) return Number(expr); - if (expr.length >= 2 && (expr[0] === '"' || expr[0] === "'") && expr[expr.length - 1] === expr[0]) { - return expr.slice(1, -1); - } - return resolvePath(vals, expr); - } - function parensWrapWhole(expr) { - let depth = 0; - for (let i = 0; i < expr.length - 1; i++) { - if (expr[i] === "(") depth++; - else if (expr[i] === ")") { - depth--; - if (depth === 0) return false; - } - } - return true; - } - function findTopLevelEquality(expr) { - let depth = 0; - for (let i = 0; i < expr.length; i++) { - const c = expr[i]; - if (c === "[" || c === "(") depth++; - else if (c === "]" || c === ")") depth--; - else if (depth === 0 && (c === "=" || c === "!") && expr[i + 1] === "=") { - if (i > 0 && (expr[i - 1] === "=" || expr[i - 1] === "!")) continue; - if (!expr.slice(0, i).trim()) continue; - const op = expr[i + 2] === "=" ? c + "==" : c + "="; - return { index: i, op }; - } - } - return null; - } - function resolvePath(vals, expr) { - const head = expr.match(IDENT_RE); - if (!head) return void 0; - let cur = vals == null ? void 0 : vals[head[0]]; - let i = head[0].length; - while (i < expr.length) { - if (expr[i] === ".") { - const m = expr.slice(i + 1).match(IDENT_RE) || expr.slice(i + 1).match(/^\d+/); - if (!m) return void 0; - cur = cur == null ? void 0 : cur[m[0]]; - i += 1 + m[0].length; - } else if (expr[i] === "[") { - let depth = 1; - let j = i + 1; - while (j < expr.length && depth > 0) { - if (expr[j] === "[") depth++; - else if (expr[j] === "]") { - depth--; - if (depth === 0) break; - } - j++; - } - if (depth !== 0) return void 0; - const key = resolve(vals, expr.slice(i + 1, j)); - cur = cur == null ? void 0 : cur[key]; - i = j + 1; - } else { - return void 0; - } - } - return cur; - } - - // src/encode.ts - var CAMEL_ATTR = "sc-camel-"; - var RAW_WRAP = { - select: "sc-raw-select", - table: "sc-raw-table", - tbody: "sc-raw-tbody", - thead: "sc-raw-thead", - tfoot: "sc-raw-tfoot", - tr: "sc-raw-tr", - td: "sc-raw-td", - th: "sc-raw-th", - caption: "sc-raw-caption" - }; - var RAW_UNWRAP = Object.fromEntries( - Object.entries(RAW_WRAP).map(([k, v]) => [v, k]) - ); - var EVENT_MAP = { - onclick: "onClick", - onchange: "onChange", - oninput: "onInput", - onsubmit: "onSubmit", - onkeydown: "onKeyDown", - onkeyup: "onKeyUp", - onkeypress: "onKeyPress", - onmousedown: "onMouseDown", - onmouseup: "onMouseUp", - onmouseenter: "onMouseEnter", - onmouseleave: "onMouseLeave", - onfocus: "onFocus", - onblur: "onBlur", - ondoubleclick: "onDoubleClick", - oncontextmenu: "onContextMenu" - }; - var ATTRS = `(?:[^>"']|"[^"]*"|'[^']*')*`; - var IMPORT_SELF_CLOSE_RE = new RegExp( - "<(x-import|dc-import)(" + ATTRS + ")/>", - "gi" - ); - var CAMEL_ATTR_RE = /(\s)([a-z]+[A-Z][A-Za-z0-9]*)(\s*=)/g; - function encodeCase(html) { - html = html.replace( - IMPORT_SELF_CLOSE_RE, - (_, t, a) => "<" + t + a + ">" - ); - html = html.replace(/)/gi, "/gi, ""); - html = html.replace( - CAMEL_ATTR_RE, - (_, sp, name, eq) => sp + CAMEL_ATTR + name.replace(/[A-Z]/g, (c) => "-" + c.toLowerCase()) + eq - ); - for (const [real, alias] of Object.entries(RAW_WRAP)) { - html = html.replace( - new RegExp("(])", "gi"), - "$1" + alias - ); - } - return html; - } - function kebabToCamel(s) { - return s.replace(/-([a-z])/g, (_, c) => c.toUpperCase()); - } - function cssToObj(css) { - const o = {}; - for (const decl of css.split(";")) { - const i = decl.indexOf(":"); - if (i < 0) continue; - const prop = decl.slice(0, i).trim(); - o[prop.startsWith("--") ? prop : kebabToCamel(prop)] = decl.slice(i + 1).trim(); - } - return o; - } - function compileAttr(raw) { - const whole = raw.match(/^\s*\{\{([\s\S]+?)\}\}\s*$/); - if (whole) { - const path = whole[1]; - return (vals) => resolve(vals, path); - } - if (raw.includes("{{")) { - const parts = raw.split(/\{\{([\s\S]+?)\}\}/g); - return (vals) => parts.map((s, i) => i & 1 ? resolve(vals, s) ?? "" : s).join(""); - } - return () => raw; - } - - // src/compile.ts - function collectProps(node, isComponent, host) { - const propGetters = []; - const pseudoClasses = []; - let hintSize = null; - for (const { name, value } of [...node.attributes]) { - if (name === "sc-name" || name === "data-dc-tpl") continue; - let key = name; - if (key.startsWith(CAMEL_ATTR)) - key = kebabToCamel(key.slice(CAMEL_ATTR.length)); - if (key === "hint-size") { - hintSize = value; - continue; - } - if (key.startsWith("style-")) { - pseudoClasses.push(host.pseudoClass(key.slice(6), value)); - continue; - } - if (isComponent) { - if (key.includes("-")) key = kebabToCamel(key); - } else { - if (key === "class") key = "className"; - else if (key === "for") key = "htmlFor"; - else if (key.startsWith("on")) - key = EVENT_MAP[key] || "on" + key[2].toUpperCase() + key.slice(3); - } - propGetters.push([key, compileAttr(value)]); - } - return { propGetters, pseudoClasses, hintSize }; - } - var HOST_STYLE_PROPS = /* @__PURE__ */ new Set([ - "position", - "left", - "right", - "top", - "bottom", - "inset", - "width", - "height", - "z-index", - "transform" - ]); - function hostPositionStyle(style) { - const all = typeof style === "string" ? cssToObj(style) : style != null && typeof style === "object" ? style : null; - if (!all) return void 0; - const out = {}; - for (const [k, v] of Object.entries(all)) { - const kebab = k.replace(/[A-Z]/g, (c) => "-" + c.toLowerCase()); - if (HOST_STYLE_PROPS.has(kebab)) out[k] = v; - } - return Object.keys(out).length ? out : void 0; - } - function compileTemplate(html, host) { - const tpl = document.createElement("template"); - //! nosemgrep: direct-inner-html-assignment - tpl.innerHTML = encodeCase(html); - let tplN = 0; - (function stamp(node) { - if (node.nodeType === Node.ELEMENT_NODE) { - node.setAttribute("data-dc-tpl", String(tplN++)); - } - for (const c of node.childNodes) stamp(c); - })(tpl.content); - const builders = walkChildren(tpl.content, host); - const render = ((vals, ctx) => builders.map((b, i) => b(vals || {}, ctx, i))); - render.__annotated = tpl.innerHTML; - return render; - } - function walkChildren(node, host) { - return [...node.childNodes].map((c) => walk(c, host)).filter((b) => b != null); - } - function walk(node, host) { - if (node.nodeType === Node.TEXT_NODE) return walkText(node); - if (node.nodeType !== Node.ELEMENT_NODE) return null; - const el = node; - const tag = el.tagName.toLowerCase(); - if (tag === "sc-for") return walkFor(el, host); - if (tag === "sc-if") return walkIf(el, host); - if (tag === "x-import") return walkXImport(el, host); - if (tag === "sc-helmet") return host.helmet(el); - if (tag === "dc-import") return walkComponent(el, host); - return walkElement(el, host); - } - var warnedHoles = /* @__PURE__ */ new Set(); - function warnUnresolved(ctx, what) { - const key = (ctx?.__name || "?") + "\0" + what; - if (warnedHoles.has(key)) return; - warnedHoles.add(key); - console.warn("[dc-runtime] " + (ctx?.__name || "template") + ": " + what); - } - function walkText(node) { - const txt = node.nodeValue ?? ""; - if (!txt.includes("{{")) { - if (!txt.trim() && !txt.includes(" ")) return null; - return () => txt; - } - const parts = txt.split(/\{\{([\s\S]+?)\}\}/g); - return (vals, ctx, key) => h( - getReact().Fragment, - { key }, - ...parts.map((p, i) => { - if (!(i & 1)) return p; - const v = resolve(vals, p); - if (v === void 0) { - if (!ctx?.__streamingNow) { - if (document.body?.hasAttribute("data-dc-editor-on")) { - return h( - "span", - { key: i, className: "sc-interp sc-unresolved" }, - "{{ " + p.trim() + " }}" - ); - } - warnUnresolved( - ctx, - "{{ " + p.trim() + " }} never resolved \u2014 rendered as empty" - ); - return null; - } - return h( - "span", - { key: i, className: "sc-interp sc-missing" }, - p.trim() - ); - } - if (getReact().isValidElement(v) || Array.isArray(v)) { - return h(getReact().Fragment, { key: i }, v); - } - if (v === null || typeof v === "boolean") return null; - return h("span", { key: i, className: "sc-interp" }, String(v)); - }) - ); - } - function walkFor(el, host) { - const listGet = compileAttr(el.getAttribute("list") || ""); - const asName = el.getAttribute("as") || "item"; - const hintN = parseInt(el.getAttribute("hint-placeholder-count") || "0", 10); - const kids = walkChildren(el, host); - const listSrc = el.getAttribute("list") || ""; - return (vals, ctx, key) => { - let list = listGet(vals); - if (!Array.isArray(list)) { - if (!ctx?.__streamingNow) { - if (list !== void 0 && list !== null) { - warnUnresolved( - ctx, - 'sc-for list="' + listSrc + '" is not an array (' + typeof list + ")" - ); - } - list = []; - } else { - list = hintN > 0 ? Array(hintN).fill(void 0) : []; - } - } - return h( - getReact().Fragment, - { key }, - list.map((item, i) => { - const sub = { ...vals, [asName]: item, $index: i }; - return h( - getReact().Fragment, - { key: i }, - kids.map((b, j) => b(sub, ctx, j)) - ); - }) - ); - }; - } - function walkIf(el, host) { - const valGet = compileAttr(el.getAttribute("value") || ""); - const hintRaw = el.getAttribute("hint-placeholder-val"); - const hintGet = hintRaw != null ? compileAttr(hintRaw) : null; - const kids = walkChildren(el, host); - return (vals, ctx, key) => { - let v = valGet(vals); - if (v === void 0 && hintGet && ctx?.__streamingNow) v = hintGet(vals); - return v ? h( - getReact().Fragment, - { key }, - kids.map((b, j) => b(vals, ctx, j)) - ) : null; - }; - } - function walkComponent(el, host) { - const name = el.getAttribute("name") || el.getAttribute("component") || ""; - el.removeAttribute("name"); - el.removeAttribute("component"); - const tplId = el.getAttribute("data-dc-tpl"); - const styleRaw = el.getAttribute("style"); - el.removeAttribute("style"); - const styleGet = styleRaw != null ? compileAttr(styleRaw) : null; - const { propGetters, hintSize } = collectProps(el, true, host); - const kids = walkChildren(el, host); - return (vals, ctx, key) => { - const props = { - key, - __hintSize: hintSize, - __tplId: tplId, - __hostStyle: styleGet ? hostPositionStyle(styleGet(vals)) : void 0 - }; - for (const [k, g] of propGetters) props[k] = g(vals); - if (kids.length) props.children = kids.map((b, j) => b(vals, ctx, j)); - return h(host.component(name), props); - }; - } - function walkXImport(el, host) { - const globalNameGet = compileAttr( - el.getAttribute("component-from-global-scope") || "" - ); - const exportNameGet = compileAttr( - el.getAttribute("component") || el.getAttribute("name") || "" - ); - const url = el.getAttribute("from") || el.getAttribute("src") || el.getAttribute("import") || ""; - const kind = /\.(jsx|tsx)(\?|#|$)/i.test(url) ? "jsx" : "js"; - const tplId = el.getAttribute("data-dc-tpl"); - const styleRaw = el.getAttribute("style"); - el.removeAttribute("style"); - const styleGet = styleRaw != null ? compileAttr(styleRaw) : null; - const wrap = tplId != null || styleGet != null; - const { propGetters, hintSize } = collectProps(el, true, host); - const hasContent = el.children.length > 0 || !!(el.textContent || "").trim(); - const kids = hasContent ? walkChildren(el, host) : []; - const urlBindable = url.includes("{{"); - if (url && !urlBindable) host.loadExternal(kind, url); - const evalName = (g, vals) => { - const v = g(vals); - const s = v == null ? "" : String(v); - return s.includes("{{") ? "" : s; - }; - return (vals, ctx, key) => { - const globalName = evalName(globalNameGet, vals); - const name = globalName || evalName(exportNameGet, vals); - const C = !name || urlBindable ? null : globalName ? host.resolveExternalGlobal(url, globalName) : host.resolveExternal(url, name); - const hostStyle = styleGet ? hostPositionStyle(styleGet(vals)) : void 0; - const wrapper = wrap ? { - key, - className: "sc-host-x", - "data-dc-tpl": tplId, - style: hostStyle || { display: "contents" } - } : null; - if (!C) { - const error = urlBindable ? "x-import `from` cannot contain {{ \u2026 }} \u2014 module URLs are resolved at parse time; use a literal URL" : host.resolveExternalError(url, name); - const ph = host.placeholder({ - key: wrapper ? void 0 : key, - name, - hintSize, - error - }); - return wrapper ? h("div", wrapper, ph) : ph; - } - const props = wrapper ? {} : { key }; - for (const [k, g] of propGetters) { - if (k === "component" || k === "componentFromGlobalScope" || k === "name" || k === "from" || k === "src" || k === "import") { - continue; - } - props[k] = g(vals); - } - if (kids.length) props.children = kids.map((b, j) => b(vals, ctx, j)); - return wrapper ? h("div", wrapper, h(C, props)) : h(C, props); - }; - } - function walkElement(el, host) { - const realTag = RAW_UNWRAP[el.localName] || el.localName; - const tplId = el.getAttribute("data-dc-tpl"); - const { propGetters, pseudoClasses } = collectProps(el, false, host); - const kids = walkChildren(el, host); - return (vals, ctx, key) => { - const props = { key, "data-dc-tpl": tplId }; - for (const [k, g] of propGetters) { - let v = g(vals); - if (k === "style" && typeof v === "string") v = cssToObj(v); - if ((k === "value" || k === "checked") && v === void 0) { - v = k === "checked" ? false : ""; - } - props[k] = v; - } - if (pseudoClasses.length) { - props.className = [props.className, ...pseudoClasses].filter(Boolean).join(" "); - } - return h(realTag, props, ...kids.map((b, j) => b(vals, ctx, j))); - }; - } - - // src/logic.ts - var StreamableLogic = class { - constructor(props) { - __publicField(this, "props"); - __publicField(this, "state", {}); - /** Back-pointer to the wrapper component, installed after construction. */ - __publicField(this, "__host"); - this.props = props || {}; - } - setState(update, cb) { - this.__host && this.__host.__setLogicState(update, cb); - } - forceUpdate() { - this.__host && this.__host.forceUpdate(); - } - componentDidMount() { - } - componentDidUpdate(_prevProps) { - } - componentWillUnmount() { - } - /** The flat object the template renders against (merged over props). */ - renderVals() { - return {}; - } - }; - function evalDcLogic(src) { - //! nosemgrep: eval-and-function-constructor - const fn = new Function( - "DCLogic", - "StreamableLogic", - "React", - src + '\n;return (typeof Component!=="undefined"&&Component)||undefined;' - ); - return fn(StreamableLogic, StreamableLogic, getReact()); - } - - // src/component.ts - function Placeholder({ - name, - hintSize, - streaming, - error - }) { - const [w, hgt] = (hintSize || "100%,60px").split(","); - return h( - "div", - { - className: "sc-placeholder" + (streaming ? " sc-streaming" : ""), - style: { width: w.trim(), height: hgt && hgt.trim() }, - title: name - }, - error ? h( - "div", - { className: "sc-placeholder-error" }, - (name ? name + ": " : "") + error - ) : null - ); - } - function hintToMin(hint) { - if (!hint) return void 0; - const [w, hgt] = hint.split(","); - return { minWidth: w.trim(), minHeight: hgt && hgt.trim() }; - } - function createComponentFactory(registry, ensureFetched) { - const React = getReact(); - const AncestorContext = React.createContext([]); - class StreamableComponent extends React.Component { - constructor(props) { - super(props); - __publicField(this, "__name"); - __publicField(this, "__sub"); - __publicField(this, "__needsDidMount", false); - /** Snapshot of the registry's streaming flags taken at render time — - * builders read it off the RenderCtx (this) to pick placeholder vs - * render-nothing for unresolved values. */ - __publicField(this, "__streamingNow", false); - __publicField(this, "logic"); - this.__name = props.__name; - this.state = { __v: 0, __err: null }; - this.__sub = () => { - this.__reconcileLogic(); - if (this.state.__err) this.setState({ __err: null }); - this.forceUpdate(); - }; - this.__makeLogic(registry.get(this.__name).Logic, null); - ensureFetched(this.__name); - } - /** Error-boundary hook: a render crash anywhere in this DC's subtree - * (its own template, an x-import'd component, a child DC without its - * own deeper boundary) lands here instead of unmounting the page. */ - static getDerivedStateFromError(e) { - return { __err: e instanceof Error && e.message ? e.message : String(e) }; - } - componentDidCatch(e, info) { - console.error( - "[dc-runtime] render error in <" + this.__name + ">:", - e, - info?.componentStack || "" - ); - } - /** Instantiate the logic class (or the no-op base) and adopt `prevState` - * over its initial state — used both at mount and on hot-swap. */ - __makeLogic(Logic, prevState) { - const L = Logic || StreamableLogic; - try { - this.logic = new L(this.__userProps()); - } catch (e) { - console.error(e); - registry.get(this.__name).logicError = this.__name + ": " + (e instanceof Error && e.message ? e.message : String(e)); - this.logic = new StreamableLogic( - this.__userProps() - ); - } - this.logic.__host = this; - if (prevState) - this.logic.state = { ...this.logic.state || {}, ...prevState }; - } - /** The props the author's logic + template see — internal __-prefixed - * wiring stripped. */ - __userProps() { - const { __name, __hintSize, __tplId, __hostStyle, ...rest } = this.props; - return rest; - } - __setLogicState(update, cb) { - const prev = this.logic.state; - const patch = typeof update === "function" ? update(prev) : update; - this.logic.state = { ...prev, ...patch }; - this.setState((s) => ({ __v: s.__v + 1 }), cb); - } - /** Swap the logic instance when the registry's Logic class changed - * (streaming completion, hot reload). State carries over; didMount - * re-fires after the swap commits so refs exist. */ - __reconcileLogic() { - const Next = registry.get(this.__name).Logic; - const Cur = this.logic.constructor; - if (Next === Cur || !Next && Cur === StreamableLogic) - return; - try { - this.logic.componentWillUnmount(); - } catch (e) { - console.error(e); - } - this.__makeLogic(Next, this.logic.state); - this.__needsDidMount = true; - } - componentDidMount() { - registry.get(this.__name).subs.add(this.__sub); - try { - this.logic.componentDidMount(); - } catch (e) { - console.error(e); - } - } - componentDidUpdate(prevProps) { - this.logic.props = this.__userProps(); - if (this.__needsDidMount) { - this.__needsDidMount = false; - try { - this.logic.componentDidMount(); - } catch (e) { - console.error(e); - } - } else { - try { - this.logic.componentDidUpdate(prevProps); - } catch (e) { - console.error(e); - } - } - } - componentWillUnmount() { - registry.get(this.__name).subs.delete(this.__sub); - try { - this.logic.componentWillUnmount(); - } catch (e) { - console.error(e); - } - } - render() { - const r = registry.get(this.__name); - const cls = "sc-host" + (r.htmlStreaming ? " sc-streaming-html" : "") + (r.jsStreaming ? " sc-streaming-js" : ""); - const hintStyle = r.htmlStreaming ? hintToMin(this.props.__hintSize) : void 0; - const hostStyle = this.props.__hostStyle || hintStyle ? { ...hintStyle || {}, ...this.props.__hostStyle || {} } : void 0; - const hostBase = { - className: cls, - style: hostStyle, - "data-sc-name": this.__name, - "data-dc-tpl": this.props.__tplId - }; - const chain = Array.isArray(this.context) ? this.context : []; - if (chain.includes(this.__name)) { - const cycle = [ - ...chain.slice(chain.indexOf(this.__name)), - this.__name - ].join(" \u2192 "); - return h( - "div", - { ...hostBase, className: cls + " sc-has-error" }, - h(Placeholder, { - name: this.__name, - hintSize: this.props.__hintSize, - error: "circular import: " + cycle - }) - ); - } - if (this.state.__err) { - return h( - "div", - { ...hostBase, className: cls + " sc-has-error" }, - h( - "div", - { className: "sc-logic-error" }, - this.__name + ": " + this.state.__err - ), - h(Placeholder, { - name: this.__name, - hintSize: this.props.__hintSize, - error: this.state.__err - }) - ); - } - if (!r.tpl) { - return h( - "div", - hostBase, - h(Placeholder, { name: this.__name, hintSize: this.props.__hintSize }) - ); - } - const userProps = this.__userProps(); - this.logic.props = userProps; - let vals = userProps; - let renderErr = r.logicError; - try { - vals = { ...userProps, ...this.logic.renderVals() || {} }; - } catch (e) { - console.error(e); - renderErr = this.__name + ".renderVals(): " + (e instanceof Error && e.message ? e.message : String(e)); - } - this.__streamingNow = !!(r.htmlStreaming || r.jsStreaming); - return h( - "div", - { ...hostBase, className: cls + (renderErr ? " sc-has-error" : "") }, - renderErr && h("div", { className: "sc-logic-error" }, renderErr), - h( - AncestorContext.Provider, - { value: [...chain, this.__name] }, - r.tpl(vals, this) - ) - ); - } - } - __publicField(StreamableComponent, "contextType", AncestorContext); - const named = /* @__PURE__ */ new Map(); - function getDC(name) { - const hit = named.get(name); - if (hit) return hit; - function Dispatcher(p) { - const [, setTick] = React.useState(0); - React.useEffect(() => { - const sub = () => setTick((n) => n + 1); - registry.get(name).subs.add(sub); - return () => { - registry.get(name).subs.delete(sub); - }; - }, []); - ensureFetched(name); - return h(StreamableComponent, { ...p, __name: name }); - } - Dispatcher.displayName = name; - named.set(name, Dispatcher); - return Dispatcher; - } - return { - getDC, - StreamableComponent - }; - } - - // src/external.ts - var isCustomElementName = (n) => !n.includes(".") && n.includes("-"); - function isRenderableType(g) { - if (typeof g === "function") return !isElementClass(g); - return typeof g === "object" && g !== null && typeof g.$$typeof === "symbol"; - } - function resolveDottedPath(root, name) { - let cur = root; - for (const seg of name.split(".")) { - if (cur == null) return void 0; - cur = cur[seg]; - } - return cur; - } - var BABEL_URL = "https://unpkg.com/@babel/standalone@7.26.4/babel.min.js"; - var GLOBAL_POLL_INTERVAL_MS = 50; - var GLOBAL_POLL_TIMEOUT_MS = 3e4; - function createExternalModules(onResolved) { - const cache = /* @__PURE__ */ new Map(); - let babelLoading = null; - const reportedMissing = /* @__PURE__ */ new Map(); - const polling = /* @__PURE__ */ new Set(); - function ensureBabel() { - if (window.Babel) return Promise.resolve(); - if (babelLoading) return babelLoading; - babelLoading = new Promise((res, rej) => { - const s = document.createElement("script"); - s.src = BABEL_URL; - s.crossOrigin = "anonymous"; - s.onload = () => res(); - s.onerror = rej; - document.head.appendChild(s); - }); - return babelLoading; - } - function load(kind, url) { - if (cache.has(url)) return; - cache.set(url, null); - console.info("[dc-runtime] x-import: loading", url, "(" + kind + ")"); - const ready = kind === "jsx" ? ensureBabel() : Promise.resolve(); - ready.then(() => fetch(url)).then((r) => { - if (!r.ok) throw new Error("HTTP " + r.status); - return r.text(); - }).then((src) => { - const code = kind === "jsx" ? window.Babel.transform(src, { - filename: url, - presets: ["react", "typescript"] - }).code : src; - const module = { exports: {} }; - const before = new Set(Object.keys(window)); - //! nosemgrep: eval-and-function-constructor - new Function("React", "module", "exports", "require", code)( - getReact(), - module, - module.exports, - () => ({}) - ); - const globals = {}; - for (const k of Object.keys(window)) { - if (!before.has(k) && typeof window[k] === "function") { - globals[k] = window[k]; - } - } - cache.set(url, { mod: module.exports, globals }); - console.info( - "[dc-runtime] x-import: loaded", - url, - "\u2014 exports:", - Object.keys(module.exports), - "window globals:", - Object.keys(globals) - ); - onResolved(); - }).catch((e) => { - cache.set(url, { - mod: {}, - globals: {}, - error: "failed to load: " + (e instanceof Error && e.message ? e.message : String(e)) - }); - console.error( - "[dc-runtime] x-import: FAILED to load", - url, - "(" + kind + ")", - e - ); - onResolved(); - }); - } - function resolve2(url, name) { - const entry = cache.get(url); - if (!entry) return null; - const { mod, globals } = entry; - const C = mod && mod[name] || globals && globals[name] || typeof window !== "undefined" && window[name] || mod && mod.default; - if (typeof C === "function") return C; - const key = url + "\0" + name; - if (!reportedMissing.has(key)) { - reportedMissing.set( - key, - entry.error || 'no export named "' + name + '" (has: ' + Object.keys(mod).join(", ") + ")" - ); - console.error( - "[dc-runtime] x-import: module", - url, - "loaded but has no component named", - JSON.stringify(name), - "\u2014 available exports:", - Object.keys(mod), - "window globals:", - Object.keys(globals), - ". The module must `module.exports = {" + name + "}` or set `window." + name + "`." - ); - } - return null; - } - function waitForGlobal(name) { - if (polling.has(name)) return; - polling.add(name); - const started = Date.now(); - const isCE = isCustomElementName(name); - const tick = () => { - const found = isCE ? customElements.get(name) : isRenderableType(resolveDottedPath(window, name)); - if (found) { - polling.delete(name); - onResolved(); - return; - } - if (Date.now() - started >= GLOBAL_POLL_TIMEOUT_MS) { - console.warn( - "[dc-runtime] x-import: global", - JSON.stringify(name), - "never appeared on window after " + GLOBAL_POLL_TIMEOUT_MS + "ms" - ); - return; - } - setTimeout(tick, GLOBAL_POLL_INTERVAL_MS); - }; - setTimeout(tick, GLOBAL_POLL_INTERVAL_MS); - } - function resolveGlobal(url, name) { - const isCE = isCustomElementName(name); - if (!url) { - if (isCE) { - if (customElements.get(name)) return name; - waitForGlobal(name); - return null; - } - const g2 = resolveDottedPath(window, name); - if (isRenderableType(g2)) return g2; - waitForGlobal(name); - return null; - } - const entry = cache.get(url); - if (!entry) return null; - if (isCE && customElements.get(name)) return name; - const g = entry.globals[name] ?? resolveDottedPath(window, name); - if (isRenderableType(g)) return g; - if (name.includes(".")) return null; - const key = url + "\0global\0" + name; - if (!reportedMissing.has(key)) { - reportedMissing.set(key, null); - if (isCE && !customElements.get(name)) { - console.warn( - "[dc-runtime] x-import:", - url, - "loaded but no custom element", - JSON.stringify(name), - "is registered and window." + name + " is not a function \u2014 rendering <" + name + "> as an unknown element." - ); - } - } - return name; - } - function getError(url, name) { - const entry = cache.get(url); - if (entry?.error) return entry.error; - return reportedMissing.get(url + "\0" + name) || null; - } - return { load, resolve: resolve2, resolveGlobal, getError }; - } - function isElementClass(g) { - try { - return typeof g === "function" && typeof HTMLElement !== "undefined" && g.prototype instanceof HTMLElement; - } catch { - return false; - } - } - - // src/helmet.ts - function createHelmetManager(doc, isStreaming) { - const mounted = /* @__PURE__ */ new Set(); - const live = /* @__PURE__ */ new Map(); - function compile(node) { - const raw = [...node.children]; - const helmetClosed = node.nextSibling != null || node.parentNode?.nextSibling != null; - return (_vals, ctx) => { - const name = ctx && ctx.__name || ""; - const streaming = !!(name && isStreaming(name)); - for (let i = 0; i < raw.length; i++) { - const child = raw[i]; - const tag = child.tagName; - const mayBePartial = streaming && !helmetClosed && i === raw.length - 1; - if (tag === "SCRIPT") { - if (mayBePartial) continue; - const key = "SCRIPT|" + (child.getAttribute("src") || child.textContent || ""); - if (mounted.has(key)) continue; - mounted.add(key); - const el = doc.createElement("script"); - for (const { name: an, value } of [...child.attributes]) - el.setAttribute(an, value); - if (child.textContent) el.textContent = child.textContent; - doc.head.appendChild(el); - } else if (tag === "LINK" || tag === "META") { - if (mayBePartial) continue; - const key = tag + "|" + (child.getAttribute("href") || child.getAttribute("src") || child.outerHTML); - if (mounted.has(key)) continue; - mounted.add(key); - doc.head.appendChild(child.cloneNode(true)); - } else { - const key = name + "|" + i; - let el = live.get(key); - if (!el || el.tagName !== tag) { - if (el) el.remove(); - el = doc.createElement(tag.toLowerCase()); - live.set(key, el); - doc.head.appendChild(el); - } - for (const { name: an, value } of [...child.attributes]) { - if (el.getAttribute(an) !== value) el.setAttribute(an, value); - } - if (el.textContent !== child.textContent) - el.textContent = child.textContent; - } - } - return null; - }; - } - return { compile }; - } - - // src/pseudo.ts - function createPseudoSheet(doc) { - let el = null; - const cache = /* @__PURE__ */ new Map(); - let n = 0; - return (pseudo, css) => { - const k = pseudo + "|" + css; - const hit = cache.get(k); - if (hit) return hit; - if (!el) { - el = doc.createElement("style"); - doc.head.appendChild(el); - } - const cls = "scp" + (n++).toString(36); - const sel = pseudo === "before" || pseudo === "after" ? "." + cls + "::" + pseudo : "." + cls + ":" + pseudo; - el.sheet.insertRule(sel + "{" + css + "}", el.sheet.cssRules.length); - cache.set(k, cls); - return cls; - }; - } - - // src/registry.ts - function createRegistry() { - const entries = /* @__PURE__ */ Object.create(null); - function get(name) { - return entries[name] || (entries[name] = { - html: "", - tpl: null, - Logic: null, - jsStreaming: false, - htmlStreaming: false, - ver: 0, - subs: /* @__PURE__ */ new Set(), - fetched: false - }); - } - function bump(name) { - const r = get(name); - r.ver++; - for (const fn of r.subs) fn(); - } - return { - entries, - get, - bump, - bumpAll() { - for (const n in entries) bump(n); - } - }; - } - - // src/runtime.ts - var COMPONENT_DIR = "."; - function createRuntime(doc = document) { - const registry = createRegistry(); - const pseudoClass = createPseudoSheet(doc); - const helmet = createHelmetManager( - doc, - (name) => registry.get(name).htmlStreaming - ); - const external = createExternalModules(() => registry.bumpAll()); - const factory = createComponentFactory(registry, ensureFetched); - const host = { - component: (name) => factory.getDC(name), - placeholder: (props) => h(Placeholder, props), - helmet: (node) => helmet.compile(node), - loadExternal: (kind, url) => external.load(kind, url), - resolveExternal: (url, name) => external.resolve(url, name), - resolveExternalGlobal: (url, name) => external.resolveGlobal(url, name), - resolveExternalError: (url, name) => external.getError(url, name), - pseudoClass - }; - function ensureFetched(name) { - const r = registry.get(name); - if (r.fetched) return; - r.fetched = true; - const url = COMPONENT_DIR + "/" + name + ".dc.html"; - fetch(url).then((res) => { - if (!res.ok) { - console.error( - "[dc-runtime] sibling fetch for <" + name + "/> failed:", - url, - "returned", - res.status, - "\u2014 the reference renders as an empty placeholder." - ); - return ""; - } - return res.text(); - }).then((t) => { - if (!t) return; - const parsed = parseDcText(t); - if (!parsed) { - console.error( - "[dc-runtime] sibling fetch for <" + name + "/>:", - url, - "has no block \u2014 not a Design Component." - ); - return; - } - if (parsed.props) r.propsMeta = parsed.props; - if (parsed.preview) r.preview = parsed.preview; - if (parsed.template && !r.html) updateHtml(name, parsed.template); - if (parsed.js && !r.Logic) updateJs(name, parsed.js); - }).catch( - (e) => console.error( - "[dc-runtime] sibling fetch for <" + name + "/> threw:", - url, - e - ) - ); - } - function updateHtml(name, html) { - const r = registry.get(name); - r.html = html; - try { - r.tpl = compileTemplate(html, host); - } catch (e) { - console.error("[dc-runtime] template compile FAILED for", name, e); - } - registry.bump(name); - } - function updateJs(name, src) { - const r = registry.get(name); - const seq = r.jsSeq = (r.jsSeq || 0) + 1; - try { - const Cls = evalDcLogic(src); - if (r.jsSeq !== seq) return; - if (typeof Cls !== "function") { - r.logicError = name + ".dc.html: