@semiont/react-ui 0.2.30 → 0.2.31

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 (225) hide show
  1. package/README.md +34 -1
  2. package/dist/{ar-TQSFB35U.mjs → ar-6QTTYSKD.mjs} +44 -2
  3. package/dist/ar-6QTTYSKD.mjs.map +1 -0
  4. package/dist/{bn-525U24T3.mjs → bn-AHD2VP4T.mjs} +44 -2
  5. package/dist/bn-AHD2VP4T.mjs.map +1 -0
  6. package/dist/{chunk-BHAP6MVA.mjs → chunk-GDEHLKCO.mjs} +44 -2
  7. package/dist/chunk-GDEHLKCO.mjs.map +1 -0
  8. package/dist/{chunk-W6E2UESX.mjs → chunk-WHI4ECK4.mjs} +89 -47
  9. package/dist/chunk-WHI4ECK4.mjs.map +1 -0
  10. package/dist/{cs-OYWTGLFM.mjs → cs-WKZ5PTM3.mjs} +44 -2
  11. package/dist/cs-WKZ5PTM3.mjs.map +1 -0
  12. package/dist/{da-BDXG2ITK.mjs → da-JLWQLEH2.mjs} +44 -2
  13. package/dist/da-JLWQLEH2.mjs.map +1 -0
  14. package/dist/{de-NB5JLMES.mjs → de-TOCT63PC.mjs} +44 -2
  15. package/dist/de-TOCT63PC.mjs.map +1 -0
  16. package/dist/{el-3SVXEAJI.mjs → el-2XXDPBHO.mjs} +44 -2
  17. package/dist/el-2XXDPBHO.mjs.map +1 -0
  18. package/dist/{en-DVB4OE2R.mjs → en-OAKDUA6C.mjs} +10 -2
  19. package/dist/{es-YBOFA3W5.mjs → es-VQZSZSKB.mjs} +44 -2
  20. package/dist/es-VQZSZSKB.mjs.map +1 -0
  21. package/dist/{fa-7MU36AMY.mjs → fa-HFYV6XFA.mjs} +44 -2
  22. package/dist/fa-HFYV6XFA.mjs.map +1 -0
  23. package/dist/{fi-PQKJB32G.mjs → fi-GYTT42QN.mjs} +44 -2
  24. package/dist/fi-GYTT42QN.mjs.map +1 -0
  25. package/dist/{fr-U4HK5GM6.mjs → fr-RBOM5A35.mjs} +44 -2
  26. package/dist/fr-RBOM5A35.mjs.map +1 -0
  27. package/dist/{he-F5MNZHAL.mjs → he-KNB7K2AV.mjs} +44 -2
  28. package/dist/he-KNB7K2AV.mjs.map +1 -0
  29. package/dist/{hi-2PHI37ZX.mjs → hi-QJ6E72XH.mjs} +44 -2
  30. package/dist/hi-QJ6E72XH.mjs.map +1 -0
  31. package/dist/{id-JPRBNCGS.mjs → id-EKQVDHC7.mjs} +44 -2
  32. package/dist/id-EKQVDHC7.mjs.map +1 -0
  33. package/dist/index.d.mts +775 -127
  34. package/dist/index.mjs +8786 -2892
  35. package/dist/index.mjs.map +1 -1
  36. package/dist/{it-MRLWI5OS.mjs → it-43QKJZRF.mjs} +44 -2
  37. package/dist/it-43QKJZRF.mjs.map +1 -0
  38. package/dist/{ja-YQ6RPI2T.mjs → ja-SZUXDDO5.mjs} +44 -2
  39. package/dist/ja-SZUXDDO5.mjs.map +1 -0
  40. package/dist/{ko-DUAVCEXX.mjs → ko-HIR2TG2Q.mjs} +44 -2
  41. package/dist/ko-HIR2TG2Q.mjs.map +1 -0
  42. package/dist/{ms-FBHSR4PG.mjs → ms-6EJXSDHO.mjs} +44 -2
  43. package/dist/ms-6EJXSDHO.mjs.map +1 -0
  44. package/dist/{nl-IC2MPZXN.mjs → nl-AAAXD3KD.mjs} +44 -2
  45. package/dist/nl-AAAXD3KD.mjs.map +1 -0
  46. package/dist/{no-LLD43NRM.mjs → no-CEBS75VU.mjs} +44 -2
  47. package/dist/no-CEBS75VU.mjs.map +1 -0
  48. package/dist/{pl-DDOJBR4D.mjs → pl-SIB6PH3I.mjs} +44 -2
  49. package/dist/pl-SIB6PH3I.mjs.map +1 -0
  50. package/dist/{pt-7TFHQRRN.mjs → pt-6BMNSQTQ.mjs} +44 -2
  51. package/dist/pt-6BMNSQTQ.mjs.map +1 -0
  52. package/dist/{ro-P4PJEGDU.mjs → ro-63CZRSZ7.mjs} +44 -2
  53. package/dist/ro-63CZRSZ7.mjs.map +1 -0
  54. package/dist/{sv-LF3VEQD2.mjs → sv-BRAAQGIC.mjs} +44 -2
  55. package/dist/sv-BRAAQGIC.mjs.map +1 -0
  56. package/dist/test-utils.mjs +2 -2
  57. package/dist/{th-YUQAOFXF.mjs → th-DQEDBNDR.mjs} +44 -2
  58. package/dist/th-DQEDBNDR.mjs.map +1 -0
  59. package/dist/{tr-CSIGLMJC.mjs → tr-IR5MEUEU.mjs} +44 -2
  60. package/dist/tr-IR5MEUEU.mjs.map +1 -0
  61. package/dist/{uk-LW3QBKSR.mjs → uk-BVRTOFAO.mjs} +44 -2
  62. package/dist/uk-BVRTOFAO.mjs.map +1 -0
  63. package/dist/{vi-W464Y6ZC.mjs → vi-QRBKNVJA.mjs} +44 -2
  64. package/dist/vi-QRBKNVJA.mjs.map +1 -0
  65. package/dist/{zh-R5XLM3EI.mjs → zh-VQVBROMT.mjs} +44 -2
  66. package/dist/zh-VQVBROMT.mjs.map +1 -0
  67. package/package.json +44 -6
  68. package/public/favicons/android-chrome-192x192.png +0 -0
  69. package/public/favicons/android-chrome-512x512.png +0 -0
  70. package/public/favicons/apple-touch-icon.png +0 -0
  71. package/public/favicons/favicon-128x128.png +0 -0
  72. package/public/favicons/favicon-16x16.png +0 -0
  73. package/public/favicons/favicon-32x32.png +0 -0
  74. package/public/favicons/favicon-48x48.png +0 -0
  75. package/public/favicons/favicon-64x64.png +0 -0
  76. package/public/favicons/favicon-96x96.png +0 -0
  77. package/public/favicons/favicon.ico +0 -0
  78. package/public/favicons/favicon.svg +47 -0
  79. package/public/favicons/site.webmanifest +19 -0
  80. package/src/examples/ButtonUsageExample.tsx +242 -0
  81. package/src/examples/button-css-modules.module.css +164 -0
  82. package/src/examples/button-styled-components.tsx +215 -0
  83. package/src/examples/button-tailwind.css +51 -0
  84. package/src/integrations/css-modules-helper.tsx +223 -0
  85. package/src/integrations/styled-components-theme.ts +405 -0
  86. package/src/integrations/tailwind-plugin.js +224 -0
  87. package/src/styles/base/reset.css +105 -0
  88. package/src/styles/base/utilities.css +465 -0
  89. package/src/styles/components/annotation-entries.css +138 -0
  90. package/src/styles/components/annotations.css +51 -0
  91. package/src/styles/components/auth.css +309 -0
  92. package/src/styles/components/branding.css +131 -0
  93. package/src/styles/components/cards.css +136 -0
  94. package/src/styles/components/collapsible-resource-navigation.css +161 -0
  95. package/src/styles/components/detection-widget.css +499 -0
  96. package/src/styles/components/footer.css +98 -0
  97. package/src/styles/components/header.css +109 -0
  98. package/src/styles/components/left-sidebar.css +138 -0
  99. package/src/styles/components/modals.css +672 -0
  100. package/src/styles/components/navigation-menu.css +59 -0
  101. package/src/styles/components/navigation-tabs.css +474 -0
  102. package/src/styles/components/panel-sections.css +440 -0
  103. package/src/styles/components/panels-base.css +404 -0
  104. package/src/styles/components/panels.css +100 -0
  105. package/src/styles/components/references.css +430 -0
  106. package/src/styles/components/resize-handle.css +110 -0
  107. package/src/styles/components/search-modal.css +463 -0
  108. package/src/styles/components/skip-links.css +101 -0
  109. package/src/styles/components/status-display.css +409 -0
  110. package/src/styles/components/tables.css +199 -0
  111. package/src/styles/components/toast.css +130 -0
  112. package/src/styles/components/toolbar.css +201 -0
  113. package/src/styles/core/badges.css +209 -0
  114. package/src/styles/core/buttons.css +781 -0
  115. package/src/styles/core/checkboxes.css +92 -0
  116. package/src/styles/core/forms.css +254 -0
  117. package/src/styles/core/index.css +43 -0
  118. package/src/styles/core/indicators.css +225 -0
  119. package/src/styles/core/inputs.css +117 -0
  120. package/src/styles/core/progress.css +170 -0
  121. package/src/styles/core/selects.css +135 -0
  122. package/src/styles/core/sliders.css +236 -0
  123. package/src/styles/core/tags.css +203 -0
  124. package/src/styles/core/textareas.css +134 -0
  125. package/src/styles/core/toggles.css +86 -0
  126. package/src/styles/features/admin.css +293 -0
  127. package/src/styles/features/compose.css +192 -0
  128. package/src/styles/features/devops.css +154 -0
  129. package/src/styles/features/entity-tags.css +140 -0
  130. package/src/styles/features/recent-docs.css +97 -0
  131. package/src/styles/features/resource-discovery.css +387 -0
  132. package/src/styles/features/resource-viewer.css +508 -0
  133. package/src/styles/features/resource.css +506 -0
  134. package/src/styles/features/schemas.css +222 -0
  135. package/src/styles/features/static-pages.css +589 -0
  136. package/src/styles/features/welcome.css +81 -0
  137. package/src/styles/index.css +93 -0
  138. package/src/styles/layout/layout.css +85 -0
  139. package/src/styles/motivations/motivation-assessment.css +234 -0
  140. package/src/styles/motivations/motivation-comment.css +245 -0
  141. package/src/styles/motivations/motivation-highlight.css +195 -0
  142. package/src/styles/motivations/motivation-reference.css +210 -0
  143. package/src/styles/motivations/motivation-tag.css +254 -0
  144. package/src/styles/panels/assessment-panel.css +91 -0
  145. package/src/styles/panels/collaboration-panel.css +222 -0
  146. package/src/styles/panels/comments-panel.css +130 -0
  147. package/src/styles/panels/highlight-panel.css +63 -0
  148. package/src/styles/panels/history-panel.css +301 -0
  149. package/src/styles/panels/jsonld-panel.css +41 -0
  150. package/src/styles/panels/references-panel.css +85 -0
  151. package/src/styles/panels/resource-info-panel.css +230 -0
  152. package/src/styles/panels/settings-panel.css +58 -0
  153. package/src/styles/panels/statistics-panel.css +147 -0
  154. package/src/styles/panels/tagging-panel.css +59 -0
  155. package/src/styles/panels/unified-annotations-panel.css +133 -0
  156. package/src/styles/panels/user-panel.css +24 -0
  157. package/src/styles/patterns/errors.css +24 -0
  158. package/src/styles/patterns/loading.css +26 -0
  159. package/src/styles/utilities/contrast.css +443 -0
  160. package/src/styles/utilities/focus-extended.css +539 -0
  161. package/src/styles/utilities/focus.css +108 -0
  162. package/src/styles/utilities/motion-overrides.css +378 -0
  163. package/src/styles/utilities/motion.css +370 -0
  164. package/src/styles/utilities/semantic-indicators.css +321 -0
  165. package/src/styles/variables.css +354 -0
  166. package/translations/ar.json +35 -1
  167. package/translations/bn.json +35 -1
  168. package/translations/cs.json +35 -1
  169. package/translations/da.json +35 -1
  170. package/translations/de.json +35 -1
  171. package/translations/el.json +35 -1
  172. package/translations/en.json +35 -1
  173. package/translations/es.json +35 -1
  174. package/translations/fa.json +35 -1
  175. package/translations/fi.json +35 -1
  176. package/translations/fr.json +35 -1
  177. package/translations/he.json +35 -1
  178. package/translations/hi.json +35 -1
  179. package/translations/id.json +35 -1
  180. package/translations/it.json +35 -1
  181. package/translations/ja.json +35 -1
  182. package/translations/ko.json +35 -1
  183. package/translations/ms.json +35 -1
  184. package/translations/nl.json +35 -1
  185. package/translations/no.json +35 -1
  186. package/translations/pl.json +35 -1
  187. package/translations/pt.json +35 -1
  188. package/translations/ro.json +35 -1
  189. package/translations/sv.json +35 -1
  190. package/translations/th.json +35 -1
  191. package/translations/tr.json +35 -1
  192. package/translations/uk.json +35 -1
  193. package/translations/vi.json +35 -1
  194. package/translations/zh.json +35 -1
  195. package/dist/ar-TQSFB35U.mjs.map +0 -1
  196. package/dist/bn-525U24T3.mjs.map +0 -1
  197. package/dist/chunk-BHAP6MVA.mjs.map +0 -1
  198. package/dist/chunk-W6E2UESX.mjs.map +0 -1
  199. package/dist/cs-OYWTGLFM.mjs.map +0 -1
  200. package/dist/da-BDXG2ITK.mjs.map +0 -1
  201. package/dist/de-NB5JLMES.mjs.map +0 -1
  202. package/dist/el-3SVXEAJI.mjs.map +0 -1
  203. package/dist/es-YBOFA3W5.mjs.map +0 -1
  204. package/dist/fa-7MU36AMY.mjs.map +0 -1
  205. package/dist/fi-PQKJB32G.mjs.map +0 -1
  206. package/dist/fr-U4HK5GM6.mjs.map +0 -1
  207. package/dist/he-F5MNZHAL.mjs.map +0 -1
  208. package/dist/hi-2PHI37ZX.mjs.map +0 -1
  209. package/dist/id-JPRBNCGS.mjs.map +0 -1
  210. package/dist/it-MRLWI5OS.mjs.map +0 -1
  211. package/dist/ja-YQ6RPI2T.mjs.map +0 -1
  212. package/dist/ko-DUAVCEXX.mjs.map +0 -1
  213. package/dist/ms-FBHSR4PG.mjs.map +0 -1
  214. package/dist/nl-IC2MPZXN.mjs.map +0 -1
  215. package/dist/no-LLD43NRM.mjs.map +0 -1
  216. package/dist/pl-DDOJBR4D.mjs.map +0 -1
  217. package/dist/pt-7TFHQRRN.mjs.map +0 -1
  218. package/dist/ro-P4PJEGDU.mjs.map +0 -1
  219. package/dist/sv-LF3VEQD2.mjs.map +0 -1
  220. package/dist/th-YUQAOFXF.mjs.map +0 -1
  221. package/dist/tr-CSIGLMJC.mjs.map +0 -1
  222. package/dist/uk-LW3QBKSR.mjs.map +0 -1
  223. package/dist/vi-W464Y6ZC.mjs.map +0 -1
  224. package/dist/zh-R5XLM3EI.mjs.map +0 -1
  225. /package/dist/{en-DVB4OE2R.mjs.map → en-OAKDUA6C.mjs.map} +0 -0
@@ -0,0 +1,370 @@
1
+ /**
2
+ * Motion and Animation Utilities
3
+ *
4
+ * Provides accessible animation controls that respect user preferences
5
+ * for reduced motion (WCAG 2.1 Success Criterion 2.3.3)
6
+ */
7
+
8
+ /* ========================================
9
+ Animation Keyframes
10
+ ======================================== */
11
+
12
+ /* Fade animations */
13
+ @keyframes fadeIn {
14
+ from { opacity: 0; }
15
+ to { opacity: 1; }
16
+ }
17
+
18
+ @keyframes fadeOut {
19
+ from { opacity: 1; }
20
+ to { opacity: 0; }
21
+ }
22
+
23
+ /* Slide animations */
24
+ @keyframes slideInUp {
25
+ from {
26
+ transform: translateY(100%);
27
+ opacity: 0;
28
+ }
29
+ to {
30
+ transform: translateY(0);
31
+ opacity: 1;
32
+ }
33
+ }
34
+
35
+ @keyframes slideInDown {
36
+ from {
37
+ transform: translateY(-100%);
38
+ opacity: 0;
39
+ }
40
+ to {
41
+ transform: translateY(0);
42
+ opacity: 1;
43
+ }
44
+ }
45
+
46
+ @keyframes slideInLeft {
47
+ from {
48
+ transform: translateX(-100%);
49
+ opacity: 0;
50
+ }
51
+ to {
52
+ transform: translateX(0);
53
+ opacity: 1;
54
+ }
55
+ }
56
+
57
+ @keyframes slideInRight {
58
+ from {
59
+ transform: translateX(100%);
60
+ opacity: 0;
61
+ }
62
+ to {
63
+ transform: translateX(0);
64
+ opacity: 1;
65
+ }
66
+ }
67
+
68
+ /* Scale animations */
69
+ @keyframes scaleIn {
70
+ from {
71
+ transform: scale(0.95);
72
+ opacity: 0;
73
+ }
74
+ to {
75
+ transform: scale(1);
76
+ opacity: 1;
77
+ }
78
+ }
79
+
80
+ @keyframes scaleOut {
81
+ from {
82
+ transform: scale(1);
83
+ opacity: 1;
84
+ }
85
+ to {
86
+ transform: scale(0.95);
87
+ opacity: 0;
88
+ }
89
+ }
90
+
91
+ /* Spin animation */
92
+ @keyframes spin {
93
+ from { transform: rotate(0deg); }
94
+ to { transform: rotate(360deg); }
95
+ }
96
+
97
+ /* Pulse animation */
98
+ @keyframes pulse {
99
+ 0%, 100% {
100
+ transform: scale(1);
101
+ opacity: 1;
102
+ }
103
+ 50% {
104
+ transform: scale(1.05);
105
+ opacity: 0.8;
106
+ }
107
+ }
108
+
109
+ /* Shimmer animation */
110
+ @keyframes shimmer {
111
+ 0% {
112
+ background-position: -200% 0;
113
+ }
114
+ 100% {
115
+ background-position: 200% 0;
116
+ }
117
+ }
118
+
119
+ /* ========================================
120
+ Motion Utility Classes
121
+ ======================================== */
122
+
123
+ /* Safe transitions that respect user preferences */
124
+ .semiont-transition {
125
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
126
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
127
+ transition-duration: var(--semiont-duration-base, 150ms);
128
+ }
129
+
130
+ .semiont-transition-none {
131
+ transition-property: none;
132
+ }
133
+
134
+ .semiont-transition-all {
135
+ transition-property: all;
136
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
137
+ transition-duration: var(--semiont-duration-base, 150ms);
138
+ }
139
+
140
+ .semiont-transition-colors {
141
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
142
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
143
+ transition-duration: var(--semiont-duration-base, 150ms);
144
+ }
145
+
146
+ .semiont-transition-opacity {
147
+ transition-property: opacity;
148
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
149
+ transition-duration: var(--semiont-duration-base, 150ms);
150
+ }
151
+
152
+ .semiont-transition-transform {
153
+ transition-property: transform;
154
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
155
+ transition-duration: var(--semiont-duration-base, 150ms);
156
+ }
157
+
158
+ /* Animation classes */
159
+ .semiont-animate-fade-in {
160
+ animation: fadeIn var(--semiont-duration-base, 150ms) ease-in-out;
161
+ }
162
+
163
+ .semiont-animate-fade-out {
164
+ animation: fadeOut var(--semiont-duration-base, 150ms) ease-in-out;
165
+ }
166
+
167
+ .semiont-animate-slide-in-up {
168
+ animation: slideInUp var(--semiont-duration-moderate, 300ms) ease-out;
169
+ }
170
+
171
+ .semiont-animate-slide-in-down {
172
+ animation: slideInDown var(--semiont-duration-moderate, 300ms) ease-out;
173
+ }
174
+
175
+ .semiont-animate-slide-in-left {
176
+ animation: slideInLeft var(--semiont-duration-moderate, 300ms) ease-out;
177
+ }
178
+
179
+ .semiont-animate-slide-in-right {
180
+ animation: slideInRight var(--semiont-duration-moderate, 300ms) ease-out;
181
+ }
182
+
183
+ .semiont-animate-scale-in {
184
+ animation: scaleIn var(--semiont-duration-base, 150ms) ease-out;
185
+ }
186
+
187
+ .semiont-animate-scale-out {
188
+ animation: scaleOut var(--semiont-duration-base, 150ms) ease-in;
189
+ }
190
+
191
+ .semiont-animate-spin {
192
+ animation: spin 1s linear infinite;
193
+ }
194
+
195
+ .semiont-animate-pulse {
196
+ animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
197
+ }
198
+
199
+ .semiont-animate-shimmer {
200
+ animation: shimmer 2s linear infinite;
201
+ background: linear-gradient(
202
+ 90deg,
203
+ transparent 0%,
204
+ rgba(255, 255, 255, 0.1) 50%,
205
+ transparent 100%
206
+ );
207
+ background-size: 200% 100%;
208
+ }
209
+
210
+ /* ========================================
211
+ Reduced Motion Support
212
+ ======================================== */
213
+
214
+ /**
215
+ * When users prefer reduced motion:
216
+ * - Remove all animations
217
+ * - Reduce transition durations to instant or very fast
218
+ * - Keep essential transitions for usability
219
+ */
220
+
221
+ @media (prefers-reduced-motion: reduce) {
222
+ /* Remove all animations */
223
+ *,
224
+ *::before,
225
+ *::after {
226
+ animation-duration: 0.01ms !important;
227
+ animation-iteration-count: 1 !important;
228
+ transition-duration: 0.01ms !important;
229
+ scroll-behavior: auto !important;
230
+ }
231
+
232
+ /* Keep essential opacity transitions for usability */
233
+ .semiont-transition,
234
+ .semiont-transition-all,
235
+ .semiont-transition-colors,
236
+ .semiont-transition-opacity {
237
+ transition-duration: 0.01ms !important;
238
+ }
239
+
240
+ /* Disable transform animations completely */
241
+ .semiont-transition-transform {
242
+ transition-property: none !important;
243
+ }
244
+
245
+ /* Override specific animations to be instant */
246
+ .semiont-animate-fade-in,
247
+ .semiont-animate-fade-out,
248
+ .semiont-animate-slide-in-up,
249
+ .semiont-animate-slide-in-down,
250
+ .semiont-animate-slide-in-left,
251
+ .semiont-animate-slide-in-right,
252
+ .semiont-animate-scale-in,
253
+ .semiont-animate-scale-out {
254
+ animation: none !important;
255
+ opacity: 1 !important;
256
+ transform: none !important;
257
+ }
258
+
259
+ /* Stop infinite animations */
260
+ .semiont-animate-spin,
261
+ .semiont-animate-pulse,
262
+ .semiont-animate-shimmer {
263
+ animation: none !important;
264
+ }
265
+
266
+ /* Ensure spinners are still visible but static */
267
+ .semiont-animate-spin {
268
+ opacity: 1;
269
+ }
270
+
271
+ /* Replace shimmer with static loading state */
272
+ .semiont-animate-shimmer {
273
+ background: rgba(0, 0, 0, 0.1);
274
+ }
275
+
276
+ [data-theme="dark"] .semiont-animate-shimmer {
277
+ background: rgba(255, 255, 255, 0.1);
278
+ }
279
+ }
280
+
281
+ /* ========================================
282
+ Motion-Safe Utilities
283
+ ======================================== */
284
+
285
+ /**
286
+ * Use these classes when motion is essential to functionality
287
+ * They will only apply when motion is NOT reduced
288
+ */
289
+
290
+ @media (prefers-reduced-motion: no-preference) {
291
+ .semiont-motion-safe-animate-spin {
292
+ animation: spin 1s linear infinite;
293
+ }
294
+
295
+ .semiont-motion-safe-animate-pulse {
296
+ animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
297
+ }
298
+
299
+ .semiont-motion-safe-transition-all {
300
+ transition-property: all;
301
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
302
+ transition-duration: var(--semiont-duration-base, 150ms);
303
+ }
304
+
305
+ .semiont-motion-safe-transition-transform {
306
+ transition-property: transform;
307
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
308
+ transition-duration: var(--semiont-duration-base, 150ms);
309
+ }
310
+ }
311
+
312
+ /* ========================================
313
+ Component-Specific Motion Overrides
314
+ ======================================== */
315
+
316
+ @media (prefers-reduced-motion: reduce) {
317
+ /* Loading spinners - keep visible but static */
318
+ .semiont-spinner,
319
+ .semiont-loading__spinner {
320
+ animation: none !important;
321
+ opacity: 0.6;
322
+ }
323
+
324
+ /* Progress bars - instant updates */
325
+ .semiont-progress__fill {
326
+ transition: none !important;
327
+ }
328
+
329
+ /* Toasts - appear instantly */
330
+ .semiont-toast {
331
+ animation: none !important;
332
+ transition: none !important;
333
+ opacity: 1 !important;
334
+ transform: none !important;
335
+ }
336
+
337
+ /* Modals - no slide/fade effects */
338
+ .semiont-modal,
339
+ .semiont-modal__backdrop,
340
+ .semiont-modal__content {
341
+ animation: none !important;
342
+ transition: opacity 0.01ms !important;
343
+ }
344
+
345
+ /* Tooltips - instant show/hide */
346
+ .semiont-tooltip {
347
+ transition: none !important;
348
+ animation: none !important;
349
+ }
350
+
351
+ /* Accordions/Collapsibles - instant expand/collapse */
352
+ .semiont-accordion__content,
353
+ .semiont-collapsible {
354
+ transition: none !important;
355
+ animation: none !important;
356
+ }
357
+
358
+ /* Tabs - instant switching */
359
+ .semiont-tabs__panel {
360
+ transition: none !important;
361
+ animation: none !important;
362
+ }
363
+
364
+ /* Dropdowns - instant open/close */
365
+ .semiont-dropdown,
366
+ .semiont-dropdown__menu {
367
+ transition: none !important;
368
+ animation: none !important;
369
+ }
370
+ }
@@ -0,0 +1,321 @@
1
+ /**
2
+ * Semantic Indicators for Accessibility
3
+ *
4
+ * This file ensures that information is not conveyed by color alone
5
+ * by adding secondary indicators like icons, text, and patterns.
6
+ * WCAG 2.1 Success Criterion 1.4.1: Use of Color
7
+ */
8
+
9
+ /* ========================================
10
+ Icon Indicators via Pseudo-elements
11
+ ======================================== */
12
+
13
+ /**
14
+ * Add icons to error states using pseudo-elements
15
+ * This ensures errors are identifiable without relying on color
16
+ */
17
+
18
+ /* Error indicators */
19
+ .semiont-error-message::before,
20
+ .semiont-auth__error::before,
21
+ .semiont-auth__error-text::before,
22
+ .semiont-form__error::before,
23
+ .semiont-panel-error::before,
24
+ .semiont-view-error::before,
25
+ .semiont-entity-tags__error::before,
26
+ .semiont-document-viewer__error-title::before,
27
+ .semiont-document-viewer__error-message::before,
28
+ .semiont-document-viewer__error-button::before,
29
+ .semiont-stat-card__icon--error::before,
30
+ [data-state="error"]::before,
31
+ [data-status="error"]::before {
32
+ content: "⚠ " !important; /* Warning triangle */
33
+ font-family: system-ui, -apple-system, sans-serif !important;
34
+ font-weight: bold !important;
35
+ margin-right: 0.25em !important;
36
+ }
37
+
38
+ /* Warning indicators */
39
+ .semiont-button[data-variant="warning"]::before,
40
+ .semiont-stat-card__icon--warning::before,
41
+ .semiont-status--warning::before,
42
+ [data-state="warning"]::before,
43
+ [data-status="warning"]::before {
44
+ content: "⚡ " !important; /* Lightning bolt for warnings */
45
+ font-family: system-ui, -apple-system, sans-serif !important;
46
+ margin-right: 0.25em !important;
47
+ }
48
+
49
+ /* Success indicators */
50
+ .semiont-button[data-variant="success"]::before,
51
+ .semiont-stat-card__icon--success::before,
52
+ .semiont-status--success::before,
53
+ .semiont-success-message::before,
54
+ [data-state="success"]::before,
55
+ [data-status="success"]::before {
56
+ content: "✓ " !important; /* Checkmark */
57
+ font-family: system-ui, -apple-system, sans-serif !important;
58
+ margin-right: 0.25em !important;
59
+ }
60
+
61
+ /* Info indicators */
62
+ .semiont-button[data-variant="info"]::before,
63
+ .semiont-stat-card__icon--info::before,
64
+ .semiont-status--info::before,
65
+ .semiont-info-message::before,
66
+ [data-state="info"]::before,
67
+ [data-status="info"]::before {
68
+ content: "ℹ " !important; /* Info symbol */
69
+ font-family: system-ui, -apple-system, sans-serif !important;
70
+ margin-right: 0.25em !important;
71
+ }
72
+
73
+ /* Danger indicators */
74
+ .semiont-button[data-variant="danger"]::before,
75
+ .semiont-status--danger::before,
76
+ [data-state="danger"]::before,
77
+ [data-status="danger"]::before {
78
+ content: "✕ " !important; /* X mark */
79
+ font-family: system-ui, -apple-system, sans-serif !important;
80
+ margin-right: 0.25em !important;
81
+ }
82
+
83
+ /* ========================================
84
+ Text Labels for Status
85
+ ======================================== */
86
+
87
+ /**
88
+ * Add screen reader text for status indicators
89
+ * This ensures status is announced even if visual indicators fail
90
+ */
91
+
92
+ /* Add visually hidden but screen-reader accessible text */
93
+ .semiont-error-message::after,
94
+ .semiont-auth__error::after,
95
+ .semiont-auth__error-text::after,
96
+ .semiont-form__error::after,
97
+ .semiont-panel-error::after,
98
+ .semiont-view-error::after {
99
+ content: " (Error)" !important;
100
+ position: absolute !important;
101
+ width: 1px !important;
102
+ height: 1px !important;
103
+ padding: 0 !important;
104
+ margin: -1px !important;
105
+ overflow: hidden !important;
106
+ clip: rect(0, 0, 0, 0) !important;
107
+ white-space: nowrap !important;
108
+ border: 0 !important;
109
+ }
110
+
111
+ .semiont-button[data-variant="warning"]::after,
112
+ .semiont-stat-card__icon--warning::after,
113
+ .semiont-status--warning::after {
114
+ content: " (Warning)" !important;
115
+ position: absolute !important;
116
+ width: 1px !important;
117
+ height: 1px !important;
118
+ padding: 0 !important;
119
+ margin: -1px !important;
120
+ overflow: hidden !important;
121
+ clip: rect(0, 0, 0, 0) !important;
122
+ white-space: nowrap !important;
123
+ border: 0 !important;
124
+ }
125
+
126
+ .semiont-button[data-variant="success"]::after,
127
+ .semiont-stat-card__icon--success::after,
128
+ .semiont-status--success::after {
129
+ content: " (Success)" !important;
130
+ position: absolute !important;
131
+ width: 1px !important;
132
+ height: 1px !important;
133
+ padding: 0 !important;
134
+ margin: -1px !important;
135
+ overflow: hidden !important;
136
+ clip: rect(0, 0, 0, 0) !important;
137
+ white-space: nowrap !important;
138
+ border: 0 !important;
139
+ }
140
+
141
+ /* ========================================
142
+ Pattern Overlays for Additional Context
143
+ ======================================== */
144
+
145
+ /**
146
+ * Add subtle patterns to differentiate states
147
+ * This helps users who cannot distinguish colors
148
+ */
149
+
150
+ /* Error pattern - diagonal stripes */
151
+ .semiont-error-message,
152
+ .semiont-auth__error,
153
+ .semiont-panel-error,
154
+ .semiont-view-error {
155
+ background-image: repeating-linear-gradient(
156
+ -45deg,
157
+ transparent,
158
+ transparent 10px,
159
+ rgba(220, 38, 38, 0.03) 10px,
160
+ rgba(220, 38, 38, 0.03) 20px
161
+ ) !important;
162
+ }
163
+
164
+ /* Warning pattern - dots */
165
+ .semiont-button[data-variant="warning"],
166
+ .semiont-stat-card__icon--warning,
167
+ .semiont-status--warning {
168
+ background-image: radial-gradient(
169
+ circle,
170
+ rgba(251, 191, 36, 0.05) 1px,
171
+ transparent 1px
172
+ ) !important;
173
+ background-size: 10px 10px !important;
174
+ }
175
+
176
+ /* ========================================
177
+ Border Styles for Additional Distinction
178
+ ======================================== */
179
+
180
+ /* Add distinct border styles to status elements */
181
+ .semiont-error-message,
182
+ .semiont-auth__error,
183
+ .semiont-form__error,
184
+ .semiont-panel-error {
185
+ border-left: 4px solid var(--semiont-color-red-600) !important;
186
+ padding-left: 0.75rem !important;
187
+ }
188
+
189
+ .semiont-button[data-variant="warning"],
190
+ .semiont-status--warning {
191
+ border: 2px dashed var(--semiont-color-amber-600) !important;
192
+ }
193
+
194
+ .semiont-button[data-variant="success"],
195
+ .semiont-status--success {
196
+ border: 2px solid var(--semiont-color-green-600) !important;
197
+ }
198
+
199
+ /* ========================================
200
+ ARIA Labels for Complex States
201
+ ======================================== */
202
+
203
+ /* Note: ARIA attributes should be set in HTML, not CSS.
204
+ These selectors identify elements that need proper ARIA labels. */
205
+
206
+ /* ========================================
207
+ Hover State Differentiation
208
+ ======================================== */
209
+
210
+ /* Ensure hover states don't rely only on color */
211
+ .semiont-button[data-variant="warning"]:hover:not(:disabled):not([data-disabled="true"]) {
212
+ transform: translateY(-1px) !important;
213
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1) !important;
214
+ text-decoration: underline !important;
215
+ }
216
+
217
+ .semiont-button[data-variant="warning"]:active:not(:disabled):not([data-disabled="true"]),
218
+ .semiont-button[data-variant="warning"][data-active="true"]:not(:disabled):not([data-disabled="true"]) {
219
+ transform: translateY(0) !important;
220
+ box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.1) !important;
221
+ }
222
+
223
+ /* ========================================
224
+ Document Viewer Error States
225
+ ======================================== */
226
+
227
+ .semiont-document-viewer__error-title {
228
+ font-weight: bold !important;
229
+ text-transform: uppercase !important;
230
+ letter-spacing: 0.05em !important;
231
+ }
232
+
233
+ .semiont-document-viewer__error-message {
234
+ font-style: italic !important;
235
+ border-left: 4px solid currentColor !important;
236
+ padding-left: 1rem !important;
237
+ }
238
+
239
+ .semiont-document-viewer__error-button {
240
+ text-decoration: underline !important;
241
+ font-weight: 600 !important;
242
+ }
243
+
244
+ .semiont-document-viewer__error-button:focus-visible {
245
+ outline: 2px solid var(--semiont-color-red-600) !important;
246
+ outline-offset: 2px !important;
247
+ border-radius: 2px !important;
248
+ }
249
+
250
+ /* ========================================
251
+ Entity Tags Error States
252
+ ======================================== */
253
+
254
+ .semiont-entity-tags__error {
255
+ text-decoration: wavy underline !important;
256
+ text-underline-offset: 2px !important;
257
+ font-weight: 600 !important;
258
+ }
259
+
260
+ /* ========================================
261
+ Stat Card Icon States
262
+ ======================================== */
263
+
264
+ /* Make stat card icons more distinguishable */
265
+ .semiont-stat-card__icon--error,
266
+ .semiont-stat-card__icon--warning,
267
+ .semiont-stat-card__icon--success,
268
+ .semiont-stat-card__icon--info {
269
+ position: relative !important;
270
+ display: inline-flex !important;
271
+ align-items: center !important;
272
+ }
273
+
274
+ /* ========================================
275
+ Dark Theme Support
276
+ ======================================== */
277
+
278
+ /* Ensure patterns work in dark theme */
279
+ [data-theme="dark"] .semiont-error-message,
280
+ [data-theme="dark"] .semiont-auth__error,
281
+ [data-theme="dark"] .semiont-auth__error-text,
282
+ [data-theme="dark"] .semiont-form__error,
283
+ [data-theme="dark"] .semiont-panel-error,
284
+ [data-theme="dark"] .semiont-view-error,
285
+ [data-theme="dark"] .semiont-entity-tags__error,
286
+ [data-theme="dark"] .semiont-document-viewer__error-title,
287
+ [data-theme="dark"] .semiont-document-viewer__error-message,
288
+ [data-theme="dark"] .semiont-document-viewer__error-button {
289
+ /* Icons and patterns still work in dark theme */
290
+ filter: none !important;
291
+ }
292
+
293
+ [data-theme="dark"] .semiont-button[data-variant="warning"],
294
+ [data-theme="dark"] .semiont-button[data-variant="warning"]:hover:not(:disabled):not([data-disabled="true"]),
295
+ [data-theme="dark"] .semiont-button[data-variant="warning"]:active:not(:disabled):not([data-disabled="true"]),
296
+ [data-theme="dark"] .semiont-button[data-variant="warning"][data-active="true"]:not(:disabled):not([data-disabled="true"]) {
297
+ /* Maintain visual indicators in dark theme */
298
+ filter: none !important;
299
+ }
300
+
301
+ [data-theme="dark"] .semiont-stat-card__icon--warning,
302
+ [data-theme="dark"] .semiont-stat-card__icon--error,
303
+ [data-theme="dark"] .semiont-stat-card__icon--success,
304
+ [data-theme="dark"] .semiont-stat-card__icon--info {
305
+ /* Icons remain visible */
306
+ opacity: 1 !important;
307
+ }
308
+
309
+ /* ========================================
310
+ Print Styles
311
+ ======================================== */
312
+
313
+ @media print {
314
+ /* Ensure status is clear when printed */
315
+ .semiont-error-message::before,
316
+ .semiont-button[data-variant="warning"]::before,
317
+ .semiont-status--success::before {
318
+ content: attr(data-status-text, "•") " " !important;
319
+ font-weight: bold !important;
320
+ }
321
+ }