gbs-add-block 2.1.0 → 2.3.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 (129) hide show
  1. package/.gbs/skills/gbs-components/SKILL.md +190 -134
  2. package/.gbs/skills/gbs-components/references/install.md +25 -3
  3. package/.gbs/skills/gbs-components/references/styling.md +246 -207
  4. package/CHANGELOG.md +74 -0
  5. package/README.md +154 -23
  6. package/index.cjs +212 -3
  7. package/package.json +41 -10
  8. package/schema/passport-v1.schema.json +204 -0
  9. package/source/beta-components/accordion/passport.json +259 -0
  10. package/source/beta-components/accordion/styles.css +207 -208
  11. package/source/beta-components/alert/passport.json +250 -0
  12. package/source/beta-components/alert/styles.css +154 -155
  13. package/source/beta-components/avatar/passport.json +294 -0
  14. package/source/beta-components/avatar/styles.css +225 -226
  15. package/source/beta-components/badge/passport.json +332 -0
  16. package/source/beta-components/badge/styles.css +203 -204
  17. package/source/beta-components/breadcrumb/passport.json +243 -0
  18. package/source/beta-components/breadcrumb/styles.css +138 -140
  19. package/source/beta-components/button/passport.json +402 -0
  20. package/source/beta-components/button/passport.manual.json +31 -0
  21. package/source/beta-components/button/styles.css +232 -234
  22. package/source/beta-components/card/passport.json +337 -0
  23. package/source/beta-components/card/styles.css +230 -232
  24. package/source/beta-components/checkbox/passport.json +456 -0
  25. package/source/beta-components/checkbox/styles.css +211 -213
  26. package/source/beta-components/combobox/passport.json +456 -0
  27. package/source/beta-components/combobox/styles.css +419 -417
  28. package/source/beta-components/data-grid/agent/coerce.ts +368 -0
  29. package/source/beta-components/data-grid/agent/contract.ts +410 -0
  30. package/source/beta-components/data-grid/agent/dataset.ts +92 -0
  31. package/source/beta-components/data-grid/agent/engine.ts +470 -0
  32. package/source/beta-components/data-grid/agent/executors.ts +155 -0
  33. package/source/beta-components/data-grid/agent/index.ts +79 -0
  34. package/source/beta-components/data-grid/agent/intent.ts +324 -0
  35. package/source/beta-components/data-grid/agent/operations.ts +335 -0
  36. package/source/beta-components/data-grid/agent/validate.ts +630 -0
  37. package/source/beta-components/data-grid/agent/webmcp.ts +107 -0
  38. package/source/beta-components/data-grid/index.ts +14 -7
  39. package/source/beta-components/data-grid/passport.json +1051 -0
  40. package/source/beta-components/data-grid/passport.manual.json +255 -0
  41. package/source/beta-components/data-grid/react/AskGrid.tsx +164 -0
  42. package/source/beta-components/data-grid/react/DataGrid.tsx +39 -0
  43. package/source/beta-components/data-grid/styles.css +874 -716
  44. package/source/beta-components/date-picker/passport.json +407 -0
  45. package/source/beta-components/date-picker/styles.css +445 -446
  46. package/source/beta-components/dialog/passport.json +344 -0
  47. package/source/beta-components/dialog/styles.css +280 -279
  48. package/source/beta-components/file-uploader/passport.json +518 -0
  49. package/source/beta-components/file-uploader/styles.css +394 -396
  50. package/source/beta-components/input/passport.json +536 -0
  51. package/source/beta-components/input/styles.css +295 -297
  52. package/source/beta-components/menu/passport.json +322 -0
  53. package/source/beta-components/menu/styles.css +224 -223
  54. package/source/beta-components/modal/passport.json +289 -0
  55. package/source/beta-components/modal/styles.css +241 -240
  56. package/source/beta-components/number-input/passport.json +541 -0
  57. package/source/beta-components/number-input/styles.css +230 -231
  58. package/source/beta-components/popover/passport.json +238 -0
  59. package/source/beta-components/popover/styles.css +148 -147
  60. package/source/beta-components/progress/passport.json +270 -0
  61. package/source/beta-components/progress/styles.css +200 -201
  62. package/source/beta-components/radio-group/passport.json +477 -0
  63. package/source/beta-components/radio-group/styles.css +269 -270
  64. package/source/beta-components/shared/core/agent/adapter.ts +65 -0
  65. package/source/beta-components/shared/core/agent/history.ts +120 -0
  66. package/source/beta-components/shared/core/agent/index.ts +46 -0
  67. package/source/beta-components/shared/core/agent/numbers.ts +217 -0
  68. package/source/beta-components/shared/core/agent/schema.ts +180 -0
  69. package/source/beta-components/shared/core/agent/types.ts +169 -0
  70. package/source/beta-components/shared/core/agent/webmcp.ts +328 -0
  71. package/source/beta-components/shared/index.ts +9 -0
  72. package/source/beta-components/shared/react/GramproAIProvider.tsx +50 -0
  73. package/source/beta-components/shared/react/useAskAgent.ts +217 -0
  74. package/source/beta-components/shared/styles.css +79 -0
  75. package/source/beta-components/shared/version.json +4 -4
  76. package/source/beta-components/shared/version.ts +6 -6
  77. package/source/beta-components/skeleton/passport.json +251 -0
  78. package/source/beta-components/skeleton/styles.css +185 -187
  79. package/source/beta-components/spinner/passport.json +245 -0
  80. package/source/beta-components/spinner/styles.css +173 -174
  81. package/source/beta-components/switch/passport.json +421 -0
  82. package/source/beta-components/switch/styles.css +227 -229
  83. package/source/beta-components/tabs/passport.json +315 -0
  84. package/source/beta-components/tabs/styles.css +263 -264
  85. package/source/beta-components/textarea/passport.json +382 -0
  86. package/source/beta-components/textarea/styles.css +158 -160
  87. package/source/beta-components/toaster/passport.json +221 -0
  88. package/source/beta-components/toaster/styles.css +282 -282
  89. package/source/beta-components/tooltip/passport.json +170 -0
  90. package/source/beta-components/tooltip/styles.css +71 -73
  91. package/tools/env.cjs +61 -0
  92. package/tools/passport/cli.cjs +79 -0
  93. package/tools/passport/extract.cjs +493 -0
  94. package/tools/passport/index.cjs +185 -0
  95. package/tools/passport/merge.cjs +131 -0
  96. package/tools/passport/policy.cjs +65 -0
  97. package/tools/passport/validate.cjs +277 -0
  98. package/tools/ts-require.cjs +79 -0
  99. package/source/beta-components/accordion/__tests__/core.test.ts +0 -58
  100. package/source/beta-components/alert/__tests__/core.test.ts +0 -17
  101. package/source/beta-components/avatar/__tests__/core.test.ts +0 -88
  102. package/source/beta-components/badge/__tests__/core.test.ts +0 -46
  103. package/source/beta-components/breadcrumb/__tests__/core.test.ts +0 -58
  104. package/source/beta-components/button/__tests__/core.test.ts +0 -31
  105. package/source/beta-components/card/__tests__/core.test.ts +0 -57
  106. package/source/beta-components/checkbox/__tests__/core.test.ts +0 -40
  107. package/source/beta-components/combobox/__tests__/core.test.ts +0 -134
  108. package/source/beta-components/data-grid/__tests__/core.test.ts +0 -356
  109. package/source/beta-components/data-grid/__tests__/export.test.ts +0 -70
  110. package/source/beta-components/data-grid/__tests__/pdf.test.ts +0 -209
  111. package/source/beta-components/date-picker/__tests__/core.test.ts +0 -273
  112. package/source/beta-components/dialog/__tests__/core.test.ts +0 -86
  113. package/source/beta-components/file-uploader/__tests__/core.test.ts +0 -395
  114. package/source/beta-components/input/__tests__/core.test.ts +0 -75
  115. package/source/beta-components/menu/__tests__/core.test.ts +0 -120
  116. package/source/beta-components/modal/__tests__/core.test.ts +0 -55
  117. package/source/beta-components/number-input/__tests__/core.test.ts +0 -151
  118. package/source/beta-components/progress/__tests__/core.test.ts +0 -56
  119. package/source/beta-components/radio-group/__tests__/core.test.ts +0 -64
  120. package/source/beta-components/shared/__tests__/boundaries.test.ts +0 -95
  121. package/source/beta-components/shared/__tests__/core.test.ts +0 -55
  122. package/source/beta-components/shared/__tests__/position.test.ts +0 -143
  123. package/source/beta-components/skeleton/__tests__/core.test.ts +0 -41
  124. package/source/beta-components/spinner/__tests__/core.test.ts +0 -48
  125. package/source/beta-components/switch/__tests__/core.test.ts +0 -64
  126. package/source/beta-components/tabs/__tests__/core.test.ts +0 -51
  127. package/source/beta-components/textarea/__tests__/core.test.ts +0 -38
  128. package/source/beta-components/toaster/__tests__/core.test.ts +0 -256
  129. package/source/beta-components/tooltip/__tests__/core.test.ts +0 -42
@@ -1,282 +1,282 @@
1
- /*
2
- * Toaster styles.
3
- *
4
- * Tokens read the shared --gbs-* variables when they are set on an ancestor
5
- * (toasts render in a portal on <body>, so set them on :root) and fall back to
6
- * the same default palette otherwise. Rules live in the `components`
7
- * layer, so utility classes passed through `className` / `classNames` win.
8
- */
9
-
10
- @layer gbs {
11
- .ts-region {
12
- --ts-bg: var(--gbs-bg, var(--dg-bg, light-dark(#ffffff, #0b0b0e)));
13
- --ts-fg: var(--gbs-fg, var(--dg-fg, light-dark(#18181b, #f4f4f5)));
14
- --ts-muted: var(--gbs-muted, var(--dg-muted, light-dark(#71717a, #a1a1aa)));
15
- --ts-border: var(--gbs-border, var(--dg-border, light-dark(#e4e4e7, #27272a)));
16
- --ts-hover: var(--gbs-hover, var(--dg-hover, light-dark(#f4f4f5, #1f1f23)));
17
- --ts-accent: var(--gbs-accent, var(--dg-accent, light-dark(#2563eb, #60a5fa)));
18
- --ts-accent-fg: var(--gbs-accent-fg, var(--dg-accent-fg, light-dark(#ffffff, #0b1220)));
19
- --ts-focus: var(--gbs-focus, var(--dg-focus, light-dark(#2563eb, #60a5fa)));
20
- --ts-shadow: var(--gbs-shadow, var(--dg-shadow, 0 10px 30px -8px light-dark(rgb(0 0 0 / 0.18), rgb(0 0 0 / 0.6))));
21
- --ts-radius: var(--gbs-radius, var(--dg-radius, 8px));
22
- --ts-font-size: var(--gbs-font-size, var(--dg-font-size, 13px));
23
- --ts-success: var(--gbs-success, light-dark(#15803d, #4ade80));
24
- --ts-error: var(--gbs-danger, var(--dg-danger, light-dark(#dc2626, #f87171)));
25
- --ts-warning: var(--gbs-warning, light-dark(#d97706, #fbbf24));
26
- --ts-info: var(--gbs-info, var(--gbs-accent, var(--dg-accent, light-dark(#2563eb, #60a5fa))));
27
- --ts-width: 356px;
28
- --ts-offset: 16px;
29
- --ts-gap: 8px;
30
- --ts-z-index: 2147483000;
31
-
32
- color-scheme: inherit;
33
- position: fixed;
34
- z-index: var(--ts-z-index);
35
- width: var(--ts-width);
36
- max-width: calc(100vw - 2 * var(--ts-offset));
37
- font-size: var(--ts-font-size);
38
- line-height: 1.4;
39
- color: var(--ts-fg);
40
- /* The region spans the stack; only the toasts themselves take clicks. */
41
- pointer-events: none;
42
- }
43
-
44
- :where(.dark, [data-theme="dark"]) .ts-region {
45
- color-scheme: dark;
46
- }
47
- :where(.light, [data-theme="light"]) .ts-region {
48
- color-scheme: light;
49
- }
50
-
51
- :where(.ts-region) *,
52
- :where(.ts-region) *::before,
53
- :where(.ts-region) *::after {
54
- box-sizing: border-box;
55
- }
56
-
57
- /* ------------------------------------------------------------ placement */
58
-
59
- .ts-region[data-position^="top"] {
60
- top: var(--ts-offset);
61
- --ts-enter-y: -8px;
62
- }
63
- .ts-region[data-position^="bottom"] {
64
- bottom: var(--ts-offset);
65
- --ts-enter-y: 8px;
66
- }
67
- .ts-region[data-position$="left"] {
68
- left: var(--ts-offset);
69
- }
70
- .ts-region[data-position$="right"] {
71
- right: var(--ts-offset);
72
- }
73
- .ts-region[data-position$="center"] {
74
- left: 50%;
75
- translate: -50% 0;
76
- }
77
-
78
- @media (max-width: 600px) {
79
- .ts-region {
80
- right: var(--ts-offset);
81
- left: var(--ts-offset);
82
- width: auto;
83
- max-width: none;
84
- translate: none;
85
- }
86
- }
87
-
88
- .ts-list {
89
- display: flex;
90
- flex-direction: column;
91
- gap: var(--ts-gap);
92
- margin: 0;
93
- padding: 0;
94
- list-style: none;
95
- outline: none;
96
- }
97
- /* Newest toast sits nearest the screen edge. */
98
- .ts-region[data-position^="bottom"] .ts-list {
99
- flex-direction: column-reverse;
100
- }
101
- .ts-list:focus-visible {
102
- outline: 2px solid var(--ts-focus);
103
- outline-offset: 4px;
104
- border-radius: var(--ts-radius);
105
- }
106
-
107
- /* --------------------------------------------------------------- toast */
108
-
109
- .ts-toast {
110
- --ts-type-color: transparent;
111
-
112
- position: relative;
113
- display: flex;
114
- align-items: flex-start;
115
- gap: 10px;
116
- width: 100%;
117
- padding-block: 12px;
118
- padding-inline: 14px 10px;
119
- overflow: hidden;
120
- border: 1px solid var(--ts-border);
121
- border-radius: var(--ts-radius);
122
- background: var(--ts-bg);
123
- color: var(--ts-fg);
124
- box-shadow: var(--ts-shadow);
125
- pointer-events: auto;
126
- outline: none;
127
- touch-action: pan-y;
128
- opacity: 1;
129
- translate: var(--ts-swipe, 0px) 0;
130
- transition:
131
- opacity 200ms ease,
132
- translate 200ms ease;
133
- }
134
- @starting-style {
135
- .ts-toast {
136
- opacity: 0;
137
- translate: 0 var(--ts-enter-y, 8px);
138
- }
139
- }
140
- .ts-toast[data-swiping] {
141
- transition: none;
142
- cursor: grabbing;
143
- }
144
- .ts-toast[data-state="closing"] {
145
- opacity: 0;
146
- pointer-events: none;
147
- }
148
- .ts-toast:focus-visible {
149
- outline: 2px solid var(--ts-focus);
150
- outline-offset: -2px;
151
- }
152
-
153
- /* A thin bar on the reading-start edge carries the type's color. */
154
- .ts-toast::before {
155
- content: "";
156
- position: absolute;
157
- inset-block: 0;
158
- inset-inline-start: 0;
159
- width: 3px;
160
- background: var(--ts-type-color);
161
- }
162
- .ts-toast[data-type="success"] {
163
- --ts-type-color: var(--ts-success);
164
- }
165
- .ts-toast[data-type="error"] {
166
- --ts-type-color: var(--ts-error);
167
- }
168
- .ts-toast[data-type="warning"] {
169
- --ts-type-color: var(--ts-warning);
170
- }
171
- .ts-toast[data-type="info"] {
172
- --ts-type-color: var(--ts-info);
173
- }
174
-
175
- .ts-icon {
176
- display: inline-grid;
177
- flex: none;
178
- place-items: center;
179
- margin-top: 1px;
180
- color: var(--ts-type-color);
181
- }
182
- .ts-toast:is([data-type="default"], [data-type="loading"]) .ts-icon {
183
- color: var(--ts-muted);
184
- }
185
-
186
- .ts-content {
187
- flex: 1 1 auto;
188
- min-width: 0;
189
- overflow-wrap: anywhere;
190
- }
191
- .ts-title {
192
- font-weight: 600;
193
- }
194
- .ts-description {
195
- margin-top: 2px;
196
- color: var(--ts-muted);
197
- }
198
-
199
- .ts-actions {
200
- display: flex;
201
- flex: none;
202
- align-items: center;
203
- align-self: center;
204
- gap: 6px;
205
- }
206
- .ts-button {
207
- height: 28px;
208
- padding: 0 10px;
209
- border: 1px solid var(--ts-border);
210
- border-radius: 6px;
211
- background: var(--ts-bg);
212
- color: inherit;
213
- font: inherit;
214
- font-weight: 500;
215
- white-space: nowrap;
216
- cursor: pointer;
217
- }
218
- .ts-button:hover {
219
- background: var(--ts-hover);
220
- }
221
- .ts-button[data-variant="action"] {
222
- border-color: var(--ts-accent);
223
- background: var(--ts-accent);
224
- color: var(--ts-accent-fg);
225
- }
226
- .ts-button[data-variant="action"]:hover {
227
- background: color-mix(in oklab, var(--ts-accent), var(--ts-fg) 12%);
228
- }
229
- .ts-button:focus-visible {
230
- outline: 2px solid var(--ts-focus);
231
- outline-offset: 1px;
232
- }
233
-
234
- .ts-close {
235
- display: inline-grid;
236
- flex: none;
237
- place-items: center;
238
- width: 22px;
239
- height: 22px;
240
- padding: 0;
241
- border: 0;
242
- border-radius: 4px;
243
- background: transparent;
244
- color: var(--ts-muted);
245
- cursor: pointer;
246
- }
247
- .ts-close:hover {
248
- background: var(--ts-hover);
249
- color: var(--ts-fg);
250
- }
251
- .ts-close:focus-visible {
252
- outline: 2px solid var(--ts-focus);
253
- outline-offset: 1px;
254
- }
255
-
256
- .ts-spinner {
257
- animation: ts-spin 0.7s linear infinite;
258
- }
259
- @keyframes ts-spin {
260
- to {
261
- transform: rotate(360deg);
262
- }
263
- }
264
-
265
- @media (prefers-reduced-motion: reduce) {
266
- .ts-toast {
267
- transition: none;
268
- }
269
- .ts-spinner {
270
- animation-duration: 2s;
271
- }
272
- }
273
-
274
- @media (forced-colors: active) {
275
- .ts-toast {
276
- border-color: CanvasText;
277
- }
278
- .ts-toast::before {
279
- background: Highlight;
280
- }
281
- }
282
- }
1
+ /*
2
+ * Toaster styles.
3
+ *
4
+ * Tokens read the shared --gbs-* variables when they are set on an ancestor
5
+ * (toasts render in a portal on <body>, so set them on :root) and fall back to
6
+ * the same default palette otherwise. Rules are unlayered: they beat a
7
+ * framework reset on specificity, and lose to anything you pass through
8
+ * `className`. With Tailwind v4, import this file after the framework and
9
+ * inside its components layer - see the README.
10
+ */
11
+
12
+ .ts-region {
13
+ --ts-bg: var(--gbs-bg, var(--dg-bg, light-dark(#ffffff, #0b0b0e)));
14
+ --ts-fg: var(--gbs-fg, var(--dg-fg, light-dark(#18181b, #f4f4f5)));
15
+ --ts-muted: var(--gbs-muted, var(--dg-muted, light-dark(#71717a, #a1a1aa)));
16
+ --ts-border: var(--gbs-border, var(--dg-border, light-dark(#e4e4e7, #27272a)));
17
+ --ts-hover: var(--gbs-hover, var(--dg-hover, light-dark(#f4f4f5, #1f1f23)));
18
+ --ts-accent: var(--gbs-accent, var(--dg-accent, light-dark(#2563eb, #60a5fa)));
19
+ --ts-accent-fg: var(--gbs-accent-fg, var(--dg-accent-fg, light-dark(#ffffff, #0b1220)));
20
+ --ts-focus: var(--gbs-focus, var(--dg-focus, light-dark(#2563eb, #60a5fa)));
21
+ --ts-shadow: var(--gbs-shadow, var(--dg-shadow, 0 10px 30px -8px light-dark(rgb(0 0 0 / 0.18), rgb(0 0 0 / 0.6))));
22
+ --ts-radius: var(--gbs-radius, var(--dg-radius, 8px));
23
+ --ts-font-size: var(--gbs-font-size, var(--dg-font-size, 13px));
24
+ --ts-success: var(--gbs-success, light-dark(#15803d, #4ade80));
25
+ --ts-error: var(--gbs-danger, var(--dg-danger, light-dark(#dc2626, #f87171)));
26
+ --ts-warning: var(--gbs-warning, light-dark(#d97706, #fbbf24));
27
+ --ts-info: var(--gbs-info, var(--gbs-accent, var(--dg-accent, light-dark(#2563eb, #60a5fa))));
28
+ --ts-width: 356px;
29
+ --ts-offset: 16px;
30
+ --ts-gap: 8px;
31
+ --ts-z-index: 2147483000;
32
+
33
+ color-scheme: inherit;
34
+ position: fixed;
35
+ z-index: var(--ts-z-index);
36
+ width: var(--ts-width);
37
+ max-width: calc(100vw - 2 * var(--ts-offset));
38
+ font-size: var(--ts-font-size);
39
+ line-height: 1.4;
40
+ color: var(--ts-fg);
41
+ /* The region spans the stack; only the toasts themselves take clicks. */
42
+ pointer-events: none;
43
+ }
44
+
45
+ :where(.dark, [data-theme="dark"]) .ts-region {
46
+ color-scheme: dark;
47
+ }
48
+ :where(.light, [data-theme="light"]) .ts-region {
49
+ color-scheme: light;
50
+ }
51
+
52
+ :where(.ts-region) *,
53
+ :where(.ts-region) *::before,
54
+ :where(.ts-region) *::after {
55
+ box-sizing: border-box;
56
+ }
57
+
58
+ /* ------------------------------------------------------------ placement */
59
+
60
+ .ts-region[data-position^="top"] {
61
+ top: var(--ts-offset);
62
+ --ts-enter-y: -8px;
63
+ }
64
+ .ts-region[data-position^="bottom"] {
65
+ bottom: var(--ts-offset);
66
+ --ts-enter-y: 8px;
67
+ }
68
+ .ts-region[data-position$="left"] {
69
+ left: var(--ts-offset);
70
+ }
71
+ .ts-region[data-position$="right"] {
72
+ right: var(--ts-offset);
73
+ }
74
+ .ts-region[data-position$="center"] {
75
+ left: 50%;
76
+ translate: -50% 0;
77
+ }
78
+
79
+ @media (max-width: 600px) {
80
+ .ts-region {
81
+ right: var(--ts-offset);
82
+ left: var(--ts-offset);
83
+ width: auto;
84
+ max-width: none;
85
+ translate: none;
86
+ }
87
+ }
88
+
89
+ .ts-list {
90
+ display: flex;
91
+ flex-direction: column;
92
+ gap: var(--ts-gap);
93
+ margin: 0;
94
+ padding: 0;
95
+ list-style: none;
96
+ outline: none;
97
+ }
98
+ /* Newest toast sits nearest the screen edge. */
99
+ .ts-region[data-position^="bottom"] .ts-list {
100
+ flex-direction: column-reverse;
101
+ }
102
+ .ts-list:focus-visible {
103
+ outline: 2px solid var(--ts-focus);
104
+ outline-offset: 4px;
105
+ border-radius: var(--ts-radius);
106
+ }
107
+
108
+ /* --------------------------------------------------------------- toast */
109
+
110
+ .ts-toast {
111
+ --ts-type-color: transparent;
112
+
113
+ position: relative;
114
+ display: flex;
115
+ align-items: flex-start;
116
+ gap: 10px;
117
+ width: 100%;
118
+ padding-block: 12px;
119
+ padding-inline: 14px 10px;
120
+ overflow: hidden;
121
+ border: 1px solid var(--ts-border);
122
+ border-radius: var(--ts-radius);
123
+ background: var(--ts-bg);
124
+ color: var(--ts-fg);
125
+ box-shadow: var(--ts-shadow);
126
+ pointer-events: auto;
127
+ outline: none;
128
+ touch-action: pan-y;
129
+ opacity: 1;
130
+ translate: var(--ts-swipe, 0px) 0;
131
+ transition:
132
+ opacity 200ms ease,
133
+ translate 200ms ease;
134
+ }
135
+ @starting-style {
136
+ .ts-toast {
137
+ opacity: 0;
138
+ translate: 0 var(--ts-enter-y, 8px);
139
+ }
140
+ }
141
+ .ts-toast[data-swiping] {
142
+ transition: none;
143
+ cursor: grabbing;
144
+ }
145
+ .ts-toast[data-state="closing"] {
146
+ opacity: 0;
147
+ pointer-events: none;
148
+ }
149
+ .ts-toast:focus-visible {
150
+ outline: 2px solid var(--ts-focus);
151
+ outline-offset: -2px;
152
+ }
153
+
154
+ /* A thin bar on the reading-start edge carries the type's color. */
155
+ .ts-toast::before {
156
+ content: "";
157
+ position: absolute;
158
+ inset-block: 0;
159
+ inset-inline-start: 0;
160
+ width: 3px;
161
+ background: var(--ts-type-color);
162
+ }
163
+ .ts-toast[data-type="success"] {
164
+ --ts-type-color: var(--ts-success);
165
+ }
166
+ .ts-toast[data-type="error"] {
167
+ --ts-type-color: var(--ts-error);
168
+ }
169
+ .ts-toast[data-type="warning"] {
170
+ --ts-type-color: var(--ts-warning);
171
+ }
172
+ .ts-toast[data-type="info"] {
173
+ --ts-type-color: var(--ts-info);
174
+ }
175
+
176
+ .ts-icon {
177
+ display: inline-grid;
178
+ flex: none;
179
+ place-items: center;
180
+ margin-top: 1px;
181
+ color: var(--ts-type-color);
182
+ }
183
+ .ts-toast:is([data-type="default"], [data-type="loading"]) .ts-icon {
184
+ color: var(--ts-muted);
185
+ }
186
+
187
+ .ts-content {
188
+ flex: 1 1 auto;
189
+ min-width: 0;
190
+ overflow-wrap: anywhere;
191
+ }
192
+ .ts-title {
193
+ font-weight: 600;
194
+ }
195
+ .ts-description {
196
+ margin-top: 2px;
197
+ color: var(--ts-muted);
198
+ }
199
+
200
+ .ts-actions {
201
+ display: flex;
202
+ flex: none;
203
+ align-items: center;
204
+ align-self: center;
205
+ gap: 6px;
206
+ }
207
+ .ts-button {
208
+ height: 28px;
209
+ padding: 0 10px;
210
+ border: 1px solid var(--ts-border);
211
+ border-radius: 6px;
212
+ background: var(--ts-bg);
213
+ color: inherit;
214
+ font: inherit;
215
+ font-weight: 500;
216
+ white-space: nowrap;
217
+ cursor: pointer;
218
+ }
219
+ .ts-button:hover {
220
+ background: var(--ts-hover);
221
+ }
222
+ .ts-button[data-variant="action"] {
223
+ border-color: var(--ts-accent);
224
+ background: var(--ts-accent);
225
+ color: var(--ts-accent-fg);
226
+ }
227
+ .ts-button[data-variant="action"]:hover {
228
+ background: color-mix(in oklab, var(--ts-accent), var(--ts-fg) 12%);
229
+ }
230
+ .ts-button:focus-visible {
231
+ outline: 2px solid var(--ts-focus);
232
+ outline-offset: 1px;
233
+ }
234
+
235
+ .ts-close {
236
+ display: inline-grid;
237
+ flex: none;
238
+ place-items: center;
239
+ width: 22px;
240
+ height: 22px;
241
+ padding: 0;
242
+ border: 0;
243
+ border-radius: 4px;
244
+ background: transparent;
245
+ color: var(--ts-muted);
246
+ cursor: pointer;
247
+ }
248
+ .ts-close:hover {
249
+ background: var(--ts-hover);
250
+ color: var(--ts-fg);
251
+ }
252
+ .ts-close:focus-visible {
253
+ outline: 2px solid var(--ts-focus);
254
+ outline-offset: 1px;
255
+ }
256
+
257
+ .ts-spinner {
258
+ animation: ts-spin 0.7s linear infinite;
259
+ }
260
+ @keyframes ts-spin {
261
+ to {
262
+ transform: rotate(360deg);
263
+ }
264
+ }
265
+
266
+ @media (prefers-reduced-motion: reduce) {
267
+ .ts-toast {
268
+ transition: none;
269
+ }
270
+ .ts-spinner {
271
+ animation-duration: 2s;
272
+ }
273
+ }
274
+
275
+ @media (forced-colors: active) {
276
+ .ts-toast {
277
+ border-color: CanvasText;
278
+ }
279
+ .ts-toast::before {
280
+ background: Highlight;
281
+ }
282
+ }