@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
package/README.md CHANGED
@@ -42,4 +42,4 @@ Quasar's internal architecture is highly advanced. If you want to understand how
42
42
 
43
43
  [**Miliastry Source License (MSL-1.0)**](LICENSE) — Copyright (c) 2026 hxovc / Miliastry Team.
44
44
 
45
- Quasar is Source-Available under a custom license designed to protect the Miliastry ecosystem. You can use, modify, and distribute the engine for any project—including standard visual BBCode editors or osu! profile tools—**except** for creating a Competing Product (i.e., a direct clone of Miliastry Nova as an integrated IDE, or a competing standalone engine based on this code). The license automatically converts to a standard MIT License 2 years after each commit.
45
+ Quasar is Source-Available under a custom license designed to protect the Miliastry ecosystem. You can use, modify, and distribute the engine for any project—including standard visual BBCode editors or osu! profile tools—**except** for creating a Competing Product (i.e., a direct clone of Miliastry Nova as an integrated IDE, or a competing standalone engine based on this code).
@@ -6,21 +6,45 @@
6
6
  *
7
7
  * Scoped under `.bbcode-preview-lyne` and `.theme-lyne`.
8
8
  * All rules strictly override default/osu.css styles to ensure 0% pink bleed.
9
+ *
10
+ * No `@import` of Google Fonts here — the host supplies the faces.
11
+ *
12
+ * This file used to open with
13
+ * @import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono…&family=Saira+Condensed…&family=Saira…')
14
+ * and that line broke the desktop app. Chromium reports a stylesheet as FAILED
15
+ * when any of its @imports fails to load, so under a CSP whose `style-src` does
16
+ * not list fonts.googleapis.com (Tauri's) — or simply with no network — the CSS
17
+ * chunk carrying this file rejected, the dynamic import of the whole BBCode
18
+ * feature rejected with it, and the kernel booted without an editor.
19
+ *
20
+ * Miliastry self-hosts these families with next/font and publishes them as
21
+ * `--font-syne-display` / `--font-syne-body` / `--font-syne-mono` (app/layout.tsx;
22
+ * `[data-theme='syne']` in globals.css reads the same variables). They are
23
+ * used when present; the plain family names remain as the fallback for a host
24
+ * that installs the fonts by other means.
9
25
  */
10
26
 
11
- @import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=Saira+Condensed:wght@600;700&family=Saira:wght@400;600&display=swap');
12
-
13
- :root {
27
+ .theme-lyne,
28
+ .bbcode-preview-lyne,
29
+ [data-theme='syne'],
30
+ [data-dialect='lyne'] {
14
31
  --color-accent: #2EE6E2;
15
32
  --color-accent-bright: #68FFF8;
16
33
  --color-warning: #FFC34D;
34
+ --color-danger: #FF3B5C;
17
35
  --color-text-primary: #FFFFFF;
18
36
  --color-text-mid: #9EACD4;
19
37
  --color-text-dim: #606C8F;
20
38
  --color-hairline: rgba(255, 255, 255, 0.12);
21
- --font-display: "Saira Condensed", sans-serif;
22
- --font-body: "Saira", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
23
- --font-numeric: "IBM Plex Mono", monospace;
39
+ --color-hairline-bright: rgba(142, 155, 196, 0.35);
40
+ --color-surface: #0B1024;
41
+ --color-surface-bright: #141C3C;
42
+ --color-inset-well: #080D20;
43
+ --color-on-accent: #05060F;
44
+ --cut-control: 10px;
45
+ --font-display: var(--font-syne-display, "Saira Condensed"), "Saira Condensed", sans-serif;
46
+ --font-body: var(--font-syne-body, "Saira"), "Saira", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
47
+ --font-numeric: var(--font-syne-mono, "IBM Plex Mono"), "IBM Plex Mono", monospace;
24
48
  --lyne-cut: 8px;
25
49
  }
26
50
 
@@ -52,6 +76,41 @@
52
76
  border-bottom-color: var(--color-accent, #2EE6E2) !important;
53
77
  }
54
78
 
79
+ .bbcode-preview-lyne a:has(img),
80
+ .bbcode-preview-lyne a:has(.bb-img),
81
+ .bbcode-preview-lyne a:has(svg),
82
+ .bbcode-preview-lyne a.bb-link-img,
83
+ .bbcode-preview.theme-lyne a:has(img),
84
+ .bbcode-preview.theme-lyne a:has(.bb-img),
85
+ .bbcode-preview.theme-lyne a:has(svg),
86
+ .bbcode-preview.theme-lyne a.bb-link-img {
87
+ border-bottom: none !important;
88
+ text-decoration: none !important;
89
+ display: inline-block;
90
+ vertical-align: middle;
91
+ }
92
+
93
+ .bbcode-preview-lyne a:has(img):hover,
94
+ .bbcode-preview-lyne a:has(.bb-img):hover,
95
+ .bbcode-preview-lyne a:has(svg):hover,
96
+ .bbcode-preview-lyne a.bb-link-img:hover,
97
+ .bbcode-preview.theme-lyne a:has(img):hover,
98
+ .bbcode-preview.theme-lyne a:has(.bb-img):hover,
99
+ .bbcode-preview.theme-lyne a:has(svg):hover,
100
+ .bbcode-preview.theme-lyne a.bb-link-img:hover {
101
+ border-bottom: none !important;
102
+ text-decoration: none !important;
103
+ }
104
+
105
+ .bbcode-preview-lyne a img,
106
+ .bbcode-preview-lyne a .bb-img,
107
+ .bbcode-preview.theme-lyne a img,
108
+ .bbcode-preview.theme-lyne a .bb-img {
109
+ vertical-align: middle;
110
+ border: none;
111
+ text-decoration: none;
112
+ }
113
+
55
114
  /* Forum @mentions — inherit the accent link look, slightly bolder so they
56
115
  read as handles rather than plain links. */
57
116
  .bbcode-preview-lyne a.bb-mention,
@@ -862,9 +921,256 @@
862
921
  margin: 4px 0 !important;
863
922
  }
864
923
 
865
- /* Audio: replica el .bbAudio original de Lyne (bloque centrado, ancho máx). */
866
- .bb-audio {
867
- display: block !important;
924
+ /* ─── Audio: LINE chrome redesign (spec docs/design-spec/bbcode-audio-player) ── */
925
+ .bbcode-preview-lyne .lx-audio,
926
+ .bbcode-preview.theme-lyne .lx-audio,
927
+ [data-theme='syne'] .lx-audio,
928
+ [data-dialect='lyne'] .lx-audio,
929
+ .lx-audio {
930
+ --c: var(--cut-control, 10px);
931
+ display: inline-block !important;
932
+ width: 100% !important;
933
+ max-width: 560px !important;
934
+ margin: 14px 0 !important;
935
+ background:
936
+ linear-gradient(180deg, var(--color-surface-bright, #141C3C) 0%, var(--color-surface, #0B1024) 38%, var(--color-inset-well, #080D20) 100%) !important;
937
+ border: 1px solid var(--color-hairline-bright, rgba(142, 155, 196, 0.35)) !important;
938
+ clip-path: polygon(var(--c) 0, 100% 0, 100% calc(100% - var(--c)), calc(100% - var(--c)) 100%, 0 100%, 0 var(--c)) !important;
939
+ position: relative;
940
+ font-family: var(--font-body, "Saira", sans-serif);
941
+ transition: border-color 120ms cubic-bezier(0.16, 1.0, 0.3, 1.0);
942
+ text-align: left;
943
+ box-sizing: border-box;
944
+ vertical-align: middle;
945
+ }
946
+ .lx-audio audio {
947
+ position: absolute !important;
948
+ width: 1px !important;
949
+ height: 1px !important;
950
+ opacity: 0 !important;
951
+ pointer-events: none !important;
952
+ clip: rect(0, 0, 0, 0) !important;
953
+ }
954
+ .lx-audio:hover {
955
+ border-color: rgba(46, 230, 226, 0.45) !important;
956
+ }
957
+ .lx-audio.is-playing {
958
+ border-color: rgba(46, 230, 226, 0.6) !important;
959
+ }
960
+
961
+ /* thin accent baseline — the "catch line" motif; fills with progress */
962
+ .lx-audio .lx-track {
963
+ position: relative;
964
+ height: 12px;
965
+ cursor: pointer;
966
+ background:
967
+ repeating-linear-gradient(-45deg, rgba(142,155,196,0.10) 0 2px, transparent 2px 9px),
968
+ var(--color-inset-well, #080D20);
969
+ }
970
+ .lx-audio .lx-track .fill {
971
+ position: absolute;
972
+ inset: 0 auto 0 0;
973
+ width: 0%;
974
+ background: linear-gradient(90deg, rgba(46,230,226,0.10), rgba(46,230,226,0.22));
975
+ border-right: 2px solid var(--color-accent, #2EE6E2);
976
+ box-shadow: 0 0 12px rgba(46, 230, 226, 0.55);
977
+ }
978
+ .lx-audio .lx-row {
979
+ display: flex;
980
+ align-items: center;
981
+ gap: 14px;
982
+ padding: 10px 16px 12px;
983
+ }
984
+ .lx-audio .lx-btn {
985
+ flex: none;
986
+ width: 40px;
987
+ height: 40px;
988
+ display: grid;
989
+ place-items: center;
990
+ background: var(--color-accent, #2EE6E2);
991
+ color: var(--color-on-accent, #05060F);
992
+ cursor: pointer;
993
+ border: none;
994
+ clip-path: polygon(var(--c) 0, 100% 0, 100% calc(100% - var(--c)), calc(100% - var(--c)) 100%, 0 100%, 0 var(--c));
995
+ transition: background 120ms cubic-bezier(0.16, 1.0, 0.3, 1.0), transform 120ms cubic-bezier(0.16, 1.0, 0.3, 1.0);
996
+ }
997
+ .lx-audio .lx-btn:hover {
998
+ background: var(--color-accent-bright, #7FF5F0);
999
+ }
1000
+ .lx-audio .lx-btn:active {
1001
+ transform: scale(0.94);
1002
+ }
1003
+ .lx-audio .lx-btn svg {
1004
+ width: 16px;
1005
+ height: 16px;
1006
+ fill: var(--color-on-accent, #05060F);
1007
+ }
1008
+
1009
+ .lx-audio .lx-title {
1010
+ flex: 1;
1011
+ min-width: 0;
1012
+ }
1013
+ .lx-audio .lx-title .name {
1014
+ font-family: var(--font-display, "Saira Condensed", sans-serif);
1015
+ font-weight: 600;
1016
+ font-size: 16px;
1017
+ text-transform: uppercase;
1018
+ letter-spacing: 1px;
1019
+ white-space: nowrap;
1020
+ overflow: hidden;
1021
+ text-overflow: ellipsis;
1022
+ color: var(--color-text-primary, #F2F5FF);
1023
+ }
1024
+ .lx-audio .lx-title .label {
1025
+ font-family: var(--font-numeric, "IBM Plex Mono", monospace);
1026
+ font-size: 10px;
1027
+ font-weight: 500;
1028
+ letter-spacing: 2px;
1029
+ text-transform: uppercase;
1030
+ color: var(--color-text-dim, #8E9BC4);
1031
+ display: flex;
1032
+ align-items: center;
1033
+ gap: 6px;
1034
+ margin-top: 1px;
1035
+ }
1036
+ .lx-audio .lx-title .label .dot {
1037
+ width: 5px;
1038
+ height: 5px;
1039
+ background: var(--color-text-dim, #8E9BC4);
1040
+ flex: none;
1041
+ transition: background 120ms;
1042
+ }
1043
+ .lx-audio.is-playing .lx-title .label .dot {
1044
+ background: var(--color-accent, #2EE6E2);
1045
+ box-shadow: 0 0 6px rgba(46,230,226,0.9);
1046
+ animation: lx-beat 606ms infinite;
1047
+ }
1048
+ @keyframes lx-beat {
1049
+ 0% { transform: scale(1.25); }
1050
+ 100% { transform: scale(1); }
1051
+ }
1052
+
1053
+ .lx-audio .lx-vol {
1054
+ display: flex;
1055
+ align-items: center;
1056
+ gap: 6px;
1057
+ flex: none;
1058
+ }
1059
+ .lx-audio .lx-vol-btn {
1060
+ background: none;
1061
+ border: none;
1062
+ padding: 2px;
1063
+ cursor: pointer;
1064
+ display: grid;
1065
+ place-items: center;
1066
+ color: var(--color-text-dim, #8E9BC4);
1067
+ transition: color 120ms cubic-bezier(0.16, 1.0, 0.3, 1.0);
1068
+ }
1069
+ .lx-audio .lx-vol-btn:hover {
1070
+ color: var(--color-accent, #2EE6E2);
1071
+ }
1072
+ .lx-audio .lx-vol-btn svg {
1073
+ width: 14px;
1074
+ height: 14px;
1075
+ fill: currentColor;
1076
+ }
1077
+ .lx-audio .lx-vol-slider {
1078
+ -webkit-appearance: none;
1079
+ appearance: none;
1080
+ width: 56px;
1081
+ height: 4px;
1082
+ background: var(--color-inset-well, #080D20);
1083
+ border: 1px solid var(--color-hairline, rgba(142, 155, 196, 0.25));
1084
+ outline: none;
1085
+ cursor: pointer;
1086
+ border-radius: 0;
1087
+ vertical-align: middle;
1088
+ }
1089
+ .lx-audio .lx-vol-slider::-webkit-slider-thumb {
1090
+ -webkit-appearance: none;
1091
+ appearance: none;
1092
+ width: 8px;
1093
+ height: 12px;
1094
+ background: var(--color-accent, #2EE6E2);
1095
+ clip-path: polygon(2px 0, 100% 0, 100% calc(100% - 2px), calc(100% - 2px) 100%, 0 100%, 0 2px);
1096
+ cursor: pointer;
1097
+ transition: transform 120ms, background 120ms;
1098
+ }
1099
+ .lx-audio .lx-vol-slider::-moz-range-thumb {
1100
+ width: 8px;
1101
+ height: 12px;
1102
+ border: none;
1103
+ border-radius: 0;
1104
+ background: var(--color-accent, #2EE6E2);
1105
+ clip-path: polygon(2px 0, 100% 0, 100% calc(100% - 2px), calc(100% - 2px) 100%, 0 100%, 0 2px);
1106
+ cursor: pointer;
1107
+ }
1108
+ .lx-audio .lx-vol-slider:hover::-webkit-slider-thumb {
1109
+ background: var(--color-accent-bright, #7FF5F0);
1110
+ transform: scaleY(1.15);
1111
+ }
1112
+ .lx-audio .lx-vol-slider:hover::-moz-range-thumb {
1113
+ background: var(--color-accent-bright, #7FF5F0);
1114
+ }
1115
+
1116
+ .lx-audio .lx-time {
1117
+ flex: none;
1118
+ font-family: var(--font-numeric, "IBM Plex Mono", monospace);
1119
+ font-weight: 500;
1120
+ font-size: 12px;
1121
+ letter-spacing: 0.5px;
1122
+ color: var(--color-text-mid, #AAB6DE);
1123
+ font-variant-numeric: tabular-nums;
1124
+ }
1125
+ .lx-audio .lx-time .cur {
1126
+ color: var(--color-text-primary, #F2F5FF);
1127
+ }
1128
+
1129
+ .lx-audio .lx-speed {
1130
+ flex: none;
1131
+ font-family: var(--font-numeric, "IBM Plex Mono", monospace);
1132
+ font-size: 11px;
1133
+ font-weight: 500;
1134
+ color: var(--color-text-dim, #8E9BC4);
1135
+ background: none;
1136
+ border: 1px solid var(--color-hairline, rgba(142, 155, 196, 0.18));
1137
+ padding: 3px 8px;
1138
+ cursor: pointer;
1139
+ letter-spacing: 1px;
1140
+ clip-path: polygon(5px 0, 100% 0, 100% calc(100% - 5px), calc(100% - 5px) 100%, 0 100%, 0 5px);
1141
+ transition: color 120ms, border-color 120ms;
1142
+ }
1143
+ .lx-audio .lx-speed:hover {
1144
+ color: var(--color-accent, #2EE6E2);
1145
+ border-color: rgba(46,230,226,0.4);
1146
+ }
1147
+ .lx-audio .lx-speed.active {
1148
+ color: var(--color-accent, #2EE6E2);
1149
+ border-color: rgba(46,230,226,0.5);
1150
+ }
1151
+
1152
+ /* states */
1153
+ .lx-audio.is-loading .lx-btn svg {
1154
+ opacity: 0.3;
1155
+ }
1156
+ .lx-audio.is-loading .fill {
1157
+ border-right-color: var(--color-text-dim, #8E9BC4);
1158
+ box-shadow: none;
1159
+ }
1160
+ .lx-audio.is-error {
1161
+ border-color: rgba(255, 59, 92, 0.5) !important;
1162
+ }
1163
+ .lx-audio.is-error .fill {
1164
+ border-right-color: var(--color-danger, #FF3B5C);
1165
+ box-shadow: 0 0 12px rgba(255,59,92,0.5);
1166
+ }
1167
+ .lx-audio.is-error .lx-title .label {
1168
+ color: var(--color-danger, #FF3B5C);
1169
+ }
1170
+
1171
+ /* Fallback si se usa audio nativo directo */
1172
+ audio.bb-audio {
1173
+ display: inline-block !important;
868
1174
  width: 100% !important;
869
1175
  max-width: 420px !important;
870
1176
  margin: 10px 0 !important;
@@ -1121,3 +1427,62 @@
1121
1427
  background-clip: text !important;
1122
1428
  color: transparent !important;
1123
1429
  }
1430
+
1431
+ /* ─── Lyne (SYNE) Preview Highlight Overrides ────────────────────────────── */
1432
+
1433
+ .theme-lyne [data-bbid]:hover:not(:has([data-bbid]:hover, [data-node-id]:hover)),
1434
+ .bbcode-preview-lyne [data-bbid]:hover:not(:has([data-bbid]:hover, [data-node-id]:hover)) {
1435
+ outline: 1.5px solid #2EE6E2 !important;
1436
+ background-color: rgba(46, 230, 226, 0.1) !important;
1437
+ box-shadow: 0 0 8px rgba(46, 230, 226, 0.25) !important;
1438
+ }
1439
+
1440
+ .theme-lyne[data-hover-highlight="on"] [data-bbid]:hover:not(:has([data-bbid]:hover, [data-node-id]:hover)),
1441
+ .bbcode-preview-lyne[data-hover-highlight="on"] [data-bbid]:hover:not(:has([data-bbid]:hover, [data-node-id]:hover)),
1442
+ .theme-lyne[data-hover-highlight="on"] [data-node-id]:hover:not(:has([data-bbid]:hover, [data-node-id]:hover)),
1443
+ .bbcode-preview-lyne[data-hover-highlight="on"] [data-node-id]:hover:not(:has([data-bbid]:hover, [data-node-id]:hover)) {
1444
+ outline: 1px dashed rgba(46, 230, 226, 0.55) !important;
1445
+ box-shadow: 0 0 6px rgba(46, 230, 226, 0.2) !important;
1446
+ }
1447
+
1448
+ .theme-lyne [data-node-id].cursor-highlight,
1449
+ .bbcode-preview-lyne [data-node-id].cursor-highlight,
1450
+ .theme-lyne .cursor-highlight,
1451
+ .bbcode-preview-lyne .cursor-highlight {
1452
+ outline: 2px solid #2EE6E2 !important;
1453
+ background-color: rgba(46, 230, 226, 0.18) !important;
1454
+ box-shadow: 0 0 12px rgba(46, 230, 226, 0.35) !important;
1455
+ }
1456
+
1457
+ .theme-lyne .bb-empty-line.cursor-highlight,
1458
+ .bbcode-preview-lyne .bb-empty-line.cursor-highlight {
1459
+ background-color: rgba(46, 230, 226, 0.22) !important;
1460
+ outline: 2px solid #2EE6E2 !important;
1461
+ box-shadow: 0 0 8px rgba(46, 230, 226, 0.3) !important;
1462
+ }
1463
+
1464
+ .theme-lyne[data-hover-highlight="on"] .bb-empty-line:hover,
1465
+ .bbcode-preview-lyne[data-hover-highlight="on"] .bb-empty-line:hover {
1466
+ outline: 1px dashed rgba(46, 230, 226, 0.55) !important;
1467
+ background-color: rgba(46, 230, 226, 0.1) !important;
1468
+ }
1469
+
1470
+ .theme-lyne div.bb-block.cursor-highlight::after,
1471
+ .bbcode-preview-lyne div.bb-block.cursor-highlight::after {
1472
+ box-shadow: inset 0 0 0 2px #2EE6E2, 0 0 10px rgba(46, 230, 226, 0.35) !important;
1473
+ background-color: rgba(46, 230, 226, 0.18) !important;
1474
+ }
1475
+
1476
+ .theme-lyne span.bb-block.cursor-highlight,
1477
+ .bbcode-preview-lyne span.bb-block.cursor-highlight {
1478
+ outline: 2px solid #2EE6E2 !important;
1479
+ background-color: rgba(46, 230, 226, 0.18) !important;
1480
+ box-shadow: 0 0 8px rgba(46, 230, 226, 0.3) !important;
1481
+ }
1482
+
1483
+ .theme-lyne ::selection,
1484
+ .bbcode-preview-lyne ::selection {
1485
+ background-color: rgba(46, 230, 226, 0.3) !important;
1486
+ color: #ffffff !important;
1487
+ }
1488
+