@fangxinyan/lumina 0.1.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/LICENSE +15 -0
- package/README.md +110 -0
- package/dist/Accordion-GSBY5T5U.css +38 -0
- package/dist/Accordion.cjs +13 -0
- package/dist/Accordion.cjs.map +1 -0
- package/dist/Accordion.d.cts +21 -0
- package/dist/Accordion.d.ts +21 -0
- package/dist/Accordion.js +4 -0
- package/dist/Accordion.js.map +1 -0
- package/dist/Alert-LSKBYDRI.css +35 -0
- package/dist/Alert.cjs +13 -0
- package/dist/Alert.cjs.map +1 -0
- package/dist/Alert.d.cts +17 -0
- package/dist/Alert.d.ts +17 -0
- package/dist/Alert.js +4 -0
- package/dist/Alert.js.map +1 -0
- package/dist/AppShell-RCALXUCZ.css +162 -0
- package/dist/AppShell.cjs +24 -0
- package/dist/AppShell.cjs.map +1 -0
- package/dist/AppShell.d.cts +68 -0
- package/dist/AppShell.d.ts +68 -0
- package/dist/AppShell.js +3 -0
- package/dist/AppShell.js.map +1 -0
- package/dist/Avatar-OXDSG5Q6.css +36 -0
- package/dist/Avatar.cjs +12 -0
- package/dist/Avatar.cjs.map +1 -0
- package/dist/Avatar.d.cts +15 -0
- package/dist/Avatar.d.ts +15 -0
- package/dist/Avatar.js +3 -0
- package/dist/Avatar.js.map +1 -0
- package/dist/Button-5UI7QXGU.css +96 -0
- package/dist/Button.cjs +17 -0
- package/dist/Button.cjs.map +1 -0
- package/dist/Button.d.cts +41 -0
- package/dist/Button.d.ts +41 -0
- package/dist/Button.js +4 -0
- package/dist/Button.js.map +1 -0
- package/dist/Calendar-LHZELUDL.css +65 -0
- package/dist/Calendar.cjs +13 -0
- package/dist/Calendar.cjs.map +1 -0
- package/dist/Calendar.d.cts +16 -0
- package/dist/Calendar.d.ts +16 -0
- package/dist/Calendar.js +4 -0
- package/dist/Calendar.js.map +1 -0
- package/dist/Card-2CHHFD4Y.css +28 -0
- package/dist/Card.cjs +16 -0
- package/dist/Card.cjs.map +1 -0
- package/dist/Card.d.cts +25 -0
- package/dist/Card.d.ts +25 -0
- package/dist/Card.js +3 -0
- package/dist/Card.js.map +1 -0
- package/dist/Cascader-TO2QMSLJ.css +76 -0
- package/dist/Cascader.cjs +13 -0
- package/dist/Cascader.cjs.map +1 -0
- package/dist/Cascader.d.cts +23 -0
- package/dist/Cascader.d.ts +23 -0
- package/dist/Cascader.js +4 -0
- package/dist/Cascader.js.map +1 -0
- package/dist/Checkbox-SKJATVSN.css +72 -0
- package/dist/Checkbox.cjs +17 -0
- package/dist/Checkbox.cjs.map +1 -0
- package/dist/Checkbox.d.cts +33 -0
- package/dist/Checkbox.d.ts +33 -0
- package/dist/Checkbox.js +4 -0
- package/dist/Checkbox.js.map +1 -0
- package/dist/Divider-Z37INS5E.css +49 -0
- package/dist/Divider.cjs +12 -0
- package/dist/Divider.cjs.map +1 -0
- package/dist/Divider.d.cts +12 -0
- package/dist/Divider.d.ts +12 -0
- package/dist/Divider.js +3 -0
- package/dist/Divider.js.map +1 -0
- package/dist/Empty-VM23UNLQ.css +138 -0
- package/dist/Empty.cjs +20 -0
- package/dist/Empty.cjs.map +1 -0
- package/dist/Empty.d.cts +37 -0
- package/dist/Empty.d.ts +37 -0
- package/dist/Empty.js +3 -0
- package/dist/Empty.js.map +1 -0
- package/dist/Icon.cjs +16 -0
- package/dist/Icon.cjs.map +1 -0
- package/dist/Icon.d.cts +21 -0
- package/dist/Icon.d.ts +21 -0
- package/dist/Icon.js +3 -0
- package/dist/Icon.js.map +1 -0
- package/dist/Image-WYWORJT4.css +106 -0
- package/dist/Image.cjs +17 -0
- package/dist/Image.cjs.map +1 -0
- package/dist/Image.d.cts +30 -0
- package/dist/Image.d.ts +30 -0
- package/dist/Image.js +4 -0
- package/dist/Image.js.map +1 -0
- package/dist/Input-Z526ARZP.css +66 -0
- package/dist/Input.cjs +17 -0
- package/dist/Input.cjs.map +1 -0
- package/dist/Input.d.cts +36 -0
- package/dist/Input.d.ts +36 -0
- package/dist/Input.js +4 -0
- package/dist/Input.js.map +1 -0
- package/dist/List-W5BW4D2P.css +26 -0
- package/dist/List.cjs +12 -0
- package/dist/List.cjs.map +1 -0
- package/dist/List.d.cts +20 -0
- package/dist/List.d.ts +20 -0
- package/dist/List.js +3 -0
- package/dist/List.js.map +1 -0
- package/dist/Modal-AYKNIWWQ.css +79 -0
- package/dist/Modal.cjs +18 -0
- package/dist/Modal.cjs.map +1 -0
- package/dist/Modal.d.cts +27 -0
- package/dist/Modal.d.ts +27 -0
- package/dist/Modal.js +5 -0
- package/dist/Modal.js.map +1 -0
- package/dist/Pagination-6FFOI4NM.css +35 -0
- package/dist/Pagination.cjs +13 -0
- package/dist/Pagination.cjs.map +1 -0
- package/dist/Pagination.d.cts +19 -0
- package/dist/Pagination.d.ts +19 -0
- package/dist/Pagination.js +4 -0
- package/dist/Pagination.js.map +1 -0
- package/dist/Popover-WXEVUYBG.css +15 -0
- package/dist/Popover.cjs +12 -0
- package/dist/Popover.cjs.map +1 -0
- package/dist/Popover.d.cts +16 -0
- package/dist/Popover.d.ts +16 -0
- package/dist/Popover.js +3 -0
- package/dist/Popover.js.map +1 -0
- package/dist/Progress-IXRSO5TW.css +63 -0
- package/dist/Progress.cjs +16 -0
- package/dist/Progress.cjs.map +1 -0
- package/dist/Progress.d.cts +26 -0
- package/dist/Progress.d.ts +26 -0
- package/dist/Progress.js +3 -0
- package/dist/Progress.js.map +1 -0
- package/dist/Select-DDJJBQEL.css +263 -0
- package/dist/Select.cjs +14 -0
- package/dist/Select.cjs.map +1 -0
- package/dist/Select.d.cts +68 -0
- package/dist/Select.d.ts +68 -0
- package/dist/Select.js +5 -0
- package/dist/Select.js.map +1 -0
- package/dist/Slider-RE4HZQKF.css +59 -0
- package/dist/Slider.cjs +12 -0
- package/dist/Slider.cjs.map +1 -0
- package/dist/Slider.d.cts +18 -0
- package/dist/Slider.d.ts +18 -0
- package/dist/Slider.js +3 -0
- package/dist/Slider.js.map +1 -0
- package/dist/Switch-NP7KKJOX.css +44 -0
- package/dist/Switch.cjs +12 -0
- package/dist/Switch.cjs.map +1 -0
- package/dist/Switch.d.cts +18 -0
- package/dist/Switch.d.ts +18 -0
- package/dist/Switch.js +3 -0
- package/dist/Switch.js.map +1 -0
- package/dist/Table-ZDPGWLH3.css +139 -0
- package/dist/Table.cjs +18 -0
- package/dist/Table.cjs.map +1 -0
- package/dist/Table.d.cts +57 -0
- package/dist/Table.d.ts +57 -0
- package/dist/Table.js +5 -0
- package/dist/Table.js.map +1 -0
- package/dist/Tabs-A27TSZOP.css +95 -0
- package/dist/Tabs.cjs +16 -0
- package/dist/Tabs.cjs.map +1 -0
- package/dist/Tabs.d.cts +35 -0
- package/dist/Tabs.d.ts +35 -0
- package/dist/Tabs.js +3 -0
- package/dist/Tabs.js.map +1 -0
- package/dist/Tag-EYOY3UWG.css +49 -0
- package/dist/Tag.cjs +17 -0
- package/dist/Tag.cjs.map +1 -0
- package/dist/Tag.d.cts +27 -0
- package/dist/Tag.d.ts +27 -0
- package/dist/Tag.js +4 -0
- package/dist/Tag.js.map +1 -0
- package/dist/Theme.cjs +44 -0
- package/dist/Theme.cjs.map +1 -0
- package/dist/Theme.d.cts +127 -0
- package/dist/Theme.d.ts +127 -0
- package/dist/Theme.js +3 -0
- package/dist/Theme.js.map +1 -0
- package/dist/Toast-ERHDN3WG.css +45 -0
- package/dist/Toast.cjs +17 -0
- package/dist/Toast.cjs.map +1 -0
- package/dist/Toast.d.cts +26 -0
- package/dist/Toast.d.ts +26 -0
- package/dist/Toast.js +4 -0
- package/dist/Toast.js.map +1 -0
- package/dist/Tooltip-RT4BOVTD.css +23 -0
- package/dist/Tooltip.cjs +12 -0
- package/dist/Tooltip.cjs.map +1 -0
- package/dist/Tooltip.d.cts +13 -0
- package/dist/Tooltip.d.ts +13 -0
- package/dist/Tooltip.js +3 -0
- package/dist/Tooltip.js.map +1 -0
- package/dist/chunk-2VA2HSL4.cjs +121 -0
- package/dist/chunk-2VA2HSL4.cjs.map +1 -0
- package/dist/chunk-2W2AJUZW.js +118 -0
- package/dist/chunk-2W2AJUZW.js.map +1 -0
- package/dist/chunk-3QWHDCHJ.js +53 -0
- package/dist/chunk-3QWHDCHJ.js.map +1 -0
- package/dist/chunk-3WAFIUDQ.js +85 -0
- package/dist/chunk-3WAFIUDQ.js.map +1 -0
- package/dist/chunk-4AA22BOG.js +63 -0
- package/dist/chunk-4AA22BOG.js.map +1 -0
- package/dist/chunk-4GT5TOHP.js +18 -0
- package/dist/chunk-4GT5TOHP.js.map +1 -0
- package/dist/chunk-5EYI27B6.js +64 -0
- package/dist/chunk-5EYI27B6.js.map +1 -0
- package/dist/chunk-6YVW3VYL.js +51 -0
- package/dist/chunk-6YVW3VYL.js.map +1 -0
- package/dist/chunk-77NP67ML.cjs +70 -0
- package/dist/chunk-77NP67ML.cjs.map +1 -0
- package/dist/chunk-7CKHWCEA.cjs +110 -0
- package/dist/chunk-7CKHWCEA.cjs.map +1 -0
- package/dist/chunk-7H453VPW.cjs +20 -0
- package/dist/chunk-7H453VPW.cjs.map +1 -0
- package/dist/chunk-7NM5BRUX.js +91 -0
- package/dist/chunk-7NM5BRUX.js.map +1 -0
- package/dist/chunk-7U6I44RV.cjs +283 -0
- package/dist/chunk-7U6I44RV.cjs.map +1 -0
- package/dist/chunk-AAMYURWQ.cjs +87 -0
- package/dist/chunk-AAMYURWQ.cjs.map +1 -0
- package/dist/chunk-ALFDP5WX.cjs +70 -0
- package/dist/chunk-ALFDP5WX.cjs.map +1 -0
- package/dist/chunk-C5TGQ7CV.cjs +114 -0
- package/dist/chunk-C5TGQ7CV.cjs.map +1 -0
- package/dist/chunk-F3NHM4GX.js +20 -0
- package/dist/chunk-F3NHM4GX.js.map +1 -0
- package/dist/chunk-FI7QO3I5.cjs +90 -0
- package/dist/chunk-FI7QO3I5.cjs.map +1 -0
- package/dist/chunk-FMG3ZPGK.js +88 -0
- package/dist/chunk-FMG3ZPGK.js.map +1 -0
- package/dist/chunk-G3UWXSNQ.js +71 -0
- package/dist/chunk-G3UWXSNQ.js.map +1 -0
- package/dist/chunk-GEYMWUW6.js +146 -0
- package/dist/chunk-GEYMWUW6.js.map +1 -0
- package/dist/chunk-HTP6UEVR.js +48 -0
- package/dist/chunk-HTP6UEVR.js.map +1 -0
- package/dist/chunk-I2ERCHFV.cjs +58 -0
- package/dist/chunk-I2ERCHFV.cjs.map +1 -0
- package/dist/chunk-I7SSCSFH.js +253 -0
- package/dist/chunk-I7SSCSFH.js.map +1 -0
- package/dist/chunk-IGHLSNXT.cjs +109 -0
- package/dist/chunk-IGHLSNXT.cjs.map +1 -0
- package/dist/chunk-IKI5CS4L.cjs +91 -0
- package/dist/chunk-IKI5CS4L.cjs.map +1 -0
- package/dist/chunk-ITGCHU3Y.cjs +94 -0
- package/dist/chunk-ITGCHU3Y.cjs.map +1 -0
- package/dist/chunk-JNFCTYJT.cjs +31 -0
- package/dist/chunk-JNFCTYJT.cjs.map +1 -0
- package/dist/chunk-JWFVSBVX.cjs +30 -0
- package/dist/chunk-JWFVSBVX.cjs.map +1 -0
- package/dist/chunk-K5MHL732.js +81 -0
- package/dist/chunk-K5MHL732.js.map +1 -0
- package/dist/chunk-K67KIKX4.cjs +67 -0
- package/dist/chunk-K67KIKX4.cjs.map +1 -0
- package/dist/chunk-KF4MCHZL.cjs +105 -0
- package/dist/chunk-KF4MCHZL.cjs.map +1 -0
- package/dist/chunk-M6CGYGEO.js +91 -0
- package/dist/chunk-M6CGYGEO.js.map +1 -0
- package/dist/chunk-M6OTFXZA.js +48 -0
- package/dist/chunk-M6OTFXZA.js.map +1 -0
- package/dist/chunk-NWJW5KLN.js +29 -0
- package/dist/chunk-NWJW5KLN.js.map +1 -0
- package/dist/chunk-NXOAYNG2.cjs +52 -0
- package/dist/chunk-NXOAYNG2.cjs.map +1 -0
- package/dist/chunk-NZPJ7BUB.cjs +22 -0
- package/dist/chunk-NZPJ7BUB.cjs.map +1 -0
- package/dist/chunk-OUJBCNWD.js +52 -0
- package/dist/chunk-OUJBCNWD.js.map +1 -0
- package/dist/chunk-OXYFB2ZI.js +35 -0
- package/dist/chunk-OXYFB2ZI.js.map +1 -0
- package/dist/chunk-Q33V7MSK.js +79 -0
- package/dist/chunk-Q33V7MSK.js.map +1 -0
- package/dist/chunk-QESLHLTG.cjs +107 -0
- package/dist/chunk-QESLHLTG.cjs.map +1 -0
- package/dist/chunk-QPZZNSRB.js +65 -0
- package/dist/chunk-QPZZNSRB.js.map +1 -0
- package/dist/chunk-QT7SJITQ.cjs +114 -0
- package/dist/chunk-QT7SJITQ.cjs.map +1 -0
- package/dist/chunk-RMD6KQ4H.cjs +56 -0
- package/dist/chunk-RMD6KQ4H.cjs.map +1 -0
- package/dist/chunk-T5AH4FCV.js +280 -0
- package/dist/chunk-T5AH4FCV.js.map +1 -0
- package/dist/chunk-U6ODMPTI.cjs +74 -0
- package/dist/chunk-U6ODMPTI.cjs.map +1 -0
- package/dist/chunk-V2ZUOEXM.cjs +73 -0
- package/dist/chunk-V2ZUOEXM.cjs.map +1 -0
- package/dist/chunk-VJN637MT.js +49 -0
- package/dist/chunk-VJN637MT.js.map +1 -0
- package/dist/chunk-VMHNKD3N.cjs +56 -0
- package/dist/chunk-VMHNKD3N.cjs.map +1 -0
- package/dist/chunk-VXITDXLW.js +28 -0
- package/dist/chunk-VXITDXLW.js.map +1 -0
- package/dist/chunk-XFRP2MBR.js +87 -0
- package/dist/chunk-XFRP2MBR.js.map +1 -0
- package/dist/chunk-XRZ5OKZH.js +101 -0
- package/dist/chunk-XRZ5OKZH.js.map +1 -0
- package/dist/chunk-Y6FVCCUE.js +34 -0
- package/dist/chunk-Y6FVCCUE.js.map +1 -0
- package/dist/chunk-YVO7XO4W.cjs +149 -0
- package/dist/chunk-YVO7XO4W.cjs.map +1 -0
- package/dist/chunk-ZMDVK2U3.cjs +302 -0
- package/dist/chunk-ZMDVK2U3.cjs.map +1 -0
- package/dist/chunk-ZXM247EM.cjs +123 -0
- package/dist/chunk-ZXM247EM.cjs.map +1 -0
- package/dist/index.cjs +249 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +35 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/shared-NJHRNLRH.css +4 -0
- package/dist/styles.css +2068 -0
- package/dist/tokens-HWQ7KWPG.css +153 -0
- package/dist/tokens.css +153 -0
- package/package.json +77 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/* ============ Tabs ============ */
|
|
2
|
+
.tabs { display: flex; flex-direction: column; gap: var(--gap-3); }
|
|
3
|
+
.tabs-nav {
|
|
4
|
+
display: inline-flex;
|
|
5
|
+
padding: 5px;
|
|
6
|
+
border-radius: var(--r-md);
|
|
7
|
+
background: var(--bg);
|
|
8
|
+
box-shadow: var(--neu-in-sm);
|
|
9
|
+
gap: 2px;
|
|
10
|
+
align-self: flex-start;
|
|
11
|
+
}
|
|
12
|
+
.tabs-nav .tab {
|
|
13
|
+
padding: 8px 16px;
|
|
14
|
+
border: none;
|
|
15
|
+
background: transparent;
|
|
16
|
+
border-radius: calc(var(--r-md) - 5px);
|
|
17
|
+
font-size: 12px;
|
|
18
|
+
font-weight: 500;
|
|
19
|
+
font-family: inherit;
|
|
20
|
+
color: var(--fg-muted);
|
|
21
|
+
cursor: pointer;
|
|
22
|
+
display: inline-flex;
|
|
23
|
+
align-items: center;
|
|
24
|
+
gap: 6px;
|
|
25
|
+
transition: all var(--dur-fast) var(--ease);
|
|
26
|
+
}
|
|
27
|
+
.tabs-nav .tab:hover { color: var(--fg); }
|
|
28
|
+
.tabs-nav .tab.active {
|
|
29
|
+
color: var(--accent-ink);
|
|
30
|
+
background: var(--bg);
|
|
31
|
+
box-shadow: var(--neu-out-sm);
|
|
32
|
+
font-weight: 600;
|
|
33
|
+
}
|
|
34
|
+
.tabs-nav .tab[disabled] { opacity: 0.4; cursor: not-allowed; }
|
|
35
|
+
|
|
36
|
+
.tabs.line .tabs-nav,
|
|
37
|
+
.tabs.underline .tabs-nav {
|
|
38
|
+
padding: 0;
|
|
39
|
+
background: transparent;
|
|
40
|
+
box-shadow: none;
|
|
41
|
+
border-radius: 0;
|
|
42
|
+
border-bottom: 1px solid var(--divider);
|
|
43
|
+
align-self: stretch;
|
|
44
|
+
}
|
|
45
|
+
.tabs.line .tabs-nav .tab,
|
|
46
|
+
.tabs.underline .tabs-nav .tab {
|
|
47
|
+
padding: 10px 4px;
|
|
48
|
+
margin-right: 22px;
|
|
49
|
+
border-radius: 0;
|
|
50
|
+
position: relative;
|
|
51
|
+
}
|
|
52
|
+
.tabs.line .tabs-nav .tab.active,
|
|
53
|
+
.tabs.underline .tabs-nav .tab.active { background: transparent; box-shadow: none; }
|
|
54
|
+
.tabs.line .tabs-nav .tab.active::after,
|
|
55
|
+
.tabs.underline .tabs-nav .tab.active::after {
|
|
56
|
+
content: ""; position: absolute; left: 0; right: 0; bottom: -1px; height: 2px;
|
|
57
|
+
background: var(--accent); border-radius: 999px;
|
|
58
|
+
box-shadow: 0 0 8px var(--accent-glow);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.tabs-content { padding: var(--gap-2) 0; }
|
|
62
|
+
|
|
63
|
+
/* Segmented (owned by Tabs.tsx — Segmented is co-exported) */
|
|
64
|
+
.segmented {
|
|
65
|
+
display: inline-flex;
|
|
66
|
+
padding: 4px;
|
|
67
|
+
border-radius: var(--r-md);
|
|
68
|
+
background: var(--bg);
|
|
69
|
+
box-shadow: var(--neu-in-sm);
|
|
70
|
+
gap: 2px;
|
|
71
|
+
}
|
|
72
|
+
.segmented .seg {
|
|
73
|
+
padding: 6px 14px;
|
|
74
|
+
height: 32px;
|
|
75
|
+
display: inline-flex;
|
|
76
|
+
align-items: center;
|
|
77
|
+
gap: 6px;
|
|
78
|
+
border: none;
|
|
79
|
+
background: transparent;
|
|
80
|
+
border-radius: calc(var(--r-md) - 4px);
|
|
81
|
+
font-size: 12px;
|
|
82
|
+
font-family: inherit;
|
|
83
|
+
color: var(--fg-muted);
|
|
84
|
+
cursor: pointer;
|
|
85
|
+
transition: all var(--dur-fast) var(--ease);
|
|
86
|
+
}
|
|
87
|
+
.segmented .seg:hover { color: var(--fg); }
|
|
88
|
+
.segmented .seg.active {
|
|
89
|
+
color: var(--accent-ink);
|
|
90
|
+
background: var(--bg);
|
|
91
|
+
box-shadow: var(--neu-out-sm);
|
|
92
|
+
font-weight: 600;
|
|
93
|
+
}
|
|
94
|
+
.segmented.sm .seg { height: 26px; padding: 4px 10px; font-size: 11px; }
|
|
95
|
+
.segmented.lg .seg { height: 38px; padding: 8px 18px; font-size: 13px; }
|
package/dist/Tabs.cjs
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkITGCHU3Y_cjs = require('./chunk-ITGCHU3Y.cjs');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "Segmented", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () { return chunkITGCHU3Y_cjs.Segmented; }
|
|
10
|
+
});
|
|
11
|
+
Object.defineProperty(exports, "Tabs", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
get: function () { return chunkITGCHU3Y_cjs.Tabs; }
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=Tabs.cjs.map
|
|
16
|
+
//# sourceMappingURL=Tabs.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"Tabs.cjs"}
|
package/dist/Tabs.d.cts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
|
|
4
|
+
interface TabItem {
|
|
5
|
+
key: string;
|
|
6
|
+
label: React.ReactNode;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
content?: React.ReactNode;
|
|
9
|
+
}
|
|
10
|
+
interface TabsProps {
|
|
11
|
+
items: TabItem[];
|
|
12
|
+
activeKey?: string;
|
|
13
|
+
defaultActiveKey?: string;
|
|
14
|
+
onChange?: (key: string) => void;
|
|
15
|
+
variant?: "line" | "pill" | "segmented";
|
|
16
|
+
className?: string;
|
|
17
|
+
}
|
|
18
|
+
/** `Tabs` — switchable sections. */
|
|
19
|
+
declare const Tabs: React.FC<TabsProps>;
|
|
20
|
+
interface SegmentedProps<T extends string = string> {
|
|
21
|
+
options: {
|
|
22
|
+
value: T;
|
|
23
|
+
label: React.ReactNode;
|
|
24
|
+
disabled?: boolean;
|
|
25
|
+
}[];
|
|
26
|
+
value?: T;
|
|
27
|
+
defaultValue?: T;
|
|
28
|
+
onChange?: (value: T) => void;
|
|
29
|
+
size?: "sm" | "md";
|
|
30
|
+
className?: string;
|
|
31
|
+
}
|
|
32
|
+
/** `Segmented` — exclusive choice chip row. */
|
|
33
|
+
declare function Segmented<T extends string = string>({ options, value, defaultValue, onChange, size, className, }: SegmentedProps<T>): react_jsx_runtime.JSX.Element;
|
|
34
|
+
|
|
35
|
+
export { Segmented, type SegmentedProps, type TabItem, Tabs, type TabsProps };
|
package/dist/Tabs.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
|
|
4
|
+
interface TabItem {
|
|
5
|
+
key: string;
|
|
6
|
+
label: React.ReactNode;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
content?: React.ReactNode;
|
|
9
|
+
}
|
|
10
|
+
interface TabsProps {
|
|
11
|
+
items: TabItem[];
|
|
12
|
+
activeKey?: string;
|
|
13
|
+
defaultActiveKey?: string;
|
|
14
|
+
onChange?: (key: string) => void;
|
|
15
|
+
variant?: "line" | "pill" | "segmented";
|
|
16
|
+
className?: string;
|
|
17
|
+
}
|
|
18
|
+
/** `Tabs` — switchable sections. */
|
|
19
|
+
declare const Tabs: React.FC<TabsProps>;
|
|
20
|
+
interface SegmentedProps<T extends string = string> {
|
|
21
|
+
options: {
|
|
22
|
+
value: T;
|
|
23
|
+
label: React.ReactNode;
|
|
24
|
+
disabled?: boolean;
|
|
25
|
+
}[];
|
|
26
|
+
value?: T;
|
|
27
|
+
defaultValue?: T;
|
|
28
|
+
onChange?: (value: T) => void;
|
|
29
|
+
size?: "sm" | "md";
|
|
30
|
+
className?: string;
|
|
31
|
+
}
|
|
32
|
+
/** `Segmented` — exclusive choice chip row. */
|
|
33
|
+
declare function Segmented<T extends string = string>({ options, value, defaultValue, onChange, size, className, }: SegmentedProps<T>): react_jsx_runtime.JSX.Element;
|
|
34
|
+
|
|
35
|
+
export { Segmented, type SegmentedProps, type TabItem, Tabs, type TabsProps };
|
package/dist/Tabs.js
ADDED
package/dist/Tabs.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"Tabs.js"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/* ============ Tag & Badge ============ */
|
|
2
|
+
.tag {
|
|
3
|
+
display: inline-flex;
|
|
4
|
+
align-items: center;
|
|
5
|
+
gap: 6px;
|
|
6
|
+
height: 24px;
|
|
7
|
+
padding: 0 10px;
|
|
8
|
+
border-radius: var(--r-pill);
|
|
9
|
+
font-size: 11px;
|
|
10
|
+
font-weight: 500;
|
|
11
|
+
background: var(--bg);
|
|
12
|
+
box-shadow: var(--neu-flat);
|
|
13
|
+
color: var(--fg-muted);
|
|
14
|
+
}
|
|
15
|
+
.tag.accent { color: var(--accent-ink); }
|
|
16
|
+
.tag.info { color: var(--info); }
|
|
17
|
+
.tag.success { color: var(--success); }
|
|
18
|
+
.tag.warning { color: var(--warning); }
|
|
19
|
+
.tag.danger { color: var(--danger); }
|
|
20
|
+
.tag.solid { background: var(--accent); color: white; box-shadow: 0 2px 6px var(--accent-glow); }
|
|
21
|
+
.tag.solid.info { background: var(--info); color: white; box-shadow: 0 2px 6px color-mix(in oklch, var(--info) 35%, transparent); }
|
|
22
|
+
.tag.solid.success { background: var(--success); color: white; box-shadow: 0 2px 6px color-mix(in oklch, var(--success) 35%, transparent); }
|
|
23
|
+
.tag.solid.warning { background: var(--warning); color: white; box-shadow: 0 2px 6px color-mix(in oklch, var(--warning) 35%, transparent); }
|
|
24
|
+
.tag.solid.danger { background: var(--danger); color: white; box-shadow: 0 2px 6px color-mix(in oklch, var(--danger) 35%, transparent); }
|
|
25
|
+
.tag .dot { width: 6px; height: 6px; border-radius: 999px; background: currentColor; }
|
|
26
|
+
.tag .x { cursor: pointer; color: var(--fg-subtle); margin-left: 2px; display: inline-flex; }
|
|
27
|
+
.tag .x:hover { color: var(--fg); }
|
|
28
|
+
|
|
29
|
+
.badge {
|
|
30
|
+
display: inline-flex;
|
|
31
|
+
align-items: center; justify-content: center;
|
|
32
|
+
min-width: 18px; height: 18px;
|
|
33
|
+
padding: 0 6px;
|
|
34
|
+
border-radius: 999px;
|
|
35
|
+
font-size: 10px;
|
|
36
|
+
font-weight: 700;
|
|
37
|
+
background: var(--danger);
|
|
38
|
+
color: white;
|
|
39
|
+
box-shadow: 0 1px 4px rgba(0,0,0,0.15);
|
|
40
|
+
font-variant-numeric: tabular-nums;
|
|
41
|
+
}
|
|
42
|
+
.badge.dot { min-width: 10px; height: 10px; padding: 0; }
|
|
43
|
+
.badge.accent { background: var(--accent); box-shadow: 0 1px 4px var(--accent-glow); }
|
|
44
|
+
.badge.info { background: var(--info); box-shadow: 0 1px 4px color-mix(in oklch, var(--info) 35%, transparent); }
|
|
45
|
+
.badge.success { background: var(--success); box-shadow: 0 1px 4px color-mix(in oklch, var(--success) 35%, transparent); }
|
|
46
|
+
.badge.warning { background: var(--warning); box-shadow: 0 1px 4px color-mix(in oklch, var(--warning) 35%, transparent); }
|
|
47
|
+
.badge.neutral { background: var(--fg-muted); box-shadow: 0 1px 4px rgba(0,0,0,0.15); }
|
|
48
|
+
.badge-wrap { position: relative; display: inline-block; }
|
|
49
|
+
.badge-wrap > .badge { position: absolute; top: -4px; right: -4px; }
|
package/dist/Tag.cjs
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkVMHNKD3N_cjs = require('./chunk-VMHNKD3N.cjs');
|
|
4
|
+
require('./chunk-YVO7XO4W.cjs');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Object.defineProperty(exports, "Badge", {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
get: function () { return chunkVMHNKD3N_cjs.Badge; }
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "Tag", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () { return chunkVMHNKD3N_cjs.Tag; }
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=Tag.cjs.map
|
|
17
|
+
//# sourceMappingURL=Tag.cjs.map
|
package/dist/Tag.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"Tag.cjs"}
|
package/dist/Tag.d.cts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
type TagTone = "neutral" | "accent" | "info" | "success" | "warning" | "danger";
|
|
4
|
+
interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {
|
|
5
|
+
tone?: TagTone;
|
|
6
|
+
solid?: boolean;
|
|
7
|
+
/** Render a leading colored dot. */
|
|
8
|
+
dot?: boolean;
|
|
9
|
+
/** Show a close button. */
|
|
10
|
+
removable?: boolean;
|
|
11
|
+
onRemove?: () => void;
|
|
12
|
+
children?: React.ReactNode;
|
|
13
|
+
}
|
|
14
|
+
/** `Tag` — small label/pill. */
|
|
15
|
+
declare const Tag: React.FC<TagProps>;
|
|
16
|
+
interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
|
|
17
|
+
/** Numeric count — renders as "99+" if > 99. */
|
|
18
|
+
count?: number;
|
|
19
|
+
/** Show a tiny dot instead of a number. */
|
|
20
|
+
dot?: boolean;
|
|
21
|
+
tone?: TagTone;
|
|
22
|
+
children?: React.ReactNode;
|
|
23
|
+
}
|
|
24
|
+
/** `Badge` — notification dot / count. Wrap around another element. */
|
|
25
|
+
declare const Badge: React.FC<BadgeProps>;
|
|
26
|
+
|
|
27
|
+
export { Badge, type BadgeProps, Tag, type TagProps, type TagTone };
|
package/dist/Tag.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
type TagTone = "neutral" | "accent" | "info" | "success" | "warning" | "danger";
|
|
4
|
+
interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {
|
|
5
|
+
tone?: TagTone;
|
|
6
|
+
solid?: boolean;
|
|
7
|
+
/** Render a leading colored dot. */
|
|
8
|
+
dot?: boolean;
|
|
9
|
+
/** Show a close button. */
|
|
10
|
+
removable?: boolean;
|
|
11
|
+
onRemove?: () => void;
|
|
12
|
+
children?: React.ReactNode;
|
|
13
|
+
}
|
|
14
|
+
/** `Tag` — small label/pill. */
|
|
15
|
+
declare const Tag: React.FC<TagProps>;
|
|
16
|
+
interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
|
|
17
|
+
/** Numeric count — renders as "99+" if > 99. */
|
|
18
|
+
count?: number;
|
|
19
|
+
/** Show a tiny dot instead of a number. */
|
|
20
|
+
dot?: boolean;
|
|
21
|
+
tone?: TagTone;
|
|
22
|
+
children?: React.ReactNode;
|
|
23
|
+
}
|
|
24
|
+
/** `Badge` — notification dot / count. Wrap around another element. */
|
|
25
|
+
declare const Badge: React.FC<BadgeProps>;
|
|
26
|
+
|
|
27
|
+
export { Badge, type BadgeProps, Tag, type TagProps, type TagTone };
|
package/dist/Tag.js
ADDED
package/dist/Tag.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"Tag.js"}
|
package/dist/Theme.cjs
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk7U6I44RV_cjs = require('./chunk-7U6I44RV.cjs');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "ACCENT_PRESETS", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () { return chunk7U6I44RV_cjs.ACCENT_PRESETS; }
|
|
10
|
+
});
|
|
11
|
+
Object.defineProperty(exports, "ACCENT_PRESETS_DARK", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
get: function () { return chunk7U6I44RV_cjs.ACCENT_PRESETS_DARK; }
|
|
14
|
+
});
|
|
15
|
+
Object.defineProperty(exports, "FONT_STACKS", {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return chunk7U6I44RV_cjs.FONT_STACKS; }
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports, "ThemeProvider", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function () { return chunk7U6I44RV_cjs.ThemeProvider; }
|
|
22
|
+
});
|
|
23
|
+
Object.defineProperty(exports, "applyTheme", {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
get: function () { return chunk7U6I44RV_cjs.applyTheme; }
|
|
26
|
+
});
|
|
27
|
+
Object.defineProperty(exports, "normalizeAccentInput", {
|
|
28
|
+
enumerable: true,
|
|
29
|
+
get: function () { return chunk7U6I44RV_cjs.normalizeAccentInput; }
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(exports, "resolveThemeMode", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
get: function () { return chunk7U6I44RV_cjs.resolveThemeMode; }
|
|
34
|
+
});
|
|
35
|
+
Object.defineProperty(exports, "useTheme", {
|
|
36
|
+
enumerable: true,
|
|
37
|
+
get: function () { return chunk7U6I44RV_cjs.useTheme; }
|
|
38
|
+
});
|
|
39
|
+
Object.defineProperty(exports, "useThemeOptional", {
|
|
40
|
+
enumerable: true,
|
|
41
|
+
get: function () { return chunk7U6I44RV_cjs.useThemeOptional; }
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=Theme.cjs.map
|
|
44
|
+
//# sourceMappingURL=Theme.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"Theme.cjs"}
|
package/dist/Theme.d.cts
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
type ThemeMode = "light" | "dark" | "system";
|
|
4
|
+
type ResolvedThemeMode = "light" | "dark";
|
|
5
|
+
type AccentKey = "sky" | "coral" | "mint" | "violet" | "amber" | "rose";
|
|
6
|
+
type DensityMode = "compact" | "comfortable" | "spacious";
|
|
7
|
+
type FontKey = "system" | "sf" | "serif" | "mono";
|
|
8
|
+
/** Full accent color slots. All four CSS variables the library reads. */
|
|
9
|
+
interface AccentPalette {
|
|
10
|
+
/** Primary accent — `--accent`. */
|
|
11
|
+
accent: string;
|
|
12
|
+
/** Darker text-on-soft variant — `--accent-ink`. */
|
|
13
|
+
ink: string;
|
|
14
|
+
/** Pale tint for backgrounds — `--accent-soft`. */
|
|
15
|
+
soft: string;
|
|
16
|
+
/** Halo / glow color (typically with alpha) — `--accent-glow`. */
|
|
17
|
+
glow: string;
|
|
18
|
+
}
|
|
19
|
+
/** Input type for custom accent: either full palette, or just a base color
|
|
20
|
+
* (missing slots derived via color-mix in CSS). */
|
|
21
|
+
type CustomAccentInput = string | Partial<AccentPalette> & {
|
|
22
|
+
accent: string;
|
|
23
|
+
};
|
|
24
|
+
/** Font config — either a preset key, a single sans string, or a granular object. */
|
|
25
|
+
type FontConfig = FontKey | string | {
|
|
26
|
+
sans?: string;
|
|
27
|
+
display?: string;
|
|
28
|
+
mono?: string;
|
|
29
|
+
};
|
|
30
|
+
/** Arbitrary CSS variable overrides. Keys may be either a short name
|
|
31
|
+
* (e.g. `"bg"` → `--bg`) or a full var name (e.g. `"--bg"`). */
|
|
32
|
+
type ThemeTokens = Record<string, string>;
|
|
33
|
+
interface ThemeConfig {
|
|
34
|
+
mode?: ThemeMode;
|
|
35
|
+
accent?: AccentKey | CustomAccentInput;
|
|
36
|
+
density?: DensityMode;
|
|
37
|
+
/** Shadow strength, 1..10. Maps to `--d` (0.4..1.6). */
|
|
38
|
+
intensity?: number;
|
|
39
|
+
/** Base radius in px — generates the full `--r-*` scale. */
|
|
40
|
+
radius?: number;
|
|
41
|
+
font?: FontConfig;
|
|
42
|
+
tokens?: ThemeTokens;
|
|
43
|
+
}
|
|
44
|
+
interface ThemeValue {
|
|
45
|
+
/** Requested mode ("system" is preserved here). */
|
|
46
|
+
mode: ThemeMode;
|
|
47
|
+
/** Resolved concrete mode ("system" → "light" | "dark" based on OS). */
|
|
48
|
+
resolvedMode: ResolvedThemeMode;
|
|
49
|
+
/** Accent key or "custom" if a palette was supplied. */
|
|
50
|
+
accent: AccentKey | "custom";
|
|
51
|
+
/** Resolved palette currently in effect. */
|
|
52
|
+
accentPalette: AccentPalette;
|
|
53
|
+
density: DensityMode;
|
|
54
|
+
intensity: number;
|
|
55
|
+
radius: number;
|
|
56
|
+
font: FontConfig;
|
|
57
|
+
tokens: ThemeTokens;
|
|
58
|
+
setMode: (m: ThemeMode) => void;
|
|
59
|
+
toggleMode: () => void;
|
|
60
|
+
setAccent: (a: AccentKey | CustomAccentInput) => void;
|
|
61
|
+
setDensity: (d: DensityMode) => void;
|
|
62
|
+
setIntensity: (n: number) => void;
|
|
63
|
+
setRadius: (n: number) => void;
|
|
64
|
+
setFont: (f: FontConfig) => void;
|
|
65
|
+
setTokens: (t: ThemeTokens) => void;
|
|
66
|
+
/** Shallow-merge a partial config. */
|
|
67
|
+
update: (cfg: Partial<ThemeConfig>) => void;
|
|
68
|
+
/** Reset to the initial props. */
|
|
69
|
+
reset: () => void;
|
|
70
|
+
}
|
|
71
|
+
/** Built-in accent palettes (light-mode values). */
|
|
72
|
+
declare const ACCENT_PRESETS: Record<AccentKey, AccentPalette>;
|
|
73
|
+
/** Dark-mode overrides — ink/soft shift, and glow alpha is halved so the outer
|
|
74
|
+
* button bloom doesn't read as a bright ring on dark surfaces. */
|
|
75
|
+
declare const ACCENT_PRESETS_DARK: Record<AccentKey, Pick<AccentPalette, "ink" | "soft" | "glow">>;
|
|
76
|
+
/** Built-in font family stacks. */
|
|
77
|
+
declare const FONT_STACKS: Record<FontKey, string>;
|
|
78
|
+
/** Resolve "system" mode against `prefers-color-scheme`. */
|
|
79
|
+
declare function resolveThemeMode(mode: ThemeMode): ResolvedThemeMode;
|
|
80
|
+
/** Fill missing slots of a custom accent via color-mix. */
|
|
81
|
+
declare function normalizeAccentInput(input: AccentKey | CustomAccentInput, resolvedMode: ResolvedThemeMode): {
|
|
82
|
+
key: AccentKey | "custom";
|
|
83
|
+
palette: AccentPalette;
|
|
84
|
+
};
|
|
85
|
+
/** Imperative theme application — writes CSS vars / data-attrs on a target. */
|
|
86
|
+
declare function applyTheme(target: HTMLElement, config: ThemeConfig): void;
|
|
87
|
+
/** Read/write access to the nearest `<ThemeProvider>`. */
|
|
88
|
+
declare function useTheme(): ThemeValue;
|
|
89
|
+
/** Read theme value without throwing — returns `null` outside of a provider. */
|
|
90
|
+
declare function useThemeOptional(): ThemeValue | null;
|
|
91
|
+
interface ThemeProviderProps extends ThemeConfig {
|
|
92
|
+
children?: React.ReactNode;
|
|
93
|
+
/**
|
|
94
|
+
* Where to apply the theme.
|
|
95
|
+
* - `"root"` (default): on `<html>` — affects the whole document.
|
|
96
|
+
* - `"scope"`: on a local wrapper element — scoped to descendants.
|
|
97
|
+
*/
|
|
98
|
+
target?: "root" | "scope";
|
|
99
|
+
/** Tag for scope mode. Default `"div"`. */
|
|
100
|
+
as?: keyof JSX.IntrinsicElements;
|
|
101
|
+
className?: string;
|
|
102
|
+
style?: React.CSSProperties;
|
|
103
|
+
/** If set, theme state is persisted to localStorage under this key. */
|
|
104
|
+
storageKey?: string;
|
|
105
|
+
/** Called whenever the resolved theme value changes. */
|
|
106
|
+
onChange?: (value: ThemeValue) => void;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* `<ThemeProvider>` — manage theme state and apply CSS variables.
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```tsx
|
|
113
|
+
* <ThemeProvider mode="system" accent="violet" storageKey="app:theme">
|
|
114
|
+
* <App />
|
|
115
|
+
* </ThemeProvider>
|
|
116
|
+
* ```
|
|
117
|
+
*
|
|
118
|
+
* @example Custom accent
|
|
119
|
+
* ```tsx
|
|
120
|
+
* <ThemeProvider accent={{ accent: "oklch(70% 0.2 180)" }} />
|
|
121
|
+
* // or just
|
|
122
|
+
* <ThemeProvider accent="oklch(70% 0.2 180)" />
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
declare const ThemeProvider: React.FC<ThemeProviderProps>;
|
|
126
|
+
|
|
127
|
+
export { ACCENT_PRESETS, ACCENT_PRESETS_DARK, type AccentKey, type AccentPalette, type CustomAccentInput, type DensityMode, FONT_STACKS, type FontConfig, type FontKey, type ResolvedThemeMode, type ThemeConfig, type ThemeMode, ThemeProvider, type ThemeProviderProps, type ThemeTokens, type ThemeValue, applyTheme, normalizeAccentInput, resolveThemeMode, useTheme, useThemeOptional };
|
package/dist/Theme.d.ts
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
type ThemeMode = "light" | "dark" | "system";
|
|
4
|
+
type ResolvedThemeMode = "light" | "dark";
|
|
5
|
+
type AccentKey = "sky" | "coral" | "mint" | "violet" | "amber" | "rose";
|
|
6
|
+
type DensityMode = "compact" | "comfortable" | "spacious";
|
|
7
|
+
type FontKey = "system" | "sf" | "serif" | "mono";
|
|
8
|
+
/** Full accent color slots. All four CSS variables the library reads. */
|
|
9
|
+
interface AccentPalette {
|
|
10
|
+
/** Primary accent — `--accent`. */
|
|
11
|
+
accent: string;
|
|
12
|
+
/** Darker text-on-soft variant — `--accent-ink`. */
|
|
13
|
+
ink: string;
|
|
14
|
+
/** Pale tint for backgrounds — `--accent-soft`. */
|
|
15
|
+
soft: string;
|
|
16
|
+
/** Halo / glow color (typically with alpha) — `--accent-glow`. */
|
|
17
|
+
glow: string;
|
|
18
|
+
}
|
|
19
|
+
/** Input type for custom accent: either full palette, or just a base color
|
|
20
|
+
* (missing slots derived via color-mix in CSS). */
|
|
21
|
+
type CustomAccentInput = string | Partial<AccentPalette> & {
|
|
22
|
+
accent: string;
|
|
23
|
+
};
|
|
24
|
+
/** Font config — either a preset key, a single sans string, or a granular object. */
|
|
25
|
+
type FontConfig = FontKey | string | {
|
|
26
|
+
sans?: string;
|
|
27
|
+
display?: string;
|
|
28
|
+
mono?: string;
|
|
29
|
+
};
|
|
30
|
+
/** Arbitrary CSS variable overrides. Keys may be either a short name
|
|
31
|
+
* (e.g. `"bg"` → `--bg`) or a full var name (e.g. `"--bg"`). */
|
|
32
|
+
type ThemeTokens = Record<string, string>;
|
|
33
|
+
interface ThemeConfig {
|
|
34
|
+
mode?: ThemeMode;
|
|
35
|
+
accent?: AccentKey | CustomAccentInput;
|
|
36
|
+
density?: DensityMode;
|
|
37
|
+
/** Shadow strength, 1..10. Maps to `--d` (0.4..1.6). */
|
|
38
|
+
intensity?: number;
|
|
39
|
+
/** Base radius in px — generates the full `--r-*` scale. */
|
|
40
|
+
radius?: number;
|
|
41
|
+
font?: FontConfig;
|
|
42
|
+
tokens?: ThemeTokens;
|
|
43
|
+
}
|
|
44
|
+
interface ThemeValue {
|
|
45
|
+
/** Requested mode ("system" is preserved here). */
|
|
46
|
+
mode: ThemeMode;
|
|
47
|
+
/** Resolved concrete mode ("system" → "light" | "dark" based on OS). */
|
|
48
|
+
resolvedMode: ResolvedThemeMode;
|
|
49
|
+
/** Accent key or "custom" if a palette was supplied. */
|
|
50
|
+
accent: AccentKey | "custom";
|
|
51
|
+
/** Resolved palette currently in effect. */
|
|
52
|
+
accentPalette: AccentPalette;
|
|
53
|
+
density: DensityMode;
|
|
54
|
+
intensity: number;
|
|
55
|
+
radius: number;
|
|
56
|
+
font: FontConfig;
|
|
57
|
+
tokens: ThemeTokens;
|
|
58
|
+
setMode: (m: ThemeMode) => void;
|
|
59
|
+
toggleMode: () => void;
|
|
60
|
+
setAccent: (a: AccentKey | CustomAccentInput) => void;
|
|
61
|
+
setDensity: (d: DensityMode) => void;
|
|
62
|
+
setIntensity: (n: number) => void;
|
|
63
|
+
setRadius: (n: number) => void;
|
|
64
|
+
setFont: (f: FontConfig) => void;
|
|
65
|
+
setTokens: (t: ThemeTokens) => void;
|
|
66
|
+
/** Shallow-merge a partial config. */
|
|
67
|
+
update: (cfg: Partial<ThemeConfig>) => void;
|
|
68
|
+
/** Reset to the initial props. */
|
|
69
|
+
reset: () => void;
|
|
70
|
+
}
|
|
71
|
+
/** Built-in accent palettes (light-mode values). */
|
|
72
|
+
declare const ACCENT_PRESETS: Record<AccentKey, AccentPalette>;
|
|
73
|
+
/** Dark-mode overrides — ink/soft shift, and glow alpha is halved so the outer
|
|
74
|
+
* button bloom doesn't read as a bright ring on dark surfaces. */
|
|
75
|
+
declare const ACCENT_PRESETS_DARK: Record<AccentKey, Pick<AccentPalette, "ink" | "soft" | "glow">>;
|
|
76
|
+
/** Built-in font family stacks. */
|
|
77
|
+
declare const FONT_STACKS: Record<FontKey, string>;
|
|
78
|
+
/** Resolve "system" mode against `prefers-color-scheme`. */
|
|
79
|
+
declare function resolveThemeMode(mode: ThemeMode): ResolvedThemeMode;
|
|
80
|
+
/** Fill missing slots of a custom accent via color-mix. */
|
|
81
|
+
declare function normalizeAccentInput(input: AccentKey | CustomAccentInput, resolvedMode: ResolvedThemeMode): {
|
|
82
|
+
key: AccentKey | "custom";
|
|
83
|
+
palette: AccentPalette;
|
|
84
|
+
};
|
|
85
|
+
/** Imperative theme application — writes CSS vars / data-attrs on a target. */
|
|
86
|
+
declare function applyTheme(target: HTMLElement, config: ThemeConfig): void;
|
|
87
|
+
/** Read/write access to the nearest `<ThemeProvider>`. */
|
|
88
|
+
declare function useTheme(): ThemeValue;
|
|
89
|
+
/** Read theme value without throwing — returns `null` outside of a provider. */
|
|
90
|
+
declare function useThemeOptional(): ThemeValue | null;
|
|
91
|
+
interface ThemeProviderProps extends ThemeConfig {
|
|
92
|
+
children?: React.ReactNode;
|
|
93
|
+
/**
|
|
94
|
+
* Where to apply the theme.
|
|
95
|
+
* - `"root"` (default): on `<html>` — affects the whole document.
|
|
96
|
+
* - `"scope"`: on a local wrapper element — scoped to descendants.
|
|
97
|
+
*/
|
|
98
|
+
target?: "root" | "scope";
|
|
99
|
+
/** Tag for scope mode. Default `"div"`. */
|
|
100
|
+
as?: keyof JSX.IntrinsicElements;
|
|
101
|
+
className?: string;
|
|
102
|
+
style?: React.CSSProperties;
|
|
103
|
+
/** If set, theme state is persisted to localStorage under this key. */
|
|
104
|
+
storageKey?: string;
|
|
105
|
+
/** Called whenever the resolved theme value changes. */
|
|
106
|
+
onChange?: (value: ThemeValue) => void;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* `<ThemeProvider>` — manage theme state and apply CSS variables.
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```tsx
|
|
113
|
+
* <ThemeProvider mode="system" accent="violet" storageKey="app:theme">
|
|
114
|
+
* <App />
|
|
115
|
+
* </ThemeProvider>
|
|
116
|
+
* ```
|
|
117
|
+
*
|
|
118
|
+
* @example Custom accent
|
|
119
|
+
* ```tsx
|
|
120
|
+
* <ThemeProvider accent={{ accent: "oklch(70% 0.2 180)" }} />
|
|
121
|
+
* // or just
|
|
122
|
+
* <ThemeProvider accent="oklch(70% 0.2 180)" />
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
declare const ThemeProvider: React.FC<ThemeProviderProps>;
|
|
126
|
+
|
|
127
|
+
export { ACCENT_PRESETS, ACCENT_PRESETS_DARK, type AccentKey, type AccentPalette, type CustomAccentInput, type DensityMode, FONT_STACKS, type FontConfig, type FontKey, type ResolvedThemeMode, type ThemeConfig, type ThemeMode, ThemeProvider, type ThemeProviderProps, type ThemeTokens, type ThemeValue, applyTheme, normalizeAccentInput, resolveThemeMode, useTheme, useThemeOptional };
|
package/dist/Theme.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"Theme.js"}
|