@koide-labs/ui 0.0.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 (170) hide show
  1. package/.husky/pre-commit +1 -0
  2. package/.storybook/main.ts +25 -0
  3. package/.storybook/preview-head.html +6 -0
  4. package/.storybook/preview.tsx +48 -0
  5. package/.storybook/vitest.setup.ts +8 -0
  6. package/README.md +11 -0
  7. package/eslint.config.mjs +29 -0
  8. package/lint-staged.config.js +15 -0
  9. package/package.json +95 -0
  10. package/pnpm-workspace.yaml +2 -0
  11. package/postcss.config.mjs +7 -0
  12. package/prettier.config.mjs +24 -0
  13. package/scripts/build-icon-types.ts +38 -0
  14. package/src/-types.ts +8 -0
  15. package/src/-utils.tsx +64 -0
  16. package/src/components/accordion/accordion.module.css +44 -0
  17. package/src/components/accordion/accordion.stories.tsx +36 -0
  18. package/src/components/accordion/index.tsx +67 -0
  19. package/src/components/alert-dialog/alert-dialog.module.css +5 -0
  20. package/src/components/alert-dialog/alert-dialog.stories.tsx +53 -0
  21. package/src/components/alert-dialog/index.tsx +138 -0
  22. package/src/components/anchor/anchor.module.css +18 -0
  23. package/src/components/anchor/anchor.stories.tsx +28 -0
  24. package/src/components/anchor/index.tsx +45 -0
  25. package/src/components/avatar/avatar.module.css +56 -0
  26. package/src/components/avatar/avatar.stories.tsx +61 -0
  27. package/src/components/avatar/index.tsx +82 -0
  28. package/src/components/badge/badge.module.css +35 -0
  29. package/src/components/badge/badge.stories.tsx +60 -0
  30. package/src/components/badge/index.tsx +71 -0
  31. package/src/components/button/button.module.css +42 -0
  32. package/src/components/button/button.stories.tsx +108 -0
  33. package/src/components/button/index.tsx +63 -0
  34. package/src/components/checkbox/checkbox.module.css +36 -0
  35. package/src/components/checkbox/checkbox.stories.tsx +21 -0
  36. package/src/components/checkbox/index.tsx +41 -0
  37. package/src/components/code/code.module.css +20 -0
  38. package/src/components/code/code.stories.tsx +42 -0
  39. package/src/components/code/index.tsx +73 -0
  40. package/src/components/collapse/collapse.module.css +27 -0
  41. package/src/components/collapse/collapse.stories.tsx +27 -0
  42. package/src/components/collapse/index.tsx +59 -0
  43. package/src/components/command/command.module.css +95 -0
  44. package/src/components/command/command.stories.tsx +38 -0
  45. package/src/components/command/index.tsx +108 -0
  46. package/src/components/context-menu/context-menu.module.css +36 -0
  47. package/src/components/context-menu/context-menu.stories.tsx +99 -0
  48. package/src/components/context-menu/index.tsx +242 -0
  49. package/src/components/dialog/dialog.module.css +71 -0
  50. package/src/components/dialog/dialog.stories.tsx +29 -0
  51. package/src/components/dialog/index.tsx +148 -0
  52. package/src/components/heading/heading.module.css +3 -0
  53. package/src/components/heading/heading.stories.tsx +52 -0
  54. package/src/components/heading/index.tsx +112 -0
  55. package/src/components/icon/icon-names.ts +3189 -0
  56. package/src/components/icon/icon.module.css +36 -0
  57. package/src/components/icon/icon.stories.tsx +40 -0
  58. package/src/components/icon/index.tsx +60 -0
  59. package/src/components/icon-button/icon-button.module.css +33 -0
  60. package/src/components/icon-button/icon-button.stories.tsx +59 -0
  61. package/src/components/icon-button/index.tsx +48 -0
  62. package/src/components/inline-code/index.tsx +29 -0
  63. package/src/components/inline-code/inline-code.module.css +13 -0
  64. package/src/components/inline-code/inline-code.stories.tsx +31 -0
  65. package/src/components/input/index.tsx +22 -0
  66. package/src/components/input/input.module.css +23 -0
  67. package/src/components/input/input.stories.tsx +52 -0
  68. package/src/components/meter/index.tsx +55 -0
  69. package/src/components/meter/meter.module.css +23 -0
  70. package/src/components/meter/meter.stories.tsx +31 -0
  71. package/src/components/multiline-input/index.tsx +58 -0
  72. package/src/components/multiline-input/multiline-input.stories.tsx +26 -0
  73. package/src/components/number-input/index.tsx +74 -0
  74. package/src/components/number-input/number-input.module.css +41 -0
  75. package/src/components/number-input/number-input.stories.tsx +24 -0
  76. package/src/components/password-input/index.tsx +24 -0
  77. package/src/components/password-input/password-input.module.css +10 -0
  78. package/src/components/password-input/password-input.stories.tsx +24 -0
  79. package/src/components/pill/index.tsx +45 -0
  80. package/src/components/pill/pill.module.css +22 -0
  81. package/src/components/pill/pill.stories.tsx +83 -0
  82. package/src/components/popover/index.tsx +94 -0
  83. package/src/components/popover/popover.module.css +8 -0
  84. package/src/components/popover/popover.stories.tsx +53 -0
  85. package/src/components/preview-card/index.tsx +68 -0
  86. package/src/components/preview-card/preview-card.module.css +5 -0
  87. package/src/components/preview-card/preview-card.stories.tsx +58 -0
  88. package/src/components/radio/index.tsx +67 -0
  89. package/src/components/radio/radio-group.module.css +5 -0
  90. package/src/components/radio/radio.module.css +36 -0
  91. package/src/components/radio/radio.stories.tsx +27 -0
  92. package/src/components/search-bar/index.tsx +60 -0
  93. package/src/components/search-bar/search-bar.module.css +29 -0
  94. package/src/components/search-bar/search-bar.stories.tsx +37 -0
  95. package/src/components/select/index.tsx +132 -0
  96. package/src/components/select/select.module.css +63 -0
  97. package/src/components/select/select.stories.tsx +49 -0
  98. package/src/components/separator/index.tsx +28 -0
  99. package/src/components/separator/separator.module.css +24 -0
  100. package/src/components/separator/separator.stories.tsx +40 -0
  101. package/src/components/slider/index.tsx +28 -0
  102. package/src/components/slider/slider.module.css +52 -0
  103. package/src/components/slider/slider.stories.tsx +53 -0
  104. package/src/components/spinner/index.tsx +14 -0
  105. package/src/components/spinner/spinner.module.css +13 -0
  106. package/src/components/spinner/spinner.stories.tsx +17 -0
  107. package/src/components/stacked-avatars/index.tsx +88 -0
  108. package/src/components/stacked-avatars/stacked-avatars.module.css +79 -0
  109. package/src/components/stacked-avatars/stacked-avatars.stories.tsx +48 -0
  110. package/src/components/status-banner/index.tsx +96 -0
  111. package/src/components/status-banner/status-banner.module.css +52 -0
  112. package/src/components/status-banner/status-banner.stories.tsx +44 -0
  113. package/src/components/surface/index.tsx +83 -0
  114. package/src/components/surface/surface.module.css +35 -0
  115. package/src/components/surface/surface.stories.tsx +84 -0
  116. package/src/components/switch/index.tsx +23 -0
  117. package/src/components/switch/switch.module.css +45 -0
  118. package/src/components/switch/switch.stories.tsx +48 -0
  119. package/src/components/tabs/index.tsx +126 -0
  120. package/src/components/tabs/tabs.module.css +134 -0
  121. package/src/components/tabs/tabs.stories.tsx +88 -0
  122. package/src/components/text/index.tsx +69 -0
  123. package/src/components/text/text.module.css +76 -0
  124. package/src/components/text/text.stories.tsx +107 -0
  125. package/src/components/theme-provider/index.ts +2 -0
  126. package/src/components/theme-provider/theme-context.tsx +18 -0
  127. package/src/components/theme-provider/theme-provider.stories.tsx +47 -0
  128. package/src/components/theme-provider/theme-provider.tsx +77 -0
  129. package/src/components/timestamp/index.tsx +131 -0
  130. package/src/components/timestamp/timestamp.module.css +8 -0
  131. package/src/components/timestamp/timestamp.stories.tsx +37 -0
  132. package/src/components/toast/index.ts +2 -0
  133. package/src/components/toast/toast.module.css +163 -0
  134. package/src/components/toast/toast.stories.tsx +53 -0
  135. package/src/components/toast/toast.tsx +104 -0
  136. package/src/components/toast/use-toast-manager.ts +63 -0
  137. package/src/components/tooltip/index.tsx +61 -0
  138. package/src/components/tooltip/tooltip-arrow.tsx +17 -0
  139. package/src/components/tooltip/tooltip.module.css +44 -0
  140. package/src/components/tooltip/tooltip.stories.tsx +76 -0
  141. package/src/components/view/index.tsx +137 -0
  142. package/src/components/view/view.module.css +11 -0
  143. package/src/components/view/view.stories.tsx +131 -0
  144. package/src/components/view/view_colorway.module.css +280 -0
  145. package/src/components/view/view_interactive.module.css +127 -0
  146. package/src/components/view/view_loading.module.css +58 -0
  147. package/src/components/visually-hidden/index.ts +1 -0
  148. package/src/index.ts +49 -0
  149. package/src/integrations/react-markdown/index.tsx +134 -0
  150. package/src/integrations/react-markdown/react-markdown.module.css +62 -0
  151. package/src/integrations/react-markdown/react-markdown.stories.tsx +31 -0
  152. package/src/integrations/remix.ts +12 -0
  153. package/src/integrations/tailwind.css +173 -0
  154. package/src/integrations/twemoij/index.tsx +13 -0
  155. package/src/integrations/twemoij/twemoji.module.css +7 -0
  156. package/src/integrations/twemoij/twemoji.stories.tsx +40 -0
  157. package/src/stories/components/all-variants.tsx +40 -0
  158. package/src/stories/data.ts +72 -0
  159. package/src/stories/utils.ts +20 -0
  160. package/src/styles/core.css +153 -0
  161. package/src/styles/themes/dark.css +86 -0
  162. package/src/styles/themes/light.css +86 -0
  163. package/src/styles/tokens.ts +282 -0
  164. package/src/styles/transitions.module.css +31 -0
  165. package/stylelint.config.mjs +29 -0
  166. package/tsconfig.app.json +35 -0
  167. package/tsconfig.json +7 -0
  168. package/tsconfig.node.json +26 -0
  169. package/vite.config.ts +103 -0
  170. package/vitest.shims.d.ts +1 -0
@@ -0,0 +1,280 @@
1
+ .view_colorway {
2
+ /* loading styles */
3
+ --view-loading-low-pulse: var(--view-colorway-dimmest);
4
+ --view-loading-high-pulse: transparent;
5
+
6
+ transition-duration: var(--transition-duration-snappy);
7
+ transition-timing-function: var(--transition-timing-function-snappy);
8
+ cursor: not-allowed;
9
+ border-width: 1px;
10
+ border-style: solid;
11
+ border-color: transparent;
12
+ border-radius: var(--border-radius-default);
13
+
14
+ &:not([disabled], [data-disabled]) {
15
+ cursor: pointer;
16
+ }
17
+ }
18
+
19
+ .view_colorway_static {
20
+ border-width: 1px;
21
+ border-style: solid;
22
+ border-color: transparent;
23
+ border-radius: var(--border-radius-default);
24
+ }
25
+
26
+ /* Variants */
27
+ .view_colorway_outline {
28
+ transition-property: color, background-color, box-shadow;
29
+ border-color: var(--view-colorway-dimmer);
30
+ background-color: transparent;
31
+ color: var(--view-colorway-dimmer);
32
+
33
+ &:not([disabled], [data-disabled]) {
34
+ color: var(--view-colorway-stronger);
35
+
36
+ &:active {
37
+ transition: none;
38
+ border-color: var(--view-colorway-stronger) !important;
39
+ }
40
+
41
+ &:focus {
42
+ box-shadow: 0 0 0 2px var(--view-colorway-strongest);
43
+
44
+ &:not(:focus-visible) {
45
+ box-shadow: none;
46
+ }
47
+ }
48
+
49
+ @media (hover: hover) {
50
+ &:hover {
51
+ border-color: var(--view-colorway-default);
52
+ background-color: var(--view-colorway-dimmer);
53
+ color: var(--view-colorway-strongest);
54
+ }
55
+ }
56
+ }
57
+ }
58
+
59
+ .view_colorway_outline-static {
60
+ box-shadow: none;
61
+ border-color: var(--view-colorway-dimmer);
62
+ background-color: transparent;
63
+ color: var(--view-colorway-stronger);
64
+ }
65
+
66
+ .view_colorway_mute-static {
67
+ box-shadow: none;
68
+ background-color: var(--view-colorway-dimmest);
69
+ color: var(--view-colorway-strongest);
70
+ }
71
+
72
+ .view_colorway_no-fill {
73
+ transition-property: color, background-color, box-shadow;
74
+ background-color: transparent;
75
+ color: var(--view-colorway-dimmer);
76
+
77
+ &:not([disabled], [data-disabled]) {
78
+ color: var(--view-colorway-stronger);
79
+
80
+ &:focus {
81
+ box-shadow: 0 0 0 2px var(--view-colorway-strongest);
82
+
83
+ &:not(:focus-visible) {
84
+ box-shadow: none;
85
+ }
86
+ }
87
+
88
+ @media (hover: hover) {
89
+ &:hover {
90
+ background-color: var(--view-colorway-dimmer);
91
+ color: var(--view-colorway-strongest);
92
+ }
93
+ }
94
+ }
95
+ }
96
+
97
+ .view_colorway_fill {
98
+ transition-property: background-color, box-shadow;
99
+ background-color: var(--view-colorway-dimmest);
100
+ color: var(--view-colorway-default);
101
+
102
+ &:not([disabled], [data-disabled]) {
103
+ background-color: var(--view-colorway-dimmer);
104
+ color: var(--view-colorway-strongest);
105
+
106
+ &:focus {
107
+ box-shadow: 0 0 0 2px var(--view-colorway-stronger);
108
+
109
+ &:not(:focus-visible) {
110
+ box-shadow: none;
111
+ }
112
+ }
113
+
114
+ @media (hover: hover) {
115
+ &:hover {
116
+ background-color: var(--view-colorway-default);
117
+ }
118
+ }
119
+ }
120
+ }
121
+
122
+ .view_colorway_fill-static {
123
+ box-shadow: none;
124
+ background-color: var(--view-colorway-dimmer);
125
+ color: var(--view-colorway-strongest);
126
+ }
127
+
128
+ .view_colorway_fill-outline {
129
+ transition-property: background-color, box-shadow;
130
+ box-shadow: none;
131
+ border-color: var(--view-colorway-dimmer);
132
+ background-color: var(--view-colorway-dimmest);
133
+ color: var(--view-colorway-default);
134
+
135
+ &:not([disabled], [data-disabled]) {
136
+ border-color: var(--view-colorway-dimmer);
137
+ background-color: var(--view-colorway-dimmest);
138
+ color: var(--view-colorway-strongest);
139
+
140
+ &:active {
141
+ transition: none;
142
+ border-color: var(--view-colorway-stronger) !important;
143
+ }
144
+
145
+ &:focus {
146
+ box-shadow: 0 0 0 2px var(--view-colorway-stronger);
147
+
148
+ &:not(:focus-visible) {
149
+ box-shadow: none;
150
+ }
151
+ }
152
+
153
+ @media (hover: hover) {
154
+ &:hover {
155
+ border-color: var(--view-colorway-default);
156
+ }
157
+ }
158
+ }
159
+ }
160
+
161
+ /* Colors! */
162
+ .view_colorway_color-primary {
163
+ --view-colorway-dimmest: var(--primary-dimmest);
164
+ --view-colorway-dimmer: var(--primary-dimmer);
165
+ --view-colorway-default: var(--primary-default);
166
+ --view-colorway-stronger: var(--primary-stronger);
167
+ --view-colorway-strongest: var(--primary-strongest);
168
+ }
169
+
170
+ .view_colorway_color-positive {
171
+ --view-colorway-dimmest: var(--positive-dimmest);
172
+ --view-colorway-dimmer: var(--positive-dimmer);
173
+ --view-colorway-default: var(--positive-default);
174
+ --view-colorway-stronger: var(--positive-stronger);
175
+ --view-colorway-strongest: var(--positive-strongest);
176
+ }
177
+
178
+ .view_colorway_color-negative {
179
+ --view-colorway-dimmest: var(--negative-dimmest);
180
+ --view-colorway-dimmer: var(--negative-dimmer);
181
+ --view-colorway-default: var(--negative-default);
182
+ --view-colorway-stronger: var(--negative-stronger);
183
+ --view-colorway-strongest: var(--negative-strongest);
184
+ }
185
+
186
+ .view_colorway_color-warning {
187
+ --view-colorway-dimmest: var(--warning-dimmest);
188
+ --view-colorway-dimmer: var(--warning-dimmer);
189
+ --view-colorway-default: var(--warning-default);
190
+ --view-colorway-stronger: var(--warning-stronger);
191
+ --view-colorway-strongest: var(--warning-strongest);
192
+ }
193
+
194
+ .view_colorway_color-red {
195
+ --view-colorway-dimmest: var(--red-dimmest);
196
+ --view-colorway-dimmer: var(--red-dimmer);
197
+ --view-colorway-default: var(--red-default);
198
+ --view-colorway-stronger: var(--red-stronger);
199
+ --view-colorway-strongest: var(--red-strongest);
200
+ }
201
+
202
+ .view_colorway_color-orange {
203
+ --view-colorway-dimmest: var(--orange-dimmest);
204
+ --view-colorway-dimmer: var(--orange-dimmer);
205
+ --view-colorway-default: var(--orange-default);
206
+ --view-colorway-stronger: var(--orange-stronger);
207
+ --view-colorway-strongest: var(--orange-strongest);
208
+ }
209
+
210
+ .view_colorway_color-yellow {
211
+ --view-colorway-dimmest: var(--yellow-dimmest);
212
+ --view-colorway-dimmer: var(--yellow-dimmer);
213
+ --view-colorway-default: var(--yellow-default);
214
+ --view-colorway-stronger: var(--yellow-stronger);
215
+ --view-colorway-strongest: var(--yellow-strongest);
216
+ }
217
+
218
+ .view_colorway_color-green {
219
+ --view-colorway-dimmest: var(--green-dimmest);
220
+ --view-colorway-dimmer: var(--green-dimmer);
221
+ --view-colorway-default: var(--green-default);
222
+ --view-colorway-stronger: var(--green-stronger);
223
+ --view-colorway-strongest: var(--green-strongest);
224
+ }
225
+
226
+ .view_colorway_color-teal {
227
+ --view-colorway-dimmest: var(--teal-dimmest);
228
+ --view-colorway-dimmer: var(--teal-dimmer);
229
+ --view-colorway-default: var(--teal-default);
230
+ --view-colorway-stronger: var(--teal-stronger);
231
+ --view-colorway-strongest: var(--teal-strongest);
232
+ }
233
+
234
+ .view_colorway_color-blue {
235
+ --view-colorway-dimmest: var(--blue-dimmest);
236
+ --view-colorway-dimmer: var(--blue-dimmer);
237
+ --view-colorway-default: var(--blue-default);
238
+ --view-colorway-stronger: var(--blue-stronger);
239
+ --view-colorway-strongest: var(--blue-strongest);
240
+ }
241
+
242
+ .view_colorway_color-blurple {
243
+ --view-colorway-dimmest: var(--blurple-dimmest);
244
+ --view-colorway-dimmer: var(--blurple-dimmer);
245
+ --view-colorway-default: var(--blurple-default);
246
+ --view-colorway-stronger: var(--blurple-stronger);
247
+ --view-colorway-strongest: var(--blurple-strongest);
248
+ }
249
+
250
+ .view_colorway_color-purple {
251
+ --view-colorway-dimmest: var(--purple-dimmest);
252
+ --view-colorway-dimmer: var(--purple-dimmer);
253
+ --view-colorway-default: var(--purple-default);
254
+ --view-colorway-stronger: var(--purple-stronger);
255
+ --view-colorway-strongest: var(--purple-strongest);
256
+ }
257
+
258
+ .view_colorway_color-magenta {
259
+ --view-colorway-dimmest: var(--magenta-dimmest);
260
+ --view-colorway-dimmer: var(--magenta-dimmer);
261
+ --view-colorway-default: var(--magenta-default);
262
+ --view-colorway-stronger: var(--magenta-stronger);
263
+ --view-colorway-strongest: var(--magenta-strongest);
264
+ }
265
+
266
+ .view_colorway_color-pink {
267
+ --view-colorway-dimmest: var(--pink-dimmest);
268
+ --view-colorway-dimmer: var(--pink-dimmer);
269
+ --view-colorway-default: var(--pink-default);
270
+ --view-colorway-stronger: var(--pink-stronger);
271
+ --view-colorway-strongest: var(--pink-strongest);
272
+ }
273
+
274
+ .view_colorway_color-grey {
275
+ --view-colorway-dimmest: var(--grey-dimmest);
276
+ --view-colorway-dimmer: var(--grey-dimmer);
277
+ --view-colorway-default: var(--grey-default);
278
+ --view-colorway-stronger: var(--grey-stronger);
279
+ --view-colorway-strongest: var(--grey-strongest);
280
+ }
@@ -0,0 +1,127 @@
1
+ .view_interactive {
2
+ /* loading styles */
3
+ --view-loading-low-pulse: var(--outline-dimmest);
4
+ --view-loading-high-pulse: var(--surface-interactive-background);
5
+
6
+ transition-duration: var(--transition-duration-snappy);
7
+ transition-timing-function: var(--transition-timing-function-snappy);
8
+ cursor: not-allowed;
9
+ border-width: 1px;
10
+ border-style: solid;
11
+ border-color: transparent;
12
+ border-radius: var(--border-radius-default);
13
+ background-color: transparent;
14
+ color: var(--foreground-dimmest);
15
+
16
+ &:not([disabled], [data-disabled]) {
17
+ cursor: pointer;
18
+
19
+ &:focus:focus-visible {
20
+ outline-color: transparent;
21
+ outline-width: var(--space-2);
22
+ outline-offset: var(--space-4);
23
+ box-shadow: var(--shadow-focus);
24
+ }
25
+ }
26
+ }
27
+
28
+ /* Variants */
29
+ .view_interactive_fill {
30
+ transition-property: background-color, box-shadow;
31
+ background-color: var(--surface-interactive-background);
32
+
33
+ &:not([disabled], [data-disabled]) {
34
+ color: inherit;
35
+
36
+ &:active {
37
+ border-color: var(--primary-default);
38
+ background-color: var(--surface-interactive-background-active);
39
+ }
40
+
41
+ @media (hover: hover) {
42
+ &:hover {
43
+ background-color: var(--surface-interactive-background-active);
44
+ }
45
+ }
46
+ }
47
+ }
48
+
49
+ .view_interactive_no-fill {
50
+ transition-property: background-color, box-shadow;
51
+
52
+ &:not([disabled], [data-disabled]) {
53
+ color: inherit;
54
+
55
+ &:not(textarea):active {
56
+ border-color: var(--primary-default);
57
+ background-color: var(--surface-interactive-background);
58
+ }
59
+
60
+ @media (hover: hover) {
61
+ &:hover {
62
+ background-color: var(--surface-interactive-background);
63
+ }
64
+ }
65
+ }
66
+ }
67
+
68
+ .view_interactive_outline {
69
+ transition-property: background-color, box-shadow;
70
+ border-color: var(--surface-interactive-border);
71
+
72
+ &:not([disabled], [data-disabled]) {
73
+ color: inherit;
74
+
75
+ &:not(textarea):active {
76
+ border-color: var(--primary-default);
77
+ }
78
+
79
+ @media (hover: hover) {
80
+ &:hover {
81
+ background-color: var(--surface-interactive-background);
82
+ }
83
+ }
84
+ }
85
+ }
86
+
87
+ /* default interactive style */
88
+ .view_interactive_fill-outline {
89
+ transition-property: box-shadow;
90
+ background-color: var(--surface-interactive-background);
91
+
92
+ &:not([disabled], [data-disabled]) {
93
+ border-color: var(--surface-interactive-border);
94
+ color: inherit;
95
+
96
+ &:not(textarea):active {
97
+ transition: none;
98
+ border-color: var(--primary-default);
99
+ }
100
+
101
+ @media (hover: hover) {
102
+ &:hover {
103
+ border-color: var(--surface-interactive-border-hover);
104
+ }
105
+ }
106
+ }
107
+ }
108
+
109
+ .view_interactive_list-item {
110
+ transition-property: box-shadow;
111
+ border-radius: 0;
112
+
113
+ &:not([disabled], [data-disabled]) {
114
+ color: inherit;
115
+
116
+ &:not(textarea):active {
117
+ border-color: var(--primary-default);
118
+ background-color: var(--surface-interactive-background-active);
119
+ }
120
+
121
+ @media (hover: hover) {
122
+ &:hover {
123
+ background-color: var(--surface-interactive-background);
124
+ }
125
+ }
126
+ }
127
+ }
@@ -0,0 +1,58 @@
1
+ /*
2
+ these variables are defined in colorway & interactive
3
+ --view-loading-low-pulse
4
+ --view-loading-high-pulse
5
+ */
6
+ .view_loading {
7
+ position: relative;
8
+ color: var(--foreground-dimmest);
9
+ }
10
+
11
+ .view_loading_foreground {
12
+ animation: loading 2s linear infinite;
13
+ background: linear-gradient(
14
+ 90deg,
15
+ var(--view-loading-low-pulse),
16
+ var(--view-loading-high-pulse),
17
+ var(--view-loading-low-pulse),
18
+ var(--view-loading-high-pulse)
19
+ );
20
+ background-position-x: 0%;
21
+ background-size: 300% 100%;
22
+ }
23
+
24
+ .view_loading_background {
25
+ overflow: hidden;
26
+
27
+ &::after {
28
+ display: block;
29
+ position: absolute;
30
+ top: 0;
31
+ left: 0;
32
+ opacity: 0.5;
33
+ animation: loading 2s linear infinite;
34
+ background: linear-gradient(
35
+ 90deg,
36
+ var(--view-loading-low-pulse),
37
+ var(--view-loading-high-pulse),
38
+ var(--view-loading-low-pulse),
39
+ var(--view-loading-high-pulse)
40
+ );
41
+ background-position-x: 0%;
42
+ background-size: 300% 100%;
43
+ width: 100%;
44
+ height: 100%;
45
+ pointer-events: none;
46
+ content: "";
47
+ }
48
+ }
49
+
50
+ @keyframes loading {
51
+ 0% {
52
+ background-position-x: 100%;
53
+ }
54
+
55
+ 100% {
56
+ background-position-x: 0%;
57
+ }
58
+ }
@@ -0,0 +1 @@
1
+ export { VisuallyHidden } from "@radix-ui/react-visually-hidden";
package/src/index.ts ADDED
@@ -0,0 +1,49 @@
1
+ export { Accordion, AccordionItem } from "./components/accordion";
2
+ export { AlertDialog } from "./components/alert-dialog";
3
+ export { Anchor } from "./components/anchor";
4
+ export { Avatar } from "./components/avatar";
5
+ export { Badge } from "./components/badge";
6
+ export { Button } from "./components/button";
7
+ export { Checkbox } from "./components/checkbox";
8
+ export { Code } from "./components/code";
9
+ export { Collapse } from "./components/collapse";
10
+ export {
11
+ CommandDialog,
12
+ CommandGroup,
13
+ CommandSeparator,
14
+ CommandItem,
15
+ } from "./components/command";
16
+ export { Dialog, DialogClose } from "./components/dialog";
17
+ export { Heading, Section } from "./components/heading";
18
+ export { IconButton } from "./components/icon-button";
19
+ export { Icon } from "./components/icon";
20
+ export { InlineCode } from "./components/inline-code";
21
+ export { Input } from "./components/input";
22
+ export { Meter } from "./components/meter";
23
+ export { MultilineInput } from "./components/multiline-input";
24
+ export { NumberInput } from "./components/number-input";
25
+ export { PasswordInput } from "./components/password-input";
26
+ export { Pill } from "./components/pill";
27
+ export { Popover } from "./components/popover";
28
+ export { PreviewCard } from "./components/preview-card";
29
+ export { RadioGroup, Radio } from "./components/radio";
30
+ export { SearchBar } from "./components/search-bar";
31
+ export { Select } from "./components/select";
32
+ export { Separator } from "./components/separator";
33
+ export { Slider } from "./components/slider";
34
+ export { StackedAvatars } from "./components/stacked-avatars";
35
+ export { StatusBanner } from "./components/status-banner";
36
+ export { Surface } from "./components/surface";
37
+ export { Switch } from "./components/switch";
38
+ export { Tabs } from "./components/tabs";
39
+ export { Text } from "./components/text";
40
+ export { ThemeProvider, useThemeContext } from "./components/theme-provider";
41
+ export { Timestamp } from "./components/timestamp";
42
+ export {
43
+ ToastProvider,
44
+ ToastViewport,
45
+ useToastManager,
46
+ } from "./components/toast";
47
+ export { TooltipProvider, Tooltip } from "./components/tooltip";
48
+ export { View } from "./components/view";
49
+ export { VisuallyHidden } from "./components/visually-hidden";
@@ -0,0 +1,134 @@
1
+ import type { ComponentProps } from "react";
2
+ import MarkdownPrimitive from "react-markdown";
3
+
4
+ import { omit } from "~/-utils";
5
+ import { Anchor } from "~/components/anchor";
6
+ import { Code } from "~/components/code";
7
+ import { Heading } from "~/components/heading";
8
+ import { Separator } from "~/components/separator";
9
+ import { Text } from "~/components/text";
10
+ import { View } from "~/components/view";
11
+
12
+ import styles from "./react-markdown.module.css";
13
+
14
+ export function Markdown({
15
+ components,
16
+ children,
17
+ ...props
18
+ }: ComponentProps<typeof MarkdownPrimitive> & { children: string }) {
19
+ return (
20
+ <MarkdownPrimitive
21
+ {...props}
22
+ components={{
23
+ h1: (props) => (
24
+ <Heading
25
+ {...omit(props, ["node"])}
26
+ level={1}
27
+ className={styles["react-markdown__h1"]}
28
+ />
29
+ ),
30
+ h2: (props) => (
31
+ <Heading
32
+ {...omit(props, ["node"])}
33
+ level={2}
34
+ className={styles["react-markdown__h2"]}
35
+ />
36
+ ),
37
+ h3: (props) => (
38
+ <Heading
39
+ {...omit(props, ["node"])}
40
+ level={3}
41
+ className={styles["react-markdown__h3"]}
42
+ />
43
+ ),
44
+ h4: (props) => (
45
+ <Heading
46
+ {...omit(props, ["node"])}
47
+ level={4}
48
+ className={styles["react-markdown__h4"]}
49
+ />
50
+ ),
51
+ h5: (props) => (
52
+ <Heading
53
+ {...omit(props, ["node"])}
54
+ level={5}
55
+ className={styles["react-markdown__h5"]}
56
+ />
57
+ ),
58
+ p: (props) => (
59
+ <Text
60
+ {...omit(props, ["node"])}
61
+ multiline
62
+ className={styles["react-markdown__p"]}
63
+ />
64
+ ),
65
+ hr: () => <Separator />,
66
+ ul: (props) => (
67
+ <ul
68
+ {...omit(props, ["node"])}
69
+ className={styles["react-markdown__ul"]}
70
+ />
71
+ ),
72
+ ol: (props) => (
73
+ <ul
74
+ {...omit(props, ["node"])}
75
+ className={styles["react-markdown__ol"]}
76
+ />
77
+ ),
78
+ li: (props) => (
79
+ <li
80
+ {...omit(props, ["node"])}
81
+ className={styles["react-markdown__li"]}
82
+ />
83
+ ),
84
+ a: ({ href, ...props }) => (
85
+ <Anchor
86
+ {...omit(props, ["node"])}
87
+ href={href}
88
+ {...(isExternal(href)
89
+ ? {
90
+ target: "_blank",
91
+ rel: "noreferrer",
92
+ }
93
+ : {})}
94
+ />
95
+ ),
96
+ code: ({ className, ...props }) => {
97
+ return (
98
+ <Code
99
+ className={styles["react-markdown__code"]}
100
+ {...omit(props, ["node"])}
101
+ language={getLanguage(className)}
102
+ />
103
+ );
104
+ },
105
+ img: ({ alt, ...props }) => (
106
+ <View className={styles["react-markdown__img-root"]}>
107
+ <img
108
+ {...omit(props, ["node"])}
109
+ alt={alt}
110
+ className={styles["react-markdown__img"]}
111
+ />
112
+ {alt ? (
113
+ <Text size="sm" color="dimmer" multiline>
114
+ {alt}
115
+ </Text>
116
+ ) : null}
117
+ </View>
118
+ ),
119
+ ...components,
120
+ }}
121
+ >
122
+ {children}
123
+ </MarkdownPrimitive>
124
+ );
125
+ }
126
+
127
+ function getLanguage(className: string = "") {
128
+ const language = (/language-(\w+)/.exec(className) || [])[0];
129
+ return language ? language.substring("language-".length) : "text";
130
+ }
131
+
132
+ function isExternal(href?: string) {
133
+ return href?.startsWith("https://");
134
+ }
@@ -0,0 +1,62 @@
1
+ .react-markdown {
2
+ display: flex;
3
+ flex-direction: column;
4
+ }
5
+
6
+ .react-markdown__h1,
7
+ .react-markdown__h2 {
8
+ margin-top: var(--space-24);
9
+ }
10
+
11
+ .react-markdown__h3,
12
+ .react-markdown__h4 {
13
+ margin-top: var(--space-16);
14
+ }
15
+
16
+ .react-markdown__h5,
17
+ .react-markdown__p,
18
+ .react-markdown__code {
19
+ margin-top: var(--space-8);
20
+ }
21
+
22
+ .react-markdown__ul {
23
+ margin-top: var(--space-8);
24
+ padding-left: var(--space-24);
25
+ list-style-type: disc;
26
+ }
27
+
28
+ .react-markdown__ol {
29
+ margin-top: var(--space-8);
30
+ padding-left: var(--space-24);
31
+ list-style-type: decimal;
32
+ }
33
+
34
+ .react-markdown__li {
35
+ vertical-align: middle;
36
+ }
37
+
38
+ /* stylelint-disable */
39
+ .react-markdown__li > ul,
40
+ .react-markdown__li > ol {
41
+ margin-top: 0;
42
+ }
43
+ /* stylelint-enable */
44
+
45
+ .react-markdown__img-root {
46
+ display: flex;
47
+ flex-direction: column;
48
+ justify-content: center;
49
+ align-items: center;
50
+ gap: var(--space-8);
51
+ margin-top: var(--space-8);
52
+ text-align: center;
53
+ }
54
+
55
+ .react-markdown__img {
56
+ border: 1px solid var(--surface-border-interactive);
57
+ border-radius: var(--border-radius-default);
58
+ background-color: var(--background-surface);
59
+ width: 100%;
60
+ height: auto;
61
+ overflow: hidden;
62
+ }