intelligent-system-design-language 0.3.22 → 0.3.24

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 (106) hide show
  1. package/.claude/agents/langium-language-designer.md +38 -38
  2. package/.claude/agents/typescript-vscode-expert.md +29 -29
  3. package/.claude/agents/ui-ux-designer.md +36 -36
  4. package/.claude/settings.local.json +33 -33
  5. package/.idea/inspectionProfiles/Project_Default.xml +6 -6
  6. package/.idea/isdl.iml +13 -13
  7. package/.idea/modules.xml +8 -8
  8. package/.idea/vcs.xml +6 -6
  9. package/.idea/watcherTasks.xml +3 -3
  10. package/.vscodeignore +18 -18
  11. package/LICENSE +673 -673
  12. package/README.md +86 -86
  13. package/bin/cli.js +4 -4
  14. package/bin/lsp.js +8 -8
  15. package/out/_backgrounds.scss +91 -91
  16. package/out/_handlebars.scss +497 -497
  17. package/out/_isdlStyles.scss +1444 -1444
  18. package/out/_vuetifyOverrides.scss +425 -425
  19. package/out/_vuetifyStyles.scss +31957 -31957
  20. package/out/cli/components/_backgrounds.scss +91 -91
  21. package/out/cli/components/_handlebars.scss +497 -497
  22. package/out/cli/components/_isdlStyles.scss +1444 -1444
  23. package/out/cli/components/_vuetifyOverrides.scss +425 -425
  24. package/out/cli/components/_vuetifyStyles.scss +31957 -31957
  25. package/out/cli/components/active-effect-sheet-generator.js +453 -453
  26. package/out/cli/components/chat-card-generator.js +654 -654
  27. package/out/cli/components/css-generator.js +4 -4
  28. package/out/cli/components/damage-roll-generator.js +160 -160
  29. package/out/cli/components/datamodel-generator.js +257 -257
  30. package/out/cli/components/derived-data-generator.js +923 -923
  31. package/out/cli/components/hotbar-drop-hook-generator.js +82 -82
  32. package/out/cli/components/init-hook-generator.js +495 -495
  33. package/out/cli/components/language-generator.js +1 -1
  34. package/out/cli/components/language-generator.js.map +1 -1
  35. package/out/cli/components/measured-template-preview.js +221 -221
  36. package/out/cli/components/method-generator.js +601 -562
  37. package/out/cli/components/method-generator.js.map +1 -1
  38. package/out/cli/components/ready-hook-generator.js +404 -404
  39. package/out/cli/components/token-generator.js +116 -116
  40. package/out/cli/components/vue/base-components/vue-attribute.js +138 -138
  41. package/out/cli/components/vue/base-components/vue-boolean.js +64 -64
  42. package/out/cli/components/vue/base-components/vue-calculator.js +93 -93
  43. package/out/cli/components/vue/base-components/vue-damage-application.js +356 -356
  44. package/out/cli/components/vue/base-components/vue-damage-bonuses.js +165 -165
  45. package/out/cli/components/vue/base-components/vue-damage-resistances.js +196 -196
  46. package/out/cli/components/vue/base-components/vue-damage-track.js +121 -121
  47. package/out/cli/components/vue/base-components/vue-date-time.js +42 -42
  48. package/out/cli/components/vue/base-components/vue-dice.js +98 -98
  49. package/out/cli/components/vue/base-components/vue-die.js +73 -73
  50. package/out/cli/components/vue/base-components/vue-document-choice.js +149 -149
  51. package/out/cli/components/vue/base-components/vue-document-choices.js +179 -179
  52. package/out/cli/components/vue/base-components/vue-document-link.js +60 -60
  53. package/out/cli/components/vue/base-components/vue-extended-choice.js +88 -88
  54. package/out/cli/components/vue/base-components/vue-inventory.js +519 -519
  55. package/out/cli/components/vue/base-components/vue-macro-choice.js +138 -138
  56. package/out/cli/components/vue/base-components/vue-measured-template.js +530 -530
  57. package/out/cli/components/vue/base-components/vue-money.js +483 -483
  58. package/out/cli/components/vue/base-components/vue-number.js +174 -174
  59. package/out/cli/components/vue/base-components/vue-paperdoll.js +43 -43
  60. package/out/cli/components/vue/base-components/vue-parent-property-reference.js +76 -76
  61. package/out/cli/components/vue/base-components/vue-prosemirror.js +18 -18
  62. package/out/cli/components/vue/base-components/vue-resource.js +136 -136
  63. package/out/cli/components/vue/base-components/vue-roll-visualizer.js +285 -285
  64. package/out/cli/components/vue/base-components/vue-self-property-reference.js +62 -62
  65. package/out/cli/components/vue/base-components/vue-string-choice.js +98 -98
  66. package/out/cli/components/vue/base-components/vue-string-choices.js +203 -203
  67. package/out/cli/components/vue/base-components/vue-string.js +60 -60
  68. package/out/cli/components/vue/base-components/vue-text-field.js +53 -53
  69. package/out/cli/components/vue/base-components/vue-tracker.js +431 -431
  70. package/out/cli/components/vue/vue-action-component-generator.js +64 -64
  71. package/out/cli/components/vue/vue-active-effect-sheet-generator.js +856 -856
  72. package/out/cli/components/vue/vue-datatable-sheet-class-generator.js +292 -292
  73. package/out/cli/components/vue/vue-datatable2-component-generator.js +824 -824
  74. package/out/cli/components/vue/vue-document-creation-app.js +121 -121
  75. package/out/cli/components/vue/vue-document-creation-sheet.js +94 -94
  76. package/out/cli/components/vue/vue-generator.js +40 -40
  77. package/out/cli/components/vue/vue-mixin.js +296 -296
  78. package/out/cli/components/vue/vue-pinned-datatable-component-generator.js +260 -260
  79. package/out/cli/components/vue/vue-prompt-generator.js +80 -80
  80. package/out/cli/components/vue/vue-prompt-sheet-class-generator.js +317 -317
  81. package/out/cli/components/vue/vue-sheet-application-generator.js +1171 -1171
  82. package/out/cli/components/vue/vue-sheet-class-generator.js +510 -510
  83. package/out/cli/generator.js +508 -438
  84. package/out/cli/generator.js.map +1 -1
  85. package/out/extension/github/githubManager.js +35 -35
  86. package/out/extension/github/githubQuickActions.js +120 -120
  87. package/out/extension/github/system-workflow.yml +47 -47
  88. package/out/extension/main.cjs +881 -311
  89. package/out/extension/main.cjs.map +3 -3
  90. package/out/extension/package.json +419 -419
  91. package/out/language/generated/ast.js +98 -2
  92. package/out/language/generated/ast.js.map +1 -1
  93. package/out/language/generated/grammar.js +14688 -14240
  94. package/out/language/generated/grammar.js.map +1 -1
  95. package/out/language/intelligent-system-design-language-validator.js +44 -2
  96. package/out/language/intelligent-system-design-language-validator.js.map +1 -1
  97. package/out/language/isdl-scope-provider.js +7 -1
  98. package/out/language/isdl-scope-provider.js.map +1 -1
  99. package/out/language/main.cjs +881 -311
  100. package/out/language/main.cjs.map +3 -3
  101. package/out/package.json +419 -419
  102. package/out/progressbar.min.js +6 -6
  103. package/out/styles.scss +828 -762
  104. package/out/test/validating/diagnostics.test.js +55 -0
  105. package/out/test/validating/diagnostics.test.js.map +1 -1
  106. package/package.json +419 -419
package/out/styles.scss CHANGED
@@ -1,763 +1,829 @@
1
- @use "./backgrounds";
2
- @use "./handlebars";
3
- @use "./vuetifyStyles";
4
- @use "./vuetifyOverrides";
5
- @use "./isdlStyles";
6
-
7
- /* -------------------------------------------- */
8
- /* Vuetify Overrides */
9
- /* -------------------------------------------- */
10
-
11
- .#{$dynamic-id}.vue-application {
12
-
13
- html {
14
- overflow-x: hidden;
15
- overflow-y: scroll;
16
- }
17
- }
18
-
19
- /* -------------------------------------------- */
20
- /* System Stylesheet */
21
- /* -------------------------------------------- */
22
-
23
- .#{$dynamic-id}.handlebars-sheet {
24
- @include handlebars.handlebarsSheet;
25
- }
26
-
27
- .v-overlay-container {
28
- @include vuetifyStyles.vuetifyStyles;
29
- @include vuetifyOverrides.vuetifyOverrides;
30
-
31
- --v-theme-overlay-multiplier: 1;
32
- --v-disabled-opacity: 0.7;
33
- }
34
-
35
- // Copy of Foundry app styles for vue apps
36
- .#{$dynamic-id}.vue-application {
37
-
38
- --color-text-primary: var(--color-light-2);
39
- --color-header-background: rgba(0, 0, 0, 0.5);
40
- --color-border: var(--color-cool-4);
41
- --color-fieldset-border: var(--color-light-6);
42
- --color-form-hint: var(--color-light-5);
43
- --color-form-hint-hover: var(--color-light-4);
44
- --color-form-label: var(--color-light-4);
45
- --color-form-label-hover: var(--color-light-2);
46
- --color-select-option-bg: transparent;
47
- --v-theme-overlay-multiplier: 1;
48
- --v-disabled-opacity: 0.7;
49
-
50
-
51
- .window-content {
52
- @include vuetifyStyles.vuetifyStyles;
53
- @include vuetifyOverrides.vuetifyOverrides;
54
-
55
- --color-text-primary: var(--color-light-2);
56
- --color-header-background: rgba(0, 0, 0, 0.5);
57
- --color-border: var(--color-cool-4);
58
- --color-fieldset-border: var(--color-light-6);
59
- --color-form-hint: var(--color-light-5);
60
- --color-form-hint-hover: var(--color-light-4);
61
- --color-form-label: var(--color-light-4);
62
- --color-form-label-hover: var(--color-light-2);
63
- --color-select-option-bg: transparent;
64
- --v-theme-overlay-multiplier: 1;
65
- --v-disabled-opacity: 0.7;
66
-
67
- overflow-y: scroll;
68
-
69
- input[type="text"]:focus,
70
- input[type="number"]:focus,
71
- input[type="password"]:focus,
72
- input[type="date"]:focus,
73
- input[type="time"]:focus,
74
- input[type="search"]:focus {
75
- box-shadow: none;
76
- }
77
-
78
- .v-application {
79
- @include isdlStyles.isdlStyles;
80
- }
81
- }
82
-
83
- &.document-creation {
84
-
85
- .window-content {
86
- overflow: hidden;
87
- }
88
-
89
- // With the window sized to content (height: auto), neutralize Vuetify's 100vh
90
- // min-heights so the layout collapses to the form instead of leaving dark space.
91
- .v-application__wrap {
92
- min-height: unset;
93
- }
94
-
95
- .v-main {
96
- flex: 1 1 auto;
97
- min-height: 0;
98
- }
99
-
100
- .v-container {
101
- padding: 1rem;
102
- }
103
- }
104
-
105
- &.isdl-prompt {
106
-
107
- // Cap prompt windows at 80% of the viewport (overrides the base max-height: 100%).
108
- max-height: 80vh;
109
-
110
- // When a prompt exceeds the cap, scroll the content. We scroll at .window-content
111
- // rather than an inner field-list scroller because the window is height:auto and
112
- // max-height is NOT a definite height, so a percentage/flex height cascade can't
113
- // bound an inner scroller. window-content has a real used height, so it scrolls
114
- // reliably; the Submit/Cancel footer stays visible via position: sticky.
115
- .window-content {
116
- overflow-y: auto;
117
- overflow-x: hidden;
118
- }
119
-
120
- .isdl-prompt-footer {
121
- position: sticky;
122
- bottom: 0;
123
- z-index: 2;
124
- background: rgb(var(--v-theme-surface));
125
- border-top: 1px solid rgba(0, 0, 0, 0.12);
126
- }
127
-
128
- .v-application__wrap {
129
- min-height: unset;
130
- }
131
-
132
- .v-main {
133
- flex: 1 1 auto;
134
- min-height: 0;
135
- }
136
- }
137
-
138
- &.active-effect {
139
- .v-col {
140
- padding: 0;
141
- }
142
-
143
- .v-card {
144
- padding: 0.25rem;
145
-
146
- > .v-card-title {
147
- padding-top: 0;
148
- padding-bottom: 0;
149
- }
150
- }
151
-
152
- .v-autocomplete__selection {
153
- .v-chip__close {
154
- border: none;
155
- background: none;
156
- }
157
- }
158
-
159
- }
160
-
161
- position: absolute;
162
- z-index: var(--z-index-window);
163
- transform-origin: top left;
164
- display: flex;
165
- flex-direction: column;
166
- flex-wrap: nowrap;
167
- min-width: 200px;
168
- max-height: 100%;
169
- max-width: 100%;
170
- overflow: hidden;
171
- background: var(--background);
172
- font-size: var(--font-size-14);
173
- color: var(--color-text-primary);
174
- border: 1px solid var(--color-border);
175
- border-radius: 6px;
176
- box-shadow: 0 0 10px #000;
177
-
178
- > .window-resize-handle {
179
- position: absolute;
180
- inset: auto 0px 0px auto;
181
- width: 11px;
182
- height: 11px;
183
- cursor: nwse-resize;
184
- background: transparent url(/ui/resize-handle.webp) no-repeat center / contain;
185
- }
186
-
187
- > .window-header {
188
- --button-size: 24px;
189
- display: flex;
190
- flex-wrap: nowrap;
191
- align-items: center;
192
- flex: 0 0 var(--header-height);
193
- position: relative;
194
- overflow: hidden;
195
- padding: 0 0.5rem;
196
- gap: 0.25rem;
197
- z-index: 1;
198
- cursor: grab;
199
- background: var(--color-cool-5-90);
200
- font-size: var(--font-size-13);
201
- color: var(--color-light-1);
202
- border-bottom: 1px solid var(--color-border);
203
- font: unset;
204
-
205
- > .window-title {
206
- flex: 1;
207
- font-size: inherit;
208
- font-family: inherit;
209
- font-weight: inherit;
210
- text-shadow: none;
211
- margin: 0;
212
- line-height: var(--header-height);
213
- border: none;
214
- overflow: hidden;
215
- text-align: left;
216
- white-space: nowrap;
217
- text-overflow: ellipsis;
218
- }
219
-
220
- > .header-control {
221
- flex: 0 0 var(--button-size);
222
- height: var(--button-size);
223
- padding: 0;
224
- margin: 0;
225
- border: none;
226
- color: var(--color-light-text-heading);
227
- background: none;
228
- }
229
- }
230
-
231
- > .controls-dropdown {
232
- position: absolute;
233
- overflow: hidden auto;
234
- top: var(--header-height);
235
- right: 0;
236
- width: max-content;
237
- min-width: 100px;
238
- max-width: 300px;
239
- max-height: 0;
240
- z-index: 1;
241
- list-style: none;
242
- margin: 0 0.25rem;
243
- padding: 0;
244
- background: var(--background);
245
- border-radius: 0 0 4px 4px;
246
- transition: max-height 0.5s;
247
- pointer-events: none;
248
-
249
- > .header-control {
250
- margin: 0.25rem;
251
-
252
- > button {
253
- --button-background-color: none;
254
- --button-text-color: var(--color-text-primary);
255
- width: 100%;
256
- display: flex;
257
- justify-content: space-between;
258
- border: none;
259
- font-size: var(--font-size-12);
260
- color: var(--button-text-color);
261
- background: var(--button-background-color);
262
-
263
- > i {
264
- line-height: 28px;
265
- }
266
- }
267
- }
268
-
269
- &.expanded {
270
- max-height: calc(100% - var(--header-height));
271
- pointer-events: all;
272
- box-shadow: 0 0 8px var(--color-cool-3);
273
- }
274
- }
275
-
276
- > .window-content {
277
- backdrop-filter: blur(4px);
278
- }
279
-
280
-
281
- }
282
-
283
-
284
- .#{$dynamic-id} {
285
-
286
-
287
- --header-height: 36px;
288
- --minimized-width: 200px;
289
- --background: var(--color-cool-5-90);
290
- --color-text-primary: var(--color-light-2);
291
- --color-header-background: rgba(0, 0, 0, 0.5);
292
- --color-border: var(--color-cool-4);
293
- --color-fieldset-border: var(--color-light-6);
294
- --color-form-hint: var(--color-light-5);
295
- --color-form-hint-hover: var(--color-light-4);
296
- --color-form-label: var(--color-light-4);
297
- --color-form-label-hover: var(--color-light-2);
298
- --color-select-option-bg: transparent;
299
- --color-text-light-highlight: #f0f0e0;
300
- --color-text-light-heading: #c9c7b8;
301
- --color-text-light-primary: #b5b3a4;
302
- --color-text-dark-primary: #191813;
303
- --color-text-dark-secondary: #4b4a44;
304
- --color-text-dark-header: #23221d;
305
- --color-text-dark-inactive: #7a7971;
306
- --color-text-hyperlink: #ff6400;
307
- --color-text-selection: #f7f3e8;
308
- --color-text-selection-bg: #777;
309
- --color-text-light-0: #fff;
310
- --color-text-light-1: #eee;
311
- --color-text-light-2: #ddd;
312
- --color-text-light-3: #ccc;
313
- --color-text-light-4: #bbb;
314
- --color-text-light-5: #aaa;
315
- --color-text-light-6: #999;
316
- --color-text-light-7: #888;
317
- --color-text-dark-1: #111;
318
- --color-text-dark-2: #222;
319
- --color-text-dark-3: #444;
320
- --color-text-dark-4: #555;
321
- --color-text-dark-5: #666;
322
- --color-text-dark-6: #777;
323
- --color-border-light-1: #ddd;
324
- --color-border-light-2: #999;
325
- --color-border-dark-1: #111;
326
- --color-border-dark-2: #222;
327
- --color-border-dark-3: #333;
328
- --color-border-dark-4: #444;
329
- --color-border-dark-5: #666;
330
- --color-shadow-primary: #ff0000;
331
- --color-shadow-highlight: #ff6400;
332
- --color-shadow-dark: #000;
333
- --color-underline-inactive: #7a7971;
334
- --color-underline-active: #44191A;
335
- --color-underline-header: #782e22;
336
- --color-border-light-highlight: #f0f0e0;
337
- --color-border-light-primary: #b5b3a4;
338
- --color-border-light-secondary: #c9c7b8;
339
- --color-border-light-tertiary: #7a7971;
340
- --color-border-dark: #000;
341
- --color-border-dark-primary: #191813;
342
- --color-border-dark-secondary: #23221d;
343
- --color-border-dark-tertiary: #4b4a44;
344
- --color-border-highlight: #ff6400;
345
- --color-border-highlight-alt: #ff0000;
346
- --color-bg-btn-minor-inactive: #c9c7b8;
347
- --color-bg-btn-minor-active: #b5b3a4;
348
- --color-select-option-bg: #dad8cc;
349
- --color-checkbox-checked: #666;
350
- --color-ownership-none: #5500ff;
351
- --color-ownership-observer: #7a7971;
352
- --color-ownership-owner: #b5b3a4;
353
- --sidebar-width: 300px;
354
- --sidebar-header-height: 32px;
355
- --sidebar-item-height: 48px;
356
- --hotbar-height: 52px;
357
- --hotbar-width: 578px;
358
- --macro-size: 50px;
359
- --color-scrollbar: #782e22;
360
- --color-scrollbar-track: transparent;
361
- --color-scrollbar-border: #ff6400;
362
- --players-width: 200px;
363
- --form-field-height: 26px;
364
- --font-primary: "Signika", sans-serif;
365
- --line-height-12: 0.75rem;
366
- --line-height-16: 1rem;
367
- --line-height-20: 1.25rem;
368
- --line-height-30: 1.875rem;
369
-
370
- &.create-document {
371
- ol.unlist {
372
- display: grid;
373
- grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
374
- gap: 1rem;
375
- list-style: none;
376
-
377
- label {
378
- display: block;
379
- padding-bottom: 5px;
380
- }
381
-
382
- img {
383
- border-bottom: none;
384
- }
385
- }
386
- }
387
-
388
- &.chat-card {
389
-
390
- .chat-header {
391
- border: 2px solid gray;
392
- border-radius: 2px;
393
- align-items: center;
394
- transition: max-height 500ms ease;
395
-
396
- .name {
397
- font-size: 16px;
398
- font-weight: bold;
399
- }
400
-
401
- .type {
402
- font-style: italic;
403
- font-size: 14px;
404
- }
405
-
406
- > header {
407
- align-items: center;
408
-
409
- > img {
410
- flex: 0;
411
- border-radius: 0;
412
- margin-right: 1rem;
413
- }
414
-
415
- > i {
416
- flex: 0;
417
- }
418
- }
419
- }
420
-
421
- i {
422
- transition: all 250ms ease;
423
- margin-right: 0.25rem;
424
- }
425
-
426
- .collapsible-content {
427
- transition: height 500ms ease;
428
- padding: 0.25rem;
429
- }
430
-
431
- .collapsible > header {
432
- cursor: pointer;
433
- }
434
-
435
- .collapsed {
436
- max-height: 54px;
437
- overflow: hidden;
438
-
439
- .collapse-icon {
440
- transform: rotate(-90deg);
441
- }
442
-
443
- .collapsible-content {
444
- opacity: 0;
445
- height: 0px;
446
- }
447
- }
448
-
449
- .chat-info {
450
- color: black;
451
- .wide {
452
- flex-basis: 100%;
453
-
454
- > dd {
455
- padding-left: 0.5rem;
456
- }
457
- }
458
-
459
- dl {
460
- display: flex;
461
- flex-wrap: wrap;
462
- margin: 0.5em 0;
463
- color: black;
464
- text-shadow: none;
465
- }
466
-
467
- dt {
468
- flex-basis: 25%;
469
- color: black;
470
- text-shadow: none;
471
- }
472
-
473
- dd {
474
- flex-basis: 25%;
475
- margin: 0;
476
- padding: 0 0 10px 0;
477
-
478
- > p {
479
- line-height: 1.5rem;
480
- }
481
- }
482
-
483
- .dice-roll {
484
- .dice-total {
485
- height: 35px;
486
- line-height: 35px;
487
- margin-bottom: 0.5rem;
488
- font-weight: normal;
489
- font-size: 16px;
490
- text-align: left;
491
-
492
- > i {
493
- padding-left: 0.5rem;
494
- line-height: 35px;
495
- position: absolute;
496
- }
497
-
498
- .dice-info {
499
- display: inline-block;
500
- width: 200px;
501
- white-space: nowrap;
502
- overflow: hidden;
503
- text-overflow: ellipsis;
504
- margin-left: 30px;
505
- }
506
-
507
- > .label {
508
- font-weight: bold;
509
- }
510
-
511
- > .result {
512
- font-size: 20px;
513
- font-weight: bold;
514
- right: 10px;
515
- position: absolute;
516
- border-left: 1px solid gray;
517
- padding-left: 10px;
518
- line-height: 33px;
519
- }
520
- }
521
-
522
- // Enhanced styling for damage rolls
523
- &.damage-roll {
524
- position: relative;
525
-
526
- .dice-total {
527
- .damage-type {
528
- font-weight: normal;
529
- font-size: 14px;
530
- margin-left: 8px;
531
- opacity: 0.9;
532
- }
533
- }
534
-
535
- .damage-metadata {
536
- margin-top: 0.25rem;
537
- margin-left: 0.25px;
538
- font-size: 12px;
539
- color: var(--color-text-dark-1);
540
-
541
- .damage-property {
542
- display: inline-block;
543
- padding: 2px 6px;
544
- background: rgba(0, 0, 0, 0.2);
545
- border-radius: 3px;
546
- border: 1px solid rgba(255, 255, 255, 0.1);
547
- }
548
- }
549
-
550
- }
551
- }
552
-
553
- .measured-template {
554
- display: flex;
555
-
556
- .measured-template-button {
557
- flex: 0 0 100%;
558
- height: 35px;
559
- line-height: 35px;
560
- margin: 0;
561
- margin-bottom: 0.5rem;
562
- font-weight: normal;
563
- font-size: 16px;
564
- text-align: left;
565
- position: relative;
566
- background: rgba(0, 0, 0, 0.1);
567
- --color-border-light-2: #999;
568
- border: 1px solid var(--color-border-light-2);
569
- border-radius: 3px;
570
- box-shadow: 0 0 2px #FFF inset;
571
- word-break: break-all;
572
-
573
- > i {
574
- padding-left: 0.5rem;
575
- line-height: 30px;
576
- position: absolute;
577
- }
578
-
579
- .summary {
580
- display: inline-block;
581
- width: 100%;
582
- white-space: nowrap;
583
- overflow: hidden;
584
- text-overflow: ellipsis;
585
- margin-left: 8px;
586
- font-size: 16px;
587
- font-weight: normal;
588
-
589
- > .result {
590
- font-size: 20px;
591
- font-weight: bold;
592
- right: 2px;
593
- position: absolute;
594
- border-left: 1px solid gray;
595
- padding-left: 7px;
596
- height: 34px;
597
-
598
- > i {
599
- &:hover {
600
- cursor: pointer;
601
- box-shadow: 0 0 10px var(--color-shadow-highlight);
602
- }
603
- }
604
- }
605
- }
606
- }
607
- }
608
-
609
- .chat-info-tags {
610
- display: grid;
611
- grid-template-columns: repeat(4, auto);
612
- gap: 5px;
613
- /* Space between items */
614
-
615
- .tag {
616
- border: 2px outset whitesmoke;
617
- border-radius: 2px;
618
- display: flex;
619
- flex-direction: column;
620
- font-size: 12px;
621
- text-align: center;
622
-
623
- .label {
624
- font-weight: bold;
625
- }
626
- }
627
- }
628
- }
629
-
630
- .chat-effects {
631
-
632
- .title {
633
- margin-top: 1rem;
634
- font-size: 1.25em;
635
- border-bottom: 1px solid var(--color-underline-header);
636
- color: var(--color-text-dark-primary);
637
-
638
- > i {
639
- right: 1rem;
640
- }
641
- }
642
-
643
- img {
644
- flex: 0;
645
- }
646
-
647
- .effect {
648
- .name {
649
- margin-left: 0.5rem;
650
- line-height: 30px;
651
- font-size: 16px;
652
- }
653
-
654
- &:not(:last-child) {
655
- border-bottom: 1px dashed gray;
656
- margin-bottom: 0.75rem;
657
- padding-bottom: 0.25rem;
658
- }
659
-
660
- &:hover {
661
- cursor: pointer;
662
- border: 1px dashed var(--color-shadow-primary);
663
- }
664
- }
665
- }
666
- }
667
- }
668
-
669
-
670
- /* ----------------------------------------- */
671
- /* Context Dropdown Menu
672
- /* ----------------------------------------- */
673
- #context-menu2 {
674
- width: max-content;
675
- height: max-content;
676
- min-width: 200px;
677
- max-width: 360px;
678
- // Rendered to <body> with explicit viewport coordinates (see ContextMenu2._setPosition) so
679
- // the menu escapes the chat log's overflow clipping and any transformed sheet ancestor.
680
- position: fixed;
681
- background: linear-gradient(180deg, rgba(24, 23, 20, 0.8) 0%, rgba(35, 34, 29, 0.8) 100%);
682
- border: 1px solid #000;
683
- box-shadow: 0 0 20px -2px #000;
684
- border-radius: 5px;
685
- color: #EEE;
686
- z-index: 100000;
687
-
688
- h2 {
689
- font-family: 'warnock-pro', sans-serif;
690
- line-height: 44px;
691
- padding: 0 5px;
692
- border-bottom: 1px solid var(--color-border-highlight);
693
- text-shadow: none;
694
- }
695
- }
696
-
697
- // Positioning is set inline from the target's viewport rect (ContextMenu2._setPosition);
698
- // these classes remain only as open-direction markers for the slide animation.
699
- #context-menu2.expand-down {
700
- transform-origin: top;
701
- }
702
-
703
- #context-menu2.expand-up {
704
- transform-origin: bottom;
705
- }
706
-
707
- #context-menu2 ol.context-items {
708
- list-style: none;
709
- margin: 0;
710
- padding: 0;
711
- }
712
-
713
- #context-menu2 li.context-item {
714
- padding: 0 5px;
715
- line-height: 32px;
716
- text-shadow: none;
717
- }
718
-
719
- #context-menu2 li.context-item:hover {
720
- color: #FFF;
721
- text-shadow: 0 0 4px red;
722
- }
723
-
724
- #context-menu2 li.context-item > i {
725
- margin-right: 5px;
726
- }
727
-
728
- // The menu now mounts on <body>, so its damage-apply buttons/modifiers (which only exist in
729
- // the chat context) are styled by id alone rather than via a #chat-log ancestor selector.
730
- #context-menu2 {
731
- button {
732
- font-size: 12px;
733
- background: transparent;
734
- color: #fff;
735
- border: 1px dashed var(--color-border-highlight);
736
- box-shadow: none;
737
- opacity: 0.5;
738
- background: rgba(160, 157, 231, 0.5);
739
-
740
- &.active,
741
- &:hover {
742
- border: 1px solid var(--color-border-highlight);
743
- color: #fff;
744
- opacity: 1;
745
- box-shadow: inset 0 0 10px 0px var(--color-shadow-primary);
746
- }
747
-
748
- &:hover {
749
- border: 1px solid #35a7e9;
750
- box-shadow: inset 0 0 8px 2px var(--color-shadow-primary);
751
- }
752
- }
753
-
754
- .reroll,
755
- .modifiers {
756
- border-top: 1px solid var(--color-border-highlight);
757
- }
758
-
759
- .modifiers {
760
- margin: 6px 0 0;
761
- padding-top: 6px;
762
- }
1
+ @use "./backgrounds";
2
+ @use "./handlebars";
3
+ @use "./vuetifyStyles";
4
+ @use "./vuetifyOverrides";
5
+ @use "./isdlStyles";
6
+
7
+ /* -------------------------------------------- */
8
+ /* Vuetify Overrides */
9
+ /* -------------------------------------------- */
10
+
11
+ .#{$dynamic-id}.vue-application {
12
+
13
+ html {
14
+ overflow-x: hidden;
15
+ overflow-y: scroll;
16
+ }
17
+ }
18
+
19
+ /* -------------------------------------------- */
20
+ /* System Stylesheet */
21
+ /* -------------------------------------------- */
22
+
23
+ .#{$dynamic-id}.handlebars-sheet {
24
+ @include handlebars.handlebarsSheet;
25
+ }
26
+
27
+ .v-overlay-container {
28
+ @include vuetifyStyles.vuetifyStyles;
29
+ @include vuetifyOverrides.vuetifyOverrides;
30
+
31
+ --v-theme-overlay-multiplier: 1;
32
+ --v-disabled-opacity: 0.7;
33
+ }
34
+
35
+ // Copy of Foundry app styles for vue apps
36
+ .#{$dynamic-id}.vue-application {
37
+
38
+ --color-text-primary: var(--color-light-2);
39
+ --color-header-background: rgba(0, 0, 0, 0.5);
40
+ --color-border: var(--color-cool-4);
41
+ --color-fieldset-border: var(--color-light-6);
42
+ --color-form-hint: var(--color-light-5);
43
+ --color-form-hint-hover: var(--color-light-4);
44
+ --color-form-label: var(--color-light-4);
45
+ --color-form-label-hover: var(--color-light-2);
46
+ --color-select-option-bg: transparent;
47
+ --v-theme-overlay-multiplier: 1;
48
+ --v-disabled-opacity: 0.7;
49
+
50
+
51
+ .window-content {
52
+ @include vuetifyStyles.vuetifyStyles;
53
+ @include vuetifyOverrides.vuetifyOverrides;
54
+
55
+ --color-text-primary: var(--color-light-2);
56
+ --color-header-background: rgba(0, 0, 0, 0.5);
57
+ --color-border: var(--color-cool-4);
58
+ --color-fieldset-border: var(--color-light-6);
59
+ --color-form-hint: var(--color-light-5);
60
+ --color-form-hint-hover: var(--color-light-4);
61
+ --color-form-label: var(--color-light-4);
62
+ --color-form-label-hover: var(--color-light-2);
63
+ --color-select-option-bg: transparent;
64
+ --v-theme-overlay-multiplier: 1;
65
+ --v-disabled-opacity: 0.7;
66
+
67
+ overflow-y: scroll;
68
+
69
+ input[type="text"]:focus,
70
+ input[type="number"]:focus,
71
+ input[type="password"]:focus,
72
+ input[type="date"]:focus,
73
+ input[type="time"]:focus,
74
+ input[type="search"]:focus {
75
+ box-shadow: none;
76
+ }
77
+
78
+ .v-application {
79
+ @include isdlStyles.isdlStyles;
80
+ }
81
+ }
82
+
83
+ &.document-creation {
84
+
85
+ .window-content {
86
+ overflow: hidden;
87
+ }
88
+
89
+ // With the window sized to content (height: auto), neutralize Vuetify's 100vh
90
+ // min-heights so the layout collapses to the form instead of leaving dark space.
91
+ .v-application__wrap {
92
+ min-height: unset;
93
+ }
94
+
95
+ .v-main {
96
+ flex: 1 1 auto;
97
+ min-height: 0;
98
+ }
99
+
100
+ .v-container {
101
+ padding: 1rem;
102
+ }
103
+ }
104
+
105
+ &.isdl-prompt {
106
+
107
+ // Cap prompt windows at 80% of the viewport (overrides the base max-height: 100%).
108
+ max-height: 80vh;
109
+
110
+ // When a prompt exceeds the cap, scroll the content. We scroll at .window-content
111
+ // rather than an inner field-list scroller because the window is height:auto and
112
+ // max-height is NOT a definite height, so a percentage/flex height cascade can't
113
+ // bound an inner scroller. window-content has a real used height, so it scrolls
114
+ // reliably; the Submit/Cancel footer stays visible via position: sticky.
115
+ .window-content {
116
+ overflow-y: auto;
117
+ overflow-x: hidden;
118
+ }
119
+
120
+ .isdl-prompt-footer {
121
+ position: sticky;
122
+ bottom: 0;
123
+ z-index: 2;
124
+ background: rgb(var(--v-theme-surface));
125
+ border-top: 1px solid rgba(0, 0, 0, 0.12);
126
+ }
127
+
128
+ .v-application__wrap {
129
+ min-height: unset;
130
+ }
131
+
132
+ .v-main {
133
+ flex: 1 1 auto;
134
+ min-height: 0;
135
+ }
136
+ }
137
+
138
+ &.active-effect {
139
+ .v-col {
140
+ padding: 0;
141
+ }
142
+
143
+ .v-card {
144
+ padding: 0.25rem;
145
+
146
+ > .v-card-title {
147
+ padding-top: 0;
148
+ padding-bottom: 0;
149
+ }
150
+ }
151
+
152
+ .v-autocomplete__selection {
153
+ .v-chip__close {
154
+ border: none;
155
+ background: none;
156
+ }
157
+ }
158
+
159
+ }
160
+
161
+ position: absolute;
162
+ z-index: var(--z-index-window);
163
+ transform-origin: top left;
164
+ display: flex;
165
+ flex-direction: column;
166
+ flex-wrap: nowrap;
167
+ min-width: 200px;
168
+ max-height: 100%;
169
+ max-width: 100%;
170
+ overflow: hidden;
171
+ background: var(--background);
172
+ font-size: var(--font-size-14);
173
+ color: var(--color-text-primary);
174
+ border: 1px solid var(--color-border);
175
+ border-radius: 6px;
176
+ box-shadow: 0 0 10px #000;
177
+
178
+ > .window-resize-handle {
179
+ position: absolute;
180
+ inset: auto 0px 0px auto;
181
+ width: 11px;
182
+ height: 11px;
183
+ cursor: nwse-resize;
184
+ background: transparent url(/ui/resize-handle.webp) no-repeat center / contain;
185
+ }
186
+
187
+ > .window-header {
188
+ --button-size: 24px;
189
+ display: flex;
190
+ flex-wrap: nowrap;
191
+ align-items: center;
192
+ flex: 0 0 var(--header-height);
193
+ position: relative;
194
+ overflow: hidden;
195
+ padding: 0 0.5rem;
196
+ gap: 0.25rem;
197
+ z-index: 1;
198
+ cursor: grab;
199
+ background: var(--color-cool-5-90);
200
+ font-size: var(--font-size-13);
201
+ color: var(--color-light-1);
202
+ border-bottom: 1px solid var(--color-border);
203
+ font: unset;
204
+
205
+ > .window-title {
206
+ flex: 1;
207
+ font-size: inherit;
208
+ font-family: inherit;
209
+ font-weight: inherit;
210
+ text-shadow: none;
211
+ margin: 0;
212
+ line-height: var(--header-height);
213
+ border: none;
214
+ overflow: hidden;
215
+ text-align: left;
216
+ white-space: nowrap;
217
+ text-overflow: ellipsis;
218
+ }
219
+
220
+ > .header-control {
221
+ flex: 0 0 var(--button-size);
222
+ height: var(--button-size);
223
+ padding: 0;
224
+ margin: 0;
225
+ border: none;
226
+ color: var(--color-light-text-heading);
227
+ background: none;
228
+ }
229
+ }
230
+
231
+ > .controls-dropdown {
232
+ position: absolute;
233
+ overflow: hidden auto;
234
+ top: var(--header-height);
235
+ right: 0;
236
+ width: max-content;
237
+ min-width: 100px;
238
+ max-width: 300px;
239
+ max-height: 0;
240
+ z-index: 1;
241
+ list-style: none;
242
+ margin: 0 0.25rem;
243
+ padding: 0;
244
+ background: var(--background);
245
+ border-radius: 0 0 4px 4px;
246
+ transition: max-height 0.5s;
247
+ pointer-events: none;
248
+
249
+ > .header-control {
250
+ margin: 0.25rem;
251
+
252
+ > button {
253
+ --button-background-color: none;
254
+ --button-text-color: var(--color-text-primary);
255
+ width: 100%;
256
+ display: flex;
257
+ justify-content: space-between;
258
+ border: none;
259
+ font-size: var(--font-size-12);
260
+ color: var(--button-text-color);
261
+ background: var(--button-background-color);
262
+
263
+ > i {
264
+ line-height: 28px;
265
+ }
266
+ }
267
+ }
268
+
269
+ &.expanded {
270
+ max-height: calc(100% - var(--header-height));
271
+ pointer-events: all;
272
+ box-shadow: 0 0 8px var(--color-cool-3);
273
+ }
274
+ }
275
+
276
+ > .window-content {
277
+ backdrop-filter: blur(4px);
278
+ }
279
+
280
+
281
+ }
282
+
283
+
284
+ .#{$dynamic-id} {
285
+
286
+
287
+ --header-height: 36px;
288
+ --minimized-width: 200px;
289
+ --background: var(--color-cool-5-90);
290
+ --color-text-primary: var(--color-light-2);
291
+ --color-header-background: rgba(0, 0, 0, 0.5);
292
+ --color-border: var(--color-cool-4);
293
+ --color-fieldset-border: var(--color-light-6);
294
+ --color-form-hint: var(--color-light-5);
295
+ --color-form-hint-hover: var(--color-light-4);
296
+ --color-form-label: var(--color-light-4);
297
+ --color-form-label-hover: var(--color-light-2);
298
+ --color-select-option-bg: transparent;
299
+ --color-text-light-highlight: #f0f0e0;
300
+ --color-text-light-heading: #c9c7b8;
301
+ --color-text-light-primary: #b5b3a4;
302
+ --color-text-dark-primary: #191813;
303
+ --color-text-dark-secondary: #4b4a44;
304
+ --color-text-dark-header: #23221d;
305
+ --color-text-dark-inactive: #7a7971;
306
+ --color-text-hyperlink: #ff6400;
307
+ --color-text-selection: #f7f3e8;
308
+ --color-text-selection-bg: #777;
309
+ --color-text-light-0: #fff;
310
+ --color-text-light-1: #eee;
311
+ --color-text-light-2: #ddd;
312
+ --color-text-light-3: #ccc;
313
+ --color-text-light-4: #bbb;
314
+ --color-text-light-5: #aaa;
315
+ --color-text-light-6: #999;
316
+ --color-text-light-7: #888;
317
+ --color-text-dark-1: #111;
318
+ --color-text-dark-2: #222;
319
+ --color-text-dark-3: #444;
320
+ --color-text-dark-4: #555;
321
+ --color-text-dark-5: #666;
322
+ --color-text-dark-6: #777;
323
+ --color-border-light-1: #ddd;
324
+ --color-border-light-2: #999;
325
+ --color-border-dark-1: #111;
326
+ --color-border-dark-2: #222;
327
+ --color-border-dark-3: #333;
328
+ --color-border-dark-4: #444;
329
+ --color-border-dark-5: #666;
330
+ --color-shadow-primary: #ff0000;
331
+ --color-shadow-highlight: #ff6400;
332
+ --color-shadow-dark: #000;
333
+ --color-underline-inactive: #7a7971;
334
+ --color-underline-active: #44191A;
335
+ --color-underline-header: #782e22;
336
+ --color-border-light-highlight: #f0f0e0;
337
+ --color-border-light-primary: #b5b3a4;
338
+ --color-border-light-secondary: #c9c7b8;
339
+ --color-border-light-tertiary: #7a7971;
340
+ --color-border-dark: #000;
341
+ --color-border-dark-primary: #191813;
342
+ --color-border-dark-secondary: #23221d;
343
+ --color-border-dark-tertiary: #4b4a44;
344
+ --color-border-highlight: #ff6400;
345
+ --color-border-highlight-alt: #ff0000;
346
+ --color-bg-btn-minor-inactive: #c9c7b8;
347
+ --color-bg-btn-minor-active: #b5b3a4;
348
+ --color-select-option-bg: #dad8cc;
349
+ --color-checkbox-checked: #666;
350
+ --color-ownership-none: #5500ff;
351
+ --color-ownership-observer: #7a7971;
352
+ --color-ownership-owner: #b5b3a4;
353
+ --sidebar-width: 300px;
354
+ --sidebar-header-height: 32px;
355
+ --sidebar-item-height: 48px;
356
+ --hotbar-height: 52px;
357
+ --hotbar-width: 578px;
358
+ --macro-size: 50px;
359
+ --color-scrollbar: #782e22;
360
+ --color-scrollbar-track: transparent;
361
+ --color-scrollbar-border: #ff6400;
362
+ --players-width: 200px;
363
+ --form-field-height: 26px;
364
+ --font-primary: "Signika", sans-serif;
365
+ --line-height-12: 0.75rem;
366
+ --line-height-16: 1rem;
367
+ --line-height-20: 1.25rem;
368
+ --line-height-30: 1.875rem;
369
+
370
+ &.create-document {
371
+ ol.unlist {
372
+ display: grid;
373
+ grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
374
+ gap: 1rem;
375
+ list-style: none;
376
+
377
+ label {
378
+ display: block;
379
+ padding-bottom: 5px;
380
+ }
381
+
382
+ img {
383
+ border-bottom: none;
384
+ }
385
+ }
386
+ }
387
+
388
+ &.chat-card {
389
+
390
+ .chat-header {
391
+ border: 2px solid gray;
392
+ border-radius: 2px;
393
+ align-items: center;
394
+ transition: max-height 500ms ease;
395
+
396
+ .name {
397
+ font-size: 16px;
398
+ font-weight: bold;
399
+ }
400
+
401
+ .type {
402
+ font-style: italic;
403
+ font-size: 14px;
404
+ }
405
+
406
+ > header {
407
+ align-items: center;
408
+
409
+ > img {
410
+ flex: 0;
411
+ border-radius: 0;
412
+ margin-right: 1rem;
413
+ }
414
+
415
+ > i {
416
+ flex: 0;
417
+ }
418
+ }
419
+ }
420
+
421
+ i {
422
+ transition: all 250ms ease;
423
+ margin-right: 0.25rem;
424
+ }
425
+
426
+ .collapsible-content {
427
+ transition: height 500ms ease;
428
+ padding: 0.25rem;
429
+ }
430
+
431
+ .collapsible > header {
432
+ cursor: pointer;
433
+ }
434
+
435
+ .collapsed {
436
+ max-height: 54px;
437
+ overflow: hidden;
438
+
439
+ .collapse-icon {
440
+ transform: rotate(-90deg);
441
+ }
442
+
443
+ .collapsible-content {
444
+ opacity: 0;
445
+ height: 0px;
446
+ }
447
+ }
448
+
449
+ .chat-info {
450
+ color: black;
451
+ .wide {
452
+ flex-basis: 100%;
453
+
454
+ > dd {
455
+ padding-left: 0.5rem;
456
+ }
457
+ }
458
+
459
+ dl {
460
+ display: flex;
461
+ flex-wrap: wrap;
462
+ margin: 0.5em 0;
463
+ color: black;
464
+ text-shadow: none;
465
+ }
466
+
467
+ dt {
468
+ flex-basis: 25%;
469
+ color: black;
470
+ text-shadow: none;
471
+ }
472
+
473
+ dd {
474
+ flex-basis: 25%;
475
+ margin: 0;
476
+ padding: 0 0 10px 0;
477
+
478
+ > p {
479
+ line-height: 1.5rem;
480
+ }
481
+ }
482
+
483
+ .dice-roll {
484
+ .dice-total {
485
+ height: 35px;
486
+ line-height: 35px;
487
+ margin-bottom: 0.5rem;
488
+ font-weight: normal;
489
+ font-size: 16px;
490
+ text-align: left;
491
+
492
+ > i {
493
+ padding-left: 0.5rem;
494
+ line-height: 35px;
495
+ position: absolute;
496
+ }
497
+
498
+ .dice-info {
499
+ display: inline-block;
500
+ width: 200px;
501
+ white-space: nowrap;
502
+ overflow: hidden;
503
+ text-overflow: ellipsis;
504
+ margin-left: 30px;
505
+ }
506
+
507
+ > .label {
508
+ font-weight: bold;
509
+ }
510
+
511
+ > .result {
512
+ font-size: 20px;
513
+ font-weight: bold;
514
+ right: 10px;
515
+ position: absolute;
516
+ border-left: 1px solid gray;
517
+ padding-left: 10px;
518
+ line-height: 33px;
519
+ }
520
+ }
521
+
522
+ // Enhanced styling for damage rolls
523
+ &.damage-roll {
524
+ position: relative;
525
+
526
+ .dice-total {
527
+ .damage-type {
528
+ font-weight: normal;
529
+ font-size: 14px;
530
+ margin-left: 8px;
531
+ opacity: 0.9;
532
+ }
533
+ }
534
+
535
+ .damage-metadata {
536
+ margin-top: 0.25rem;
537
+ margin-left: 0.25px;
538
+ font-size: 12px;
539
+ color: var(--color-text-dark-1);
540
+
541
+ .damage-property {
542
+ display: inline-block;
543
+ padding: 2px 6px;
544
+ background: rgba(0, 0, 0, 0.2);
545
+ border-radius: 3px;
546
+ border: 1px solid rgba(255, 255, 255, 0.1);
547
+ }
548
+ }
549
+
550
+ }
551
+
552
+ // Crit / fumble result highlighting (issue #10). The roll exposes
553
+ // crit/fumble booleans; the chat card adds these modifier classes.
554
+ // Crit is green, fumble red; keep the glow tight so the text stays crisp.
555
+ &.roll--crit {
556
+ .dice-total,
557
+ .dice-total > .result {
558
+ color: #2f9e44;
559
+ text-shadow: 0 0 3px rgba(56, 161, 105, 0.55);
560
+ }
561
+ .roll-flag-crit {
562
+ color: #40c057;
563
+ }
564
+ }
565
+
566
+ &.roll--fumble {
567
+ .dice-total,
568
+ .dice-total > .result {
569
+ color: #c92a2a;
570
+ text-shadow: 0 0 3px rgba(220, 40, 40, 0.5);
571
+ }
572
+ .roll-flag-fumble {
573
+ color: #e03131;
574
+ }
575
+ }
576
+
577
+ // Rare "crit-fumble" -- a roll flagged BOTH crit and fumble (only really
578
+ // reachable via manual marking). Both modifier classes apply, so this
579
+ // combined selector (specificity 0,2,0) overrides the single-flag styling
580
+ // above. Green->red shimmer on the total (no blur filter -- gradient text
581
+ // stays crisp), pulsing dual-glow yin-yang icon.
582
+ &.roll--crit.roll--fumble {
583
+ .dice-total,
584
+ .dice-total > .result {
585
+ background: linear-gradient(100deg, #40c057 0%, #2f9e44 25%, #c92a2a 50%, #2f9e44 75%, #40c057 100%);
586
+ background-size: 200% auto;
587
+ -webkit-background-clip: text;
588
+ background-clip: text;
589
+ -webkit-text-fill-color: transparent;
590
+ color: transparent;
591
+ animation: isdl-crit-fumble-shimmer 3s linear infinite;
592
+ }
593
+ // Crisp green->red gradient glyph (no blur filter); just the scale pulse.
594
+ // The gradient lives on ::before (whose box wraps the glyph exactly) so
595
+ // background-clip:text doesn't clip the right edge of the icon.
596
+ .roll-flag-crit-fumble {
597
+ animation: isdl-crit-fumble-pulse 1.2s ease-in-out infinite;
598
+ &::before {
599
+ background: linear-gradient(135deg, #40c057 0%, #2f9e44 45%, #c92a2a 55%, #e03131 100%);
600
+ -webkit-background-clip: text;
601
+ background-clip: text;
602
+ -webkit-text-fill-color: transparent;
603
+ color: transparent;
604
+ }
605
+ }
606
+ }
607
+ }
608
+
609
+ @keyframes isdl-crit-fumble-shimmer {
610
+ from { background-position: 0% center; }
611
+ to { background-position: 200% center; }
612
+ }
613
+
614
+ @keyframes isdl-crit-fumble-pulse {
615
+ 0%, 100% { transform: scale(1); }
616
+ 50% { transform: scale(1.18); }
617
+ }
618
+
619
+ .measured-template {
620
+ display: flex;
621
+
622
+ .measured-template-button {
623
+ flex: 0 0 100%;
624
+ height: 35px;
625
+ line-height: 35px;
626
+ margin: 0;
627
+ margin-bottom: 0.5rem;
628
+ font-weight: normal;
629
+ font-size: 16px;
630
+ text-align: left;
631
+ position: relative;
632
+ background: rgba(0, 0, 0, 0.1);
633
+ --color-border-light-2: #999;
634
+ border: 1px solid var(--color-border-light-2);
635
+ border-radius: 3px;
636
+ box-shadow: 0 0 2px #FFF inset;
637
+ word-break: break-all;
638
+
639
+ > i {
640
+ padding-left: 0.5rem;
641
+ line-height: 30px;
642
+ position: absolute;
643
+ }
644
+
645
+ .summary {
646
+ display: inline-block;
647
+ width: 100%;
648
+ white-space: nowrap;
649
+ overflow: hidden;
650
+ text-overflow: ellipsis;
651
+ margin-left: 8px;
652
+ font-size: 16px;
653
+ font-weight: normal;
654
+
655
+ > .result {
656
+ font-size: 20px;
657
+ font-weight: bold;
658
+ right: 2px;
659
+ position: absolute;
660
+ border-left: 1px solid gray;
661
+ padding-left: 7px;
662
+ height: 34px;
663
+
664
+ > i {
665
+ &:hover {
666
+ cursor: pointer;
667
+ box-shadow: 0 0 10px var(--color-shadow-highlight);
668
+ }
669
+ }
670
+ }
671
+ }
672
+ }
673
+ }
674
+
675
+ .chat-info-tags {
676
+ display: grid;
677
+ grid-template-columns: repeat(4, auto);
678
+ gap: 5px;
679
+ /* Space between items */
680
+
681
+ .tag {
682
+ border: 2px outset whitesmoke;
683
+ border-radius: 2px;
684
+ display: flex;
685
+ flex-direction: column;
686
+ font-size: 12px;
687
+ text-align: center;
688
+
689
+ .label {
690
+ font-weight: bold;
691
+ }
692
+ }
693
+ }
694
+ }
695
+
696
+ .chat-effects {
697
+
698
+ .title {
699
+ margin-top: 1rem;
700
+ font-size: 1.25em;
701
+ border-bottom: 1px solid var(--color-underline-header);
702
+ color: var(--color-text-dark-primary);
703
+
704
+ > i {
705
+ right: 1rem;
706
+ }
707
+ }
708
+
709
+ img {
710
+ flex: 0;
711
+ }
712
+
713
+ .effect {
714
+ .name {
715
+ margin-left: 0.5rem;
716
+ line-height: 30px;
717
+ font-size: 16px;
718
+ }
719
+
720
+ &:not(:last-child) {
721
+ border-bottom: 1px dashed gray;
722
+ margin-bottom: 0.75rem;
723
+ padding-bottom: 0.25rem;
724
+ }
725
+
726
+ &:hover {
727
+ cursor: pointer;
728
+ border: 1px dashed var(--color-shadow-primary);
729
+ }
730
+ }
731
+ }
732
+ }
733
+ }
734
+
735
+
736
+ /* ----------------------------------------- */
737
+ /* Context Dropdown Menu
738
+ /* ----------------------------------------- */
739
+ #context-menu2 {
740
+ width: max-content;
741
+ height: max-content;
742
+ min-width: 200px;
743
+ max-width: 360px;
744
+ // Rendered to <body> with explicit viewport coordinates (see ContextMenu2._setPosition) so
745
+ // the menu escapes the chat log's overflow clipping and any transformed sheet ancestor.
746
+ position: fixed;
747
+ background: linear-gradient(180deg, rgba(24, 23, 20, 0.8) 0%, rgba(35, 34, 29, 0.8) 100%);
748
+ border: 1px solid #000;
749
+ box-shadow: 0 0 20px -2px #000;
750
+ border-radius: 5px;
751
+ color: #EEE;
752
+ z-index: 100000;
753
+
754
+ h2 {
755
+ font-family: 'warnock-pro', sans-serif;
756
+ line-height: 44px;
757
+ padding: 0 5px;
758
+ border-bottom: 1px solid var(--color-border-highlight);
759
+ text-shadow: none;
760
+ }
761
+ }
762
+
763
+ // Positioning is set inline from the target's viewport rect (ContextMenu2._setPosition);
764
+ // these classes remain only as open-direction markers for the slide animation.
765
+ #context-menu2.expand-down {
766
+ transform-origin: top;
767
+ }
768
+
769
+ #context-menu2.expand-up {
770
+ transform-origin: bottom;
771
+ }
772
+
773
+ #context-menu2 ol.context-items {
774
+ list-style: none;
775
+ margin: 0;
776
+ padding: 0;
777
+ }
778
+
779
+ #context-menu2 li.context-item {
780
+ padding: 0 5px;
781
+ line-height: 32px;
782
+ text-shadow: none;
783
+ }
784
+
785
+ #context-menu2 li.context-item:hover {
786
+ color: #FFF;
787
+ text-shadow: 0 0 4px red;
788
+ }
789
+
790
+ #context-menu2 li.context-item > i {
791
+ margin-right: 5px;
792
+ }
793
+
794
+ // The menu now mounts on <body>, so its damage-apply buttons/modifiers (which only exist in
795
+ // the chat context) are styled by id alone rather than via a #chat-log ancestor selector.
796
+ #context-menu2 {
797
+ button {
798
+ font-size: 12px;
799
+ background: transparent;
800
+ color: #fff;
801
+ border: 1px dashed var(--color-border-highlight);
802
+ box-shadow: none;
803
+ opacity: 0.5;
804
+ background: rgba(160, 157, 231, 0.5);
805
+
806
+ &.active,
807
+ &:hover {
808
+ border: 1px solid var(--color-border-highlight);
809
+ color: #fff;
810
+ opacity: 1;
811
+ box-shadow: inset 0 0 10px 0px var(--color-shadow-primary);
812
+ }
813
+
814
+ &:hover {
815
+ border: 1px solid #35a7e9;
816
+ box-shadow: inset 0 0 8px 2px var(--color-shadow-primary);
817
+ }
818
+ }
819
+
820
+ .reroll,
821
+ .modifiers {
822
+ border-top: 1px solid var(--color-border-highlight);
823
+ }
824
+
825
+ .modifiers {
826
+ margin: 6px 0 0;
827
+ padding-top: 6px;
828
+ }
763
829
  }