@zhang_jifan/fanui 2.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.
Files changed (127) hide show
  1. package/ACCESSIBILITY.md +61 -0
  2. package/CHANGELOG.md +112 -0
  3. package/COMMERCIAL-LICENSE.md +71 -0
  4. package/DESIGN-SYSTEM.md +294 -0
  5. package/LICENSE +661 -0
  6. package/README.md +348 -0
  7. package/USAGE.md +1926 -0
  8. package/_index.scss +20 -0
  9. package/dist/fanui.cjs +15 -0
  10. package/dist/fanui.css +28209 -0
  11. package/dist/fanui.d.ts +353 -0
  12. package/dist/fanui.esm.js +71 -0
  13. package/dist/fanui.js +4782 -0
  14. package/dist/fanui.min.css +1 -0
  15. package/dist/fanui.mjs +71 -0
  16. package/dist/modules/fanui-advanced.css +830 -0
  17. package/dist/modules/fanui-advanced.min.css +129 -0
  18. package/dist/modules/fanui-alert.css +575 -0
  19. package/dist/modules/fanui-alert.min.css +122 -0
  20. package/dist/modules/fanui-badge.css +426 -0
  21. package/dist/modules/fanui-badge.min.css +77 -0
  22. package/dist/modules/fanui-base.css +1394 -0
  23. package/dist/modules/fanui-base.min.css +236 -0
  24. package/dist/modules/fanui-blog.css +762 -0
  25. package/dist/modules/fanui-blog.min.css +108 -0
  26. package/dist/modules/fanui-button.css +526 -0
  27. package/dist/modules/fanui-button.min.css +56 -0
  28. package/dist/modules/fanui-card.css +291 -0
  29. package/dist/modules/fanui-card.min.css +52 -0
  30. package/dist/modules/fanui-choice.css +539 -0
  31. package/dist/modules/fanui-choice.min.css +83 -0
  32. package/dist/modules/fanui-dashboard.css +1057 -0
  33. package/dist/modules/fanui-dashboard.min.css +160 -0
  34. package/dist/modules/fanui-data.css +687 -0
  35. package/dist/modules/fanui-data.min.css +125 -0
  36. package/dist/modules/fanui-feedback.css +432 -0
  37. package/dist/modules/fanui-feedback.min.css +79 -0
  38. package/dist/modules/fanui-form.css +779 -0
  39. package/dist/modules/fanui-form.min.css +123 -0
  40. package/dist/modules/fanui-glass.css +497 -0
  41. package/dist/modules/fanui-glass.min.css +46 -0
  42. package/dist/modules/fanui-input-plus.css +799 -0
  43. package/dist/modules/fanui-input-plus.min.css +124 -0
  44. package/dist/modules/fanui-interactive.css +960 -0
  45. package/dist/modules/fanui-interactive.min.css +138 -0
  46. package/dist/modules/fanui-layout.css +4399 -0
  47. package/dist/modules/fanui-layout.min.css +1172 -0
  48. package/dist/modules/fanui-marketing.css +1125 -0
  49. package/dist/modules/fanui-marketing.min.css +144 -0
  50. package/dist/modules/fanui-nav.css +458 -0
  51. package/dist/modules/fanui-nav.min.css +76 -0
  52. package/dist/modules/fanui-overlay.css +547 -0
  53. package/dist/modules/fanui-overlay.min.css +91 -0
  54. package/dist/modules/fanui-table.css +290 -0
  55. package/dist/modules/fanui-table.min.css +62 -0
  56. package/dist/modules/fanui-tabs.css +333 -0
  57. package/dist/modules/fanui-tabs.min.css +58 -0
  58. package/dist/modules/fanui-themes.css +2728 -0
  59. package/dist/modules/fanui-themes.min.css +40 -0
  60. package/dist/modules/fanui-tokens.css +587 -0
  61. package/dist/modules/fanui-tokens.min.css +3 -0
  62. package/dist/modules/fanui-utilities.css +6557 -0
  63. package/dist/modules/fanui-utilities.min.css +1762 -0
  64. package/dist/modules/sizes.json +103 -0
  65. package/docs/MIGRATION-v2.md +179 -0
  66. package/examples/01-script-tag.html +149 -0
  67. package/examples/02-react/README.md +39 -0
  68. package/examples/02-react/index.html +12 -0
  69. package/examples/02-react/package.json +20 -0
  70. package/examples/02-react/src/App.jsx +108 -0
  71. package/examples/02-react/src/main.jsx +13 -0
  72. package/examples/02-react/src/useFanUI.js +87 -0
  73. package/examples/02-react/vite.config.js +6 -0
  74. package/examples/03-vue3/README.md +67 -0
  75. package/examples/03-vue3/index.html +12 -0
  76. package/examples/03-vue3/package.json +19 -0
  77. package/examples/03-vue3/src/App.vue +93 -0
  78. package/examples/03-vue3/src/main.js +8 -0
  79. package/examples/03-vue3/src/useFanUI.js +85 -0
  80. package/examples/03-vue3/vite.config.js +6 -0
  81. package/examples/04-vue2-cdn.html +93 -0
  82. package/examples/README.md +34 -0
  83. package/package.json +127 -0
  84. package/src/_functions.scss +319 -0
  85. package/src/_mixins.scss +1202 -0
  86. package/src/_tokens.scss +180 -0
  87. package/src/_variables.scss +491 -0
  88. package/src/base/_animations.scss +210 -0
  89. package/src/base/_reset.scss +359 -0
  90. package/src/base/_rtl.scss +133 -0
  91. package/src/base/_typography.scss +353 -0
  92. package/src/components/_advanced.scss +763 -0
  93. package/src/components/_alert.scss +322 -0
  94. package/src/components/_badge.scss +279 -0
  95. package/src/components/_blog.scss +693 -0
  96. package/src/components/_button.scss +351 -0
  97. package/src/components/_capabilities.scss +463 -0
  98. package/src/components/_card.scss +281 -0
  99. package/src/components/_choice.scss +444 -0
  100. package/src/components/_dashboard.scss +950 -0
  101. package/src/components/_data.scss +618 -0
  102. package/src/components/_feedback.scss +403 -0
  103. package/src/components/_form.scss +408 -0
  104. package/src/components/_glass.scss +374 -0
  105. package/src/components/_input-plus.scss +730 -0
  106. package/src/components/_interactive.scss +885 -0
  107. package/src/components/_marketing.scss +982 -0
  108. package/src/components/_nav.scss +480 -0
  109. package/src/components/_overlay.scss +517 -0
  110. package/src/components/_table.scss +276 -0
  111. package/src/components/_tabs.scss +338 -0
  112. package/src/fanui.d.ts +353 -0
  113. package/src/fanui.js +4782 -0
  114. package/src/fanui.scss +79 -0
  115. package/src/glass/_switches.scss +36 -0
  116. package/src/glass/_tokens.scss +259 -0
  117. package/src/layout/_container.scss +111 -0
  118. package/src/layout/_flex.scss +164 -0
  119. package/src/layout/_grid.scss +180 -0
  120. package/src/themes/_accents.scss +201 -0
  121. package/src/themes/_palettes.scss +180 -0
  122. package/src/utilities/_borders.scss +104 -0
  123. package/src/utilities/_display.scss +145 -0
  124. package/src/utilities/_effects.scss +210 -0
  125. package/src/utilities/_sizing.scss +123 -0
  126. package/src/utilities/_spacing.scss +118 -0
  127. package/src/utilities/_texture.scss +323 -0
@@ -0,0 +1,76 @@
1
+ @charset "UTF-8";.fanui-navbar{--fanui-navbar-height:56px;--fanui-navbar-bg:var(--fanui-color-surface);--fanui-navbar-border:var(--fanui-color-border);position:relative;display:flex;align-items:center;gap:var(--fanui-space-4);min-height:var(--fanui-navbar-height);padding:0 var(--fanui-container-px,16px);background-color:var(--fanui-navbar-bg);border-bottom:1px solid var(--fanui-navbar-border);box-sizing:border-box;z-index:var(--fanui-z-sticky,1020)}
2
+ .fanui-navbar--sticky{position:sticky;top:0}
3
+ .fanui-navbar--fixed{position:fixed;top:0;right:0;left:0}
4
+ .fanui-navbar--glass{background-color:rgba(255,255,255,0.78);backdrop-filter:blur(14px) saturate(180%);-webkit-backdrop-filter:blur(14px) saturate(180%);border-bottom-color:rgba(15,23,42,0.06)}
5
+ :root[data-fanui-theme=dark] .fanui-navbar--glass{background-color:rgba(15,23,42,0.72);backdrop-filter:blur(14px) saturate(180%);-webkit-backdrop-filter:blur(14px) saturate(180%);border-bottom-color:rgba(255,255,255,0.08)}
6
+ .fanui-navbar--dark{--fanui-navbar-bg:#0f172a;--fanui-navbar-border:rgba(255,255,255,0.08);color:#f1f5f9}
7
+ .fanui-navbar--borderless{border-bottom-color:transparent}
8
+ .fanui-navbar__inner{display:flex;align-items:center;gap:var(--fanui-space-4);width:100%;max-width:var(--fanui-navbar-max-width,none);margin:0 auto}
9
+ .fanui-navbar__brand{display:inline-flex;align-items:center;gap:var(--fanui-space-2);flex:0 0 auto;font-size:var(--fanui-font-size-md);font-weight:700;color:var(--fanui-color-text-strong);text-decoration:none;white-space:nowrap;letter-spacing:-0.01em}
10
+ .fanui-navbar__brand:hover{text-decoration:none}
11
+ .fanui-navbar__brand img,.fanui-navbar__brand svg{height:24px;width:auto}
12
+ .fanui-navbar__menu{display:flex;align-items:center;gap:var(--fanui-space-1);flex:1 1 auto;min-width:0}
13
+ .fanui-navbar__actions{display:flex;align-items:center;gap:var(--fanui-space-2);flex:0 0 auto;margin-inline-start:auto}
14
+ .fanui-navbar__toggle{display:none;flex:0 0 auto}@media (max-width:767.95px){.fanui-navbar__toggle{display:inline-flex}}
15
+ .fanui-navbar__divider{width:1px;height:20px;background-color:var(--fanui-color-border);flex:0 0 auto}@media (max-width:767.95px){.fanui-navbar__menu{display:none}
16
+ .fanui-navbar__menu.is-open{display:flex;position:absolute;top:100%;left:0;right:0;flex-direction:column;align-items:stretch;padding:var(--fanui-space-2);background-color:var(--fanui-color-surface);border-bottom:1px solid var(--fanui-color-border);box-shadow:var(--fanui-shadow-lg)}}
17
+ .fanui-nav{display:flex;align-items:center;gap:var(--fanui-space-1);list-style:none;margin:0;padding:0}
18
+ .fanui-nav--vertical{flex-direction:column;align-items:stretch}
19
+ .fanui-nav--pill{padding:3px;background-color:var(--fanui-color-surface-sunken);border-radius:var(--fanui-radius-md)}
20
+ .fanui-nav--underline{gap:var(--fanui-space-5)}
21
+ .fanui-nav__item{position:relative;display:inline-flex;align-items:center;gap:8px;padding:8px 12px;font-size:var(--fanui-font-size-base);font-weight:500;line-height:1.4;color:var(--fanui-color-text-muted);text-decoration:none;border-radius:var(--fanui-radius-base);cursor:pointer;white-space:nowrap;box-sizing:border-box;transition:color 150ms cubic-bezier(0.4,0,0.2,1) 0s,background-color 150ms cubic-bezier(0.4,0,0.2,1) 0s,border-color 150ms cubic-bezier(0.4,0,0.2,1) 0s}
22
+ .fanui-nav__item:hover{color:var(--fanui-color-text-strong);background-color:var(--fanui-color-hover);text-decoration:none}
23
+ .fanui-nav__item:focus-visible{outline:0;box-shadow:0 0 0 var(--fanui-focus-ring-offset,1px) var(--fanui-color-surface,#fff),0 0 0 calc(var(--fanui-focus-ring-offset,1px) + var(--fanui-focus-ring-width,3px)) var(--fanui-focus-ring-color,rgba(14,116,144,0.3))}@media (forced-colors:active){.fanui-nav__item:focus-visible{outline:2px solid transparent;outline-offset:2px}}
24
+ .fanui-nav__item.is-active,.fanui-nav__item[aria-current=page]{color:var(--fanui-primary);background-color:var(--fanui-primary-soft);font-weight:600}
25
+ .fanui-nav__item.is-disabled,.fanui-nav__item[aria-disabled=true]{color:var(--fanui-color-disabled-text);pointer-events:none;cursor:not-allowed}
26
+ .fanui-nav__item__icon{display:inline-flex;flex:0 0 auto;font-size:1.1em;line-height:1}
27
+ .fanui-nav__item__badge{margin-inline-start:auto}
28
+ .fanui-nav--underline .fanui-nav__item{padding:10px 0;background:none;border-radius:0}
29
+ .fanui-nav--underline .fanui-nav__item:hover{background:none}
30
+ .fanui-nav--underline .fanui-nav__item::after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;background-color:transparent;border-radius:2px;transition:background-color 150ms cubic-bezier(0.4,0,0.2,1) 0s}
31
+ .fanui-nav--underline .fanui-nav__item.is-active::after,.fanui-nav--underline .fanui-nav__item[aria-current=page]::after{background-color:var(--fanui-primary)}
32
+ .fanui-nav--vertical .fanui-nav__item{width:100%;justify-content:flex-start}
33
+ .fanui-nav--pill .fanui-nav__item.is-active{color:var(--fanui-color-text-strong);background-color:var(--fanui-color-surface);box-shadow:var(--fanui-shadow-xs)}
34
+ .fanui-nav__item--sm{padding:5px 9px;font-size:var(--fanui-font-size-sm)}
35
+ .fanui-nav__item--lg{padding:11px 16px;font-size:var(--fanui-font-size-md)}
36
+ .fanui-sidebar{--fanui-sidebar-width:240px;display:flex;flex-direction:column;width:var(--fanui-sidebar-width);flex:0 0 auto;padding:var(--fanui-space-4) var(--fanui-space-3);gap:var(--fanui-space-1);background-color:var(--fanui-color-surface);border-inline-end:1px solid var(--fanui-color-border);box-sizing:border-box;overflow-y:auto;scrollbar-width:thin;scrollbar-color:rgba(100,116,139,0.45) transparent}
37
+ .fanui-sidebar::-webkit-scrollbar{width:8px;height:8px}
38
+ .fanui-sidebar::-webkit-scrollbar-track{background:transparent}
39
+ .fanui-sidebar::-webkit-scrollbar-thumb{background:rgba(100,116,139,0.45);border-radius:9999px}
40
+ .fanui-sidebar::-webkit-scrollbar-thumb:hover{background:rgba(100,116,139,0.7)}
41
+ .fanui-sidebar--end{border-inline-end:0;border-inline-start:1px solid var(--fanui-color-border)}
42
+ .fanui-sidebar--sunken{background-color:var(--fanui-color-surface-sunken)}
43
+ .fanui-sidebar--bordered-none{border:0}
44
+ .fanui-sidebar__section{margin-top:var(--fanui-space-4)}
45
+ .fanui-sidebar__section:first-child{margin-top:0}
46
+ .fanui-sidebar__title{padding:var(--fanui-space-2) var(--fanui-space-3);font-size:var(--fanui-font-size-xs);font-weight:600;letter-spacing:0.06em;text-transform:uppercase;color:var(--fanui-color-text-subtle)}
47
+ .fanui-sidebar__item{display:flex;align-items:center;gap:10px;width:100%;padding:8px 12px;font-size:var(--fanui-font-size-base);color:var(--fanui-color-text-muted);text-decoration:none;border-radius:var(--fanui-radius-base);cursor:pointer;box-sizing:border-box;transition:color 150ms cubic-bezier(0.4,0,0.2,1) 0s,background-color 150ms cubic-bezier(0.4,0,0.2,1) 0s}
48
+ .fanui-sidebar__item:hover{color:var(--fanui-color-text-strong);background-color:var(--fanui-color-hover);text-decoration:none}
49
+ .fanui-sidebar__item.is-active{color:var(--fanui-primary);background-color:var(--fanui-primary-soft);font-weight:600}
50
+ .fanui-sidebar__item__icon{flex:0 0 auto;display:inline-flex;width:18px;justify-content:center}
51
+ .fanui-sidebar__item__text{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
52
+ .fanui-sidebar__item__badge{flex:0 0 auto}
53
+ .fanui-sidebar__item__arrow{flex:0 0 auto;font-size:12px;opacity:0.6;transition:transform 150ms cubic-bezier(0.4,0,0.2,1) 0s}
54
+ .fanui-sidebar__item[aria-expanded=true] .fanui-sidebar__item__arrow{transform:rotate(90deg)}
55
+ .fanui-sidebar__sub{display:flex;flex-direction:column;gap:2px;padding-inline-start:var(--fanui-space-6);margin-top:2px}
56
+ .fanui-sidebar--collapsed{--fanui-sidebar-width:64px}
57
+ .fanui-sidebar--collapsed .fanui-sidebar__item{justify-content:center;padding:10px 0}
58
+ .fanui-sidebar--collapsed .fanui-sidebar__item__text,.fanui-sidebar--collapsed .fanui-sidebar__title,.fanui-sidebar--collapsed .fanui-sidebar__item__badge,.fanui-sidebar--collapsed .fanui-sidebar__item__arrow{display:none}
59
+ .fanui-breadcrumb{display:flex;flex-wrap:wrap;align-items:center;gap:var(--fanui-space-2);list-style:none;margin:0;padding:0;font-size:var(--fanui-font-size-sm);color:var(--fanui-color-text-muted)}
60
+ .fanui-breadcrumb__item{display:inline-flex;align-items:center;gap:var(--fanui-space-2)}
61
+ .fanui-breadcrumb__item a{color:var(--fanui-color-text-muted);text-decoration:none}
62
+ .fanui-breadcrumb__item a:hover{color:var(--fanui-primary);text-decoration:none}
63
+ .fanui-breadcrumb__item + .fanui-breadcrumb__item::before,.fanui-breadcrumb__separator{content:"/";color:var(--fanui-color-text-subtle);user-select:none}
64
+ .fanui-breadcrumb__item.is-active,.fanui-breadcrumb__item[aria-current=page]{color:var(--fanui-color-text-strong);font-weight:500}
65
+ .fanui-breadcrumb--arrow .fanui-breadcrumb__separator{content:"›"}
66
+ .fanui-breadcrumb--chevron .fanui-breadcrumb__item + .fanui-breadcrumb__item::before{content:"›"}
67
+ .fanui-menu{display:flex;flex-direction:column;gap:2px;list-style:none;margin:0;padding:0;min-width:160px}
68
+ .fanui-menu__item{display:flex;align-items:center;gap:10px;padding:7px 12px;font-size:var(--fanui-font-size-base);color:var(--fanui-color-text);text-decoration:none;border-radius:var(--fanui-radius-base);cursor:pointer;transition:background-color 150ms cubic-bezier(0.4,0,0.2,1) 0s,color 150ms cubic-bezier(0.4,0,0.2,1) 0s}
69
+ .fanui-menu__item:hover{background-color:var(--fanui-color-hover);text-decoration:none;color:var(--fanui-color-text-strong)}
70
+ .fanui-menu__item.is-active{color:var(--fanui-primary);background-color:var(--fanui-primary-soft)}
71
+ .fanui-menu__item.is-disabled{color:var(--fanui-color-disabled-text);pointer-events:none}
72
+ .fanui-menu__label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
73
+ .fanui-menu__shortcut{flex:0 0 auto;font-size:var(--fanui-font-size-xs);color:var(--fanui-color-text-subtle);font-family:var(--fanui-font-mono)}
74
+ .fanui-menu__divider{height:1px;margin:5px 2px;background-color:var(--fanui-color-border-subtle)}
75
+ .fanui-menu__group-title{padding:8px 12px 4px;font-size:var(--fanui-font-size-xs);font-weight:600;color:var(--fanui-color-text-subtle);text-transform:uppercase;letter-spacing:0.05em}
76
+ .fanui-menu--horizontal{flex-direction:row;align-items:center}
@@ -0,0 +1,547 @@
1
+ /* fanUI v2.1.0 · module: overlay(独立产物,自带令牌) */
2
+ .fanui-modal {
3
+ position: fixed;
4
+ inset: 0;
5
+ z-index: var(--fanui-z-modal, 1060);
6
+ display: flex;
7
+ align-items: center;
8
+ justify-content: center;
9
+ padding: var(--fanui-space-4);
10
+ opacity: 0;
11
+ visibility: hidden;
12
+ transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s, visibility 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
13
+ overflow-y: auto;
14
+ -webkit-overflow-scrolling: touch;
15
+ }
16
+ .fanui-modal.is-open, .fanui-modal.is-active {
17
+ opacity: 1;
18
+ visibility: visible;
19
+ }
20
+ .fanui-modal.is-open > .fanui-modal__dialog, .fanui-modal.is-active > .fanui-modal__dialog {
21
+ transform: translateY(0) scale(1);
22
+ }
23
+ .fanui-modal__backdrop {
24
+ position: fixed;
25
+ top: 0;
26
+ right: 0;
27
+ bottom: 0;
28
+ left: 0;
29
+ background-color: var(--fanui-backdrop-bg, rgba(15, 23, 42, 0.55));
30
+ backdrop-filter: blur(var(--fanui-backdrop-blur, 2px));
31
+ -webkit-backdrop-filter: blur(var(--fanui-backdrop-blur, 2px));
32
+ z-index: var(--fanui-z-backdrop, 1040);
33
+ z-index: 0;
34
+ }
35
+ .fanui-modal__dialog {
36
+ position: relative;
37
+ z-index: 1;
38
+ display: flex;
39
+ flex-direction: column;
40
+ width: 100%;
41
+ max-width: var(--fanui-modal-width, 520px);
42
+ max-height: calc(100vh - var(--fanui-space-8));
43
+ margin: auto;
44
+ background-color: var(--fanui-color-surface);
45
+ border: 1px solid var(--fanui-color-border);
46
+ border-radius: var(--fanui-radius-xl);
47
+ box-shadow: var(--fanui-shadow-2xl);
48
+ box-sizing: border-box;
49
+ transform: translateY(12px) scale(0.98);
50
+ transition: transform 300ms cubic-bezier(0.34, 1.56, 0.64, 1) 0s;
51
+ overflow: hidden;
52
+ }
53
+ .fanui-modal__header {
54
+ display: flex;
55
+ align-items: flex-start;
56
+ justify-content: space-between;
57
+ gap: var(--fanui-space-4);
58
+ padding: var(--fanui-space-5) var(--fanui-space-5) var(--fanui-space-4);
59
+ flex: 0 0 auto;
60
+ }
61
+ .fanui-modal__title {
62
+ margin: 0;
63
+ font-size: var(--fanui-font-size-lg);
64
+ font-weight: 600;
65
+ line-height: 1.4;
66
+ color: var(--fanui-color-text-strong);
67
+ }
68
+ .fanui-modal__desc {
69
+ margin: 4px 0 0;
70
+ font-size: var(--fanui-font-size-sm);
71
+ color: var(--fanui-color-text-muted);
72
+ }
73
+ .fanui-modal__close {
74
+ flex: 0 0 auto;
75
+ display: inline-flex;
76
+ align-items: center;
77
+ justify-content: center;
78
+ width: 28px;
79
+ height: 28px;
80
+ margin: -4px -6px 0 0;
81
+ padding: 0;
82
+ font-size: 16px;
83
+ line-height: 1;
84
+ color: var(--fanui-color-text-subtle);
85
+ background: none;
86
+ border: 0;
87
+ border-radius: var(--fanui-radius-base);
88
+ cursor: pointer;
89
+ transition: color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
90
+ }
91
+ .fanui-modal__close:hover {
92
+ color: var(--fanui-color-text);
93
+ background-color: var(--fanui-color-hover);
94
+ }
95
+ .fanui-modal__close:focus-visible {
96
+ outline: 0;
97
+ box-shadow: 0 0 0 var(--fanui-focus-ring-offset, 1px) var(--fanui-color-surface, #fff), 0 0 0 calc(var(--fanui-focus-ring-offset, 1px) + var(--fanui-focus-ring-width, 3px)) var(--fanui-focus-ring-color, rgba(14, 116, 144, 0.3));
98
+ }
99
+ @media (forced-colors: active) {
100
+ .fanui-modal__close:focus-visible {
101
+ outline: 2px solid transparent;
102
+ outline-offset: 2px;
103
+ }
104
+ }
105
+ .fanui-modal__body {
106
+ flex: 1 1 auto;
107
+ padding: 0 var(--fanui-space-5) var(--fanui-space-5);
108
+ overflow-y: auto;
109
+ min-height: 0;
110
+ font-size: var(--fanui-font-size-base);
111
+ line-height: var(--fanui-line-height-relaxed);
112
+ color: var(--fanui-color-text);
113
+ scrollbar-width: thin;
114
+ scrollbar-color: rgba(100, 116, 139, 0.45) transparent;
115
+ }
116
+ .fanui-modal__body::-webkit-scrollbar {
117
+ width: 8px;
118
+ height: 8px;
119
+ }
120
+ .fanui-modal__body::-webkit-scrollbar-track {
121
+ background: transparent;
122
+ }
123
+ .fanui-modal__body::-webkit-scrollbar-thumb {
124
+ background: rgba(100, 116, 139, 0.45);
125
+ border-radius: 9999px;
126
+ }
127
+ .fanui-modal__body::-webkit-scrollbar-thumb:hover {
128
+ background: rgba(100, 116, 139, 0.7);
129
+ }
130
+ .fanui-modal__footer {
131
+ display: flex;
132
+ align-items: center;
133
+ justify-content: flex-end;
134
+ gap: var(--fanui-space-3);
135
+ padding: var(--fanui-space-4) var(--fanui-space-5);
136
+ background-color: var(--fanui-color-surface-sunken);
137
+ border-top: 1px solid var(--fanui-color-border);
138
+ flex: 0 0 auto;
139
+ }
140
+ .fanui-modal__footer--start {
141
+ justify-content: flex-start;
142
+ }
143
+ .fanui-modal__footer--between {
144
+ justify-content: space-between;
145
+ }
146
+ .fanui-modal__header--bordered {
147
+ padding-bottom: var(--fanui-space-4);
148
+ border-bottom: 1px solid var(--fanui-color-border);
149
+ }
150
+ .fanui-modal--sm > .fanui-modal__dialog {
151
+ --fanui-modal-width: 380px;
152
+ }
153
+ .fanui-modal--md > .fanui-modal__dialog {
154
+ --fanui-modal-width: 520px;
155
+ }
156
+ .fanui-modal--lg > .fanui-modal__dialog {
157
+ --fanui-modal-width: 720px;
158
+ }
159
+ .fanui-modal--xl > .fanui-modal__dialog {
160
+ --fanui-modal-width: 960px;
161
+ }
162
+ .fanui-modal--full > .fanui-modal__dialog {
163
+ --fanui-modal-width: 100%;
164
+ max-height: 100vh;
165
+ height: 100%;
166
+ border-radius: 0;
167
+ border: 0;
168
+ }
169
+ .fanui-modal--top {
170
+ align-items: flex-start;
171
+ padding-top: var(--fanui-space-16);
172
+ }
173
+ .fanui-modal--bottom {
174
+ align-items: flex-end;
175
+ }
176
+ .fanui-modal--plain > .fanui-modal__dialog {
177
+ border: 0;
178
+ box-shadow: var(--fanui-shadow-2xl);
179
+ }
180
+ .fanui-modal--scrollable > .fanui-modal__dialog {
181
+ overflow: hidden;
182
+ }
183
+
184
+ .fanui-modal-open {
185
+ overflow: hidden;
186
+ }
187
+
188
+ .fanui-drawer {
189
+ position: fixed;
190
+ inset: 0;
191
+ z-index: var(--fanui-z-offcanvas, 1050);
192
+ visibility: hidden;
193
+ transition: visibility 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
194
+ }
195
+ .fanui-drawer.is-open, .fanui-drawer.is-active {
196
+ visibility: visible;
197
+ }
198
+ .fanui-drawer__backdrop {
199
+ position: fixed;
200
+ top: 0;
201
+ right: 0;
202
+ bottom: 0;
203
+ left: 0;
204
+ background-color: var(--fanui-backdrop-bg, rgba(15, 23, 42, 0.55));
205
+ backdrop-filter: blur(var(--fanui-backdrop-blur, 2px));
206
+ -webkit-backdrop-filter: blur(var(--fanui-backdrop-blur, 2px));
207
+ z-index: var(--fanui-z-backdrop, 1040);
208
+ opacity: 0;
209
+ transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
210
+ }
211
+ .fanui-drawer.is-open > .fanui-drawer__backdrop {
212
+ opacity: 1;
213
+ }
214
+ .fanui-drawer__panel {
215
+ position: absolute;
216
+ top: 0;
217
+ bottom: 0;
218
+ display: flex;
219
+ flex-direction: column;
220
+ width: var(--fanui-drawer-width, 360px);
221
+ max-width: 92vw;
222
+ background-color: var(--fanui-color-surface);
223
+ box-shadow: var(--fanui-shadow-2xl);
224
+ box-sizing: border-box;
225
+ transition: transform 300ms cubic-bezier(0, 0, 0.2, 1) 0s;
226
+ z-index: 1;
227
+ }
228
+ .fanui-drawer__header {
229
+ display: flex;
230
+ align-items: center;
231
+ justify-content: space-between;
232
+ gap: var(--fanui-space-3);
233
+ padding: var(--fanui-space-4) var(--fanui-space-5);
234
+ border-bottom: 1px solid var(--fanui-color-border);
235
+ flex: 0 0 auto;
236
+ }
237
+ .fanui-drawer__title {
238
+ margin: 0;
239
+ font-size: var(--fanui-font-size-md);
240
+ font-weight: 600;
241
+ color: var(--fanui-color-text-strong);
242
+ }
243
+ .fanui-drawer__body {
244
+ flex: 1 1 auto;
245
+ padding: var(--fanui-space-5);
246
+ overflow-y: auto;
247
+ min-height: 0;
248
+ scrollbar-width: thin;
249
+ scrollbar-color: rgba(100, 116, 139, 0.45) transparent;
250
+ }
251
+ .fanui-drawer__body::-webkit-scrollbar {
252
+ width: 8px;
253
+ height: 8px;
254
+ }
255
+ .fanui-drawer__body::-webkit-scrollbar-track {
256
+ background: transparent;
257
+ }
258
+ .fanui-drawer__body::-webkit-scrollbar-thumb {
259
+ background: rgba(100, 116, 139, 0.45);
260
+ border-radius: 9999px;
261
+ }
262
+ .fanui-drawer__body::-webkit-scrollbar-thumb:hover {
263
+ background: rgba(100, 116, 139, 0.7);
264
+ }
265
+ .fanui-drawer__footer {
266
+ display: flex;
267
+ align-items: center;
268
+ justify-content: flex-end;
269
+ gap: var(--fanui-space-3);
270
+ padding: var(--fanui-space-4) var(--fanui-space-5);
271
+ border-top: 1px solid var(--fanui-color-border);
272
+ flex: 0 0 auto;
273
+ }
274
+ .fanui-drawer--start .fanui-drawer__panel {
275
+ left: 0;
276
+ right: auto;
277
+ transform: translateX(-100%);
278
+ }
279
+ .fanui-drawer--end .fanui-drawer__panel {
280
+ right: 0;
281
+ left: auto;
282
+ transform: translateX(100%);
283
+ }
284
+ .fanui-drawer--top .fanui-drawer__panel {
285
+ left: 0;
286
+ right: 0;
287
+ top: 0;
288
+ bottom: auto;
289
+ width: 100%;
290
+ max-width: none;
291
+ height: var(--fanui-drawer-height, 320px);
292
+ transform: translateY(-100%);
293
+ border-radius: 0 0 var(--fanui-radius-xl) var(--fanui-radius-xl);
294
+ }
295
+ .fanui-drawer--bottom .fanui-drawer__panel {
296
+ left: 0;
297
+ right: 0;
298
+ bottom: 0;
299
+ top: auto;
300
+ width: 100%;
301
+ max-width: none;
302
+ height: var(--fanui-drawer-height, auto);
303
+ max-height: 88vh;
304
+ transform: translateY(100%);
305
+ border-radius: var(--fanui-radius-xl) var(--fanui-radius-xl) 0 0;
306
+ }
307
+ .fanui-drawer.is-open > .fanui-drawer__panel {
308
+ transform: translate(0, 0);
309
+ }
310
+ .fanui-drawer--sm > .fanui-drawer__panel {
311
+ --fanui-drawer-width: 280px;
312
+ }
313
+ .fanui-drawer--lg > .fanui-drawer__panel {
314
+ --fanui-drawer-width: 480px;
315
+ }
316
+ .fanui-drawer--xl > .fanui-drawer__panel {
317
+ --fanui-drawer-width: 640px;
318
+ }
319
+ .fanui-drawer--full > .fanui-drawer__panel {
320
+ --fanui-drawer-width: 100%;
321
+ max-width: none;
322
+ }
323
+ .fanui-drawer__grabber {
324
+ width: 36px;
325
+ height: 4px;
326
+ margin: var(--fanui-space-2) auto 0;
327
+ border-radius: 9999px;
328
+ background-color: var(--fanui-color-border-strong);
329
+ flex: 0 0 auto;
330
+ }
331
+
332
+ .fanui-dropdown {
333
+ position: relative;
334
+ display: inline-flex;
335
+ }
336
+ .fanui-dropdown__menu {
337
+ position: absolute;
338
+ top: calc(100% + 6px);
339
+ left: 0;
340
+ z-index: var(--fanui-z-dropdown, 1000);
341
+ min-width: var(--fanui-dropdown-width, 180px);
342
+ max-width: 320px;
343
+ padding: 6px;
344
+ background-color: var(--fanui-color-surface);
345
+ border: 1px solid var(--fanui-color-border);
346
+ border-radius: var(--fanui-radius-md);
347
+ box-shadow: var(--fanui-shadow-lg);
348
+ box-sizing: border-box;
349
+ opacity: 0;
350
+ visibility: hidden;
351
+ transform: translateY(-4px) scale(0.98);
352
+ transform-origin: top left;
353
+ transition: opacity 150ms cubic-bezier(0, 0, 0.2, 1) 0s, visibility 150ms cubic-bezier(0, 0, 0.2, 1) 0s, transform 150ms cubic-bezier(0, 0, 0.2, 1) 0s;
354
+ }
355
+ .fanui-dropdown__menu.is-open, .fanui-dropdown__menu.is-active {
356
+ opacity: 1;
357
+ visibility: visible;
358
+ transform: translateY(0) scale(1);
359
+ }
360
+ .fanui-dropdown__menu--end {
361
+ left: auto;
362
+ right: 0;
363
+ transform-origin: top right;
364
+ }
365
+ .fanui-dropdown__menu--start {
366
+ left: 0;
367
+ right: auto;
368
+ }
369
+ .fanui-dropdown__menu--up {
370
+ top: auto;
371
+ bottom: calc(100% + 6px);
372
+ transform-origin: bottom left;
373
+ transform: translateY(4px) scale(0.98);
374
+ }
375
+ .fanui-dropdown__menu--up.fanui-dropdown__menu--end {
376
+ transform-origin: bottom right;
377
+ }
378
+ .fanui-dropdown__menu--flush {
379
+ padding: 0;
380
+ }
381
+ .fanui-dropdown.is-open > .fanui-dropdown__trigger, .fanui-dropdown__trigger[aria-expanded=true] {
382
+ color: var(--fanui-color-text-strong);
383
+ }
384
+
385
+ .fanui-tooltip {
386
+ position: relative;
387
+ display: inline-flex;
388
+ }
389
+ .fanui-tooltip__bubble {
390
+ position: absolute;
391
+ z-index: var(--fanui-z-tooltip, 1080);
392
+ max-width: 260px;
393
+ padding: 6px 10px;
394
+ font-size: var(--fanui-font-size-xs);
395
+ line-height: 1.5;
396
+ white-space: normal;
397
+ text-align: center;
398
+ color: var(--fanui-color-surface);
399
+ background-color: var(--fanui-color-text-strong);
400
+ border-radius: var(--fanui-radius-base);
401
+ box-shadow: var(--fanui-shadow-md);
402
+ opacity: 0;
403
+ visibility: hidden;
404
+ pointer-events: none;
405
+ transition: opacity 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, visibility 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
406
+ }
407
+ .fanui-tooltip__bubble::after {
408
+ content: "";
409
+ position: absolute;
410
+ width: 6px;
411
+ height: 6px;
412
+ background-color: inherit;
413
+ transform: rotate(45deg);
414
+ }
415
+ .fanui-tooltip__bubble {
416
+ bottom: calc(100% + 8px);
417
+ left: 50%;
418
+ transform: translateX(-50%) translateY(4px);
419
+ }
420
+ .fanui-tooltip__bubble::after {
421
+ top: 100%;
422
+ left: 50%;
423
+ margin: -3px 0 0 -3px;
424
+ }
425
+ .fanui-tooltip:hover > .fanui-tooltip__bubble, .fanui-tooltip:focus-within > .fanui-tooltip__bubble,
426
+ .fanui-tooltip > .fanui-tooltip__bubble.is-open {
427
+ opacity: 1;
428
+ visibility: visible;
429
+ }
430
+ .fanui-tooltip:hover > .fanui-tooltip__bubble {
431
+ transform: translateX(-50%) translateY(0);
432
+ }
433
+ .fanui-tooltip--bottom:hover > .fanui-tooltip__bubble, .fanui-tooltip--bottom:focus-within > .fanui-tooltip__bubble {
434
+ transform: translateX(-50%) translateY(0);
435
+ }
436
+ .fanui-tooltip--right:hover > .fanui-tooltip__bubble, .fanui-tooltip--right:focus-within > .fanui-tooltip__bubble, .fanui-tooltip--left:hover > .fanui-tooltip__bubble, .fanui-tooltip--left:focus-within > .fanui-tooltip__bubble {
437
+ transform: translateY(-50%) translateX(0);
438
+ }
439
+ .fanui-tooltip--bottom > .fanui-tooltip__bubble {
440
+ bottom: auto;
441
+ top: calc(100% + 8px);
442
+ transform: translateX(-50%) translateY(-4px);
443
+ }
444
+ .fanui-tooltip--bottom > .fanui-tooltip__bubble::after {
445
+ top: auto;
446
+ bottom: 100%;
447
+ margin: 0 0 -3px -3px;
448
+ }
449
+ .fanui-tooltip--right > .fanui-tooltip__bubble {
450
+ bottom: auto;
451
+ top: 50%;
452
+ left: calc(100% + 8px);
453
+ transform: translateY(-50%) translateX(-4px);
454
+ }
455
+ .fanui-tooltip--right > .fanui-tooltip__bubble::after {
456
+ top: 50%;
457
+ left: 0;
458
+ margin: -3px 0 0 -3px;
459
+ }
460
+ .fanui-tooltip--left > .fanui-tooltip__bubble {
461
+ bottom: auto;
462
+ top: 50%;
463
+ left: auto;
464
+ right: calc(100% + 8px);
465
+ transform: translateY(-50%) translateX(4px);
466
+ }
467
+ .fanui-tooltip--left > .fanui-tooltip__bubble::after {
468
+ top: 50%;
469
+ left: 100%;
470
+ margin: -3px 0 0 -3px;
471
+ }
472
+ .fanui-tooltip--light > .fanui-tooltip__bubble {
473
+ color: var(--fanui-color-text);
474
+ background-color: var(--fanui-color-surface);
475
+ border: 1px solid var(--fanui-color-border-strong);
476
+ }
477
+ .fanui-tooltip--primary > .fanui-tooltip__bubble {
478
+ background-color: var(--fanui-primary);
479
+ color: var(--fanui-primary-fg);
480
+ }
481
+ .fanui-tooltip--danger > .fanui-tooltip__bubble {
482
+ background-color: var(--fanui-danger);
483
+ color: var(--fanui-danger-fg);
484
+ }
485
+ .fanui-tooltip--success > .fanui-tooltip__bubble {
486
+ background-color: var(--fanui-success);
487
+ color: var(--fanui-success-fg);
488
+ }
489
+
490
+ .fanui-popover {
491
+ position: relative;
492
+ display: inline-flex;
493
+ }
494
+ .fanui-popover__panel {
495
+ position: absolute;
496
+ top: calc(100% + 8px);
497
+ left: 0;
498
+ z-index: var(--fanui-z-popover, 1070);
499
+ width: var(--fanui-popover-width, 280px);
500
+ background-color: var(--fanui-color-surface);
501
+ border: 1px solid var(--fanui-color-border);
502
+ border-radius: var(--fanui-radius-md);
503
+ box-shadow: var(--fanui-shadow-xl);
504
+ opacity: 0;
505
+ visibility: hidden;
506
+ transform: translateY(-4px);
507
+ transition: opacity 150ms cubic-bezier(0, 0, 0.2, 1) 0s, visibility 150ms cubic-bezier(0, 0, 0.2, 1) 0s, transform 150ms cubic-bezier(0, 0, 0.2, 1) 0s;
508
+ }
509
+ .fanui-popover__panel.is-open, .fanui-popover__panel.is-active {
510
+ opacity: 1;
511
+ visibility: visible;
512
+ transform: translateY(0);
513
+ }
514
+ .fanui-popover__panel--end {
515
+ left: auto;
516
+ right: 0;
517
+ }
518
+ .fanui-popover__panel--center {
519
+ left: 50%;
520
+ transform: translateX(-50%) translateY(-4px);
521
+ }
522
+ .fanui-popover__panel--center.is-open {
523
+ transform: translateX(-50%) translateY(0);
524
+ }
525
+ .fanui-popover__panel--wide {
526
+ --fanui-popover-width: 420px;
527
+ }
528
+ .fanui-popover__header {
529
+ padding: var(--fanui-space-3) var(--fanui-space-4);
530
+ font-size: var(--fanui-font-size-base);
531
+ font-weight: 600;
532
+ color: var(--fanui-color-text-strong);
533
+ border-bottom: 1px solid var(--fanui-color-border-subtle);
534
+ }
535
+ .fanui-popover__body {
536
+ padding: var(--fanui-space-4);
537
+ font-size: var(--fanui-font-size-sm);
538
+ line-height: 1.6;
539
+ color: var(--fanui-color-text-muted);
540
+ }
541
+ .fanui-popover__footer {
542
+ padding: var(--fanui-space-3) var(--fanui-space-4);
543
+ border-top: 1px solid var(--fanui-color-border-subtle);
544
+ display: flex;
545
+ justify-content: flex-end;
546
+ gap: var(--fanui-space-2);
547
+ }