@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.
Files changed (153) hide show
  1. package/ai/INTEGRATION.md +66 -28
  2. package/ai/RECIPES.md +46 -1
  3. package/ai/USAGE.md +2 -2
  4. package/ai/registry.json +65 -23
  5. package/dist/assets/brand-mark.js.map +1 -1
  6. package/dist/charts/area.js.map +1 -1
  7. package/dist/charts/bar.js.map +1 -1
  8. package/dist/charts/bullet.js.map +1 -1
  9. package/dist/charts/charts.js.map +1 -1
  10. package/dist/charts/config.js.map +1 -1
  11. package/dist/charts/custom-chart.js.map +1 -1
  12. package/dist/charts/date-navigation.js.map +1 -1
  13. package/dist/charts/donut.js.map +1 -1
  14. package/dist/charts/frame.js.map +1 -1
  15. package/dist/charts/funnel.js.map +1 -1
  16. package/dist/charts/gauge.js.map +1 -1
  17. package/dist/charts/grouped-bar.js.map +1 -1
  18. package/dist/charts/heatmap-calendar.js.map +1 -1
  19. package/dist/charts/heatmap-matrix.js.map +1 -1
  20. package/dist/charts/item-list.js.map +1 -1
  21. package/dist/charts/legend.js.map +1 -1
  22. package/dist/charts/line.js.map +1 -1
  23. package/dist/charts/palette.js.map +1 -1
  24. package/dist/charts/radar.js.map +1 -1
  25. package/dist/charts/sample.js.map +1 -1
  26. package/dist/charts/sankey.js.map +1 -1
  27. package/dist/charts/series.js.map +1 -1
  28. package/dist/charts/slot-bar.js.map +1 -1
  29. package/dist/charts/sparkline.js.map +1 -1
  30. package/dist/charts/stacked-bar.js.map +1 -1
  31. package/dist/charts/stat-card.js.map +1 -1
  32. package/dist/charts/timeline.js.map +1 -1
  33. package/dist/charts/timeseries.js.map +1 -1
  34. package/dist/charts/tooltip.js.map +1 -1
  35. package/dist/components/accordion.js.map +1 -1
  36. package/dist/components/alert-dialog.js.map +1 -1
  37. package/dist/components/app-header.d.ts +5 -1
  38. package/dist/components/app-header.js +12 -4
  39. package/dist/components/app-header.js.map +1 -1
  40. package/dist/components/app-shell.d.ts +4 -1
  41. package/dist/components/app-shell.js +7 -4
  42. package/dist/components/app-shell.js.map +1 -1
  43. package/dist/components/autocomplete.js.map +1 -1
  44. package/dist/components/avatar.js.map +1 -1
  45. package/dist/components/badge.js.map +1 -1
  46. package/dist/components/banner.js.map +1 -1
  47. package/dist/components/basalt-mark.js.map +1 -1
  48. package/dist/components/battery-meter.js.map +1 -1
  49. package/dist/components/breadcrumbs.js.map +1 -1
  50. package/dist/components/button.js +2 -2
  51. package/dist/components/button.js.map +1 -1
  52. package/dist/components/chat-bubble.js.map +1 -1
  53. package/dist/components/chat-composer.js.map +1 -1
  54. package/dist/components/chat-header.js.map +1 -1
  55. package/dist/components/chat-inbox.js.map +1 -1
  56. package/dist/components/checkbox.js.map +1 -1
  57. package/dist/components/clipboard-text.js.map +1 -1
  58. package/dist/components/code.js.map +1 -1
  59. package/dist/components/collapsible.js.map +1 -1
  60. package/dist/components/combobox.js.map +1 -1
  61. package/dist/components/command-palette.js.map +1 -1
  62. package/dist/components/confirm-dialog.d.ts +4 -1
  63. package/dist/components/confirm-dialog.js +20 -18
  64. package/dist/components/confirm-dialog.js.map +1 -1
  65. package/dist/components/context-menu.js.map +1 -1
  66. package/dist/components/data-table.js +1 -1
  67. package/dist/components/data-table.js.map +1 -1
  68. package/dist/components/date-picker.js.map +1 -1
  69. package/dist/components/delete-resource.js +1 -1
  70. package/dist/components/delete-resource.js.map +1 -1
  71. package/dist/components/description-list.js.map +1 -1
  72. package/dist/components/dialog.js.map +1 -1
  73. package/dist/components/dock.js.map +1 -1
  74. package/dist/components/dropdown-menu.js.map +1 -1
  75. package/dist/components/editable-nav-item.js.map +1 -1
  76. package/dist/components/empty.js.map +1 -1
  77. package/dist/components/fab.js.map +1 -1
  78. package/dist/components/field.js.map +1 -1
  79. package/dist/components/file-dropzone.js.map +1 -1
  80. package/dist/components/filter-bar.js.map +1 -1
  81. package/dist/components/flow.js.map +1 -1
  82. package/dist/components/grid.js.map +1 -1
  83. package/dist/components/hover-card.js.map +1 -1
  84. package/dist/components/icon-picker.js.map +1 -1
  85. package/dist/components/inline-editable.js.map +1 -1
  86. package/dist/components/input-area.js.map +1 -1
  87. package/dist/components/input-group.js.map +1 -1
  88. package/dist/components/input.js.map +1 -1
  89. package/dist/components/label.js.map +1 -1
  90. package/dist/components/layer-card.js.map +1 -1
  91. package/dist/components/link.js.map +1 -1
  92. package/dist/components/loader.js.map +1 -1
  93. package/dist/components/loading-screen.js.map +1 -1
  94. package/dist/components/menu-bar.js.map +1 -1
  95. package/dist/components/meter.js.map +1 -1
  96. package/dist/components/multi-select.js.map +1 -1
  97. package/dist/components/navigation-menu.js.map +1 -1
  98. package/dist/components/overlay.js.map +1 -1
  99. package/dist/components/page-header.js.map +1 -1
  100. package/dist/components/pagination.js.map +1 -1
  101. package/dist/components/popover.js.map +1 -1
  102. package/dist/components/radio.js.map +1 -1
  103. package/dist/components/resource-list.js.map +1 -1
  104. package/dist/components/responsive-master-detail.js +5 -5
  105. package/dist/components/responsive-master-detail.js.map +1 -1
  106. package/dist/components/scroll-area.js.map +1 -1
  107. package/dist/components/section-rule.js.map +1 -1
  108. package/dist/components/segment-control.js.map +1 -1
  109. package/dist/components/select.js.map +1 -1
  110. package/dist/components/sensitive-input.js.map +1 -1
  111. package/dist/components/separator.js.map +1 -1
  112. package/dist/components/sheet.js +1 -0
  113. package/dist/components/sheet.js.map +1 -1
  114. package/dist/components/sidebar.d.ts +3 -1
  115. package/dist/components/sidebar.js +8 -5
  116. package/dist/components/sidebar.js.map +1 -1
  117. package/dist/components/skeleton-line.js.map +1 -1
  118. package/dist/components/slider.js.map +1 -1
  119. package/dist/components/stat-strip.js.map +1 -1
  120. package/dist/components/switch.js.map +1 -1
  121. package/dist/components/table-of-contents.js.map +1 -1
  122. package/dist/components/table-pager.js.map +1 -1
  123. package/dist/components/table.js.map +1 -1
  124. package/dist/components/tabs.js.map +1 -1
  125. package/dist/components/tag-badge.js.map +1 -1
  126. package/dist/components/tag-color-picker.js.map +1 -1
  127. package/dist/components/text.js.map +1 -1
  128. package/dist/components/theme-toggle.js.map +1 -1
  129. package/dist/components/toast.js.map +1 -1
  130. package/dist/components/toggle-group.js +2 -2
  131. package/dist/components/toggle-group.js.map +1 -1
  132. package/dist/components/toggle.js +1 -1
  133. package/dist/components/toggle.js.map +1 -1
  134. package/dist/components/toolbar.js.map +1 -1
  135. package/dist/components/tooltip.js +14 -13
  136. package/dist/components/tooltip.js.map +1 -1
  137. package/dist/components/typeahead-field.js.map +1 -1
  138. package/dist/components/upload-queue.js.map +1 -1
  139. package/dist/providers/accent.js +1 -1
  140. package/dist/providers/accent.js.map +1 -1
  141. package/dist/providers/link.js.map +1 -1
  142. package/dist/providers/theme.js +1 -1
  143. package/dist/providers/theme.js.map +1 -1
  144. package/dist/styles/base.css +116 -0
  145. package/dist/styles/standalone.css +161 -16
  146. package/dist/utils/cn.js.map +1 -1
  147. package/dist/utils/control-surface.js.map +1 -1
  148. package/dist/utils/preference-store.js +1 -1
  149. package/dist/utils/preference-store.js.map +1 -1
  150. package/dist/utils/selection-indicator.js +1 -1
  151. package/dist/utils/selection-indicator.js.map +1 -1
  152. package/dist/utils/use-checkable-group.js.map +1 -1
  153. 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
  }
@@ -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,SAAgB,EAAG,GAAG,GAAsB;CAC3C,OAAO,EAAQ,EAAK,CAAM,CAAC;AAC5B"}
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,IAAa,IAAkB,aAElB,IACZ;AAED,SAAgB,EAAoB,GAAoB;CACvD,OAAO,EAAG,GAAuB,CAAS;AAC3C"}
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 > "u" || p.size === 1 && !_ && (window.addEventListener("storage", g), window.addEventListener(c, h), _ = () => {
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":";;AAQA,SAASA,EAAmB,GAAgC;CAC3D,IAAI;EAKH,OAJI,OAAO,SAAW,OAAe,CAAC,OAAO,eACrC,EAAE,QAAQ,QAAQ,IAGnB;GAAE,QAAQ;GAAW,OADd,OAAO,aAAa,QAAQC,CACd;EAAM;CACnC,QAAQ;EACP,OAAO,EAAE,QAAQ,QAAQ;CAC1B;AACD;AAEA,SAASC,EAAmB,GAAa,GAAwB;CAChE,IAAI;EAKH,OAJI,OAAO,SAAW,OAAe,CAAC,OAAO,eACrC,MAER,OAAO,aAAa,QAAQD,GAAKE,CAAK,GAC/B;CACR,QAAQ;EACP,OAAO;CACR;AACD;AAEA,SAASC,EAAmB,GAA2C;CACtE,IAAI,CAACC,GACJ,OAAO;CAER,IAAI;EACH,IAAI,OAAO,SAAW,OAAe,OAAO,cAC3C,OAAOA,MAAS,OAAO;CAEzB,QAAQ;EACP,OAAO;CACR;CACA,OAAO;AACR;AAQA,SAAgBC,EAAwC,EACvD,eACA,cAAcC,GACd,YACA,YACA,cACA,gBAKE;CACF,IAAIC,IAAeC,EAAUF,CAAmB,GAC5CG,IAAcF,GACdG,IAAuB,IACvBC,IAAgB;CAEpB,IAAIC,GAAS;EACZ,IAAMC,IAAMd,EAAmBe,CAAU;EACzC,AAAID,EAAI,WAAW,aAAaE,EAAQF,EAAI,KAAK,MAChD,IAAcL,EAAUK,EAAI,KAAK,GACjC,IAAuB;CAEzB;CAEA,IAAMG,oBAAY,IAAI,IAAgB,GAChCC,UAAe;EACpB,KAAK,IAAMC,KAAYF,GACtB,EAAS;CAEX,GAEMG,KAAoB,MAAiB;EAC1C,IAAI,CAACP,GACJ;EAED,IAAMQ,IAAWC;EACjB,IAAI,CAACD,EAAS,UAAUA,EAAS,OAAO,QAAQN,GAC/C;EAED,IAAM,EAAE,UAAO,sBAAmBM,EAAS;EAI3C,AAHA,IAAgB,CAACE,GACjB,IAAcpB,GACd,IAAuB,IACvBe,EAAO;CACR,GAEMM,KAAa,MAAgC;EAClD,IAAI,CAACX,GACJ;EAED,IAAMY,IAAYH;EAClB,IAAI,SAASG,KAAaA,EAAU,QAAQ,KAAA,GAAW;GAItD,IAHI,CAACrB,EAAmBqB,EAAU,WAAW,KAGzCA,EAAU,QAAQ,QAAQA,EAAU,QAAQV,GAC/C;GAED,IAAgB;GAChB,IAAMW,IAAWD,EAAU;GAQ3B,AAPIC,KAAa,QAAkC,CAACV,EAAQU,CAAQ,KACnE,IAAclB,GACd,IAAuB,OAEvB,IAAcC,EAAUiB,CAAQ,GAChC,IAAuB,KAExBR,EAAO;GACP;EACD;EAEA,IAAIN,GACH;EAED,IAAME,IAAMd,EAAmBe,CAAU;EACzC,AAAID,EAAI,WAAW,YAGfE,EAAQF,EAAI,KAAK,KACpB,IAAcL,EAAUK,EAAI,KAAK,GACjC,IAAuB,OAEvB,IAAcN,GACd,IAAuB,KAExBU,EAAO;CACR,GAEIS,IAA8C,MAC5CC,UAA8B;EACnC,AAAI,OAAO,SAAW,OAGlBX,EAAU,SAAS,KAAK,CAACU,MAC5B,OAAO,iBAAiB,WAAWH,CAAS,GAC5C,OAAO,iBAAiBK,GAAWT,CAAgB,GACnD,UAA+B;GAG9B,AAFA,OAAO,oBAAoB,WAAWI,CAAS,GAC/C,OAAO,oBAAoBK,GAAWT,CAAgB,GACtD,IAAyB;EAC1B;CAEF,GAEMU,UAA8B;EACnC,AAAIb,EAAU,SAAS,KAAKU,KAC3BA,EAAuB;CAEzB;CAEA,OAAO;EACN,mBAAmBjB;EACnB,YAAY,OACXO,EAAU,IAAIE,CAAQ,GACtBS,EAAsB,SACT;GAEZ,AADAX,EAAU,OAAOE,CAAQ,GACzBW,EAAsB;EACvB;EAED,WAAW,MAAY;GACtB,IAAM3B,IAAQM,EAAUsB,CAAI;GAG5B,IAFA,IAAc5B,GACd,IAAuB,IACnBU,GAAS;IACZ,IAAMU,IAAiBrB,EAAmBa,GAAYZ,CAAK;IAE3D,IADA,IAAgB,CAACoB,GACb,OAAO,SAAW,KACrB,IAAI;KACH,OAAO,cACN,IAAI,YAA4CM,GAAW,EAC1D,QAAQ;MAAE,KAAKd;MAAY;MAAO;KAAe,EAClD,CAAC,CACF;IACD,QAAQ,CAER;GAEF;GACA,EAAO;EACR;EACA,eAAe,MAAgC;GAC9C,IAAMiB,IAAajB,MAAekB,EAAO,YACnCC,IAAiBrB,MAAYoB,EAAO,SACpCE,IAAoB1B,EAAUwB,EAAO,YAAY,GACjDG,IAAiB5B,MAAiB2B,GAElCE,IAAaxB;GAKnB,IAJA,IAAaoB,EAAO,YACpB,IAAeE,GACf,IAAUF,EAAO,SAEbD,GACC;QAAAnB,GAAS;KACZ,IAAMC,IAAMd,EAAmBe,CAAU;KAWzC,AAVID,EAAI,WAAW,cAClB,IAAgB,IACZE,EAAQF,EAAI,KAAK,KACpB,IAAcL,EAAUK,EAAI,KAAK,GACjC,IAAuB,OAEvB,IAAcN,GACd,IAAuB,MAGzBU,EAAO;IACR;UACM,IAAIgB,GACN;QAAA,CAACG,KAAcxB,GAAS;KAC3B,IAAMC,IAAMd,EAAmBe,CAAU;KACzC,AAAID,EAAI,WAAW,cAClB,IAAgB,IACZE,EAAQF,EAAI,KAAK,MACpB,IAAcL,EAAUK,EAAI,KAAK,GACjC,IAAuB,IACvBI,EAAO;IAGV;UACM,IAAIkB,KACN,CAACzB,GAAsB;IAC1B,IAAIE,GAAS;KACZ,IAAMC,IAAMd,EAAmBe,CAAU;KACzC,AAAID,EAAI,WAAW,aAAa,CAACE,EAAQF,EAAI,KAAK,MACjD,IAAcN,GACdU,EAAO;IAET,OAEC,AADA,IAAcV,GACdU,EAAO;GAET;EAEF;CACD;AACD"}
@@ -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":"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"}
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,SAAgB,EAAkB,EACjC,UACA,iBACA,kBACA,UACA,gBACA,gBACA,SACA,UAUE;CACF,IAAM,IAAc,EAAM,MAAM,GAC1B,IAAU,EAAM,OAAmC,IAAI,GACvD,CAAC,GAAc,KAAmB,EAAM,SAAS,KAAgB,CAAC,CAAC,GACnE,IAAU,KAAS,GACnB,IAAU,EAAQ,GAClB,IAAU,GAAG,EAAY,SACzB,IACL,CAAC,IAAU,IAAU,MAAM,CAAW,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,KAAK,KAAA,GAChE,IAAgB,EAAM,OAAqB,IAAI,GAC/C,IAAW,EAAM,aACrB,MAAmB;EACnB,IAAM,IAAc,EAAc;EAC9B,KAAe,EAAY,eAAe,MAAM,SAGhD,MAAU,KAAA,KACb,EAAgB,CAAI,GAErB,IAAgB,CAAI;CACrB,GACA,CAAC,GAAe,CAAK,CACtB,GACM,IAAU,EAAM,aACpB,MAAqC;EACrC,MAAQ,UAAU,GACb,GAGL;OAAI,OAAO,KAAQ,YAAY;IAC9B,IAAM,IAAW,EAA+C,CAAI;IAOpE,OANI,OAAO,KAAY,mBACT;KAEZ,AADA,EAAQ,UAAU,MAClB,EAAQ;IACT,UAEY;KAEZ,AADA,EAAQ,UAAU,MAClB,EAAI,IAAI;IACT;GACD;GAEA,OADA,EAAqD,UAAU,SAClD;IAEZ,AADA,EAAQ,UAAU,MAClB,EAAqD,UAAU;GAChE;EALA;CAMD,GACA,CAAC,CAAG,CACL,GACM,IAAkB,EAAM,OAAO;EACpC;EACA;CACD,CAAC;CAyCD,OAxCA,EAAM,gBAAgB;EACrB,EAAgB,UAAU;GACzB;GACA;EACD;CACD,CAAC,GAED,EAAM,gBAAgB;EACrB,IAAM,IAAS,EAAQ,SAAS;EAChC,IAAI,CAAC,KAAW,KAAQ,EAAO,OAAO,GACrC;EAED,IAAI,IAAW,IACT,oBAAS,IAAI,IAAmC,GAChD,KAAW,MAAiB;GACjC,EAAc,UAAU;GACxB,IAAM,IAAQ,iBAAiB;IAE9B,IADA,EAAO,OAAO,CAAK,GACf,KAAY,EAAM,kBACrB;IAED,IAAM,IAAM,EAAgB;IAC5B,AAAI,EAAI,UAAU,KAAA,KACjB,EAAgB,EAAI,gBAAgB,CAAC,CAAC;GAExC,GAAG,CAAC;GACJ,EAAO,IAAI,CAAK;EACjB;EAEA,OADA,EAAO,iBAAiB,SAAS,GAAS,EAAI,SACjC;GAEZ,AADA,IAAW,IACX,EAAc,UAAU;GACxB,KAAK,IAAM,KAAS,GACnB,aAAa,CAAK;GAGnB,AADA,EAAO,MAAM,GACb,EAAO,oBAAoB,SAAS,GAAS,EAAI;EAClD;CACD,GAAG,CAAC,CAAI,CAAC,GAEF;EACN;EACA;EACA;EACA;EACA;EACA;EACA,aAAa,IAAU,KAAO;CAC/B;AACD"}
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.1.7",
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.6.0"
84
+ "tailwind-merge": "3.7.0"
85
85
  },
86
86
  "peerDependencies": {
87
87
  "react": "^19",