@nocoo/basalt 2.1.7 → 2.2.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/ai/INTEGRATION.md +66 -28
- package/ai/RECIPES.md +46 -1
- package/ai/USAGE.md +2 -2
- package/ai/registry.json +65 -23
- package/dist/assets/brand-mark.js.map +1 -1
- package/dist/charts/area.js.map +1 -1
- package/dist/charts/bar.js.map +1 -1
- package/dist/charts/bullet.js.map +1 -1
- package/dist/charts/charts.js.map +1 -1
- package/dist/charts/config.js.map +1 -1
- package/dist/charts/custom-chart.js.map +1 -1
- package/dist/charts/date-navigation.js.map +1 -1
- package/dist/charts/donut.js.map +1 -1
- package/dist/charts/frame.js.map +1 -1
- package/dist/charts/funnel.js.map +1 -1
- package/dist/charts/gauge.js.map +1 -1
- package/dist/charts/grouped-bar.js.map +1 -1
- package/dist/charts/heatmap-calendar.js.map +1 -1
- package/dist/charts/heatmap-matrix.js.map +1 -1
- package/dist/charts/item-list.js.map +1 -1
- package/dist/charts/legend.js.map +1 -1
- package/dist/charts/line.js.map +1 -1
- package/dist/charts/palette.js.map +1 -1
- package/dist/charts/radar.js.map +1 -1
- package/dist/charts/sample.js.map +1 -1
- package/dist/charts/sankey.js.map +1 -1
- package/dist/charts/series.js.map +1 -1
- package/dist/charts/slot-bar.js.map +1 -1
- package/dist/charts/sparkline.js.map +1 -1
- package/dist/charts/stacked-bar.js.map +1 -1
- package/dist/charts/stat-card.js.map +1 -1
- package/dist/charts/timeline.js.map +1 -1
- package/dist/charts/timeseries.js.map +1 -1
- package/dist/charts/tooltip.js.map +1 -1
- package/dist/components/accordion.js.map +1 -1
- package/dist/components/alert-dialog.js.map +1 -1
- package/dist/components/app-header.d.ts +5 -1
- package/dist/components/app-header.js +12 -4
- package/dist/components/app-header.js.map +1 -1
- package/dist/components/app-shell.d.ts +4 -1
- package/dist/components/app-shell.js +7 -4
- package/dist/components/app-shell.js.map +1 -1
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/avatar.js.map +1 -1
- package/dist/components/badge.js.map +1 -1
- package/dist/components/banner.js.map +1 -1
- package/dist/components/basalt-mark.js.map +1 -1
- package/dist/components/battery-meter.js.map +1 -1
- package/dist/components/breadcrumbs.js.map +1 -1
- package/dist/components/button.js +2 -2
- package/dist/components/button.js.map +1 -1
- package/dist/components/chat-bubble.js.map +1 -1
- package/dist/components/chat-composer.js.map +1 -1
- package/dist/components/chat-header.js.map +1 -1
- package/dist/components/chat-inbox.js.map +1 -1
- package/dist/components/checkbox.js.map +1 -1
- package/dist/components/clipboard-text.js.map +1 -1
- package/dist/components/code.js.map +1 -1
- package/dist/components/collapsible.js.map +1 -1
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/command-palette.js.map +1 -1
- package/dist/components/confirm-dialog.d.ts +4 -1
- package/dist/components/confirm-dialog.js +20 -18
- package/dist/components/confirm-dialog.js.map +1 -1
- package/dist/components/context-menu.js.map +1 -1
- package/dist/components/data-table.js +1 -1
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/delete-resource.js +1 -1
- package/dist/components/delete-resource.js.map +1 -1
- package/dist/components/description-list.js.map +1 -1
- package/dist/components/dialog.js.map +1 -1
- package/dist/components/dock.js.map +1 -1
- package/dist/components/dropdown-menu.js.map +1 -1
- package/dist/components/editable-nav-item.js.map +1 -1
- package/dist/components/empty.js.map +1 -1
- package/dist/components/fab.js.map +1 -1
- package/dist/components/field.js.map +1 -1
- package/dist/components/file-dropzone.js.map +1 -1
- package/dist/components/filter-bar.js.map +1 -1
- package/dist/components/flow.js.map +1 -1
- package/dist/components/grid.js.map +1 -1
- package/dist/components/hover-card.js.map +1 -1
- package/dist/components/icon-picker.js.map +1 -1
- package/dist/components/inline-editable.js.map +1 -1
- package/dist/components/input-area.js.map +1 -1
- package/dist/components/input-group.js.map +1 -1
- package/dist/components/input.js.map +1 -1
- package/dist/components/label.js.map +1 -1
- package/dist/components/layer-card.js.map +1 -1
- package/dist/components/link.js.map +1 -1
- package/dist/components/loader.js.map +1 -1
- package/dist/components/loading-screen.js.map +1 -1
- package/dist/components/menu-bar.js.map +1 -1
- package/dist/components/meter.js.map +1 -1
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/navigation-menu.js.map +1 -1
- package/dist/components/overlay.js.map +1 -1
- package/dist/components/page-header.js.map +1 -1
- package/dist/components/pagination.js.map +1 -1
- package/dist/components/popover.js.map +1 -1
- package/dist/components/radio.js.map +1 -1
- package/dist/components/resource-list.js.map +1 -1
- package/dist/components/responsive-master-detail.js +5 -5
- package/dist/components/responsive-master-detail.js.map +1 -1
- package/dist/components/scroll-area.js.map +1 -1
- package/dist/components/section-rule.js.map +1 -1
- package/dist/components/segment-control.js.map +1 -1
- package/dist/components/select.js.map +1 -1
- package/dist/components/sensitive-input.js.map +1 -1
- package/dist/components/separator.js.map +1 -1
- package/dist/components/sheet.js +1 -0
- package/dist/components/sheet.js.map +1 -1
- package/dist/components/sidebar.d.ts +3 -1
- package/dist/components/sidebar.js +8 -5
- package/dist/components/sidebar.js.map +1 -1
- package/dist/components/skeleton-line.js.map +1 -1
- package/dist/components/slider.js.map +1 -1
- package/dist/components/stat-strip.js.map +1 -1
- package/dist/components/switch.js.map +1 -1
- package/dist/components/table-of-contents.js.map +1 -1
- package/dist/components/table-pager.js.map +1 -1
- package/dist/components/table.js.map +1 -1
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/tag-badge.js.map +1 -1
- package/dist/components/tag-color-picker.js.map +1 -1
- package/dist/components/text.js.map +1 -1
- package/dist/components/theme-toggle.js.map +1 -1
- package/dist/components/toast.js.map +1 -1
- package/dist/components/toggle-group.js +2 -2
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/toggle.js +1 -1
- package/dist/components/toggle.js.map +1 -1
- package/dist/components/toolbar.js.map +1 -1
- package/dist/components/tooltip.js +14 -13
- package/dist/components/tooltip.js.map +1 -1
- package/dist/components/typeahead-field.js.map +1 -1
- package/dist/components/upload-queue.js.map +1 -1
- package/dist/providers/accent.js +1 -1
- package/dist/providers/accent.js.map +1 -1
- package/dist/providers/link.js.map +1 -1
- package/dist/providers/theme.js +1 -1
- package/dist/providers/theme.js.map +1 -1
- package/dist/styles/base.css +116 -0
- package/dist/styles/standalone.css +161 -16
- package/dist/utils/cn.js.map +1 -1
- package/dist/utils/control-surface.js.map +1 -1
- package/dist/utils/preference-store.js +1 -1
- package/dist/utils/preference-store.js.map +1 -1
- package/dist/utils/selection-indicator.js +1 -1
- package/dist/utils/selection-indicator.js.map +1 -1
- package/dist/utils/use-checkable-group.js.map +1 -1
- package/package.json +2 -2
|
@@ -511,6 +511,99 @@
|
|
|
511
511
|
border-color: inherit;
|
|
512
512
|
border-collapse: collapse;
|
|
513
513
|
}
|
|
514
|
+
[data-basalt-shell] {
|
|
515
|
+
--basalt-safe-top: env(safe-area-inset-top, 0px);
|
|
516
|
+
--basalt-sticky-top: 0px;
|
|
517
|
+
--basalt-main-height: 100%;
|
|
518
|
+
--basalt-main-overflow: hidden;
|
|
519
|
+
--basalt-island-overflow: auto;
|
|
520
|
+
--basalt-island-overscroll: contain;
|
|
521
|
+
--basalt-sidebar-height: 100%;
|
|
522
|
+
box-sizing: border-box;
|
|
523
|
+
height: 100dvh;
|
|
524
|
+
max-height: 100dvh;
|
|
525
|
+
overflow: hidden;
|
|
526
|
+
overscroll-behavior: none;
|
|
527
|
+
padding: var(--basalt-safe-top) env(safe-area-inset-right, 0px) env(safe-area-inset-bottom, 0px) env(safe-area-inset-left, 0px);
|
|
528
|
+
}
|
|
529
|
+
[data-basalt-shell="document"] {
|
|
530
|
+
--basalt-sticky-top: var(--basalt-safe-top);
|
|
531
|
+
--basalt-main-height: auto;
|
|
532
|
+
--basalt-main-overflow: visible;
|
|
533
|
+
--basalt-island-overflow: visible;
|
|
534
|
+
--basalt-island-overscroll: auto;
|
|
535
|
+
--basalt-sidebar-height: calc(
|
|
536
|
+
100dvh -
|
|
537
|
+
var(--basalt-safe-top) -
|
|
538
|
+
env(safe-area-inset-bottom, 0px)
|
|
539
|
+
);
|
|
540
|
+
height: auto;
|
|
541
|
+
min-height: 100dvh;
|
|
542
|
+
max-height: none;
|
|
543
|
+
overflow: visible;
|
|
544
|
+
overscroll-behavior: auto;
|
|
545
|
+
}
|
|
546
|
+
@media (width < 768px) {
|
|
547
|
+
[data-basalt-shell="responsive"] {
|
|
548
|
+
--basalt-sticky-top: var(--basalt-safe-top);
|
|
549
|
+
--basalt-main-height: auto;
|
|
550
|
+
--basalt-main-overflow: visible;
|
|
551
|
+
--basalt-island-overflow: visible;
|
|
552
|
+
--basalt-island-overscroll: auto;
|
|
553
|
+
--basalt-sidebar-height: calc(
|
|
554
|
+
100dvh -
|
|
555
|
+
var(--basalt-safe-top) -
|
|
556
|
+
env(safe-area-inset-bottom, 0px)
|
|
557
|
+
);
|
|
558
|
+
height: auto;
|
|
559
|
+
min-height: 100dvh;
|
|
560
|
+
max-height: none;
|
|
561
|
+
overflow: visible;
|
|
562
|
+
overscroll-behavior: auto;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
[data-basalt-main] {
|
|
566
|
+
height: var(--basalt-main-height, 100%);
|
|
567
|
+
overflow: var(--basalt-main-overflow, hidden);
|
|
568
|
+
}
|
|
569
|
+
[data-basalt-island] {
|
|
570
|
+
overflow-y: var(--basalt-island-overflow, auto);
|
|
571
|
+
overscroll-behavior-y: var(--basalt-island-overscroll, contain);
|
|
572
|
+
}
|
|
573
|
+
[data-basalt-sidebar] {
|
|
574
|
+
height: var(--basalt-sidebar-height, 100dvh);
|
|
575
|
+
max-height: 100dvh;
|
|
576
|
+
}
|
|
577
|
+
[data-basalt-sidebar]:not([data-overlay]) {
|
|
578
|
+
top: var(--basalt-sticky-top, 0px);
|
|
579
|
+
}
|
|
580
|
+
[data-basalt-sheet] {
|
|
581
|
+
--basalt-sidebar-height: 100%;
|
|
582
|
+
max-height: 100dvh;
|
|
583
|
+
}
|
|
584
|
+
[data-basalt-sheet] [data-basalt-sidebar], [data-basalt-sidebar][data-overlay] {
|
|
585
|
+
box-sizing: border-box;
|
|
586
|
+
padding: env(safe-area-inset-top, 0px) env(safe-area-inset-right, 0px) env(safe-area-inset-bottom, 0px) env(safe-area-inset-left, 0px);
|
|
587
|
+
}
|
|
588
|
+
[data-basalt-header][data-sticky] {
|
|
589
|
+
position: sticky;
|
|
590
|
+
top: var(--basalt-sticky-top, 0px);
|
|
591
|
+
z-index: 20;
|
|
592
|
+
background-color: hsl(var(--basalt-card));
|
|
593
|
+
}
|
|
594
|
+
[data-basalt-header][data-sticky]::before {
|
|
595
|
+
content: "";
|
|
596
|
+
position: absolute;
|
|
597
|
+
inset-inline: 0;
|
|
598
|
+
bottom: 100%;
|
|
599
|
+
height: var(--basalt-sticky-top, 0px);
|
|
600
|
+
background: inherit;
|
|
601
|
+
pointer-events: none;
|
|
602
|
+
}
|
|
603
|
+
[data-basalt-header][data-density="compact"] :where([data-basalt-header-leading], [data-basalt-header-actions]) :where(button, a, [role="button"]) {
|
|
604
|
+
min-height: 44px;
|
|
605
|
+
min-width: 44px;
|
|
606
|
+
}
|
|
514
607
|
}
|
|
515
608
|
.basalt-chart .recharts-sector:focus:not(:focus-visible), .basalt-chart .recharts-rectangle:focus:not(:focus-visible), .basalt-chart .recharts-layer:focus:not(:focus-visible), .basalt-chart .recharts-surface:focus:not(:focus-visible) {
|
|
516
609
|
outline: none;
|
|
@@ -805,6 +898,9 @@
|
|
|
805
898
|
.h-80 {
|
|
806
899
|
height: calc(var(--spacing) * 80);
|
|
807
900
|
}
|
|
901
|
+
.h-\[52px\] {
|
|
902
|
+
height: 52px;
|
|
903
|
+
}
|
|
808
904
|
.h-auto {
|
|
809
905
|
height: auto;
|
|
810
906
|
}
|
|
@@ -838,6 +934,9 @@
|
|
|
838
934
|
.min-h-9 {
|
|
839
935
|
min-height: calc(var(--spacing) * 9);
|
|
840
936
|
}
|
|
937
|
+
.min-h-11 {
|
|
938
|
+
min-height: calc(var(--spacing) * 11);
|
|
939
|
+
}
|
|
841
940
|
.min-h-\[24px\] {
|
|
842
941
|
min-height: 24px;
|
|
843
942
|
}
|
|
@@ -1193,9 +1292,6 @@
|
|
|
1193
1292
|
.overflow-y-hidden\! {
|
|
1194
1293
|
overflow-y: hidden !important;
|
|
1195
1294
|
}
|
|
1196
|
-
.overscroll-none {
|
|
1197
|
-
overscroll-behavior: none;
|
|
1198
|
-
}
|
|
1199
1295
|
.overscroll-y-contain {
|
|
1200
1296
|
overscroll-behavior-y: contain;
|
|
1201
1297
|
}
|
|
@@ -1688,6 +1784,10 @@
|
|
|
1688
1784
|
.text-\[13px\] {
|
|
1689
1785
|
font-size: 13px;
|
|
1690
1786
|
}
|
|
1787
|
+
.leading-4 {
|
|
1788
|
+
--tw-leading: calc(var(--spacing) * 4);
|
|
1789
|
+
line-height: calc(var(--spacing) * 4);
|
|
1790
|
+
}
|
|
1691
1791
|
.leading-5 {
|
|
1692
1792
|
--tw-leading: calc(var(--spacing) * 5);
|
|
1693
1793
|
line-height: calc(var(--spacing) * 5);
|
|
@@ -2014,6 +2114,14 @@
|
|
|
2014
2114
|
.placeholder\:text-basalt-muted-foreground::placeholder {
|
|
2015
2115
|
color: hsl(var(--basalt-muted-foreground));
|
|
2016
2116
|
}
|
|
2117
|
+
.before\:absolute::before {
|
|
2118
|
+
content: var(--tw-content);
|
|
2119
|
+
position: absolute;
|
|
2120
|
+
}
|
|
2121
|
+
.before\:inset-0::before {
|
|
2122
|
+
content: var(--tw-content);
|
|
2123
|
+
inset: 0px;
|
|
2124
|
+
}
|
|
2017
2125
|
.first\:rounded-l-basalt-md:first-child {
|
|
2018
2126
|
border-top-left-radius: calc(var(--basalt-radius) - 2px);
|
|
2019
2127
|
border-bottom-left-radius: calc(var(--basalt-radius) - 2px);
|
|
@@ -2214,6 +2322,12 @@
|
|
|
2214
2322
|
.disabled\:opacity-100:disabled {
|
|
2215
2323
|
opacity: 100%;
|
|
2216
2324
|
}
|
|
2325
|
+
.aria-checked\:text-basalt-primary-foreground[aria-checked="true"] {
|
|
2326
|
+
color: hsl(var(--basalt-primary-foreground));
|
|
2327
|
+
}
|
|
2328
|
+
.aria-disabled\:cursor-not-allowed[aria-disabled="true"] {
|
|
2329
|
+
cursor: not-allowed;
|
|
2330
|
+
}
|
|
2217
2331
|
.aria-disabled\:opacity-50[aria-disabled="true"] {
|
|
2218
2332
|
opacity: 50%;
|
|
2219
2333
|
}
|
|
@@ -2223,6 +2337,19 @@
|
|
|
2223
2337
|
.aria-invalid\:focus-visible\:border-basalt-destructive[aria-invalid="true"]:focus-visible {
|
|
2224
2338
|
border-color: hsl(var(--basalt-destructive));
|
|
2225
2339
|
}
|
|
2340
|
+
.aria-pressed\:bg-basalt-accent[aria-pressed="true"] {
|
|
2341
|
+
background-color: hsl(var(--basalt-accent));
|
|
2342
|
+
}
|
|
2343
|
+
.aria-pressed\:bg-basalt-primary[aria-pressed="true"] {
|
|
2344
|
+
background-color: hsl(var(--basalt-primary));
|
|
2345
|
+
}
|
|
2346
|
+
.aria-pressed\:text-basalt-primary-foreground[aria-pressed="true"] {
|
|
2347
|
+
color: hsl(var(--basalt-primary-foreground));
|
|
2348
|
+
}
|
|
2349
|
+
.aria-pressed\:shadow-sm[aria-pressed="true"] {
|
|
2350
|
+
--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
|
|
2351
|
+
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
2352
|
+
}
|
|
2226
2353
|
.data-disabled\:pointer-events-none[data-disabled] {
|
|
2227
2354
|
pointer-events: none;
|
|
2228
2355
|
}
|
|
@@ -2287,19 +2414,6 @@
|
|
|
2287
2414
|
.data-\[state\=indeterminate\]\:text-basalt-primary-foreground[data-state="indeterminate"] {
|
|
2288
2415
|
color: hsl(var(--basalt-primary-foreground));
|
|
2289
2416
|
}
|
|
2290
|
-
.data-\[state\=on\]\:bg-basalt-accent[data-state="on"] {
|
|
2291
|
-
background-color: hsl(var(--basalt-accent));
|
|
2292
|
-
}
|
|
2293
|
-
.data-\[state\=on\]\:bg-basalt-primary[data-state="on"] {
|
|
2294
|
-
background-color: hsl(var(--basalt-primary));
|
|
2295
|
-
}
|
|
2296
|
-
.data-\[state\=on\]\:text-basalt-primary-foreground[data-state="on"] {
|
|
2297
|
-
color: hsl(var(--basalt-primary-foreground));
|
|
2298
|
-
}
|
|
2299
|
-
.data-\[state\=on\]\:shadow-sm[data-state="on"] {
|
|
2300
|
-
--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
|
|
2301
|
-
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
2302
|
-
}
|
|
2303
2417
|
.data-\[state\=open\]\:animate-basalt-collapsible-down[data-state="open"] {
|
|
2304
2418
|
animation: basalt-collapsible-down 150ms ease-out;
|
|
2305
2419
|
}
|
|
@@ -2384,6 +2498,15 @@
|
|
|
2384
2498
|
.md\:gap-4 {
|
|
2385
2499
|
gap: calc(var(--spacing) * 4);
|
|
2386
2500
|
}
|
|
2501
|
+
.md\:overflow-hidden {
|
|
2502
|
+
overflow: hidden;
|
|
2503
|
+
}
|
|
2504
|
+
.md\:overflow-y-auto {
|
|
2505
|
+
overflow-y: auto;
|
|
2506
|
+
}
|
|
2507
|
+
.md\:overscroll-y-contain {
|
|
2508
|
+
overscroll-behavior-y: contain;
|
|
2509
|
+
}
|
|
2387
2510
|
.md\:rounded-basalt-island {
|
|
2388
2511
|
border-radius: var(--basalt-radius-island);
|
|
2389
2512
|
}
|
|
@@ -2408,6 +2531,22 @@
|
|
|
2408
2531
|
font-size: var(--text-sm);
|
|
2409
2532
|
line-height: var(--tw-leading, var(--text-sm--line-height));
|
|
2410
2533
|
}
|
|
2534
|
+
.md\:shadow-sm {
|
|
2535
|
+
--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
|
|
2536
|
+
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
2537
|
+
}
|
|
2538
|
+
.md\:ring-1 {
|
|
2539
|
+
--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
|
|
2540
|
+
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
2541
|
+
}
|
|
2542
|
+
.md\:ring-basalt-border\/40 {
|
|
2543
|
+
--tw-ring-color: hsl(var(--basalt-border));
|
|
2544
|
+
}
|
|
2545
|
+
@supports (color: color-mix(in lab, red, red)) {
|
|
2546
|
+
.md\:ring-basalt-border\/40 {
|
|
2547
|
+
--tw-ring-color: color-mix(in oklab, hsl(var(--basalt-border)) 40%, transparent);
|
|
2548
|
+
}
|
|
2549
|
+
}
|
|
2411
2550
|
}
|
|
2412
2551
|
@media (width >= 64rem) {
|
|
2413
2552
|
.lg\:grid-cols-3 {
|
|
@@ -3010,6 +3149,11 @@
|
|
|
3010
3149
|
syntax: "*";
|
|
3011
3150
|
inherits: false;
|
|
3012
3151
|
}
|
|
3152
|
+
@property --tw-content {
|
|
3153
|
+
syntax: "*";
|
|
3154
|
+
initial-value: "";
|
|
3155
|
+
inherits: false;
|
|
3156
|
+
}
|
|
3013
3157
|
@layer properties {
|
|
3014
3158
|
@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
|
|
3015
3159
|
*, ::before, ::after, ::backdrop {
|
|
@@ -3079,6 +3223,7 @@
|
|
|
3079
3223
|
--tw-backdrop-sepia: initial;
|
|
3080
3224
|
--tw-duration: initial;
|
|
3081
3225
|
--tw-ease: initial;
|
|
3226
|
+
--tw-content: "";
|
|
3082
3227
|
}
|
|
3083
3228
|
}
|
|
3084
3229
|
}
|
package/dist/utils/cn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cn.js","names":[],"sources":["../../src/utils/cn.ts"],"sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n"],"mappings":";;;;AAGA,
|
|
1
|
+
{"version":3,"file":"cn.js","names":["cn","inputs","twMerge","clsx"],"sources":["../../src/utils/cn.ts"],"sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n"],"mappings":";;;;AAGA,SAAgBA,EAAG,GAAGC,GAAsB;CAC3C,OAAOC,EAAQC,EAAKF,CAAM,CAAC;AAC5B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-surface.js","names":[],"sources":["../../src/utils/control-surface.ts"],"sourcesContent":["import { cn } from \"./cn\";\n\nexport const BASALT_UI_CLASS = \"basalt-ui\";\n\nexport const CONTROL_SURFACE_CLASS =\n\t\"basalt-ui rounded-basalt-md border border-basalt-border bg-basalt-control text-sm\";\n\nexport function controlSurfaceClass(className?: string) {\n\treturn cn(CONTROL_SURFACE_CLASS, className);\n}\n"],"mappings":";;;AAEA,
|
|
1
|
+
{"version":3,"file":"control-surface.js","names":["BASALT_UI_CLASS","CONTROL_SURFACE_CLASS","controlSurfaceClass","cn","className"],"sources":["../../src/utils/control-surface.ts"],"sourcesContent":["import { cn } from \"./cn\";\n\nexport const BASALT_UI_CLASS = \"basalt-ui\";\n\nexport const CONTROL_SURFACE_CLASS =\n\t\"basalt-ui rounded-basalt-md border border-basalt-border bg-basalt-control text-sm\";\n\nexport function controlSurfaceClass(className?: string) {\n\treturn cn(CONTROL_SURFACE_CLASS, className);\n}\n"],"mappings":";;;AAEA,IAAaA,IAAkB,aAElBC,IACZ;AAED,SAAgBC,EAAoB,GAAoB;CACvD,OAAOC,EAAGF,GAAuBG,CAAS;AAC3C"}
|
|
@@ -54,7 +54,7 @@ function r({ storageKey: r, defaultValue: i, persist: a, isValid: o, normalize:
|
|
|
54
54
|
let c = e(r);
|
|
55
55
|
c.status !== "error" && (o(c.value) ? (u = s(c.value), d = !0) : (u = l, d = !1), m());
|
|
56
56
|
}, _ = null, v = () => {
|
|
57
|
-
typeof window
|
|
57
|
+
typeof window < "u" && p.size === 1 && !_ && (window.addEventListener("storage", g), window.addEventListener(c, h), _ = () => {
|
|
58
58
|
window.removeEventListener("storage", g), window.removeEventListener(c, h), _ = null;
|
|
59
59
|
});
|
|
60
60
|
}, y = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preference-store.js","names":[],"sources":["../../src/utils/preference-store.ts"],"sourcesContent":["type PreferenceConfig<T> = {\n\tstorageKey: string;\n\tdefaultValue: T;\n\tpersist: boolean;\n};\n\ntype StorageReadResult = { status: \"success\"; value: string | null } | { status: \"error\" };\n\nfunction safeGetStorageItem(key: string): StorageReadResult {\n\ttry {\n\t\tif (typeof window === \"undefined\" || !window.localStorage) {\n\t\t\treturn { status: \"error\" };\n\t\t}\n\t\tconst value = window.localStorage.getItem(key);\n\t\treturn { status: \"success\", value };\n\t} catch {\n\t\treturn { status: \"error\" };\n\t}\n}\n\nfunction safeSetStorageItem(key: string, value: string): boolean {\n\ttry {\n\t\tif (typeof window === \"undefined\" || !window.localStorage) {\n\t\t\treturn false;\n\t\t}\n\t\twindow.localStorage.setItem(key, value);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction isLocalStorageArea(area: Storage | null | undefined): boolean {\n\tif (!area) {\n\t\treturn true;\n\t}\n\ttry {\n\t\tif (typeof window !== \"undefined\" && window.localStorage) {\n\t\t\treturn area === window.localStorage;\n\t\t}\n\t} catch {\n\t\treturn false;\n\t}\n\treturn false;\n}\n\ninterface PreferenceChangeEventDetail<T> {\n\tkey: string;\n\tvalue: T;\n\twriteSucceeded: boolean;\n}\n\nexport function createPreferenceStore<T extends string>({\n\tstorageKey,\n\tdefaultValue: initialDefaultValue,\n\tpersist,\n\tisValid,\n\tnormalize,\n\teventName,\n}: PreferenceConfig<T> & {\n\tisValid: (value: unknown) => value is T;\n\tnormalize: (value: T) => T;\n\teventName: string;\n}) {\n\tlet defaultValue = normalize(initialDefaultValue);\n\tlet memoryValue = defaultValue;\n\tlet hasExplicitSelection = false;\n\tlet lastSetFailed = false;\n\n\tif (persist) {\n\t\tconst res = safeGetStorageItem(storageKey);\n\t\tif (res.status === \"success\" && isValid(res.value)) {\n\t\t\tmemoryValue = normalize(res.value);\n\t\t\thasExplicitSelection = true;\n\t\t}\n\t}\n\n\tconst listeners = new Set<() => void>();\n\tconst notify = () => {\n\t\tfor (const listener of listeners) {\n\t\t\tlistener();\n\t\t}\n\t};\n\n\tconst onInternalChange = (event: Event) => {\n\t\tif (!persist) {\n\t\t\treturn;\n\t\t}\n\t\tconst customEv = event as CustomEvent<PreferenceChangeEventDetail<T>>;\n\t\tif (!customEv.detail || customEv.detail.key !== storageKey) {\n\t\t\treturn;\n\t\t}\n\t\tconst { value, writeSucceeded } = customEv.detail;\n\t\tlastSetFailed = !writeSucceeded;\n\t\tmemoryValue = value;\n\t\thasExplicitSelection = true;\n\t\tnotify();\n\t};\n\n\tconst onStorage = (event: StorageEvent | Event) => {\n\t\tif (!persist) {\n\t\t\treturn;\n\t\t}\n\t\tconst storageEv = event as Partial<StorageEvent>;\n\t\tif (\"key\" in storageEv && storageEv.key !== undefined) {\n\t\t\tif (!isLocalStorageArea(storageEv.storageArea)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (storageEv.key !== null && storageEv.key !== storageKey) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlastSetFailed = false;\n\t\t\tconst rawValue = storageEv.newValue;\n\t\t\tif (rawValue === null || rawValue === undefined || !isValid(rawValue)) {\n\t\t\t\tmemoryValue = defaultValue;\n\t\t\t\thasExplicitSelection = false;\n\t\t\t} else {\n\t\t\t\tmemoryValue = normalize(rawValue);\n\t\t\t\thasExplicitSelection = true;\n\t\t\t}\n\t\t\tnotify();\n\t\t\treturn;\n\t\t}\n\t\t// A bare storage event must not replace a selection whose write failed.\n\t\tif (lastSetFailed) {\n\t\t\treturn;\n\t\t}\n\t\tconst res = safeGetStorageItem(storageKey);\n\t\tif (res.status === \"error\") {\n\t\t\treturn;\n\t\t}\n\t\tif (isValid(res.value)) {\n\t\t\tmemoryValue = normalize(res.value);\n\t\t\thasExplicitSelection = true;\n\t\t} else {\n\t\t\tmemoryValue = defaultValue;\n\t\t\thasExplicitSelection = false;\n\t\t}\n\t\tnotify();\n\t};\n\n\tlet cleanupStorageListener: (() => void) | null = null;\n\tconst attachStorageListener = () => {\n\t\tif (typeof window === \"undefined\") {\n\t\t\treturn;\n\t\t}\n\t\tif (listeners.size === 1 && !cleanupStorageListener) {\n\t\t\twindow.addEventListener(\"storage\", onStorage);\n\t\t\twindow.addEventListener(eventName, onInternalChange);\n\t\t\tcleanupStorageListener = () => {\n\t\t\t\twindow.removeEventListener(\"storage\", onStorage);\n\t\t\t\twindow.removeEventListener(eventName, onInternalChange);\n\t\t\t\tcleanupStorageListener = null;\n\t\t\t};\n\t\t}\n\t};\n\n\tconst detachStorageListener = () => {\n\t\tif (listeners.size === 0 && cleanupStorageListener) {\n\t\t\tcleanupStorageListener();\n\t\t}\n\t};\n\n\treturn {\n\t\tgetSnapshot: () => memoryValue,\n\t\tsubscribe: (listener: () => void) => {\n\t\t\tlisteners.add(listener);\n\t\t\tattachStorageListener();\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(listener);\n\t\t\t\tdetachStorageListener();\n\t\t\t};\n\t\t},\n\t\tsetValue: (next: T) => {\n\t\t\tconst value = normalize(next);\n\t\t\tmemoryValue = value;\n\t\t\thasExplicitSelection = true;\n\t\t\tif (persist) {\n\t\t\t\tconst writeSucceeded = safeSetStorageItem(storageKey, value);\n\t\t\t\tlastSetFailed = !writeSucceeded;\n\t\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\twindow.dispatchEvent(\n\t\t\t\t\t\t\tnew CustomEvent<PreferenceChangeEventDetail<T>>(eventName, {\n\t\t\t\t\t\t\t\tdetail: { key: storageKey, value, writeSucceeded },\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// The local selection still applies when dispatch is unavailable.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tnotify();\n\t\t},\n\t\tupdateConfig: (config: PreferenceConfig<T>) => {\n\t\t\tconst keyChanged = storageKey !== config.storageKey;\n\t\t\tconst persistChanged = persist !== config.persist;\n\t\t\tconst normalizedDefault = normalize(config.defaultValue);\n\t\t\tconst defaultChanged = defaultValue !== normalizedDefault;\n\n\t\t\tconst oldPersist = persist;\n\t\t\tstorageKey = config.storageKey;\n\t\t\tdefaultValue = normalizedDefault;\n\t\t\tpersist = config.persist;\n\n\t\t\tif (keyChanged) {\n\t\t\t\tif (persist) {\n\t\t\t\t\tconst res = safeGetStorageItem(storageKey);\n\t\t\t\t\tif (res.status === \"success\") {\n\t\t\t\t\t\tlastSetFailed = false;\n\t\t\t\t\t\tif (isValid(res.value)) {\n\t\t\t\t\t\t\tmemoryValue = normalize(res.value);\n\t\t\t\t\t\t\thasExplicitSelection = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmemoryValue = defaultValue;\n\t\t\t\t\t\t\thasExplicitSelection = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnotify();\n\t\t\t\t}\n\t\t\t} else if (persistChanged) {\n\t\t\t\tif (!oldPersist && persist) {\n\t\t\t\t\tconst res = safeGetStorageItem(storageKey);\n\t\t\t\t\tif (res.status === \"success\") {\n\t\t\t\t\t\tlastSetFailed = false;\n\t\t\t\t\t\tif (isValid(res.value)) {\n\t\t\t\t\t\t\tmemoryValue = normalize(res.value);\n\t\t\t\t\t\t\thasExplicitSelection = true;\n\t\t\t\t\t\t\tnotify();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (defaultChanged) {\n\t\t\t\tif (!hasExplicitSelection) {\n\t\t\t\t\tif (persist) {\n\t\t\t\t\t\tconst res = safeGetStorageItem(storageKey);\n\t\t\t\t\t\tif (res.status === \"success\" && !isValid(res.value)) {\n\t\t\t\t\t\t\tmemoryValue = defaultValue;\n\t\t\t\t\t\t\tnotify();\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmemoryValue = defaultValue;\n\t\t\t\t\t\tnotify();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"preference-store.js","names":["safeGetStorageItem","key","safeSetStorageItem","value","isLocalStorageArea","area","createPreferenceStore","initialDefaultValue","defaultValue","normalize","memoryValue","hasExplicitSelection","lastSetFailed","persist","res","storageKey","isValid","listeners","notify","listener","onInternalChange","customEv","event","writeSucceeded","onStorage","storageEv","rawValue","cleanupStorageListener","attachStorageListener","eventName","detachStorageListener","next","keyChanged","config","persistChanged","normalizedDefault","defaultChanged","oldPersist"],"sources":["../../src/utils/preference-store.ts"],"sourcesContent":["type PreferenceConfig<T> = {\n\tstorageKey: string;\n\tdefaultValue: T;\n\tpersist: boolean;\n};\n\ntype StorageReadResult = { status: \"success\"; value: string | null } | { status: \"error\" };\n\nfunction safeGetStorageItem(key: string): StorageReadResult {\n\ttry {\n\t\tif (typeof window === \"undefined\" || !window.localStorage) {\n\t\t\treturn { status: \"error\" };\n\t\t}\n\t\tconst value = window.localStorage.getItem(key);\n\t\treturn { status: \"success\", value };\n\t} catch {\n\t\treturn { status: \"error\" };\n\t}\n}\n\nfunction safeSetStorageItem(key: string, value: string): boolean {\n\ttry {\n\t\tif (typeof window === \"undefined\" || !window.localStorage) {\n\t\t\treturn false;\n\t\t}\n\t\twindow.localStorage.setItem(key, value);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction isLocalStorageArea(area: Storage | null | undefined): boolean {\n\tif (!area) {\n\t\treturn true;\n\t}\n\ttry {\n\t\tif (typeof window !== \"undefined\" && window.localStorage) {\n\t\t\treturn area === window.localStorage;\n\t\t}\n\t} catch {\n\t\treturn false;\n\t}\n\treturn false;\n}\n\ninterface PreferenceChangeEventDetail<T> {\n\tkey: string;\n\tvalue: T;\n\twriteSucceeded: boolean;\n}\n\nexport function createPreferenceStore<T extends string>({\n\tstorageKey,\n\tdefaultValue: initialDefaultValue,\n\tpersist,\n\tisValid,\n\tnormalize,\n\teventName,\n}: PreferenceConfig<T> & {\n\tisValid: (value: unknown) => value is T;\n\tnormalize: (value: T) => T;\n\teventName: string;\n}) {\n\tlet defaultValue = normalize(initialDefaultValue);\n\tlet memoryValue = defaultValue;\n\tlet hasExplicitSelection = false;\n\tlet lastSetFailed = false;\n\n\tif (persist) {\n\t\tconst res = safeGetStorageItem(storageKey);\n\t\tif (res.status === \"success\" && isValid(res.value)) {\n\t\t\tmemoryValue = normalize(res.value);\n\t\t\thasExplicitSelection = true;\n\t\t}\n\t}\n\n\tconst listeners = new Set<() => void>();\n\tconst notify = () => {\n\t\tfor (const listener of listeners) {\n\t\t\tlistener();\n\t\t}\n\t};\n\n\tconst onInternalChange = (event: Event) => {\n\t\tif (!persist) {\n\t\t\treturn;\n\t\t}\n\t\tconst customEv = event as CustomEvent<PreferenceChangeEventDetail<T>>;\n\t\tif (!customEv.detail || customEv.detail.key !== storageKey) {\n\t\t\treturn;\n\t\t}\n\t\tconst { value, writeSucceeded } = customEv.detail;\n\t\tlastSetFailed = !writeSucceeded;\n\t\tmemoryValue = value;\n\t\thasExplicitSelection = true;\n\t\tnotify();\n\t};\n\n\tconst onStorage = (event: StorageEvent | Event) => {\n\t\tif (!persist) {\n\t\t\treturn;\n\t\t}\n\t\tconst storageEv = event as Partial<StorageEvent>;\n\t\tif (\"key\" in storageEv && storageEv.key !== undefined) {\n\t\t\tif (!isLocalStorageArea(storageEv.storageArea)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (storageEv.key !== null && storageEv.key !== storageKey) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlastSetFailed = false;\n\t\t\tconst rawValue = storageEv.newValue;\n\t\t\tif (rawValue === null || rawValue === undefined || !isValid(rawValue)) {\n\t\t\t\tmemoryValue = defaultValue;\n\t\t\t\thasExplicitSelection = false;\n\t\t\t} else {\n\t\t\t\tmemoryValue = normalize(rawValue);\n\t\t\t\thasExplicitSelection = true;\n\t\t\t}\n\t\t\tnotify();\n\t\t\treturn;\n\t\t}\n\t\t// A bare storage event must not replace a selection whose write failed.\n\t\tif (lastSetFailed) {\n\t\t\treturn;\n\t\t}\n\t\tconst res = safeGetStorageItem(storageKey);\n\t\tif (res.status === \"error\") {\n\t\t\treturn;\n\t\t}\n\t\tif (isValid(res.value)) {\n\t\t\tmemoryValue = normalize(res.value);\n\t\t\thasExplicitSelection = true;\n\t\t} else {\n\t\t\tmemoryValue = defaultValue;\n\t\t\thasExplicitSelection = false;\n\t\t}\n\t\tnotify();\n\t};\n\n\tlet cleanupStorageListener: (() => void) | null = null;\n\tconst attachStorageListener = () => {\n\t\tif (typeof window === \"undefined\") {\n\t\t\treturn;\n\t\t}\n\t\tif (listeners.size === 1 && !cleanupStorageListener) {\n\t\t\twindow.addEventListener(\"storage\", onStorage);\n\t\t\twindow.addEventListener(eventName, onInternalChange);\n\t\t\tcleanupStorageListener = () => {\n\t\t\t\twindow.removeEventListener(\"storage\", onStorage);\n\t\t\t\twindow.removeEventListener(eventName, onInternalChange);\n\t\t\t\tcleanupStorageListener = null;\n\t\t\t};\n\t\t}\n\t};\n\n\tconst detachStorageListener = () => {\n\t\tif (listeners.size === 0 && cleanupStorageListener) {\n\t\t\tcleanupStorageListener();\n\t\t}\n\t};\n\n\treturn {\n\t\tgetSnapshot: () => memoryValue,\n\t\tsubscribe: (listener: () => void) => {\n\t\t\tlisteners.add(listener);\n\t\t\tattachStorageListener();\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(listener);\n\t\t\t\tdetachStorageListener();\n\t\t\t};\n\t\t},\n\t\tsetValue: (next: T) => {\n\t\t\tconst value = normalize(next);\n\t\t\tmemoryValue = value;\n\t\t\thasExplicitSelection = true;\n\t\t\tif (persist) {\n\t\t\t\tconst writeSucceeded = safeSetStorageItem(storageKey, value);\n\t\t\t\tlastSetFailed = !writeSucceeded;\n\t\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\twindow.dispatchEvent(\n\t\t\t\t\t\t\tnew CustomEvent<PreferenceChangeEventDetail<T>>(eventName, {\n\t\t\t\t\t\t\t\tdetail: { key: storageKey, value, writeSucceeded },\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// The local selection still applies when dispatch is unavailable.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tnotify();\n\t\t},\n\t\tupdateConfig: (config: PreferenceConfig<T>) => {\n\t\t\tconst keyChanged = storageKey !== config.storageKey;\n\t\t\tconst persistChanged = persist !== config.persist;\n\t\t\tconst normalizedDefault = normalize(config.defaultValue);\n\t\t\tconst defaultChanged = defaultValue !== normalizedDefault;\n\n\t\t\tconst oldPersist = persist;\n\t\t\tstorageKey = config.storageKey;\n\t\t\tdefaultValue = normalizedDefault;\n\t\t\tpersist = config.persist;\n\n\t\t\tif (keyChanged) {\n\t\t\t\tif (persist) {\n\t\t\t\t\tconst res = safeGetStorageItem(storageKey);\n\t\t\t\t\tif (res.status === \"success\") {\n\t\t\t\t\t\tlastSetFailed = false;\n\t\t\t\t\t\tif (isValid(res.value)) {\n\t\t\t\t\t\t\tmemoryValue = normalize(res.value);\n\t\t\t\t\t\t\thasExplicitSelection = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmemoryValue = defaultValue;\n\t\t\t\t\t\t\thasExplicitSelection = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnotify();\n\t\t\t\t}\n\t\t\t} else if (persistChanged) {\n\t\t\t\tif (!oldPersist && persist) {\n\t\t\t\t\tconst res = safeGetStorageItem(storageKey);\n\t\t\t\t\tif (res.status === \"success\") {\n\t\t\t\t\t\tlastSetFailed = false;\n\t\t\t\t\t\tif (isValid(res.value)) {\n\t\t\t\t\t\t\tmemoryValue = normalize(res.value);\n\t\t\t\t\t\t\thasExplicitSelection = true;\n\t\t\t\t\t\t\tnotify();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (defaultChanged) {\n\t\t\t\tif (!hasExplicitSelection) {\n\t\t\t\t\tif (persist) {\n\t\t\t\t\t\tconst res = safeGetStorageItem(storageKey);\n\t\t\t\t\t\tif (res.status === \"success\" && !isValid(res.value)) {\n\t\t\t\t\t\t\tmemoryValue = defaultValue;\n\t\t\t\t\t\t\tnotify();\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmemoryValue = defaultValue;\n\t\t\t\t\t\tnotify();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n}\n"],"mappings":"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"}
|
|
@@ -92,7 +92,7 @@ function s({ itemSelector: s, enabled: c = !0, mapGeometry: l, ref: u }) {
|
|
|
92
92
|
subtree: !0,
|
|
93
93
|
childList: !0,
|
|
94
94
|
characterData: !0,
|
|
95
|
-
attributeFilter: ["data-state"]
|
|
95
|
+
attributeFilter: ["data-state", "aria-checked"]
|
|
96
96
|
}), () => {
|
|
97
97
|
cancelAnimationFrame(t), i.disconnect(), n.disconnect();
|
|
98
98
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection-indicator.js","names":[],"sources":["../../src/utils/selection-indicator.ts"],"sourcesContent":["import * as React from \"react\";\n\nexport const SELECTION_INDICATOR_MOTION_CLASS =\n\t\"transition-[left,width,top,height] duration-200 ease-out\";\n\nexport type SelectionGeometry = {\n\tleft: number;\n\twidth: number;\n\ttop: number;\n\theight: number;\n};\n\nexport type SelectionIndicatorState = SelectionGeometry & {\n\tvisible: boolean;\n\tanimated: boolean;\n};\n\nconst EMPTY: SelectionGeometry = { left: 0, width: 0, top: 0, height: 0 };\n\nexport function assignRef<T>(ref: React.Ref<T> | undefined, value: T | null) {\n\tif (typeof ref === \"function\") {\n\t\tref(value);\n\t} else if (ref) {\n\t\t(ref as React.MutableRefObject<T | null>).current = value;\n\t}\n}\n\nexport function measureSelectionItem(item: HTMLElement): SelectionGeometry {\n\treturn {\n\t\tleft: item.offsetLeft,\n\t\twidth: item.offsetWidth,\n\t\ttop: item.offsetTop,\n\t\theight: item.offsetHeight,\n\t};\n}\n\nfunction prefersReducedMotion() {\n\treturn (\n\t\ttypeof window !== \"undefined\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n\t);\n}\n\nfunction selectionTargets(root: HTMLElement) {\n\tconst targets: HTMLElement[] = [root];\n\tfor (const node of root.children) {\n\t\tif (node instanceof HTMLElement && node.getAttribute(\"aria-hidden\") !== \"true\") {\n\t\t\ttargets.push(node);\n\t\t}\n\t}\n\treturn targets;\n}\n\nexport function useSelectionIndicator({\n\titemSelector,\n\tenabled = true,\n\tmapGeometry,\n\tref,\n}: {\n\titemSelector: string;\n\tenabled?: boolean;\n\tmapGeometry?: (item: HTMLElement, root: HTMLElement) => SelectionGeometry;\n\tref?: React.Ref<HTMLElement | null>;\n}) {\n\tconst rootRef = React.useRef<HTMLElement | null>(null);\n\tconst composedRef = React.useMemo(() => {\n\t\treturn (node: HTMLElement | null) => {\n\t\t\trootRef.current = node;\n\t\t\tassignRef(ref, node);\n\t\t};\n\t}, [ref]);\n\tconst [state, setState] = React.useState<SelectionIndicatorState>({\n\t\t...EMPTY,\n\t\tvisible: false,\n\t\tanimated: false,\n\t});\n\tconst [reduced, setReduced] = React.useState(prefersReducedMotion);\n\n\tReact.useEffect(() => {\n\t\tconst media = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n\t\tconst onChange = () => setReduced(media.matches);\n\t\tonChange();\n\t\tmedia.addEventListener(\"change\", onChange);\n\t\treturn () => media.removeEventListener(\"change\", onChange);\n\t}, []);\n\n\tconst sync = React.useCallback(() => {\n\t\tconst root = rootRef.current;\n\t\tif (!root || !enabled) {\n\t\t\tsetState((current) => ({ ...current, ...EMPTY, visible: false, animated: false }));\n\t\t\treturn;\n\t\t}\n\t\tconst item = root.querySelector<HTMLElement>(itemSelector);\n\t\tif (!item) {\n\t\t\tsetState((current) => ({ ...current, width: 0, height: 0, visible: false, animated: false }));\n\t\t\treturn;\n\t\t}\n\t\t// Keep the optional dependency undefined. Production optimizers may inline a\n\t\t// function-valued parameter default, creating a new effect dependency every render.\n\t\tconst geometry = (mapGeometry ?? measureSelectionItem)(item, root);\n\t\tsetState((current) => ({\n\t\t\t...geometry,\n\t\t\tvisible: true,\n\t\t\tanimated: current.visible && !reduced,\n\t\t}));\n\t}, [enabled, itemSelector, mapGeometry, reduced]);\n\n\tReact.useLayoutEffect(() => {\n\t\tconst root = rootRef.current;\n\t\tif (!root || !enabled) {\n\t\t\treturn;\n\t\t}\n\t\tlet frame = 0;\n\t\tconst ro = new ResizeObserver(() => {\n\t\t\tcancelAnimationFrame(frame);\n\t\t\tframe = requestAnimationFrame(sync);\n\t\t});\n\t\tconst observe = () => {\n\t\t\tro.disconnect();\n\t\t\tfor (const node of selectionTargets(root)) {\n\t\t\t\tro.observe(node);\n\t\t\t}\n\t\t};\n\t\tobserve();\n\t\tsync();\n\t\tconst mo = new MutationObserver(() => {\n\t\t\tcancelAnimationFrame(frame);\n\t\t\tframe = requestAnimationFrame(() => {\n\t\t\t\tobserve();\n\t\t\t\tsync();\n\t\t\t});\n\t\t});\n\t\tmo.observe(root, {\n\t\t\tattributes: true,\n\t\t\tsubtree: true,\n\t\t\tchildList: true,\n\t\t\tcharacterData: true,\n\t\t\tattributeFilter: [\"data-state\"],\n\t\t});\n\t\treturn () => {\n\t\t\tcancelAnimationFrame(frame);\n\t\t\tmo.disconnect();\n\t\t\tro.disconnect();\n\t\t};\n\t}, [enabled, sync]);\n\n\treturn {\n\t\tref: composedRef,\n\t\tstate,\n\t\tmotionClassName: state.animated && !reduced ? SELECTION_INDICATOR_MOTION_CLASS : undefined,\n\t};\n}\n"],"mappings":";;;AAEA,
|
|
1
|
+
{"version":3,"file":"selection-indicator.js","names":["React","SELECTION_INDICATOR_MOTION_CLASS","EMPTY","assignRef","ref","value","measureSelectionItem","item","prefersReducedMotion","selectionTargets","targets","root","node","useSelectionIndicator","rootRef","composedRef","state","setState","reduced","setReduced","media","onChange","sync","enabled","current","itemSelector","geometry","mapGeometry","frame","ro","observe","mo"],"sources":["../../src/utils/selection-indicator.ts"],"sourcesContent":["import * as React from \"react\";\n\nexport const SELECTION_INDICATOR_MOTION_CLASS =\n\t\"transition-[left,width,top,height] duration-200 ease-out\";\n\nexport type SelectionGeometry = {\n\tleft: number;\n\twidth: number;\n\ttop: number;\n\theight: number;\n};\n\nexport type SelectionIndicatorState = SelectionGeometry & {\n\tvisible: boolean;\n\tanimated: boolean;\n};\n\nconst EMPTY: SelectionGeometry = { left: 0, width: 0, top: 0, height: 0 };\n\nexport function assignRef<T>(ref: React.Ref<T> | undefined, value: T | null) {\n\tif (typeof ref === \"function\") {\n\t\tref(value);\n\t} else if (ref) {\n\t\t(ref as React.MutableRefObject<T | null>).current = value;\n\t}\n}\n\nexport function measureSelectionItem(item: HTMLElement): SelectionGeometry {\n\treturn {\n\t\tleft: item.offsetLeft,\n\t\twidth: item.offsetWidth,\n\t\ttop: item.offsetTop,\n\t\theight: item.offsetHeight,\n\t};\n}\n\nfunction prefersReducedMotion() {\n\treturn (\n\t\ttypeof window !== \"undefined\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n\t);\n}\n\nfunction selectionTargets(root: HTMLElement) {\n\tconst targets: HTMLElement[] = [root];\n\tfor (const node of root.children) {\n\t\tif (node instanceof HTMLElement && node.getAttribute(\"aria-hidden\") !== \"true\") {\n\t\t\ttargets.push(node);\n\t\t}\n\t}\n\treturn targets;\n}\n\nexport function useSelectionIndicator({\n\titemSelector,\n\tenabled = true,\n\tmapGeometry,\n\tref,\n}: {\n\titemSelector: string;\n\tenabled?: boolean;\n\tmapGeometry?: (item: HTMLElement, root: HTMLElement) => SelectionGeometry;\n\tref?: React.Ref<HTMLElement | null>;\n}) {\n\tconst rootRef = React.useRef<HTMLElement | null>(null);\n\tconst composedRef = React.useMemo(() => {\n\t\treturn (node: HTMLElement | null) => {\n\t\t\trootRef.current = node;\n\t\t\tassignRef(ref, node);\n\t\t};\n\t}, [ref]);\n\tconst [state, setState] = React.useState<SelectionIndicatorState>({\n\t\t...EMPTY,\n\t\tvisible: false,\n\t\tanimated: false,\n\t});\n\tconst [reduced, setReduced] = React.useState(prefersReducedMotion);\n\n\tReact.useEffect(() => {\n\t\tconst media = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n\t\tconst onChange = () => setReduced(media.matches);\n\t\tonChange();\n\t\tmedia.addEventListener(\"change\", onChange);\n\t\treturn () => media.removeEventListener(\"change\", onChange);\n\t}, []);\n\n\tconst sync = React.useCallback(() => {\n\t\tconst root = rootRef.current;\n\t\tif (!root || !enabled) {\n\t\t\tsetState((current) => ({ ...current, ...EMPTY, visible: false, animated: false }));\n\t\t\treturn;\n\t\t}\n\t\tconst item = root.querySelector<HTMLElement>(itemSelector);\n\t\tif (!item) {\n\t\t\tsetState((current) => ({ ...current, width: 0, height: 0, visible: false, animated: false }));\n\t\t\treturn;\n\t\t}\n\t\t// Keep the optional dependency undefined. Production optimizers may inline a\n\t\t// function-valued parameter default, creating a new effect dependency every render.\n\t\tconst geometry = (mapGeometry ?? measureSelectionItem)(item, root);\n\t\tsetState((current) => ({\n\t\t\t...geometry,\n\t\t\tvisible: true,\n\t\t\tanimated: current.visible && !reduced,\n\t\t}));\n\t}, [enabled, itemSelector, mapGeometry, reduced]);\n\n\tReact.useLayoutEffect(() => {\n\t\tconst root = rootRef.current;\n\t\tif (!root || !enabled) {\n\t\t\treturn;\n\t\t}\n\t\tlet frame = 0;\n\t\tconst ro = new ResizeObserver(() => {\n\t\t\tcancelAnimationFrame(frame);\n\t\t\tframe = requestAnimationFrame(sync);\n\t\t});\n\t\tconst observe = () => {\n\t\t\tro.disconnect();\n\t\t\tfor (const node of selectionTargets(root)) {\n\t\t\t\tro.observe(node);\n\t\t\t}\n\t\t};\n\t\tobserve();\n\t\tsync();\n\t\tconst mo = new MutationObserver(() => {\n\t\t\tcancelAnimationFrame(frame);\n\t\t\tframe = requestAnimationFrame(() => {\n\t\t\t\tobserve();\n\t\t\t\tsync();\n\t\t\t});\n\t\t});\n\t\tmo.observe(root, {\n\t\t\tattributes: true,\n\t\t\tsubtree: true,\n\t\t\tchildList: true,\n\t\t\tcharacterData: true,\n\t\t\tattributeFilter: [\"data-state\", \"aria-checked\"],\n\t\t});\n\t\treturn () => {\n\t\t\tcancelAnimationFrame(frame);\n\t\t\tmo.disconnect();\n\t\t\tro.disconnect();\n\t\t};\n\t}, [enabled, sync]);\n\n\treturn {\n\t\tref: composedRef,\n\t\tstate,\n\t\tmotionClassName: state.animated && !reduced ? SELECTION_INDICATOR_MOTION_CLASS : undefined,\n\t};\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-checkable-group.js","names":[],"sources":["../../src/utils/use-checkable-group.ts"],"sourcesContent":["import * as React from \"react\";\n\nexport function useCheckableGroup({\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\terror,\n\tdescribedBy,\n\tariaInvalid,\n\tform,\n\tref,\n}: {\n\tvalue?: string[];\n\tdefaultValue?: string[];\n\tonValueChange?: (value: string[]) => void;\n\terror?: React.ReactNode;\n\tdescribedBy?: string;\n\tariaInvalid?: React.AriaAttributes[\"aria-invalid\"];\n\tform?: string;\n\tref: React.ForwardedRef<HTMLFieldSetElement>;\n}) {\n\tconst generatedId = React.useId();\n\tconst nodeRef = React.useRef<HTMLFieldSetElement | null>(null);\n\tconst [uncontrolled, setUncontrolled] = React.useState(defaultValue ?? []);\n\tconst current = value ?? uncontrolled;\n\tconst invalid = Boolean(error);\n\tconst errorId = `${generatedId}-error`;\n\tconst mergedDescribedBy =\n\t\t[invalid ? errorId : null, describedBy].filter(Boolean).join(\" \") || undefined;\n\tconst resetEventRef = React.useRef<Event | null>(null);\n\tconst setValue = React.useCallback(\n\t\t(next: string[]) => {\n\t\t\tconst activeReset = resetEventRef.current;\n\t\t\tif (activeReset && activeReset.eventPhase !== Event.NONE) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (value === undefined) {\n\t\t\t\tsetUncontrolled(next);\n\t\t\t}\n\t\t\tonValueChange?.(next);\n\t\t},\n\t\t[onValueChange, value],\n\t);\n\tconst setRefs = React.useCallback(\n\t\t(node: HTMLFieldSetElement | null) => {\n\t\t\tnodeRef.current = node;\n\t\t\tif (!ref) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (typeof ref === \"function\") {\n\t\t\t\tconst cleanup = (ref as React.RefCallback<HTMLFieldSetElement>)(node);\n\t\t\t\tif (typeof cleanup === \"function\") {\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tnodeRef.current = null;\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn () => {\n\t\t\t\t\tnodeRef.current = null;\n\t\t\t\t\tref(null);\n\t\t\t\t};\n\t\t\t}\n\t\t\t(ref as React.RefObject<HTMLFieldSetElement | null>).current = node;\n\t\t\treturn () => {\n\t\t\t\tnodeRef.current = null;\n\t\t\t\t(ref as React.RefObject<HTMLFieldSetElement | null>).current = null;\n\t\t\t};\n\t\t},\n\t\t[ref],\n\t);\n\tconst latestConfigRef = React.useRef({\n\t\tdefaultValue,\n\t\tvalue,\n\t});\n\tReact.useEffect(() => {\n\t\tlatestConfigRef.current = {\n\t\t\tdefaultValue,\n\t\t\tvalue,\n\t\t};\n\t});\n\n\tReact.useEffect(() => {\n\t\tconst formEl = nodeRef.current?.form;\n\t\tif (!formEl || (form && formEl.id !== form)) {\n\t\t\treturn;\n\t\t}\n\t\tlet disposed = false;\n\t\tconst timers = new Set<ReturnType<typeof setTimeout>>();\n\t\tconst onReset = (event: Event) => {\n\t\t\tresetEventRef.current = event;\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\ttimers.delete(timer);\n\t\t\t\tif (disposed || event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst cfg = latestConfigRef.current;\n\t\t\t\tif (cfg.value === undefined) {\n\t\t\t\t\tsetUncontrolled(cfg.defaultValue ?? []);\n\t\t\t\t}\n\t\t\t}, 0);\n\t\t\ttimers.add(timer);\n\t\t};\n\t\tformEl.addEventListener(\"reset\", onReset, true);\n\t\treturn () => {\n\t\t\tdisposed = true;\n\t\t\tresetEventRef.current = null;\n\t\t\tfor (const timer of timers) {\n\t\t\t\tclearTimeout(timer);\n\t\t\t}\n\t\t\ttimers.clear();\n\t\t\tformEl.removeEventListener(\"reset\", onReset, true);\n\t\t};\n\t}, [form]);\n\n\treturn {\n\t\tcurrent,\n\t\tsetValue,\n\t\tinvalid,\n\t\terrorId,\n\t\tmergedDescribedBy,\n\t\tsetRefs,\n\t\tariaInvalid: invalid ? true : ariaInvalid,\n\t};\n}\n"],"mappings":";;;AAEA,
|
|
1
|
+
{"version":3,"file":"use-checkable-group.js","names":["React","useCheckableGroup","generatedId","nodeRef","uncontrolled","setUncontrolled","defaultValue","current","value","invalid","error","errorId","mergedDescribedBy","describedBy","resetEventRef","setValue","activeReset","next","onValueChange","setRefs","node","ref","cleanup","latestConfigRef","formEl","form","disposed","timers","onReset","event","timer","cfg","ariaInvalid"],"sources":["../../src/utils/use-checkable-group.ts"],"sourcesContent":["import * as React from \"react\";\n\nexport function useCheckableGroup({\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\terror,\n\tdescribedBy,\n\tariaInvalid,\n\tform,\n\tref,\n}: {\n\tvalue?: string[];\n\tdefaultValue?: string[];\n\tonValueChange?: (value: string[]) => void;\n\terror?: React.ReactNode;\n\tdescribedBy?: string;\n\tariaInvalid?: React.AriaAttributes[\"aria-invalid\"];\n\tform?: string;\n\tref: React.ForwardedRef<HTMLFieldSetElement>;\n}) {\n\tconst generatedId = React.useId();\n\tconst nodeRef = React.useRef<HTMLFieldSetElement | null>(null);\n\tconst [uncontrolled, setUncontrolled] = React.useState(defaultValue ?? []);\n\tconst current = value ?? uncontrolled;\n\tconst invalid = Boolean(error);\n\tconst errorId = `${generatedId}-error`;\n\tconst mergedDescribedBy =\n\t\t[invalid ? errorId : null, describedBy].filter(Boolean).join(\" \") || undefined;\n\tconst resetEventRef = React.useRef<Event | null>(null);\n\tconst setValue = React.useCallback(\n\t\t(next: string[]) => {\n\t\t\tconst activeReset = resetEventRef.current;\n\t\t\tif (activeReset && activeReset.eventPhase !== Event.NONE) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (value === undefined) {\n\t\t\t\tsetUncontrolled(next);\n\t\t\t}\n\t\t\tonValueChange?.(next);\n\t\t},\n\t\t[onValueChange, value],\n\t);\n\tconst setRefs = React.useCallback(\n\t\t(node: HTMLFieldSetElement | null) => {\n\t\t\tnodeRef.current = node;\n\t\t\tif (!ref) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (typeof ref === \"function\") {\n\t\t\t\tconst cleanup = (ref as React.RefCallback<HTMLFieldSetElement>)(node);\n\t\t\t\tif (typeof cleanup === \"function\") {\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tnodeRef.current = null;\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn () => {\n\t\t\t\t\tnodeRef.current = null;\n\t\t\t\t\tref(null);\n\t\t\t\t};\n\t\t\t}\n\t\t\t(ref as React.RefObject<HTMLFieldSetElement | null>).current = node;\n\t\t\treturn () => {\n\t\t\t\tnodeRef.current = null;\n\t\t\t\t(ref as React.RefObject<HTMLFieldSetElement | null>).current = null;\n\t\t\t};\n\t\t},\n\t\t[ref],\n\t);\n\tconst latestConfigRef = React.useRef({\n\t\tdefaultValue,\n\t\tvalue,\n\t});\n\tReact.useEffect(() => {\n\t\tlatestConfigRef.current = {\n\t\t\tdefaultValue,\n\t\t\tvalue,\n\t\t};\n\t});\n\n\tReact.useEffect(() => {\n\t\tconst formEl = nodeRef.current?.form;\n\t\tif (!formEl || (form && formEl.id !== form)) {\n\t\t\treturn;\n\t\t}\n\t\tlet disposed = false;\n\t\tconst timers = new Set<ReturnType<typeof setTimeout>>();\n\t\tconst onReset = (event: Event) => {\n\t\t\tresetEventRef.current = event;\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\ttimers.delete(timer);\n\t\t\t\tif (disposed || event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst cfg = latestConfigRef.current;\n\t\t\t\tif (cfg.value === undefined) {\n\t\t\t\t\tsetUncontrolled(cfg.defaultValue ?? []);\n\t\t\t\t}\n\t\t\t}, 0);\n\t\t\ttimers.add(timer);\n\t\t};\n\t\tformEl.addEventListener(\"reset\", onReset, true);\n\t\treturn () => {\n\t\t\tdisposed = true;\n\t\t\tresetEventRef.current = null;\n\t\t\tfor (const timer of timers) {\n\t\t\t\tclearTimeout(timer);\n\t\t\t}\n\t\t\ttimers.clear();\n\t\t\tformEl.removeEventListener(\"reset\", onReset, true);\n\t\t};\n\t}, [form]);\n\n\treturn {\n\t\tcurrent,\n\t\tsetValue,\n\t\tinvalid,\n\t\terrorId,\n\t\tmergedDescribedBy,\n\t\tsetRefs,\n\t\tariaInvalid: invalid ? true : ariaInvalid,\n\t};\n}\n"],"mappings":";;;AAEA,SAAgBC,EAAkB,EACjC,UACA,iBACA,kBACA,UACA,gBACA,gBACA,SACA,UAUE;CACF,IAAMC,IAAcF,EAAM,MAAM,GAC1BG,IAAUH,EAAM,OAAmC,IAAI,GACvD,CAACI,GAAcC,KAAmBL,EAAM,SAASM,KAAgB,CAAC,CAAC,GACnEC,IAAUC,KAASJ,GACnBK,IAAU,EAAQC,GAClBC,IAAU,GAAGT,EAAY,SACzBU,IACL,CAACH,IAAUE,IAAU,MAAME,CAAW,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,KAAK,KAAA,GAChEC,IAAgBd,EAAM,OAAqB,IAAI,GAC/Ce,IAAWf,EAAM,aACrB,MAAmB;EACnB,IAAMgB,IAAcF,EAAc;EAClC,AAAIE,KAAeA,EAAY,eAAe,MAAM,SAGhDR,MAAU,KAAA,KACbH,EAAgBY,CAAI,GAErBC,IAAgBD,CAAI;CACrB,GACA,CAACC,GAAeV,CAAK,CACtB,GACMW,IAAUnB,EAAM,aACpB,MAAqC;EAErC,IADA,EAAQ,UAAUoB,GACbC,GAGL;OAAI,OAAOA,KAAQ,YAAY;IAC9B,IAAMC,IAAWD,EAA+CD,CAAI;IAOpE,OANI,OAAOE,KAAY,mBACT;KAEZ,AADA,EAAQ,UAAU,MAClBA,EAAQ;IACT,UAEY;KAEZ,AADA,EAAQ,UAAU,MAClBD,EAAI,IAAI;IACT;GACD;GAEA,OADA,EAAqD,UAAUD,SAClD;IAEZ,AADA,EAAQ,UAAU,MAClB,EAAqD,UAAU;GAChE;EALA;CAMD,GACA,CAACC,CAAG,CACL,GACME,IAAkBvB,EAAM,OAAO;EACpC;EACA;CACD,CAAC;CAyCD,OAxCAA,EAAM,gBAAgB;EACrB,EAAgB,UAAU;GACzB;GACA;EACD;CACD,CAAC,GAEDA,EAAM,gBAAgB;EACrB,IAAMwB,IAASrB,EAAQ,SAAS;EAChC,IAAI,CAACqB,KAAWC,KAAQD,EAAO,OAAOC,GACrC;EAED,IAAIC,IAAW,IACTC,oBAAS,IAAI,IAAmC,GAChDC,KAAW,MAAiB;GACjC,EAAc,UAAUC;GACxB,IAAMC,IAAQ,iBAAiB;IAE9B,IADAH,EAAO,OAAOG,CAAK,GACfJ,KAAYG,EAAM,kBACrB;IAED,IAAME,IAAMR,EAAgB;IAC5B,AAAIQ,EAAI,UAAU,KAAA,KACjB1B,EAAgB0B,EAAI,gBAAgB,CAAC,CAAC;GAExC,GAAG,CAAC;GACJ,EAAO,IAAID,CAAK;EACjB;EAEA,OADAN,EAAO,iBAAiB,SAASI,GAAS,EAAI,SACjC;GAEZ,AADA,IAAW,IACX,EAAc,UAAU;GACxB,KAAK,IAAME,KAASH,GACnB,aAAaG,CAAK;GAGnB,AADAH,EAAO,MAAM,GACbH,EAAO,oBAAoB,SAASI,GAAS,EAAI;EAClD;CACD,GAAG,CAACH,CAAI,CAAC,GAEF;EACN;EACA;EACA;EACA;EACA;EACA;EACA,aAAahB,IAAU,KAAOuB;CAC/B;AACD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nocoo/basalt",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
"clsx": "^2.1.1",
|
|
82
82
|
"cmdk": "^1.1.1",
|
|
83
83
|
"sonner": "2.0.8",
|
|
84
|
-
"tailwind-merge": "3.
|
|
84
|
+
"tailwind-merge": "3.7.0"
|
|
85
85
|
},
|
|
86
86
|
"peerDependencies": {
|
|
87
87
|
"react": "^19",
|