Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
管理画面向けUIコンポーネントの設計 - Web componentsでフレームワーク非依存を目指す
Search
LINEヤフーTech (LY Corporation Tech)
PRO
December 12, 2023
Technology
860
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
管理画面向けUIコンポーネントの設計 - Web componentsでフレームワーク非依存を目指す
「UIT × Bonfire Front-end Meetup #1」での発表資料です。
https://uit.connpass.com/event/300284/
LINEヤフーTech (LY Corporation Tech)
PRO
December 12, 2023
More Decks by LINEヤフーTech (LY Corporation Tech)
See All by LINEヤフーTech (LY Corporation Tech)
Scaling Beyond the Exabyte: Lessons from Hadoop Integration and Operations at LY Corporation
lycorptech_jp
PRO
0
62
多層防御と最⼩権限で実現する、安全なAIエージェント設計パターン
lycorptech_jp
PRO
1
290
PM領域でのAI Agentの活用
lycorptech_jp
PRO
0
310
AI駆動開発を組織で促すために
lycorptech_jp
PRO
7
9.6k
検索技術知識0のエンジニアが広告検索システムを内製化して運用するまで
lycorptech_jp
PRO
1
380
No More Log Digging 〜AIを一次調査係にする アラートレビュー改善〜
lycorptech_jp
PRO
0
190
実践!既存 Project への AI-Driven Development 適用〜一ヶ月で Project 唯一のフロントエンドエンジニアを作り出せ〜
lycorptech_jp
PRO
1
510
AIが実装を自走する時代の認知負債との戦い
lycorptech_jp
PRO
3
1.3k
AIと1000本ノックしてたどり着いた、最速のプロダクト開発 ~toC向けAIエージェントUXを、動く選択肢とAIキャパシティで設計する~
lycorptech_jp
PRO
1
240
Other Decks in Technology
See All in Technology
DEFCON34-Write-up_HYCu-MYCu
daikiokazaki
0
160
iOSDC Japan 2026 day1 TrackC 10:50
feedtailor
0
120
山手線を徒歩で一周してわかった、 位置情報アプリは「足」が最強のデバッガー
hinakko
0
140
生成AIエージェントを用いた、 手動テスト手順書から自動テストへの 変換手法の検討
magicpod
0
140
銀行勘定系システムにおける開発プロセス刷新×AIによる環境モダナイゼーション / Development Process Transformation and AI-Driven Environment Modernization
muit
0
1.6k
空間オーディオで過去の 自分(ゴースト)と競うランニング 〜HealthKitのルートを足音に変える実装〜
nao_randd
0
150
登壇の自信を奪う3匹のオバケ / 3 Ghosts That Rob You of Your Confidence in Public Speaking
pauli
8
830
事業課題から技術的負債に向き合う
sansantech
PRO
2
1.2k
Claude Code本って、 読む必要あるの?
oikon48
2
440
絵ではじめるKubernetesセキュリティ
aoi1
3
450
Deployment の 先にある AI Agent 基盤 - kagent vNext、Agent Substrate、Hermes から読み解く Agent Runtime の現在地 / k8s-matsuri-2-ai-agent-platform-amsy810
masayaaoyama
3
490
SQL文一行も書けない人事がCortexもろもろを使って人事業務を楽にしてみる
ponponmikankan
1
240
Featured
See All Featured
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6.2k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
600
The Cult of Friendly URLs
andyhume
79
7k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
300
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
370
Making Projects Easy
brettharned
120
6.7k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
720
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
590
How GitHub (no longer) Works
holman
316
150k
Transcript
ཧը໘͚6*ίϯϙʔωϯτͷઃܭ 8FCDPNQPOFOUTͰϑϨʔϜϫʔΫඇґଘΛࢦ͢ 6*5ʷ#PO fi SF'SPOUFOE.FFUVQWPM "LJIJSP5BNBEB !TQSJOHSBJOJOH
"HFOEB طଘϓϩδΣΫτͷ$44ϑϨʔϜϫʔΫಋ ೖͷ͠͞ 8FCDPNQPOFOUTΛͬͨ6*ίϯϙʔω ϯτ࣮
"HFOEB طଘϓϩδΣΫτͷ$44ϑϨʔϜϫʔΫಋ ೖͷ͠͞ 8FCDPNQPOFOUTΛͬͨ6*ίϯϙʔω ϯτ࣮ ͕࣌ؒͳ͗͢͞ΔͷͰͪ͜ΒΛத৺ʹ͠·͢
ϓϩμΫτ w -*/&ެࣜΞΧϯτͷཧը໘ w 8FCͱJ04"OESPJE"QQ͚ʹϦϦʔε w ࣾһਓ ΞϧόΠτਓ 7/ ,3νʔϜͰ։ൃ
ཧը໘ͷ։ൃͷಛ w ͦΕͳΓʹେن w ߦ7VFϑΝΠϧ ݸ+4ϑΝΠϧ ݸ w ػೳ͕ଟذʹΘͨΔ͕ɺ֤ػೳͷར༻ස·ͪ·ͪ
w ಛఆͷϢʔβʔʹ͚ͩඞཁͳཧը໘͕ͨ͘͞Μ͋ΔΠϝʔδ ࠷খͷ࿑ྗͰɺͦͷը໘ͷॏཁʹ߹Θͤͨ ΫΦϦςΟͰ6*Λ࣮͢Δ͜ͱΛॏࢹ
ཧը໘ͷ6*ϥΠϒϥϦ w #PPUTUSBQΛΧελϚΠζͨ͠ಠࣗϥΠϒϥϦ w #PPUTUSBQաڈͷϥΠϒϥϦͱࢥΘΕ͍ͯΔ͕ʜ w ͋Δఔͬͨ6*Λ؆୯ʹ͑Δ w ΄΅ $44ͷΈͰߏ͞Ε࣮ͨͰɺͲͷΑ͏ͳڥͰ͑Δ
Ͱ#PPUTUSBQΛ͍ଓ͚Δ͔ʁ w ʮͳ͑͘Δʯ͜ͱ͕᠘ w Ҡߦͷ༏ઌΛԼ͛ͨ݁Ռɺগͣͭ͠$44ϑϨʔϜϫʔΫͷґଘ ΛਂΊ͍ͯ͘ w ཁ݅ʹ߹Θͤͯ$44ͷύον͕૿͍͖͑ͯɺՃతʹมߋΛࠔ ʹ͍ͯͨ͠
ҠߦͷऔΓΈ w ݕ౼ͷ݁Ռ5BJMXJOEΛ࠾༻͠ɺঃʑʹҠߦ͍ͯ͘͜͠ͱʹ w #PPUTUSBQͷDMBTT໊͕5BJMXJOEͷͷͱॏෳ😩 w Ήͳ͘5BJMXJOEͷQSF fi YΛ༗ޮԽ AMEAΛ༩
<div class="ld-flex ld-items-start ld-mx-200 ld-my-600"> <div class="ld-w-[130px] ld-h-[130px] ld-bg-gray-200"> <img class="ld-max-w-full ld-max-h-full" /> ...
6*ίϯϙʔωϯτͷ࣮ w 5BJMXJOEl6UJMJUZ fi STUzͳ$44ϑϨʔϜϫʔΫͳͷͰɺશʹ #PPUTUSBQΛஔ͖͑Δʹ6*ίϯϙʔωϯτΛ༻ҙ͢Δඞཁ͕͋Δ w ௨ৗͰ͋ΕͦΕͧΕͷϑϨʔϜϫʔΫ্Ͱಈ࡞͢Δίϯϙʔωϯτ ͱ࣮͍͕ͯͯ͘͠͠ʜ
͞Βʹঢ়گ͕ෳࡶʹͳ͍ͬͯ͘ w ࣮ಉ࣌ʹ7VF͔Β7VFͷҠߦ͕ਐߦத w ཧը໘ͷେ౷Ұܭը w ࠓޙʮ-*/&ެࣜΞΧϯτʯҎ֎ͷ༷ʑͳཧը໘ͷ6*69Λڞ ௨Խ͢ΔՄೳੑ w ϑϨʔϜϫʔΫ͢ΒόϥόϥʹͳΔՄೳੑ͕ग़͖ͯͨ
ϑϨʔϜϫʔΫʹґଘͤͣಈ࡞͢Δ6*ίϯϙʔωϯτ͕ඞཁ
͜Ε·Ͱͷ·ͱΊ w #PPUTUSBQ͋ΔఔͬͨϖʔδΛ࡞Δͷʹ͕͘ɺཁ͕݅ෳࡶʹ ͳΔʹͭΕͯύον͕૿͍͖͑ͯมߋΛࠔʹ͍ͯͬͨ͠ w 5BJMXJOE༏ल͕ͩ୯ମ͚ͩͰ#PPUTUSBQͷସʹͳΒͳ͍ w 7VF7VF 3FBDU ͰҰ؏ͯ͠ಈ࡞͢Δ6*ίϯϙʔωϯτΛ
ఏڙ͍ͨ͠
8FCDPNQPOFOUT
ͳͥ8FCDPNQPOFOUTʁ w ϑϨʔϜϫʔΫʹґଘ͠ͳ͍6*ίϯϙʔωϯτΛఏڙͰ͖Δ w 4IBEPX%0.ʹΑΔελΠϧͷʹΑΓɺ$44ͷΈͷϑϨʔϜ ϫʔΫʹ͕͋ͬͨղফͰ͖Δ
ͱ͍͏ͷͷʜ w 6*ίϯϙʔωϯτͱͯ͠8FCDPNQPOFOUTΛ࠾༻͢Δ͜ͱʹջٙత ͳҙݟଟ͍ w ։ൃύϥμΠϜͷҧ͍ w طଘϑϨʔϜϫʔΫͱͷੑ w 443ͷରԠ
w ͦΕͧΕͷ՝ʹ͍ͭͯɺࢲͨͪͷࠓͷղܾࡦΛ͠·͢
8FCDPNQPOFOUTͷ։ൃํ๏ w ֤ίϯϙʔωϯτ-JUΛ࣮ͬͯ w -JU&MFNFOU)5.-&MFNFOUͷ4VCDMBTTͱͯ͠ಈ࡞͠ɺಁաతʹ 8FCDPNQPOFOUTͷ"1*Λѻ͑Δ͕ಛ w ҰํͰɺ$MBTTϕʔεͷ"1*ݱͷϑϩϯτΤϯυ։ൃ͔Βͷίϯ ςΩετεΠονΛඞཁͱ͢Δ w
ಛʹ.JYJOؔ࿈Ͱ5ZQF4DSJQUͷରԠ͕ݫ͍͠
;BH
;BH w 6*ίϯϙʔωϯτ࣮ͷͨΊͷϥΠϒϥϦ w ϔουϨε6*ϥΠϒϥϦͷ"SLɺ$44JO+4ϑϨʔϜϫʔΫͷ 1BOEB$44͕;BHΛϕʔεʹ࣮͞Ε͍ͯΔ w ϑϨʔϜϫʔΫʹґଘ͠ͳ͍࣮ʹͳ͓ͬͯΓɺެࣜͰ3FBDU7VF 4PMJEʹରԠ 8FCDPNQPOFOUT
-JU ʹରԠՄೳ
-JU͚ͷϔϧύʔΛ༻ҙ͢Δ͜ͱͰͳ͘ಈ࡞ import * as checkbox from '@zag-js/checkbox'; import { useController
} from 'haunted'; import { html } from 'lit'; import { MachineController, applyProps, createElement } from '~util'; export const Checkbox = createElement((element) => { const machine = useController( (host) => new MachineController(host, checkbox) ); const api = machine.connect(); return html` <label ${applyProps(api.rootProps)}> <div class="checkbox" ${applyProps(api.controlProps)}></div> <input ${applyProps(api.hiddenInputProps)} /> <span ${applyProps(api.labelProps)}> <slot></slot> </span> </label> `; });
;BHͷڧΈ w εςʔτϚγϯΛ༻ҙ͢Δ͜ͱͰɺঢ়ଶཧʹؔ͢ΔॲཧΛۃݶ·Ͱ நԽͰ͖Δ w ผ్$44JO+4Λఏڙ͢Δڥ͕༻ҙͰ͖Εɺ;Δ·͍Λҡ࣋͠ ͨ··8FCDPNQPOFOUT͔Β٫͢Δ͜ͱ͢ΒՄೳ w 8FCDPNQPOFOUϑϨʔϜϫʔΫʹґଘ࣮͔ͨ͠Β٫Ͱ͖Δ
طଘϑϨʔϜϫʔΫͱͷੑ w 8FCDPNQPOFOUT୯ͳΔ)5.-λάͱͯ͠Ͳ͜ͰͰ͑Δ͕ɺ ٯʹܽͰ͋Δ w 3FBDU7VFͷίϯϙʔωϯτͱͯ͑ͣ͠ɺ5ZQF4DSJQUͷܕ͕ޮ͔ ͳ͍ w -JU4UFODJMͳͲϑϨʔϜϫʔΫผʹϥούʔίϯϙʔωϯτΛग़ྗ ͢Δػೳ͕༻ҙ͞Ε͍ͯΔ
DVTUPNFMFNFOUTNBOJGFTU w ੜπʔϧ͕όϥόϥʹ࣮͞Ε͍ͯΔ͜ͱΛࢹͯ͠࡞ΒΕͨɺ $VTUPNFMFNFOUͷϚχϑΣετϑΝΠϧͷ༷ w ADVTUPNFMFNFOUTKTPOAͱ͍͏໊લͷ+40/4DIFNBΛ༻ҙ ͠ɺͦͷதͰ$VTUPNFMFNFOUʹ͍ͭͯͷϝλσʔλΛએݴ͢Δ $VTUPNFMFNFOUTNBOJGFTUΛͱʹ 3FBDU7VF͚ϥούʔΛੜ
ιʔείʔυ͔ΒQSPQTTMPUTFNJUTͷܕΛநग़ import { defineComponentEmits, defineComponentProps, defineComponentSlots, } from '~util'; export
const tagName = 'my-checkbox'; export const props = defineComponentProps<{ checked: boolean; }>({ checked: false, }); export const slots = defineComponentSlots<{ default: () => void; }>(); export const emit = defineComponentEmits<{ changed: boolean | 'indeterminate'; }>(); { "schemaVersion": "1.0.0", "modules": [ { "kind": "javascript-module", "declarations": [ { "kind": "class", "customElement": true, "tagName": "my-checkbox", "attributes": [ { "name": "checked", "fieldName": "checked", "type": { "text": "boolean" }, "default": "false" } ], "slots": [], "events": [ { "name": "changed", "type": { "text": "CustomEvent<boolean | \"indeterminate\">" }
ͳ͘3FBDU7VF͔Βར༻Ͱ͖ΔΑ͏ʹʂ <MyCheckbox :checked="checked" @changed="..."> ... </MyCheckbox> <MyCheckbox checked={checked} onChanged={...}> ...
</MyCheckbox> { "schemaVersion": "1.0.0", "modules": [ { "kind": "javascript-module", "declarations": [ { "kind": "class", "customElement": true, "tagName": "my-checkbox", "attributes": [ { "name": "checked", "fieldName": "checked", "type": { "text": "boolean" }, "default": "false" } ], "slots": [], "events": [ { "name": "changed", "type": { "text": "CustomEvent<boolean | \"indeterminate\">" } 7VF 3FBDU
443ͷରԠ w ೦ͳ͕Βɺ443Λ࣮ݱ͢ΔͨΊͷΤίγεςϜ·ͩ·ͩ w ࢲͨͪͷϓϩμΫτ͕443Λ༻͍ͯ͠ͳ͔ͬͨ8FC DPNQPOFOUTΛ࠾༻ͨ͠ཧ༝ͷҰͭ
%FDMBSBUJWF4IBEPX%0.ͷظ w ͔͠͠ʜʜ%FDMBSBUJWF4IBEPX%0.͕͍ͭʹ4BGBSJʹʂ w 443ڥͰ4IBEPX%0.Λར༻͢ΔͨΊͷٕज़ཁૉ w खݩͰࢼ͢ൣғͰɺ)ZESBUJPOFSSPS͕ൃੜ͢Δͷͷɺͳ͘ ίϯϙʔωϯτ͕443)ZESBUJPO͞ΕΔঢ়ଶͩͬͨ /FYUKT /VYU
$PODMVTJPO w 8FCDPNQPOFOUTϑϨʔϜϫʔΫඇґଘ ͷ6*ίϯϙʔωϯτΛ࣮͢Δͷʹྑ͍બ w ;BHʹΑΔ6*ͷ;Δ·͍ͷ w কདྷੑΛߟ͑ͨΤεέʔϓϋον͕ॏཁ