gbs-add-block 2.0.4 → 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 -201
  4. package/CHANGELOG.md +74 -0
  5. package/README.md +157 -11
  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 +201 -203
  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 -139
  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 -233
  22. package/source/beta-components/card/passport.json +337 -0
  23. package/source/beta-components/card/styles.css +230 -231
  24. package/source/beta-components/checkbox/passport.json +456 -0
  25. package/source/beta-components/checkbox/styles.css +211 -212
  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 -717
  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 -278
  48. package/source/beta-components/file-uploader/passport.json +518 -0
  49. package/source/beta-components/file-uploader/styles.css +394 -395
  50. package/source/beta-components/input/passport.json +536 -0
  51. package/source/beta-components/input/styles.css +295 -296
  52. package/source/beta-components/menu/passport.json +322 -0
  53. package/source/beta-components/menu/styles.css +224 -222
  54. package/source/beta-components/modal/passport.json +289 -0
  55. package/source/beta-components/modal/styles.css +241 -239
  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 -146
  60. package/source/beta-components/progress/passport.json +270 -0
  61. package/source/beta-components/progress/styles.css +200 -202
  62. package/source/beta-components/radio-group/passport.json +477 -0
  63. package/source/beta-components/radio-group/styles.css +241 -242
  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 -186
  79. package/source/beta-components/spinner/passport.json +245 -0
  80. package/source/beta-components/spinner/styles.css +145 -146
  81. package/source/beta-components/switch/passport.json +421 -0
  82. package/source/beta-components/switch/styles.css +194 -196
  83. package/source/beta-components/tabs/passport.json +315 -0
  84. package/source/beta-components/tabs/styles.css +234 -235
  85. package/source/beta-components/textarea/passport.json +382 -0
  86. package/source/beta-components/textarea/styles.css +158 -159
  87. package/source/beta-components/toaster/passport.json +221 -0
  88. package/source/beta-components/toaster/styles.css +282 -283
  89. package/source/beta-components/tooltip/passport.json +170 -0
  90. package/source/beta-components/tooltip/styles.css +71 -72
  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,283 +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
- @layer theme, base, components, utilities;
10
-
11
- @layer components {
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
- }
283
- }
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
+ }