synthos 0.7.2 → 0.9.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 (380) hide show
  1. package/README.md +215 -65
  2. package/default-pages/application/page.html +42 -0
  3. package/default-pages/application/page.json +10 -0
  4. package/default-pages/elevenlabs_effects_studio/page.html +1363 -0
  5. package/default-pages/elevenlabs_effects_studio/page.json +11 -0
  6. package/default-pages/elevenlabs_voice_studio/page.html +801 -0
  7. package/default-pages/elevenlabs_voice_studio/page.json +11 -0
  8. package/default-pages/{json_tools.html → json_tools/page.html} +13 -11
  9. package/default-pages/json_tools/page.json +10 -0
  10. package/default-pages/my_notes/notes/a1b2c3d4-e5f6-7890-abcd-ef1234567890.json +5 -0
  11. package/default-pages/my_notes/page.html +132 -0
  12. package/default-pages/{my_notes.json → my_notes/page.json} +2 -2
  13. package/default-pages/neon_asteroids/files/Ambient_Space.mp3 +0 -0
  14. package/default-pages/neon_asteroids/files/Ambient_Space2.mp3 +0 -0
  15. package/default-pages/neon_asteroids/files/Ambient_Space3.mp3 +0 -0
  16. package/default-pages/neon_asteroids/files/Asteroid_Explosion.mp3 +0 -0
  17. package/default-pages/neon_asteroids/files/Hyperspace_Jump.mp3 +0 -0
  18. package/default-pages/neon_asteroids/files/Laser_Fire.mp3 +0 -0
  19. package/default-pages/neon_asteroids/files/Menu_Navigate.mp3 +0 -0
  20. package/default-pages/neon_asteroids/files/Power_Up_Collect.mp3 +0 -0
  21. package/default-pages/neon_asteroids/files/Saucer_Alert.mp3 +0 -0
  22. package/default-pages/neon_asteroids/files/Ship_Thrust.mp3 +0 -0
  23. package/default-pages/neon_asteroids/files/effects.json +74 -0
  24. package/default-pages/neon_asteroids/page.html +1822 -0
  25. package/default-pages/{neon_asteroids.json → neon_asteroids/page.json} +3 -3
  26. package/default-pages/oregon_trail/page.html +323 -0
  27. package/default-pages/oregon_trail/page.json +12 -0
  28. package/default-pages/retro_game_starter/page.html +1308 -0
  29. package/default-pages/retro_game_starter/page.json +12 -0
  30. package/default-pages/{sidebar_builder.html → sidebar_page/page.html} +12 -10
  31. package/default-pages/sidebar_page/page.json +10 -0
  32. package/default-pages/{solar_explorer.html → solar_explorer/page.html} +24 -29
  33. package/default-pages/{solar_explorer.json → solar_explorer/page.json} +4 -4
  34. package/default-pages/{solar_tutorial.html → solar_tutorial/page.html} +12 -10
  35. package/default-pages/solar_tutorial/page.json +10 -0
  36. package/default-pages/{two-panel_builder.html → two-panel_page/page.html} +13 -11
  37. package/default-pages/two-panel_page/page.json +10 -0
  38. package/default-pages/us_map/page.html +193 -0
  39. package/default-pages/us_map/page.json +12 -0
  40. package/default-pages/us_map_1850/page.html +326 -0
  41. package/default-pages/us_map_1850/page.json +12 -0
  42. package/default-pages/western_cities_1850/page.html +527 -0
  43. package/default-pages/western_cities_1850/page.json +12 -0
  44. package/default-themes/aurora-dawn.json +19 -0
  45. package/default-themes/aurora-dawn.v3.css +198 -0
  46. package/default-themes/aurora-dusk.json +19 -0
  47. package/default-themes/aurora-dusk.v3.css +200 -0
  48. package/default-themes/cosmos-dawn.json +19 -0
  49. package/default-themes/cosmos-dawn.v3.css +198 -0
  50. package/default-themes/cosmos-dusk.json +19 -0
  51. package/default-themes/cosmos-dusk.v3.css +200 -0
  52. package/default-themes/high-contrast-dark.json +19 -0
  53. package/default-themes/high-contrast-dark.v3.css +200 -0
  54. package/default-themes/high-contrast-light.json +19 -0
  55. package/default-themes/high-contrast-light.v3.css +198 -0
  56. package/default-themes/{nebula-dawn.css → nebula-dawn.v2.css} +134 -0
  57. package/default-themes/nebula-dawn.v3.css +199 -0
  58. package/default-themes/{nebula-dusk.css → nebula-dusk.v2.css} +128 -0
  59. package/default-themes/nebula-dusk.v3.css +201 -0
  60. package/default-themes/solar-flare-dawn.json +19 -0
  61. package/default-themes/solar-flare-dawn.v3.css +198 -0
  62. package/default-themes/solar-flare-dusk.json +19 -0
  63. package/default-themes/solar-flare-dusk.v3.css +200 -0
  64. package/dist/agents/a2a/a2aProvider.d.ts.map +1 -0
  65. package/dist/agents/a2a/a2aProvider.js +126 -0
  66. package/dist/agents/a2a/a2aProvider.js.map +1 -0
  67. package/dist/agents/discovery.d.ts.map +1 -0
  68. package/dist/agents/discovery.js +52 -0
  69. package/dist/agents/discovery.js.map +1 -0
  70. package/dist/agents/index.d.ts +7 -0
  71. package/dist/agents/index.d.ts.map +1 -0
  72. package/dist/agents/index.js +20 -0
  73. package/dist/agents/index.js.map +1 -0
  74. package/dist/agents/openclaw/gatewayManager.d.ts +117 -0
  75. package/dist/agents/openclaw/gatewayManager.d.ts.map +1 -0
  76. package/dist/agents/openclaw/gatewayManager.js +486 -0
  77. package/dist/agents/openclaw/gatewayManager.js.map +1 -0
  78. package/dist/agents/openclaw/openclawProvider.d.ts.map +1 -0
  79. package/dist/agents/openclaw/openclawProvider.js +237 -0
  80. package/dist/agents/openclaw/openclawProvider.js.map +1 -0
  81. package/dist/agents/openclaw/sshTunnelManager.d.ts +25 -0
  82. package/dist/agents/openclaw/sshTunnelManager.d.ts.map +1 -0
  83. package/dist/agents/openclaw/sshTunnelManager.js +359 -0
  84. package/dist/agents/openclaw/sshTunnelManager.js.map +1 -0
  85. package/dist/agents/types.d.ts.map +1 -0
  86. package/dist/agents/types.js +6 -0
  87. package/dist/agents/types.js.map +1 -0
  88. package/dist/builders/anthropic.d.ts +31 -0
  89. package/dist/builders/anthropic.d.ts.map +1 -0
  90. package/dist/builders/anthropic.js +227 -0
  91. package/dist/builders/anthropic.js.map +1 -0
  92. package/dist/builders/fireworksai.d.ts +9 -0
  93. package/dist/builders/fireworksai.d.ts.map +1 -0
  94. package/dist/builders/fireworksai.js +57 -0
  95. package/dist/builders/fireworksai.js.map +1 -0
  96. package/dist/builders/index.d.ts +13 -0
  97. package/dist/builders/index.d.ts.map +1 -0
  98. package/dist/builders/index.js +31 -0
  99. package/dist/builders/index.js.map +1 -0
  100. package/dist/builders/openai.d.ts +8 -0
  101. package/dist/builders/openai.d.ts.map +1 -0
  102. package/dist/builders/openai.js +87 -0
  103. package/dist/builders/openai.js.map +1 -0
  104. package/dist/builders/types.d.ts +54 -0
  105. package/dist/builders/types.d.ts.map +1 -0
  106. package/dist/builders/types.js +211 -0
  107. package/dist/builders/types.js.map +1 -0
  108. package/dist/connectors/index.d.ts.map +1 -1
  109. package/dist/connectors/index.js +3 -2
  110. package/dist/connectors/index.js.map +1 -1
  111. package/dist/connectors/registry.d.ts +2 -1
  112. package/dist/connectors/registry.d.ts.map +1 -1
  113. package/dist/connectors/registry.js +65 -96
  114. package/dist/connectors/registry.js.map +1 -1
  115. package/dist/connectors/types.d.ts.map +1 -1
  116. package/dist/customizer/Customizer.d.ts +57 -0
  117. package/dist/customizer/Customizer.d.ts.map +1 -0
  118. package/dist/customizer/Customizer.js +124 -0
  119. package/dist/customizer/Customizer.js.map +1 -0
  120. package/dist/customizer/index.d.ts.map +1 -0
  121. package/dist/customizer/index.js +9 -0
  122. package/dist/customizer/index.js.map +1 -0
  123. package/dist/files.d.ts +17 -0
  124. package/dist/files.d.ts.map +1 -1
  125. package/dist/files.js +75 -1
  126. package/dist/files.js.map +1 -1
  127. package/dist/index.d.ts.map +1 -1
  128. package/dist/index.js +1 -0
  129. package/dist/index.js.map +1 -1
  130. package/dist/init.d.ts +10 -6
  131. package/dist/init.d.ts.map +1 -1
  132. package/dist/init.js +97 -86
  133. package/dist/init.js.map +1 -1
  134. package/dist/migrations.d.ts.map +1 -1
  135. package/dist/migrations.js +142 -145
  136. package/dist/migrations.js.map +1 -1
  137. package/dist/models/anthropic.d.ts +24 -0
  138. package/dist/models/anthropic.d.ts.map +1 -0
  139. package/dist/models/anthropic.js +103 -0
  140. package/dist/models/anthropic.js.map +1 -0
  141. package/dist/models/chainOfThought.d.ts.map +1 -0
  142. package/dist/models/chainOfThought.js +45 -0
  143. package/dist/models/chainOfThought.js.map +1 -0
  144. package/dist/models/fireworksai.d.ts.map +1 -0
  145. package/dist/models/fireworksai.js +141 -0
  146. package/dist/models/fireworksai.js.map +1 -0
  147. package/dist/models/index.d.ts +7 -1
  148. package/dist/models/index.d.ts.map +1 -1
  149. package/dist/models/index.js +20 -1
  150. package/dist/models/index.js.map +1 -1
  151. package/dist/models/logCompletePrompt.d.ts.map +1 -0
  152. package/dist/models/logCompletePrompt.js +23 -0
  153. package/dist/models/logCompletePrompt.js.map +1 -0
  154. package/dist/models/openai.d.ts +24 -0
  155. package/dist/models/openai.d.ts.map +1 -0
  156. package/dist/models/openai.js +101 -0
  157. package/dist/models/openai.js.map +1 -0
  158. package/dist/models/providers.d.ts.map +1 -1
  159. package/dist/models/providers.js +12 -4
  160. package/dist/models/providers.js.map +1 -1
  161. package/dist/models/types.d.ts +53 -2
  162. package/dist/models/types.d.ts.map +1 -1
  163. package/dist/models/types.js +21 -0
  164. package/dist/models/types.js.map +1 -1
  165. package/dist/models/utils.d.ts.map +1 -0
  166. package/dist/models/utils.js +21 -0
  167. package/dist/models/utils.js.map +1 -0
  168. package/dist/pages.d.ts +30 -7
  169. package/dist/pages.d.ts.map +1 -1
  170. package/dist/pages.js +177 -55
  171. package/dist/pages.js.map +1 -1
  172. package/dist/scripts.d.ts.map +1 -1
  173. package/dist/scripts.js +4 -3
  174. package/dist/scripts.js.map +1 -1
  175. package/dist/service/createCompletePrompt.d.ts.map +1 -1
  176. package/dist/service/createCompletePrompt.js +9 -6
  177. package/dist/service/createCompletePrompt.js.map +1 -1
  178. package/dist/service/generateImage.d.ts.map +1 -1
  179. package/dist/service/generateImage.js +3 -3
  180. package/dist/service/generateImage.js.map +1 -1
  181. package/dist/service/server.d.ts.map +1 -1
  182. package/dist/service/server.js +39 -7
  183. package/dist/service/server.js.map +1 -1
  184. package/dist/service/transformPage.d.ts +47 -18
  185. package/dist/service/transformPage.d.ts.map +1 -1
  186. package/dist/service/transformPage.js +559 -270
  187. package/dist/service/transformPage.js.map +1 -1
  188. package/dist/service/useAgentRoutes.d.ts +5 -0
  189. package/dist/service/useAgentRoutes.d.ts.map +1 -0
  190. package/dist/service/useAgentRoutes.js +392 -0
  191. package/dist/service/useAgentRoutes.js.map +1 -0
  192. package/dist/service/useApiRoutes.d.ts.map +1 -1
  193. package/dist/service/useApiRoutes.js +380 -138
  194. package/dist/service/useApiRoutes.js.map +1 -1
  195. package/dist/service/useConnectorRoutes.d.ts.map +1 -1
  196. package/dist/service/useConnectorRoutes.js +20 -9
  197. package/dist/service/useConnectorRoutes.js.map +1 -1
  198. package/dist/service/useFileRoutes.d.ts +4 -0
  199. package/dist/service/useFileRoutes.d.ts.map +1 -0
  200. package/dist/service/useFileRoutes.js +122 -0
  201. package/dist/service/useFileRoutes.js.map +1 -0
  202. package/dist/service/usePageRoutes.d.ts.map +1 -1
  203. package/dist/service/usePageRoutes.js +660 -68
  204. package/dist/service/usePageRoutes.js.map +1 -1
  205. package/dist/service/useSharedDataRoutes.d.ts +4 -0
  206. package/dist/service/useSharedDataRoutes.d.ts.map +1 -0
  207. package/dist/service/useSharedDataRoutes.js +104 -0
  208. package/dist/service/useSharedDataRoutes.js.map +1 -0
  209. package/dist/service/useSharedFileRoutes.d.ts +4 -0
  210. package/dist/service/useSharedFileRoutes.d.ts.map +1 -0
  211. package/dist/service/useSharedFileRoutes.js +121 -0
  212. package/dist/service/useSharedFileRoutes.js.map +1 -0
  213. package/dist/settings.d.ts +3 -1
  214. package/dist/settings.d.ts.map +1 -1
  215. package/dist/settings.js +5 -8
  216. package/dist/settings.js.map +1 -1
  217. package/dist/synthos-cli.d.ts.map +1 -1
  218. package/dist/synthos-cli.js +4 -3
  219. package/dist/synthos-cli.js.map +1 -1
  220. package/dist/themes.d.ts +15 -0
  221. package/dist/themes.d.ts.map +1 -1
  222. package/dist/themes.js +106 -20
  223. package/dist/themes.js.map +1 -1
  224. package/migration-rules/v1-to-v2.md +193 -0
  225. package/migration-rules/v2-to-v3.md +481 -0
  226. package/package.json +15 -11
  227. package/required-pages/builder/page.html +43 -0
  228. package/required-pages/builder/page.json +10 -0
  229. package/required-pages/pages/page.html +924 -0
  230. package/required-pages/pages/page.json +10 -0
  231. package/required-pages/settings/page.html +1753 -0
  232. package/required-pages/settings/page.json +10 -0
  233. package/required-pages/synthos_apis/page.html +846 -0
  234. package/required-pages/synthos_apis/page.json +10 -0
  235. package/required-pages/{synthos_scripts.html → synthos_scripts/page.html} +13 -11
  236. package/required-pages/synthos_scripts/page.json +10 -0
  237. package/service-connectors/airtable/connector.json +27 -0
  238. package/service-connectors/alpha-vantage/connector.json +26 -0
  239. package/service-connectors/brave-search/connector.json +26 -0
  240. package/service-connectors/cloudinary/connector.json +27 -0
  241. package/service-connectors/deepl/connector.json +28 -0
  242. package/service-connectors/elevenlabs/connector.json +30 -0
  243. package/service-connectors/giphy/connector.json +27 -0
  244. package/service-connectors/github/connector.json +29 -0
  245. package/service-connectors/huggingface/connector.json +27 -0
  246. package/service-connectors/imgur/connector.json +29 -0
  247. package/service-connectors/instagram/connector.json +43 -0
  248. package/service-connectors/jira/connector.json +28 -0
  249. package/service-connectors/mapbox/connector.json +26 -0
  250. package/service-connectors/nasa/connector.json +27 -0
  251. package/service-connectors/newsapi/connector.json +27 -0
  252. package/service-connectors/notion/connector.json +28 -0
  253. package/service-connectors/open-exchange-rates/connector.json +27 -0
  254. package/service-connectors/openweathermap/connector.json +26 -0
  255. package/service-connectors/pexels/connector.json +27 -0
  256. package/service-connectors/resend/connector.json +29 -0
  257. package/service-connectors/rss2json/connector.json +27 -0
  258. package/service-connectors/sendgrid/connector.json +27 -0
  259. package/service-connectors/spoonacular/connector.json +28 -0
  260. package/service-connectors/stability-ai/connector.json +27 -0
  261. package/service-connectors/twilio/connector.json +28 -0
  262. package/service-connectors/unsplash/connector.json +27 -0
  263. package/service-connectors/wolfram-alpha/connector.json +26 -0
  264. package/service-connectors/youtube-data/connector.json +30 -0
  265. package/src/agents/a2a/a2aProvider.ts +110 -0
  266. package/src/agents/discovery.ts +74 -0
  267. package/src/agents/index.ts +6 -0
  268. package/src/agents/openclaw/gatewayManager.ts +570 -0
  269. package/src/agents/openclaw/openclawProvider.ts +259 -0
  270. package/src/agents/openclaw/sshTunnelManager.ts +393 -0
  271. package/src/agents/types.ts +82 -0
  272. package/src/builders/anthropic.ts +283 -0
  273. package/src/builders/fireworksai.ts +59 -0
  274. package/src/builders/index.ts +33 -0
  275. package/src/builders/openai.ts +89 -0
  276. package/src/builders/types.ts +261 -0
  277. package/src/connectors/index.ts +3 -1
  278. package/src/connectors/registry.ts +40 -96
  279. package/src/connectors/types.ts +25 -0
  280. package/src/customizer/Customizer.ts +151 -0
  281. package/src/customizer/index.ts +5 -0
  282. package/src/files.ts +71 -0
  283. package/src/index.ts +2 -1
  284. package/src/init.ts +138 -97
  285. package/src/migrations.ts +148 -145
  286. package/src/models/anthropic.ts +119 -0
  287. package/src/models/chainOfThought.ts +56 -0
  288. package/src/models/fireworksai.ts +143 -0
  289. package/src/models/index.ts +7 -1
  290. package/src/models/logCompletePrompt.ts +25 -0
  291. package/src/models/openai.ts +110 -0
  292. package/src/models/providers.ts +12 -3
  293. package/src/models/types.ts +97 -2
  294. package/src/models/utils.ts +16 -0
  295. package/src/pages.ts +176 -54
  296. package/src/scripts.ts +2 -2
  297. package/src/service/createCompletePrompt.ts +3 -1
  298. package/src/service/generateImage.ts +2 -2
  299. package/src/service/server.ts +39 -8
  300. package/src/service/transformPage.ts +605 -301
  301. package/src/service/useAgentRoutes.ts +428 -0
  302. package/src/service/useApiRoutes.ts +309 -45
  303. package/src/service/useConnectorRoutes.ts +21 -10
  304. package/src/service/useFileRoutes.ts +127 -0
  305. package/src/service/usePageRoutes.ts +736 -75
  306. package/src/service/useSharedDataRoutes.ts +106 -0
  307. package/src/service/useSharedFileRoutes.ts +126 -0
  308. package/src/settings.ts +8 -10
  309. package/src/synthos-cli.ts +4 -3
  310. package/src/themes.ts +103 -20
  311. package/static-files/favicon.svg +12 -0
  312. package/static-files/fluentlm-instructions.llmd +868 -0
  313. package/static-files/fluentlm-instructions.md +1595 -0
  314. package/static-files/fluentlm.css +4844 -0
  315. package/static-files/fluentlm.js +3602 -0
  316. package/static-files/fluentlm.min.css +1 -0
  317. package/static-files/fluentlm.min.js +1 -0
  318. package/static-files/helpers.v3.js +304 -0
  319. package/static-files/page.v3.js +1290 -0
  320. package/static-files/recommended-frameworks.llmd +81 -0
  321. package/static-files/recommended-frameworks.md +137 -0
  322. package/static-files/retro-game.js +877 -0
  323. package/static-files/shell.css +797 -0
  324. package/static-files/theme-dark.css +169 -0
  325. package/static-files/theme-light.css +169 -0
  326. package/tests/anthropic.spec.ts +84 -0
  327. package/tests/builders.spec.ts +139 -0
  328. package/tests/chainOfThought.spec.ts +108 -0
  329. package/tests/ensureScripts.spec.ts +82 -0
  330. package/tests/files.spec.ts +233 -0
  331. package/tests/fireworksai.spec.ts +92 -0
  332. package/tests/logCompletePrompt.spec.ts +74 -0
  333. package/tests/migrations.spec.ts +79 -1
  334. package/tests/openai.spec.ts +71 -0
  335. package/tests/pages.spec.ts +226 -1
  336. package/tests/providers.spec.ts +144 -0
  337. package/tests/scripts.spec.ts +209 -0
  338. package/tests/transformPage.spec.ts +456 -0
  339. package/tests/types.spec.ts +23 -0
  340. package/default-pages/app_builder.html +0 -40
  341. package/default-pages/app_builder.json +0 -1
  342. package/default-pages/json_tools.json +0 -1
  343. package/default-pages/my_notes.html +0 -33
  344. package/default-pages/neon_asteroids.html +0 -77
  345. package/default-pages/sidebar_builder.json +0 -1
  346. package/default-pages/solar_tutorial.json +0 -1
  347. package/default-pages/two-panel_builder.json +0 -1
  348. package/dist/connectors/index.d.ts +0 -3
  349. package/dist/connectors/types.d.ts +0 -61
  350. package/dist/index.d.ts +0 -7
  351. package/dist/migrations.d.ts +0 -11
  352. package/dist/models/providers.d.ts +0 -7
  353. package/dist/scripts.d.ts +0 -14
  354. package/dist/service/createCompletePrompt.d.ts +0 -5
  355. package/dist/service/debugLog.d.ts +0 -11
  356. package/dist/service/generateImage.d.ts +0 -32
  357. package/dist/service/index.d.ts +0 -8
  358. package/dist/service/modelInstructions.d.ts +0 -7
  359. package/dist/service/requiresSettings.d.ts +0 -3
  360. package/dist/service/server.d.ts +0 -4
  361. package/dist/service/useApiRoutes.d.ts +0 -4
  362. package/dist/service/useConnectorRoutes.d.ts +0 -4
  363. package/dist/service/useDataRoutes.d.ts +0 -4
  364. package/dist/service/usePageRoutes.d.ts +0 -5
  365. package/dist/synthos-cli.d.ts +0 -2
  366. package/images/home.png +0 -0
  367. package/images/page-management.png +0 -0
  368. package/images/settings.png +0 -0
  369. package/images/synthos-square.png +0 -0
  370. package/page-scripts/helpers-v2.js +0 -121
  371. package/page-scripts/page-v2.js +0 -615
  372. package/required-pages/builder.html +0 -74
  373. package/required-pages/builder.json +0 -1
  374. package/required-pages/pages.html +0 -196
  375. package/required-pages/pages.json +0 -1
  376. package/required-pages/settings.html +0 -841
  377. package/required-pages/settings.json +0 -1
  378. package/required-pages/synthos_apis.html +0 -272
  379. package/required-pages/synthos_apis.json +0 -1
  380. package/required-pages/synthos_scripts.json +0 -1
@@ -0,0 +1,4844 @@
1
+ /* ==========================================================================
2
+ FluentLM — Design Tokens
3
+ All raw palette values, typography, spacing, effects, and motion tokens.
4
+ These are theme-independent constants. Semantic (theme-aware) colors live
5
+ in theme-light.css / theme-dark.css.
6
+ ========================================================================== */
7
+
8
+ :root {
9
+ /* -----------------------------------------------------------------------
10
+ PALETTE — Brand / Theme Colors
11
+ ----------------------------------------------------------------------- */
12
+ --themeDarker: #004578;
13
+ --themeDark: #005a9e;
14
+ --themeDarkAlt: #106ebe;
15
+ --themePrimary: #0078d4;
16
+ --themeSecondary: #2b88d8;
17
+ --themeTertiary: #71afe5;
18
+ --themeLight: #c7e0f4;
19
+ --themeLighter: #deecf9;
20
+ --themeLighterAlt: #eff6fc;
21
+
22
+ /* -----------------------------------------------------------------------
23
+ PALETTE — Neutrals
24
+ ----------------------------------------------------------------------- */
25
+ --black: #000000;
26
+ --blackTranslucent40: rgba(0, 0, 0, 0.4);
27
+ --neutralDark: #201f1e;
28
+ --neutralPrimary: #323130;
29
+ --neutralPrimaryAlt: #3b3a39;
30
+ --neutralSecondary: #605e5c;
31
+ --neutralSecondaryAlt: #8a8886;
32
+ --neutralTertiary: #a19f9d;
33
+ --neutralTertiaryAlt: #c8c6c4;
34
+ --neutralQuaternary: #d2d0ce;
35
+ --neutralQuaternaryAlt: #e1dfdd;
36
+ --neutralLight: #edebe9;
37
+ --neutralLighter: #f3f2f1;
38
+ --neutralLighterAlt: #faf9f8;
39
+ --white: #ffffff;
40
+ --whiteTranslucent40: rgba(255, 255, 255, 0.4);
41
+
42
+ /* -----------------------------------------------------------------------
43
+ PALETTE — Status / Accent Colors
44
+ ----------------------------------------------------------------------- */
45
+ --yellow: #ffb900;
46
+ --yellowDark: #d29200;
47
+ --yellowLight: #fff100;
48
+ --orange: #d83b01;
49
+ --orangeLight: #ea4300;
50
+ --orangeLighter: #ff8c00;
51
+ --redDark: #a4262c;
52
+ --red: #e81123;
53
+ --magentaDark: #5c005c;
54
+ --magenta: #b4009e;
55
+ --magentaLight: #e3008c;
56
+ --purpleDark: #32145a;
57
+ --purple: #5c2d91;
58
+ --purpleLight: #b4a0ff;
59
+ --blueDark: #002050;
60
+ --blueMid: #00188f;
61
+ --blue: #0078d4;
62
+ --blueLight: #00bcf2;
63
+ --tealDark: #004b50;
64
+ --teal: #008272;
65
+ --tealLight: #00b294;
66
+ --greenDark: #004b1c;
67
+ --green: #107c10;
68
+ --greenLight: #bad80a;
69
+
70
+ /* -----------------------------------------------------------------------
71
+ TYPOGRAPHY — Font Family
72
+ ----------------------------------------------------------------------- */
73
+ --fontFamily: 'Segoe UI', 'Segoe UI Web (West European)', -apple-system,
74
+ BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif;
75
+ --fontFamilyMonospace: 'Cascadia Code', 'Consolas', 'Courier New', monospace;
76
+
77
+ /* -----------------------------------------------------------------------
78
+ TYPOGRAPHY — Font Sizes
79
+ ----------------------------------------------------------------------- */
80
+ --fontSizeTiny: 10px;
81
+ --fontSizeXSmall: 10px;
82
+ --fontSizeSmall: 12px;
83
+ --fontSizeSmallPlus: 12px;
84
+ --fontSizeMedium: 14px;
85
+ --fontSizeMediumPlus: 16px;
86
+ --fontSizeLarge: 18px;
87
+ --fontSizeXLarge: 20px;
88
+ --fontSizeXXLarge: 28px;
89
+ --fontSizeSuperLarge: 42px;
90
+ --fontSizeMega: 68px;
91
+
92
+ /* -----------------------------------------------------------------------
93
+ TYPOGRAPHY — Font Weights
94
+ ----------------------------------------------------------------------- */
95
+ --fontWeightLight: 100;
96
+ --fontWeightSemilight: 300;
97
+ --fontWeightRegular: 400;
98
+ --fontWeightSemibold: 600;
99
+ --fontWeightBold: 700;
100
+
101
+ /* -----------------------------------------------------------------------
102
+ TYPOGRAPHY — Line Heights (matched to size ramp)
103
+ ----------------------------------------------------------------------- */
104
+ --lineHeightTiny: 14px;
105
+ --lineHeightXSmall: 14px;
106
+ --lineHeightSmall: 16px;
107
+ --lineHeightSmallPlus: 16px;
108
+ --lineHeightMedium: 20px;
109
+ --lineHeightMediumPlus: 22px;
110
+ --lineHeightLarge: 24px;
111
+ --lineHeightXLarge: 28px;
112
+ --lineHeightXXLarge: 36px;
113
+ --lineHeightSuperLarge: 52px;
114
+ --lineHeightMega: 80px;
115
+
116
+ /* -----------------------------------------------------------------------
117
+ SPACING
118
+ ----------------------------------------------------------------------- */
119
+ --spacingS2: 4px;
120
+ --spacingS1: 8px;
121
+ --spacingM: 16px;
122
+ --spacingL1: 20px;
123
+ --spacingL2: 32px;
124
+
125
+ /* -----------------------------------------------------------------------
126
+ EFFECTS — Elevation / Shadows
127
+ ----------------------------------------------------------------------- */
128
+ --elevation4: 0 1.6px 3.6px 0 rgba(0, 0, 0, 0.132),
129
+ 0 0.3px 0.9px 0 rgba(0, 0, 0, 0.108);
130
+ --elevation8: 0 3.2px 7.2px 0 rgba(0, 0, 0, 0.132),
131
+ 0 0.6px 1.8px 0 rgba(0, 0, 0, 0.108);
132
+ --elevation16: 0 6.4px 14.4px 0 rgba(0, 0, 0, 0.132),
133
+ 0 1.2px 3.6px 0 rgba(0, 0, 0, 0.108);
134
+ --elevation64: 0 25.6px 57.6px 0 rgba(0, 0, 0, 0.22),
135
+ 0 4.8px 14.4px 0 rgba(0, 0, 0, 0.18);
136
+
137
+ /* -----------------------------------------------------------------------
138
+ EFFECTS — Border Radius
139
+ ----------------------------------------------------------------------- */
140
+ --roundedCorner2: 2px;
141
+ --roundedCorner4: 4px;
142
+ --roundedCorner6: 6px;
143
+
144
+ /* -----------------------------------------------------------------------
145
+ MOTION — Durations
146
+ ----------------------------------------------------------------------- */
147
+ --duration1: 100ms;
148
+ --duration2: 200ms;
149
+ --duration3: 300ms;
150
+ --duration4: 400ms;
151
+
152
+ /* -----------------------------------------------------------------------
153
+ MOTION — Easing Curves
154
+ ----------------------------------------------------------------------- */
155
+ --easeAccelerate: cubic-bezier(0.9, 0.1, 1, 0.2);
156
+ --easeDecelerate: cubic-bezier(0.1, 0.9, 0.2, 1);
157
+ --easeLinear: cubic-bezier(0, 0, 1, 1);
158
+ --easeStandard: cubic-bezier(0.8, 0, 0.2, 1);
159
+
160
+ /* -----------------------------------------------------------------------
161
+ FOCUS — Outline style used by all interactive components
162
+ ----------------------------------------------------------------------- */
163
+ --focusOutlineWidth: 2px;
164
+ --focusOutlineOffset: -1px;
165
+ }
166
+
167
+ /* ==========================================================================
168
+ FluentLM — Base Styles
169
+ Reset, box-sizing, font smoothing, global element defaults, and
170
+ typography utility classes.
171
+ ========================================================================== */
172
+
173
+ /* -----------------------------------------------------------------------
174
+ RESET
175
+ ----------------------------------------------------------------------- */
176
+ *,
177
+ *::before,
178
+ *::after {
179
+ box-sizing: border-box;
180
+ }
181
+
182
+ html {
183
+ -webkit-font-smoothing: antialiased;
184
+ -moz-osx-font-smoothing: grayscale;
185
+ text-size-adjust: 100%;
186
+ tab-size: 4;
187
+ }
188
+
189
+ body {
190
+ margin: 0;
191
+ font-family: var(--fontFamily);
192
+ font-size: var(--fontSizeMedium);
193
+ font-weight: var(--fontWeightRegular);
194
+ line-height: var(--lineHeightMedium);
195
+ color: var(--bodyText);
196
+ background-color: var(--bodyBackground);
197
+ }
198
+
199
+ /* Remove default margins */
200
+ h1, h2, h3, h4, h5, h6, p, figure, blockquote, dl, dd {
201
+ margin: 0;
202
+ }
203
+
204
+ /* Remove list styles on ul/ol with role="list" */
205
+ ul[role='list'],
206
+ ol[role='list'] {
207
+ list-style: none;
208
+ padding: 0;
209
+ margin: 0;
210
+ }
211
+
212
+ /* Sensible defaults for media */
213
+ img, picture, video, canvas, svg {
214
+ display: block;
215
+ max-width: 100%;
216
+ }
217
+
218
+ /* Inherit fonts for form controls */
219
+ input, button, textarea, select {
220
+ font: inherit;
221
+ color: inherit;
222
+ }
223
+
224
+ /* Remove default button styles */
225
+ button {
226
+ cursor: pointer;
227
+ border: none;
228
+ background: none;
229
+ padding: 0;
230
+ }
231
+
232
+ /* Remove textarea resize handle (components control this) */
233
+ textarea {
234
+ resize: vertical;
235
+ }
236
+
237
+ /* Anchor defaults */
238
+ a {
239
+ color: var(--link);
240
+ text-decoration: none;
241
+ }
242
+
243
+ a:hover {
244
+ color: var(--linkHovered);
245
+ text-decoration: underline;
246
+ }
247
+
248
+ /* -----------------------------------------------------------------------
249
+ FOCUS STYLES
250
+ Visible keyboard focus ring matching Fluent v8.
251
+ Uses :focus-visible so mouse clicks don't trigger the outline.
252
+ ----------------------------------------------------------------------- */
253
+ :focus-visible {
254
+ outline: var(--focusOutlineWidth) solid var(--focusBorder);
255
+ outline-offset: var(--focusOutlineOffset);
256
+ }
257
+
258
+ :focus:not(:focus-visible) {
259
+ outline: none;
260
+ }
261
+
262
+ /* -----------------------------------------------------------------------
263
+ SCROLLBAR (thin, neutral — matches Fluent aesthetic)
264
+ ----------------------------------------------------------------------- */
265
+ ::-webkit-scrollbar {
266
+ width: 8px;
267
+ height: 8px;
268
+ }
269
+
270
+ ::-webkit-scrollbar-thumb {
271
+ background-color: var(--neutralTertiaryAlt);
272
+ border-radius: 4px;
273
+ }
274
+
275
+ ::-webkit-scrollbar-thumb:hover {
276
+ background-color: var(--neutralTertiary);
277
+ }
278
+
279
+ ::-webkit-scrollbar-track {
280
+ background-color: transparent;
281
+ }
282
+
283
+ /* Firefox */
284
+ * {
285
+ scrollbar-width: thin;
286
+ scrollbar-color: var(--neutralTertiaryAlt) transparent;
287
+ }
288
+
289
+ /* -----------------------------------------------------------------------
290
+ TYPOGRAPHY — Utility Classes
291
+ Usage: <span class="flm-text-large">Hello</span>
292
+ Each class sets font-size, line-height, and weight per the Fluent ramp.
293
+ ----------------------------------------------------------------------- */
294
+ .flm-text-tiny {
295
+ font-size: var(--fontSizeTiny);
296
+ line-height: var(--lineHeightTiny);
297
+ font-weight: var(--fontWeightRegular);
298
+ }
299
+
300
+ .flm-text-xSmall {
301
+ font-size: var(--fontSizeXSmall);
302
+ line-height: var(--lineHeightXSmall);
303
+ font-weight: var(--fontWeightRegular);
304
+ }
305
+
306
+ .flm-text-small {
307
+ font-size: var(--fontSizeSmall);
308
+ line-height: var(--lineHeightSmall);
309
+ font-weight: var(--fontWeightRegular);
310
+ }
311
+
312
+ .flm-text-smallPlus {
313
+ font-size: var(--fontSizeSmallPlus);
314
+ line-height: var(--lineHeightSmallPlus);
315
+ font-weight: var(--fontWeightRegular);
316
+ }
317
+
318
+ .flm-text-medium {
319
+ font-size: var(--fontSizeMedium);
320
+ line-height: var(--lineHeightMedium);
321
+ font-weight: var(--fontWeightRegular);
322
+ }
323
+
324
+ .flm-text-mediumPlus {
325
+ font-size: var(--fontSizeMediumPlus);
326
+ line-height: var(--lineHeightMediumPlus);
327
+ font-weight: var(--fontWeightRegular);
328
+ }
329
+
330
+ .flm-text-large {
331
+ font-size: var(--fontSizeLarge);
332
+ line-height: var(--lineHeightLarge);
333
+ font-weight: var(--fontWeightRegular);
334
+ }
335
+
336
+ .flm-text-xLarge {
337
+ font-size: var(--fontSizeXLarge);
338
+ line-height: var(--lineHeightXLarge);
339
+ font-weight: var(--fontWeightSemibold);
340
+ }
341
+
342
+ .flm-text-xxLarge {
343
+ font-size: var(--fontSizeXXLarge);
344
+ line-height: var(--lineHeightXXLarge);
345
+ font-weight: var(--fontWeightSemibold);
346
+ }
347
+
348
+ .flm-text-superLarge {
349
+ font-size: var(--fontSizeSuperLarge);
350
+ line-height: var(--lineHeightSuperLarge);
351
+ font-weight: var(--fontWeightSemibold);
352
+ }
353
+
354
+ .flm-text-mega {
355
+ font-size: var(--fontSizeMega);
356
+ line-height: var(--lineHeightMega);
357
+ font-weight: var(--fontWeightSemibold);
358
+ }
359
+
360
+ /* Weight modifiers */
361
+ .flm-weight-light { font-weight: var(--fontWeightLight); }
362
+ .flm-weight-semilight { font-weight: var(--fontWeightSemilight); }
363
+ .flm-weight-regular { font-weight: var(--fontWeightRegular); }
364
+ .flm-weight-semibold { font-weight: var(--fontWeightSemibold); }
365
+ .flm-weight-bold { font-weight: var(--fontWeightBold); }
366
+
367
+ /* Monospace */
368
+ .flm-text-mono {
369
+ font-family: var(--fontFamilyMonospace);
370
+ }
371
+
372
+ /* Text helpers */
373
+ .flm-text-nowrap {
374
+ white-space: nowrap;
375
+ overflow: hidden;
376
+ text-overflow: ellipsis;
377
+ }
378
+
379
+ .flm-text-block {
380
+ display: block;
381
+ }
382
+
383
+ /* -----------------------------------------------------------------------
384
+ SELECTION HIGHLIGHT
385
+ ----------------------------------------------------------------------- */
386
+ ::selection {
387
+ background-color: var(--themePrimary);
388
+ color: var(--white);
389
+ }
390
+
391
+ /* -----------------------------------------------------------------------
392
+ SCREEN-READER ONLY (accessibility helper)
393
+ ----------------------------------------------------------------------- */
394
+ .flm-sr-only {
395
+ position: absolute;
396
+ width: 1px;
397
+ height: 1px;
398
+ padding: 0;
399
+ margin: -1px;
400
+ overflow: hidden;
401
+ clip: rect(0, 0, 0, 0);
402
+ white-space: nowrap;
403
+ border: 0;
404
+ }
405
+
406
+ /* -----------------------------------------------------------------------
407
+ THEME TRANSITION
408
+ Smooth color transition when switching themes at runtime.
409
+ ----------------------------------------------------------------------- */
410
+ .fluent-theme-transition,
411
+ .fluent-theme-transition *,
412
+ .fluent-theme-transition *::before,
413
+ .fluent-theme-transition *::after {
414
+ transition: background-color var(--duration2) var(--easeStandard),
415
+ color var(--duration2) var(--easeStandard),
416
+ border-color var(--duration2) var(--easeStandard),
417
+ box-shadow var(--duration2) var(--easeStandard);
418
+ }
419
+
420
+ /* Breadcrumb */
421
+
422
+ .flm-breadcrumb {
423
+ display: flex;
424
+ align-items: center;
425
+ flex-wrap: wrap;
426
+ font-family: var(--fontFamily);
427
+ font-size: var(--fontSizeMedium);
428
+ line-height: var(--lineHeightMedium);
429
+ list-style: none;
430
+ padding: 0;
431
+ margin: 0;
432
+ }
433
+
434
+ .flm-breadcrumb-item {
435
+ display: inline-flex;
436
+ align-items: center;
437
+ }
438
+
439
+ .flm-breadcrumb-item + .flm-breadcrumb-item::before {
440
+ content: '';
441
+ display: inline-block;
442
+ width: 8px;
443
+ height: 8px;
444
+ margin: 0 var(--spacingS1);
445
+ border-right: 1.5px solid var(--neutralTertiary);
446
+ border-top: 1.5px solid var(--neutralTertiary);
447
+ transform: rotate(45deg);
448
+ flex-shrink: 0;
449
+ }
450
+
451
+ .flm-breadcrumb-link {
452
+ color: var(--bodyText);
453
+ text-decoration: none;
454
+ padding: var(--spacingS2) 0;
455
+ font-size: var(--fontSizeMedium);
456
+ cursor: pointer;
457
+ }
458
+
459
+ .flm-breadcrumb-link:hover {
460
+ color: var(--linkHovered);
461
+ text-decoration: underline;
462
+ }
463
+
464
+ /* Current (last) item */
465
+ .flm-breadcrumb-item:last-child .flm-breadcrumb-link {
466
+ color: var(--bodyText);
467
+ font-weight: var(--fontWeightSemibold);
468
+ cursor: default;
469
+ }
470
+
471
+ .flm-breadcrumb-item:last-child .flm-breadcrumb-link:hover {
472
+ text-decoration: none;
473
+ color: var(--bodyText);
474
+ }
475
+
476
+ /* Overflow button */
477
+ .flm-breadcrumb-overflow {
478
+ display: inline-flex;
479
+ align-items: center;
480
+ justify-content: center;
481
+ border: none;
482
+ background: transparent;
483
+ color: var(--bodyText);
484
+ cursor: pointer;
485
+ padding: var(--spacingS2);
486
+ font-size: var(--fontSizeMedium);
487
+ }
488
+
489
+ .flm-breadcrumb-overflow:hover {
490
+ color: var(--linkHovered);
491
+ }
492
+
493
+ /* Size variants */
494
+ .flm-breadcrumb--small .flm-breadcrumb-link { font-size: var(--fontSizeSmall); }
495
+ .flm-breadcrumb--large .flm-breadcrumb-link {
496
+ font-size: var(--fontSizeLarge);
497
+ font-weight: var(--fontWeightSemibold);
498
+ }
499
+
500
+ /* Button */
501
+
502
+ .flm-button {
503
+ display: inline-flex;
504
+ align-items: center;
505
+ justify-content: center;
506
+ gap: var(--spacingS2);
507
+ min-width: 80px;
508
+ height: 32px;
509
+ padding: 0 20px;
510
+ border: 1px solid var(--buttonBorder);
511
+ border-radius: var(--roundedCorner2);
512
+ background-color: var(--buttonBackground);
513
+ color: var(--buttonText);
514
+ font-family: var(--fontFamily);
515
+ font-size: var(--fontSizeMedium);
516
+ font-weight: var(--fontWeightSemibold);
517
+ line-height: var(--lineHeightMedium);
518
+ cursor: pointer;
519
+ text-decoration: none;
520
+ white-space: nowrap;
521
+ user-select: none;
522
+ outline: none;
523
+ position: relative;
524
+ vertical-align: middle;
525
+ box-sizing: border-box;
526
+ }
527
+
528
+ .flm-button:hover {
529
+ background-color: var(--buttonBackgroundHovered);
530
+ color: var(--buttonTextHovered);
531
+ }
532
+
533
+ .flm-button:active {
534
+ background-color: var(--buttonBackgroundPressed);
535
+ color: var(--buttonTextPressed);
536
+ }
537
+
538
+ .flm-button:focus-visible {
539
+ outline: var(--focusOutlineWidth) solid var(--focusBorder);
540
+ outline-offset: var(--focusOutlineOffset);
541
+ }
542
+
543
+ /* Disabled */
544
+ .flm-button:disabled,
545
+ .flm-button[disabled] {
546
+ background-color: var(--buttonBackgroundDisabled);
547
+ border-color: var(--buttonBorderDisabled);
548
+ color: var(--buttonTextDisabled);
549
+ cursor: default;
550
+ pointer-events: none;
551
+ }
552
+
553
+ /* Primary */
554
+ .flm-button--primary {
555
+ background-color: var(--primaryButtonBackground);
556
+ border-color: var(--primaryButtonBorder);
557
+ color: var(--primaryButtonText);
558
+ }
559
+
560
+ .flm-button--primary:hover {
561
+ background-color: var(--primaryButtonBackgroundHovered);
562
+ color: var(--primaryButtonTextHovered);
563
+ }
564
+
565
+ .flm-button--primary:active {
566
+ background-color: var(--primaryButtonBackgroundPressed);
567
+ color: var(--primaryButtonTextPressed);
568
+ }
569
+
570
+ .flm-button--primary:disabled,
571
+ .flm-button--primary[disabled] {
572
+ background-color: var(--primaryButtonBackgroundDisabled);
573
+ color: var(--primaryButtonTextDisabled);
574
+ border-color: var(--primaryButtonBackgroundDisabled);
575
+ }
576
+
577
+ /* Subtle */
578
+ .flm-button--subtle {
579
+ background-color: transparent;
580
+ border-color: transparent;
581
+ min-width: auto;
582
+ }
583
+
584
+ .flm-button--subtle:hover {
585
+ background-color: var(--buttonBackgroundHovered);
586
+ border-color: transparent;
587
+ }
588
+
589
+ .flm-button--subtle:active {
590
+ background-color: var(--buttonBackgroundPressed);
591
+ }
592
+
593
+ /* Icon-only */
594
+ .flm-button--icon {
595
+ min-width: 32px;
596
+ width: 32px;
597
+ height: 32px;
598
+ padding: 0;
599
+ background-color: transparent;
600
+ border-color: transparent;
601
+ color: var(--bodyText);
602
+ }
603
+
604
+ .flm-button--icon:hover {
605
+ background-color: var(--buttonBackgroundHovered);
606
+ color: var(--buttonTextHovered);
607
+ }
608
+
609
+ .flm-button--icon:active {
610
+ background-color: var(--buttonBackgroundPressed);
611
+ }
612
+
613
+ /* Compound */
614
+ .flm-button--compound {
615
+ height: auto;
616
+ min-height: 40px;
617
+ padding: 8px 20px;
618
+ flex-direction: column;
619
+ align-items: flex-start;
620
+ gap: 0;
621
+ }
622
+
623
+ .flm-button-label {
624
+ font-size: var(--fontSizeMedium);
625
+ font-weight: var(--fontWeightSemibold);
626
+ line-height: var(--lineHeightMedium);
627
+ }
628
+
629
+ .flm-button-description {
630
+ font-size: var(--fontSizeSmall);
631
+ font-weight: var(--fontWeightRegular);
632
+ line-height: var(--lineHeightSmall);
633
+ color: var(--bodySubtext);
634
+ }
635
+
636
+ .flm-button--compound:hover .flm-button-description {
637
+ color: var(--bodyText);
638
+ }
639
+
640
+ .flm-button--primary.flm-button--compound .flm-button-description {
641
+ color: var(--whiteTranslucent40);
642
+ }
643
+
644
+ .flm-button--primary.flm-button--compound:hover .flm-button-description {
645
+ color: var(--white);
646
+ }
647
+
648
+ /* Split button */
649
+ .flm-button-split {
650
+ display: inline-flex;
651
+ align-items: stretch;
652
+ }
653
+
654
+ .flm-button-split > .flm-button {
655
+ border-top-right-radius: 0;
656
+ border-bottom-right-radius: 0;
657
+ }
658
+
659
+ .flm-button-split-caret {
660
+ display: inline-flex;
661
+ align-items: center;
662
+ justify-content: center;
663
+ width: 32px;
664
+ border: 1px solid var(--buttonBorder);
665
+ border-left: none;
666
+ border-radius: 0 var(--roundedCorner2) var(--roundedCorner2) 0;
667
+ background-color: var(--buttonBackground);
668
+ color: var(--buttonText);
669
+ cursor: pointer;
670
+ }
671
+
672
+ .flm-button-split-caret:hover {
673
+ background-color: var(--buttonBackgroundHovered);
674
+ color: var(--buttonTextHovered);
675
+ }
676
+
677
+ .flm-button-split--primary > .flm-button {
678
+ border-right-color: var(--themeDark);
679
+ }
680
+
681
+ .flm-button-split--primary .flm-button-split-caret {
682
+ background-color: var(--primaryButtonBackground);
683
+ border-color: var(--primaryButtonBorder);
684
+ border-left-color: var(--themeDark);
685
+ color: var(--primaryButtonText);
686
+ }
687
+
688
+ .flm-button-split--primary .flm-button-split-caret:hover {
689
+ background-color: var(--primaryButtonBackgroundHovered);
690
+ }
691
+
692
+ /* Icon inside button */
693
+ .flm-button > .flm-icon {
694
+ flex-shrink: 0;
695
+ }
696
+
697
+ /* Callout — positioned popup anchored to a target element */
698
+
699
+ .flm-callout {
700
+ position: absolute;
701
+ z-index: 1000;
702
+ background-color: var(--bodyBackground);
703
+ border-radius: var(--roundedCorner2);
704
+ box-shadow: var(--elevation16);
705
+ border: 1px solid var(--variantBorder);
706
+ max-width: 364px;
707
+ opacity: 0;
708
+ pointer-events: none;
709
+ transform: translateY(4px);
710
+ transition: opacity var(--duration1) var(--easeStandard),
711
+ transform var(--duration1) var(--easeDecelerate);
712
+ }
713
+
714
+ .flm-callout--visible {
715
+ opacity: 1;
716
+ pointer-events: auto;
717
+ transform: translateY(0);
718
+ }
719
+
720
+ .flm-callout-body {
721
+ padding: var(--spacingM);
722
+ }
723
+
724
+ /* Beak / arrow */
725
+ .flm-callout-beak {
726
+ position: absolute;
727
+ width: 16px;
728
+ height: 16px;
729
+ background-color: var(--bodyBackground);
730
+ border: 1px solid var(--variantBorder);
731
+ transform: rotate(45deg);
732
+ border-right: none;
733
+ border-bottom: none;
734
+ top: -9px;
735
+ left: 24px;
736
+ }
737
+
738
+ .flm-callout--below .flm-callout-beak {
739
+ top: -9px;
740
+ }
741
+
742
+ .flm-callout--above .flm-callout-beak {
743
+ top: auto;
744
+ bottom: -9px;
745
+ border: 1px solid var(--variantBorder);
746
+ border-left: none;
747
+ border-top: none;
748
+ }
749
+
750
+ /* Checkbox */
751
+
752
+ .flm-checkbox {
753
+ display: inline-flex;
754
+ align-items: center;
755
+ gap: var(--spacingS2);
756
+ cursor: pointer;
757
+ user-select: none;
758
+ font-family: var(--fontFamily);
759
+ font-size: var(--fontSizeMedium);
760
+ line-height: var(--lineHeightMedium);
761
+ color: var(--bodyText);
762
+ position: relative;
763
+ padding: 2px 0;
764
+ }
765
+
766
+ /* Hide native checkbox */
767
+ .flm-checkbox-input {
768
+ position: absolute;
769
+ opacity: 0;
770
+ width: 0;
771
+ height: 0;
772
+ margin: 0;
773
+ padding: 0;
774
+ }
775
+
776
+ /* Visual checkbox box */
777
+ .flm-checkbox-mark {
778
+ display: inline-flex;
779
+ align-items: center;
780
+ justify-content: center;
781
+ width: 20px;
782
+ height: 20px;
783
+ min-width: 20px;
784
+ border: 1px solid var(--smallInputBorder);
785
+ border-radius: var(--roundedCorner2);
786
+ background-color: var(--inputBackground);
787
+ transition: background-color var(--duration1) var(--easeStandard),
788
+ border-color var(--duration1) var(--easeStandard);
789
+ box-sizing: border-box;
790
+ flex-shrink: 0;
791
+ }
792
+
793
+ /* Checkmark icon (CSS-drawn) */
794
+ .flm-checkbox-mark::after {
795
+ content: '';
796
+ display: none;
797
+ width: 6px;
798
+ height: 10px;
799
+ border: solid var(--inputForegroundChecked);
800
+ border-width: 0 2px 2px 0;
801
+ transform: rotate(45deg);
802
+ margin-top: -2px;
803
+ }
804
+
805
+ /* Hover */
806
+ .flm-checkbox:hover .flm-checkbox-mark {
807
+ border-color: var(--inputBorderHovered);
808
+ }
809
+
810
+ /* Checked */
811
+ .flm-checkbox-input:checked + .flm-checkbox-mark {
812
+ background-color: var(--inputBackgroundChecked);
813
+ border-color: var(--inputBackgroundChecked);
814
+ }
815
+
816
+ .flm-checkbox-input:checked + .flm-checkbox-mark::after {
817
+ display: block;
818
+ }
819
+
820
+ /* Checked hover */
821
+ .flm-checkbox:hover .flm-checkbox-input:checked + .flm-checkbox-mark {
822
+ background-color: var(--inputBackgroundCheckedHovered);
823
+ border-color: var(--inputBackgroundCheckedHovered);
824
+ }
825
+
826
+ /* Focus */
827
+ .flm-checkbox-input:focus-visible + .flm-checkbox-mark {
828
+ outline: var(--focusOutlineWidth) solid var(--focusBorder);
829
+ outline-offset: var(--focusOutlineOffset);
830
+ }
831
+
832
+ /* Disabled */
833
+ .flm-checkbox--disabled,
834
+ .flm-checkbox:has(.flm-checkbox-input:disabled) {
835
+ cursor: default;
836
+ color: var(--disabledText);
837
+ }
838
+
839
+ .flm-checkbox-input:disabled + .flm-checkbox-mark {
840
+ background-color: var(--disabledBackground);
841
+ border-color: var(--disabledBorder);
842
+ }
843
+
844
+ .flm-checkbox-input:disabled:checked + .flm-checkbox-mark {
845
+ background-color: var(--disabledBackground);
846
+ border-color: var(--disabledBorder);
847
+ }
848
+
849
+ .flm-checkbox-input:disabled:checked + .flm-checkbox-mark::after {
850
+ border-color: var(--disabledText);
851
+ }
852
+
853
+ .flm-checkbox-label {
854
+ /* Inherits from parent */
855
+ }
856
+
857
+ /* ChoiceGroup — Radio button group */
858
+
859
+ .flm-choicegroup {
860
+ display: flex;
861
+ flex-direction: column;
862
+ gap: var(--spacingS2);
863
+ font-family: var(--fontFamily);
864
+ }
865
+
866
+ /* Horizontal variant */
867
+ .flm-choicegroup--horizontal {
868
+ flex-direction: row;
869
+ gap: var(--spacingM);
870
+ }
871
+
872
+ .flm-choicegroup-option {
873
+ display: inline-flex;
874
+ align-items: center;
875
+ gap: var(--spacingS2);
876
+ cursor: pointer;
877
+ user-select: none;
878
+ font-size: var(--fontSizeMedium);
879
+ line-height: var(--lineHeightMedium);
880
+ color: var(--bodyText);
881
+ position: relative;
882
+ padding: 2px 0;
883
+ }
884
+
885
+ /* Hide native radio */
886
+ .flm-choicegroup-input {
887
+ position: absolute;
888
+ opacity: 0;
889
+ width: 0;
890
+ height: 0;
891
+ margin: 0;
892
+ padding: 0;
893
+ }
894
+
895
+ /* Visual radio circle */
896
+ .flm-choicegroup-mark {
897
+ display: inline-flex;
898
+ align-items: center;
899
+ justify-content: center;
900
+ width: 20px;
901
+ height: 20px;
902
+ min-width: 20px;
903
+ border: 1px solid var(--smallInputBorder);
904
+ border-radius: 50%;
905
+ background-color: var(--inputBackground);
906
+ transition: background-color var(--duration1) var(--easeStandard),
907
+ border-color var(--duration1) var(--easeStandard);
908
+ box-sizing: border-box;
909
+ flex-shrink: 0;
910
+ }
911
+
912
+ /* Inner dot */
913
+ .flm-choicegroup-mark::after {
914
+ content: '';
915
+ display: none;
916
+ width: 10px;
917
+ height: 10px;
918
+ border-radius: 50%;
919
+ background-color: var(--inputBackgroundChecked);
920
+ }
921
+
922
+ /* Hover */
923
+ .flm-choicegroup-option:hover .flm-choicegroup-mark {
924
+ border-color: var(--inputBorderHovered);
925
+ }
926
+
927
+ /* Checked */
928
+ .flm-choicegroup-input:checked + .flm-choicegroup-mark {
929
+ border-color: var(--inputBackgroundChecked);
930
+ }
931
+
932
+ .flm-choicegroup-input:checked + .flm-choicegroup-mark::after {
933
+ display: block;
934
+ }
935
+
936
+ /* Checked hover */
937
+ .flm-choicegroup-option:hover .flm-choicegroup-input:checked + .flm-choicegroup-mark {
938
+ border-color: var(--inputBackgroundCheckedHovered);
939
+ }
940
+
941
+ .flm-choicegroup-option:hover .flm-choicegroup-input:checked + .flm-choicegroup-mark::after {
942
+ background-color: var(--inputBackgroundCheckedHovered);
943
+ }
944
+
945
+ /* Focus */
946
+ .flm-choicegroup-input:focus-visible + .flm-choicegroup-mark {
947
+ outline: var(--focusOutlineWidth) solid var(--focusBorder);
948
+ outline-offset: var(--focusOutlineOffset);
949
+ }
950
+
951
+ /* Disabled */
952
+ .flm-choicegroup-option--disabled,
953
+ .flm-choicegroup-option:has(.flm-choicegroup-input:disabled) {
954
+ cursor: default;
955
+ color: var(--disabledText);
956
+ }
957
+
958
+ .flm-choicegroup-input:disabled + .flm-choicegroup-mark {
959
+ background-color: var(--disabledBackground);
960
+ border-color: var(--disabledBorder);
961
+ }
962
+
963
+ .flm-choicegroup-input:disabled:checked + .flm-choicegroup-mark::after {
964
+ background-color: var(--disabledText);
965
+ }
966
+
967
+ .flm-choicegroup-label {
968
+ /* Inherits from parent */
969
+ }
970
+
971
+ /* Coachmark — Pulsing beacon that reveals a TeachingBubble */
972
+
973
+ @keyframes flm-coachmark-pulse {
974
+ 0% {
975
+ transform: scale(1);
976
+ opacity: 0.8;
977
+ }
978
+ 100% {
979
+ transform: scale(2.5);
980
+ opacity: 0;
981
+ }
982
+ }
983
+
984
+ .flm-coachmark {
985
+ position: absolute;
986
+ z-index: 999;
987
+ display: inline-flex;
988
+ align-items: center;
989
+ justify-content: center;
990
+ cursor: pointer;
991
+ }
992
+
993
+ /* Central dot */
994
+ .flm-coachmark-dot {
995
+ width: 12px;
996
+ height: 12px;
997
+ border-radius: 50%;
998
+ background-color: var(--themePrimary);
999
+ position: relative;
1000
+ z-index: 1;
1001
+ }
1002
+
1003
+ /* Pulsing ring */
1004
+ .flm-coachmark-ring {
1005
+ position: absolute;
1006
+ width: 12px;
1007
+ height: 12px;
1008
+ border-radius: 50%;
1009
+ border: 2px solid var(--themePrimary);
1010
+ animation: flm-coachmark-pulse 1.5s ease-out infinite;
1011
+ top: 50%;
1012
+ left: 50%;
1013
+ margin-top: -6px;
1014
+ margin-left: -6px;
1015
+ box-sizing: border-box;
1016
+ }
1017
+
1018
+ /* Hidden state (after teaching bubble dismissed) */
1019
+ .flm-coachmark--hidden {
1020
+ display: none;
1021
+ }
1022
+
1023
+ /* Color variants */
1024
+ .flm-coachmark--dark .flm-coachmark-dot {
1025
+ background-color: var(--themeDark);
1026
+ }
1027
+
1028
+ .flm-coachmark--dark .flm-coachmark-ring {
1029
+ border-color: var(--themeDark);
1030
+ }
1031
+
1032
+ /* ComboBox — Filterable dropdown */
1033
+
1034
+ .flm-combobox {
1035
+ display: flex;
1036
+ flex-direction: column;
1037
+ width: 100%;
1038
+ position: relative;
1039
+ font-family: var(--fontFamily);
1040
+ }
1041
+
1042
+ .flm-combobox-wrapper {
1043
+ display: flex;
1044
+ align-items: stretch;
1045
+ height: 32px;
1046
+ border: 1px solid var(--inputBorder);
1047
+ border-radius: var(--roundedCorner2);
1048
+ background-color: var(--inputBackground);
1049
+ box-sizing: border-box;
1050
+ overflow: hidden;
1051
+ }
1052
+
1053
+ .flm-combobox-wrapper:hover {
1054
+ border-color: var(--inputBorderHovered);
1055
+ }
1056
+
1057
+ .flm-combobox-wrapper:focus-within {
1058
+ border-color: var(--inputFocusBorderAlt);
1059
+ border-bottom-width: 2px;
1060
+ }
1061
+
1062
+ .flm-combobox-input {
1063
+ flex: 1;
1064
+ border: none;
1065
+ background: transparent;
1066
+ color: var(--inputText);
1067
+ font-family: var(--fontFamily);
1068
+ font-size: var(--fontSizeMedium);
1069
+ line-height: var(--lineHeightMedium);
1070
+ padding: 0 8px;
1071
+ outline: none;
1072
+ min-width: 0;
1073
+ }
1074
+
1075
+ .flm-combobox-input::placeholder {
1076
+ color: var(--inputPlaceholderText);
1077
+ }
1078
+
1079
+ /* Caret button */
1080
+ .flm-combobox-caret {
1081
+ display: flex;
1082
+ align-items: center;
1083
+ justify-content: center;
1084
+ width: 28px;
1085
+ border: none;
1086
+ background: transparent;
1087
+ color: var(--bodySubtext);
1088
+ cursor: pointer;
1089
+ padding: 0;
1090
+ flex-shrink: 0;
1091
+ }
1092
+
1093
+ .flm-combobox-caret:hover {
1094
+ background-color: var(--listItemBackgroundHovered);
1095
+ color: var(--bodyText);
1096
+ }
1097
+
1098
+ /* Listbox (option dropdown) */
1099
+ .flm-combobox-listbox {
1100
+ position: absolute;
1101
+ left: 0;
1102
+ right: 0;
1103
+ top: 100%;
1104
+ margin-top: 2px;
1105
+ z-index: 1000;
1106
+ background-color: var(--bodyBackground);
1107
+ border: 1px solid var(--variantBorder);
1108
+ border-radius: var(--roundedCorner2);
1109
+ box-shadow: var(--elevation8);
1110
+ max-height: 220px;
1111
+ overflow-y: auto;
1112
+ display: none;
1113
+ }
1114
+
1115
+ .flm-combobox-listbox--open {
1116
+ display: block;
1117
+ }
1118
+
1119
+ /* Flip above */
1120
+ .flm-combobox-listbox--above {
1121
+ top: auto;
1122
+ bottom: 100%;
1123
+ margin-top: 0;
1124
+ margin-bottom: 2px;
1125
+ }
1126
+
1127
+ .flm-combobox-option {
1128
+ display: flex;
1129
+ align-items: center;
1130
+ padding: 6px var(--spacingS1);
1131
+ min-height: 32px;
1132
+ cursor: pointer;
1133
+ font-size: var(--fontSizeMedium);
1134
+ line-height: var(--lineHeightMedium);
1135
+ color: var(--bodyText);
1136
+ box-sizing: border-box;
1137
+ }
1138
+
1139
+ .flm-combobox-option:hover,
1140
+ .flm-combobox-option--highlighted {
1141
+ background-color: var(--listItemBackgroundHovered);
1142
+ }
1143
+
1144
+ .flm-combobox-option--selected {
1145
+ background-color: var(--listItemBackgroundChecked);
1146
+ font-weight: var(--fontWeightSemibold);
1147
+ }
1148
+
1149
+ .flm-combobox-option--disabled {
1150
+ color: var(--disabledText);
1151
+ cursor: default;
1152
+ pointer-events: none;
1153
+ }
1154
+
1155
+ .flm-combobox-option--hidden {
1156
+ display: none;
1157
+ }
1158
+
1159
+ /* Multi-select checkbox inside option */
1160
+ .flm-combobox-option-check {
1161
+ display: inline-flex;
1162
+ align-items: center;
1163
+ justify-content: center;
1164
+ width: 16px;
1165
+ height: 16px;
1166
+ min-width: 16px;
1167
+ margin-right: var(--spacingS2);
1168
+ border: 1px solid var(--smallInputBorder);
1169
+ border-radius: var(--roundedCorner2);
1170
+ box-sizing: border-box;
1171
+ flex-shrink: 0;
1172
+ }
1173
+
1174
+ .flm-combobox-option--selected .flm-combobox-option-check {
1175
+ background-color: var(--inputBackgroundChecked);
1176
+ border-color: var(--inputBackgroundChecked);
1177
+ }
1178
+
1179
+ .flm-combobox-option--selected .flm-combobox-option-check::after {
1180
+ content: '';
1181
+ display: block;
1182
+ width: 5px;
1183
+ height: 8px;
1184
+ border: solid var(--inputForegroundChecked);
1185
+ border-width: 0 2px 2px 0;
1186
+ transform: rotate(45deg);
1187
+ margin-top: -2px;
1188
+ }
1189
+
1190
+ /* Disabled combobox */
1191
+ .flm-combobox--disabled .flm-combobox-wrapper {
1192
+ border-color: var(--disabledBorder);
1193
+ background-color: var(--disabledBackground);
1194
+ }
1195
+
1196
+ .flm-combobox--disabled .flm-combobox-input {
1197
+ color: var(--disabledText);
1198
+ }
1199
+
1200
+ .flm-combobox--disabled .flm-combobox-caret {
1201
+ color: var(--disabledText);
1202
+ cursor: default;
1203
+ pointer-events: none;
1204
+ }
1205
+
1206
+ /* Error */
1207
+ .flm-combobox--error .flm-combobox-wrapper {
1208
+ border-color: var(--errorText);
1209
+ }
1210
+
1211
+ .flm-combobox-error {
1212
+ display: block;
1213
+ font-size: var(--fontSizeSmall);
1214
+ line-height: var(--lineHeightSmall);
1215
+ color: var(--errorText);
1216
+ padding-top: 5px;
1217
+ }
1218
+
1219
+ /* CommandBar — horizontal toolbar */
1220
+
1221
+ .flm-commandbar {
1222
+ display: flex;
1223
+ align-items: stretch;
1224
+ height: 44px;
1225
+ background-color: var(--bodyBackground);
1226
+ border-bottom: 1px solid var(--bodyDivider);
1227
+ padding: 0 var(--spacingS2);
1228
+ font-family: var(--fontFamily);
1229
+ }
1230
+
1231
+ .flm-commandbar-items {
1232
+ display: flex;
1233
+ align-items: stretch;
1234
+ flex: 1;
1235
+ min-width: 0;
1236
+ overflow: hidden;
1237
+ }
1238
+
1239
+ .flm-commandbar-far {
1240
+ display: flex;
1241
+ align-items: stretch;
1242
+ margin-left: auto;
1243
+ flex-shrink: 0;
1244
+ }
1245
+
1246
+ .flm-commandbar-item {
1247
+ display: inline-flex;
1248
+ align-items: center;
1249
+ gap: var(--spacingS2);
1250
+ padding: 0 var(--spacingS1);
1251
+ border: none;
1252
+ background: transparent;
1253
+ color: var(--bodyText);
1254
+ font-family: var(--fontFamily);
1255
+ font-size: var(--fontSizeMedium);
1256
+ cursor: pointer;
1257
+ white-space: nowrap;
1258
+ height: 100%;
1259
+ box-sizing: border-box;
1260
+ }
1261
+
1262
+ .flm-commandbar-item:hover {
1263
+ background-color: var(--buttonBackgroundHovered);
1264
+ color: var(--buttonTextHovered);
1265
+ }
1266
+
1267
+ .flm-commandbar-item:active {
1268
+ background-color: var(--buttonBackgroundPressed);
1269
+ }
1270
+
1271
+ .flm-commandbar-item[disabled] {
1272
+ color: var(--disabledText);
1273
+ cursor: default;
1274
+ pointer-events: none;
1275
+ }
1276
+
1277
+ .flm-commandbar-divider {
1278
+ width: 1px;
1279
+ align-self: stretch;
1280
+ margin: 8px 4px;
1281
+ background-color: var(--bodyDivider);
1282
+ }
1283
+
1284
+ /* Overflow button */
1285
+ .flm-commandbar-overflow {
1286
+ display: inline-flex;
1287
+ align-items: center;
1288
+ justify-content: center;
1289
+ width: 40px;
1290
+ border: none;
1291
+ background: transparent;
1292
+ color: var(--bodyText);
1293
+ cursor: pointer;
1294
+ }
1295
+
1296
+ .flm-commandbar-overflow:hover {
1297
+ background-color: var(--buttonBackgroundHovered);
1298
+ }
1299
+
1300
+ /* ContextualMenu */
1301
+
1302
+ .flm-contextmenu {
1303
+ position: absolute;
1304
+ z-index: 1000;
1305
+ background-color: var(--menuBackground);
1306
+ border-radius: var(--roundedCorner2);
1307
+ box-shadow: var(--elevation8);
1308
+ border: 1px solid var(--variantBorder);
1309
+ min-width: 180px;
1310
+ max-width: 300px;
1311
+ padding: var(--spacingS2) 0;
1312
+ opacity: 0;
1313
+ pointer-events: none;
1314
+ transform: scaleY(0.95);
1315
+ transform-origin: top left;
1316
+ transition: opacity var(--duration1) var(--easeStandard),
1317
+ transform var(--duration1) var(--easeDecelerate);
1318
+ font-family: var(--fontFamily);
1319
+ }
1320
+
1321
+ .flm-contextmenu--visible {
1322
+ opacity: 1;
1323
+ pointer-events: auto;
1324
+ transform: scaleY(1);
1325
+ }
1326
+
1327
+ .flm-contextmenu-item {
1328
+ display: flex;
1329
+ align-items: center;
1330
+ gap: var(--spacingS2);
1331
+ padding: 6px var(--spacingS1);
1332
+ border: none;
1333
+ background: transparent;
1334
+ color: var(--menuItemText);
1335
+ font-family: var(--fontFamily);
1336
+ font-size: var(--fontSizeMedium);
1337
+ line-height: var(--lineHeightMedium);
1338
+ cursor: pointer;
1339
+ width: 100%;
1340
+ text-align: left;
1341
+ white-space: nowrap;
1342
+ }
1343
+
1344
+ .flm-contextmenu-item:hover {
1345
+ background-color: var(--menuItemBackgroundHovered);
1346
+ color: var(--menuItemTextHovered);
1347
+ }
1348
+
1349
+ .flm-contextmenu-item:active {
1350
+ background-color: var(--menuItemBackgroundPressed);
1351
+ }
1352
+
1353
+ .flm-contextmenu-item[disabled] {
1354
+ color: var(--disabledText);
1355
+ cursor: default;
1356
+ pointer-events: none;
1357
+ }
1358
+
1359
+ .flm-contextmenu-item-icon {
1360
+ display: inline-flex;
1361
+ width: 16px;
1362
+ height: 16px;
1363
+ color: var(--menuIcon);
1364
+ flex-shrink: 0;
1365
+ }
1366
+
1367
+ .flm-contextmenu-item-icon > svg {
1368
+ width: 100%;
1369
+ height: 100%;
1370
+ fill: currentColor;
1371
+ }
1372
+
1373
+ .flm-contextmenu-item-text {
1374
+ flex: 1;
1375
+ overflow: hidden;
1376
+ text-overflow: ellipsis;
1377
+ }
1378
+
1379
+ /* Submenu indicator */
1380
+ .flm-contextmenu-item-submenu {
1381
+ display: inline-flex;
1382
+ width: 12px;
1383
+ height: 12px;
1384
+ margin-left: auto;
1385
+ color: var(--bodySubtext);
1386
+ flex-shrink: 0;
1387
+ }
1388
+
1389
+ .flm-contextmenu-divider {
1390
+ height: 1px;
1391
+ background-color: var(--menuDivider);
1392
+ margin: var(--spacingS2) 0;
1393
+ }
1394
+
1395
+ .flm-contextmenu-header {
1396
+ padding: 6px var(--spacingS1);
1397
+ font-size: var(--fontSizeSmall);
1398
+ font-weight: var(--fontWeightSemibold);
1399
+ color: var(--menuHeader);
1400
+ }
1401
+
1402
+ /* Checkbox / radio items */
1403
+ .flm-contextmenu-item--checked::before {
1404
+ content: '';
1405
+ display: inline-block;
1406
+ width: 16px;
1407
+ height: 16px;
1408
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='%230078d4' d='M13.86 3.66a.5.5 0 0 1-.02.7l-7.93 7.48a.5.5 0 0 1-.7-.02L2.16 8.59a.5.5 0 0 1 .72-.7l2.7 2.88 7.58-7.13a.5.5 0 0 1 .7.02z'/%3E%3C/svg%3E");
1409
+ background-size: contain;
1410
+ flex-shrink: 0;
1411
+ }
1412
+
1413
+ /* DatePicker — Date input with calendar dropdown */
1414
+
1415
+ .flm-datepicker {
1416
+ display: flex;
1417
+ flex-direction: column;
1418
+ width: 100%;
1419
+ position: relative;
1420
+ font-family: var(--fontFamily);
1421
+ }
1422
+
1423
+ .flm-datepicker-wrapper {
1424
+ display: flex;
1425
+ align-items: stretch;
1426
+ height: 32px;
1427
+ border: 1px solid var(--inputBorder);
1428
+ border-radius: var(--roundedCorner2);
1429
+ background-color: var(--inputBackground);
1430
+ box-sizing: border-box;
1431
+ overflow: hidden;
1432
+ }
1433
+
1434
+ .flm-datepicker-wrapper:hover {
1435
+ border-color: var(--inputBorderHovered);
1436
+ }
1437
+
1438
+ .flm-datepicker-wrapper:focus-within {
1439
+ border-color: var(--inputFocusBorderAlt);
1440
+ border-bottom-width: 2px;
1441
+ }
1442
+
1443
+ .flm-datepicker-input {
1444
+ flex: 1;
1445
+ border: none;
1446
+ background: transparent;
1447
+ color: var(--inputText);
1448
+ font-family: var(--fontFamily);
1449
+ font-size: var(--fontSizeMedium);
1450
+ line-height: var(--lineHeightMedium);
1451
+ padding: 0 8px;
1452
+ outline: none;
1453
+ min-width: 0;
1454
+ }
1455
+
1456
+ .flm-datepicker-input::placeholder {
1457
+ color: var(--inputPlaceholderText);
1458
+ }
1459
+
1460
+ /* Calendar icon button */
1461
+ .flm-datepicker-icon {
1462
+ display: flex;
1463
+ align-items: center;
1464
+ justify-content: center;
1465
+ width: 28px;
1466
+ border: none;
1467
+ background: transparent;
1468
+ color: var(--bodySubtext);
1469
+ cursor: pointer;
1470
+ padding: 0;
1471
+ flex-shrink: 0;
1472
+ }
1473
+
1474
+ .flm-datepicker-icon:hover {
1475
+ background-color: var(--listItemBackgroundHovered);
1476
+ color: var(--bodyText);
1477
+ }
1478
+
1479
+ /* Calendar callout */
1480
+ .flm-datepicker-callout {
1481
+ position: absolute;
1482
+ left: 0;
1483
+ top: 100%;
1484
+ margin-top: 2px;
1485
+ z-index: 1000;
1486
+ background-color: var(--bodyBackground);
1487
+ border: 1px solid var(--variantBorder);
1488
+ border-radius: var(--roundedCorner2);
1489
+ box-shadow: var(--elevation8);
1490
+ padding: var(--spacingS1);
1491
+ display: none;
1492
+ width: 252px;
1493
+ }
1494
+
1495
+ .flm-datepicker-callout--open {
1496
+ display: block;
1497
+ }
1498
+
1499
+ .flm-datepicker-callout--above {
1500
+ top: auto;
1501
+ bottom: 100%;
1502
+ margin-top: 0;
1503
+ margin-bottom: 2px;
1504
+ }
1505
+
1506
+ /* Month navigation header */
1507
+ .flm-datepicker-nav {
1508
+ display: flex;
1509
+ align-items: center;
1510
+ justify-content: space-between;
1511
+ padding: var(--spacingS2) 0;
1512
+ margin-bottom: var(--spacingS2);
1513
+ }
1514
+
1515
+ .flm-datepicker-month {
1516
+ font-size: var(--fontSizeMedium);
1517
+ font-weight: var(--fontWeightSemibold);
1518
+ color: var(--bodyText);
1519
+ user-select: none;
1520
+ }
1521
+
1522
+ .flm-datepicker-nav-btn {
1523
+ display: flex;
1524
+ align-items: center;
1525
+ justify-content: center;
1526
+ width: 28px;
1527
+ height: 28px;
1528
+ border: none;
1529
+ background: transparent;
1530
+ color: var(--bodySubtext);
1531
+ cursor: pointer;
1532
+ border-radius: var(--roundedCorner2);
1533
+ padding: 0;
1534
+ }
1535
+
1536
+ .flm-datepicker-nav-btn:hover {
1537
+ background-color: var(--listItemBackgroundHovered);
1538
+ color: var(--bodyText);
1539
+ }
1540
+
1541
+ /* Day-of-week header row */
1542
+ .flm-datepicker-weekdays {
1543
+ display: grid;
1544
+ grid-template-columns: repeat(7, 1fr);
1545
+ text-align: center;
1546
+ margin-bottom: 2px;
1547
+ }
1548
+
1549
+ .flm-datepicker-weekday {
1550
+ font-size: var(--fontSizeSmall);
1551
+ line-height: 32px;
1552
+ color: var(--bodySubtext);
1553
+ font-weight: var(--fontWeightSemibold);
1554
+ user-select: none;
1555
+ }
1556
+
1557
+ /* Calendar grid (7×6 = 42 cells) */
1558
+ .flm-datepicker-grid {
1559
+ display: grid;
1560
+ grid-template-columns: repeat(7, 1fr);
1561
+ text-align: center;
1562
+ }
1563
+
1564
+ .flm-datepicker-day {
1565
+ display: flex;
1566
+ align-items: center;
1567
+ justify-content: center;
1568
+ width: 32px;
1569
+ height: 32px;
1570
+ margin: 1px auto;
1571
+ border: none;
1572
+ background: transparent;
1573
+ color: var(--bodyText);
1574
+ font-size: var(--fontSizeSmall);
1575
+ cursor: pointer;
1576
+ border-radius: 50%;
1577
+ padding: 0;
1578
+ }
1579
+
1580
+ .flm-datepicker-day:hover {
1581
+ background-color: var(--listItemBackgroundHovered);
1582
+ }
1583
+
1584
+ /* Today */
1585
+ .flm-datepicker-day--today {
1586
+ font-weight: var(--fontWeightSemibold);
1587
+ color: var(--themePrimary);
1588
+ background-color: var(--themeLighterAlt);
1589
+ border-radius: 50%;
1590
+ }
1591
+
1592
+ /* Selected */
1593
+ .flm-datepicker-day--selected {
1594
+ background-color: var(--themePrimary);
1595
+ color: var(--white);
1596
+ }
1597
+
1598
+ .flm-datepicker-day--selected:hover {
1599
+ background-color: var(--themeDarkAlt);
1600
+ }
1601
+
1602
+ /* Outside current month */
1603
+ .flm-datepicker-day--outside {
1604
+ color: var(--neutralTertiary);
1605
+ }
1606
+
1607
+ /* Disabled dates */
1608
+ .flm-datepicker-day--disabled {
1609
+ color: var(--disabledText);
1610
+ cursor: default;
1611
+ pointer-events: none;
1612
+ }
1613
+
1614
+ /* Disabled datepicker */
1615
+ .flm-datepicker--disabled .flm-datepicker-wrapper {
1616
+ border-color: var(--disabledBorder);
1617
+ background-color: var(--disabledBackground);
1618
+ }
1619
+
1620
+ .flm-datepicker--disabled .flm-datepicker-input {
1621
+ color: var(--disabledText);
1622
+ }
1623
+
1624
+ .flm-datepicker--disabled .flm-datepicker-icon {
1625
+ color: var(--disabledText);
1626
+ cursor: default;
1627
+ pointer-events: none;
1628
+ }
1629
+
1630
+ /* Error */
1631
+ .flm-datepicker--error .flm-datepicker-wrapper {
1632
+ border-color: var(--errorText);
1633
+ }
1634
+
1635
+ .flm-datepicker-error {
1636
+ display: block;
1637
+ font-size: var(--fontSizeSmall);
1638
+ line-height: var(--lineHeightSmall);
1639
+ color: var(--errorText);
1640
+ padding-top: 5px;
1641
+ }
1642
+
1643
+ /* DetailsList — data table */
1644
+
1645
+ .flm-detailslist {
1646
+ width: 100%;
1647
+ font-family: var(--fontFamily);
1648
+ font-size: var(--fontSizeMedium);
1649
+ border-collapse: collapse;
1650
+ }
1651
+
1652
+ /* Header */
1653
+ .flm-detailslist-header {
1654
+ display: flex;
1655
+ align-items: stretch;
1656
+ border-bottom: 1px solid var(--bodyDivider);
1657
+ background-color: var(--bodyBackground);
1658
+ min-height: 42px;
1659
+ user-select: none;
1660
+ }
1661
+
1662
+ .flm-detailslist-header-cell {
1663
+ display: flex;
1664
+ align-items: center;
1665
+ gap: var(--spacingS2);
1666
+ padding: 0 var(--spacingS1);
1667
+ font-size: var(--fontSizeSmall);
1668
+ font-weight: var(--fontWeightSemibold);
1669
+ color: var(--bodyText);
1670
+ cursor: pointer;
1671
+ border: none;
1672
+ background: transparent;
1673
+ text-align: left;
1674
+ white-space: nowrap;
1675
+ overflow: hidden;
1676
+ text-overflow: ellipsis;
1677
+ flex-shrink: 0;
1678
+ }
1679
+
1680
+ .flm-detailslist-header-cell:hover {
1681
+ background-color: var(--listHeaderBackgroundHovered);
1682
+ }
1683
+
1684
+ .flm-detailslist-header-cell:active {
1685
+ background-color: var(--listHeaderBackgroundPressed);
1686
+ }
1687
+
1688
+ /* Sort indicator */
1689
+ .flm-detailslist-sort {
1690
+ display: inline-flex;
1691
+ width: 12px;
1692
+ height: 12px;
1693
+ flex-shrink: 0;
1694
+ }
1695
+
1696
+ /* Rows */
1697
+ .flm-detailslist-row {
1698
+ display: flex;
1699
+ align-items: center;
1700
+ min-height: 42px;
1701
+ border-bottom: 1px solid var(--bodyDivider);
1702
+ background-color: var(--listBackground);
1703
+ cursor: default;
1704
+ }
1705
+
1706
+ .flm-detailslist-row:hover {
1707
+ background-color: var(--listItemBackgroundHovered);
1708
+ }
1709
+
1710
+ .flm-detailslist-row--selected {
1711
+ background-color: var(--listItemBackgroundChecked);
1712
+ }
1713
+
1714
+ .flm-detailslist-row--selected:hover {
1715
+ background-color: var(--listItemBackgroundCheckedHovered);
1716
+ }
1717
+
1718
+ .flm-detailslist-cell {
1719
+ padding: 0 var(--spacingS1);
1720
+ overflow: hidden;
1721
+ text-overflow: ellipsis;
1722
+ white-space: nowrap;
1723
+ font-size: var(--fontSizeMedium);
1724
+ color: var(--bodyText);
1725
+ flex-shrink: 0;
1726
+ }
1727
+
1728
+ /* Row checkbox */
1729
+ .flm-detailslist-check {
1730
+ display: flex;
1731
+ align-items: center;
1732
+ justify-content: center;
1733
+ width: 40px;
1734
+ flex-shrink: 0;
1735
+ }
1736
+
1737
+ /* Compact mode */
1738
+ .flm-detailslist--compact .flm-detailslist-row,
1739
+ .flm-detailslist--compact .flm-detailslist-header {
1740
+ min-height: 32px;
1741
+ }
1742
+
1743
+ /* Empty state */
1744
+ .flm-detailslist-empty {
1745
+ display: flex;
1746
+ align-items: center;
1747
+ justify-content: center;
1748
+ padding: var(--spacingL2);
1749
+ color: var(--bodySubtext);
1750
+ font-size: var(--fontSizeMedium);
1751
+ }
1752
+
1753
+ /* Column resize handle */
1754
+ .flm-detailslist-resize {
1755
+ width: 4px;
1756
+ align-self: stretch;
1757
+ cursor: col-resize;
1758
+ margin-left: auto;
1759
+ opacity: 0;
1760
+ background-color: var(--themePrimary);
1761
+ transition: opacity var(--duration1) var(--easeStandard);
1762
+ }
1763
+
1764
+ .flm-detailslist-header-cell:hover .flm-detailslist-resize {
1765
+ opacity: 1;
1766
+ }
1767
+
1768
+ /* Dialog */
1769
+
1770
+ .flm-dialog-overlay {
1771
+ position: fixed;
1772
+ inset: 0;
1773
+ background-color: var(--overlayBackground);
1774
+ z-index: 1000;
1775
+ display: flex;
1776
+ align-items: center;
1777
+ justify-content: center;
1778
+ opacity: 0;
1779
+ pointer-events: none;
1780
+ transition: opacity var(--duration2) var(--easeStandard);
1781
+ }
1782
+
1783
+ .flm-dialog-overlay--open {
1784
+ opacity: 1;
1785
+ pointer-events: auto;
1786
+ }
1787
+
1788
+ .flm-dialog {
1789
+ background-color: var(--bodyBackground);
1790
+ border-radius: var(--roundedCorner4);
1791
+ box-shadow: var(--elevation64);
1792
+ min-width: 288px;
1793
+ max-width: 560px;
1794
+ width: 100%;
1795
+ max-height: 90vh;
1796
+ display: flex;
1797
+ flex-direction: column;
1798
+ transform: scale(0.95);
1799
+ transition: transform var(--duration2) var(--easeDecelerate);
1800
+ }
1801
+
1802
+ .flm-dialog-overlay--open .flm-dialog {
1803
+ transform: scale(1);
1804
+ }
1805
+
1806
+ .flm-dialog-header {
1807
+ display: flex;
1808
+ align-items: center;
1809
+ justify-content: space-between;
1810
+ padding: var(--spacingM) var(--spacingL1);
1811
+ flex-shrink: 0;
1812
+ }
1813
+
1814
+ .flm-dialog-title {
1815
+ font-size: var(--fontSizeXLarge);
1816
+ font-weight: var(--fontWeightSemibold);
1817
+ line-height: var(--lineHeightXLarge);
1818
+ color: var(--bodyText);
1819
+ margin: 0;
1820
+ }
1821
+
1822
+ .flm-dialog-close {
1823
+ display: inline-flex;
1824
+ align-items: center;
1825
+ justify-content: center;
1826
+ width: 32px;
1827
+ height: 32px;
1828
+ border: none;
1829
+ border-radius: var(--roundedCorner2);
1830
+ background: transparent;
1831
+ color: var(--bodySubtext);
1832
+ cursor: pointer;
1833
+ flex-shrink: 0;
1834
+ }
1835
+
1836
+ .flm-dialog-close:hover {
1837
+ background-color: var(--buttonBackgroundHovered);
1838
+ color: var(--bodyText);
1839
+ }
1840
+
1841
+ .flm-dialog-body {
1842
+ padding: 0 var(--spacingL1);
1843
+ overflow-y: auto;
1844
+ flex: 1;
1845
+ font-size: var(--fontSizeMedium);
1846
+ line-height: var(--lineHeightMedium);
1847
+ color: var(--bodySubtext);
1848
+ }
1849
+
1850
+ .flm-dialog-footer {
1851
+ display: flex;
1852
+ align-items: center;
1853
+ justify-content: flex-end;
1854
+ gap: var(--spacingS1);
1855
+ padding: var(--spacingM) var(--spacingL1);
1856
+ flex-shrink: 0;
1857
+ }
1858
+
1859
+ /* Large header variant */
1860
+ .flm-dialog--large-header .flm-dialog-title {
1861
+ font-size: var(--fontSizeXXLarge);
1862
+ line-height: var(--lineHeightXXLarge);
1863
+ }
1864
+
1865
+ /* DocumentCard — File preview card */
1866
+
1867
+ .flm-documentcard {
1868
+ display: flex;
1869
+ flex-direction: column;
1870
+ width: 212px;
1871
+ background-color: var(--bodyBackground);
1872
+ border: 1px solid var(--variantBorder);
1873
+ border-radius: var(--roundedCorner2);
1874
+ box-shadow: var(--elevation4);
1875
+ overflow: hidden;
1876
+ cursor: pointer;
1877
+ font-family: var(--fontFamily);
1878
+ transition: box-shadow var(--duration2) var(--easeStandard);
1879
+ }
1880
+
1881
+ .flm-documentcard:hover {
1882
+ box-shadow: var(--elevation8);
1883
+ border-color: var(--variantBorderHovered);
1884
+ }
1885
+
1886
+ /* Preview image area */
1887
+ .flm-documentcard-preview {
1888
+ position: relative;
1889
+ height: 130px;
1890
+ overflow: hidden;
1891
+ background-color: var(--neutralLighter);
1892
+ }
1893
+
1894
+ .flm-documentcard-preview img {
1895
+ width: 100%;
1896
+ height: 100%;
1897
+ object-fit: cover;
1898
+ }
1899
+
1900
+ /* File type icon in preview */
1901
+ .flm-documentcard-preview-icon {
1902
+ display: flex;
1903
+ align-items: center;
1904
+ justify-content: center;
1905
+ height: 100%;
1906
+ color: var(--themePrimary);
1907
+ font-size: 32px;
1908
+ }
1909
+
1910
+ /* Card details */
1911
+ .flm-documentcard-details {
1912
+ padding: var(--spacingS1);
1913
+ display: flex;
1914
+ flex-direction: column;
1915
+ gap: 4px;
1916
+ }
1917
+
1918
+ .flm-documentcard-title {
1919
+ font-size: var(--fontSizeMedium);
1920
+ font-weight: var(--fontWeightSemibold);
1921
+ line-height: var(--lineHeightMedium);
1922
+ color: var(--bodyText);
1923
+ white-space: nowrap;
1924
+ overflow: hidden;
1925
+ text-overflow: ellipsis;
1926
+ }
1927
+
1928
+ /* Activity row (persona + timestamp) */
1929
+ .flm-documentcard-activity {
1930
+ display: flex;
1931
+ align-items: center;
1932
+ gap: var(--spacingS2);
1933
+ padding: 0 var(--spacingS1) var(--spacingS1);
1934
+ }
1935
+
1936
+ .flm-documentcard-activity-name {
1937
+ font-size: var(--fontSizeSmall);
1938
+ line-height: var(--lineHeightSmall);
1939
+ color: var(--bodyText);
1940
+ white-space: nowrap;
1941
+ overflow: hidden;
1942
+ text-overflow: ellipsis;
1943
+ }
1944
+
1945
+ .flm-documentcard-activity-date {
1946
+ font-size: var(--fontSizeSmall);
1947
+ line-height: var(--lineHeightSmall);
1948
+ color: var(--bodySubtext);
1949
+ }
1950
+
1951
+ /* Actions row */
1952
+ .flm-documentcard-actions {
1953
+ display: flex;
1954
+ align-items: center;
1955
+ gap: var(--spacingS2);
1956
+ padding: var(--spacingS2) var(--spacingS1);
1957
+ border-top: 1px solid var(--variantBorder);
1958
+ }
1959
+
1960
+ /* Compact variant — horizontal layout */
1961
+ .flm-documentcard--compact {
1962
+ flex-direction: row;
1963
+ width: auto;
1964
+ max-width: 480px;
1965
+ height: 90px;
1966
+ }
1967
+
1968
+ .flm-documentcard--compact .flm-documentcard-preview {
1969
+ width: 90px;
1970
+ height: 100%;
1971
+ flex-shrink: 0;
1972
+ }
1973
+
1974
+ .flm-documentcard--compact .flm-documentcard-details {
1975
+ flex: 1;
1976
+ min-width: 0;
1977
+ justify-content: center;
1978
+ }
1979
+
1980
+ .flm-documentcard--compact .flm-documentcard-activity {
1981
+ padding: 0 var(--spacingS1);
1982
+ }
1983
+
1984
+ /* Dropdown — custom dropdown (non-native) */
1985
+
1986
+ .flm-dropdown {
1987
+ display: flex;
1988
+ flex-direction: column;
1989
+ width: 100%;
1990
+ position: relative;
1991
+ font-family: var(--fontFamily);
1992
+ }
1993
+
1994
+ /* Trigger button — styled to match ComboBox wrapper */
1995
+ .flm-dropdown-trigger {
1996
+ display: flex;
1997
+ align-items: center;
1998
+ width: 100%;
1999
+ height: 32px;
2000
+ border: 1px solid var(--inputBorder);
2001
+ border-radius: var(--roundedCorner2);
2002
+ background-color: var(--inputBackground);
2003
+ box-sizing: border-box;
2004
+ cursor: pointer;
2005
+ padding: 0;
2006
+ overflow: hidden;
2007
+ text-align: left;
2008
+ font-family: var(--fontFamily);
2009
+ }
2010
+
2011
+ .flm-dropdown-trigger:hover {
2012
+ border-color: var(--inputBorderHovered);
2013
+ }
2014
+
2015
+ .flm-dropdown-trigger:focus {
2016
+ border-color: var(--inputFocusBorderAlt);
2017
+ border-bottom-width: 2px;
2018
+ outline: none;
2019
+ }
2020
+
2021
+ .flm-dropdown-title {
2022
+ flex: 1;
2023
+ padding: 0 8px;
2024
+ font-size: var(--fontSizeMedium);
2025
+ line-height: var(--lineHeightMedium);
2026
+ color: var(--inputText);
2027
+ overflow: hidden;
2028
+ text-overflow: ellipsis;
2029
+ white-space: nowrap;
2030
+ }
2031
+
2032
+ .flm-dropdown-title--placeholder {
2033
+ color: var(--inputPlaceholderText);
2034
+ }
2035
+
2036
+ .flm-dropdown-caret {
2037
+ display: flex;
2038
+ align-items: center;
2039
+ justify-content: center;
2040
+ width: 28px;
2041
+ height: 100%;
2042
+ color: var(--bodySubtext);
2043
+ flex-shrink: 0;
2044
+ pointer-events: none;
2045
+ }
2046
+
2047
+ /* Options listbox */
2048
+ .flm-dropdown-listbox {
2049
+ position: absolute;
2050
+ left: 0;
2051
+ right: 0;
2052
+ top: 100%;
2053
+ margin-top: 2px;
2054
+ z-index: 1000;
2055
+ background-color: var(--bodyBackground);
2056
+ border: 1px solid var(--variantBorder);
2057
+ border-radius: var(--roundedCorner2);
2058
+ box-shadow: var(--elevation8);
2059
+ max-height: 220px;
2060
+ overflow-y: auto;
2061
+ display: none;
2062
+ }
2063
+
2064
+ .flm-dropdown-listbox--open {
2065
+ display: block;
2066
+ }
2067
+
2068
+ .flm-dropdown-listbox--above {
2069
+ top: auto;
2070
+ bottom: 100%;
2071
+ margin-top: 0;
2072
+ margin-bottom: 2px;
2073
+ }
2074
+
2075
+ .flm-dropdown-option {
2076
+ display: flex;
2077
+ align-items: center;
2078
+ padding: 6px var(--spacingS1);
2079
+ min-height: 32px;
2080
+ cursor: pointer;
2081
+ font-size: var(--fontSizeMedium);
2082
+ line-height: var(--lineHeightMedium);
2083
+ color: var(--bodyText);
2084
+ box-sizing: border-box;
2085
+ }
2086
+
2087
+ .flm-dropdown-option:hover,
2088
+ .flm-dropdown-option--highlighted {
2089
+ background-color: var(--listItemBackgroundHovered);
2090
+ }
2091
+
2092
+ .flm-dropdown-option--selected {
2093
+ background-color: var(--listItemBackgroundChecked);
2094
+ font-weight: var(--fontWeightSemibold);
2095
+ }
2096
+
2097
+ .flm-dropdown-option--disabled {
2098
+ color: var(--disabledText);
2099
+ cursor: default;
2100
+ pointer-events: none;
2101
+ }
2102
+
2103
+ /* Hidden input for form value */
2104
+ .flm-dropdown-value {
2105
+ display: none;
2106
+ }
2107
+
2108
+ /* Disabled */
2109
+ .flm-dropdown--disabled .flm-dropdown-trigger {
2110
+ border-color: var(--disabledBorder);
2111
+ background-color: var(--disabledBackground);
2112
+ cursor: default;
2113
+ }
2114
+
2115
+ .flm-dropdown--disabled .flm-dropdown-title {
2116
+ color: var(--disabledText);
2117
+ }
2118
+
2119
+ .flm-dropdown--disabled .flm-dropdown-caret {
2120
+ color: var(--disabledText);
2121
+ }
2122
+
2123
+ /* Error */
2124
+ .flm-dropdown--error .flm-dropdown-trigger {
2125
+ border-color: var(--errorText);
2126
+ }
2127
+
2128
+ .flm-dropdown-error {
2129
+ display: block;
2130
+ font-size: var(--fontSizeSmall);
2131
+ line-height: var(--lineHeightSmall);
2132
+ color: var(--errorText);
2133
+ padding-top: 5px;
2134
+ }
2135
+
2136
+ /* Facepile — Overlapping persona coin row */
2137
+
2138
+ .flm-facepile {
2139
+ display: inline-flex;
2140
+ align-items: center;
2141
+ font-family: var(--fontFamily);
2142
+ }
2143
+
2144
+ /* Coins overlap via negative margin */
2145
+ .flm-facepile-member {
2146
+ margin-left: -8px;
2147
+ border: 2px solid var(--bodyBackground);
2148
+ border-radius: 50%;
2149
+ box-sizing: content-box;
2150
+ }
2151
+
2152
+ .flm-facepile-member:first-child {
2153
+ margin-left: 0;
2154
+ }
2155
+
2156
+ /* Reuse persona coin sizing */
2157
+ .flm-facepile .flm-persona-coin {
2158
+ display: inline-flex;
2159
+ align-items: center;
2160
+ justify-content: center;
2161
+ width: 32px;
2162
+ height: 32px;
2163
+ border-radius: 50%;
2164
+ background-color: var(--themePrimary);
2165
+ color: var(--white);
2166
+ font-size: 12px;
2167
+ font-weight: var(--fontWeightSemibold);
2168
+ flex-shrink: 0;
2169
+ user-select: none;
2170
+ }
2171
+
2172
+ .flm-facepile .flm-persona-coin img {
2173
+ width: 100%;
2174
+ height: 100%;
2175
+ object-fit: cover;
2176
+ border-radius: 50%;
2177
+ }
2178
+
2179
+ /* Overflow chip (+N) */
2180
+ .flm-facepile-overflow {
2181
+ display: inline-flex;
2182
+ align-items: center;
2183
+ justify-content: center;
2184
+ width: 32px;
2185
+ height: 32px;
2186
+ border-radius: 50%;
2187
+ background-color: var(--defaultStateBackground);
2188
+ color: var(--bodyText);
2189
+ font-size: var(--fontSizeSmall);
2190
+ font-weight: var(--fontWeightSemibold);
2191
+ margin-left: -8px;
2192
+ border: 2px solid var(--bodyBackground);
2193
+ box-sizing: content-box;
2194
+ flex-shrink: 0;
2195
+ user-select: none;
2196
+ }
2197
+
2198
+ /* Add button */
2199
+ .flm-facepile-add {
2200
+ display: inline-flex;
2201
+ align-items: center;
2202
+ justify-content: center;
2203
+ width: 32px;
2204
+ height: 32px;
2205
+ border-radius: 50%;
2206
+ border: 1px dashed var(--neutralTertiary);
2207
+ background: transparent;
2208
+ color: var(--themePrimary);
2209
+ font-size: 16px;
2210
+ cursor: pointer;
2211
+ margin-left: var(--spacingS2);
2212
+ flex-shrink: 0;
2213
+ }
2214
+
2215
+ .flm-facepile-add:hover {
2216
+ border-color: var(--themePrimary);
2217
+ background-color: var(--themeLighterAlt);
2218
+ }
2219
+
2220
+ /* GroupedList — Collapsible grouped items */
2221
+
2222
+ .flm-groupedlist {
2223
+ font-family: var(--fontFamily);
2224
+ font-size: var(--fontSizeMedium);
2225
+ width: 100%;
2226
+ }
2227
+
2228
+ .flm-groupedlist-group {
2229
+ margin-bottom: var(--spacingS2);
2230
+ }
2231
+
2232
+ .flm-groupedlist-header {
2233
+ display: flex;
2234
+ align-items: center;
2235
+ gap: var(--spacingS2);
2236
+ padding: var(--spacingS2) var(--spacingS1);
2237
+ font-size: var(--fontSizeMedium);
2238
+ font-weight: var(--fontWeightSemibold);
2239
+ color: var(--bodyText);
2240
+ cursor: pointer;
2241
+ user-select: none;
2242
+ border: none;
2243
+ background: transparent;
2244
+ width: 100%;
2245
+ text-align: left;
2246
+ }
2247
+
2248
+ .flm-groupedlist-header:hover {
2249
+ background-color: var(--listItemBackgroundHovered);
2250
+ }
2251
+
2252
+ /* Chevron */
2253
+ .flm-groupedlist-chevron {
2254
+ display: inline-flex;
2255
+ width: 16px;
2256
+ height: 16px;
2257
+ transition: transform var(--duration1) var(--easeStandard);
2258
+ flex-shrink: 0;
2259
+ }
2260
+
2261
+ .flm-groupedlist-chevron--expanded {
2262
+ transform: rotate(90deg);
2263
+ }
2264
+
2265
+ /* Items container */
2266
+ .flm-groupedlist-items {
2267
+ overflow: hidden;
2268
+ }
2269
+
2270
+ .flm-groupedlist-items--collapsed {
2271
+ display: none;
2272
+ }
2273
+
2274
+ /* Individual items */
2275
+ .flm-groupedlist-item {
2276
+ display: flex;
2277
+ align-items: center;
2278
+ gap: var(--spacingS1);
2279
+ padding: 6px var(--spacingS1) 6px var(--spacingL2);
2280
+ min-height: 36px;
2281
+ color: var(--bodyText);
2282
+ cursor: pointer;
2283
+ user-select: none;
2284
+ box-sizing: border-box;
2285
+ }
2286
+
2287
+ .flm-groupedlist-item:hover {
2288
+ background-color: var(--listItemBackgroundHovered);
2289
+ }
2290
+
2291
+ .flm-groupedlist-item--selected {
2292
+ background-color: var(--listItemBackgroundChecked);
2293
+ }
2294
+
2295
+ .flm-groupedlist-item--disabled {
2296
+ color: var(--disabledText);
2297
+ cursor: default;
2298
+ pointer-events: none;
2299
+ }
2300
+
2301
+ /* Group count badge */
2302
+ .flm-groupedlist-count {
2303
+ font-size: var(--fontSizeSmall);
2304
+ color: var(--bodySubtext);
2305
+ font-weight: var(--fontWeightRegular);
2306
+ margin-left: var(--spacingS2);
2307
+ }
2308
+
2309
+ /* HoverCard — Two-phase hover detail card */
2310
+
2311
+ .flm-hovercard {
2312
+ position: absolute;
2313
+ z-index: 1000;
2314
+ background-color: var(--bodyBackground);
2315
+ border: 1px solid var(--variantBorder);
2316
+ border-radius: var(--roundedCorner2);
2317
+ box-shadow: var(--elevation16);
2318
+ min-width: 260px;
2319
+ max-width: 364px;
2320
+ opacity: 0;
2321
+ pointer-events: none;
2322
+ transform: translateY(4px);
2323
+ transition: opacity var(--duration1) var(--easeStandard),
2324
+ transform var(--duration1) var(--easeDecelerate);
2325
+ font-family: var(--fontFamily);
2326
+ }
2327
+
2328
+ .flm-hovercard--visible {
2329
+ opacity: 1;
2330
+ pointer-events: auto;
2331
+ transform: translateY(0);
2332
+ }
2333
+
2334
+ /* Compact section (shows first on hover) */
2335
+ .flm-hovercard-compact {
2336
+ padding: var(--spacingM);
2337
+ }
2338
+
2339
+ /* Expanded section (shows after delay) */
2340
+ .flm-hovercard-expanded {
2341
+ display: none;
2342
+ padding: 0 var(--spacingM) var(--spacingM);
2343
+ border-top: 1px solid var(--variantBorder);
2344
+ }
2345
+
2346
+ .flm-hovercard-expanded--visible {
2347
+ display: block;
2348
+ }
2349
+
2350
+ /* Content sections */
2351
+ .flm-hovercard-title {
2352
+ font-size: var(--fontSizeMediumPlus);
2353
+ font-weight: var(--fontWeightSemibold);
2354
+ line-height: var(--lineHeightMediumPlus);
2355
+ color: var(--bodyText);
2356
+ margin-bottom: var(--spacingS2);
2357
+ }
2358
+
2359
+ .flm-hovercard-subtitle {
2360
+ font-size: var(--fontSizeSmall);
2361
+ line-height: var(--lineHeightSmall);
2362
+ color: var(--bodySubtext);
2363
+ }
2364
+
2365
+ .flm-hovercard-body {
2366
+ font-size: var(--fontSizeMedium);
2367
+ line-height: var(--lineHeightMedium);
2368
+ color: var(--bodyText);
2369
+ padding-top: var(--spacingS1);
2370
+ }
2371
+
2372
+ /* Icon */
2373
+
2374
+ .flm-icon {
2375
+ display: inline-flex;
2376
+ align-items: center;
2377
+ justify-content: center;
2378
+ width: 16px;
2379
+ height: 16px;
2380
+ font-size: 16px;
2381
+ line-height: 1;
2382
+ color: inherit;
2383
+ vertical-align: middle;
2384
+ flex-shrink: 0;
2385
+ }
2386
+
2387
+ .flm-icon > svg {
2388
+ width: 100%;
2389
+ height: 100%;
2390
+ fill: currentColor;
2391
+ }
2392
+
2393
+ .flm-icon--small {
2394
+ width: 12px;
2395
+ height: 12px;
2396
+ font-size: 12px;
2397
+ }
2398
+
2399
+ .flm-icon--large {
2400
+ width: 20px;
2401
+ height: 20px;
2402
+ font-size: 20px;
2403
+ }
2404
+
2405
+ /* Image */
2406
+
2407
+ .flm-image {
2408
+ display: block;
2409
+ max-width: 100%;
2410
+ border: 0;
2411
+ }
2412
+
2413
+ /* Fit variants */
2414
+ .flm-image--cover {
2415
+ object-fit: cover;
2416
+ width: 100%;
2417
+ height: 100%;
2418
+ }
2419
+
2420
+ .flm-image--contain {
2421
+ object-fit: contain;
2422
+ width: 100%;
2423
+ height: 100%;
2424
+ }
2425
+
2426
+ .flm-image--center {
2427
+ object-fit: none;
2428
+ object-position: center;
2429
+ }
2430
+
2431
+ .flm-image--none {
2432
+ object-fit: none;
2433
+ }
2434
+
2435
+ /* Border */
2436
+ .flm-image--border {
2437
+ border: 1px solid var(--variantBorder);
2438
+ border-radius: var(--roundedCorner2);
2439
+ }
2440
+
2441
+ /* Round (for avatars / thumbnails) */
2442
+ .flm-image--round {
2443
+ border-radius: 50%;
2444
+ }
2445
+
2446
+ /* Maximize frame — stretch to fill parent */
2447
+ .flm-image--maximize {
2448
+ width: 100%;
2449
+ height: 100%;
2450
+ }
2451
+
2452
+ /* Label */
2453
+
2454
+ .flm-label {
2455
+ display: inline-block;
2456
+ font-family: var(--fontFamily);
2457
+ font-size: var(--fontSizeMedium);
2458
+ line-height: var(--lineHeightMedium);
2459
+ font-weight: var(--fontWeightSemibold);
2460
+ color: var(--bodyText);
2461
+ padding: 5px 0;
2462
+ }
2463
+
2464
+ .flm-label--required::after {
2465
+ content: ' *';
2466
+ color: var(--errorText);
2467
+ padding-left: 2px;
2468
+ }
2469
+
2470
+ .flm-label--disabled {
2471
+ color: var(--disabledText);
2472
+ }
2473
+
2474
+ /* Link */
2475
+
2476
+ .flm-link {
2477
+ font-family: var(--fontFamily);
2478
+ font-size: var(--fontSizeMedium);
2479
+ color: var(--link);
2480
+ text-decoration: none;
2481
+ cursor: pointer;
2482
+ }
2483
+
2484
+ .flm-link:hover {
2485
+ color: var(--linkHovered);
2486
+ text-decoration: underline;
2487
+ }
2488
+
2489
+ .flm-link:active {
2490
+ color: var(--linkHovered);
2491
+ }
2492
+
2493
+ .flm-link--disabled,
2494
+ .flm-link--disabled:hover {
2495
+ color: var(--disabledText);
2496
+ text-decoration: none;
2497
+ cursor: default;
2498
+ pointer-events: none;
2499
+ }
2500
+
2501
+ /* List — Simple scrollable list */
2502
+
2503
+ .flm-list {
2504
+ display: flex;
2505
+ flex-direction: column;
2506
+ font-family: var(--fontFamily);
2507
+ font-size: var(--fontSizeMedium);
2508
+ line-height: var(--lineHeightMedium);
2509
+ color: var(--bodyText);
2510
+ }
2511
+
2512
+ /* Bordered variant */
2513
+ .flm-list--bordered {
2514
+ border: 1px solid var(--variantBorder);
2515
+ border-radius: var(--roundedCorner2);
2516
+ }
2517
+
2518
+ /* Scrollable variant */
2519
+ .flm-list--scrollable {
2520
+ overflow-y: auto;
2521
+ max-height: 300px;
2522
+ }
2523
+
2524
+ /* Compact variant */
2525
+ .flm-list--compact .flm-list-item {
2526
+ min-height: 28px;
2527
+ padding: 2px var(--spacingS1);
2528
+ font-size: var(--fontSizeSmall);
2529
+ }
2530
+
2531
+ /* List items */
2532
+ .flm-list-item {
2533
+ display: flex;
2534
+ align-items: center;
2535
+ gap: var(--spacingS1);
2536
+ min-height: 36px;
2537
+ padding: 4px var(--spacingS1);
2538
+ cursor: pointer;
2539
+ user-select: none;
2540
+ box-sizing: border-box;
2541
+ border-bottom: 1px solid transparent;
2542
+ }
2543
+
2544
+ .flm-list--bordered .flm-list-item {
2545
+ border-bottom-color: var(--variantBorder);
2546
+ }
2547
+
2548
+ .flm-list--bordered .flm-list-item:last-child {
2549
+ border-bottom-color: transparent;
2550
+ }
2551
+
2552
+ /* Hover */
2553
+ .flm-list-item:hover {
2554
+ background-color: var(--listItemBackgroundHovered);
2555
+ }
2556
+
2557
+ /* Selected */
2558
+ .flm-list-item--selected {
2559
+ background-color: var(--listItemBackgroundChecked);
2560
+ }
2561
+
2562
+ .flm-list-item--selected:hover {
2563
+ background-color: var(--listItemBackgroundCheckedHovered);
2564
+ }
2565
+
2566
+ /* Disabled */
2567
+ .flm-list-item--disabled {
2568
+ color: var(--disabledText);
2569
+ cursor: default;
2570
+ pointer-events: none;
2571
+ }
2572
+
2573
+ /* Icon slot */
2574
+ .flm-list-item-icon {
2575
+ display: inline-flex;
2576
+ align-items: center;
2577
+ justify-content: center;
2578
+ width: 16px;
2579
+ height: 16px;
2580
+ flex-shrink: 0;
2581
+ color: var(--bodySubtext);
2582
+ }
2583
+
2584
+ /* Text content */
2585
+ .flm-list-item-content {
2586
+ display: flex;
2587
+ flex-direction: column;
2588
+ min-width: 0;
2589
+ flex: 1;
2590
+ }
2591
+
2592
+ .flm-list-item-primary {
2593
+ font-size: var(--fontSizeMedium);
2594
+ line-height: var(--lineHeightMedium);
2595
+ color: var(--bodyText);
2596
+ white-space: nowrap;
2597
+ overflow: hidden;
2598
+ text-overflow: ellipsis;
2599
+ }
2600
+
2601
+ .flm-list-item-secondary {
2602
+ font-size: var(--fontSizeSmall);
2603
+ line-height: var(--lineHeightSmall);
2604
+ color: var(--bodySubtext);
2605
+ white-space: nowrap;
2606
+ overflow: hidden;
2607
+ text-overflow: ellipsis;
2608
+ }
2609
+
2610
+ /* MessageBar */
2611
+
2612
+ .flm-messagebar {
2613
+ display: flex;
2614
+ align-items: center;
2615
+ gap: var(--spacingS1);
2616
+ padding: var(--spacingS1) var(--spacingM);
2617
+ font-family: var(--fontFamily);
2618
+ font-size: var(--fontSizeMedium);
2619
+ line-height: var(--lineHeightMedium);
2620
+ color: var(--messageText);
2621
+ border-radius: var(--roundedCorner2);
2622
+ min-height: 32px;
2623
+ box-sizing: border-box;
2624
+ }
2625
+
2626
+ /* Icon slot */
2627
+ .flm-messagebar-icon {
2628
+ display: inline-flex;
2629
+ align-items: center;
2630
+ justify-content: center;
2631
+ flex-shrink: 0;
2632
+ width: 16px;
2633
+ height: 16px;
2634
+ }
2635
+
2636
+ .flm-messagebar-icon > svg {
2637
+ width: 100%;
2638
+ height: 100%;
2639
+ fill: currentColor;
2640
+ }
2641
+
2642
+ /* Text fills remaining space */
2643
+ .flm-messagebar-text {
2644
+ flex: 1;
2645
+ }
2646
+
2647
+ /* Actions area */
2648
+ .flm-messagebar-actions {
2649
+ display: flex;
2650
+ align-items: center;
2651
+ gap: var(--spacingS2);
2652
+ margin-left: auto;
2653
+ flex-shrink: 0;
2654
+ }
2655
+
2656
+ /* Dismiss button */
2657
+ .flm-messagebar-dismiss {
2658
+ display: inline-flex;
2659
+ align-items: center;
2660
+ justify-content: center;
2661
+ width: 24px;
2662
+ height: 24px;
2663
+ padding: 0;
2664
+ border: none;
2665
+ border-radius: var(--roundedCorner2);
2666
+ background: transparent;
2667
+ color: inherit;
2668
+ cursor: pointer;
2669
+ flex-shrink: 0;
2670
+ }
2671
+
2672
+ .flm-messagebar-dismiss:hover {
2673
+ background-color: rgba(0, 0, 0, 0.05);
2674
+ }
2675
+
2676
+ /* Type variants */
2677
+ .flm-messagebar--info {
2678
+ background-color: var(--infoBackground);
2679
+ }
2680
+
2681
+ .flm-messagebar--info .flm-messagebar-icon {
2682
+ color: var(--infoIcon);
2683
+ }
2684
+
2685
+ .flm-messagebar--success {
2686
+ background-color: var(--successBackground);
2687
+ }
2688
+
2689
+ .flm-messagebar--success .flm-messagebar-icon {
2690
+ color: var(--successIcon);
2691
+ }
2692
+
2693
+ .flm-messagebar--warning {
2694
+ background-color: var(--warningBackground);
2695
+ }
2696
+
2697
+ .flm-messagebar--warning .flm-messagebar-icon {
2698
+ color: var(--warningIcon);
2699
+ }
2700
+
2701
+ .flm-messagebar--severeWarning {
2702
+ background-color: var(--severeWarningBackground);
2703
+ }
2704
+
2705
+ .flm-messagebar--severeWarning .flm-messagebar-icon {
2706
+ color: var(--severeWarningIcon);
2707
+ }
2708
+
2709
+ .flm-messagebar--error {
2710
+ background-color: var(--errorBackground);
2711
+ }
2712
+
2713
+ .flm-messagebar--error .flm-messagebar-icon {
2714
+ color: var(--errorIcon);
2715
+ }
2716
+
2717
+ .flm-messagebar--blocked {
2718
+ background-color: var(--blockingBackground);
2719
+ }
2720
+
2721
+ .flm-messagebar--blocked .flm-messagebar-icon {
2722
+ color: var(--blockingIcon);
2723
+ }
2724
+
2725
+ /* Modal — generic modal container (uses overlay) */
2726
+
2727
+ .flm-modal-overlay {
2728
+ position: fixed;
2729
+ inset: 0;
2730
+ background-color: var(--overlayBackground);
2731
+ z-index: 1000;
2732
+ display: flex;
2733
+ align-items: center;
2734
+ justify-content: center;
2735
+ opacity: 0;
2736
+ pointer-events: none;
2737
+ transition: opacity var(--duration2) var(--easeStandard);
2738
+ }
2739
+
2740
+ .flm-modal-overlay--open {
2741
+ opacity: 1;
2742
+ pointer-events: auto;
2743
+ }
2744
+
2745
+ .flm-modal {
2746
+ background-color: var(--bodyBackground);
2747
+ border-radius: var(--roundedCorner4);
2748
+ box-shadow: var(--elevation64);
2749
+ max-height: 90vh;
2750
+ overflow-y: auto;
2751
+ transform: translateY(16px);
2752
+ transition: transform var(--duration2) var(--easeDecelerate);
2753
+ }
2754
+
2755
+ .flm-modal-overlay--open .flm-modal {
2756
+ transform: translateY(0);
2757
+ }
2758
+
2759
+ /* Nav — hierarchical navigation */
2760
+
2761
+ .flm-nav {
2762
+ font-family: var(--fontFamily);
2763
+ font-size: var(--fontSizeMedium);
2764
+ width: 100%;
2765
+ }
2766
+
2767
+ .flm-nav-group {
2768
+ margin-bottom: var(--spacingS2);
2769
+ }
2770
+
2771
+ .flm-nav-group-header {
2772
+ display: flex;
2773
+ align-items: center;
2774
+ gap: var(--spacingS2);
2775
+ padding: var(--spacingS2) var(--spacingS1);
2776
+ font-size: var(--fontSizeSmall);
2777
+ font-weight: var(--fontWeightSemibold);
2778
+ color: var(--bodySubtext);
2779
+ text-transform: uppercase;
2780
+ letter-spacing: 0.5px;
2781
+ cursor: pointer;
2782
+ user-select: none;
2783
+ border: none;
2784
+ background: transparent;
2785
+ width: 100%;
2786
+ text-align: left;
2787
+ }
2788
+
2789
+ .flm-nav-group-header:hover {
2790
+ color: var(--bodyText);
2791
+ }
2792
+
2793
+ .flm-nav-link {
2794
+ display: flex;
2795
+ align-items: center;
2796
+ gap: var(--spacingS1);
2797
+ padding: 6px var(--spacingS1) 6px var(--spacingM);
2798
+ color: var(--bodyText);
2799
+ text-decoration: none;
2800
+ border-radius: var(--roundedCorner2);
2801
+ cursor: pointer;
2802
+ border-left: 3px solid transparent;
2803
+ font-size: var(--fontSizeMedium);
2804
+ line-height: var(--lineHeightMedium);
2805
+ }
2806
+
2807
+ .flm-nav-link:hover {
2808
+ background-color: var(--listItemBackgroundHovered);
2809
+ text-decoration: none;
2810
+ }
2811
+
2812
+ .flm-nav-link--active {
2813
+ border-left-color: var(--themePrimary);
2814
+ background-color: var(--listItemBackgroundChecked);
2815
+ font-weight: var(--fontWeightSemibold);
2816
+ color: var(--themePrimary);
2817
+ }
2818
+
2819
+ .flm-nav-link--disabled {
2820
+ color: var(--disabledText);
2821
+ cursor: default;
2822
+ pointer-events: none;
2823
+ }
2824
+
2825
+ /* Nested links (indented) */
2826
+ .flm-nav-link--nested {
2827
+ padding-left: var(--spacingL2);
2828
+ }
2829
+
2830
+ /* Chevron for expandable groups */
2831
+ .flm-nav-chevron {
2832
+ display: inline-flex;
2833
+ width: 16px;
2834
+ height: 16px;
2835
+ transition: transform var(--duration1) var(--easeStandard);
2836
+ flex-shrink: 0;
2837
+ }
2838
+
2839
+ .flm-nav-chevron--expanded {
2840
+ transform: rotate(90deg);
2841
+ }
2842
+
2843
+ /* Collapsible group content */
2844
+ .flm-nav-group-items {
2845
+ overflow: hidden;
2846
+ }
2847
+
2848
+ .flm-nav-group-items--collapsed {
2849
+ display: none;
2850
+ }
2851
+
2852
+ /* OverflowSet — responsive container that hides items into overflow menu */
2853
+
2854
+ .flm-overflowset {
2855
+ display: flex;
2856
+ align-items: center;
2857
+ overflow: hidden;
2858
+ position: relative;
2859
+ font-family: var(--fontFamily);
2860
+ }
2861
+
2862
+ .flm-overflowset-items {
2863
+ display: flex;
2864
+ align-items: center;
2865
+ gap: var(--spacingS2);
2866
+ overflow: hidden;
2867
+ flex: 1;
2868
+ min-width: 0;
2869
+ }
2870
+
2871
+ .flm-overflowset-item {
2872
+ flex-shrink: 0;
2873
+ }
2874
+
2875
+ .flm-overflowset-item--hidden {
2876
+ display: none;
2877
+ }
2878
+
2879
+ /* Overflow "..." button */
2880
+ .flm-overflowset-overflow {
2881
+ display: none;
2882
+ align-items: center;
2883
+ justify-content: center;
2884
+ width: 32px;
2885
+ height: 32px;
2886
+ border: none;
2887
+ background: transparent;
2888
+ color: var(--bodySubtext);
2889
+ cursor: pointer;
2890
+ padding: 0;
2891
+ border-radius: var(--roundedCorner2);
2892
+ flex-shrink: 0;
2893
+ font-size: var(--fontSizeMedium);
2894
+ }
2895
+
2896
+ .flm-overflowset-overflow:hover {
2897
+ background-color: var(--listItemBackgroundHovered);
2898
+ color: var(--bodyText);
2899
+ }
2900
+
2901
+ .flm-overflowset--has-overflow .flm-overflowset-overflow {
2902
+ display: flex;
2903
+ }
2904
+
2905
+ /* Far-side items — never overflow */
2906
+ .flm-overflowset-far {
2907
+ display: flex;
2908
+ align-items: center;
2909
+ gap: var(--spacingS2);
2910
+ margin-left: auto;
2911
+ flex-shrink: 0;
2912
+ }
2913
+
2914
+ /* Overlay — semi-transparent backdrop for modals/panels/dialogs */
2915
+
2916
+ .flm-overlay {
2917
+ position: fixed;
2918
+ inset: 0;
2919
+ background-color: var(--overlayBackground);
2920
+ z-index: 1000;
2921
+ opacity: 0;
2922
+ pointer-events: none;
2923
+ transition: opacity var(--duration2) var(--easeStandard);
2924
+ }
2925
+
2926
+ .flm-overlay--visible {
2927
+ opacity: 1;
2928
+ pointer-events: auto;
2929
+ }
2930
+
2931
+ /* Panel — slide-out surface from the right */
2932
+
2933
+ .flm-panel-overlay {
2934
+ position: fixed;
2935
+ inset: 0;
2936
+ background-color: var(--overlayBackground);
2937
+ z-index: 1000;
2938
+ opacity: 0;
2939
+ pointer-events: none;
2940
+ transition: opacity var(--duration3) var(--easeStandard);
2941
+ }
2942
+
2943
+ .flm-panel-overlay--open {
2944
+ opacity: 1;
2945
+ pointer-events: auto;
2946
+ }
2947
+
2948
+ .flm-panel {
2949
+ position: fixed;
2950
+ top: 0;
2951
+ right: 0;
2952
+ bottom: 0;
2953
+ width: 340px;
2954
+ max-width: 100vw;
2955
+ background-color: var(--bodyBackground);
2956
+ box-shadow: var(--elevation64);
2957
+ z-index: 1001;
2958
+ display: flex;
2959
+ flex-direction: column;
2960
+ transform: translateX(100%);
2961
+ transition: transform var(--duration3) var(--easeDecelerate);
2962
+ }
2963
+
2964
+ .flm-panel--open {
2965
+ transform: translateX(0);
2966
+ }
2967
+
2968
+ /* Size variants */
2969
+ .flm-panel--small { width: 272px; }
2970
+ .flm-panel--medium { width: 592px; }
2971
+ .flm-panel--large { width: 940px; }
2972
+ .flm-panel--extraLarge { width: 100%; max-width: 1200px; }
2973
+ .flm-panel--fluid { width: 100%; }
2974
+
2975
+ /* Left side variant */
2976
+ .flm-panel--left {
2977
+ right: auto;
2978
+ left: 0;
2979
+ transform: translateX(-100%);
2980
+ }
2981
+
2982
+ .flm-panel--left.flm-panel--open {
2983
+ transform: translateX(0);
2984
+ }
2985
+
2986
+ .flm-panel-header {
2987
+ display: flex;
2988
+ align-items: center;
2989
+ justify-content: space-between;
2990
+ padding: var(--spacingM) var(--spacingL1);
2991
+ flex-shrink: 0;
2992
+ }
2993
+
2994
+ .flm-panel-title {
2995
+ font-size: var(--fontSizeXLarge);
2996
+ font-weight: var(--fontWeightSemibold);
2997
+ line-height: var(--lineHeightXLarge);
2998
+ color: var(--bodyText);
2999
+ margin: 0;
3000
+ }
3001
+
3002
+ .flm-panel-close {
3003
+ display: inline-flex;
3004
+ align-items: center;
3005
+ justify-content: center;
3006
+ width: 32px;
3007
+ height: 32px;
3008
+ border: none;
3009
+ border-radius: var(--roundedCorner2);
3010
+ background: transparent;
3011
+ color: var(--bodySubtext);
3012
+ cursor: pointer;
3013
+ flex-shrink: 0;
3014
+ }
3015
+
3016
+ .flm-panel-close:hover {
3017
+ background-color: var(--buttonBackgroundHovered);
3018
+ color: var(--bodyText);
3019
+ }
3020
+
3021
+ .flm-panel-body {
3022
+ padding: 0 var(--spacingL1);
3023
+ overflow-y: auto;
3024
+ flex: 1;
3025
+ }
3026
+
3027
+ .flm-panel-footer {
3028
+ display: flex;
3029
+ align-items: center;
3030
+ justify-content: flex-end;
3031
+ gap: var(--spacingS1);
3032
+ padding: var(--spacingM) var(--spacingL1);
3033
+ border-top: 1px solid var(--bodyDivider);
3034
+ flex-shrink: 0;
3035
+ }
3036
+
3037
+ /* Persona — avatar + text */
3038
+
3039
+ .flm-persona {
3040
+ display: inline-flex;
3041
+ align-items: center;
3042
+ gap: var(--spacingS1);
3043
+ font-family: var(--fontFamily);
3044
+ }
3045
+
3046
+ /* Coin / avatar */
3047
+ .flm-persona-coin {
3048
+ display: inline-flex;
3049
+ align-items: center;
3050
+ justify-content: center;
3051
+ border-radius: 50%;
3052
+ background-color: var(--themePrimary);
3053
+ color: var(--white);
3054
+ font-weight: var(--fontWeightSemibold);
3055
+ flex-shrink: 0;
3056
+ user-select: none;
3057
+ }
3058
+
3059
+ .flm-persona-coin img {
3060
+ width: 100%;
3061
+ height: 100%;
3062
+ object-fit: cover;
3063
+ border-radius: 50%;
3064
+ }
3065
+
3066
+ /* Sizes */
3067
+ .flm-persona--size8 .flm-persona-coin { width: 8px; height: 8px; font-size: 0; }
3068
+ .flm-persona--size24 .flm-persona-coin,
3069
+ .flm-persona-coin { width: 24px; height: 24px; font-size: 10px; }
3070
+ .flm-persona--size32 .flm-persona-coin { width: 32px; height: 32px; font-size: 12px; }
3071
+ .flm-persona--size40 .flm-persona-coin { width: 40px; height: 40px; font-size: 14px; }
3072
+ .flm-persona--size48 .flm-persona-coin { width: 48px; height: 48px; font-size: 16px; }
3073
+ .flm-persona--size56 .flm-persona-coin { width: 56px; height: 56px; font-size: 18px; }
3074
+ .flm-persona--size72 .flm-persona-coin { width: 72px; height: 72px; font-size: 22px; }
3075
+ .flm-persona--size100 .flm-persona-coin { width: 100px; height: 100px; font-size: 28px; }
3076
+ .flm-persona--size120 .flm-persona-coin { width: 120px; height: 120px; font-size: 32px; }
3077
+
3078
+ /* Presence indicator */
3079
+ .flm-persona-presence {
3080
+ position: relative;
3081
+ }
3082
+
3083
+ .flm-persona-presence::after {
3084
+ content: '';
3085
+ position: absolute;
3086
+ bottom: 0;
3087
+ right: 0;
3088
+ width: 8px;
3089
+ height: 8px;
3090
+ border-radius: 50%;
3091
+ border: 2px solid var(--bodyBackground);
3092
+ box-sizing: content-box;
3093
+ }
3094
+
3095
+ .flm-persona-presence--available::after { background-color: var(--green); }
3096
+ .flm-persona-presence--away::after { background-color: var(--yellow); }
3097
+ .flm-persona-presence--busy::after { background-color: var(--red); }
3098
+ .flm-persona-presence--dnd::after { background-color: var(--red); }
3099
+ .flm-persona-presence--offline::after { background-color: var(--neutralTertiary); }
3100
+ .flm-persona-presence--blocked::after { background-color: var(--red); }
3101
+
3102
+ /* Text details */
3103
+ .flm-persona-details {
3104
+ display: flex;
3105
+ flex-direction: column;
3106
+ min-width: 0;
3107
+ }
3108
+
3109
+ .flm-persona-name {
3110
+ font-size: var(--fontSizeMedium);
3111
+ font-weight: var(--fontWeightSemibold);
3112
+ line-height: var(--lineHeightMedium);
3113
+ color: var(--bodyText);
3114
+ white-space: nowrap;
3115
+ overflow: hidden;
3116
+ text-overflow: ellipsis;
3117
+ }
3118
+
3119
+ .flm-persona-secondary {
3120
+ font-size: var(--fontSizeSmall);
3121
+ line-height: var(--lineHeightSmall);
3122
+ color: var(--bodySubtext);
3123
+ white-space: nowrap;
3124
+ overflow: hidden;
3125
+ text-overflow: ellipsis;
3126
+ }
3127
+
3128
+ .flm-persona-tertiary {
3129
+ font-size: var(--fontSizeSmall);
3130
+ line-height: var(--lineHeightSmall);
3131
+ color: var(--bodySubtext);
3132
+ white-space: nowrap;
3133
+ overflow: hidden;
3134
+ text-overflow: ellipsis;
3135
+ }
3136
+
3137
+ /* Pivot — tab navigation */
3138
+
3139
+ .flm-pivot {
3140
+ display: flex;
3141
+ flex-direction: column;
3142
+ font-family: var(--fontFamily);
3143
+ }
3144
+
3145
+ .flm-pivot-tabs {
3146
+ display: flex;
3147
+ border-bottom: 1px solid var(--bodyDivider);
3148
+ overflow-x: auto;
3149
+ overflow-y: hidden;
3150
+ scrollbar-width: none; /* Firefox */
3151
+ -ms-overflow-style: none; /* IE/Edge */
3152
+ flex-shrink: 0;
3153
+ }
3154
+
3155
+ .flm-pivot-tabs::-webkit-scrollbar { display: none; }
3156
+
3157
+ .flm-pivot-tab {
3158
+ display: inline-flex;
3159
+ align-items: center;
3160
+ gap: var(--spacingS2);
3161
+ padding: var(--spacingS1) var(--spacingS1);
3162
+ border: none;
3163
+ border-bottom: 2px solid transparent;
3164
+ background: transparent;
3165
+ color: var(--bodyText);
3166
+ font-family: var(--fontFamily);
3167
+ font-size: var(--fontSizeMedium);
3168
+ font-weight: var(--fontWeightRegular);
3169
+ line-height: var(--lineHeightMedium);
3170
+ cursor: pointer;
3171
+ white-space: nowrap;
3172
+ margin-bottom: -1px;
3173
+ transition: color var(--duration1) var(--easeStandard),
3174
+ border-color var(--duration1) var(--easeStandard);
3175
+ }
3176
+
3177
+ .flm-pivot-tab:hover {
3178
+ color: var(--bodyText);
3179
+ background-color: var(--buttonBackgroundHovered);
3180
+ }
3181
+
3182
+ .flm-pivot-tab--active {
3183
+ color: var(--themePrimary);
3184
+ font-weight: var(--fontWeightSemibold);
3185
+ border-bottom-color: var(--themePrimary);
3186
+ }
3187
+
3188
+ .flm-pivot-tab--disabled {
3189
+ color: var(--disabledText);
3190
+ cursor: default;
3191
+ pointer-events: none;
3192
+ }
3193
+
3194
+ /* Pivot content panels */
3195
+ .flm-pivot-panel {
3196
+ display: none;
3197
+ padding: var(--spacingM) 0;
3198
+ }
3199
+
3200
+ .flm-pivot-panel--active {
3201
+ display: block;
3202
+ }
3203
+
3204
+ /* Link-style variant (underline) */
3205
+ .flm-pivot--links .flm-pivot-tab {
3206
+ padding: var(--spacingS1) var(--spacingM);
3207
+ }
3208
+
3209
+ /* Tab-style variant (filled tabs) */
3210
+ .flm-pivot--tabs .flm-pivot-tab {
3211
+ border-bottom: none;
3212
+ border-radius: var(--roundedCorner2) var(--roundedCorner2) 0 0;
3213
+ }
3214
+
3215
+ .flm-pivot--tabs .flm-pivot-tab--active {
3216
+ background-color: var(--bodyBackground);
3217
+ border: 1px solid var(--bodyDivider);
3218
+ border-bottom-color: var(--bodyBackground);
3219
+ }
3220
+
3221
+ /* ProgressIndicator */
3222
+
3223
+ .flm-progress {
3224
+ display: flex;
3225
+ flex-direction: column;
3226
+ gap: var(--spacingS2);
3227
+ font-family: var(--fontFamily);
3228
+ width: 100%;
3229
+ }
3230
+
3231
+ .flm-progress-label {
3232
+ font-size: var(--fontSizeMedium);
3233
+ font-weight: var(--fontWeightSemibold);
3234
+ color: var(--bodyText);
3235
+ }
3236
+
3237
+ .flm-progress-description {
3238
+ font-size: var(--fontSizeSmall);
3239
+ color: var(--bodySubtext);
3240
+ }
3241
+
3242
+ .flm-progress-track {
3243
+ width: 100%;
3244
+ height: 2px;
3245
+ background-color: var(--disabledBackground);
3246
+ border-radius: 1px;
3247
+ overflow: hidden;
3248
+ }
3249
+
3250
+ .flm-progress-bar {
3251
+ height: 100%;
3252
+ background-color: var(--themePrimary);
3253
+ border-radius: 1px;
3254
+ transition: width var(--duration3) var(--easeStandard);
3255
+ }
3256
+
3257
+ /* Indeterminate animation */
3258
+ .flm-progress--indeterminate .flm-progress-bar {
3259
+ width: 33%;
3260
+ animation: flm-progress-indeterminate 2s var(--easeStandard) infinite;
3261
+ }
3262
+
3263
+ @keyframes flm-progress-indeterminate {
3264
+ 0% { transform: translateX(-100%); }
3265
+ 100% { transform: translateX(400%); }
3266
+ }
3267
+
3268
+ /* Rating — Star rating control */
3269
+
3270
+ .flm-rating {
3271
+ display: inline-flex;
3272
+ flex-direction: row-reverse;
3273
+ align-items: center;
3274
+ gap: 2px;
3275
+ font-family: var(--fontFamily);
3276
+ }
3277
+
3278
+ /* Hide native radio */
3279
+ .flm-rating-input {
3280
+ position: absolute;
3281
+ opacity: 0;
3282
+ width: 0;
3283
+ height: 0;
3284
+ margin: 0;
3285
+ padding: 0;
3286
+ }
3287
+
3288
+ /* Star label */
3289
+ .flm-rating-star {
3290
+ display: inline-flex;
3291
+ align-items: center;
3292
+ justify-content: center;
3293
+ width: 24px;
3294
+ height: 24px;
3295
+ cursor: pointer;
3296
+ color: var(--neutralTertiary);
3297
+ transition: color var(--duration1) var(--easeStandard);
3298
+ }
3299
+
3300
+ /* Star shape via clip-path */
3301
+ .flm-rating-star::before {
3302
+ content: '';
3303
+ display: block;
3304
+ width: 18px;
3305
+ height: 18px;
3306
+ background-color: currentColor;
3307
+ clip-path: polygon(
3308
+ 50% 0%,
3309
+ 63% 35%,
3310
+ 100% 35%,
3311
+ 69% 57%,
3312
+ 79% 91%,
3313
+ 50% 70%,
3314
+ 21% 91%,
3315
+ 31% 57%,
3316
+ 0% 35%,
3317
+ 37% 35%
3318
+ );
3319
+ }
3320
+
3321
+ /* Hover: current star and all lower via sibling combinator */
3322
+ .flm-rating-star:hover,
3323
+ .flm-rating-star:hover ~ .flm-rating-star {
3324
+ color: var(--themePrimary);
3325
+ }
3326
+
3327
+ /* Checked: fill current and all lower stars (row-reverse makes ~ go to lower values) */
3328
+ .flm-rating-input:checked + .flm-rating-star,
3329
+ .flm-rating-input:checked + .flm-rating-star ~ .flm-rating-star {
3330
+ color: var(--themePrimary);
3331
+ }
3332
+
3333
+ /* Focus */
3334
+ .flm-rating-input:focus-visible + .flm-rating-star {
3335
+ outline: var(--focusOutlineWidth) solid var(--focusBorder);
3336
+ outline-offset: var(--focusOutlineOffset);
3337
+ border-radius: var(--roundedCorner2);
3338
+ }
3339
+
3340
+ /* Readonly variant */
3341
+ .flm-rating--readonly .flm-rating-star {
3342
+ cursor: default;
3343
+ pointer-events: none;
3344
+ }
3345
+
3346
+ .flm-rating--readonly .flm-rating-star--empty {
3347
+ color: var(--neutralTertiary);
3348
+ }
3349
+
3350
+ .flm-rating--readonly .flm-rating-star--filled {
3351
+ color: var(--themePrimary);
3352
+ }
3353
+
3354
+ /* Disabled */
3355
+ .flm-rating--disabled .flm-rating-star {
3356
+ cursor: default;
3357
+ pointer-events: none;
3358
+ color: var(--disabledText);
3359
+ }
3360
+
3361
+ .flm-rating--disabled .flm-rating-input:checked + .flm-rating-star,
3362
+ .flm-rating--disabled .flm-rating-input:checked + .flm-rating-star ~ .flm-rating-star {
3363
+ color: var(--disabledText);
3364
+ }
3365
+
3366
+ /* Large variant */
3367
+ .flm-rating--large .flm-rating-star {
3368
+ width: 32px;
3369
+ height: 32px;
3370
+ }
3371
+
3372
+ .flm-rating--large .flm-rating-star::before {
3373
+ width: 24px;
3374
+ height: 24px;
3375
+ }
3376
+
3377
+ /* SearchBox */
3378
+
3379
+ .flm-searchbox {
3380
+ display: flex;
3381
+ align-items: center;
3382
+ height: 32px;
3383
+ border: 1px solid var(--inputBorder);
3384
+ border-radius: var(--roundedCorner2);
3385
+ background-color: var(--inputBackground);
3386
+ padding: 0 var(--spacingS1);
3387
+ gap: var(--spacingS2);
3388
+ box-sizing: border-box;
3389
+ }
3390
+
3391
+ .flm-searchbox:hover {
3392
+ border-color: var(--inputBorderHovered);
3393
+ }
3394
+
3395
+ .flm-searchbox:focus-within {
3396
+ border-color: var(--inputFocusBorderAlt);
3397
+ border-bottom-width: 2px;
3398
+ }
3399
+
3400
+ .flm-searchbox-icon {
3401
+ display: inline-flex;
3402
+ align-items: center;
3403
+ justify-content: center;
3404
+ color: var(--inputIcon);
3405
+ flex-shrink: 0;
3406
+ width: 16px;
3407
+ height: 16px;
3408
+ }
3409
+
3410
+ .flm-searchbox-icon > svg {
3411
+ width: 100%;
3412
+ height: 100%;
3413
+ fill: currentColor;
3414
+ }
3415
+
3416
+ .flm-searchbox-input {
3417
+ flex: 1;
3418
+ border: none;
3419
+ background: transparent;
3420
+ color: var(--inputText);
3421
+ font-family: var(--fontFamily);
3422
+ font-size: var(--fontSizeMedium);
3423
+ outline: none;
3424
+ min-width: 0;
3425
+ padding: 0;
3426
+ }
3427
+
3428
+ .flm-searchbox-input::placeholder {
3429
+ color: var(--inputPlaceholderText);
3430
+ }
3431
+
3432
+ .flm-searchbox-clear {
3433
+ display: none;
3434
+ align-items: center;
3435
+ justify-content: center;
3436
+ width: 24px;
3437
+ height: 24px;
3438
+ border: none;
3439
+ border-radius: var(--roundedCorner2);
3440
+ background: transparent;
3441
+ color: var(--bodySubtext);
3442
+ cursor: pointer;
3443
+ padding: 0;
3444
+ flex-shrink: 0;
3445
+ }
3446
+
3447
+ .flm-searchbox-clear:hover {
3448
+ background-color: var(--buttonBackgroundHovered);
3449
+ color: var(--bodyText);
3450
+ }
3451
+
3452
+ /* Show clear button when input has value */
3453
+ .flm-searchbox--has-value .flm-searchbox-clear {
3454
+ display: inline-flex;
3455
+ }
3456
+
3457
+ /* Underlined variant */
3458
+ .flm-searchbox--underlined {
3459
+ border: none;
3460
+ border-bottom: 1px solid var(--inputBorder);
3461
+ border-radius: 0;
3462
+ }
3463
+
3464
+ .flm-searchbox--underlined:focus-within {
3465
+ border-bottom: 2px solid var(--inputFocusBorderAlt);
3466
+ }
3467
+
3468
+ /* Disabled */
3469
+ .flm-searchbox--disabled {
3470
+ background-color: var(--disabledBackground);
3471
+ border-color: var(--disabledBorder);
3472
+ cursor: default;
3473
+ }
3474
+
3475
+ .flm-searchbox--disabled .flm-searchbox-input {
3476
+ color: var(--disabledText);
3477
+ }
3478
+
3479
+ /* Separator */
3480
+
3481
+ .flm-separator {
3482
+ border: none;
3483
+ border-top: 1px solid var(--bodyDivider);
3484
+ margin: 0;
3485
+ padding: 0;
3486
+ }
3487
+
3488
+ .flm-separator--vertical {
3489
+ border-top: none;
3490
+ border-left: 1px solid var(--bodyDivider);
3491
+ align-self: stretch;
3492
+ width: 0;
3493
+ min-height: 1em;
3494
+ }
3495
+
3496
+ /* Shimmer — Loading skeleton placeholder */
3497
+
3498
+ @keyframes flm-shimmer-wave {
3499
+ 0% { background-position: -200% 0; }
3500
+ 100% { background-position: 200% 0; }
3501
+ }
3502
+
3503
+ .flm-shimmer {
3504
+ display: flex;
3505
+ flex-direction: column;
3506
+ gap: var(--spacingS1);
3507
+ font-family: var(--fontFamily);
3508
+ }
3509
+
3510
+ /* Row variant for horizontal composition */
3511
+ .flm-shimmer--row {
3512
+ flex-direction: row;
3513
+ align-items: center;
3514
+ }
3515
+
3516
+ /* Shared shimmer element base */
3517
+ .flm-shimmer-line,
3518
+ .flm-shimmer-circle,
3519
+ .flm-shimmer-rect {
3520
+ background: linear-gradient(
3521
+ 90deg,
3522
+ var(--neutralLighter) 25%,
3523
+ var(--neutralLight) 50%,
3524
+ var(--neutralLighter) 75%
3525
+ );
3526
+ background-size: 200% 100%;
3527
+ animation: flm-shimmer-wave 2s ease-in-out infinite;
3528
+ border-radius: var(--roundedCorner2);
3529
+ }
3530
+
3531
+ /* Line — text placeholder (16px bar) */
3532
+ .flm-shimmer-line {
3533
+ height: 16px;
3534
+ width: 100%;
3535
+ }
3536
+
3537
+ .flm-shimmer-line--short {
3538
+ width: 40%;
3539
+ }
3540
+
3541
+ .flm-shimmer-line--medium {
3542
+ width: 70%;
3543
+ }
3544
+
3545
+ /* Circle — avatar placeholder (40px) */
3546
+ .flm-shimmer-circle {
3547
+ width: 40px;
3548
+ height: 40px;
3549
+ min-width: 40px;
3550
+ border-radius: 50%;
3551
+ flex-shrink: 0;
3552
+ }
3553
+
3554
+ .flm-shimmer-circle--small {
3555
+ width: 24px;
3556
+ height: 24px;
3557
+ min-width: 24px;
3558
+ }
3559
+
3560
+ .flm-shimmer-circle--large {
3561
+ width: 56px;
3562
+ height: 56px;
3563
+ min-width: 56px;
3564
+ }
3565
+
3566
+ /* Rect — block placeholder (120px) */
3567
+ .flm-shimmer-rect {
3568
+ width: 120px;
3569
+ height: 120px;
3570
+ min-width: 120px;
3571
+ flex-shrink: 0;
3572
+ }
3573
+
3574
+ .flm-shimmer-rect--wide {
3575
+ width: 200px;
3576
+ }
3577
+
3578
+ .flm-shimmer-rect--tall {
3579
+ height: 200px;
3580
+ }
3581
+
3582
+ /* Slider — Range input with custom styling */
3583
+
3584
+ .flm-slider {
3585
+ display: flex;
3586
+ flex-direction: column;
3587
+ gap: var(--spacingS2);
3588
+ width: 100%;
3589
+ font-family: var(--fontFamily);
3590
+ }
3591
+
3592
+ .flm-slider-container {
3593
+ display: flex;
3594
+ align-items: center;
3595
+ gap: var(--spacingS1);
3596
+ }
3597
+
3598
+ .flm-slider-input {
3599
+ -webkit-appearance: none;
3600
+ -moz-appearance: none;
3601
+ appearance: none;
3602
+ width: 100%;
3603
+ height: 4px;
3604
+ border-radius: 2px;
3605
+ outline: none;
3606
+ cursor: pointer;
3607
+ background: linear-gradient(
3608
+ to right,
3609
+ var(--themePrimary) 0%,
3610
+ var(--themePrimary) var(--flm-slider-fill, 50%),
3611
+ var(--neutralLight) var(--flm-slider-fill, 50%),
3612
+ var(--neutralLight) 100%
3613
+ );
3614
+ }
3615
+
3616
+ /* Webkit thumb */
3617
+ .flm-slider-input::-webkit-slider-thumb {
3618
+ -webkit-appearance: none;
3619
+ width: 16px;
3620
+ height: 16px;
3621
+ border-radius: 50%;
3622
+ background-color: var(--themePrimary);
3623
+ border: 2px solid var(--bodyBackground);
3624
+ box-shadow: 0 0 0 1px var(--themePrimary);
3625
+ cursor: pointer;
3626
+ transition: transform var(--duration1) var(--easeStandard);
3627
+ }
3628
+
3629
+ .flm-slider-input::-webkit-slider-thumb:hover {
3630
+ transform: scale(1.2);
3631
+ }
3632
+
3633
+ .flm-slider-input::-webkit-slider-thumb:active {
3634
+ transform: scale(1.3);
3635
+ }
3636
+
3637
+ /* Firefox thumb */
3638
+ .flm-slider-input::-moz-range-thumb {
3639
+ width: 16px;
3640
+ height: 16px;
3641
+ border-radius: 50%;
3642
+ background-color: var(--themePrimary);
3643
+ border: 2px solid var(--bodyBackground);
3644
+ box-shadow: 0 0 0 1px var(--themePrimary);
3645
+ cursor: pointer;
3646
+ }
3647
+
3648
+ /* Firefox track */
3649
+ .flm-slider-input::-moz-range-track {
3650
+ height: 4px;
3651
+ border-radius: 2px;
3652
+ background: var(--neutralLight);
3653
+ }
3654
+
3655
+ .flm-slider-input::-moz-range-progress {
3656
+ height: 4px;
3657
+ border-radius: 2px;
3658
+ background: var(--themePrimary);
3659
+ }
3660
+
3661
+ /* Focus */
3662
+ .flm-slider-input:focus-visible::-webkit-slider-thumb {
3663
+ outline: var(--focusOutlineWidth) solid var(--focusBorder);
3664
+ outline-offset: var(--focusOutlineOffset);
3665
+ }
3666
+
3667
+ .flm-slider-input:focus-visible::-moz-range-thumb {
3668
+ outline: var(--focusOutlineWidth) solid var(--focusBorder);
3669
+ outline-offset: var(--focusOutlineOffset);
3670
+ }
3671
+
3672
+ /* Value display */
3673
+ .flm-slider-value {
3674
+ font-size: var(--fontSizeSmall);
3675
+ line-height: var(--lineHeightSmall);
3676
+ color: var(--bodyText);
3677
+ min-width: 32px;
3678
+ text-align: right;
3679
+ flex-shrink: 0;
3680
+ }
3681
+
3682
+ /* Label */
3683
+ .flm-slider-label {
3684
+ display: flex;
3685
+ justify-content: space-between;
3686
+ align-items: center;
3687
+ }
3688
+
3689
+ /* Disabled */
3690
+ .flm-slider--disabled .flm-slider-input {
3691
+ cursor: default;
3692
+ background: var(--neutralLight);
3693
+ }
3694
+
3695
+ .flm-slider--disabled .flm-slider-input::-webkit-slider-thumb {
3696
+ background-color: var(--disabledText);
3697
+ box-shadow: none;
3698
+ cursor: default;
3699
+ transform: none;
3700
+ }
3701
+
3702
+ .flm-slider--disabled .flm-slider-input::-moz-range-thumb {
3703
+ background-color: var(--disabledText);
3704
+ box-shadow: none;
3705
+ cursor: default;
3706
+ }
3707
+
3708
+ .flm-slider--disabled .flm-slider-value {
3709
+ color: var(--disabledText);
3710
+ }
3711
+
3712
+ /* Vertical variant */
3713
+ .flm-slider--vertical {
3714
+ width: auto;
3715
+ height: 200px;
3716
+ }
3717
+
3718
+ .flm-slider--vertical .flm-slider-container {
3719
+ flex-direction: column;
3720
+ height: 100%;
3721
+ }
3722
+
3723
+ .flm-slider--vertical .flm-slider-input {
3724
+ writing-mode: vertical-lr;
3725
+ direction: rtl;
3726
+ width: 4px;
3727
+ height: 100%;
3728
+ }
3729
+
3730
+ /* SpinButton — Numeric input with increment/decrement */
3731
+
3732
+ .flm-spinbutton {
3733
+ display: inline-flex;
3734
+ align-items: stretch;
3735
+ height: 32px;
3736
+ border: 1px solid var(--inputBorder);
3737
+ border-radius: var(--roundedCorner2);
3738
+ background-color: var(--inputBackground);
3739
+ font-family: var(--fontFamily);
3740
+ box-sizing: border-box;
3741
+ overflow: hidden;
3742
+ }
3743
+
3744
+ .flm-spinbutton:hover {
3745
+ border-color: var(--inputBorderHovered);
3746
+ }
3747
+
3748
+ .flm-spinbutton:focus-within {
3749
+ border-color: var(--inputFocusBorderAlt);
3750
+ border-bottom-width: 2px;
3751
+ }
3752
+
3753
+ /* Label above the spinbutton */
3754
+ .flm-spinbutton-wrapper {
3755
+ display: flex;
3756
+ flex-direction: column;
3757
+ width: 100%;
3758
+ }
3759
+
3760
+ /* Hide native spinners */
3761
+ .flm-spinbutton-input {
3762
+ border: none;
3763
+ background: transparent;
3764
+ color: var(--inputText);
3765
+ font-family: var(--fontFamily);
3766
+ font-size: var(--fontSizeMedium);
3767
+ line-height: var(--lineHeightMedium);
3768
+ padding: 0 8px;
3769
+ width: 80px;
3770
+ height: 100%;
3771
+ outline: none;
3772
+ box-sizing: border-box;
3773
+ text-align: center;
3774
+ -moz-appearance: textfield;
3775
+ }
3776
+
3777
+ .flm-spinbutton-input::-webkit-outer-spin-button,
3778
+ .flm-spinbutton-input::-webkit-inner-spin-button {
3779
+ -webkit-appearance: none;
3780
+ margin: 0;
3781
+ }
3782
+
3783
+ /* Buttons */
3784
+ .flm-spinbutton-btn {
3785
+ display: flex;
3786
+ align-items: center;
3787
+ justify-content: center;
3788
+ width: 24px;
3789
+ border: none;
3790
+ background: transparent;
3791
+ color: var(--bodySubtext);
3792
+ cursor: pointer;
3793
+ padding: 0;
3794
+ flex-shrink: 0;
3795
+ }
3796
+
3797
+ .flm-spinbutton-btn:hover {
3798
+ background-color: var(--listItemBackgroundHovered);
3799
+ color: var(--bodyText);
3800
+ }
3801
+
3802
+ .flm-spinbutton-btn:active {
3803
+ background-color: var(--listItemBackgroundChecked);
3804
+ }
3805
+
3806
+ .flm-spinbutton-btn--decrement {
3807
+ border-right: 1px solid var(--variantBorder);
3808
+ }
3809
+
3810
+ .flm-spinbutton-btn--increment {
3811
+ border-left: 1px solid var(--variantBorder);
3812
+ }
3813
+
3814
+ /* Disabled */
3815
+ .flm-spinbutton--disabled {
3816
+ border-color: var(--disabledBorder);
3817
+ background-color: var(--disabledBackground);
3818
+ }
3819
+
3820
+ .flm-spinbutton--disabled .flm-spinbutton-input {
3821
+ color: var(--disabledText);
3822
+ }
3823
+
3824
+ .flm-spinbutton--disabled .flm-spinbutton-btn {
3825
+ color: var(--disabledText);
3826
+ cursor: default;
3827
+ pointer-events: none;
3828
+ }
3829
+
3830
+ /* Spinner */
3831
+
3832
+ .flm-spinner {
3833
+ display: inline-flex;
3834
+ flex-direction: column;
3835
+ align-items: center;
3836
+ gap: var(--spacingS1);
3837
+ }
3838
+
3839
+ .flm-spinner-circle {
3840
+ width: 20px;
3841
+ height: 20px;
3842
+ border: 2px solid var(--themeLighter);
3843
+ border-top-color: var(--themePrimary);
3844
+ border-radius: 50%;
3845
+ animation: flm-spin 0.6s linear infinite;
3846
+ box-sizing: border-box;
3847
+ }
3848
+
3849
+ /* Sizes */
3850
+ .flm-spinner--xSmall .flm-spinner-circle { width: 12px; height: 12px; border-width: 1.5px; }
3851
+ .flm-spinner--small .flm-spinner-circle { width: 16px; height: 16px; border-width: 1.5px; }
3852
+ .flm-spinner--large .flm-spinner-circle { width: 28px; height: 28px; border-width: 3px; }
3853
+
3854
+ .flm-spinner-label {
3855
+ font-family: var(--fontFamily);
3856
+ font-size: var(--fontSizeSmall);
3857
+ line-height: var(--lineHeightSmall);
3858
+ color: var(--bodyText);
3859
+ }
3860
+
3861
+ @keyframes flm-spin {
3862
+ to { transform: rotate(360deg); }
3863
+ }
3864
+
3865
+ /* Stack — Flexbox layout container */
3866
+
3867
+ .flm-stack {
3868
+ display: flex;
3869
+ flex-direction: column;
3870
+ }
3871
+
3872
+ .flm-stack--horizontal {
3873
+ flex-direction: row;
3874
+ }
3875
+
3876
+ .flm-stack--center {
3877
+ justify-content: center;
3878
+ align-items: center;
3879
+ }
3880
+
3881
+ .flm-stack--end {
3882
+ justify-content: flex-end;
3883
+ align-items: flex-end;
3884
+ }
3885
+
3886
+ .flm-stack--space-between {
3887
+ justify-content: space-between;
3888
+ }
3889
+
3890
+ .flm-stack--wrap {
3891
+ flex-wrap: wrap;
3892
+ }
3893
+
3894
+ /* Horizontal + center should only center cross-axis by default */
3895
+ .flm-stack--horizontal.flm-stack--center {
3896
+ align-items: center;
3897
+ }
3898
+
3899
+ /* Stack Items */
3900
+ .flm-stack-item--grow {
3901
+ flex-grow: 1;
3902
+ }
3903
+
3904
+ .flm-stack-item--shrink {
3905
+ flex-shrink: 1;
3906
+ }
3907
+
3908
+ .flm-stack-item--align-end {
3909
+ align-self: flex-end;
3910
+ }
3911
+
3912
+ .flm-stack-item--align-center {
3913
+ align-self: center;
3914
+ }
3915
+
3916
+ /* SwatchColorPicker — Color swatch grid */
3917
+
3918
+ .flm-swatchcolorpicker {
3919
+ display: flex;
3920
+ flex-wrap: wrap;
3921
+ gap: 4px;
3922
+ font-family: var(--fontFamily);
3923
+ }
3924
+
3925
+ .flm-swatchcolorpicker-cell {
3926
+ display: inline-flex;
3927
+ align-items: center;
3928
+ justify-content: center;
3929
+ width: 24px;
3930
+ height: 24px;
3931
+ border: none;
3932
+ border-radius: var(--roundedCorner2);
3933
+ cursor: pointer;
3934
+ padding: 0;
3935
+ box-sizing: border-box;
3936
+ transition: box-shadow var(--duration1) var(--easeStandard),
3937
+ transform var(--duration1) var(--easeStandard);
3938
+ }
3939
+
3940
+ .flm-swatchcolorpicker-cell:hover {
3941
+ transform: scale(1.15);
3942
+ }
3943
+
3944
+ .flm-swatchcolorpicker-cell:focus-visible {
3945
+ outline: var(--focusOutlineWidth) solid var(--focusBorder);
3946
+ outline-offset: var(--focusOutlineOffset);
3947
+ }
3948
+
3949
+ /* Selected swatch ring */
3950
+ .flm-swatchcolorpicker-cell--selected {
3951
+ box-shadow: 0 0 0 2px var(--bodyBackground), 0 0 0 4px var(--bodyText);
3952
+ }
3953
+
3954
+ /* Disabled */
3955
+ .flm-swatchcolorpicker-cell:disabled,
3956
+ .flm-swatchcolorpicker-cell--disabled {
3957
+ opacity: 0.4;
3958
+ cursor: default;
3959
+ transform: none;
3960
+ }
3961
+
3962
+ /* Circle variant */
3963
+ .flm-swatchcolorpicker--circle .flm-swatchcolorpicker-cell {
3964
+ border-radius: 50%;
3965
+ }
3966
+
3967
+ /* Large size variant */
3968
+ .flm-swatchcolorpicker--large .flm-swatchcolorpicker-cell {
3969
+ width: 32px;
3970
+ height: 32px;
3971
+ }
3972
+
3973
+ /* TagPicker / PeoplePicker — multi-select input with chip/tag UI */
3974
+
3975
+ .flm-tagpicker {
3976
+ display: flex;
3977
+ flex-direction: column;
3978
+ width: 100%;
3979
+ position: relative;
3980
+ font-family: var(--fontFamily);
3981
+ }
3982
+
3983
+ /* Well — flex-wrap input area holding chips + input */
3984
+ .flm-tagpicker-well {
3985
+ display: flex;
3986
+ flex-wrap: wrap;
3987
+ align-items: center;
3988
+ gap: 4px;
3989
+ min-height: 32px;
3990
+ padding: 2px 4px;
3991
+ border: 1px solid var(--inputBorder);
3992
+ border-radius: var(--roundedCorner2);
3993
+ background-color: var(--inputBackground);
3994
+ box-sizing: border-box;
3995
+ cursor: text;
3996
+ }
3997
+
3998
+ .flm-tagpicker-well:hover {
3999
+ border-color: var(--inputBorderHovered);
4000
+ }
4001
+
4002
+ .flm-tagpicker-well:focus-within {
4003
+ border-color: var(--inputFocusBorderAlt);
4004
+ border-bottom-width: 2px;
4005
+ }
4006
+
4007
+ /* Chip / Tag pill */
4008
+ .flm-tagpicker-chip {
4009
+ display: inline-flex;
4010
+ align-items: center;
4011
+ height: 24px;
4012
+ padding: 0 4px 0 8px;
4013
+ background-color: var(--neutralLight);
4014
+ border-radius: var(--roundedCorner4);
4015
+ font-size: var(--fontSizeSmall);
4016
+ line-height: var(--lineHeightSmall);
4017
+ color: var(--bodyText);
4018
+ max-width: 200px;
4019
+ box-sizing: border-box;
4020
+ }
4021
+
4022
+ .flm-tagpicker-chip-text {
4023
+ overflow: hidden;
4024
+ text-overflow: ellipsis;
4025
+ white-space: nowrap;
4026
+ }
4027
+
4028
+ .flm-tagpicker-chip-remove {
4029
+ display: inline-flex;
4030
+ align-items: center;
4031
+ justify-content: center;
4032
+ width: 16px;
4033
+ height: 16px;
4034
+ margin-left: 4px;
4035
+ border: none;
4036
+ background: transparent;
4037
+ color: var(--bodySubtext);
4038
+ cursor: pointer;
4039
+ padding: 0;
4040
+ border-radius: var(--roundedCorner2);
4041
+ flex-shrink: 0;
4042
+ }
4043
+
4044
+ .flm-tagpicker-chip-remove:hover {
4045
+ background-color: var(--neutralQuaternary);
4046
+ color: var(--bodyText);
4047
+ }
4048
+
4049
+ .flm-tagpicker-chip-remove svg {
4050
+ width: 8px;
4051
+ height: 8px;
4052
+ fill: currentColor;
4053
+ }
4054
+
4055
+ /* Input inside the well */
4056
+ .flm-tagpicker-input {
4057
+ flex: 1;
4058
+ min-width: 80px;
4059
+ border: none;
4060
+ background: transparent;
4061
+ color: var(--inputText);
4062
+ font-family: var(--fontFamily);
4063
+ font-size: var(--fontSizeMedium);
4064
+ line-height: var(--lineHeightMedium);
4065
+ padding: 2px 4px;
4066
+ outline: none;
4067
+ }
4068
+
4069
+ .flm-tagpicker-input::placeholder {
4070
+ color: var(--inputPlaceholderText);
4071
+ }
4072
+
4073
+ /* Listbox (option dropdown) */
4074
+ .flm-tagpicker-listbox {
4075
+ position: absolute;
4076
+ left: 0;
4077
+ right: 0;
4078
+ top: 100%;
4079
+ margin-top: 2px;
4080
+ z-index: 1000;
4081
+ background-color: var(--bodyBackground);
4082
+ border: 1px solid var(--variantBorder);
4083
+ border-radius: var(--roundedCorner2);
4084
+ box-shadow: var(--elevation8);
4085
+ max-height: 220px;
4086
+ overflow-y: auto;
4087
+ display: none;
4088
+ }
4089
+
4090
+ .flm-tagpicker-listbox--open {
4091
+ display: block;
4092
+ }
4093
+
4094
+ .flm-tagpicker-listbox--above {
4095
+ top: auto;
4096
+ bottom: 100%;
4097
+ margin-top: 0;
4098
+ margin-bottom: 2px;
4099
+ }
4100
+
4101
+ /* Option */
4102
+ .flm-tagpicker-option {
4103
+ display: flex;
4104
+ align-items: center;
4105
+ padding: 6px var(--spacingS1);
4106
+ min-height: 32px;
4107
+ cursor: pointer;
4108
+ font-size: var(--fontSizeMedium);
4109
+ line-height: var(--lineHeightMedium);
4110
+ color: var(--bodyText);
4111
+ box-sizing: border-box;
4112
+ }
4113
+
4114
+ .flm-tagpicker-option:hover,
4115
+ .flm-tagpicker-option--highlighted {
4116
+ background-color: var(--listItemBackgroundHovered);
4117
+ }
4118
+
4119
+ .flm-tagpicker-option--selected {
4120
+ color: var(--disabledText);
4121
+ cursor: default;
4122
+ }
4123
+
4124
+ .flm-tagpicker-option--hidden {
4125
+ display: none;
4126
+ }
4127
+
4128
+ /* PeoplePicker variant — option with persona coin */
4129
+ .flm-tagpicker--people .flm-tagpicker-option {
4130
+ gap: var(--spacingS2);
4131
+ }
4132
+
4133
+ .flm-tagpicker-option-coin {
4134
+ display: inline-flex;
4135
+ align-items: center;
4136
+ justify-content: center;
4137
+ width: 24px;
4138
+ height: 24px;
4139
+ border-radius: 50%;
4140
+ background-color: var(--themePrimary);
4141
+ color: var(--white);
4142
+ font-size: 10px;
4143
+ font-weight: var(--fontWeightSemibold);
4144
+ flex-shrink: 0;
4145
+ }
4146
+
4147
+ .flm-tagpicker-option-details {
4148
+ display: flex;
4149
+ flex-direction: column;
4150
+ min-width: 0;
4151
+ }
4152
+
4153
+ .flm-tagpicker-option-name {
4154
+ overflow: hidden;
4155
+ text-overflow: ellipsis;
4156
+ white-space: nowrap;
4157
+ }
4158
+
4159
+ .flm-tagpicker-option-secondary {
4160
+ font-size: var(--fontSizeSmall);
4161
+ line-height: var(--lineHeightSmall);
4162
+ color: var(--bodySubtext);
4163
+ overflow: hidden;
4164
+ text-overflow: ellipsis;
4165
+ white-space: nowrap;
4166
+ }
4167
+
4168
+ /* PeoplePicker chip with small coin */
4169
+ .flm-tagpicker-chip-coin {
4170
+ display: inline-flex;
4171
+ align-items: center;
4172
+ justify-content: center;
4173
+ width: 18px;
4174
+ height: 18px;
4175
+ border-radius: 50%;
4176
+ background-color: var(--themePrimary);
4177
+ color: var(--white);
4178
+ font-size: 8px;
4179
+ font-weight: var(--fontWeightSemibold);
4180
+ flex-shrink: 0;
4181
+ margin-right: 4px;
4182
+ }
4183
+
4184
+ /* Disabled state */
4185
+ .flm-tagpicker--disabled .flm-tagpicker-well {
4186
+ border-color: var(--disabledBorder);
4187
+ background-color: var(--disabledBackground);
4188
+ cursor: default;
4189
+ }
4190
+
4191
+ .flm-tagpicker--disabled .flm-tagpicker-input {
4192
+ color: var(--disabledText);
4193
+ }
4194
+
4195
+ .flm-tagpicker--disabled .flm-tagpicker-chip {
4196
+ background-color: var(--neutralLighter);
4197
+ color: var(--disabledText);
4198
+ }
4199
+
4200
+ .flm-tagpicker--disabled .flm-tagpicker-chip-remove {
4201
+ display: none;
4202
+ }
4203
+
4204
+ /* Error state */
4205
+ .flm-tagpicker--error .flm-tagpicker-well {
4206
+ border-color: var(--errorText);
4207
+ }
4208
+
4209
+ .flm-tagpicker-error {
4210
+ display: block;
4211
+ font-size: var(--fontSizeSmall);
4212
+ line-height: var(--lineHeightSmall);
4213
+ color: var(--errorText);
4214
+ padding-top: 5px;
4215
+ }
4216
+
4217
+ /* TeachingBubble — Guided callout with inverted colors */
4218
+
4219
+ .flm-teachingbubble {
4220
+ position: absolute;
4221
+ z-index: 1000;
4222
+ background-color: var(--themePrimary);
4223
+ color: var(--white);
4224
+ border-radius: var(--roundedCorner2);
4225
+ box-shadow: var(--elevation16);
4226
+ max-width: 364px;
4227
+ min-width: 240px;
4228
+ opacity: 0;
4229
+ pointer-events: none;
4230
+ transform: translateY(4px);
4231
+ transition: opacity var(--duration1) var(--easeStandard),
4232
+ transform var(--duration1) var(--easeDecelerate);
4233
+ font-family: var(--fontFamily);
4234
+ }
4235
+
4236
+ .flm-teachingbubble--visible {
4237
+ opacity: 1;
4238
+ pointer-events: auto;
4239
+ transform: translateY(0);
4240
+ }
4241
+
4242
+ /* Header */
4243
+ .flm-teachingbubble-header {
4244
+ display: flex;
4245
+ align-items: flex-start;
4246
+ justify-content: space-between;
4247
+ padding: var(--spacingM) var(--spacingM) 0;
4248
+ }
4249
+
4250
+ .flm-teachingbubble-headline {
4251
+ font-size: var(--fontSizeMediumPlus);
4252
+ font-weight: var(--fontWeightSemibold);
4253
+ line-height: var(--lineHeightMediumPlus);
4254
+ color: var(--white);
4255
+ margin: 0;
4256
+ }
4257
+
4258
+ /* Close button */
4259
+ .flm-teachingbubble-close {
4260
+ display: flex;
4261
+ align-items: center;
4262
+ justify-content: center;
4263
+ width: 24px;
4264
+ height: 24px;
4265
+ border: none;
4266
+ background: transparent;
4267
+ color: var(--white);
4268
+ cursor: pointer;
4269
+ padding: 0;
4270
+ border-radius: var(--roundedCorner2);
4271
+ opacity: 0.8;
4272
+ flex-shrink: 0;
4273
+ }
4274
+
4275
+ .flm-teachingbubble-close:hover {
4276
+ opacity: 1;
4277
+ background-color: rgba(255, 255, 255, 0.1);
4278
+ }
4279
+
4280
+ /* Body text */
4281
+ .flm-teachingbubble-body {
4282
+ padding: var(--spacingS1) var(--spacingM);
4283
+ font-size: var(--fontSizeMedium);
4284
+ line-height: var(--lineHeightMedium);
4285
+ color: rgba(255, 255, 255, 0.9);
4286
+ }
4287
+
4288
+ /* Footer with action buttons */
4289
+ .flm-teachingbubble-footer {
4290
+ display: flex;
4291
+ align-items: center;
4292
+ justify-content: flex-end;
4293
+ gap: var(--spacingS1);
4294
+ padding: var(--spacingS1) var(--spacingM) var(--spacingM);
4295
+ }
4296
+
4297
+ /* Button overrides inside teaching bubble */
4298
+ .flm-teachingbubble .flm-button {
4299
+ border-color: var(--white);
4300
+ color: var(--white);
4301
+ background-color: transparent;
4302
+ }
4303
+
4304
+ .flm-teachingbubble .flm-button:hover {
4305
+ background-color: rgba(255, 255, 255, 0.15);
4306
+ }
4307
+
4308
+ .flm-teachingbubble .flm-button--primary {
4309
+ background-color: var(--white);
4310
+ color: var(--themePrimary);
4311
+ border-color: var(--white);
4312
+ }
4313
+
4314
+ .flm-teachingbubble .flm-button--primary:hover {
4315
+ background-color: rgba(255, 255, 255, 0.85);
4316
+ }
4317
+
4318
+ /* Beak */
4319
+ .flm-teachingbubble-beak {
4320
+ position: absolute;
4321
+ width: 16px;
4322
+ height: 16px;
4323
+ background-color: var(--themePrimary);
4324
+ transform: rotate(45deg);
4325
+ top: -8px;
4326
+ left: 24px; /* default; overridden by JS to point at target */
4327
+ }
4328
+
4329
+ .flm-teachingbubble--above .flm-teachingbubble-beak {
4330
+ top: auto;
4331
+ bottom: -8px;
4332
+ }
4333
+
4334
+ /* Text — Typography component */
4335
+
4336
+ .flm-text {
4337
+ font-family: var(--fontFamily);
4338
+ font-size: var(--fontSizeMedium);
4339
+ line-height: var(--lineHeightMedium);
4340
+ font-weight: var(--fontWeightRegular);
4341
+ color: var(--bodyText);
4342
+ }
4343
+
4344
+ /* Size variants */
4345
+ .flm-text--tiny { font-size: var(--fontSizeTiny); line-height: var(--lineHeightTiny); }
4346
+ .flm-text--xSmall { font-size: var(--fontSizeXSmall); line-height: var(--lineHeightXSmall); }
4347
+ .flm-text--small { font-size: var(--fontSizeSmall); line-height: var(--lineHeightSmall); }
4348
+ .flm-text--smallPlus { font-size: var(--fontSizeSmallPlus); line-height: var(--lineHeightSmallPlus); }
4349
+ .flm-text--medium { font-size: var(--fontSizeMedium); line-height: var(--lineHeightMedium); }
4350
+ .flm-text--mediumPlus { font-size: var(--fontSizeMediumPlus); line-height: var(--lineHeightMediumPlus); }
4351
+ .flm-text--large { font-size: var(--fontSizeLarge); line-height: var(--lineHeightLarge); }
4352
+
4353
+ .flm-text--xLarge {
4354
+ font-size: var(--fontSizeXLarge);
4355
+ line-height: var(--lineHeightXLarge);
4356
+ font-weight: var(--fontWeightSemibold);
4357
+ }
4358
+
4359
+ .flm-text--xxLarge {
4360
+ font-size: var(--fontSizeXXLarge);
4361
+ line-height: var(--lineHeightXXLarge);
4362
+ font-weight: var(--fontWeightSemibold);
4363
+ }
4364
+
4365
+ .flm-text--superLarge {
4366
+ font-size: var(--fontSizeSuperLarge);
4367
+ line-height: var(--lineHeightSuperLarge);
4368
+ font-weight: var(--fontWeightSemibold);
4369
+ }
4370
+
4371
+ .flm-text--mega {
4372
+ font-size: var(--fontSizeMega);
4373
+ line-height: var(--lineHeightMega);
4374
+ font-weight: var(--fontWeightSemibold);
4375
+ }
4376
+
4377
+ /* Color variants */
4378
+ .flm-text--secondary { color: var(--bodySubtext); }
4379
+ .flm-text--disabled { color: var(--disabledText); }
4380
+ .flm-text--error { color: var(--errorText); }
4381
+ .flm-text--success { color: var(--successText); }
4382
+
4383
+ /* Weight variants */
4384
+ .flm-text--semibold { font-weight: var(--fontWeightSemibold); }
4385
+ .flm-text--bold { font-weight: var(--fontWeightBold); }
4386
+
4387
+ /* Display variants */
4388
+ .flm-text--block { display: block; }
4389
+
4390
+ .flm-text--nowrap {
4391
+ white-space: nowrap;
4392
+ overflow: hidden;
4393
+ text-overflow: ellipsis;
4394
+ }
4395
+
4396
+ /* TextField */
4397
+
4398
+ .flm-textfield {
4399
+ display: flex;
4400
+ flex-direction: column;
4401
+ width: 100%;
4402
+ }
4403
+
4404
+ .flm-textfield-input {
4405
+ display: block;
4406
+ width: 100%;
4407
+ height: 32px;
4408
+ padding: 0 8px;
4409
+ border: 1px solid var(--inputBorder);
4410
+ border-radius: var(--roundedCorner2);
4411
+ background-color: var(--inputBackground);
4412
+ color: var(--inputText);
4413
+ font-family: var(--fontFamily);
4414
+ font-size: var(--fontSizeMedium);
4415
+ line-height: var(--lineHeightMedium);
4416
+ outline: none;
4417
+ box-sizing: border-box;
4418
+ }
4419
+
4420
+ /* Textarea */
4421
+ textarea.flm-textfield-input {
4422
+ height: auto;
4423
+ padding: 6px 8px;
4424
+ resize: none;
4425
+ }
4426
+
4427
+ .flm-textfield-input::placeholder {
4428
+ color: var(--inputPlaceholderText);
4429
+ }
4430
+
4431
+ .flm-textfield-input:hover {
4432
+ border-color: var(--inputBorderHovered);
4433
+ }
4434
+
4435
+ .flm-textfield-input:focus {
4436
+ border-color: var(--inputFocusBorderAlt);
4437
+ }
4438
+
4439
+ /* Underlined variant */
4440
+ .flm-textfield--underlined .flm-textfield-input {
4441
+ border: none;
4442
+ border-bottom: 1px solid var(--inputBorder);
4443
+ border-radius: 0;
4444
+ padding-left: 0;
4445
+ }
4446
+
4447
+ .flm-textfield--underlined .flm-textfield-input:focus {
4448
+ border-bottom: 2px solid var(--inputFocusBorderAlt);
4449
+ }
4450
+
4451
+ /* Borderless variant */
4452
+ .flm-textfield--borderless .flm-textfield-input {
4453
+ border: none;
4454
+ }
4455
+
4456
+ .flm-textfield--borderless .flm-textfield-input:focus {
4457
+ border: none;
4458
+ border-bottom: 2px solid var(--inputFocusBorderAlt);
4459
+ }
4460
+
4461
+ /* Error state */
4462
+ .flm-textfield--error .flm-textfield-input {
4463
+ border-color: var(--errorText);
4464
+ }
4465
+
4466
+ .flm-textfield--error .flm-textfield-input:hover,
4467
+ .flm-textfield--error .flm-textfield-input:focus {
4468
+ border-color: var(--errorText);
4469
+ }
4470
+
4471
+ .flm-textfield-error {
4472
+ display: block;
4473
+ font-size: var(--fontSizeSmall);
4474
+ line-height: var(--lineHeightSmall);
4475
+ color: var(--errorText);
4476
+ padding-top: 5px;
4477
+ }
4478
+
4479
+ /* Disabled state */
4480
+ .flm-textfield--disabled .flm-textfield-input,
4481
+ .flm-textfield-input:disabled {
4482
+ background-color: var(--disabledBackground);
4483
+ border-color: var(--disabledBorder);
4484
+ color: var(--disabledText);
4485
+ cursor: default;
4486
+ }
4487
+
4488
+ /* Prefix / Suffix wrapper */
4489
+ .flm-textfield-wrapper {
4490
+ display: flex;
4491
+ align-items: stretch;
4492
+ border: 1px solid var(--inputBorder);
4493
+ border-radius: var(--roundedCorner2);
4494
+ background-color: var(--inputBackground);
4495
+ overflow: hidden;
4496
+ }
4497
+
4498
+ .flm-textfield-wrapper:hover {
4499
+ border-color: var(--inputBorderHovered);
4500
+ }
4501
+
4502
+ .flm-textfield-wrapper:focus-within {
4503
+ border-color: var(--inputFocusBorderAlt);
4504
+ border-bottom-width: 2px;
4505
+ }
4506
+
4507
+ .flm-textfield-wrapper > .flm-textfield-input {
4508
+ border: none;
4509
+ border-radius: 0;
4510
+ flex: 1;
4511
+ min-width: 0;
4512
+ }
4513
+
4514
+ .flm-textfield-wrapper > .flm-textfield-input:focus {
4515
+ border: none;
4516
+ padding-bottom: 0;
4517
+ }
4518
+
4519
+ .flm-textfield-prefix,
4520
+ .flm-textfield-suffix {
4521
+ display: flex;
4522
+ align-items: center;
4523
+ padding: 0 8px;
4524
+ background-color: var(--bodyStandoutBackground);
4525
+ color: var(--bodySubtext);
4526
+ font-size: var(--fontSizeMedium);
4527
+ white-space: nowrap;
4528
+ user-select: none;
4529
+ }
4530
+
4531
+ /* TimePicker — Time input with scrollable dropdown of time slots */
4532
+
4533
+ .flm-timepicker {
4534
+ display: flex;
4535
+ flex-direction: column;
4536
+ width: 100%;
4537
+ position: relative;
4538
+ font-family: var(--fontFamily);
4539
+ }
4540
+
4541
+ .flm-timepicker-wrapper {
4542
+ display: flex;
4543
+ align-items: stretch;
4544
+ height: 32px;
4545
+ border: 1px solid var(--inputBorder);
4546
+ border-radius: var(--roundedCorner2);
4547
+ background-color: var(--inputBackground);
4548
+ box-sizing: border-box;
4549
+ overflow: hidden;
4550
+ }
4551
+
4552
+ .flm-timepicker-wrapper:hover {
4553
+ border-color: var(--inputBorderHovered);
4554
+ }
4555
+
4556
+ .flm-timepicker-wrapper:focus-within {
4557
+ border-color: var(--inputFocusBorderAlt);
4558
+ border-bottom-width: 2px;
4559
+ }
4560
+
4561
+ .flm-timepicker-input {
4562
+ flex: 1;
4563
+ border: none;
4564
+ background: transparent;
4565
+ color: var(--inputText);
4566
+ font-family: var(--fontFamily);
4567
+ font-size: var(--fontSizeMedium);
4568
+ line-height: var(--lineHeightMedium);
4569
+ padding: 0 8px;
4570
+ outline: none;
4571
+ min-width: 0;
4572
+ }
4573
+
4574
+ .flm-timepicker-input::placeholder {
4575
+ color: var(--inputPlaceholderText);
4576
+ }
4577
+
4578
+ /* Clock icon button */
4579
+ .flm-timepicker-icon {
4580
+ display: flex;
4581
+ align-items: center;
4582
+ justify-content: center;
4583
+ width: 28px;
4584
+ border: none;
4585
+ background: transparent;
4586
+ color: var(--bodySubtext);
4587
+ cursor: pointer;
4588
+ padding: 0;
4589
+ flex-shrink: 0;
4590
+ }
4591
+
4592
+ .flm-timepicker-icon:hover {
4593
+ background-color: var(--listItemBackgroundHovered);
4594
+ color: var(--bodyText);
4595
+ }
4596
+
4597
+ /* Dropdown listbox */
4598
+ .flm-timepicker-listbox {
4599
+ position: absolute;
4600
+ left: 0;
4601
+ top: 100%;
4602
+ margin-top: 2px;
4603
+ z-index: 1000;
4604
+ background-color: var(--bodyBackground);
4605
+ border: 1px solid var(--variantBorder);
4606
+ border-radius: var(--roundedCorner2);
4607
+ box-shadow: var(--elevation8);
4608
+ display: none;
4609
+ width: 100%;
4610
+ max-height: 220px;
4611
+ overflow-y: auto;
4612
+ box-sizing: border-box;
4613
+ }
4614
+
4615
+ .flm-timepicker-listbox--open {
4616
+ display: block;
4617
+ }
4618
+
4619
+ .flm-timepicker-listbox--above {
4620
+ top: auto;
4621
+ bottom: 100%;
4622
+ margin-top: 0;
4623
+ margin-bottom: 2px;
4624
+ }
4625
+
4626
+ /* Option rows */
4627
+ .flm-timepicker-option {
4628
+ display: flex;
4629
+ align-items: center;
4630
+ min-height: 32px;
4631
+ padding: 0 8px;
4632
+ font-size: var(--fontSizeMedium);
4633
+ line-height: var(--lineHeightMedium);
4634
+ color: var(--bodyText);
4635
+ cursor: pointer;
4636
+ user-select: none;
4637
+ }
4638
+
4639
+ .flm-timepicker-option:hover {
4640
+ background-color: var(--listItemBackgroundHovered);
4641
+ }
4642
+
4643
+ .flm-timepicker-option--highlighted {
4644
+ background-color: var(--listItemBackgroundHovered);
4645
+ }
4646
+
4647
+ .flm-timepicker-option--selected {
4648
+ background-color: var(--listItemBackgroundChecked);
4649
+ font-weight: var(--fontWeightSemibold);
4650
+ }
4651
+
4652
+ .flm-timepicker-option--hidden {
4653
+ display: none;
4654
+ }
4655
+
4656
+ /* Disabled state */
4657
+ .flm-timepicker--disabled .flm-timepicker-wrapper {
4658
+ border-color: var(--disabledBorder);
4659
+ background-color: var(--disabledBackground);
4660
+ }
4661
+
4662
+ .flm-timepicker--disabled .flm-timepicker-input {
4663
+ color: var(--disabledText);
4664
+ }
4665
+
4666
+ .flm-timepicker--disabled .flm-timepicker-icon {
4667
+ color: var(--disabledText);
4668
+ cursor: default;
4669
+ pointer-events: none;
4670
+ }
4671
+
4672
+ /* Error state */
4673
+ .flm-timepicker--error .flm-timepicker-wrapper {
4674
+ border-color: var(--errorText);
4675
+ }
4676
+
4677
+ .flm-timepicker-error {
4678
+ display: block;
4679
+ font-size: var(--fontSizeSmall);
4680
+ line-height: var(--lineHeightSmall);
4681
+ color: var(--errorText);
4682
+ padding-top: 5px;
4683
+ }
4684
+
4685
+ /* Toggle */
4686
+
4687
+ .flm-toggle {
4688
+ display: inline-flex;
4689
+ align-items: center;
4690
+ gap: var(--spacingS1);
4691
+ cursor: pointer;
4692
+ user-select: none;
4693
+ font-family: var(--fontFamily);
4694
+ font-size: var(--fontSizeMedium);
4695
+ line-height: var(--lineHeightMedium);
4696
+ color: var(--bodyText);
4697
+ position: relative;
4698
+ }
4699
+
4700
+ /* Hide native checkbox */
4701
+ .flm-toggle-input {
4702
+ position: absolute;
4703
+ opacity: 0;
4704
+ width: 0;
4705
+ height: 0;
4706
+ margin: 0;
4707
+ padding: 0;
4708
+ }
4709
+
4710
+ .flm-toggle-label {
4711
+ font-weight: var(--fontWeightSemibold);
4712
+ }
4713
+
4714
+ /* Track (pill shape) */
4715
+ .flm-toggle-track {
4716
+ display: inline-flex;
4717
+ align-items: center;
4718
+ width: 40px;
4719
+ height: 20px;
4720
+ padding: 0 3px;
4721
+ border: 1px solid var(--smallInputBorder);
4722
+ border-radius: 10px;
4723
+ background-color: var(--inputBackground);
4724
+ transition: background-color var(--duration2) var(--easeStandard),
4725
+ border-color var(--duration2) var(--easeStandard);
4726
+ box-sizing: border-box;
4727
+ flex-shrink: 0;
4728
+ }
4729
+
4730
+ /* Thumb (circle) */
4731
+ .flm-toggle-thumb {
4732
+ display: block;
4733
+ width: 12px;
4734
+ height: 12px;
4735
+ border-radius: 50%;
4736
+ background-color: var(--smallInputBorder);
4737
+ transition: transform var(--duration2) var(--easeStandard),
4738
+ background-color var(--duration2) var(--easeStandard);
4739
+ }
4740
+
4741
+ /* Hover */
4742
+ .flm-toggle:hover .flm-toggle-track {
4743
+ border-color: var(--inputBorderHovered);
4744
+ }
4745
+
4746
+ .flm-toggle:hover .flm-toggle-thumb {
4747
+ background-color: var(--inputBorderHovered);
4748
+ }
4749
+
4750
+ /* Checked */
4751
+ .flm-toggle-input:checked ~ .flm-toggle-track {
4752
+ background-color: var(--inputBackgroundChecked);
4753
+ border-color: var(--inputBackgroundChecked);
4754
+ }
4755
+
4756
+ .flm-toggle-input:checked ~ .flm-toggle-track .flm-toggle-thumb {
4757
+ background-color: var(--inputForegroundChecked);
4758
+ transform: translateX(20px);
4759
+ }
4760
+
4761
+ /* Checked + hover */
4762
+ .flm-toggle:hover .flm-toggle-input:checked ~ .flm-toggle-track {
4763
+ background-color: var(--inputBackgroundCheckedHovered);
4764
+ border-color: var(--inputBackgroundCheckedHovered);
4765
+ }
4766
+
4767
+ /* Focus */
4768
+ .flm-toggle-input:focus-visible ~ .flm-toggle-track {
4769
+ outline: var(--focusOutlineWidth) solid var(--focusBorder);
4770
+ outline-offset: var(--focusOutlineOffset);
4771
+ }
4772
+
4773
+ /* State text */
4774
+ .flm-toggle-state {
4775
+ font-size: var(--fontSizeMedium);
4776
+ color: var(--bodySubtext);
4777
+ }
4778
+
4779
+ /* Show data-off by default, data-on when checked */
4780
+ .flm-toggle-state::after {
4781
+ content: attr(data-off);
4782
+ }
4783
+
4784
+ .flm-toggle-input:checked ~ .flm-toggle-state::after {
4785
+ content: attr(data-on);
4786
+ }
4787
+
4788
+ /* Disabled */
4789
+ .flm-toggle--disabled,
4790
+ .flm-toggle:has(.flm-toggle-input:disabled) {
4791
+ cursor: default;
4792
+ color: var(--disabledText);
4793
+ }
4794
+
4795
+ .flm-toggle-input:disabled ~ .flm-toggle-track {
4796
+ background-color: var(--disabledBackground);
4797
+ border-color: var(--disabledBorder);
4798
+ }
4799
+
4800
+ .flm-toggle-input:disabled ~ .flm-toggle-track .flm-toggle-thumb {
4801
+ background-color: var(--disabledText);
4802
+ }
4803
+
4804
+ .flm-toggle-input:disabled:checked ~ .flm-toggle-track {
4805
+ background-color: var(--disabledBackground);
4806
+ border-color: var(--disabledBorder);
4807
+ }
4808
+
4809
+ /* Inline variant */
4810
+ .flm-toggle--inline {
4811
+ flex-direction: row;
4812
+ }
4813
+
4814
+ /* Tooltip */
4815
+
4816
+ .flm-tooltip {
4817
+ position: absolute;
4818
+ z-index: 1100;
4819
+ background-color: var(--bodyBackground);
4820
+ border: 1px solid var(--variantBorder);
4821
+ border-radius: var(--roundedCorner4);
4822
+ box-shadow: var(--elevation8);
4823
+ padding: 6px var(--spacingS1);
4824
+ font-family: var(--fontFamily);
4825
+ font-size: var(--fontSizeSmall);
4826
+ line-height: var(--lineHeightSmall);
4827
+ color: var(--bodyText);
4828
+ max-width: 276px;
4829
+ white-space: normal;
4830
+ word-wrap: break-word;
4831
+ opacity: 0;
4832
+ pointer-events: none;
4833
+ transition: opacity var(--duration1) var(--easeStandard);
4834
+ }
4835
+
4836
+ .flm-tooltip--visible {
4837
+ opacity: 1;
4838
+ }
4839
+
4840
+ /* Tooltip host — wrapper around the trigger element */
4841
+ .flm-tooltip-host {
4842
+ display: inline-block;
4843
+ position: relative;
4844
+ }