From bb56242b8544b897378dc6555dfe8a0d91d00e65 Mon Sep 17 00:00:00 2001 From: Philip Johnson Date: Mon, 11 Nov 2024 09:10:25 -1000 Subject: [PATCH] Deploy website - based on e78632594081a736795f80d1eb3691ad2de26b2a --- 404.html | 2 +- assets/js/{a6327429.689a0a36.js => a6327429.b29917b1.js} | 2 +- .../js/{runtime~main.86a5e7a2.js => runtime~main.5ac53f25.js} | 2 +- blog.html | 2 +- blog/2023/02/10/welcome.html | 2 +- blog/archive.html | 2 +- docs/business.html | 2 +- docs/business/market-size.html | 2 +- docs/business/milestones.html | 2 +- docs/business/roadmap.html | 2 +- docs/develop.html | 2 +- docs/develop/architecture.html | 2 +- docs/develop/backups.html | 2 +- docs/develop/coding-standards.html | 2 +- docs/develop/dart-analyze.html | 2 +- docs/develop/deployment.html | 2 +- docs/develop/design/badges.html | 2 +- docs/develop/design/data-model-old.html | 2 +- docs/develop/design/data-model.html | 2 +- docs/develop/design/data-mutation.html | 2 +- docs/develop/design/features.html | 4 ++-- docs/develop/design/input-fields.html | 2 +- docs/develop/design/with-widgets.html | 2 +- docs/develop/installation.html | 2 +- docs/develop/integrity-check.html | 2 +- docs/develop/managing-firebase-data.html | 2 +- docs/develop/onboarding.html | 2 +- docs/develop/releases/release-0.0/chatgpt-feedback.html | 2 +- docs/develop/releases/release-0.0/customer-feedback.html | 2 +- docs/develop/releases/release-0.0/design.html | 2 +- docs/develop/releases/release-0.0/entrepreneur-feedback.html | 2 +- docs/develop/releases/release-1.0/cvp.html | 2 +- docs/develop/releases/release-1.0/end-of-season-feedback.html | 2 +- docs/develop/releases/release-1.0/goals.html | 2 +- docs/develop/releases/release-1.0/onboarding-feedback.html | 2 +- docs/develop/scripts.html | 2 +- docs/develop/testing.html | 2 +- docs/home/food-security.html | 2 +- docs/home/innovations.html | 2 +- docs/home/related-work.html | 2 +- docs/home/serious-gardeners.html | 2 +- docs/home/sneak-peek.html | 2 +- docs/home/team.html | 2 +- docs/home/welcome.html | 2 +- docs/user-guide/adding-plantings.html | 2 +- docs/user-guide/adding-vendors-crops-varieties.html | 2 +- docs/user-guide/badges.html | 2 +- docs/user-guide/chat-rooms.html | 2 +- docs/user-guide/define-a-garden.html | 2 +- docs/user-guide/downloading.html | 2 +- docs/user-guide/explore-a-chapter.html | 2 +- docs/user-guide/explore-a-garden.html | 2 +- docs/user-guide/geobot.html | 2 +- docs/user-guide/guided-tour.html | 2 +- docs/user-guide/observations.html | 2 +- docs/user-guide/outcomes.html | 2 +- docs/user-guide/overview.html | 2 +- docs/user-guide/privacy.html | 2 +- docs/user-guide/registration.html | 2 +- docs/user-guide/scenarios.html | 2 +- docs/user-guide/seeds.html | 2 +- docs/user-guide/tasks.html | 2 +- docs/user-guide/terms-and-conditions.html | 2 +- index.html | 2 +- markdown-page.html | 2 +- 65 files changed, 66 insertions(+), 66 deletions(-) rename assets/js/{a6327429.689a0a36.js => a6327429.b29917b1.js} (94%) rename assets/js/{runtime~main.86a5e7a2.js => runtime~main.5ac53f25.js} (99%) diff --git a/404.html b/404.html index f41f1ad8..f83a0bd6 100644 --- a/404.html +++ b/404.html @@ -5,7 +5,7 @@ Page Not Found | Geo Garden Club - + diff --git a/assets/js/a6327429.689a0a36.js b/assets/js/a6327429.b29917b1.js similarity index 94% rename from assets/js/a6327429.689a0a36.js rename to assets/js/a6327429.b29917b1.js index 19e19e35..2473f916 100644 --- a/assets/js/a6327429.689a0a36.js +++ b/assets/js/a6327429.b29917b1.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgeogardenclub_github_io=self.webpackChunkgeogardenclub_github_io||[]).push([[200],{8082:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var r=n(5893),a=n(1151);const o={hide_table_of_contents:!1},s="Anatomy of a feature",i={id:"develop/design/features",title:"Anatomy of a feature",description:'The GGC app loosely follows the "feature first" design philosophy expressed in Andrea Bizzotto\'s article Flutter Project Structure',source:"@site/docs/develop/design/features.md",sourceDirName:"develop/design",slug:"/develop/design/features",permalink:"/docs/develop/design/features",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{hide_table_of_contents:!1},sidebar:"developSidebar",previous:{title:"Backups",permalink:"/docs/develop/backups"},next:{title:"Data Model",permalink:"/docs/develop/design/data-model"}},c={},d=[];function l(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"anatomy-of-a-feature",children:"Anatomy of a feature"})}),"\n",(0,r.jsxs)(t.p,{children:['The GGC app loosely follows the "feature first" design philosophy expressed in Andrea Bizzotto\'s article ',(0,r.jsx)(t.a,{href:"https://codewithandrea.com/articles/flutter-project-structure/",children:"Flutter Project Structure: Feature-first or Layer-first?"}),". As noted in ",(0,r.jsx)(t.a,{href:"/docs/develop/architecture",children:"Architecture"}),", the top-level ",(0,r.jsx)(t.code,{children:"lib/"})," directory contains a ",(0,r.jsx)(t.code,{children:"features"})," subdirectory. Let's look at a snapshot of its contents:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",children:"~/GitHub/geogardenclub/ggc_app/lib/features git:[main] ls\nadmin/ bed/ common/ garden/ help/ outcome/ tag/ variety/\nauthentication/ chapter/ crop/ gardener/ home/ planting/ task/\nbadge/ chat/ family/ geobot/ observation/ settings/ user/\n"})}),"\n",(0,r.jsxs)(t.p,{children:["As you can see, the ",(0,r.jsx)(t.code,{children:"features/"}),' directory consists of a couple dozen subdirectories, each of which contains the implementation of a "feature". In many cases, a feature is an entity in the data model (i.e. Bed, Garden, Planting, etc.). In other cases, a feature is a conceptually coherent mechanism (i.e. authentication, help). Then there\'s the ',(0,r.jsx)(t.code,{children:"common/"})," directory, which isn't actually a feature at all, but which holds cross-cutting functionality that is used by multiple features, and which seems most appropriate to be located in this subdirectory even though it isn't actually a feature."]}),"\n",(0,r.jsx)(t.admonition,{title:"Tests are also organized by feature",type:"info",children:(0,r.jsxs)(t.p,{children:["Fun fact: if you look in the ",(0,r.jsx)(t.code,{children:"integration_test/features"})," directory, you'll see a set of subdirectories that almost directly correspond to the subdirectories in ",(0,r.jsx)(t.code,{children:"lib/features"}),"."]})}),"\n",(0,r.jsxs)(t.p,{children:['A distinguishing characteristic of a GGC feature is that it is implemented in terms of one or more of the following components: "data", "domain", and "presentation". As a result, if you look into a feature directory, you will find one or more of the following subdirectories: ',(0,r.jsx)(t.code,{children:"data/"}),", ",(0,r.jsx)(t.code,{children:"domain/"}),", and ",(0,r.jsx)(t.code,{children:"presentation/"}),'. Here\'s the contents of those directories for a relatively simple feature: "Crop":']}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",children:"crop/\n data/\n crop_database.dart \n crop_provider.dart \n crop_provider.g.dart \n fixture_crop_database.dart\n domain/\n crop.dart \n crop.freezed.dart \n crop.g.dart \n crop_collection.dart\n presentation/\n create_crop_screen.dart \n crop_form.dart \n crop_view.dart \n update_crop_screen.dart\n crop_chip.dart \n crop_index_screen.dart \n crop_view_screen.dart\n crop_delete_button.dart \n crop_toggle_section.dart \n delete_crop_screen.dart\n"})}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.code,{children:"data/"})," directory contains code that provides the mechanisms for persisting data associated with this feature to Firebase. It also includes the Riverpod Providers for accessing this data from elsewhere in the app. Finally, it includes the code for overriding the normal Firebase connection and replacing it with a connection to test fixture data. Note that at the ",(0,r.jsx)(t.code,{children:"data/"})," level, data is represented as JSON."]}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.code,{children:"domain/"})," directory contains class definitions (along with the ",(0,r.jsx)(t.a,{href:"https://pub.dev/packages/freezed",children:"Freezed"})," enhancements) to represent the feature data as instances of a Dart class, not JSON. In addition, the ",(0,r.jsx)(t.code,{children:"domain/"}),' directory can contain a "Collection" class. This is a class that aggregates together all the individual instances of the feature and provides operations (such as find or filter) to manipulate the entire population of feature instances.']}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.code,{children:"presentation/"}),' directory contains UI code. "Top-level" UI classes (containing a Scaffold) are called "screens", and there is a special kind of screen called an "index screen" which provides a way to present all the instances of a feature and search, sort, or filter them. Other common UI classes are "views" (which are reusable components within a screen), "forms" (containing one or more input controllers to gather information from the user), "chips" (presenting a clickable tile representing a feature instance), and "buttons". To support mutation of the feature, there can be "create", "update", and "delete" screens.']}),"\n",(0,r.jsxs)(t.p,{children:['Not all features will have all three of these subdirectories. For example, the "home" feature contains only a ',(0,r.jsx)(t.code,{children:"presentation/"})," subdirectory, because this feature only manipulates entities defined as part of other features."]})]})}function h(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>i,a:()=>s});var r=n(7294);const a={},o=r.createContext(a);function s(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgeogardenclub_github_io=self.webpackChunkgeogardenclub_github_io||[]).push([[200],{8082:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var r=n(5893),a=n(1151);const o={hide_table_of_contents:!1},s="Anatomy of a feature",i={id:"develop/design/features",title:"Anatomy of a feature",description:'The GGC app loosely follows the "feature first" design philosophy expressed in Andrea Bizzotto\'s article Flutter Project Structure',source:"@site/docs/develop/design/features.md",sourceDirName:"develop/design",slug:"/develop/design/features",permalink:"/docs/develop/design/features",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{hide_table_of_contents:!1},sidebar:"developSidebar",previous:{title:"Backups",permalink:"/docs/develop/backups"},next:{title:"Data Model",permalink:"/docs/develop/design/data-model"}},c={},d=[];function l(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"anatomy-of-a-feature",children:"Anatomy of a feature"})}),"\n",(0,r.jsxs)(t.p,{children:['The GGC app loosely follows the "feature first" design philosophy expressed in Andrea Bizzotto\'s article ',(0,r.jsx)(t.a,{href:"https://codewithandrea.com/articles/flutter-project-structure/",children:"Flutter Project Structure: Feature-first or Layer-first?"}),". As noted in ",(0,r.jsx)(t.a,{href:"/docs/develop/architecture",children:"Architecture"}),", the top-level ",(0,r.jsx)(t.code,{children:"lib/"})," directory contains a ",(0,r.jsx)(t.code,{children:"features"})," subdirectory. Let's look at a snapshot of its contents:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",children:"~/GitHub/geogardenclub/ggc_app/lib/features git:[main] ls\nadmin/ bed/ common/ garden/ help/ outcome/ tag/ variety/\nauthentication/ chapter/ crop/ gardener/ home/ planting/ task/\nbadge/ chat/ family/ geobot/ observation/ settings/ user/\n"})}),"\n",(0,r.jsxs)(t.p,{children:["As you can see, the ",(0,r.jsx)(t.code,{children:"features/"}),' directory consists of a couple dozen subdirectories, each of which contains the implementation of a "feature". In many cases, a feature is an entity in the data model (i.e. Bed, Garden, Planting, etc.). In other cases, a feature is a conceptually coherent mechanism (i.e. authentication, help). Then there\'s the ',(0,r.jsx)(t.code,{children:"common/"})," directory, which isn't actually a feature at all, but which holds cross-cutting functionality that is used by multiple features, and which seems most appropriate to be located in this subdirectory even though it isn't actually a feature."]}),"\n",(0,r.jsx)(t.admonition,{title:"Tests are also organized by feature",type:"info",children:(0,r.jsxs)(t.p,{children:["Fun fact: if you look in the ",(0,r.jsx)(t.code,{children:"integration_test/features"})," directory, you'll see a set of subdirectories that almost directly correspond to the subdirectories in ",(0,r.jsx)(t.code,{children:"lib/features"}),"."]})}),"\n",(0,r.jsxs)(t.p,{children:['A distinguishing characteristic of a GGC feature is that it is implemented in terms of one or more of the following components: "data", "domain", and "presentation". As a result, if you look into a feature directory, you will find one or more of the following subdirectories: ',(0,r.jsx)(t.code,{children:"data/"}),", ",(0,r.jsx)(t.code,{children:"domain/"}),", and ",(0,r.jsx)(t.code,{children:"presentation/"}),'. Here\'s the contents of those directories for a relatively simple feature: "Crop":']}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",children:"crop/\n data/\n crop_database.dart \n crop_provider.dart \n crop_provider.g.dart \n fixture_crop_database.dart\n domain/\n crop.dart \n crop.freezed.dart \n crop.g.dart \n crop_collection.dart\n presentation/\n create_crop_screen.dart \n crop_chip.dart \n crop_delete_button.dart \n crop_form.dart \n crop_index_screen.dart \n crop_toggle_section.dart \n crop_view.dart \n crop_view_screen.dart\n delete_crop_screen.dart\n update_crop_screen.dart\n"})}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.code,{children:"data/"})," directory contains code that provides the mechanisms for persisting data associated with this feature to Firebase. It also includes the Riverpod Providers for accessing this data from elsewhere in the app. Finally, it includes the code for overriding the normal Firebase connection and replacing it with a connection to test fixture data. Note that at the ",(0,r.jsx)(t.code,{children:"data/"})," level, data is represented as JSON."]}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.code,{children:"domain/"})," directory contains class definitions (along with the ",(0,r.jsx)(t.a,{href:"https://pub.dev/packages/freezed",children:"Freezed"})," enhancements) to represent the feature data as instances of a Dart class, not JSON. In addition, the ",(0,r.jsx)(t.code,{children:"domain/"}),' directory can contain a "Collection" class. This is a class that aggregates together all the individual instances of the feature and provides operations (such as find or filter) to manipulate the entire population of feature instances.']}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.code,{children:"presentation/"}),' directory contains UI code. "Top-level" UI classes (containing a Scaffold) are called "screens", and there is a special kind of screen called an "index screen" which provides a way to present all the instances of a feature and search, sort, or filter them. Other common UI classes are "views" (which are reusable components within a screen), "forms" (containing one or more input controllers to gather information from the user), "chips" (presenting a clickable tile representing a feature instance), and "buttons". To support mutation of the feature, there can be "create", "update", and "delete" screens.']}),"\n",(0,r.jsxs)(t.p,{children:['Not all features will have all three of these subdirectories. For example, the "home" feature contains only a ',(0,r.jsx)(t.code,{children:"presentation/"})," subdirectory, because this feature only manipulates entities defined as part of other features."]})]})}function h(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>i,a:()=>s});var r=n(7294);const a={},o=r.createContext(a);function s(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.86a5e7a2.js b/assets/js/runtime~main.5ac53f25.js similarity index 99% rename from assets/js/runtime~main.86a5e7a2.js rename to assets/js/runtime~main.5ac53f25.js index 143212a9..e2d6f7b7 100644 --- a/assets/js/runtime~main.86a5e7a2.js +++ b/assets/js/runtime~main.5ac53f25.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,c,d,f,b={},r={};function t(e){var a=r[e];if(void 0!==a)return a.exports;var c=r[e]={exports:{}};return b[e].call(c.exports,c,c.exports,t),c.exports}t.m=b,e=[],t.O=(a,c,d,f)=>{if(!c){var b=1/0;for(i=0;i=f)&&Object.keys(t.O).every((e=>t.O[e](c[o])))?c.splice(o--,1):(r=!1,f0&&e[i-1][2]>f;i--)e[i]=e[i-1];e[i]=[c,d,f]},t.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return t.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,t.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var f=Object.create(null);t.r(f);var b={};a=a||[null,c({}),c([]),c(c)];for(var r=2&d&&e;"object"==typeof r&&!~a.indexOf(r);r=c(r))Object.getOwnPropertyNames(r).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,t.d(f,b),f},t.d=(e,a)=>{for(var c in a)t.o(a,c)&&!t.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},t.f={},t.e=e=>Promise.all(Object.keys(t.f).reduce(((a,c)=>(t.f[c](e,a),a)),[])),t.u=e=>"assets/js/"+({1:"ff0b8175",183:"96083bb9",186:"a8521eb9",196:"505d7517",200:"a6327429",234:"39838d4e",403:"3ad77611",814:"95f4d37c",825:"7be5f79d",860:"2cd8ab24",1217:"1e5c498d",1340:"e2299c6d",1420:"6741c1a9",1549:"1506d638",1585:"2450005c",1666:"c401bc0d",1744:"10921c5b",1937:"49882d99",2446:"bc1f8660",2522:"c7c467a1",2535:"814f3328",2743:"968b4846",2889:"a1e7621f",2967:"e4eb6786",3085:"1f391b9e",3089:"a6aa9e1f",3560:"17d8eee1",3608:"9e4087bc",3629:"aba21aa0",3844:"772c3429",4e3:"afc29949",4031:"f81c1134",4057:"c03baef0",4063:"31caa863",4076:"7d1225b6",4088:"0058b4c6",4195:"c4f5d8e4",4368:"a94703ab",4524:"e27695c2",4713:"bc03b1b7",5014:"38346c4b",5857:"3e240fbf",5980:"a7456010",6103:"ccc49370",6142:"bebdd554",6265:"906ac375",6414:"3d832522",6427:"59628a4d",6642:"c15d9823",6800:"2f9db241",6900:"32cdd552",6906:"9ebba4ea",6957:"a5b8d3e9",6974:"af21c641",7222:"0bd3a280",7346:"f3759001",7393:"acecf23e",7414:"393be207",7540:"0f1af657",7664:"reactPlayerPreview",7918:"17896441",7937:"c48bbb24",8294:"3463d78f",8392:"ed0568ab",8518:"a7bd4aaa",8653:"ec0f34d7",8754:"6b1fc3de",9095:"9140a56a",9208:"36994c47",9256:"3bea7cd1",9268:"ba771284",9533:"a03c61f1",9572:"7d56ced7",9586:"3b4579e8",9601:"18fc9463",9661:"5e95c892",9866:"11f6a8a1",9929:"1863cff0"}[e]||e)+"."+{1:"a06d7a3a",183:"d2117bbc",186:"4c804139",196:"f6ca95e3",200:"689a0a36",234:"295e1e77",403:"dafd6774",814:"4e08262b",825:"d42ee47b",860:"d7028e73",1217:"c1c4c40c",1340:"11ae0623",1420:"aeb48ccb",1549:"7d1c392d",1585:"db463b44",1666:"ffe69db6",1744:"4d956c8c",1772:"3d06e0e2",1937:"96ed6c84",2446:"74e6e406",2522:"f201450f",2535:"0ba125c5",2700:"83aa9a75",2743:"67c47945",2889:"aba6ed83",2967:"a7c4ab03",3085:"3dba5538",3089:"911b8dd5",3560:"cffc9f0b",3608:"ee0c677a",3629:"eb980bea",3844:"84e52c31",4e3:"1038aca8",4031:"6f8546d9",4057:"efd80a40",4063:"c28d79bc",4076:"c945d809",4088:"e179fb10",4195:"b92bf9f8",4368:"4aef8496",4524:"f13327a6",4713:"802bf1c8",5014:"bd156c61",5655:"ab3e12ff",5857:"241b5abc",5980:"f93cbc61",6103:"4990621e",6142:"9adb781d",6265:"ecc041e6",6414:"19d9c76b",6427:"2704a200",6642:"b756708b",6800:"2dc6905e",6900:"4c0ae06e",6906:"df274206",6957:"e7cd2989",6974:"242c3e8d",7222:"7b0ad8f2",7346:"73ba512d",7393:"9d35c647",7414:"37f8208f",7540:"5d4247b4",7664:"e5a1011e",7918:"b96e81ff",7937:"881a7b56",8041:"e22d43c6",8294:"97dc70b8",8392:"a5d4194d",8518:"eaa77d27",8653:"1c9ade88",8754:"efb9acd3",9095:"63431e4b",9208:"203bad01",9256:"0698ba6b",9268:"f1b885cf",9533:"4158548e",9572:"e01aba21",9586:"82224d7d",9601:"e6c986e7",9661:"2dcb0623",9866:"6c00f0dc",9929:"e36f6a83"}[e]+".js",t.miniCssF=e=>{},t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),t.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},f="geogardenclub-github-io:",t.l=(e,a,c,b)=>{if(d[e])d[e].push(a);else{var r,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{r.onerror=r.onload=null,clearTimeout(s);var f=d[e];if(delete d[e],r.parentNode&&r.parentNode.removeChild(r),f&&f.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=l.bind(null,r.onerror),r.onload=l.bind(null,r.onload),o&&document.head.appendChild(r)}},t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.p="/",t.gca=function(e){return e={17896441:"7918",ff0b8175:"1","96083bb9":"183",a8521eb9:"186","505d7517":"196",a6327429:"200","39838d4e":"234","3ad77611":"403","95f4d37c":"814","7be5f79d":"825","2cd8ab24":"860","1e5c498d":"1217",e2299c6d:"1340","6741c1a9":"1420","1506d638":"1549","2450005c":"1585",c401bc0d:"1666","10921c5b":"1744","49882d99":"1937",bc1f8660:"2446",c7c467a1:"2522","814f3328":"2535","968b4846":"2743",a1e7621f:"2889",e4eb6786:"2967","1f391b9e":"3085",a6aa9e1f:"3089","17d8eee1":"3560","9e4087bc":"3608",aba21aa0:"3629","772c3429":"3844",afc29949:"4000",f81c1134:"4031",c03baef0:"4057","31caa863":"4063","7d1225b6":"4076","0058b4c6":"4088",c4f5d8e4:"4195",a94703ab:"4368",e27695c2:"4524",bc03b1b7:"4713","38346c4b":"5014","3e240fbf":"5857",a7456010:"5980",ccc49370:"6103",bebdd554:"6142","906ac375":"6265","3d832522":"6414","59628a4d":"6427",c15d9823:"6642","2f9db241":"6800","32cdd552":"6900","9ebba4ea":"6906",a5b8d3e9:"6957",af21c641:"6974","0bd3a280":"7222",f3759001:"7346",acecf23e:"7393","393be207":"7414","0f1af657":"7540",reactPlayerPreview:"7664",c48bbb24:"7937","3463d78f":"8294",ed0568ab:"8392",a7bd4aaa:"8518",ec0f34d7:"8653","6b1fc3de":"8754","9140a56a":"9095","36994c47":"9208","3bea7cd1":"9256",ba771284:"9268",a03c61f1:"9533","7d56ced7":"9572","3b4579e8":"9586","18fc9463":"9601","5e95c892":"9661","11f6a8a1":"9866","1863cff0":"9929"}[e]||e,t.p+t.u(e)},(()=>{var e={1303:0,532:0};t.f.j=(a,c)=>{var d=t.o(e,a)?e[a]:void 0;if(0!==d)if(d)c.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var f=new Promise(((c,f)=>d=e[a]=[c,f]));c.push(d[2]=f);var b=t.p+t.u(a),r=new Error;t.l(b,(c=>{if(t.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var f=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;r.message="Loading chunk "+a+" failed.\n("+f+": "+b+")",r.name="ChunkLoadError",r.type=f,r.request=b,d[1](r)}}),"chunk-"+a,a)}},t.O.j=a=>0===e[a];var a=(a,c)=>{var d,f,b=c[0],r=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(d in r)t.o(r,d)&&(t.m[d]=r[d]);if(o)var i=o(t)}for(a&&a(c);n{"use strict";var e,a,c,d,f,b={},r={};function t(e){var a=r[e];if(void 0!==a)return a.exports;var c=r[e]={exports:{}};return b[e].call(c.exports,c,c.exports,t),c.exports}t.m=b,e=[],t.O=(a,c,d,f)=>{if(!c){var b=1/0;for(i=0;i=f)&&Object.keys(t.O).every((e=>t.O[e](c[o])))?c.splice(o--,1):(r=!1,f0&&e[i-1][2]>f;i--)e[i]=e[i-1];e[i]=[c,d,f]},t.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return t.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,t.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var f=Object.create(null);t.r(f);var b={};a=a||[null,c({}),c([]),c(c)];for(var r=2&d&&e;"object"==typeof r&&!~a.indexOf(r);r=c(r))Object.getOwnPropertyNames(r).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,t.d(f,b),f},t.d=(e,a)=>{for(var c in a)t.o(a,c)&&!t.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},t.f={},t.e=e=>Promise.all(Object.keys(t.f).reduce(((a,c)=>(t.f[c](e,a),a)),[])),t.u=e=>"assets/js/"+({1:"ff0b8175",183:"96083bb9",186:"a8521eb9",196:"505d7517",200:"a6327429",234:"39838d4e",403:"3ad77611",814:"95f4d37c",825:"7be5f79d",860:"2cd8ab24",1217:"1e5c498d",1340:"e2299c6d",1420:"6741c1a9",1549:"1506d638",1585:"2450005c",1666:"c401bc0d",1744:"10921c5b",1937:"49882d99",2446:"bc1f8660",2522:"c7c467a1",2535:"814f3328",2743:"968b4846",2889:"a1e7621f",2967:"e4eb6786",3085:"1f391b9e",3089:"a6aa9e1f",3560:"17d8eee1",3608:"9e4087bc",3629:"aba21aa0",3844:"772c3429",4e3:"afc29949",4031:"f81c1134",4057:"c03baef0",4063:"31caa863",4076:"7d1225b6",4088:"0058b4c6",4195:"c4f5d8e4",4368:"a94703ab",4524:"e27695c2",4713:"bc03b1b7",5014:"38346c4b",5857:"3e240fbf",5980:"a7456010",6103:"ccc49370",6142:"bebdd554",6265:"906ac375",6414:"3d832522",6427:"59628a4d",6642:"c15d9823",6800:"2f9db241",6900:"32cdd552",6906:"9ebba4ea",6957:"a5b8d3e9",6974:"af21c641",7222:"0bd3a280",7346:"f3759001",7393:"acecf23e",7414:"393be207",7540:"0f1af657",7664:"reactPlayerPreview",7918:"17896441",7937:"c48bbb24",8294:"3463d78f",8392:"ed0568ab",8518:"a7bd4aaa",8653:"ec0f34d7",8754:"6b1fc3de",9095:"9140a56a",9208:"36994c47",9256:"3bea7cd1",9268:"ba771284",9533:"a03c61f1",9572:"7d56ced7",9586:"3b4579e8",9601:"18fc9463",9661:"5e95c892",9866:"11f6a8a1",9929:"1863cff0"}[e]||e)+"."+{1:"a06d7a3a",183:"d2117bbc",186:"4c804139",196:"f6ca95e3",200:"b29917b1",234:"295e1e77",403:"dafd6774",814:"4e08262b",825:"d42ee47b",860:"d7028e73",1217:"c1c4c40c",1340:"11ae0623",1420:"aeb48ccb",1549:"7d1c392d",1585:"db463b44",1666:"ffe69db6",1744:"4d956c8c",1772:"3d06e0e2",1937:"96ed6c84",2446:"74e6e406",2522:"f201450f",2535:"0ba125c5",2700:"83aa9a75",2743:"67c47945",2889:"aba6ed83",2967:"a7c4ab03",3085:"3dba5538",3089:"911b8dd5",3560:"cffc9f0b",3608:"ee0c677a",3629:"eb980bea",3844:"84e52c31",4e3:"1038aca8",4031:"6f8546d9",4057:"efd80a40",4063:"c28d79bc",4076:"c945d809",4088:"e179fb10",4195:"b92bf9f8",4368:"4aef8496",4524:"f13327a6",4713:"802bf1c8",5014:"bd156c61",5655:"ab3e12ff",5857:"241b5abc",5980:"f93cbc61",6103:"4990621e",6142:"9adb781d",6265:"ecc041e6",6414:"19d9c76b",6427:"2704a200",6642:"b756708b",6800:"2dc6905e",6900:"4c0ae06e",6906:"df274206",6957:"e7cd2989",6974:"242c3e8d",7222:"7b0ad8f2",7346:"73ba512d",7393:"9d35c647",7414:"37f8208f",7540:"5d4247b4",7664:"e5a1011e",7918:"b96e81ff",7937:"881a7b56",8041:"e22d43c6",8294:"97dc70b8",8392:"a5d4194d",8518:"eaa77d27",8653:"1c9ade88",8754:"efb9acd3",9095:"63431e4b",9208:"203bad01",9256:"0698ba6b",9268:"f1b885cf",9533:"4158548e",9572:"e01aba21",9586:"82224d7d",9601:"e6c986e7",9661:"2dcb0623",9866:"6c00f0dc",9929:"e36f6a83"}[e]+".js",t.miniCssF=e=>{},t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),t.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},f="geogardenclub-github-io:",t.l=(e,a,c,b)=>{if(d[e])d[e].push(a);else{var r,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{r.onerror=r.onload=null,clearTimeout(s);var f=d[e];if(delete d[e],r.parentNode&&r.parentNode.removeChild(r),f&&f.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=l.bind(null,r.onerror),r.onload=l.bind(null,r.onload),o&&document.head.appendChild(r)}},t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.p="/",t.gca=function(e){return e={17896441:"7918",ff0b8175:"1","96083bb9":"183",a8521eb9:"186","505d7517":"196",a6327429:"200","39838d4e":"234","3ad77611":"403","95f4d37c":"814","7be5f79d":"825","2cd8ab24":"860","1e5c498d":"1217",e2299c6d:"1340","6741c1a9":"1420","1506d638":"1549","2450005c":"1585",c401bc0d:"1666","10921c5b":"1744","49882d99":"1937",bc1f8660:"2446",c7c467a1:"2522","814f3328":"2535","968b4846":"2743",a1e7621f:"2889",e4eb6786:"2967","1f391b9e":"3085",a6aa9e1f:"3089","17d8eee1":"3560","9e4087bc":"3608",aba21aa0:"3629","772c3429":"3844",afc29949:"4000",f81c1134:"4031",c03baef0:"4057","31caa863":"4063","7d1225b6":"4076","0058b4c6":"4088",c4f5d8e4:"4195",a94703ab:"4368",e27695c2:"4524",bc03b1b7:"4713","38346c4b":"5014","3e240fbf":"5857",a7456010:"5980",ccc49370:"6103",bebdd554:"6142","906ac375":"6265","3d832522":"6414","59628a4d":"6427",c15d9823:"6642","2f9db241":"6800","32cdd552":"6900","9ebba4ea":"6906",a5b8d3e9:"6957",af21c641:"6974","0bd3a280":"7222",f3759001:"7346",acecf23e:"7393","393be207":"7414","0f1af657":"7540",reactPlayerPreview:"7664",c48bbb24:"7937","3463d78f":"8294",ed0568ab:"8392",a7bd4aaa:"8518",ec0f34d7:"8653","6b1fc3de":"8754","9140a56a":"9095","36994c47":"9208","3bea7cd1":"9256",ba771284:"9268",a03c61f1:"9533","7d56ced7":"9572","3b4579e8":"9586","18fc9463":"9601","5e95c892":"9661","11f6a8a1":"9866","1863cff0":"9929"}[e]||e,t.p+t.u(e)},(()=>{var e={1303:0,532:0};t.f.j=(a,c)=>{var d=t.o(e,a)?e[a]:void 0;if(0!==d)if(d)c.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var f=new Promise(((c,f)=>d=e[a]=[c,f]));c.push(d[2]=f);var b=t.p+t.u(a),r=new Error;t.l(b,(c=>{if(t.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var f=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;r.message="Loading chunk "+a+" failed.\n("+f+": "+b+")",r.name="ChunkLoadError",r.type=f,r.request=b,d[1](r)}}),"chunk-"+a,a)}},t.O.j=a=>0===e[a];var a=(a,c)=>{var d,f,b=c[0],r=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(d in r)t.o(r,d)&&(t.m[d]=r[d]);if(o)var i=o(t)}for(a&&a(c);n Blog | Geo Garden Club - + diff --git a/blog/2023/02/10/welcome.html b/blog/2023/02/10/welcome.html index e3b59cf1..4e6b4e48 100644 --- a/blog/2023/02/10/welcome.html +++ b/blog/2023/02/10/welcome.html @@ -5,7 +5,7 @@ Welcome, Geo Garden Club! Aloha, Agile Garden Club! | Geo Garden Club - + diff --git a/blog/archive.html b/blog/archive.html index dda8b7ce..ad660092 100644 --- a/blog/archive.html +++ b/blog/archive.html @@ -5,7 +5,7 @@ Archive | Geo Garden Club - + diff --git a/docs/business.html b/docs/business.html index d32ae1a4..049dd648 100644 --- a/docs/business.html +++ b/docs/business.html @@ -5,7 +5,7 @@ Welcome to the GGC Business Development Guide | Geo Garden Club - + diff --git a/docs/business/market-size.html b/docs/business/market-size.html index fab792da..0a654252 100644 --- a/docs/business/market-size.html +++ b/docs/business/market-size.html @@ -5,7 +5,7 @@ Market Size Estimation (USA) | Geo Garden Club - + diff --git a/docs/business/milestones.html b/docs/business/milestones.html index 346d475a..ac54633b 100644 --- a/docs/business/milestones.html +++ b/docs/business/milestones.html @@ -5,7 +5,7 @@ Milestones | Geo Garden Club - + diff --git a/docs/business/roadmap.html b/docs/business/roadmap.html index 769f6b59..13566414 100644 --- a/docs/business/roadmap.html +++ b/docs/business/roadmap.html @@ -5,7 +5,7 @@ Roadmap | Geo Garden Club - + diff --git a/docs/develop.html b/docs/develop.html index 6c227b2d..ed4e905f 100644 --- a/docs/develop.html +++ b/docs/develop.html @@ -5,7 +5,7 @@ Welcome to the GGC Developers Guide | Geo Garden Club - + diff --git a/docs/develop/architecture.html b/docs/develop/architecture.html index d1b13901..b9f6f589 100644 --- a/docs/develop/architecture.html +++ b/docs/develop/architecture.html @@ -5,7 +5,7 @@ Architecture | Geo Garden Club - + diff --git a/docs/develop/backups.html b/docs/develop/backups.html index 0094643f..31052972 100644 --- a/docs/develop/backups.html +++ b/docs/develop/backups.html @@ -5,7 +5,7 @@ Backups | Geo Garden Club - + diff --git a/docs/develop/coding-standards.html b/docs/develop/coding-standards.html index d5849cc2..4360188b 100644 --- a/docs/develop/coding-standards.html +++ b/docs/develop/coding-standards.html @@ -5,7 +5,7 @@ Coding Standards | Geo Garden Club - + diff --git a/docs/develop/dart-analyze.html b/docs/develop/dart-analyze.html index 066fba9c..5fcbc8f6 100644 --- a/docs/develop/dart-analyze.html +++ b/docs/develop/dart-analyze.html @@ -5,7 +5,7 @@ Dart analyze | Geo Garden Club - + diff --git a/docs/develop/deployment.html b/docs/develop/deployment.html index 9520626a..7de975c1 100644 --- a/docs/develop/deployment.html +++ b/docs/develop/deployment.html @@ -5,7 +5,7 @@ Deployment | Geo Garden Club - + diff --git a/docs/develop/design/badges.html b/docs/develop/design/badges.html index e6a82764..5d07b048 100644 --- a/docs/develop/design/badges.html +++ b/docs/develop/design/badges.html @@ -5,7 +5,7 @@ Badges | Geo Garden Club - + diff --git a/docs/develop/design/data-model-old.html b/docs/develop/design/data-model-old.html index be440f86..8467d4c2 100644 --- a/docs/develop/design/data-model-old.html +++ b/docs/develop/design/data-model-old.html @@ -5,7 +5,7 @@ Data Model | Geo Garden Club - + diff --git a/docs/develop/design/data-model.html b/docs/develop/design/data-model.html index 8180abff..edc61d65 100644 --- a/docs/develop/design/data-model.html +++ b/docs/develop/design/data-model.html @@ -5,7 +5,7 @@ Data Model | Geo Garden Club - + diff --git a/docs/develop/design/data-mutation.html b/docs/develop/design/data-mutation.html index 1a1cd010..a4cf6885 100644 --- a/docs/develop/design/data-mutation.html +++ b/docs/develop/design/data-mutation.html @@ -5,7 +5,7 @@ Data Mutation | Geo Garden Club - + diff --git a/docs/develop/design/features.html b/docs/develop/design/features.html index 193201da..e8776b4a 100644 --- a/docs/develop/design/features.html +++ b/docs/develop/design/features.html @@ -5,7 +5,7 @@ Anatomy of a feature | Geo Garden Club - + @@ -15,7 +15,7 @@

As you can see, the features/ directory consists of a couple dozen subdirectories, each of which contains the implementation of a "feature". In many cases, a feature is an entity in the data model (i.e. Bed, Garden, Planting, etc.). In other cases, a feature is a conceptually coherent mechanism (i.e. authentication, help). Then there's the common/ directory, which isn't actually a feature at all, but which holds cross-cutting functionality that is used by multiple features, and which seems most appropriate to be located in this subdirectory even though it isn't actually a feature.

Tests are also organized by feature

Fun fact: if you look in the integration_test/features directory, you'll see a set of subdirectories that almost directly correspond to the subdirectories in lib/features.

A distinguishing characteristic of a GGC feature is that it is implemented in terms of one or more of the following components: "data", "domain", and "presentation". As a result, if you look into a feature directory, you will find one or more of the following subdirectories: data/, domain/, and presentation/. Here's the contents of those directories for a relatively simple feature: "Crop":

-
crop/
data/
crop_database.dart
crop_provider.dart
crop_provider.g.dart
fixture_crop_database.dart
domain/
crop.dart
crop.freezed.dart
crop.g.dart
crop_collection.dart
presentation/
create_crop_screen.dart
crop_form.dart
crop_view.dart
update_crop_screen.dart
crop_chip.dart
crop_index_screen.dart
crop_view_screen.dart
crop_delete_button.dart
crop_toggle_section.dart
delete_crop_screen.dart
+
crop/
data/
crop_database.dart
crop_provider.dart
crop_provider.g.dart
fixture_crop_database.dart
domain/
crop.dart
crop.freezed.dart
crop.g.dart
crop_collection.dart
presentation/
create_crop_screen.dart
crop_chip.dart
crop_delete_button.dart
crop_form.dart
crop_index_screen.dart
crop_toggle_section.dart
crop_view.dart
crop_view_screen.dart
delete_crop_screen.dart
update_crop_screen.dart

The data/ directory contains code that provides the mechanisms for persisting data associated with this feature to Firebase. It also includes the Riverpod Providers for accessing this data from elsewhere in the app. Finally, it includes the code for overriding the normal Firebase connection and replacing it with a connection to test fixture data. Note that at the data/ level, data is represented as JSON.

The domain/ directory contains class definitions (along with the Freezed enhancements) to represent the feature data as instances of a Dart class, not JSON. In addition, the domain/ directory can contain a "Collection" class. This is a class that aggregates together all the individual instances of the feature and provides operations (such as find or filter) to manipulate the entire population of feature instances.

The presentation/ directory contains UI code. "Top-level" UI classes (containing a Scaffold) are called "screens", and there is a special kind of screen called an "index screen" which provides a way to present all the instances of a feature and search, sort, or filter them. Other common UI classes are "views" (which are reusable components within a screen), "forms" (containing one or more input controllers to gather information from the user), "chips" (presenting a clickable tile representing a feature instance), and "buttons". To support mutation of the feature, there can be "create", "update", and "delete" screens.

diff --git a/docs/develop/design/input-fields.html b/docs/develop/design/input-fields.html index 434416c6..919e1790 100644 --- a/docs/develop/design/input-fields.html +++ b/docs/develop/design/input-fields.html @@ -5,7 +5,7 @@ GGC Input Fields | Geo Garden Club - + diff --git a/docs/develop/design/with-widgets.html b/docs/develop/design/with-widgets.html index 09375161..bd4a8f23 100644 --- a/docs/develop/design/with-widgets.html +++ b/docs/develop/design/with-widgets.html @@ -5,7 +5,7 @@ "With" widgets | Geo Garden Club - + diff --git a/docs/develop/installation.html b/docs/develop/installation.html index 3f3ae3cd..fdcaa14b 100644 --- a/docs/develop/installation.html +++ b/docs/develop/installation.html @@ -5,7 +5,7 @@ Installation | Geo Garden Club - + diff --git a/docs/develop/integrity-check.html b/docs/develop/integrity-check.html index cec56a13..73b04a39 100644 --- a/docs/develop/integrity-check.html +++ b/docs/develop/integrity-check.html @@ -5,7 +5,7 @@ Database Integrity Checking | Geo Garden Club - + diff --git a/docs/develop/managing-firebase-data.html b/docs/develop/managing-firebase-data.html index b5e5adcd..6efb74df 100644 --- a/docs/develop/managing-firebase-data.html +++ b/docs/develop/managing-firebase-data.html @@ -5,7 +5,7 @@ Managing Firebase data | Geo Garden Club - + diff --git a/docs/develop/onboarding.html b/docs/develop/onboarding.html index bacb404a..0d8ec171 100644 --- a/docs/develop/onboarding.html +++ b/docs/develop/onboarding.html @@ -5,7 +5,7 @@ Onboarding | Geo Garden Club - + diff --git a/docs/develop/releases/release-0.0/chatgpt-feedback.html b/docs/develop/releases/release-0.0/chatgpt-feedback.html index 72fb4412..3bf5be9b 100644 --- a/docs/develop/releases/release-0.0/chatgpt-feedback.html +++ b/docs/develop/releases/release-0.0/chatgpt-feedback.html @@ -5,7 +5,7 @@ ChatGPT feedback | Geo Garden Club - + diff --git a/docs/develop/releases/release-0.0/customer-feedback.html b/docs/develop/releases/release-0.0/customer-feedback.html index e46fc43d..461cc4ef 100644 --- a/docs/develop/releases/release-0.0/customer-feedback.html +++ b/docs/develop/releases/release-0.0/customer-feedback.html @@ -5,7 +5,7 @@ Customer feedback | Geo Garden Club - + diff --git a/docs/develop/releases/release-0.0/design.html b/docs/develop/releases/release-0.0/design.html index 1a374f0a..ef158401 100644 --- a/docs/develop/releases/release-0.0/design.html +++ b/docs/develop/releases/release-0.0/design.html @@ -5,7 +5,7 @@ Design and implementation | Geo Garden Club - + diff --git a/docs/develop/releases/release-0.0/entrepreneur-feedback.html b/docs/develop/releases/release-0.0/entrepreneur-feedback.html index d6ce55fc..eb7e6759 100644 --- a/docs/develop/releases/release-0.0/entrepreneur-feedback.html +++ b/docs/develop/releases/release-0.0/entrepreneur-feedback.html @@ -5,7 +5,7 @@ Entrepreneur feedback | Geo Garden Club - + diff --git a/docs/develop/releases/release-1.0/cvp.html b/docs/develop/releases/release-1.0/cvp.html index 07d275fe..120b4115 100644 --- a/docs/develop/releases/release-1.0/cvp.html +++ b/docs/develop/releases/release-1.0/cvp.html @@ -5,7 +5,7 @@ Core Value Propositions | Geo Garden Club - + diff --git a/docs/develop/releases/release-1.0/end-of-season-feedback.html b/docs/develop/releases/release-1.0/end-of-season-feedback.html index de83ad36..6d924a5a 100644 --- a/docs/develop/releases/release-1.0/end-of-season-feedback.html +++ b/docs/develop/releases/release-1.0/end-of-season-feedback.html @@ -5,7 +5,7 @@ End of Season Feedback | Geo Garden Club - + diff --git a/docs/develop/releases/release-1.0/goals.html b/docs/develop/releases/release-1.0/goals.html index 02f2e770..88cd4622 100644 --- a/docs/develop/releases/release-1.0/goals.html +++ b/docs/develop/releases/release-1.0/goals.html @@ -5,7 +5,7 @@ Technology Goals | Geo Garden Club - + diff --git a/docs/develop/releases/release-1.0/onboarding-feedback.html b/docs/develop/releases/release-1.0/onboarding-feedback.html index ecc39114..5533cd09 100644 --- a/docs/develop/releases/release-1.0/onboarding-feedback.html +++ b/docs/develop/releases/release-1.0/onboarding-feedback.html @@ -5,7 +5,7 @@ Onboarding Feedback | Geo Garden Club - + diff --git a/docs/develop/scripts.html b/docs/develop/scripts.html index dd533bf4..34896235 100644 --- a/docs/develop/scripts.html +++ b/docs/develop/scripts.html @@ -5,7 +5,7 @@ Scripts | Geo Garden Club - + diff --git a/docs/develop/testing.html b/docs/develop/testing.html index faddb7ff..7656a149 100644 --- a/docs/develop/testing.html +++ b/docs/develop/testing.html @@ -5,7 +5,7 @@ Testing | Geo Garden Club - + diff --git a/docs/home/food-security.html b/docs/home/food-security.html index 1b471b3f..400ffb89 100644 --- a/docs/home/food-security.html +++ b/docs/home/food-security.html @@ -5,7 +5,7 @@ Food Security | Geo Garden Club - + diff --git a/docs/home/innovations.html b/docs/home/innovations.html index 998ba2f1..43cc7eaf 100644 --- a/docs/home/innovations.html +++ b/docs/home/innovations.html @@ -5,7 +5,7 @@ Design Innovations | Geo Garden Club - + diff --git a/docs/home/related-work.html b/docs/home/related-work.html index eeab951d..c891bb98 100644 --- a/docs/home/related-work.html +++ b/docs/home/related-work.html @@ -5,7 +5,7 @@ Garden Planning Tools | Geo Garden Club - + diff --git a/docs/home/serious-gardeners.html b/docs/home/serious-gardeners.html index c048f292..be7894b2 100644 --- a/docs/home/serious-gardeners.html +++ b/docs/home/serious-gardeners.html @@ -5,7 +5,7 @@ "Serious" Gardeners | Geo Garden Club - + diff --git a/docs/home/sneak-peek.html b/docs/home/sneak-peek.html index 40ba0867..95855b69 100644 --- a/docs/home/sneak-peek.html +++ b/docs/home/sneak-peek.html @@ -5,7 +5,7 @@ Mobile App Sneak Peek | Geo Garden Club - + diff --git a/docs/home/team.html b/docs/home/team.html index 064260f0..3a3782cb 100644 --- a/docs/home/team.html +++ b/docs/home/team.html @@ -5,7 +5,7 @@ The Team | Geo Garden Club - + diff --git a/docs/home/welcome.html b/docs/home/welcome.html index 75fd0b51..fc92d146 100644 --- a/docs/home/welcome.html +++ b/docs/home/welcome.html @@ -5,7 +5,7 @@ Welcome | Geo Garden Club - + diff --git a/docs/user-guide/adding-plantings.html b/docs/user-guide/adding-plantings.html index 64a5df86..343db09a 100644 --- a/docs/user-guide/adding-plantings.html +++ b/docs/user-guide/adding-plantings.html @@ -5,7 +5,7 @@ Add Plantings to Beds | Geo Garden Club - + diff --git a/docs/user-guide/adding-vendors-crops-varieties.html b/docs/user-guide/adding-vendors-crops-varieties.html index b93a38a8..8c728224 100644 --- a/docs/user-guide/adding-vendors-crops-varieties.html +++ b/docs/user-guide/adding-vendors-crops-varieties.html @@ -5,7 +5,7 @@ Add Crops, Varieties, Vendors to the Chapter Database | Geo Garden Club - + diff --git a/docs/user-guide/badges.html b/docs/user-guide/badges.html index 60f8d841..e1aea7bd 100644 --- a/docs/user-guide/badges.html +++ b/docs/user-guide/badges.html @@ -5,7 +5,7 @@ Badges | Geo Garden Club - + diff --git a/docs/user-guide/chat-rooms.html b/docs/user-guide/chat-rooms.html index 48efc09e..66489152 100644 --- a/docs/user-guide/chat-rooms.html +++ b/docs/user-guide/chat-rooms.html @@ -5,7 +5,7 @@ Chat Rooms | Geo Garden Club - + diff --git a/docs/user-guide/define-a-garden.html b/docs/user-guide/define-a-garden.html index d28321aa..3c4368ff 100644 --- a/docs/user-guide/define-a-garden.html +++ b/docs/user-guide/define-a-garden.html @@ -5,7 +5,7 @@ Define a Garden | Geo Garden Club - + diff --git a/docs/user-guide/downloading.html b/docs/user-guide/downloading.html index 1444e70d..d104a8d6 100644 --- a/docs/user-guide/downloading.html +++ b/docs/user-guide/downloading.html @@ -5,7 +5,7 @@ Downloading | Geo Garden Club - + diff --git a/docs/user-guide/explore-a-chapter.html b/docs/user-guide/explore-a-chapter.html index 29501558..966c604b 100644 --- a/docs/user-guide/explore-a-chapter.html +++ b/docs/user-guide/explore-a-chapter.html @@ -5,7 +5,7 @@ Explore a Chapter | Geo Garden Club - + diff --git a/docs/user-guide/explore-a-garden.html b/docs/user-guide/explore-a-garden.html index abb074af..45e2a8e8 100644 --- a/docs/user-guide/explore-a-garden.html +++ b/docs/user-guide/explore-a-garden.html @@ -5,7 +5,7 @@ Explore a Garden | Geo Garden Club - + diff --git a/docs/user-guide/geobot.html b/docs/user-guide/geobot.html index 57bff990..96cf9a76 100644 --- a/docs/user-guide/geobot.html +++ b/docs/user-guide/geobot.html @@ -5,7 +5,7 @@ GeoBot | Geo Garden Club - + diff --git a/docs/user-guide/guided-tour.html b/docs/user-guide/guided-tour.html index c8ab6175..50f4be07 100644 --- a/docs/user-guide/guided-tour.html +++ b/docs/user-guide/guided-tour.html @@ -5,7 +5,7 @@ Frequently Asked (Gardening) Questions | Geo Garden Club - + diff --git a/docs/user-guide/observations.html b/docs/user-guide/observations.html index d65619eb..00126a6f 100644 --- a/docs/user-guide/observations.html +++ b/docs/user-guide/observations.html @@ -5,7 +5,7 @@ Observations | Geo Garden Club - + diff --git a/docs/user-guide/outcomes.html b/docs/user-guide/outcomes.html index 0b1c886d..607b59fb 100644 --- a/docs/user-guide/outcomes.html +++ b/docs/user-guide/outcomes.html @@ -5,7 +5,7 @@ outcomes | Geo Garden Club - + diff --git a/docs/user-guide/overview.html b/docs/user-guide/overview.html index 48b2f685..7c1aab15 100644 --- a/docs/user-guide/overview.html +++ b/docs/user-guide/overview.html @@ -5,7 +5,7 @@ Overview | Geo Garden Club - + diff --git a/docs/user-guide/privacy.html b/docs/user-guide/privacy.html index 8c9a79fe..8de4c185 100644 --- a/docs/user-guide/privacy.html +++ b/docs/user-guide/privacy.html @@ -5,7 +5,7 @@ Privacy Policy | Geo Garden Club - + diff --git a/docs/user-guide/registration.html b/docs/user-guide/registration.html index d2e8e8c3..2068f714 100644 --- a/docs/user-guide/registration.html +++ b/docs/user-guide/registration.html @@ -5,7 +5,7 @@ Registration | Geo Garden Club - + diff --git a/docs/user-guide/scenarios.html b/docs/user-guide/scenarios.html index 99903963..97f98894 100644 --- a/docs/user-guide/scenarios.html +++ b/docs/user-guide/scenarios.html @@ -5,7 +5,7 @@ Planting Scenarios | Geo Garden Club - + diff --git a/docs/user-guide/seeds.html b/docs/user-guide/seeds.html index 1414078b..99dafee4 100644 --- a/docs/user-guide/seeds.html +++ b/docs/user-guide/seeds.html @@ -5,7 +5,7 @@ Seeds | Geo Garden Club - + diff --git a/docs/user-guide/tasks.html b/docs/user-guide/tasks.html index 58108bc3..39b48d22 100644 --- a/docs/user-guide/tasks.html +++ b/docs/user-guide/tasks.html @@ -5,7 +5,7 @@ Tasks | Geo Garden Club - + diff --git a/docs/user-guide/terms-and-conditions.html b/docs/user-guide/terms-and-conditions.html index 4d69fca4..f7d5d0eb 100644 --- a/docs/user-guide/terms-and-conditions.html +++ b/docs/user-guide/terms-and-conditions.html @@ -5,7 +5,7 @@ Terms and Conditions | Geo Garden Club - + diff --git a/index.html b/index.html index 37229b09..e9b2b2c4 100644 --- a/index.html +++ b/index.html @@ -5,7 +5,7 @@ Geo Garden Club | Geo Garden Club - + diff --git a/markdown-page.html b/markdown-page.html index a152616b..9f94e9b5 100644 --- a/markdown-page.html +++ b/markdown-page.html @@ -5,7 +5,7 @@ Markdown page example | Geo Garden Club - +