@hkdigital/lib-sveltekit 0.1.0 → 0.1.2

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 (87) hide show
  1. package/dist/classes/svelte/audio/AudioScene.svelte.js +1 -1
  2. package/dist/classes/svelte/image/ImageLoader.svelte.js +1 -1
  3. package/dist/classes/svelte/image/ImageScene.svelte.js +1 -1
  4. package/dist/classes/svelte/network-loader/NetworkLoader.svelte.js +1 -1
  5. package/dist/components/area/HkArea.svelte +1 -1
  6. package/dist/components/area/HkArea.svelte.d.ts +14 -0
  7. package/dist/components/area/HkGridArea.svelte +1 -1
  8. package/dist/components/area/HkGridArea.svelte.d.ts +22 -0
  9. package/dist/components/boxes/game-box/GameBox.svelte +112 -0
  10. package/dist/components/boxes/game-box/GameBox.svelte.d.ts +28 -0
  11. package/dist/components/boxes/game-box/gamebox.util.d.ts +32 -0
  12. package/dist/components/boxes/game-box/gamebox.util.js +83 -0
  13. package/dist/components/boxes/index.d.ts +2 -0
  14. package/dist/components/boxes/index.js +2 -0
  15. package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte +199 -0
  16. package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte.d.ts +42 -0
  17. package/dist/components/buttons/button/Button.svelte +75 -0
  18. package/dist/components/buttons/button/Button.svelte.d.ts +40 -0
  19. package/dist/components/buttons/button-text/TextButton.svelte +21 -0
  20. package/dist/components/buttons/button-text/TextButton.svelte.d.ts +12 -0
  21. package/dist/components/buttons/index.d.ts +2 -1
  22. package/dist/components/buttons/index.js +2 -1
  23. package/dist/components/hkdev/blocks/TextBlock.svelte +47 -0
  24. package/dist/components/hkdev/blocks/TextBlock.svelte.d.ts +24 -0
  25. package/dist/components/hkdev/buttons/CheckButton.svelte +63 -0
  26. package/dist/components/hkdev/buttons/CheckButton.svelte.d.ts +34 -0
  27. package/dist/components/icon/HkIcon.svelte +1 -1
  28. package/dist/components/icon/HkIcon.svelte.d.ts +12 -0
  29. package/dist/components/icon/HkTabIcon.svelte +6 -2
  30. package/dist/components/icon/HkTabIcon.svelte.d.ts +21 -0
  31. package/dist/components/image/EnhancedImage.svelte__ +1 -1
  32. package/dist/components/image/ImageBox.svelte.d.ts +19 -0
  33. package/dist/components/image/ResponsiveImage.svelte +1 -1
  34. package/dist/components/image/ResponsiveImage.svelte.d.ts +16 -0
  35. package/dist/components/image/ResponsiveImage.svelte__ +1 -1
  36. package/dist/components/inputs/text-input/TestTextInput.svelte__ +2 -2
  37. package/dist/components/inputs/text-input/TextInput.svelte +1 -1
  38. package/dist/components/inputs/text-input/TextInput.svelte.d.ts +28 -0
  39. package/dist/components/inputs/text-input/TextInput.svelte___ +1 -1
  40. package/dist/components/layout/HkAppLayout.svelte.d.ts +11 -0
  41. package/dist/components/layout/HkGridLayers.svelte +1 -1
  42. package/dist/components/layout/HkGridLayers.svelte.d.ts +23 -0
  43. package/dist/components/panels/plain-panel/PlainPanel.svelte +1 -1
  44. package/dist/components/panels/plain-panel/PlainPanel.svelte.d.ts +12 -0
  45. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +1 -1
  46. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte.d.ts +14 -0
  47. package/dist/components/rows/panel-row-2/PanelRow2.svelte +1 -1
  48. package/dist/components/rows/panel-row-2/PanelRow2.svelte.d.ts +14 -0
  49. package/dist/components/tab-bar/HkTabBar.svelte +1 -1
  50. package/dist/components/tab-bar/HkTabBar.svelte.d.ts +18 -0
  51. package/dist/components/tab-bar/HkTabBarSelector.svelte +1 -1
  52. package/dist/components/tab-bar/HkTabBarSelector.svelte.d.ts +19 -0
  53. package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte.d.ts +10 -0
  54. package/dist/design-system/design-config.d.ts +156 -0
  55. package/dist/design-system/design-config.js +73 -0
  56. package/dist/design-system/tailwind-theme-extend.d.ts +23 -0
  57. package/dist/design-system/tailwind-theme-extend.js +151 -0
  58. package/dist/themes/hkdev/components/blocks/text-block.postcss +41 -0
  59. package/dist/themes/hkdev/components/buttons/button-text.postcss +34 -0
  60. package/dist/themes/hkdev/components/buttons/button.postcss +138 -0
  61. package/dist/themes/hkdev/components/buttons/button.postcss__ +40 -0
  62. package/dist/themes/hkdev/components/buttons/button.postcss___ +91 -0
  63. package/dist/themes/hkdev/components.postcss +8 -2
  64. package/dist/themes/hkdev/globals.postcss +5 -6
  65. package/dist/util/css/css-vars.d.ts +24 -0
  66. package/dist/util/css/css-vars.js +83 -0
  67. package/dist/util/css/index.d.ts +1 -0
  68. package/dist/util/css/index.js +1 -0
  69. package/dist/util/design-system/components/states.d.ts +15 -0
  70. package/dist/util/design-system/components/states.js +22 -0
  71. package/dist/util/design-system/css/clamp.d.ts +17 -0
  72. package/dist/util/design-system/css/clamp.js +66 -0
  73. package/dist/util/design-system/css/root-design-vars.d.ts +77 -0
  74. package/dist/util/design-system/css/root-design-vars.js +100 -0
  75. package/dist/util/design-system/index.d.ts +5 -0
  76. package/dist/util/design-system/index.js +5 -0
  77. package/dist/util/design-system/layout/scaling.d.ts +44 -0
  78. package/dist/util/design-system/layout/scaling.js +97 -0
  79. package/dist/util/design-system/tailwind.d.ts +176 -0
  80. package/dist/util/design-system/tailwind.js +289 -0
  81. package/dist/util/http/index.js +1 -1
  82. package/package.json +18 -18
  83. package/dist/components/buttons/plain-button/PlainButton.svelte +0 -37
  84. package/dist/components/buttons/plain-button/PlainButton.svelte.d.ts +0 -10
  85. package/dist/config/tailwind.extend.d.ts +0 -56
  86. package/dist/config/tailwind.extend.js +0 -64
  87. package/dist/themes/hkdev/components/buttons/plain-button.postcss +0 -73
@@ -1,4 +1,23 @@
1
1
  export default HkTabBarSelector;
2
+ type HkTabBarSelector = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<{
5
+ base?: string;
6
+ bg?: string;
7
+ classes?: string;
8
+ boxBase?: string;
9
+ boxBg?: string;
10
+ boxPadding?: string;
11
+ boxMargin?: string;
12
+ boxClasses?: string;
13
+ boxAttrs?: {
14
+ [attr: string]: any;
15
+ };
16
+ instanceKey?: string | Symbol;
17
+ } & {
18
+ [attr: string]: any;
19
+ }>): void;
20
+ };
2
21
  declare const HkTabBarSelector: import("svelte").Component<{
3
22
  base?: string;
4
23
  bg?: string;
@@ -1,4 +1,14 @@
1
1
  export default CompareLeftRight;
2
+ type CompareLeftRight = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<{
5
+ leftContent?: Snippet<[]>;
6
+ rightContent?: Snippet<[]>;
7
+ classes?: string;
8
+ dividerColor?: string;
9
+ handleColor?: string;
10
+ } & Record<string, any>>): void;
11
+ };
2
12
  declare const CompareLeftRight: import("svelte").Component<{
3
13
  leftContent?: import("svelte").Snippet;
4
14
  rightContent?: import("svelte").Snippet;
@@ -0,0 +1,156 @@
1
+ export namespace DESIGN {
2
+ let width: number;
3
+ let height: number;
4
+ }
5
+ export namespace CLAMPING {
6
+ namespace ui {
7
+ let min: number;
8
+ let max: number;
9
+ }
10
+ namespace textContent {
11
+ let min_1: number;
12
+ export { min_1 as min };
13
+ let max_1: number;
14
+ export { max_1 as max };
15
+ }
16
+ namespace textHeading {
17
+ let min_2: number;
18
+ export { min_2 as min };
19
+ let max_2: number;
20
+ export { max_2 as max };
21
+ }
22
+ namespace textUi {
23
+ let min_3: number;
24
+ export { min_3 as min };
25
+ let max_3: number;
26
+ export { max_3 as max };
27
+ }
28
+ }
29
+ export const TEXT_POINT_SIZES: number[];
30
+ export const VIEWPORT_POINT_SIZES: number[];
31
+ export namespace TEXT_CONTENT_SIZES {
32
+ namespace sm {
33
+ let size: number;
34
+ let lineHeight: number;
35
+ }
36
+ namespace base {
37
+ let size_1: number;
38
+ export { size_1 as size };
39
+ let lineHeight_1: number;
40
+ export { lineHeight_1 as lineHeight };
41
+ }
42
+ namespace lg {
43
+ let size_2: number;
44
+ export { size_2 as size };
45
+ let lineHeight_2: number;
46
+ export { lineHeight_2 as lineHeight };
47
+ }
48
+ }
49
+ export namespace TEXT_HEADING_SIZES {
50
+ namespace h1 {
51
+ let size_3: number;
52
+ export { size_3 as size };
53
+ let lineHeight_3: number;
54
+ export { lineHeight_3 as lineHeight };
55
+ }
56
+ namespace h2 {
57
+ let size_4: number;
58
+ export { size_4 as size };
59
+ let lineHeight_4: number;
60
+ export { lineHeight_4 as lineHeight };
61
+ }
62
+ namespace h3 {
63
+ let size_5: number;
64
+ export { size_5 as size };
65
+ let lineHeight_5: number;
66
+ export { lineHeight_5 as lineHeight };
67
+ }
68
+ namespace h4 {
69
+ let size_6: number;
70
+ export { size_6 as size };
71
+ let lineHeight_6: number;
72
+ export { lineHeight_6 as lineHeight };
73
+ }
74
+ namespace h5 {
75
+ let size_7: number;
76
+ export { size_7 as size };
77
+ let lineHeight_7: number;
78
+ export { lineHeight_7 as lineHeight };
79
+ }
80
+ }
81
+ export namespace TEXT_UI_SIZES {
82
+ export namespace sm_1 {
83
+ let size_8: number;
84
+ export { size_8 as size };
85
+ let lineHeight_8: number;
86
+ export { lineHeight_8 as lineHeight };
87
+ }
88
+ export { sm_1 as sm };
89
+ export namespace base_1 {
90
+ let size_9: number;
91
+ export { size_9 as size };
92
+ let lineHeight_9: number;
93
+ export { lineHeight_9 as lineHeight };
94
+ }
95
+ export { base_1 as base };
96
+ export namespace lg_1 {
97
+ let size_10: number;
98
+ export { size_10 as size };
99
+ let lineHeight_10: number;
100
+ export { lineHeight_10 as lineHeight };
101
+ }
102
+ export { lg_1 as lg };
103
+ }
104
+ export namespace RADIUS_SIZES {
105
+ export let none: string;
106
+ export namespace xs {
107
+ let size_11: number;
108
+ export { size_11 as size };
109
+ }
110
+ export namespace sm_2 {
111
+ let size_12: number;
112
+ export { size_12 as size };
113
+ }
114
+ export { sm_2 as sm };
115
+ export namespace md {
116
+ let size_13: number;
117
+ export { size_13 as size };
118
+ }
119
+ export namespace lg_2 {
120
+ let size_14: number;
121
+ export { size_14 as size };
122
+ }
123
+ export { lg_2 as lg };
124
+ export let full: string;
125
+ }
126
+ export namespace BORDER_WIDTH_SIZES {
127
+ namespace thin {
128
+ let size_15: number;
129
+ export { size_15 as size };
130
+ }
131
+ namespace normal {
132
+ let size_16: number;
133
+ export { size_16 as size };
134
+ }
135
+ namespace thick {
136
+ let size_17: number;
137
+ export { size_17 as size };
138
+ }
139
+ }
140
+ export namespace STROKE_WIDTH_SIZES {
141
+ export namespace thin_1 {
142
+ let size_18: number;
143
+ export { size_18 as size };
144
+ }
145
+ export { thin_1 as thin };
146
+ export namespace normal_1 {
147
+ let size_19: number;
148
+ export { size_19 as size };
149
+ }
150
+ export { normal_1 as normal };
151
+ export namespace thick_1 {
152
+ let size_20: number;
153
+ export { size_20 as size };
154
+ }
155
+ export { thick_1 as thick };
156
+ }
@@ -0,0 +1,73 @@
1
+ /* == Design dimensions == */
2
+
3
+ export const DESIGN = {
4
+ width: 1024,
5
+ height: 768
6
+ };
7
+
8
+ /* == Scaling-clamping behaviour == */
9
+
10
+ export const CLAMPING = {
11
+ ui: { min: 0.3, max: 2 },
12
+ textContent: { min: 0.75, max: 1.5 },
13
+ textHeading: { min: 0.75, max: 2.25 },
14
+ textUi: { min: 0.5, max: 1.25 }
15
+ };
16
+
17
+ /* == Text == */
18
+
19
+ export const TEXT_POINT_SIZES = [
20
+ 1, 2, 4, 6, 8, 10, 11, 12, 16, 20, 24, 28, 32, 36, 50
21
+ ];
22
+
23
+ export const VIEWPORT_POINT_SIZES = [
24
+ 1, 2, 4, 5, 6, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 120, 140, 160, 180,
25
+ 200
26
+ ];
27
+
28
+ export const TEXT_CONTENT_SIZES = {
29
+ sm: { size: 14, lineHeight: 1.5 },
30
+ base: { size: 16, lineHeight: 1.5 },
31
+ lg: { size: 18, lineHeight: 1.4 }
32
+ };
33
+
34
+ export const TEXT_HEADING_SIZES = {
35
+ h1: { size: 32, lineHeight: 1.1 },
36
+ h2: { size: 28, lineHeight: 1.1 },
37
+ h3: { size: 24, lineHeight: 1.2 },
38
+ h4: { size: 20, lineHeight: 1.2 },
39
+ h5: { size: 16, lineHeight: 1.3 }
40
+ };
41
+
42
+ export const TEXT_UI_SIZES = {
43
+ sm: { size: 14, lineHeight: 1.1 },
44
+ base: { size: 16, lineHeight: 1.1 },
45
+ lg: { size: 18, lineHeight: 1.1 }
46
+ };
47
+
48
+ /* == Border radius == */
49
+
50
+ export const RADIUS_SIZES = {
51
+ none: '0px',
52
+ xs: { size: 1 },
53
+ sm: { size: 2 },
54
+ md: { size: 4 },
55
+ lg: { size: 8 },
56
+ full: '9999px'
57
+ };
58
+
59
+ /* == Border width == */
60
+
61
+ export const BORDER_WIDTH_SIZES = {
62
+ thin: { size: 1 },
63
+ normal: { size: 2 },
64
+ thick: { size: 4 }
65
+ };
66
+
67
+ /* == Stroke width == */
68
+
69
+ export const STROKE_WIDTH_SIZES = {
70
+ thin: { size: 1 },
71
+ normal: { size: 2 },
72
+ thick: { size: 4 }
73
+ };
@@ -0,0 +1,23 @@
1
+ export const spacing: {
2
+ [x: string]: string;
3
+ };
4
+ export const fontSize: {
5
+ [x: string]: string | [string, {
6
+ lineHeight: number;
7
+ }];
8
+ };
9
+ export const borderRadius: {
10
+ [x: string]: string;
11
+ };
12
+ export const borderWidth: {
13
+ [key: string]: string;
14
+ };
15
+ export const strokeWidth: {
16
+ [key: string]: string;
17
+ };
18
+ export const outlineWidth: {
19
+ [key: string]: string;
20
+ };
21
+ export const outlineOffset: {
22
+ [key: string]: string;
23
+ };
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Design System Configuration
3
+ * Using CSS Custom Properties (variables) for consistent scaling
4
+ *
5
+ * @note
6
+ * Make sure to import scaling.vars.postcss in your application.
7
+ * It contains CSS variables used by the Tailwind theme extensions defined
8
+ * below
9
+ *
10
+ *
11
+ *
12
+ * FIXME>>>
13
+ *
14
+ * e.g. in your app.postcss:
15
+ *
16
+ * // @import "../src/lib/tailwind/extend/scaling/vars.postcss";
17
+ *
18
+ * <<<FIXME
19
+ *
20
+ * Base units:
21
+ * --scale-w: 0.052vw (Viewport Width Point)
22
+ * --scale-h: 0.09259vh (Viewport Height Point)
23
+ * --scale-viewport: min(var(--scale-w), var(--scale-h)) (Viewport Point)
24
+ * --scale-ui: clamp(0.3, var(--scale-viewport), 2) (UI Point)
25
+ * --scale-text-content: clamp(0.75, var(--scale-viewport), 1.5) (Content Text)
26
+ * --scale-text-heading: clamp(0.75, var(--scale-viewport), 2.25) (Heading Text)
27
+ * --scale-text-ui: clamp(0.5, var(--scale-viewport), 1.25) (UI Text)
28
+ *
29
+ * --
30
+ *
31
+ * UI Points (p) - Clamped scaling values
32
+ * Based on viewport scaling with minimum and maximum bounds
33
+ * to ensure usability across all screen sizes
34
+ *
35
+ * > PREFERRED METHOD FOR UI ELEMENT SCALING
36
+ *
37
+ * Examples:
38
+ * 5p = 5px at design size (clamps between 1.5px and 10px)
39
+ * 10p = 10px at design size (clamps between 3px and 20px)
40
+ * 20p = 20px at design size (clamps between 6px and 40px)
41
+ *
42
+ * Used for:
43
+ * - Component padding and margins
44
+ * - Interface element sizing
45
+ * - Any UI element that needs responsive scaling with guardrails
46
+ *
47
+ * --
48
+ *
49
+ * Text-Based Spacing Units (ut, ct, ht)
50
+ * Scaled by their respective text scaling variables
51
+ *
52
+ * > PREFERRED METHOD FOR TEXT-RELATED SPACING
53
+ *
54
+ * Examples:
55
+ * 4ut = calc(4px * var(--scale-text-ui)) // UI text spacing
56
+ * 4ct = calc(4px * var(--scale-text-content)) // Content text spacing
57
+ * 4ht = calc(4px * var(--scale-text-heading)) // Heading text spacing
58
+ *
59
+ * Used for:
60
+ * - ut: Button padding, form spacing, UI component margins
61
+ * - ct: Paragraph margins, list spacing, content gaps
62
+ * - ht: Heading margins, title spacing
63
+ *
64
+ * --
65
+ *
66
+ * Viewport Points (vp, wp, hp) - Responsive scaling values
67
+ * vp: Uses min of width/height scaling
68
+ * wp: Uses width-based scaling (1920px reference)
69
+ * hp: Uses height-based scaling (1080px reference)
70
+ *
71
+ * > ALTERNATIVE SCALING METHODS
72
+ *
73
+ * Examples:
74
+ * 10vp = calc(10px * var(--scale-viewport))
75
+ * 10wp = calc(10px * var(--scale-w))
76
+ * 10hp = calc(10px * var(--scale-h))
77
+ *
78
+ * Used for:
79
+ * - Interface scaling that needs to fit both width and height
80
+ * - Maintaining aspect ratio of design
81
+ * - Preventing overflow in either direction
82
+ */
83
+ import {
84
+ generateTextBasedSpacing,
85
+ generateViewportBasedSpacing,
86
+ generateTextStyles,
87
+ generateBorderRadiusStyles,
88
+ generateWidthStyles
89
+ } from '../util/design-system/tailwind.js';
90
+
91
+ import {
92
+ TEXT_POINT_SIZES,
93
+ VIEWPORT_POINT_SIZES,
94
+ TEXT_CONTENT_SIZES,
95
+ TEXT_HEADING_SIZES,
96
+ TEXT_UI_SIZES,
97
+ RADIUS_SIZES,
98
+ BORDER_WIDTH_SIZES,
99
+ STROKE_WIDTH_SIZES
100
+ } from './design-config.js';
101
+
102
+ /* == Internals */
103
+
104
+ const TEXT_BASED_SPACING = generateTextBasedSpacing(TEXT_POINT_SIZES);
105
+ const VIEWPORT_BASED_SPACING =
106
+ generateViewportBasedSpacing(VIEWPORT_POINT_SIZES);
107
+
108
+ /* == Exports */
109
+
110
+ export const spacing = {
111
+ ...VIEWPORT_BASED_SPACING,
112
+ ...TEXT_BASED_SPACING
113
+ };
114
+
115
+ export const fontSize = {
116
+ ...TEXT_BASED_SPACING,
117
+
118
+ // Named styles
119
+ ...generateTextStyles(TEXT_CONTENT_SIZES, 'content'),
120
+ ...generateTextStyles(TEXT_HEADING_SIZES, 'heading'),
121
+ ...generateTextStyles(TEXT_UI_SIZES, 'ui')
122
+ };
123
+
124
+ export const borderRadius = {
125
+ // Named styles
126
+ ...generateBorderRadiusStyles(RADIUS_SIZES)
127
+ };
128
+
129
+ export const borderWidth = {
130
+ // Named styles
131
+ ...generateWidthStyles(BORDER_WIDTH_SIZES, 'width')
132
+ };
133
+
134
+ export const strokeWidth = {
135
+ // Named styles
136
+ ...generateWidthStyles(STROKE_WIDTH_SIZES, 'width')
137
+ };
138
+
139
+ export const outlineWidth = {
140
+ // Named styles
141
+ ...generateWidthStyles(STROKE_WIDTH_SIZES, '')
142
+ };
143
+
144
+ export const outlineOffset = {
145
+ // Named styles
146
+ ...generateWidthStyles(STROKE_WIDTH_SIZES, '')
147
+ };
148
+
149
+ // console.log('borderWidth', borderWidth);
150
+ // console.log('outlineWidth', outlineWidth);
151
+ // console.log('outlineOffset', outlineOffset);
@@ -0,0 +1,41 @@
1
+ @define-mixin text_block {
2
+
3
+ /* .on-primary-dark
4
+ {
5
+ & [data-title-text-button-block] {
6
+ & > .title-box {
7
+ @apply text-white;
8
+ }
9
+
10
+ & > .text-box {
11
+ ...text color
12
+ }
13
+ }
14
+ } */
15
+
16
+ [data-title-text-button-block] {
17
+
18
+ &.block-width {
19
+ @apply w-1/2;
20
+ }
21
+
22
+ & > .title-box {
23
+ @apply text-heading-h3;
24
+ @apply uppercase;
25
+ }
26
+
27
+ & > .content-box .p {
28
+ @apply text-content-base;
29
+ }
30
+
31
+ & > .content-box:has( + .footer-box )
32
+ {
33
+ @apply mb-30p; /* 10p + 20p */
34
+ }
35
+
36
+ & > .footer-box {
37
+ }
38
+ }
39
+
40
+
41
+ }
@@ -0,0 +1,34 @@
1
+ @define-mixin component-button-text {
2
+
3
+ /* @note using CSS vars defined in the parent button postcss */
4
+
5
+ /* Type-based styling for text buttons */
6
+ [data-component="button"][data-type="text"] {
7
+ /* Typography settings */
8
+ @apply text-ui-base uppercase;
9
+ @apply whitespace-nowrap;
10
+
11
+ /* Adjust padding to better fit text */
12
+ /*&[data-size="sm"] {
13
+ @apply px-8ut py-8ut;
14
+ }
15
+
16
+ &[data-size="md"] {
17
+ @apply px-16ut py-12ut;
18
+ }
19
+
20
+ &[data-size="lg"] {
21
+ @apply px-32ut py-16ut;
22
+ }*/
23
+
24
+ /* Role-specific text adjustments */
25
+ &[data-role="primary"] {
26
+ @apply font-extrabold;
27
+ }
28
+
29
+ &[data-role="secondary"] {
30
+ @apply font-bold;
31
+ }
32
+ }
33
+
34
+ }
@@ -0,0 +1,138 @@
1
+ @define-mixin component-button {
2
+ [data-component="button"] {
3
+ /* ---- Core Button Variables ---- */
4
+ /* These are the most reusable across button types */
5
+ --btn-border-width: 2px;
6
+ --btn-transition-duration: 150ms;
7
+ --btn-disabled-opacity: 0.6;
8
+ --btn-focus-ring-width: 3px;
9
+ --btn-focus-ring-opacity: 0.4;
10
+
11
+ /* ---- Primary Button Variables ---- */
12
+ --btn-primary-bg: var(--color-primary-500);
13
+ --btn-primary-text: var(--color-primary-50);
14
+ --btn-primary-border: var(--color-primary-500);
15
+ --btn-primary-selected-bg: var(--color-primary-700);
16
+ --btn-primary-selected-border: var(--color-primary-800);
17
+ --btn-primary-selected-text: var(--color-primary-50);
18
+ --btn-primary-hover-bg: var(--color-primary-600);
19
+ --btn-primary-hover-border: var(--color-primary-600);
20
+ --btn-primary-focus-outline: var(--color-primary-800);
21
+
22
+ /* ---- Secondary Button Variables ---- */
23
+ --btn-secondary-bg: transparent;
24
+ --btn-secondary-text: var(--color-secondary-500);
25
+ --btn-secondary-border: var(--color-secondary-500);
26
+ --btn-secondary-selected-bg: var(--color-secondary-100);
27
+ --btn-secondary-selected-border: var(--color-secondary-600);
28
+ --btn-secondary-selected-text: var(--color-secondary-800);
29
+ --btn-secondary-hover-bg: var(--color-secondary-50);
30
+ --btn-secondary-hover-border: var(--color-secondary-500);
31
+ --btn-secondary-focus-outline: var(--color-secondary-800);
32
+
33
+ /* ---- State Variables ---- */
34
+ --btn-active-transform: scale(0.98);
35
+ --btn-active-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.1);
36
+
37
+ --btn-error-border: var(--color-error-500);
38
+ --btn-loading-opacity: 0.8;
39
+
40
+ /* Base styles */
41
+ display: inline-flex;
42
+ justify-content: center;
43
+ align-items: center;
44
+ cursor: pointer;
45
+ position: relative;
46
+ transition-property: background-color, color, border-color, transform, box-shadow;
47
+ transition-duration: var(--btn-transition-duration);
48
+ }
49
+
50
+ /* Size variants */
51
+ [data-component="button"][data-size="sm"] {
52
+ @apply rounded-xs;
53
+ @apply py-8ut px-8ut;
54
+ @apply min-w-24ut min-h-24ut;
55
+ }
56
+
57
+ [data-component="button"][data-size="md"] {
58
+ @apply rounded-sm;
59
+ @apply py-8ut px-16ut;
60
+ @apply min-w-32ut min-h-32ut;
61
+ }
62
+
63
+ [data-component="button"][data-size="lg"] {
64
+ @apply rounded-sm;
65
+ @apply py-16ut px-36ut;
66
+ @apply min-w-36ut min-h-36ut;
67
+ }
68
+
69
+ /* Role-based styling for primary buttons */
70
+ [data-component="button"][data-role="primary"] {
71
+ @apply border-width-normal;
72
+ border-color: rgb(var(--btn-primary-border));
73
+ background-color: rgb(var(--btn-primary-bg));
74
+ color: rgb(var(--btn-primary-text));
75
+
76
+ &:hover:not(:disabled):not(.state-selected) {
77
+ border-color: rgb(var(--btn-primary-hover-border));
78
+ background-color: rgb(var(--btn-primary-hover-bg));
79
+ }
80
+
81
+ &:focus-visible {
82
+ @apply outline outline-normal outline-offset-normal;
83
+ outline-color: rgb(var(--btn-primary-focus-outline));
84
+ }
85
+
86
+ &.state-selected {
87
+ background-color: rgb(var(--btn-primary-selected-bg));
88
+ border-color: rgb(var(--btn-primary-selected-border));
89
+ color: rgb(var(--btn-primary-selected-text));
90
+ }
91
+ }
92
+
93
+ /* Role-based styling for secondary buttons */
94
+ [data-component="button"][data-role="secondary"] {
95
+ @apply border-width-normal;
96
+ border-color: rgb(var(--btn-secondary-border));
97
+ color: rgb(var(--btn-secondary-text));
98
+ background-color: var(--btn-secondary-bg);
99
+
100
+ &:hover:not(:disabled):not(.state-selected) {
101
+ background-color: rgb(var(--btn-secondary-hover-bg));
102
+ border-color: rgb(var(--btn-secondary-hover-border));
103
+ }
104
+
105
+ &:focus-visible {
106
+ @apply outline outline-normal outline-offset-normal;
107
+ outline-color: rgb(var(--btn-secondary-focus-outline));
108
+ }
109
+
110
+ &.state-selected {
111
+ background-color: rgb(var(--btn-secondary-selected-bg));
112
+ border-color: rgb(var(--btn-secondary-selected-border));
113
+ color: rgb(var(--btn-secondary-selected-text));
114
+ }
115
+ }
116
+
117
+ /* State-based styling */
118
+ [data-component="button"].state-active {
119
+ transform: var(--btn-active-transform);
120
+ box-shadow: var(--btn-active-shadow);
121
+ }
122
+
123
+ [data-component="button"].state-error {
124
+ border-color: rgb(var(--btn-error-border));
125
+ }
126
+
127
+ [data-component="button"].state-loading {
128
+ opacity: var(--btn-loading-opacity);
129
+ cursor: wait;
130
+ }
131
+
132
+ /* Disabled state */
133
+ [data-component="button"]:disabled {
134
+ cursor: not-allowed;
135
+ opacity: var(--btn-disabled-opacity);
136
+ pointer-events: none;
137
+ }
138
+ }
@@ -0,0 +1,40 @@
1
+ @define-mixin component-button {
2
+
3
+ [data-component="button"][data-type="plain"] {
4
+
5
+ &:not([disabled]) {
6
+ &[data-role="primary"] {
7
+ @apply ...
8
+ }
9
+
10
+ &[data-role="secondary"] {
11
+ @apply ...
12
+ }
13
+ }
14
+
15
+ &[disabled] {
16
+ &[data-role="primary"] {
17
+ @apply ...
18
+ }
19
+
20
+ &[data-role="secondary"] {
21
+ @apply ...
22
+ }
23
+ }
24
+ }
25
+
26
+ [data-component="button"][data-type="plain"] {
27
+
28
+ &[data-size="sm"] {
29
+ @apply ...
30
+ }
31
+
32
+ &[data-size="md"] {
33
+ @apply ...
34
+ }
35
+
36
+ &[data-size="lg"] {
37
+ @apply ...
38
+ }
39
+ }
40
+ }