@aphrody/m3-showcase 3.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -0
- package/dist/Album-20-x0fyhqxj.png +0 -0
- package/dist/Album-txdjxr6p.png +0 -0
- package/dist/Album_Light-bnvn9x43.png +0 -0
- package/dist/Alias-20-jpvzp7sd.png +0 -0
- package/dist/Alias-fbqj79wp.png +0 -0
- package/dist/Alias_Light-hv5b8k7t.png +0 -0
- package/dist/AmazonS3-x58haer2.png +0 -0
- package/dist/AndroidPhotos-cj9z6mnt.png +0 -0
- package/dist/AppleFiles-g4g8431e.png +0 -0
- package/dist/ApplePhotos-f2nesvx1.png +0 -0
- package/dist/Application-ft1as292.png +0 -0
- package/dist/Application_Light-h2p2z3de.png +0 -0
- package/dist/Archive-20-y262mxsm.png +0 -0
- package/dist/Archive-vmmq3f0p.png +0 -0
- package/dist/Archive_Light-fqxdt82g.png +0 -0
- package/dist/Audio-20-345hqxr8.png +0 -0
- package/dist/Audio-3w697yx9.png +0 -0
- package/dist/Audio_Light-4pb6z10h.png +0 -0
- package/dist/BackBlaze-6m4qpkyc.png +0 -0
- package/dist/Ball-d0bcgqha.png +0 -0
- package/dist/Book-20-etd4fzhm.png +0 -0
- package/dist/Book-ekfqxh7a.png +0 -0
- package/dist/BookBlue-17k9z7dy.png +0 -0
- package/dist/Book_Light-0n5wsr76.png +0 -0
- package/dist/Box-rd26c0g6.png +0 -0
- package/dist/CloudSync-wxh5ez5h.png +0 -0
- package/dist/CloudSync_Light-nb09rvv4.png +0 -0
- package/dist/Code-20-ybgq5j59.png +0 -0
- package/dist/Collection-20-7g9nzzcf.png +0 -0
- package/dist/Collection-52f2j9wx.png +0 -0
- package/dist/CollectionSparkle-nj38wazp.png +0 -0
- package/dist/CollectionSparkle_Light-hp1jptvv.png +0 -0
- package/dist/Collection_Light-z7p3knd7.png +0 -0
- package/dist/Compute-ghst3emj.png +0 -0
- package/dist/Config-20-vqd0vqeb.png +0 -0
- package/dist/DAV-mr5nm7zs.png +0 -0
- package/dist/Database-20-0q97pw36.png +0 -0
- package/dist/Database-rcxjw7yv.png +0 -0
- package/dist/Database_Light-1dxfaj96.png +0 -0
- package/dist/DeleteLocation-3hw52syq.png +0 -0
- package/dist/Devices-t2f2k803.png +0 -0
- package/dist/Document-20-0f78jpbp.png +0 -0
- package/dist/Document-kgsdt3nq.png +0 -0
- package/dist/Document_Light-ht9avf71.png +0 -0
- package/dist/Document_doc-wqd2zqp2.png +0 -0
- package/dist/Document_doc_Light-4ppbm2he.png +0 -0
- package/dist/Document_memory-6vymqjra.png +0 -0
- package/dist/Document_pdf-7b1zt469.png +0 -0
- package/dist/Document_pdf_Light-42j6dt8z.png +0 -0
- package/dist/Document_srt-symqv91r.png +0 -0
- package/dist/Document_xls-j5tbzav2.png +0 -0
- package/dist/Document_xls_Light-w6kbrvem.png +0 -0
- package/dist/Document_xmp-7xqx4tm8.png +0 -0
- package/dist/Dotfile-20-w53rabv6.png +0 -0
- package/dist/Drive-7wb1bf5w.png +0 -0
- package/dist/Drive-AmazonS3_Light-z6j2s9xm.png +0 -0
- package/dist/Drive-BackBlaze_Light-tr4wfkey.png +0 -0
- package/dist/Drive-DAV_Light-kse85f46.png +0 -0
- package/dist/Drive-Darker-mss4n9ws.png +0 -0
- package/dist/Drive-Dropbox_Light-48naz6gc.png +0 -0
- package/dist/Drive-GoogleDrive_Light-t4d4180c.png +0 -0
- package/dist/Drive-Mega-z6k8n821.png +0 -0
- package/dist/Drive-Mega_Light-nk0qskfb.png +0 -0
- package/dist/Drive-OneDrive-sx649zqw.png +0 -0
- package/dist/Drive-OneDrive_Light-2n556kpe.png +0 -0
- package/dist/Drive-OpenStack-tcs5rge7.png +0 -0
- package/dist/Drive-OpenStack_Light-05qnc2gy.png +0 -0
- package/dist/Drive-PCloud_Light-d0h9kbwp.png +0 -0
- package/dist/Drive-box_Light-0cb17zc1.png +0 -0
- package/dist/Drive_Light-dcjdmxm9.png +0 -0
- package/dist/Dropbox-q4nkmy9v.png +0 -0
- package/dist/Encrypted-20-m8ax3zxz.png +0 -0
- package/dist/Encrypted-ddrf9wk4.png +0 -0
- package/dist/Encrypted_Light-n1mjh529.png +0 -0
- package/dist/Entity-a4438mse.png +0 -0
- package/dist/Entity_Light-acxm9r2c.png +0 -0
- package/dist/Executable-20-fp7e8r9j.png +0 -0
- package/dist/Executable_Light_old-6xd6fa1z.png +0 -0
- package/dist/Executable_old-cyj158kz.png +0 -0
- package/dist/Face_Light-pjctyrvt.png +0 -0
- package/dist/Folder-20-r5505wvj.png +0 -0
- package/dist/Folder-kc594khj.png +0 -0
- package/dist/Folder-tag-xmp-ff4bgkr4.png +0 -0
- package/dist/FolderGrey-2vy13evc.png +0 -0
- package/dist/FolderGrey_Light-7z31xy56.png +0 -0
- package/dist/FolderNoSpace-d65fr1rz.png +0 -0
- package/dist/FolderNoSpace_Light-r5fc4pfj.png +0 -0
- package/dist/Folder_Light-rrg0jy36.png +0 -0
- package/dist/Font-20-r5n0z7f9.png +0 -0
- package/dist/Game-ts1kdw4e.png +0 -0
- package/dist/Game_Light-4d6ty5nz.png +0 -0
- package/dist/Globe-b379ffpd.png +0 -0
- package/dist/GlobeAlt-2mjbsvpp.png +0 -0
- package/dist/Globe_Light-2r9sdhb0.png +0 -0
- package/dist/GoogleDrive-1swewbzf.png +0 -0
- package/dist/GoogleSansFlex-latin-23tdmmt1.woff2 +0 -0
- package/dist/HDD-e85re2j5.png +0 -0
- package/dist/HDD_Light-pfbhb5wg.png +0 -0
- package/dist/Heart-3nx0yjvz.png +0 -0
- package/dist/Heart_Light-msf9zhq6.png +0 -0
- package/dist/Home-waerfpg1.png +0 -0
- package/dist/Home_Light-mdswjrcg.png +0 -0
- package/dist/Image-20-7vvqrhrb.png +0 -0
- package/dist/Image-fz5c8462.png +0 -0
- package/dist/Image_Light-rp0w5n3r.png +0 -0
- package/dist/Indexed-nxd6ctrt.png +0 -0
- package/dist/Key-20-z5nhfv0c.png +0 -0
- package/dist/Key-4en80vnn.png +0 -0
- package/dist/Key_Light-h3pc5e2c.png +0 -0
- package/dist/Keys-9jknyggw.png +0 -0
- package/dist/Keys_Light-5w8kcsmz.png +0 -0
- package/dist/Laptop-9gwskqny.png +0 -0
- package/dist/Laptop_Light-pwtbqbkp.png +0 -0
- package/dist/Link-20-f7hh1tcv.png +0 -0
- package/dist/Link-w9y1yad0.png +0 -0
- package/dist/Link_Light-4dy9pa5j.png +0 -0
- package/dist/Location-7vx0yx6r.png +0 -0
- package/dist/LocationManaged-w1n71jx5.png +0 -0
- package/dist/LocationReplica-4c6ncswq.png +0 -0
- package/dist/Lock-mnveqyfm.png +0 -0
- package/dist/Lock_Light-xwnbzkjz.png +0 -0
- package/dist/Mega-h4j4t3sb.png +0 -0
- package/dist/Mesh-20-rkky209q.png +0 -0
- package/dist/Mesh-efjcay8j.png +0 -0
- package/dist/Mesh_Light-t9yyzb3y.png +0 -0
- package/dist/MiniSilverBox-g8dfw0cp.png +0 -0
- package/dist/Mobile-Android-wy5kr3bj.png +0 -0
- package/dist/Mobile-jpsv7vp8.png +0 -0
- package/dist/Mobile_Light-2rwnn5bx.png +0 -0
- package/dist/MoveLocation-kft0z94v.png +0 -0
- package/dist/MoveLocation_Light-c23j5x59.png +0 -0
- package/dist/Movie-nxat82kv.png +0 -0
- package/dist/Movie_Light-eh1hmsr5.png +0 -0
- package/dist/NewLocation-2hfv9dwq.png +0 -0
- package/dist/Node-wykht7k0.png +0 -0
- package/dist/Node_Light-maewxhk1.png +0 -0
- package/dist/OneDrive-e4jvssjp.png +0 -0
- package/dist/OpenStack-pqp01jfd.png +0 -0
- package/dist/PC-eyfa7ewm.png +0 -0
- package/dist/PCloud-p0n6g1hq.png +0 -0
- package/dist/Package-20-grg5wkse.png +0 -0
- package/dist/Package-d7ex1fnn.png +0 -0
- package/dist/Package_Light-yj2cvgyw.png +0 -0
- package/dist/SD-h17wvz4z.png +0 -0
- package/dist/SD_Light-y3mmqh6b.png +0 -0
- package/dist/Scrapbook-f92c8p1x.png +0 -0
- package/dist/Scrapbook_Light-50pjr0q7.png +0 -0
- package/dist/Screenshot-20-z4tfe78m.png +0 -0
- package/dist/Screenshot-9nd23fde.png +0 -0
- package/dist/ScreenshotAlt-en1yt2gv.png +0 -0
- package/dist/Screenshot_Light-hnbah84r.png +0 -0
- package/dist/Search-7x8c5z1s.png +0 -0
- package/dist/SearchAlt-dmxzk2jb.png +0 -0
- package/dist/Search_Light-n23xd2ws.png +0 -0
- package/dist/Server-hqsf8851.png +0 -0
- package/dist/Server_Light-3x01jqz4.png +0 -0
- package/dist/SilverBox-0mk6sxrh.png +0 -0
- package/dist/Spacedrop-1-d230z0az.png +0 -0
- package/dist/Spacedrop-r1t67bcq.png +0 -0
- package/dist/Spacedrop_Light-dj5tgtep.png +0 -0
- package/dist/Storage-4x2q4nx6.png +0 -0
- package/dist/Sync-531te7fq.png +0 -0
- package/dist/Sync_Light-754vfxyr.png +0 -0
- package/dist/Tablet-ze6ermb7.png +0 -0
- package/dist/Tablet_Light-32skyk12.png +0 -0
- package/dist/Tags-bfapk266.png +0 -0
- package/dist/Tags_Light-7s00envw.png +0 -0
- package/dist/Terminal-t1yjx33x.png +0 -0
- package/dist/Terminal_Light-4s5azdgr.png +0 -0
- package/dist/Text-20-pt0zjg62.png +0 -0
- package/dist/Text-6fgmf4b2.png +0 -0
- package/dist/TextAlt_Light-w9kbgvm8.png +0 -0
- package/dist/Text_Light-c2k3w31k.png +0 -0
- package/dist/Text_txt-xhvv80ys.png +0 -0
- package/dist/TexturedMesh-ysk831xz.png +0 -0
- package/dist/TexturedMesh_Light-4twy5k6k.png +0 -0
- package/dist/Trash-hzscccvk.png +0 -0
- package/dist/Trash_Light-78nc56tp.png +0 -0
- package/dist/Undefined-pkbecmq4.png +0 -0
- package/dist/Undefined_Light-jxesg2zv.png +0 -0
- package/dist/Unknown-20-07efh8ya.png +0 -0
- package/dist/Video-20-q7yg9p4w.png +0 -0
- package/dist/Video-370fzqyw.png +0 -0
- package/dist/Video_Light-00vhrp0m.png +0 -0
- package/dist/WebPageArchive-20-wn0v4x27.png +0 -0
- package/dist/Widget-20-9t860nnc.png +0 -0
- package/dist/Widget-k1p15mg9.png +0 -0
- package/dist/Widget_Light-5md790ar.png +0 -0
- package/dist/ace-ph0rt669.svg +1 -0
- package/dist/acemanifest-je939qnz.svg +1 -0
- package/dist/adoc-kfbf89h8.svg +1 -0
- package/dist/adonis-pn6tbmnq.svg +1 -0
- package/dist/adonisconfig-5wfnycbk.svg +1 -0
- package/dist/afdesign-5nzbppfa.svg +1 -0
- package/dist/afphoto-p941z6q7.svg +1 -0
- package/dist/afpub-3232tcp9.svg +1 -0
- package/dist/ai-vvwvj03w.svg +1 -0
- package/dist/air-e3h8cfx1.svg +1 -0
- package/dist/angular-fyg22v82.svg +1 -0
- package/dist/angular-kzcwnjdt.svg +1 -0
- package/dist/anim-15kqy432.svg +1 -0
- package/dist/astro-wdcxh4zx.svg +1 -0
- package/dist/astroconfig-73qsx73n.svg +1 -0
- package/dist/atomizer-42xe88w7.svg +1 -0
- package/dist/audio-xy5qb7t1.svg +1 -0
- package/dist/audiomp3-s01feh78.svg +1 -0
- package/dist/audioogg-bcake0v6.svg +1 -0
- package/dist/audiowav-px37pxve.svg +1 -0
- package/dist/audiowv-bq8tbfdv.svg +1 -0
- package/dist/azure-veqzyzqq.svg +1 -0
- package/dist/babel-vxcfp57a.svg +1 -0
- package/dist/ballerina-faxx9p3b.svg +1 -0
- package/dist/ballerinaconfig-tmd09kkg.svg +1 -0
- package/dist/bat-vjr63aqs.svg +1 -0
- package/dist/bazel-4e01p5gp.svg +1 -0
- package/dist/bazelignore-wzgc7h2d.svg +1 -0
- package/dist/bicep-dae0dh59.svg +1 -0
- package/dist/bicepconfig-v64442sp.svg +1 -0
- package/dist/bicepparam-ts4jjq60.svg +1 -0
- package/dist/binary-dz3thnjq.svg +1 -0
- package/dist/biome-gbahcmjy.svg +1 -0
- package/dist/blade-je22xc2d.svg +1 -0
- package/dist/brotli-1m7qfk77.svg +1 -0
- package/dist/browserslist-005php91.svg +1 -0
- package/dist/bruno-h4bh0s2c.svg +1 -0
- package/dist/bsconfig-gmwc0r2r.svg +1 -0
- package/dist/buck-gtasjqw1.svg +1 -0
- package/dist/bun-6y6y7t4s.svg +1 -0
- package/dist/bun-zxmcandz.svg +1 -0
- package/dist/bundler-qhs5a5xb.svg +1 -0
- package/dist/bunlock-74b62xbm.svg +1 -0
- package/dist/c-k2se7t6q.svg +1 -0
- package/dist/c-v9cxtxe1.svg +1 -0
- package/dist/cargo-ma5bwyg5.svg +1 -0
- package/dist/cargolock-ak0tnv5y.svg +1 -0
- package/dist/cert-z62mqtqq.svg +1 -0
- package/dist/cheader-mgw2nf38.svg +1 -0
- package/dist/chunk-08yjrfs5.js +2 -0
- package/dist/chunk-2pmrsdd5.js +2 -0
- package/dist/chunk-3995cv9k.js +1 -0
- package/dist/chunk-58a3eq49.js +2 -0
- package/dist/chunk-616szvb9.js +2 -0
- package/dist/chunk-6638b8v6.js +1 -0
- package/dist/chunk-6ej2n64j.js +1 -0
- package/dist/chunk-7tt0cawd.js +10 -0
- package/dist/chunk-9gxv4c5g.js +1 -0
- package/dist/chunk-9na12mjw.js +1 -0
- package/dist/chunk-b7mpjcry.js +1 -0
- package/dist/chunk-c1g6tshf.js +2 -0
- package/dist/chunk-d50zvrb1.css +1 -0
- package/dist/chunk-d6c35fm0.js +2 -0
- package/dist/chunk-ehpz56xv.js +2 -0
- package/dist/chunk-ewtr6sjm.js +9 -0
- package/dist/chunk-g9rnrhvz.js +2 -0
- package/dist/chunk-gv83r4qx.js +262 -0
- package/dist/chunk-j46wg1ym.js +156 -0
- package/dist/chunk-kapsksxf.js +1 -0
- package/dist/chunk-m98tyb4g.js +6 -0
- package/dist/chunk-nn0prq25.js +2 -0
- package/dist/chunk-nsgjb3bx.js +2 -0
- package/dist/chunk-p8r6wjkz.js +3 -0
- package/dist/chunk-rdnm87fw.js +1 -0
- package/dist/chunk-re36kkra.js +1 -0
- package/dist/chunk-vm9edd26.js +2 -0
- package/dist/chunk-x2hztqk0.css +1 -0
- package/dist/chunk-yyxb5zbq.js +2 -0
- package/dist/civet-5bbs33v3.svg +1 -0
- package/dist/claude-jscxahsf.svg +1 -0
- package/dist/cli-4f5nfe5s.svg +1 -0
- package/dist/clojure-0h7h9znc.svg +1 -0
- package/dist/cmake-q8ryfre0.svg +1 -0
- package/dist/cmake-qwe6x8nx.svg +1 -0
- package/dist/codeworkspace-326020b4.svg +1 -0
- package/dist/coffeescript-ec1bytnk.svg +1 -0
- package/dist/commitlint-93j0tfvp.svg +1 -0
- package/dist/compodoc-36b7gn70.svg +1 -0
- package/dist/composer-vv2tvxkr.svg +1 -0
- package/dist/composerlock-nf0232yh.svg +1 -0
- package/dist/conan-dggdfcr9.svg +1 -0
- package/dist/conf-5756g97p.svg +1 -0
- package/dist/copilot-1phy76q3.svg +1 -0
- package/dist/cpp-4yvddm6j.svg +1 -0
- package/dist/cpp-pbznrtpp.svg +1 -0
- package/dist/crystal-x20aj00e.svg +1 -0
- package/dist/csharp-0p3hstq8.svg +1 -0
- package/dist/csharp-cpmfe8y0.svg +1 -0
- package/dist/cshtml-xb5gtb0r.svg +1 -0
- package/dist/csproj-ftptw15a.svg +1 -0
- package/dist/css-tqps22nw.svg +1 -0
- package/dist/css-ycr1qc5f.svg +1 -0
- package/dist/cssmap-3gnm34f6.svg +1 -0
- package/dist/csv-gg0axfar.svg +1 -0
- package/dist/cucumber-m06dfkm5.svg +1 -0
- package/dist/cursor-jw7n7tpq.svg +1 -0
- package/dist/cypress-xsm2fq1p.svg +1 -0
- package/dist/cypressjs-hapzyfm1.svg +1 -0
- package/dist/cypressts-jey9ahc7.svg +1 -0
- package/dist/d-4x2njcan.svg +1 -0
- package/dist/dartlang-7dwdwv03.svg +1 -0
- package/dist/dartlang-mra7r0f8.svg +1 -0
- package/dist/delphiproject-7snmvsdx.svg +1 -0
- package/dist/diff-hekg2jpm.svg +1 -0
- package/dist/docker-8q58y2kc.svg +1 -0
- package/dist/dockerdebug-8zhgj7bd.svg +1 -0
- package/dist/dockerignore-488safx9.svg +1 -0
- package/dist/drawio-6qm0rhkv.svg +1 -0
- package/dist/drizzle-5bct2tg6.svg +1 -0
- package/dist/dsstore-pmhpmkdr.svg +1 -0
- package/dist/dune-r4xhac56.svg +1 -0
- package/dist/duneproject-3b99jndq.svg +1 -0
- package/dist/edge-0jwced3c.svg +1 -0
- package/dist/editorconfig-hee1zp1h.svg +1 -0
- package/dist/eex-q1bkj66x.svg +1 -0
- package/dist/elixir-48ge02m5.svg +1 -0
- package/dist/elm-97mh5wye.svg +1 -0
- package/dist/env-ysamxkcd.svg +1 -0
- package/dist/eraser-7mejjgrg.svg +1 -0
- package/dist/erb-f28j5x6b.svg +1 -0
- package/dist/erlang-3ebtbtfw.svg +1 -0
- package/dist/esbuild-wptxye5y.svg +1 -0
- package/dist/eslint-mrbexpc5.svg +1 -0
- package/dist/eslintignore-k65wpbsr.svg +1 -0
- package/dist/excalidraw-28avfa1h.svg +1 -0
- package/dist/exs-5w2cfpaf.svg +1 -0
- package/dist/exx-s897xhz3.svg +1 -0
- package/dist/farm-m80hxnfy.svg +1 -0
- package/dist/favicon-djc6sne4.svg +1 -0
- package/dist/figma-krwq889b.svg +1 -0
- package/dist/file-hetj1tjc.svg +1 -0
- package/dist/file_light-jx35pv2m.svg +1 -0
- package/dist/flakelock-2nsqn4gw.svg +1 -0
- package/dist/flutter-277q83en.svg +1 -0
- package/dist/flutterlock-h0nywsvt.svg +1 -0
- package/dist/flutterpackage-cpgnfwtt.svg +1 -0
- package/dist/folder-2xmsfyxp.svg +1 -0
- package/dist/folder_open-wk4ndx1f.svg +1 -0
- package/dist/fonteot-a8xmqj3j.svg +1 -0
- package/dist/fontotf-f01hg174.svg +1 -0
- package/dist/fontttf-pcr3rt21.svg +1 -0
- package/dist/fontwoff-v1gdka62.svg +1 -0
- package/dist/fontwoff2-1w1r47x8.svg +1 -0
- package/dist/freemarker-s9m714ah.svg +1 -0
- package/dist/fsharp-89mjndn4.svg +1 -0
- package/dist/gbl-v20qxsgx.svg +1 -0
- package/dist/git-wc9x7c5e.svg +1 -0
- package/dist/gitlab-bhcvbetz.svg +1 -0
- package/dist/gleam-h2ze8vtz.svg +1 -0
- package/dist/gleamconfig-6sq0xy19.svg +1 -0
- package/dist/go-15qaph9s.svg +1 -0
- package/dist/go-j2dk6r7k.svg +1 -0
- package/dist/go_package-5nc95prx.svg +1 -0
- package/dist/godot-v7nnsyvc.svg +1 -0
- package/dist/gradle-khh2bn3v.svg +1 -0
- package/dist/gradlebat-631878b0.svg +1 -0
- package/dist/gradlekotlin-f8netdbt.svg +1 -0
- package/dist/grain-tztem5b9.svg +1 -0
- package/dist/graphql-egmdpvzr.svg +1 -0
- package/dist/groovy-c0sstajm.svg +1 -0
- package/dist/grunt-56ssa3fr.svg +1 -0
- package/dist/gulp-j7wc27hd.svg +1 -0
- package/dist/h-4xbbejcs.svg +1 -0
- package/dist/haml-6pyt136a.svg +1 -0
- package/dist/handlebars-1v8g0n32.svg +1 -0
- package/dist/hardhat-1k6gym6f.svg +1 -0
- package/dist/hash-xd1ymkyp.svg +1 -0
- package/dist/hashicorp-vty9d6de.svg +1 -0
- package/dist/haskell-ncbxh3wk.svg +1 -0
- package/dist/haxe-j5nqdw5z.svg +1 -0
- package/dist/haxeml-bn7wtpx1.svg +1 -0
- package/dist/hpp-rpxcfk6j.svg +1 -0
- package/dist/htaccess-s4rrm1re.svg +1 -0
- package/dist/html-3vbw2fxn.svg +1 -0
- package/dist/html-v1z6sanr.svg +1 -0
- package/dist/http-9bfh1zqw.svg +1 -0
- package/dist/identifier-6gsrr6st.svg +1 -0
- package/dist/image-pstdg0vj.svg +1 -0
- package/dist/imagegif-any2rrn3.svg +1 -0
- package/dist/imageico-cng69rft.svg +1 -0
- package/dist/imagejpg-rtx9yy9y.svg +1 -0
- package/dist/imagepng-j6f306v1.svg +1 -0
- package/dist/imagewebp-q1mcm8np.svg +1 -0
- package/dist/imba-xxn1q1r2.svg +1 -0
- package/dist/index.html +16 -0
- package/dist/info-qssn7jw5.svg +1 -0
- package/dist/instructions-3068x11a.svg +1 -0
- package/dist/ipynb-qm8fb1p1.svg +1 -0
- package/dist/jar-src0eb7a.svg +1 -0
- package/dist/java-126v951r.svg +1 -0
- package/dist/java-hhh3k9xf.svg +1 -0
- package/dist/jenkins-ap6tzby2.svg +1 -0
- package/dist/jest-xrtp7hh0.svg +1 -0
- package/dist/jinja-v9kggcps.svg +1 -0
- package/dist/js-qsntbmzx.svg +1 -0
- package/dist/js-r0b86hmj.svg +1 -0
- package/dist/jsmap-1ns6yn3z.svg +1 -0
- package/dist/json-1jhmg3gf.svg +1 -0
- package/dist/jsp-7n103tna.svg +1 -0
- package/dist/julia-nba7etbq.svg +1 -0
- package/dist/karma-zcbeze4p.svg +1 -0
- package/dist/keep-tw8xf3gf.svg +1 -0
- package/dist/key-hd2nnhmr.svg +1 -0
- package/dist/knex-87w40q0j.svg +1 -0
- package/dist/knip-kzsz2w4s.svg +1 -0
- package/dist/kotlin-360tzrt1.svg +1 -0
- package/dist/kotlin-hbykz1k8.svg +1 -0
- package/dist/kotlins-4zz4rshm.svg +1 -0
- package/dist/krita-wx5qyrx7.svg +1 -0
- package/dist/latex-jwrpzd2b.svg +1 -0
- package/dist/launch-8wsjpmd3.svg +1 -0
- package/dist/lazarusproject-gma2fvya.svg +1 -0
- package/dist/less-p4zwh19p.svg +1 -0
- package/dist/license-qamq8mp3.svg +1 -0
- package/dist/light_editorconfig-k28g3f4k.svg +1 -0
- package/dist/liquid-wtexakya.svg +1 -0
- package/dist/llvm-cfgd7591.svg +1 -0
- package/dist/lock-wv5q3nef.svg +1 -0
- package/dist/log-ykdkwnpq.svg +1 -0
- package/dist/lua-aynthw24.svg +1 -0
- package/dist/m-va54fte8.svg +1 -0
- package/dist/m3-bun.manifest.json +3785 -0
- package/dist/makefile-kkcgz3sb.svg +1 -0
- package/dist/manifest-ede4t0vc.svg +1 -0
- package/dist/markdown-x7kezf76.svg +1 -0
- package/dist/markdownx-y5mf21hn.svg +1 -0
- package/dist/maven-djc7vb1b.svg +1 -0
- package/dist/mermaid-4bpjjghk.svg +1 -0
- package/dist/mesh-q798mf4t.svg +1 -0
- package/dist/mgcb-cfmfr63b.svg +1 -0
- package/dist/mint-b732cej4.svg +1 -0
- package/dist/mix-41smb4q2.svg +1 -0
- package/dist/mixlock-z0cvwpkq.svg +1 -0
- package/dist/mjml-4kzxtz0b.svg +1 -0
- package/dist/mkdocs-5t1davz8.svg +1 -0
- package/dist/mockoon-5pw3ckhf.svg +1 -0
- package/dist/motoko-yv95035d.svg +1 -0
- package/dist/mov-r3cjb3vr.svg +1 -0
- package/dist/mp4-31hded8m.svg +1 -0
- package/dist/mtl-01f1f06m.svg +1 -0
- package/dist/mustache-1s62ewsg.svg +1 -0
- package/dist/nelua-97199e3p.svg +1 -0
- package/dist/neon-gcp7rsp5.svg +1 -0
- package/dist/nestjs-sme3dmgk.svg +1 -0
- package/dist/nestjscontroller-2ceskrfc.svg +1 -0
- package/dist/nestjsdecorator-52k9dwm2.svg +1 -0
- package/dist/nestjsdto-xf36my7y.svg +1 -0
- package/dist/nestjsentity-q17fyvm1.svg +1 -0
- package/dist/nestjsfilter-qytmtqzj.svg +1 -0
- package/dist/nestjsguard-4pyb34xe.svg +1 -0
- package/dist/nestjsinterceptor-7s690j87.svg +1 -0
- package/dist/nestjsmodule-zeyz5633.svg +1 -0
- package/dist/nestjsrepository-kz26s1jf.svg +1 -0
- package/dist/nestjsresolver-8qdvexrk.svg +1 -0
- package/dist/nestjsservice-kp3b933m.svg +1 -0
- package/dist/nestscheduler-60p4j2tg.svg +1 -0
- package/dist/netlify-bbgdw42s.svg +1 -0
- package/dist/nextconfig-gr1sd69d.svg +1 -0
- package/dist/nextron-sf3ag316.svg +1 -0
- package/dist/nginx-73stz0yt.svg +1 -0
- package/dist/nim-gqnvnkc5.svg +1 -0
- package/dist/nix-t1m4qhc8.svg +1 -0
- package/dist/njk-dfv3nrxr.svg +1 -0
- package/dist/node-w3gp0xxn.svg +1 -0
- package/dist/nodemon-q41mkhvz.svg +1 -0
- package/dist/npm-rt8ga6qx.svg +1 -0
- package/dist/npmlock-8p4sp377.svg +1 -0
- package/dist/nuxt-13qdp31g.svg +1 -0
- package/dist/nvidia-fysz92ep.svg +1 -0
- package/dist/nvim-h3ynkfqg.svg +1 -0
- package/dist/nvm-ser6majj.svg +1 -0
- package/dist/nx-av0cw2sw.svg +1 -0
- package/dist/obj-thakg863.svg +1 -0
- package/dist/ocaml-maevkwa7.svg +1 -0
- package/dist/ocamli-w0gc5jq8.svg +1 -0
- package/dist/ocamll-h2wysvh1.svg +1 -0
- package/dist/ocamly-ppj6pfy3.svg +1 -0
- package/dist/odin-x7qb7b6x.svg +1 -0
- package/dist/opengl-h6pbxg3n.svg +1 -0
- package/dist/oxlint-7qwxtp86.svg +1 -0
- package/dist/panda-9qqa1nn4.svg +1 -0
- package/dist/parcel-gzckrwpy.svg +1 -0
- package/dist/pascal-kj6crs4h.svg +1 -0
- package/dist/pdf-wk39v1nv.svg +1 -0
- package/dist/perl-11dgrnh8.svg +1 -0
- package/dist/perlm-7xrwgd93.svg +1 -0
- package/dist/pfx-ggdb4v6p.svg +1 -0
- package/dist/photoshop-m3gw1xv7.svg +1 -0
- package/dist/php-jgyt96zk.svg +1 -0
- package/dist/php-jx84j7ns.svg +1 -0
- package/dist/plantuml-04ncqrmc.svg +1 -0
- package/dist/playright-dfc8tvme.svg +1 -0
- package/dist/plop-n71aee6w.svg +1 -0
- package/dist/pnpm-jvkts1qb.svg +1 -0
- package/dist/pnpmlock-2kqbdtn7.svg +1 -0
- package/dist/poetry-yjeeyvtr.svg +1 -0
- package/dist/poetrylock-da30xbws.svg +1 -0
- package/dist/postcssconfig-yyvnwr01.svg +1 -0
- package/dist/powershell-hf358xbb.svg +1 -0
- package/dist/powershelldata-nggemhrs.svg +1 -0
- package/dist/powershellmodule-v5wz6sed.svg +1 -0
- package/dist/precommit-wmfmt8tq.svg +1 -0
- package/dist/prettier-nyc1v0qk.svg +1 -0
- package/dist/prettierignore-hx4x759w.svg +1 -0
- package/dist/prisma-te242v0q.svg +1 -0
- package/dist/prolog-twb6h758.svg +1 -0
- package/dist/prompt-eg8c0gqa.svg +1 -0
- package/dist/properties-c39zkae1.svg +1 -0
- package/dist/proto-rsvsx4xb.svg +1 -0
- package/dist/pug-rqxd67km.svg +1 -0
- package/dist/pvk-bc4g1qms.svg +1 -0
- package/dist/py-0g79s39m.svg +1 -0
- package/dist/pyproject-5s59g4en.svg +1 -0
- package/dist/python-ds482k8k.svg +1 -0
- package/dist/qt-y3kxpf67.svg +1 -0
- package/dist/quarkus-xrq4b999.svg +1 -0
- package/dist/quasar-hvna6b7f.svg +1 -0
- package/dist/r-n1bnfab8.svg +1 -0
- package/dist/racket-vx5e6n1d.svg +1 -0
- package/dist/raku-4ydzc5wj.svg +1 -0
- package/dist/razor-cbqpr6vt.svg +1 -0
- package/dist/rb-mfkwkq7e.svg +1 -0
- package/dist/reactjs-qjyhk3rf.svg +1 -0
- package/dist/reactts-p0hf29yr.svg +1 -0
- package/dist/readme-3qcyy95y.svg +1 -0
- package/dist/redis-ya1xyn4v.svg +1 -0
- package/dist/rego-tr1y9cqm.svg +1 -0
- package/dist/remix-61pbjda4.svg +1 -0
- package/dist/rescript-9c3xnepn.svg +1 -0
- package/dist/rescriptinterface-6ne0a2rf.svg +1 -0
- package/dist/restructuredtext-7k21mjx4.svg +1 -0
- package/dist/rjson-3s2edhhr.svg +1 -0
- package/dist/robots-geh7c3pq.svg +1 -0
- package/dist/rollup-0dxydzr9.svg +1 -0
- package/dist/rome-1gxetp8g.svg +1 -0
- package/dist/ron-ft34rzr3.svg +1 -0
- package/dist/root_folder-rhwm7290.svg +1 -0
- package/dist/root_folder_light-ngkg5m4x.svg +1 -0
- package/dist/root_folder_light_open-c6nhg6sy.svg +1 -0
- package/dist/root_folder_open-genv0ps7.svg +1 -0
- package/dist/rs-60bcevwn.svg +1 -0
- package/dist/ruby-7j5zzh38.svg +1 -0
- package/dist/rust-a9528zdg.svg +1 -0
- package/dist/rustfmt-c8evpzd7.svg +1 -0
- package/dist/sails-5ecccxrg.svg +1 -0
- package/dist/salesforce-4d89045j.svg +1 -0
- package/dist/sass-g9qbr3x4.svg +1 -0
- package/dist/scala-8gnn0ekc.svg +1 -0
- package/dist/scss-g9qbr3x4.svg +1 -0
- package/dist/sentinel-g8py3peh.svg +1 -0
- package/dist/sequelize-qvzwnjhv.svg +1 -0
- package/dist/sh-bkp0n5vb.svg +1 -0
- package/dist/shaderlab-gkww43v2.svg +1 -0
- package/dist/shell-kc0a9zjq.svg +1 -0
- package/dist/silq-mczpsqmz.svg +1 -0
- package/dist/slim-8j9jf3zt.svg +1 -0
- package/dist/sln-nketqakm.svg +1 -0
- package/dist/smarty-w1zxys1s.svg +1 -0
- package/dist/sol-adyfjwzz.svg +1 -0
- package/dist/spc-kk30w5m6.svg +1 -0
- package/dist/sql-3c4gcy7a.svg +1 -0
- package/dist/sqlite-cppkxr0a.svg +1 -0
- package/dist/storybook-885ssp75.svg +1 -0
- package/dist/stylelint-z7s6yhc9.svg +1 -0
- package/dist/stylelintignore-xwnh8sx1.svg +1 -0
- package/dist/stylus-qz53ytkd.svg +1 -0
- package/dist/suo-3fvnz3bx.svg +1 -0
- package/dist/svelte-jp3x9gw7.svg +1 -0
- package/dist/svelteconfig-m0n00zjj.svg +1 -0
- package/dist/svg-8dyqf96t.svg +1 -0
- package/dist/swift-8g870v6j.svg +1 -0
- package/dist/symfony-q77kcepw.svg +1 -0
- package/dist/tailwind-3es9cgbd.svg +1 -0
- package/dist/tauri-xnj526kw.svg +1 -0
- package/dist/taze-e3ykqs0k.svg +1 -0
- package/dist/terrafile-gqn1tysh.svg +1 -0
- package/dist/terraform-jy4fbwsr.svg +1 -0
- package/dist/terraformvars-05qje1sw.svg +1 -0
- package/dist/terraformversion-gq2tkwmn.svg +1 -0
- package/dist/testjs-sqgjsb8h.svg +1 -0
- package/dist/testts-19m1sf26.svg +1 -0
- package/dist/tmpl-enggw2gc.svg +1 -0
- package/dist/todo-ccw0mpg2.svg +1 -0
- package/dist/toml-rmx5hba4.svg +1 -0
- package/dist/toolversions-s7fttfyp.svg +1 -0
- package/dist/tox-a4j4yvmb.svg +1 -0
- package/dist/travis-gr3jtpx2.svg +1 -0
- package/dist/tres-qt3kk1t0.svg +1 -0
- package/dist/ts-7amn21ms.svg +1 -0
- package/dist/tscn-g1jthb4m.svg +1 -0
- package/dist/tsconfig-r1s750bq.svg +1 -0
- package/dist/tsx-a3rsjrrz.svg +1 -0
- package/dist/turbo-dcmj75tc.svg +1 -0
- package/dist/twig-3xgrb919.svg +1 -0
- package/dist/txt-y0t8b72p.svg +1 -0
- package/dist/typescript-kd5g4jkg.svg +1 -0
- package/dist/typescriptdef-y43343m6.svg +1 -0
- package/dist/ui-pxvg5zj2.svg +1 -0
- package/dist/unocss-b0f5fthj.svg +1 -0
- package/dist/user-q7tk1k2d.svg +1 -0
- package/dist/v-c25jfygk.svg +1 -0
- package/dist/vanillaextract-3w6vds6m.svg +1 -0
- package/dist/vb-87ckj7t3.svg +1 -0
- package/dist/vercel-hfxjvaj9.svg +1 -0
- package/dist/version-zd7hfmf1.svg +1 -0
- package/dist/vhd-xaw7zbny.svg +1 -0
- package/dist/vhdl-s308rb5a.svg +1 -0
- package/dist/video-z6khth5y.svg +1 -0
- package/dist/vite-5g5xkmpk.svg +1 -0
- package/dist/viteenv-jbmx0tb0.svg +1 -0
- package/dist/vitest-5267dzt2.svg +1 -0
- package/dist/vmod-8jftapdc.svg +1 -0
- package/dist/vscode-8tvcs7ae.svg +1 -0
- package/dist/vue-j5sjdz4b.svg +1 -0
- package/dist/vue-x9h2d0d2.svg +1 -0
- package/dist/vueconfig-726zh8dd.svg +1 -0
- package/dist/wasm-vgmg9kv4.svg +1 -0
- package/dist/webpack-hfwce90m.svg +1 -0
- package/dist/wgsl-68923cz5.svg +1 -0
- package/dist/windi-c9m8en7k.svg +1 -0
- package/dist/wren-7ep5ph5r.svg +1 -0
- package/dist/xmake-mc60ax7m.svg +1 -0
- package/dist/xml-feq1fbt4.svg +1 -0
- package/dist/yaml-n43aw0fx.svg +1 -0
- package/dist/yang-mtcxs2mg.svg +1 -0
- package/dist/yarn-k4k6e35h.svg +1 -0
- package/dist/yarnerror-5jkesx9j.svg +1 -0
- package/dist/yarnignore-ryh8jd5p.svg +1 -0
- package/dist/yarnlock-9zvhbg04.svg +1 -0
- package/dist/yin-f931bzgj.svg +1 -0
- package/dist/zig-nx2e65ns.svg +1 -0
- package/dist/zip-7hqmj0b0.svg +1 -0
- package/m3.config.ts +32 -0
- package/package.json +60 -0
- package/scripts/browser-contract.ts +400 -0
- package/scripts/icons.ts +56 -0
- package/scripts/inventory.ts +86 -0
- package/scripts/shots.ts +154 -0
- package/scripts/tauri.ts +401 -0
- package/src/App.tsx +40 -0
- package/src/adaptive/dpad.ts +223 -0
- package/src/adaptive/window.ts +133 -0
- package/src/api/index.ts +332 -0
- package/src/components/ui.tsx +89 -0
- package/src/env.d.ts +5 -0
- package/src/favicon.svg +1 -0
- package/src/generated/inventory.json +426 -0
- package/src/index.html +16 -0
- package/src/inventory.ts +19 -0
- package/src/main.tsx +6 -0
- package/src/pages/Adaptive.tsx +128 -0
- package/src/pages/Ai.tsx +174 -0
- package/src/pages/Brands.tsx +156 -0
- package/src/pages/Components.tsx +91 -0
- package/src/pages/Design.tsx +163 -0
- package/src/pages/Explorer.tsx +125 -0
- package/src/pages/Forms.tsx +128 -0
- package/src/pages/Icons.tsx +138 -0
- package/src/pages/Motion.tsx +157 -0
- package/src/pages/Next.tsx +107 -0
- package/src/pages/Overview.tsx +105 -0
- package/src/pages/Primitives.tsx +138 -0
- package/src/pages/Reader.tsx +101 -0
- package/src/pages/System.tsx +283 -0
- package/src/pages/Theme.tsx +146 -0
- package/src/pages/index.ts +25 -0
- package/src/router.ts +22 -0
- package/src/shell/Shell.tsx +383 -0
- package/src/shell/nav.ts +198 -0
- package/src/styles.css +61 -0
- package/test/contracts.test.ts +87 -0
- package/test/host-contract.test.ts +183 -0
- package/test/runtime-api.test.ts +138 -0
- package/test-dom/dpad.test.ts +78 -0
- package/tsconfig.json +11 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { Button } from "@aphrody/m3-primitives";
|
|
4
|
+
import {
|
|
5
|
+
M3Transition,
|
|
6
|
+
M3Fade,
|
|
7
|
+
M3Collapse,
|
|
8
|
+
M3ContainerTransform,
|
|
9
|
+
M3ContainerTransformStart,
|
|
10
|
+
M3ContainerTransformEnd,
|
|
11
|
+
M3ListStagger,
|
|
12
|
+
M3ListStaggerItem,
|
|
13
|
+
useM3ReducedMotion,
|
|
14
|
+
type M3TransitionPattern,
|
|
15
|
+
} from "@aphrody/m3-motion";
|
|
16
|
+
import { Card, Page, Section } from "../components/ui.tsx";
|
|
17
|
+
import type { PageProps } from "./index.ts";
|
|
18
|
+
|
|
19
|
+
const PATTERNS: M3TransitionPattern[] = [
|
|
20
|
+
"fade",
|
|
21
|
+
"fade-through",
|
|
22
|
+
"shared-axis-x",
|
|
23
|
+
"shared-axis-y",
|
|
24
|
+
"shared-axis-z",
|
|
25
|
+
"collapse",
|
|
26
|
+
];
|
|
27
|
+
export default function Motion({ adaptive }: PageProps) {
|
|
28
|
+
const reduced = useM3ReducedMotion();
|
|
29
|
+
const [pattern, setPattern] = useState<M3TransitionPattern>("shared-axis-x");
|
|
30
|
+
const [step, setStep] = useState(0);
|
|
31
|
+
const [forward, setForward] = useState(true);
|
|
32
|
+
const [shown, setShown] = useState(true);
|
|
33
|
+
const [expanded, setExpanded] = useState(false);
|
|
34
|
+
const [items, setItems] = useState([1, 2, 3]);
|
|
35
|
+
return (
|
|
36
|
+
<Page
|
|
37
|
+
title="Motion"
|
|
38
|
+
summary="Material 3 transitions, shared containers and list staggering. Every example follows your operating system's reduced-motion preference, including changes while this page is open."
|
|
39
|
+
packages={["@aphrody/m3-motion"]}
|
|
40
|
+
panes={adaptive.panes}
|
|
41
|
+
>
|
|
42
|
+
<p role="status" className="text-body-medium">
|
|
43
|
+
Reduced motion:{" "}
|
|
44
|
+
{reduced ? "on — states update without animation" : "off — Material motion is active"}
|
|
45
|
+
</p>
|
|
46
|
+
<Section title="Navigation patterns">
|
|
47
|
+
<Card className="flex flex-col gap-4">
|
|
48
|
+
<label className="flex flex-col gap-2 text-label-large">
|
|
49
|
+
Transition pattern
|
|
50
|
+
<select
|
|
51
|
+
value={pattern}
|
|
52
|
+
onChange={(event) => setPattern(event.target.value as M3TransitionPattern)}
|
|
53
|
+
className="rounded-small border border-outline bg-surface p-3"
|
|
54
|
+
>
|
|
55
|
+
{PATTERNS.map((value) => (
|
|
56
|
+
<option key={value}>{value}</option>
|
|
57
|
+
))}
|
|
58
|
+
</select>
|
|
59
|
+
</label>
|
|
60
|
+
<div className="min-h-28 overflow-hidden rounded-medium bg-primary-container p-4">
|
|
61
|
+
<M3Transition stateKey={step} pattern={pattern} forward={forward}>
|
|
62
|
+
<h3 className="text-title-large text-on-primary-container">View {step + 1}</h3>
|
|
63
|
+
<p className="text-body-large text-on-primary-container">
|
|
64
|
+
The state key drives entry and exit. Try forward and backward navigation.
|
|
65
|
+
</p>
|
|
66
|
+
</M3Transition>
|
|
67
|
+
</div>
|
|
68
|
+
<div className="flex gap-3">
|
|
69
|
+
<Button
|
|
70
|
+
variant="outlined"
|
|
71
|
+
disabled={step === 0}
|
|
72
|
+
onClick={() => {
|
|
73
|
+
setForward(false);
|
|
74
|
+
setStep((value) => Math.max(0, value - 1));
|
|
75
|
+
}}
|
|
76
|
+
>
|
|
77
|
+
Previous
|
|
78
|
+
</Button>
|
|
79
|
+
<Button
|
|
80
|
+
onClick={() => {
|
|
81
|
+
setForward(true);
|
|
82
|
+
setStep((value) => value + 1);
|
|
83
|
+
}}
|
|
84
|
+
>
|
|
85
|
+
Next
|
|
86
|
+
</Button>
|
|
87
|
+
</div>
|
|
88
|
+
</Card>
|
|
89
|
+
</Section>
|
|
90
|
+
<Section title="Fade and collapse">
|
|
91
|
+
<Card className="flex flex-col gap-4">
|
|
92
|
+
<Button variant="tonal" onClick={() => setShown((value) => !value)} aria-expanded={shown}>
|
|
93
|
+
Toggle content
|
|
94
|
+
</Button>
|
|
95
|
+
<M3Fade in={shown}>
|
|
96
|
+
<p className="text-body-large">A fade keeps the transition focused on opacity.</p>
|
|
97
|
+
</M3Fade>
|
|
98
|
+
<M3Collapse in={shown}>
|
|
99
|
+
<div className="rounded-medium bg-secondary-container p-4 text-on-secondary-container">
|
|
100
|
+
Collapse interpolates the natural height of this disclosure.
|
|
101
|
+
</div>
|
|
102
|
+
</M3Collapse>
|
|
103
|
+
</Card>
|
|
104
|
+
</Section>
|
|
105
|
+
<Section title="Container transform">
|
|
106
|
+
<M3ContainerTransform
|
|
107
|
+
isExpanded={expanded}
|
|
108
|
+
layoutId="showcase-container"
|
|
109
|
+
className="rounded-large bg-tertiary-container text-on-tertiary-container p-4"
|
|
110
|
+
style={{ height: expanded ? 210 : 100 }}
|
|
111
|
+
>
|
|
112
|
+
<M3ContainerTransformStart>
|
|
113
|
+
<h3 className="text-title-medium">Compact card</h3>
|
|
114
|
+
<Button variant="text" onClick={() => setExpanded(true)}>
|
|
115
|
+
Expand card
|
|
116
|
+
</Button>
|
|
117
|
+
</M3ContainerTransformStart>
|
|
118
|
+
<M3ContainerTransformEnd>
|
|
119
|
+
<h3 className="text-headline-small">Expanded details</h3>
|
|
120
|
+
<p className="my-4 text-body-large">
|
|
121
|
+
The inactive layer is inert and hidden from assistive technology.
|
|
122
|
+
</p>
|
|
123
|
+
<Button variant="text" onClick={() => setExpanded(false)}>
|
|
124
|
+
Collapse card
|
|
125
|
+
</Button>
|
|
126
|
+
</M3ContainerTransformEnd>
|
|
127
|
+
</M3ContainerTransform>
|
|
128
|
+
</Section>
|
|
129
|
+
<Section title="List staggering">
|
|
130
|
+
<Card className="flex flex-col gap-4">
|
|
131
|
+
<div className="flex gap-3">
|
|
132
|
+
<Button onClick={() => setItems((values) => [...values, (values.at(-1) ?? 0) + 1])}>
|
|
133
|
+
Add item
|
|
134
|
+
</Button>
|
|
135
|
+
<Button
|
|
136
|
+
variant="outlined"
|
|
137
|
+
disabled={items.length === 0}
|
|
138
|
+
onClick={() => setItems((values) => values.slice(0, -1))}
|
|
139
|
+
>
|
|
140
|
+
Remove item
|
|
141
|
+
</Button>
|
|
142
|
+
</div>
|
|
143
|
+
<M3ListStagger className="flex flex-wrap gap-3">
|
|
144
|
+
{items.map((item) => (
|
|
145
|
+
<M3ListStaggerItem
|
|
146
|
+
key={item}
|
|
147
|
+
className="rounded-medium bg-surface-container-high px-4 py-3 text-body-large"
|
|
148
|
+
>
|
|
149
|
+
Item {item}
|
|
150
|
+
</M3ListStaggerItem>
|
|
151
|
+
))}
|
|
152
|
+
</M3ListStagger>
|
|
153
|
+
</Card>
|
|
154
|
+
</Section>
|
|
155
|
+
</Page>
|
|
156
|
+
);
|
|
157
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { useM3Theme } from "@aphrody/m3-theme/react";
|
|
4
|
+
import { Card, Code, Page, Section } from "../components/ui.tsx";
|
|
5
|
+
import type { PageProps } from "./index.ts";
|
|
6
|
+
|
|
7
|
+
interface NextOutput {
|
|
8
|
+
metadata: unknown;
|
|
9
|
+
viewport: unknown;
|
|
10
|
+
schemeCss: string;
|
|
11
|
+
config: unknown;
|
|
12
|
+
robots: string;
|
|
13
|
+
sitemap: string;
|
|
14
|
+
jsonLd: string;
|
|
15
|
+
}
|
|
16
|
+
export default function Next({ adaptive }: PageProps) {
|
|
17
|
+
const { seedColor } = useM3Theme();
|
|
18
|
+
const [result, setResult] = useState<NextOutput | null>(null);
|
|
19
|
+
const [notice, setNotice] = useState("");
|
|
20
|
+
const [selected, setSelected] = useState<keyof NextOutput>("metadata");
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
const controller = new AbortController();
|
|
23
|
+
setNotice("Computing Next integration output…");
|
|
24
|
+
void fetch("/api/next?seed=" + encodeURIComponent(seedColor), { signal: controller.signal })
|
|
25
|
+
.then(async (response) => {
|
|
26
|
+
const payload = await response.json();
|
|
27
|
+
if (!response.ok) throw new Error(payload.error ?? "Next output is unavailable.");
|
|
28
|
+
if (!controller.signal.aborted) {
|
|
29
|
+
setResult(payload as NextOutput);
|
|
30
|
+
setNotice("Generated from the current theme and this site's origin.");
|
|
31
|
+
}
|
|
32
|
+
return payload;
|
|
33
|
+
})
|
|
34
|
+
.catch((error: unknown) => {
|
|
35
|
+
if (!controller.signal.aborted)
|
|
36
|
+
setNotice(error instanceof Error ? error.message : "Next output is unavailable.");
|
|
37
|
+
});
|
|
38
|
+
return () => controller.abort();
|
|
39
|
+
}, [seedColor]);
|
|
40
|
+
const output = result?.[selected];
|
|
41
|
+
return (
|
|
42
|
+
<Page
|
|
43
|
+
title="Next"
|
|
44
|
+
summary="Explore metadata, viewport, theme sheets and crawler documents generated by the Next integration's public exports."
|
|
45
|
+
packages={["@aphrody/m3-next"]}
|
|
46
|
+
panes={adaptive.panes}
|
|
47
|
+
aside={
|
|
48
|
+
<Card>
|
|
49
|
+
<h3 className="text-title-medium">App Router integration</h3>
|
|
50
|
+
<Code>
|
|
51
|
+
{
|
|
52
|
+
'import { withM3 } from "@aphrody/m3-next";\nexport default withM3({});\n\nimport { generateM3Metadata, generateM3Viewport } from "@aphrody/m3-next";\nexport const metadata = generateM3Metadata({ name: "My app" });\nexport const viewport = generateM3Viewport();'
|
|
53
|
+
}
|
|
54
|
+
</Code>
|
|
55
|
+
</Card>
|
|
56
|
+
}
|
|
57
|
+
>
|
|
58
|
+
<Section
|
|
59
|
+
title="Generated integration documents"
|
|
60
|
+
description="Public helpers run in this Bun showcase; the separate Next example qualifies its App Router host."
|
|
61
|
+
>
|
|
62
|
+
<Card className="flex flex-col gap-3">
|
|
63
|
+
<label className="flex flex-col gap-2 text-label-large">
|
|
64
|
+
Output
|
|
65
|
+
<select
|
|
66
|
+
className="h-12 rounded-small border border-outline bg-surface px-3"
|
|
67
|
+
value={selected}
|
|
68
|
+
onChange={(event) => setSelected(event.target.value as keyof NextOutput)}
|
|
69
|
+
>
|
|
70
|
+
{(
|
|
71
|
+
[
|
|
72
|
+
"metadata",
|
|
73
|
+
"viewport",
|
|
74
|
+
"schemeCss",
|
|
75
|
+
"config",
|
|
76
|
+
"robots",
|
|
77
|
+
"sitemap",
|
|
78
|
+
"jsonLd",
|
|
79
|
+
] as const
|
|
80
|
+
).map((name) => (
|
|
81
|
+
<option key={name}>{name}</option>
|
|
82
|
+
))}
|
|
83
|
+
</select>
|
|
84
|
+
</label>
|
|
85
|
+
<p role="status" className="text-body-medium text-on-surface-variant">
|
|
86
|
+
{notice}
|
|
87
|
+
</p>
|
|
88
|
+
<Code>{typeof output === "string" ? output : JSON.stringify(output ?? {}, null, 2)}</Code>
|
|
89
|
+
</Card>
|
|
90
|
+
</Section>
|
|
91
|
+
{result ? (
|
|
92
|
+
<Section title="Crawler files">
|
|
93
|
+
<div className="grid gap-4 expanded:grid-cols-2">
|
|
94
|
+
<Card>
|
|
95
|
+
<h3 className="text-title-medium">robots.txt</h3>
|
|
96
|
+
<Code>{result.robots}</Code>
|
|
97
|
+
</Card>
|
|
98
|
+
<Card>
|
|
99
|
+
<h3 className="text-title-medium">sitemap.xml</h3>
|
|
100
|
+
<Code>{result.sitemap}</Code>
|
|
101
|
+
</Card>
|
|
102
|
+
</div>
|
|
103
|
+
</Section>
|
|
104
|
+
) : null}
|
|
105
|
+
</Page>
|
|
106
|
+
);
|
|
107
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
|
+
import { Card, Code, Page, Section, Svg, Chips } from "../components/ui.tsx";
|
|
3
|
+
import { PACKAGES } from "../inventory.ts";
|
|
4
|
+
import { DESTINATIONS } from "../shell/nav.ts";
|
|
5
|
+
import type { PageProps } from "./index.ts";
|
|
6
|
+
import arrowIcon from "m3:icons/chevron_right";
|
|
7
|
+
|
|
8
|
+
interface Info {
|
|
9
|
+
name: string;
|
|
10
|
+
version: string;
|
|
11
|
+
buildId: string;
|
|
12
|
+
bun: string;
|
|
13
|
+
files: number;
|
|
14
|
+
api: string[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function useInfo(): { info?: Info; error?: string } {
|
|
18
|
+
const [state, setState] = useState<{ info?: Info; error?: string }>({});
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
const controller = new AbortController();
|
|
21
|
+
fetch("/api/m3/info", { signal: controller.signal })
|
|
22
|
+
.then((response) =>
|
|
23
|
+
response.ok
|
|
24
|
+
? (response.json() as Promise<Info>)
|
|
25
|
+
: Promise.reject(new Error(`HTTP ${response.status}`)),
|
|
26
|
+
)
|
|
27
|
+
.then((info) => setState({ info }))
|
|
28
|
+
.catch((error: Error) => error.name !== "AbortError" && setState({ error: error.message }));
|
|
29
|
+
return () => controller.abort();
|
|
30
|
+
}, []);
|
|
31
|
+
return state;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export default function Overview({ adaptive }: PageProps) {
|
|
35
|
+
const { info, error } = useInfo();
|
|
36
|
+
const inWorkspace = PACKAGES.filter((p) => p.workspace).length;
|
|
37
|
+
const columns =
|
|
38
|
+
adaptive.mode === "tv"
|
|
39
|
+
? "grid-cols-3"
|
|
40
|
+
: adaptive.width === "compact"
|
|
41
|
+
? "grid-cols-1"
|
|
42
|
+
: adaptive.width === "medium"
|
|
43
|
+
? "grid-cols-2"
|
|
44
|
+
: "grid-cols-3";
|
|
45
|
+
return (
|
|
46
|
+
<Page
|
|
47
|
+
title="Aphrody M3 Showcase"
|
|
48
|
+
summary="Every package of the aphrody-m3 monorepo in one adaptive app. It is built, served and compiled by @aphrody/m3-bun: the UI files and this page's API come from one Bun process."
|
|
49
|
+
packages={["@aphrody/m3", "@aphrody/m3-bun"]}
|
|
50
|
+
panes={adaptive.panes}
|
|
51
|
+
aside={
|
|
52
|
+
<Card>
|
|
53
|
+
<h3 className="mb-2 text-title-medium">One process: UI and API</h3>
|
|
54
|
+
<p className="mb-3 text-body-small text-on-surface-variant">
|
|
55
|
+
This card is a live <code>GET /api/m3/info</code> from the process that served the page.
|
|
56
|
+
</p>
|
|
57
|
+
{info ? (
|
|
58
|
+
<Code>{JSON.stringify(info, null, 2)}</Code>
|
|
59
|
+
) : (
|
|
60
|
+
<p className="text-body-small text-error" role="status">
|
|
61
|
+
{error ? `API unreachable: ${error}` : "Loading…"}
|
|
62
|
+
</p>
|
|
63
|
+
)}
|
|
64
|
+
</Card>
|
|
65
|
+
}
|
|
66
|
+
>
|
|
67
|
+
<Section title="By the numbers">
|
|
68
|
+
<div className="grid grid-cols-2 gap-3 expanded:grid-cols-4" data-testid="stats">
|
|
69
|
+
{[
|
|
70
|
+
[String(PACKAGES.length), "packages and apps"],
|
|
71
|
+
[String(inWorkspace), "in the Bun workspace"],
|
|
72
|
+
[String(DESTINATIONS.length), "showcase pages"],
|
|
73
|
+
[info ? `Bun ${info.bun}` : "…", "serving this page"],
|
|
74
|
+
].map(([value, label]) => (
|
|
75
|
+
<Card key={label}>
|
|
76
|
+
<div className="text-headline-medium text-primary">{value}</div>
|
|
77
|
+
<div className="text-body-small text-on-surface-variant">{label}</div>
|
|
78
|
+
</Card>
|
|
79
|
+
))}
|
|
80
|
+
</div>
|
|
81
|
+
</Section>
|
|
82
|
+
<Section title="Explore" description="Each page imports and runs the packages it names.">
|
|
83
|
+
<div className={`grid gap-3 ${columns}`} data-testid="destinations">
|
|
84
|
+
{DESTINATIONS.filter((d) => d.id !== "overview").map((d) => (
|
|
85
|
+
<a
|
|
86
|
+
key={d.id}
|
|
87
|
+
href={`#/${d.id}`}
|
|
88
|
+
data-dpad
|
|
89
|
+
data-testid={`card-${d.id}`}
|
|
90
|
+
className="state-layer flex flex-col gap-2 rounded-large bg-surface-container p-4 text-left"
|
|
91
|
+
>
|
|
92
|
+
<span className="flex items-center gap-2 text-title-medium text-on-surface">
|
|
93
|
+
<Svg html={d.icon} className="text-primary" />
|
|
94
|
+
{d.label}
|
|
95
|
+
<Svg html={arrowIcon} className="ml-auto text-on-surface-variant" small />
|
|
96
|
+
</span>
|
|
97
|
+
<span className="text-body-small text-on-surface-variant">{d.summary}</span>
|
|
98
|
+
<Chips names={d.packages.slice(0, 3)} />
|
|
99
|
+
</a>
|
|
100
|
+
))}
|
|
101
|
+
</div>
|
|
102
|
+
</Section>
|
|
103
|
+
</Page>
|
|
104
|
+
);
|
|
105
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import {
|
|
4
|
+
Button,
|
|
5
|
+
CheckBox,
|
|
6
|
+
Switch,
|
|
7
|
+
Slider,
|
|
8
|
+
Card as PrimitiveCard,
|
|
9
|
+
CardHeader,
|
|
10
|
+
CardTitle,
|
|
11
|
+
CardContent,
|
|
12
|
+
TabsRoot,
|
|
13
|
+
TabsList,
|
|
14
|
+
TabsTrigger,
|
|
15
|
+
TabsContent,
|
|
16
|
+
DialogRoot,
|
|
17
|
+
DialogTrigger,
|
|
18
|
+
DialogContent,
|
|
19
|
+
DialogTitle,
|
|
20
|
+
DialogDescription,
|
|
21
|
+
DialogClose,
|
|
22
|
+
AccordionRoot,
|
|
23
|
+
AccordionItem,
|
|
24
|
+
AccordionTrigger,
|
|
25
|
+
AccordionPanel,
|
|
26
|
+
ProgressBar,
|
|
27
|
+
Badge,
|
|
28
|
+
Icon,
|
|
29
|
+
} from "@aphrody/m3-primitives";
|
|
30
|
+
import { Card, Page, Section } from "../components/ui.tsx";
|
|
31
|
+
import type { PageProps } from "./index.ts";
|
|
32
|
+
|
|
33
|
+
export default function Primitives({ adaptive }: PageProps) {
|
|
34
|
+
const [count, setCount] = useState(0);
|
|
35
|
+
const [checked, setChecked] = useState(false);
|
|
36
|
+
const [enabled, setEnabled] = useState(true);
|
|
37
|
+
const [progress, setProgress] = useState([35]);
|
|
38
|
+
return (
|
|
39
|
+
<Page
|
|
40
|
+
title="React primitives"
|
|
41
|
+
summary="The Base UI component family styled with Material 3 roles. Try keyboard focus, tabs, a modal dialog and the controlled inputs."
|
|
42
|
+
packages={["@aphrody/m3-primitives", "@aphrody/m3-baseui"]}
|
|
43
|
+
panes={adaptive.panes}
|
|
44
|
+
>
|
|
45
|
+
<Section title="Actions and surfaces">
|
|
46
|
+
<div className="grid gap-3 expanded:grid-cols-3">
|
|
47
|
+
{(["elevated", "filled", "outlined"] as const).map((variant) => (
|
|
48
|
+
<PrimitiveCard key={variant} variant={variant}>
|
|
49
|
+
<CardHeader>
|
|
50
|
+
<CardTitle>{variant} card</CardTitle>
|
|
51
|
+
</CardHeader>
|
|
52
|
+
<CardContent>
|
|
53
|
+
<Button
|
|
54
|
+
variant={variant === "elevated" ? "filled" : "outlined"}
|
|
55
|
+
onClick={() => setCount((value) => value + 1)}
|
|
56
|
+
>
|
|
57
|
+
<Icon name="add" size={20} />
|
|
58
|
+
Activate
|
|
59
|
+
</Button>
|
|
60
|
+
</CardContent>
|
|
61
|
+
</PrimitiveCard>
|
|
62
|
+
))}
|
|
63
|
+
</div>
|
|
64
|
+
<output className="text-body-large" aria-live="polite">
|
|
65
|
+
Activations: {count}
|
|
66
|
+
</output>
|
|
67
|
+
</Section>
|
|
68
|
+
<Section title="Controlled inputs">
|
|
69
|
+
<Card className="flex flex-col gap-4">
|
|
70
|
+
<label className="flex items-center gap-3">
|
|
71
|
+
<CheckBox checked={checked} onChange={(event) => setChecked(event.target.checked)} />
|
|
72
|
+
Receive a local demonstration newsletter
|
|
73
|
+
</label>
|
|
74
|
+
<label className="flex items-center gap-3">
|
|
75
|
+
<Switch checked={enabled} onCheckedChange={setEnabled} aria-label="Enable preview" />
|
|
76
|
+
Preview: {enabled ? "enabled" : "disabled"}
|
|
77
|
+
</label>
|
|
78
|
+
<Slider
|
|
79
|
+
value={progress}
|
|
80
|
+
onValueChange={setProgress}
|
|
81
|
+
min={0}
|
|
82
|
+
max={100}
|
|
83
|
+
step={1}
|
|
84
|
+
getAriaLabel={() => "Progress"}
|
|
85
|
+
/>
|
|
86
|
+
<ProgressBar percent={progress[0]!} />
|
|
87
|
+
<output>{progress[0]}%</output>
|
|
88
|
+
</Card>
|
|
89
|
+
</Section>
|
|
90
|
+
<Section title="Tabs and disclosure">
|
|
91
|
+
<Card>
|
|
92
|
+
<TabsRoot defaultValue="preview">
|
|
93
|
+
<TabsList aria-label="Primitive examples">
|
|
94
|
+
<TabsTrigger value="preview">Preview</TabsTrigger>
|
|
95
|
+
<TabsTrigger value="details">Details</TabsTrigger>
|
|
96
|
+
</TabsList>
|
|
97
|
+
<TabsContent value="preview" className="pt-4">
|
|
98
|
+
<Badge>Interactive preview</Badge>
|
|
99
|
+
<p className="mt-3 text-body-large">Use left and right arrows in the tab list.</p>
|
|
100
|
+
</TabsContent>
|
|
101
|
+
<TabsContent value="details" className="pt-4">
|
|
102
|
+
<AccordionRoot>
|
|
103
|
+
<AccordionItem value="accessibility">
|
|
104
|
+
<AccordionTrigger>Keyboard and focus</AccordionTrigger>
|
|
105
|
+
<AccordionPanel>
|
|
106
|
+
Base UI owns focus movement, expanded state and dismissal. M3 owns typography,
|
|
107
|
+
shape and theme roles.
|
|
108
|
+
</AccordionPanel>
|
|
109
|
+
</AccordionItem>
|
|
110
|
+
</AccordionRoot>
|
|
111
|
+
</TabsContent>
|
|
112
|
+
</TabsRoot>
|
|
113
|
+
</Card>
|
|
114
|
+
</Section>
|
|
115
|
+
<Section
|
|
116
|
+
title="Modal dialog"
|
|
117
|
+
description="Opening the dialog moves focus inside; Escape closes it and restores focus to the trigger."
|
|
118
|
+
>
|
|
119
|
+
<DialogRoot>
|
|
120
|
+
<DialogTrigger asChild>
|
|
121
|
+
<Button variant="tonal">Open dialog</Button>
|
|
122
|
+
</DialogTrigger>
|
|
123
|
+
<DialogContent>
|
|
124
|
+
<DialogTitle>Local preview dialog</DialogTitle>
|
|
125
|
+
<DialogDescription>
|
|
126
|
+
This demonstration changes no account or remote data.
|
|
127
|
+
</DialogDescription>
|
|
128
|
+
<div className="pt-4">
|
|
129
|
+
<DialogClose asChild>
|
|
130
|
+
<Button>Close dialog</Button>
|
|
131
|
+
</DialogClose>
|
|
132
|
+
</div>
|
|
133
|
+
</DialogContent>
|
|
134
|
+
</DialogRoot>
|
|
135
|
+
</Section>
|
|
136
|
+
</Page>
|
|
137
|
+
);
|
|
138
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import {
|
|
4
|
+
CollectionReader,
|
|
5
|
+
MangaReader,
|
|
6
|
+
DatabookReader,
|
|
7
|
+
type ReaderCollectionEdition,
|
|
8
|
+
} from "@aphrody/m3-reader";
|
|
9
|
+
// oxlint-disable-next-line import/no-unassigned-import -- reader styles provide the portable reader layout and reduced-motion rules
|
|
10
|
+
import "@aphrody/m3-reader/styles.css";
|
|
11
|
+
import { Card, Page, Section } from "../components/ui.tsx";
|
|
12
|
+
import type { PageProps } from "./index.ts";
|
|
13
|
+
|
|
14
|
+
function samplePage(number: number): string {
|
|
15
|
+
const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="720" height="960" viewBox="0 0 720 960"><rect width="720" height="960" fill="#f5f0ff"/><rect x="40" y="40" width="640" height="390" rx="18" fill="#e0d4f5"/><circle cx="${180 + number * 70}" cy="220" r="80" fill="#6750a4"/><rect x="40" y="470" width="300" height="400" rx="18" fill="#d6e6f0"/><rect x="380" y="470" width="300" height="400" rx="18" fill="#ead8e7"/><text x="60" y="920" font-family="sans-serif" font-size="28" fill="#34264d">Local illustration · page ${number}</text></svg>`;
|
|
16
|
+
return `data:image/svg+xml,${encodeURIComponent(svg)}`;
|
|
17
|
+
}
|
|
18
|
+
const PAGES = [1, 2, 3].map(samplePage);
|
|
19
|
+
const EDITIONS: ReaderCollectionEdition[] = [
|
|
20
|
+
{
|
|
21
|
+
id: "first",
|
|
22
|
+
label: "Illustrated edition",
|
|
23
|
+
chapters: [
|
|
24
|
+
{ id: "one", label: "Shapes", pageCount: 3 },
|
|
25
|
+
{ id: "two", label: "Reading", pageCount: 3 },
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: "second",
|
|
30
|
+
label: "Annotated edition",
|
|
31
|
+
chapters: [{ id: "notes", label: "Annotations", pageCount: 3 }],
|
|
32
|
+
},
|
|
33
|
+
];
|
|
34
|
+
const NOTES = PAGES.map((image, index) => ({
|
|
35
|
+
image,
|
|
36
|
+
number: index + 1,
|
|
37
|
+
text: `Local demonstration page ${index + 1}. The shapes above are original inline SVG sample artwork. Use the paged view, zoom, and keyboard navigation to explore.`,
|
|
38
|
+
verifiee: true,
|
|
39
|
+
}));
|
|
40
|
+
|
|
41
|
+
export default function Reader({ adaptive }: PageProps) {
|
|
42
|
+
const [page, setPage] = useState(1);
|
|
43
|
+
const [kind, setKind] = useState<"manga" | "notes">("manga");
|
|
44
|
+
return (
|
|
45
|
+
<Page
|
|
46
|
+
title="Reader"
|
|
47
|
+
summary="An illustrated collection, paged manga viewer and annotated databook. All three pages use original local SVG sample artwork and require no external image request."
|
|
48
|
+
packages={["@aphrody/m3-reader"]}
|
|
49
|
+
panes={adaptive.panes}
|
|
50
|
+
>
|
|
51
|
+
<Section title="Reader mode">
|
|
52
|
+
<div className="flex gap-3">
|
|
53
|
+
{(["manga", "notes"] as const).map((value) => (
|
|
54
|
+
<button
|
|
55
|
+
key={value}
|
|
56
|
+
type="button"
|
|
57
|
+
aria-pressed={kind === value}
|
|
58
|
+
onClick={() => setKind(value)}
|
|
59
|
+
className={`state-layer rounded-full px-4 py-2 text-label-large ${kind === value ? "bg-secondary-container text-on-secondary-container" : "border border-outline"}`}
|
|
60
|
+
>
|
|
61
|
+
{value === "manga" ? "Paged illustration" : "Annotated pages"}
|
|
62
|
+
</button>
|
|
63
|
+
))}
|
|
64
|
+
</div>
|
|
65
|
+
</Section>
|
|
66
|
+
<Section
|
|
67
|
+
title="Local illustrated collection"
|
|
68
|
+
description="Switch editions, chapters, reading direction and paged or vertical modes."
|
|
69
|
+
>
|
|
70
|
+
<Card>
|
|
71
|
+
<CollectionReader
|
|
72
|
+
title="Local M3 illustrations"
|
|
73
|
+
editions={EDITIONS}
|
|
74
|
+
emptyLabel="No sample pages"
|
|
75
|
+
contentsLabel="Contents"
|
|
76
|
+
previousLabel="Previous chapter"
|
|
77
|
+
nextLabel="Next chapter"
|
|
78
|
+
renderChapter={(_edition, chapter) =>
|
|
79
|
+
kind === "manga" ? (
|
|
80
|
+
<MangaReader
|
|
81
|
+
key={chapter.id}
|
|
82
|
+
pages={PAGES}
|
|
83
|
+
title={chapter.label}
|
|
84
|
+
direction="ltr"
|
|
85
|
+
onPageChange={setPage}
|
|
86
|
+
/>
|
|
87
|
+
) : (
|
|
88
|
+
<DatabookReader key={chapter.id} pages={NOTES} title={chapter.label} />
|
|
89
|
+
)
|
|
90
|
+
}
|
|
91
|
+
/>
|
|
92
|
+
</Card>
|
|
93
|
+
{kind === "manga" ? (
|
|
94
|
+
<p role="status" className="text-body-medium">
|
|
95
|
+
Illustration page: {page}
|
|
96
|
+
</p>
|
|
97
|
+
) : null}
|
|
98
|
+
</Section>
|
|
99
|
+
</Page>
|
|
100
|
+
);
|
|
101
|
+
}
|