@shaykec/bridge 0.4.25 → 0.4.27
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/journeys/ai-engineer.yaml +34 -0
- package/journeys/backend-developer.yaml +36 -0
- package/journeys/business-analyst.yaml +37 -0
- package/journeys/devops-engineer.yaml +37 -0
- package/journeys/engineering-manager.yaml +44 -0
- package/journeys/frontend-developer.yaml +41 -0
- package/journeys/fullstack-developer.yaml +49 -0
- package/journeys/mobile-developer.yaml +42 -0
- package/journeys/product-manager.yaml +35 -0
- package/journeys/qa-engineer.yaml +37 -0
- package/journeys/ux-designer.yaml +43 -0
- package/modules/README.md +52 -0
- package/modules/accessibility-fundamentals/content.md +126 -0
- package/modules/accessibility-fundamentals/exercises.md +88 -0
- package/modules/accessibility-fundamentals/module.yaml +43 -0
- package/modules/accessibility-fundamentals/quick-ref.md +71 -0
- package/modules/accessibility-fundamentals/quiz.md +100 -0
- package/modules/accessibility-fundamentals/resources.md +29 -0
- package/modules/accessibility-fundamentals/walkthrough.md +80 -0
- package/modules/adr-writing/content.md +121 -0
- package/modules/adr-writing/exercises.md +81 -0
- package/modules/adr-writing/module.yaml +41 -0
- package/modules/adr-writing/quick-ref.md +57 -0
- package/modules/adr-writing/quiz.md +73 -0
- package/modules/adr-writing/resources.md +29 -0
- package/modules/adr-writing/walkthrough.md +64 -0
- package/modules/ai-agents/content.md +120 -0
- package/modules/ai-agents/exercises.md +82 -0
- package/modules/ai-agents/module.yaml +42 -0
- package/modules/ai-agents/quick-ref.md +60 -0
- package/modules/ai-agents/quiz.md +103 -0
- package/modules/ai-agents/resources.md +30 -0
- package/modules/ai-agents/walkthrough.md +85 -0
- package/modules/ai-assisted-research/content.md +136 -0
- package/modules/ai-assisted-research/exercises.md +80 -0
- package/modules/ai-assisted-research/module.yaml +42 -0
- package/modules/ai-assisted-research/quick-ref.md +67 -0
- package/modules/ai-assisted-research/quiz.md +73 -0
- package/modules/ai-assisted-research/resources.md +33 -0
- package/modules/ai-assisted-research/walkthrough.md +85 -0
- package/modules/ai-pair-programming/content.md +105 -0
- package/modules/ai-pair-programming/exercises.md +98 -0
- package/modules/ai-pair-programming/module.yaml +39 -0
- package/modules/ai-pair-programming/quick-ref.md +58 -0
- package/modules/ai-pair-programming/quiz.md +73 -0
- package/modules/ai-pair-programming/resources.md +34 -0
- package/modules/ai-pair-programming/walkthrough.md +117 -0
- package/modules/ai-test-generation/content.md +125 -0
- package/modules/ai-test-generation/exercises.md +98 -0
- package/modules/ai-test-generation/module.yaml +39 -0
- package/modules/ai-test-generation/quick-ref.md +65 -0
- package/modules/ai-test-generation/quiz.md +74 -0
- package/modules/ai-test-generation/resources.md +41 -0
- package/modules/ai-test-generation/walkthrough.md +100 -0
- package/modules/api-design/content.md +189 -0
- package/modules/api-design/exercises.md +84 -0
- package/modules/api-design/game.yaml +113 -0
- package/modules/api-design/module.yaml +45 -0
- package/modules/api-design/quick-ref.md +73 -0
- package/modules/api-design/quiz.md +100 -0
- package/modules/api-design/resources.md +55 -0
- package/modules/api-design/walkthrough.md +88 -0
- package/modules/clean-code/content.md +136 -0
- package/modules/clean-code/exercises.md +137 -0
- package/modules/clean-code/game.yaml +172 -0
- package/modules/clean-code/module.yaml +44 -0
- package/modules/clean-code/quick-ref.md +44 -0
- package/modules/clean-code/quiz.md +105 -0
- package/modules/clean-code/resources.md +40 -0
- package/modules/clean-code/walkthrough.md +78 -0
- package/modules/clean-code/workshop.yaml +149 -0
- package/modules/code-review/content.md +130 -0
- package/modules/code-review/exercises.md +95 -0
- package/modules/code-review/game.yaml +83 -0
- package/modules/code-review/module.yaml +42 -0
- package/modules/code-review/quick-ref.md +77 -0
- package/modules/code-review/quiz.md +105 -0
- package/modules/code-review/resources.md +40 -0
- package/modules/code-review/walkthrough.md +106 -0
- package/modules/daily-workflow/content.md +81 -0
- package/modules/daily-workflow/exercises.md +50 -0
- package/modules/daily-workflow/module.yaml +33 -0
- package/modules/daily-workflow/quick-ref.md +37 -0
- package/modules/daily-workflow/quiz.md +65 -0
- package/modules/daily-workflow/resources.md +38 -0
- package/modules/daily-workflow/walkthrough.md +83 -0
- package/modules/debugging-systematically/content.md +139 -0
- package/modules/debugging-systematically/exercises.md +91 -0
- package/modules/debugging-systematically/module.yaml +46 -0
- package/modules/debugging-systematically/quick-ref.md +59 -0
- package/modules/debugging-systematically/quiz.md +105 -0
- package/modules/debugging-systematically/resources.md +42 -0
- package/modules/debugging-systematically/walkthrough.md +84 -0
- package/modules/debugging-systematically/workshop.yaml +127 -0
- package/modules/demo-test/content.md +68 -0
- package/modules/demo-test/exercises.md +28 -0
- package/modules/demo-test/game.yaml +171 -0
- package/modules/demo-test/module.yaml +41 -0
- package/modules/demo-test/quick-ref.md +54 -0
- package/modules/demo-test/quiz.md +74 -0
- package/modules/demo-test/resources.md +21 -0
- package/modules/demo-test/walkthrough.md +122 -0
- package/modules/demo-test/workshop.yaml +31 -0
- package/modules/design-critique/content.md +93 -0
- package/modules/design-critique/exercises.md +71 -0
- package/modules/design-critique/module.yaml +41 -0
- package/modules/design-critique/quick-ref.md +63 -0
- package/modules/design-critique/quiz.md +73 -0
- package/modules/design-critique/resources.md +27 -0
- package/modules/design-critique/walkthrough.md +68 -0
- package/modules/design-patterns/content.md +335 -0
- package/modules/design-patterns/exercises.md +82 -0
- package/modules/design-patterns/game.yaml +55 -0
- package/modules/design-patterns/module.yaml +45 -0
- package/modules/design-patterns/quick-ref.md +44 -0
- package/modules/design-patterns/quiz.md +101 -0
- package/modules/design-patterns/resources.md +40 -0
- package/modules/design-patterns/walkthrough.md +64 -0
- package/modules/exploratory-testing/content.md +133 -0
- package/modules/exploratory-testing/exercises.md +88 -0
- package/modules/exploratory-testing/module.yaml +41 -0
- package/modules/exploratory-testing/quick-ref.md +68 -0
- package/modules/exploratory-testing/quiz.md +75 -0
- package/modules/exploratory-testing/resources.md +39 -0
- package/modules/exploratory-testing/walkthrough.md +87 -0
- package/modules/git/content.md +128 -0
- package/modules/git/exercises.md +53 -0
- package/modules/git/game.yaml +190 -0
- package/modules/git/module.yaml +44 -0
- package/modules/git/quick-ref.md +67 -0
- package/modules/git/quiz.md +89 -0
- package/modules/git/resources.md +49 -0
- package/modules/git/walkthrough.md +92 -0
- package/modules/git/workshop.yaml +145 -0
- package/modules/hiring-interviews/content.md +130 -0
- package/modules/hiring-interviews/exercises.md +88 -0
- package/modules/hiring-interviews/module.yaml +41 -0
- package/modules/hiring-interviews/quick-ref.md +68 -0
- package/modules/hiring-interviews/quiz.md +73 -0
- package/modules/hiring-interviews/resources.md +36 -0
- package/modules/hiring-interviews/walkthrough.md +75 -0
- package/modules/hooks/content.md +97 -0
- package/modules/hooks/exercises.md +69 -0
- package/modules/hooks/module.yaml +39 -0
- package/modules/hooks/quick-ref.md +93 -0
- package/modules/hooks/quiz.md +81 -0
- package/modules/hooks/resources.md +34 -0
- package/modules/hooks/walkthrough.md +105 -0
- package/modules/hooks/workshop.yaml +64 -0
- package/modules/incident-response/content.md +124 -0
- package/modules/incident-response/exercises.md +82 -0
- package/modules/incident-response/game.yaml +132 -0
- package/modules/incident-response/module.yaml +45 -0
- package/modules/incident-response/quick-ref.md +53 -0
- package/modules/incident-response/quiz.md +103 -0
- package/modules/incident-response/resources.md +40 -0
- package/modules/incident-response/walkthrough.md +82 -0
- package/modules/llm-fundamentals/content.md +114 -0
- package/modules/llm-fundamentals/exercises.md +83 -0
- package/modules/llm-fundamentals/module.yaml +42 -0
- package/modules/llm-fundamentals/quick-ref.md +64 -0
- package/modules/llm-fundamentals/quiz.md +103 -0
- package/modules/llm-fundamentals/resources.md +30 -0
- package/modules/llm-fundamentals/walkthrough.md +91 -0
- package/modules/one-on-ones/content.md +133 -0
- package/modules/one-on-ones/exercises.md +81 -0
- package/modules/one-on-ones/module.yaml +44 -0
- package/modules/one-on-ones/quick-ref.md +67 -0
- package/modules/one-on-ones/quiz.md +73 -0
- package/modules/one-on-ones/resources.md +37 -0
- package/modules/one-on-ones/walkthrough.md +69 -0
- package/modules/package.json +9 -0
- package/modules/prioritization-frameworks/content.md +130 -0
- package/modules/prioritization-frameworks/exercises.md +93 -0
- package/modules/prioritization-frameworks/module.yaml +41 -0
- package/modules/prioritization-frameworks/quick-ref.md +77 -0
- package/modules/prioritization-frameworks/quiz.md +73 -0
- package/modules/prioritization-frameworks/resources.md +32 -0
- package/modules/prioritization-frameworks/walkthrough.md +69 -0
- package/modules/prompt-engineering/content.md +123 -0
- package/modules/prompt-engineering/exercises.md +82 -0
- package/modules/prompt-engineering/game.yaml +101 -0
- package/modules/prompt-engineering/module.yaml +45 -0
- package/modules/prompt-engineering/quick-ref.md +65 -0
- package/modules/prompt-engineering/quiz.md +105 -0
- package/modules/prompt-engineering/resources.md +36 -0
- package/modules/prompt-engineering/walkthrough.md +81 -0
- package/modules/rag-fundamentals/content.md +111 -0
- package/modules/rag-fundamentals/exercises.md +80 -0
- package/modules/rag-fundamentals/module.yaml +45 -0
- package/modules/rag-fundamentals/quick-ref.md +58 -0
- package/modules/rag-fundamentals/quiz.md +75 -0
- package/modules/rag-fundamentals/resources.md +34 -0
- package/modules/rag-fundamentals/walkthrough.md +75 -0
- package/modules/react-fundamentals/content.md +140 -0
- package/modules/react-fundamentals/exercises.md +81 -0
- package/modules/react-fundamentals/game.yaml +145 -0
- package/modules/react-fundamentals/module.yaml +45 -0
- package/modules/react-fundamentals/quick-ref.md +62 -0
- package/modules/react-fundamentals/quiz.md +106 -0
- package/modules/react-fundamentals/resources.md +42 -0
- package/modules/react-fundamentals/walkthrough.md +89 -0
- package/modules/react-fundamentals/workshop.yaml +112 -0
- package/modules/react-native-fundamentals/content.md +141 -0
- package/modules/react-native-fundamentals/exercises.md +79 -0
- package/modules/react-native-fundamentals/module.yaml +42 -0
- package/modules/react-native-fundamentals/quick-ref.md +60 -0
- package/modules/react-native-fundamentals/quiz.md +61 -0
- package/modules/react-native-fundamentals/resources.md +24 -0
- package/modules/react-native-fundamentals/walkthrough.md +84 -0
- package/modules/registry.yaml +1650 -0
- package/modules/risk-management/content.md +162 -0
- package/modules/risk-management/exercises.md +86 -0
- package/modules/risk-management/module.yaml +41 -0
- package/modules/risk-management/quick-ref.md +82 -0
- package/modules/risk-management/quiz.md +73 -0
- package/modules/risk-management/resources.md +40 -0
- package/modules/risk-management/walkthrough.md +67 -0
- package/modules/running-effective-standups/content.md +119 -0
- package/modules/running-effective-standups/exercises.md +79 -0
- package/modules/running-effective-standups/module.yaml +40 -0
- package/modules/running-effective-standups/quick-ref.md +61 -0
- package/modules/running-effective-standups/quiz.md +73 -0
- package/modules/running-effective-standups/resources.md +36 -0
- package/modules/running-effective-standups/walkthrough.md +76 -0
- package/modules/solid-principles/content.md +154 -0
- package/modules/solid-principles/exercises.md +107 -0
- package/modules/solid-principles/module.yaml +42 -0
- package/modules/solid-principles/quick-ref.md +50 -0
- package/modules/solid-principles/quiz.md +102 -0
- package/modules/solid-principles/resources.md +39 -0
- package/modules/solid-principles/walkthrough.md +84 -0
- package/modules/sprint-planning/content.md +142 -0
- package/modules/sprint-planning/exercises.md +79 -0
- package/modules/sprint-planning/game.yaml +84 -0
- package/modules/sprint-planning/module.yaml +44 -0
- package/modules/sprint-planning/quick-ref.md +76 -0
- package/modules/sprint-planning/quiz.md +102 -0
- package/modules/sprint-planning/resources.md +39 -0
- package/modules/sprint-planning/walkthrough.md +75 -0
- package/modules/sql-fundamentals/content.md +160 -0
- package/modules/sql-fundamentals/exercises.md +87 -0
- package/modules/sql-fundamentals/game.yaml +105 -0
- package/modules/sql-fundamentals/module.yaml +45 -0
- package/modules/sql-fundamentals/quick-ref.md +53 -0
- package/modules/sql-fundamentals/quiz.md +103 -0
- package/modules/sql-fundamentals/resources.md +42 -0
- package/modules/sql-fundamentals/walkthrough.md +92 -0
- package/modules/sql-fundamentals/workshop.yaml +109 -0
- package/modules/stakeholder-communication/content.md +186 -0
- package/modules/stakeholder-communication/exercises.md +87 -0
- package/modules/stakeholder-communication/module.yaml +38 -0
- package/modules/stakeholder-communication/quick-ref.md +89 -0
- package/modules/stakeholder-communication/quiz.md +73 -0
- package/modules/stakeholder-communication/resources.md +41 -0
- package/modules/stakeholder-communication/walkthrough.md +74 -0
- package/modules/system-design/content.md +149 -0
- package/modules/system-design/exercises.md +83 -0
- package/modules/system-design/game.yaml +95 -0
- package/modules/system-design/module.yaml +46 -0
- package/modules/system-design/quick-ref.md +59 -0
- package/modules/system-design/quiz.md +102 -0
- package/modules/system-design/resources.md +46 -0
- package/modules/system-design/walkthrough.md +90 -0
- package/modules/team-topologies/content.md +166 -0
- package/modules/team-topologies/exercises.md +85 -0
- package/modules/team-topologies/module.yaml +41 -0
- package/modules/team-topologies/quick-ref.md +61 -0
- package/modules/team-topologies/quiz.md +101 -0
- package/modules/team-topologies/resources.md +37 -0
- package/modules/team-topologies/walkthrough.md +76 -0
- package/modules/technical-debt/content.md +111 -0
- package/modules/technical-debt/exercises.md +92 -0
- package/modules/technical-debt/module.yaml +39 -0
- package/modules/technical-debt/quick-ref.md +60 -0
- package/modules/technical-debt/quiz.md +73 -0
- package/modules/technical-debt/resources.md +25 -0
- package/modules/technical-debt/walkthrough.md +94 -0
- package/modules/technical-mentoring/content.md +128 -0
- package/modules/technical-mentoring/exercises.md +84 -0
- package/modules/technical-mentoring/module.yaml +41 -0
- package/modules/technical-mentoring/quick-ref.md +74 -0
- package/modules/technical-mentoring/quiz.md +73 -0
- package/modules/technical-mentoring/resources.md +33 -0
- package/modules/technical-mentoring/walkthrough.md +65 -0
- package/modules/test-strategy/content.md +136 -0
- package/modules/test-strategy/exercises.md +84 -0
- package/modules/test-strategy/game.yaml +99 -0
- package/modules/test-strategy/module.yaml +45 -0
- package/modules/test-strategy/quick-ref.md +66 -0
- package/modules/test-strategy/quiz.md +99 -0
- package/modules/test-strategy/resources.md +60 -0
- package/modules/test-strategy/walkthrough.md +97 -0
- package/modules/test-strategy/workshop.yaml +96 -0
- package/modules/typescript-fundamentals/content.md +127 -0
- package/modules/typescript-fundamentals/exercises.md +79 -0
- package/modules/typescript-fundamentals/game.yaml +111 -0
- package/modules/typescript-fundamentals/module.yaml +45 -0
- package/modules/typescript-fundamentals/quick-ref.md +55 -0
- package/modules/typescript-fundamentals/quiz.md +104 -0
- package/modules/typescript-fundamentals/resources.md +42 -0
- package/modules/typescript-fundamentals/walkthrough.md +71 -0
- package/modules/typescript-fundamentals/workshop.yaml +146 -0
- package/modules/user-story-mapping/content.md +123 -0
- package/modules/user-story-mapping/exercises.md +87 -0
- package/modules/user-story-mapping/module.yaml +41 -0
- package/modules/user-story-mapping/quick-ref.md +64 -0
- package/modules/user-story-mapping/quiz.md +73 -0
- package/modules/user-story-mapping/resources.md +29 -0
- package/modules/user-story-mapping/walkthrough.md +86 -0
- package/modules/writing-prds/content.md +133 -0
- package/modules/writing-prds/exercises.md +93 -0
- package/modules/writing-prds/game.yaml +83 -0
- package/modules/writing-prds/module.yaml +44 -0
- package/modules/writing-prds/quick-ref.md +77 -0
- package/modules/writing-prds/quiz.md +103 -0
- package/modules/writing-prds/resources.md +30 -0
- package/modules/writing-prds/walkthrough.md +87 -0
- package/package.json +2 -2
- package/canvas-dist/assets/_basePickBy-BovdgFIW.js +0 -1
- package/canvas-dist/assets/_basePickBy-BtkHe2u_.js +0 -1
- package/canvas-dist/assets/_basePickBy-C0936578.js +0 -1
- package/canvas-dist/assets/_basePickBy-CE2Qvuh7.js +0 -1
- package/canvas-dist/assets/_basePickBy-DV6sX4CG.js +0 -1
- package/canvas-dist/assets/_basePickBy-DZX6ZNMT.js +0 -1
- package/canvas-dist/assets/_baseUniq-B7dN28TM.js +0 -1
- package/canvas-dist/assets/_baseUniq-Cl23fCdR.js +0 -1
- package/canvas-dist/assets/_baseUniq-CojWFw7B.js +0 -1
- package/canvas-dist/assets/_baseUniq-DA640BJl.js +0 -1
- package/canvas-dist/assets/_baseUniq-Ds-62CCj.js +0 -1
- package/canvas-dist/assets/_baseUniq-KG7SRw9H.js +0 -1
- package/canvas-dist/assets/arc-7E9FFKlC.js +0 -1
- package/canvas-dist/assets/arc-BSMfRZtt.js +0 -1
- package/canvas-dist/assets/arc-C6nT-koR.js +0 -1
- package/canvas-dist/assets/arc-D_fOnjmo.js +0 -1
- package/canvas-dist/assets/arc-Khfvgkr3.js +0 -1
- package/canvas-dist/assets/arc-ieS-i42x.js +0 -1
- package/canvas-dist/assets/architectureDiagram-VXUJARFQ-DF4t6GQD.js +0 -36
- package/canvas-dist/assets/architectureDiagram-VXUJARFQ-DXgSlsio.js +0 -36
- package/canvas-dist/assets/architectureDiagram-VXUJARFQ-DiomxPB4.js +0 -36
- package/canvas-dist/assets/architectureDiagram-VXUJARFQ-DnFaxvXD.js +0 -36
- package/canvas-dist/assets/architectureDiagram-VXUJARFQ-Dt38C0LJ.js +0 -36
- package/canvas-dist/assets/architectureDiagram-VXUJARFQ-egbtMwua.js +0 -36
- package/canvas-dist/assets/blockDiagram-VD42YOAC-CUNKQd-b.js +0 -122
- package/canvas-dist/assets/blockDiagram-VD42YOAC-D-NiLXxd.js +0 -122
- package/canvas-dist/assets/blockDiagram-VD42YOAC-Dx6Dh9gg.js +0 -122
- package/canvas-dist/assets/blockDiagram-VD42YOAC-_r-PmlQy.js +0 -122
- package/canvas-dist/assets/blockDiagram-VD42YOAC-bvYKZLMc.js +0 -122
- package/canvas-dist/assets/blockDiagram-VD42YOAC-l85QT9Ig.js +0 -122
- package/canvas-dist/assets/c4Diagram-YG6GDRKO-BWKCTyQi.js +0 -10
- package/canvas-dist/assets/c4Diagram-YG6GDRKO-CbXs2xzC.js +0 -10
- package/canvas-dist/assets/c4Diagram-YG6GDRKO-CjiS-GNK.js +0 -10
- package/canvas-dist/assets/c4Diagram-YG6GDRKO-D7SnLlHp.js +0 -10
- package/canvas-dist/assets/c4Diagram-YG6GDRKO-RTTCSVf2.js +0 -10
- package/canvas-dist/assets/c4Diagram-YG6GDRKO-yvqJ_AqX.js +0 -10
- package/canvas-dist/assets/channel-CSXq7GP6.js +0 -1
- package/canvas-dist/assets/channel-CvujjGiJ.js +0 -1
- package/canvas-dist/assets/channel-D959Iony.js +0 -1
- package/canvas-dist/assets/channel-DOSwCnrB.js +0 -1
- package/canvas-dist/assets/channel-sw61LzxF.js +0 -1
- package/canvas-dist/assets/channel-vZVnNhOK.js +0 -1
- package/canvas-dist/assets/chunk-4BX2VUAB-BBjuAwXr.js +0 -1
- package/canvas-dist/assets/chunk-4BX2VUAB-BXRNyucU.js +0 -1
- package/canvas-dist/assets/chunk-4BX2VUAB-Bgq5Z77T.js +0 -1
- package/canvas-dist/assets/chunk-4BX2VUAB-BuoMCMCr.js +0 -1
- package/canvas-dist/assets/chunk-4BX2VUAB-COD5n7vg.js +0 -1
- package/canvas-dist/assets/chunk-4BX2VUAB-K8DepKJO.js +0 -1
- package/canvas-dist/assets/chunk-55IACEB6-Bic_bMrQ.js +0 -1
- package/canvas-dist/assets/chunk-55IACEB6-DEy2QUDq.js +0 -1
- package/canvas-dist/assets/chunk-55IACEB6-Dcgbmfzg.js +0 -1
- package/canvas-dist/assets/chunk-55IACEB6-DfmuNm_E.js +0 -1
- package/canvas-dist/assets/chunk-55IACEB6-DlQRcczm.js +0 -1
- package/canvas-dist/assets/chunk-55IACEB6-p2qMY-fm.js +0 -1
- package/canvas-dist/assets/chunk-B4BG7PRW-BpbyxBP2.js +0 -165
- package/canvas-dist/assets/chunk-B4BG7PRW-CCPqvPrP.js +0 -165
- package/canvas-dist/assets/chunk-B4BG7PRW-CEeDPAki.js +0 -165
- package/canvas-dist/assets/chunk-B4BG7PRW-D2UFN_2M.js +0 -165
- package/canvas-dist/assets/chunk-B4BG7PRW-DFI5h6HC.js +0 -165
- package/canvas-dist/assets/chunk-B4BG7PRW-DKOiFGMU.js +0 -165
- package/canvas-dist/assets/chunk-DI55MBZ5-BV6nHjNQ.js +0 -220
- package/canvas-dist/assets/chunk-DI55MBZ5-CEZJmC0E.js +0 -220
- package/canvas-dist/assets/chunk-DI55MBZ5-DOZT99Ek.js +0 -220
- package/canvas-dist/assets/chunk-DI55MBZ5-DmC2LoG2.js +0 -220
- package/canvas-dist/assets/chunk-DI55MBZ5-DpkcJdZP.js +0 -220
- package/canvas-dist/assets/chunk-DI55MBZ5-fVTGx0zh.js +0 -220
- package/canvas-dist/assets/chunk-FMBD7UC4-BOCyQpI7.js +0 -15
- package/canvas-dist/assets/chunk-FMBD7UC4-C76FrRL8.js +0 -15
- package/canvas-dist/assets/chunk-FMBD7UC4-CAq-btWc.js +0 -15
- package/canvas-dist/assets/chunk-FMBD7UC4-CidVsej6.js +0 -15
- package/canvas-dist/assets/chunk-FMBD7UC4-DPpfskdX.js +0 -15
- package/canvas-dist/assets/chunk-FMBD7UC4-DnLtclge.js +0 -15
- package/canvas-dist/assets/chunk-QN33PNHL-BclpCUi8.js +0 -1
- package/canvas-dist/assets/chunk-QN33PNHL-DDUw8IU1.js +0 -1
- package/canvas-dist/assets/chunk-QN33PNHL-DdJFAUXw.js +0 -1
- package/canvas-dist/assets/chunk-QN33PNHL-DjV4jUn9.js +0 -1
- package/canvas-dist/assets/chunk-QN33PNHL-N-HTycqU.js +0 -1
- package/canvas-dist/assets/chunk-QN33PNHL-sd8p21DW.js +0 -1
- package/canvas-dist/assets/chunk-QZHKN3VN-B6mT-JkP.js +0 -1
- package/canvas-dist/assets/chunk-QZHKN3VN-BCo8pc7x.js +0 -1
- package/canvas-dist/assets/chunk-QZHKN3VN-C8IIu6es.js +0 -1
- package/canvas-dist/assets/chunk-QZHKN3VN-D9FF492U.js +0 -1
- package/canvas-dist/assets/chunk-QZHKN3VN-DWMbUjXT.js +0 -1
- package/canvas-dist/assets/chunk-QZHKN3VN-l5FBJ77g.js +0 -1
- package/canvas-dist/assets/chunk-TZMSLE5B-BASt-UWt.js +0 -1
- package/canvas-dist/assets/chunk-TZMSLE5B-BCfaZWLT.js +0 -1
- package/canvas-dist/assets/chunk-TZMSLE5B-BKIk_hBR.js +0 -1
- package/canvas-dist/assets/chunk-TZMSLE5B-C4pt-Ir8.js +0 -1
- package/canvas-dist/assets/chunk-TZMSLE5B-DwGlELvo.js +0 -1
- package/canvas-dist/assets/chunk-TZMSLE5B-jJKG-WvJ.js +0 -1
- package/canvas-dist/assets/classDiagram-2ON5EDUG-B7YQfPU4.js +0 -1
- package/canvas-dist/assets/classDiagram-2ON5EDUG-BZ61MaHY.js +0 -1
- package/canvas-dist/assets/classDiagram-2ON5EDUG-CGseYor2.js +0 -1
- package/canvas-dist/assets/classDiagram-2ON5EDUG-CKzOc99J.js +0 -1
- package/canvas-dist/assets/classDiagram-2ON5EDUG-Ce_LPjwW.js +0 -1
- package/canvas-dist/assets/classDiagram-2ON5EDUG-DorPdibv.js +0 -1
- package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-B7YQfPU4.js +0 -1
- package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-BZ61MaHY.js +0 -1
- package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-CGseYor2.js +0 -1
- package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-CKzOc99J.js +0 -1
- package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-Ce_LPjwW.js +0 -1
- package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-DorPdibv.js +0 -1
- package/canvas-dist/assets/clone-74KSto7H.js +0 -1
- package/canvas-dist/assets/clone-CJQgAYVe.js +0 -1
- package/canvas-dist/assets/clone-DLeTuhHE.js +0 -1
- package/canvas-dist/assets/clone-D_IHK_lQ.js +0 -1
- package/canvas-dist/assets/clone-DxMUv1L9.js +0 -1
- package/canvas-dist/assets/clone-UNKf_nED.js +0 -1
- package/canvas-dist/assets/cose-bilkent-S5V4N54A-BTyQiCkr.js +0 -1
- package/canvas-dist/assets/cose-bilkent-S5V4N54A-BtPAe24N.js +0 -1
- package/canvas-dist/assets/cose-bilkent-S5V4N54A-DIjE7V3m.js +0 -1
- package/canvas-dist/assets/cose-bilkent-S5V4N54A-DKL_BGvE.js +0 -1
- package/canvas-dist/assets/cose-bilkent-S5V4N54A-LZ4OsCLU.js +0 -1
- package/canvas-dist/assets/cose-bilkent-S5V4N54A-XWeJtgga.js +0 -1
- package/canvas-dist/assets/dagre-6UL2VRFP-BJ2vcFwR.js +0 -4
- package/canvas-dist/assets/dagre-6UL2VRFP-C1FlE5s8.js +0 -4
- package/canvas-dist/assets/dagre-6UL2VRFP-C3BWFgl6.js +0 -4
- package/canvas-dist/assets/dagre-6UL2VRFP-CUnx73Rf.js +0 -4
- package/canvas-dist/assets/dagre-6UL2VRFP-Do10BY1y.js +0 -4
- package/canvas-dist/assets/dagre-6UL2VRFP-rOZEkrsg.js +0 -4
- package/canvas-dist/assets/diagram-PSM6KHXK-BGi_qzbq.js +0 -24
- package/canvas-dist/assets/diagram-PSM6KHXK-C3Nv7h_j.js +0 -24
- package/canvas-dist/assets/diagram-PSM6KHXK-CsMy-r0n.js +0 -24
- package/canvas-dist/assets/diagram-PSM6KHXK-Dj8g7kGt.js +0 -24
- package/canvas-dist/assets/diagram-PSM6KHXK-Dxb1w_7r.js +0 -24
- package/canvas-dist/assets/diagram-PSM6KHXK-kVMBkEyV.js +0 -24
- package/canvas-dist/assets/diagram-QEK2KX5R-4bsrr1WZ.js +0 -43
- package/canvas-dist/assets/diagram-QEK2KX5R-Bv7BmKfI.js +0 -43
- package/canvas-dist/assets/diagram-QEK2KX5R-C_FLN6hv.js +0 -43
- package/canvas-dist/assets/diagram-QEK2KX5R-Csuk5L3z.js +0 -43
- package/canvas-dist/assets/diagram-QEK2KX5R-D5Aszgz4.js +0 -43
- package/canvas-dist/assets/diagram-QEK2KX5R-DX58f87l.js +0 -43
- package/canvas-dist/assets/diagram-S2PKOQOG-1Q7hwiSd.js +0 -24
- package/canvas-dist/assets/diagram-S2PKOQOG-Bz9Vxi5V.js +0 -24
- package/canvas-dist/assets/diagram-S2PKOQOG-CdWgZIIc.js +0 -24
- package/canvas-dist/assets/diagram-S2PKOQOG-DBicbKFU.js +0 -24
- package/canvas-dist/assets/diagram-S2PKOQOG-DsXKwPtU.js +0 -24
- package/canvas-dist/assets/diagram-S2PKOQOG-L_SMHLXs.js +0 -24
- package/canvas-dist/assets/erDiagram-Q2GNP2WA-BYu7fh6H.js +0 -60
- package/canvas-dist/assets/erDiagram-Q2GNP2WA-CvnQ69BF.js +0 -60
- package/canvas-dist/assets/erDiagram-Q2GNP2WA-D3xm-Tdm.js +0 -60
- package/canvas-dist/assets/erDiagram-Q2GNP2WA-DIPpD8sj.js +0 -60
- package/canvas-dist/assets/erDiagram-Q2GNP2WA-DNgu6dMd.js +0 -60
- package/canvas-dist/assets/erDiagram-Q2GNP2WA-Decm8aB4.js +0 -60
- package/canvas-dist/assets/flowDiagram-NV44I4VS-2ymk2kw2.js +0 -162
- package/canvas-dist/assets/flowDiagram-NV44I4VS-BEPFOt6U.js +0 -162
- package/canvas-dist/assets/flowDiagram-NV44I4VS-BwqXYGfK.js +0 -162
- package/canvas-dist/assets/flowDiagram-NV44I4VS-CS1jax_z.js +0 -162
- package/canvas-dist/assets/flowDiagram-NV44I4VS-DQz5bf7r.js +0 -162
- package/canvas-dist/assets/flowDiagram-NV44I4VS-KW4T1sqF.js +0 -162
- package/canvas-dist/assets/ganttDiagram-JELNMOA3-B811prZt.js +0 -267
- package/canvas-dist/assets/ganttDiagram-JELNMOA3-C75pWm7X.js +0 -267
- package/canvas-dist/assets/ganttDiagram-JELNMOA3-CWsbo0fn.js +0 -267
- package/canvas-dist/assets/ganttDiagram-JELNMOA3-CbJozPBN.js +0 -267
- package/canvas-dist/assets/ganttDiagram-JELNMOA3-Co0cFt4c.js +0 -267
- package/canvas-dist/assets/ganttDiagram-JELNMOA3-I4PDqrRh.js +0 -267
- package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-B-z0cLPt.js +0 -65
- package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-Be40z-LF.js +0 -65
- package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-BejNaAVm.js +0 -65
- package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-BqWDYr0X.js +0 -65
- package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-DSvWGY-e.js +0 -65
- package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-HLYbyNJ5.js +0 -65
- package/canvas-dist/assets/graph-BE8KKsdf.js +0 -1
- package/canvas-dist/assets/graph-D6DzzszU.js +0 -1
- package/canvas-dist/assets/graph-DFR8Y_8s.js +0 -1
- package/canvas-dist/assets/graph-Da385cDY.js +0 -1
- package/canvas-dist/assets/graph-MU7gZz2B.js +0 -1
- package/canvas-dist/assets/graph-wjSBJwnf.js +0 -1
- package/canvas-dist/assets/index--ztw-8Rw.js +0 -647
- package/canvas-dist/assets/index-5TpIM6B1.js +0 -11
- package/canvas-dist/assets/index-BSswTuBk.js +0 -11
- package/canvas-dist/assets/index-BVvhMmjs.js +0 -11
- package/canvas-dist/assets/index-BY92Mj5g.js +0 -572
- package/canvas-dist/assets/index-CV7palC3.js +0 -572
- package/canvas-dist/assets/index-D9bmQGsB.js +0 -11
- package/canvas-dist/assets/index-DDIKkGv8.js +0 -592
- package/canvas-dist/assets/index-Dyo0NkPb.js +0 -574
- package/canvas-dist/assets/index-iQWajCow.js +0 -572
- package/canvas-dist/assets/index-m68YlAMU.js +0 -11
- package/canvas-dist/assets/index-mEoP57az.js +0 -11
- package/canvas-dist/assets/infoDiagram-HS3SLOUP--9BirqgJ.js +0 -2
- package/canvas-dist/assets/infoDiagram-HS3SLOUP-CSJVED2y.js +0 -2
- package/canvas-dist/assets/infoDiagram-HS3SLOUP-D68HIb2t.js +0 -2
- package/canvas-dist/assets/infoDiagram-HS3SLOUP-DK2VLGGz.js +0 -2
- package/canvas-dist/assets/infoDiagram-HS3SLOUP-PaFhn4yD.js +0 -2
- package/canvas-dist/assets/infoDiagram-HS3SLOUP-zLNG47sU.js +0 -2
- package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-Bue2dR2X.js +0 -139
- package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-CrgZfpdU.js +0 -139
- package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-DUxWmkkC.js +0 -139
- package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-OTFkv4pd.js +0 -139
- package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-eK2_Zuu3.js +0 -139
- package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-uds5Tz8D.js +0 -139
- package/canvas-dist/assets/kanban-definition-3W4ZIXB7-BETdiI7I.js +0 -89
- package/canvas-dist/assets/kanban-definition-3W4ZIXB7-BdVh7KdN.js +0 -89
- package/canvas-dist/assets/kanban-definition-3W4ZIXB7-Cxl8UM9S.js +0 -89
- package/canvas-dist/assets/kanban-definition-3W4ZIXB7-DVPlx3I2.js +0 -89
- package/canvas-dist/assets/kanban-definition-3W4ZIXB7-LtNWeoYB.js +0 -89
- package/canvas-dist/assets/kanban-definition-3W4ZIXB7-uvhEMvyE.js +0 -89
- package/canvas-dist/assets/layout-1OzszN14.js +0 -1
- package/canvas-dist/assets/layout-CJSupFcF.js +0 -1
- package/canvas-dist/assets/layout-DFRmxN_c.js +0 -1
- package/canvas-dist/assets/layout-DSu-zk7y.js +0 -1
- package/canvas-dist/assets/layout-TGcrvApd.js +0 -1
- package/canvas-dist/assets/layout-eStc8SYK.js +0 -1
- package/canvas-dist/assets/linear-9qlE6xa7.js +0 -1
- package/canvas-dist/assets/linear-CBfFWnLD.js +0 -1
- package/canvas-dist/assets/linear-Cv4ai8Hq.js +0 -1
- package/canvas-dist/assets/linear-DDzz65E6.js +0 -1
- package/canvas-dist/assets/linear-wbIqhwDf.js +0 -1
- package/canvas-dist/assets/linear-wyNKl76F.js +0 -1
- package/canvas-dist/assets/mindmap-definition-VGOIOE7T-3l4YzhEM.js +0 -68
- package/canvas-dist/assets/mindmap-definition-VGOIOE7T-B-KkpNlw.js +0 -68
- package/canvas-dist/assets/mindmap-definition-VGOIOE7T-DHMHWgmT.js +0 -68
- package/canvas-dist/assets/mindmap-definition-VGOIOE7T-Dqfyg4Z2.js +0 -68
- package/canvas-dist/assets/mindmap-definition-VGOIOE7T-NeRYOzsq.js +0 -68
- package/canvas-dist/assets/mindmap-definition-VGOIOE7T-xyu628P9.js +0 -68
- package/canvas-dist/assets/pieDiagram-ADFJNKIX-BWNzVAGj.js +0 -30
- package/canvas-dist/assets/pieDiagram-ADFJNKIX-Bm3PXYs-.js +0 -30
- package/canvas-dist/assets/pieDiagram-ADFJNKIX-BvvN7VvQ.js +0 -30
- package/canvas-dist/assets/pieDiagram-ADFJNKIX-BwU7AN7W.js +0 -30
- package/canvas-dist/assets/pieDiagram-ADFJNKIX-CHgwWCaM.js +0 -30
- package/canvas-dist/assets/pieDiagram-ADFJNKIX-DlZc8YOh.js +0 -30
- package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-B-Zd8OFp.js +0 -7
- package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-B1CnJyxI.js +0 -7
- package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-C0Qo00b9.js +0 -7
- package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-C9bx3nEJ.js +0 -7
- package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-UHENkiRO.js +0 -7
- package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-jKfurTPU.js +0 -7
- package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-BPpNNusD.js +0 -64
- package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-BwZF1NIK.js +0 -64
- package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-CaT3Frtk.js +0 -64
- package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-Dfoz7R_7.js +0 -64
- package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-DsrX4TT-.js +0 -64
- package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-dmouSXOl.js +0 -64
- package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-BEy-A1Fu.js +0 -10
- package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-BViMBiAQ.js +0 -10
- package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-BqrM-qWN.js +0 -10
- package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-DRkRC9qB.js +0 -10
- package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-DbuzKCtn.js +0 -10
- package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-_aHMKbpw.js +0 -10
- package/canvas-dist/assets/sequenceDiagram-WL72ISMW-B8FOaL2Q.js +0 -145
- package/canvas-dist/assets/sequenceDiagram-WL72ISMW-C02NQwOB.js +0 -145
- package/canvas-dist/assets/sequenceDiagram-WL72ISMW-CgyHivPj.js +0 -145
- package/canvas-dist/assets/sequenceDiagram-WL72ISMW-CzW1WaEm.js +0 -145
- package/canvas-dist/assets/sequenceDiagram-WL72ISMW-DJhHI1pe.js +0 -145
- package/canvas-dist/assets/sequenceDiagram-WL72ISMW-VFkpAeoG.js +0 -145
- package/canvas-dist/assets/stateDiagram-FKZM4ZOC-BSqFX4PJ.js +0 -1
- package/canvas-dist/assets/stateDiagram-FKZM4ZOC-BnXhhxkN.js +0 -1
- package/canvas-dist/assets/stateDiagram-FKZM4ZOC-ClARVrvt.js +0 -1
- package/canvas-dist/assets/stateDiagram-FKZM4ZOC-CuC6xesY.js +0 -1
- package/canvas-dist/assets/stateDiagram-FKZM4ZOC-DcAiGjph.js +0 -1
- package/canvas-dist/assets/stateDiagram-FKZM4ZOC-aBg0hjTp.js +0 -1
- package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-8fib9ftc.js +0 -1
- package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-B-DO0ZqO.js +0 -1
- package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-BksbsE4k.js +0 -1
- package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-C2DJCNPK.js +0 -1
- package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-CeA5jba6.js +0 -1
- package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-zsAyq0tK.js +0 -1
- package/canvas-dist/assets/timeline-definition-IT6M3QCI-BaHdYD2h.js +0 -61
- package/canvas-dist/assets/timeline-definition-IT6M3QCI-Bl2hg8IM.js +0 -61
- package/canvas-dist/assets/timeline-definition-IT6M3QCI-CrVwLiGm.js +0 -61
- package/canvas-dist/assets/timeline-definition-IT6M3QCI-DrXGRjnB.js +0 -61
- package/canvas-dist/assets/timeline-definition-IT6M3QCI-cYAwshf6.js +0 -61
- package/canvas-dist/assets/timeline-definition-IT6M3QCI-flyL0y-3.js +0 -61
- package/canvas-dist/assets/treemap-GDKQZRPO-C4Hg8kJ_.js +0 -162
- package/canvas-dist/assets/treemap-GDKQZRPO-DVY2G9qY.js +0 -162
- package/canvas-dist/assets/treemap-GDKQZRPO-DpLWPA1z.js +0 -162
- package/canvas-dist/assets/treemap-GDKQZRPO-Ds86cUVw.js +0 -162
- package/canvas-dist/assets/treemap-GDKQZRPO-DwmoI6tH.js +0 -162
- package/canvas-dist/assets/treemap-GDKQZRPO-SsGFkgVd.js +0 -162
- package/canvas-dist/assets/xychartDiagram-PRI3JC2R-B9c1iLBf.js +0 -7
- package/canvas-dist/assets/xychartDiagram-PRI3JC2R-BpX6MPWa.js +0 -7
- package/canvas-dist/assets/xychartDiagram-PRI3JC2R-CEgW_j0p.js +0 -7
- package/canvas-dist/assets/xychartDiagram-PRI3JC2R-CSEFGEQX.js +0 -7
- package/canvas-dist/assets/xychartDiagram-PRI3JC2R-CnG4XoMc.js +0 -7
- package/canvas-dist/assets/xychartDiagram-PRI3JC2R-Dftj3Bt3.js +0 -7
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# React — Resources
|
|
2
|
+
|
|
3
|
+
## Videos
|
|
4
|
+
|
|
5
|
+
- [React in 100 Seconds](https://www.youtube.com/watch?v=Tn6-PIqc4UM) — Fireship. Quick conceptual overview.
|
|
6
|
+
- [React Hooks Course](https://www.youtube.com/watch?v=6LVm2j0yTiU) — Web Dev Simplified. Deep dive on useState, useEffect, and more.
|
|
7
|
+
- [Complete React Course](https://www.youtube.com/watch?v=Rh3tobg7hZo) — freeCodeCamp. Full beginner track.
|
|
8
|
+
|
|
9
|
+
## Articles and Readings
|
|
10
|
+
|
|
11
|
+
- [React Docs — Learn React](https://react.dev/learn) — Official tutorial. Start here for fundamentals.
|
|
12
|
+
- [A Complete Guide to useEffect](https://overreacted.io/a-complete-guide-to-useeffect/) — Dan Abramov. Canonical reference for understanding effects.
|
|
13
|
+
|
|
14
|
+
## Books
|
|
15
|
+
|
|
16
|
+
- **React in Action** by Mark Thomas — Practical patterns and real-world examples.
|
|
17
|
+
- **Learning React** by Alex Banks & Eve Porcello — Clear, modern introduction.
|
|
18
|
+
|
|
19
|
+
## Tools and Playgrounds
|
|
20
|
+
|
|
21
|
+
- [CodeSandbox](https://codesandbox.io) — Online React playground, no setup.
|
|
22
|
+
- [React TypeScript Cheatsheet](https://react-typescript-cheatsheet.netlify.app/) — TypeScript + React patterns.
|
|
23
|
+
- [React DevTools](https://react.dev/learn/react-developer-tools) — Browser extension for inspecting components and state.
|
|
24
|
+
- [StackBlitz](https://stackblitz.com/) — Instant full-stack React environment in the browser.
|
|
25
|
+
|
|
26
|
+
## Podcasts
|
|
27
|
+
|
|
28
|
+
- [Syntax.fm](https://syntax.fm/) — Wes Bos & Scott Tolinski. Frequent React/web dev episodes.
|
|
29
|
+
- [React Podcast](https://spec.fm/podcasts/reactpodcast) — Interviews with React core team and community.
|
|
30
|
+
- [JS Party](https://changelog.com/jsparty) — Weekly panel show covering JavaScript and React ecosystem news.
|
|
31
|
+
|
|
32
|
+
## Interactive and Visual
|
|
33
|
+
|
|
34
|
+
- [React Visualized (react.gg)](https://react.gg/) — Visual, animated explanations of React concepts.
|
|
35
|
+
- [useHooks](https://usehooks.com/) — Visual catalog of reusable React hooks with code.
|
|
36
|
+
- [React Lifecycle Diagram](https://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/) — Interactive diagram of component lifecycle phases.
|
|
37
|
+
|
|
38
|
+
## Courses
|
|
39
|
+
|
|
40
|
+
- [React — Official Tutorial](https://react.dev/learn/tutorial-tic-tac-toe) — Build tic-tac-toe step by step, from the React team.
|
|
41
|
+
- [freeCodeCamp — Front End Libraries](https://www.freecodecamp.org/learn/front-end-development-libraries/) — Free certification covering React fundamentals.
|
|
42
|
+
- [Epic React (Kent C. Dodds)](https://epicreact.dev/) — Comprehensive paid workshop series on React patterns.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# React Walkthrough — Learn by Doing
|
|
2
|
+
|
|
3
|
+
## Step 1: Your First Component
|
|
4
|
+
|
|
5
|
+
Let's create a simple React component.
|
|
6
|
+
|
|
7
|
+
**Embed:** https://react.dev/learn/your-first-component
|
|
8
|
+
|
|
9
|
+
<!-- hint:code language="jsx" highlight="1,3" -->
|
|
10
|
+
|
|
11
|
+
**Task:** Write a functional component called `Greeting` that accepts a `name` prop and renders "Hello, {name}!".
|
|
12
|
+
|
|
13
|
+
**Question:** What do you think happens when you pass a prop that the component doesn't use? Would it cause an error?
|
|
14
|
+
|
|
15
|
+
**Checkpoint:** The user has a working Greeting component and understands that unused props are simply ignored.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Step 2: Adding State — Counter
|
|
20
|
+
|
|
21
|
+
Now let's make something interactive with `useState`.
|
|
22
|
+
|
|
23
|
+
**Embed:** https://react.dev/reference/react/useState
|
|
24
|
+
|
|
25
|
+
<!-- hint:card type="concept" title="useState triggers re-renders — setState causes React to re-run your component" -->
|
|
26
|
+
|
|
27
|
+
**Task:** Create a `Counter` component with a number state that starts at 0. Add a button that increments it when clicked.
|
|
28
|
+
|
|
29
|
+
**Question:** When you click the button, what actually triggers the number on screen to change? Trace the flow from click to DOM update in your mind.
|
|
30
|
+
|
|
31
|
+
**Checkpoint:** The user has a working counter and can explain that `setCount` triggers a re-render with the new value.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Step 3: Counter Refinement
|
|
36
|
+
|
|
37
|
+
Let's extend the counter.
|
|
38
|
+
|
|
39
|
+
**Task:** Add a second button that decrements the count. Add a "Reset" button that sets it back to 0. Prevent the count from going below 0.
|
|
40
|
+
|
|
41
|
+
**Question:** Why might you choose to clamp the value inside the click handler rather than in the render?
|
|
42
|
+
|
|
43
|
+
**Checkpoint:** The user has increment, decrement, and reset, and understands validation in handlers.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Step 4: useEffect Introduction
|
|
48
|
+
|
|
49
|
+
**Embed:** https://react.dev/reference/react/useEffect
|
|
50
|
+
|
|
51
|
+
<!-- hint:diagram mermaid-type="flowchart" topic="React render cycle: render → commit → effect" -->
|
|
52
|
+
|
|
53
|
+
**Task:** Use `useEffect` to update the browser tab title to show the current count (e.g., "Count: 3").
|
|
54
|
+
|
|
55
|
+
**Question:** What happens if you omit the dependency array from `useEffect`? What if you use an empty array `[]`?
|
|
56
|
+
|
|
57
|
+
**Checkpoint:** The user understands dependency arrays — empty = run once, omitted = run every render.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Step 5: Conditional Rendering
|
|
62
|
+
|
|
63
|
+
**Task:** In your counter, show "Count is zero" when the count is 0, and the normal count display otherwise. Maybe add a celebratory message when count reaches 10.
|
|
64
|
+
|
|
65
|
+
**Question:** When would you use `&&` vs a ternary for conditional rendering? What are the tradeoffs?
|
|
66
|
+
|
|
67
|
+
**Checkpoint:** The user can use both patterns and explain when each makes sense.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Step 6: Todo List — Adding Items
|
|
72
|
+
|
|
73
|
+
**Task:** Build the start of a todo list. Use `useState` with an array of items. Add an input and a button to append a new todo. Render the list with `map`.
|
|
74
|
+
|
|
75
|
+
**Question:** Why is it important to give each list item a stable `key`? What could go wrong if you use the array index as the key when items can be reordered or deleted?
|
|
76
|
+
|
|
77
|
+
**Checkpoint:** The user has a list with keys and understands key stability.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Step 7: Todo List — Toggling and Filtering
|
|
82
|
+
|
|
83
|
+
<!-- hint:celebrate -->
|
|
84
|
+
|
|
85
|
+
**Task:** Add a checkbox to each todo to mark it complete (strikethrough completed items). Add a filter: "All", "Active", "Completed". Use conditional rendering and `filter()`.
|
|
86
|
+
|
|
87
|
+
**Question:** Where should the filtered list be computed — in state, or derived at render time? What's the difference?
|
|
88
|
+
|
|
89
|
+
**Checkpoint:** The user understands derived state vs stored state — filters are typically derived.
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# React Fundamentals — Interactive Workshop Scenarios
|
|
2
|
+
# Build components with useState, lists, and useEffect.
|
|
3
|
+
|
|
4
|
+
scenarios:
|
|
5
|
+
- id: counter-component
|
|
6
|
+
title: "Build a Counter with useState"
|
|
7
|
+
difficulty: beginner
|
|
8
|
+
xp: 25
|
|
9
|
+
setup:
|
|
10
|
+
- "mkdir -p counter && cd counter && npm init -y && npm install react react-dom"
|
|
11
|
+
files:
|
|
12
|
+
- name: Counter.jsx
|
|
13
|
+
content: |
|
|
14
|
+
import React from "react";
|
|
15
|
+
|
|
16
|
+
export default function Counter() {
|
|
17
|
+
return (
|
|
18
|
+
<div>
|
|
19
|
+
<p>Count: 0</p>
|
|
20
|
+
<button>Increment</button>
|
|
21
|
+
</div>
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
language: javascript
|
|
25
|
+
readonly: false
|
|
26
|
+
task: "Add state for the count using useState. Initialize it to 0. Make the Increment button update the count when clicked. Display the current count in the paragraph."
|
|
27
|
+
validations:
|
|
28
|
+
- label: "Counter uses useState and increments"
|
|
29
|
+
check: file-changed
|
|
30
|
+
pattern: "useState|setCount|onClick"
|
|
31
|
+
hints:
|
|
32
|
+
- "Import useState: import { useState } from 'react';"
|
|
33
|
+
- "Add state: const [count, setCount] = useState(0);"
|
|
34
|
+
- "The button needs onClick={() => setCount(count + 1)} and the paragraph should show {count}."
|
|
35
|
+
agent_prompts:
|
|
36
|
+
on_start: "Right now the count is hardcoded as 0. What would need to change for the number to update when the user clicks?"
|
|
37
|
+
|
|
38
|
+
- id: todo-list
|
|
39
|
+
title: "Build a Todo List with State Management"
|
|
40
|
+
difficulty: intermediate
|
|
41
|
+
xp: 35
|
|
42
|
+
setup:
|
|
43
|
+
- "mkdir -p todo-list && cd todo-list && npm init -y && npm install react react-dom"
|
|
44
|
+
files:
|
|
45
|
+
- name: TodoApp.jsx
|
|
46
|
+
content: |
|
|
47
|
+
import React, { useState } from "react";
|
|
48
|
+
|
|
49
|
+
export default function TodoApp() {
|
|
50
|
+
const [todos, setTodos] = useState([]);
|
|
51
|
+
const [input, setInput] = useState("");
|
|
52
|
+
|
|
53
|
+
return (
|
|
54
|
+
<div>
|
|
55
|
+
<input
|
|
56
|
+
value={input}
|
|
57
|
+
onChange={(e) => setInput(e.target.value)}
|
|
58
|
+
placeholder="Add a todo"
|
|
59
|
+
/>
|
|
60
|
+
<button>Add</button>
|
|
61
|
+
<ul>
|
|
62
|
+
{/* Todo items will go here */}
|
|
63
|
+
</ul>
|
|
64
|
+
</div>
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
language: javascript
|
|
68
|
+
readonly: false
|
|
69
|
+
task: "Implement add (append new todo on Add click), remove (delete a todo by id or index), and toggle (mark todo complete/incomplete). Each todo should have id, text, and done. Display todos with checkboxes and a way to remove each."
|
|
70
|
+
validations:
|
|
71
|
+
- label: "Todo add, remove, and toggle implemented"
|
|
72
|
+
check: file-changed
|
|
73
|
+
pattern: "setTodos|add|toggle|remove"
|
|
74
|
+
hints:
|
|
75
|
+
- "Use a unique id for each todo — Date.now() or crypto.randomUUID() works."
|
|
76
|
+
- "To add: setTodos([...todos, { id, text: input, done: false }]) then clear input."
|
|
77
|
+
- "To toggle: map over todos and flip done for the matching id. To remove: filter out by id."
|
|
78
|
+
agent_prompts:
|
|
79
|
+
on_start: "You have an array of todos and an input. What happens when the user clicks Add? What shape should each todo item have?"
|
|
80
|
+
|
|
81
|
+
- id: api-fetch
|
|
82
|
+
title: "Fetch Data with useEffect"
|
|
83
|
+
difficulty: intermediate
|
|
84
|
+
xp: 35
|
|
85
|
+
setup:
|
|
86
|
+
- "mkdir -p api-fetch && cd api-fetch && npm init -y && npm install react react-dom"
|
|
87
|
+
files:
|
|
88
|
+
- name: UserList.jsx
|
|
89
|
+
content: |
|
|
90
|
+
import React, { useState, useEffect } from "react";
|
|
91
|
+
|
|
92
|
+
export default function UserList() {
|
|
93
|
+
return (
|
|
94
|
+
<div>
|
|
95
|
+
<h2>Users</h2>
|
|
96
|
+
<p>Loading...</p>
|
|
97
|
+
</div>
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
language: javascript
|
|
101
|
+
readonly: false
|
|
102
|
+
task: "Fetch users from https://jsonplaceholder.typicode.com/users using useEffect. Store them in state. Show a loading state while fetching, an error message if the request fails, and render the list of user names when successful."
|
|
103
|
+
validations:
|
|
104
|
+
- label: "useEffect fetch with loading and error states"
|
|
105
|
+
check: file-changed
|
|
106
|
+
pattern: "useEffect|fetch|loading|error"
|
|
107
|
+
hints:
|
|
108
|
+
- "useEffect(() => { fetch(url).then(...) }, []) — empty deps = run once on mount."
|
|
109
|
+
- "Use state for users, loading, and error. Set loading true before fetch, false after."
|
|
110
|
+
- "fetch().then(res => res.json()).then(data => setUsers(data)).catch(err => setError(err.message))."
|
|
111
|
+
agent_prompts:
|
|
112
|
+
on_start: "The data comes from a server. When does that request need to run? What should the UI show before the data arrives?"
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# React Native — Cross-Platform Mobile from a Web Mindset
|
|
2
|
+
|
|
3
|
+
<!-- hint:slides topic="React Native architecture: bridge vs new architecture, core components vs web, platform differences, and navigation" slides="5" -->
|
|
4
|
+
|
|
5
|
+
## What is React Native?
|
|
6
|
+
|
|
7
|
+
React Native lets you build native mobile apps (iOS and Android) using JavaScript and React. You write components; RN renders them as native views (not web views).
|
|
8
|
+
|
|
9
|
+
## Core Components
|
|
10
|
+
|
|
11
|
+
React Native uses different primitives than the web:
|
|
12
|
+
|
|
13
|
+
| Component | Purpose | Web Analogy |
|
|
14
|
+
|-----------|---------|-------------|
|
|
15
|
+
| `View` | Container, layout | `<div>` |
|
|
16
|
+
| `Text` | Display text | `<p>`, `<span>` |
|
|
17
|
+
| `ScrollView` | Scrollable container | Overflow scroll |
|
|
18
|
+
| `FlatList` | Virtualized list | Virtual list |
|
|
19
|
+
| `Image` | Images | `<img>` |
|
|
20
|
+
| `TextInput` | User input | `<input>` |
|
|
21
|
+
| `TouchableOpacity` | Pressable area | `<button>` |
|
|
22
|
+
|
|
23
|
+
**Rule:** All text must be inside `<Text>`. You cannot put text directly in `<View>`.
|
|
24
|
+
|
|
25
|
+
```jsx
|
|
26
|
+
<View>
|
|
27
|
+
<Text>Hello, world!</Text>
|
|
28
|
+
</View>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## StyleSheet
|
|
32
|
+
|
|
33
|
+
Use `StyleSheet.create()` for styles. Properties are camelCase; no CSS classes:
|
|
34
|
+
|
|
35
|
+
```jsx
|
|
36
|
+
const styles = StyleSheet.create({
|
|
37
|
+
container: {
|
|
38
|
+
flex: 1,
|
|
39
|
+
padding: 16,
|
|
40
|
+
backgroundColor: '#fff',
|
|
41
|
+
},
|
|
42
|
+
title: {
|
|
43
|
+
fontSize: 24,
|
|
44
|
+
fontWeight: 'bold',
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Flexbox is the default layout. Use `flex: 1` to fill space. `flexDirection` defaults to `column` (not `row`).
|
|
50
|
+
|
|
51
|
+
## FlatList
|
|
52
|
+
|
|
53
|
+
For long lists, use `FlatList` (virtualized) instead of mapping over an array:
|
|
54
|
+
|
|
55
|
+
```jsx
|
|
56
|
+
<FlatList
|
|
57
|
+
data={items}
|
|
58
|
+
keyExtractor={(item) => item.id}
|
|
59
|
+
renderItem={({ item }) => <ItemRow item={item} />}
|
|
60
|
+
/>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
`FlatList` only renders visible items + buffer — essential for performance.
|
|
64
|
+
|
|
65
|
+
## Navigation (React Navigation)
|
|
66
|
+
|
|
67
|
+
React Navigation is the standard for screen navigation:
|
|
68
|
+
|
|
69
|
+
```jsx
|
|
70
|
+
import { NavigationContainer } from '@react-navigation/native';
|
|
71
|
+
import { createNativeStackNavigator } from '@react-navigation/native-stack';
|
|
72
|
+
|
|
73
|
+
const Stack = createNativeStackNavigator();
|
|
74
|
+
|
|
75
|
+
function App() {
|
|
76
|
+
return (
|
|
77
|
+
<NavigationContainer>
|
|
78
|
+
<Stack.Navigator>
|
|
79
|
+
<Stack.Screen name="Home" component={HomeScreen} />
|
|
80
|
+
<Stack.Screen name="Details" component={DetailsScreen} />
|
|
81
|
+
</Stack.Navigator>
|
|
82
|
+
</NavigationContainer>
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Navigate with `navigation.navigate('Details', { id: 1 })`. Access params via `route.params`.
|
|
88
|
+
|
|
89
|
+
## Platform Differences
|
|
90
|
+
|
|
91
|
+
Use `Platform.OS` or `Platform.select()`:
|
|
92
|
+
|
|
93
|
+
```jsx
|
|
94
|
+
import { Platform } from 'react-native';
|
|
95
|
+
|
|
96
|
+
const padding = Platform.select({ ios: 20, android: 16 });
|
|
97
|
+
// Or: Platform.OS === 'ios' ? 20 : 16
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Some components behave differently (e.g., `TextInput`, shadows). Test on both platforms.
|
|
101
|
+
|
|
102
|
+
## Expo vs Bare
|
|
103
|
+
|
|
104
|
+
| | Expo | Bare (React Native CLI) |
|
|
105
|
+
|---|-----|------------------------|
|
|
106
|
+
| Setup | Fast, no Xcode/Android Studio needed to start | Full native setup |
|
|
107
|
+
| Native modules | Limited to Expo SDK + config plugins | Full access |
|
|
108
|
+
| Build | EAS Build (cloud) or local | Xcode, Android Studio |
|
|
109
|
+
| Use case | Prototypes, most apps | Heavy native customization |
|
|
110
|
+
|
|
111
|
+
## Architecture: How It Works
|
|
112
|
+
|
|
113
|
+
React Native bridges JavaScript and native code:
|
|
114
|
+
|
|
115
|
+
```mermaid
|
|
116
|
+
flowchart LR
|
|
117
|
+
subgraph JS
|
|
118
|
+
A[JS Thread]
|
|
119
|
+
end
|
|
120
|
+
subgraph Bridge
|
|
121
|
+
B[Bridge]
|
|
122
|
+
end
|
|
123
|
+
subgraph Native
|
|
124
|
+
C[Native Thread]
|
|
125
|
+
end
|
|
126
|
+
A <-->|Serialized messages| B
|
|
127
|
+
B <-->|Native calls| C
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
- **JS Thread:** Runs your React code, handles logic
|
|
131
|
+
- **Bridge:** Serializes commands (e.g., "create View", "set style")
|
|
132
|
+
- **Native Thread:** Renders actual UI, handles touch events
|
|
133
|
+
|
|
134
|
+
The bridge can be a bottleneck. New Architecture (Fabric, TurboModules) reduces this.
|
|
135
|
+
|
|
136
|
+
## Common Gotchas
|
|
137
|
+
|
|
138
|
+
- **No div/span:** Use `View` and `Text` only
|
|
139
|
+
- **No className:** Use `style` prop with StyleSheet
|
|
140
|
+
- **Pixel density:** Use `Dimensions.get('window')` or layout APIs for responsive sizing
|
|
141
|
+
- **Keyboard:** Use `KeyboardAvoidingView` for forms
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# React Native Exercises
|
|
2
|
+
|
|
3
|
+
## Exercise 1: Profile Card
|
|
4
|
+
|
|
5
|
+
**Task:** Create a `ProfileCard` component with a circular avatar placeholder (View with borderRadius), name, and a short bio. Use StyleSheet and Flexbox for layout.
|
|
6
|
+
|
|
7
|
+
**Validation:**
|
|
8
|
+
- [ ] Card has consistent padding and spacing
|
|
9
|
+
- [ ] Avatar is circular (width/height equal, borderRadius half of that)
|
|
10
|
+
- [ ] Layout works in portrait orientation
|
|
11
|
+
|
|
12
|
+
**Hints:**
|
|
13
|
+
1. `borderRadius: 50` with equal width/height makes a circle
|
|
14
|
+
2. Use `alignItems: 'center'` for centered content
|
|
15
|
+
3. `Image` with a URI or a colored View for avatar placeholder
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Exercise 2: Form with TextInput
|
|
20
|
+
|
|
21
|
+
**Task:** Create a simple form: name and email inputs, plus a submit button. Use controlled components (state drives input values). Log the values on submit.
|
|
22
|
+
|
|
23
|
+
**Validation:**
|
|
24
|
+
- [ ] Inputs are controlled (value + onChange)
|
|
25
|
+
- [ ] Submit logs the current values
|
|
26
|
+
- [ ] Keyboard doesn't obscure inputs (use KeyboardAvoidingView)
|
|
27
|
+
|
|
28
|
+
**Hints:**
|
|
29
|
+
1. `TextInput` uses `value` and `onChangeText`
|
|
30
|
+
2. `KeyboardAvoidingView` with `behavior="padding"` (iOS) or `"height"` (Android)
|
|
31
|
+
3. Wrap in `ScrollView` if content is tall
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Exercise 3: Searchable List
|
|
36
|
+
|
|
37
|
+
**Task:** Create a FlatList of 20+ items. Add a TextInput above it for search. Filter the list as the user types (case-insensitive). Use `useMemo` or a derived array for the filtered data.
|
|
38
|
+
|
|
39
|
+
**Validation:**
|
|
40
|
+
- [ ] Typing filters the list in real time
|
|
41
|
+
- [ ] FlatList only receives filtered data
|
|
42
|
+
- [ ] No lag when list is large
|
|
43
|
+
|
|
44
|
+
**Hints:**
|
|
45
|
+
1. Store search term in state, derive filtered list
|
|
46
|
+
2. `items.filter(i => i.name.toLowerCase().includes(search.toLowerCase()))`
|
|
47
|
+
3. Consider `useMemo` if filtering is expensive
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Exercise 4: Tab Navigator
|
|
52
|
+
|
|
53
|
+
**Task:** Add a bottom tab navigator with 3 tabs (e.g., Home, Search, Profile). Each tab shows a simple screen with different content. Use `createBottomTabNavigator`.
|
|
54
|
+
|
|
55
|
+
**Validation:**
|
|
56
|
+
- [ ] Tabs switch correctly
|
|
57
|
+
- [ ] Each tab has distinct content
|
|
58
|
+
- [ ] Tab bar is visible and usable
|
|
59
|
+
|
|
60
|
+
**Hints:**
|
|
61
|
+
1. `@react-navigation/bottom-tabs` for tab navigator
|
|
62
|
+
2. Nest inside your existing NavigationContainer
|
|
63
|
+
3. Optionally add icons with a vector icon library
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Exercise 5: Pull-to-Refresh
|
|
68
|
+
|
|
69
|
+
**Task:** Add pull-to-refresh to a FlatList. When pulled, show a loading indicator and "refresh" the list (e.g., shuffle or refetch simulated data). Use `refreshControl` with `RefreshControl`.
|
|
70
|
+
|
|
71
|
+
**Validation:**
|
|
72
|
+
- [ ] Pulling triggers refresh
|
|
73
|
+
- [ ] Loading state is visible during refresh
|
|
74
|
+
- [ ] List updates after refresh completes
|
|
75
|
+
|
|
76
|
+
**Hints:**
|
|
77
|
+
1. `RefreshControl` from `react-native` with `refreshing` and `onRefresh`
|
|
78
|
+
2. Use `useState` for `refreshing`; set true on pull, false when done
|
|
79
|
+
3. Simulate async with `setTimeout`
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
slug: react-native-fundamentals
|
|
2
|
+
title: "React Native — Cross-Platform Mobile from a Web Mindset"
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: "Build iOS and Android apps with React — components, navigation, and platform differences."
|
|
5
|
+
category: frameworks
|
|
6
|
+
tags: [react-native, mobile, ios, android, cross-platform, typescript]
|
|
7
|
+
difficulty: intermediate
|
|
8
|
+
|
|
9
|
+
xp:
|
|
10
|
+
read: 15
|
|
11
|
+
walkthrough: 40
|
|
12
|
+
exercise: 25
|
|
13
|
+
quiz: 20
|
|
14
|
+
quiz-perfect-bonus: 10
|
|
15
|
+
|
|
16
|
+
time:
|
|
17
|
+
quick: 5
|
|
18
|
+
read: 20
|
|
19
|
+
guided: 60
|
|
20
|
+
|
|
21
|
+
prerequisites: [react-fundamentals]
|
|
22
|
+
related: [typescript-fundamentals]
|
|
23
|
+
|
|
24
|
+
triggers:
|
|
25
|
+
- "How do I build a mobile app with React Native?"
|
|
26
|
+
- "What's the difference between React and React Native?"
|
|
27
|
+
- "How do I navigate between screens in React Native?"
|
|
28
|
+
- "How does React Native work under the hood?"
|
|
29
|
+
|
|
30
|
+
visuals:
|
|
31
|
+
diagrams: [diagram-mermaid, diagram-architecture]
|
|
32
|
+
quiz-types: [quiz-drag-order, quiz-timed-choice]
|
|
33
|
+
playground: javascript
|
|
34
|
+
slides: true
|
|
35
|
+
|
|
36
|
+
sources:
|
|
37
|
+
- url: "https://reactnative.dev"
|
|
38
|
+
label: "React Native Docs"
|
|
39
|
+
type: docs
|
|
40
|
+
- url: "https://docs.expo.dev"
|
|
41
|
+
label: "Expo Docs"
|
|
42
|
+
type: docs
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# React Native Quick Reference
|
|
2
|
+
|
|
3
|
+
## Core Components
|
|
4
|
+
|
|
5
|
+
| Component | Use For |
|
|
6
|
+
|-----------|---------|
|
|
7
|
+
| `View` | Containers, layout |
|
|
8
|
+
| `Text` | All text content |
|
|
9
|
+
| `ScrollView` | Scrollable content (finite) |
|
|
10
|
+
| `FlatList` | Long lists (virtualized) |
|
|
11
|
+
| `Image` | Images (source: `{uri}` or `require()`) |
|
|
12
|
+
| `TextInput` | User input |
|
|
13
|
+
| `TouchableOpacity` | Pressable with opacity feedback |
|
|
14
|
+
|
|
15
|
+
## StyleSheet
|
|
16
|
+
|
|
17
|
+
```jsx
|
|
18
|
+
const styles = StyleSheet.create({
|
|
19
|
+
box: { flex: 1, padding: 16 },
|
|
20
|
+
});
|
|
21
|
+
<View style={styles.box} />
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- Flexbox default: `flexDirection: 'column'`
|
|
25
|
+
- `flex: 1` fills available space
|
|
26
|
+
- No units for numbers (density-independent pixels)
|
|
27
|
+
|
|
28
|
+
## Navigation
|
|
29
|
+
|
|
30
|
+
| Method | Purpose |
|
|
31
|
+
|--------|---------|
|
|
32
|
+
| `navigation.navigate('Screen', { id: 1 })` | Go to screen with params |
|
|
33
|
+
| `navigation.goBack()` | Go back |
|
|
34
|
+
| `route.params` | Access params in destination |
|
|
35
|
+
|
|
36
|
+
## Platform
|
|
37
|
+
|
|
38
|
+
```jsx
|
|
39
|
+
import { Platform } from 'react-native';
|
|
40
|
+
Platform.OS // 'ios' | 'android'
|
|
41
|
+
Platform.select({ ios: 20, android: 16 })
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## FlatList Props
|
|
45
|
+
|
|
46
|
+
| Prop | Purpose |
|
|
47
|
+
|------|---------|
|
|
48
|
+
| `data` | Array of items |
|
|
49
|
+
| `keyExtractor` | (item) => item.id |
|
|
50
|
+
| `renderItem` | ({ item }) => <Row item={item} /> |
|
|
51
|
+
| `ListHeaderComponent` | Header content |
|
|
52
|
+
| `refreshControl` | Pull-to-refresh |
|
|
53
|
+
|
|
54
|
+
## Decision: ScrollView vs FlatList
|
|
55
|
+
|
|
56
|
+
| Use ScrollView when | Use FlatList when |
|
|
57
|
+
|---------------------|-------------------|
|
|
58
|
+
| Few items (< 20) | Many items (20+) |
|
|
59
|
+
| Content is mixed (not just list) | Homogeneous list |
|
|
60
|
+
| Need nested scroll (careful) | Standard list UI |
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# React Native Quiz
|
|
2
|
+
|
|
3
|
+
## Question 1
|
|
4
|
+
|
|
5
|
+
Can you put a string directly inside a `View` component?
|
|
6
|
+
|
|
7
|
+
A) Yes, it renders as text
|
|
8
|
+
B) No, all text must be inside a `Text` component
|
|
9
|
+
C) Yes on iOS, no on Android
|
|
10
|
+
D) Only if you use a special prop
|
|
11
|
+
|
|
12
|
+
<!-- ANSWER: B -->
|
|
13
|
+
<!-- EXPLANATION: React Native requires all text to be wrapped in a Text component. Putting a string directly in a View will throw an error. This is different from the web where text can be direct children of divs. -->
|
|
14
|
+
|
|
15
|
+
## Question 2
|
|
16
|
+
|
|
17
|
+
What is the main performance advantage of FlatList over ScrollView with a mapped array?
|
|
18
|
+
|
|
19
|
+
A) FlatList uses less memory
|
|
20
|
+
B) FlatList only renders visible items (virtualization)
|
|
21
|
+
C) FlatList has built-in caching
|
|
22
|
+
D) ScrollView is slower on Android only
|
|
23
|
+
|
|
24
|
+
<!-- ANSWER: B -->
|
|
25
|
+
<!-- EXPLANATION: FlatList virtualizes the list — it only mounts components for items near the viewport, plus a small buffer. ScrollView with map() renders every item at once, which can cause performance issues with hundreds of items. -->
|
|
26
|
+
|
|
27
|
+
## Question 3
|
|
28
|
+
|
|
29
|
+
How do you pass data when navigating to another screen with React Navigation?
|
|
30
|
+
|
|
31
|
+
A) Through global state only
|
|
32
|
+
B) As the second argument to navigate: `navigate('Screen', { id: 1 })`
|
|
33
|
+
C) Through a shared context
|
|
34
|
+
D) By mutating the navigator's state
|
|
35
|
+
|
|
36
|
+
<!-- ANSWER: B -->
|
|
37
|
+
<!-- EXPLANATION: navigation.navigate('ScreenName', { param1: value1 }) passes params to the destination screen. The destination receives them via route.params. -->
|
|
38
|
+
|
|
39
|
+
## Question 4
|
|
40
|
+
|
|
41
|
+
What does the React Native Bridge do?
|
|
42
|
+
|
|
43
|
+
A) Connects to a remote server
|
|
44
|
+
B) Serializes messages between the JS thread and native thread
|
|
45
|
+
C) Manages React state
|
|
46
|
+
D) Handles touch events only
|
|
47
|
+
|
|
48
|
+
<!-- ANSWER: B -->
|
|
49
|
+
<!-- EXPLANATION: The Bridge is the communication layer between the JavaScript thread (where your React code runs) and the native thread (where UI is rendered). Commands are serialized and sent across it. -->
|
|
50
|
+
|
|
51
|
+
## Question 5
|
|
52
|
+
|
|
53
|
+
When would you choose Expo over a bare React Native project?
|
|
54
|
+
|
|
55
|
+
A) When you need maximum native customization
|
|
56
|
+
B) When you want fast setup and don't need custom native code
|
|
57
|
+
C) Only for iOS
|
|
58
|
+
D) Expo is deprecated
|
|
59
|
+
|
|
60
|
+
<!-- ANSWER: B -->
|
|
61
|
+
<!-- EXPLANATION: Expo offers fast setup, over-the-air updates, and a managed workflow. Choose it when you don't need custom native modules. Use bare RN when you need full native control. -->
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# React Native — Resources
|
|
2
|
+
|
|
3
|
+
## Videos
|
|
4
|
+
|
|
5
|
+
- [React Native in 100 Seconds](https://www.youtube.com/watch?v=gvkqT_Uoahw) — Fireship. Quick overview.
|
|
6
|
+
- [React Native Tutorial](https://www.youtube.com/watch?v=obH0Ze_Rosc) — freeCodeCamp. Full beginner course.
|
|
7
|
+
- [Expo Crash Course](https://www.youtube.com/watch?v=5QlE6o-iYcE) — Traversy Media. Getting started with Expo.
|
|
8
|
+
|
|
9
|
+
## Articles and Readings
|
|
10
|
+
|
|
11
|
+
- [React Native Docs](https://reactnative.dev/docs/getting-started) — Official docs. Start here.
|
|
12
|
+
- [React Navigation Docs](https://reactnavigation.org/docs/getting-started) — Navigation patterns and setup.
|
|
13
|
+
- [Expo Documentation](https://docs.expo.dev) — Expo-specific guides and APIs.
|
|
14
|
+
|
|
15
|
+
## Books
|
|
16
|
+
|
|
17
|
+
- **React Native in Action** by Nader Dabit — Comprehensive RN coverage with practical projects.
|
|
18
|
+
- **Fullstack React Native** by Devin Abbott et al. — From basics to advanced patterns.
|
|
19
|
+
|
|
20
|
+
## Tools and Playgrounds
|
|
21
|
+
|
|
22
|
+
- [Expo Snack](https://snack.expo.dev) — Run RN in the browser, no local setup.
|
|
23
|
+
- [React Native Directory](https://reactnative.directory) — Find and evaluate libraries.
|
|
24
|
+
- [Flipper](https://fbflipper.com) — Debug RN apps (network, layout, logs).
|