{"version":3,"file":"o3r-styling.mjs","sources":["../../src/devkit/styling-devkit-interface.ts","../../src/devkit/styling-devtools.ts","../../src/devkit/styling-devtools-token.ts","../../src/devkit/styling-devtools-message-service.ts","../../src/devkit/styling-devtools-module.ts","../../src/o3r-styling.ts"],"sourcesContent":["import type {\n  ConnectContentMessage,\n  DevtoolsCommonOptions,\n  MessageDataTypes,\n  OtterMessageContent,\n  RequestMessagesContentMessage,\n} from '@o3r/core';\nimport {\n  CssVariable,\n} from '../core/index';\n\n/**\n * Styling devtools service options\n */\nexport interface StylingDevtoolsServiceOptions extends DevtoolsCommonOptions {\n  /**\n   * Path to retrieve the styling metadata file\n   */\n  stylingMetadataPath: string;\n}\n\n/** Update styling variables */\nexport interface UpdateStylingVariablesContentMessage extends OtterMessageContent<'updateStylingVariables'> {\n  /**\n   * Dictionary of variable value to update\n   * indexed by the variable name\n   */\n  variables: Record<string, string>;\n}\n\n/** Reset styling variables override */\nexport interface ResetStylingVariablesContentMessage extends OtterMessageContent<'resetStylingVariables'> {}\n\n/** Styling variable */\nexport type StylingVariable = CssVariable & { runtimeValue?: string };\n\n/** Get styling variables */\nexport interface GetStylingVariableContentMessage extends OtterMessageContent<'getStylingVariable'> {\n  /** List of styling variables */\n  variables: StylingVariable[];\n}\n\n/**\n * List of styling message contents\n */\ntype StylingMessageContents = UpdateStylingVariablesContentMessage\n  | ResetStylingVariablesContentMessage\n  | GetStylingVariableContentMessage;\n\n/** List of possible DataTypes for Styling messages */\nexport type StylingMessageDataTypes = MessageDataTypes<StylingMessageContents>;\n\n/** List of all messages for Styling purposes */\nexport type AvailableStylingMessageContents = StylingMessageContents\n  | ConnectContentMessage\n  | RequestMessagesContentMessage<StylingMessageDataTypes>;\n\n/** Tag to identify theme variable */\nexport const THEME_TAG_NAME = 'theme';\n\n/** Tag to identify palette variable */\nexport const PALETTE_TAG_NAME = 'palette';\n","import {\n  DOCUMENT,\n  inject,\n  Injectable,\n} from '@angular/core';\nimport type {\n  CssMetadata,\n} from '../core/index';\n\n/**\n * Styling devtools service\n */\n@Injectable()\nexport class OtterStylingDevtools {\n  private readonly document = inject(DOCUMENT);\n\n  /**\n   * Retrieve styling metadata\n   * @param stylingMetadataPath\n   */\n  public async getStylingMetadata(stylingMetadataPath: string): Promise<CssMetadata> {\n    return (await fetch(stylingMetadataPath)).json();\n  }\n\n  /**\n   * Update styling variables\n   * @param variables\n   */\n  public updateVariables(variables: Record<string, string>) {\n    Object.entries(variables).forEach(([varName, value]) => this.document.querySelector('html')!.style.setProperty(`--${varName}`, value));\n  }\n\n  /**\n   * Reset styling variables override\n   */\n  public resetStylingVariables() {\n    const style = this.document.querySelector('html')!.style;\n    style.cssText\n      .split(/;(\\s+)?/)\n      .reduce((acc: string[], str) => {\n        const match = str?.match(/^(--.*):/);\n        return match ? acc.concat(match[1]) : acc;\n      }, [])\n      .forEach((varName) => style.removeProperty(varName));\n  }\n}\n","import {\n  InjectionToken,\n} from '@angular/core';\nimport type {\n  StylingDevtoolsServiceOptions,\n} from './styling-devkit-interface';\n\n/**\n * Default value for styling devtools\n */\nexport const OTTER_STYLING_DEVTOOLS_DEFAULT_OPTIONS: Readonly<StylingDevtoolsServiceOptions> = {\n  isActivatedOnBootstrap: false,\n  stylingMetadataPath: './metadata/styling.metadata.json'\n} as const;\n\n/**\n * Token for styling devtools\n */\nexport const OTTER_STYLING_DEVTOOLS_OPTIONS = new InjectionToken<StylingDevtoolsServiceOptions>('Otter Styling Devtools options');\n","/* eslint-disable no-console -- this is the purpose of this service */\nimport {\n  DestroyRef,\n  inject,\n  Injectable,\n} from '@angular/core';\nimport {\n  takeUntilDestroyed,\n} from '@angular/core/rxjs-interop';\nimport {\n  filterMessageContent,\n  sendOtterMessage,\n} from '@o3r/core';\nimport {\n  LoggerService,\n} from '@o3r/logger';\nimport {\n  fromEvent,\n} from 'rxjs';\nimport {\n  AvailableStylingMessageContents,\n  StylingDevtoolsServiceOptions,\n  StylingMessageDataTypes,\n} from './styling-devkit-interface';\nimport {\n  OtterStylingDevtools,\n} from './styling-devtools';\nimport {\n  OTTER_STYLING_DEVTOOLS_DEFAULT_OPTIONS,\n  OTTER_STYLING_DEVTOOLS_OPTIONS,\n} from './styling-devtools-token';\n\nconst isStylingMessage = (message: any): message is AvailableStylingMessageContents => {\n  return message && (\n    message.dataType === 'updateStylingVariables'\n    || message.dataType === 'resetStylingVariables'\n    || message.dataType === 'getStylingVariable'\n    || message.dataType === 'requestMessages'\n    || message.dataType === 'connect'\n  );\n};\n\nconst getCSSRulesAppliedOnRoot = () => Array.from(document.styleSheets)\n  .reverse()\n  .reduce((acc: CSSStyleRule[], styleSheet) => {\n    let rules;\n    try {\n      rules = styleSheet.cssRules || styleSheet.rules;\n    } catch (err) {\n      console.debug(`Could not access to stylesheet ${styleSheet.href}. This might be due to network issues, please check:\n- network connectivity\n- CORS setup\n- granted access to the stylesheet`, err);\n    }\n\n    return acc.concat(\n      Array.from(rules || [])\n        .reverse()\n        .filter((rule): rule is CSSStyleRule => rule instanceof CSSStyleRule && /\\b:root\\b/.test(rule.selectorText))\n    );\n  }, []);\n\nconst getCSSVariableValueInCSSStyleDeclaration = (variableName: string, style: CSSStyleDeclaration) =>\n  style.getPropertyValue(variableName).trim();\n\nconst getCSSVariableValue = (variableName: string, cssRules: CSSStyleRule[]) => {\n  const inlineValue = getCSSVariableValueInCSSStyleDeclaration(variableName, document.querySelector('html')!.style);\n  if (inlineValue) {\n    return inlineValue;\n  }\n\n  for (const rule of cssRules) {\n    const ruleValue = getCSSVariableValueInCSSStyleDeclaration(variableName, rule.style);\n    if (ruleValue) {\n      return ruleValue;\n    }\n  }\n};\n\n/**\n * Service to handle communication between application and chrome extension for styling\n */\n@Injectable()\nexport class StylingDevtoolsMessageService {\n  private readonly logger = inject(LoggerService);\n  private readonly stylingDevTools = inject(OtterStylingDevtools);\n  private readonly options = inject<StylingDevtoolsServiceOptions>(OTTER_STYLING_DEVTOOLS_OPTIONS, { optional: true }) ?? OTTER_STYLING_DEVTOOLS_DEFAULT_OPTIONS;\n\n  private readonly sendMessage = sendOtterMessage<AvailableStylingMessageContents>;\n  private readonly destroyRef = inject(DestroyRef);\n\n  constructor() {\n    this.options = {\n      ...OTTER_STYLING_DEVTOOLS_DEFAULT_OPTIONS,\n      ...this.options\n    };\n    if (this.options.isActivatedOnBootstrap) {\n      this.activate();\n    }\n  }\n\n  private async sendMetadata() {\n    const metadata = await this.stylingDevTools.getStylingMetadata(this.options.stylingMetadataPath);\n    const cssRules = getCSSRulesAppliedOnRoot();\n    const variables = Object.values(metadata.variables).map((variable) => ({\n      ...variable,\n      runtimeValue: getCSSVariableValue(`--${variable.name}`, cssRules)\n    }));\n    this.sendMessage('getStylingVariable', { variables });\n  }\n\n  /**\n   * Function to trigger a re-send a requested messages to the Otter Chrome DevTools extension\n   * @param only restricted list of messages to re-send\n   */\n  private handleReEmitRequest(only?: StylingMessageDataTypes[]) {\n    if (!only || only.includes('getStylingVariable')) {\n      return this.sendMetadata();\n    }\n  }\n\n  /**\n   * Function to handle the incoming messages from Otter Chrome DevTools extension\n   * @param message Message coming from the Otter Chrome DevTools extension\n   */\n  private handleEvents(message: AvailableStylingMessageContents) {\n    this.logger.debug('Message handling by the styling service', message);\n\n    switch (message.dataType) {\n      case 'connect': {\n        this.connectPlugin();\n        break;\n      }\n      case 'requestMessages': {\n        void this.handleReEmitRequest(message.only);\n        break;\n      }\n      case 'updateStylingVariables': {\n        this.stylingDevTools.updateVariables(message.variables);\n        break;\n      }\n      case 'resetStylingVariables': {\n        this.stylingDevTools.resetStylingVariables();\n        break;\n      }\n      default: {\n        this.logger.warn('Message ignored by the styling service', message);\n      }\n    }\n  }\n\n  /**\n   * Function to connect the plugin to the Otter Chrome DevTools extension\n   */\n  private connectPlugin() {\n    this.logger.debug('Otter DevTools is plugged to styling service of the application');\n  }\n\n  /** @inheritDoc */\n  public activate() {\n    fromEvent(window, 'message').pipe(\n      takeUntilDestroyed(this.destroyRef),\n      filterMessageContent(isStylingMessage)\n    ).subscribe((e) => this.handleEvents(e));\n  }\n}\n","import {\n  ModuleWithProviders,\n  NgModule,\n} from '@angular/core';\nimport type {\n  StylingDevtoolsServiceOptions,\n} from './styling-devkit-interface';\nimport {\n  OtterStylingDevtools,\n} from './styling-devtools';\nimport {\n  StylingDevtoolsMessageService,\n} from './styling-devtools-message-service';\nimport {\n  OTTER_STYLING_DEVTOOLS_DEFAULT_OPTIONS,\n  OTTER_STYLING_DEVTOOLS_OPTIONS,\n} from './styling-devtools-token';\n\n@NgModule({\n  providers: [\n    { provide: OTTER_STYLING_DEVTOOLS_OPTIONS, useValue: OTTER_STYLING_DEVTOOLS_DEFAULT_OPTIONS },\n    StylingDevtoolsMessageService,\n    OtterStylingDevtools\n  ]\n})\nexport class StylingDevtoolsModule {\n  /**\n   * Initialize Otter Devtools\n   * @param options\n   */\n  public static instrument(options: Partial<StylingDevtoolsServiceOptions>): ModuleWithProviders<StylingDevtoolsModule> {\n    return {\n      ngModule: StylingDevtoolsModule,\n      providers: [\n        { provide: OTTER_STYLING_DEVTOOLS_OPTIONS, useValue: { ...OTTER_STYLING_DEVTOOLS_DEFAULT_OPTIONS, ...options }, multi: false },\n        StylingDevtoolsMessageService,\n        OtterStylingDevtools\n      ]\n    };\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}