sibujs 1.0.0-beta.3 → 1.0.0-beta.4
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/README.md +69 -61
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -710,14 +710,14 @@ Trans("greeting", { name: "Mark" });
|
|
|
710
710
|
|
|
711
711
|
---
|
|
712
712
|
|
|
713
|
-
##
|
|
713
|
+
## Patterns (`sibujs/patterns`)
|
|
714
714
|
|
|
715
|
-
Advanced
|
|
715
|
+
Advanced state management patterns, imported separately to keep the core lean.
|
|
716
716
|
|
|
717
717
|
### State Machines
|
|
718
718
|
|
|
719
719
|
```ts
|
|
720
|
-
import { machine } from "sibujs/
|
|
720
|
+
import { machine } from "sibujs/patterns";
|
|
721
721
|
|
|
722
722
|
const { state, send, matches, can } = machine({
|
|
723
723
|
initial: "idle",
|
|
@@ -749,7 +749,7 @@ can("RETRY"); // false (not in error state)
|
|
|
749
749
|
### Form Validation
|
|
750
750
|
|
|
751
751
|
```ts
|
|
752
|
-
import { form, required, email, minLength } from "sibujs/
|
|
752
|
+
import { form, required, email, minLength } from "sibujs/ui";
|
|
753
753
|
|
|
754
754
|
const form = form({
|
|
755
755
|
fields: {
|
|
@@ -772,7 +772,7 @@ form.handleSubmit();
|
|
|
772
772
|
### Global Store
|
|
773
773
|
|
|
774
774
|
```ts
|
|
775
|
-
import { globalStore } from "sibujs/
|
|
775
|
+
import { globalStore } from "sibujs/patterns";
|
|
776
776
|
|
|
777
777
|
const store = globalStore({
|
|
778
778
|
state: { count: 0, user: null },
|
|
@@ -791,7 +791,7 @@ count(); // 1
|
|
|
791
791
|
### Persistent State
|
|
792
792
|
|
|
793
793
|
```ts
|
|
794
|
-
import { persisted } from "sibujs/
|
|
794
|
+
import { persisted } from "sibujs/patterns";
|
|
795
795
|
|
|
796
796
|
// Auto-saves to localStorage, restores on page load
|
|
797
797
|
const [theme, setTheme] = persisted("app-theme", "light");
|
|
@@ -801,7 +801,7 @@ setTheme("dark"); // saved to localStorage automatically
|
|
|
801
801
|
### Time Travel
|
|
802
802
|
|
|
803
803
|
```ts
|
|
804
|
-
import { timeline } from "sibujs/
|
|
804
|
+
import { timeline } from "sibujs/patterns";
|
|
805
805
|
|
|
806
806
|
const { value, set, undo, redo, canUndo, canRedo } = timeline("initial");
|
|
807
807
|
set("second");
|
|
@@ -813,7 +813,7 @@ redo(); // value() === "third"
|
|
|
813
813
|
### Optimistic Updates
|
|
814
814
|
|
|
815
815
|
```ts
|
|
816
|
-
import { optimistic } from "sibujs/
|
|
816
|
+
import { optimistic } from "sibujs/patterns";
|
|
817
817
|
|
|
818
818
|
const [likes, addLike] = optimistic(0);
|
|
819
819
|
addLike(likes() + 1, async () => {
|
|
@@ -821,10 +821,10 @@ addLike(likes() + 1, async () => {
|
|
|
821
821
|
});
|
|
822
822
|
```
|
|
823
823
|
|
|
824
|
-
|
|
824
|
+
## Data Fetching (`sibujs/data`)
|
|
825
825
|
|
|
826
826
|
```ts
|
|
827
|
-
import { query, mutation, infiniteQuery, resource } from "sibujs/
|
|
827
|
+
import { query, mutation, infiniteQuery, resource } from "sibujs/data";
|
|
828
828
|
|
|
829
829
|
// Query with caching, stale-while-revalidate, and auto-refetch
|
|
830
830
|
const { data, loading, error, refetch } = query("users", async ({ signal }) => {
|
|
@@ -836,7 +836,7 @@ const { data, loading, error, refetch } = query("users", async ({ signal }) => {
|
|
|
836
836
|
});
|
|
837
837
|
|
|
838
838
|
// Cache management
|
|
839
|
-
import { invalidateQueries, setQueryData } from "sibujs/
|
|
839
|
+
import { invalidateQueries, setQueryData } from "sibujs/data";
|
|
840
840
|
invalidateQueries("users");
|
|
841
841
|
setQueryData("users", (prev) => [...prev, newUser]);
|
|
842
842
|
|
|
@@ -872,7 +872,7 @@ resource.data(); // reactive
|
|
|
872
872
|
### Debounce, Throttle, and Previous
|
|
873
873
|
|
|
874
874
|
```ts
|
|
875
|
-
import { debounce, throttle, previous } from "sibujs/
|
|
875
|
+
import { debounce, throttle, previous } from "sibujs/data";
|
|
876
876
|
|
|
877
877
|
// Debounced reactive value (updates after 300ms of inactivity)
|
|
878
878
|
const debouncedSearch = debounce(() => searchInput(), 300);
|
|
@@ -885,7 +885,7 @@ const prevCount = previous(count);
|
|
|
885
885
|
// prevCount() is the value before the last change
|
|
886
886
|
```
|
|
887
887
|
|
|
888
|
-
|
|
888
|
+
## Browser APIs (`sibujs/browser`)
|
|
889
889
|
|
|
890
890
|
All browser APIs return reactive getters and a `dispose` function for cleanup.
|
|
891
891
|
|
|
@@ -904,7 +904,7 @@ import {
|
|
|
904
904
|
battery,
|
|
905
905
|
idle,
|
|
906
906
|
permissions,
|
|
907
|
-
} from "sibujs/
|
|
907
|
+
} from "sibujs/browser";
|
|
908
908
|
|
|
909
909
|
// Media queries
|
|
910
910
|
const { matches: isMobile } = media("(max-width: 768px)");
|
|
@@ -952,7 +952,8 @@ const { state: cameraPermission } = permissions("camera");
|
|
|
952
952
|
### Real-Time Communication
|
|
953
953
|
|
|
954
954
|
```ts
|
|
955
|
-
import { socket, stream
|
|
955
|
+
import { socket, stream } from "sibujs/data";
|
|
956
|
+
import { eventBus } from "sibujs/ui";
|
|
956
957
|
|
|
957
958
|
// WebSocket with auto-reconnect and heartbeat
|
|
958
959
|
const { data, status, send, close } = socket("wss://api.example.com/ws", {
|
|
@@ -976,11 +977,13 @@ bus.emit("notify", "Hello!");
|
|
|
976
977
|
off(); // unsubscribe
|
|
977
978
|
```
|
|
978
979
|
|
|
980
|
+
## UI Utilities (`sibujs/ui`)
|
|
981
|
+
|
|
979
982
|
### Virtual List
|
|
980
983
|
|
|
981
984
|
```ts
|
|
982
985
|
import { html, signal } from "sibujs";
|
|
983
|
-
import { VirtualList } from "sibujs/
|
|
986
|
+
import { VirtualList } from "sibujs/ui";
|
|
984
987
|
|
|
985
988
|
VirtualList({
|
|
986
989
|
items: () => largeArray(),
|
|
@@ -991,10 +994,10 @@ VirtualList({
|
|
|
991
994
|
});
|
|
992
995
|
```
|
|
993
996
|
|
|
994
|
-
|
|
997
|
+
## Transitions and Animations (`sibujs/motion`)
|
|
995
998
|
|
|
996
999
|
```ts
|
|
997
|
-
import { transition, TransitionGroup, viewTransition } from "sibujs/
|
|
1000
|
+
import { transition, TransitionGroup, viewTransition } from "sibujs/motion";
|
|
998
1001
|
|
|
999
1002
|
// Single element transition
|
|
1000
1003
|
const { enter, leave } = transition(element, {
|
|
@@ -1023,7 +1026,7 @@ await start();
|
|
|
1023
1026
|
### Dialogs and Toasts
|
|
1024
1027
|
|
|
1025
1028
|
```ts
|
|
1026
|
-
import { dialog, toast } from "sibujs/
|
|
1029
|
+
import { dialog, toast } from "sibujs/ui";
|
|
1027
1030
|
|
|
1028
1031
|
// Dialog state
|
|
1029
1032
|
const dialog = dialog();
|
|
@@ -1043,7 +1046,7 @@ dismiss(id);
|
|
|
1043
1046
|
### Pagination and Infinite Scroll
|
|
1044
1047
|
|
|
1045
1048
|
```ts
|
|
1046
|
-
import { pagination, infiniteScroll } from "sibujs/
|
|
1049
|
+
import { pagination, infiniteScroll } from "sibujs/ui";
|
|
1047
1050
|
|
|
1048
1051
|
// Pagination
|
|
1049
1052
|
const { page, totalPages, next, prev, goTo, startIndex, endIndex } = pagination({
|
|
@@ -1062,7 +1065,7 @@ const { sentinelRef, loading } = infiniteScroll({
|
|
|
1062
1065
|
### Intersection Observer and Lazy Loading
|
|
1063
1066
|
|
|
1064
1067
|
```ts
|
|
1065
|
-
import { intersection, lazyLoad } from "sibujs/
|
|
1068
|
+
import { intersection, lazyLoad } from "sibujs/ui";
|
|
1066
1069
|
|
|
1067
1070
|
// Track element visibility
|
|
1068
1071
|
const { isIntersecting, intersectionRatio, observe } = intersection({
|
|
@@ -1079,7 +1082,7 @@ const cleanup = lazyLoad(placeholder, () => {
|
|
|
1079
1082
|
### Input Masks
|
|
1080
1083
|
|
|
1081
1084
|
```ts
|
|
1082
|
-
import { inputMask, phoneMask, dateMask, creditCardMask } from "sibujs/
|
|
1085
|
+
import { inputMask, phoneMask, dateMask, creditCardMask } from "sibujs/ui";
|
|
1083
1086
|
|
|
1084
1087
|
const phone = inputMask(phoneMask()); // (999) 999-9999
|
|
1085
1088
|
const date = inputMask(dateMask()); // 99/99/9999
|
|
@@ -1094,7 +1097,7 @@ phone.rawValue(); // unformatted: "5551234567"
|
|
|
1094
1097
|
|
|
1095
1098
|
```ts
|
|
1096
1099
|
import { html } from "sibujs";
|
|
1097
|
-
import { aria, FocusTrap, hotkey, announce } from "sibujs/
|
|
1100
|
+
import { aria, FocusTrap, hotkey, announce } from "sibujs/ui";
|
|
1098
1101
|
|
|
1099
1102
|
// Reactive ARIA attributes
|
|
1100
1103
|
aria(element, {
|
|
@@ -1116,7 +1119,7 @@ announce("Item deleted", "polite");
|
|
|
1116
1119
|
|
|
1117
1120
|
```ts
|
|
1118
1121
|
import { html } from "sibujs";
|
|
1119
|
-
import { scopedStyle, withScopedStyle } from "sibujs/
|
|
1122
|
+
import { scopedStyle, withScopedStyle } from "sibujs/ui";
|
|
1120
1123
|
|
|
1121
1124
|
// Manual scoping
|
|
1122
1125
|
const { scope, attr } = scopedStyle(`
|
|
@@ -1133,7 +1136,7 @@ const StyledCard = withScopedStyle(`
|
|
|
1133
1136
|
### Higher-Order Components
|
|
1134
1137
|
|
|
1135
1138
|
```ts
|
|
1136
|
-
import { withDefaults, withWrapper, compose } from "sibujs/
|
|
1139
|
+
import { withDefaults, withWrapper, compose } from "sibujs/patterns";
|
|
1137
1140
|
|
|
1138
1141
|
const Button = withDefaults(BaseButton, { variant: "primary", size: "md" });
|
|
1139
1142
|
|
|
@@ -1149,7 +1152,7 @@ const EnhancedButton = compose(withLogging, withTheme, withTooltip)(BaseButton);
|
|
|
1149
1152
|
|
|
1150
1153
|
```ts
|
|
1151
1154
|
import { html, signal } from "sibujs";
|
|
1152
|
-
import { composable } from "sibujs/
|
|
1155
|
+
import { composable } from "sibujs/ui";
|
|
1153
1156
|
|
|
1154
1157
|
const counterSetup = composable(() => {
|
|
1155
1158
|
const [count, setCount] = signal(0);
|
|
@@ -1165,14 +1168,14 @@ function MyComponent() {
|
|
|
1165
1168
|
|
|
1166
1169
|
---
|
|
1167
1170
|
|
|
1168
|
-
## Widgets (`
|
|
1171
|
+
## Widgets (`sibujs/widgets`)
|
|
1169
1172
|
|
|
1170
1173
|
Headless UI primitives -- state logic and keyboard navigation without opinions on markup. Build your own UI on top.
|
|
1171
1174
|
|
|
1172
1175
|
### Tabs
|
|
1173
1176
|
|
|
1174
1177
|
```ts
|
|
1175
|
-
import { tabs } from "sibujs/
|
|
1178
|
+
import { tabs } from "sibujs/widgets";
|
|
1176
1179
|
|
|
1177
1180
|
const tabs = tabs({
|
|
1178
1181
|
tabs: [
|
|
@@ -1192,7 +1195,7 @@ tabs.prevTab();
|
|
|
1192
1195
|
### Select
|
|
1193
1196
|
|
|
1194
1197
|
```ts
|
|
1195
|
-
import { select } from "sibujs/
|
|
1198
|
+
import { select } from "sibujs/widgets";
|
|
1196
1199
|
|
|
1197
1200
|
const select = select({
|
|
1198
1201
|
items: ["Apple", "Banana", "Cherry"],
|
|
@@ -1209,7 +1212,7 @@ select.isSelected("Apple"); // true
|
|
|
1209
1212
|
### Accordion
|
|
1210
1213
|
|
|
1211
1214
|
```ts
|
|
1212
|
-
import { accordion } from "sibujs/
|
|
1215
|
+
import { accordion } from "sibujs/widgets";
|
|
1213
1216
|
|
|
1214
1217
|
const accordion = accordion({
|
|
1215
1218
|
items: [
|
|
@@ -1228,7 +1231,7 @@ accordion.collapseAll();
|
|
|
1228
1231
|
### Combobox
|
|
1229
1232
|
|
|
1230
1233
|
```ts
|
|
1231
|
-
import { combobox } from "sibujs/
|
|
1234
|
+
import { combobox } from "sibujs/widgets";
|
|
1232
1235
|
|
|
1233
1236
|
const combo = combobox({
|
|
1234
1237
|
items: ["New York", "Los Angeles", "Chicago", "Houston"],
|
|
@@ -1244,7 +1247,7 @@ combo.selectedItem(); // "Chicago"
|
|
|
1244
1247
|
### Popover and Tooltip
|
|
1245
1248
|
|
|
1246
1249
|
```ts
|
|
1247
|
-
import { popover, tooltip } from "sibujs/
|
|
1250
|
+
import { popover, tooltip } from "sibujs/widgets";
|
|
1248
1251
|
|
|
1249
1252
|
const popover = popover();
|
|
1250
1253
|
popover.toggle();
|
|
@@ -1259,7 +1262,7 @@ tooltip.isVisible(); // true (after 200ms delay)
|
|
|
1259
1262
|
### File Upload
|
|
1260
1263
|
|
|
1261
1264
|
```ts
|
|
1262
|
-
import { fileUpload } from "sibujs/
|
|
1265
|
+
import { fileUpload } from "sibujs/widgets";
|
|
1263
1266
|
|
|
1264
1267
|
const upload = fileUpload({
|
|
1265
1268
|
accept: "image/*",
|
|
@@ -1277,7 +1280,7 @@ upload.clear();
|
|
|
1277
1280
|
### Date Picker
|
|
1278
1281
|
|
|
1279
1282
|
```ts
|
|
1280
|
-
import { datePicker } from "sibujs/
|
|
1283
|
+
import { datePicker } from "sibujs/widgets";
|
|
1281
1284
|
|
|
1282
1285
|
const picker = datePicker({
|
|
1283
1286
|
minDate: new Date(2020, 0, 1),
|
|
@@ -1293,7 +1296,7 @@ picker.selectedDate(); // Date
|
|
|
1293
1296
|
### Content Editable
|
|
1294
1297
|
|
|
1295
1298
|
```ts
|
|
1296
|
-
import { contentEditable } from "sibujs/
|
|
1299
|
+
import { contentEditable } from "sibujs/widgets";
|
|
1297
1300
|
|
|
1298
1301
|
const editor = contentEditable();
|
|
1299
1302
|
editor.setContent("<b>Hello</b> world");
|
|
@@ -1305,11 +1308,11 @@ editor.content(); // reactive HTML string
|
|
|
1305
1308
|
|
|
1306
1309
|
---
|
|
1307
1310
|
|
|
1308
|
-
## Web Components (`
|
|
1311
|
+
## Web Components (`sibujs/ui`)
|
|
1309
1312
|
|
|
1310
1313
|
```ts
|
|
1311
1314
|
import { html, signal } from "sibujs";
|
|
1312
|
-
import { defineElement } from "sibujs/
|
|
1315
|
+
import { defineElement } from "sibujs/ui";
|
|
1313
1316
|
|
|
1314
1317
|
defineElement("my-counter", (props) => {
|
|
1315
1318
|
const [count, setCount] = signal(Number(props.initial) || 0);
|
|
@@ -1326,7 +1329,7 @@ defineElement("my-counter", (props) => {
|
|
|
1326
1329
|
|
|
1327
1330
|
---
|
|
1328
1331
|
|
|
1329
|
-
## SSR and Static Generation (`
|
|
1332
|
+
## SSR and Static Generation (`sibujs/ssr`)
|
|
1330
1333
|
|
|
1331
1334
|
### Server-Side Rendering
|
|
1332
1335
|
|
|
@@ -1336,7 +1339,7 @@ import {
|
|
|
1336
1339
|
renderToStream,
|
|
1337
1340
|
renderToDocument,
|
|
1338
1341
|
hydrate,
|
|
1339
|
-
} from "sibujs/
|
|
1342
|
+
} from "sibujs/ssr";
|
|
1340
1343
|
|
|
1341
1344
|
// Render component to HTML string
|
|
1342
1345
|
const markup = renderToString(App());
|
|
@@ -1361,7 +1364,7 @@ hydrate(App, document.getElementById("root"));
|
|
|
1361
1364
|
### Islands Architecture
|
|
1362
1365
|
|
|
1363
1366
|
```ts
|
|
1364
|
-
import { island, hydrateIslands, hydrateProgressively } from "sibujs/
|
|
1367
|
+
import { island, hydrateIslands, hydrateProgressively } from "sibujs/ssr";
|
|
1365
1368
|
|
|
1366
1369
|
// Server: mark interactive islands
|
|
1367
1370
|
const header = island("header", () => InteractiveHeader());
|
|
@@ -1380,7 +1383,7 @@ hydrateProgressively(document.body, islands, { threshold: 0.1 });
|
|
|
1380
1383
|
|
|
1381
1384
|
```ts
|
|
1382
1385
|
import { html } from "sibujs";
|
|
1383
|
-
import { ssrSuspense, renderToSuspenseStream, suspenseSwapScript } from "sibujs/
|
|
1386
|
+
import { ssrSuspense, renderToSuspenseStream, suspenseSwapScript } from "sibujs/ssr";
|
|
1384
1387
|
|
|
1385
1388
|
const boundary = ssrSuspense({
|
|
1386
1389
|
fallback: () => html`<div>Loading...</div>`,
|
|
@@ -1394,7 +1397,7 @@ const stream = renderToSuspenseStream(shell, [boundary.promise]);
|
|
|
1394
1397
|
### Static Site Generation
|
|
1395
1398
|
|
|
1396
1399
|
```ts
|
|
1397
|
-
import { generateStaticSite } from "sibujs/
|
|
1400
|
+
import { generateStaticSite } from "sibujs/ssr";
|
|
1398
1401
|
|
|
1399
1402
|
const result = await generateStaticSite({
|
|
1400
1403
|
routes: ["/", "/about", "/blog/1", "/blog/2"],
|
|
@@ -1408,7 +1411,7 @@ result.errors; // [{ path: "/blog/2", error: Error }]
|
|
|
1408
1411
|
|
|
1409
1412
|
---
|
|
1410
1413
|
|
|
1411
|
-
## Concurrent Rendering (`
|
|
1414
|
+
## Concurrent Rendering (`sibujs/performance`)
|
|
1412
1415
|
|
|
1413
1416
|
```ts
|
|
1414
1417
|
import {
|
|
@@ -1420,7 +1423,7 @@ import {
|
|
|
1420
1423
|
yieldToMain,
|
|
1421
1424
|
processInChunks,
|
|
1422
1425
|
Priority,
|
|
1423
|
-
} from "sibujs/
|
|
1426
|
+
} from "sibujs/performance";
|
|
1424
1427
|
|
|
1425
1428
|
// Non-blocking state updates
|
|
1426
1429
|
startTransition(() => {
|
|
@@ -1450,7 +1453,7 @@ await processInChunks(bigArray, (item) => processItem(item), 50);
|
|
|
1450
1453
|
|
|
1451
1454
|
---
|
|
1452
1455
|
|
|
1453
|
-
## DevTools (`
|
|
1456
|
+
## DevTools (`sibujs/devtools`)
|
|
1454
1457
|
|
|
1455
1458
|
### Debugging and Performance
|
|
1456
1459
|
|
|
@@ -1462,7 +1465,7 @@ import {
|
|
|
1462
1465
|
measureRender,
|
|
1463
1466
|
getPerformanceReport,
|
|
1464
1467
|
checkLeaks,
|
|
1465
|
-
} from "sibujs/
|
|
1468
|
+
} from "sibujs/devtools";
|
|
1466
1469
|
|
|
1467
1470
|
enableDebug();
|
|
1468
1471
|
debugLog("Counter", "increment", { value: 5 });
|
|
@@ -1488,7 +1491,7 @@ checkLeaks(); // { "Counter": 2 } -- 2 unclean instances
|
|
|
1488
1491
|
### DevTools Integration
|
|
1489
1492
|
|
|
1490
1493
|
```ts
|
|
1491
|
-
import { initDevTools, devState, getActiveDevTools } from "sibujs/
|
|
1494
|
+
import { initDevTools, devState, getActiveDevTools } from "sibujs/devtools";
|
|
1492
1495
|
|
|
1493
1496
|
const devtools = initDevTools({ maxEvents: 1000 });
|
|
1494
1497
|
|
|
@@ -1509,7 +1512,7 @@ devtools.snapshot();
|
|
|
1509
1512
|
### Hot Module Replacement
|
|
1510
1513
|
|
|
1511
1514
|
```ts
|
|
1512
|
-
import { hmrState, registerHMR, createHMRBoundary } from "sibujs/
|
|
1515
|
+
import { hmrState, registerHMR, createHMRBoundary } from "sibujs/devtools";
|
|
1513
1516
|
|
|
1514
1517
|
// State that persists across HMR updates
|
|
1515
1518
|
const [count, setCount] = hmrState("counter", 0);
|
|
@@ -1525,12 +1528,12 @@ boundary.accept(() => console.log("Module updated"));
|
|
|
1525
1528
|
|
|
1526
1529
|
---
|
|
1527
1530
|
|
|
1528
|
-
## Ecosystem Adapters (`
|
|
1531
|
+
## Ecosystem Adapters (`sibujs/ecosystem`)
|
|
1529
1532
|
|
|
1530
1533
|
### State Management
|
|
1531
1534
|
|
|
1532
1535
|
```ts
|
|
1533
|
-
import { reduxAdapter, zustandAdapter, mobXAdapter } from "sibujs/
|
|
1536
|
+
import { reduxAdapter, zustandAdapter, mobXAdapter } from "sibujs/ecosystem";
|
|
1534
1537
|
|
|
1535
1538
|
// Use Redux store with Sibu reactivity
|
|
1536
1539
|
const { useSelector, dispatch } = reduxAdapter(reduxStore);
|
|
@@ -1546,7 +1549,7 @@ const { useObservable } = mobXAdapter();
|
|
|
1546
1549
|
### UI Framework Integration
|
|
1547
1550
|
|
|
1548
1551
|
```ts
|
|
1549
|
-
import { componentAdapter, createTheme } from "sibujs/
|
|
1552
|
+
import { componentAdapter, createTheme } from "sibujs/ecosystem";
|
|
1550
1553
|
|
|
1551
1554
|
const adapter = componentAdapter();
|
|
1552
1555
|
const theme = createTheme({ colors: { primary: "#007bff" } });
|
|
@@ -1592,15 +1595,20 @@ unmount();
|
|
|
1592
1595
|
Sibu is split into modular entry points. Import only what you use.
|
|
1593
1596
|
|
|
1594
1597
|
```
|
|
1595
|
-
sibujs
|
|
1596
|
-
sibujs/
|
|
1597
|
-
sibujs/
|
|
1598
|
-
sibujs/
|
|
1599
|
-
sibujs/
|
|
1600
|
-
sibujs/
|
|
1601
|
-
sibujs/
|
|
1602
|
-
sibujs/
|
|
1603
|
-
sibujs/
|
|
1598
|
+
sibujs Core: signal, effect, derived, mount, each, when, html, tags, ErrorBoundary
|
|
1599
|
+
sibujs/plugins Router, i18n
|
|
1600
|
+
sibujs/data Data fetching: query, mutation, infiniteQuery, socket, stream
|
|
1601
|
+
sibujs/browser Browser APIs: media, geo, resize, scroll, online, battery, ...
|
|
1602
|
+
sibujs/patterns State patterns: machine, persisted, timeline, optimistic, globalStore
|
|
1603
|
+
sibujs/motion Transitions: transition, TransitionGroup, viewTransition, reducedMotion
|
|
1604
|
+
sibujs/ui Forms, a11y, dialogs, toasts, virtual lists, composables, web components
|
|
1605
|
+
sibujs/widgets Headless UI: tabs, select, accordion, combobox, popover, datePicker, ...
|
|
1606
|
+
sibujs/ssr SSR, hydration, islands, static site generation
|
|
1607
|
+
sibujs/performance Concurrent rendering, scheduling, DOM recycling, chunk loading
|
|
1608
|
+
sibujs/devtools Debugging, profiling, HMR, component introspection
|
|
1609
|
+
sibujs/ecosystem Adapters: Redux, MobX, Zustand, Material UI, Chakra, Ant Design
|
|
1610
|
+
sibujs/build Vite plugin, Webpack plugin, template compiler, CDN utilities
|
|
1611
|
+
sibujs/testing Component testing utilities
|
|
1604
1612
|
```
|
|
1605
1613
|
|
|
1606
1614
|
The core has zero dependencies beyond TypeScript. Tree shaking works at the module level -- unused subpaths are not included in your bundle.
|
|
@@ -1636,4 +1644,4 @@ before submitting a PR.
|
|
|
1636
1644
|
|
|
1637
1645
|
## License
|
|
1638
1646
|
|
|
1639
|
-
MIT -- (c) 2025 [hexplus](https://github.com/hexplus)
|
|
1647
|
+
MIT -- (c) 2025-2026 [hexplus](https://github.com/hexplus)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sibujs",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.4",
|
|
4
4
|
"description": "A lightweight, function-based frontend framework that combines the best of React, Svelte, and Vue — with zero VDOM and maximum simplicity. Designed for developers who want fine-grained reactivity and full control without compilation or magic.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"frontend",
|