@nappr/nappr-styles 0.3.1 → 0.3.3

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 (124) hide show
  1. package/README.md +33 -20
  2. package/dist/styles.css +7462 -1
  3. package/dist/styles.css.map +1 -1
  4. package/dist/styles.min.css +3 -0
  5. package/dist/styles.min.css.map +1 -0
  6. package/docs/_coverpage.md +2 -2
  7. package/docs/_sidebar.md +2 -2
  8. package/docs/docs.theme.css +2 -1
  9. package/docs/docs.theme.css.map +1 -1
  10. package/docs/index.html +1 -1
  11. package/docs/pages/displays.md +26 -8
  12. package/docs/pages/grid.md +365 -0
  13. package/docs/pages/helpers.md +30 -18
  14. package/docs/pages/quick-start.md +100 -14
  15. package/docs/temp.scss +122 -0
  16. package/index.d.ts +25 -0
  17. package/package.json +48 -14
  18. package/sass/_globals.module.scss +43 -0
  19. package/sass/_globals.scss +78 -0
  20. package/sass/components/_.scss +1 -0
  21. package/sass/components/_badge.scss +58 -0
  22. package/sass/components/_button.scss +212 -0
  23. package/sass/components/scrollbar/_.scss +102 -0
  24. package/sass/configs/_.scss +7 -0
  25. package/sass/configs/_breakpoints.scss +12 -0
  26. package/sass/configs/_defaults.scss +6 -0
  27. package/sass/configs/_grid.scss +8 -0
  28. package/sass/configs/_palettes.scss +72 -0
  29. package/sass/configs/_spacing.scss +36 -0
  30. package/sass/configs/_text.scss +41 -0
  31. package/sass/configs/_themes.scss +24 -0
  32. package/sass/core/funcs/_list.scss +43 -0
  33. package/sass/core/funcs/_map.scss +42 -0
  34. package/sass/core/funcs/_math.scss +35 -0
  35. package/sass/core/funcs/_string.scss +47 -0
  36. package/sass/core/mixins/_.scss +3 -0
  37. package/{lib → sass/core}/mixins/_links.scss +2 -2
  38. package/sass/core/mixins/_media-queries.scss +22 -0
  39. package/sass/core/mixins/_typography.scss +26 -0
  40. package/sass/core/placeholders/_.scss +4 -0
  41. package/sass/core/placeholders/_dimensions.scss +16 -0
  42. package/sass/core/placeholders/_flexbox.scss +11 -0
  43. package/sass/core/placeholders/_lists.scss +41 -0
  44. package/sass/core/placeholders/_positions.scss +19 -0
  45. package/sass/core/placeholders/_typography.scss +10 -0
  46. package/sass/elements/_.scss +6 -0
  47. package/sass/elements/_dialog.scss +13 -0
  48. package/{lib/htmls → sass/elements}/_form.scss +28 -6
  49. package/sass/elements/_links.scss +21 -0
  50. package/sass/elements/_lists.scss +11 -0
  51. package/{lib/htmls → sass/elements}/_table.scss +2 -6
  52. package/sass/elements/_typography.scss +13 -0
  53. package/sass/layout/grid/_.scss +4 -0
  54. package/sass/layout/grid/_columns.scss +32 -0
  55. package/sass/layout/grid/_gaps.scss +42 -0
  56. package/sass/layout/grid/_grid.scss +130 -0
  57. package/sass/layout/grid/_offsets.scss +35 -0
  58. package/sass/main.scss +59 -0
  59. package/sass/resets/_.scss +5 -0
  60. package/sass/resets/_base.scss +69 -0
  61. package/sass/resets/_nappr.scss +82 -0
  62. package/sass/themes/_dark.scss +17 -0
  63. package/sass/themes/_dracula.scss +17 -0
  64. package/sass/themes/_github-light.scss +17 -0
  65. package/sass/themes/_light.scss +17 -0
  66. package/sass/themes/_monokai-pro.scss +17 -0
  67. package/sass/themes/_night-owl.scss +17 -0
  68. package/sass/themes/_nord.scss +17 -0
  69. package/sass/themes/_tokyo-night.scss +17 -0
  70. package/sass/utilities/_.scss +21 -0
  71. package/sass/utilities/_dimensions.scss +11 -0
  72. package/sass/utilities/_displays.scss +111 -0
  73. package/sass/utilities/_flexbox.scss +81 -0
  74. package/{lib/helpers → sass/utilities}/_floats.scss +10 -13
  75. package/sass/utilities/_lists.scss +86 -0
  76. package/sass/utilities/_negates.scss +121 -0
  77. package/sass/utilities/_palette.scss +11 -0
  78. package/sass/utilities/_scrolls.scss +67 -0
  79. package/sass/utilities/_spacers.scss +120 -0
  80. package/sass/utilities/_square-grid.scss +33 -0
  81. package/sass/utilities/_typography.scss +106 -0
  82. package/sass/utilities/_visibility.scss +60 -0
  83. package/sass/utilities/_wrap.scss +12 -0
  84. package/styles.scss +5 -1
  85. package/lib/_globals.scss +0 -16
  86. package/lib/_reset.scss +0 -223
  87. package/lib/customs/scrollbar.scss +0 -40
  88. package/lib/funcs/_.scss +0 -5
  89. package/lib/funcs/_get-color.scss +0 -3
  90. package/lib/funcs/_math.scss +0 -5
  91. package/lib/funcs/_merge-palette.scss +0 -12
  92. package/lib/funcs/_rem.scss +0 -104
  93. package/lib/funcs/_strings.scss +0 -35
  94. package/lib/grid/_.scss +0 -4
  95. package/lib/grid/_col.scss +0 -117
  96. package/lib/grid/_row.scss +0 -117
  97. package/lib/grid/_square.scss +0 -34
  98. package/lib/grid/_wrap.scss +0 -39
  99. package/lib/helpers/_.scss +0 -9
  100. package/lib/helpers/_displays.scss +0 -151
  101. package/lib/helpers/_flexbox.scss +0 -105
  102. package/lib/helpers/_margins.scss +0 -13
  103. package/lib/helpers/_negates.scss +0 -171
  104. package/lib/helpers/_scrolls.scss +0 -55
  105. package/lib/helpers/_texts.scss +0 -101
  106. package/lib/helpers/_visibility.scss +0 -34
  107. package/lib/htmls/_.scss +0 -4
  108. package/lib/htmls/_headings.scss +0 -29
  109. package/lib/htmls/_links.scss +0 -11
  110. package/lib/mixins/_.scss +0 -9
  111. package/lib/mixins/_border-radius.scss +0 -61
  112. package/lib/mixins/_border.scss +0 -48
  113. package/lib/mixins/_dimensions.scss +0 -48
  114. package/lib/mixins/_font-size.scss +0 -22
  115. package/lib/mixins/_line-height.scss +0 -19
  116. package/lib/mixins/_margin-padding.scss +0 -66
  117. package/lib/mixins/_root-variables.scss +0 -11
  118. package/lib/mixins/_theme.scss +0 -25
  119. package/lib/styles.scss +0 -19
  120. package/lib/variables/_.scss +0 -4
  121. package/lib/variables/_breakpoints.scss +0 -5
  122. package/lib/variables/_colors.scss +0 -60
  123. package/lib/variables/_defaults.scss +0 -53
  124. /package/{lib/helpers → sass/utilities}/_pointers.scss +0 -0
package/docs/temp.scss ADDED
@@ -0,0 +1,122 @@
1
+ // ==============================================
2
+ // 1. Variables : Polices et Couleurs (Basé sur le DSFR)
3
+ // ==============================================
4
+
5
+ // Polices
6
+ $font-marianne: 'Marianne', arial, sans-serif;
7
+ $font-spectral: 'Spectral', georgia, serif; // Utilisée pour les Displays selon la charte
8
+
9
+ // Couleurs (Tokens DSFR - à ajuster si besoin)
10
+ $color-text-default: #161616; // Couleur G800 sur fond clair
11
+ $color-text-inverted: #ffffff; // Couleur White sur fond foncé
12
+ $margin-bottom-heading: 1.5rem; // 24px/16 = 1.5rem (pour h1-h6)
13
+ $margin-bottom-display: 2rem; // 32px/16 = 2rem (pour les displays)
14
+
15
+ // Variables de taille de police (À REMPLACER PAR LES VALEURS EXACTES DU DSFR)
16
+ // Ces valeurs sont indicatives et doivent être vérifiées dans la documentation DSFR
17
+ $h1-font-size: 2.5rem; // Ex: 40px
18
+ $h2-font-size: 2rem; // Ex: 32px
19
+ $h3-font-size: 1.75rem; // Ex: 28px
20
+ $h4-font-size: 1.5rem; // Ex: 24px
21
+ $h5-font-size: 1.25rem; // Ex: 20px
22
+ $h6-font-size: 1rem; // Ex: 16px
23
+
24
+ $display-xl-font-size: 4rem; // Très grand display
25
+ $display-lg-font-size: 3rem; // Grand display
26
+ $display-md-font-size: 2.5rem; // Display moyen
27
+
28
+ // ==============================================
29
+ // 2. Mixin pour styliser un titre
30
+ // ==============================================
31
+
32
+ @mixin heading-style(
33
+ $font-size,
34
+ $font-weight: 700,
35
+ $font-family: $font-marianne,
36
+ $margin-bottom: $margin-bottom-heading
37
+ ) {
38
+ color: $color-text-default;
39
+ font-family: $font-family;
40
+ font-size: $font-size;
41
+ font-weight: $font-weight;
42
+ line-height: 1.2; // Ligne de hauteur à vérifier dans le DSFR
43
+ margin-bottom: $margin-bottom;
44
+ margin-top: 0; // Réinitialise la marge supérieure
45
+
46
+ // Style pour le mode sombre ou fond coloré
47
+ .fr-scheme-dark &,
48
+ .fr-background-alt & {
49
+ color: $color-text-inverted;
50
+ }
51
+ }
52
+
53
+ // ==============================================
54
+ // 3. Application des styles aux balises HTML (H1 à H6)
55
+ // ==============================================
56
+
57
+ h1 {
58
+ @include heading-style($h1-font-size, 700); // Généralement Bold
59
+ }
60
+
61
+ h2 {
62
+ @include heading-style($h2-font-size, 700);
63
+ }
64
+
65
+ h3 {
66
+ @include heading-style($h3-font-size, 700);
67
+ }
68
+
69
+ h4 {
70
+ @include heading-style($h4-font-size, 700);
71
+ }
72
+
73
+ h5 {
74
+ @include heading-style($h5-font-size, 700);
75
+ }
76
+
77
+ h6 {
78
+ @include heading-style($h6-font-size, 700);
79
+ }
80
+
81
+ // ==============================================
82
+ // 4. Titres Alternatifs (Display)
83
+ // ==============================================
84
+
85
+ // Les displays utilisent souvent la police Spectral et un poids plus lourd
86
+ .fr-display--xl {
87
+ @include heading-style(
88
+ $display-xl-font-size,
89
+ 800,
90
+ $font-spectral,
91
+ $margin-bottom-display
92
+ );
93
+ }
94
+
95
+ .fr-display--lg {
96
+ @include heading-style(
97
+ $display-lg-font-size,
98
+ 800,
99
+ $font-spectral,
100
+ $margin-bottom-display
101
+ );
102
+ }
103
+
104
+ .fr-display--md {
105
+ @include heading-style(
106
+ $display-md-font-size,
107
+ 800,
108
+ $font-spectral,
109
+ $margin-bottom-display
110
+ );
111
+ }
112
+
113
+ // Classe pour réinitialiser le style de titre (si besoin)
114
+ .fr-text--lead {
115
+ font-family: $font-marianne;
116
+
117
+ // Style spécifique pour un texte d'introduction
118
+ font-size: 1.25rem;
119
+ font-weight: 400;
120
+
121
+ // Autres styles...
122
+ }
package/index.d.ts ADDED
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Type definitions for @nappr/nappr-styles
3
+ *
4
+ * Provides TypeScript support for importing CSS and SCSS files.
5
+ */
6
+
7
+ declare module '*.css' {
8
+ const content: string;
9
+ export default content;
10
+ }
11
+
12
+ declare module '*.scss' {
13
+ const content: { [className: string]: string };
14
+ export default content;
15
+ }
16
+
17
+ declare module '*.module.css' {
18
+ const classes: { [key: string]: string };
19
+ export default classes;
20
+ }
21
+
22
+ declare module '*.module.scss' {
23
+ const classes: { [key: string]: string };
24
+ export default classes;
25
+ }
package/package.json CHANGED
@@ -1,35 +1,69 @@
1
1
  {
2
2
  "name": "@nappr/nappr-styles",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "description": "A collection of SCSS helpers",
5
- "main": "./styles.scss",
6
- "browser": "./dist/styles.css",
5
+ "main": "./dist/styles.min.css",
6
+ "browser": "./dist/styles.min.css",
7
+ "style": "./dist/styles.min.css",
8
+ "types": "./index.d.ts",
9
+ "sass": "./styles.scss",
7
10
  "homepage": "https://sixertoy.github.io/nappr-styles",
8
- "repository": "https://github.com/sixertoy/nappr-styles",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/sixertoy/nappr-styles.git"
14
+ },
9
15
  "author": "sixertoy <sixertoy.github@gmail.com>",
10
16
  "license": "ISC",
17
+ "keywords": [
18
+ "scss",
19
+ "sass",
20
+ "css",
21
+ "styles",
22
+ "helpers",
23
+ "utilities",
24
+ "nappr"
25
+ ],
26
+ "engines": {
27
+ "node": ">=14.0.0"
28
+ },
11
29
  "files": [
12
- "lib",
30
+ "sass",
13
31
  "dist",
14
32
  "docs",
15
33
  "styles.scss",
16
- "variables.module.scss"
34
+ "styles.module.scss",
35
+ "*.d.ts"
17
36
  ],
18
37
  "devDependencies": {
38
+ "cssnano": "^7.1.2",
39
+ "cssnano-preset-advanced": "^7.0.10",
19
40
  "docsify": "^4.13.1",
20
41
  "docsify-cli": "^4.4.4",
21
- "prettier": "^3.3.2",
42
+ "postcss": "^8.5.6",
43
+ "postcss-cli": "^11.0.1",
44
+ "postcss-scss": "^4.0.9",
45
+ "postcss-sort-media-queries": "^5.2.0",
46
+ "prettier": "^3.6.2",
22
47
  "prettier-stylelint": "0.4.2",
23
- "sass": "^1.77.6",
24
- "stylelint": "^16.6.1",
25
- "stylelint-config-standard": "^38.0.0",
48
+ "stylelint": "^16.25.0",
49
+ "stylelint-config-standard": "^39.0.1",
50
+ "stylelint-config-standard-scss": "^16.0.0",
26
51
  "stylelint-order": "^7.0.0",
27
- "stylelint-scss": "^6.3.2"
52
+ "stylelint-scss": "^6.12.1"
53
+ },
54
+ "dependencies": {
55
+ "sass": "^1.93.3",
56
+ "sass-rem": "^4.0.0"
28
57
  },
29
58
  "scripts": {
30
- "cleanup": "rm -rf node_modules",
59
+ "cleanup": "rm -rf node_modules dist",
31
60
  "docs": "docsify serve docs --port=2999",
32
- "dev": "sass --load-path=node_modules styles.scss",
33
- "build": "./.scripts/build.sh"
61
+ "build": "./.scripts/build.sh",
62
+ "lint": "./.scripts/lint.sh",
63
+ "lint:fix": "./.scripts/lint.sh --fix",
64
+ "format": "./.scripts/format.sh",
65
+ "format:check": "./.scripts/format.sh --check",
66
+ "prepublishOnly": "yarn validate && yarn build",
67
+ "validate": "yarn lint && yarn format:check"
34
68
  }
35
69
  }
@@ -0,0 +1,43 @@
1
+ @use './configs/' as configs;
2
+ @use './core/funcs/string' as string;
3
+
4
+ // ==========================================================
5
+ // Mixins
6
+ // ==========================================================
7
+
8
+ /**
9
+ * Export module variables
10
+ * @param {Map} $map - Map containing the variables to export
11
+ * @return {Void}
12
+ */
13
+ @mixin export-moudles-variables($map) {
14
+ @each $token, $vars in $map {
15
+ $prefix: string.capitalize(string.camelize($token));
16
+
17
+ @each $key, $value in $vars {
18
+ $var: string.capitalize(string.camelize($key));
19
+
20
+ nappr#{$prefix}#{$var}: #{$value};
21
+ }
22
+ }
23
+ }
24
+
25
+ // ==========================================================
26
+ // Root variables
27
+ // ==========================================================
28
+ $ROOT_EXPORTS: (
29
+ '': configs.$NAPPR_DEFAULTS,
30
+ 'palette': configs.$NAPPR_PALETTES,
31
+ 'breakpoint': configs.$NAPPR_BREAKPOINTS,
32
+ 'theme': map.get(
33
+ configs.$NAPPR_THEMES,
34
+ map.get(configs.$NAPPR_DEFAULTS, 'default-theme')
35
+ ),
36
+ );
37
+
38
+ // ==========================================================
39
+ // Export module variables
40
+ // ==========================================================
41
+ :export {
42
+ @include export-moudles-variables(globals.$ROOT_EXPORTS);
43
+ }
@@ -0,0 +1,78 @@
1
+ @use 'sass:meta';
2
+ @use './configs/' as configs;
3
+ @use './core/funcs/map' as map;
4
+
5
+ // ==========================================================
6
+ // Mixins
7
+ // ==========================================================
8
+
9
+ // Génère les variables CSS personnalisées pour :root
10
+ // @param {Map} $map - Map contenant les configurations à exporter
11
+ // @param {String} $prefix - Préfixe pour les variables
12
+ @mixin generate-root-vars($map, $prefix: '') {
13
+ @each $key, $value in $map {
14
+ $is-map: meta.type-of($value) == 'map';
15
+
16
+ @if $is-map {
17
+ @include generate-root-vars($value, '#{$prefix}#{$key}');
18
+ } @else {
19
+ $name-prefix: if($prefix != '', '#{$prefix}-', '');
20
+ $var-name: '#{$name-prefix}#{$key}';
21
+
22
+ --nappr-#{$var-name}: #{$value};
23
+ }
24
+ }
25
+ }
26
+
27
+ @mixin generate-palette-variables($map) {
28
+ @each $key, $value in $map {
29
+ [data-color='#{$key}'] {
30
+ --nappr-data-color: #{$value};
31
+ }
32
+ }
33
+ }
34
+
35
+ // Génère les variables CSS personnalisées pour chaque thème
36
+ // @param {Map} $map - Map contenant les configurations de thèmes
37
+ @mixin generate-theme-variables($themes) {
38
+ @each $token, $map in $themes {
39
+ [data-theme='#{$token}'] {
40
+ @each $key, $value in $map {
41
+ --nappr-data-color: var(--nappr-palette-#{$token});
42
+ }
43
+ }
44
+ }
45
+ }
46
+
47
+ // ==========================================================
48
+ // Root variables
49
+ // ==========================================================
50
+ $ROOT_EXPORTS: (
51
+ '': configs.$NAPPR_DEFAULTS,
52
+ 'palette': configs.$NAPPR_PALETTES,
53
+ 'breakpoint': configs.$NAPPR_BREAKPOINTS,
54
+ 'grid': configs.$NAPPR_GRID,
55
+ 'spacing': configs.$NAPPR_SPACING,
56
+ 'theme': map.get(
57
+ configs.$NAPPR_THEMES,
58
+ map.get(configs.$NAPPR_DEFAULTS, 'default-theme')
59
+ ),
60
+ );
61
+ $ROOT_THEMES_EXPORTS: (
62
+ 'dark-theme': map.get(configs.$NAPPR_THEMES, 'dark-theme'),
63
+ 'light-theme': map.get(configs.$NAPPR_THEMES, 'light-theme'),
64
+ );
65
+
66
+ // ==========================================================
67
+ // Export root variables
68
+ // ==========================================================
69
+ :root {
70
+ // --- ROOT VARIABLES ---
71
+ @include generate-root-vars($ROOT_EXPORTS);
72
+ }
73
+
74
+ // --- THEME VARIABLES ---
75
+ @include generate-palette-variables(configs.$NAPPR_PALETTES);
76
+
77
+ // --- THEME VARIABLES ---
78
+ @include generate-theme-variables($ROOT_THEMES_EXPORTS);
@@ -0,0 +1 @@
1
+ @use './button/' as *;
@@ -0,0 +1,58 @@
1
+ // ==========================================================
2
+ // BADGE COMPONENT
3
+ // ==========================================================
4
+
5
+ .badge {
6
+ align-items: center;
7
+ border-radius: 0.25rem;
8
+ display: inline-flex;
9
+ font-family: inherit;
10
+ font-weight: 500;
11
+ gap: 0.5rem;
12
+ line-height: var(--nappr-text-line-height);
13
+ text-align: center;
14
+ vertical-align: middle;
15
+ white-space: nowrap;
16
+
17
+ .icon {
18
+ align-items: center;
19
+ display: inline-flex;
20
+ flex-shrink: 0;
21
+ justify-content: center;
22
+ }
23
+
24
+ &.badge--icon-left {
25
+ .icon {
26
+ order: -1;
27
+ }
28
+ }
29
+ }
30
+
31
+ // ==========================================================
32
+ // BADGE SIZES
33
+ // ==========================================================
34
+
35
+ // // Medium size (default)
36
+ .badge,
37
+ .badge--md {
38
+ font-size: 0.875rem;
39
+ padding: 0.5rem 0.25rem;
40
+ }
41
+
42
+ // Small size
43
+ .badge--sm {
44
+ font-size: 0.75rem;
45
+ padding: 0.375rem 0.125rem;
46
+ }
47
+
48
+ // ==========================================================
49
+ // BADGE VARIANTS (STATUS COLORS)
50
+ // ==========================================================
51
+ // Uses theme variables for dynamic theming support
52
+
53
+ @each $key in ('info', 'error', 'debug', 'success', 'warning') {
54
+ .badge--#{$key} {
55
+ background-color: var(--nappr-theme-state-#{$key});
56
+ color: var(--nappr-theme-text-primary);
57
+ }
58
+ }
@@ -0,0 +1,212 @@
1
+ @use 'sass:color';
2
+
3
+ // $COMPONENT_CONFIG: (
4
+ // 'hover-lightness': -10%,
5
+ // 'active-lightness': -15%,
6
+ // ) !default;
7
+
8
+ // ==========================================================
9
+ // BUTTON PLACEHOLDERS
10
+ // ==========================================================
11
+
12
+ %button-base {
13
+ align-items: center;
14
+ border: 0;
15
+ border-radius: 0.25rem;
16
+ cursor: pointer;
17
+ display: inline-flex;
18
+ font-family: inherit;
19
+ font-size: 0.75rem;
20
+ font-weight: 500;
21
+ gap: 0.5rem;
22
+ justify-content: center;
23
+ line-height: 1.2;
24
+ padding: 1rem 0.5rem;
25
+ text-align: center;
26
+ text-decoration: none;
27
+ user-select: none;
28
+ vertical-align: middle;
29
+ white-space: nowrap;
30
+ }
31
+
32
+ // Button disabled state
33
+ %button-disabled {
34
+ cursor: not-allowed;
35
+ opacity: 0.65;
36
+ pointer-events: none;
37
+ }
38
+
39
+ // ==========================================================
40
+ // BUTTON MIXINS
41
+ // ==========================================================
42
+
43
+ @mixin button-interactive {
44
+ &:not(:disabled, .disabled) {
45
+ @content;
46
+ }
47
+ }
48
+
49
+ @mixin button-transition {
50
+ transition:
51
+ background-color 0.15s ease-in-out,
52
+ border-color 0.15s ease-in-out,
53
+ color 0.15s ease-in-out,
54
+ box-shadow 0.15s ease-in-out;
55
+
56
+ // Note: border-color is included for secondary variant which has a border
57
+ }
58
+
59
+ // ==========================================================
60
+ // BUTTON COMPONENT
61
+ // ==========================================================
62
+
63
+ .btn {
64
+ @extend %button-base;
65
+ @include mixins.button-transition;
66
+
67
+ // Icon support
68
+ .icon {
69
+ align-items: center;
70
+ display: inline-flex;
71
+ flex-shrink: 0;
72
+ justify-content: center;
73
+ }
74
+
75
+ // Icon only (no text)
76
+ &.btn--icon-only {
77
+ aspect-ratio: 1;
78
+ padding: config.$NAPPR_BUTTON_PADDING_Y;
79
+
80
+ .icon {
81
+ margin: 0;
82
+ }
83
+ }
84
+
85
+ // Icon on the left
86
+ &.btn--icon-left {
87
+ .icon {
88
+ order: -1;
89
+ }
90
+ }
91
+
92
+ // Icon on the right (default)
93
+ &.btn--icon-right {
94
+ .icon {
95
+ order: 1;
96
+ }
97
+ }
98
+
99
+ // Hover state
100
+ @include mixins.button-interactive {
101
+ &:hover {
102
+ text-decoration: none;
103
+ }
104
+ }
105
+
106
+ // Disabled state
107
+ &:disabled,
108
+ &.disabled {
109
+ @extend %button-disabled;
110
+ }
111
+
112
+ // Focus state
113
+ &:focus-visible {
114
+ outline: 2px solid var(--nappr-theme-accent);
115
+ outline-offset: 2px;
116
+ }
117
+
118
+ // No outline modifier
119
+ &.btn--no-outline {
120
+ &:focus-visible {
121
+ outline: none;
122
+ }
123
+ }
124
+ }
125
+
126
+ // ==========================================================
127
+ // BUTTON VARIANTS (PRIORITIES)
128
+ // ==========================================================
129
+
130
+ // Primary (default)
131
+ .btn--primary {
132
+ background-color: var(--nappr-theme-accent);
133
+ border: 0;
134
+ color: var(--nappr-theme-text-primary);
135
+
136
+ @include mixins.button-interactive {
137
+ &:hover {
138
+ // Use color-mix for hover state (darken by 10%)
139
+ background-color: color-mix(
140
+ in srgb,
141
+ var(--nappr-theme-accent) 90%,
142
+ black 10%
143
+ );
144
+ }
145
+
146
+ &:active {
147
+ // Use color-mix for active state (darken by 15%)
148
+ background-color: color-mix(
149
+ in srgb,
150
+ var(--nappr-theme-accent) 85%,
151
+ black 15%
152
+ );
153
+ }
154
+ }
155
+ }
156
+
157
+ // Secondary (variant of primary)
158
+ .btn--secondary {
159
+ background-color: transparent;
160
+ border: 1px solid var(--nappr-theme-accent);
161
+ color: var(--nappr-theme-accent);
162
+
163
+ @include mixins.button-interactive {
164
+ &:hover {
165
+ background-color: var(--nappr-theme-accent);
166
+ color: var(--nappr-theme-text-primary);
167
+ }
168
+
169
+ &:active {
170
+ background-color: color-mix(
171
+ in srgb,
172
+ var(--nappr-theme-accent) 90%,
173
+ black 10%
174
+ );
175
+ border-color: color-mix(
176
+ in srgb,
177
+ var(--nappr-theme-accent) 90%,
178
+ black 10%
179
+ );
180
+ color: var(--nappr-theme-text-primary);
181
+ }
182
+ }
183
+ }
184
+
185
+ // Tertiary (border only, background on hover)
186
+ .btn--tertiary {
187
+ background-color: transparent;
188
+ border: 1px solid var(--nappr-theme-accent);
189
+ color: var(--nappr-theme-accent);
190
+
191
+ @include mixins.button-interactive {
192
+ &:hover {
193
+ background-color: var(--nappr-theme-accent);
194
+ border-color: var(--nappr-theme-accent);
195
+ color: var(--nappr-theme-text-primary);
196
+ }
197
+
198
+ &:active {
199
+ background-color: color-mix(
200
+ in srgb,
201
+ var(--nappr-theme-accent) 90%,
202
+ black 10%
203
+ );
204
+ border-color: color-mix(
205
+ in srgb,
206
+ var(--nappr-theme-accent) 90%,
207
+ black 10%
208
+ );
209
+ color: var(--nappr-theme-text-primary);
210
+ }
211
+ }
212
+ }