Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
199 commits
Select commit Hold shift + click to select a range
14f24d5
refactor(item): change events types and calbacks to present tense
piraz Dec 26, 2023
54f4753
build: deliver 0.1.10
piraz Dec 26, 2023
2f67dad
chore(dependencies): bump axios to 1.6.8
piraz May 13, 2024
0933e39
chore(dependencies): bump bootstrap to 5.3.3
piraz May 13, 2024
67f7ccf
chore(dependencies): bump solid-js to 1.8.17
piraz May 13, 2024
a0d553d
chore(dependencies): bump esbuild 0.21.2
piraz May 13, 2024
2e2c1da
chore(dependencies): bump prettier to 3.2.5
piraz May 13, 2024
58eb838
chore(dependencies): bump ts-jest to 29.1.2
piraz May 13, 2024
d4195ff
build(dependencies): bump typescript to 5.4.5
piraz May 13, 2024
a9f16b6
build(dependencies): bump types/jest to 29.5.12
piraz May 13, 2024
d3ce20c
build(dependencies): bump @testing-library/jest-dom to 6.4.5
piraz May 13, 2024
d375389
build(dependencies): bump @testing-library/dom to 10.1.0
piraz May 13, 2024
5208f43
build(test): remove karma test
piraz May 13, 2024
7d961e8
build(scope): replace esbuild-jest for esbuild-jest2
piraz May 14, 2024
f44f2b6
build(release): deliver 0.1.11
piraz May 14, 2024
ec52993
refactor: handle faz item extra classes as an array
piraz May 24, 2024
a143dca
feat(form): add basic form with the new structure
piraz May 24, 2024
4e6b582
fix: return correctly first 9 characters as random id
michael-lins May 20, 2024
338c654
build: add showcase back to the project
piraz May 30, 2024
c66a6ae
build(release): deliver 0.1.12
piraz May 30, 2024
6867f16
build: bump axios to 1.7.7
piraz Sep 22, 2024
0ac99b4
build: bump typescript to 5.6.2
piraz Sep 23, 2024
d36ba38
build: bump esbuild to 0.24.0
piraz Sep 23, 2024
d3ba646
build: bump @types/jest to 29.5.13
piraz Sep 23, 2024
de4bcaf
build: bump @types/lodash to 4.17.7
piraz Sep 23, 2024
20b6c7c
build: bump @testing-library/dom to 10.4.0
piraz Sep 23, 2024
7d90451
buildl: bump @testing-library/jest-dom to 6.5.0
piraz Sep 23, 2024
c1048fa
build(release): deliver 0.1.13
piraz Sep 23, 2024
ea97ee6
refactor: get solid back as base of FazElementItem
piraz Sep 24, 2024
7333289
build: replace jest by vitest
piraz Sep 24, 2024
047a04d
build: add node 22 to the test matrix
piraz Sep 24, 2024
1ad4f3b
build(release): deliver 0.0.14
piraz Sep 25, 2024
cf40085
refactor: storing accessor and setter direcly instead of signal
piraz Sep 25, 2024
6af0d2f
build(release): delivel 0.1.15
piraz Sep 25, 2024
186bca9
build(ts): use tsc to generate types
piraz Sep 25, 2024
a5fed89
build(release): deliver 0.1.16
piraz Sep 25, 2024
643b413
fix: types was pointing to the wrong file
piraz Sep 25, 2024
91a0cc0
build(release): deliver 0.1.17
piraz Sep 25, 2024
690207d
build: add types to the list of directories to be published
piraz Sep 25, 2024
c129993
build(release): deliver 0.1.18
piraz Sep 25, 2024
6c8f8c3
refactor: convert several properties to solid-js
piraz Sep 25, 2024
b3d3fdf
build(release): deliver 0.1.19
piraz Sep 25, 2024
550ad53
fix: wrap connectedCallback execution into a setTimeout
piraz Sep 27, 2024
51dd4cc
fix: fix test execution and types generation
piraz Sep 27, 2024
34cd850
build(release): deliver 0.1.20
piraz Sep 27, 2024
1ea63b9
refactor: remove createEvent method from FazElementItem
piraz Sep 28, 2024
0009920
build(deps): add vite as dependencie and remove unused ones
piraz Sep 28, 2024
c7d99f5
chore(types): update form and item types
piraz Sep 28, 2024
931ab40
build(release): deliver 0.1.21
piraz Sep 28, 2024
283a592
fix: return only the active item
piraz Sep 28, 2024
2113fe9
build(release): deliver 0.1.22
piraz Sep 28, 2024
7bc8db4
refactor: back with semicolons
piraz Sep 29, 2024
2c274a9
build(relase): deliver 0.1.23
piraz Sep 29, 2024
0dd4cba
feat: changed contentChild to contentChildren
piraz Sep 29, 2024
170cbca
build(release): deliver 0.1.24
piraz Sep 29, 2024
b201a6f
chore: update item types
piraz Sep 29, 2024
571de9e
refactor: revert contentChildren to contentChild
piraz Sep 29, 2024
64e3ffe
build(release): deliver 0.1.25
piraz Sep 29, 2024
352d0ba
feat: remove faz tag by default
piraz Oct 7, 2024
d90341d
refactor: change debug attribute to signal
piraz Oct 7, 2024
60dfaa1
build(release): deliver 0.1.26
piraz Oct 7, 2024
878a380
build(deps): bump solid-js to 1.9.2
piraz Oct 9, 2024
57be9e4
build(deps): bump typescript to 5.6.3
piraz Oct 9, 2024
21b14b8
build(deps): bump @types/node to 22.7.5
piraz Oct 9, 2024
58016eb
build(deps): bump vitest to 2.1.2
piraz Oct 9, 2024
eadffba
fix: force after show to run just once
piraz Oct 9, 2024
5853bc0
build(release): deliver 0.1.27
piraz Oct 9, 2024
f428b0b
fix: all render methods will run only when the item is loading
piraz Oct 9, 2024
14c6142
build(release): deliver 0.1.28
piraz Oct 9, 2024
f26343c
chore: update item type map
piraz Oct 9, 2024
8265f6b
build(deps): bump vite to 5.4.9
piraz Oct 15, 2024
047d428
build(deps): bump vitest to 2.1.3
piraz Oct 15, 2024
5f20d02
refactor: rename items to fazChild property in FazElementItem
piraz Oct 15, 2024
41212e0
build(release): deliver 0.1.29
piraz Oct 15, 2024
f63b052
build(deps): bump solid-js to 1.9.3
piraz Nov 29, 2024
f9b20e5
build(deps): remove codemirror by now
piraz Nov 29, 2024
f2e003c
build(deps): bump prettier to 3.4.1
piraz Nov 29, 2024
fbcba59
build(deps): bump typescript to 5.7.2
piraz Nov 29, 2024
da3f0ab
build(deps): bump vite to 6.0.1
piraz Nov 29, 2024
6e4fd0b
refactor(global): remove codemirror from global
piraz Nov 29, 2024
f9a03bb
refactor(global): update types after removal of codemirror
piraz Nov 29, 2024
8e5c390
build(deps): bump prettier to 3.4.2
piraz Dec 24, 2024
649b660
build(deps): bump esbuild 0.24.2
piraz Dec 24, 2024
f6915cd
build(deps): bump vite to 6.0.5
piraz Dec 24, 2024
06d4f7f
build(deps): bump testing-library/jest-dom to 6.6.3
piraz Dec 24, 2024
ae7aeb4
build(deps): bump types/jest to 29.5.14
piraz Dec 24, 2024
dfa4f43
build(deps): bump types/node to 22.10.2
piraz Dec 24, 2024
f61ab29
build(deps): bump vite-plugin-solid to 2.11.0
piraz Dec 24, 2024
e3aecc1
build(deps): bump vitest to 2.1.8
piraz Dec 24, 2024
1f1df7a
build(release): deliver 0.1.30
piraz Dec 24, 2024
8327051
fix: remove faz tag after rendering
piraz Dec 30, 2024
6e1b176
build(deps): add axios and nise to the project
piraz Dec 30, 2024
9d8d73f
chore(showcase): update watch script to start the showcase app
piraz Dec 30, 2024
c8a4a0a
chore: update item types
piraz Dec 30, 2024
a85a2d9
build(relase): deliver 0.1.31
piraz Dec 30, 2024
6509003
refactor(from): change errors to be key value instead of an array
piraz Jan 1, 2025
022568a
chore(form): update form types
piraz Jan 1, 2025
4c43efd
build(release): deliver 0.1.32
piraz Jan 1, 2025
7ab761f
refactor: rename FazElementItem to FazElement
piraz Jan 3, 2025
ed9e0ce
build(release): deliver 0.2.0
piraz Jan 3, 2025
be0f10c
fix(element): add comment at the connectCallback
piraz Jan 4, 2025
4e161c4
build(release): deliver 0.2.1
piraz Jan 4, 2025
36f9b04
chore(element): update element types
piraz Jan 4, 2025
3018f0f
build(deps): bump less to 4.2.1
piraz Jan 5, 2025
30c7242
build(deps): bump axios to 1.7.9
piraz Jan 5, 2025
0b53671
build(deps): bump @types/node to 22.10.5
piraz Jan 5, 2025
5f2ff4e
build(deps): bump vite to 6.0.7
piraz Jan 5, 2025
0f663f9
chore(types): add correct JSX reference to faz-elements.d.ts
piraz Jan 5, 2025
edd91a3
build(release): deliver 0.2.2
piraz Jan 5, 2025
2e30f79
build: set yarn to 4.8.1
piraz Apr 7, 2025
7a005e7
build: enable corepack
piraz Apr 7, 2025
520793f
build: use npm set version instead of instaling via npm install
piraz Apr 7, 2025
5ce1d85
build(deps): bump solid-js to 1.9.5
piraz Apr 7, 2025
cb84a30
build(deps): bump less to 4.3.0
piraz Apr 7, 2025
d87da9a
build(deps): bump @types/node to 22.14.0
piraz Apr 7, 2025
d107534
build(deps): bump axios to 1.8.4
piraz Apr 7, 2025
b9a9e46
build(deps): bump esbuild to 0.25.2
piraz Apr 7, 2025
fc31001
build(deps): bump jsdom to 26.0.0
piraz Apr 7, 2025
b095acf
build(deps): bump prettier to 3.5.3
piraz Apr 7, 2025
4d2b140
build(deps): bump typescript to 5.9.3
piraz Apr 7, 2025
df72c4c
build(deps): bump vite to 6.2.5
piraz Apr 7, 2025
91b2259
build(deps): bump vite-plugin-solid to 2.11.6
piraz Apr 7, 2025
e6b6fa9
build(deps): bump vitest to 3.1.1
piraz Apr 7, 2025
8df5a87
build(release): deliver 0.2.3
piraz Apr 7, 2025
01d94c4
feat(types): add element-attributes type
piraz Apr 8, 2025
2d93474
build(release): deliver 0.2.4
piraz Apr 8, 2025
4f049f6
build(deps): bump solid-js to 1.9.7
piraz Jun 21, 2025
f966322
build(deps): bump @types/jest to 30.0.0
piraz Jun 21, 2025
b6d645a
build(deps): bump @types/node to 24.0.3
piraz Jun 21, 2025
4381f11
build(deps): bump axios to 1.10.0
piraz Jun 21, 2025
45d0628
build(deps): bump esbuild to 0.25.5
piraz Jun 21, 2025
577b436
build(deps): bump jsdom to 26.1.0
piraz Jun 21, 2025
6665cc4
build(deps): bump vite to 6.3.5
piraz Jun 21, 2025
01dbd89
build(deps): bump vitest to 3.2.4
piraz Jun 21, 2025
56596e9
build(release): delivery 0.2.5
piraz Jun 21, 2025
c5958bc
docs(template): Add release note template to the project
piraz Jun 23, 2025
0700ce3
docs(template): add optinal block and example to the release note
piraz Jun 23, 2025
ccd53fe
feat(paginator): add paginator to the project
piraz Jun 23, 2025
8085bd6
build(release): deliver 0.3.0
piraz Jun 23, 2025
985bec3
chore: add paginator types
piraz Jun 23, 2025
4cc89bf
feat(element): add faz-role to FazElement
piraz Jun 24, 2025
2ab12b6
chore: remove old form, nav, and pagination components
piraz Jun 24, 2025
6ed0e27
chore(element): add element and element-attributes types
piraz Jun 24, 2025
728eb21
build(release): delivery 0.3.1
piraz Jun 24, 2025
f968186
refactor(tsconfig): tsconfig.types now extends tsconfg
piraz Jun 27, 2025
b13ef1b
feat(element): optimize connectedCallback with Promise.resolve
piraz Jun 27, 2025
dfeaae4
feat(form): add values property to FazForm
piraz Jun 27, 2025
7996af8
build(release): deliver 0.3.2
piraz Jun 27, 2025
b61cf96
refactor(element): remove clearFazTag from the rendering process
piraz Jul 6, 2025
b9bb912
chore(element): add types without clearFazTag method
piraz Jul 6, 2025
0c67ff9
build(release): deliver 0.4.0
piraz Jul 6, 2025
936f062
feat(element): add disconnect method to the project
piraz Jul 6, 2025
ca732fa
build(release): deliver 0.4.1
piraz Jul 6, 2025
3490ed8
chore(element): add element types with the disconnect method
piraz Jul 6, 2025
7381862
build(deps): bump esbuild to 0.25.10
piraz Oct 12, 2025
dec1bb1
build(deps): bump solid-js to 1.9.9
piraz Oct 12, 2025
9a60660
build(deps): bump vite to 7.1.9 and vite-plugin-solid to 2.11.9
piraz Oct 12, 2025
de8257e
build(deps): bump jsdom to 27.0.0
piraz Oct 12, 2025
eb08d2b
build(deps): bump @types/node to 24.7.2
piraz Oct 12, 2025
9e77cfa
build(deps): bump @testing-library/jest-dom to 6.9.1
piraz Oct 12, 2025
625fa68
build(deps): bump prettier to 3.6.2
piraz Oct 12, 2025
0440ab6
build(deps): bump typescript to 5.9.3
piraz Oct 12, 2025
e07a767
build(release): deliver 0.4.2
piraz Oct 12, 2025
66b4a7f
build(tests): remove nodejs 18 from the build
piraz Oct 12, 2025
20a93f6
chore(date): remove some warns from the code
piraz Oct 12, 2025
f45c358
build(deps): bump @types/node to 25.0.3
piraz Dec 30, 2025
e7473b8
build(deps): bump axios to 1.13.2
piraz Dec 30, 2025
d1ff537
build(deps): bump esbuild to 0.27.2
piraz Dec 30, 2025
1b8817f
build(deps): bump jsdom to 27.4.0
piraz Dec 30, 2025
3f704de
build(deps): revert back jsdom to 27.0.0
piraz Dec 30, 2025
2ee5f4d
build(deps): bump prettier to 3.7.4
piraz Dec 30, 2025
6da1457
build(deps): bump vite to 7.3.0
piraz Dec 30, 2025
9985c79
build(deps): bump vite-plugin-solid to 2.11.10
piraz Dec 30, 2025
37510a3
build(deps): bump vitest to 4.0.16
piraz Dec 30, 2025
0777692
build(deps): bump less to 4.5.1
piraz Dec 30, 2025
2bb9462
build(deps): bump solid-js to 1.9.10
piraz Dec 30, 2025
5c90733
build(release): deliver 0.4.3
piraz Dec 30, 2025
8e361ad
docs(license): change license from APACHE-2.0 to MIT
piraz Dec 30, 2025
97c78d6
docs(license): remove old Apache-2.0 headers from source files
piraz Mar 3, 2026
7d2a9ab
build(deps): bump vitest to 4.0.18
piraz Mar 3, 2026
1887f61
feat(element): implement layout stabilization and loading lifecycle
piraz Mar 3, 2026
656360f
feat(poc): add layout stabilization proof of concept
piraz Mar 7, 2026
fcd7139
feat(core): modernize reactivity and stabilize layout (v0.5.0)
piraz Mar 8, 2026
50b8176
feat(core): implement property-based reactivity and layout stability
piraz Mar 8, 2026
a1c78ac
test(fix): resolve ESM/CJS interop issue for Node 21
piraz Mar 8, 2026
9e39ebc
test(fix): force dependency inlining and switch to threads pool
piraz Mar 8, 2026
f989d54
build(deps): bump jsdom to 28.1.0
piraz Mar 8, 2026
02e054d
build(fix): lock css-color to resolve ESM/CJS interop errors
piraz Mar 8, 2026
ed7fec0
feat(core): expose reactivity engine and implement subpath exports
piraz Mar 8, 2026
93ef25e
chore(release): bump version to 0.5.1 and finalize distribution types
piraz Mar 8, 2026
16bc268
fix(core): restore direct access to src for unified reactivity
piraz Mar 8, 2026
e163704
build(deps): bump solid-js to 1.9.13
piraz Jun 23, 2026
c381a2c
build(deps): bump nise to 6.1.5
piraz Jun 23, 2026
68e18f9
build(deps): bump vite to 8.0.16
piraz Jun 23, 2026
248c3f5
fix: harden element and package build
piraz Jun 23, 2026
57a36d1
build: migrate package workflow to pnpm
piraz Jun 23, 2026
7e0ceb9
ci: bump workflow actions
piraz Jun 23, 2026
753f4b7
ci: bump node test matrix
piraz Jun 23, 2026
e809920
ci: correct node test matrix
piraz Jun 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions .github/RELEASE-NOTE-TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# What's new in Faz X.X.X

## YYYY-MM-DD

We are pleased to announce the release of Faz X.X.X.

<!-- Optional: Add a significant change or highlight for this release below -->
<!-- Example: This version introduces a major redesign of the pagination with improved performance and security. -->

Here are the highlights:

## Features

* Describe new features here. [#issue-number](https://github.com/candango/faz/issues/issue-number)

## Build

* Describe build changes or improvements here. [#issue-number](https://github.com/candango/faz/issues/issue-number)

## Refactory

* Describe refactoring efforts or code structure improvements here. [#issue-number](https://github.com/candango/faz/issues/issue-number)

## Bug Fixes

* List bug fixes here, if any. [#issue-number](https://github.com/candango/faz/issues/issue-number)

## Other Notes

* Add any additional notes or acknowledgments here.
24 changes: 14 additions & 10 deletions .github/workflows/run_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,31 @@ name: Run faz tests

on: [push, pull_request]

permissions:
contents: read

jobs:
build:

runs-on: ubuntu-latest
strategy:
matrix:
node-version: ["18", "20", "21"]
node-version: ["22", "24", "26"]

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7
- name: Set up Node ${{ matrix.node-version }}
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
- name: Set up pnpm
uses: pnpm/action-setup@v6
- name: Install dependencies
# Solution from: https://stackoverflow.com/a/67740771/2887989
run: |
export YARN_ENABLE_IMMUTABLE_INSTALLS=false
npm install -g yarn
npm run yarn
yarn install
- name: Run jest unit tests
pnpm install --frozen-lockfile
- name: Run build
run: |
pnpm run build
- name: Run vitest unit tests
run: |
npm test
pnpm test
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,6 @@ yarn-error.log
# Less
stylesheets/*.css
stylesheets/*.css.map

# Project
.gemini/
81 changes: 81 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# AGENTS.md

## Project Identity

Candango Faz is a Web Components toolkit for incremental modernization of legacy applications.

This repository is not primarily an application. It is a substrate for building reusable custom elements that can be embedded into existing systems, including legacy PHP applications, server-rendered pages, and mixed frontend stacks.

The strategic goal is to let teams replace tangled combinations of business logic, control flow, markup, Bootstrap classes, and imperative JavaScript with focused HTML tags that encapsulate UI behavior and presentation.

## Core Mission

Faz exists to support gradual migration, not big-bang rewrites.

A typical target environment may contain legacy PHP templates with conditionals, echoes, inline markup, duplicated Bootstrap snippets, and procedural JavaScript. Faz should make it possible to replace those fragments incrementally with reusable custom elements, one screen or one UI island at a time.

The intended migration pattern is:

1. Identify a painful legacy UI fragment.
2. Extract the behavior and presentation into a Faz component.
3. Replace the legacy fragment with a single custom element tag.
4. Keep the surrounding legacy system running.
5. Repeat until the system becomes easier to maintain.

This avoids the common failure mode where a team disappears for months attempting a full rewrite and returns with an incomplete proof of concept while the legacy system remains unchanged.

## Architectural Implications

Agents working in this repository must preserve the following priorities:

- **HTML-first integration:** Components must be easy to consume from plain HTML and server-rendered templates.
- **Attribute-driven APIs:** Public component APIs should work naturally through HTML attributes and properties.
- **Legacy compatibility:** Do not assume a clean SPA environment. Components may be mounted inside old pages with existing CSS and JavaScript.
- **Incremental adoption:** Changes should support partial replacement of legacy UI, not require full application rewrites.
- **Reusable UI islands:** Components should encapsulate behavior, state, and presentation cleanly enough to be reused across legacy screens.
- **Bootstrap-aware presentation:** Faz builds on Bootstrap conventions and should cooperate with Bootstrap-based layouts.
- **Small blast radius:** Prefer changes that can be adopted component-by-component without forcing consumers to reorganize their whole frontend.

## Development Guidance

When designing or changing APIs, ask:

- Can this be used from a legacy PHP template with a simple tag?
- Does the component expose enough behavior through attributes/properties?
- Does this require consumers to adopt a full frontend runtime architecture?
- Can this replace a small legacy fragment without rewriting the whole page?
- Will this behave predictably when embedded into an existing Bootstrap page?

Avoid designs that only make sense in a modern greenfield SPA.

## Security and Build Hardening TODOs

The current build and CI setup needs supply-chain hardening before release automation becomes trusted.

TODO:

- Replace the mutable Yarn CI install flow with a reproducible package-manager workflow.
- Current GitHub Actions disables immutable installs and runs `npm run yarn`, which deletes and regenerates `yarn.lock`, `.yarnrc.yml`, and `node_modules`.
- Prefer a committed lockfile and an immutable install command.
- The project may migrate from Yarn to pnpm, but the migration must preserve reproducibility.
- Add explicit least-privilege permissions to GitHub Actions.
- The test workflow should start with `permissions: contents: read` unless a job needs more.
- Decide whether to pin GitHub Actions by SHA.
- Current workflow uses tag references such as `actions/checkout@v4` and `actions/setup-node@v4`.
- Pinning by SHA reduces tag-compromise risk.
- Retire or modernize Travis CI.
- `.travis.yml` still targets Node.js 12 and caches `node_modules`.
- If Travis is no longer used, remove it to avoid stale CI behavior.
- Decide release sourcemap policy.
- `build.mjs` currently emits sourcemaps into `dist/js`.
- Keep them intentionally for open-source/debuggability or disable them for release builds.
- Review bundled legal comment handling.
- `build.mjs` uses `legalComments: "none"`.
- Consider `legalComments: "eof"` or another policy that preserves required dependency notices.
- Audit legacy `eval()` usage before exposing related code paths.
- `input/filterbox.js` contains callback evaluation via `eval(...)`.
- If that code is still reachable, replace it with an explicit callback registry or allowlist.

## Working Definition

Candango Faz is a toolkit for replacing legacy UI fragments with reusable Web Components, enabling progressive modernization without stopping the business for a rewrite.
222 changes: 21 additions & 201 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -1,201 +1,21 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.

"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:

(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and

(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and

(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and

(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.

You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.

Copyright 2018-2023 Flavio Garcia.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
MIT License

Copyright (c) 2026 Flavio Garcia

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Loading