From bd7be07ad3031ff0c635738ba28aaf9c777dc70c Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Tue, 11 Jun 2024 19:25:42 -0700 Subject: [PATCH 01/32] Resolving merge conflicts --- src/guitar-diagrams-config.mjs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/guitar-diagrams-config.mjs b/src/guitar-diagrams-config.mjs index 73a46ca..3b04fd0 100644 --- a/src/guitar-diagrams-config.mjs +++ b/src/guitar-diagrams-config.mjs @@ -63,16 +63,16 @@ export class GuitarDiagramsJSConfig { // ========== BEGIN properties // ----- References /** - * Gets the ID attribute of the canvas HTML tag. - * @return {string} The ID attribute of the canvas HTML tag. + * Gets the ID attribute of the canvas HTML element. + * @return {string} The ID attribute of the canvas HTML element. */ get canvasID() { return this.#canvasID; } // end get canvasID property /** - * Sets the ID attribute of the canvas HTML tag. - * @param {string} paramCanvasID - The ID attribute of the canvas HTML tag. + * Sets the ID attribute of the canvas HTML element. + * @param {string} paramCanvasID - The ID attribute of the canvas HTML element. */ set canvasID(paramCanvasID) { this.#canvasID = paramCanvasID; @@ -104,7 +104,7 @@ export class GuitarDiagramsJSConfig { } // end get colorNut property /** - * Gets the HTML color code of the nut. + * Sets the HTML color code of the nut. * @param {string} paramColorNut - The HTML color code of the nut. */ set colorNut(paramColorNut) { @@ -120,7 +120,7 @@ export class GuitarDiagramsJSConfig { } // end get colorNutOutline property /** - * Gets the HTML color code of the nut outline. + * Sets the HTML color code of the nut outline. * @param {string} paramColorNutOutline - The HTML color code of the nut outline. */ set colorNutOutline(paramColorNutOutline) { From 1fd9a2c8135522b1ac5432ed4889469428a43799 Mon Sep 17 00:00:00 2001 From: Chad Kreiger Date: Fri, 31 May 2024 19:23:51 -0700 Subject: [PATCH 02/32] CanvasID API usage - sample formatting --- docs/index.md | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 7d3c92c..1b238b6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -30,8 +30,29 @@ Lorem ipsum... ### guitar-diagrams-config.js -#### guitar-diagrams-config.js Members +### guitar-diagrams-config.js Members +#### canvasID + +Gets and sets the ID attribute of the canvas HTML tag. + +- **Parameters**: {string} paramCanvasID +- **Return Value**: #canvasID + +*Example:* + +``` +get canvasID() { + return this.#canvasID; + } // end get canvasID property + /** + * Sets the ID attribute of the canvas HTML tag. + * @param {string} paramCanvasID - The ID attribute of the canvas HTML tag. + */ + set canvasID(paramCanvasID) { + this.#canvasID = paramCanvasID; + } // end get canvasID property' +``` #### guitar-diagrams-config.js Methods Lorem ipsum... From 97a5743a1e979222039bfe94b75dae88f80c3093 Mon Sep 17 00:00:00 2001 From: Chad Kreiger Date: Fri, 31 May 2024 19:31:14 -0700 Subject: [PATCH 03/32] Update to the index file sample --- docs/index.md | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/docs/index.md b/docs/index.md index 1b238b6..c0ab92f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -42,16 +42,7 @@ Gets and sets the ID attribute of the canvas HTML tag. *Example:* ``` -get canvasID() { - return this.#canvasID; - } // end get canvasID property - /** - * Sets the ID attribute of the canvas HTML tag. - * @param {string} paramCanvasID - The ID attribute of the canvas HTML tag. - */ - set canvasID(paramCanvasID) { - this.#canvasID = paramCanvasID; - } // end get canvasID property' +gdj1.config.canvasID = 'diagram-1-canvas'; // specify the canvas element's an ID ``` #### guitar-diagrams-config.js Methods From b135ad6e6fb37db1b99e020787a8ff69be46f252 Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Sat, 1 Jun 2024 20:07:08 -0700 Subject: [PATCH 04/32] Updating docs formatting --- .../guitar-diagrams-config.mjs | 8 +- docs/index.md | 80 ++++++++++++++----- 2 files changed, 62 insertions(+), 26 deletions(-) diff --git a/docs/examples/js/guitar-diagrams-js/guitar-diagrams-config.mjs b/docs/examples/js/guitar-diagrams-js/guitar-diagrams-config.mjs index 73a46ca..f04f4e8 100644 --- a/docs/examples/js/guitar-diagrams-js/guitar-diagrams-config.mjs +++ b/docs/examples/js/guitar-diagrams-js/guitar-diagrams-config.mjs @@ -63,16 +63,16 @@ export class GuitarDiagramsJSConfig { // ========== BEGIN properties // ----- References /** - * Gets the ID attribute of the canvas HTML tag. - * @return {string} The ID attribute of the canvas HTML tag. + * Gets the ID attribute of the canvas HTML element. + * @return {string} The ID attribute of the canvas HTML element. */ get canvasID() { return this.#canvasID; } // end get canvasID property /** - * Sets the ID attribute of the canvas HTML tag. - * @param {string} paramCanvasID - The ID attribute of the canvas HTML tag. + * Sets the ID attribute of the canvas HTML element. + * @param {string} paramCanvasID - The ID attribute of the canvas HTML element. */ set canvasID(paramCanvasID) { this.#canvasID = paramCanvasID; diff --git a/docs/index.md b/docs/index.md index c0ab92f..120f18b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -20,42 +20,78 @@ Lorem ipsum... ## API Usage -Lorem ipsum... +Lorem ipsum...some description, if necessary, for the API usage section. + +### `guitar-diagrams.js` Class + +#### `guitar-diagrams.js` Constructors + +Constructor(s) in `guitar-diagrams.js` go here... + +#### `guitar-diagrams.js` Static Public Members + +Static members in `guitar-diagrams.js` go here... (We might need to talk about how to handled these.) -### guitar-diagrams.js +#### `guitar-diagrams.js` Public Properties -#### guitar-diagrams.js Members +Properties in `guitar-diagrams.js` go here... -#### guitar-diagrams.js Methods +#### `guitar-diagrams.js` Public Methods -### guitar-diagrams-config.js +Methods in `guitar-diagrams.js` go here... -### guitar-diagrams-config.js Members +### `guitar-diagrams-config.js` Class -#### canvasID +#### `guitar-diagrams-config.js` Constructors -Gets and sets the ID attribute of the canvas HTML tag. +Constructor(s) in `guitar-diagrams-config.js` go here... -- **Parameters**: {string} paramCanvasID -- **Return Value**: #canvasID +#### `guitar-diagrams-config.js` Public Properties -*Example:* +Properties in `guitar-diagrams-config.js` go here... +##### canvasID (get) + +Exists as a property of the config property on the GuitarDiagrams object. Gets the ID attribute of the canvas HTML element. + +- **Parameters**: {string} The ID attribute of the canvas HTML element. +- **Return Value**: _None_ +- **Default Value**: {string} 'gdjCanvas' + +_Example:_ + +```javascript +gdj1.config.canvasID = 'diagram-1-canvas'; ``` -gdj1.config.canvasID = 'diagram-1-canvas'; // specify the canvas element's an ID + +##### canvasID (set) + +Exists as a property of the config property on the GuitarDiagrams object. Sets the ID attribute of the canvas HTML element. + +- **Parameters**: _None_ +- **Return Value**: {string} The ID attribute of the canvas HTML element. +- **Default Value**: {string} 'gdjCanvas' + +_Example:_ + +```javascript +console.log('Canvas ID: ' + gdj1.config.canvasID); ``` -#### guitar-diagrams-config.js Methods -Lorem ipsum... +#### `guitar-diagrams-config.js` Public Methods -| Name | Description | Parameters | Return Value | Example | Notes | -| ---- | ----------- | ---------- | ------------ | ------- | ----- | -| z | y | x | w | v | u | +_None._ -### Configuration Values +### `guitar-diagrams-marker.js` Class -Lorem ipsum... +#### `guitar-diagrams-marker.js` Constructors + +Constructor(s) in `guitar-diagram-marker.js` go here... (There's only a default constructor as of now.) + +#### `guitar-diagrams-marker.js` Public Properties + +Properties in `guitar-diagrams-marker.js` go here... + +#### `guitar-diagrams-marker.js` Public Methods -| Name | Description | Required | Values | Default | Example | Notes | -| ---- | ----------- | -------- | ------ | ------- | ------- | ----- | -| z | y | x | w | v | u | t | +Methods in `guitar-diagrams-marker.js` go here... From 9ff300f22f65182cce0ed87438d17ef213240592 Mon Sep 17 00:00:00 2001 From: Chad Kreiger Date: Sun, 2 Jun 2024 12:11:06 -0700 Subject: [PATCH 05/32] colorFretboard example attempted --- docs/index.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docs/index.md b/docs/index.md index 120f18b..fb6f165 100644 --- a/docs/index.md +++ b/docs/index.md @@ -77,6 +77,33 @@ _Example:_ ```javascript console.log('Canvas ID: ' + gdj1.config.canvasID); ``` +##### colorFretboard (get) + +Exists as a property of the config property on the GuitarDiagrams object. Gets the HTML color code of the fretboard. + +- **Parameters**: {string} The HTML color code of the fretboard. +- **Return Value**: _None_ +- **Default Value**: {string} '#795548' + +_Example:_ + +```javascript +gdj5.config.colorFretboard = '#FFE0B2'; +``` + +##### colorFretboard (set) + +Exists as a property of the config property on the GuitarDiagrams object. Sets the HTML color code of the fretboard. + +- **Parameters**: _None_ +- **Return Value**: {string} The HTML color code of the fretboard. +- **Default Value**: {string} '#795548' + +_Example:_ + +```javascript +PENDING +``` #### `guitar-diagrams-config.js` Public Methods From ca0c7013bb3d8ee88c73fadd5c9b1acab1dc607c Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Sun, 2 Jun 2024 22:41:09 -0700 Subject: [PATCH 06/32] Fixing missing line in MD --- docs/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/index.md b/docs/index.md index fb6f165..9289773 100644 --- a/docs/index.md +++ b/docs/index.md @@ -77,6 +77,7 @@ _Example:_ ```javascript console.log('Canvas ID: ' + gdj1.config.canvasID); ``` + ##### colorFretboard (get) Exists as a property of the config property on the GuitarDiagrams object. Gets the HTML color code of the fretboard. From 987385b48f995de9569fd85778b9af574bde0fd7 Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Mon, 3 Jun 2024 14:27:06 -0700 Subject: [PATCH 07/32] Tweaking formatting, adding TOC --- docs/index.md | 90 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 59 insertions(+), 31 deletions(-) diff --git a/docs/index.md b/docs/index.md index 9289773..74e57c9 100644 --- a/docs/index.md +++ b/docs/index.md @@ -22,104 +22,132 @@ Lorem ipsum... Lorem ipsum...some description, if necessary, for the API usage section. -### `guitar-diagrams.js` Class - -#### `guitar-diagrams.js` Constructors - -Constructor(s) in `guitar-diagrams.js` go here... - -#### `guitar-diagrams.js` Static Public Members +### Table of Contents + +- [Guitar Diagrams JS Documentation](#guitar-diagrams-js-documentation) + - [Overview](#overview) + - [Getting started](#getting-started) + - [Importing the library into your project](#importing-the-library-into-your-project) + - [Initializing a diagram](#initializing-a-diagram) + - [Creating a diagram with markers](#creating-a-diagram-with-markers) + - [API Usage](#api-usage) + - [Table of Contents](#table-of-contents) + - [`guitar-diagrams.js` Class](#guitar-diagramsjs-class) + - [`guitar-diagrams.js` Constructors (non-default)](#guitar-diagramsjs-constructors-non-default) + - [`guitar-diagrams.js` Static Public Members](#guitar-diagramsjs-static-public-members) + - [`guitar-diagrams.js` Public Properties](#guitar-diagramsjs-public-properties) + - [`guitar-diagrams.js` Public Methods](#guitar-diagramsjs-public-methods) + - [`guitar-diagrams-config.js` Class](#guitar-diagrams-configjs-class) + - [`guitar-diagrams-config.js` Constructors (non-default)](#guitar-diagrams-configjs-constructors-non-default) + - [`guitar-diagrams-config.js` Public Properties](#guitar-diagrams-configjs-public-properties) + - [canvasID (get)](#canvasid-get) + - [canvasID (set)](#canvasid-set) + - [colorFretboard (get)](#colorfretboard-get) + - [colorFretboard (set)](#colorfretboard-set) + - [`guitar-diagrams-config.js` Public Methods](#guitar-diagrams-configjs-public-methods) + - [`guitar-diagrams-marker.js` Class](#guitar-diagrams-markerjs-class) + - [`guitar-diagrams-marker.js` Constructors (non-default)](#guitar-diagrams-markerjs-constructors-non-default) + - [`guitar-diagrams-marker.js` Public Properties](#guitar-diagrams-markerjs-public-properties) + - [`guitar-diagrams-marker.js` Public Methods](#guitar-diagrams-markerjs-public-methods) + +### `guitar-diagrams.js` Class + +#### `guitar-diagrams.js` Constructors (non-default) + +Constructor(s) in `guitar-diagrams.js` go here... or _None._ + +#### `guitar-diagrams.js` Static Public Members Static members in `guitar-diagrams.js` go here... (We might need to talk about how to handled these.) -#### `guitar-diagrams.js` Public Properties +#### `guitar-diagrams.js` Public Properties Properties in `guitar-diagrams.js` go here... -#### `guitar-diagrams.js` Public Methods +#### `guitar-diagrams.js` Public Methods Methods in `guitar-diagrams.js` go here... -### `guitar-diagrams-config.js` Class +### `guitar-diagrams-config.js` Class -#### `guitar-diagrams-config.js` Constructors +#### `guitar-diagrams-config.js` Constructors (non-default) Constructor(s) in `guitar-diagrams-config.js` go here... -#### `guitar-diagrams-config.js` Public Properties +#### `guitar-diagrams-config.js` Public Properties Properties in `guitar-diagrams-config.js` go here... ##### canvasID (get) -Exists as a property of the config property on the GuitarDiagrams object. Gets the ID attribute of the canvas HTML element. +Exists as a property of the config property on the GuitarDiagrams object. Sets the ID attribute of the canvas HTML element. -- **Parameters**: {string} The ID attribute of the canvas HTML element. -- **Return Value**: _None_ +- **Parameters**: _None_ +- **Return Value**: {string} The ID attribute of the canvas HTML element. - **Default Value**: {string} 'gdjCanvas' _Example:_ ```javascript -gdj1.config.canvasID = 'diagram-1-canvas'; +console.log('Canvas ID: ' + gdj1.config.canvasID); ``` ##### canvasID (set) -Exists as a property of the config property on the GuitarDiagrams object. Sets the ID attribute of the canvas HTML element. +Exists as a property of the config property on the GuitarDiagrams object. Gets the ID attribute of the canvas HTML element. -- **Parameters**: _None_ -- **Return Value**: {string} The ID attribute of the canvas HTML element. +- **Parameters**: {string} The ID attribute of the canvas HTML element. +- **Return Value**: _None_ - **Default Value**: {string} 'gdjCanvas' _Example:_ ```javascript -console.log('Canvas ID: ' + gdj1.config.canvasID); +gdj1.config.canvasID = 'diagram-1-canvas'; ``` ##### colorFretboard (get) Exists as a property of the config property on the GuitarDiagrams object. Gets the HTML color code of the fretboard. -- **Parameters**: {string} The HTML color code of the fretboard. -- **Return Value**: _None_ +- **Parameters**: _None_ +- **Return Value**: {string} The HTML color code of the fretboard. - **Default Value**: {string} '#795548' _Example:_ ```javascript -gdj5.config.colorFretboard = '#FFE0B2'; +console.log('Fretboard color: ' + gdj5.config.colorFretboard); ``` ##### colorFretboard (set) Exists as a property of the config property on the GuitarDiagrams object. Sets the HTML color code of the fretboard. -- **Parameters**: _None_ -- **Return Value**: {string} The HTML color code of the fretboard. +- **Parameters**: {string} The HTML color code of the fretboard. +- **Return Value**: _None_ - **Default Value**: {string} '#795548' _Example:_ ```javascript -PENDING +gdj5.config.colorFretboard = '#FFE0B2'; ``` -#### `guitar-diagrams-config.js` Public Methods +#### `guitar-diagrams-config.js` Public Methods _None._ -### `guitar-diagrams-marker.js` Class +### `guitar-diagrams-marker.js` Class -#### `guitar-diagrams-marker.js` Constructors +#### `guitar-diagrams-marker.js` Constructors (non-default) Constructor(s) in `guitar-diagram-marker.js` go here... (There's only a default constructor as of now.) -#### `guitar-diagrams-marker.js` Public Properties +#### `guitar-diagrams-marker.js` Public Properties Properties in `guitar-diagrams-marker.js` go here... -#### `guitar-diagrams-marker.js` Public Methods +#### `guitar-diagrams-marker.js` Public Methods Methods in `guitar-diagrams-marker.js` go here... From cedfa63fbe24e907c2fb88a69b22f0e84c453766 Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Mon, 3 Jun 2024 15:54:54 -0700 Subject: [PATCH 08/32] Moving API Docs to api-docs.md --- README.md | 2 +- docs/api-docs.md | 129 +++++++++++++++++++++++++++++++++++++++++++++ docs/index.md | 132 +---------------------------------------------- 3 files changed, 131 insertions(+), 132 deletions(-) create mode 100644 docs/api-docs.md diff --git a/README.md b/README.md index f6e059d..6e362c7 100644 --- a/README.md +++ b/README.md @@ -151,7 +151,7 @@ See [`docs/code-owners.md`](docs/code-owners.md) for documentation related to de There are no specific requirements[1](#footnotes) for dependencies to use Guitar Diagrams JS other than the standard browser compatibility considerations with CSS, JavaScript, and HTML 5's `` tag. Browser compatibility for the `` tag can be found on [the MDN `` page](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas#browser_compatibility). ----- +--- ## References diff --git a/docs/api-docs.md b/docs/api-docs.md new file mode 100644 index 0000000..e8ed8f1 --- /dev/null +++ b/docs/api-docs.md @@ -0,0 +1,129 @@ +# API Documentation + +Lorem ipsum...some description, if necessary, for the API usage section. + +## Table of Contents + +- [API Documentation](#api-documentation) + - [Table of Contents](#table-of-contents) + - [`guitar-diagrams.js` Class](#guitar-diagramsjs-class) + - [`guitar-diagrams.js` Constructors (non-default)](#guitar-diagramsjs-constructors-non-default) + - [`guitar-diagrams.js` Static Public Members](#guitar-diagramsjs-static-public-members) + - [`guitar-diagrams.js` Public Properties](#guitar-diagramsjs-public-properties) + - [`guitar-diagrams.js` Public Methods](#guitar-diagramsjs-public-methods) + - [`guitar-diagrams-config.js` Class](#guitar-diagrams-configjs-class) + - [`guitar-diagrams-config.js` Constructors (non-default)](#guitar-diagrams-configjs-constructors-non-default) + - [`guitar-diagrams-config.js` Public Properties](#guitar-diagrams-configjs-public-properties) + - [canvasID (get)](#canvasid-get) + - [canvasID (set)](#canvasid-set) + - [colorFretboard (get)](#colorfretboard-get) + - [colorFretboard (set)](#colorfretboard-set) + - [`guitar-diagrams-config.js` Public Methods](#guitar-diagrams-configjs-public-methods) + - [`guitar-diagrams-marker.js` Class](#guitar-diagrams-markerjs-class) + - [`guitar-diagrams-marker.js` Constructors (non-default)](#guitar-diagrams-markerjs-constructors-non-default) + - [`guitar-diagrams-marker.js` Public Properties](#guitar-diagrams-markerjs-public-properties) + - [`guitar-diagrams-marker.js` Public Methods](#guitar-diagrams-markerjs-public-methods) + +--- + +## `guitar-diagrams.js` Class + +### `guitar-diagrams.js` Constructors (non-default) + +Constructor(s) in `guitar-diagrams.js` go here... or _None._ + +### `guitar-diagrams.js` Static Public Members + +Static members in `guitar-diagrams.js` go here... (We might need to talk about how to handled these.) + +### `guitar-diagrams.js` Public Properties + +Properties in `guitar-diagrams.js` go here... + +### `guitar-diagrams.js` Public Methods + +Methods in `guitar-diagrams.js` go here... + +## `guitar-diagrams-config.js` Class + +### `guitar-diagrams-config.js` Constructors (non-default) + +Constructor(s) in `guitar-diagrams-config.js` go here... + +### `guitar-diagrams-config.js` Public Properties + +Properties in `guitar-diagrams-config.js` go here... + +#### canvasID (get) + +Exists as a property of the config property on the GuitarDiagrams object. Sets the ID attribute of the canvas HTML element. + +- **Parameters**: _None_ +- **Return Value**: {string} The ID attribute of the canvas HTML element. +- **Default Value**: {string} 'gdjCanvas' + +_Example:_ + +```javascript +console.log('Canvas ID: ' + gdj1.config.canvasID); +``` + +#### canvasID (set) + +Exists as a property of the config property on the GuitarDiagrams object. Gets the ID attribute of the canvas HTML element. + +- **Parameters**: {string} The ID attribute of the canvas HTML element. +- **Return Value**: _None_ +- **Default Value**: {string} 'gdjCanvas' + +_Example:_ + +```javascript +gdj1.config.canvasID = 'diagram-1-canvas'; +``` + +#### colorFretboard (get) + +Exists as a property of the config property on the GuitarDiagrams object. Gets the HTML color code of the fretboard. + +- **Parameters**: _None_ +- **Return Value**: {string} The HTML color code of the fretboard. +- **Default Value**: {string} '#795548' + +_Example:_ + +```javascript +console.log('Fretboard color: ' + gdj5.config.colorFretboard); +``` + +#### colorFretboard (set) + +Exists as a property of the config property on the GuitarDiagrams object. Sets the HTML color code of the fretboard. + +- **Parameters**: {string} The HTML color code of the fretboard. +- **Return Value**: _None_ +- **Default Value**: {string} '#795548' + +_Example:_ + +```javascript +gdj5.config.colorFretboard = '#FFE0B2'; +``` + +### `guitar-diagrams-config.js` Public Methods + +_None._ + +## `guitar-diagrams-marker.js` Class + +### `guitar-diagrams-marker.js` Constructors (non-default) + +Constructor(s) in `guitar-diagram-marker.js` go here... (There's only a default constructor as of now.) + +### `guitar-diagrams-marker.js` Public Properties + +Properties in `guitar-diagrams-marker.js` go here... + +### `guitar-diagrams-marker.js` Public Methods + +Methods in `guitar-diagrams-marker.js` go here... diff --git a/docs/index.md b/docs/index.md index 74e57c9..5ad2b5b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -20,134 +20,4 @@ Lorem ipsum... ## API Usage -Lorem ipsum...some description, if necessary, for the API usage section. - -### Table of Contents - -- [Guitar Diagrams JS Documentation](#guitar-diagrams-js-documentation) - - [Overview](#overview) - - [Getting started](#getting-started) - - [Importing the library into your project](#importing-the-library-into-your-project) - - [Initializing a diagram](#initializing-a-diagram) - - [Creating a diagram with markers](#creating-a-diagram-with-markers) - - [API Usage](#api-usage) - - [Table of Contents](#table-of-contents) - - [`guitar-diagrams.js` Class](#guitar-diagramsjs-class) - - [`guitar-diagrams.js` Constructors (non-default)](#guitar-diagramsjs-constructors-non-default) - - [`guitar-diagrams.js` Static Public Members](#guitar-diagramsjs-static-public-members) - - [`guitar-diagrams.js` Public Properties](#guitar-diagramsjs-public-properties) - - [`guitar-diagrams.js` Public Methods](#guitar-diagramsjs-public-methods) - - [`guitar-diagrams-config.js` Class](#guitar-diagrams-configjs-class) - - [`guitar-diagrams-config.js` Constructors (non-default)](#guitar-diagrams-configjs-constructors-non-default) - - [`guitar-diagrams-config.js` Public Properties](#guitar-diagrams-configjs-public-properties) - - [canvasID (get)](#canvasid-get) - - [canvasID (set)](#canvasid-set) - - [colorFretboard (get)](#colorfretboard-get) - - [colorFretboard (set)](#colorfretboard-set) - - [`guitar-diagrams-config.js` Public Methods](#guitar-diagrams-configjs-public-methods) - - [`guitar-diagrams-marker.js` Class](#guitar-diagrams-markerjs-class) - - [`guitar-diagrams-marker.js` Constructors (non-default)](#guitar-diagrams-markerjs-constructors-non-default) - - [`guitar-diagrams-marker.js` Public Properties](#guitar-diagrams-markerjs-public-properties) - - [`guitar-diagrams-marker.js` Public Methods](#guitar-diagrams-markerjs-public-methods) - -### `guitar-diagrams.js` Class - -#### `guitar-diagrams.js` Constructors (non-default) - -Constructor(s) in `guitar-diagrams.js` go here... or _None._ - -#### `guitar-diagrams.js` Static Public Members - -Static members in `guitar-diagrams.js` go here... (We might need to talk about how to handled these.) - -#### `guitar-diagrams.js` Public Properties - -Properties in `guitar-diagrams.js` go here... - -#### `guitar-diagrams.js` Public Methods - -Methods in `guitar-diagrams.js` go here... - -### `guitar-diagrams-config.js` Class - -#### `guitar-diagrams-config.js` Constructors (non-default) - -Constructor(s) in `guitar-diagrams-config.js` go here... - -#### `guitar-diagrams-config.js` Public Properties - -Properties in `guitar-diagrams-config.js` go here... - -##### canvasID (get) - -Exists as a property of the config property on the GuitarDiagrams object. Sets the ID attribute of the canvas HTML element. - -- **Parameters**: _None_ -- **Return Value**: {string} The ID attribute of the canvas HTML element. -- **Default Value**: {string} 'gdjCanvas' - -_Example:_ - -```javascript -console.log('Canvas ID: ' + gdj1.config.canvasID); -``` - -##### canvasID (set) - -Exists as a property of the config property on the GuitarDiagrams object. Gets the ID attribute of the canvas HTML element. - -- **Parameters**: {string} The ID attribute of the canvas HTML element. -- **Return Value**: _None_ -- **Default Value**: {string} 'gdjCanvas' - -_Example:_ - -```javascript -gdj1.config.canvasID = 'diagram-1-canvas'; -``` - -##### colorFretboard (get) - -Exists as a property of the config property on the GuitarDiagrams object. Gets the HTML color code of the fretboard. - -- **Parameters**: _None_ -- **Return Value**: {string} The HTML color code of the fretboard. -- **Default Value**: {string} '#795548' - -_Example:_ - -```javascript -console.log('Fretboard color: ' + gdj5.config.colorFretboard); -``` - -##### colorFretboard (set) - -Exists as a property of the config property on the GuitarDiagrams object. Sets the HTML color code of the fretboard. - -- **Parameters**: {string} The HTML color code of the fretboard. -- **Return Value**: _None_ -- **Default Value**: {string} '#795548' - -_Example:_ - -```javascript -gdj5.config.colorFretboard = '#FFE0B2'; -``` - -#### `guitar-diagrams-config.js` Public Methods - -_None._ - -### `guitar-diagrams-marker.js` Class - -#### `guitar-diagrams-marker.js` Constructors (non-default) - -Constructor(s) in `guitar-diagram-marker.js` go here... (There's only a default constructor as of now.) - -#### `guitar-diagrams-marker.js` Public Properties - -Properties in `guitar-diagrams-marker.js` go here... - -#### `guitar-diagrams-marker.js` Public Methods - -Methods in `guitar-diagrams-marker.js` go here... +See the [API Documentation page](api-docs.md) for more information about how to use the API, including constructors (non-default), properties, public methods, and more. From dd66d5809879fbc1fe8224a57440b7f3830410d9 Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Mon, 3 Jun 2024 15:58:52 -0700 Subject: [PATCH 09/32] Updating README.md for split docs --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6e362c7..f84600c 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ You can also install this package manually by downloading it, placing the files ### More Information -For more information, please see the [`docs/index.md`](docs/index.md) and ['docs/examples/index.html`](docs/examples/index.html) pages for API documentation and examples. +For more information, please see the [`docs/index.md`](docs/index.md) and [`docs/api-docs.md`](docs/api-docs.md) pages for general usage help and API documentation. See also the [`docs/examples/index.html`](docs/examples/index.html) page for usage examples. ## Technical Information for Code Owners From 5157f92be608eefc9822cccacdb86c84f1e19d81 Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Mon, 3 Jun 2024 16:10:39 -0700 Subject: [PATCH 10/32] Updating README.md --- README.md | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index f84600c..be1697b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # Guitar Diagrams JS -[![GitHub Release](https://img.shields.io/github/v/release/KCarlile/guitar-diagrams-js?include_prereleases&logo=github&label=Latest%20version)](https://github.com/KCarlile/guitar-diagrams-js/releases) [![GitHub Actions Workflow Status](https://github.com/KCarlile/guitar-diagrams-js/actions/workflows/release-package.yml/badge.svg)](https://github.com/KCarlile/guitar-diagrams-js/actions/workflows/release-package.yml) [![Super-Linter](https://github.com/KCarlile/guitar-diagrams-js/actions/workflows/linting.yml/badge.svg)](https://github.com/marketplace/actions/super-linter) @@ -17,7 +16,7 @@ _Guitar Diagrams JS_ is an open source JavaScript library for drawing guitar chords and scales on an HTML5 canvas. Project: \ -Version: 0.9.2 +Version: [![GitHub Release](https://img.shields.io/github/v/release/KCarlile/guitar-diagrams-js?include_prereleases&logo=github&label=Latest%20version)](https://github.com/KCarlile/guitar-diagrams-js/releases) ### Why should you use Guitar Diagrams JS? @@ -27,12 +26,15 @@ The benefit of Guitar Diagrams JS is that it provides a visual representation of Here are some other comparisons to Guitar Diagrams JS: -| Name | Description | Visual | Graphical | Instrument Representation | No Sheet Music | Cost | -| ---- | ----------- | ------ | --------- | ------------------------- | -------------- | ---- | -| Guitar Diagrams JS | Create diagrams with minimal code and no graphics | ✅ | ✅ | ✅ | ✅ | $0 | -| Tablature (tabs) | Create diagrams manually with text | ✅ | ✅ | ⚠️ | ✅ | $0 | -| Graphic Design Software | Create diagrams manually with a graphic design program | ✅ | ✅ | ⚠️ | ✅ | [\$22.99/month](https://www.adobe.com/products/photoshop/plans.html) | -| Sheet Music | Create sheet music | ✅ | ❌ | ❌ | ❌ | [\$99](https://www.finalemusic.com/products/finale/special-pricing/) or [\$27.99/month](https://www.avid.com/sibelius/sibelius-ultimate-subscriptions?usertype=individual) | +| Name | Description | Visual | Graphical | Instrument Representation | No Sheet Music Reading | Works with Musical Passages | Cost | +| ---- | ----------- | ------ | --------- | ------------------------- | -------------- | ---------------- | ---- | +| Guitar Diagrams JS | Create diagrams with minimal code and no graphics | ✅ | ✅ | ✅ | ✅ | ❌ | $0 | +| Tablature (tabs) | Create diagrams manually with text | ✅ | ✅ | ⚠️ | ✅ | ✅ | $0, but time consuming and error prone | +| Graphic Design Software | Create diagrams manually with a graphic design program | ✅ | ✅ | ⚠️ | ✅ | ❌ | [\$22.99/month](https://www.adobe.com/products/photoshop/plans.html), and very time consuming | +| Sheet Music | Create sheet music | ✅ | ❌ | ❌ | ❌ | ✅ | [\$99](https://www.finalemusic.com/products/finale/special-pricing/) or [\$27.99/month](https://www.avid.com/sibelius/sibelius-ultimate-subscriptions?usertype=individual), and requires music notation proficiency | + +Key: ✅Yes. ⚠️Maybe, sorta, kinda, optional. ❌ No. + ## Project Lead/Owner and Contributors @@ -74,16 +76,16 @@ See the repository's [Releases page](https://github.com/KCarlile/guitar-diagrams For full details, see the Node JS packages released by this project here: -You can install Guitar Diagrams JS in your project as a Node JS dependency via NPM. Run the following command from your project's directory: +You can install Guitar Diagrams JS in your project as a Node JS dependency via NPM. Run the following command from your project's directory where `x.y.z` (e.g., `1.0.2`) is the version (or branch name, such as `main`) of the library you want to use: ```bash -npm install @kcarlile/guitar-diagrams-js@0.9.2 +npm install @kcarlile/guitar-diagrams-js@x.y.z ``` Or, alternately, you can manually edit your `package.json` file and add the following entry: ```json -"@kcarlile/guitar-diagrams-js": "0.9.2", +"@kcarlile/guitar-diagrams-js": "x.y.z", ``` #### Option 2: Manual Installation via CDN From c3a6fa8f4d2ab04355d33c871ec09ee4380c799d Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Mon, 3 Jun 2024 17:29:12 -0700 Subject: [PATCH 11/32] Updating usage documentation --- README.md | 74 ++----------------------- docs/index.md | 147 ++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 140 insertions(+), 81 deletions(-) diff --git a/README.md b/README.md index be1697b..019a1cc 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,6 @@ Here are some other comparisons to Guitar Diagrams JS: Key: ✅Yes. ⚠️Maybe, sorta, kinda, optional. ❌ No. - ## Project Lead/Owner and Contributors ### Project Lead/Owner @@ -56,6 +55,8 @@ GitHub profile: [@KCarlile](https://github.com/KCarlile) Please see the following pages for more information: - [`README.md`](README.md): this page +- [`docs/index.md`](docs/index.md): general usage documentation +- [`docs/api-docs.md`](docs/api-docs.md): API usage documentation - [`docs/index.md`](docs/index.md): main landing page for project documentation - [`docs/api-docs.md`](docs/api-docs.md): API usage documentation - [`docs/code-owner-docs.md`](docs/code-owner-docs.md): technical documentation for code owners @@ -70,76 +71,7 @@ See the repository's [Releases page](https://github.com/KCarlile/guitar-diagrams ## Technical Information for Site Builders -### Usage in Your Project - -#### Option 1: Installation as a Node Dependency - -For full details, see the Node JS packages released by this project here: - -You can install Guitar Diagrams JS in your project as a Node JS dependency via NPM. Run the following command from your project's directory where `x.y.z` (e.g., `1.0.2`) is the version (or branch name, such as `main`) of the library you want to use: - -```bash -npm install @kcarlile/guitar-diagrams-js@x.y.z -``` - -Or, alternately, you can manually edit your `package.json` file and add the following entry: - -```json -"@kcarlile/guitar-diagrams-js": "x.y.z", -``` - -#### Option 2: Manual Installation via CDN - -If you want to use a CDN-hosted package (e.g., Guitar Diagrams JS on JSDelivr at `https://cdn.jsdelivr.net/gh/KCarlile/guitar-diagrams-js@main/guitar-diagrams.js`), you can reference it in your code like this: - -```html -
- -``` - -Be sure to add some target HTML element to your page with a matching ID (`gdj1.addCanvas('diagram-1');` where `diagram-1` is the ID) in your JS code so Guitar Diagrams JS knows where to add your drawing: - -```html -
-``` - -#### Option 3: Manual Installation via Local Copies - -You can also install this package manually by downloading it, placing the files in the correct location, and modifying your site's code to reference the library. The following steps outline this process: - -1. Download the repository files from the [GitHub repository for Guitar Diagrams JS](https://github.com/KCarlile/guitar-diagrams-js). -1. The only files about which you should be concerned are the following: - - `guitar-diagrams.js`: main functionality - - `guitar-diagrams-config.js`: config object - - `guitar-diagrams-marker.js`: marker object -1. Place those files in your application at `wherever/you/put/your/js/files/guitar-diagram-js/`. -1. In the JS file with your primary entrypoint, add an import statement: - - ```javascript - import { GuitarDiagramsJS } from 'wherever/you/put/your/js/files/guitar-diagrams-js/guitar-diagrams.js'; - ``` - -1. Following that import statement, begin to reference the library: - - ```javascript - let gdj1 = new GuitarDiagramsJS(); - gdj1.config.canvasID = 'diagram-1-canvas'; // specify the canvas element's an ID - gdj1.addCanvas('diagram-1'); // add the canvas to the specified element ID on the page - gdj1.drawNeck(); // draw the fretboard - ``` - -1. Be sure to add some target HTML element to your page with a matching ID (`gdj1.addCanvas('diagram-1');` where `diagram-1` is the ID) in your JS code so Guitar Diagrams JS knows where to add your drawing: - - ```html -
- ``` +You can find the full usage documentation at [`docs/index.md`](docs/index.md) and the API documentation at [`docs/api-docs.md`](docs/api-docs.md). The following information is just a high-level overview of how to use Guitar Diagrams JS. ### More Information diff --git a/docs/index.md b/docs/index.md index 5ad2b5b..0f552b6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,23 +1,150 @@ # Guitar Diagrams JS Documentation -## Overview +## Getting Started with Guitar Diagrams JS -Lorem ipsum... +### Importing the Library into Your Project -## Getting started +There are three primary ways to include the Guitar Diagrams JS library into your project: -### Importing the library into your project +1. Install the Guitar Diagrams JS library as a Node JS dependency +1. Reference the Guitar Diagrams JS library from a hosted CDN provider +1. Reference the Guitar Diagrams JS library from a local copy of the JavaScript (JS) files -Lorem ipsum... +#### Option 1: Installation as a Node JS Dependency -### Initializing a diagram +For full details, see the Node JS packages released by this project here: -Lorem ipsum... +You can install Guitar Diagrams JS in your project as a Node JS dependency via NPM. Run the following command from your project's directory where `x.y.z` (e.g., `1.0.2`) is the version (or branch name, such as `main`) of the library you want to use: -### Creating a diagram with markers +```bash +npm install @kcarlile/guitar-diagrams-js@x.y.z +``` -Lorem ipsum... +Or, alternately, you can manually edit your `package.json` file and add the following entry: -## API Usage +```json +"@kcarlile/guitar-diagrams-js": "x.y.z", +``` + +#### Option 2: Manual Reference via CDN-Hosted Files + +If you want to use a CDN-hosted package (e.g., Guitar Diagrams JS on JSDelivr at `https://cdn.jsdelivr.net/gh/KCarlile/guitar-diagrams-js@main/guitar-diagrams.js`), you can reference it in your code like this: + +```html + +``` + +Be sure to add some target HTML element to your page with a matching ID (`gdj1.addCanvas('diagram-1');` where `diagram-1` is the ID) in your JS code so Guitar Diagrams JS knows where to add your drawing: + + ```html +
+ ``` + +#### Option 3: Manual Reference via Local Copies of Files + +You can also install this package manually by downloading it, placing the files in the correct location, and modifying your site's code to reference the library. The following steps outline this process: + +1. Download the repository files from the [GitHub repository for Guitar Diagrams JS](https://github.com/KCarlile/guitar-diagrams-js). +1. The only files about which you should be concerned are the following: + - `guitar-diagrams.js`: main functionality + - `guitar-diagrams-config.js`: config object + - `guitar-diagrams-marker.js`: marker object +1. Place those files in your application at `wherever/you/put/your/js/files/guitar-diagram-js/`. +1. In the JS file with your primary entrypoint, add an import statement: + + ```javascript + + ``` + +1. Be sure to add some target HTML element to your page with a matching ID (`gdj1.addCanvas('diagram-1');` where `diagram-1` is the ID) in your JS code so Guitar Diagrams JS knows where to add your drawing: + + ```html +
+ ``` + +### Leveraging the Guitar Diagrams JS Library in Your Project + +Once you've successfully referenced the library using one of the methods outlined above, you'll need to prepare your HTML and JavaScript to leverage the library. + +#### Specifying the Location of the Diagram + +In your HTML markup, ensure that you have some block-level element (`

`, `

`, etc.) with a unique ID that you can reference from JavaScript, such as: + +```html +
+``` + +Remember the unique ID of this block-level element as you'll be using it in the next section. + +### Initializing a Diagram + +After your import statement, add the JavaScript to associate your block-level element's unique ID with an instance of a Guitar Diagrams JS object, like this: + +```javascript +let gdj1 = new GuitarDiagramsJS(); +gdj1.config.canvasID = 'diagram-1-canvas'; // specify the canvas element's unique ID +gdj1.addCanvas('diagram-1'); // add the canvas to the specified element ID on the page +gdj1.drawNeck(); // draw the fretboard +``` + +This will result in the most basic guitar diagram of a blank fretboard. The following explains what each line does: + +| Line | Code | Description | Notes | +| ---- | ---- | ----------- | ----- | +| 1 | `let gdj1 = new GuitarDiagramsJS();`| Instantiate a new `GuitarDiagramsJS` object and assign it to the `gdj1` variable| | +| 2 | `gdj1.config.canvasID = 'diagram-1-canvas';` | Set the canvasID value of the gdj1's config object to `'diagram-1-canvas'` | `'diagram-1-canvas'` is a unique ID for the `` HTML element that will be added to your HTML within the block-level element. This ID is important so you can reference it later if you want to style the canvas itself. | +| 3 | `gdj1.addCanvas('diagram-1');` | Add the Guitar Diagrams JS HTML `` element to the parent block-level HTML element as specified by the element's unique ID | The ID string being passed here is the one specified in your HTML, like the example above: ```
``` | +| 4 | `gdj1.drawNeck();` | Draw the neck of the diagram with the previously specified parameters | | + +See _Example 1_ on the [Examples page](examples/index.html). + +### Creating a Diagram with Markers + +To add markers to a diagram, after calling `gdj1.drawNeck();`, you'll need to specify those markers and then draw them, like this: + +```javascript +let gdj2 = new GuitarDiagramsJS(); +gdj2.config.canvasID = 'diagram-2-canvas'; +gdj2.config.stringNamesEnabled = true; +gdj2.addCanvas('diagram-2'); +gdj2.drawNeck(); +gdj2.addMarker(1, 1, '1', GuitarDiagramsJS.Shape.Square); // add a square marker on string 1, fret 1, text '1' +gdj2.addMarker(2, 2, '2', GuitarDiagramsJS.Shape.Triangle); // add a triangle marker on string 2, fret 2, text '2' +gdj2.addMarker(3, 3, '3', GuitarDiagramsJS.Shape.Diamond); // add a diamond marker on string 3, fret 3, text '3' +gdj2.addMarker(4, 4, '4'); // add a default (circle) marker on string 4, fret 4, text '4' +gdj2.addMarker(5, 0, '0'); // add a default (circle) marker on string 5, fret 0, text '0' +gdj2.addMarker(6, 0, 'X'); // add a default (circle) marker on string 6, fret 0, text 'X' +gdj2.addMarker(3, 1); // add a default (circle) marker on string 3, fret 1, text empty +gdj2.drawAllMarkers(); // draw the markers +``` + +This will result in a basic guitar fretboard diagram with 7 different markers added. The following explains what each line does: + +| Line | Code | Description | Notes | +| ---- | ---- | ----------- | ----- | +| 1 | `let gdj2 = new GuitarDiagramsJS();`| Instantiate a new `GuitarDiagramsJS` object and assign it to the `gdj1` variable| | +| 2 | `gdj2.config.canvasID = 'diagram-2-canvas';` | Set the canvasID value of the gdj1's config object to `'diagram-2-canvas'` | `'diagram-2-canvas'` is a unique ID for the `` HTML element that will be added to your HTML within the block-level element. This ID is important so you can reference it later if you want to style the canvas itself. | +| 3 | `gdj1.addCanvas('diagram-2');` | Add the Guitar Diagrams JS HTML `` element to the parent block-level HTML element as specified by the element's unique ID | The ID string being passed here is the one specified in your HTML, like the example above, but with a different ID for diagram 2: ```
``` | +| 4 | `gdj1.drawNeck();` | Draw the neck of the diagram with the previously specified parameters | | +| 5 | `gdj2.addMarker(1, 1, '1', GuitarDiagramsJS.Shape.Square);` | Adds a marker on the string 1, fret 1, with text "1", and square shape | | +| 6 | `gdj2.addMarker(2, 2, '2', GuitarDiagramsJS.Shape.Triangle);` | Adds a marker on the string 2, fret 2, with text "2", and triangle shape | | +| 7 | `gdj2.addMarker(3, 3, '3', GuitarDiagramsJS.Shape.Diamond);` | Adds a marker on the string 3, fret 3, with text "3", and diamond shape | | +| 8 | `gdj2.addMarker(4, 4, '4');` | Adds a marker on the string 4, fret 4, with text "4" | If a shape is not specified, circle is the default shape. | +| 9 | `gdj2.addMarker(5, 0, '0');` | Adds a marker on the string 5, fret 0, with text "0" | If a shape is not specified, circle is the default shape. "0" for fret marker indicates an open string. | +| 10 | `gdj2.addMarker(6, 0, 'X');` | Adds a marker on the string 6, fret 0, with text "X" | If a shape is not specified, circle is the default shape. "X" for fret marker indicates a muted string. | +| 11 | `gdj2.addMarker(3, 1);` | Adds a marker on the string 3, fret 1 | If text is not specified, the marker will be blank. If a shape is not specified, circle is the default shape. | +| 12 | `gdj2.drawAllMarkers();` | Draws all of the specified markers on the fretboard | If a specified marker would be rendered beyond the visible fretboard, it will not be rendered and an error will be logged to the console. | + +See _Example 2_ on the [Examples page](examples/index.html). + +See the full [API documentation](api-docs.md) for all of the options for markers. + +## API Usage Details See the [API Documentation page](api-docs.md) for more information about how to use the API, including constructors (non-default), properties, public methods, and more. From d73d8a3895ad6681e381273ff4c772cd24d086ae Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Mon, 3 Jun 2024 17:30:31 -0700 Subject: [PATCH 12/32] Updating usage documentation --- docs/index.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/index.md b/docs/index.md index 0f552b6..19eb8a4 100644 --- a/docs/index.md +++ b/docs/index.md @@ -37,11 +37,11 @@ If you want to use a CDN-hosted package (e.g., Guitar Diagrams JS on JSDelivr at ``` -Be sure to add some target HTML element to your page with a matching ID (`gdj1.addCanvas('diagram-1');` where `diagram-1` is the ID) in your JS code so Guitar Diagrams JS knows where to add your drawing: +Be sure to add some target HTML element to your page with a matching ID (`gdj1.addCanvas('diagram-1');` where `'diagram-1'` is the ID) in your JS code so Guitar Diagrams JS knows where to add your drawing: - ```html -
- ``` +```html +
+``` #### Option 3: Manual Reference via Local Copies of Files @@ -62,7 +62,7 @@ You can also install this package manually by downloading it, placing the files ``` -1. Be sure to add some target HTML element to your page with a matching ID (`gdj1.addCanvas('diagram-1');` where `diagram-1` is the ID) in your JS code so Guitar Diagrams JS knows where to add your drawing: +1. Be sure to add some target HTML element to your page with a matching ID (`gdj1.addCanvas('diagram-1');` where `'diagram-1'` is the ID) in your JS code so Guitar Diagrams JS knows where to add your drawing: ```html
From 2d1074e59c1c6d4c3ccc4678753bec91d5f86a9c Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Mon, 3 Jun 2024 19:21:55 -0700 Subject: [PATCH 13/32] Removing code comments from docs --- docs/index.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/index.md b/docs/index.md index 19eb8a4..51abbd7 100644 --- a/docs/index.md +++ b/docs/index.md @@ -88,9 +88,9 @@ After your import statement, add the JavaScript to associate your block-level el ```javascript let gdj1 = new GuitarDiagramsJS(); -gdj1.config.canvasID = 'diagram-1-canvas'; // specify the canvas element's unique ID -gdj1.addCanvas('diagram-1'); // add the canvas to the specified element ID on the page -gdj1.drawNeck(); // draw the fretboard +gdj1.config.canvasID = 'diagram-1-canvas'; +gdj1.addCanvas('diagram-1'); +gdj1.drawNeck(); ``` This will result in the most basic guitar diagram of a blank fretboard. The following explains what each line does: @@ -114,14 +114,14 @@ gdj2.config.canvasID = 'diagram-2-canvas'; gdj2.config.stringNamesEnabled = true; gdj2.addCanvas('diagram-2'); gdj2.drawNeck(); -gdj2.addMarker(1, 1, '1', GuitarDiagramsJS.Shape.Square); // add a square marker on string 1, fret 1, text '1' -gdj2.addMarker(2, 2, '2', GuitarDiagramsJS.Shape.Triangle); // add a triangle marker on string 2, fret 2, text '2' -gdj2.addMarker(3, 3, '3', GuitarDiagramsJS.Shape.Diamond); // add a diamond marker on string 3, fret 3, text '3' -gdj2.addMarker(4, 4, '4'); // add a default (circle) marker on string 4, fret 4, text '4' -gdj2.addMarker(5, 0, '0'); // add a default (circle) marker on string 5, fret 0, text '0' -gdj2.addMarker(6, 0, 'X'); // add a default (circle) marker on string 6, fret 0, text 'X' -gdj2.addMarker(3, 1); // add a default (circle) marker on string 3, fret 1, text empty -gdj2.drawAllMarkers(); // draw the markers +gdj2.addMarker(1, 1, '1', GuitarDiagramsJS.Shape.Square); +gdj2.addMarker(2, 2, '2', GuitarDiagramsJS.Shape.Triangle); +gdj2.addMarker(3, 3, '3', GuitarDiagramsJS.Shape.Diamond); +gdj2.addMarker(4, 4, '4'); +gdj2.addMarker(5, 0, '0'); +gdj2.addMarker(6, 0, 'X'); +gdj2.addMarker(3, 1); +gdj2.drawAllMarkers(); ``` This will result in a basic guitar fretboard diagram with 7 different markers added. The following explains what each line does: From 00c9ff3e72ba97427e58f6d4d7f048b0e2083362 Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Tue, 4 Jun 2024 19:13:10 -0700 Subject: [PATCH 14/32] Adding temporary Windows symlink for Chad --- .scripts/chad-win-fix.bat | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .scripts/chad-win-fix.bat diff --git a/.scripts/chad-win-fix.bat b/.scripts/chad-win-fix.bat new file mode 100644 index 0000000..b3b138c --- /dev/null +++ b/.scripts/chad-win-fix.bat @@ -0,0 +1,3 @@ +mklink ..\docs\js\guitar-diagrams-js\guitar-diagrams.js ..\guitar-diagrams.js +mklink ..\docs\js\guitar-diagrams-js\guitar-diagrams-config.js ..\guitar-diagrams-config.js +mklink ..\docs\js\guitar-diagrams-js\guitar-diagrams-marker.js ..\guitar-diagrams-marker.js From 3adfa3d065b8f20f2653a4451c650335f968d4fb Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Tue, 4 Jun 2024 19:16:16 -0700 Subject: [PATCH 15/32] Modifying bat file for Windows fix --- .scripts/chad-win-fix.bat | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.scripts/chad-win-fix.bat b/.scripts/chad-win-fix.bat index b3b138c..a7dfeb1 100644 --- a/.scripts/chad-win-fix.bat +++ b/.scripts/chad-win-fix.bat @@ -1,3 +1,5 @@ +echo "Trying to fix Windows symlink issues..." mklink ..\docs\js\guitar-diagrams-js\guitar-diagrams.js ..\guitar-diagrams.js mklink ..\docs\js\guitar-diagrams-js\guitar-diagrams-config.js ..\guitar-diagrams-config.js mklink ..\docs\js\guitar-diagrams-js\guitar-diagrams-marker.js ..\guitar-diagrams-marker.js +pause \ No newline at end of file From 9a787bc431c05cec44ccb0bf736983738143a29c Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Tue, 4 Jun 2024 19:18:44 -0700 Subject: [PATCH 16/32] Fixing paths in bat file --- .scripts/chad-win-fix.bat | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.scripts/chad-win-fix.bat b/.scripts/chad-win-fix.bat index a7dfeb1..efaf010 100644 --- a/.scripts/chad-win-fix.bat +++ b/.scripts/chad-win-fix.bat @@ -1,5 +1,5 @@ echo "Trying to fix Windows symlink issues..." -mklink ..\docs\js\guitar-diagrams-js\guitar-diagrams.js ..\guitar-diagrams.js -mklink ..\docs\js\guitar-diagrams-js\guitar-diagrams-config.js ..\guitar-diagrams-config.js -mklink ..\docs\js\guitar-diagrams-js\guitar-diagrams-marker.js ..\guitar-diagrams-marker.js +mklink ..\docs\examples\js\guitar-diagrams-js\guitar-diagrams.js ..\guitar-diagrams.js +mklink ..\docs\examples\js\guitar-diagrams-js\guitar-diagrams-config.js ..\guitar-diagrams-config.js +mklink ..\docs\examples\js\guitar-diagrams-js\guitar-diagrams-marker.js ..\guitar-diagrams-marker.js pause \ No newline at end of file From 396fcae43ef014a9d5f6abd814a24dac9aa89b36 Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Tue, 4 Jun 2024 19:20:21 -0700 Subject: [PATCH 17/32] Removing files before running win symlink fix --- .scripts/chad-win-fix.bat | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.scripts/chad-win-fix.bat b/.scripts/chad-win-fix.bat index efaf010..7a29c43 100644 --- a/.scripts/chad-win-fix.bat +++ b/.scripts/chad-win-fix.bat @@ -1,4 +1,9 @@ echo "Trying to fix Windows symlink issues..." + +del ..\docs\examples\js\guitar-diagrams-js\guitar-diagrams.js +del ..\docs\examples\js\guitar-diagrams-js\guitar-diagrams-config.js +del ..\docs\examples\js\guitar-diagrams-js\guitar-diagrams-marker.js + mklink ..\docs\examples\js\guitar-diagrams-js\guitar-diagrams.js ..\guitar-diagrams.js mklink ..\docs\examples\js\guitar-diagrams-js\guitar-diagrams-config.js ..\guitar-diagrams-config.js mklink ..\docs\examples\js\guitar-diagrams-js\guitar-diagrams-marker.js ..\guitar-diagrams-marker.js From aaa8d6fb72a6b469c3197db2df744235ab155023 Mon Sep 17 00:00:00 2001 From: Chad Kreiger Date: Tue, 4 Jun 2024 20:44:39 -0700 Subject: [PATCH 18/32] Updated ColorNut and ColorNutOutline --- docs/api-docs.md | 58 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/docs/api-docs.md b/docs/api-docs.md index e8ed8f1..09c13c4 100644 --- a/docs/api-docs.md +++ b/docs/api-docs.md @@ -18,6 +18,10 @@ Lorem ipsum...some description, if necessary, for the API usage section. - [canvasID (set)](#canvasid-set) - [colorFretboard (get)](#colorfretboard-get) - [colorFretboard (set)](#colorfretboard-set) + - [colorNut (get)](#colornut-get) + - [colorNut (set)](#colornut-set) + - [colorNutOutline (get)](#colornutoutline-get) + - [colorNutOutline (set)](#colornutoutline-set) - [`guitar-diagrams-config.js` Public Methods](#guitar-diagrams-configjs-public-methods) - [`guitar-diagrams-marker.js` Class](#guitar-diagrams-markerjs-class) - [`guitar-diagrams-marker.js` Constructors (non-default)](#guitar-diagrams-markerjs-constructors-non-default) @@ -70,7 +74,7 @@ console.log('Canvas ID: ' + gdj1.config.canvasID); #### canvasID (set) -Exists as a property of the config property on the GuitarDiagrams object. Gets the ID attribute of the canvas HTML element. +Exists as a property of the config property on the GuitarDiagrams object. Sets the ID attribute of the canvas HTML element. - **Parameters**: {string} The ID attribute of the canvas HTML element. - **Return Value**: _None_ @@ -110,6 +114,58 @@ _Example:_ gdj5.config.colorFretboard = '#FFE0B2'; ``` +#### colorNut (get) + +Exists as a property of the config property on the GuitarDiagrams object. Gets the HTML color code of the nut. + +- **Parameters**: _None_ +- **Return Value**: {string} The HTML color code of the nut. +- **Default Value**: {string} '#F2F3F4' + +_Example:_ + +NEED EXAMPLE HERE CRK + +#### colorNut (set) + +Exists as a property of the config property on the GuitarDiagrams object. Sets the HTML color code of the nut. + +- **Parameters**: {string} The HTML color code of the nut. +- **Return Value**: _None_ +- **Default Value**: {string} '#F2F3F4' + +_Example:_ + +```javascript +gdj5.config.colorNut = '#FFFFFF'; +``` + +#### colorNutOutline (get) + +Exists as a property of the config property on the GuitarDiagrams object. Gets the HTML color code of the nut outline. + +- **Parameters**: {string} The HTML color code of the nut outline. +- **Return Value**: _None_ +- **Default Value**: {string} '#000000' + +_Example:_ + +NEED EXAMPLE HERE CRK + +#### colorNutOutline (set) + +Exists as a property of the config property on the GuitarDiagrams object. Sets the HTML color code of the nut outline. + +- **Parameters**: {string} The HTML color code of the nut outline. +- **Return Value**: _None_ +- **Default Value**: {string} '#000000' + +_Example:_ + +```javascript +gdj5.config.colorNutOutline = '#7E5109'; +``` + ###
`guitar-diagrams-config.js` Public Methods _None._ From a663477ab16532f6abb86026213f4b2bdf95c667 Mon Sep 17 00:00:00 2001 From: Chad Kreiger Date: Tue, 4 Jun 2024 20:47:04 -0700 Subject: [PATCH 19/32] Small edits chaging Gets to Sets --- .../examples/js/guitar-diagrams-js/guitar-diagrams-config.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/examples/js/guitar-diagrams-js/guitar-diagrams-config.mjs b/docs/examples/js/guitar-diagrams-js/guitar-diagrams-config.mjs index f04f4e8..3b04fd0 100644 --- a/docs/examples/js/guitar-diagrams-js/guitar-diagrams-config.mjs +++ b/docs/examples/js/guitar-diagrams-js/guitar-diagrams-config.mjs @@ -104,7 +104,7 @@ export class GuitarDiagramsJSConfig { } // end get colorNut property /** - * Gets the HTML color code of the nut. + * Sets the HTML color code of the nut. * @param {string} paramColorNut - The HTML color code of the nut. */ set colorNut(paramColorNut) { @@ -120,7 +120,7 @@ export class GuitarDiagramsJSConfig { } // end get colorNutOutline property /** - * Gets the HTML color code of the nut outline. + * Sets the HTML color code of the nut outline. * @param {string} paramColorNutOutline - The HTML color code of the nut outline. */ set colorNutOutline(paramColorNutOutline) { From dc12a499daf4ca1b6961abff68811e66b1659b2a Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Tue, 4 Jun 2024 21:03:49 -0700 Subject: [PATCH 20/32] Removing chad-win-fix.bat script, abandoning this attempt --- .scripts/chad-win-fix.bat | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 .scripts/chad-win-fix.bat diff --git a/.scripts/chad-win-fix.bat b/.scripts/chad-win-fix.bat deleted file mode 100644 index 7a29c43..0000000 --- a/.scripts/chad-win-fix.bat +++ /dev/null @@ -1,10 +0,0 @@ -echo "Trying to fix Windows symlink issues..." - -del ..\docs\examples\js\guitar-diagrams-js\guitar-diagrams.js -del ..\docs\examples\js\guitar-diagrams-js\guitar-diagrams-config.js -del ..\docs\examples\js\guitar-diagrams-js\guitar-diagrams-marker.js - -mklink ..\docs\examples\js\guitar-diagrams-js\guitar-diagrams.js ..\guitar-diagrams.js -mklink ..\docs\examples\js\guitar-diagrams-js\guitar-diagrams-config.js ..\guitar-diagrams-config.js -mklink ..\docs\examples\js\guitar-diagrams-js\guitar-diagrams-marker.js ..\guitar-diagrams-marker.js -pause \ No newline at end of file From f74e9e0afff8c16e60b278ca1afa4d6a75709c8b Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Tue, 4 Jun 2024 21:07:29 -0700 Subject: [PATCH 21/32] Adding JS examples --- docs/api-docs.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/api-docs.md b/docs/api-docs.md index 09c13c4..94a30ba 100644 --- a/docs/api-docs.md +++ b/docs/api-docs.md @@ -111,7 +111,7 @@ Exists as a property of the config property on the GuitarDiagrams object. Sets t _Example:_ ```javascript -gdj5.config.colorFretboard = '#FFE0B2'; +gdj1.config.colorFretboard = '#FFE0B2'; ``` #### colorNut (get) @@ -124,7 +124,9 @@ Exists as a property of the config property on the GuitarDiagrams object. Gets t _Example:_ -NEED EXAMPLE HERE CRK +```javascript +console.log(gdj1.config.colorNut); +``` #### colorNut (set) @@ -137,7 +139,7 @@ Exists as a property of the config property on the GuitarDiagrams object. Sets t _Example:_ ```javascript -gdj5.config.colorNut = '#FFFFFF'; +gdj1.config.colorNut = '#FFFFFF'; ``` #### colorNutOutline (get) @@ -150,7 +152,9 @@ Exists as a property of the config property on the GuitarDiagrams object. Gets t _Example:_ -NEED EXAMPLE HERE CRK +```javascript +console.log(gdj1.config.colorNutOutline); +``` #### colorNutOutline (set) @@ -163,7 +167,7 @@ Exists as a property of the config property on the GuitarDiagrams object. Sets t _Example:_ ```javascript -gdj5.config.colorNutOutline = '#7E5109'; +gdj1.config.colorNutOutline = '#7E5109'; ``` ### `guitar-diagrams-config.js` Public Methods From 83b2a2e788b91940b692d8a331b9645fff77e5ed Mon Sep 17 00:00:00 2001 From: Chad Kreiger Date: Wed, 5 Jun 2024 22:18:37 -0700 Subject: [PATCH 22/32] More get and set properties added to api-docs.md --- docs/api-docs.md | 154 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 152 insertions(+), 2 deletions(-) diff --git a/docs/api-docs.md b/docs/api-docs.md index 94a30ba..7f57ecf 100644 --- a/docs/api-docs.md +++ b/docs/api-docs.md @@ -22,6 +22,16 @@ Lorem ipsum...some description, if necessary, for the API usage section. - [colorNut (set)](#colornut-set) - [colorNutOutline (get)](#colornutoutline-get) - [colorNutOutline (set)](#colornutoutline-set) + - [colorFrets (get)](#colorfrets-get) + - [colorFrets (set)](#colorfrets-set) + - [colorStrings (get)](#colorstrings-get) + - [colorStrings (set)](#colorstrings-set) + - [colorFretMarker (get)](#colorfretmarker-get) + - [colorFretMarker (set)](#colorfretmarker-set) + - [colorDiagramBackground (get)](#colordiagrambackground-get) + - [colorDiagramBackground (set)](#colordiagrambackground-set) + - [colorLabel (get)](#colorlabel-get) + - [colorLabel (set)](#colorlabel-set) - [`guitar-diagrams-config.js` Public Methods](#guitar-diagrams-configjs-public-methods) - [`guitar-diagrams-marker.js` Class](#guitar-diagrams-markerjs-class) - [`guitar-diagrams-marker.js` Constructors (non-default)](#guitar-diagrams-markerjs-constructors-non-default) @@ -146,8 +156,8 @@ gdj1.config.colorNut = '#FFFFFF'; Exists as a property of the config property on the GuitarDiagrams object. Gets the HTML color code of the nut outline. -- **Parameters**: {string} The HTML color code of the nut outline. -- **Return Value**: _None_ +- **Parameters**: _None_ +- **Return Value**: {string} The HTML color code of the nut outline. - **Default Value**: {string} '#000000' _Example:_ @@ -170,6 +180,146 @@ _Example:_ gdj1.config.colorNutOutline = '#7E5109'; ``` +#### colorFrets (get) + +Exists as a property of the config property on the GuitarDiagrams object. Gets the HTML color code of the frets. + +- **Parameters**: _None_ +- **Return Value**: {string} The HTML color code of the frets. +- **Default Value**: {string} '#808B96' + +_Example:_ + +```javascript +console.log(gdj1.config.colorFrets); +``` + +#### colorFrets (set) + +Exists as a property of the config property on the GuitarDiagrams object. Sets the HTML color code of the frets. + +- **Parameters**: {string} The HTML color code of the nut outline. +- **Return Value**: _None_ +- **Default Value**: {string} '#808B96' + +_Example:_ + +```javascript +gdj1.config.colorFrets = '#AEB6BF'; +``` + +#### colorStrings (get) + +Exists as a property of the config property on the GuitarDiagrams object. Gets the HTML color code of the strings. + +- **Parameters**: _None_ +- **Return Value**: {string} The HTML color code of the strings. +- **Default Value**: {string} '#CFD8DC' + +_Example:_ + +```javascript +console.log(gdj1.config.colorStrings); +``` + +#### colorStrings (set) + +Exists as a property of the config property on the GuitarDiagrams object. Sets the HTML color code of the strings. + +- **Parameters**: {string} The HTML color code of the strings. +- **Return Value**: _None_ +- **Default Value**: {string} '#CFD8DC' + +_Example:_ + +```javascript +gdj1.config.colorStrings = '#566573'; +``` + +#### colorFretMarker (get) + +Exists as a property of the config property on the GuitarDiagrams object. Gets the HTML color code of the fret markers. + +- **Parameters**: _None_ +- **Return Value**: {string} The HTML color code of the fret markers. +- **Default Value**: {string} '#FFFFFF' + +_Example:_ + +```javascript +console.log(gdj1.config.colorFretMarker); +``` + +#### colorFretMarker (set) + +Exists as a property of the config property on the GuitarDiagrams object. Sets the HTML color code of the fret markers. + +- **Parameters**: {string} The HTML color code of the fret markers. +- **Return Value**: _None_ +- **Default Value**: {string} '#FFFFFF' + +_Example:_ + +```javascript +gdj1.config.colorFretMarker = '#424949'; +``` + +#### colorDiagramBackground (get) + +Exists as a property of the config property on the GuitarDiagrams object. Gets the HTML color code of the diagram background. + +- **Parameters**: _None_ +- **Return Value**: {string} The HTML color code of the diagram background. +- **Default Value**: {string} null + +_Example:_ + +```javascript +console.log(gdj1.config.colorDiagramBackground); +``` + +#### colorDiagramBackground (set) + +Exists as a property of the config property on the GuitarDiagrams object. Sets the HTML color code of the diagram background. + +- **Parameters**: {string} The HTML color code of the diagram background. +- **Return Value**: _None_ +- **Default Value**: {string} null + +_Example:_ + +```javascript +gdj1.config.colorDiagramBackground = '#000000'; +``` + +#### colorLabel (get) + +Exists as a property of the config property on the GuitarDiagrams object. Gets HTML color code of the label text for string names and fret number. + +- **Parameters**: _None_ +- **Return Value**: {string} The HTML color code of the label text for string names and fret number. +- **Default Value**: {string} '#000000' + +_Example:_ + +```javascript +console.log(gdj1.config.colorLabel); +``` + +#### colorLabel (set) + +Exists as a property of the config property on the GuitarDiagrams object. Sets HTML color code of the label text for string names and fret number. + +- **Parameters**: {string} The HTML color code of the label text for string names and fret number. +- **Return Value**: _None_ +- **Default Value**: {string} '#FFFFFF' + +_Example:_ + +```javascript +gdj1.config.colorDiagramBackground = '#000000'; +``` + ### `guitar-diagrams-config.js` Public Methods _None._ From eb6423c32c99a15d55c86572de55873a99fa5d69 Mon Sep 17 00:00:00 2001 From: Chad Kreiger Date: Fri, 7 Jun 2024 20:10:30 -0700 Subject: [PATCH 23/32] Finished adding the property entries for the config.js file --- docs/api-docs.md | 301 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 299 insertions(+), 2 deletions(-) diff --git a/docs/api-docs.md b/docs/api-docs.md index 7f57ecf..5d01d28 100644 --- a/docs/api-docs.md +++ b/docs/api-docs.md @@ -32,6 +32,26 @@ Lorem ipsum...some description, if necessary, for the API usage section. - [colorDiagramBackground (set)](#colordiagrambackground-set) - [colorLabel (get)](#colorlabel-get) - [colorLabel (set)](#colorlabel-set) + - [markerStrokeWidth (get)](#markerstrokewidth-get) + - [markerStrokeWidth (set)](#markerstrokewidth-set) + - [markerFontSize (get)](#markerfontsize-get) + - [markerFontSize (set)](#markerfontsize-set) + - [fretCount (get)](#fretcount-get) + - [fretCount (set)](#fretcount-set) + - [scaleFactor (get)](#scalefactor-get) + - [scaleFactor (set)](#scalefactor-set) + - [orientHorizontally (get)](#orienthorizontally-get) + - [orientHorizontally (set)](#orienthorizontally-set) + - [fretMarkerEnabled (get)](#fretmarkerenabled-get) + - [fretMarkerEnabled (set)](#fretmarkerenabled-set) + - [fretStartingNumber (get)](#fretstartingnumber-get) + - [fretStartingNumber (set)](#fretstartingnumber-set) + - [stringNamesEnabled (get)](#stringnamesenabled-get) + - [stringNamesEnabled (set)](#stringnamesenabled-set) + - [stringNames (get)](#stringnames-get) + - [stringNames (set)](#stringnames-set) + - [downloadImageEnabled (get)](#downloadimageenabled-get) + - [downloadImageEnabled (set)](#downloadimageenabled-set) - [`guitar-diagrams-config.js` Public Methods](#guitar-diagrams-configjs-public-methods) - [`guitar-diagrams-marker.js` Class](#guitar-diagrams-markerjs-class) - [`guitar-diagrams-marker.js` Constructors (non-default)](#guitar-diagrams-markerjs-constructors-non-default) @@ -312,14 +332,291 @@ Exists as a property of the config property on the GuitarDiagrams object. Sets H - **Parameters**: {string} The HTML color code of the label text for string names and fret number. - **Return Value**: _None_ -- **Default Value**: {string} '#FFFFFF' +- **Default Value**: {string} '#000000' _Example:_ ```javascript -gdj1.config.colorDiagramBackground = '#000000'; +gdj1.config.colorLabel = '#000000'; +``` + +#### markerStrokeWidth (get) + +Exists as a property of the config property on the GuitarDiagrams object. Gets the marker's stroke width. + +- **Parameters**: _None_ +- **Return Value**: {number} The marker's stroke width. +- **Default Value**: {number} 2 + +_Example:_ + +```javascript +console.log(gdj1.markerStrokeWidth); +``` + +#### markerStrokeWidth (set) + +Exists as a property of the config property on the GuitarDiagrams object. Sets the marker's stroke width. + +- **Parameters**: {number} The marker's stroke width. +- **Return Value**: _None_ +- **Default Value**: {number} 2 + +_Example:_ + +```javascript +gdj1.config.markerStrokeWidth = 1; +``` +#### markerFontSize (get) + +Exists as a property of the config property on the GuitarDiagrams object. Gets the marker's font size. + +- **Parameters**: _None_ +- **Return Value**: {number} The marker's font size. +- **Default Value**: {number} 16 + +_Example:_ + +```javascript +console.log(gdj1.config.markerFontSize); +``` + +#### markerFontSize (set) + +Exists as a property of the config property on the GuitarDiagrams object. Sets the marker's font size. + +- **Parameters**: {number} The marker's font size. +- **Return Value**: _None_ +- **Default Value**: {number} 16 + +_Example:_ + +```javascript +gdj1.config.markerFontSize = 10; +``` +#### fretCount (get) + +Exists as a property of the config property on the GuitarDiagrams object. Gets the number of frets on the diagram. + +- **Parameters**: _None_ +- **Return Value**: {number} The number of frets on the diagram. +- **Default Value**: {number} 5 + +_Example:_ + +```javascript +console.log(gdj1.config.fretCount); +``` + +#### fretCount (set) + +Exists as a property of the config property on the GuitarDiagrams object. Sets the number of frets on the diagram. + +- **Parameters**: {number} The number of frets on the diagram. +- **Return Value**: _None_ +- **Default Value**: {number} 5 + +_Example:_ + +```javascript +gdj1.config.fretCount = 3; +``` + +#### scaleFactor (get) + +Exists as a property of the config property on the GuitarDiagrams object. Gets the scale factor of the diagram. + +- **Parameters**: _None_ +- **Return Value**: {number} The scale factor of the diagram. +- **Default Value**: {number} 1 + +_Example:_ + +```javascript +console.log(gdj1.config.scaleFactor); +``` + +#### scaleFactor (set) + +Exists as a property of the config property on the GuitarDiagrams object. Sets the scale factor of the diagram. + +- **Parameters**: {number} The scale factor of the diagram. +- **Return Value**: _None_ +- **Default Value**: {number} 1 + +_Example:_ + +```javascript +gdj1.config.scaleFactor = .6; +``` + +#### orientHorizontally (get) + +Exists as a property of the config property on the GuitarDiagrams object. Gets the horizontal status of the diagram. + +- **Parameters**: _None_ +- **Return Value**: {boolean} The horizontal status of diagram. +- **Default Value**: {boolean} false; + +_Example:_ + +```javascript +console.log(gdj1.config.orientHorizontally); +``` + +#### orientHorizontally (set) + +Exists as a property of the config property on the GuitarDiagrams object. Sets the horizontal status of the diagram. + +- **Parameters**: {boolean} The horizontal status of diagram. +- **Return Value**: _None_ +- **Default Value**: {boolean} false; + +_Example:_ + +```javascript +gdj1.config.orientHorizontally = true; +``` + +#### fretMarkerEnabled (get) + +Exists as a property of the config property on the GuitarDiagrams object. Gets the enabled status of fret markers. + +- **Parameters**: _None_ +- **Return Value**: {boolean} The enabled status of fret markers. +- **Default Value**: {boolean} true; + +_Example:_ + +```javascript +console.log(gdj1.config.fretMarkerEnabled); +``` + +#### fretMarkerEnabled (set) + +Exists as a property of the config property on the GuitarDiagrams object. Sets the enabled status of fret markers. + +- **Parameters**: {boolean} The enabled status of fret markers. +- **Return Value**: _None_ +- **Default Value**: {boolean} true; + +_Example:_ + +```javascript +gdj1.config.fretMarkerEnabled = true; +``` + +#### fretStartingNumber (get) + +Exists as a property of the config property on the GuitarDiagrams object. Gets the starting fret number. + +- **Parameters**: _None_ +- **Return Value**: {number} The starting fret number. +- **Default Value**: {number} 0; + +_Example:_ + +```javascript +console.log(gdj1.config.fretStartingNumber); +``` + +#### fretStartingNumber (set) + +Exists as a property of the config property on the GuitarDiagrams object. Sets the starting fret number. + +- **Parameters**: {number} The starting fret number. +- **Return Value**: _None_ +- **Default Value**: {number} 0; + +_Example:_ + +```javascript +gdj1.config.fretStartingNumber = 3; +``` + +#### stringNamesEnabled (get) + +Exists as a property of the config property on the GuitarDiagrams object. Gets the enabled status of string names. + +- **Parameters**: _None_ +- **Return Value**: {boolean} The enabled status of string names. +- **Default Value**: {boolean} false; + +_Example:_ + +```javascript +console.log(gdj1.config.stringNamesEnabled); +``` + +#### stringNamesEnabled (set) + +Exists as a property of the config property on the GuitarDiagrams object. Sets the enabled status of string names. + +- **Parameters**: {boolean} The enabled status of string names. +- **Return Value**: _None_ +- **Default Value**: {boolean} false; + +_Example:_ + +```javascript +gdj1.config.stringNamesEnabled = true; ``` +#### stringNames (get) + +Exists as a property of the config property on the GuitarDiagrams object. Gets the array of string names. + +- **Parameters**: _None_ +- **Return Value**: {array} The array of string names. +- **Default Value**: {array} ['E','A','D','G','B','e']; + +_Example:_ + +```javascript +console.log(gdj1.config.stringNames); +``` + +#### stringNames (set) + +Exists as a property of the config property on the GuitarDiagrams object. Sets the array of string names. + +- **Parameters**: {array} The array of string names. +- **Return Value**: _None_ +- **Default Value**: {array} ['E','A','D','G','B','e']; + +_Example:_ + +```javascript +gdj1.config.stringNames = ['D','A','D','G']; +``` + +#### downloadImageEnabled (get) + +Exists as a property of the config property on the GuitarDiagrams object. Gets the enabled status of the download image button. + +- **Parameters**: _None_ +- **Return Value**: {boolean} The enabled status of the download image button. +- **Default Value**: {boolean} false; + +_Example:_ + +```javascript +console.log(gdj1.config.downloadImageEnabled); +``` + +#### downloadImageEnabled (set) + +Exists as a property of the config property on the GuitarDiagrams object. Sets the enabled status of the download image button. + +- **Parameters**: {boolean} The enabled status of the download image button. +- **Return Value**: _None_ +- **Default Value**: {boolean} false; + +_Example:_ + +```javascript +gdj1.config.downloadImageEnabled = true; +``` ### `guitar-diagrams-config.js` Public Methods _None._ From 457926fa46b25e755e08a076ddba6f73c8ba0ff5 Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Tue, 11 Jun 2024 12:05:37 -0700 Subject: [PATCH 24/32] Fixing markdown syntax issues --- docs/api-docs.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/api-docs.md b/docs/api-docs.md index 5d01d28..b99c021 100644 --- a/docs/api-docs.md +++ b/docs/api-docs.md @@ -176,7 +176,7 @@ gdj1.config.colorNut = '#FFFFFF'; Exists as a property of the config property on the GuitarDiagrams object. Gets the HTML color code of the nut outline. -- **Parameters**: _None_ +- **Parameters**: _None_ - **Return Value**: {string} The HTML color code of the nut outline. - **Default Value**: {string} '#000000' @@ -286,7 +286,7 @@ gdj1.config.colorFretMarker = '#424949'; #### colorDiagramBackground (get) -Exists as a property of the config property on the GuitarDiagrams object. Gets the HTML color code of the diagram background. +Exists as a property of the config property on the GuitarDiagrams object. Gets the HTML color code of the diagram background. - **Parameters**: _None_ - **Return Value**: {string} The HTML color code of the diagram background. @@ -300,7 +300,7 @@ console.log(gdj1.config.colorDiagramBackground); #### colorDiagramBackground (set) -Exists as a property of the config property on the GuitarDiagrams object. Sets the HTML color code of the diagram background. +Exists as a property of the config property on the GuitarDiagrams object. Sets the HTML color code of the diagram background. - **Parameters**: {string} The HTML color code of the diagram background. - **Return Value**: _None_ @@ -367,6 +367,7 @@ _Example:_ ```javascript gdj1.config.markerStrokeWidth = 1; ``` + #### markerFontSize (get) Exists as a property of the config property on the GuitarDiagrams object. Gets the marker's font size. @@ -394,6 +395,7 @@ _Example:_ ```javascript gdj1.config.markerFontSize = 10; ``` + #### fretCount (get) Exists as a property of the config property on the GuitarDiagrams object. Gets the number of frets on the diagram. @@ -617,6 +619,7 @@ _Example:_ ```javascript gdj1.config.downloadImageEnabled = true; ``` + ### `guitar-diagrams-config.js` Public Methods _None._ From d9016c46e638065401c54d2557c818c6ac3b9deb Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Wed, 12 Jun 2024 10:42:12 -0700 Subject: [PATCH 25/32] Changed array copy to deep copy --- src/guitar-diagrams.mjs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/guitar-diagrams.mjs b/src/guitar-diagrams.mjs index b9357ae..c7400ee 100644 --- a/src/guitar-diagrams.mjs +++ b/src/guitar-diagrams.mjs @@ -154,7 +154,7 @@ export class GuitarDiagramsJS { let stringNamesIndent = this.#config.fretStartingNumber == 0 ? 0 : fretNumberFontSize; let posX; let posY; - let stringNames = this.#config.stringNames; + let stringNames = [...this.#config.stringNames]; // deep copy array // vertical draws string names left to right, but horizontal needs to draw them bottom to top if (this.#config.orientHorizontally == true) { @@ -561,13 +561,13 @@ export class GuitarDiagramsJS { const controlClass = 'guitar-diagrams-control'; const controlClassPrefix = 'guitar-diagrams-'; - let canvasElement = document.getElementById(this.#config.canvasID); + const canvasElement = document.getElementById(this.#config.canvasID); - let controlsDiv = document.createElement('div'); + const controlsDiv = document.createElement('div'); controlsDiv.style = 'display: block; margin-top: .5em'; canvasElement.insertAdjacentElement('afterend', controlsDiv); - // add the controls in reverse order of display order + // add the controls in reverse order of desired display order (last to first) // other controls go here /* if (this.#config.someFeatureEnabled) { From af67ac88a256eec461976e159cf2a8ab6f0d08c3 Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Wed, 12 Jun 2024 12:57:35 -0700 Subject: [PATCH 26/32] Improving documentation for code owners --- .github/workflows/demo-hosting.yml | 2 +- .github/workflows/linting.yml | 2 +- .github/workflows/release-package.yml | 3 +- README.md | 21 ++++++----- docs/code-owner-docs.md | 48 +++++++++++++++++++++++--- guitar-diagrams-js-demo.png | Bin 0 -> 68103 bytes 6 files changed, 60 insertions(+), 16 deletions(-) create mode 100644 guitar-diagrams-js-demo.png diff --git a/.github/workflows/demo-hosting.yml b/.github/workflows/demo-hosting.yml index ea5e698..0d11cc0 100644 --- a/.github/workflows/demo-hosting.yml +++ b/.github/workflows/demo-hosting.yml @@ -1,4 +1,4 @@ -name: Deploy examples directory to demo.kcarlile.com on main branch releases +name: Deploy docs/examples/* to demo hosting on: release: diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 766b2bb..d5c5188 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -1,4 +1,4 @@ -name: Linting +name: Lint codebase on: # yamllint disable-line rule:truthy push: diff --git a/.github/workflows/release-package.yml b/.github/workflows/release-package.yml index f897b06..0f35012 100644 --- a/.github/workflows/release-package.yml +++ b/.github/workflows/release-package.yml @@ -1,8 +1,9 @@ -name: Node.js Package +name: Build and publish to NPM on: release: types: [created] + branches: [main] jobs: build: diff --git a/README.md b/README.md index 019a1cc..cf0cfb1 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,11 @@ _Guitar Diagrams JS_ is an open source JavaScript library for drawing guitar chords and scales on an HTML5 canvas. -Project: \ -Version: [![GitHub Release](https://img.shields.io/github/v/release/KCarlile/guitar-diagrams-js?include_prereleases&logo=github&label=Latest%20version)](https://github.com/KCarlile/guitar-diagrams-js/releases) +**Project:** \ +**Version:** [![GitHub Release](https://img.shields.io/github/v/release/KCarlile/guitar-diagrams-js?include_prereleases&logo=github&label=Latest%20version)](https://github.com/KCarlile/guitar-diagrams-js/releases)\ +**Demo:** + +![Guitar Diagrams JS demo image](guitar-diagrams-js-demo.png) ### Why should you use Guitar Diagrams JS? @@ -65,23 +68,23 @@ Please see the following pages for more information: - [`docs/CONTRIBUTING.md`](docs/CONTRIBUTING.md): instructions for contributing to the project - [`LICENSE`](LICENSE): license file for the project -## Change Log +### Site Builders - Technical Information -See the repository's [Releases page](https://github.com/KCarlile/guitar-diagrams-js/releases) for each release and associated release notes. +You can find the full usage documentation at [`docs/index.md`](docs/index.md) and the API documentation at [`docs/api-docs.md`](docs/api-docs.md). The following information is just a high-level overview of how to use Guitar Diagrams JS. -## Technical Information for Site Builders +#### Change Log -You can find the full usage documentation at [`docs/index.md`](docs/index.md) and the API documentation at [`docs/api-docs.md`](docs/api-docs.md). The following information is just a high-level overview of how to use Guitar Diagrams JS. +See the repository's [Releases page](https://github.com/KCarlile/guitar-diagrams-js/releases) for each release and associated release notes. -### More Information +#### More Information For more information, please see the [`docs/index.md`](docs/index.md) and [`docs/api-docs.md`](docs/api-docs.md) pages for general usage help and API documentation. See also the [`docs/examples/index.html`](docs/examples/index.html) page for usage examples. -## Technical Information for Code Owners +### Code Owners - Technical Information See [`docs/code-owners.md`](docs/code-owners.md) for documentation related to development and deployment. -## Dependency Requirements +### Dependency Requirements There are no specific requirements[1](#footnotes) for dependencies to use Guitar Diagrams JS other than the standard browser compatibility considerations with CSS, JavaScript, and HTML 5's `` tag. Browser compatibility for the `` tag can be found on [the MDN `` page](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas#browser_compatibility). diff --git a/docs/code-owner-docs.md b/docs/code-owner-docs.md index 4c291ec..5659884 100644 --- a/docs/code-owner-docs.md +++ b/docs/code-owner-docs.md @@ -13,9 +13,13 @@ This documentation page is for code owners to understand the technical details o - [`linting.sh`](#lintingsh) - [`package-check.sh`](#package-checksh) - [`super-linter.sh`](#super-lintersh) + - [GitHub Actions](#github-actions) + - [Demo Hosting](#demo-hosting) + - [Important Note](#important-note) - [Building, Packaging, and Releasing](#building-packaging-and-releasing) - [Local Builds and Releases](#local-builds-and-releases) - [Releases](#releases) + - [Versioning](#versioning) ## Directory Structure @@ -51,7 +55,7 @@ This section outlines the directory structure of the project. - `code-owner-docs.md`: This document. - `CONTRIBUTING.md`: Community guidelines for contributing to the project. - `index.md`: Main documentation landing page. - - `index.html`: Documentation with demonstrations of examples for how to use the projet. + - `index.html`: Documentation with demonstrations of examples for how to use the project. - `testing.html`: Testing page used for development. - `src/`: Contains development files. - `guitar-diagrams.mjs`: Main entry point for the project. @@ -96,6 +100,30 @@ This script calls the `npx publint` to check the `package.json` file for correct This script starts a Docker container to run a local version of Super-Linter for linting HTML, CSS, JS, and Markdown. This can be run as part of the `build.sh` script by running `npm run build` from the root of the project. +## GitHub Actions + +There are three workflows defined for GitHub Actions and those exist at the following location: + +- `.github/` + - `workflows/` + - `demo-hosting.yml` + - `linting.yml` + - `release-package.yml` + +| File Name | Workflow Name | Trigger(s) | Branch(es) | Description | +| --------- | ------------- | ---------- | ---------- | ----------- | +| Deploy docs/examples/* to demo hosting | `demo-hosting.yml` | Release published | `main` | Copies `docs/examples/*` to @KCarlile's personal GoDaddy hosting via FTP for public demo of functionality at . | +| Lint codebase | `linting.yml` | Push, PR | `main`, `develop` | Runs Super-Linter against HTML, CSS, JS, and Markdown files in the codebase when code is pushed to `main` or `develop` and when a PR is created against `main` or `develop`. | +| Build and publish to NPM | `release-package.yml` | Release created | `main` | Builds and publishes the project to NPM when release are created on `main`. | + +## Demo Hosting + +Whenever a release is published, a GitHub Actions workflow runs to FTP the contents of the `docs/examples/` directory to @KCarlile's personal GoDaddy hosting account. This is so the demo examples can be easily viewed by anyone at . + +### Important Note + +The `.scripts/build.sh` script, which is run by calling `npm run build` from the root of the project, copies the JavaScript files from `src/*.mjs` to `docs/examples/js/guitar-diagrams-js/` for local reference for the demo page (`docs/examples/index.html`). + ## Building, Packaging, and Releasing ### Local Builds and Releases @@ -107,8 +135,20 @@ This script starts a Docker container to run a local version of Super-Linter for ## Releases -When you have enough features and bugs merged to justify a release, create a PR from the `develop` branch into `main` branch. -Once that is merged, use the [Release page](https://github.com/KCarlile/guitar-diagrams-js/releases) to create a new release which will kick off a new package deployment using the GitHub Action workflow defined in `.github/workflows/release-package.yml`. +When enough changes (bugs and new features) have been merged into the `develop` branch to warrant a new version, create a release with a new version number. + +1. Create a PR from the `develop` branch into `main` branch. +1. Once that PR is merged into `main`, checkout `main` locally and pull to get the latest changes. Then, update the version number in `package.json` in your local `main` branch and commit, then push back up to GitHub. (Release creation will fail if the version in `package.json` is not the same as the version you are creating.) +1. Use the [Release page](https://github.com/KCarlile/guitar-diagrams-js/releases) to create a new release which will kick off a new package deployment using the GitHub Action workflow defined in `.github/workflows/release-package.yml`. + Once the workflow has completed successfully, the package will be hosted on the [Packages page](https://github.com/KCarlile/guitar-diagrams-js/pkgs/npm/guitar-diagrams-js). -See also [`docs/examples/js/guitar-diagrams-js/README.md`](docs/examples/js/guitar-diagrams-js/README.md) for information about symlinks for local testing and demo deployment information. +### Versioning + +Guitar Diagrams JS uses [semantic versioning](https://semver.org/) with version numbers in the format of X.Y.Z. + +| Number | Release Significance | Description | Example | +| ------ | -------------------- | ----------- | ------- | +| X | Major | A change in major version denotes new features (and bug fixes) that break backward compatibility. | `1.5.1` :arrow_right: `2.0.0` | +| Y | Minor | A change in minor version denotes new features (and bug fixes) that retain backward compatibility. | `1.5.1` :arrow_right: `1.6.0` | +| Z | Patch | A change in patch version denotes bug fixes (no new features) that retain backward compatibility. | `1.5.1` :arrow_right: `1.5.2` | diff --git a/guitar-diagrams-js-demo.png b/guitar-diagrams-js-demo.png new file mode 100644 index 0000000000000000000000000000000000000000..d8d327f5e567aa08ad56a98bb9a573871444f79e GIT binary patch literal 68103 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 literal 0 HcmV?d00001 From ab0c209bc052a5509cc1547e89ff6f8a736966d0 Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Wed, 12 Jun 2024 12:58:31 -0700 Subject: [PATCH 27/32] Fixing broken link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cf0cfb1..a96d291 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ For more information, please see the [`docs/index.md`](docs/index.md) and [`docs ### Code Owners - Technical Information -See [`docs/code-owners.md`](docs/code-owners.md) for documentation related to development and deployment. +See [`docs/code-owner-docs.md`](docs/code-owner-docs.md) for documentation related to development and deployment. ### Dependency Requirements From 273ad8cd0a5ca69ae42ac82eedf11f9929d77225 Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Wed, 12 Jun 2024 13:00:52 -0700 Subject: [PATCH 28/32] Updating README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a96d291..5994ab2 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,8 @@ GitHub profile: [@KCarlile](https://github.com/KCarlile) If you contribute to the project in any way (code, documentation, testing, etc.), your name will appear in the list of contributors below: -- Kenny Carlile (project lead/owner) +- @KCarlile (project lead/owner) +- @ckreiger1 - _Your name here_ ## Documentation and Examples From 816cc891ccbcf669544c1d26606c15b428e9e879 Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Wed, 12 Jun 2024 16:17:04 -0700 Subject: [PATCH 29/32] Renaming addCanvas() method to addCanvasToElement() --- docs/examples/index.html | 14 +++++++------- .../js/guitar-diagrams-js/guitar-diagrams.mjs | 12 ++++++------ docs/examples/js/main.js | 12 ++++++------ docs/examples/js/testing.js | 2 +- docs/index.md | 12 ++++++------ src/guitar-diagrams.mjs | 4 ++-- 6 files changed, 28 insertions(+), 28 deletions(-) diff --git a/docs/examples/index.html b/docs/examples/index.html index c4f8428..65808b2 100644 --- a/docs/examples/index.html +++ b/docs/examples/index.html @@ -27,7 +27,7 @@

Preface - Setup

<div id="diagram-1"></div>

That div's ID doesn't need to be diagram-1 as shown, but it needs to be a unique name that you will reference later on in your code, like this:

-
gdj1.addCanvas('diagram-1');
+
gdj1.addCanvasToElement('diagram-1');
@@ -41,7 +41,7 @@

Example 1 - Basic fretboard

Code
let gdj1 = new GuitarDiagramsJS();
 gdj1.config.canvasID = 'diagram-1-canvas'; // specify the canvas element's an ID
-gdj1.addCanvas('diagram-1'); // add the canvas to the specified element ID on the page
+gdj1.addCanvasToElement('diagram-1'); // add the canvas to the specified element ID on the page
 gdj1.drawNeck(); // draw the fretboard
@@ -62,7 +62,7 @@
Code
let gdj2 = new GuitarDiagramsJS();
 gdj2.config.canvasID = 'diagram-2-canvas';
 gdj2.config.stringNamesEnabled = true;
-gdj2.addCanvas('diagram-2');
+gdj2.addCanvasToElement('diagram-2');
 gdj2.drawNeck();
 gdj2.addMarker(1, 1, '1', GuitarDiagramsJS.Shape.Square); // add a square marker on string 1, fret 1, text '1'
 gdj2.addMarker(2, 2, '2', GuitarDiagramsJS.Shape.Triangle); // add a triangle marker on string 2, fret 2, text '2'
@@ -99,7 +99,7 @@ 
Code
gdj3.config.fretStartingNumber = 3; // set starting fret gdj3.config.stringNames = ['D','A','D','G']; // set string names and count gdj3.config.fretCount = 3; // set starting fret -gdj3.addCanvas('diagram-3'); +gdj3.addCanvasToElement('diagram-3'); gdj3.drawNeck(); gdj3.addMarker(1, 1, '1', GuitarDiagramsJS.Shape.Square); gdj3.addMarker(2, 2, '2', GuitarDiagramsJS.Shape.Triangle); @@ -135,7 +135,7 @@
Code
let gdj4 = new GuitarDiagramsJS();
 gdj4.config.canvasID = 'diagram-4-canvas';
 gdj4.config.scaleFactor = .6; // set scaling factor (.6 == 60%)
-gdj4.addCanvas('diagram-4');
+gdj4.addCanvasToElement('diagram-4');
 gdj4.drawNeck();
 gdj4.addMarker(1, 1, '1', GuitarDiagramsJS.Shape.Square);
 gdj4.addMarker(2, 2, '2', GuitarDiagramsJS.Shape.Triangle);
@@ -189,7 +189,7 @@ 
Code
gdj5.config.colorLabel = '#FFFFFF'; // specify the label color for string names and starting fret gdj5.config.markerStrokeWidth = 1; // specify the marker's stroke width gdj5.config.markerFontSize = 10; // specify the marker text's font size -gdj5.addCanvas('diagram-5'); +gdj5.addCanvasToElement('diagram-5'); gdj5.drawNeck(); gdj5.addMarker(1, 1, '1', GuitarDiagramsJS.Shape.Square); gdj5.addMarker(2, 2, '2', GuitarDiagramsJS.Shape.Triangle); @@ -224,7 +224,7 @@
Code
gdj6.config.controlsEnabled = true; gdj6.config.downloadImageEnabled = true; gdj6.config.changeOrientationEnabled = true; -gdj6.addCanvas('diagram-6'); +gdj6.addCanvasToElement('diagram-6'); gdj6.drawNeck(); gdj6.addMarker(1, 1, '1', GuitarDiagramsJS.Shape.Square); gdj6.addMarker(2, 2, '2', GuitarDiagramsJS.Shape.Triangle); diff --git a/docs/examples/js/guitar-diagrams-js/guitar-diagrams.mjs b/docs/examples/js/guitar-diagrams-js/guitar-diagrams.mjs index b9357ae..e114173 100644 --- a/docs/examples/js/guitar-diagrams-js/guitar-diagrams.mjs +++ b/docs/examples/js/guitar-diagrams-js/guitar-diagrams.mjs @@ -154,7 +154,7 @@ export class GuitarDiagramsJS { let stringNamesIndent = this.#config.fretStartingNumber == 0 ? 0 : fretNumberFontSize; let posX; let posY; - let stringNames = this.#config.stringNames; + let stringNames = [...this.#config.stringNames]; // deep copy array // vertical draws string names left to right, but horizontal needs to draw them bottom to top if (this.#config.orientHorizontally == true) { @@ -561,13 +561,13 @@ export class GuitarDiagramsJS { const controlClass = 'guitar-diagrams-control'; const controlClassPrefix = 'guitar-diagrams-'; - let canvasElement = document.getElementById(this.#config.canvasID); + const canvasElement = document.getElementById(this.#config.canvasID); - let controlsDiv = document.createElement('div'); + const controlsDiv = document.createElement('div'); controlsDiv.style = 'display: block; margin-top: .5em'; canvasElement.insertAdjacentElement('afterend', controlsDiv); - // add the controls in reverse order of display order + // add the controls in reverse order of desired display order (last to first) // other controls go here /* if (this.#config.someFeatureEnabled) { @@ -667,9 +667,9 @@ export class GuitarDiagramsJS { * Adds the canvas element to the parent element with the specified ID. * @param {string} paramParentElementID - The parent element's ID to which the canvas element will be added. */ - addCanvas(paramParentElementID) { + addCanvasToElement(paramParentElementID) { document.getElementById(paramParentElementID).appendChild(this.getCanvasElement()); - } // end addCanvas method + } // end addCanvasToElement method /** * Sets the canvas element's ID for an existing canvas. diff --git a/docs/examples/js/main.js b/docs/examples/js/main.js index 7251d7d..143b2b5 100644 --- a/docs/examples/js/main.js +++ b/docs/examples/js/main.js @@ -13,7 +13,7 @@ import { GuitarDiagramsJS } from './guitar-diagrams-js/guitar-diagrams.mjs'; // ========== BEGIN example 1 let gdj1 = new GuitarDiagramsJS(); gdj1.config.canvasID = 'diagram-1-canvas'; // specify the canvas element's an ID -gdj1.addCanvas('diagram-1'); // add the canvas to the specified element ID on the page +gdj1.addCanvasToElement('diagram-1'); // add the canvas to the specified element ID on the page gdj1.drawNeck(); // draw the fretboard // ========== END example 1 @@ -21,7 +21,7 @@ gdj1.drawNeck(); // draw the fretboard let gdj2 = new GuitarDiagramsJS(); gdj2.config.canvasID = 'diagram-2-canvas'; gdj2.config.stringNamesEnabled = true; -gdj2.addCanvas('diagram-2'); +gdj2.addCanvasToElement('diagram-2'); gdj2.drawNeck(); gdj2.addMarker(1, 1, '1', GuitarDiagramsJS.Shape.Square); // add a square marker on string 1, fret 1, text '1' gdj2.addMarker(2, 2, '2', GuitarDiagramsJS.Shape.Triangle); // add a triangle marker on string 2, fret 2, text '2' @@ -41,7 +41,7 @@ gdj3.config.orientHorizontally = true; // set horizontal orientation gdj3.config.fretStartingNumber = 3; // set starting fret gdj3.config.stringNames = ['D','A','D','G']; // set string names and count gdj3.config.fretCount = 3; // set starting fret -gdj3.addCanvas('diagram-3'); +gdj3.addCanvasToElement('diagram-3'); gdj3.drawNeck(); gdj3.addMarker(1, 1, '1', GuitarDiagramsJS.Shape.Square); gdj3.addMarker(2, 2, '2', GuitarDiagramsJS.Shape.Triangle); @@ -57,7 +57,7 @@ gdj3.drawAllMarkers(); let gdj4 = new GuitarDiagramsJS(); gdj4.config.canvasID = 'diagram-4-canvas'; gdj4.config.scaleFactor = .6; // set scaling factor (.6 == 60%) -gdj4.addCanvas('diagram-4'); +gdj4.addCanvasToElement('diagram-4'); gdj4.drawNeck(); gdj4.addMarker(1, 1, '1', GuitarDiagramsJS.Shape.Square); gdj4.addMarker(2, 2, '2', GuitarDiagramsJS.Shape.Triangle); @@ -84,7 +84,7 @@ gdj5.config.colorDiagramBackground = '#000000'; // specify the diagram backgroun gdj5.config.colorLabel = '#FFFFFF'; // specify the label color for string names and starting fret gdj5.config.markerStrokeWidth = 1; // specify the marker's stroke width gdj5.config.markerFontSize = 10; // specify the marker text's font size -gdj5.addCanvas('diagram-5'); +gdj5.addCanvasToElement('diagram-5'); gdj5.drawNeck(); gdj5.addMarker(1, 1, '1', GuitarDiagramsJS.Shape.Square); gdj5.addMarker(2, 2, '2', GuitarDiagramsJS.Shape.Triangle); @@ -103,7 +103,7 @@ gdj6.config.stringNamesEnabled = true; gdj6.config.controlsEnabled = true; gdj6.config.downloadImageEnabled = true; gdj6.config.changeOrientationEnabled = true; -gdj6.addCanvas('diagram-6'); +gdj6.addCanvasToElement('diagram-6'); gdj6.drawNeck(); gdj6.addMarker(1, 1, '1', GuitarDiagramsJS.Shape.Square); gdj6.addMarker(2, 2, '2', GuitarDiagramsJS.Shape.Triangle); diff --git a/docs/examples/js/testing.js b/docs/examples/js/testing.js index b49fa94..02c4683 100644 --- a/docs/examples/js/testing.js +++ b/docs/examples/js/testing.js @@ -22,7 +22,7 @@ gdjTesting.config.enableAllControls(); //gdjTesting.config.changeOrientationEnabled = true; //gdj4.config.scaleFactor = .5; -gdjTesting.addCanvas('diagram-testing'); +gdjTesting.addCanvasToElement('diagram-testing'); gdjTesting.drawNeck(); gdjTesting.addMarker(1, 1, '1', GuitarDiagramsJS.Shape.Square); gdjTesting.addMarker(2, 2, '2', GuitarDiagramsJS.Shape.Triangle); diff --git a/docs/index.md b/docs/index.md index 51abbd7..ffae2c4 100644 --- a/docs/index.md +++ b/docs/index.md @@ -37,7 +37,7 @@ If you want to use a CDN-hosted package (e.g., Guitar Diagrams JS on JSDelivr at ``` -Be sure to add some target HTML element to your page with a matching ID (`gdj1.addCanvas('diagram-1');` where `'diagram-1'` is the ID) in your JS code so Guitar Diagrams JS knows where to add your drawing: +Be sure to add some target HTML element to your page with a matching ID (`gdj1.addCanvasToElement('diagram-1');` where `'diagram-1'` is the ID) in your JS code so Guitar Diagrams JS knows where to add your drawing: ```html
@@ -62,7 +62,7 @@ You can also install this package manually by downloading it, placing the files ``` -1. Be sure to add some target HTML element to your page with a matching ID (`gdj1.addCanvas('diagram-1');` where `'diagram-1'` is the ID) in your JS code so Guitar Diagrams JS knows where to add your drawing: +1. Be sure to add some target HTML element to your page with a matching ID (`gdj1.addCanvasToElement('diagram-1');` where `'diagram-1'` is the ID) in your JS code so Guitar Diagrams JS knows where to add your drawing: ```html
@@ -89,7 +89,7 @@ After your import statement, add the JavaScript to associate your block-level el ```javascript let gdj1 = new GuitarDiagramsJS(); gdj1.config.canvasID = 'diagram-1-canvas'; -gdj1.addCanvas('diagram-1'); +gdj1.addCanvasToElement('diagram-1'); gdj1.drawNeck(); ``` @@ -99,7 +99,7 @@ This will result in the most basic guitar diagram of a blank fretboard. The foll | ---- | ---- | ----------- | ----- | | 1 | `let gdj1 = new GuitarDiagramsJS();`| Instantiate a new `GuitarDiagramsJS` object and assign it to the `gdj1` variable| | | 2 | `gdj1.config.canvasID = 'diagram-1-canvas';` | Set the canvasID value of the gdj1's config object to `'diagram-1-canvas'` | `'diagram-1-canvas'` is a unique ID for the `` HTML element that will be added to your HTML within the block-level element. This ID is important so you can reference it later if you want to style the canvas itself. | -| 3 | `gdj1.addCanvas('diagram-1');` | Add the Guitar Diagrams JS HTML `` element to the parent block-level HTML element as specified by the element's unique ID | The ID string being passed here is the one specified in your HTML, like the example above: ```
``` | +| 3 | `gdj1.addCanvasToElement('diagram-1');` | Add the Guitar Diagrams JS HTML `` element to the parent block-level HTML element as specified by the element's unique ID | The ID string being passed here is the one specified in your HTML, like the example above: ```
``` | | 4 | `gdj1.drawNeck();` | Draw the neck of the diagram with the previously specified parameters | | See _Example 1_ on the [Examples page](examples/index.html). @@ -112,7 +112,7 @@ To add markers to a diagram, after calling `gdj1.drawNeck();`, you'll need to sp let gdj2 = new GuitarDiagramsJS(); gdj2.config.canvasID = 'diagram-2-canvas'; gdj2.config.stringNamesEnabled = true; -gdj2.addCanvas('diagram-2'); +gdj2.addCanvasToElement('diagram-2'); gdj2.drawNeck(); gdj2.addMarker(1, 1, '1', GuitarDiagramsJS.Shape.Square); gdj2.addMarker(2, 2, '2', GuitarDiagramsJS.Shape.Triangle); @@ -130,7 +130,7 @@ This will result in a basic guitar fretboard diagram with 7 different markers ad | ---- | ---- | ----------- | ----- | | 1 | `let gdj2 = new GuitarDiagramsJS();`| Instantiate a new `GuitarDiagramsJS` object and assign it to the `gdj1` variable| | | 2 | `gdj2.config.canvasID = 'diagram-2-canvas';` | Set the canvasID value of the gdj1's config object to `'diagram-2-canvas'` | `'diagram-2-canvas'` is a unique ID for the `` HTML element that will be added to your HTML within the block-level element. This ID is important so you can reference it later if you want to style the canvas itself. | -| 3 | `gdj1.addCanvas('diagram-2');` | Add the Guitar Diagrams JS HTML `` element to the parent block-level HTML element as specified by the element's unique ID | The ID string being passed here is the one specified in your HTML, like the example above, but with a different ID for diagram 2: ```
``` | +| 3 | `gdj1.addCanvasToElement('diagram-2');` | Add the Guitar Diagrams JS HTML `` element to the parent block-level HTML element as specified by the element's unique ID | The ID string being passed here is the one specified in your HTML, like the example above, but with a different ID for diagram 2: ```
``` | | 4 | `gdj1.drawNeck();` | Draw the neck of the diagram with the previously specified parameters | | | 5 | `gdj2.addMarker(1, 1, '1', GuitarDiagramsJS.Shape.Square);` | Adds a marker on the string 1, fret 1, with text "1", and square shape | | | 6 | `gdj2.addMarker(2, 2, '2', GuitarDiagramsJS.Shape.Triangle);` | Adds a marker on the string 2, fret 2, with text "2", and triangle shape | | diff --git a/src/guitar-diagrams.mjs b/src/guitar-diagrams.mjs index c7400ee..e114173 100644 --- a/src/guitar-diagrams.mjs +++ b/src/guitar-diagrams.mjs @@ -667,9 +667,9 @@ export class GuitarDiagramsJS { * Adds the canvas element to the parent element with the specified ID. * @param {string} paramParentElementID - The parent element's ID to which the canvas element will be added. */ - addCanvas(paramParentElementID) { + addCanvasToElement(paramParentElementID) { document.getElementById(paramParentElementID).appendChild(this.getCanvasElement()); - } // end addCanvas method + } // end addCanvasToElement method /** * Sets the canvas element's ID for an existing canvas. From 3d963a263d3c6e93ff2d5c01442cf7cbd785cd83 Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Wed, 12 Jun 2024 17:04:35 -0700 Subject: [PATCH 30/32] Updating README.md with example sites and instructions --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 5994ab2..c3ce67e 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,15 @@ Please see the following pages for more information: - [`docs/CONTRIBUTING.md`](docs/CONTRIBUTING.md): instructions for contributing to the project - [`LICENSE`](LICENSE): license file for the project +### Site Builder Examples + +If you're a site builder using Guitar Diagrams JS, your site should be featured here as an example of how to use this library. Please [submit an Issue](https://github.com/KCarlile/guitar-diagrams-js/issues/new/choose) with a link to your site, plus any links to specific pages using Guitar Diagrams JS, and it will be added to the list below. + +**Example sites:** + +- [Guitar Diagrams JS demo/examples](https://demo.kcarlile.com/guitar-diagrams-js/) +- _Your site here!_ + ### Site Builders - Technical Information You can find the full usage documentation at [`docs/index.md`](docs/index.md) and the API documentation at [`docs/api-docs.md`](docs/api-docs.md). The following information is just a high-level overview of how to use Guitar Diagrams JS. From 67bbe17ac1f8788b8b14ab6e089b204842ffecb1 Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Wed, 12 Jun 2024 21:15:14 -0700 Subject: [PATCH 31/32] Updating issue templates and links. --- .github/ISSUE_TEMPLATE/01-bug-report.md | 10 +++++++--- .github/ISSUE_TEMPLATE/02-feature-request.md | 4 ++-- .github/ISSUE_TEMPLATE/03-usage-submission.md | 20 +++++++++++++++++++ README.md | 2 +- docs/code-owner-docs.md | 1 + 5 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/03-usage-submission.md diff --git a/.github/ISSUE_TEMPLATE/01-bug-report.md b/.github/ISSUE_TEMPLATE/01-bug-report.md index dc2e58b..99ff939 100644 --- a/.github/ISSUE_TEMPLATE/01-bug-report.md +++ b/.github/ISSUE_TEMPLATE/01-bug-report.md @@ -1,7 +1,7 @@ --- -name: Bug report -about: Create a report to help us improve -title: "[Bug]" +name: Bug +about: Submit a bug describing a problematic behavior +title: "[Bug title]" labels: bug assignees: '' @@ -11,6 +11,10 @@ assignees: '' A description of the bug and how you found it, including steps to reproduce and notable parameters such as browser and OS. Also include how the system should have behaved. Provide screenshots if applicable. +## Steps to Reproduce + +Describe the steps to reproduce the issue. + ## Acceptance Criteria - Bulleted list of what would constitute this bug being resolved diff --git a/.github/ISSUE_TEMPLATE/02-feature-request.md b/.github/ISSUE_TEMPLATE/02-feature-request.md index 179deb7..6566ede 100644 --- a/.github/ISSUE_TEMPLATE/02-feature-request.md +++ b/.github/ISSUE_TEMPLATE/02-feature-request.md @@ -1,7 +1,7 @@ --- name: Feature request -about: Feature Request or Enhancement -title: "[Feature or enhancement request]" +about: Submit a new feature idea or enhancement request +title: "[Feature or enhancement request title]" labels: enhancement assignees: '' diff --git a/.github/ISSUE_TEMPLATE/03-usage-submission.md b/.github/ISSUE_TEMPLATE/03-usage-submission.md new file mode 100644 index 0000000..efe3fb6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/03-usage-submission.md @@ -0,0 +1,20 @@ +--- +name: Usage submission +about: Submit a site using this project as an example of usage +title: "[Site name]" +labels: usage +assignees: '' + +--- + +## Site + +Provide the URL for your site. + +## Usage Examples + +Provide a list of any URLs for pages within your site that demonstrate usage of the project. + +## Comments + +Add any other comments or thoughts about your usage of the project. diff --git a/README.md b/README.md index c3ce67e..5969149 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ Please see the following pages for more information: ### Site Builder Examples -If you're a site builder using Guitar Diagrams JS, your site should be featured here as an example of how to use this library. Please [submit an Issue](https://github.com/KCarlile/guitar-diagrams-js/issues/new/choose) with a link to your site, plus any links to specific pages using Guitar Diagrams JS, and it will be added to the list below. +If you're a site builder using Guitar Diagrams JS, your site should be featured here as an example of how to use this library. Please [submit an issue of Usage Submission type](https://github.com/KCarlile/guitar-diagrams-js/issues/new?labels=usage&template=03-usage-submission.md&title=%5BSite%20name%5D) with a link to your site, plus any links to specific pages using Guitar Diagrams JS, and it will be added to the list below. **Example sites:** diff --git a/docs/code-owner-docs.md b/docs/code-owner-docs.md index 5659884..8fc73d2 100644 --- a/docs/code-owner-docs.md +++ b/docs/code-owner-docs.md @@ -32,6 +32,7 @@ This section outlines the directory structure of the project. - `ISSUE_TEMPLATE/`: Markdown files for GitHub issue templates. - `01-bug-report.md`: Template for GitHub issues of type bug. - `02-feature-request.md`: Template for GitHub issues of type feature request. + - `03-usage-submission.md`: Template for GitHub issues of type usage submission. - `config.yml`: GitHub Actions config. - `workflows/`: YML files to define GitHub Actions. - `demo-hosting.yml`: GitHub Actions workflow to deploy `examples/` content to GoDaddy hosting for demos. From e9784aea7c94598db0b8360db3eaec18ddfba3cb Mon Sep 17 00:00:00 2001 From: Kenny Carlile Date: Wed, 12 Jun 2024 21:23:43 -0700 Subject: [PATCH 32/32] Fixing MD validation --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5969149..4057b6d 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,8 @@ Please see the following pages for more information: ### Site Builder Examples -If you're a site builder using Guitar Diagrams JS, your site should be featured here as an example of how to use this library. Please [submit an issue of Usage Submission type](https://github.com/KCarlile/guitar-diagrams-js/issues/new?labels=usage&template=03-usage-submission.md&title=%5BSite%20name%5D) with a link to your site, plus any links to specific pages using Guitar Diagrams JS, and it will be added to the list below. +If you're a site builder using Guitar Diagrams JS, your site should be featured here as an example of how to use this library. +Please [submit an issue of Usage Submission type](https://github.com/KCarlile/guitar-diagrams-js/issues/new?labels=usage&template=03-usage-submission.md&title=%5BSite%20name%5D) with a link to your site, plus any links to specific pages using Guitar Diagrams JS, and it will be added to the list below. **Example sites:**