@miliastry/quasar 1.0.6 → 1.2.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 (278) hide show
  1. package/README.md +1 -1
  2. package/dist/Visuals/lyne.css +374 -9
  3. package/dist/Visuals/osu.css +393 -11
  4. package/dist/index.js +10470 -3336
  5. package/dist/index.mjs +10336 -3337
  6. package/dist/types/Analysis/Contracts/AnalysisReport.d.ts +22 -0
  7. package/dist/types/Analysis/Contracts/Contribution.d.ts +68 -0
  8. package/dist/types/Analysis/Contracts/Pass.d.ts +59 -0
  9. package/dist/types/Analysis/Contracts/PipelineContext.d.ts +34 -0
  10. package/dist/types/Analysis/Passes/Analysis/ColorUsageAnalyzer.d.ts +56 -0
  11. package/dist/types/Analysis/Passes/Analysis/GradientAnalyzer.d.ts +111 -0
  12. package/dist/types/Analysis/Passes/Analysis/MergeableColorAnalyzer.d.ts +26 -0
  13. package/dist/types/Analysis/Passes/Analysis/RainbowAnalyzer.d.ts +47 -0
  14. package/dist/types/Analysis/Passes/Analysis/SymbolAnalyzer.d.ts +89 -0
  15. package/dist/types/Analysis/Passes/Analysis/WaveAnalyzer.d.ts +44 -0
  16. package/dist/types/Analysis/Passes/Analysis/__tests__/GradientAnalyzer.test.d.ts +4 -0
  17. package/dist/types/Analysis/Passes/Analysis/__tests__/MergeableColorAnalyzer.test.d.ts +4 -0
  18. package/dist/types/Analysis/Passes/Analysis/__tests__/RainbowAnalyzer.test.d.ts +4 -0
  19. package/dist/types/Analysis/Passes/Analysis/__tests__/WaveAnalyzer.test.d.ts +4 -0
  20. package/dist/types/Analysis/Passes/Decision/DefaultDecision.d.ts +30 -0
  21. package/dist/types/Analysis/Passes/Decision/PaletteRemapDecision.d.ts +169 -0
  22. package/dist/types/Analysis/Passes/Decision/__tests__/DefaultDecision.test.d.ts +4 -0
  23. package/dist/types/Analysis/Passes/Transform/CollapseGradientTransform.d.ts +37 -0
  24. package/dist/types/Analysis/Passes/Transform/MergeColorsTransform.d.ts +28 -0
  25. package/dist/types/Analysis/Passes/Transform/RainbowCollapseTransform.d.ts +19 -0
  26. package/dist/types/Analysis/Passes/Transform/WaveCollapseTransform.d.ts +20 -0
  27. package/dist/types/Analysis/Passes/Utility/CharacterCountAnalyzer.d.ts +19 -0
  28. package/dist/types/Analysis/Pipeline/Pipeline.d.ts +69 -0
  29. package/dist/types/Analysis/Pipeline/PipelineBuilder.d.ts +31 -0
  30. package/dist/types/Analysis/Pipeline/PipelineStage.d.ts +17 -0
  31. package/dist/types/Analysis/Utils/color-utils.d.ts +60 -0
  32. package/dist/types/Analysis/__tests__/Integration.test.d.ts +8 -0
  33. package/dist/types/Analysis/__tests__/PaletteRemap.test.d.ts +14 -0
  34. package/dist/types/Analysis/__tests__/Pipeline.test.d.ts +10 -0
  35. package/dist/types/Analysis/__tests__/RoundTrip.test.d.ts +30 -0
  36. package/dist/types/Analysis/__tests__/SymbolAnalyzer.test.d.ts +11 -0
  37. package/dist/types/Analysis/index.d.ts +40 -0
  38. package/dist/types/BBCode/BBCodeDocumentModel.d.ts +102 -0
  39. package/dist/types/BBCode/BBCodeToGreenNode.d.ts +111 -0
  40. package/dist/types/BBCode/Parser.d.ts +78 -0
  41. package/dist/types/BBCode/index.d.ts +4 -0
  42. package/dist/types/Collab/positions.d.ts +55 -0
  43. package/dist/types/Commands/Command.d.ts +37 -0
  44. package/dist/types/Commands/CommandRegistry.d.ts +48 -0
  45. package/dist/types/Commands/DeleteNode.d.ts +7 -0
  46. package/dist/types/Commands/InsertText.d.ts +8 -0
  47. package/dist/types/Commands/SplitMerge.d.ts +9 -0
  48. package/dist/types/Commands/WrapInTag.d.ts +8 -0
  49. package/dist/types/Commands/index.d.ts +6 -0
  50. package/dist/types/Diff/TreeDiffer.d.ts +52 -0
  51. package/dist/types/Diff/__tests__/TreeDiffer.test.d.ts +1 -0
  52. package/dist/types/Diff/index.d.ts +2 -0
  53. package/dist/types/Edits/EditPlan.d.ts +144 -0
  54. package/dist/types/Edits/Optimizer.d.ts +78 -0
  55. package/dist/types/Edits/Rules/Rule.d.ts +91 -0
  56. package/dist/types/Edits/Rules/dropEmptyTags.d.ts +40 -0
  57. package/dist/types/Edits/Rules/dropRedundantNesting.d.ts +59 -0
  58. package/dist/types/Edits/Rules/index.d.ts +9 -0
  59. package/dist/types/Edits/Rules/mergeAdjacent.d.ts +93 -0
  60. package/dist/types/Edits/Rules/reorderWrappers.d.ts +42 -0
  61. package/dist/types/Edits/Rules/shortenHex.d.ts +30 -0
  62. package/dist/types/Edits/Rules/tagValue.d.ts +56 -0
  63. package/dist/types/Edits/Rules/unwrapInvisibleColor.d.ts +47 -0
  64. package/dist/types/Edits/applyEdits.d.ts +36 -0
  65. package/dist/types/Edits/index.d.ts +6 -0
  66. package/dist/types/Events/EventBus.d.ts +103 -0
  67. package/dist/types/Events/index.d.ts +2 -0
  68. package/dist/types/Formatter/Formatter.d.ts +32 -0
  69. package/dist/types/Formatter/index.d.ts +2 -0
  70. package/dist/types/HTML/HTMLDocumentModel.d.ts +13 -0
  71. package/dist/types/HTML/HTMLToGreenNode.d.ts +4 -0
  72. package/dist/types/Incremental/BracketIndex.d.ts +101 -0
  73. package/dist/types/Incremental/ChangeTracker.d.ts +69 -0
  74. package/dist/types/Incremental/IncrementalParser.d.ts +246 -0
  75. package/dist/types/Incremental/__tests__/BracketIndex.test.d.ts +1 -0
  76. package/dist/types/Incremental/__tests__/IncrementalParser.test.d.ts +1 -0
  77. package/dist/types/Incremental/index.d.ts +4 -0
  78. package/dist/types/Lexer/BBCodeLexer.d.ts +74 -0
  79. package/dist/types/Lexer/Lexer.d.ts +54 -0
  80. package/dist/types/Lexer/index.d.ts +4 -0
  81. package/dist/types/Linter/Linter.d.ts +58 -0
  82. package/dist/types/Linter/index.d.ts +2 -0
  83. package/dist/types/Markdown/MarkdownAST.d.ts +122 -0
  84. package/dist/types/Markdown/MarkdownDocumentModel.d.ts +15 -0
  85. package/dist/types/Markdown/MarkdownLexer.d.ts +155 -0
  86. package/dist/types/Markdown/MarkdownParser.d.ts +42 -0
  87. package/dist/types/Markdown/MarkdownToGreenNode.d.ts +6 -0
  88. package/dist/types/MilHibri/MilHibriDocumentModel.d.ts +21 -0
  89. package/dist/types/Model/DocumentModel.d.ts +318 -0
  90. package/dist/types/Model/NodeFactory.d.ts +29 -0
  91. package/dist/types/Model/TagRegistry.d.ts +165 -0
  92. package/dist/types/Model/index.d.ts +5 -0
  93. package/dist/types/Plugins/PluginAPI.d.ts +44 -0
  94. package/dist/types/Plugins/PluginRegistry.d.ts +81 -0
  95. package/dist/types/Plugins/index.d.ts +3 -0
  96. package/dist/types/Queries/QueryEngine.d.ts +32 -0
  97. package/dist/types/Queries/index.d.ts +1 -0
  98. package/dist/types/Reconciler/SurgicalReconciler.d.ts +23 -0
  99. package/dist/types/RenderPipeline/RenderPipeline.d.ts +46 -0
  100. package/dist/types/RenderPipeline/RenderTree.d.ts +55 -0
  101. package/dist/types/RenderPipeline/index.d.ts +4 -0
  102. package/dist/types/Repair/NestingRepair.d.ts +48 -0
  103. package/dist/types/Repair/index.d.ts +1 -0
  104. package/dist/types/Semantic/SemanticAnalyzer.d.ts +321 -0
  105. package/dist/types/Semantic/index.d.ts +2 -0
  106. package/dist/types/Symbols/SymbolTable.d.ts +47 -0
  107. package/dist/types/Symbols/index.d.ts +1 -0
  108. package/dist/types/Syntax/GreenNode.d.ts +154 -0
  109. package/dist/types/Syntax/GreenNodePool.d.ts +134 -0
  110. package/dist/types/Syntax/NodeMatcher.d.ts +75 -0
  111. package/dist/types/Syntax/RedNode.d.ts +280 -0
  112. package/dist/types/Syntax/RedNodeStore.d.ts +116 -0
  113. package/dist/types/Syntax/TreeBuilder.d.ts +54 -0
  114. package/dist/types/Syntax/__tests__/GreenNode.test.d.ts +1 -0
  115. package/dist/types/Syntax/__tests__/RedNode.test.d.ts +1 -0
  116. package/dist/types/Syntax/__tests__/RedNodeStore.test.d.ts +1 -0
  117. package/dist/types/Syntax/greenEdit.d.ts +64 -0
  118. package/dist/types/Syntax/hash.d.ts +17 -0
  119. package/dist/types/Syntax/index.d.ts +8 -0
  120. package/dist/types/Syntax/nodeAttr.d.ts +63 -0
  121. package/dist/types/Syntax/partition.d.ts +67 -0
  122. package/dist/types/Syntax/preserveNodeIds.d.ts +47 -0
  123. package/dist/types/Tokens/TokenResolver.d.ts +25 -0
  124. package/dist/types/Tokens/index.d.ts +1 -0
  125. package/dist/types/Transactions/Transaction.d.ts +36 -0
  126. package/dist/types/Transactions/UndoManager.d.ts +63 -0
  127. package/dist/types/Transactions/index.d.ts +3 -0
  128. package/dist/types/Transformers/ASTOptimizer.d.ts +34 -0
  129. package/dist/types/Transformers/GradientTransformer.d.ts +18 -0
  130. package/dist/types/Transformers/GrowTransformer.d.ts +16 -0
  131. package/dist/types/Transformers/RainbowTransformer.d.ts +17 -0
  132. package/dist/types/Transformers/SineWaveTransformer.d.ts +17 -0
  133. package/dist/types/Transformers/Transformer.d.ts +17 -0
  134. package/dist/types/Types/core.d.ts +104 -0
  135. package/dist/types/Types/diagnostics.d.ts +85 -0
  136. package/dist/types/Types/index.d.ts +11 -0
  137. package/dist/types/Types/operations.d.ts +109 -0
  138. package/dist/types/Types/queries.d.ts +67 -0
  139. package/dist/types/Types/symbols.d.ts +42 -0
  140. package/dist/types/Types/tokens.d.ts +75 -0
  141. package/dist/types/Utils/BBCodeGenerator.d.ts +21 -0
  142. package/dist/types/Utils/ColorMath.d.ts +92 -0
  143. package/dist/types/Utils/EffectMath.d.ts +643 -0
  144. package/dist/types/Utils/TagVocabulary.d.ts +104 -0
  145. package/dist/types/Utils/TagVocabulary.test.d.ts +1 -0
  146. package/dist/types/Utils/color.d.ts +29 -0
  147. package/dist/types/Utils/dom-to-svg.d.ts +28 -0
  148. package/dist/types/Utils/dom-to-svg.test.d.ts +1 -0
  149. package/dist/types/Utils/treeTransformers.d.ts +160 -0
  150. package/dist/types/Visitors/BBBlocksExporter.d.ts +27 -0
  151. package/dist/types/Visitors/BBCodeExporter.d.ts +90 -0
  152. package/dist/types/Visitors/BlockPatcher.d.ts +91 -0
  153. package/dist/types/Visitors/DOMMorpher.d.ts +19 -0
  154. package/dist/types/Visitors/HTMLRenderer.d.ts +492 -0
  155. package/dist/types/Visitors/JSONExporter.d.ts +42 -0
  156. package/dist/types/Visitors/MarkdownExporter.d.ts +28 -0
  157. package/dist/types/Visitors/SVGRenderer.d.ts +16 -0
  158. package/dist/types/Visitors/TiptapExporter.d.ts +40 -0
  159. package/dist/types/Visitors/Visitor.d.ts +35 -0
  160. package/dist/types/Visitors/index.d.ts +9 -0
  161. package/dist/types/Visuals/BoxDrawer.d.ts +54 -0
  162. package/dist/types/Visuals/LyneAudio.d.ts +8 -0
  163. package/dist/types/Visuals/index.d.ts +39 -0
  164. package/dist/types/index.d.ts +155 -0
  165. package/package.json +14 -10
  166. package/src/Analysis/Passes/Analysis/ColorUsageAnalyzer.ts +103 -0
  167. package/src/Analysis/Passes/Analysis/GradientAnalyzer.ts +294 -20
  168. package/src/Analysis/Passes/Analysis/SymbolAnalyzer.ts +257 -0
  169. package/src/Analysis/Passes/Decision/PaletteRemapDecision.ts +425 -0
  170. package/src/Analysis/Pipeline/Pipeline.ts +15 -2
  171. package/src/Analysis/index.ts +8 -2
  172. package/src/BBCode/BBCodeDocumentModel.ts +39 -1
  173. package/src/BBCode/BBCodeToGreenNode.ts +18 -12
  174. package/src/BBCode/Parser.ts +38 -1
  175. package/src/Edits/EditPlan.ts +290 -0
  176. package/src/Edits/Optimizer.ts +185 -0
  177. package/src/Edits/Rules/Rule.ts +145 -0
  178. package/src/Edits/Rules/dropEmptyTags.ts +110 -0
  179. package/src/Edits/Rules/dropRedundantNesting.ts +120 -0
  180. package/src/Edits/Rules/index.ts +28 -0
  181. package/src/Edits/Rules/mergeAdjacent.ts +224 -0
  182. package/src/Edits/Rules/reorderWrappers.ts +154 -0
  183. package/src/Edits/Rules/shortenHex.ts +79 -0
  184. package/src/Edits/Rules/tagValue.ts +105 -0
  185. package/src/Edits/Rules/unwrapInvisibleColor.ts +93 -0
  186. package/src/Edits/applyEdits.ts +54 -0
  187. package/src/Edits/index.ts +22 -0
  188. package/src/Events/EventBus.ts +18 -0
  189. package/src/HTML/HTMLToGreenNode.ts +193 -37
  190. package/src/Incremental/BracketIndex.ts +249 -0
  191. package/src/Incremental/IncrementalParser.ts +464 -41
  192. package/src/Lexer/BBCodeLexer.ts +25 -3
  193. package/src/Lexer/index.ts +1 -1
  194. package/src/Markdown/MarkdownAST.ts +65 -2
  195. package/src/Markdown/MarkdownLexer.ts +69 -14
  196. package/src/Markdown/MarkdownParser.ts +749 -62
  197. package/src/Markdown/MarkdownToGreenNode.ts +148 -27
  198. package/src/MilHibri/MilHibriDocumentModel.ts +56 -0
  199. package/src/Model/DocumentModel.ts +138 -5
  200. package/src/Model/TagRegistry.ts +129 -134
  201. package/src/Reconciler/SurgicalReconciler.ts +460 -0
  202. package/src/Repair/NestingRepair.ts +116 -0
  203. package/src/Repair/index.ts +1 -0
  204. package/src/Semantic/SemanticAnalyzer.ts +1845 -65
  205. package/src/Syntax/GreenNodePool.ts +12 -12
  206. package/src/Syntax/RedNode.ts +17 -3
  207. package/src/Syntax/RedNodeStore.ts +9 -1
  208. package/src/Syntax/nodeAttr.ts +172 -0
  209. package/src/Tokens/TokenResolver.ts +55 -0
  210. package/src/Tokens/index.ts +1 -0
  211. package/src/Types/core.ts +15 -0
  212. package/src/Utils/ColorMath.ts +276 -55
  213. package/src/Utils/EffectMath.ts +2462 -0
  214. package/src/Utils/TagVocabulary.ts +141 -0
  215. package/src/Utils/dom-to-svg.ts +28 -12
  216. package/src/Visitors/BBBlocksExporter.ts +15 -1
  217. package/src/Visitors/BBCodeExporter.ts +365 -32
  218. package/src/Visitors/BlockPatcher.ts +123 -22
  219. package/src/Visitors/DOMMorpher.ts +44 -28
  220. package/src/Visitors/HTMLRenderer.ts +771 -205
  221. package/src/Visitors/MarkdownExporter.ts +98 -41
  222. package/src/Visitors/TiptapExporter.ts +1 -0
  223. package/src/Visitors/index.ts +1 -1
  224. package/src/Visuals/BoxDrawer.ts +56 -10
  225. package/src/Visuals/LyneAudio.ts +346 -0
  226. package/src/Visuals/index.ts +8 -4
  227. package/src/Visuals/lyne.css +374 -9
  228. package/src/Visuals/osu.css +393 -11
  229. package/src/index.ts +178 -8
  230. package/dist/index.d.mts +0 -4612
  231. package/dist/index.d.ts +0 -4612
  232. package/src/Analysis/Passes/Analysis/__tests__/GradientAnalyzer.test.ts +0 -135
  233. package/src/Analysis/Passes/Analysis/__tests__/MergeableColorAnalyzer.test.ts +0 -84
  234. package/src/Analysis/Passes/Analysis/__tests__/RainbowAnalyzer.test.ts +0 -99
  235. package/src/Analysis/Passes/Analysis/__tests__/WaveAnalyzer.test.ts +0 -119
  236. package/src/Analysis/Passes/Decision/__tests__/DefaultDecision.test.ts +0 -179
  237. package/src/Analysis/__tests__/Integration.test.ts +0 -162
  238. package/src/Analysis/__tests__/Pipeline.test.ts +0 -133
  239. package/src/Diff/__tests__/TreeDiffer.test.ts +0 -65
  240. package/src/Incremental/__tests__/IncrementalParser.test.ts +0 -164
  241. package/src/Syntax/__tests__/GreenNode.test.ts +0 -33
  242. package/src/Syntax/__tests__/RedNode.test.ts +0 -81
  243. package/src/Syntax/__tests__/RedNodeStore.test.ts +0 -104
  244. package/src/Tests/ASTOptimizerIdempotence.test.ts +0 -77
  245. package/src/Tests/BlockPatcher.test.ts +0 -437
  246. package/src/Tests/BlockPatcherWindowed.test.ts +0 -364
  247. package/src/Tests/BoxDrawer.test.ts +0 -217
  248. package/src/Tests/BoxRichTitle.test.ts +0 -105
  249. package/src/Tests/Chars500kBenchmark.test.ts +0 -151
  250. package/src/Tests/Chars500kEdits.test.ts +0 -321
  251. package/src/Tests/CollabPositions.test.ts +0 -146
  252. package/src/Tests/CompilerPathProfiling.test.ts +0 -186
  253. package/src/Tests/DOMMorpher.test.ts +0 -142
  254. package/src/Tests/DomPatchPerf.test.ts +0 -60
  255. package/src/Tests/EffectSegments.snapshot.json +0 -616
  256. package/src/Tests/EffectSegments.test.ts +0 -68
  257. package/src/Tests/FindNodeAtOffset.test.ts +0 -65
  258. package/src/Tests/Fuzzer.test.ts +0 -166
  259. package/src/Tests/GreenNodePool.test.ts +0 -153
  260. package/src/Tests/Lexer.test.ts +0 -238
  261. package/src/Tests/LyneMode.test.ts +0 -291
  262. package/src/Tests/ModelCoherence.test.ts +0 -180
  263. package/src/Tests/Partition.test.ts +0 -238
  264. package/src/Tests/PluginTags.test.ts +0 -150
  265. package/src/Tests/ProblematicSection.test.ts +0 -46
  266. package/src/Tests/ProblematicSectionHTML.test.ts +0 -58
  267. package/src/Tests/RedReuse.test.ts +0 -134
  268. package/src/Tests/ReproDelete20k.test.ts +0 -62
  269. package/src/Tests/SemanticValidators.test.ts +0 -136
  270. package/src/Tests/StableNodeIds.test.ts +0 -210
  271. package/src/Tests/StudioColorBloat.test.ts +0 -25
  272. package/src/Tests/StudioDebugText.test.ts +0 -27
  273. package/src/Tests/StudioTrailingChar.test.ts +0 -25
  274. package/src/Tests/StudioValidText.test.ts +0 -25
  275. package/src/Tests/UrlImgBug.test.ts +0 -23
  276. package/src/Tests/VisualBuilderFidelity.test.ts +0 -105
  277. package/src/Tests/referenceDocument.ts +0 -119
  278. package/src/Utils/dom-to-svg.test.ts +0 -86
@@ -33,6 +33,28 @@
33
33
  color: #94C8EA;
34
34
  border-bottom: 1px solid rgba(126,184,224,0.7);
35
35
  }
36
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) a:has(img),
37
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) a:has(.bb-img),
38
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) a:has(svg),
39
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) a.bb-link-img {
40
+ border-bottom: none !important;
41
+ text-decoration: none !important;
42
+ display: inline-block;
43
+ vertical-align: middle;
44
+ }
45
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) a:has(img):hover,
46
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) a:has(.bb-img):hover,
47
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) a:has(svg):hover,
48
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) a.bb-link-img:hover {
49
+ border-bottom: none !important;
50
+ text-decoration: none !important;
51
+ }
52
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) a img,
53
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) a .bb-img {
54
+ vertical-align: middle;
55
+ border: none;
56
+ text-decoration: none;
57
+ }
36
58
 
37
59
  /* ─── Headings ───────────────────────────────────────── */
38
60
 
@@ -51,7 +73,7 @@
51
73
  .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) blockquote {
52
74
  padding: 0 0 0 20px;
53
75
  margin: 0 0 20px 0;
54
- border-left: 2px solid #D194B3;
76
+ border-left: 2px solid var(--osu-accent);
55
77
  color: #ffffff;
56
78
  font-style: normal;
57
79
  background: none;
@@ -61,8 +83,8 @@
61
83
  .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) pre {
62
84
  padding: 10px;
63
85
  margin-bottom: 10px;
64
- background: #1C1719;
65
- border: 1px solid #43383A;
86
+ background: var(--osu-code-bg);
87
+ border: 1px solid var(--osu-code-border);
66
88
  border-radius: 8px;
67
89
  overflow-x: auto;
68
90
  }
@@ -99,13 +121,22 @@
99
121
  /* ─── Spoiler ────────────────────────────────────────── */
100
122
 
101
123
  .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .spoiler {
102
- background: #000;
103
- color: #000;
104
- cursor: text;
124
+ background: #111111;
125
+ color: #111111;
126
+ cursor: pointer;
127
+ padding: 0 4px;
128
+ border-radius: 3px;
129
+ user-select: text;
130
+ transition: background 0.15s ease, color 0.15s ease;
131
+ }
132
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .spoiler:hover,
133
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .spoiler:active {
134
+ color: #ffffff;
135
+ background: #333333;
105
136
  }
106
137
  .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .spoiler::selection {
107
- color: #fff;
108
- background: #555;
138
+ color: #ffffff;
139
+ background: #555555;
109
140
  }
110
141
 
111
142
  /* ─── Box / Spoilerbox ───────────────────────────────── */
@@ -119,7 +150,7 @@
119
150
  .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) details summary {
120
151
  cursor: pointer;
121
152
  font-weight: 600;
122
- color: #D194B3;
153
+ color: var(--osu-accent);
123
154
  font-size: 13px;
124
155
  user-select: none;
125
156
  }
@@ -145,7 +176,7 @@
145
176
  display: list-item;
146
177
  }
147
178
  .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) li::marker {
148
- color: #D194B3;
179
+ color: var(--osu-accent);
149
180
  }
150
181
 
151
182
  /* ─── Media ──────────────────────────────────────────── */
@@ -164,7 +195,11 @@
164
195
  border-radius: 8px;
165
196
  }
166
197
  .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) audio {
198
+ /* inline-block: el preflight de Tailwind fuerza `audio{display:block}`
199
+ * y eso rompe el centrado por `text-align:center` de [centre]. */
200
+ display: inline-block;
167
201
  width: 100%;
202
+ max-width: 420px;
168
203
  }
169
204
 
170
205
  /* ─── Image Map ──────────────────────────────────────── */
@@ -237,7 +272,106 @@
237
272
  display: inline-block;
238
273
  transform: rotate(-5deg) scale(0.95);
239
274
  font-style: italic;
240
- color: #F0A0C0;
275
+ color: var(--osu-bloom);
276
+ }
277
+
278
+ /* ─── Semantic Spacing ───────────────────────────────── */
279
+
280
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .bbcode-sp {
281
+ display: block;
282
+ height: 0;
283
+ min-height: 0;
284
+ margin: 0;
285
+ padding: 0;
286
+ }
287
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .bbcode-para {
288
+ display: block;
289
+ height: 1em;
290
+ min-height: 12px;
291
+ padding: 0;
292
+ }
293
+
294
+ /* ─── Vocabulario de clases del dialecto osu ──────────────────────────────
295
+ *
296
+ * Con `dialect: 'osu'` el renderer emite los nombres de clase reales de osu!
297
+ * (`well`, `js-spoilerbox`, `imagemap__link`, …) en vez de los de Miliastry
298
+ * (`notice`, `imagemap-container`, …). Sobre osu.ppy.sh eso basta: su propia
299
+ * hoja los pinta. Fuera de ahí —el preview de la app, el HTML autónomo de
300
+ * `scripts/osu-inject.ts`— no hay nadie, y estas reglas son ese nadie.
301
+ *
302
+ * ── Un solo parámetro, como osu ──────────────────────────────────────
303
+ *
304
+ * osu! no hardcodea sus colores: define `--base-hue` y deriva todo con
305
+ * `hsl()`, porque el usuario elige el tono de su tema. Medirlos y copiar el
306
+ * resultado congelaría UN tema concreto. Así que aquí se reproduce la
307
+ * mecánica, no la foto: los pares saturación/luminosidad son fijos por rol
308
+ * (la familia `b` es fondo al 10%, la `l` enlaces al 40%) y el tono entra por
309
+ * variable.
310
+ *
311
+ * `var(--base-hue, 338)` consume el tono del documento cuando existe —en la
312
+ * página real de osu existe, y ahí gana el del usuario— y si no cae a 338.
313
+ *
314
+ * Ese respaldo NO es el tono de osu (253), y es deliberado: esta hoja se
315
+ * consume sobre todo DENTRO de Miliastry, cuyo modo osu tiene fondo rosado
316
+ * (`#2a1f23`, tono 338) y acento `--accent-pink` (~332). Cayendo al 253 se
317
+ * mezclaban morados de osu sobre un fondo rosa nuestro, que se veía «casi
318
+ * bien» y por eso no saltaba. Un host puede fijar `--base-hue` para forzar
319
+ * otro.
320
+ *
321
+ * Las reglas de arriba (`.notice`, `.imagemap-container`, `.imagemap-area`)
322
+ * siguen vivas: son los nombres que emiten los dialectos miliastry y lyne.
323
+ * Esta sección añade, no reemplaza.
324
+ */
325
+
326
+ /* Qué sigue al tono y qué no: EL CONTENIDO SIGUE, LAS SEÑALES NO.
327
+ *
328
+ * Lo que el BBCode pinta —citas, listas, código, cajas, enlaces— se deriva de
329
+ * `--osu-hue`, porque su color no significa nada por sí mismo: es la piel del
330
+ * documento. Lo que comunica un estado conserva su color fijo, porque ahí el
331
+ * color ES el mensaje: el rojo de `.media-error`, el negro sobre negro de
332
+ * `.spoiler` (que en osu es literalmente eso), el rosa de selección de las
333
+ * áreas de imagemap —una ayuda de edición, no contenido— y el degradado
334
+ * deliberadamente multicolor de `.sparkle`. Los blancos y los `rgba()`
335
+ * neutros tampoco: son veladuras, no color.
336
+ *
337
+ * Si vienes a "terminar el trabajo" convirtiendo los que quedan, esto es el
338
+ * porqué de que sigan ahí.
339
+ */
340
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) {
341
+ --osu-hue: var(--base-hue, 338);
342
+ --osu-bg-deep: hsl(var(--osu-hue), 10%, 15%); /* fondo hundido */
343
+ --osu-border: hsl(var(--osu-hue), 10%, 40%); /* borde sobre ese fondo */
344
+ --osu-link: hsl(var(--osu-hue), 40%, 75%); /* enlaces, perfiles, cajas */
345
+ --osu-link-hi: hsl(var(--osu-hue), 40%, 80%); /* el mismo, al pasar */
346
+ --osu-text: hsl(var(--osu-hue), 40%, 100%); /* texto sobre fondo hundido */
347
+
348
+ /* ── La escalera real de osu ──────────────────────────────────────────
349
+ * Leída de su página en vivo (`--hsl-*` sobre `.bbcode`), no deducida:
350
+ * osu define --base-hue y estos pares de saturación/luminosidad, y su
351
+ * `bbcode.less` asigna un rol a cada elemento. Los cinco alias de arriba
352
+ * son estos mismos: bg-deep = b5, border = b1, link = l2, link-hi = l1,
353
+ * text = c1. Se nombran los roles aparte para poder citar la hoja de osu
354
+ * por su nombre cuando se ajusta un elemento concreto. */
355
+ --osu-b1: hsl(var(--osu-hue), 10%, 40%);
356
+ --osu-b5: hsl(var(--osu-hue), 10%, 15%);
357
+ --osu-b6: hsl(var(--osu-hue), 10%, 10%);
358
+ --osu-c2: hsl(var(--osu-hue), 40%, 90%);
359
+ --osu-l1: hsl(var(--osu-hue), 40%, 80%);
360
+ --osu-l3: hsl(var(--osu-hue), 40%, 70%);
361
+
362
+ /* El acento del cuerpo en el look de MILIASTRY: filo de las citas,
363
+ * marcador de lista, título de `details`. Era el literal `#D194B3`, que es
364
+ * exactamente hsl(330,40%,70%) — o sea `l3`. osu usa otros roles en esos
365
+ * mismos elementos; ver el bloque `[data-dialect="osu"]` más abajo. */
366
+ --osu-accent: var(--osu-l3);
367
+ /* Superficie del bloque de código y su filo, look de Miliastry. Eran
368
+ * `#1C1719` —hsl(336,10%,10%), que es `b6`— y `#43383A`. Este último
369
+ * estaba en el tono 349, fuera de la familia; al derivarlo se corrige. */
370
+ --osu-code-bg: var(--osu-b6);
371
+ --osu-code-border: hsl(var(--osu-hue), 9%, 24%);
372
+ /* Adorno `.flower`: era `#F0A0C0`, hsl(336,73%,78%). Es de Miliastry, osu
373
+ * no tiene nada parecido. */
374
+ --osu-bloom: hsl(var(--osu-hue), 73%, 78%);
241
375
  }
242
376
 
243
377
  /* ─── Semantic Spacing ───────────────────────────────── */
@@ -255,3 +389,251 @@
255
389
  min-height: 12px;
256
390
  padding: 0;
257
391
  }
392
+
393
+ /* ─── Vocabulario de clases del dialecto osu ──────────────────────────────
394
+ *
395
+ * Con `dialect: 'osu'` el renderer emite los nombres de clase reales de osu!
396
+ * (`well`, `js-spoilerbox`, `imagemap__link`, …) en vez de los de Miliastry
397
+ * (`notice`, `imagemap-container`, …). Sobre osu.ppy.sh eso basta: su propia
398
+ * hoja los pinta. Fuera de ahí —el preview de la app, el HTML autónomo de
399
+ * `scripts/osu-inject.ts`— no hay nadie, y estas reglas son ese nadie.
400
+ *
401
+ * ── Un solo parámetro, como osu ──────────────────────────────────────
402
+ *
403
+ * osu! no hardcodea sus colores: define `--base-hue` y deriva todo con
404
+ * `hsl()`, porque el usuario elige el tono de su tema. Medirlos y copiar el
405
+ * resultado congelaría UN tema concreto. Así que aquí se reproduce la
406
+ * mecánica, no la foto: los pares saturación/luminosidad son fijos por rol
407
+ * (la familia `b` es fondo al 10%, la `l` enlaces al 40%) y el tono entra por
408
+ * variable.
409
+ *
410
+ * `var(--base-hue, 338)` consume el tono del documento cuando existe —en la
411
+ * página real de osu existe, y ahí gana el del usuario— y si no cae a 338.
412
+ *
413
+ * Ese respaldo NO es el tono de osu (253), y es deliberado: esta hoja se
414
+ * consume sobre todo DENTRO de Miliastry, cuyo modo osu tiene fondo rosado
415
+ * (`#2a1f23`, tono 338) y acento `--accent-pink` (~332). Cayendo al 253 se
416
+ * mezclaban morados de osu sobre un fondo rosa nuestro, que se veía «casi
417
+ * bien» y por eso no saltaba. Un host puede fijar `--base-hue` para forzar
418
+ * otro.
419
+ *
420
+ * Las reglas de arriba (`.notice`, `.imagemap-container`, `.imagemap-area`)
421
+ * siguen vivas: son los nombres que emiten los dialectos miliastry y lyne.
422
+ * Esta sección añade, no reemplaza.
423
+ */
424
+
425
+ /* Qué sigue al tono y qué no: EL CONTENIDO SIGUE, LAS SEÑALES NO.
426
+ *
427
+ * Lo que el BBCode pinta —citas, listas, código, cajas, enlaces— se deriva de
428
+ * `--osu-hue`, porque su color no significa nada por sí mismo: es la piel del
429
+ * documento. Lo que comunica un estado conserva su color fijo, porque ahí el
430
+ * color ES el mensaje: el rojo de `.media-error`, el negro sobre negro de
431
+ * `.spoiler` (que en osu es literalmente eso), el rosa de selección de las
432
+ * áreas de imagemap —una ayuda de edición, no contenido— y el degradado
433
+ * deliberadamente multicolor de `.sparkle`. Los blancos y los `rgba()`
434
+ * neutros tampoco: son veladuras, no color.
435
+ *
436
+ * Si vienes a "terminar el trabajo" convirtiendo los que quedan, esto es el
437
+ * porqué de que sigan ahí.
438
+ */
439
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) {
440
+ --osu-hue: var(--base-hue, 338);
441
+ --osu-bg-deep: hsl(var(--osu-hue), 10%, 15%); /* fondo hundido */
442
+ --osu-border: hsl(var(--osu-hue), 10%, 40%); /* borde sobre ese fondo */
443
+ --osu-link: hsl(var(--osu-hue), 40%, 75%); /* enlaces, perfiles, cajas */
444
+ --osu-link-hi: hsl(var(--osu-hue), 40%, 80%); /* el mismo, al pasar */
445
+ --osu-text: hsl(var(--osu-hue), 40%, 100%); /* texto sobre fondo hundido */
446
+
447
+ /* El acento del cuerpo: filo de las citas, marcador de lista, título de
448
+ * `details`. Era el literal `#D194B3`, que es exactamente hsl(330,40%,70%). */
449
+ --osu-accent: hsl(var(--osu-hue), 40%, 70%);
450
+ /* Superficie del bloque de código y su filo. Eran `#1C1719` —hsl(336,10%,10%)—
451
+ * y `#43383A`. Este último estaba en el tono 349, fuera de la familia; al
452
+ * derivarlo del tono se corrige de paso. */
453
+ --osu-code-bg: hsl(var(--osu-hue), 10%, 10%);
454
+ --osu-code-border: hsl(var(--osu-hue), 9%, 24%);
455
+ /* Adorno `.flower`: era `#F0A0C0`, hsl(336,73%,78%). */
456
+ --osu-bloom: hsl(var(--osu-hue), 73%, 78%);
457
+ }
458
+
459
+ /* Los enlaces de osu son del mismo morado que los perfiles, no azules. El
460
+ * azul de la sección base es el look de Miliastry, así que sólo se pisa
461
+ * cuando el preview declara el dialecto osu. */
462
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne)[data-dialect="osu"] a { color: var(--osu-link); }
463
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne)[data-dialect="osu"] a:hover { color: var(--osu-link-hi); border-bottom-color: var(--osu-link-hi); }
464
+
465
+ /* ── Roles de osu para el cuerpo del documento ────────────────────────────
466
+ * Fuente: `resources/css/bbcode.less` de osu-web, cruzada con la escalera
467
+ * medida en su página. Estos elementos tienen en Miliastry el acento rosa
468
+ * (`--osu-accent`), que es el look de la casa; bajo el dialecto osu mandan
469
+ * los roles de osu, igual que ya pasa arriba con los enlaces.
470
+ */
471
+
472
+ /* La cita no lleva acento: el texto Y la barra son `c2`, y la barra la pinta
473
+ * osu con un ::before de 2px redondeado. El borde izquierdo da el mismo
474
+ * resultado a esta anchura. */
475
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne)[data-dialect="osu"] blockquote {
476
+ color: var(--osu-c2);
477
+ border-left-color: var(--osu-c2);
478
+ }
479
+
480
+ /* El bloque de código es `b5` y NO lleva borde. El nuestro usaba `b6` con un
481
+ * filo, que es más oscuro y más marcado que el de osu. */
482
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne)[data-dialect="osu"] pre {
483
+ background: var(--osu-b5);
484
+ border: none;
485
+ }
486
+
487
+ /* El código en línea también es `b5`, plano: ni veladura blanca ni filo. */
488
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne)[data-dialect="osu"] code.inline {
489
+ background: var(--osu-b5);
490
+ border: none;
491
+ padding: 1px 4px;
492
+ }
493
+
494
+ /* `[heading]` no es blanco en osu, es `l1`. */
495
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne)[data-dialect="osu"] h2 {
496
+ color: var(--osu-l1);
497
+ }
498
+
499
+ /* osu no le da color al marcador de lista: hereda el del texto. El rosa es
500
+ * cosa nuestra. */
501
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne)[data-dialect="osu"] li::marker {
502
+ color: inherit;
503
+ }
504
+
505
+ /* El spoiler de osu es negro puro sobre negro puro, no un gris. */
506
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne)[data-dialect="osu"] .spoiler {
507
+ background: #000;
508
+ color: #000;
509
+ }
510
+
511
+ /* Notice — osu lo llama `well` */
512
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .well {
513
+ padding: 19px;
514
+ border: 2px solid var(--osu-border);
515
+ border-radius: 4px;
516
+ background: var(--osu-bg-deep);
517
+ color: var(--osu-text);
518
+ text-align: center;
519
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
520
+ }
521
+
522
+ /* Spoilerbox — estructura div > a(icono + texto) + div(cuerpo) */
523
+ /* osu no le pone caja propia al contenedor: el `margin: 8px 0` que trae
524
+ * `features/BBCode/styles.css` para el look de Miliastry sumaba 16px por
525
+ * caja (19 en una userpage real). Se declara a cero en vez de confiar en
526
+ * la especificidad, que aquí sólo ganaba en `display`. */
527
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .bbcode-spoilerbox { display: block; margin: 0; padding: 0; }
528
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .bbcode-spoilerbox__link {
529
+ display: inline-flex;
530
+ align-items: center;
531
+ color: var(--osu-link);
532
+ font-weight: 700;
533
+ text-decoration: none;
534
+ cursor: pointer;
535
+ /* osu lo deja al 100%; `features/BBCode/styles.css` lo baja a 0.85em para el
536
+ * look de Miliastry. Bajo este dialecto manda el de osu. */
537
+ font-size: 1em;
538
+ line-height: inherit;
539
+ /* Un `inline-flex` se alinea sobre la línea base del texto, así que el
540
+ * navegador reserva hueco para los descendentes DEBAJO y la caja crece de
541
+ * 21px a 26px. osu no lo sufre porque su icono es un glifo de fuente, que
542
+ * aporta una línea base real; el nuestro es un triángulo CSS sin texto y la
543
+ * base se sintetiza desde el borde inferior. Alinear arriba elimina el
544
+ * hueco: el enlace es el único contenido de su línea, así que `top` no
545
+ * cambia nada más. Medido: 26px -> 21px, que es lo que mide en osu. */
546
+ vertical-align: top;
547
+ }
548
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .bbcode-spoilerbox__link:hover { color: var(--osu-link-hi); border-bottom: none; }
549
+
550
+ /* El icono de osu es un glifo de Font Awesome 5, que no distribuimos. Este es
551
+ * un triángulo CSS equivalente: apunta a la derecha cerrado y rota al abrir.
552
+ * osu cambia de glifo en vez de rotar; el efecto leído es el mismo. Hereda
553
+ * `currentColor`, así que sigue al tono sin declarar nada. */
554
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .bbcode-spoilerbox__link-icon {
555
+ display: block;
556
+ position: relative;
557
+ flex: none;
558
+ width: 20px;
559
+ height: 21px;
560
+ }
561
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .bbcode-spoilerbox__link-icon::before {
562
+ content: "";
563
+ position: absolute;
564
+ top: 50%;
565
+ left: 5px;
566
+ width: 0;
567
+ height: 0;
568
+ border-left: 5px solid currentColor;
569
+ border-top: 4px solid transparent;
570
+ border-bottom: 4px solid transparent;
571
+ transform: translateY(-50%);
572
+ transform-origin: 2px 50%;
573
+ transition: transform 0.12s ease;
574
+ }
575
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .js-spoilerbox--open .bbcode-spoilerbox__link-icon::before {
576
+ transform: translateY(-50%) rotate(90deg);
577
+ }
578
+
579
+ /* El cuerpo arranca oculto. Lo abre la clase `js-spoilerbox--open` en el
580
+ * CONTENEDOR, que pone `bindBoxDrawer`. */
581
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .bbcode-spoilerbox__body {
582
+ display: none;
583
+ margin: 10px 0 0;
584
+ padding: 0 0 0 20px;
585
+ }
586
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .js-spoilerbox--open > .bbcode-spoilerbox__body { display: block; }
587
+
588
+ /* Imagemap — el contenedor ancla; los enlaces van absolutos con el
589
+ * left/top/width/height en % que el renderer escribe en el style inline.
590
+ * Sin el `position: relative` los enlaces caen al flujo. */
591
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .imagemap {
592
+ display: inline-block;
593
+ position: relative;
594
+ max-width: max-content;
595
+ }
596
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .imagemap__image {
597
+ display: inline;
598
+ max-width: 100%;
599
+ vertical-align: middle;
600
+ }
601
+ /* Transparentes en reposo, como en osu. El realce al pasar por encima es
602
+ * nuestro: en un editor conviene ver dónde están las áreas, y no altera la
603
+ * apariencia estática. */
604
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .imagemap__link {
605
+ display: block;
606
+ position: absolute;
607
+ box-sizing: border-box;
608
+ border-radius: 4px;
609
+ text-decoration: none;
610
+ transition: background-color 0.08s linear, box-shadow 0.08s linear;
611
+ }
612
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .imagemap__link:hover {
613
+ background: hsl(var(--osu-hue), 40%, 75%, 0.22);
614
+ box-shadow: inset 0 0 0 1.5px var(--osu-link);
615
+ border-bottom: none;
616
+ }
617
+
618
+ /* Alineación */
619
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .bbcode__align-centre { display: block; text-align: center; }
620
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .bbcode__align-left { display: block; text-align: left; }
621
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .bbcode__align-right { display: block; text-align: right; }
622
+
623
+ /* Perfil */
624
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .user-name {
625
+ display: inline;
626
+ color: var(--osu-link);
627
+ font-weight: 700;
628
+ text-decoration: none;
629
+ }
630
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .user-name:hover { color: var(--osu-link-hi); border-bottom: none; }
631
+
632
+ /* YouTube */
633
+ .bbcode-preview:not(.bbcode-preview-lyne):not(.theme-lyne) .u-embed-wide--bbcode {
634
+ display: inline-block;
635
+ width: 100%;
636
+ max-width: 425px;
637
+ aspect-ratio: 16 / 9;
638
+ border: 0;
639
+ }