@hashicorp/design-system-components 4.24.0-rc-20251002140454 → 4.24.1-rc-20251103142501
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.
- package/declarations/components/hds/advanced-table/models/row.d.ts +3 -2
- package/declarations/components/hds/code-block/copy-button.d.ts +1 -0
- package/declarations/components/hds/code-block/index.d.ts +1 -0
- package/declarations/components/hds/copy/button/index.d.ts +4 -0
- package/declarations/components/hds/flyout/index.d.ts +1 -18
- package/declarations/components/hds/modal/index.d.ts +2 -2
- package/declarations/components/hds/theme-switcher/index.d.ts +41 -0
- package/declarations/components.d.ts +1 -0
- package/declarations/services/hds-theming.d.ts +68 -0
- package/declarations/services.d.ts +1 -0
- package/declarations/template-registry.d.ts +3 -0
- package/dist/_app_/components/hds/theme-switcher.js +1 -0
- package/dist/_app_/services/hds-theming.js +1 -0
- package/dist/components/hds/advanced-table/models/row.js +19 -15
- package/dist/components/hds/advanced-table/models/row.js.map +1 -1
- package/dist/components/hds/advanced-table/models/table.js +2 -4
- package/dist/components/hds/advanced-table/models/table.js.map +1 -1
- package/dist/components/hds/app-footer/copyright.js +1 -1
- package/dist/components/hds/code-block/copy-button.js +1 -1
- package/dist/components/hds/code-block/copy-button.js.map +1 -1
- package/dist/components/hds/code-block/index.js +1 -1
- package/dist/components/hds/code-block/index.js.map +1 -1
- package/dist/components/hds/copy/button/index.js +15 -1
- package/dist/components/hds/copy/button/index.js.map +1 -1
- package/dist/components/hds/dialog-primitive/body.js +1 -1
- package/dist/components/hds/flyout/index.js +31 -54
- package/dist/components/hds/flyout/index.js.map +1 -1
- package/dist/components/hds/modal/index.js +48 -35
- package/dist/components/hds/modal/index.js.map +1 -1
- package/dist/components/hds/theme-switcher/index.js +86 -0
- package/dist/components/hds/theme-switcher/index.js.map +1 -0
- package/dist/components.js +1 -0
- package/dist/components.js.map +1 -1
- package/dist/services/hds-theming.js +204 -0
- package/dist/services/hds-theming.js.map +1 -0
- package/dist/services.js +1 -1
- package/dist/styles/@hashicorp/design-system-components-common.css +9823 -0
- package/dist/styles/@hashicorp/design-system-components-common.css.map +1 -0
- package/dist/styles/@hashicorp/design-system-components-common.scss +20 -0
- package/dist/styles/@hashicorp/design-system-components.css +32 -18
- package/dist/styles/@hashicorp/design-system-components.css.map +1 -0
- package/dist/styles/@hashicorp/design-system-components.scss +4 -59
- package/dist/styles/@hashicorp/design-system-power-select-overrides.css +229 -0
- package/dist/styles/@hashicorp/design-system-power-select-overrides.css.map +1 -0
- package/dist/styles/components/app-footer.scss +3 -0
- package/dist/styles/components/form/file-input.scss +1 -0
- package/dist/styles/components/index.scss +52 -0
- package/package.json +9 -4
- package/translations/hds/components/app-footer/copyright/en-us.yaml +1 -1
- package/translations/hds/components/copy-button/en-us.yaml +1 -0
- package/dist/styles/@hashicorp/design-system-components.scss.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/hds/modal/index.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { assert } from '@ember/debug';\nimport { getElementId } from '../../../utils/hds-get-element-id.ts';\nimport { buildWaiter } from '@ember/test-waiters';\n\nimport type { WithBoundArgs } from '@glint/template';\nimport type { HdsModalSizes, HdsModalColors } from './types.ts';\n\nimport HdsDialogPrimitiveHeaderComponent from '../dialog-primitive/header.ts';\nimport HdsDialogPrimitiveBodyComponent from '../dialog-primitive/body.ts';\nimport HdsDialogPrimitiveFooterComponent from '../dialog-primitive/footer.ts';\nimport { HdsModalSizeValues, HdsModalColorValues } from './types.ts';\n\nconst waiter = buildWaiter('@hashicorp/design-system-components:modal');\n\nexport const DEFAULT_SIZE = HdsModalSizeValues.Medium;\nexport const DEFAULT_COLOR = HdsModalColorValues.Neutral;\n\nexport const SIZES: HdsModalSizes[] = Object.values(HdsModalSizeValues);\nexport const COLORS: HdsModalColors[] = Object.values(HdsModalColorValues);\n\nexport interface HdsModalSignature {\n Args: {\n isDismissDisabled?: boolean;\n size?: HdsModalSizes;\n color?: HdsModalColors;\n returnFocusTo?: string;\n onOpen?: () => void;\n onClose?: (event: Event) => void;\n };\n Blocks: {\n default: [\n {\n Header?: WithBoundArgs<\n typeof HdsDialogPrimitiveHeaderComponent,\n 'id' | 'onDismiss' | 'contextualClassPrefix'\n >;\n Body?: WithBoundArgs<\n typeof HdsDialogPrimitiveBodyComponent,\n 'contextualClass'\n >;\n Footer?: WithBoundArgs<\n typeof HdsDialogPrimitiveFooterComponent,\n 'onDismiss' | 'contextualClass'\n >;\n },\n ];\n };\n Element: HTMLDialogElement;\n}\n\nexport default class HdsModal extends Component<HdsModalSignature> {\n @tracked private _isOpen = false;\n private _element!: HTMLDialogElement;\n private _body!: HTMLElement;\n private _bodyInitialOverflowValue = '';\n\n get isDismissDisabled(): boolean {\n return this.args.isDismissDisabled ?? false;\n }\n\n get size(): HdsModalSizes {\n const { size = DEFAULT_SIZE } = this.args;\n\n assert(\n `@size for \"Hds::Modal\" must be one of the following: ${SIZES.join(\n ', '\n )}; received: ${size}`,\n SIZES.includes(size)\n );\n\n return size;\n }\n\n get color(): HdsModalColors {\n const { color = DEFAULT_COLOR } = this.args;\n\n assert(\n `@color for \"Hds::Modal\" must be one of the following: ${COLORS.join(\n ', '\n )}; received: ${color}`,\n COLORS.includes(color)\n );\n\n return color;\n }\n\n get id(): string {\n return getElementId(this);\n }\n\n get classNames(): string {\n const classes = ['hds-modal'];\n\n // add a class based on the @size argument\n classes.push(`hds-modal--size-${this.size}`);\n\n // add a class based on the @color argument\n classes.push(`hds-modal--color-${this.color}`);\n\n return classes.join(' ');\n }\n\n @action registerOnCloseCallback(event: Event): void {\n if (\n !this.isDismissDisabled &&\n this.args.onClose &&\n typeof this.args.onClose === 'function'\n ) {\n this.args.onClose(event);\n }\n\n // If the dismissal of the modal is disabled, we keep the modal open/visible otherwise we mark it as closed\n if (this.isDismissDisabled) {\n // If, in a chain of events, the element is not attached to the DOM, the `showModal` would fail\n // so we add this safeguard condition that checks for the `<dialog>` to have a parent\n if (this._element.parentElement) {\n // As there is no way to `preventDefault` on `close` events, we call the `showModal` function\n // preserving the state of the modal dialog\n this._element.showModal();\n }\n } else {\n this._isOpen = false;\n }\n }\n\n @action\n didInsert(element: HTMLDialogElement): void {\n // Store references of `<dialog>` and `<body>` elements\n this._element = element;\n this._body = document.body;\n\n if (this._body) {\n // Store the initial `overflow` value of `<body>` so we can reset to it\n this._bodyInitialOverflowValue =\n this._body.style.getPropertyValue('overflow');\n }\n\n // Register \"onClose\" callback function to be called when a native 'close' event is dispatched\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this._element.addEventListener('close', this.registerOnCloseCallback, true);\n\n // If the modal dialog is not already open\n if (!this._element.open) {\n this.open();\n }\n }\n\n @action\n willDestroyNode(): void {\n if (this._element) {\n this._element.removeEventListener(\n 'close',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.registerOnCloseCallback,\n true\n );\n }\n }\n\n @action\n open(): void {\n // Make modal dialog visible using the native `showModal` method\n this._element.showModal();\n this._isOpen = true;\n\n // Prevent page from scrolling when the dialog is open\n if (this._body) this._body.style.setProperty('overflow', 'hidden');\n\n // Call \"onOpen\" callback function\n if (this.args.onOpen && typeof this.args.onOpen === 'function') {\n this.args.onOpen();\n }\n }\n\n @action\n // eslint-disable-next-line @typescript-eslint/require-await\n async onDismiss(): Promise<void> {\n // allow ember test helpers to be aware of when the `close` event fires\n // when using `click` or other helpers from '@ember/test-helpers'\n // Notice: this code will get stripped out in production builds (DEBUG evaluates to `true` in dev/test builds, but `false` in prod builds)\n if (this._element.open) {\n const token = waiter.beginAsync();\n const listener = () => {\n waiter.endAsync(token);\n this._element.removeEventListener('close', listener);\n };\n this._element.addEventListener('close', listener);\n }\n\n // Make modal dialog invisible using the native `close` method\n this._element.close();\n\n // Reset page `overflow` property\n if (this._body) {\n this._body.style.removeProperty('overflow');\n if (this._bodyInitialOverflowValue === '') {\n if (this._body.style.length === 0) {\n this._body.removeAttribute('style');\n }\n } else {\n this._body.style.setProperty(\n 'overflow',\n this._bodyInitialOverflowValue\n );\n }\n }\n\n // Return focus to a specific element (if provided)\n if (this.args.returnFocusTo) {\n const initiator = document.getElementById(this.args.returnFocusTo);\n if (initiator) {\n initiator.focus();\n }\n }\n }\n}\n"],"names":["waiter","buildWaiter","DEFAULT_SIZE","HdsModalSizeValues","Medium","DEFAULT_COLOR","HdsModalColorValues","Neutral","SIZES","Object","values","COLORS","HdsModal","Component","g","prototype","tracked","i","void 0","_element","_body","_bodyInitialOverflowValue","isDismissDisabled","args","size","assert","join","includes","color","id","getElementId","classNames","classes","push","registerOnCloseCallback","event","onClose","parentElement","showModal","_isOpen","n","action","didInsert","element","document","body","style","getPropertyValue","addEventListener","open","willDestroyNode","removeEventListener","setProperty","onOpen","onDismiss","token","beginAsync","listener","endAsync","close","removeProperty","length","removeAttribute","returnFocusTo","initiator","getElementById","focus","setComponentTemplate","TEMPLATE"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/hds/modal/index.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { assert } from '@ember/debug';\nimport { getElementId } from '../../../utils/hds-get-element-id.ts';\nimport { buildWaiter } from '@ember/test-waiters';\nimport { modifier } from 'ember-modifier';\n\nimport type { WithBoundArgs } from '@glint/template';\nimport type { HdsModalSizes, HdsModalColors } from './types.ts';\n\nimport HdsDialogPrimitiveHeaderComponent from '../dialog-primitive/header.ts';\nimport HdsDialogPrimitiveBodyComponent from '../dialog-primitive/body.ts';\nimport HdsDialogPrimitiveFooterComponent from '../dialog-primitive/footer.ts';\nimport { HdsModalSizeValues, HdsModalColorValues } from './types.ts';\n\nconst waiter = buildWaiter('@hashicorp/design-system-components:modal');\n\nexport const DEFAULT_SIZE = HdsModalSizeValues.Medium;\nexport const DEFAULT_COLOR = HdsModalColorValues.Neutral;\n\nexport const SIZES: HdsModalSizes[] = Object.values(HdsModalSizeValues);\nexport const COLORS: HdsModalColors[] = Object.values(HdsModalColorValues);\n\nexport interface HdsModalSignature {\n Args: {\n isDismissDisabled?: boolean;\n size?: HdsModalSizes;\n color?: HdsModalColors;\n returnFocusTo?: string;\n onOpen?: () => void;\n onClose?: (event: Event) => void;\n };\n Blocks: {\n default: [\n {\n Header?: WithBoundArgs<\n typeof HdsDialogPrimitiveHeaderComponent,\n 'id' | 'onDismiss' | 'contextualClassPrefix'\n >;\n Body?: WithBoundArgs<\n typeof HdsDialogPrimitiveBodyComponent,\n 'contextualClass'\n >;\n Footer?: WithBoundArgs<\n typeof HdsDialogPrimitiveFooterComponent,\n 'onDismiss' | 'contextualClass'\n >;\n },\n ];\n };\n Element: HTMLDialogElement;\n}\n\nexport default class HdsModal extends Component<HdsModalSignature> {\n @tracked private _isOpen = false;\n private _element!: HTMLDialogElement;\n private _body!: HTMLElement;\n private _bodyInitialOverflowValue = '';\n private _clickOutsideToDismissHandler!: (event: MouseEvent) => void;\n\n get isDismissDisabled(): boolean {\n return this.args.isDismissDisabled ?? false;\n }\n\n get size(): HdsModalSizes {\n const { size = DEFAULT_SIZE } = this.args;\n\n assert(\n `@size for \"Hds::Modal\" must be one of the following: ${SIZES.join(\n ', '\n )}; received: ${size}`,\n SIZES.includes(size)\n );\n\n return size;\n }\n\n get color(): HdsModalColors {\n const { color = DEFAULT_COLOR } = this.args;\n\n assert(\n `@color for \"Hds::Modal\" must be one of the following: ${COLORS.join(\n ', '\n )}; received: ${color}`,\n COLORS.includes(color)\n );\n\n return color;\n }\n\n get id(): string {\n return getElementId(this);\n }\n\n get classNames(): string {\n const classes = ['hds-modal'];\n\n // add a class based on the @size argument\n classes.push(`hds-modal--size-${this.size}`);\n\n // add a class based on the @color argument\n classes.push(`hds-modal--color-${this.color}`);\n\n return classes.join(' ');\n }\n\n @action registerOnCloseCallback(event: Event): void {\n if (\n !this.isDismissDisabled &&\n this.args.onClose &&\n typeof this.args.onClose === 'function'\n ) {\n this.args.onClose(event);\n }\n\n // If the dismissal of the modal is disabled, we keep the modal open/visible otherwise we mark it as closed\n if (this.isDismissDisabled) {\n // If, in a chain of events, the element is not attached to the DOM, the `showModal` would fail\n // so we add this safeguard condition that checks for the `<dialog>` to have a parent\n if (this._element.parentElement) {\n // As there is no way to `preventDefault` on `close` events, we call the `showModal` function\n // preserving the state of the modal dialog\n this._element.showModal();\n }\n } else {\n this._isOpen = false;\n\n // Reset page `overflow` property\n if (this._body) {\n this._body.style.removeProperty('overflow');\n if (this._bodyInitialOverflowValue === '') {\n if (this._body.style.length === 0) {\n this._body.removeAttribute('style');\n }\n } else {\n this._body.style.setProperty(\n 'overflow',\n this._bodyInitialOverflowValue\n );\n }\n }\n\n // Return focus to a specific element (if provided)\n if (this.args.returnFocusTo) {\n const initiator = document.getElementById(this.args.returnFocusTo);\n if (initiator) {\n initiator.focus();\n }\n }\n }\n }\n\n private _registerDialog = modifier((element: HTMLDialogElement) => {\n // Store references of `<dialog>` and `<body>` elements\n this._element = element;\n this._body = document.body;\n\n if (this._body) {\n // Store the initial `overflow` value of `<body>` so we can reset to it\n this._bodyInitialOverflowValue =\n this._body.style.getPropertyValue('overflow');\n }\n\n // Register \"onClose\" callback function to be called when a native 'close' event is dispatched\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this._element.addEventListener('close', this.registerOnCloseCallback, true);\n\n // If the modal dialog is not already open\n if (!this._element.open) {\n this.open();\n }\n\n // Note: because the Modal has the `@isDismissedDisabled` argument, we need to add our own click outside to dismiss logic. This is because `ember-focus-trap` treats the `focusTrapOptions` as static, so we can't update it dynamically if `@isDismissDisabled` changes.\n this._clickOutsideToDismissHandler = (event: MouseEvent) => {\n // check if the click is outside the modal and the modal is open\n if (!this._element.contains(event.target as Node) && this._isOpen) {\n if (!this.isDismissDisabled) {\n // here we use `void` because `onDismiss` is an async function, but in reality we don't need to handle the result or wait for its completion\n void this.onDismiss();\n }\n }\n };\n\n document.addEventListener('click', this._clickOutsideToDismissHandler, {\n capture: true,\n passive: false,\n });\n\n return () => {\n // if the <dialog> is removed from the dom while open we emulate the close event\n if (this._isOpen) {\n this._element?.dispatchEvent(new Event('close'));\n }\n\n this._element?.removeEventListener(\n 'close',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.registerOnCloseCallback,\n true\n );\n\n document.removeEventListener(\n 'click',\n this._clickOutsideToDismissHandler,\n true\n );\n };\n });\n\n @action\n open(): void {\n // Make modal dialog visible using the native `showModal` method\n this._element.showModal();\n this._isOpen = true;\n\n // Prevent page from scrolling when the dialog is open\n if (this._body) this._body.style.setProperty('overflow', 'hidden');\n\n // Call \"onOpen\" callback function\n if (this.args.onOpen && typeof this.args.onOpen === 'function') {\n this.args.onOpen();\n }\n }\n\n @action\n // eslint-disable-next-line @typescript-eslint/require-await\n async onDismiss(): Promise<void> {\n // allow ember test helpers to be aware of when the `close` event fires\n // when using `click` or other helpers from '@ember/test-helpers'\n if (this._element.open) {\n const token = waiter.beginAsync();\n const listener = () => {\n waiter.endAsync(token);\n this._element.removeEventListener('close', listener);\n };\n this._element.addEventListener('close', listener);\n }\n\n // Make modal dialog invisible using the native `close` method\n this._element.close();\n }\n}\n"],"names":["waiter","buildWaiter","DEFAULT_SIZE","HdsModalSizeValues","Medium","DEFAULT_COLOR","HdsModalColorValues","Neutral","SIZES","Object","values","COLORS","HdsModal","Component","g","prototype","tracked","i","void 0","_element","_body","_bodyInitialOverflowValue","_clickOutsideToDismissHandler","isDismissDisabled","args","size","assert","join","includes","color","id","getElementId","classNames","classes","push","registerOnCloseCallback","event","onClose","parentElement","showModal","_isOpen","style","removeProperty","length","removeAttribute","setProperty","returnFocusTo","initiator","document","getElementById","focus","n","action","_registerDialog","modifier","element","body","getPropertyValue","addEventListener","open","contains","target","onDismiss","capture","passive","dispatchEvent","Event","removeEventListener","onOpen","token","beginAsync","listener","endAsync","close","setComponentTemplate","TEMPLATE"],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import Component from '@glimmer/component';
|
|
2
|
+
import { inject } from '@ember/service';
|
|
3
|
+
import { action } from '@ember/object';
|
|
4
|
+
import { precompileTemplate } from '@ember/template-compilation';
|
|
5
|
+
import { g, i, n } from 'decorator-transforms/runtime';
|
|
6
|
+
import { setComponentTemplate } from '@ember/component';
|
|
7
|
+
|
|
8
|
+
var TEMPLATE = precompileTemplate("{{!\n Copyright (c) HashiCorp, Inc.\n SPDX-License-Identifier: MPL-2.0\n}}\n\n{{!\n ------------------------------------------------------------------------------------------\n IMPORTANT: this is a temporary implementation, while we wait for the design specifications\n ------------------------------------------------------------------------------------------\n}}\n\n<Hds::Dropdown\n @enableCollisionDetection={{true}}\n @matchToggleWidth={{@toggleIsFullWidth}}\n class=\"hds-theme-switcher-control\"\n ...attributes\n as |D|\n>\n <D.ToggleButton\n @color=\"secondary\"\n @size={{this.toggleSize}}\n @isFullWidth={{this.toggleIsFullWidth}}\n @text={{this.toggleContent.label}}\n @icon={{this.toggleContent.icon}}\n />\n {{#each-in this._options as |key data|}}\n <D.Interactive @icon={{data.icon}} {{on \"click\" (fn this.onSelectTheme data.theme)}}>{{data.label}}</D.Interactive>\n {{/each-in}}\n</Hds::Dropdown>");
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Copyright (c) HashiCorp, Inc.
|
|
12
|
+
* SPDX-License-Identifier: MPL-2.0
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
const OPTIONS = {
|
|
16
|
+
system: {
|
|
17
|
+
theme: 'system',
|
|
18
|
+
icon: 'monitor',
|
|
19
|
+
label: 'System'
|
|
20
|
+
},
|
|
21
|
+
light: {
|
|
22
|
+
theme: 'light',
|
|
23
|
+
icon: 'sun',
|
|
24
|
+
label: 'Light'
|
|
25
|
+
},
|
|
26
|
+
dark: {
|
|
27
|
+
theme: 'dark',
|
|
28
|
+
icon: 'moon',
|
|
29
|
+
label: 'Dark'
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
class HdsThemeSwitcher extends Component {
|
|
33
|
+
static {
|
|
34
|
+
g(this.prototype, "hdsTheming", [inject]);
|
|
35
|
+
}
|
|
36
|
+
#hdsTheming = (i(this, "hdsTheming"), void 0);
|
|
37
|
+
get toggleSize() {
|
|
38
|
+
return this.args.toggleSize ?? 'small';
|
|
39
|
+
}
|
|
40
|
+
get toggleIsFullWidth() {
|
|
41
|
+
return this.args.toggleIsFullWidth ?? false;
|
|
42
|
+
}
|
|
43
|
+
get toggleContent() {
|
|
44
|
+
if (this.currentTheme === 'system' && this.hasSystemOption || this.currentTheme === 'light' || this.currentTheme === 'dark') {
|
|
45
|
+
return {
|
|
46
|
+
label: OPTIONS[this.currentTheme].label,
|
|
47
|
+
icon: OPTIONS[this.currentTheme].icon
|
|
48
|
+
};
|
|
49
|
+
} else {
|
|
50
|
+
return {
|
|
51
|
+
label: 'Theme',
|
|
52
|
+
icon: undefined
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
get hasSystemOption() {
|
|
57
|
+
return this.args.hasSystemOption ?? true;
|
|
58
|
+
}
|
|
59
|
+
get _options() {
|
|
60
|
+
const options = {
|
|
61
|
+
...OPTIONS
|
|
62
|
+
};
|
|
63
|
+
if (!this.hasSystemOption) {
|
|
64
|
+
delete options.system;
|
|
65
|
+
}
|
|
66
|
+
return options;
|
|
67
|
+
}
|
|
68
|
+
get currentTheme() {
|
|
69
|
+
// we get the theme from the global service
|
|
70
|
+
return this.hdsTheming.currentTheme;
|
|
71
|
+
}
|
|
72
|
+
onSelectTheme(theme) {
|
|
73
|
+
// we set the theme in the global service (and provide an optional user-defined callback)
|
|
74
|
+
this.hdsTheming.setTheme({
|
|
75
|
+
theme,
|
|
76
|
+
onSetTheme: this.args.onSetTheme
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
static {
|
|
80
|
+
n(this.prototype, "onSelectTheme", [action]);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
setComponentTemplate(TEMPLATE, HdsThemeSwitcher);
|
|
84
|
+
|
|
85
|
+
export { HdsThemeSwitcher as default };
|
|
86
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/hds/theme-switcher/index.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\n// ------------------------------------------------------------------------------------------\n// IMPORTANT: this is a temporary implementation, while we wait for the design specifications\n// ------------------------------------------------------------------------------------------\n\nimport Component from '@glimmer/component';\nimport { inject as service } from '@ember/service';\nimport { action } from '@ember/object';\n\nimport type { HdsDropdownSignature } from '../dropdown/index.ts';\nimport type { HdsDropdownToggleButtonSignature } from '../dropdown/toggle/button.ts';\nimport type { HdsIconSignature } from '../icon/index.ts';\nimport type HdsThemingService from '../../../services/hds-theming.ts';\nimport type {\n HdsThemes,\n OnSetThemeCallback,\n} from '../../../services/hds-theming.ts';\n\ninterface ThemeOption {\n theme: HdsThemes | undefined;\n icon: HdsIconSignature['Args']['name'];\n label: string;\n}\n\nconst OPTIONS: Record<HdsThemes, ThemeOption> = {\n system: { theme: 'system', icon: 'monitor', label: 'System' },\n light: { theme: 'light', icon: 'sun', label: 'Light' },\n dark: { theme: 'dark', icon: 'moon', label: 'Dark' },\n};\n\ninterface HdsThemeSwitcherSignature {\n Args: {\n toggleSize?: HdsDropdownToggleButtonSignature['Args']['size'];\n toggleIsFullWidth?: HdsDropdownToggleButtonSignature['Args']['isFullWidth'];\n hasSystemOption?: boolean;\n onSetTheme?: OnSetThemeCallback;\n };\n Element: HdsDropdownSignature['Element'];\n}\n\nexport default class HdsThemeSwitcher extends Component<HdsThemeSwitcherSignature> {\n @service declare readonly hdsTheming: HdsThemingService;\n\n get toggleSize() {\n return this.args.toggleSize ?? 'small';\n }\n\n get toggleIsFullWidth() {\n return this.args.toggleIsFullWidth ?? false;\n }\n\n get toggleContent() {\n if (\n (this.currentTheme === 'system' && this.hasSystemOption) ||\n this.currentTheme === 'light' ||\n this.currentTheme === 'dark'\n ) {\n return {\n label: OPTIONS[this.currentTheme].label,\n icon: OPTIONS[this.currentTheme].icon,\n };\n } else {\n return { label: 'Theme', icon: undefined };\n }\n }\n\n get hasSystemOption() {\n return this.args.hasSystemOption ?? true;\n }\n\n get _options() {\n const options: Partial<typeof OPTIONS> = { ...OPTIONS };\n\n if (!this.hasSystemOption) {\n delete options.system;\n }\n\n return options;\n }\n\n get currentTheme() {\n // we get the theme from the global service\n return this.hdsTheming.currentTheme;\n }\n\n @action\n onSelectTheme(theme: HdsThemes | undefined): void {\n // we set the theme in the global service (and provide an optional user-defined callback)\n this.hdsTheming.setTheme({ theme, onSetTheme: this.args.onSetTheme });\n }\n}\n"],"names":["OPTIONS","system","theme","icon","label","light","dark","HdsThemeSwitcher","Component","g","prototype","service","i","void 0","toggleSize","args","toggleIsFullWidth","toggleContent","currentTheme","hasSystemOption","undefined","_options","options","hdsTheming","onSelectTheme","setTheme","onSetTheme","n","action","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;;AAyBA,MAAMA,OAAuC,GAAG;AAC9CC,EAAAA,MAAM,EAAE;AAAEC,IAAAA,KAAK,EAAE,QAAQ;AAAEC,IAAAA,IAAI,EAAE,SAAS;AAAEC,IAAAA,KAAK,EAAE;GAAU;AAC7DC,EAAAA,KAAK,EAAE;AAAEH,IAAAA,KAAK,EAAE,OAAO;AAAEC,IAAAA,IAAI,EAAE,KAAK;AAAEC,IAAAA,KAAK,EAAE;GAAS;AACtDE,EAAAA,IAAI,EAAE;AAAEJ,IAAAA,KAAK,EAAE,MAAM;AAAEC,IAAAA,IAAI,EAAE,MAAM;AAAEC,IAAAA,KAAK,EAAE;AAAO;AACrD,CAAC;AAYc,MAAMG,gBAAgB,SAASC,SAAS,CAA4B;AAAA,EAAA;IAAAC,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,YAAA,EAAA,CAChFC,MAAO,CAAA,CAAA;AAAA;AAAA,EAAA,WAAA,IAAAC,CAAA,CAAA,IAAA,EAAA,YAAA,CAAA,EAAAC,MAAA;EAER,IAAIC,UAAUA,GAAG;AACf,IAAA,OAAO,IAAI,CAACC,IAAI,CAACD,UAAU,IAAI,OAAO;AACxC,EAAA;EAEA,IAAIE,iBAAiBA,GAAG;AACtB,IAAA,OAAO,IAAI,CAACD,IAAI,CAACC,iBAAiB,IAAI,KAAK;AAC7C,EAAA;EAEA,IAAIC,aAAaA,GAAG;IAClB,IACG,IAAI,CAACC,YAAY,KAAK,QAAQ,IAAI,IAAI,CAACC,eAAe,IACvD,IAAI,CAACD,YAAY,KAAK,OAAO,IAC7B,IAAI,CAACA,YAAY,KAAK,MAAM,EAC5B;MACA,OAAO;QACLd,KAAK,EAAEJ,OAAO,CAAC,IAAI,CAACkB,YAAY,CAAC,CAACd,KAAK;AACvCD,QAAAA,IAAI,EAAEH,OAAO,CAAC,IAAI,CAACkB,YAAY,CAAC,CAACf;OAClC;AACH,IAAA,CAAC,MAAM;MACL,OAAO;AAAEC,QAAAA,KAAK,EAAE,OAAO;AAAED,QAAAA,IAAI,EAAEiB;OAAW;AAC5C,IAAA;AACF,EAAA;EAEA,IAAID,eAAeA,GAAG;AACpB,IAAA,OAAO,IAAI,CAACJ,IAAI,CAACI,eAAe,IAAI,IAAI;AAC1C,EAAA;EAEA,IAAIE,QAAQA,GAAG;AACb,IAAA,MAAMC,OAAgC,GAAG;MAAE,GAAGtB;KAAS;AAEvD,IAAA,IAAI,CAAC,IAAI,CAACmB,eAAe,EAAE;MACzB,OAAOG,OAAO,CAACrB,MAAM;AACvB,IAAA;AAEA,IAAA,OAAOqB,OAAO;AAChB,EAAA;EAEA,IAAIJ,YAAYA,GAAG;AACjB;AACA,IAAA,OAAO,IAAI,CAACK,UAAU,CAACL,YAAY;AACrC,EAAA;EAGAM,aAAaA,CAACtB,KAA4B,EAAQ;AAChD;AACA,IAAA,IAAI,CAACqB,UAAU,CAACE,QAAQ,CAAC;MAAEvB,KAAK;AAAEwB,MAAAA,UAAU,EAAE,IAAI,CAACX,IAAI,CAACW;AAAW,KAAC,CAAC;AACvE,EAAA;AAAC,EAAA;IAAAC,CAAA,CAAA,IAAA,CAAAjB,SAAA,EAAA,eAAA,EAAA,CAJAkB,MAAM,CAAA,CAAA;AAAA;AAKT;AAACC,oBAAA,CAAAC,QAAA,EAlDoBvB,gBAAgB,CAAA;;;;"}
|
package/dist/components.js
CHANGED
|
@@ -219,6 +219,7 @@ export { default as HdsTextBody } from './components/hds/text/body.js';
|
|
|
219
219
|
export { default as HdsTextCode } from './components/hds/text/code.js';
|
|
220
220
|
export { default as HdsTextDisplay } from './components/hds/text/display.js';
|
|
221
221
|
export { HdsTextAlignValues, HdsTextColorValues, HdsTextGroupValues, HdsTextSizeValues, HdsTextWeightValues } from './components/hds/text/types.js';
|
|
222
|
+
export { default as HdsThemeSwitcher } from './components/hds/theme-switcher/index.js';
|
|
222
223
|
export { default as HdsTime } from './components/hds/time/index.js';
|
|
223
224
|
export { default as HdsTimeSingle } from './components/hds/time/single.js';
|
|
224
225
|
export { default as HdsTimeRange } from './components/hds/time/range.js';
|
package/dist/components.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"components.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import Service from '@ember/service';
|
|
2
|
+
import { tracked } from '@glimmer/tracking';
|
|
3
|
+
import { g, i } from 'decorator-transforms/runtime';
|
|
4
|
+
|
|
5
|
+
let HdsThemeValues = /*#__PURE__*/function (HdsThemeValues) {
|
|
6
|
+
// system settings (prefers-color-scheme)
|
|
7
|
+
HdsThemeValues["System"] = "system";
|
|
8
|
+
// user settings for dark/light
|
|
9
|
+
HdsThemeValues["Light"] = "light";
|
|
10
|
+
HdsThemeValues["Dark"] = "dark";
|
|
11
|
+
return HdsThemeValues;
|
|
12
|
+
}({});
|
|
13
|
+
var HdsModesBaseValues = /*#__PURE__*/function (HdsModesBaseValues) {
|
|
14
|
+
HdsModesBaseValues["Hds"] = "hds"; // TODO understand if it should be `default`
|
|
15
|
+
return HdsModesBaseValues;
|
|
16
|
+
}(HdsModesBaseValues || {});
|
|
17
|
+
var HdsModesLightValues = /*#__PURE__*/function (HdsModesLightValues) {
|
|
18
|
+
HdsModesLightValues["CdsG0"] = "cds-g0";
|
|
19
|
+
HdsModesLightValues["CdsG10"] = "cds-g10";
|
|
20
|
+
return HdsModesLightValues;
|
|
21
|
+
}(HdsModesLightValues || {});
|
|
22
|
+
var HdsModesDarkValues = /*#__PURE__*/function (HdsModesDarkValues) {
|
|
23
|
+
HdsModesDarkValues["CdsG90"] = "cds-g90";
|
|
24
|
+
HdsModesDarkValues["CdsG100"] = "cds-g100";
|
|
25
|
+
return HdsModesDarkValues;
|
|
26
|
+
}(HdsModesDarkValues || {});
|
|
27
|
+
let HdsCssSelectorsValues = /*#__PURE__*/function (HdsCssSelectorsValues) {
|
|
28
|
+
HdsCssSelectorsValues["Data"] = "data";
|
|
29
|
+
HdsCssSelectorsValues["Class"] = "class";
|
|
30
|
+
return HdsCssSelectorsValues;
|
|
31
|
+
}({});
|
|
32
|
+
const THEMES = Object.values(HdsThemeValues);
|
|
33
|
+
const MODES_LIGHT = Object.values(HdsModesLightValues);
|
|
34
|
+
const MODES_DARK = Object.values(HdsModesDarkValues);
|
|
35
|
+
const MODES = [...Object.values(HdsModesBaseValues), ...MODES_LIGHT, ...MODES_DARK];
|
|
36
|
+
const HDS_THEMING_DATA_SELECTOR = 'data-hds-theme';
|
|
37
|
+
const HDS_THEMING_CLASS_SELECTOR_PREFIX = 'hds-theme';
|
|
38
|
+
const HDS_THEMING_CLASS_SELECTORS_LIST = [...MODES_LIGHT, ...MODES_DARK].map(mode => `${HDS_THEMING_CLASS_SELECTOR_PREFIX}-${mode}`);
|
|
39
|
+
const HDS_THEMING_LOCALSTORAGE_DATA = 'hds-theming-data';
|
|
40
|
+
const DEFAULT_THEMING_OPTION_LIGHT_THEME = HdsModesLightValues.CdsG0;
|
|
41
|
+
const DEFAULT_THEMING_OPTION_DARK_THEME = HdsModesDarkValues.CdsG100;
|
|
42
|
+
const DEFAULT_THEMING_OPTION_CSS_SELECTOR = 'data';
|
|
43
|
+
class HdsThemingService extends Service {
|
|
44
|
+
static {
|
|
45
|
+
g(this.prototype, "_currentTheme", [tracked], function () {
|
|
46
|
+
return undefined;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
#_currentTheme = (i(this, "_currentTheme"), void 0);
|
|
50
|
+
static {
|
|
51
|
+
g(this.prototype, "_currentMode", [tracked], function () {
|
|
52
|
+
return undefined;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
#_currentMode = (i(this, "_currentMode"), void 0);
|
|
56
|
+
static {
|
|
57
|
+
g(this.prototype, "_currentLightTheme", [tracked], function () {
|
|
58
|
+
return DEFAULT_THEMING_OPTION_LIGHT_THEME;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
#_currentLightTheme = (i(this, "_currentLightTheme"), void 0);
|
|
62
|
+
static {
|
|
63
|
+
g(this.prototype, "_currentDarkTheme", [tracked], function () {
|
|
64
|
+
return DEFAULT_THEMING_OPTION_DARK_THEME;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
#_currentDarkTheme = (i(this, "_currentDarkTheme"), void 0);
|
|
68
|
+
static {
|
|
69
|
+
g(this.prototype, "_currentCssSelector", [tracked], function () {
|
|
70
|
+
return DEFAULT_THEMING_OPTION_CSS_SELECTOR;
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
#_currentCssSelector = (i(this, "_currentCssSelector"), void 0);
|
|
74
|
+
static {
|
|
75
|
+
g(this.prototype, "globalOnSetTheme", [tracked]);
|
|
76
|
+
}
|
|
77
|
+
#globalOnSetTheme = (i(this, "globalOnSetTheme"), void 0);
|
|
78
|
+
initializeTheme() {
|
|
79
|
+
const rawStoredThemingData = localStorage.getItem(HDS_THEMING_LOCALSTORAGE_DATA);
|
|
80
|
+
if (rawStoredThemingData !== null) {
|
|
81
|
+
const storedThemingData = JSON.parse(rawStoredThemingData);
|
|
82
|
+
if (storedThemingData) {
|
|
83
|
+
const {
|
|
84
|
+
theme,
|
|
85
|
+
options
|
|
86
|
+
} = storedThemingData;
|
|
87
|
+
this.setTheme({
|
|
88
|
+
theme,
|
|
89
|
+
options
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
setTheme({
|
|
95
|
+
theme,
|
|
96
|
+
options,
|
|
97
|
+
onSetTheme
|
|
98
|
+
}) {
|
|
99
|
+
if (options !== undefined) {
|
|
100
|
+
// if we have new options, we override the current ones (`lightTheme` / `darkTheme` / `cssSelector`)
|
|
101
|
+
// these options can be used by consumers that want to customize how they apply theming
|
|
102
|
+
// (and used by the showcase for the custom theming / theme switching logic)
|
|
103
|
+
if (Object.hasOwn(options, 'lightTheme') && Object.hasOwn(options, 'darkTheme') && Object.hasOwn(options, 'cssSelector')) {
|
|
104
|
+
const {
|
|
105
|
+
lightTheme,
|
|
106
|
+
darkTheme,
|
|
107
|
+
cssSelector
|
|
108
|
+
} = options;
|
|
109
|
+
this._currentLightTheme = lightTheme;
|
|
110
|
+
this._currentDarkTheme = darkTheme;
|
|
111
|
+
this._currentCssSelector = cssSelector;
|
|
112
|
+
} else {
|
|
113
|
+
// fallback if something goes wrong
|
|
114
|
+
this._currentLightTheme = DEFAULT_THEMING_OPTION_LIGHT_THEME;
|
|
115
|
+
this._currentDarkTheme = DEFAULT_THEMING_OPTION_DARK_THEME;
|
|
116
|
+
this._currentCssSelector = DEFAULT_THEMING_OPTION_CSS_SELECTOR;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// set the current theme/mode (`currentTheme` / `currentMode`)
|
|
121
|
+
if (theme === undefined ||
|
|
122
|
+
// standard (no theming)
|
|
123
|
+
!THEMES.includes(theme) // handle possible errors
|
|
124
|
+
) {
|
|
125
|
+
this._currentTheme = undefined;
|
|
126
|
+
this._currentMode = undefined;
|
|
127
|
+
} else if (theme === HdsThemeValues.System // system (prefers-color-scheme)
|
|
128
|
+
) {
|
|
129
|
+
this._currentTheme = HdsThemeValues.System;
|
|
130
|
+
this._currentMode = undefined;
|
|
131
|
+
} else {
|
|
132
|
+
this._currentTheme = theme;
|
|
133
|
+
if (this._currentTheme === HdsThemeValues.Light) {
|
|
134
|
+
this._currentMode = this._currentLightTheme;
|
|
135
|
+
}
|
|
136
|
+
if (this._currentTheme === HdsThemeValues.Dark) {
|
|
137
|
+
this._currentMode = this._currentDarkTheme;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// IMPORTANT: for this to work, it needs to be the HTML tag (it's the `:root` in CSS)
|
|
142
|
+
const rootElement = document.querySelector('html');
|
|
143
|
+
if (!rootElement) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
// remove or update the CSS selectors applied to the root element (depending on the `theme` argument)
|
|
147
|
+
rootElement.removeAttribute(HDS_THEMING_DATA_SELECTOR);
|
|
148
|
+
rootElement.classList.remove(...HDS_THEMING_CLASS_SELECTORS_LIST);
|
|
149
|
+
if (this._currentMode !== undefined) {
|
|
150
|
+
if (this._currentCssSelector === 'data') {
|
|
151
|
+
rootElement.setAttribute(HDS_THEMING_DATA_SELECTOR, this._currentMode);
|
|
152
|
+
} else if (this._currentCssSelector === 'class') {
|
|
153
|
+
rootElement.classList.add(`${HDS_THEMING_CLASS_SELECTOR_PREFIX}-${this._currentMode}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// store the current theme and theming options in local storage (unless undefined)
|
|
158
|
+
localStorage.setItem(HDS_THEMING_LOCALSTORAGE_DATA, JSON.stringify({
|
|
159
|
+
theme: this._currentTheme,
|
|
160
|
+
options: {
|
|
161
|
+
lightTheme: this._currentLightTheme,
|
|
162
|
+
darkTheme: this._currentDarkTheme,
|
|
163
|
+
cssSelector: this._currentCssSelector
|
|
164
|
+
}
|
|
165
|
+
}));
|
|
166
|
+
|
|
167
|
+
// this is a general callback that can be defined globally (by extending the service)
|
|
168
|
+
if (this.globalOnSetTheme) {
|
|
169
|
+
this.globalOnSetTheme({
|
|
170
|
+
currentTheme: this._currentTheme,
|
|
171
|
+
currentMode: this._currentMode
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// this is a "local" callback that can be defined "locally" (eg. in a theme switcher)
|
|
176
|
+
if (onSetTheme) {
|
|
177
|
+
onSetTheme({
|
|
178
|
+
currentTheme: this._currentTheme,
|
|
179
|
+
currentMode: this._currentMode
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// getters used for reactivity in the components/services using this service
|
|
185
|
+
|
|
186
|
+
get currentTheme() {
|
|
187
|
+
return this._currentTheme;
|
|
188
|
+
}
|
|
189
|
+
get currentMode() {
|
|
190
|
+
return this._currentMode;
|
|
191
|
+
}
|
|
192
|
+
get currentLightTheme() {
|
|
193
|
+
return this._currentLightTheme ?? DEFAULT_THEMING_OPTION_LIGHT_THEME;
|
|
194
|
+
}
|
|
195
|
+
get currentDarkTheme() {
|
|
196
|
+
return this._currentDarkTheme ?? DEFAULT_THEMING_OPTION_DARK_THEME;
|
|
197
|
+
}
|
|
198
|
+
get currentCssSelector() {
|
|
199
|
+
return this._currentCssSelector ?? DEFAULT_THEMING_OPTION_CSS_SELECTOR;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export { DEFAULT_THEMING_OPTION_CSS_SELECTOR, DEFAULT_THEMING_OPTION_DARK_THEME, DEFAULT_THEMING_OPTION_LIGHT_THEME, HDS_THEMING_CLASS_SELECTORS_LIST, HDS_THEMING_CLASS_SELECTOR_PREFIX, HDS_THEMING_DATA_SELECTOR, HDS_THEMING_LOCALSTORAGE_DATA, HdsCssSelectorsValues, HdsThemeValues, MODES, MODES_DARK, MODES_LIGHT, THEMES, HdsThemingService as default };
|
|
204
|
+
//# sourceMappingURL=hds-theming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hds-theming.js","sources":["../../src/services/hds-theming.ts"],"sourcesContent":["import Service from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\n\nexport enum HdsThemeValues {\n // system settings (prefers-color-scheme)\n System = 'system',\n // user settings for dark/light\n Light = 'light',\n Dark = 'dark',\n}\n\nenum HdsModesBaseValues {\n Hds = 'hds', // TODO understand if it should be `default`\n}\n\nenum HdsModesLightValues {\n CdsG0 = 'cds-g0',\n CdsG10 = 'cds-g10',\n}\n\nenum HdsModesDarkValues {\n CdsG90 = 'cds-g90',\n CdsG100 = 'cds-g100',\n}\n\nexport enum HdsCssSelectorsValues {\n Data = 'data',\n Class = 'class',\n}\n\nexport type HdsThemes = `${HdsThemeValues}`;\nexport type HdsModes =\n | `${HdsModesBaseValues}`\n | `${HdsModesLightValues}`\n | `${HdsModesDarkValues}`;\nexport type HdsModesLight = `${HdsModesLightValues}`;\nexport type HdsModesDark = `${HdsModesDarkValues}`;\nexport type HdsCssSelectors = `${HdsCssSelectorsValues}`;\n\ntype HdsThemingOptions = {\n lightTheme: HdsModesLight;\n darkTheme: HdsModesDark;\n cssSelector: HdsCssSelectors;\n};\n\ntype SetThemeArgs = {\n theme: HdsThemes | undefined;\n options?: HdsThemingOptions;\n onSetTheme?: OnSetThemeCallback;\n};\n\nexport type OnSetThemeCallbackArgs = {\n currentTheme: HdsThemes | undefined;\n currentMode: HdsModes | undefined;\n};\n\nexport type OnSetThemeCallback = (args: OnSetThemeCallbackArgs) => void;\n\nexport const THEMES: HdsThemes[] = Object.values(HdsThemeValues);\nexport const MODES_LIGHT: HdsModesLight[] = Object.values(HdsModesLightValues);\nexport const MODES_DARK: HdsModesDark[] = Object.values(HdsModesDarkValues);\nexport const MODES: HdsModes[] = [\n ...Object.values(HdsModesBaseValues),\n ...MODES_LIGHT,\n ...MODES_DARK,\n];\n\nexport const HDS_THEMING_DATA_SELECTOR = 'data-hds-theme';\nexport const HDS_THEMING_CLASS_SELECTOR_PREFIX = 'hds-theme';\nexport const HDS_THEMING_CLASS_SELECTORS_LIST = [\n ...MODES_LIGHT,\n ...MODES_DARK,\n].map((mode) => `${HDS_THEMING_CLASS_SELECTOR_PREFIX}-${mode}`);\n\nexport const HDS_THEMING_LOCALSTORAGE_DATA = 'hds-theming-data';\n\nexport const DEFAULT_THEMING_OPTION_LIGHT_THEME = HdsModesLightValues.CdsG0;\nexport const DEFAULT_THEMING_OPTION_DARK_THEME = HdsModesDarkValues.CdsG100;\nexport const DEFAULT_THEMING_OPTION_CSS_SELECTOR = 'data';\n\nexport default class HdsThemingService extends Service {\n @tracked _currentTheme: HdsThemes | undefined = undefined;\n @tracked _currentMode: HdsModes | undefined = undefined;\n @tracked _currentLightTheme: HdsModesLight =\n DEFAULT_THEMING_OPTION_LIGHT_THEME;\n @tracked _currentDarkTheme: HdsModesDark = DEFAULT_THEMING_OPTION_DARK_THEME;\n @tracked _currentCssSelector: HdsCssSelectors =\n DEFAULT_THEMING_OPTION_CSS_SELECTOR;\n @tracked globalOnSetTheme: OnSetThemeCallback | undefined;\n\n initializeTheme() {\n const rawStoredThemingData = localStorage.getItem(\n HDS_THEMING_LOCALSTORAGE_DATA\n );\n if (rawStoredThemingData !== null) {\n const storedThemingData: unknown = JSON.parse(rawStoredThemingData);\n if (storedThemingData) {\n const { theme, options } = storedThemingData as {\n theme: HdsThemes | undefined;\n options: HdsThemingOptions;\n };\n this.setTheme({\n theme,\n options,\n });\n }\n }\n }\n\n setTheme({ theme, options, onSetTheme }: SetThemeArgs) {\n if (options !== undefined) {\n // if we have new options, we override the current ones (`lightTheme` / `darkTheme` / `cssSelector`)\n // these options can be used by consumers that want to customize how they apply theming\n // (and used by the showcase for the custom theming / theme switching logic)\n if (\n Object.hasOwn(options, 'lightTheme') &&\n Object.hasOwn(options, 'darkTheme') &&\n Object.hasOwn(options, 'cssSelector')\n ) {\n const { lightTheme, darkTheme, cssSelector } = options;\n\n this._currentLightTheme = lightTheme;\n this._currentDarkTheme = darkTheme;\n this._currentCssSelector = cssSelector;\n } else {\n // fallback if something goes wrong\n this._currentLightTheme = DEFAULT_THEMING_OPTION_LIGHT_THEME;\n this._currentDarkTheme = DEFAULT_THEMING_OPTION_DARK_THEME;\n this._currentCssSelector = DEFAULT_THEMING_OPTION_CSS_SELECTOR;\n }\n }\n\n // set the current theme/mode (`currentTheme` / `currentMode`)\n if (\n theme === undefined || // standard (no theming)\n !THEMES.includes(theme) // handle possible errors\n ) {\n this._currentTheme = undefined;\n this._currentMode = undefined;\n } else if (\n theme === HdsThemeValues.System // system (prefers-color-scheme)\n ) {\n this._currentTheme = HdsThemeValues.System;\n this._currentMode = undefined;\n } else {\n this._currentTheme = theme;\n if (this._currentTheme === HdsThemeValues.Light) {\n this._currentMode = this._currentLightTheme;\n }\n if (this._currentTheme === HdsThemeValues.Dark) {\n this._currentMode = this._currentDarkTheme;\n }\n }\n\n // IMPORTANT: for this to work, it needs to be the HTML tag (it's the `:root` in CSS)\n const rootElement = document.querySelector('html');\n\n if (!rootElement) {\n return;\n }\n // remove or update the CSS selectors applied to the root element (depending on the `theme` argument)\n rootElement.removeAttribute(HDS_THEMING_DATA_SELECTOR);\n rootElement.classList.remove(...HDS_THEMING_CLASS_SELECTORS_LIST);\n if (this._currentMode !== undefined) {\n if (this._currentCssSelector === 'data') {\n rootElement.setAttribute(HDS_THEMING_DATA_SELECTOR, this._currentMode);\n } else if (this._currentCssSelector === 'class') {\n rootElement.classList.add(\n `${HDS_THEMING_CLASS_SELECTOR_PREFIX}-${this._currentMode}`\n );\n }\n }\n\n // store the current theme and theming options in local storage (unless undefined)\n localStorage.setItem(\n HDS_THEMING_LOCALSTORAGE_DATA,\n JSON.stringify({\n theme: this._currentTheme,\n options: {\n lightTheme: this._currentLightTheme,\n darkTheme: this._currentDarkTheme,\n cssSelector: this._currentCssSelector,\n },\n })\n );\n\n // this is a general callback that can be defined globally (by extending the service)\n if (this.globalOnSetTheme) {\n this.globalOnSetTheme({\n currentTheme: this._currentTheme,\n currentMode: this._currentMode,\n });\n }\n\n // this is a \"local\" callback that can be defined \"locally\" (eg. in a theme switcher)\n if (onSetTheme) {\n onSetTheme({\n currentTheme: this._currentTheme,\n currentMode: this._currentMode,\n });\n }\n }\n\n // getters used for reactivity in the components/services using this service\n\n get currentTheme(): HdsThemes | undefined {\n return this._currentTheme;\n }\n\n get currentMode(): HdsModes | undefined {\n return this._currentMode;\n }\n\n get currentLightTheme(): HdsModesLight {\n return this._currentLightTheme ?? DEFAULT_THEMING_OPTION_LIGHT_THEME;\n }\n\n get currentDarkTheme(): HdsModesDark {\n return this._currentDarkTheme ?? DEFAULT_THEMING_OPTION_DARK_THEME;\n }\n\n get currentCssSelector(): HdsCssSelectors {\n return this._currentCssSelector ?? DEFAULT_THEMING_OPTION_CSS_SELECTOR;\n }\n}\n"],"names":["HdsThemeValues","HdsModesBaseValues","HdsModesLightValues","HdsModesDarkValues","HdsCssSelectorsValues","THEMES","Object","values","MODES_LIGHT","MODES_DARK","MODES","HDS_THEMING_DATA_SELECTOR","HDS_THEMING_CLASS_SELECTOR_PREFIX","HDS_THEMING_CLASS_SELECTORS_LIST","map","mode","HDS_THEMING_LOCALSTORAGE_DATA","DEFAULT_THEMING_OPTION_LIGHT_THEME","CdsG0","DEFAULT_THEMING_OPTION_DARK_THEME","CdsG100","DEFAULT_THEMING_OPTION_CSS_SELECTOR","HdsThemingService","Service","g","prototype","tracked","undefined","i","void 0","initializeTheme","rawStoredThemingData","localStorage","getItem","storedThemingData","JSON","parse","theme","options","setTheme","onSetTheme","hasOwn","lightTheme","darkTheme","cssSelector","_currentLightTheme","_currentDarkTheme","_currentCssSelector","includes","_currentTheme","_currentMode","System","Light","Dark","rootElement","document","querySelector","removeAttribute","classList","remove","setAttribute","add","setItem","stringify","globalOnSetTheme","currentTheme","currentMode","currentLightTheme","currentDarkTheme","currentCssSelector"],"mappings":"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"}
|
package/dist/services.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
export { DEFAULT_THEMING_OPTION_CSS_SELECTOR, DEFAULT_THEMING_OPTION_DARK_THEME, DEFAULT_THEMING_OPTION_LIGHT_THEME, HDS_THEMING_CLASS_SELECTORS_LIST, HDS_THEMING_CLASS_SELECTOR_PREFIX, HDS_THEMING_DATA_SELECTOR, HDS_THEMING_LOCALSTORAGE_DATA, HdsCssSelectorsValues, HdsThemeValues, MODES, MODES_DARK, MODES_LIGHT, THEMES } from './services/hds-theming.js';
|
|
2
2
|
//# sourceMappingURL=services.js.map
|