@thebase/ui 1.2.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -269
- package/LICENSE +1 -1
- package/README.md +96 -105
- package/bin/{create-baseui-app.mjs → create-nodexui-app.mjs} +65 -65
- package/dist/{baseui.apidoc.esm.js → nodexui.apidoc.esm.js} +136 -136
- package/dist/{baseui.apidoc.min.js → nodexui.apidoc.min.js} +137 -137
- package/dist/nodexui.esm.js +58 -0
- package/dist/nodexui.icons.esm.js +1 -0
- package/dist/{baseui.min.css → nodexui.min.css} +1 -1
- package/dist/nodexui.min.js +77 -0
- package/dist/{baseui.pwa.esm.js → nodexui.pwa.esm.js} +5 -5
- package/dist/{baseui.registry.json → nodexui.registry.json} +162 -162
- package/dist/{baseui.templates.xml → nodexui.templates.xml} +573 -573
- package/dist/{baseui.vite.esm.js → nodexui.vite.esm.js} +6 -6
- package/dist/runtime/mermaid/mermaid.esm.min.mjs +2 -2
- package/dist/runtime/milkdown/milkdown-editor.js +1 -1
- package/dist/runtime/milkdown/milkdown-text-editor.js +1 -1
- package/dist/themes/{baseui-dark.css → nodexui-dark.css} +2 -2
- package/dist/themes/{baseui-light.css → nodexui-light.css} +2 -2
- package/dist/types/analytics.d.ts +12 -12
- package/dist/types/apidoc.d.ts +1 -1
- package/dist/types/i18n.d.ts +7 -7
- package/dist/types/index.d.ts +15 -15
- package/dist/types/vite.d.ts +2 -2
- package/docs/analytics.md +12 -12
- package/docs/base-ui-skill.md +4 -4
- package/docs/blocks.md +6 -6
- package/docs/components/accordion.md +4 -4
- package/docs/components/alert-dialog.md +2 -2
- package/docs/components/alert.md +5 -5
- package/docs/components/apidoc.md +14 -14
- package/docs/components/aspect-ratio.md +2 -2
- package/docs/components/attachment.md +5 -5
- package/docs/components/avatar.md +7 -7
- package/docs/components/badge.md +2 -2
- package/docs/components/block-viewer.md +8 -8
- package/docs/components/breadcrumb.md +3 -3
- package/docs/components/bubble.md +2 -2
- package/docs/components/button-group.md +2 -2
- package/docs/components/button.md +2 -2
- package/docs/components/calendar.md +7 -7
- package/docs/components/card.md +2 -2
- package/docs/components/carousel.md +9 -9
- package/docs/components/chart.md +7 -7
- package/docs/components/checkbox.md +2 -2
- package/docs/components/clipboard-button.md +7 -7
- package/docs/components/code-editor.md +1 -1
- package/docs/components/collapsible.md +4 -4
- package/docs/components/combobox.md +7 -7
- package/docs/components/command.md +7 -7
- package/docs/components/context-menu.md +7 -7
- package/docs/components/data-table.md +9 -9
- package/docs/components/date-picker.md +7 -7
- package/docs/components/dialog.md +5 -5
- package/docs/components/direction.md +2 -2
- package/docs/components/drawer.md +4 -4
- package/docs/components/dropdown-menu.md +3 -3
- package/docs/components/empty.md +3 -3
- package/docs/components/field.md +1 -1
- package/docs/components/form.md +3 -3
- package/docs/components/hover-card.md +2 -2
- package/docs/components/icon.md +3 -3
- package/docs/components/input-otp.md +7 -7
- package/docs/components/input.md +6 -6
- package/docs/components/item.md +3 -3
- package/docs/components/kbd.md +2 -2
- package/docs/components/label.md +2 -2
- package/docs/components/markdown.md +13 -13
- package/docs/components/marker.md +2 -2
- package/docs/components/menubar.md +2 -2
- package/docs/components/message-scroller.md +7 -7
- package/docs/components/message.md +7 -7
- package/docs/components/native-select.md +3 -3
- package/docs/components/navigation-menu.md +3 -3
- package/docs/components/pagination.md +3 -3
- package/docs/components/popover.md +10 -10
- package/docs/components/progress.md +2 -2
- package/docs/components/pwa.md +4 -4
- package/docs/components/questionnaire.md +7 -7
- package/docs/components/radio-group.md +2 -2
- package/docs/components/resizable.md +7 -7
- package/docs/components/scroll-area.md +7 -7
- package/docs/components/select.md +2 -2
- package/docs/components/separator.md +2 -2
- package/docs/components/sheet.md +3 -3
- package/docs/components/shell.md +7 -7
- package/docs/components/sidebar.md +3 -3
- package/docs/components/skeleton.md +2 -2
- package/docs/components/slider.md +2 -2
- package/docs/components/spinner.md +4 -4
- package/docs/components/switch.md +2 -2
- package/docs/components/table.md +2 -2
- package/docs/components/tabs.md +6 -6
- package/docs/components/text-editor.md +6 -6
- package/docs/components/textarea.md +3 -3
- package/docs/components/theme-button.md +6 -6
- package/docs/components/toast.md +6 -6
- package/docs/components/toggle-group.md +7 -7
- package/docs/components/toggle.md +7 -7
- package/docs/components/tooltip.md +9 -9
- package/docs/components/typography.md +9 -9
- package/docs/i18n.md +10 -10
- package/docs/icons.md +9 -9
- package/docs/installation.md +31 -33
- package/docs/owl-components.md +36 -38
- package/docs/registry.md +14 -14
- package/docs/runtime-api.md +12 -12
- package/docs/theming.md +15 -15
- package/docs/usage-guide.md +54 -56
- package/package.json +48 -39
- package/dist/baseui.esm.js +0 -58
- package/dist/baseui.icons.esm.js +0 -1
- package/dist/baseui.min.js +0 -77
- /package/dist/{baseui.analytics.esm.js → nodexui.analytics.esm.js} +0 -0
- /package/dist/{baseui.analytics.min.js → nodexui.analytics.min.js} +0 -0
- /package/dist/{baseui.i18n.esm.js → nodexui.i18n.esm.js} +0 -0
- /package/dist/{baseui.i18n.min.js → nodexui.i18n.min.js} +0 -0
- /package/dist/themes/{baseui-dark.min.css → nodexui-dark.min.css} +0 -0
- /package/dist/themes/{baseui-light.min.css → nodexui-light.min.css} +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# Textarea
|
|
2
2
|
|
|
3
|
-
Native multiline text input with
|
|
3
|
+
Native multiline text input with Nodex UI and built-in styling.
|
|
4
4
|
|
|
5
5
|
## Base component
|
|
6
6
|
|
|
7
7
|
```js
|
|
8
|
-
import { Textarea } from "
|
|
8
|
+
import { Textarea } from "nodexui";
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
```base-ui
|
|
@@ -64,7 +64,7 @@ Set `useTip="1"` to move `supportingText` into a tooltip: a question-mark icon a
|
|
|
64
64
|
| `Textarea` | slots `start` / `end` / `footer` | slot | content drawn inside the box; `footer` sits along the bottom edge |
|
|
65
65
|
| `Textarea` | `label`, `supportingText`, `useTip`, `errorText`, `maxLength`, `invalid`, `placeholder` | `String` / `Boolean` | Material-style outlined field, same behaviour as [Input](/examples/blocks.html#/docs/components/input): the label floats onto the border, `errorText` replaces `supportingText`. Also inherited from a parent `Field`. |
|
|
66
66
|
|
|
67
|
-
See [
|
|
67
|
+
See [Nodex UI Component](/examples/blocks.html#/docs/guide/owl-components) for how to load `nodexui` and `dist/nodexui.templates.xml`.
|
|
68
68
|
|
|
69
69
|
## Static component
|
|
70
70
|
|
|
@@ -4,12 +4,12 @@ Use `b-ui="theme-button"` for an icon-only light/dark theme toggle.
|
|
|
4
4
|
|
|
5
5
|
## CDN install requirements
|
|
6
6
|
|
|
7
|
-
Load
|
|
7
|
+
Load Nodex UI CSS and Nodex UI JavaScript bundle (`nodexui.min.js`). The component uses the built-in Lucide icon renderer and the `nodexui` helper bundled with Nodex UI.
|
|
8
8
|
|
|
9
9
|
## Base component
|
|
10
10
|
|
|
11
11
|
```js
|
|
12
|
-
import { ThemeButton } from "
|
|
12
|
+
import { ThemeButton } from "nodexui";
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
```base-ui
|
|
@@ -24,7 +24,7 @@ import { ThemeButton } from "@thebase/ui";
|
|
|
24
24
|
| `ThemeButton` | `className` | `String` | optional |
|
|
25
25
|
| `ThemeButton` | `onChange` | `Function` | optional |
|
|
26
26
|
|
|
27
|
-
See [
|
|
27
|
+
See [Nodex UI Component](/examples/blocks.html#/docs/guide/owl-components) for how to load `nodexui` and `dist/nodexui.templates.xml`.
|
|
28
28
|
|
|
29
29
|
## Static component
|
|
30
30
|
|
|
@@ -42,11 +42,11 @@ Use `b-att-variant="default|outline|ghost|destructive|secondary|link"` and `b-at
|
|
|
42
42
|
|
|
43
43
|
## Methods
|
|
44
44
|
|
|
45
|
-
Use the global runtime methods: `thebase.mount()`, `thebase.mountAll()`, and `thebase.destroy()`. For direct theme control, import `createThemeController` from
|
|
45
|
+
Use the global runtime methods: `thebase.mount()`, `thebase.mountAll()`, and `thebase.destroy()`. For direct theme control, import `createThemeController` from `nodexui`.
|
|
46
46
|
|
|
47
47
|
## Events
|
|
48
48
|
|
|
49
|
-
Theme changes dispatch `
|
|
49
|
+
Theme changes dispatch `nodexui:theme-change` on `document` with `{ theme }` in `event.detail`.
|
|
50
50
|
|
|
51
51
|
## CSS variables
|
|
52
52
|
|
|
@@ -62,7 +62,7 @@ See the example page headers for working `b-ui="theme-button"` navigation usage.
|
|
|
62
62
|
|
|
63
63
|
## Browser support
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
Nodex UI targets modern evergreen browsers that support ES modules, CSS variables.
|
|
66
66
|
|
|
67
67
|
## Test checklist
|
|
68
68
|
|
package/docs/components/toast.md
CHANGED
|
@@ -5,7 +5,7 @@ Use `b-ui="toast"` for transient status messages.
|
|
|
5
5
|
## Base component
|
|
6
6
|
|
|
7
7
|
```js
|
|
8
|
-
import { Toast } from "
|
|
8
|
+
import { Toast } from "nodexui";
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
```base-ui
|
|
@@ -35,7 +35,7 @@ The toast stays hidden until `open`/`state` becomes truthy (never shows on mount
|
|
|
35
35
|
| `Toast` | `onOpenChange` | `Function` | optional |
|
|
36
36
|
| `Toast` | `action` slot | — | optional — e.g. a `<Button/>`, rendered grouped next to the close button (`<t t-set-slot="action">...</t>`) |
|
|
37
37
|
|
|
38
|
-
See [
|
|
38
|
+
See [Nodex UI Component](/examples/blocks.html#/docs/guide/owl-components) for how to load `nodexui` and `dist/nodexui.templates.xml`.
|
|
39
39
|
|
|
40
40
|
## Static component
|
|
41
41
|
|
|
@@ -54,7 +54,7 @@ The toast stays hidden until shown — omit `b-att-state="open"` and call `.show
|
|
|
54
54
|
|
|
55
55
|
```base-ui
|
|
56
56
|
<div class="d-flex flex-column align-items-center gap-3">
|
|
57
|
-
<button type="button" class="btn b-button btn-outline-secondary" onclick="document.getElementById('demo-toast').
|
|
57
|
+
<button type="button" class="btn b-button btn-outline-secondary" onclick="document.getElementById('demo-toast').NodexUIToast.show()">Show Toast</button>
|
|
58
58
|
<div id="demo-toast" b-ui="toast" b-att-delay="3000">
|
|
59
59
|
<div class="b-toast-content">
|
|
60
60
|
<div class="fw-medium">Event created</div>
|
|
@@ -68,13 +68,13 @@ The toast stays hidden until shown — omit `b-att-state="open"` and call `.show
|
|
|
68
68
|
</div>
|
|
69
69
|
```
|
|
70
70
|
|
|
71
|
-
Programmatic API: after mount, call `element.
|
|
71
|
+
Programmatic API: after mount, call `element.NodexUIToast.show()` or `element.NodexUIToast.hide()`. Events: `nodexui:open`, `nodexui:close`.
|
|
72
72
|
|
|
73
|
-
Toasts are backed by `bootstrap.Toast`: the root receives
|
|
73
|
+
Toasts are backed by `bootstrap.Toast`: the root receives the built-in `toast fade` classes, and visibility is driven by the built-in `show`/`showing` classes (not `hidden`). The close button(s) carry `data-bs-dismiss="toast"` in addition to the `b-toast-close`/`b-toast-close` selector, so the built-in delegated dismiss handler drives them.
|
|
74
74
|
|
|
75
75
|
### Screen-corner placement
|
|
76
76
|
|
|
77
|
-
Set `b-att-position` to `top-left`, `top-right`, `bottom-left`, or `bottom-right` to fix the toast to that corner of the viewport. The toast element itself gets the
|
|
77
|
+
Set `b-att-position` to `top-left`, `top-right`, `bottom-left`, or `bottom-right` to fix the toast to that corner of the viewport. The toast element itself gets the built-in `toast-container position-fixed p-3 pe-auto` classes plus the matching edge utility classes (`top-0`/`bottom-0` + `start-0`/`end-0`) merged in — no wrapper element. Omit the attribute to leave the toast inline in the document flow (the previous, default behavior):
|
|
78
78
|
|
|
79
79
|
```base-ui
|
|
80
80
|
<div id="corner-toast" b-ui="toast" b-att-position="bottom-right" b-att-delay="3000">
|
|
@@ -4,12 +4,12 @@ Use `b-ui="toggle-group"` for a CDN-ready toggle group component.
|
|
|
4
4
|
|
|
5
5
|
## CDN install requirements
|
|
6
6
|
|
|
7
|
-
Load the pinned
|
|
7
|
+
Load the pinned Nodex UI CSS and JavaScript files; no extra dependency is required for this component.
|
|
8
8
|
|
|
9
9
|
## Base component
|
|
10
10
|
|
|
11
11
|
```js
|
|
12
|
-
import { ToggleGroup, ToggleGroupItem } from "
|
|
12
|
+
import { ToggleGroup, ToggleGroupItem } from "nodexui";
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
```base-ui
|
|
@@ -36,7 +36,7 @@ import { ToggleGroup, ToggleGroupItem } from "@thebase/ui";
|
|
|
36
36
|
| `ToggleGroupItem` | `value` | `String` | required |
|
|
37
37
|
| `ToggleGroupItem` | `className` | `String` | optional |
|
|
38
38
|
|
|
39
|
-
See [
|
|
39
|
+
See [Nodex UI Component](/examples/blocks.html#/docs/guide/owl-components) for how to load `nodexui` and `dist/nodexui.templates.xml`.
|
|
40
40
|
|
|
41
41
|
## Static component
|
|
42
42
|
|
|
@@ -50,7 +50,7 @@ Call `thebase.mount(element)` or rely on `thebase.mountAll()` after the script l
|
|
|
50
50
|
|
|
51
51
|
## Options and attributes
|
|
52
52
|
|
|
53
|
-
See `dist/
|
|
53
|
+
See `dist/nodexui.registry.json` for the supported attribute list.
|
|
54
54
|
|
|
55
55
|
## Methods
|
|
56
56
|
|
|
@@ -58,11 +58,11 @@ Use the global runtime methods: `thebase.mount()`, `thebase.mountAll()`, and `th
|
|
|
58
58
|
|
|
59
59
|
## Events
|
|
60
60
|
|
|
61
|
-
Interactive components emit documented `
|
|
61
|
+
Interactive components emit documented `nodexui:*` events from their root element. Static components do not emit events.
|
|
62
62
|
|
|
63
63
|
## CSS variables
|
|
64
64
|
|
|
65
|
-
The component inherits
|
|
65
|
+
The component inherits Nodex UI semantic tokens such as `--b-surface`, `--b-border`, `--b-primary`, and `--b-radius`.
|
|
66
66
|
|
|
67
67
|
## Accessibility behavior
|
|
68
68
|
|
|
@@ -74,7 +74,7 @@ See `examples/index.html` for a working CDN-style page.
|
|
|
74
74
|
|
|
75
75
|
## Browser support
|
|
76
76
|
|
|
77
|
-
|
|
77
|
+
Nodex UI targets modern evergreen browsers that support ES modules, CSS variables.
|
|
78
78
|
|
|
79
79
|
## Test checklist
|
|
80
80
|
|
|
@@ -4,12 +4,12 @@ Use `b-ui="toggle"` for a CDN-ready toggle component.
|
|
|
4
4
|
|
|
5
5
|
## CDN install requirements
|
|
6
6
|
|
|
7
|
-
Load the pinned
|
|
7
|
+
Load the pinned Nodex UI CSS and JavaScript files; no extra dependency is required for this component.
|
|
8
8
|
|
|
9
9
|
## Base component
|
|
10
10
|
|
|
11
11
|
```js
|
|
12
|
-
import { Toggle } from "
|
|
12
|
+
import { Toggle } from "nodexui";
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
```base-ui
|
|
@@ -37,7 +37,7 @@ import { Toggle } from "@thebase/ui";
|
|
|
37
37
|
| `Toggle` | `className` | `String` | optional |
|
|
38
38
|
| `Toggle` | `onChange` | `Function` | optional |
|
|
39
39
|
|
|
40
|
-
See [
|
|
40
|
+
See [Nodex UI Component](/examples/blocks.html#/docs/guide/owl-components) for how to load `nodexui` and `dist/nodexui.templates.xml`.
|
|
41
41
|
|
|
42
42
|
## Static component
|
|
43
43
|
|
|
@@ -51,7 +51,7 @@ Call `thebase.mount(element)` or rely on `thebase.mountAll()` after the script l
|
|
|
51
51
|
|
|
52
52
|
## Options and attributes
|
|
53
53
|
|
|
54
|
-
See `dist/
|
|
54
|
+
See `dist/nodexui.registry.json` for the supported attribute list.
|
|
55
55
|
|
|
56
56
|
## Methods
|
|
57
57
|
|
|
@@ -59,11 +59,11 @@ Use the global runtime methods: `thebase.mount()`, `thebase.mountAll()`, and `th
|
|
|
59
59
|
|
|
60
60
|
## Events
|
|
61
61
|
|
|
62
|
-
Interactive components emit documented `
|
|
62
|
+
Interactive components emit documented `nodexui:*` events from their root element. Static components do not emit events.
|
|
63
63
|
|
|
64
64
|
## CSS variables
|
|
65
65
|
|
|
66
|
-
The component inherits
|
|
66
|
+
The component inherits Nodex UI semantic tokens such as `--b-surface`, `--b-border`, `--b-primary`, and `--b-radius`.
|
|
67
67
|
|
|
68
68
|
## Accessibility behavior
|
|
69
69
|
|
|
@@ -75,7 +75,7 @@ See `examples/index.html` for a working CDN-style page.
|
|
|
75
75
|
|
|
76
76
|
## Browser support
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
Nodex UI targets modern evergreen browsers that support ES modules, CSS variables.
|
|
79
79
|
|
|
80
80
|
## Test checklist
|
|
81
81
|
|
|
@@ -5,7 +5,7 @@ Use `b-ui="tooltip"` with either `b-att-content` or a tooltip content child.
|
|
|
5
5
|
## Base component
|
|
6
6
|
|
|
7
7
|
```js
|
|
8
|
-
import { Tooltip } from "
|
|
8
|
+
import { Tooltip } from "nodexui";
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
```base-ui
|
|
@@ -24,11 +24,11 @@ import { Tooltip } from "@thebase/ui";
|
|
|
24
24
|
| `Tooltip` | `state` | `String` | optional; `"open"`/`"on"`/`"active"` shows the tooltip once on mount (uncontrolled testing hook) |
|
|
25
25
|
| `Tooltip` | `className` | `String` | optional |
|
|
26
26
|
|
|
27
|
-
See [
|
|
27
|
+
See [Nodex UI Component](/examples/blocks.html#/docs/guide/owl-components) for how to load `nodexui` and `dist/nodexui.templates.xml`.
|
|
28
28
|
|
|
29
|
-
Both the pure Base and static forms are driven by a live `bootstrap.Tooltip` instance owned on the trigger element, with `trigger: "hover focus"` — **the visible popup is
|
|
29
|
+
Both the pure Base and static forms are driven by a live `bootstrap.Tooltip` instance owned on the trigger element, with `trigger: "hover focus"` — **the visible popup is the built-in generated DOM (a `.tooltip`/`.tooltip-arrow`/`.tooltip-inner` node, positioned via Popper), appended to `document.body`, not rendered inline where you authored the tooltip.** Don't query for it as a descendant of the trigger; query `document.body.querySelector(".tooltip .tooltip-inner")` instead. base sets `aria-describedby` on the trigger itself, but only while the tooltip is actually shown (removed again on hide) — Nodex UI does not additionally set a static `aria-describedby` up front.
|
|
30
30
|
|
|
31
|
-
The default slot's rendered markup is captured into an HTML string for
|
|
31
|
+
The default slot's rendered markup is captured into an HTML string for the built-in `title`/`html: true` options (the library can't consume live vnodes): the Base component renders the slot into a hidden buffer element internal to its own template, reads its `innerHTML` on mount, and re-syncs the live popup via `.setContent({'.tooltip-inner': html})` whenever that HTML changes on a later render.
|
|
32
32
|
|
|
33
33
|
## Static component
|
|
34
34
|
|
|
@@ -38,7 +38,7 @@ The default slot's rendered markup is captured into an HTML string for Bootstrap
|
|
|
38
38
|
</span>
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
Tooltips show on hover and focus, then hide on mouse leave and blur —
|
|
41
|
+
Tooltips show on hover and focus, then hide on mouse leave and blur — the built-in `trigger: "hover focus"` wires this, not manual event listeners. The static adapter reads `[b-tooltip-content]` (or the element built from `b-att-content`) once at mount time as the tooltip's HTML content, then removes that node from the DOM — the library owns showing/hiding the content from then on, so no `[b-tooltip-content]` element survives in the authored markup post-mount.
|
|
42
42
|
|
|
43
43
|
## Enhanced usage
|
|
44
44
|
|
|
@@ -46,7 +46,7 @@ Call `thebase.mount(element)` or rely on `thebase.mountAll()` after the script l
|
|
|
46
46
|
|
|
47
47
|
## Options and attributes
|
|
48
48
|
|
|
49
|
-
See `dist/
|
|
49
|
+
See `dist/nodexui.registry.json` for the supported attribute list.
|
|
50
50
|
|
|
51
51
|
## Methods
|
|
52
52
|
|
|
@@ -54,11 +54,11 @@ Use the global runtime methods: `thebase.mount()`, `thebase.mountAll()`, and `th
|
|
|
54
54
|
|
|
55
55
|
## Events
|
|
56
56
|
|
|
57
|
-
Interactive components emit documented `
|
|
57
|
+
Interactive components emit documented `nodexui:*` events from their root element. Listen for the built-in `shown.bs.tooltip`/`hidden.bs.tooltip` on the trigger element to react to show/hide; Nodex UI mirrors those into `b-att-state` (`open`/`closed`) on the static root and `this.state.open` on the Base component.
|
|
58
58
|
|
|
59
59
|
## CSS variables
|
|
60
60
|
|
|
61
|
-
The component inherits
|
|
61
|
+
The component inherits Nodex UI semantic tokens such as `--b-surface`, `--b-border`, `--b-primary`, and `--b-radius`. The popup itself is styled by the built-in bundled `.tooltip`/`.tooltip-arrow`/`.tooltip-inner` CSS (loaded via `dist/nodexui.min.css`), not Nodex UI's own classes.
|
|
62
62
|
|
|
63
63
|
## Accessibility behavior
|
|
64
64
|
|
|
@@ -70,7 +70,7 @@ See `examples/index.html` for a working CDN-style page.
|
|
|
70
70
|
|
|
71
71
|
## Browser support
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
Nodex UI targets modern evergreen browsers that support ES modules, CSS variables.
|
|
74
74
|
|
|
75
75
|
## Test checklist
|
|
76
76
|
|
|
@@ -5,7 +5,7 @@ Small text helpers for plain content.
|
|
|
5
5
|
## Base component
|
|
6
6
|
|
|
7
7
|
```js
|
|
8
|
-
import { Typography } from "
|
|
8
|
+
import { Typography } from "nodexui";
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
```base-ui
|
|
@@ -86,23 +86,23 @@ import { Typography } from "@thebase/ui";
|
|
|
86
86
|
| `Typography` | `tag` | `String` | optional; defaults to `h1`-`h4`, `blockquote`, `small`, `ul` for those variants, else `p` |
|
|
87
87
|
| `Typography` | `className` | `String` | optional |
|
|
88
88
|
|
|
89
|
-
See [
|
|
89
|
+
See [Nodex UI Component](/examples/blocks.html#/docs/guide/owl-components) for how to load `nodexui` and `dist/nodexui.templates.xml`.
|
|
90
90
|
|
|
91
|
-
##
|
|
91
|
+
## built-in typography classes
|
|
92
92
|
|
|
93
|
-
|
|
94
|
-
(`src/styles/base-extensions.css`), in Be Vietnam Pro. Use plain
|
|
93
|
+
Nodex UI redefines the built-in typography classes to the shadcn typeset values
|
|
94
|
+
(`src/styles/base-extensions.css`), in Be Vietnam Pro. Use plain built-in markup:
|
|
95
95
|
|
|
96
96
|
| Element / class | Result |
|
|
97
97
|
| --- | --- |
|
|
98
98
|
| `h1` / `.h1` ... `h4` / `.h4` | 1.75rem, 1.25rem, 1.125rem, 1rem; weight 600; line-height 1.3 to 1.5 |
|
|
99
99
|
| `h5` / `.h5`, `h6` / `.h6` | 0.875rem / 0.8125rem, weight 500, muted; `h6` is uppercase with 0.08em tracking |
|
|
100
|
-
| `.display-1` ... `.display-6` |
|
|
100
|
+
| `.display-1` ... `.display-6` | built-in sizes, weight 600, line-height 1.2 |
|
|
101
101
|
| `.lead`, `.small`, `mark`, `del`, `abbr[title]` | muted lead text, `--b-text-sm`, shadcn highlight, muted strike-through, dotted underline |
|
|
102
102
|
| `blockquote` / `.blockquote` | 2px start border, 1em inline padding, inherited size |
|
|
103
103
|
| `hr`, `dt`, `dd`, `code`, `pre`, `kbd`, `caption` | shadcn rule, weights, muted-background code, keycap border |
|
|
104
104
|
|
|
105
|
-
|
|
105
|
+
the built-in bottom-margin rhythm is unchanged. For the shadcn flow model (margin-top only,
|
|
106
106
|
1.25em between blocks, 1.75 line-height, styled lists, links and tables) wrap prose in
|
|
107
107
|
`class="b-typeset"`; tune with `--b-typeset-flow` and `--b-typeset-leading`.
|
|
108
108
|
|
|
@@ -110,9 +110,9 @@ Bootstrap's bottom-margin rhythm is unchanged. For the shadcn flow model (margin
|
|
|
110
110
|
|
|
111
111
|
```base-ui
|
|
112
112
|
<p b-ui="typography" b-att-variant="lead">Readable intro text.</p>
|
|
113
|
-
<span b-ui="typography" b-att-variant="code">
|
|
113
|
+
<span b-ui="typography" b-att-variant="code">nodexui</span>
|
|
114
114
|
```
|
|
115
115
|
|
|
116
116
|
Options: `b-att-variant="body|lead|muted|code|kbd|h1|h2|h3|h4|blockquote|small|list"` (static markup keeps its own element, so write `<h2 b-ui="typography" b-att-variant="h2">`; the variant only adds the class).
|
|
117
117
|
|
|
118
|
-
Accessibility: choose semantic HTML elements first, then add
|
|
118
|
+
Accessibility: choose semantic HTML elements first, then add Nodex UI typography attributes for styling.
|
package/docs/i18n.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# i18n service
|
|
2
2
|
|
|
3
|
-
Instructions for adding translations to a page or app with
|
|
3
|
+
Instructions for adding translations to a page or app with Nodex UI i18n service (`nodexui/i18n`). It is optional and standalone: no framework or component runtime, and it is not part of the main bundles.
|
|
4
4
|
|
|
5
5
|
- **Audience:** developers adding a language switcher or translating an existing page.
|
|
6
6
|
- **Runnable example:** `examples/i18n/` (open `/examples/i18n/` from `npm run dev`).
|
|
7
|
-
- **Real-world use:** `emvhub/i18n.js` and the `i18n/*.po` folders beside each emvhub module.
|
|
7
|
+
- **Real-world use:** `emvhub/i18n.js` and the `i18n/*.po` folders beside each emvhub module; the examples app does the same in `examples/i18n.js` and `examples/components/*/i18n/` (English and Vietnamese). Update catalogs with `node scripts/emvhub-i18n.mjs extract [--site=emvhub|examples/components] [newLang]`.
|
|
8
8
|
|
|
9
9
|
## 1. How it works
|
|
10
10
|
|
|
@@ -24,9 +24,9 @@ flowchart LR
|
|
|
24
24
|
|
|
25
25
|
| How you load it | Use |
|
|
26
26
|
| --- | --- |
|
|
27
|
-
| ES module | `import { init, t, loadCatalog } from "
|
|
28
|
-
| Import map | map
|
|
29
|
-
| Script tag | `dist/
|
|
27
|
+
| ES module | `import { init, t, loadCatalog } from "nodexui/i18n"` (file: `dist/nodexui.i18n.esm.js`) |
|
|
28
|
+
| Import map | map `nodexui/i18n` to the ESM file, then `import … from "nodexui/i18n"` |
|
|
29
|
+
| Script tag | `dist/nodexui.i18n.min.js` sets `window.thebase.i18n` |
|
|
30
30
|
|
|
31
31
|
## 3. Quick start
|
|
32
32
|
|
|
@@ -34,14 +34,14 @@ flowchart LR
|
|
|
34
34
|
|
|
35
35
|
```html
|
|
36
36
|
<script type="importmap">
|
|
37
|
-
{ "imports": { "
|
|
37
|
+
{ "imports": { "nodexui/i18n": "https://cdn.jsdelivr.net/npm/nodexui@<version>/dist/nodexui.i18n.esm.js" } }
|
|
38
38
|
</script>
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
2. Configure once, then load the catalog next to your module:
|
|
42
42
|
|
|
43
43
|
```js
|
|
44
|
-
import { init, t, loadCatalog, languages, currentLanguage, setLanguage, translateHead } from "
|
|
44
|
+
import { init, t, loadCatalog, languages, currentLanguage, setLanguage, translateHead } from "nodexui/i18n";
|
|
45
45
|
|
|
46
46
|
init({ languages: [{ code: "en", label: "English" }, { code: "vi", label: "Tiếng Việt" }], storageKey: "my-lang" });
|
|
47
47
|
await loadCatalog(import.meta.url); // fetches ./i18n/vi.po when Vietnamese is picked
|
|
@@ -99,10 +99,10 @@ Each module loads its own catalog, but language selection and `init()` must happ
|
|
|
99
99
|
|
|
100
100
|
```js
|
|
101
101
|
// i18n.js
|
|
102
|
-
import { init } from "
|
|
102
|
+
import { init } from "nodexui/i18n";
|
|
103
103
|
|
|
104
104
|
init({ languages: [{ code: "en", label: "English" }, { code: "vi", label: "Tiếng Việt" }], storageKey: "my-lang" });
|
|
105
|
-
export * from "
|
|
105
|
+
export * from "nodexui/i18n";
|
|
106
106
|
```
|
|
107
107
|
|
|
108
108
|
Because ES modules evaluate dependencies first, `init()` runs before any module's top-level `await loadCatalog(import.meta.url)`. A module that shares another folder's texts loads both: `await Promise.all([loadCatalog(import.meta.url), loadCatalog(new URL("../lib/", import.meta.url))])`.
|
|
@@ -116,4 +116,4 @@ Because ES modules evaluate dependencies first, `init()` runs before any module'
|
|
|
116
116
|
| Module-level texts untranslated | `t()` ran before `await loadCatalog(...)` finished. Await it at the top of the module. |
|
|
117
117
|
| Switching language reloads the page | By design: every text is redrawn in the new language. |
|
|
118
118
|
| Choice not remembered | Storage is blocked; the `?lang=` link still works for that visit. |
|
|
119
|
-
| Offline/PWA | Precache each `i18n/<code>.po` in your service worker (see `emvhub/
|
|
119
|
+
| Offline/PWA | Precache each `i18n/<code>.po` in your service worker (see `emvhub/nodexui.pwa.config.js`). |
|
package/docs/icons.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Built-in Icons
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Nodex UI ships the full Lucide icon set as a built-in CDN-ready icon library. Icons use the `b-icon` attribute, render as CSS masks, and inherit `currentColor` from the surrounding button, link, menu item, block, or theme.
|
|
4
4
|
|
|
5
5
|
```html
|
|
6
6
|
<button b-ui="button" type="button">
|
|
@@ -15,20 +15,20 @@ The Base UI ships the full Lucide icon set as a built-in CDN-ready icon library.
|
|
|
15
15
|
|
|
16
16
|
## Install
|
|
17
17
|
|
|
18
|
-
Load the normal
|
|
18
|
+
Load the normal Nodex UI assets. No separate icon script is required.
|
|
19
19
|
|
|
20
20
|
```html
|
|
21
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm
|
|
22
|
-
<script src="https://cdn.jsdelivr.net/npm
|
|
21
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/nodexui@latest/dist/nodexui.min.css">
|
|
22
|
+
<script src="https://cdn.jsdelivr.net/npm/nodexui@latest/dist/nodexui.min.js" defer></script>
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
`https://unpkg.com
|
|
25
|
+
`https://unpkg.com/nodexui@latest/dist/...` mirrors the same files as an alternative CDN if jsDelivr is unreachable. Pin an exact version (e.g. `@1.3.0`, or `@1` to take only non-breaking updates) instead of `@latest` for production. `b-icon` also works with the [pure Base `Icon` component](components/icon.md) — the recommended API in an application; the classic script above is for pages using the static `b-ui` API.
|
|
26
26
|
|
|
27
27
|
The build publishes every Lucide SVG to `dist/icons/lucide/` and writes the generated icon manifest to `dist/icons/lucide.json`.
|
|
28
28
|
|
|
29
29
|
## Markup
|
|
30
30
|
|
|
31
|
-
Use the Lucide icon name in kebab-case, camelCase, snake_case, or space-separated form.
|
|
31
|
+
Use the Lucide icon name in kebab-case, camelCase, snake_case, or space-separated form. Nodex UI normalizes the name to the matching Lucide SVG file.
|
|
32
32
|
|
|
33
33
|
```html
|
|
34
34
|
<span b-icon="check"></span>
|
|
@@ -46,7 +46,7 @@ Use `b-icon-size` when the surrounding component should not control the icon siz
|
|
|
46
46
|
|
|
47
47
|
## Color
|
|
48
48
|
|
|
49
|
-
Icons inherit `currentColor`, so set color on the parent element or let
|
|
49
|
+
Icons inherit `currentColor`, so set color on the parent element or let Nodex UI component variants and themes do it.
|
|
50
50
|
|
|
51
51
|
```html
|
|
52
52
|
<button b-ui="button" b-att-variant="destructive" type="button">
|
|
@@ -62,7 +62,7 @@ Icons inherit `currentColor`, so set color on the parent element or let the Base
|
|
|
62
62
|
|
|
63
63
|
## Accessibility
|
|
64
64
|
|
|
65
|
-
Decorative icons should not have a label.
|
|
65
|
+
Decorative icons should not have a label. Nodex UI marks them with `aria-hidden="true"`.
|
|
66
66
|
|
|
67
67
|
```html
|
|
68
68
|
<span b-icon="mail"></span>
|
|
@@ -84,7 +84,7 @@ Standalone meaningful icons can use `aria-label`.
|
|
|
84
84
|
|
|
85
85
|
## Self-hosting
|
|
86
86
|
|
|
87
|
-
By default, icon URLs point to the pinned Lucide CDN configured in the registry. To serve icons from your own
|
|
87
|
+
By default, icon URLs point to the pinned Lucide CDN configured in the registry. To serve icons from your own Nodex UI build, point `b-icon-base-url` at the published icon folder.
|
|
88
88
|
|
|
89
89
|
```html
|
|
90
90
|
<span b-icon="search" b-icon-base-url="/dist/icons/lucide"></span>
|
package/docs/installation.md
CHANGED
|
@@ -2,60 +2,58 @@
|
|
|
2
2
|
|
|
3
3
|
See the [Usage Guide](usage-guide.md) for the end-to-end integration path (choosing an API, install, theming, verification). This page covers install mechanics only.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Nodex UI is distributed as one CSS file and one JavaScript file for browser use. `dist/nodexui.min.js` is fully self-contained: the JS bundle (Popper.js included) and the Nodex runtime are embedded ahead of Nodex UI's own code, in load order (JS bundle, then runtime, then Nodex UI) — nothing else needs to load first. Both install paths below load this same file; the Base component API is the recommended way to consume Nodex UI in an application, with the base static markup (`b-ui`) API available as a lighter-weight alternative for non-component pages.
|
|
6
6
|
|
|
7
|
-
The snippets below use the `@latest` tag for readability. Pin an exact version instead (e.g. `@1.
|
|
7
|
+
The snippets below use the `@latest` tag for readability. Pin an exact version instead (e.g. `@1.3.0`, or `@1` to take only non-breaking updates) for any production page — `@latest` can silently change what your page loads the moment a new version is published.
|
|
8
8
|
|
|
9
9
|
## Base component install (recommended)
|
|
10
10
|
|
|
11
|
-
If you're building your own application and want to import
|
|
11
|
+
If you're building your own application and want to import Nodex UI components as real Nodex component classes (`<Button/>`, `<Card/>`, `<Tabs/>`, ...) instead of `b-ui` markup, it's the same one file as the static install, just accessed through an import map:
|
|
12
12
|
|
|
13
13
|
```html
|
|
14
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm
|
|
14
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/nodexui@latest/dist/nodexui.min.css">
|
|
15
15
|
<script type="importmap">
|
|
16
16
|
{
|
|
17
17
|
"imports": {
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"@base/theme": "https://cdn.jsdelivr.net/npm/@thebase/ui@latest/dist/baseui.esm.js",
|
|
21
|
-
"@base/templates": "https://cdn.jsdelivr.net/npm/@thebase/ui@latest/dist/baseui.templates.xml"
|
|
18
|
+
"nodexui": "https://cdn.jsdelivr.net/npm/nodexui@latest/dist/nodexui.esm.js",
|
|
19
|
+
"nodexui/templates": "https://cdn.jsdelivr.net/npm/nodexui@latest/dist/nodexui.templates.xml"
|
|
22
20
|
}
|
|
23
21
|
}
|
|
24
22
|
</script>
|
|
25
23
|
```
|
|
26
24
|
|
|
27
|
-
`https://unpkg.com
|
|
25
|
+
`https://unpkg.com/nodexui@latest/dist/...` mirrors the same files if jsDelivr is unreachable — swap the host in each URL above.
|
|
28
26
|
|
|
29
|
-
|
|
27
|
+
`nodexui` resolves to the `dist/nodexui.esm.js` module — the browser fetches and evaluates it once, so `Component`/`mount`/`xml` from `nodexui` and `Button`/`Card`/... from `nodexui` are guaranteed to be the same runtime identity (no separate script needs to load first to set up a shared global). Your own app code should still import Nodex from `nodexui`, never install or import `@odoo/owl` directly — that's what keeps a `class Root extends Component` you write instanceof-compatible with Nodex UI's own components. `nodexui/templates` maps to the templates XML — not a JS module, so resolve it with `import.meta.resolve("nodexui/templates")` and `fetch()` the result rather than `import`ing it.
|
|
30
28
|
|
|
31
|
-
For npm/bundler usage, everything (
|
|
29
|
+
For npm/bundler usage, everything (Nodex runtime, component classes, theme helper) is exported from the one `nodexui` package entry: `import { Component, mount, xml, Button, Card, createThemeController } from "nodexui";` — plus `nodexui/dist/nodexui.templates.xml` (component templates — fetch or load them before mounting). Note that importing the main entry always runs its `autoMount()` side effect (it scans the DOM for `[b-ui]`/`[b-icon]` markers on `DOMContentLoaded`) — harmless if your page has none, but worth knowing if you specifically wanted a side-effect-free import.
|
|
32
30
|
|
|
33
|
-
See [
|
|
31
|
+
See [Nodex UI Component](owl-components.md) for the full loading contract, a worked example, and common mistakes.
|
|
34
32
|
|
|
35
33
|
## Static `b-ui` install (alternative)
|
|
36
34
|
|
|
37
|
-
For static HTML, a server-rendered page, or a Base HUB website page that has no
|
|
35
|
+
For static HTML, a server-rendered page, or a Base HUB website page that has no Nodex runtime of its own, load the same bundle as plain CSS + a classic `<script>` tag instead of an import map:
|
|
38
36
|
|
|
39
37
|
```html
|
|
40
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm
|
|
41
|
-
<script src="https://cdn.jsdelivr.net/npm
|
|
38
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/nodexui@latest/dist/nodexui.min.css">
|
|
39
|
+
<script src="https://cdn.jsdelivr.net/npm/nodexui@latest/dist/nodexui.min.js" defer></script>
|
|
42
40
|
```
|
|
43
41
|
|
|
44
|
-
|
|
42
|
+
base is the bundled baseline CSS framework, and its JS bundle now drives Nodex UI's interactive components directly.
|
|
45
43
|
|
|
46
|
-
|
|
44
|
+
`nodexui` is published on npm, so [unpkg](https://unpkg.com/nodexui@latest/) mirrors the same files as an alternative CDN (`https://unpkg.com/nodexui@latest/dist/nodexui.min.css` / `nodexui.min.js`) if jsDelivr is unreachable in your environment. Pin an exact version (e.g. `@1.3.0`, or `@1` to take only non-breaking updates) instead of `@latest` for production.
|
|
47
45
|
|
|
48
46
|
For npm/self-hosted usage:
|
|
49
47
|
|
|
50
48
|
```sh
|
|
51
|
-
npm install
|
|
49
|
+
npm install nodexui
|
|
52
50
|
```
|
|
53
51
|
|
|
54
|
-
Then copy or serve `node_modules
|
|
52
|
+
Then copy or serve `node_modules/nodexui/dist/nodexui.min.css` and `node_modules/nodexui/dist/nodexui.min.js`.
|
|
55
53
|
|
|
56
|
-
`dist/bootstrap.bundle.min.js` also ships standalone, unmodified, with its own integrity hash in `dist/
|
|
54
|
+
`dist/bootstrap.bundle.min.js` also ships standalone, unmodified, with its own integrity hash in `dist/nodexui.registry.json`, in case a project wants vendored built-in JS on its own — Nodex UI itself never needs it loaded separately.
|
|
57
55
|
|
|
58
|
-
The static bundle auto-mounts existing `[b-ui]` and `[b-icon]` markers on `DOMContentLoaded`. Use `thebase.mountAll(root)` after later DOM injection, and `thebase.destroy(root)` before removing a mounted subtree that owns listeners or an
|
|
56
|
+
The static bundle auto-mounts existing `[b-ui]` and `[b-icon]` markers on `DOMContentLoaded`. Use `thebase.mountAll(root)` after later DOM injection, and `thebase.destroy(root)` before removing a mounted subtree that owns listeners or an runtime-backed controller.
|
|
59
57
|
|
|
60
58
|
The package also ships the complete Lucide SVG icon set under `dist/icons/lucide/` and a generated `dist/icons/lucide.json` manifest. The built-in icon component can use the pinned jsDelivr Lucide CDN by default or your own self-hosted path:
|
|
61
59
|
|
|
@@ -70,20 +68,20 @@ Production pages should use pinned version URLs. `latest` is for demos and exper
|
|
|
70
68
|
|
|
71
69
|
| Need | npm/bundler export | Browser import-map key | Dist file |
|
|
72
70
|
| --- | --- | --- | --- |
|
|
73
|
-
| Static `b-ui` runtime,
|
|
74
|
-
| Styles |
|
|
75
|
-
|
|
|
76
|
-
| Named-icon components (`IconEye`, ...) |
|
|
77
|
-
|
|
|
78
|
-
| Registry metadata |
|
|
79
|
-
| Optional analytics service (`init`, `track`) |
|
|
80
|
-
| Optional i18n service (`init`, `t`, `loadCatalog`) |
|
|
81
|
-
| Standalone ApiDoc (`mountApiDoc`) |
|
|
82
|
-
|
|
83
|
-
|
|
71
|
+
| Static `b-ui` runtime, Nodex runtime, every Base component class, theme helper | `nodexui` | `nodexui` (one key pointing at the same file) | `dist/nodexui.esm.js`, `dist/nodexui.min.js` |
|
|
72
|
+
| Styles | `nodexui/nodexui.css` | none; load with `<link>` | `dist/nodexui.min.css` |
|
|
73
|
+
| built-in JS | embedded; standalone file is a vendoring convenience only, not part of Nodex UI's own load path | none | `dist/bootstrap.bundle.min.js` |
|
|
74
|
+
| Named-icon components (`IconEye`, ...) | `nodexui/icons` | `nodexui/icons` | `dist/nodexui.icons.esm.js` |
|
|
75
|
+
| Nodex templates XML | `nodexui/dist/nodexui.templates.xml` | `nodexui/templates` | `dist/nodexui.templates.xml` |
|
|
76
|
+
| Registry metadata | `nodexui/registry` | none; fetch the JSON file | `dist/nodexui.registry.json` |
|
|
77
|
+
| Optional analytics service (`init`, `track`) | `nodexui/analytics` | none; import the file URL or load the `<script>` build (sets `window.thebase.analytics`) | `dist/nodexui.analytics.esm.js`, `dist/nodexui.analytics.min.js` |
|
|
78
|
+
| Optional i18n service (`init`, `t`, `loadCatalog`) | `nodexui/i18n` | `nodexui/i18n` (as in `emvhub/index.html`); or load the `<script>` build (sets `window.thebase.i18n`) | `dist/nodexui.i18n.esm.js`, `dist/nodexui.i18n.min.js` |
|
|
79
|
+
| Standalone ApiDoc (`mountApiDoc`) | `nodexui/apidoc` | none; embeds Nodex + its templates, still needs `nodexui.min.css`; set `assetBase` for the language logos | `dist/nodexui.apidoc.esm.js`, `dist/nodexui.apidoc.min.js` |
|
|
80
|
+
|
|
81
|
+
`nodexui/templates` points to XML, not JavaScript. Resolve and fetch it (`fetch(import.meta.resolve("nodexui/templates"))`) before mounting an application that uses Nodex UI component classes.
|
|
84
82
|
|
|
85
83
|
## Release Guardrails
|
|
86
84
|
|
|
87
|
-
|
|
85
|
+
Nodex UI intentionally keeps its built-in styles and scripts bundled for the browser build, both CSS and JS. The JS bundle and the Nodex runtime are embedded directly into `dist/nodexui.min.js`/`nodexui.esm.js` — in that load order — along with every Base component class and the theme helper, so both the static API and the pure Base API install with one stylesheet and one script/import: there is no more separate `nodexui.owl.*`/`nodexui.components.esm.js`/`nodexui.theme.esm.js` file to keep in load order. the bundled JS instances (`bootstrap.Modal`, `Dropdown`, `Collapse`, `Tab`, `Toast`, `Carousel`, `Tooltip`, `Popover`, `Alert`) drive the components that map to them, wrapped by Nodex UI's own `.behavior.js`/`runtime/*.js` helpers so both the static and pure Base APIs share identical ARIA/keyboard/event behavior.
|
|
88
86
|
|
|
89
87
|
Release checks enforce runtime dependency, peer dependency, scoped CSS selector, and CDN file-size budgets through `npm run lint` and `npm run build`.
|