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.
- package/CHANGELOG.md +6 -0
- package/README.md +17 -0
- package/dist/components/alert-dialog/alert-dialog.cjs +4 -1
- package/dist/components/alert-dialog/alert-dialog.cjs.map +1 -1
- package/dist/components/alert-dialog/alert-dialog.d.cts +2 -2
- package/dist/components/alert-dialog/alert-dialog.d.ts +2 -2
- package/dist/components/alert-dialog/alert-dialog.js +4 -1
- package/dist/components/alert-dialog/alert-dialog.js.map +1 -1
- package/dist/components/color-picker/color-picker.cjs +4 -1
- package/dist/components/color-picker/color-picker.cjs.map +1 -1
- package/dist/components/color-picker/color-picker.d.cts +2 -2
- package/dist/components/color-picker/color-picker.d.ts +2 -2
- package/dist/components/color-picker/color-picker.js +4 -1
- package/dist/components/color-picker/color-picker.js.map +1 -1
- package/dist/components/combobox/combobox.cjs +4 -1
- package/dist/components/combobox/combobox.cjs.map +1 -1
- package/dist/components/combobox/combobox.d.cts +2 -2
- package/dist/components/combobox/combobox.d.ts +2 -2
- package/dist/components/combobox/combobox.js +4 -1
- package/dist/components/combobox/combobox.js.map +1 -1
- package/dist/components/command/command.cjs +73 -12
- package/dist/components/command/command.cjs.map +1 -1
- package/dist/components/command/command.d.cts +7 -1
- package/dist/components/command/command.d.ts +7 -1
- package/dist/components/command/command.js +73 -12
- package/dist/components/command/command.js.map +1 -1
- package/dist/components/command/index.d.cts +2 -2
- package/dist/components/command/index.d.ts +2 -2
- package/dist/components/context-menu/context-menu.cjs +4 -1
- package/dist/components/context-menu/context-menu.cjs.map +1 -1
- package/dist/components/context-menu/context-menu.d.cts +2 -2
- package/dist/components/context-menu/context-menu.d.ts +2 -2
- package/dist/components/context-menu/context-menu.js +4 -1
- package/dist/components/context-menu/context-menu.js.map +1 -1
- package/dist/components/date-picker/date-picker.cjs +4 -1
- package/dist/components/date-picker/date-picker.cjs.map +1 -1
- package/dist/components/date-picker/date-picker.d.cts +2 -2
- package/dist/components/date-picker/date-picker.d.ts +2 -2
- package/dist/components/date-picker/date-picker.js +4 -1
- package/dist/components/date-picker/date-picker.js.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.cjs +4 -1
- package/dist/components/date-range-picker/date-range-picker.cjs.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.d.cts +2 -2
- package/dist/components/date-range-picker/date-range-picker.d.ts +2 -2
- package/dist/components/date-range-picker/date-range-picker.js +4 -1
- package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
- package/dist/components/dialog/dialog.cjs +4 -1
- package/dist/components/dialog/dialog.cjs.map +1 -1
- package/dist/components/dialog/dialog.d.cts +2 -2
- package/dist/components/dialog/dialog.d.ts +2 -2
- package/dist/components/dialog/dialog.js +4 -1
- package/dist/components/dialog/dialog.js.map +1 -1
- package/dist/components/drawer/drawer.cjs +4 -1
- package/dist/components/drawer/drawer.cjs.map +1 -1
- package/dist/components/drawer/drawer.d.cts +2 -2
- package/dist/components/drawer/drawer.d.ts +2 -2
- package/dist/components/drawer/drawer.js +4 -1
- package/dist/components/drawer/drawer.js.map +1 -1
- package/dist/components/figure/figure.cjs +45 -36
- package/dist/components/figure/figure.cjs.map +1 -1
- package/dist/components/figure/figure.js +45 -36
- package/dist/components/figure/figure.js.map +1 -1
- package/dist/components/image/image.cjs +41 -32
- package/dist/components/image/image.cjs.map +1 -1
- package/dist/components/image/image.js +41 -32
- package/dist/components/image/image.js.map +1 -1
- package/dist/components/menu/menu.cjs +4 -1
- package/dist/components/menu/menu.cjs.map +1 -1
- package/dist/components/menu/menu.d.cts +2 -2
- package/dist/components/menu/menu.d.ts +2 -2
- package/dist/components/menu/menu.js +4 -1
- package/dist/components/menu/menu.js.map +1 -1
- package/dist/components/menubar/menubar.cjs +4 -1
- package/dist/components/menubar/menubar.cjs.map +1 -1
- package/dist/components/menubar/menubar.d.cts +2 -2
- package/dist/components/menubar/menubar.d.ts +2 -2
- package/dist/components/menubar/menubar.js +4 -1
- package/dist/components/menubar/menubar.js.map +1 -1
- package/dist/components/navigation/navigation.cjs +3 -1
- package/dist/components/navigation/navigation.cjs.map +1 -1
- package/dist/components/navigation/navigation.js +3 -1
- package/dist/components/navigation/navigation.js.map +1 -1
- package/dist/components/navigation-menu/navigation-menu.cjs +4 -1
- package/dist/components/navigation-menu/navigation-menu.cjs.map +1 -1
- package/dist/components/navigation-menu/navigation-menu.d.cts +2 -2
- package/dist/components/navigation-menu/navigation-menu.d.ts +2 -2
- package/dist/components/navigation-menu/navigation-menu.js +4 -1
- package/dist/components/navigation-menu/navigation-menu.js.map +1 -1
- package/dist/components/popover/popover.cjs +4 -1
- package/dist/components/popover/popover.cjs.map +1 -1
- package/dist/components/popover/popover.d.cts +2 -2
- package/dist/components/popover/popover.d.ts +2 -2
- package/dist/components/popover/popover.js +4 -1
- package/dist/components/popover/popover.js.map +1 -1
- package/dist/components/select/select.cjs +4 -1
- package/dist/components/select/select.cjs.map +1 -1
- package/dist/components/select/select.d.cts +2 -2
- package/dist/components/select/select.d.ts +2 -2
- package/dist/components/select/select.js +4 -1
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/sidebar/sidebar.cjs +24 -17
- package/dist/components/sidebar/sidebar.cjs.map +1 -1
- package/dist/components/sidebar/sidebar.d.cts +4 -2
- package/dist/components/sidebar/sidebar.d.ts +4 -2
- package/dist/components/sidebar/sidebar.js +24 -17
- package/dist/components/sidebar/sidebar.js.map +1 -1
- package/dist/components/toast/toast.cjs +4 -1
- package/dist/components/toast/toast.cjs.map +1 -1
- package/dist/components/toast/toast.d.cts +1 -1
- package/dist/components/toast/toast.d.ts +1 -1
- package/dist/components/toast/toast.js +4 -1
- package/dist/components/toast/toast.js.map +1 -1
- package/dist/components/tooltip/tooltip.cjs +4 -1
- package/dist/components/tooltip/tooltip.cjs.map +1 -1
- package/dist/components/tooltip/tooltip.d.cts +2 -2
- package/dist/components/tooltip/tooltip.d.ts +2 -2
- package/dist/components/tooltip/tooltip.js +4 -1
- package/dist/components/tooltip/tooltip.js.map +1 -1
- package/dist/index.cjs +1 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/dist/styled-system/recipes/command.cjs +3 -3
- package/dist/styled-system/recipes/command.cjs.map +1 -1
- package/dist/styled-system/recipes/command.js +3 -3
- package/dist/styled-system/recipes/command.js.map +1 -1
- package/dist/styled-system/recipes/figure.cjs +1 -0
- package/dist/styled-system/recipes/figure.cjs.map +1 -1
- package/dist/styled-system/recipes/figure.js +1 -0
- package/dist/styled-system/recipes/figure.js.map +1 -1
- package/dist/styled-system/recipes/image.cjs +1 -0
- package/dist/styled-system/recipes/image.cjs.map +1 -1
- package/dist/styled-system/recipes/image.js +1 -0
- package/dist/styled-system/recipes/image.js.map +1 -1
- package/dist/styles.css +70 -50
- package/dist/theme/theme-provider.cjs +18 -8
- package/dist/theme/theme-provider.cjs.map +1 -1
- package/dist/theme/theme-provider.js +18 -8
- package/dist/theme/theme-provider.js.map +1 -1
- package/dist/theme/theme-scope.cjs +21 -0
- package/dist/theme/theme-scope.cjs.map +1 -0
- package/dist/theme/theme-scope.js +19 -0
- package/dist/theme/theme-scope.js.map +1 -0
- 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
|
-
|
|
5338
|
-
|
|
5339
|
-
|
|
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 -
|
|
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-
|
|
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:
|
|
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-
|
|
10075
|
-
background-color: var(--jaci-colors-
|
|
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-
|
|
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-
|
|
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-
|
|
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,
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
|
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":"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"}
|
|
@@ -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:
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
|
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.
|
|
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
|
-
"
|
|
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
|
|
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 &&
|
|
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
|
}
|