revotech-ui-kit 0.0.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 (82) hide show
  1. package/.editorconfig +29 -0
  2. package/.eslintrc +10 -0
  3. package/.storybook/main.ts +17 -0
  4. package/.storybook/preview-head.html +1 -0
  5. package/.storybook/preview.ts +17 -0
  6. package/LICENSE +21 -0
  7. package/README.md +30 -0
  8. package/assets/fonts/Geist/Geist-Black.otf +0 -0
  9. package/assets/fonts/Geist/Geist-Black.woff2 +0 -0
  10. package/assets/fonts/Geist/Geist-Bold.otf +0 -0
  11. package/assets/fonts/Geist/Geist-Bold.woff2 +0 -0
  12. package/assets/fonts/Geist/Geist-Light.otf +0 -0
  13. package/assets/fonts/Geist/Geist-Light.woff2 +0 -0
  14. package/assets/fonts/Geist/Geist-Medium.otf +0 -0
  15. package/assets/fonts/Geist/Geist-Medium.woff2 +0 -0
  16. package/assets/fonts/Geist/Geist-Regular.otf +0 -0
  17. package/assets/fonts/Geist/Geist-Regular.woff2 +0 -0
  18. package/assets/fonts/Geist/Geist-SemiBold.otf +0 -0
  19. package/assets/fonts/Geist/Geist-SemiBold.woff2 +0 -0
  20. package/assets/fonts/Geist/Geist-Thin.otf +0 -0
  21. package/assets/fonts/Geist/Geist-Thin.woff2 +0 -0
  22. package/assets/fonts/Geist/Geist-UltraBlack.otf +0 -0
  23. package/assets/fonts/Geist/Geist-UltraBlack.woff2 +0 -0
  24. package/assets/fonts/Geist/Geist-UltraLight.otf +0 -0
  25. package/assets/fonts/Geist/Geist-UltraLight.woff2 +0 -0
  26. package/assets/fonts/Geist/GeistVariableVF.ttf +0 -0
  27. package/assets/fonts/Geist/GeistVariableVF.woff2 +0 -0
  28. package/assets/fonts/Geist/LICENSE.TXT +92 -0
  29. package/assets/open-wc-logo.svg +29 -0
  30. package/index.html +362 -0
  31. package/package.json +117 -0
  32. package/rollup.config.js +71 -0
  33. package/src/components/atoms/button/button.atom.ts +39 -0
  34. package/src/components/atoms/button/button.stories.ts +186 -0
  35. package/src/components/atoms/button/button.style.ts +31 -0
  36. package/src/components/atoms/button/button.type.ts +10 -0
  37. package/src/components/atoms/checkbox/checkbox.atom.ts +62 -0
  38. package/src/components/atoms/checkbox/checkbox.stories.ts +42 -0
  39. package/src/components/atoms/command-empty/command-empty.atom.ts +44 -0
  40. package/src/components/atoms/command-group/command-group.atom.ts +60 -0
  41. package/src/components/atoms/command-item/command-item.atom.ts +74 -0
  42. package/src/components/atoms/command-list/command-list.atom.ts +37 -0
  43. package/src/components/atoms/command-separator/command-separator.atom.ts +42 -0
  44. package/src/components/atoms/dialog/dialog.atom.ts +301 -0
  45. package/src/components/atoms/dialog/dialog.stories.ts +86 -0
  46. package/src/components/atoms/index.ts +10 -0
  47. package/src/components/atoms/input/input.atom.ts +34 -0
  48. package/src/components/atoms/input/input.stories.ts +89 -0
  49. package/src/components/atoms/input/input.type.ts +24 -0
  50. package/src/components/atoms/label/label.atom.ts +40 -0
  51. package/src/components/atoms/label/label.stories.ts +18 -0
  52. package/src/components/atoms/label/label.style.ts +5 -0
  53. package/src/components/command/command.stories.ts +154 -0
  54. package/src/components/command/command.ts +391 -0
  55. package/src/components/index.ts +2 -0
  56. package/src/components/molecules/command/command.molecules.ts +31 -0
  57. package/src/components/molecules/command-input/command-input.atom.ts +130 -0
  58. package/src/components/molecules/index.ts +1 -0
  59. package/src/components/popover.ts +247 -0
  60. package/src/globals.css +1806 -0
  61. package/src/helpers/index.ts +2 -0
  62. package/src/helpers/mouse-conroller.helper.ts +42 -0
  63. package/src/helpers/style.helpers.ts +6 -0
  64. package/src/interfaces/actionable.interface.ts +6 -0
  65. package/src/interfaces/atomic.interface.ts +6 -0
  66. package/src/interfaces/changeable.interface.ts +14 -0
  67. package/src/interfaces/child-support-atomic.interface.ts +5 -0
  68. package/src/interfaces/index.ts +6 -0
  69. package/src/interfaces/intractable.interface.ts +6 -0
  70. package/src/interfaces/variant.interface.ts +3 -0
  71. package/src/lib/index.ts +0 -0
  72. package/src/lib/next/next.lib.ts +0 -0
  73. package/src/lib/react/react.lib.ts +0 -0
  74. package/src/styles/index.ts +1 -0
  75. package/src/styles/tw.styles.ts +1867 -0
  76. package/src/tailwind-lib.css +95 -0
  77. package/src/wc-ui-app.ts +81 -0
  78. package/tailwind.config.js +81 -0
  79. package/test/wc-ui-app.test.ts +22 -0
  80. package/tsconfig.json +25 -0
  81. package/web-dev-server.config.mjs +26 -0
  82. package/web-test-runner.config.mjs +41 -0
@@ -0,0 +1,186 @@
1
+ import type { Meta, StoryObj } from '@storybook/web-components';
2
+ import { action } from '@storybook/addon-actions';
3
+ import { html } from 'lit';
4
+ import './button.atom';
5
+
6
+ const meta: Meta = {
7
+ component: 'components/button',
8
+ tags: ['autodocs'],
9
+ argTypes: {
10
+ variant: {
11
+ control: {
12
+ type: 'select',
13
+ },
14
+ options: [
15
+ 'default',
16
+ 'destructive',
17
+ 'outline',
18
+ 'secondary',
19
+ 'ghost',
20
+ 'link',
21
+ ],
22
+ },
23
+ size: {
24
+ control: {
25
+ type: 'select',
26
+ },
27
+ options: ['default', 'sm', 'lg', 'icon'],
28
+ },
29
+ disabled: { control: 'boolean' },
30
+ onClick: { action: 'button-click' },
31
+ },
32
+ };
33
+ export default meta;
34
+ type Story = StoryObj;
35
+
36
+ const logger = () => {
37
+ console.log('Btn Clicked!');
38
+ };
39
+
40
+ export const Default: Story = {
41
+ args: {
42
+ label: 'Default',
43
+ variant: 'default',
44
+ size: 'lg',
45
+ disabled: false,
46
+ },
47
+
48
+ render: ({ label, variant, size, disabled }) =>
49
+ html`<rtg-button
50
+ .onClick=${action('button-click')}
51
+ variant=${variant}
52
+ size=${size}
53
+ ?disabled=${disabled}
54
+ >
55
+ ${label}</rtg-button
56
+ >`,
57
+ };
58
+
59
+ export const Primary: Story = {
60
+ args: {
61
+ label: 'Primary',
62
+ variant: 'default',
63
+ size: 'lg',
64
+ disabled: false,
65
+ },
66
+ render: ({ label, variant, size, disabled }) =>
67
+ html`<rtg-button
68
+ .onClick=${logger}
69
+ variant=${variant}
70
+ size=${size}
71
+ ?disabled=${disabled}
72
+ >${label}</rtg-button
73
+ > `,
74
+ };
75
+
76
+ export const Destructive: Story = {
77
+ args: {
78
+ label: 'Destructive',
79
+ variant: 'destructive',
80
+ size: 'lg',
81
+ disabled: false,
82
+ },
83
+ render: ({ label, variant, size, disabled }) =>
84
+ html`<rtg-button
85
+ .onClick=${logger}
86
+ variant=${variant}
87
+ size=${size}
88
+ ?disabled=${disabled}
89
+ >${label}</rtg-button
90
+ > `,
91
+ };
92
+
93
+ export const Outline: Story = {
94
+ args: {
95
+ label: 'Outline',
96
+ variant: 'outline',
97
+ size: 'lg',
98
+ disabled: false,
99
+ },
100
+ render: ({ label, variant, size, disabled }) =>
101
+ html`<rtg-button
102
+ .onClick=${logger}
103
+ variant=${variant}
104
+ size=${size}
105
+ ?disabled=${disabled}
106
+ >${label}</rtg-button
107
+ > `,
108
+ };
109
+
110
+ export const Ghost: Story = {
111
+ args: {
112
+ variant: 'ghost',
113
+ label: 'Ghost',
114
+ size: 'lg',
115
+ disabled: false,
116
+ },
117
+ render: ({ label, variant, size, disabled }) =>
118
+ html`<rtg-button
119
+ .onClick=${logger}
120
+ variant=${variant}
121
+ size=${size}
122
+ ?disabled=${disabled}
123
+ >${label}</rtg-button
124
+ > `,
125
+ };
126
+
127
+ export const Link: Story = {
128
+ args: {
129
+ variant: 'link',
130
+ label: 'Link',
131
+ size: 'lg',
132
+ disabled: false,
133
+ },
134
+ render: ({ label, variant, size, disabled }) =>
135
+ html`<rtg-button
136
+ .onClick=${logger}
137
+ variant=${variant}
138
+ size=${size}
139
+ ?disabled=${disabled}
140
+ >${label}</rtg-button
141
+ > `,
142
+ };
143
+
144
+ export const IconButton: Story = {
145
+ args: {
146
+ variant: 'outline',
147
+ size: 'icon',
148
+ disabled: false,
149
+ },
150
+ render: ({ variant, size }) =>
151
+ html`<rtg-button .onClick=${logger} variant=${variant} size=${size}>
152
+ <iconify-icon icon="mdi:home"></iconify-icon>
153
+ </rtg-button> `,
154
+ };
155
+
156
+ export const ButtonWithIcon: Story = {
157
+ args: {
158
+ label: 'Home Page',
159
+ variant: 'default',
160
+ size: 'default',
161
+ disabled: false,
162
+ },
163
+ render: ({ variant, label, size, disabled }) =>
164
+ html`
165
+ <rtg-button varian=${variant} ?disabled=${disabled} size=${size}
166
+ ><iconify-icon class="mr-2" icon="mdi:home"></iconify-icon>
167
+ ${label}</rtg-button
168
+ >
169
+ `,
170
+ };
171
+
172
+ export const animationButton: Story = {
173
+ args: {
174
+ label: 'Home Page',
175
+ variant: 'default',
176
+ size: 'default',
177
+ disabled: true,
178
+ },
179
+ render: ({ variant, label, size, disabled }) =>
180
+ html`
181
+ <rtg-button varian=${variant} ?disabled=${disabled} size=${size}
182
+ ><iconify-icon class="mr-2 animate-spin" icon="mdi:home"></iconify-icon>
183
+ ${label}</rtg-button
184
+ >
185
+ `,
186
+ };
@@ -0,0 +1,31 @@
1
+ import { cva } from 'class-variance-authority';
2
+
3
+ export const buttonStyle = cva(
4
+ 'inline-flex items-center justify-center whitespace-nowrap rounded-sm text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50',
5
+ {
6
+ variants: {
7
+ variant: {
8
+ default:
9
+ 'bg-primary text-primary-foreground shadow hover:bg-primary/90',
10
+ destructive:
11
+ 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90',
12
+ outline:
13
+ 'border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground',
14
+ secondary:
15
+ 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80',
16
+ ghost: 'hover:bg-accent hover:text-accent-foreground',
17
+ link: 'text-primary underline-offset-4 hover:underline',
18
+ },
19
+ size: {
20
+ default: 'h-8 px-4 py-2',
21
+ sm: 'h-7 rounded-sm px-3 text-xs',
22
+ lg: 'h-9 rounded-sm px-8',
23
+ icon: 'h-8 w-8',
24
+ },
25
+ },
26
+ defaultVariants: {
27
+ variant: 'default',
28
+ size: 'default',
29
+ },
30
+ }
31
+ );
@@ -0,0 +1,10 @@
1
+ export type ButtonVariant =
2
+ | 'default'
3
+ | 'destructive'
4
+ | 'outline'
5
+ | 'secondary'
6
+ | 'ghost'
7
+ | 'link';
8
+ export type ButtonSize = 'default' | 'sm' | 'lg' | 'icon';
9
+
10
+ export type ButtonType = 'button' | 'submit' | 'reset' | 'menu';
@@ -0,0 +1,62 @@
1
+ import { LitElement, html, css, nothing } from 'lit';
2
+ import { property, customElement } from 'lit/decorators.js';
3
+ import { cn } from '@/helpers';
4
+ import { TWStyles } from '@/styles';
5
+
6
+ @customElement('rtg-checkbox')
7
+ export class Checkbox extends LitElement {
8
+ @property({ type: Boolean }) disabled = false;
9
+
10
+ @property({ type: Boolean }) checked = false;
11
+
12
+ static styles = [css``, TWStyles];
13
+
14
+ private _onClick(e: Event) {
15
+ if (e.defaultPrevented) return;
16
+ this.checked = !this.checked;
17
+ }
18
+
19
+ public click() {
20
+ this.checked = !this.checked;
21
+ }
22
+
23
+ //
24
+ render() {
25
+ return html`
26
+ <button
27
+ type="button"
28
+ role="checkbox"
29
+ aria-checked="${this.checked}"
30
+ data-state="${this.checked ? 'checked' : 'unchecked'}"
31
+ value="on"
32
+ ?disabled=${this.disabled}
33
+ @click="${this._onClick}"
34
+ class="${cn(
35
+ 'peer h-4 w-4 align-middle shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground',
36
+ this.className
37
+ )}"
38
+ >
39
+ ${this.checked
40
+ ? html`<span
41
+ data-state="checked"
42
+ class="flex items-center justify-center text-current"
43
+ style="pointer-events: none;"
44
+ ><svg
45
+ xmlns="http://www.w3.org/2000/svg"
46
+ width="24"
47
+ height="24"
48
+ viewBox="0 0 24 24"
49
+ fill="none"
50
+ stroke="currentColor"
51
+ stroke-width="3"
52
+ stroke-linecap="round"
53
+ stroke-linejoin="round"
54
+ class="h-4 w-4"
55
+ >
56
+ <polyline points="20 6 9 17 4 12"></polyline></svg
57
+ ></span>`
58
+ : nothing}
59
+ </button>
60
+ `;
61
+ }
62
+ }
@@ -0,0 +1,42 @@
1
+ import type { Meta, StoryFn } from '@storybook/web-components';
2
+ import { html } from 'lit';
3
+ import './checkbox.atom';
4
+
5
+ export default {
6
+ title: 'Components/Checkbox',
7
+ component: 'rtg-checkbox',
8
+ tags: ['autodocs'],
9
+ argTypes: {
10
+ disabled: { control: 'boolean' },
11
+ checked: { control: 'boolean' },
12
+ },
13
+ } as Meta;
14
+
15
+ const Template: StoryFn = (args: any) =>
16
+ html` <rtg-checkbox
17
+ id="terms"
18
+ ?disabled=${args.disabled}
19
+ ?checked=${args.checked}
20
+ ></rtg-checkbox>
21
+ <rtg-label for="terms">${args.label}</rtg-label>`;
22
+
23
+ export const Default = Template.bind({});
24
+ Default.args = {
25
+ disabled: false,
26
+ checked: false,
27
+ label: 'Accept terms and conditions',
28
+ };
29
+
30
+ export const Checked = Template.bind({});
31
+ Checked.args = {
32
+ disabled: false,
33
+ checked: true,
34
+ label: 'Checked',
35
+ };
36
+
37
+ export const Disabled = Template.bind({});
38
+ Disabled.args = {
39
+ disabled: true,
40
+ checked: false,
41
+ label: 'Disabled',
42
+ };
@@ -0,0 +1,44 @@
1
+ import { LitElement, html, css, nothing } from 'lit';
2
+ import { property, customElement } from 'lit/decorators.js';
3
+ import { cn } from '@/helpers';
4
+ import { TWStyles } from '@/styles';
5
+
6
+ @customElement('rtg-command-empty')
7
+ export class CommandEmpty extends LitElement {
8
+ @property({ type: String }) _id = '';
9
+
10
+ @property({ attribute: 'aria-hidden', type: String }) _hidden = 'true';
11
+
12
+ private static _counter = 0;
13
+
14
+ static styles = [css``, TWStyles];
15
+
16
+ private get identifier() {
17
+ if (this._id !== '') {
18
+ return this._id;
19
+ }
20
+ const parent =
21
+ this.parentElement?.shadowRoot?.querySelector('div[rtgcmd-list]');
22
+ if (parent) {
23
+ this._id = `${parent.getAttribute('id')}e${CommandEmpty._counter++}`;
24
+ } else {
25
+ this._id = `rtgcmdrxlxe${CommandEmpty._counter++}`;
26
+ }
27
+ return this._id;
28
+ }
29
+
30
+ render() {
31
+ return html`${this._hidden === 'true'
32
+ ? nothing
33
+ : html`
34
+ <div
35
+ class="${cn('py-6 text-center text-sm', this.className)}"
36
+ rtgcmd-empty
37
+ role="presentation"
38
+ id="${this.identifier}"
39
+ >
40
+ <slot></slot>
41
+ </div>
42
+ `}`;
43
+ }
44
+ }
@@ -0,0 +1,60 @@
1
+ import { LitElement, html, css, nothing } from 'lit';
2
+ import { property, customElement } from 'lit/decorators.js';
3
+ import { TWStyles } from '@/styles';
4
+
5
+ @customElement('rtg-command-group')
6
+ export class CommandGroup extends LitElement {
7
+ @property({ type: String }) heading = '';
8
+
9
+ @property({ attribute: 'id', type: String }) _id = '';
10
+
11
+ @property({ attribute: 'aria-hidden', type: String }) _hidden = '';
12
+
13
+ private static _counter = 0;
14
+
15
+ static styles = [css``, TWStyles];
16
+
17
+ private get identifier() {
18
+ if (this._id !== '') {
19
+ return this._id;
20
+ }
21
+ const parent =
22
+ this.parentElement?.shadowRoot?.querySelector('div[rtgcmd-list]');
23
+ if (parent) {
24
+ this._id = `${parent.getAttribute('id')}g${CommandGroup._counter++}`;
25
+ } else {
26
+ this._id = `rtgcmdrxlxg${CommandGroup._counter++}`;
27
+ }
28
+ return this._id;
29
+ }
30
+
31
+ render() {
32
+ const className =
33
+ 'overflow-hidden p-1 text-foreground [&_[rtgcmd-group-heading]]:px-2 [&_[rtgcmd-group-heading]]:py-1.5 [&_[rtgcmd-group-heading]]:text-xs [&_[rtgcmd-group-heading]]:font-medium [&_[rtgcmd-group-heading]]:text-muted-foreground';
34
+ return html`${this._hidden === 'true'
35
+ ? nothing
36
+ : html`
37
+ <div
38
+ class="${className}"
39
+ rtgcmd-group
40
+ role="presentation"
41
+ id="${this.identifier}"
42
+ >
43
+ <div
44
+ rtgcmd-group-heading
45
+ aria-hidden="true"
46
+ id="${this.identifier}h"
47
+ >
48
+ ${this.heading}
49
+ </div>
50
+ <div
51
+ rtgcmd-group-items
52
+ role="group"
53
+ aria-labelledby="${this.identifier}h"
54
+ >
55
+ <slot></slot>
56
+ </div>
57
+ </div>
58
+ `}`;
59
+ }
60
+ }
@@ -0,0 +1,74 @@
1
+ import { LitElement, html, css, nothing } from 'lit';
2
+ import {
3
+ property,
4
+ customElement,
5
+ queryAssignedElements,
6
+ } from 'lit/decorators.js';
7
+ import { cn } from '@/helpers';
8
+ import { TWStyles } from '@/styles';
9
+
10
+ @customElement('rtg-command-item')
11
+ export class CommandItem extends LitElement {
12
+ @property({ type: String }) _id = '';
13
+
14
+ @property({ attribute: 'aria-hidden', type: String }) _hidden = '';
15
+
16
+ private static _counter = 0;
17
+
18
+ static styles = [css``, TWStyles];
19
+
20
+ private get identifier() {
21
+ if (this._id !== '') {
22
+ return this._id;
23
+ }
24
+ const parent =
25
+ this.parentElement?.shadowRoot?.querySelector('div[rtgcmd-group]');
26
+ if (parent) {
27
+ this._id = `${parent.getAttribute('id')}li${CommandItem._counter++}`;
28
+ } else {
29
+ this._id = `rtgcmdrxgxli${CommandItem._counter++}`;
30
+ }
31
+ return this._id;
32
+ }
33
+
34
+ @property({ attribute: 'data-value', type: String })
35
+ public get value() {
36
+ return this.textContent?.trim() || '';
37
+ }
38
+
39
+ @property({ type: Boolean }) selected = false;
40
+
41
+ private handleMouseEvent(e: Event) {
42
+ if (e.type === 'mouseover' || e.type === 'focus') {
43
+ this.selected = true;
44
+ }
45
+ if (e.type === 'mouseleave') {
46
+ this.selected = false;
47
+ }
48
+ }
49
+
50
+ render() {
51
+ return html` ${this._hidden === 'true'
52
+ ? nothing
53
+ : html`
54
+ <div
55
+ class="${cn(
56
+ 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none aria-selected:bg-accent aria-selected:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
57
+ this.className
58
+ )}"
59
+ @mouseover="${this.handleMouseEvent}"
60
+ @mouseleave="${this.handleMouseEvent}"
61
+ @focus="${this.handleMouseEvent}"
62
+ rtgcmd-item
63
+ role="option"
64
+ aria-selected="${this.selected}"
65
+ data-selected="${this.selected}"
66
+ data-value="${this.value}"
67
+ id="${this.identifier}"
68
+ aria-hidden="${this.hidden}"
69
+ >
70
+ <slot></slot>
71
+ </div>
72
+ `}`;
73
+ }
74
+ }
@@ -0,0 +1,37 @@
1
+ import { LitElement, html, css } from 'lit';
2
+ import { customElement } from 'lit/decorators.js';
3
+ import { cn } from '@/helpers';
4
+ import { TWStyles } from '@/styles';
5
+
6
+ @customElement('rtg-command-list')
7
+ export class CommandList extends LitElement {
8
+ static styles = [css``, TWStyles];
9
+
10
+ private get identifier() {
11
+ const parent =
12
+ this.parentElement?.shadowRoot?.querySelector('div[rtgcmd-root]');
13
+ if (parent) {
14
+ return `${parent.getAttribute('id')}l`;
15
+ }
16
+ return `rtgcmdrxl`;
17
+ }
18
+
19
+ render() {
20
+ return html`
21
+ <div
22
+ class="${cn(
23
+ 'max-h-[300px] overflow-y-auto overflow-x-hidden',
24
+ this.className
25
+ )}"
26
+ role="listbox"
27
+ id="${this.identifier}"
28
+ style="--rtgcmd-list-height: 265.0px;"
29
+ rtgcmd-list
30
+ >
31
+ <div>
32
+ <slot></slot>
33
+ </div>
34
+ </div>
35
+ `;
36
+ }
37
+ }
@@ -0,0 +1,42 @@
1
+ import { LitElement, html, css, nothing } from 'lit';
2
+ import { property, customElement } from 'lit/decorators.js';
3
+ import { cn } from '@/helpers';
4
+ import { TWStyles } from '@/styles';
5
+
6
+ @customElement('rtg-command-separator')
7
+ export class CommandSeparator extends LitElement {
8
+ @property({ type: String }) _id = '';
9
+
10
+ @property({ attribute: 'aria-hidden', type: String }) _hidden = '';
11
+
12
+ private static _counter = 0;
13
+
14
+ static styles = [css``, TWStyles];
15
+
16
+ private get identifier() {
17
+ if (this._id !== '') {
18
+ return this._id;
19
+ }
20
+ const parent =
21
+ this.parentElement?.shadowRoot?.querySelector('div[rtgcmd-list]');
22
+ if (parent) {
23
+ this._id = `${parent.getAttribute('id')}s${CommandSeparator._counter++}`;
24
+ } else {
25
+ this._id = `rtgcmdrxlxs${CommandSeparator._counter++}`;
26
+ }
27
+ return this._id;
28
+ }
29
+
30
+ render() {
31
+ return html`${this._hidden === 'true'
32
+ ? nothing
33
+ : html`
34
+ <div
35
+ class="${cn('-mx-1 h-px bg-border', this.className)}"
36
+ rtgcmd-separator
37
+ role="separator"
38
+ id="${this.identifier}"
39
+ ></div>
40
+ `}`;
41
+ }
42
+ }