@semantic-components/ui 0.57.0 → 0.62.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.
- package/README.md +14 -0
- package/eslint.config.mjs +48 -0
- package/ng-package.json +8 -0
- package/package.json +12 -30
- package/project.json +28 -0
- package/src/index.ts +2 -0
- package/src/lib/components/button/README.md +143 -0
- package/src/lib/components/button/button.ts +69 -0
- package/src/lib/components/button/index.ts +1 -0
- package/src/lib/components/index.ts +2 -0
- package/src/lib/components/link/index.ts +1 -0
- package/src/lib/components/link/link.ts +31 -0
- package/src/lib/styles/index.css +3 -0
- package/{styles.css → src/lib/styles/shadcn.css} +17 -75
- package/src/lib/utils/index.ts +6 -0
- package/tsconfig.json +28 -0
- package/tsconfig.lib.json +12 -0
- package/tsconfig.lib.prod.json +7 -0
- package/LICENSE +0 -21
- package/all-styles.css +0 -155
- package/angular-cdk-styles.css +0 -0
- package/fesm2022/semantic-components-ui.mjs +0 -14416
- package/fesm2022/semantic-components-ui.mjs.map +0 -1
- package/index.d.ts +0 -2682
- package/scrollbar-styles.css +0 -11
- package/shiki-styles.css +0 -3
- package/tiptap-styles.css +0 -72
- package/typography-styles.css +0 -304
package/README.md
CHANGED
|
@@ -1 +1,15 @@
|
|
|
1
1
|
# @semantic-components/ui
|
|
2
|
+
|
|
3
|
+
Core UI primitives, utilities, and styles for the Semantic Components library.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
- **Components**: Button, Link
|
|
8
|
+
- **Utils**: `cn()` utility (Tailwind class merging via `clsx` + `tailwind-merge`)
|
|
9
|
+
- **Styles**: Base theme (shadcn/ui tokens, Tailwind setup, CDK overlay)
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { ScButton, ScLink, cn } from '@semantic-components/ui';
|
|
15
|
+
```
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import nx from '@nx/eslint-plugin';
|
|
2
|
+
import baseConfig from '../../eslint.config.mjs';
|
|
3
|
+
|
|
4
|
+
export default [
|
|
5
|
+
...baseConfig,
|
|
6
|
+
{
|
|
7
|
+
files: ['**/*.json'],
|
|
8
|
+
rules: {
|
|
9
|
+
'@nx/dependency-checks': [
|
|
10
|
+
'error',
|
|
11
|
+
{
|
|
12
|
+
ignoredFiles: ['{projectRoot}/eslint.config.{js,cjs,mjs,ts,cts,mts}'],
|
|
13
|
+
},
|
|
14
|
+
],
|
|
15
|
+
},
|
|
16
|
+
languageOptions: {
|
|
17
|
+
parser: await import('jsonc-eslint-parser'),
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
...nx.configs['flat/angular'],
|
|
21
|
+
...nx.configs['flat/angular-template'],
|
|
22
|
+
{
|
|
23
|
+
files: ['**/*.ts'],
|
|
24
|
+
rules: {
|
|
25
|
+
'@angular-eslint/directive-selector': [
|
|
26
|
+
'error',
|
|
27
|
+
{
|
|
28
|
+
type: 'attribute',
|
|
29
|
+
prefix: 'sc',
|
|
30
|
+
style: 'camelCase',
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
'@angular-eslint/component-selector': [
|
|
34
|
+
'error',
|
|
35
|
+
{
|
|
36
|
+
type: 'element',
|
|
37
|
+
prefix: 'sc',
|
|
38
|
+
style: 'kebab-case',
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
files: ['**/*.html'],
|
|
45
|
+
// Override or add rules here
|
|
46
|
+
rules: {},
|
|
47
|
+
},
|
|
48
|
+
];
|
package/ng-package.json
ADDED
package/package.json
CHANGED
|
@@ -1,45 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@semantic-components/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.62.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
8
|
"author": "Khalil LAGRIDA",
|
|
9
9
|
"license": "MIT",
|
|
10
|
-
"peerDependencies": {
|
|
11
|
-
"@angular/common": ">=19.0.0",
|
|
12
|
-
"@angular/core": ">=19.0.0",
|
|
13
|
-
"@angular/cdk": ">=19.0.0",
|
|
14
|
-
"@angular/forms": ">=19.0.0",
|
|
15
|
-
"class-variance-authority": "^0.7.1",
|
|
16
|
-
"rxjs": "~7.8.1",
|
|
17
|
-
"@semantic-icons/lucide-icons": ">=0.0.1",
|
|
18
|
-
"@semantic-components/utils": "0.46.0",
|
|
19
|
-
"@angular/router": ">=19.0.0",
|
|
20
|
-
"@js-temporal/polyfill": ">=0.4.4"
|
|
21
|
-
},
|
|
22
|
-
"sideEffects": false,
|
|
23
10
|
"repository": {
|
|
24
11
|
"type": "git",
|
|
25
|
-
"url": "https://github.com/
|
|
12
|
+
"url": "https://github.com/gridatek/semantic-components",
|
|
26
13
|
"directory": "libs/ui"
|
|
27
14
|
},
|
|
15
|
+
"peerDependencies": {
|
|
16
|
+
"@angular/core": ">=21.1.0",
|
|
17
|
+
"class-variance-authority": ">=0.7.1",
|
|
18
|
+
"clsx": ">=2.1.1",
|
|
19
|
+
"tailwind-merge": ">=3.4.0"
|
|
20
|
+
},
|
|
28
21
|
"exports": {
|
|
29
|
-
"./styles
|
|
30
|
-
"
|
|
31
|
-
},
|
|
32
|
-
"./package.json": {
|
|
33
|
-
"default": "./package.json"
|
|
34
|
-
},
|
|
35
|
-
".": {
|
|
36
|
-
"types": "./index.d.ts",
|
|
37
|
-
"default": "./fesm2022/semantic-components-ui.mjs"
|
|
22
|
+
"./styles": {
|
|
23
|
+
"default": "./src/lib/styles/index.css"
|
|
38
24
|
}
|
|
39
25
|
},
|
|
40
|
-
"
|
|
41
|
-
|
|
42
|
-
"dependencies": {
|
|
43
|
-
"tslib": "^2.3.0"
|
|
44
|
-
}
|
|
45
|
-
}
|
|
26
|
+
"sideEffects": false
|
|
27
|
+
}
|
package/project.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ui",
|
|
3
|
+
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
+
"sourceRoot": "libs/ui/src",
|
|
5
|
+
"prefix": "sc",
|
|
6
|
+
"projectType": "library",
|
|
7
|
+
"tags": [],
|
|
8
|
+
"targets": {
|
|
9
|
+
"build": {
|
|
10
|
+
"executor": "@nx/angular:ng-packagr-lite",
|
|
11
|
+
"outputs": ["{workspaceRoot}/dist/{projectRoot}"],
|
|
12
|
+
"options": {
|
|
13
|
+
"project": "libs/ui/ng-package.json",
|
|
14
|
+
"tsConfig": "libs/ui/tsconfig.lib.json"
|
|
15
|
+
},
|
|
16
|
+
"configurations": {
|
|
17
|
+
"production": {
|
|
18
|
+
"tsConfig": "libs/ui/tsconfig.lib.prod.json"
|
|
19
|
+
},
|
|
20
|
+
"development": {}
|
|
21
|
+
},
|
|
22
|
+
"defaultConfiguration": "production"
|
|
23
|
+
},
|
|
24
|
+
"lint": {
|
|
25
|
+
"executor": "@nx/eslint:lint"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Button
|
|
2
|
+
|
|
3
|
+
Displays a button or a component that looks like a button.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```html
|
|
8
|
+
<button sc-button>Click me</button>
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Directive
|
|
12
|
+
|
|
13
|
+
### ScButton
|
|
14
|
+
|
|
15
|
+
Button directive that can be applied to `button` or `a` elements.
|
|
16
|
+
|
|
17
|
+
**Selector:** `button[sc-button], a[sc-button]`
|
|
18
|
+
|
|
19
|
+
**Inputs:**
|
|
20
|
+
|
|
21
|
+
| Input | Type | Default | Description |
|
|
22
|
+
| ---------- | --------------------------------- | ----------- | ------------------------------------------------------------ |
|
|
23
|
+
| `variant` | `ButtonVariant` | `'default'` | Visual style variant |
|
|
24
|
+
| `size` | `ButtonSize` | `'default'` | Size of the button |
|
|
25
|
+
| `type` | `'button' \| 'submit' \| 'reset'` | `'button'` | Button type attribute (only applied to `<button>` elements) |
|
|
26
|
+
| `href` | `string` | `'#'` | Href attribute (only applied to `<a>` elements, overridable) |
|
|
27
|
+
| `disabled` | `boolean` | `false` | Disables the button (sets `aria-disabled`) |
|
|
28
|
+
| `class` | `string` | `''` | Additional CSS classes |
|
|
29
|
+
|
|
30
|
+
**ButtonVariant:**
|
|
31
|
+
|
|
32
|
+
- `default` - Primary button style
|
|
33
|
+
- `destructive` - Destructive/danger action
|
|
34
|
+
- `outline` - Bordered button
|
|
35
|
+
- `secondary` - Secondary action
|
|
36
|
+
- `ghost` - Minimal styling
|
|
37
|
+
- `link` - Looks like a link
|
|
38
|
+
|
|
39
|
+
**ButtonSize:**
|
|
40
|
+
|
|
41
|
+
- `default` - Standard size (h-8)
|
|
42
|
+
- `xs` - Extra small size (h-6)
|
|
43
|
+
- `sm` - Small size (h-7)
|
|
44
|
+
- `lg` - Large size (h-9)
|
|
45
|
+
- `icon` - Square icon button (size-8)
|
|
46
|
+
- `icon-xs` - Extra small icon button (size-6)
|
|
47
|
+
- `icon-sm` - Small icon button (size-7)
|
|
48
|
+
- `icon-lg` - Large icon button (size-9)
|
|
49
|
+
|
|
50
|
+
## Examples
|
|
51
|
+
|
|
52
|
+
### Variants
|
|
53
|
+
|
|
54
|
+
```html
|
|
55
|
+
<button sc-button>Default</button>
|
|
56
|
+
<button sc-button variant="secondary">Secondary</button>
|
|
57
|
+
<button sc-button variant="destructive">Destructive</button>
|
|
58
|
+
<button sc-button variant="outline">Outline</button>
|
|
59
|
+
<button sc-button variant="ghost">Ghost</button>
|
|
60
|
+
<button sc-button variant="link">Link</button>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Sizes
|
|
64
|
+
|
|
65
|
+
```html
|
|
66
|
+
<button sc-button size="lg">Large</button>
|
|
67
|
+
<button sc-button size="default">Default</button>
|
|
68
|
+
<button sc-button size="sm">Small</button>
|
|
69
|
+
<button sc-button size="icon">
|
|
70
|
+
<svg><!-- icon --></svg>
|
|
71
|
+
</button>
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### With Icons
|
|
75
|
+
|
|
76
|
+
```html
|
|
77
|
+
<button sc-button>
|
|
78
|
+
<svg><!-- icon --></svg>
|
|
79
|
+
Upload
|
|
80
|
+
</button>
|
|
81
|
+
|
|
82
|
+
<button sc-button variant="outline">
|
|
83
|
+
Settings
|
|
84
|
+
<svg><!-- icon --></svg>
|
|
85
|
+
</button>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Disabled
|
|
89
|
+
|
|
90
|
+
```html
|
|
91
|
+
<button sc-button disabled>Disabled</button>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### As Link
|
|
95
|
+
|
|
96
|
+
`ScButton` automatically sets `href="#"` on `<a>` elements. Override with `[href]` for real navigation:
|
|
97
|
+
|
|
98
|
+
```html
|
|
99
|
+
<!-- Default href="#" -->
|
|
100
|
+
<a sc-button>Link Button</a>
|
|
101
|
+
<a sc-button variant="outline">Outline Link</a>
|
|
102
|
+
|
|
103
|
+
<!-- Custom href -->
|
|
104
|
+
<a sc-button href="/somewhere">Navigate</a>
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Form Submit
|
|
108
|
+
|
|
109
|
+
By default, `sc-button` sets `type="button"` to prevent accidental form submissions. Use `type="submit"` explicitly for submit buttons:
|
|
110
|
+
|
|
111
|
+
```html
|
|
112
|
+
<form>
|
|
113
|
+
<button sc-button variant="outline">Cancel</button>
|
|
114
|
+
<!-- type="button" by default, won't submit -->
|
|
115
|
+
|
|
116
|
+
<button sc-button type="submit">Save</button>
|
|
117
|
+
<!-- explicit type="submit" -->
|
|
118
|
+
</form>
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Loading State
|
|
122
|
+
|
|
123
|
+
```html
|
|
124
|
+
<button sc-button disabled>
|
|
125
|
+
<svg sc-spinner si-loader-2-icon></svg>
|
|
126
|
+
Please wait
|
|
127
|
+
</button>
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Features
|
|
131
|
+
|
|
132
|
+
- **Multiple Variants**: 6 visual variants for different use cases
|
|
133
|
+
- **Size Options**: 4 sizes including icon-only
|
|
134
|
+
- **Icon Support**: Automatic sizing for nested SVG icons
|
|
135
|
+
- **Link Support**: Works on both `button` and `a` elements
|
|
136
|
+
- **Disabled State**: Built-in disabled styling
|
|
137
|
+
|
|
138
|
+
## Accessibility
|
|
139
|
+
|
|
140
|
+
- Uses native `button` or `a` elements
|
|
141
|
+
- Supports native `disabled` attribute
|
|
142
|
+
- Focus ring for keyboard navigation
|
|
143
|
+
- Proper contrast ratios for all variants
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { booleanAttribute, computed, Directive, input } from '@angular/core';
|
|
2
|
+
import { cva, type VariantProps } from 'class-variance-authority';
|
|
3
|
+
import { cn } from '../../utils';
|
|
4
|
+
|
|
5
|
+
export const buttonVariants = cva(
|
|
6
|
+
"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-lg border border-transparent bg-clip-padding text-sm font-medium focus-visible:ring-[3px] aria-invalid:ring-[3px] [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none",
|
|
7
|
+
{
|
|
8
|
+
variants: {
|
|
9
|
+
variant: {
|
|
10
|
+
default: 'bg-primary text-primary-foreground [a]:hover:bg-primary/80',
|
|
11
|
+
outline:
|
|
12
|
+
'border-border bg-background hover:bg-muted hover:text-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 aria-expanded:bg-muted aria-expanded:text-foreground',
|
|
13
|
+
secondary:
|
|
14
|
+
'bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground',
|
|
15
|
+
ghost:
|
|
16
|
+
'hover:bg-muted hover:text-foreground dark:hover:bg-muted/50 aria-expanded:bg-muted aria-expanded:text-foreground',
|
|
17
|
+
destructive:
|
|
18
|
+
'bg-destructive/10 hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/20 text-destructive focus-visible:border-destructive/40 dark:hover:bg-destructive/30',
|
|
19
|
+
link: 'text-primary underline-offset-4 hover:underline',
|
|
20
|
+
},
|
|
21
|
+
size: {
|
|
22
|
+
default:
|
|
23
|
+
'h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2',
|
|
24
|
+
xs: "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
|
|
25
|
+
sm: "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
|
|
26
|
+
lg: 'h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3',
|
|
27
|
+
icon: 'size-8',
|
|
28
|
+
'icon-xs':
|
|
29
|
+
"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
|
|
30
|
+
'icon-sm':
|
|
31
|
+
'size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg',
|
|
32
|
+
'icon-lg': 'size-9',
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
defaultVariants: {
|
|
36
|
+
variant: 'default',
|
|
37
|
+
size: 'default',
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
export type ScButtonVariants = VariantProps<typeof buttonVariants>;
|
|
43
|
+
|
|
44
|
+
@Directive({
|
|
45
|
+
selector: 'button[sc-button]',
|
|
46
|
+
host: {
|
|
47
|
+
'data-slot': 'button',
|
|
48
|
+
'[attr.type]': 'type()',
|
|
49
|
+
'[disabled]': 'disabled()',
|
|
50
|
+
'[attr.aria-disabled]': 'disabled() || null',
|
|
51
|
+
'[class]': 'class()',
|
|
52
|
+
},
|
|
53
|
+
})
|
|
54
|
+
export class ScButton {
|
|
55
|
+
readonly classInput = input<string>('', { alias: 'class' });
|
|
56
|
+
readonly variant = input<ScButtonVariants['variant']>('default');
|
|
57
|
+
readonly size = input<ScButtonVariants['size']>('default');
|
|
58
|
+
readonly type = input<'button' | 'submit' | 'reset'>('button');
|
|
59
|
+
readonly disabled = input<boolean, unknown>(false, {
|
|
60
|
+
transform: booleanAttribute,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
protected readonly class = computed(() =>
|
|
64
|
+
cn(
|
|
65
|
+
buttonVariants({ variant: this.variant(), size: this.size() }),
|
|
66
|
+
this.classInput(),
|
|
67
|
+
),
|
|
68
|
+
);
|
|
69
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './button';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './link';
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { booleanAttribute, computed, Directive, input } from '@angular/core';
|
|
2
|
+
import { cn } from '../../utils';
|
|
3
|
+
import { buttonVariants, type ScButtonVariants } from '../button';
|
|
4
|
+
|
|
5
|
+
@Directive({
|
|
6
|
+
selector: 'a[sc-link]',
|
|
7
|
+
host: {
|
|
8
|
+
'data-slot': 'link',
|
|
9
|
+
'[attr.href]': '!disabled() ? href() : null',
|
|
10
|
+
'[attr.role]': 'disabled() ? "link" : null',
|
|
11
|
+
'[attr.aria-disabled]': 'disabled() || null',
|
|
12
|
+
'[attr.tabindex]': 'disabled() ? -1 : null',
|
|
13
|
+
'[class]': 'class()',
|
|
14
|
+
},
|
|
15
|
+
})
|
|
16
|
+
export class ScLink {
|
|
17
|
+
readonly classInput = input<string>('', { alias: 'class' });
|
|
18
|
+
readonly variant = input<ScButtonVariants['variant']>('default');
|
|
19
|
+
readonly size = input<ScButtonVariants['size']>('default');
|
|
20
|
+
readonly href = input<string>('#');
|
|
21
|
+
readonly disabled = input<boolean, unknown>(false, {
|
|
22
|
+
transform: booleanAttribute,
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
protected readonly class = computed(() =>
|
|
26
|
+
cn(
|
|
27
|
+
buttonVariants({ variant: this.variant(), size: this.size() }),
|
|
28
|
+
this.classInput(),
|
|
29
|
+
),
|
|
30
|
+
);
|
|
31
|
+
}
|
|
@@ -1,17 +1,9 @@
|
|
|
1
|
-
@import url('@angular/cdk/overlay-prebuilt.css');
|
|
2
|
-
|
|
3
1
|
@import 'tailwindcss';
|
|
4
|
-
|
|
5
|
-
@plugin '@tailwindcss/typography';
|
|
6
|
-
|
|
7
2
|
@import 'tw-animate-css';
|
|
8
3
|
|
|
9
4
|
@custom-variant dark (&:is(.dark *));
|
|
10
5
|
|
|
11
|
-
@import './tiptap-styles.css';
|
|
12
|
-
|
|
13
6
|
:root {
|
|
14
|
-
--radius: 0.625rem;
|
|
15
7
|
--background: oklch(1 0 0);
|
|
16
8
|
--foreground: oklch(0.145 0 0);
|
|
17
9
|
--card: oklch(1 0 0);
|
|
@@ -27,7 +19,7 @@
|
|
|
27
19
|
--accent: oklch(0.97 0 0);
|
|
28
20
|
--accent-foreground: oklch(0.205 0 0);
|
|
29
21
|
--destructive: oklch(0.577 0.245 27.325);
|
|
30
|
-
--destructive-foreground: oklch(0.
|
|
22
|
+
--destructive-foreground: oklch(0.577 0.245 27.325);
|
|
31
23
|
--border: oklch(0.922 0 0);
|
|
32
24
|
--input: oklch(0.922 0 0);
|
|
33
25
|
--ring: oklch(0.708 0 0);
|
|
@@ -36,6 +28,7 @@
|
|
|
36
28
|
--chart-3: oklch(0.398 0.07 227.392);
|
|
37
29
|
--chart-4: oklch(0.828 0.189 84.429);
|
|
38
30
|
--chart-5: oklch(0.769 0.188 70.08);
|
|
31
|
+
--radius: 0.625rem;
|
|
39
32
|
--sidebar: oklch(0.985 0 0);
|
|
40
33
|
--sidebar-foreground: oklch(0.145 0 0);
|
|
41
34
|
--sidebar-primary: oklch(0.205 0 0);
|
|
@@ -49,23 +42,23 @@
|
|
|
49
42
|
.dark {
|
|
50
43
|
--background: oklch(0.145 0 0);
|
|
51
44
|
--foreground: oklch(0.985 0 0);
|
|
52
|
-
--card: oklch(0.
|
|
45
|
+
--card: oklch(0.145 0 0);
|
|
53
46
|
--card-foreground: oklch(0.985 0 0);
|
|
54
|
-
--popover: oklch(0.
|
|
47
|
+
--popover: oklch(0.145 0 0);
|
|
55
48
|
--popover-foreground: oklch(0.985 0 0);
|
|
56
|
-
--primary: oklch(0.
|
|
49
|
+
--primary: oklch(0.985 0 0);
|
|
57
50
|
--primary-foreground: oklch(0.205 0 0);
|
|
58
51
|
--secondary: oklch(0.269 0 0);
|
|
59
52
|
--secondary-foreground: oklch(0.985 0 0);
|
|
60
53
|
--muted: oklch(0.269 0 0);
|
|
61
54
|
--muted-foreground: oklch(0.708 0 0);
|
|
62
|
-
--accent: oklch(0.
|
|
55
|
+
--accent: oklch(0.269 0 0);
|
|
63
56
|
--accent-foreground: oklch(0.985 0 0);
|
|
64
|
-
--destructive: oklch(0.
|
|
65
|
-
--destructive-foreground: oklch(0.
|
|
66
|
-
--border: oklch(
|
|
67
|
-
--input: oklch(
|
|
68
|
-
--ring: oklch(0.
|
|
57
|
+
--destructive: oklch(0.396 0.141 25.723);
|
|
58
|
+
--destructive-foreground: oklch(0.637 0.237 25.331);
|
|
59
|
+
--border: oklch(0.269 0 0);
|
|
60
|
+
--input: oklch(0.269 0 0);
|
|
61
|
+
--ring: oklch(0.439 0 0);
|
|
69
62
|
--chart-1: oklch(0.488 0.243 264.376);
|
|
70
63
|
--chart-2: oklch(0.696 0.17 162.48);
|
|
71
64
|
--chart-3: oklch(0.769 0.188 70.08);
|
|
@@ -77,15 +70,11 @@
|
|
|
77
70
|
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
78
71
|
--sidebar-accent: oklch(0.269 0 0);
|
|
79
72
|
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
80
|
-
--sidebar-border: oklch(
|
|
73
|
+
--sidebar-border: oklch(0.269 0 0);
|
|
81
74
|
--sidebar-ring: oklch(0.439 0 0);
|
|
82
75
|
}
|
|
83
76
|
|
|
84
77
|
@theme inline {
|
|
85
|
-
--radius-sm: calc(var(--radius) - 4px);
|
|
86
|
-
--radius-md: calc(var(--radius) - 2px);
|
|
87
|
-
--radius-lg: var(--radius);
|
|
88
|
-
--radius-xl: calc(var(--radius) + 4px);
|
|
89
78
|
--color-background: var(--background);
|
|
90
79
|
--color-foreground: var(--foreground);
|
|
91
80
|
--color-card: var(--card);
|
|
@@ -110,6 +99,10 @@
|
|
|
110
99
|
--color-chart-3: var(--chart-3);
|
|
111
100
|
--color-chart-4: var(--chart-4);
|
|
112
101
|
--color-chart-5: var(--chart-5);
|
|
102
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
103
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
104
|
+
--radius-lg: var(--radius);
|
|
105
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
113
106
|
--color-sidebar: var(--sidebar);
|
|
114
107
|
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
115
108
|
--color-sidebar-primary: var(--sidebar-primary);
|
|
@@ -118,65 +111,14 @@
|
|
|
118
111
|
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
119
112
|
--color-sidebar-border: var(--sidebar-border);
|
|
120
113
|
--color-sidebar-ring: var(--sidebar-ring);
|
|
121
|
-
|
|
122
|
-
@keyframes progress {
|
|
123
|
-
0% {
|
|
124
|
-
transform: translateX(0) scaleX(0);
|
|
125
|
-
}
|
|
126
|
-
40% {
|
|
127
|
-
transform: translateX(0) scaleX(0.4);
|
|
128
|
-
}
|
|
129
|
-
100% {
|
|
130
|
-
transform: translateX(100%) scaleX(0.5);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
--animate-progress: progress 1s infinite linear;
|
|
135
|
-
|
|
136
|
-
@keyframes accordion-down {
|
|
137
|
-
0% {
|
|
138
|
-
height: 0;
|
|
139
|
-
}
|
|
140
|
-
100% {
|
|
141
|
-
height: height;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
@keyframes accordion-up {
|
|
146
|
-
0% {
|
|
147
|
-
height: height;
|
|
148
|
-
}
|
|
149
|
-
100% {
|
|
150
|
-
height: 0;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
--animate-accordion-down: accordion-down 0.2s ease-out;
|
|
155
|
-
--animate-accordion-up: accordion-up 0.2s ease-out;
|
|
156
114
|
}
|
|
157
115
|
|
|
158
116
|
@layer base {
|
|
159
117
|
* {
|
|
160
118
|
@apply border-border outline-ring/50;
|
|
119
|
+
interpolate-size: allow-keywords;
|
|
161
120
|
}
|
|
162
121
|
body {
|
|
163
122
|
@apply bg-background text-foreground;
|
|
164
123
|
}
|
|
165
124
|
}
|
|
166
|
-
|
|
167
|
-
html {
|
|
168
|
-
interpolate-size: allow-keywords;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
html,
|
|
172
|
-
body {
|
|
173
|
-
height: 100%;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
pre.shiki {
|
|
177
|
-
@apply p-6 rounded-md overflow-auto border border-border;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
.cdk-overlay-dark-backdrop {
|
|
181
|
-
@apply data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 bg-black/50;
|
|
182
|
-
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.base.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"isolatedModules": true,
|
|
5
|
+
"target": "es2022",
|
|
6
|
+
"moduleResolution": "bundler",
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noImplicitOverride": true,
|
|
9
|
+
"noPropertyAccessFromIndexSignature": true,
|
|
10
|
+
"noImplicitReturns": true,
|
|
11
|
+
"noFallthroughCasesInSwitch": true,
|
|
12
|
+
"emitDecoratorMetadata": false,
|
|
13
|
+
"module": "preserve"
|
|
14
|
+
},
|
|
15
|
+
"angularCompilerOptions": {
|
|
16
|
+
"enableI18nLegacyMessageIdFormat": false,
|
|
17
|
+
"strictInjectionParameters": true,
|
|
18
|
+
"strictInputAccessModifiers": true,
|
|
19
|
+
"strictTemplates": true
|
|
20
|
+
},
|
|
21
|
+
"files": [],
|
|
22
|
+
"include": [],
|
|
23
|
+
"references": [
|
|
24
|
+
{
|
|
25
|
+
"path": "./tsconfig.lib.json"
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "./tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"outDir": "../../dist/out-tsc",
|
|
5
|
+
"declaration": true,
|
|
6
|
+
"declarationMap": true,
|
|
7
|
+
"inlineSources": true,
|
|
8
|
+
"types": []
|
|
9
|
+
},
|
|
10
|
+
"include": ["src/**/*.ts"],
|
|
11
|
+
"exclude": ["src/**/*.spec.ts", "src/**/*.test.ts"]
|
|
12
|
+
}
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 Khalil LAGRIDA
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|