jaci-ui 0.7.0 → 0.8.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 (146) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +17 -0
  3. package/dist/components/alert-dialog/alert-dialog.cjs +4 -1
  4. package/dist/components/alert-dialog/alert-dialog.cjs.map +1 -1
  5. package/dist/components/alert-dialog/alert-dialog.d.cts +2 -2
  6. package/dist/components/alert-dialog/alert-dialog.d.ts +2 -2
  7. package/dist/components/alert-dialog/alert-dialog.js +4 -1
  8. package/dist/components/alert-dialog/alert-dialog.js.map +1 -1
  9. package/dist/components/color-picker/color-picker.cjs +4 -1
  10. package/dist/components/color-picker/color-picker.cjs.map +1 -1
  11. package/dist/components/color-picker/color-picker.d.cts +2 -2
  12. package/dist/components/color-picker/color-picker.d.ts +2 -2
  13. package/dist/components/color-picker/color-picker.js +4 -1
  14. package/dist/components/color-picker/color-picker.js.map +1 -1
  15. package/dist/components/combobox/combobox.cjs +4 -1
  16. package/dist/components/combobox/combobox.cjs.map +1 -1
  17. package/dist/components/combobox/combobox.d.cts +2 -2
  18. package/dist/components/combobox/combobox.d.ts +2 -2
  19. package/dist/components/combobox/combobox.js +4 -1
  20. package/dist/components/combobox/combobox.js.map +1 -1
  21. package/dist/components/command/command.cjs +73 -12
  22. package/dist/components/command/command.cjs.map +1 -1
  23. package/dist/components/command/command.d.cts +7 -1
  24. package/dist/components/command/command.d.ts +7 -1
  25. package/dist/components/command/command.js +73 -12
  26. package/dist/components/command/command.js.map +1 -1
  27. package/dist/components/command/index.d.cts +2 -2
  28. package/dist/components/command/index.d.ts +2 -2
  29. package/dist/components/context-menu/context-menu.cjs +4 -1
  30. package/dist/components/context-menu/context-menu.cjs.map +1 -1
  31. package/dist/components/context-menu/context-menu.d.cts +2 -2
  32. package/dist/components/context-menu/context-menu.d.ts +2 -2
  33. package/dist/components/context-menu/context-menu.js +4 -1
  34. package/dist/components/context-menu/context-menu.js.map +1 -1
  35. package/dist/components/date-picker/date-picker.cjs +4 -1
  36. package/dist/components/date-picker/date-picker.cjs.map +1 -1
  37. package/dist/components/date-picker/date-picker.d.cts +2 -2
  38. package/dist/components/date-picker/date-picker.d.ts +2 -2
  39. package/dist/components/date-picker/date-picker.js +4 -1
  40. package/dist/components/date-picker/date-picker.js.map +1 -1
  41. package/dist/components/date-range-picker/date-range-picker.cjs +4 -1
  42. package/dist/components/date-range-picker/date-range-picker.cjs.map +1 -1
  43. package/dist/components/date-range-picker/date-range-picker.d.cts +2 -2
  44. package/dist/components/date-range-picker/date-range-picker.d.ts +2 -2
  45. package/dist/components/date-range-picker/date-range-picker.js +4 -1
  46. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  47. package/dist/components/dialog/dialog.cjs +4 -1
  48. package/dist/components/dialog/dialog.cjs.map +1 -1
  49. package/dist/components/dialog/dialog.d.cts +2 -2
  50. package/dist/components/dialog/dialog.d.ts +2 -2
  51. package/dist/components/dialog/dialog.js +4 -1
  52. package/dist/components/dialog/dialog.js.map +1 -1
  53. package/dist/components/drawer/drawer.cjs +4 -1
  54. package/dist/components/drawer/drawer.cjs.map +1 -1
  55. package/dist/components/drawer/drawer.d.cts +2 -2
  56. package/dist/components/drawer/drawer.d.ts +2 -2
  57. package/dist/components/drawer/drawer.js +4 -1
  58. package/dist/components/drawer/drawer.js.map +1 -1
  59. package/dist/components/figure/figure.cjs +45 -36
  60. package/dist/components/figure/figure.cjs.map +1 -1
  61. package/dist/components/figure/figure.js +45 -36
  62. package/dist/components/figure/figure.js.map +1 -1
  63. package/dist/components/image/image.cjs +41 -32
  64. package/dist/components/image/image.cjs.map +1 -1
  65. package/dist/components/image/image.js +41 -32
  66. package/dist/components/image/image.js.map +1 -1
  67. package/dist/components/menu/menu.cjs +4 -1
  68. package/dist/components/menu/menu.cjs.map +1 -1
  69. package/dist/components/menu/menu.d.cts +2 -2
  70. package/dist/components/menu/menu.d.ts +2 -2
  71. package/dist/components/menu/menu.js +4 -1
  72. package/dist/components/menu/menu.js.map +1 -1
  73. package/dist/components/menubar/menubar.cjs +4 -1
  74. package/dist/components/menubar/menubar.cjs.map +1 -1
  75. package/dist/components/menubar/menubar.d.cts +2 -2
  76. package/dist/components/menubar/menubar.d.ts +2 -2
  77. package/dist/components/menubar/menubar.js +4 -1
  78. package/dist/components/menubar/menubar.js.map +1 -1
  79. package/dist/components/navigation/navigation.cjs +3 -1
  80. package/dist/components/navigation/navigation.cjs.map +1 -1
  81. package/dist/components/navigation/navigation.js +3 -1
  82. package/dist/components/navigation/navigation.js.map +1 -1
  83. package/dist/components/navigation-menu/navigation-menu.cjs +4 -1
  84. package/dist/components/navigation-menu/navigation-menu.cjs.map +1 -1
  85. package/dist/components/navigation-menu/navigation-menu.d.cts +2 -2
  86. package/dist/components/navigation-menu/navigation-menu.d.ts +2 -2
  87. package/dist/components/navigation-menu/navigation-menu.js +4 -1
  88. package/dist/components/navigation-menu/navigation-menu.js.map +1 -1
  89. package/dist/components/popover/popover.cjs +4 -1
  90. package/dist/components/popover/popover.cjs.map +1 -1
  91. package/dist/components/popover/popover.d.cts +2 -2
  92. package/dist/components/popover/popover.d.ts +2 -2
  93. package/dist/components/popover/popover.js +4 -1
  94. package/dist/components/popover/popover.js.map +1 -1
  95. package/dist/components/select/select.cjs +4 -1
  96. package/dist/components/select/select.cjs.map +1 -1
  97. package/dist/components/select/select.d.cts +2 -2
  98. package/dist/components/select/select.d.ts +2 -2
  99. package/dist/components/select/select.js +4 -1
  100. package/dist/components/select/select.js.map +1 -1
  101. package/dist/components/sidebar/sidebar.cjs +24 -17
  102. package/dist/components/sidebar/sidebar.cjs.map +1 -1
  103. package/dist/components/sidebar/sidebar.d.cts +4 -2
  104. package/dist/components/sidebar/sidebar.d.ts +4 -2
  105. package/dist/components/sidebar/sidebar.js +24 -17
  106. package/dist/components/sidebar/sidebar.js.map +1 -1
  107. package/dist/components/toast/toast.cjs +4 -1
  108. package/dist/components/toast/toast.cjs.map +1 -1
  109. package/dist/components/toast/toast.d.cts +1 -1
  110. package/dist/components/toast/toast.d.ts +1 -1
  111. package/dist/components/toast/toast.js +4 -1
  112. package/dist/components/toast/toast.js.map +1 -1
  113. package/dist/components/tooltip/tooltip.cjs +4 -1
  114. package/dist/components/tooltip/tooltip.cjs.map +1 -1
  115. package/dist/components/tooltip/tooltip.d.cts +2 -2
  116. package/dist/components/tooltip/tooltip.d.ts +2 -2
  117. package/dist/components/tooltip/tooltip.js +4 -1
  118. package/dist/components/tooltip/tooltip.js.map +1 -1
  119. package/dist/index.cjs +1 -0
  120. package/dist/index.cjs.map +1 -0
  121. package/dist/index.d.cts +2 -2
  122. package/dist/index.d.ts +2 -2
  123. package/dist/index.js +1 -0
  124. package/dist/index.js.map +1 -0
  125. package/dist/styled-system/recipes/command.cjs +3 -3
  126. package/dist/styled-system/recipes/command.cjs.map +1 -1
  127. package/dist/styled-system/recipes/command.js +3 -3
  128. package/dist/styled-system/recipes/command.js.map +1 -1
  129. package/dist/styled-system/recipes/figure.cjs +1 -0
  130. package/dist/styled-system/recipes/figure.cjs.map +1 -1
  131. package/dist/styled-system/recipes/figure.js +1 -0
  132. package/dist/styled-system/recipes/figure.js.map +1 -1
  133. package/dist/styled-system/recipes/image.cjs +1 -0
  134. package/dist/styled-system/recipes/image.cjs.map +1 -1
  135. package/dist/styled-system/recipes/image.js +1 -0
  136. package/dist/styled-system/recipes/image.js.map +1 -1
  137. package/dist/styles.css +70 -50
  138. package/dist/theme/theme-provider.cjs +18 -8
  139. package/dist/theme/theme-provider.cjs.map +1 -1
  140. package/dist/theme/theme-provider.js +18 -8
  141. package/dist/theme/theme-provider.js.map +1 -1
  142. package/dist/theme/theme-scope.cjs +21 -0
  143. package/dist/theme/theme-scope.cjs.map +1 -0
  144. package/dist/theme/theme-scope.js +19 -0
  145. package/dist/theme/theme-scope.js.map +1 -0
  146. package/package.json +7 -4
package/dist/styles.css CHANGED
@@ -5,6 +5,10 @@
5
5
  --made-with-panda: '🐼';
6
6
  }
7
7
 
8
+ :where([data-slot="bottom-navigation"]),:where([data-slot="sidebar"]) {
9
+ display: flex;
10
+ }
11
+
8
12
  [data-jaci-theme] {
9
13
  background-color: var(--jaci-colors-surface-canvas);
10
14
  color: var(--jaci-colors-fg-default);
@@ -5322,26 +5326,21 @@
5322
5326
  .jaci-image__viewport {
5323
5327
  inset: var(--jaci-spacing-0);
5324
5328
  padding: var(--jaci-spacing-4);
5325
- overflow: auto;
5326
5329
  justify-content: center;
5327
5330
  position: fixed;
5328
5331
  z-index: 60;
5329
5332
  }
5330
5333
 
5331
5334
  .jaci-image__viewport,.jaci-image__popup {
5335
+ overflow: auto;
5332
5336
  align-items: center;
5333
5337
  display: flex;
5334
5338
  }
5335
5339
 
5336
5340
  .jaci-image__popup {
5337
- padding: var(--jaci-spacing-2);
5338
- border-color: var(--jaci-colors-border-default);
5339
- border-radius: var(--jaci-radii-2xl);
5340
- border-style: solid;
5341
- border-width: 1px;
5342
- overflow: hidden;
5343
- background-color: var(--jaci-colors-surface-canvas);
5344
- box-shadow: var(--jaci-shadows-xl);
5341
+ gap: var(--jaci-spacing-2);
5342
+ background-color: var(--jaci-colors-transparent);
5343
+ flex-direction: column;
5345
5344
  position: relative;
5346
5345
  --transition-duration: var(--jaci-durations-normal);
5347
5346
  transition-duration: var(--jaci-durations-normal);
@@ -5363,10 +5362,18 @@
5363
5362
  border-radius: var(--jaci-radii-xl);
5364
5363
  display: block;
5365
5364
  object-fit: contain;
5366
- max-height: calc(100dvh - 4rem);
5365
+ max-height: calc(100dvh - 8rem);
5367
5366
  max-width: calc(100vw - 4rem);
5368
5367
  }
5369
5368
 
5369
+ .jaci-image__closeRow {
5370
+ align-items: center;
5371
+ display: flex;
5372
+ justify-content: flex-end;
5373
+ min-height: 2rem;
5374
+ width: 100%;
5375
+ }
5376
+
5370
5377
  .jaci-image__close {
5371
5378
  border-color: var(--jaci-colors-border-default);
5372
5379
  border-radius: var(--jaci-radii-full);
@@ -5379,12 +5386,9 @@
5379
5386
  color: var(--jaci-colors-fg-default);
5380
5387
  cursor: pointer;
5381
5388
  display: inline-flex;
5389
+ flex-shrink: 0;
5382
5390
  justify-content: center;
5383
- position: absolute;
5384
- z-index: 1;
5385
5391
  height: var(--jaci-sizes-8);
5386
- right: var(--jaci-spacing-3);
5387
- top: var(--jaci-spacing-3);
5388
5392
  width: var(--jaci-sizes-8);
5389
5393
  }
5390
5394
 
@@ -5478,14 +5482,8 @@
5478
5482
  }
5479
5483
 
5480
5484
  .jaci-figure__popup {
5481
- padding: var(--jaci-spacing-2);
5482
- border-color: var(--jaci-colors-border-default);
5483
- border-radius: var(--jaci-radii-2xl);
5484
- border-style: solid;
5485
- border-width: 1px;
5486
5485
  gap: var(--jaci-spacing-3);
5487
- background-color: var(--jaci-colors-surface-canvas);
5488
- box-shadow: var(--jaci-shadows-xl);
5486
+ background-color: var(--jaci-colors-transparent);
5489
5487
  flex-direction: column;
5490
5488
  position: relative;
5491
5489
  --transition-duration: var(--jaci-durations-normal);
@@ -5513,12 +5511,28 @@
5513
5511
  }
5514
5512
 
5515
5513
  .jaci-figure__lightboxCaption {
5514
+ padding: var(--jaci-spacing-3);
5515
+ border-color: var(--jaci-colors-border-default);
5516
+ border-radius: var(--jaci-radii-lg);
5517
+ border-style: solid;
5518
+ border-width: 1px;
5519
+ background-color: var(--jaci-colors-surface-canvas);
5520
+ box-sizing: border-box;
5516
5521
  color: var(--jaci-colors-fg-default);
5517
5522
  font-size: var(--jaci-font-sizes-sm);
5518
5523
  line-height: 1.5;
5519
5524
  overflow-wrap: anywhere;
5520
5525
  text-align: center;
5521
5526
  max-width: min(48rem, calc(100vw - 4rem));
5527
+ width: 100%;
5528
+ }
5529
+
5530
+ .jaci-figure__closeRow {
5531
+ align-items: center;
5532
+ display: flex;
5533
+ justify-content: flex-end;
5534
+ min-height: 2rem;
5535
+ width: 100%;
5522
5536
  }
5523
5537
 
5524
5538
  .jaci-figure__close {
@@ -5533,12 +5547,9 @@
5533
5547
  color: var(--jaci-colors-fg-default);
5534
5548
  cursor: pointer;
5535
5549
  display: inline-flex;
5550
+ flex-shrink: 0;
5536
5551
  justify-content: center;
5537
- position: absolute;
5538
- z-index: 1;
5539
5552
  height: var(--jaci-sizes-8);
5540
- right: var(--jaci-spacing-3);
5541
- top: var(--jaci-spacing-3);
5542
5553
  width: var(--jaci-sizes-8);
5543
5554
  }
5544
5555
 
@@ -6023,7 +6034,6 @@
6023
6034
  background-color: var(--jaci-colors-surface-overlay);
6024
6035
  box-shadow: var(--jaci-shadows-xl);
6025
6036
  box-sizing: border-box;
6026
- display: flex;
6027
6037
  position: fixed;
6028
6038
  transform: translateX(-50%);
6029
6039
  -webkit-user-select: none;
@@ -6145,7 +6155,7 @@
6145
6155
  overflow-wrap: anywhere;
6146
6156
  max-width: calc(100vw - 2rem);
6147
6157
  min-width: var(--jaci-sizes-0);
6148
- width: min(32rem, calc(100vw - 2rem));
6158
+ width: max-content;
6149
6159
  }
6150
6160
 
6151
6161
  .jaci-navigation-menu__link {
@@ -6216,6 +6226,7 @@
6216
6226
  overflow-wrap: anywhere;
6217
6227
  max-width: calc(100vw - 2rem);
6218
6228
  min-width: var(--jaci-sizes-0);
6229
+ width: max-content;
6219
6230
  }
6220
6231
 
6221
6232
  .jaci-navigation-menu__backdrop {
@@ -7276,7 +7287,6 @@
7276
7287
  .jaci-sidebar__root {
7277
7288
  background-color: var(--jaci-colors-surface-canvas);
7278
7289
  color: var(--jaci-colors-fg-default);
7279
- display: flex;
7280
7290
  flex-direction: column;
7281
7291
  flex-shrink: 0;
7282
7292
  position: relative;
@@ -9288,17 +9298,8 @@
9288
9298
  .jaci-drawer__footer {
9289
9299
  padding: var(--jaci-spacing-6);
9290
9300
  }
9291
- .jaci-image__viewport {
9301
+ .jaci-image__viewport,.jaci-figure__viewport {
9292
9302
  padding: var(--jaci-spacing-8);
9293
- }
9294
- .jaci-image__popup {
9295
- padding: var(--jaci-spacing-3);
9296
- }
9297
- .jaci-figure__viewport {
9298
- padding: var(--jaci-spacing-8);
9299
- }
9300
- .jaci-figure__popup {
9301
- padding: var(--jaci-spacing-3);
9302
9303
  }
9303
9304
  .jaci-navbar__bar {
9304
9305
  padding: var(--jaci-spacing-4);
@@ -9525,6 +9526,29 @@
9525
9526
  font-size: var(--jaci-font-sizes-lg);
9526
9527
  }
9527
9528
 
9529
+ .jaci-command__root--mode_dropdown {
9530
+ overflow: visible;
9531
+ position: relative;
9532
+ }
9533
+
9534
+ .jaci-command__list--mode_dropdown {
9535
+ border-color: var(--jaci-colors-border-default);
9536
+ border-radius: var(--jaci-radii-lg);
9537
+ border-style: solid;
9538
+ border-width: 1px;
9539
+ --backdrop-blur: blur(var(--jaci-blurs-md));
9540
+ backdrop-filter: var(--backdrop-blur, ) var(--backdrop-brightness, ) var(--backdrop-contrast, ) var(--backdrop-grayscale, ) var(--backdrop-hue-rotate, ) var(--backdrop-invert, ) var(--backdrop-opacity, ) var(--backdrop-saturate, ) var(--backdrop-sepia, );
9541
+ -webkit-backdrop-filter: var(--backdrop-blur, ) var(--backdrop-brightness, ) var(--backdrop-contrast, ) var(--backdrop-grayscale, ) var(--backdrop-hue-rotate, ) var(--backdrop-invert, ) var(--backdrop-opacity, ) var(--backdrop-saturate, ) var(--backdrop-sepia, );
9542
+ background-color: var(--jaci-colors-surface-overlay);
9543
+ box-shadow: var(--jaci-shadows-lg);
9544
+ position: absolute;
9545
+ z-index: 50;
9546
+ left: var(--jaci-spacing-0);
9547
+ max-width: calc(100vw - 2rem);
9548
+ top: calc(100% + 0.5rem);
9549
+ width: min(100%, calc(100vw - 2rem));
9550
+ }
9551
+
9528
9552
  .jaci-toggleSwitch__root--checked_true {
9529
9553
  background-color: var(--jaci-colors-accent-default);
9530
9554
  }
@@ -10071,27 +10095,23 @@
10071
10095
  }
10072
10096
 
10073
10097
  .jaci-toast__root--tone_info {
10074
- border-color: var(--jaci-colors-accent-hover);
10075
- background-color: var(--jaci-colors-accent-default);
10076
- color: var(--jaci-colors-fg-on-accent);
10098
+ border-color: var(--jaci-colors-info);
10099
+ background-color: color-mix(in srgb, var(--jaci-colors-info) 14%, var(--jaci-colors-surface-raised));
10077
10100
  }
10078
10101
 
10079
10102
  .jaci-toast__root--tone_success {
10080
- border-color: var(--jaci-colors-green-700);
10081
- background-color: var(--jaci-colors-success);
10082
- color: var(--jaci-colors-fg-on-accent);
10103
+ border-color: var(--jaci-colors-success);
10104
+ background-color: color-mix(in srgb, var(--jaci-colors-success) 14%, var(--jaci-colors-surface-raised));
10083
10105
  }
10084
10106
 
10085
10107
  .jaci-toast__root--tone_warning {
10086
- border-color: var(--jaci-colors-amber-700);
10087
- background-color: var(--jaci-colors-warning);
10088
- color: var(--jaci-colors-fg-on-accent);
10108
+ border-color: var(--jaci-colors-warning);
10109
+ background-color: color-mix(in srgb, var(--jaci-colors-warning) 14%, var(--jaci-colors-surface-raised));
10089
10110
  }
10090
10111
 
10091
10112
  .jaci-toast__root--tone_danger {
10092
- border-color: var(--jaci-colors-red-600);
10093
- background-color: var(--jaci-colors-danger);
10094
- color: var(--jaci-colors-fg-on-accent);
10113
+ border-color: var(--jaci-colors-danger);
10114
+ background-color: color-mix(in srgb, var(--jaci-colors-danger) 14%, var(--jaci-colors-surface-raised));
10095
10115
  }
10096
10116
 
10097
10117
  .jaci-toggle-group__item--size_md {
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ const require_theme_scope = require("./theme-scope.cjs");
2
3
  let react = require("react");
3
4
  let react_jsx_runtime = require("react/jsx-runtime");
4
5
  //#region src/theme/theme-provider.tsx
@@ -31,6 +32,7 @@ function initialSystemTheme(ssrTheme) {
31
32
  const ThemeProvider = (0, react.forwardRef)(function ThemeProvider({ as = "div", children, defaultTheme = "light", onThemeChange, ssrTheme, style, theme, tokens, ...props }, ref) {
32
33
  const [uncontrolledTheme, setUncontrolledTheme] = (0, react.useState)(defaultTheme);
33
34
  const [systemTheme, setSystemTheme] = (0, react.useState)(() => initialSystemTheme(ssrTheme));
35
+ const [scopeElement, setScopeElement] = (0, react.useState)(null);
34
36
  const currentTheme = theme ?? uncontrolledTheme;
35
37
  (0, react.useEffect)(() => {
36
38
  if (currentTheme !== "system") return;
@@ -64,16 +66,24 @@ const ThemeProvider = (0, react.forwardRef)(function ThemeProvider({ as = "div",
64
66
  ...tokenStyles(tokens)
65
67
  }), [style, tokens]);
66
68
  const Root = as;
69
+ const setRootRef = (0, react.useCallback)((element) => {
70
+ setScopeElement((current) => current === element ? current : element);
71
+ if (typeof ref === "function") ref(element);
72
+ else if (ref) ref.current = element;
73
+ }, [ref]);
67
74
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ThemeContext.Provider, {
68
75
  value: contextValue,
69
- children: (0, react.createElement)(Root, {
70
- ...props,
71
- "data-jaci-theme": resolvedTheme,
72
- "data-jaci-component": "theme-provider",
73
- "data-slot": "theme-provider",
74
- ref,
75
- style: mergedStyle
76
- }, children)
76
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_theme_scope.ThemeScopeContext.Provider, {
77
+ value: { container: scopeElement },
78
+ children: (0, react.createElement)(Root, {
79
+ ...props,
80
+ "data-jaci-theme": resolvedTheme,
81
+ "data-jaci-component": "theme-provider",
82
+ "data-slot": "theme-provider",
83
+ ref: setRootRef,
84
+ style: mergedStyle
85
+ }, children)
86
+ })
77
87
  });
78
88
  });
79
89
  function useTheme() {
@@ -1 +1 @@
1
- {"version":3,"file":"theme-provider.cjs","names":[],"sources":["../../src/theme/theme-provider.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n createElement,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport type { ComponentPropsWithoutRef, CSSProperties, ElementType, ReactNode, Ref } from \"react\";\n\nexport type ThemeMode = \"light\" | \"dark\" | \"system\";\n\n/** A leaf value accepted by the theme variable mapper. */\nexport type JaciThemeTokenValue = string | number;\n\n/**\n * Semantic theme values. The groups intentionally accept additional keys so\n * applications can extend the token vocabulary without waiting for a package\n * release. Known semantic groups are documented in the public README.\n */\nexport type JaciThemeTokenGroup = {\n readonly [key: string]: JaciThemeTokenValue | JaciThemeTokenGroup | undefined;\n};\n\nexport interface JaciThemeColorTokens extends JaciThemeTokenGroup {\n surface?: JaciThemeTokenGroup;\n fg?: JaciThemeTokenGroup;\n border?: JaciThemeTokenGroup;\n accent?: JaciThemeTokenGroup;\n success?: JaciThemeTokenValue;\n warning?: JaciThemeTokenValue;\n danger?: JaciThemeTokenValue;\n info?: JaciThemeTokenValue;\n link?: JaciThemeTokenGroup;\n focus?: JaciThemeTokenValue;\n disabled?: JaciThemeTokenValue;\n selected?: JaciThemeTokenValue;\n}\n\nexport interface JaciThemeTokens {\n colors?: JaciThemeColorTokens;\n radii?: JaciThemeTokenGroup;\n shadows?: JaciThemeTokenGroup;\n durations?: JaciThemeTokenGroup;\n easings?: JaciThemeTokenGroup;\n transitions?: JaciThemeTokenGroup;\n spacing?: JaciThemeTokenGroup;\n fontSizes?: JaciThemeTokenGroup;\n lineHeights?: JaciThemeTokenGroup;\n typography?: JaciThemeTokenGroup;\n textStyles?: JaciThemeTokenGroup;\n fonts?: JaciThemeTokenGroup;\n}\n\nexport interface ThemeProviderProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> {\n /** The controlled color mode. */\n theme?: ThemeMode;\n /** The initial color mode for an uncontrolled provider. */\n defaultTheme?: ThemeMode;\n /** The deterministic mode used for `system` while rendering on the server. */\n ssrTheme?: \"light\" | \"dark\";\n /** Scoped semantic token overrides. */\n tokens?: JaciThemeTokens;\n /** Called when a controlled provider requests a mode change. */\n onThemeChange?: (theme: ThemeMode) => void;\n /** The element that owns the theme scope. */\n as?: ElementType;\n children?: ReactNode;\n}\n\nexport interface ThemeContextValue {\n theme: ThemeMode;\n resolvedTheme: \"light\" | \"dark\";\n setTheme: (theme: ThemeMode) => void;\n}\n\nconst defaultThemeContext: ThemeContextValue = {\n theme: \"light\",\n resolvedTheme: \"light\",\n setTheme: () => undefined,\n};\n\nconst ThemeContext = createContext<ThemeContextValue>(defaultThemeContext);\n\nfunction kebabCase(value: string) {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase();\n}\n\nfunction flattenTokens(\n group: JaciThemeTokenGroup | undefined,\n path: string[],\n output: Record<string, string>,\n) {\n if (!group) return;\n\n for (const [key, value] of Object.entries(group)) {\n if (value === undefined) continue;\n const nextPath = [...path, kebabCase(key)];\n\n if (typeof value === \"object\") {\n flattenTokens(value, nextPath, output);\n } else {\n output[`--jaci-${nextPath.join(\"-\")}`] = String(value);\n }\n }\n}\n\nfunction tokenStyles(tokens: JaciThemeTokens | undefined): CSSProperties {\n if (!tokens) return {};\n\n const variables: Record<string, string> = {};\n for (const [group, values] of Object.entries(tokens)) {\n flattenTokens(values, [kebabCase(group)], variables);\n }\n\n return variables as CSSProperties;\n}\n\nfunction initialSystemTheme(ssrTheme: \"light\" | \"dark\" | undefined) {\n return ssrTheme ?? \"light\";\n}\n\nexport const ThemeProvider = forwardRef<HTMLElement, ThemeProviderProps>(function ThemeProvider(\n {\n as = \"div\",\n children,\n defaultTheme = \"light\",\n onThemeChange,\n ssrTheme,\n style,\n theme,\n tokens,\n ...props\n },\n ref,\n) {\n const [uncontrolledTheme, setUncontrolledTheme] = useState<ThemeMode>(defaultTheme);\n const [systemTheme, setSystemTheme] = useState<\"light\" | \"dark\">(() =>\n initialSystemTheme(ssrTheme),\n );\n const currentTheme = theme ?? uncontrolledTheme;\n\n useEffect(() => {\n if (currentTheme !== \"system\") return;\n\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return;\n\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const update = () => setSystemTheme(media.matches ? \"dark\" : \"light\");\n update();\n if (typeof media.addEventListener === \"function\") media.addEventListener(\"change\", update);\n else media.addListener?.(update);\n\n return () => {\n if (typeof media.removeEventListener === \"function\")\n media.removeEventListener(\"change\", update);\n else media.removeListener?.(update);\n };\n }, [currentTheme]);\n\n const resolvedTheme = currentTheme === \"system\" ? systemTheme : currentTheme;\n const setTheme = useCallback(\n (nextTheme: ThemeMode) => {\n if (theme === undefined) setUncontrolledTheme(nextTheme);\n onThemeChange?.(nextTheme);\n },\n [onThemeChange, theme],\n );\n const contextValue = useMemo(\n () => ({ theme: currentTheme, resolvedTheme, setTheme }),\n [currentTheme, resolvedTheme, setTheme],\n );\n const mergedStyle = useMemo(() => ({ ...style, ...tokenStyles(tokens) }), [style, tokens]);\n const Root = as;\n\n return (\n <ThemeContext.Provider value={contextValue}>\n {createElement(\n Root,\n {\n ...props,\n \"data-jaci-theme\": resolvedTheme,\n \"data-jaci-component\": \"theme-provider\",\n \"data-slot\": \"theme-provider\",\n ref: ref as Ref<HTMLElement>,\n style: mergedStyle,\n },\n children,\n )}\n </ThemeContext.Provider>\n );\n});\n\nexport function useTheme() {\n return useContext(ThemeContext);\n}\n"],"mappings":";;;;AAsFA,MAAM,gBAAA,GAAA,MAAA,cAAA,CAAgD;CALpD,OAAO;CACP,eAAe;CACf,gBAAgB,KAAA;AAGsD,CAAC;AAEzE,SAAS,UAAU,OAAe;CAChC,OAAO,MACJ,QAAQ,sBAAsB,OAAO,CAAC,CACtC,QAAQ,WAAW,GAAG,CAAC,CACvB,YAAY;AACjB;AAEA,SAAS,cACP,OACA,MACA,QACA;CACA,IAAI,CAAC,OAAO;CAEZ,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAG;EAChD,IAAI,UAAU,KAAA,GAAW;EACzB,MAAM,WAAW,CAAC,GAAG,MAAM,UAAU,GAAG,CAAC;EAEzC,IAAI,OAAO,UAAU,UACnB,cAAc,OAAO,UAAU,MAAM;OAErC,OAAO,UAAU,SAAS,KAAK,GAAG,OAAO,OAAO,KAAK;CAEzD;AACF;AAEA,SAAS,YAAY,QAAoD;CACvE,IAAI,CAAC,QAAQ,OAAO,CAAC;CAErB,MAAM,YAAoC,CAAC;CAC3C,KAAK,MAAM,CAAC,OAAO,WAAW,OAAO,QAAQ,MAAM,GACjD,cAAc,QAAQ,CAAC,UAAU,KAAK,CAAC,GAAG,SAAS;CAGrD,OAAO;AACT;AAEA,SAAS,mBAAmB,UAAwC;CAClE,OAAO,YAAY;AACrB;AAEA,MAAa,iBAAA,GAAA,MAAA,WAAA,CAA4D,SAAS,cAChF,EACE,KAAK,OACL,UACA,eAAe,SACf,eACA,UACA,OACA,OACA,QACA,GAAG,SAEL,KACA;CACA,MAAM,CAAC,mBAAmB,yBAAA,GAAA,MAAA,SAAA,CAA4C,YAAY;CAClF,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,SAAA,OAClB,mBAAmB,QAAQ,CAC7B;CACA,MAAM,eAAe,SAAS;CAE9B,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,iBAAiB,UAAU;EAE/B,IAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;EAE9E,MAAM,QAAQ,OAAO,WAAW,8BAA8B;EAC9D,MAAM,eAAe,eAAe,MAAM,UAAU,SAAS,OAAO;EACpE,OAAO;EACP,IAAI,OAAO,MAAM,qBAAqB,YAAY,MAAM,iBAAiB,UAAU,MAAM;OACpF,MAAM,cAAc,MAAM;EAE/B,aAAa;GACX,IAAI,OAAO,MAAM,wBAAwB,YACvC,MAAM,oBAAoB,UAAU,MAAM;QACvC,MAAM,iBAAiB,MAAM;EACpC;CACF,GAAG,CAAC,YAAY,CAAC;CAEjB,MAAM,gBAAgB,iBAAiB,WAAW,cAAc;CAChE,MAAM,YAAA,GAAA,MAAA,YAAA,EACH,cAAyB;EACxB,IAAI,UAAU,KAAA,GAAW,qBAAqB,SAAS;EACvD,gBAAgB,SAAS;CAC3B,GACA,CAAC,eAAe,KAAK,CACvB;CACA,MAAM,gBAAA,GAAA,MAAA,QAAA,QACG;EAAE,OAAO;EAAc;EAAe;CAAS,IACtD;EAAC;EAAc;EAAe;CAAQ,CACxC;CACA,MAAM,eAAA,GAAA,MAAA,QAAA,QAA6B;EAAE,GAAG;EAAO,GAAG,YAAY,MAAM;CAAE,IAAI,CAAC,OAAO,MAAM,CAAC;CACzF,MAAM,OAAO;CAEb,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAa,UAAd;EAAuB,OAAO;qCAE1B,MACA;GACE,GAAG;GACH,mBAAmB;GACnB,uBAAuB;GACvB,aAAa;GACR;GACL,OAAO;EACT,GACA,QACF;CACqB,CAAA;AAE3B,CAAC;AAED,SAAgB,WAAW;CACzB,QAAA,GAAA,MAAA,WAAA,CAAkB,YAAY;AAChC"}
1
+ {"version":3,"file":"theme-provider.cjs","names":["ThemeScopeContext"],"sources":["../../src/theme/theme-provider.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n createElement,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport type { ComponentPropsWithoutRef, CSSProperties, ElementType, ReactNode, Ref } from \"react\";\n\nimport { ThemeScopeContext } from \"./theme-scope\";\n\nexport type ThemeMode = \"light\" | \"dark\" | \"system\";\n\n/** A leaf value accepted by the theme variable mapper. */\nexport type JaciThemeTokenValue = string | number;\n\n/**\n * Semantic theme values. The groups intentionally accept additional keys so\n * applications can extend the token vocabulary without waiting for a package\n * release. Known semantic groups are documented in the public README.\n */\nexport type JaciThemeTokenGroup = {\n readonly [key: string]: JaciThemeTokenValue | JaciThemeTokenGroup | undefined;\n};\n\nexport interface JaciThemeColorTokens extends JaciThemeTokenGroup {\n surface?: JaciThemeTokenGroup;\n fg?: JaciThemeTokenGroup;\n border?: JaciThemeTokenGroup;\n accent?: JaciThemeTokenGroup;\n success?: JaciThemeTokenValue;\n warning?: JaciThemeTokenValue;\n danger?: JaciThemeTokenValue;\n info?: JaciThemeTokenValue;\n link?: JaciThemeTokenGroup;\n focus?: JaciThemeTokenValue;\n disabled?: JaciThemeTokenValue;\n selected?: JaciThemeTokenValue;\n}\n\nexport interface JaciThemeTokens {\n colors?: JaciThemeColorTokens;\n radii?: JaciThemeTokenGroup;\n shadows?: JaciThemeTokenGroup;\n durations?: JaciThemeTokenGroup;\n easings?: JaciThemeTokenGroup;\n transitions?: JaciThemeTokenGroup;\n spacing?: JaciThemeTokenGroup;\n fontSizes?: JaciThemeTokenGroup;\n lineHeights?: JaciThemeTokenGroup;\n typography?: JaciThemeTokenGroup;\n textStyles?: JaciThemeTokenGroup;\n fonts?: JaciThemeTokenGroup;\n}\n\nexport interface ThemeProviderProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> {\n /** The controlled color mode. */\n theme?: ThemeMode;\n /** The initial color mode for an uncontrolled provider. */\n defaultTheme?: ThemeMode;\n /** The deterministic mode used for `system` while rendering on the server. */\n ssrTheme?: \"light\" | \"dark\";\n /** Scoped semantic token overrides. */\n tokens?: JaciThemeTokens;\n /** Called when a controlled provider requests a mode change. */\n onThemeChange?: (theme: ThemeMode) => void;\n /** The element that owns the theme scope. */\n as?: ElementType;\n children?: ReactNode;\n}\n\nexport interface ThemeContextValue {\n theme: ThemeMode;\n resolvedTheme: \"light\" | \"dark\";\n setTheme: (theme: ThemeMode) => void;\n}\n\nconst defaultThemeContext: ThemeContextValue = {\n theme: \"light\",\n resolvedTheme: \"light\",\n setTheme: () => undefined,\n};\n\nconst ThemeContext = createContext<ThemeContextValue>(defaultThemeContext);\n\nfunction kebabCase(value: string) {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase();\n}\n\nfunction flattenTokens(\n group: JaciThemeTokenGroup | undefined,\n path: string[],\n output: Record<string, string>,\n) {\n if (!group) return;\n\n for (const [key, value] of Object.entries(group)) {\n if (value === undefined) continue;\n const nextPath = [...path, kebabCase(key)];\n\n if (typeof value === \"object\") {\n flattenTokens(value, nextPath, output);\n } else {\n output[`--jaci-${nextPath.join(\"-\")}`] = String(value);\n }\n }\n}\n\nfunction tokenStyles(tokens: JaciThemeTokens | undefined): CSSProperties {\n if (!tokens) return {};\n\n const variables: Record<string, string> = {};\n for (const [group, values] of Object.entries(tokens)) {\n flattenTokens(values, [kebabCase(group)], variables);\n }\n\n return variables as CSSProperties;\n}\n\nfunction initialSystemTheme(ssrTheme: \"light\" | \"dark\" | undefined) {\n return ssrTheme ?? \"light\";\n}\n\nexport const ThemeProvider = forwardRef<HTMLElement, ThemeProviderProps>(function ThemeProvider(\n {\n as = \"div\",\n children,\n defaultTheme = \"light\",\n onThemeChange,\n ssrTheme,\n style,\n theme,\n tokens,\n ...props\n },\n ref,\n) {\n const [uncontrolledTheme, setUncontrolledTheme] = useState<ThemeMode>(defaultTheme);\n const [systemTheme, setSystemTheme] = useState<\"light\" | \"dark\">(() =>\n initialSystemTheme(ssrTheme),\n );\n const [scopeElement, setScopeElement] = useState<HTMLElement | null>(null);\n const currentTheme = theme ?? uncontrolledTheme;\n\n useEffect(() => {\n if (currentTheme !== \"system\") return;\n\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return;\n\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const update = () => setSystemTheme(media.matches ? \"dark\" : \"light\");\n update();\n if (typeof media.addEventListener === \"function\") media.addEventListener(\"change\", update);\n else media.addListener?.(update);\n\n return () => {\n if (typeof media.removeEventListener === \"function\")\n media.removeEventListener(\"change\", update);\n else media.removeListener?.(update);\n };\n }, [currentTheme]);\n\n const resolvedTheme = currentTheme === \"system\" ? systemTheme : currentTheme;\n const setTheme = useCallback(\n (nextTheme: ThemeMode) => {\n if (theme === undefined) setUncontrolledTheme(nextTheme);\n onThemeChange?.(nextTheme);\n },\n [onThemeChange, theme],\n );\n const contextValue = useMemo(\n () => ({ theme: currentTheme, resolvedTheme, setTheme }),\n [currentTheme, resolvedTheme, setTheme],\n );\n const mergedStyle = useMemo(() => ({ ...style, ...tokenStyles(tokens) }), [style, tokens]);\n const Root = as;\n const setRootRef = useCallback(\n (element: HTMLElement | null) => {\n setScopeElement((current) => (current === element ? current : element));\n if (typeof ref === \"function\") ref(element);\n else if (ref) (ref as { current: HTMLElement | null }).current = element;\n },\n [ref],\n );\n\n return (\n <ThemeContext.Provider value={contextValue}>\n <ThemeScopeContext.Provider value={{ container: scopeElement }}>\n {createElement(\n Root,\n {\n ...props,\n \"data-jaci-theme\": resolvedTheme,\n \"data-jaci-component\": \"theme-provider\",\n \"data-slot\": \"theme-provider\",\n ref: setRootRef as Ref<HTMLElement>,\n style: mergedStyle,\n },\n children,\n )}\n </ThemeScopeContext.Provider>\n </ThemeContext.Provider>\n );\n});\n\nexport function useTheme() {\n return useContext(ThemeContext);\n}\n"],"mappings":";;;;;AAwFA,MAAM,gBAAA,GAAA,MAAA,cAAA,CAAgD;CALpD,OAAO;CACP,eAAe;CACf,gBAAgB,KAAA;AAGsD,CAAC;AAEzE,SAAS,UAAU,OAAe;CAChC,OAAO,MACJ,QAAQ,sBAAsB,OAAO,CAAC,CACtC,QAAQ,WAAW,GAAG,CAAC,CACvB,YAAY;AACjB;AAEA,SAAS,cACP,OACA,MACA,QACA;CACA,IAAI,CAAC,OAAO;CAEZ,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAG;EAChD,IAAI,UAAU,KAAA,GAAW;EACzB,MAAM,WAAW,CAAC,GAAG,MAAM,UAAU,GAAG,CAAC;EAEzC,IAAI,OAAO,UAAU,UACnB,cAAc,OAAO,UAAU,MAAM;OAErC,OAAO,UAAU,SAAS,KAAK,GAAG,OAAO,OAAO,KAAK;CAEzD;AACF;AAEA,SAAS,YAAY,QAAoD;CACvE,IAAI,CAAC,QAAQ,OAAO,CAAC;CAErB,MAAM,YAAoC,CAAC;CAC3C,KAAK,MAAM,CAAC,OAAO,WAAW,OAAO,QAAQ,MAAM,GACjD,cAAc,QAAQ,CAAC,UAAU,KAAK,CAAC,GAAG,SAAS;CAGrD,OAAO;AACT;AAEA,SAAS,mBAAmB,UAAwC;CAClE,OAAO,YAAY;AACrB;AAEA,MAAa,iBAAA,GAAA,MAAA,WAAA,CAA4D,SAAS,cAChF,EACE,KAAK,OACL,UACA,eAAe,SACf,eACA,UACA,OACA,OACA,QACA,GAAG,SAEL,KACA;CACA,MAAM,CAAC,mBAAmB,yBAAA,GAAA,MAAA,SAAA,CAA4C,YAAY;CAClF,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,SAAA,OAClB,mBAAmB,QAAQ,CAC7B;CACA,MAAM,CAAC,cAAc,oBAAA,GAAA,MAAA,SAAA,CAAgD,IAAI;CACzE,MAAM,eAAe,SAAS;CAE9B,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,iBAAiB,UAAU;EAE/B,IAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;EAE9E,MAAM,QAAQ,OAAO,WAAW,8BAA8B;EAC9D,MAAM,eAAe,eAAe,MAAM,UAAU,SAAS,OAAO;EACpE,OAAO;EACP,IAAI,OAAO,MAAM,qBAAqB,YAAY,MAAM,iBAAiB,UAAU,MAAM;OACpF,MAAM,cAAc,MAAM;EAE/B,aAAa;GACX,IAAI,OAAO,MAAM,wBAAwB,YACvC,MAAM,oBAAoB,UAAU,MAAM;QACvC,MAAM,iBAAiB,MAAM;EACpC;CACF,GAAG,CAAC,YAAY,CAAC;CAEjB,MAAM,gBAAgB,iBAAiB,WAAW,cAAc;CAChE,MAAM,YAAA,GAAA,MAAA,YAAA,EACH,cAAyB;EACxB,IAAI,UAAU,KAAA,GAAW,qBAAqB,SAAS;EACvD,gBAAgB,SAAS;CAC3B,GACA,CAAC,eAAe,KAAK,CACvB;CACA,MAAM,gBAAA,GAAA,MAAA,QAAA,QACG;EAAE,OAAO;EAAc;EAAe;CAAS,IACtD;EAAC;EAAc;EAAe;CAAQ,CACxC;CACA,MAAM,eAAA,GAAA,MAAA,QAAA,QAA6B;EAAE,GAAG;EAAO,GAAG,YAAY,MAAM;CAAE,IAAI,CAAC,OAAO,MAAM,CAAC;CACzF,MAAM,OAAO;CACb,MAAM,cAAA,GAAA,MAAA,YAAA,EACH,YAAgC;EAC/B,iBAAiB,YAAa,YAAY,UAAU,UAAU,OAAQ;EACtE,IAAI,OAAO,QAAQ,YAAY,IAAI,OAAO;OACrC,IAAI,KAAK,IAAyC,UAAU;CACnE,GACA,CAAC,GAAG,CACN;CAEA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAa,UAAd;EAAuB,OAAO;YAC5B,iBAAA,GAAA,kBAAA,IAAA,CAACA,oBAAAA,kBAAkB,UAAnB;GAA4B,OAAO,EAAE,WAAW,aAAa;sCAEzD,MACA;IACE,GAAG;IACH,mBAAmB;IACnB,uBAAuB;IACvB,aAAa;IACb,KAAK;IACL,OAAO;GACT,GACA,QACF;EAC0B,CAAA;CACP,CAAA;AAE3B,CAAC;AAED,SAAgB,WAAW;CACzB,QAAA,GAAA,MAAA,WAAA,CAAkB,YAAY;AAChC"}
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ import { ThemeScopeContext } from "./theme-scope.js";
2
3
  import { createContext, createElement, forwardRef, useCallback, useContext, useEffect, useMemo, useState } from "react";
3
4
  import { jsx } from "react/jsx-runtime";
4
5
  //#region src/theme/theme-provider.tsx
@@ -31,6 +32,7 @@ function initialSystemTheme(ssrTheme) {
31
32
  const ThemeProvider = forwardRef(function ThemeProvider({ as = "div", children, defaultTheme = "light", onThemeChange, ssrTheme, style, theme, tokens, ...props }, ref) {
32
33
  const [uncontrolledTheme, setUncontrolledTheme] = useState(defaultTheme);
33
34
  const [systemTheme, setSystemTheme] = useState(() => initialSystemTheme(ssrTheme));
35
+ const [scopeElement, setScopeElement] = useState(null);
34
36
  const currentTheme = theme ?? uncontrolledTheme;
35
37
  useEffect(() => {
36
38
  if (currentTheme !== "system") return;
@@ -64,16 +66,24 @@ const ThemeProvider = forwardRef(function ThemeProvider({ as = "div", children,
64
66
  ...tokenStyles(tokens)
65
67
  }), [style, tokens]);
66
68
  const Root = as;
69
+ const setRootRef = useCallback((element) => {
70
+ setScopeElement((current) => current === element ? current : element);
71
+ if (typeof ref === "function") ref(element);
72
+ else if (ref) ref.current = element;
73
+ }, [ref]);
67
74
  return /* @__PURE__ */ jsx(ThemeContext.Provider, {
68
75
  value: contextValue,
69
- children: createElement(Root, {
70
- ...props,
71
- "data-jaci-theme": resolvedTheme,
72
- "data-jaci-component": "theme-provider",
73
- "data-slot": "theme-provider",
74
- ref,
75
- style: mergedStyle
76
- }, children)
76
+ children: /* @__PURE__ */ jsx(ThemeScopeContext.Provider, {
77
+ value: { container: scopeElement },
78
+ children: createElement(Root, {
79
+ ...props,
80
+ "data-jaci-theme": resolvedTheme,
81
+ "data-jaci-component": "theme-provider",
82
+ "data-slot": "theme-provider",
83
+ ref: setRootRef,
84
+ style: mergedStyle
85
+ }, children)
86
+ })
77
87
  });
78
88
  });
79
89
  function useTheme() {
@@ -1 +1 @@
1
- {"version":3,"file":"theme-provider.js","names":[],"sources":["../../src/theme/theme-provider.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n createElement,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport type { ComponentPropsWithoutRef, CSSProperties, ElementType, ReactNode, Ref } from \"react\";\n\nexport type ThemeMode = \"light\" | \"dark\" | \"system\";\n\n/** A leaf value accepted by the theme variable mapper. */\nexport type JaciThemeTokenValue = string | number;\n\n/**\n * Semantic theme values. The groups intentionally accept additional keys so\n * applications can extend the token vocabulary without waiting for a package\n * release. Known semantic groups are documented in the public README.\n */\nexport type JaciThemeTokenGroup = {\n readonly [key: string]: JaciThemeTokenValue | JaciThemeTokenGroup | undefined;\n};\n\nexport interface JaciThemeColorTokens extends JaciThemeTokenGroup {\n surface?: JaciThemeTokenGroup;\n fg?: JaciThemeTokenGroup;\n border?: JaciThemeTokenGroup;\n accent?: JaciThemeTokenGroup;\n success?: JaciThemeTokenValue;\n warning?: JaciThemeTokenValue;\n danger?: JaciThemeTokenValue;\n info?: JaciThemeTokenValue;\n link?: JaciThemeTokenGroup;\n focus?: JaciThemeTokenValue;\n disabled?: JaciThemeTokenValue;\n selected?: JaciThemeTokenValue;\n}\n\nexport interface JaciThemeTokens {\n colors?: JaciThemeColorTokens;\n radii?: JaciThemeTokenGroup;\n shadows?: JaciThemeTokenGroup;\n durations?: JaciThemeTokenGroup;\n easings?: JaciThemeTokenGroup;\n transitions?: JaciThemeTokenGroup;\n spacing?: JaciThemeTokenGroup;\n fontSizes?: JaciThemeTokenGroup;\n lineHeights?: JaciThemeTokenGroup;\n typography?: JaciThemeTokenGroup;\n textStyles?: JaciThemeTokenGroup;\n fonts?: JaciThemeTokenGroup;\n}\n\nexport interface ThemeProviderProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> {\n /** The controlled color mode. */\n theme?: ThemeMode;\n /** The initial color mode for an uncontrolled provider. */\n defaultTheme?: ThemeMode;\n /** The deterministic mode used for `system` while rendering on the server. */\n ssrTheme?: \"light\" | \"dark\";\n /** Scoped semantic token overrides. */\n tokens?: JaciThemeTokens;\n /** Called when a controlled provider requests a mode change. */\n onThemeChange?: (theme: ThemeMode) => void;\n /** The element that owns the theme scope. */\n as?: ElementType;\n children?: ReactNode;\n}\n\nexport interface ThemeContextValue {\n theme: ThemeMode;\n resolvedTheme: \"light\" | \"dark\";\n setTheme: (theme: ThemeMode) => void;\n}\n\nconst defaultThemeContext: ThemeContextValue = {\n theme: \"light\",\n resolvedTheme: \"light\",\n setTheme: () => undefined,\n};\n\nconst ThemeContext = createContext<ThemeContextValue>(defaultThemeContext);\n\nfunction kebabCase(value: string) {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase();\n}\n\nfunction flattenTokens(\n group: JaciThemeTokenGroup | undefined,\n path: string[],\n output: Record<string, string>,\n) {\n if (!group) return;\n\n for (const [key, value] of Object.entries(group)) {\n if (value === undefined) continue;\n const nextPath = [...path, kebabCase(key)];\n\n if (typeof value === \"object\") {\n flattenTokens(value, nextPath, output);\n } else {\n output[`--jaci-${nextPath.join(\"-\")}`] = String(value);\n }\n }\n}\n\nfunction tokenStyles(tokens: JaciThemeTokens | undefined): CSSProperties {\n if (!tokens) return {};\n\n const variables: Record<string, string> = {};\n for (const [group, values] of Object.entries(tokens)) {\n flattenTokens(values, [kebabCase(group)], variables);\n }\n\n return variables as CSSProperties;\n}\n\nfunction initialSystemTheme(ssrTheme: \"light\" | \"dark\" | undefined) {\n return ssrTheme ?? \"light\";\n}\n\nexport const ThemeProvider = forwardRef<HTMLElement, ThemeProviderProps>(function ThemeProvider(\n {\n as = \"div\",\n children,\n defaultTheme = \"light\",\n onThemeChange,\n ssrTheme,\n style,\n theme,\n tokens,\n ...props\n },\n ref,\n) {\n const [uncontrolledTheme, setUncontrolledTheme] = useState<ThemeMode>(defaultTheme);\n const [systemTheme, setSystemTheme] = useState<\"light\" | \"dark\">(() =>\n initialSystemTheme(ssrTheme),\n );\n const currentTheme = theme ?? uncontrolledTheme;\n\n useEffect(() => {\n if (currentTheme !== \"system\") return;\n\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return;\n\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const update = () => setSystemTheme(media.matches ? \"dark\" : \"light\");\n update();\n if (typeof media.addEventListener === \"function\") media.addEventListener(\"change\", update);\n else media.addListener?.(update);\n\n return () => {\n if (typeof media.removeEventListener === \"function\")\n media.removeEventListener(\"change\", update);\n else media.removeListener?.(update);\n };\n }, [currentTheme]);\n\n const resolvedTheme = currentTheme === \"system\" ? systemTheme : currentTheme;\n const setTheme = useCallback(\n (nextTheme: ThemeMode) => {\n if (theme === undefined) setUncontrolledTheme(nextTheme);\n onThemeChange?.(nextTheme);\n },\n [onThemeChange, theme],\n );\n const contextValue = useMemo(\n () => ({ theme: currentTheme, resolvedTheme, setTheme }),\n [currentTheme, resolvedTheme, setTheme],\n );\n const mergedStyle = useMemo(() => ({ ...style, ...tokenStyles(tokens) }), [style, tokens]);\n const Root = as;\n\n return (\n <ThemeContext.Provider value={contextValue}>\n {createElement(\n Root,\n {\n ...props,\n \"data-jaci-theme\": resolvedTheme,\n \"data-jaci-component\": \"theme-provider\",\n \"data-slot\": \"theme-provider\",\n ref: ref as Ref<HTMLElement>,\n style: mergedStyle,\n },\n children,\n )}\n </ThemeContext.Provider>\n );\n});\n\nexport function useTheme() {\n return useContext(ThemeContext);\n}\n"],"mappings":";;;;AAsFA,MAAM,eAAe,cAAiC;CALpD,OAAO;CACP,eAAe;CACf,gBAAgB,KAAA;AAGsD,CAAC;AAEzE,SAAS,UAAU,OAAe;CAChC,OAAO,MACJ,QAAQ,sBAAsB,OAAO,CAAC,CACtC,QAAQ,WAAW,GAAG,CAAC,CACvB,YAAY;AACjB;AAEA,SAAS,cACP,OACA,MACA,QACA;CACA,IAAI,CAAC,OAAO;CAEZ,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAG;EAChD,IAAI,UAAU,KAAA,GAAW;EACzB,MAAM,WAAW,CAAC,GAAG,MAAM,UAAU,GAAG,CAAC;EAEzC,IAAI,OAAO,UAAU,UACnB,cAAc,OAAO,UAAU,MAAM;OAErC,OAAO,UAAU,SAAS,KAAK,GAAG,OAAO,OAAO,KAAK;CAEzD;AACF;AAEA,SAAS,YAAY,QAAoD;CACvE,IAAI,CAAC,QAAQ,OAAO,CAAC;CAErB,MAAM,YAAoC,CAAC;CAC3C,KAAK,MAAM,CAAC,OAAO,WAAW,OAAO,QAAQ,MAAM,GACjD,cAAc,QAAQ,CAAC,UAAU,KAAK,CAAC,GAAG,SAAS;CAGrD,OAAO;AACT;AAEA,SAAS,mBAAmB,UAAwC;CAClE,OAAO,YAAY;AACrB;AAEA,MAAa,gBAAgB,WAA4C,SAAS,cAChF,EACE,KAAK,OACL,UACA,eAAe,SACf,eACA,UACA,OACA,OACA,QACA,GAAG,SAEL,KACA;CACA,MAAM,CAAC,mBAAmB,wBAAwB,SAAoB,YAAY;CAClF,MAAM,CAAC,aAAa,kBAAkB,eACpC,mBAAmB,QAAQ,CAC7B;CACA,MAAM,eAAe,SAAS;CAE9B,gBAAgB;EACd,IAAI,iBAAiB,UAAU;EAE/B,IAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;EAE9E,MAAM,QAAQ,OAAO,WAAW,8BAA8B;EAC9D,MAAM,eAAe,eAAe,MAAM,UAAU,SAAS,OAAO;EACpE,OAAO;EACP,IAAI,OAAO,MAAM,qBAAqB,YAAY,MAAM,iBAAiB,UAAU,MAAM;OACpF,MAAM,cAAc,MAAM;EAE/B,aAAa;GACX,IAAI,OAAO,MAAM,wBAAwB,YACvC,MAAM,oBAAoB,UAAU,MAAM;QACvC,MAAM,iBAAiB,MAAM;EACpC;CACF,GAAG,CAAC,YAAY,CAAC;CAEjB,MAAM,gBAAgB,iBAAiB,WAAW,cAAc;CAChE,MAAM,WAAW,aACd,cAAyB;EACxB,IAAI,UAAU,KAAA,GAAW,qBAAqB,SAAS;EACvD,gBAAgB,SAAS;CAC3B,GACA,CAAC,eAAe,KAAK,CACvB;CACA,MAAM,eAAe,eACZ;EAAE,OAAO;EAAc;EAAe;CAAS,IACtD;EAAC;EAAc;EAAe;CAAQ,CACxC;CACA,MAAM,cAAc,eAAe;EAAE,GAAG;EAAO,GAAG,YAAY,MAAM;CAAE,IAAI,CAAC,OAAO,MAAM,CAAC;CACzF,MAAM,OAAO;CAEb,OACE,oBAAC,aAAa,UAAd;EAAuB,OAAO;YAC3B,cACC,MACA;GACE,GAAG;GACH,mBAAmB;GACnB,uBAAuB;GACvB,aAAa;GACR;GACL,OAAO;EACT,GACA,QACF;CACqB,CAAA;AAE3B,CAAC;AAED,SAAgB,WAAW;CACzB,OAAO,WAAW,YAAY;AAChC"}
1
+ {"version":3,"file":"theme-provider.js","names":[],"sources":["../../src/theme/theme-provider.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n createElement,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport type { ComponentPropsWithoutRef, CSSProperties, ElementType, ReactNode, Ref } from \"react\";\n\nimport { ThemeScopeContext } from \"./theme-scope\";\n\nexport type ThemeMode = \"light\" | \"dark\" | \"system\";\n\n/** A leaf value accepted by the theme variable mapper. */\nexport type JaciThemeTokenValue = string | number;\n\n/**\n * Semantic theme values. The groups intentionally accept additional keys so\n * applications can extend the token vocabulary without waiting for a package\n * release. Known semantic groups are documented in the public README.\n */\nexport type JaciThemeTokenGroup = {\n readonly [key: string]: JaciThemeTokenValue | JaciThemeTokenGroup | undefined;\n};\n\nexport interface JaciThemeColorTokens extends JaciThemeTokenGroup {\n surface?: JaciThemeTokenGroup;\n fg?: JaciThemeTokenGroup;\n border?: JaciThemeTokenGroup;\n accent?: JaciThemeTokenGroup;\n success?: JaciThemeTokenValue;\n warning?: JaciThemeTokenValue;\n danger?: JaciThemeTokenValue;\n info?: JaciThemeTokenValue;\n link?: JaciThemeTokenGroup;\n focus?: JaciThemeTokenValue;\n disabled?: JaciThemeTokenValue;\n selected?: JaciThemeTokenValue;\n}\n\nexport interface JaciThemeTokens {\n colors?: JaciThemeColorTokens;\n radii?: JaciThemeTokenGroup;\n shadows?: JaciThemeTokenGroup;\n durations?: JaciThemeTokenGroup;\n easings?: JaciThemeTokenGroup;\n transitions?: JaciThemeTokenGroup;\n spacing?: JaciThemeTokenGroup;\n fontSizes?: JaciThemeTokenGroup;\n lineHeights?: JaciThemeTokenGroup;\n typography?: JaciThemeTokenGroup;\n textStyles?: JaciThemeTokenGroup;\n fonts?: JaciThemeTokenGroup;\n}\n\nexport interface ThemeProviderProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> {\n /** The controlled color mode. */\n theme?: ThemeMode;\n /** The initial color mode for an uncontrolled provider. */\n defaultTheme?: ThemeMode;\n /** The deterministic mode used for `system` while rendering on the server. */\n ssrTheme?: \"light\" | \"dark\";\n /** Scoped semantic token overrides. */\n tokens?: JaciThemeTokens;\n /** Called when a controlled provider requests a mode change. */\n onThemeChange?: (theme: ThemeMode) => void;\n /** The element that owns the theme scope. */\n as?: ElementType;\n children?: ReactNode;\n}\n\nexport interface ThemeContextValue {\n theme: ThemeMode;\n resolvedTheme: \"light\" | \"dark\";\n setTheme: (theme: ThemeMode) => void;\n}\n\nconst defaultThemeContext: ThemeContextValue = {\n theme: \"light\",\n resolvedTheme: \"light\",\n setTheme: () => undefined,\n};\n\nconst ThemeContext = createContext<ThemeContextValue>(defaultThemeContext);\n\nfunction kebabCase(value: string) {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase();\n}\n\nfunction flattenTokens(\n group: JaciThemeTokenGroup | undefined,\n path: string[],\n output: Record<string, string>,\n) {\n if (!group) return;\n\n for (const [key, value] of Object.entries(group)) {\n if (value === undefined) continue;\n const nextPath = [...path, kebabCase(key)];\n\n if (typeof value === \"object\") {\n flattenTokens(value, nextPath, output);\n } else {\n output[`--jaci-${nextPath.join(\"-\")}`] = String(value);\n }\n }\n}\n\nfunction tokenStyles(tokens: JaciThemeTokens | undefined): CSSProperties {\n if (!tokens) return {};\n\n const variables: Record<string, string> = {};\n for (const [group, values] of Object.entries(tokens)) {\n flattenTokens(values, [kebabCase(group)], variables);\n }\n\n return variables as CSSProperties;\n}\n\nfunction initialSystemTheme(ssrTheme: \"light\" | \"dark\" | undefined) {\n return ssrTheme ?? \"light\";\n}\n\nexport const ThemeProvider = forwardRef<HTMLElement, ThemeProviderProps>(function ThemeProvider(\n {\n as = \"div\",\n children,\n defaultTheme = \"light\",\n onThemeChange,\n ssrTheme,\n style,\n theme,\n tokens,\n ...props\n },\n ref,\n) {\n const [uncontrolledTheme, setUncontrolledTheme] = useState<ThemeMode>(defaultTheme);\n const [systemTheme, setSystemTheme] = useState<\"light\" | \"dark\">(() =>\n initialSystemTheme(ssrTheme),\n );\n const [scopeElement, setScopeElement] = useState<HTMLElement | null>(null);\n const currentTheme = theme ?? uncontrolledTheme;\n\n useEffect(() => {\n if (currentTheme !== \"system\") return;\n\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return;\n\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const update = () => setSystemTheme(media.matches ? \"dark\" : \"light\");\n update();\n if (typeof media.addEventListener === \"function\") media.addEventListener(\"change\", update);\n else media.addListener?.(update);\n\n return () => {\n if (typeof media.removeEventListener === \"function\")\n media.removeEventListener(\"change\", update);\n else media.removeListener?.(update);\n };\n }, [currentTheme]);\n\n const resolvedTheme = currentTheme === \"system\" ? systemTheme : currentTheme;\n const setTheme = useCallback(\n (nextTheme: ThemeMode) => {\n if (theme === undefined) setUncontrolledTheme(nextTheme);\n onThemeChange?.(nextTheme);\n },\n [onThemeChange, theme],\n );\n const contextValue = useMemo(\n () => ({ theme: currentTheme, resolvedTheme, setTheme }),\n [currentTheme, resolvedTheme, setTheme],\n );\n const mergedStyle = useMemo(() => ({ ...style, ...tokenStyles(tokens) }), [style, tokens]);\n const Root = as;\n const setRootRef = useCallback(\n (element: HTMLElement | null) => {\n setScopeElement((current) => (current === element ? current : element));\n if (typeof ref === \"function\") ref(element);\n else if (ref) (ref as { current: HTMLElement | null }).current = element;\n },\n [ref],\n );\n\n return (\n <ThemeContext.Provider value={contextValue}>\n <ThemeScopeContext.Provider value={{ container: scopeElement }}>\n {createElement(\n Root,\n {\n ...props,\n \"data-jaci-theme\": resolvedTheme,\n \"data-jaci-component\": \"theme-provider\",\n \"data-slot\": \"theme-provider\",\n ref: setRootRef as Ref<HTMLElement>,\n style: mergedStyle,\n },\n children,\n )}\n </ThemeScopeContext.Provider>\n </ThemeContext.Provider>\n );\n});\n\nexport function useTheme() {\n return useContext(ThemeContext);\n}\n"],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ let react = require("react");
3
+ //#region src/theme/theme-scope.ts
4
+ const ThemeScopeContext = (0, react.createContext)({ container: null });
5
+ function useThemePortalContainer() {
6
+ return (0, react.useContext)(ThemeScopeContext).container;
7
+ }
8
+ function useThemePortalProps(props) {
9
+ const scopedContainer = useThemePortalContainer();
10
+ if (props.container !== void 0 || scopedContainer === null) return props;
11
+ return {
12
+ ...props,
13
+ container: scopedContainer
14
+ };
15
+ }
16
+ //#endregion
17
+ exports.ThemeScopeContext = ThemeScopeContext;
18
+ exports.useThemePortalContainer = useThemePortalContainer;
19
+ exports.useThemePortalProps = useThemePortalProps;
20
+
21
+ //# sourceMappingURL=theme-scope.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-scope.cjs","names":[],"sources":["../../src/theme/theme-scope.ts"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type { RefObject } from \"react\";\n\nexport type ThemePortalContainer =\n | HTMLElement\n | ShadowRoot\n | null\n | RefObject<HTMLElement | ShadowRoot | null>;\n\nexport interface ThemeScopeValue {\n container: HTMLElement | null;\n}\n\nexport const ThemeScopeContext = createContext<ThemeScopeValue>({ container: null });\n\nexport function useThemePortalContainer() {\n return useContext(ThemeScopeContext).container;\n}\n\nexport function useThemePortalProps<T extends { container?: ThemePortalContainer | undefined }>(\n props: T,\n): T {\n const scopedContainer = useThemePortalContainer();\n\n if (props.container !== undefined || scopedContainer === null) return props;\n\n return { ...props, container: scopedContainer };\n}\n"],"mappings":";;;AAeA,MAAa,qBAAA,GAAA,MAAA,cAAA,CAAmD,EAAE,WAAW,KAAK,CAAC;AAEnF,SAAgB,0BAA0B;CACxC,QAAA,GAAA,MAAA,WAAA,CAAkB,iBAAiB,CAAC,CAAC;AACvC;AAEA,SAAgB,oBACd,OACG;CACH,MAAM,kBAAkB,wBAAwB;CAEhD,IAAI,MAAM,cAAc,KAAA,KAAa,oBAAoB,MAAM,OAAO;CAEtE,OAAO;EAAE,GAAG;EAAO,WAAW;CAAgB;AAChD"}
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import { createContext, useContext } from "react";
3
+ //#region src/theme/theme-scope.ts
4
+ const ThemeScopeContext = createContext({ container: null });
5
+ function useThemePortalContainer() {
6
+ return useContext(ThemeScopeContext).container;
7
+ }
8
+ function useThemePortalProps(props) {
9
+ const scopedContainer = useThemePortalContainer();
10
+ if (props.container !== void 0 || scopedContainer === null) return props;
11
+ return {
12
+ ...props,
13
+ container: scopedContainer
14
+ };
15
+ }
16
+ //#endregion
17
+ export { ThemeScopeContext, useThemePortalContainer, useThemePortalProps };
18
+
19
+ //# sourceMappingURL=theme-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-scope.js","names":[],"sources":["../../src/theme/theme-scope.ts"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type { RefObject } from \"react\";\n\nexport type ThemePortalContainer =\n | HTMLElement\n | ShadowRoot\n | null\n | RefObject<HTMLElement | ShadowRoot | null>;\n\nexport interface ThemeScopeValue {\n container: HTMLElement | null;\n}\n\nexport const ThemeScopeContext = createContext<ThemeScopeValue>({ container: null });\n\nexport function useThemePortalContainer() {\n return useContext(ThemeScopeContext).container;\n}\n\nexport function useThemePortalProps<T extends { container?: ThemePortalContainer | undefined }>(\n props: T,\n): T {\n const scopedContainer = useThemePortalContainer();\n\n if (props.container !== undefined || scopedContainer === null) return props;\n\n return { ...props, container: scopedContainer };\n}\n"],"mappings":";;;AAeA,MAAa,oBAAoB,cAA+B,EAAE,WAAW,KAAK,CAAC;AAEnF,SAAgB,0BAA0B;CACxC,OAAO,WAAW,iBAAiB,CAAC,CAAC;AACvC;AAEA,SAAgB,oBACd,OACG;CACH,MAAM,kBAAkB,wBAAwB;CAEhD,IAAI,MAAM,cAAc,KAAA,KAAa,oBAAoB,MAAM,OAAO;CAEtE,OAAO;EAAE,GAAG;EAAO,WAAW;CAAgB;AAChD"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "jaci-ui",
3
3
  "description": "Accessible, themeable React components by Jaci UI",
4
- "version": "0.7.0",
4
+ "version": "0.8.0",
5
5
  "license": "MIT",
6
6
  "author": {
7
7
  "name": "Richard Borges",
@@ -97,15 +97,18 @@
97
97
  "clean": "rimraf dist src/styled-system",
98
98
  "panda:codegen": "panda codegen --clean --config panda.config.ts",
99
99
  "panda:css": "panda cssgen --config panda.config.ts --outfile dist/styles.css",
100
- "build": "pnpm panda:codegen && tsdown && pnpm panda:css && pnpm verify:client-boundaries",
100
+ "ensure:sourcemaps": "node scripts/ensure-entry-sourcemaps.mjs",
101
+ "build": "pnpm panda:codegen && tsdown && pnpm ensure:sourcemaps && pnpm panda:css && pnpm verify:client-boundaries",
101
102
  "dev": "pnpm panda:codegen && tsdown --watch",
102
- "lint": "biome lint src panda.config.ts tsdown.config.ts",
103
+ "lint": "biome check --assist-enabled=false src scripts panda.config.ts tsdown.config.ts",
103
104
  "format": "biome format --write src panda.config.ts tsdown.config.ts",
104
105
  "format:check": "biome format src panda.config.ts tsdown.config.ts",
105
106
  "typecheck": "pnpm panda:codegen && tsc --noEmit",
106
107
  "test": "pnpm panda:codegen && vitest run",
107
108
  "test:watch": "pnpm panda:codegen && vitest",
108
109
  "verify:client-boundaries": "node scripts/verify-client-boundaries.mjs",
109
- "package:check": "pnpm build && node scripts/package-check.mjs"
110
+ "package:check": "pnpm build && pnpm performance:check && pnpm package:contract",
111
+ "package:contract": "node scripts/package-check.mjs",
112
+ "performance:check": "node scripts/performance-check.mjs"
110
113
  }
111
114
  }