@db-vincent/components 0.0.0-stage → 0.1.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 (62) hide show
  1. package/package.json +28 -4
  2. package/src/astro/Accordion.astro +37 -0
  3. package/src/astro/Alert.astro +73 -0
  4. package/src/astro/Badge.astro +23 -0
  5. package/src/astro/Breadcrumbs.astro +45 -0
  6. package/src/astro/Button.astro +125 -0
  7. package/src/astro/Card.astro +63 -0
  8. package/src/astro/Checkbox.astro +61 -0
  9. package/src/astro/Chip.astro +116 -0
  10. package/src/astro/CodeBlock.astro +17 -0
  11. package/src/astro/EmptyState.astro +45 -0
  12. package/src/astro/Example.astro +37 -0
  13. package/src/astro/Grid.astro +50 -0
  14. package/src/astro/GridItem.astro +23 -0
  15. package/src/astro/Icon.astro +52 -0
  16. package/src/astro/Modal.astro +117 -0
  17. package/src/astro/Navbar.astro +756 -0
  18. package/src/astro/PageHeader.astro +34 -0
  19. package/src/astro/Pagination.astro +162 -0
  20. package/src/astro/Radio.astro +58 -0
  21. package/src/astro/RadioGroup.astro +25 -0
  22. package/src/astro/Section.astro +25 -0
  23. package/src/astro/Select.astro +403 -0
  24. package/src/astro/Sidebar.astro +215 -0
  25. package/src/astro/Skeleton.astro +39 -0
  26. package/src/astro/Spinner.astro +19 -0
  27. package/src/astro/Table.astro +254 -0
  28. package/src/astro/TextField.astro +287 -0
  29. package/src/astro/ThemeToggle.astro +66 -0
  30. package/src/astro/Toast.astro +181 -0
  31. package/src/astro/TopBar.astro +29 -0
  32. package/src/data/icons.ts +104 -0
  33. package/src/scripts/toast.ts +531 -0
  34. package/src/styles/accordion.css +77 -0
  35. package/src/styles/alert.css +106 -0
  36. package/src/styles/badge.css +46 -0
  37. package/src/styles/base.css +203 -0
  38. package/src/styles/breadcrumbs.css +52 -0
  39. package/src/styles/button.css +163 -0
  40. package/src/styles/card.css +108 -0
  41. package/src/styles/chip.css +104 -0
  42. package/src/styles/choice.css +137 -0
  43. package/src/styles/code.css +42 -0
  44. package/src/styles/empty.css +57 -0
  45. package/src/styles/example.css +55 -0
  46. package/src/styles/grid.css +62 -0
  47. package/src/styles/input.css +198 -0
  48. package/src/styles/modal.css +143 -0
  49. package/src/styles/motion.css +96 -0
  50. package/src/styles/nav.css +230 -0
  51. package/src/styles/navbar.css +656 -0
  52. package/src/styles/page-header.css +59 -0
  53. package/src/styles/pagination.css +77 -0
  54. package/src/styles/section.css +36 -0
  55. package/src/styles/select.css +235 -0
  56. package/src/styles/skeleton.css +64 -0
  57. package/src/styles/spinner.css +42 -0
  58. package/src/styles/table.css +175 -0
  59. package/src/styles/theme-toggle.css +29 -0
  60. package/src/styles/toast.css +207 -0
  61. package/src/styles/topbar.css +30 -0
  62. package/README.md +0 -3
@@ -0,0 +1,46 @@
1
+ @layer components {
2
+ .ds-badge {
3
+ align-items: center;
4
+ background: var(--badge-neutral-bg);
5
+ border-radius: var(--badge-radius);
6
+ color: var(--badge-neutral-fg);
7
+ display: inline-flex;
8
+ font-family: var(--badge-font);
9
+ font-size: var(--badge-font-size);
10
+ font-weight: var(--badge-font-weight);
11
+ gap: var(--space-1);
12
+ height: var(--badge-height);
13
+ letter-spacing: var(--type-overline-tracking);
14
+ line-height: 1;
15
+ padding-inline: var(--badge-padding-x);
16
+ text-transform: uppercase;
17
+ white-space: nowrap;
18
+ }
19
+
20
+ .ds-badge--accent {
21
+ background: var(--badge-accent-bg);
22
+ color: var(--badge-accent-fg);
23
+ }
24
+
25
+ .ds-badge--success {
26
+ background: var(--badge-success-bg);
27
+ color: var(--badge-success-fg);
28
+ }
29
+
30
+ .ds-badge--warning {
31
+ background: var(--badge-warning-bg);
32
+ color: var(--badge-warning-fg);
33
+ }
34
+
35
+ .ds-badge--danger {
36
+ background: var(--badge-danger-bg);
37
+ color: var(--badge-danger-fg);
38
+ }
39
+
40
+ .ds-badge__dot {
41
+ background: currentColor;
42
+ border-radius: var(--radius-full);
43
+ height: var(--badge-dot-size);
44
+ width: var(--badge-dot-size);
45
+ }
46
+ }
@@ -0,0 +1,203 @@
1
+ @layer base {
2
+ *,
3
+ *::before,
4
+ *::after {
5
+ box-sizing: border-box;
6
+ }
7
+
8
+ * {
9
+ margin: 0;
10
+ }
11
+
12
+ html {
13
+ -webkit-text-size-adjust: 100%;
14
+ scroll-behavior: smooth;
15
+ }
16
+
17
+ body {
18
+ background: var(--color-canvas);
19
+ color: var(--color-text-primary);
20
+ font-family: var(--font-body);
21
+ font-size: var(--text-base);
22
+ line-height: var(--leading-base);
23
+ font-feature-settings: "cv11", "ss01";
24
+ text-rendering: optimizeLegibility;
25
+ -webkit-font-smoothing: antialiased;
26
+ }
27
+
28
+ ::selection {
29
+ background: var(--color-selection);
30
+ color: var(--color-text-primary);
31
+ }
32
+
33
+ :focus-visible {
34
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
35
+ outline-offset: var(--focus-ring-offset);
36
+ }
37
+
38
+ h1,
39
+ h2,
40
+ h3,
41
+ h4 {
42
+ color: var(--color-text-primary);
43
+ font-weight: var(--weight-semibold);
44
+ letter-spacing: var(--type-title-sm-tracking);
45
+ line-height: 1.2;
46
+ text-wrap: balance;
47
+ }
48
+
49
+ h1 {
50
+ font-size: var(--text-4xl);
51
+ line-height: var(--leading-4xl);
52
+ letter-spacing: var(--type-title-lg-tracking);
53
+ }
54
+
55
+ h2 {
56
+ font-size: var(--text-3xl);
57
+ line-height: var(--leading-3xl);
58
+ }
59
+
60
+ h3 {
61
+ font-size: var(--text-2xl);
62
+ line-height: var(--leading-2xl);
63
+ }
64
+
65
+ h4 {
66
+ font-size: var(--text-lg);
67
+ line-height: var(--leading-lg);
68
+ }
69
+
70
+ p {
71
+ text-wrap: pretty;
72
+ }
73
+
74
+ a {
75
+ color: var(--color-link);
76
+ text-decoration-thickness: 1px;
77
+ text-underline-offset: 0.18em;
78
+ }
79
+
80
+ a:hover {
81
+ color: var(--color-link-hover);
82
+ }
83
+
84
+ code,
85
+ kbd,
86
+ samp,
87
+ pre {
88
+ font-family: var(--font-mono);
89
+ }
90
+
91
+ :not(pre) > code {
92
+ background: var(--color-surface-sunken);
93
+ border-radius: var(--radius-xs);
94
+ font-size: 0.875em;
95
+ padding: 0.1em 0.35em;
96
+ }
97
+
98
+ kbd {
99
+ background: var(--color-surface);
100
+ border: 1px solid var(--color-border-default);
101
+ border-bottom-width: 2px;
102
+ border-radius: var(--radius-xs);
103
+ color: var(--color-text-secondary);
104
+ font-size: var(--text-xs);
105
+ padding: 0.1em 0.4em;
106
+ }
107
+
108
+ img,
109
+ svg {
110
+ display: block;
111
+ max-width: 100%;
112
+ }
113
+
114
+ button,
115
+ input,
116
+ select,
117
+ textarea {
118
+ font: inherit;
119
+ color: inherit;
120
+ }
121
+
122
+ button {
123
+ cursor: pointer;
124
+ }
125
+
126
+ [hidden] {
127
+ display: none !important;
128
+ }
129
+
130
+ hr {
131
+ border: 0;
132
+ border-top: 1px solid var(--color-border-subtle);
133
+ }
134
+
135
+ .ds-container {
136
+ margin-inline: auto;
137
+ max-width: var(--layout-container);
138
+ padding-inline: var(--space-5);
139
+ width: 100%;
140
+ }
141
+
142
+ .ds-prose {
143
+ color: var(--color-text-secondary);
144
+ max-width: var(--layout-prose);
145
+ }
146
+
147
+ .ds-prose > * + * {
148
+ margin-top: var(--space-4);
149
+ }
150
+
151
+ .ds-prose h2,
152
+ .ds-prose h3 {
153
+ color: var(--color-text-primary);
154
+ margin-top: var(--space-10);
155
+ }
156
+
157
+ .ds-prose h2 {
158
+ font-size: var(--text-2xl);
159
+ }
160
+
161
+ .ds-prose h3 {
162
+ font-size: var(--text-xl);
163
+ }
164
+
165
+ .ds-prose ul,
166
+ .ds-prose ol {
167
+ padding-left: var(--space-5);
168
+ }
169
+
170
+ .ds-prose li + li {
171
+ margin-top: var(--space-2);
172
+ }
173
+
174
+ .ds-prose strong {
175
+ color: var(--color-text-primary);
176
+ font-weight: var(--weight-semibold);
177
+ }
178
+
179
+ .ds-prose code {
180
+ color: var(--color-text-primary);
181
+ }
182
+
183
+ /* Shared icon geometry: every icon inherits the current text colour. */
184
+ .ds-icon {
185
+ flex: none;
186
+ stroke: currentColor;
187
+ }
188
+
189
+ .ds-sr-only {
190
+ clip-path: inset(50%);
191
+ height: 1px;
192
+ overflow: hidden;
193
+ position: absolute;
194
+ white-space: nowrap;
195
+ width: 1px;
196
+ }
197
+
198
+ @media (prefers-reduced-motion: reduce) {
199
+ html {
200
+ scroll-behavior: auto;
201
+ }
202
+ }
203
+ }
@@ -0,0 +1,52 @@
1
+ @layer components {
2
+ .ds-breadcrumbs {
3
+ font-size: var(--breadcrumbs-font-size);
4
+ }
5
+
6
+ .ds-breadcrumbs__list {
7
+ align-items: center;
8
+ display: flex;
9
+ flex-wrap: wrap;
10
+ gap: var(--breadcrumbs-gap);
11
+ list-style: none;
12
+ margin: 0;
13
+ padding: 0;
14
+ }
15
+
16
+ .ds-breadcrumbs__item {
17
+ align-items: center;
18
+ display: inline-flex;
19
+ gap: var(--breadcrumbs-gap);
20
+ min-width: 0;
21
+ }
22
+
23
+ .ds-breadcrumbs__link {
24
+ border-radius: var(--radius-xs);
25
+ color: var(--breadcrumbs-link-fg);
26
+ text-decoration: none;
27
+ }
28
+
29
+ .ds-breadcrumbs__link:hover {
30
+ color: var(--breadcrumbs-link-fg-hover);
31
+ text-decoration: underline;
32
+ text-underline-offset: 0.18em;
33
+ }
34
+
35
+ .ds-breadcrumbs__link:focus-visible {
36
+ outline: var(--breadcrumbs-focus-width) solid var(--breadcrumbs-focus-color);
37
+ outline-offset: var(--breadcrumbs-focus-offset);
38
+ }
39
+
40
+ .ds-breadcrumbs__current {
41
+ color: var(--breadcrumbs-current-fg);
42
+ font-weight: var(--weight-medium);
43
+ overflow: hidden;
44
+ text-overflow: ellipsis;
45
+ white-space: nowrap;
46
+ }
47
+
48
+ .ds-breadcrumbs__separator {
49
+ color: var(--breadcrumbs-separator-fg);
50
+ flex: none;
51
+ }
52
+ }
@@ -0,0 +1,163 @@
1
+ @layer components {
2
+ .ds-button {
3
+ align-items: center;
4
+ background: var(--button-secondary-bg);
5
+ border: 1px solid var(--button-secondary-border);
6
+ border-radius: var(--button-radius);
7
+ color: var(--button-secondary-fg);
8
+ display: inline-flex;
9
+ font-family: var(--button-font);
10
+ font-size: var(--button-font-md);
11
+ font-weight: var(--button-font-weight);
12
+ gap: var(--button-gap);
13
+ height: var(--button-height-md);
14
+ justify-content: center;
15
+ line-height: 1;
16
+ padding-inline: var(--button-padding-x-md);
17
+ position: relative;
18
+ text-decoration: none;
19
+ transition:
20
+ background-color var(--duration-fast) var(--ease-standard),
21
+ border-color var(--duration-fast) var(--ease-standard),
22
+ color var(--duration-fast) var(--ease-standard),
23
+ box-shadow var(--duration-fast) var(--ease-standard);
24
+ user-select: none;
25
+ white-space: nowrap;
26
+ }
27
+
28
+ .ds-button:hover {
29
+ background: var(--button-secondary-bg-hover);
30
+ border-color: var(--button-secondary-border-hover);
31
+ }
32
+
33
+ .ds-button:active {
34
+ background: var(--button-secondary-bg-active);
35
+ }
36
+
37
+ .ds-button:focus-visible {
38
+ outline: var(--button-focus-width) solid var(--button-focus-color);
39
+ outline-offset: var(--button-focus-offset);
40
+ }
41
+
42
+ .ds-button--primary {
43
+ background: var(--button-primary-bg);
44
+ border-color: var(--button-primary-border);
45
+ color: var(--button-primary-fg);
46
+ }
47
+
48
+ .ds-button--primary:hover {
49
+ background: var(--button-primary-bg-hover);
50
+ border-color: var(--button-primary-border-hover);
51
+ }
52
+
53
+ .ds-button--primary:active {
54
+ background: var(--button-primary-bg-active);
55
+ }
56
+
57
+ .ds-button--ghost {
58
+ background: var(--button-ghost-bg);
59
+ border-color: var(--button-ghost-border);
60
+ color: var(--button-ghost-fg);
61
+ }
62
+
63
+ .ds-button--ghost:hover {
64
+ background: var(--button-ghost-bg-hover);
65
+ color: var(--button-ghost-fg-hover);
66
+ }
67
+
68
+ .ds-button--ghost:active {
69
+ background: var(--button-ghost-bg-active);
70
+ }
71
+
72
+ .ds-button--danger {
73
+ background: var(--button-danger-bg);
74
+ border-color: var(--button-danger-border);
75
+ color: var(--button-danger-fg);
76
+ }
77
+
78
+ .ds-button--danger:hover {
79
+ background: var(--button-danger-bg-hover);
80
+ }
81
+
82
+ .ds-button--sm {
83
+ font-size: var(--button-font-sm);
84
+ height: var(--button-height-sm);
85
+ padding-inline: var(--button-padding-x-sm);
86
+ }
87
+
88
+ .ds-button--lg {
89
+ font-size: var(--button-font-lg);
90
+ height: var(--button-height-lg);
91
+ padding-inline: var(--button-padding-x-lg);
92
+ }
93
+
94
+ .ds-button--block {
95
+ width: 100%;
96
+ }
97
+
98
+ .ds-button--icon {
99
+ aspect-ratio: 1;
100
+ padding-inline: var(--space-0);
101
+ width: var(--button-height-md);
102
+ }
103
+
104
+ .ds-button--icon.ds-button--sm {
105
+ width: var(--button-height-sm);
106
+ }
107
+
108
+ .ds-button--icon.ds-button--lg {
109
+ width: var(--button-height-lg);
110
+ }
111
+
112
+ .ds-button__icon {
113
+ align-items: center;
114
+ display: inline-flex;
115
+ height: var(--button-icon-size-md);
116
+ justify-content: center;
117
+ width: var(--button-icon-size-md);
118
+ }
119
+
120
+ .ds-button--sm .ds-button__icon {
121
+ height: var(--button-icon-size-sm);
122
+ width: var(--button-icon-size-sm);
123
+ }
124
+
125
+ .ds-button--lg .ds-button__icon {
126
+ height: var(--button-icon-size-lg);
127
+ width: var(--button-icon-size-lg);
128
+ }
129
+
130
+ .ds-button[aria-disabled="true"],
131
+ .ds-button:disabled {
132
+ background: var(--button-disabled-bg);
133
+ border-color: var(--button-disabled-border);
134
+ color: var(--button-disabled-fg);
135
+ cursor: not-allowed;
136
+ pointer-events: none;
137
+ }
138
+
139
+ .ds-button__spinner {
140
+ animation: ds-button-spin var(--duration-slower) linear infinite;
141
+ border: var(--spinner-stroke) solid currentColor;
142
+ border-right-color: transparent;
143
+ border-radius: var(--radius-full);
144
+ height: var(--space-4);
145
+ width: var(--space-4);
146
+ }
147
+
148
+ .ds-button[aria-busy="true"] {
149
+ cursor: progress;
150
+ }
151
+
152
+ @keyframes ds-button-spin {
153
+ to {
154
+ transform: rotate(360deg);
155
+ }
156
+ }
157
+
158
+ @media (prefers-reduced-motion: reduce) {
159
+ .ds-button__spinner {
160
+ animation-duration: 1.6s;
161
+ }
162
+ }
163
+ }
@@ -0,0 +1,108 @@
1
+ @layer components {
2
+ .ds-card {
3
+ background: var(--card-bg);
4
+ border: 1px solid var(--card-border);
5
+ border-radius: var(--card-radius);
6
+ color: var(--card-fg);
7
+ display: block;
8
+ overflow: hidden;
9
+ transition:
10
+ border-color var(--duration-fast) var(--ease-standard),
11
+ box-shadow var(--duration-fast) var(--ease-standard),
12
+ transform var(--duration-fast) var(--ease-standard);
13
+ }
14
+
15
+ .ds-card--accent {
16
+ background: var(--card-accent-bg);
17
+ border-color: var(--card-accent-border);
18
+ }
19
+
20
+ .ds-card--raised {
21
+ background: var(--card-raised-bg);
22
+ border-color: var(--card-raised-border);
23
+ box-shadow: var(--card-raised-shadow);
24
+ }
25
+
26
+ .ds-card--flat {
27
+ background: var(--card-flat-bg);
28
+ border-color: var(--card-flat-border);
29
+ box-shadow: none;
30
+ }
31
+
32
+ a.ds-card {
33
+ text-decoration: none;
34
+ }
35
+
36
+ a.ds-card:hover {
37
+ border-color: var(--card-hover-border);
38
+ box-shadow: var(--card-raised-shadow);
39
+ transform: translateY(-1px);
40
+ }
41
+
42
+ a.ds-card:focus-visible {
43
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
44
+ outline-offset: var(--focus-ring-offset);
45
+ }
46
+
47
+ .ds-card__header {
48
+ padding: var(--card-padding) var(--card-padding) 0;
49
+ }
50
+
51
+ .ds-card__header > * + * {
52
+ margin-block-start: var(--card-header-gap);
53
+ }
54
+
55
+ .ds-card__eyebrow {
56
+ color: var(--card-meta-fg);
57
+ font-family: var(--font-body);
58
+ font-size: var(--type-overline-size);
59
+ font-weight: var(--type-overline-weight);
60
+ letter-spacing: var(--type-overline-tracking);
61
+ margin-block-end: var(--space-2);
62
+ text-transform: uppercase;
63
+ }
64
+
65
+ .ds-card__title {
66
+ color: var(--card-title-fg);
67
+ font-size: var(--text-lg);
68
+ font-weight: var(--weight-semibold);
69
+ letter-spacing: var(--type-heading-tracking);
70
+ line-height: var(--leading-lg);
71
+ }
72
+
73
+ .ds-card__meta {
74
+ color: var(--card-meta-fg);
75
+ font-size: var(--text-sm);
76
+ line-height: var(--leading-sm);
77
+ }
78
+
79
+ .ds-card__body {
80
+ color: var(--card-body-fg);
81
+ font-size: var(--text-sm);
82
+ line-height: var(--leading-base);
83
+ padding: var(--card-padding);
84
+ }
85
+
86
+ .ds-card__header + .ds-card__body {
87
+ padding-block-start: var(--space-3);
88
+ }
89
+
90
+ .ds-card__footer {
91
+ align-items: center;
92
+ background: var(--card-footer-bg);
93
+ border-top: 1px solid var(--card-footer-border);
94
+ display: flex;
95
+ gap: var(--space-3);
96
+ padding: var(--space-3) var(--card-padding);
97
+ }
98
+
99
+ @media (prefers-reduced-motion: reduce) {
100
+ .ds-card {
101
+ transition: none;
102
+ }
103
+
104
+ a.ds-card:hover {
105
+ transform: none;
106
+ }
107
+ }
108
+ }
@@ -0,0 +1,104 @@
1
+ @layer components {
2
+ .ds-chip {
3
+ align-items: center;
4
+ background: var(--chip-bg);
5
+ border: 1px solid var(--chip-border);
6
+ border-radius: var(--chip-radius);
7
+ color: var(--chip-fg);
8
+ display: inline-flex;
9
+ font-family: var(--font-body);
10
+ font-size: var(--chip-font-size);
11
+ gap: var(--space-1-5);
12
+ height: var(--chip-height);
13
+ line-height: 1;
14
+ padding-inline: var(--chip-padding-x);
15
+ text-decoration: none;
16
+ transition:
17
+ background-color var(--duration-fast) var(--ease-standard),
18
+ border-color var(--duration-fast) var(--ease-standard),
19
+ color var(--duration-fast) var(--ease-standard);
20
+ white-space: nowrap;
21
+ }
22
+
23
+ button.ds-chip {
24
+ cursor: pointer;
25
+ }
26
+
27
+ .ds-chip--sm {
28
+ font-size: var(--text-xs);
29
+ gap: var(--space-1);
30
+ height: var(--chip-height-sm);
31
+ padding-inline: var(--space-2-5);
32
+ }
33
+
34
+ /* Selection is never color alone: a pressed toggle shows a check. */
35
+ .ds-chip__check {
36
+ display: none;
37
+ margin-inline-start: calc(-1 * var(--space-0-5));
38
+ }
39
+
40
+ .ds-chip[aria-pressed="true"] .ds-chip__check {
41
+ display: block;
42
+ }
43
+
44
+ .ds-chip.is-disabled,
45
+ .ds-chip:disabled {
46
+ color: var(--chip-fg-disabled);
47
+ cursor: not-allowed;
48
+ pointer-events: none;
49
+ }
50
+
51
+ .ds-chip:hover {
52
+ background: var(--chip-bg-hover);
53
+ border-color: var(--chip-border-hover);
54
+ color: var(--chip-fg-hover);
55
+ }
56
+
57
+ .ds-chip[aria-pressed="true"],
58
+ .ds-chip.is-selected {
59
+ background: var(--chip-bg-selected);
60
+ border-color: var(--chip-border-selected);
61
+ color: var(--chip-fg-selected);
62
+ }
63
+
64
+ .ds-chip:focus-visible {
65
+ outline: var(--chip-focus-width) solid var(--chip-focus-color);
66
+ outline-offset: var(--chip-focus-offset);
67
+ }
68
+
69
+ .ds-chip__remove {
70
+ align-items: center;
71
+ background: transparent;
72
+ border: 0;
73
+ border-radius: var(--radius-full);
74
+ color: inherit;
75
+ display: inline-flex;
76
+ height: var(--space-4);
77
+ justify-content: center;
78
+ margin-inline-end: calc(-1 * var(--space-1));
79
+ padding: 0;
80
+ position: relative;
81
+ width: var(--space-4);
82
+ }
83
+
84
+ /* Keep the 14px glyph but give it a 24px pointer target. */
85
+ .ds-chip__remove::after {
86
+ content: "";
87
+ inset: calc(-1 * var(--space-1));
88
+ position: absolute;
89
+ }
90
+
91
+ .ds-chip__remove:hover {
92
+ background: var(--chip-remove-bg-hover);
93
+ }
94
+
95
+ .ds-chip__remove:focus-visible {
96
+ outline: var(--chip-focus-width) solid var(--chip-focus-color);
97
+ outline-offset: var(--chip-focus-offset);
98
+ }
99
+
100
+ .ds-chip__remove:disabled {
101
+ color: var(--chip-fg-disabled);
102
+ cursor: not-allowed;
103
+ }
104
+ }