@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,236 @@
1
+ @charset "UTF-8";*,*::before,*::after{box-sizing:border-box}
2
+ html{-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);scroll-behavior:smooth;font-size:100%;line-height:1;tab-size:4;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei","Helvetica Neue",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";text-rendering:optimizeLegibility}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}
3
+ body{margin:0;min-height:100vh;font-family:var(--fanui-font-base,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji);font-size:var(--fanui-font-size-base,14px);font-weight:400;line-height:var(--fanui-line-height-base,1.5715);color:var(--fanui-color-text);background-color:var(--fanui-color-bg);transition:color 300ms cubic-bezier(0.4,0,0.2,1) 0s,background-color 300ms cubic-bezier(0.4,0,0.2,1) 0s;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
4
+ main,article,aside,figure,footer,header,hgroup,nav,section,details,summary,figcaption{display:block}
5
+ h1,h2,h3,h4,h5,h6,p,figure,blockquote,dl,dd,ol,ul,pre{margin:0}
6
+ ol[class],ul[class],li[class]{list-style:none;padding:0}
7
+ a{color:var(--fanui-primary);text-decoration:none;background-color:transparent;transition:color 150ms cubic-bezier(0.4,0,0.2,1) 0s}
8
+ a:hover{color:var(--fanui-primary-hover);text-decoration:underline}
9
+ a:active{color:var(--fanui-primary-active)}
10
+ a: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){a:focus-visible{outline:2px solid transparent;outline-offset:2px}}
11
+ a:focus-visible{border-radius:2px}
12
+ b,strong{font-weight:700}
13
+ small{font-size:0.875em}
14
+ sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}
15
+ sub{bottom:-0.25em}
16
+ sup{top:-0.5em}
17
+ img,picture,video,canvas,svg{display:block;max-width:100%}
18
+ img,video{height:auto;border-style:none}
19
+ svg{overflow:hidden;vertical-align:middle}
20
+ button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:100%;line-height:inherit;color:inherit}
21
+ button,[type=button],[type=reset],[type=submit],[role=button]{-webkit-appearance:button;cursor:pointer;text-transform:none;background-color:transparent;background-image:none;border:0;padding:0}
22
+ ::-moz-focus-inner{padding:0;border-style:none}
23
+ :-moz-ui-invalid{box-shadow:none}
24
+ fieldset{min-width:0;padding:0;margin:0;border:0}
25
+ legend{padding:0;display:table;max-width:100%;white-space:normal;color:inherit}
26
+ progress{vertical-align:baseline}
27
+ textarea{resize:vertical;overflow:auto}
28
+ [type=search]{outline-offset:-2px;-webkit-appearance:textfield;appearance:textfield}
29
+ [type=search]::-webkit-search-decoration{-webkit-appearance:none}
30
+ ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}
31
+ [type=number]::-webkit-outer-spin-button,[type=number]::-webkit-inner-spin-button{height:auto;-webkit-appearance:none;margin:0}
32
+ [type=number]{-moz-appearance:textfield}
33
+ [hidden],template{display:none !important}
34
+ iframe{border:0;display:block}
35
+ hr{box-sizing:content-box;height:0;overflow:visible;margin:1em 0;border:0;border-top:var(--fanui-border-width,1px) solid var(--fanui-color-border);opacity:1;color:inherit}
36
+ abbr[title]{text-decoration:underline dotted;cursor:help}
37
+ code,kbd,samp,pre{font-family:var(--fanui-font-mono,ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,Courier New,monospace);font-size:1em}
38
+ pre{overflow:auto;-webkit-overflow-scrolling:touch}
39
+ summary{display:list-item;cursor:pointer}
40
+ details>summary::-webkit-details-marker{display:none}
41
+ table{border-collapse:collapse;border-spacing:0;text-indent:0}
42
+ th{text-align:inherit;text-align:-webkit-match-parent}
43
+ html{scrollbar-width:thin;scrollbar-color:rgba(100,116,139,0.45) transparent}
44
+ html::-webkit-scrollbar{width:8px;height:8px}
45
+ html::-webkit-scrollbar-track{background:transparent}
46
+ html::-webkit-scrollbar-thumb{background:rgba(100,116,139,0.45);border-radius:9999px}
47
+ html::-webkit-scrollbar-thumb:hover{background:rgba(100,116,139,0.7)}
48
+ ::selection{background-color:var(--fanui-primary-soft);color:var(--fanui-primary-active)}
49
+ .fanui-skip-link{position:fixed;top:-100%;left:var(--fanui-space-4);z-index:calc(var(--fanui-z-toast) + 1);padding:10px 18px;border-radius:var(--fanui-radius-md);background-color:var(--fanui-primary);color:var(--fanui-primary-fg);font-size:var(--fanui-font-size-sm);font-weight:var(--fanui-font-weight-semibold);text-decoration:none;box-shadow:var(--fanui-shadow-lg);transition:top 150ms cubic-bezier(0.4,0,0.2,1) 0s}
50
+ .fanui-skip-link:focus{top:var(--fanui-space-3);outline:3px solid var(--fanui-primary-ring);outline-offset:2px}
51
+ .fanui-visually-hidden,.fanui-sr-only{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0,0,0,0) !important;white-space:nowrap !important;border:0 !important}
52
+ .fanui-sr-only-focusable{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0,0,0,0) !important;white-space:nowrap !important;border:0 !important}
53
+ .fanui-sr-only-focusable:active,.fanui-sr-only-focusable:focus{position:static !important;width:auto !important;height:auto !important;margin:0 !important;overflow:visible !important;clip:auto !important;white-space:normal !important}
54
+ .fanui-no-scrollbar{scrollbar-width:none;-ms-overflow-style:none}
55
+ .fanui-no-scrollbar::-webkit-scrollbar{display:none;width:0;height:0}
56
+ :focus-visible{outline:2px solid var(--fanui-primary-ring);outline-offset:1px}@media (forced-colors:active){:focus-visible{outline:2px solid transparent}}
57
+ .fanui-font-sans{font-family:var(--fanui-font-sans)}
58
+ .fanui-font-serif{font-family:var(--fanui-font-serif)}
59
+ .fanui-font-mono{font-family:var(--fanui-font-mono)}
60
+ h1,h2,h3,h4,h5,h6,.fanui-h1,.fanui-h2,.fanui-h3,.fanui-h4,.fanui-h5,.fanui-h6{margin-top:0;margin-bottom:var(--fanui-heading-margin-bottom,0.5em);font-weight:600;line-height:1.25;color:var(--fanui-color-text-strong);text-wrap:balance}
61
+ h1,.fanui-h1{font-size:var(--fanui-font-size-3xl);letter-spacing:-0.02em}
62
+ h2,.fanui-h2{font-size:var(--fanui-font-size-2xl);letter-spacing:-0.015em}
63
+ h3,.fanui-h3{font-size:var(--fanui-font-size-xl)}
64
+ h4,.fanui-h4{font-size:var(--fanui-font-size-lg)}
65
+ h5,.fanui-h5{font-size:var(--fanui-font-size-md)}
66
+ h6,.fanui-h6{font-size:var(--fanui-font-size-base)}
67
+ .fanui-display-1{font-size:var(--fanui-font-size-6xl);font-weight:800;line-height:1.1;letter-spacing:-0.025em}
68
+ .fanui-display-2{font-size:var(--fanui-font-size-5xl);font-weight:800;line-height:1.15;letter-spacing:-0.02em}
69
+ .fanui-display-3{font-size:var(--fanui-font-size-4xl);font-weight:700;line-height:1.2;letter-spacing:-0.02em}
70
+ p{margin-top:0;margin-bottom:var(--fanui-paragraph-margin-bottom,1em)}
71
+ .fanui-lead{font-size:var(--fanui-font-size-md);line-height:var(--fanui-line-height-relaxed);color:var(--fanui-color-text-muted)}
72
+ .fanui-text-muted{color:var(--fanui-color-text-muted)}
73
+ .fanui-text-subtle{color:var(--fanui-color-text-subtle)}
74
+ .fanui-text-strong{color:var(--fanui-color-text-strong);font-weight:600}
75
+ .fanui-text-inverse{color:var(--fanui-color-text-inverse)}
76
+ .fanui-text-primary{color:var(--fanui-primary)}
77
+ .fanui-text-accent{color:var(--fanui-accent)}
78
+ .fanui-text-success{color:var(--fanui-success)}
79
+ .fanui-text-warning{color:var(--fanui-warning)}
80
+ .fanui-text-danger{color:var(--fanui-danger)}
81
+ .fanui-text-info{color:var(--fanui-info)}
82
+ .fanui-text-gradient{background-image:linear-gradient(to right,var(--fanui-primary),var(--fanui-accent));-webkit-background-clip:text;background-clip:text;color:transparent;-webkit-text-fill-color:transparent}
83
+ .fanui-fs-xs{font-size:var(--fanui-font-size-xs)}
84
+ .fanui-fs-sm{font-size:var(--fanui-font-size-sm)}
85
+ .fanui-fs-base{font-size:var(--fanui-font-size-base)}
86
+ .fanui-fs-md{font-size:var(--fanui-font-size-md)}
87
+ .fanui-fs-lg{font-size:var(--fanui-font-size-lg)}
88
+ .fanui-fs-xl{font-size:var(--fanui-font-size-xl)}
89
+ .fanui-fs-2xl{font-size:var(--fanui-font-size-2xl)}
90
+ .fanui-fs-3xl{font-size:var(--fanui-font-size-3xl)}
91
+ .fanui-fs-4xl{font-size:var(--fanui-font-size-4xl)}
92
+ .fanui-fs-5xl{font-size:var(--fanui-font-size-5xl)}
93
+ .fanui-fs-6xl{font-size:var(--fanui-font-size-6xl)}
94
+ .fanui-fs-lead-lg::first-letter{font-size:var(--fanui-font-size-5xl);font-weight:700;float:left;line-height:1;margin-inline-end:8px}
95
+ .fanui-lh-none{line-height:1}
96
+ .fanui-lh-tight{line-height:1.25}
97
+ .fanui-lh-snug{line-height:1.375}
98
+ .fanui-lh-normal{line-height:1.5}
99
+ .fanui-lh-base{line-height:1.5715}
100
+ .fanui-lh-relaxed{line-height:1.625}
101
+ .fanui-lh-loose{line-height:2}
102
+ .fanui-fw-light{font-weight:300}
103
+ .fanui-fw-normal{font-weight:400}
104
+ .fanui-fw-medium{font-weight:500}
105
+ .fanui-fw-semibold{font-weight:600}
106
+ .fanui-fw-bold{font-weight:700}
107
+ .fanui-fw-extrabold{font-weight:800}
108
+ .fanui-tracking-tighter{letter-spacing:-0.05em}
109
+ .fanui-tracking-tight{letter-spacing:-0.025em}
110
+ .fanui-tracking-normal{letter-spacing:0}
111
+ .fanui-tracking-wide{letter-spacing:0.025em}
112
+ .fanui-tracking-wider{letter-spacing:0.05em}
113
+ .fanui-tracking-widest{letter-spacing:0.1em}
114
+ .fanui-italic{font-style:italic}
115
+ .fanui-not-italic{font-style:normal}
116
+ .fanui-uppercase{text-transform:uppercase}
117
+ .fanui-lowercase{text-transform:lowercase}
118
+ .fanui-capitalize{text-transform:capitalize}
119
+ .fanui-underline{text-decoration:underline}
120
+ .fanui-line-through{text-decoration:line-through}
121
+ .fanui-no-underline{text-decoration:none}
122
+ .fanui-text-start{text-align:start}
123
+ .fanui-text-center{text-align:center}
124
+ .fanui-text-end{text-align:end}
125
+ .fanui-text-justify{text-align:justify}
126
+ .fanui-text-wrap{white-space:normal}
127
+ .fanui-text-nowrap{white-space:nowrap}
128
+ .fanui-text-pre{white-space:pre}
129
+ .fanui-text-pre-wrap{white-space:pre-wrap}
130
+ .fanui-text-break{word-break:break-word;overflow-wrap:anywhere}
131
+ .fanui-text-balance{text-wrap:balance}
132
+ .fanui-text-pretty{text-wrap:pretty}
133
+ .fanui-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
134
+ .fanui-truncate-2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}
135
+ .fanui-truncate-3{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}
136
+ .fanui-truncate-4{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}
137
+ .fanui-list{padding-inline-start:1.25rem;margin-bottom:1em}
138
+ .fanui-list li{margin-bottom:0.25em}
139
+ .fanui-list-unstyled{list-style:none;padding-inline-start:0;margin-inline-start:0}
140
+ .fanui-list-inline{display:flex;flex-wrap:wrap;gap:var(--fanui-space-4);list-style:none;padding-inline-start:0}
141
+ .fanui-list-dashed{list-style:none;padding-inline-start:0}
142
+ .fanui-list-dashed>li{position:relative;padding-inline-start:1.25em}
143
+ .fanui-list-dashed>li::before{content:"";position:absolute;left:0.25em;top:0.65em;width:0.35em;height:0.35em;border-radius:50%;background-color:var(--fanui-primary)}
144
+ .fanui-blockquote{margin:0 0 1em;padding:var(--fanui-space-4) var(--fanui-space-5);border-inline-start:4px solid var(--fanui-primary);background-color:var(--fanui-color-surface-sunken);border-radius:0 var(--fanui-radius-base) var(--fanui-radius-base) 0;color:var(--fanui-color-text-muted)}
145
+ .fanui-blockquote footer{margin-top:var(--fanui-space-2);font-size:var(--fanui-font-size-sm);color:var(--fanui-color-text-subtle)}
146
+ .fanui-blockquote footer::before{content:"— "}
147
+ .fanui-code,.fanui-prose code{padding:0.15em 0.4em;font-family:var(--fanui-font-mono);font-size:0.875em;color:var(--fanui-danger);background-color:var(--fanui-color-surface-sunken);border:1px solid var(--fanui-color-border-subtle);border-radius:var(--fanui-radius-sm);white-space:nowrap}
148
+ .fanui-pre,.fanui-prose pre{display:block;margin:0 0 1em;padding:var(--fanui-space-4);font-family:var(--fanui-font-mono);font-size:var(--fanui-font-size-sm);line-height:var(--fanui-line-height-relaxed);color:var(--fanui-color-text);background-color:var(--fanui-color-surface-sunken);border:1px solid var(--fanui-color-border);border-radius:var(--fanui-radius-md);overflow-x:auto;tab-size:2}
149
+ .fanui-pre code,.fanui-prose pre code{padding:0;background:none;border:0;color:inherit;font-size:inherit;white-space:pre}
150
+ .fanui-kbd{display:inline-block;min-width:1.6em;padding:0.1em 0.4em;font-family:var(--fanui-font-mono);font-size:0.8125em;line-height:1.4;text-align:center;color:var(--fanui-color-text);background-color:var(--fanui-color-surface);border:1px solid var(--fanui-color-border-strong);border-bottom-width:2px;border-radius:var(--fanui-radius-sm);box-shadow:var(--fanui-shadow-xs)}
151
+ .fanui-mark{padding:0.1em 0.2em;background-color:rgba(245,158,11,0.28);color:inherit;border-radius:var(--fanui-radius-sm)}
152
+ .fanui-link{color:var(--fanui-primary);text-decoration:none;border-bottom:1px solid var(--fanui-primary-border);transition:color 150ms cubic-bezier(0.4,0,0.2,1) 0s,border-color 150ms cubic-bezier(0.4,0,0.2,1) 0s}
153
+ .fanui-link:hover{color:var(--fanui-primary-hover);border-bottom-color:var(--fanui-primary-hover);text-decoration:none}
154
+ .fanui-link--subtle{color:var(--fanui-color-text-muted);border-bottom-color:var(--fanui-color-border)}
155
+ .fanui-link--subtle:hover{color:var(--fanui-color-text);border-bottom-color:var(--fanui-color-border-strong)}
156
+ .fanui-anchor{position:relative;scroll-margin-top:var(--fanui-space-8)}
157
+ .fanui-anchor>.fanui-anchor__link{position:absolute;left:-1.25em;padding-inline-end:0.25em;color:var(--fanui-color-text-subtle);opacity:0;transition:opacity 150ms cubic-bezier(0.4,0,0.2,1) 0s}
158
+ .fanui-anchor>.fanui-anchor__link::before{content:"#"}
159
+ .fanui-anchor:hover>.fanui-anchor__link{opacity:1}
160
+ .fanui-prose{font-size:var(--fanui-font-size-md);line-height:var(--fanui-line-height-relaxed);color:var(--fanui-color-text);max-width:72ch}
161
+ .fanui-prose>* + *{margin-top:1em}
162
+ .fanui-prose>h2{margin-top:2em}
163
+ .fanui-prose>h3{margin-top:1.5em}
164
+ .fanui-prose>h2 + *,.fanui-prose>h3 + *{margin-top:0.5em}
165
+ .fanui-prose ul,.fanui-prose ol{padding-inline-start:1.4em}
166
+ .fanui-prose li + li{margin-top:0.35em}
167
+ .fanui-prose li>ul,.fanui-prose li>ol{margin-top:0.35em}
168
+ .fanui-prose img{border-radius:var(--fanui-radius-md);margin:1.5em 0}
169
+ .fanui-prose hr{margin:2.5em 0}
170
+ .fanui-prose table{width:100%;border-collapse:collapse;font-size:var(--fanui-font-size-base);margin:1.5em 0}
171
+ .fanui-prose table th,.fanui-prose table td{padding:8px 12px;text-align:start;border:1px solid var(--fanui-color-border)}
172
+ .fanui-prose table th{background-color:var(--fanui-color-surface-sunken);font-weight:600}@keyframes fanui-fade-in{from{opacity:0}
173
+ to{opacity:1}}@keyframes fanui-fade-out{from{opacity:1}
174
+ to{opacity:0}}@keyframes fanui-slide-in-up{from{opacity:0;transform:translateY(12px)}
175
+ to{opacity:1;transform:translateY(0)}}@keyframes fanui-slide-in-down{from{opacity:0;transform:translateY(-12px)}
176
+ to{opacity:1;transform:translateY(0)}}@keyframes fanui-slide-in-start{from{opacity:0;transform:translateX(-16px)}
177
+ to{opacity:1;transform:translateX(0)}}@keyframes fanui-slide-in-end{from{opacity:0;transform:translateX(16px)}
178
+ to{opacity:1;transform:translateX(0)}}@keyframes fanui-zoom-in{from{opacity:0;transform:scale(0.94)}
179
+ to{opacity:1;transform:scale(1)}}@keyframes fanui-zoom-out{from{opacity:1;transform:scale(1)}
180
+ to{opacity:0;transform:scale(0.94)}}@keyframes fanui-pop-in{from{opacity:0;transform:scale(0.86) translateY(8px)}
181
+ 60%{opacity:1;transform:scale(1.02) translateY(0)}
182
+ to{opacity:1;transform:scale(1) translateY(0)}}@keyframes fanui-spin{to{transform:rotate(360deg)}}@keyframes fanui-pulse{0%,100%{opacity:1}
183
+ 50%{opacity:0.45}}@keyframes fanui-bounce{0%,100%{transform:translateY(0)}
184
+ 50%{transform:translateY(-6px)}}@keyframes fanui-shake{0%,100%{transform:translateX(0)}
185
+ 20%{transform:translateX(-6px)}
186
+ 40%{transform:translateX(6px)}
187
+ 60%{transform:translateX(-4px)}
188
+ 80%{transform:translateX(4px)}}@keyframes fanui-progress-stripes{from{background-position:1rem 0}
189
+ to{background-position:0 0}}@keyframes fanui-progress-indeterminate{0%{left:-35%;width:35%}
190
+ 60%{left:100%;width:60%}
191
+ 100%{left:100%;width:60%}}@keyframes fanui-skeleton-shimmer{from{background-position:200% 0}
192
+ to{background-position:-200% 0}}@keyframes fanui-toast-in{from{opacity:0;transform:translateY(-8px) scale(0.98)}
193
+ to{opacity:1;transform:translateY(0) scale(1)}}@keyframes fanui-ripple{from{transform:scale(0);opacity:0.45}
194
+ to{transform:scale(2.6);opacity:0}}@keyframes fanui-blink{0%,100%{opacity:1}
195
+ 50%{opacity:0}}
196
+ .fanui-animate-fade-in{animation-name:fanui-fade-in;animation-duration:200ms;animation-timing-function:cubic-bezier(0,0,0.2,1);animation-fill-mode:both;animation-iteration-count:1}
197
+ .fanui-animate-fade-out{animation-name:fanui-fade-out;animation-duration:200ms;animation-timing-function:cubic-bezier(0.4,0,1,1);animation-fill-mode:both;animation-iteration-count:1}
198
+ .fanui-animate-slide-in-up{animation-name:fanui-slide-in-up;animation-duration:300ms;animation-timing-function:cubic-bezier(0,0,0.2,1);animation-fill-mode:both;animation-iteration-count:1}
199
+ .fanui-animate-slide-in-down{animation-name:fanui-slide-in-down;animation-duration:300ms;animation-timing-function:cubic-bezier(0,0,0.2,1);animation-fill-mode:both;animation-iteration-count:1}
200
+ .fanui-animate-slide-in-start{animation-name:fanui-slide-in-start;animation-duration:300ms;animation-timing-function:cubic-bezier(0,0,0.2,1);animation-fill-mode:both;animation-iteration-count:1}
201
+ .fanui-animate-slide-in-end{animation-name:fanui-slide-in-end;animation-duration:300ms;animation-timing-function:cubic-bezier(0,0,0.2,1);animation-fill-mode:both;animation-iteration-count:1}
202
+ .fanui-animate-zoom-in{animation-name:fanui-zoom-in;animation-duration:200ms;animation-timing-function:cubic-bezier(0,0,0.2,1);animation-fill-mode:both;animation-iteration-count:1}
203
+ .fanui-animate-zoom-out{animation-name:fanui-zoom-out;animation-duration:200ms;animation-timing-function:cubic-bezier(0.4,0,1,1);animation-fill-mode:both;animation-iteration-count:1}
204
+ .fanui-animate-pop-in{animation-name:fanui-pop-in;animation-duration:300ms;animation-timing-function:cubic-bezier(0.34,1.56,0.64,1);animation-fill-mode:both;animation-iteration-count:1}
205
+ .fanui-animate-spin{animation-name:fanui-spin;animation-duration:900ms;animation-timing-function:linear;animation-fill-mode:infinite;animation-iteration-count:1}
206
+ .fanui-animate-pulse{animation-name:fanui-pulse;animation-duration:1.6s;animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-fill-mode:infinite;animation-iteration-count:1}
207
+ .fanui-animate-bounce{animation-name:fanui-bounce;animation-duration:1s;animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-fill-mode:infinite;animation-iteration-count:1}
208
+ .fanui-animate-shake{animation-name:fanui-shake;animation-duration:420ms;animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-fill-mode:both;animation-iteration-count:1}
209
+ .fanui-animate-blink{animation-name:fanui-blink;animation-duration:1s;animation-timing-function:step-end;animation-fill-mode:infinite;animation-iteration-count:1}
210
+ .fanui-animate-spin,.fanui-animate-pulse,.fanui-animate-bounce,.fanui-animate-blink{animation-iteration-count:infinite}
211
+ .fanui-animate-infinite{animation-iteration-count:infinite}
212
+ .fanui-animate-once{animation-iteration-count:1}
213
+ .fanui-duration-instant{animation-duration:100ms;transition-duration:100ms}
214
+ .fanui-duration-fast{animation-duration:150ms;transition-duration:150ms}
215
+ .fanui-duration-base{animation-duration:200ms;transition-duration:200ms}
216
+ .fanui-duration-slow{animation-duration:300ms;transition-duration:300ms}
217
+ .fanui-duration-slower{animation-duration:500ms;transition-duration:500ms}
218
+ .fanui-ease-linear{animation-timing-function:linear;transition-timing-function:linear}
219
+ .fanui-ease-in{animation-timing-function:cubic-bezier(0.4,0,1,1);transition-timing-function:cubic-bezier(0.4,0,1,1)}
220
+ .fanui-ease-out{animation-timing-function:cubic-bezier(0,0,0.2,1);transition-timing-function:cubic-bezier(0,0,0.2,1)}
221
+ .fanui-ease-in-out{animation-timing-function:cubic-bezier(0.4,0,0.2,1);transition-timing-function:cubic-bezier(0.4,0,0.2,1)}
222
+ .fanui-ease-spring{animation-timing-function:cubic-bezier(0.34,1.56,0.64,1);transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)}
223
+ .fanui-delay-75{animation-delay:75ms}
224
+ .fanui-delay-150{animation-delay:150ms}
225
+ .fanui-delay-300{animation-delay:300ms}
226
+ .fanui-delay-500{animation-delay:500ms}
227
+ .fanui-paused{animation-play-state:paused}
228
+ .fanui-running{animation-play-state:running}
229
+ .fanui-transition-all{transition:all 200ms cubic-bezier(0.4,0,0.2,1) 0s}
230
+ .fanui-transition-color{transition:color 200ms cubic-bezier(0.4,0,0.2,1) 0s}
231
+ .fanui-transition-background-color{transition:background-color 200ms cubic-bezier(0.4,0,0.2,1) 0s}
232
+ .fanui-transition-border-color{transition:border-color 200ms cubic-bezier(0.4,0,0.2,1) 0s}
233
+ .fanui-transition-box-shadow{transition:box-shadow 200ms cubic-bezier(0.4,0,0.2,1) 0s}
234
+ .fanui-transition-opacity{transition:opacity 200ms cubic-bezier(0.4,0,0.2,1) 0s}
235
+ .fanui-transition-transform{transition:transform 200ms cubic-bezier(0.4,0,0.2,1) 0s}@media (prefers-reduced-motion:reduce){.fanui-animate-fade-in,.fanui-animate-fade-out,.fanui-animate-slide-in-up,.fanui-animate-slide-in-down,.fanui-animate-slide-in-start,.fanui-animate-slide-in-end,.fanui-animate-zoom-in,.fanui-animate-zoom-out,.fanui-animate-pop-in,.fanui-animate-shake{animation:none !important;opacity:1 !important;transform:none !important}
236
+ .fanui-animate-spin,.fanui-animate-pulse,.fanui-animate-bounce,.fanui-animate-blink{animation-duration:3s !important}}