cbs-bootstrap
Version:
A collection of Bootstrap 5 components for use with TypeScript
267 lines (184 loc) • 8.29 kB
Markdown
# cbs-bootstrap
Hello, and welcome to Custom Bootstrap! This is a resource for developers who use Bootstrap (5.0+) and would like a framework to manage elements.
## Basics
When you import this package into your DOM, you will be given a global constant `CBS` (Custom Bootstrap) which is an instance of `CustomBootstrap`. This constant is the equivalent of `document` in the DOM, it allows you to make elements and manage them.
## `CBS_Element`
A CBS_Element a wrapper around DOM elements where each instance of this class has a `.el` property that is the DOM element that instance represents. Here is the functionality this class provides:
<hr>
### General
`.el: HTMLElement` - The element this class instance represents
- If changed, this will apply every `Listener` and property from `.options` onto the new element.
- Runs `.trigger('element.change')`
`.options: {}` - Options containing `.classes`, `.id`, `.attributes`, and `.style`, along with more depending on the extended class. Used to change many aspects of a class in a quick and efficient manner.
`.id: string` - Id of the object
`.createElementFromText(html)` - Returns an array of all `HTMLElement`s, or `CBS_Element`s created from an html string. See [usage](#cbscreateelementfromtexthtml-string)
- html: `string`
`.hide()` - Adds `d-none` to classes
`.show()` - Removes `d-none` from classes
`.toggleHide()` - Toggles `d-none`
`.isHidden: boolean` - Whether the classes contains `d-none`
`.destroy()` - removes event listeners, destroys all components, and runs `.el.remove()`
`.clone()` - Clones the element
`.clone(listeners)` - Clones the element
- listeners: `boolean` - (default: `true`) clones with the listeners
<hr>
### Elements
`.el: HTMLElement` The element `CBS_Element` represents
Just for ease, I'll use `CBS_Node` to represent `Node|CBS_Element|String|Boolean|Number`
`get .content: CBS_Node[]` - Array of components that were appended to `.el`
`set .content: CBS_Node` - Removes all elements and replaces it with a single one
`set .content: CBS_Node[]` - Removes all elements and replaces them with several (in order)
`.append(...element)` - adds element(s) onto `.el` in order
- element: `CBS_Node`
`.removeElement(...element)` - removes element(s) from `.el`
- element: `CBS_Node`
`.prepend(...element)` - prepends elements (in order) before the first element
- element: `CBS_Node`
`replace(nodeToReplace, ...elementsToAdd)` - replaces a node with one/multiple
- nodeToReplace: `CBS_Node`
- elementsToAdd: `CBS_Node`
`insertBefore(nodeToInsertBefore, ...elementsToAdd)` - inserts multiple/one nodes before another node
- nodeToReplace: `CBS_Node`
- elementsToAdd: `CBS_Node`
`insertAfter(nodeToInsertAfter, ...elementsToAdd)` - inserts multiple/one nodes after another node
`.parent: Node` - The parent of this element
<hr>
### Listeners
Instead of `.addEventListener()` and `.removeEventListener()`, this uses `.on()` and `.off()`
`.listeners: Listener[]` - The list of event listeners that this element has
`.on(event, callback)` - adds an event listener
- event: `string`
- callback: `(event: Event) => {}`
`.on(event, callback, isAsync)` - adds an event listener
- event: `string`
- callback: `(event: Event) => {}`
- isAsync: `boolean` (default: `true`) - Whether this function should be run in async/sync
`.hasListener(event)` - returns whether this element has a listener of that name
- event: `string`
- returns: `boolean`
`.off()` - removes all event listeners
`.off(event)` - removes all events with that name
- event: `string`
`.off(event, callback)` - removes all event listeners with that name and callback
- event: `string`
- callback: `(event: Event) => {}`
`.trigger(event)` - triggers an event
- event: `string`
- returns: `Promise<boolean>` true if there was no error
<hr>
### Classes
`.addClass(...classes)` - Adds classes to `.options` and to classes
- classes: `string`
`.removeClass(...classes)` - Removes classes from `.options` and from classes
- classes: `string`
`.toggleClass(...classes)` - Toggles classes in `.options` and in classes
- classes: `string`
`.classes: string[]` - Array of classes from `.el`
`.clearClasses()` - Removes all classes
`.hasClass(...name)` - Whether the element has that class
- name: `string`
- returns: `boolean`
<hr>
### Parameters
Parameters allow you to edit multiple parts of a `CBS_Element` at once from one method. This is very useful when used in tandem with `CBS.createElementFromText()`
`.parameters: { [key: string]: Node|CBS_Element|String|Boolean|Number }` - Key/value pairs for writable parameters on the object
`.write(key, value)` - Writes that key/value pair onto the element and subElements
- key: `string`
- value: `Node|CBS_Element|String|Boolean|Number`
`.write(key, value, trigger)` - Writes that key/value pair onto the element and subElements
- key: `string`
- value: `Node|CBS_Element|String|Boolean|Number`
- trigger: `boolean` - (default: `true`) Will run `.trigger('parameters.write')`
<hr>
### Padding and Margin
Utilizing Bootstrap's `p-#` and `m-#` classes, CBS_Element contains the following properties:
`.paddingS`: - Padding Start
`.paddingE`: - Padding End
`.paddingT`: - Padding Top
`.paddingB`: - Padding Bottom
`.paddingX`: - Padding X
`.paddingY`: - Padding Y
`.padding`: - Global Padding (deletes all other `.padding[value]` properties)
`.marginS`: - Margin Start
`.marginE`: - Margin End
`.marginT`: - Margin Top
`.marginB`: - Margin Bottom
`.marginX`: - Margin X
`.marginY`: - Margin Y
`.margin`: - Global Margin (deletes all other `.margin[value]` properties)
<hr>
## `CBS_Component`
This is extended off of `CBS_Element` so it keeps all properties above. Similar with `CBS_Element` this only represents a single DOM element, however, it has the property `.subcomponents` which is an object with `CBS_Element|CBS_Component`.
The property `.subcomponents` is useful for Bootstrap elements that require multiple elements, such as cards. For example:
```html
<div class="card">
<div class="card-header">
This would be CBS_Card.subcomponents.header (CBS_CardHeader)
<h3 class="card-title">
My card title
<h3>
</div>
<div class="card-body">
This would be CBS_Card.subcomponents.body (CBS_CardBody)
</div>
<div class="card-footer">
This would be CBS_Card.subcomponents.footer (CBS_CardFooter)
</div>
</div>
```
## Usage
### `CBS.createElementFromText(html: string)`
Create several references to elements in a string. (These will always be in the order that `document.querySelectorAll('*')` will return)
```typescript
const [div, p] = CBS.createElementFromString(`
<div class="m-5">
<p>Hello world!</p>
</div>
`);
// references are kept:
div // <div class="m-5"><p>Hello world!</p></div>
p // <p>Hello world!</p>
```
Create `CBS_Element`s or `CBS_Component`s
```typescript
const [card, h5, p] = CBS.createElementFromString(`
<cbs-card>
<card-header> // CBS_Card.subcomponents.header
<h5>My Card Title!</h5>
</card-header>
<card-body> // CBS_Card.subcomponents.body
<p>My card body!</p>
</card-body>
</cbs-card>
`);
// references:
card // CBS_Card
h5 // <h5>My Card Title!</h5>
p // <p>My card body!</p>
```
Very useful with parameters:
```typescript
const [card, h5] = CBS.createElementFromString(`
<cbs-card>
<card-header>
<h5>What time is it?</h5>
</card-header>
<card-body>
{{time}} // this will not be visible until you write something
</card-body>
</cbs-card>
`);
card.write(new Date().toTimeString()); // will replace all {{time}} with this string
```
Similar to React, you can only create one element, if you want to make multiple, use blank tags
```typescript
const [, p, h5] = CBS.createElementFromString(`
<>
<p></p>
<h5></h5>
</>
`);
```
## Links
- [Main](./markdowns/main.md)
- [Elements](./markdowns/elements.md)