ð ãã®èšäºã5è¡ã§ãŸãšãããš
- ååã®èšäºã§äºåããŠãã Taskæ©èœ ãå®è£ ããåºèã¡ã¢ããŒã«ãã²ãšãŸã宿ããŸããã
- Taskã®è¿œå ã»å®äºã»åé€ã ãã§ãªããã¹ããåæã§ é·æŒãã»äžŠã³æ¿ãUX ãäœåºŠã調æŽããŸããã
- æ¹åéäžã§å ¥ã£ããŽãŒã¹ãæ¹åŒã«å®æ©ã§éåæããããæçµçã« ã«ãŒãæ¬äººãçŽæ¥åããæ¹åŒ ãžå€æŽããŸããã
- æåŸã¯äžŠã³æ¿ãæç«ã®å¢çã ã»ãŒ100% â çŽ75% ãŸã§åºããå°ãªãæã®ç§»åã§ãåšå²ã®ã«ãŒããèªç¶ã«é¿ãããã調æŽããŸããã
- æçµç¢ºèªã§ã¯ Chrome headlessãTaské¢é£ 69 passedãå šäœ 742 passed / 17 skipped ã確èªããŠããŸãã
ã¯ããã«
çŸåšãããŒã«ãªãŒåã売äžç®¡çã¢ã㪠Bakery HubïŒsales_data_appïŒ ãå人éçºããŠããŸãã
GitHubïŒ
ååã®èšäºã§ã¯ãåºèã¡ã¢æ©èœãäžå¿ã«ãChange Lããç¶ããæ¹åããŸãšããŸããã
ãã®æåŸã§ã
次ã¯Taskæ©èœãžé²ã
ãšæžããŠããŸããã
ãããŠã
ææçºæ³šã»åºèã¡ã¢ã»Taskã®3ã€ãæã£ããšããã§ãåºèã¡ã¢ããŒã«ãšããŠäžåºŠãŸãšããã
ãšãèããŠããŸããã
ä»åã¯ããã®ç¶ãã§ãã
ãšã¯ãããä»åã®èšäºã®äž»åœ¹ã¯ã»ãŒ Taskæ©èœ ã§ãã
ðª åºèã¡ã¢ããŒã«ã®çŸåšå°
åºèã¡ã¢ããŒã«ã¯ã売äžåæãšã¯å°ã圹å²ãéããŸãã
åºèæ¥åã®äžã§ã
- ããšã§çºæ³šããããã®
- å¿ããããªãããš
- 仿¥ããããš
ããããæ®ããå ŽæãšããŠäœã£ãŠããŸãã
çŸåšã¯æ¬¡ã®3æ©èœã«ãªããŸããã
| æ©èœ | çšé |
|---|---|
| çºæ³š | ææã»ååãªã©ã®çºæ³šãè²·ãç©ã¡ã¢ |
| ã¡ã¢ | åºèéå¶ã§æ®ããŠããããæ å ± |
| Task | åºå ã§ããããšã»ç¢ºèªããããšã®ç®¡ç |
ä»åããã®æåŸã® Taskæ©èœ ãŸã§å®è£ ããŸããã
â Taskæ©èœã远å
ãŸãå¿ èŠã ã£ãã®ã¯ãæ®éã®ã¿ã¹ã¯ç®¡çã§ãã
äŸãã°ã
â¡ ææ¥ã®é£ãã³ãä»èŸŒã
â¡ å·èµåº«ã®æž©åºŠã確èª
⡠売ãå Žãè£å
ãã
â¡ ãªãŒãã³ãæž
æ
â¡ ç¿æ¥ã®äºçŽã確èª
ã®ããã«ç»é²ããŠãçµãã£ãããã§ãã¯ããã
çºæ³šããææãååã¯ãçºæ³šãæ©èœãžã
Taskã§ã¯ã
åºèã§å®éã«ããäœæ¥ã確èªäºé
ã管çããã€ã¡ãŒãžã§ãã
ä»åå®è£ ããäž»ãªæ©èœã¯æ¬¡ã®éãã§ãã
| æ©èœ | å 容 |
|---|---|
| 远å | æ°ããTaskãç»é² |
| å®äº / æªå®äº | ãã§ãã¯ã§ç¶æ å€æŽ |
| åé€ | äžèŠãªTaskãåé€ |
| è€æ°éžæ | è€æ°TaskããŸãšããŠéžæ |
| äžæ¬åé€ | éžæããTaskããŸãšããŠåé€ |
| å®äºã°ã«ãŒã | å®äºæžã¿TaskããŸãšããŠè¡šç€º |
| äžŠã³æ¿ã | é·æŒãããŠå¥œããªé çªãžç§»å |
ãã ãä»åäžçªæéã䜿ã£ãã®ã¯CRUDãã®ãã®ã§ã¯ãããŸããã§ããã
ã¹ããã§è§Šã£ãæã«éåæããªãã
ãšããéšåã§ãã
ð± Taskã1ä»¶ãã€ç¬ç«ã«ãŒããž
æåã®TaskäžèЧããæ©èœãšããŠã¯åããŠããŸããã
ãã ãã¹ããã§äœ¿ã£ãŠã¿ããšã
ããå°ãTaskã¢ããªãããã1ä»¶ãã€è§Šããæãã«ããã
ãšæããŸããã
ããã§ãTaskã1ä»¶ãã€ç¬ç«ããã«ãŒãã«ããŸããã
ââââââââââââââââââââââââââ
â â¡ ææ¥ã®é£ãã³ãä»èŸŒã â
ââââââââââââââââââââââââââ
ââââââââââââââââââââââââââ
â â¡ å·èµåº«ã®æž©åºŠãç¢ºèª â
ââââââââââââââââââââââââââ
ââââââââââââââââââââââââââ
â ⡠売ãå Žãè£å
ãã â
ââââââââââââââââââââââââââ
ã«ãŒãå士ã«ãå°ãééã空ããŠããŸãã
åãªãäžèЧã§ã¯ãªãã
æã§è§Šãã1ã€ã®èŠçŽ
ãšããŠåããããããããã£ãããã§ãã
â å®äºæžã¿ã0ä»¶ãªã衚瀺ããªã
æ¬¡ã«æ°ã«ãªã£ãã®ããå®äºæžã¿Taskã®è¡šç€ºã§ããã
å®äºæžã¿ã0ä»¶ãªã®ã«ã
å®äº 0
ãšè¡šç€ºããç¶ããå¿ èŠã¯ãªããšæããŸããã
ããã§ã
å®äºæžã¿ 0ä»¶
â
衚瀺ããªã
ãšãã圢ã«ããŠããŸãã
1ä»¶å®äºãããšã
âš å®äº 1
ãèªåã§çŸããŸãã
å¿ èŠã«ãªã£ãæã ã衚瀺ããæ¹ããç»é¢ããã£ããããŸãã
ð é·æŒãã§äžŠã³æ¿ããã
Taskæ©èœãäœããªããäžŠã³æ¿ããæ¬²ãããªããŸããã
äŸãã°ã
å·èµåº«ã®æž©åºŠã確èª
売ãå Žãè£å
ãã
ææ¥ã®é£ãã³ãä»èŸŒã
ç¿æ¥ã®äºçŽã確èª
ãšãªã£ãŠããæã«ã
ãææ¥ã®é£ãã³ãä»èŸŒãããå ã«ãããããªãã
ææ¥ã®é£ãã³ãä»èŸŒã
å·èµåº«ã®æž©åºŠã確èª
売ãå Žãè£å
ãã
ç¿æ¥ã®äºçŽã確èª
ã®ããã«ããã®å Žã§åªå é äœãå€ãããã
ããã§ç®æããæäœãã
é·æŒã
â
ã«ãŒããæŽã
â
ãã®ãŸãŸäžäžãžç§»å
â
æãé¢ã
â
äžŠã³æ¿ãæç«
ã§ãã
ðµ äžŠã³æ¿ãäžã«ç»é¢ãŸã§ã¹ã¯ããŒã«ãã
宿©ã§ç¢ºèªãããšãæåã«æ°ã«ãªã£ãã®ãããã§ããã
Taskãé·æŒãããŠäžäžãžåããããšãããšã
ã«ãŒãã ãã§ãªãç»é¢ãŸã§ã¹ã¯ããŒã«ããŠããŸã
ããšããããŸãã
ããã§ã¯ã
Taskãåãããã
ã®ãã
ããŒãžãã¹ã¯ããŒã«ããã
ã®ããææ§ã§ãã
ããã§ã
é·æŒãæç«å
â éåžžã¹ã¯ããŒã«
é·æŒãæç«åŸ
â Taskã®äžŠã³æ¿ããåªå
äžŠã³æ¿ãäž
â ããŒãžã¹ã¯ããŒã«ãæå¶
ãšãã圢ãžèª¿æŽããŸããã
ã¹ããã§ã¯ããã©ãã°ã§ãããã ãã§ã¯è¶³ããã
ã¹ã¯ããŒã«ãšã®ç«¶åãã©ãæ±ãããæäœæã«ããªã圱é¿ããŸããã
ðïž ãããããšå ¥ãæ¿ããã®ãåããã«ãã
äžŠã³æ¿ãèªäœã¯æåããŠããŠãã
ãã
ãšäžç¬ã§äœçœ®ãå€ãããšã
ããïŒ
ä»ã¡ãããšç§»åããïŒ
ãšäžç¬æããããšããããŸããã
ããã§ãåšå²ã®Taskãã
ã¹ã
ãšé¿ãããããªã¢ãã¡ãŒã·ã§ã³ãå ¥ããŸããã
ç§»åååŸã®äœçœ®ãååŸããŠã
const previousTop = card.getBoundingClientRect().top;
// DOMã®äœçœ®ã倿Ž
const currentTop = card.getBoundingClientRect().top;
const deltaY = previousTop - currentTop;
ãã®å·®åã䜿ã£ãŠã
card.animate(
[
{ transform: `translateY(${deltaY}px)` },
{ transform: "translateY(0)" },
],
{
duration: 180,
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
}
);
ãšããŠããŸãã
FLIPãšåŒã°ããèãæ¹ãåèã«ããŠããŸãã
ãŸã ãã®èŸºãããã¹ãŠæ·±ã説æã§ããã»ã©çè§£ããŠããããã§ã¯ãããŸããã
ãã ã宿©ã§è§Šã£ãæã®åãããããã¯ããªãå€ãããŸããã
ð» éäžã§å ¥ã£ãããŽãŒã¹ããã«éåæ
äžŠã³æ¿ãUXãAIãšäžç·ã«äœåºŠã調æŽããŠããéäžã§ãã«ãŒããè€è£œããåŠçãå ¥ããŸããã
const ghost = card.cloneNode(true);
ãã®æã®åãã¯ã
å
ã®ã«ãŒã
â
ãã®å Žã«æ®éã®æ¿ãã§æ®ã
ã³ããŒãããŽãŒã¹ã
â
æã«ã€ããŠåã
ãšããç¶æ ã§ããã
æ©èœãšããŠã¯äžŠã³æ¿ãã§ããŸãã
ã§ãã¹ããã§è§Šã£ãŠã¿ããšã
ãªããéã
ãšæããŸããã
ç»é¢äžã«ã¯ã
å
ã®Task
+
æã«ã€ããŠåããŠããåãTask
ãäžæçã«2ã€èŠããŸãã
ã€ãŸãã
ã«ãŒããæŽãã§ãããšãããããã³ããŒã ããåãããŠãã
ããã«æããŸããã
ãŽãŒã¹ãæ¹åŒãã®ãã®ãééããšããæå³ã§ã¯ãããŸããã
ä»åã®Bakery Hubã§ç®æããŠããæäœæãšã¯éã£ãããã宿©ã§æããéåæãããšã«ä¿®æ£ããŠãããŸããã
ð± Xiaomi端æ«ã®Taskã¢ããªãšèŠæ¯ã¹ãŠã¿ã
æ®æ®µäœ¿ã£ãŠãã Xiaomi端æ«ã®Taskã¢ã㪠ã§ããäžŠã³æ¿ãã®åããæ¹ããŠç¢ºèªããŸããã
ãã¡ãã¯ã
é·æŒã
â
ãã®ã«ãŒãæ¬äººãæµ®ã
â
ãã®ãŸãŸæã«ã€ããŠãã
ããã«èŠããŸãã
å ã®ã«ãŒãããã®å Žã«æ®ãããŸãŸãå¥ã®ã³ããŒã ããåãããã«ã¯èŠããŸããã
ããã§ã
Bakery Hubãããã®æäœæã«è¿ã¥ããã
ãšæããŸããã
ãŽãŒã¹ãæ¹åŒã®éåæãäŒããªããä¿®æ£ãéãã
ã«ãŒãæ¬äººãæµ®ããŠããã®ãŸãŸæã«ã€ããŠåã圢ãžå€æŽããŠãããŸããã
ð ãŽãŒã¹ããæ€å»ããŠãã«ãŒãæ¬äººããåãã
æçµçã«ã¯ããŽãŒã¹ãæ¹åŒãæ€å»ããŸããã
ç®æããåãã¯ã
é·æŒã
â
å®ã«ãŒãæ¬äººãæµ®ã
â
æã«ã€ããŠåã
â
åšå²ã®ã«ãŒãããã«ã£ãšé¿ãã
â
æãé¢ã
â
ãã®äœçœ®ãžçå°
ã§ãã
ã³ããŒã¯äœããŸããã
å®éã®Taskã«ãŒãæ¬äººãæã¡äžããŸãã
ð§© placeholderã§å ã®å Žæã確ä¿
ãã ããå®ã«ãŒãæ¬äººãæã¡äžãããšå¥ã®åé¡ãåºãŸãã
äŸãã°ã
ææ¥ã®é£ãã³ãä»èŸŒã
ãªãŒãã³ãæž
æ
ç¿æ¥ã®äºçŽã確èª
ããããªãŒãã³ãæž æããéåžžã¬ã€ã¢ãŠãã®å€ãžåºããšã
ææ¥ã®é£ãã³ãä»èŸŒã
ç¿æ¥ã®äºçŽã確èª
ãšãªããäžèŠ§ãæ¥ã«è©°ãŸã£ãŠããŸããŸãã
ããã§ãããªãŒãã³ãæž æããããå Žæã«äžæç㪠placeholder ã眮ããŸãã
ææ¥ã®é£ãã³ãä»èŸŒã
[ placeholder ]
ç¿æ¥ã®äºçŽã確èª
ããªãŒãã³ãæž æãã®ã«ãŒãæ¬äººã¯ç»é¢äžã§æµ®ãããŸãŸãæã«ã€ããŠåããŸãã
æãäžäžãžåãããšã
Taskæ¬äººã§ã¯ãªãplaceholderã®äœçœ®ãå ¥ãæ¿ãã
圢ã§ãã
æåŸã«æãé¢ããæã
placeholder
â
Taskæ¬äºº
ãžæ»ããŸãã
ããã§ã
ãã³ããŒãåãããã®ã§ã¯ãªããæŽãã ã«ãŒãæ¬äººãåããã
æèŠã«ããªãè¿ã¥ããŸããã
ðïž requestAnimationFrame + translate3d
æã«ã€ããŠããTaskã®äœçœ®æŽæ°ã«ã¯ã
requestAnimationFrame()
ãšã
transform: translate3d(...);
ã䜿ã£ãŠããŸãã
ãã©ãã°äžã¯äœåºŠãäœçœ®æŽæ°ãçºçããŸãã
ããã§ã
æãåã
â
requestAnimationFrame
â
transformã§è¡šç€ºäœçœ®ãæŽæ°
ãšãã圢ã«ããŸããã
宿©ã§ã¯ã以åããããªãèªç¶ã«æãžã€ããŠããããã«ãªããŸããã
ð¯ æåŸã«è©°ãããäžŠã³æ¿ãæç«ã®å¢çç·ã
ä»åã®Task調æŽã§ãç¹ã«å°è±¡ã«æ®ã£ãã®ã¯æåŸã®ãã®éšåã§ããã
ã«ãŒãæ¬äººãæã«ã€ããŠåããåšå²ã®Taskããã«ã£ãšé¿ããã
ããªãçæ³ã«è¿ã¥ããŠããŸããã
ãã ãå®éã«äœåºŠãäžŠã³æ¿ããŠãããšã
ããå°ãæ©ã段éã§ãé£ã®ã«ãŒããé¿ããŠãããæ¹ãåããããã
ãšæããŸããã
ãããŸã§ã¯ãåãããŠããã«ãŒããé£ã®ã«ãŒããžã
ã»ãŒ100%
éãªãããããŸã§ç§»åããªããšãäžŠã³æ¿ããæç«ããŸããã§ããã
ããã§ããã®å¢çãã
ã»ãŒ100%
â
çŽ75%
ãŸã§åºããŸããã
ã€ãŸããé£ã®Taskãžå®å šã«éãåããªããŠãã
çŽ75%éãªã£ã段éã§ããã¡ããžç§»åãããããšå€å®ãã
ããã«ããŸããã
äŸãã°ã
Task A
Task B
Task C
ã§Task Bãäžãžåããå Žåã
Task CãžçŽ75%éãªã
â
Task Cãå
ã«ãã«ã£ãšäžãžé¿ãã
â
Task Bã®ç§»åå
ãåãã
ãšããåãã«ãªããŸãã
æ°åã ãèŠããšã
100% â 75%
ãšããå°ããªå€æŽã§ãã
ã§ã宿©ã§è§Šã£ãæèŠã¯ããªãéããŸããã
æããããŸã§å€§ããåãããªããŠãã
ããããžç§»åãããããšããæäœã«UIåŽãå°ãæ©ãåå¿ããŠããã
ããã«ãªã£ãããã§ãã
ä»åç¹ã«é¢çœãã£ãã®ã¯ã
ãäžŠã³æ¿ãæ©èœãããããã ãã§ãªãããã©ã®äœçœ®ã§äžŠã³æ¿ããæç«ãããããŸã§UXã«ãªã
ãšããããšã§ããã
ð¥ ãã ã75%åã§äžåºŠå£ãã
ãã®å¢çã75%ãžå€æŽããéäžã§ãäžåºŠäžŠã³æ¿ããå£ããŸããã
çç¶ã¯ã
é·æŒãã§ãã
â
ã«ãŒãã¯æµ®ã
â
ã§ãæãåãããŠãäœãèµ·ããªã
ãšããç¶æ ã§ãã
åå ã調ã¹ããšã
äžŠã³æ¿ãå€å®ã ãã倿Žããã€ãããã眮æç¯å²ãåºãåããããŠãã
ããšãåãããŸããã
ãã®çµæã
animateTaskReorder()
ã®äžãžã
card
placeholder
clientY
gesture
ãªã©ãæ¬æ¥å¥ã®åŠçã«ãã倿°ãå ¥ã蟌ãã§ããŸããã
ã€ãŸãã
æåŸã®åŸ®èª¿æŽã®ã€ããã§ãäžŠã³æ¿ãã®æ žãŸã§å£ããŠãã
ãšããããšã§ãã
ð ãŸããçæ³çã«åããŠããç¶æ ããžæ»ã
ãã®æã¯ãããã«ä¿®æ£ãéããã®ãäžåºŠãããŸããã
å ã«ã
ãã£ããŸã§çæ³çã«åããŠããç¶æ ãžæ»ã
ããšãåªå ããŸããã
æ£åžžãªç¶æ ãžåŸ©æ§ããŠãããä»åºŠã¯äžŠã³æ¿ãå šäœã§ã¯ãªãã
å¢çå€å®ã®éšåã ã
ã倿ŽããŸããã
ãããŠæçµçã«ã
çŽ75%éãªã
â
åšå²ã®ã«ãŒãããã«ã£ãšé¿ãã
ãšããä»ã®åãã«èœã¡çããŸããã
âïž ãã§ãã¯ããã¯ã¹ãæ°ã«ãªã£ã
Taskã«ãŒãã宿ã«è¿ã¥ãããšããã§ãä»åºŠã¯ãã§ãã¯ããã¯ã¹ãæ°ã«ãªããŸããã
æåã¯Taskæåããå°ã倧ããèŠããŸããã
ããã§ãµã€ãºãå°ããããŠã¿ãŸããã
ãã ã
å°ãããããã
â
ä»åºŠã¯é ŒããªãèŠãã
ãšããç¶æ ã«ãªããŸããã
æçµçã«ã¯æ¬¡ã®ãããã«èœã¡çããŸããã
| èŠçŽ | ãµã€ãº |
|---|---|
| Taskæå | 16px |
| ãã§ãã¯ããã¯ã¹ | çŽ19px |
| ãã§ãã¯ããŒã¯ | çŽ14px |
| ã¿ããé å | 44px |
èŠãç®ã¯å°ããããŠããæŒããç¯å²ã¯44pxã®ãŸãŸæ®ããŠããŸãã
ð€ ãµã€ãºã¯è¯ããã§ãå°ãäžã«èŠãã
ãµã€ãºã調æŽããåŸãã
ãã§ãã¯ããã¯ã¹ãæåããå°ãäžã«æµ®ããŠèŠãã
ãšããéåæãæ®ããŸããã
æåã«èããã®ã¯ã
top: 2px;
ã®ããã«äœçœ®ãçŽæ¥ãããæ¹æ³ã§ãã
èŠãç®ã ããªããããã§ãçŽããŸãã
ãã éäžã§ã
äœçœ®ããããã®ã§ã¯ãªãã
Taskã«ãŒããã®ãã®ãåºæºã«äžå€®æãã§ããªããïŒ
ãšèããŸããã
ð¯ ãäœçœ®ãã§ã¯ãªããåºæºããçŽã
ãã§ãã¯ããã¯ã¹ãå ãã§ãããã©ãŒã ããTaskã«ãŒãã®é«ãå šäœãžåºããŸããã
.shop-task-completion-form {
align-self: stretch;
display: flex;
align-items: center;
justify-content: center;
}
ããã«ãã§ãã¯ãã¿ã³èªäœãäžå€®ãžã
.shop-task-completion-form .shop-task-toggle {
align-self: center;
}
ããã§ã
Taskã«ãŒãå
šäœ
â
ãã®é«ãã®äžå€®
â
ãã§ãã¯ããã¯ã¹
ãšããæ§é ã«ãªããŸããã
宿©ã§èŠããšãTaskæåãšã®äœçœ®ãèªç¶ã«æããŸããã
ð¡ æ°pxãããåã«ãäœãåºæºã«ããŠãããããèŠã
ä»åãããå匷ã«ãªããŸããã
äŸãã°ã
top: 2px;
margin-top: 1px;
ã§ãèŠãç®ã¯çŽããŸãã
ã§ãä»åã¯ã
ãã§ãã¯ããã¯ã¹ãäžã«èŠãã
â
2pxäžãã
ã§ã¯ãªãã
ããããäœãåºæºã«é
眮ãããŠããïŒ
â
Taskã«ãŒãå
šäœãåºæºã«äžå€®æããã
ãšèãçŽããããšã§è§£æ±ºããŸããã
ãã¡ããUIã§ã¯ãæåŸã«1pxçšåºŠã®å åŠè£æ£ãå¿ èŠã«ãªãå ŽåããããšæããŸãã
ãã ã
ãŸãæ§é ã§æãã
ãšããèãæ¹ã¯ä»åŸã䜿ãããã§ãã
ð€ åãªãã®AIãšã®éçºã®é²ãæ¹
ä»åã®Taskéçºã¯ãä»ã®åã®AIã®äœ¿ãæ¹ãããªããã®ãŸãŸåºããšæããŸãã
æµããšããŠã¯ã
èªåã®çæ³ãAIã«çžè«ãã
â
AIãå®è£
ã»å¯Ÿçæ¡ãåºã
â
å®éã«ã³ãã³ããå
¥ããŠåãããŠã¿ã
â
宿©ã§éåæãæ¢ã
â
ãã®éåæãAIã«äŒãã
â
ãŸãä¿®æ£ãã
â
å°ããã€çæ³ã«è¿ã¥ãã
ãšãã圢ã§ãã
ä»åãæåããã
ããããJavaScriptãæžããã
ãšããã³ãŒãã®å®æåœ¢ãé ã«ãã£ãããã§ã¯ãããŸããã
ãã ã
é·æŒãããã«ãŒãæ¬äººãæµ®ããŠã»ãã
æã«ã€ããŠããŠã»ãã
åšå²ã®ã«ãŒãã¯ãããšã§ã¯ãªãããã«ã£ãšé¿ããŠã»ãã
ããå°ãæåã§äžŠã³æ¿ããæç«ããŠã»ãã
ãšããã
ãããåããŠã»ããã
ãšããçæ³ã¯ãããŸããã
ãããAIãžäŒããåºãŠããæ¡ãå®éã«åããã
éåæãããã°ããŸãäŒããã
ä»åã®ãŽãŒã¹ãæ¹åŒãã75%ã®å¢ç調æŽãããã®ç¹°ãè¿ãã®äžã§ä»ã®åœ¢ã«ãªããŸããã
AIã®ææ¡ãåãåãããšãšã
æåã«åºãŠããæ¡ããã®ãŸãŸå®æåœ¢ã«ããããšã¯å¥ã ãšæã£ãŠããŸãã
å®éã«è§Šã£ãŠãèªåãæ¬²ããåãã«è¿ã¥ããŠãããã確èªãããšãããŸã§å«ããŠãä»ã®éçºã®é²ãæ¹ã«ãªã£ãŠããŸãã
𧪠JavaScriptã¯Chrome headlessã§ã確èª
ä»åã®Taskå®è£ ã§ã¯ã以åJavaScriptã®æ§æãšã©ãŒãçµéšããŸããã
äŸãã°ã
Uncaught SyntaxError:
Identifier 'titleElement' has already been declared
ãšãããšã©ãŒã§ãã
JavaScriptã¯æ§æãšã©ãŒã1ã€ããã ãã§ããã®ãã¡ã€ã«å ã®åŠçå šäœãåããªããªãå ŽåããããŸãã
pytestãGreenã§ãã
ãã©ãŠã¶äžã§JavaScriptèªäœãèªã¿èŸŒããŠããªã
å¯èœæ§ã¯æ®ããŸãã
ããã§æè¿ã¯ãJavaScriptã倧ãã倿ŽããåŸã«ã
Chrome headless
â
pytest
â
宿©ç¢ºèª
ãšãã確èªãå ¥ããããã«ããŠããŸãã
ä»åã®æçµç¢ºèªã§ãã
Chrome JS check: OK
ã確èªããŸããã
â æçµãã¹ã
Taské¢é£ïŒ
69 passed
å šäœïŒ
742 passed
17 skipped
9 warnings
ã§ããã
742 passed, 17 skipped, 9 warnings
warningsã¯SQLite / Python 3.12åšèŸºã®DeprecationWarningã§ãä»åã®Task倿Žã«ãããã¹ã倱æã§ã¯ãããŸããã
ð PR #44ã#46ã§Taskãä»äžãã
Taskæ©èœã¯ã1åã®PRã§ãã¹ãŠå ¥ããããã§ã¯ãããŸããã
段éçã«å®è£ ã»æ¹åããŠããŸãã
| PR | äž»ãªå 容 |
|---|---|
| #44 | Taskæ©èœæ¬äœ |
| #45 | äžŠã³æ¿ãUXã®æ¹å |
| #46 | å®ã«ãŒã远åŸã»ãã§ãã¯ããã¯ã¹ã»äžŠã³æ¿ãæç«å€å®ãªã©ã®ä»äžã |
PR #44
Taskæ©èœæ¬äœã
PR #45
é·æŒãæéãäžŠã³æ¿ãæã®åããªã©ã調æŽããŸããã
PR #46
æçµçãªäžŠã³æ¿ãUXã®ä»äžãã§ãã
ããã§ã¯ã
ãŽãŒã¹ãæ¹åŒ
â
å®ã«ãŒãæ¬äººãçŽæ¥åããæ¹åŒ
ãžã®å€æŽãã
äžŠã³æ¿ãæç«
ã»ãŒ100%
â
çŽ75%
ãžã®èª¿æŽããã§ãã¯ããã¯ã¹ã®äžå€®æããªã©ãè¡ããŸããã
ðª åºèã¡ã¢ããŒã«ãã²ãšãŸã宿
ããã§ã
çºæ³š
ã¡ã¢
Task
ã®3ã€ãæããŸããã
åºèã¡ã¢ããŒã«ãšããŠã¯ãããã§ã²ãšãŸãäžåºåãã§ãã
æåããå šéšãèšèšããŠããããã§ã¯ãããŸããã
å®éã«äœã£ãŠè§Šããªããã
ããããã
â
å®è£
ãã
â
éåæãèŠã€ãã
â
çŽã
ãç¹°ãè¿ããŠãä»ã®åœ¢ã«ãªããŸããã
ð 远èšïœå®æåŸãã¡ã¢äžèЧãããäžåºŠè§ŠãçŽãã
Taskæ©èœãŸã§å®æãã
çºæ³š
ã¡ã¢
Task
ã®3ã€ãæã£ããšããã§ãåºèã¡ã¢ããŒã«ã¯ãã£ããäžåºåãã«ããŸããã
âŠâŠãã ããã®ããšæ¹ããŠã¹ããã§ã¡ã¢äžèЧãè§Šã£ãŠãããšã
Taskã¯ããªãèŠããããªã£ããã©ãã¡ã¢äžèЧã¯ããå°ãæŽçã§ããã
ãšæããŸããã
æ©èœãšããŠã¯ãã§ã«åããŠããŸãã
ã§ãã¡ã¢ãæ°ä»¶äžŠã¶ãšã
- ã©ããã¿ã€ãã«ãªã®ã
- æ¬æãã©ããŸã§äžèЧãžåºãã
- 1ä»¶ããšã®åºåã
- ãŽãç®±ã§äœãåé€ããã®ã
ããããå°ãäžç®ã§åããæ¹ã䜿ãããããã§ããã
ããã§ãTask宿åŸã«ããäžåºŠã¡ã¢ã®UI/UXã調æŽããŸããã
PRã¯ãã¡ãã§ãã
1è¡ç®ããã®ãŸãŸã¿ã€ãã«ãšããŠäœ¿ã
以åã¯ã
ã¿ã€ãã«
æ¬æ
ãå¥ã ã«å ¥åãã圢ã§ããã
ãã ãã¹ããã§ã¡ãã£ãšããã¡ã¢ãæžããã³ã«ã
ã¿ã€ãã«æ¬
â
æ¬ææ¬
ãšç§»åããå¿ èŠãããã®ã¯å°ãæéã§ãã
çŸåšã¯ã
ç§ã®æ°ã¡ãã¥ãŒæ¡
ãã€ãŸãããããã·ã¥
売䟡280åäºå®
詊äœã¯æ¥é±ç«ææ¥
ãšæžãã°ã
æåã®1è¡ãã¿ã€ãã«ãšããŠæ±ã
ããã«ããŸããã
äžèЧã§ã¯ã
ç§ã®æ°ã¡ãã¥ãŒæ¡
ãã€ãŸãããããã·ã¥âŠ
ã®ããã«ã
- 1è¡ç®ïŒå€ªåã¿ã€ãã«
- 2è¡ç®ä»¥éïŒæ¬æãã¬ãã¥ãŒ
ãšããŠè¡šç€ºããŸãã
ã¡ã¢ãæžãåŽã¯ãæ®éã«äžããæç« ãæžãã ãã§ãã
ð ã¡ã¢ã1ä»¶ãã€ç¬ç«ã«ãŒããž
äžèŠ§å šäœã倧ããªæ ã§å²ãã®ã§ã¯ãªãã
ã¡ã¢1ä»¶ãã€ãç¬ç«ããã«ãŒã
ãšããŠè¡šç€ºããããã«ããŸããã
âââââââââââââââââââââââ
â ç§ã®æ°ã¡ãã¥ãŒæ¡ â
â ãã€ãŸãããããã·ã¥âŠ â
â 9/27 â
âââââââââââââââââââââââ
âââââââââââââââââââââââ
â æ ããã±ã â
â 9æåŸåãã販売äºå®âŠ â
â 9/27 â
âââââââââââââââââââââââ
PCã§ãã¹ããã§ããåºæ¬ã¯çžŠ1åã§ãã
PCã ããäœåãæšªãžäžŠã¹ãã®ã§ã¯ãªãã
ã¡ã¢åž³ãšããŠäžããé çªã«æµãèªã¿ã§ããããš
ãåªå ããŸããã
æ¬æãäžèЧã§ãã¹ãŠè¡šç€ºããã1è¡ã ããã¬ãã¥ãŒããŸãã
詳ããèªã¿ããæã ãéãã°ããããšããèãæ¹ã§ãã
5ä»¶ããã䞊ã¹ããšéããåããããã
Bakery Hubã§ã¯Guest Demoãå ¬éããŠããŸãã
ããèå³ãããã°ã
ã¡ã¢ã5ä»¶ãããé©åœã«äœã£ãŠãäžèЧã«äžŠã¹ãŠã¿ãŠãã ããã
äŸãã°ã
ç§ã®æ°ã¡ãã¥ãŒæ¡
ãã€ãŸãããããã·ã¥ãæ ããã±ããããŒã¡ãã¯ãªãŒã ãã³ãåè£ã«ããã
æ ããã±ã
9æåŸåãã販売äºå®
売䟡260åã§æ€èš
ã®ãããªæ¶ç©ºã®ã¡ã¢ã§å€§äžå€«ã§ãã
1ä»¶ã ãã§ã¯åããã«ããã§ãããè€æ°ä»¶äžŠã¹ããšã
- ã¿ã€ãã«ã®èŠã€ãããã
- æ¬æãã¬ãã¥ãŒ
- ã«ãŒãå士ã®éé
- äžèŠ§ãæµãèªã¿ããæèŠ
ã確èªãããããšæããŸãã
ä»åã®å€æŽã¯ã¡ã¢ãè€æ°äžŠãã æã»ã©éããåãããããUIæ¹åã«ãªããŸããã
â ïž Guest Demoã詊ãå Žå
Guest Demoã«ã¯ãæ¶ç©ºã®åååã»æ¶ç©ºã®ã¡ã¢ã»ãã¹ãçšããŒã¿ãå ¥åããŠãã ããã
å人æ å ±ãæ©å¯æ å ±ãå®éã®åºèããŒã¿ãå®éã®æ¥åã§äœ¿çšããŠããæ å ±ãªã©ã¯å ¥åããªãã§ãã ããã
Guestããšã«Datasetã¯åé¢ããŠããŸãããå®åºèåãã®æ¬çªãµãŒãã¹ãšããŠæäŸããŠãããã®ã§ã¯ãããŸããã
ð ãŽãç®±ãäžèЧã«åãããŠæŽç
éåžžã®ã¡ã¢äžèЧãã³ã³ãã¯ãã«ãããšã
ä»åºŠã¯ãŽãç®±åŽãšã®éããæ°ã«ãªããŸããã
ããã§ãŽãç®±ãã
ã¿ã€ãã«
æ¬æãã¬ãã¥ãŒ
å逿¥æ
ãäžå¿ã«ãã衚瀺ãžå€æŽããŸããã
éåžžäžèЧãšåããããªæèŠã§ã
ã©ã®ã¡ã¢ãåé€ããã®ã
ã確èªã§ããŸãã
埩å ããŠããŽãç®±ã«æ®ãããã«ãã
以åã¯ãã¡ã¢ã埩å ãããšéåžžäžèŠ§ãžæ»ã£ãŠããŸããã
ãã ãè€æ°ã®å逿žã¿ã¡ã¢ãæŽçããŠããéäžã«ã
埩å
â
éåžžäžèЧãžç§»å
ãããšããŸããŽãç®±ãžå ¥ãçŽãå¿ èŠããããŸãã
ããã§çŸåšã¯ã
ãŽãç®±
â
埩å
â
ãã®ãŸãŸãŽãç®±
ã«ããŸããã
1件埩å ããããšããã®ãŸãŸæ¬¡ã®ã¡ã¢ã確èªã§ããŸãã
ãããæ©èœãšããŠã¯å°ããªå€æŽã§ããã
å®éã«é£ç¶ããŠæäœãããšãã¡ãã®æ¹ãèªç¶ã§ããã
â ïž å®å šåé€ã¯ç¢ºèªããŠãã
ãŽãç®±ããã®å®å šåé€ã¯åãæ¶ããŸããã
ããã¯ç¬èªã®èŠãç®ãäœã蟌ãã®ã§ã¯ãªãã
Taskåé€ãšåãããã«ãã©ãŠã¶æšæºã®ç¢ºèªãã€ã¢ãã°ã䜿ã£ãŠããŸãã
ãã®ã¡ã¢ãå®å
šã«åé€ããŸããïŒ
å©çšè ãæç€ºçã«ç¢ºèªããŠããåé€ããŸãã
åé€ãšããåãçš®é¡ã®æäœãªã®ã§ã
Taskãšã¡ã¢ã§æåãæããããšãæèããŸããã
ð Undoéç¥ãäžswipeã§éããããããã«ãã
ã¡ã¢ããŽãç®±ãžç§»åãããšã
ç»é¢äžéšãžUndoçšã®éç¥ã衚瀺ããŸãã
ãã ã¹ããã§ã¯ããã®éç¥ã衚瀺ãããŠããéã
æ°èŠã¡ã¢è¿œå çšã®ïŒãã¿ã³ä»è¿ãå¡ã
ããšããããŸããã
æ°ç§åŸ ãŠã°æ¶ããŸãã
ã§ãã
æ¶ãããŸã§åŸ ã€
ããã
ä»ã¯ãããªãããéãã
ããšãã§ããæ¹ã䜿ãããããšæããŸããã
ããã§ã
ã¡ã¢åé€
â
Undoéç¥ã衚瀺
â
äžèŠãªãäžãžswipe
â
ãã®å Žã§éãã
ãšããæäœã远å ããŸããã
ãããå®éã«ã¹ããã§äœ¿ã£ãŠããŠèŠã€ããéåæã§ããã
𧪠UI倿Žã§ãæ¢åãã¹ããå¹ãã
ä»åã埩å åŸã®ç»é¢é·ç§»ãã
éåžžäžèЧ
ããã
ãŽãç®±
ãžå€æŽããŸããã
ãã®çµæãPostgreSQL integration testã«æ®ã£ãŠããã
埩å
ãããéåžžäžèŠ§ãžæ»ã
ãšããå€ãæåŸ å€ãGitHub Actionsã§æ€åºãããŸããã
çŸåšã®ä»æ§ã«åãããŠãã¹ããæŽæ°ãã
æçµçã«ã¯ã
742 passed
17 skipped
ã確èªããŠããŸãã
UIã ãã倿Žããã€ããã§ãã
ç»é¢é·ç§»ãšãã仿§ãå€ããã°ãã¹ãã«ã圱é¿ãã
ãšããåœããåã®ããšããä»åã確èªã§ããŸããã
Task宿åŸããè§Šã£ãŠéåæãæ¢ããã¯ç¶ãã
ä»åã®èšäºã§ã¯Taskã®äžŠã³æ¿ããããªã现ãã調æŽããŸããã
ãã ããã®Taskã宿ããããšã«ã¡ã¢ãžæ»ã£ãããšã§ã
ä»åºŠã¯ã¡ã¢äžèЧã®éåæãèŠããŠããŸããã
Taskãæ¹å
â
TaskãèŠããããªã
â
ã¡ã¢ãžæ»ã
â
çžå¯Ÿçã«ã¡ã¢ã®éåæãèŠãã
â
ãŸãæ¹å
ãšããæµãã§ãã
äžåºŠã宿ããšæã£ãç»é¢ã§ãã
å¥ã®ç»é¢ãæ¹åããããšã«èŠçŽããšã
ãŸãæ°ã«ãªãéšåãåºãŠããããšããããŸãã
ä»åã®PR #48ã¯ã
æ°æ©èœãå¢ããããšããããããã§ã«ããæ©èœãããäžåºŠè§Šã£ãŠç£šããPR
ã«ãªããŸããã
ð° åŠç¿éå§ããçŽ4ãæå
åã¯2026幎5æ12æ¥ãããPythonãäžå¿ã«Webéçºã®åŠç¿ãå§ããŸããã
ãŸã åãããªãããšã¯å€§éã«ãããŸãã
ä»å䜿ã£ãã
requestAnimationFrametranslate3d- FLIPã«è¿ãã¢ãã¡ãŒã·ã§ã³
- touch / pointerã€ãã³ã
- placeholderã«ããäžŠã³æ¿ã
ã«ã€ããŠãããã¹ãŠãæ·±ã説æã§ããããã§ã¯ãããŸããã
ãã ãä»åã®ããã«å®è£ ããŠãå£ããŠãçŽããŠããäžã§ã
ã«ãŒãæ¬äººã®ç§»å
placeholderã®åœ¹å²
åšå²ã«ãŒãã®ã¢ãã¡ãŒã·ã§ã³
äžŠã³æ¿ãæç«å€å®
ããããããå¥ã®åœ¹å²ãæã£ãŠããããšã¯ä»¥åããèŠããããã«ãªããŸããã
åãããªãããšããªããªã£ãããã§ã¯ãããŸããã
ã§ããå®éã®æ©èœãææã«ããŠäžã€ãã€æã£ãŠããããšã§ãå°ããã€çè§£ã§ããéšåã¯å¢ããŠãããšæããŠããŸãã
ð ãåãããšã䜿ãããããã¯å¥ã ã£ã
ä»åäžçªæéã䜿ã£ãã®ã¯ã
Taskãç»é²ã§ãã
Taskãå®äºã§ãã
Taskãåé€ã§ãã
TaskãäžŠã³æ¿ãããã
ãšããæ©èœãã®ãã®ã§ã¯ãããŸããã§ããã
ãã®åŸã®ã
é·æŒãããããã
ã«ãŒããæã«ã€ããŠããã
ããŒãžãåæã«åããªãã
äžŠã³æ¿ããããšãåããã
ã©ããŸã§åããããäžŠã³æ¿ããæç«ããã
ãã§ãã¯ããã¯ã¹ã®äœçœ®ãèªç¶ã
ãšããéšåã§ããã
æ©èœãšããŠæ£ãããŠãã
å®éã«è§Šããšéåæããã
ããšããããŸãã
ãããŠããã®éåæã¯pytestã§ã¯èŠã€ãããªãããšããããŸãã
ä»åãã¹ããã§äœåºŠãè§Šã£ãããšã§ããããããªã宿ããŸããã
ç¹ã«æåŸã®ã
äžŠã³æ¿ãæç«
100% â 75%
ã¯ãã»ãã®å°ãå€å®ãå€ããã ãã«èŠããŠã
æäœæãã®ãã®ãå€ãã
ã®ãé¢çœããšããã§ããã
ð Bakery Hubã¯ãã£ããäžåºåã
TaskãŸã§å®æããããšã§ãBakery HubèªäœãäžåºŠåºåãããšæã£ãŠããŸãã
ãã¡ããã
ããäœã远å ããªã
ãšããæå³ã§ã¯ãããŸããã
ä»åŸäœ¿ã£ãŠããŠã
ããäžäŸ¿ã ãª
ããæ¬²ãããª
ãšæãã°ããŸãæ¹åãããšæããŸãã
客局ããŒã¿ãªã©ãåè£ãšããŠèããŠããæ©èœããããŸãã
ãã çŸæç¹ã§ã¯ã
次ã«äœãäœããã¯ãŸã 決ããŠããŸããã
ãã°ããã¯ããããŸã§äœã£ãã³ãŒããææãšããŠèªã¿çŽããããPythonãWebéçºã®åºç€ãæãçŽãããããã®ãè¯ãããã§ãã
ãããã«
åºèã¡ã¢ããŒã«ãäœãå§ããé ã¯ã
ã¡ãã£ãšããåºèçšã¡ã¢
ãããã®æèŠã§ããã
ããããã
çºæ³š
â
ã¡ã¢
â
æ€çŽ¢
â
ãŽãç®±
â
URLãªã³ã¯
â
Task
â
é·æŒã
â
äžŠã³æ¿ã
â
宿©UXæ¹å
ãšåºãããŸããã
ä»åæ¹ããŠæããã®ã¯ã
ãåãããïŒã䜿ãããããã§ã¯ãªã
ãšããããšã§ãã
å®è£ ãåããŠããŠãããã¹ããéã£ãŠããŠããå®éã«ã¹ããã§è§Šããšã
ãªããéã
ãšæããããšããããŸãã
ãããŠæåŸã¯ã
ããå°ãã ãæ©ãã«ãŒããé¿ããŠã»ãã
ãšããå°ããªéåæããã
100% â çŽ75%
ãšãã现ããéšåãŸã§èª¿æŽããŸããã
ä»åã®Taskæ©èœã§ã¯ã
ãã®éåæã«æ°ã¥ããŠãèªåãæ¬²ããåããèšèã«ããªããè©°ããŠããããšãéçºã®äžéš
ãªãã ãšæããŸããã
Bakery Hubã¯ããã§äžåºŠäžåºåãã
次ã«äœãäœããã¯ããŸã 決ããŠããŸããã
ãŸãã
ããäœã£ãŠã¿ãã
ãšæãããã®ãåºãŠããããããããæ¬¡ã®åŠç¿ãå§ããããšæããŸãã
ð é¢é£ãªã³ã¯
GitHub
ååã®èšäº
PR #44
PR #45
PR #46
PR #48
Guest Demo
