@keenmate/pure-admin-core 1.0.0-rc01

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 (167) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +172 -0
  3. package/dist/css/main.css +11542 -0
  4. package/dist/fonts/Delivery/Delivery_W_Bd.woff2 +0 -0
  5. package/dist/fonts/Delivery/Delivery_W_BdIt.woff2 +0 -0
  6. package/dist/fonts/Delivery/Delivery_W_CdBlk.woff2 +0 -0
  7. package/dist/fonts/Delivery/Delivery_W_CdLt.woff2 +0 -0
  8. package/dist/fonts/Delivery/Delivery_W_It.woff2 +0 -0
  9. package/dist/fonts/Delivery/Delivery_W_Lt.woff2 +0 -0
  10. package/dist/fonts/Delivery/Delivery_W_LtIt.woff2 +0 -0
  11. package/dist/fonts/Delivery/Delivery_W_Rg.woff2 +0 -0
  12. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8UH-qVHQ.woff2 +0 -0
  13. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8UH-qVHQ.woff2.1 +0 -0
  14. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8UH-qVHQ.woff2.2 +0 -0
  15. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8VH-qVHQ.woff2 +0 -0
  16. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8VH-qVHQ.woff2.1 +0 -0
  17. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8VH-qVHQ.woff2.2 +0 -0
  18. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8bH-o.woff2 +0 -0
  19. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8bH-o.woff2.1 +0 -0
  20. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8fH-qVHQ.woff2 +0 -0
  21. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8fH-qVHQ.woff2.1 +0 -0
  22. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8fH-qVHQ.woff2.2 +0 -0
  23. package/dist/fonts/google/6aez4K2oVqwIvtE2H68T.woff2 +0 -0
  24. package/dist/fonts/google/6aez4K2oVqwIvtU2Hw.woff2 +0 -0
  25. package/dist/fonts/google/6aez4K2oVqwIvtY2H68T.woff2 +0 -0
  26. package/dist/fonts/google/6aez4K2oVqwIvtg2H68T.woff2 +0 -0
  27. package/dist/fonts/google/6aez4K2oVqwIvto2H68T.woff2 +0 -0
  28. package/dist/fonts/google/6aez4K2oVqwIvts2H68T.woff2 +0 -0
  29. package/dist/fonts/google/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8SX21nejog.woff2 +0 -0
  30. package/dist/fonts/google/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8SX21nijogp5.woff2 +0 -0
  31. package/dist/fonts/google/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8SX21nmjogp5.woff2 +0 -0
  32. package/dist/fonts/google/PN_xRfK9oXHga0XdZ8g_vT0.woff2 +0 -0
  33. package/dist/fonts/google/PN_xRfK9oXHga0XdZsg_.woff2 +0 -0
  34. package/dist/fonts/google/PN_xRfK9oXHga0XdaMg_vT0.woff2 +0 -0
  35. package/dist/fonts/google/TK3tWkYFABsmjsphPho.woff2 +0 -0
  36. package/dist/fonts/google/TK3tWkYFABsmjspuPho7vA.woff2 +0 -0
  37. package/dist/fonts/google/TK3tWkYFABsmjspvPho7vA.woff2 +0 -0
  38. package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6VjTYJwQj.woff2 +0 -0
  39. package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6VjXYJwQj.woff2 +0 -0
  40. package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6Vj_YJwQj.woff2 +0 -0
  41. package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6VjbYJwQj.woff2 +0 -0
  42. package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6VjvYJw.woff2 +0 -0
  43. package/dist/fonts/google/fonts-tracklist.txt +48 -0
  44. package/dist/fonts/google/vEFO2_JTCgwQ5ejvMV0O96D01E8J0tJXHKbBjM4.woff2 +0 -0
  45. package/dist/fonts/google/vEFO2_JTCgwQ5ejvMV0O96D01E8J0tJXHKbOjM7sfA.woff2 +0 -0
  46. package/dist/fonts/google/vEFO2_JTCgwQ5ejvMV0O96D01E8J0tJXHKbPjM7sfA.woff2 +0 -0
  47. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfLtrftV.woff2 +0 -0
  48. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfXtrftV.woff2 +0 -0
  49. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtrQ.woff2 +0 -0
  50. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfjtrftV.woff2 +0 -0
  51. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfntrftV.woff2 +0 -0
  52. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfrtrftV.woff2 +0 -0
  53. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfvtrftV.woff2 +0 -0
  54. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_B-bnBeA.woff2 +0 -0
  55. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_C-bk.woff2 +0 -0
  56. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_G-bnBeA.woff2 +0 -0
  57. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_M-bnBeA.woff2 +0 -0
  58. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_N-bnBeA.woff2 +0 -0
  59. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_P-bnBeA.woff2 +0 -0
  60. package/package.json +60 -0
  61. package/snippets/alerts.html +281 -0
  62. package/snippets/badges.html +212 -0
  63. package/snippets/buttons.html +287 -0
  64. package/snippets/cards.html +393 -0
  65. package/snippets/checkbox-lists.html +490 -0
  66. package/snippets/code.html +225 -0
  67. package/snippets/command-palette.html +210 -0
  68. package/snippets/comparison.html +428 -0
  69. package/snippets/customization.html +142 -0
  70. package/snippets/forms.html +477 -0
  71. package/snippets/grid.html +338 -0
  72. package/snippets/layout.html +598 -0
  73. package/snippets/lists.html +232 -0
  74. package/snippets/loaders.html +183 -0
  75. package/snippets/manifest.json +388 -0
  76. package/snippets/modal-dialogs.html +411 -0
  77. package/snippets/modals.html +310 -0
  78. package/snippets/popconfirm.html +253 -0
  79. package/snippets/profile.html +264 -0
  80. package/snippets/tables.html +317 -0
  81. package/snippets/tabs.html +930 -0
  82. package/snippets/timeline.html +364 -0
  83. package/snippets/toasts.html +154 -0
  84. package/snippets/tooltips.html +411 -0
  85. package/snippets/typography.html +101 -0
  86. package/snippets/utilities.html +595 -0
  87. package/snippets/virtual-scroll.html +322 -0
  88. package/snippets/web-daterangepicker.html +634 -0
  89. package/snippets/web-multiselect.html +362 -0
  90. package/src/scss/.claude/settings.local.json +11 -0
  91. package/src/scss/_base-css-variables.scss +348 -0
  92. package/src/scss/_core.scss +99 -0
  93. package/src/scss/_fonts.scss +67 -0
  94. package/src/scss/_purecss-grid-responsive.scss +138 -0
  95. package/src/scss/_purecss-grid.scss +58 -0
  96. package/src/scss/_variables.scss +14 -0
  97. package/src/scss/core-components/_alerts.scss +212 -0
  98. package/src/scss/core-components/_badges.scss +16 -0
  99. package/src/scss/core-components/_base.scss +124 -0
  100. package/src/scss/core-components/_buttons.scss +473 -0
  101. package/src/scss/core-components/_cards.scss +285 -0
  102. package/src/scss/core-components/_checkbox-lists.scss +289 -0
  103. package/src/scss/core-components/_code.scss +141 -0
  104. package/src/scss/core-components/_command-palette.scss +518 -0
  105. package/src/scss/core-components/_comparison.scss +172 -0
  106. package/src/scss/core-components/_file-selector.scss +780 -0
  107. package/src/scss/core-components/_forms.scss +16 -0
  108. package/src/scss/core-components/_grid.scss +264 -0
  109. package/src/scss/core-components/_layout.scss +15 -0
  110. package/src/scss/core-components/_lists.scss +211 -0
  111. package/src/scss/core-components/_loaders.scss +277 -0
  112. package/src/scss/core-components/_logic-tree.scss +280 -0
  113. package/src/scss/core-components/_modals.scss +209 -0
  114. package/src/scss/core-components/_notifications.scss +253 -0
  115. package/src/scss/core-components/_pagers.scss +141 -0
  116. package/src/scss/core-components/_popconfirm.scss +170 -0
  117. package/src/scss/core-components/_profile.scss +281 -0
  118. package/src/scss/core-components/_settings-panel.scss +128 -0
  119. package/src/scss/core-components/_statistics.scss +200 -0
  120. package/src/scss/core-components/_tables.scss +555 -0
  121. package/src/scss/core-components/_tabs.scss +438 -0
  122. package/src/scss/core-components/_timeline.scss +589 -0
  123. package/src/scss/core-components/_toasts.scss +281 -0
  124. package/src/scss/core-components/_tooltips.scss +503 -0
  125. package/src/scss/core-components/_utilities.scss +241 -0
  126. package/src/scss/core-components/_web-components-theme.scss +294 -0
  127. package/src/scss/core-components/badges/_badge-base.scss +131 -0
  128. package/src/scss/core-components/badges/_badge-group.scss +25 -0
  129. package/src/scss/core-components/badges/_composite-badge-variants.scss +396 -0
  130. package/src/scss/core-components/badges/_composite-badge.scss +70 -0
  131. package/src/scss/core-components/badges/_index.scss +10 -0
  132. package/src/scss/core-components/badges/_labels.scss +155 -0
  133. package/src/scss/core-components/forms/_checkboxes-radios.scss +205 -0
  134. package/src/scss/core-components/forms/_form-inputs.scss +100 -0
  135. package/src/scss/core-components/forms/_form-layout.scss +66 -0
  136. package/src/scss/core-components/forms/_form-states.scss +89 -0
  137. package/src/scss/core-components/forms/_index.scss +12 -0
  138. package/src/scss/core-components/forms/_input-groups.scss +149 -0
  139. package/src/scss/core-components/forms/_input-wrapper.scss +89 -0
  140. package/src/scss/core-components/forms/_query-editor.scss +313 -0
  141. package/src/scss/core-components/layout/_index.scss +11 -0
  142. package/src/scss/core-components/layout/_layout-container.scss +105 -0
  143. package/src/scss/core-components/layout/_layout-responsive.scss +100 -0
  144. package/src/scss/core-components/layout/_navbar-elements.scss +238 -0
  145. package/src/scss/core-components/layout/_navbar.scss +71 -0
  146. package/src/scss/core-components/layout/_sidebar-states.scss +228 -0
  147. package/src/scss/core-components/layout/_sidebar.scss +177 -0
  148. package/src/scss/main.scss +7 -0
  149. package/src/scss/themes/_dark-base.scss +207 -0
  150. package/src/scss/themes/audi-light.scss +311 -0
  151. package/src/scss/themes/audi.scss +288 -0
  152. package/src/scss/themes/corporate.scss +203 -0
  153. package/src/scss/themes/dark-blue.scss +152 -0
  154. package/src/scss/themes/dark-green.scss +156 -0
  155. package/src/scss/themes/dark-red.scss +160 -0
  156. package/src/scss/themes/dark.scss +145 -0
  157. package/src/scss/themes/express.scss +281 -0
  158. package/src/scss/themes/minimal.scss +121 -0
  159. package/src/scss/utilities.scss +481 -0
  160. package/src/scss/variables/_base.scss +81 -0
  161. package/src/scss/variables/_colors.scss +148 -0
  162. package/src/scss/variables/_components.scss +509 -0
  163. package/src/scss/variables/_index.scss +13 -0
  164. package/src/scss/variables/_layout.scss +65 -0
  165. package/src/scss/variables/_spacing.scss +66 -0
  166. package/src/scss/variables/_system.scss +80 -0
  167. package/src/scss/variables/_typography.scss +37 -0
@@ -0,0 +1,205 @@
1
+ /* ========================================
2
+ Checkboxes and Radio Buttons
3
+ Custom checkbox component with tri-state support, radio buttons
4
+ ======================================== */
5
+ @use '../../variables' as *;
6
+
7
+ // Checkboxes and Radio Buttons Container
8
+ .pa-checkbox-group,
9
+ .pa-radio-group {
10
+ display: flex;
11
+ flex-direction: column;
12
+ gap: $form-scale;
13
+ }
14
+
15
+ // ============================================================================
16
+ // Custom Checkbox Component (Tri-State Support)
17
+ // ============================================================================
18
+ // States: unchecked, checked, indeterminate
19
+ // Set indeterminate via JS: checkbox.indeterminate = true
20
+ // ============================================================================
21
+ .pa-checkbox {
22
+ display: inline-flex;
23
+ align-items: center;
24
+ gap: $spacing-sm;
25
+ cursor: pointer;
26
+ font-size: $font-size-sm;
27
+ color: var(--pa-text-primary);
28
+ user-select: none;
29
+
30
+ // Hide native checkbox (visually hidden but accessible)
31
+ input[type="checkbox"] {
32
+ position: absolute;
33
+ opacity: 0;
34
+ width: 0;
35
+ height: 0;
36
+ pointer-events: none;
37
+ }
38
+
39
+ // Custom checkbox box
40
+ &__box {
41
+ position: relative;
42
+ width: $checkbox-size;
43
+ height: $checkbox-size;
44
+ border: $checkbox-border-width solid var(--pa-checkbox-border-color);
45
+ border-radius: $checkbox-border-radius;
46
+ background-color: var(--pa-checkbox-bg);
47
+ transition: all $checkbox-transition $easing-snappy;
48
+ flex-shrink: 0;
49
+
50
+ // Checkmark/dash (hidden by default)
51
+ &::after {
52
+ content: '';
53
+ position: absolute;
54
+ display: none;
55
+ }
56
+ }
57
+
58
+ // Hover state
59
+ &:hover &__box {
60
+ border-color: var(--pa-checkbox-border-color-hover);
61
+ }
62
+
63
+ // Focus state (keyboard navigation)
64
+ input:focus-visible + &__box {
65
+ box-shadow: var(--pa-checkbox-focus-shadow);
66
+ border-color: var(--pa-checkbox-border-color-checked);
67
+ }
68
+
69
+ // Checked state
70
+ input:checked + &__box {
71
+ background-color: var(--pa-checkbox-bg-checked);
72
+ border-color: var(--pa-checkbox-border-color-checked);
73
+
74
+ &::after {
75
+ display: block;
76
+ // Checkmark shape (CSS border trick)
77
+ left: 30%;
78
+ top: 10%;
79
+ width: 30%;
80
+ height: 55%;
81
+ border: solid var(--pa-checkbox-checkmark-color);
82
+ border-width: 0 2px 2px 0;
83
+ transform: rotate(45deg);
84
+ }
85
+ }
86
+
87
+ // Indeterminate state (dash)
88
+ input:indeterminate + &__box {
89
+ background-color: var(--pa-checkbox-bg-indeterminate);
90
+ border-color: var(--pa-checkbox-border-color-checked);
91
+
92
+ &::after {
93
+ display: block;
94
+ // Dash shape
95
+ left: 20%;
96
+ top: 45%;
97
+ width: 60%;
98
+ height: 0;
99
+ border: solid var(--pa-checkbox-checkmark-color);
100
+ border-width: 0 0 2px 0;
101
+ transform: none;
102
+ }
103
+ }
104
+
105
+ // Label text
106
+ &__label {
107
+ flex: 1;
108
+ }
109
+
110
+ // Size modifiers - apply to box element
111
+ &--xs &__box { width: $checkbox-size-xs; height: $checkbox-size-xs; }
112
+ &--sm &__box { width: $checkbox-size-sm; height: $checkbox-size-sm; }
113
+ &--lg &__box { width: $checkbox-size-lg; height: $checkbox-size-lg; }
114
+ &--xl &__box { width: $checkbox-size-xl; height: $checkbox-size-xl; }
115
+
116
+ // Checkmark position adjustments for smaller sizes
117
+ &--xs input:checked + &__box::after,
118
+ &--sm input:checked + &__box::after {
119
+ left: 25%;
120
+ top: 5%;
121
+ }
122
+ &--xs input:indeterminate + &__box::after,
123
+ &--sm input:indeterminate + &__box::after {
124
+ top: 40%;
125
+ }
126
+
127
+ // X mark modifier (instead of checkmark)
128
+ &--x input:checked + &__box {
129
+ &::after {
130
+ // First diagonal of X
131
+ left: 50%;
132
+ top: 50%;
133
+ width: 60%;
134
+ height: 0;
135
+ border: solid var(--pa-checkbox-checkmark-color);
136
+ border-width: 0 0 2px 0;
137
+ transform: translate(-50%, -50%) rotate(45deg);
138
+ }
139
+ &::before {
140
+ // Second diagonal of X
141
+ content: '';
142
+ position: absolute;
143
+ display: block;
144
+ left: 50%;
145
+ top: 50%;
146
+ width: 60%;
147
+ height: 0;
148
+ border: solid var(--pa-checkbox-checkmark-color);
149
+ border-width: 0 0 2px 0;
150
+ transform: translate(-50%, -50%) rotate(-45deg);
151
+ }
152
+ }
153
+
154
+ // Disabled state
155
+ &--disabled,
156
+ &:has(input:disabled) {
157
+ opacity: 0.5;
158
+ cursor: not-allowed;
159
+
160
+ .pa-checkbox__box {
161
+ cursor: not-allowed;
162
+ }
163
+ }
164
+ }
165
+
166
+ // ============================================================================
167
+ // Radio Buttons (Native styling)
168
+ // ============================================================================
169
+ .pa-radio {
170
+ display: flex;
171
+ align-items: center;
172
+ gap: $form-scale;
173
+ cursor: pointer;
174
+ font-size: $font-size-sm;
175
+ color: var(--pa-text-primary);
176
+
177
+ input {
178
+ margin: 0;
179
+ width: $checkbox-size;
180
+ height: $checkbox-size;
181
+ cursor: pointer;
182
+ flex-shrink: 0;
183
+ }
184
+
185
+ // Size modifiers
186
+ &--xs input {
187
+ width: $checkbox-size-xs;
188
+ height: $checkbox-size-xs;
189
+ }
190
+
191
+ &--sm input {
192
+ width: $checkbox-size-sm;
193
+ height: $checkbox-size-sm;
194
+ }
195
+
196
+ &--lg input {
197
+ width: $checkbox-size-lg;
198
+ height: $checkbox-size-lg;
199
+ }
200
+
201
+ &--xl input {
202
+ width: $checkbox-size-xl;
203
+ height: $checkbox-size-xl;
204
+ }
205
+ }
@@ -0,0 +1,100 @@
1
+ /* ========================================
2
+ Form Input Elements
3
+ Input, select, textarea base styles and sizes
4
+ ======================================== */
5
+ @use '../../variables' as *;
6
+
7
+ .pa-input {
8
+ width: 100%;
9
+ padding: $input-padding-v $input-padding-h;
10
+ border: $border-width-base solid var(--pa-border-color);
11
+ border-radius: $border-radius;
12
+ font-size: $font-size-sm;
13
+ background-color: var(--pa-input-bg);
14
+ color: var(--pa-text-primary);
15
+ transition: border-color $transition-fast $easing-snappy;
16
+
17
+ &:focus {
18
+ outline: none;
19
+ border-color: var(--pa-input-focus-border-color);
20
+ box-shadow: 0 0 0 $focus-ring-width var(--pa-accent-light);
21
+ }
22
+ }
23
+
24
+ .pa-select {
25
+ width: 100%;
26
+ padding: $select-padding-v $select-padding-h;
27
+ border: $border-width-base solid var(--pa-border-color);
28
+ border-radius: $border-radius;
29
+ font-size: $font-size-sm;
30
+ background-color: var(--pa-input-bg);
31
+ color: var(--pa-text-primary);
32
+ transition: border-color $transition-fast $easing-snappy;
33
+
34
+ &:focus {
35
+ outline: none;
36
+ border-color: var(--pa-select-focus-border-color);
37
+ box-shadow: 0 0 0 $focus-ring-width var(--pa-accent-light);
38
+ }
39
+ }
40
+
41
+ .pa-textarea {
42
+ width: 100%;
43
+ padding: $input-padding-v $input-padding-h;
44
+ border: $border-width-base solid var(--pa-border-color);
45
+ border-radius: $border-radius;
46
+ font-size: $font-size-sm;
47
+ background-color: var(--pa-input-bg);
48
+ color: var(--pa-text-primary);
49
+ transition: border-color $transition-fast $easing-snappy;
50
+ resize: vertical;
51
+ min-height: $textarea-min-height;
52
+
53
+ &:focus {
54
+ outline: none;
55
+ border-color: var(--pa-textarea-focus-border-color);
56
+ box-shadow: 0 0 0 $focus-ring-width var(--pa-accent-light);
57
+ }
58
+
59
+ &::placeholder {
60
+ color: var(--pa-text-secondary);
61
+ }
62
+ }
63
+
64
+ // Input Sizes
65
+ .pa-input--xs,
66
+ .pa-select--xs {
67
+ padding: $input-padding-xs-v $input-padding-h;
68
+ font-size: $font-size-xs;
69
+ }
70
+
71
+ .pa-input--sm,
72
+ .pa-select--sm {
73
+ padding: $input-padding-v $input-padding-h;
74
+ font-size: $font-size-sm;
75
+ }
76
+
77
+ .pa-input--lg,
78
+ .pa-select--lg {
79
+ padding: $input-padding-v $input-padding-h;
80
+ font-size: $font-size-base;
81
+ }
82
+
83
+ .pa-input--xl,
84
+ .pa-select--xl {
85
+ padding: $input-padding-v $input-padding-h;
86
+ font-size: $font-size-lg;
87
+ }
88
+
89
+ // Dark mode: invert native date/time picker icons for visibility
90
+ .pa-mode-dark {
91
+ input[type="date"],
92
+ input[type="time"],
93
+ input[type="datetime-local"],
94
+ input[type="month"],
95
+ input[type="week"] {
96
+ &::-webkit-calendar-picker-indicator {
97
+ filter: invert(1);
98
+ }
99
+ }
100
+ }
@@ -0,0 +1,66 @@
1
+ /* ========================================
2
+ Form Layout
3
+ Form groups, form containers, horizontal layouts
4
+ ======================================== */
5
+ @use '../../variables' as *;
6
+
7
+ // Form Elements
8
+ .pa-form-group {
9
+ margin-bottom: $form-group-margin-bottom;
10
+
11
+ // Remove margins when first/last child in card body (direct, in forms+grids, or in grid columns)
12
+ .pa-card__body > &:first-child,
13
+ .pa-card__body > .pa-form > .pure-g > [class*="pure-u"]:first-child > &:first-child,
14
+ .pa-card__body > [class*="pure-u"]:first-child > &:first-child {
15
+ margin-top: 0;
16
+ }
17
+ .pa-card__body > &:last-child,
18
+ .pa-card__body > .pa-form > .pure-g > [class*="pure-u"]:last-child > &:last-child,
19
+ .pa-card__body > [class*="pure-u"]:last-child > &:last-child {
20
+ margin-bottom: 0;
21
+ }
22
+ }
23
+
24
+ // Horizontal form group (label on left, input on right)
25
+ .pa-form-group--horizontal {
26
+ display: flex;
27
+ align-items: flex-start;
28
+ gap: $spacing-base;
29
+
30
+ label {
31
+ flex-shrink: 0;
32
+ padding-top: $input-padding-v;
33
+ margin-bottom: 0;
34
+ color: var(--pa-text-primary);
35
+ font-weight: $font-weight-medium;
36
+ font-size: $font-size-sm;
37
+ }
38
+
39
+ // Input container takes remaining space
40
+ > .pa-input,
41
+ > .pa-select,
42
+ > .pa-textarea {
43
+ flex: 1;
44
+ }
45
+ }
46
+
47
+ .pa-form {
48
+ .pa-form-group {
49
+ label {
50
+ display: flex;
51
+ align-items: center;
52
+ gap: $form-scale;
53
+ margin-bottom: $form-label-margin-bottom;
54
+ color: var(--pa-text-primary);
55
+ font-weight: $font-weight-medium;
56
+ font-size: $font-size-sm;
57
+ }
58
+ }
59
+
60
+ .pa-form-actions {
61
+ margin-top: $spacing-base;
62
+ display: flex;
63
+ gap: $form-scale;
64
+ flex-wrap: wrap;
65
+ }
66
+ }
@@ -0,0 +1,89 @@
1
+ /* ========================================
2
+ Form Validation States
3
+ Input states (error, success, warning), form groups with states, help text
4
+ ======================================== */
5
+ @use '../../variables' as *;
6
+
7
+ // Input States
8
+ .pa-input--error,
9
+ .pa-select--error {
10
+ border-color: var(--pa-danger-bg);
11
+
12
+ &:focus {
13
+ border-color: var(--pa-danger-bg);
14
+ box-shadow: 0 0 0 $focus-ring-width var(--pa-danger-bg-light);
15
+ }
16
+ }
17
+
18
+ .pa-input--success,
19
+ .pa-select--success {
20
+ border-color: var(--pa-success-bg);
21
+
22
+ &:focus {
23
+ border-color: var(--pa-success-bg);
24
+ box-shadow: 0 0 0 $focus-ring-width var(--pa-success-bg-light);
25
+ }
26
+ }
27
+
28
+ .pa-input--warning,
29
+ .pa-select--warning {
30
+ border-color: var(--pa-warning-bg);
31
+
32
+ &:focus {
33
+ border-color: var(--pa-warning-bg);
34
+ box-shadow: 0 0 0 $focus-ring-width var(--pa-warning-bg-light);
35
+ }
36
+ }
37
+
38
+ // Form Groups with States
39
+ .pa-form-group--error {
40
+ .pa-input,
41
+ .pa-select {
42
+ border-color: var(--pa-danger-bg);
43
+
44
+ &:focus {
45
+ border-color: var(--pa-danger-bg);
46
+ box-shadow: 0 0 0 $focus-ring-width var(--pa-danger-bg-light);
47
+ }
48
+ }
49
+ }
50
+
51
+ .pa-form-group--success {
52
+ .pa-input,
53
+ .pa-select {
54
+ border-color: var(--pa-success-bg);
55
+
56
+ &:focus {
57
+ border-color: var(--pa-success-bg);
58
+ box-shadow: 0 0 0 $focus-ring-width var(--pa-success-bg-light);
59
+ }
60
+ }
61
+ }
62
+
63
+ .pa-form-group--warning {
64
+ .pa-input,
65
+ .pa-select {
66
+ border-color: var(--pa-warning-bg);
67
+
68
+ &:focus {
69
+ border-color: var(--pa-warning-bg);
70
+ box-shadow: 0 0 0 $focus-ring-width var(--pa-warning-bg-light);
71
+ }
72
+ }
73
+ }
74
+
75
+ // Form Help Text
76
+ .pa-form-help {
77
+ display: block;
78
+ margin-top: $form-help-margin-top;
79
+ font-size: $font-size-xs;
80
+ color: var(--pa-text-secondary);
81
+
82
+ &--error {
83
+ color: var(--pa-danger-bg);
84
+ }
85
+
86
+ &--success {
87
+ color: var(--pa-success-bg);
88
+ }
89
+ }
@@ -0,0 +1,12 @@
1
+ /* ========================================
2
+ Forms Index
3
+ Central import point for all form component modules
4
+ ======================================== */
5
+
6
+ @forward 'form-layout';
7
+ @forward 'form-inputs';
8
+ @forward 'form-states';
9
+ @forward 'input-groups';
10
+ @forward 'input-wrapper';
11
+ @forward 'query-editor';
12
+ @forward 'checkboxes-radios';
@@ -0,0 +1,149 @@
1
+ /* ========================================
2
+ Input Groups
3
+ Input groups with prepend/append addons and buttons
4
+ ======================================== */
5
+ @use '../../variables' as *;
6
+
7
+ .pa-input-group {
8
+ display: flex;
9
+ align-items: stretch;
10
+
11
+ .pa-input {
12
+ border-radius: 0;
13
+ flex: 1;
14
+
15
+ &:first-child {
16
+ border-top-left-radius: $border-radius;
17
+ border-bottom-left-radius: $border-radius;
18
+ }
19
+
20
+ &:last-child {
21
+ border-top-right-radius: $border-radius;
22
+ border-bottom-right-radius: $border-radius;
23
+ }
24
+
25
+ &:not(:first-child) {
26
+ border-left: none;
27
+ }
28
+
29
+ &:not(:last-child) {
30
+ border-right: none;
31
+ }
32
+ }
33
+
34
+ &__prepend,
35
+ &__append {
36
+ display: flex;
37
+ align-items: center;
38
+ padding: $input-padding-v $input-padding-h;
39
+ border: $border-width-base solid var(--pa-border-color);
40
+ font-size: $font-size-sm;
41
+ line-height: 1;
42
+ white-space: nowrap;
43
+ border-radius: 0;
44
+ }
45
+
46
+ &__prepend {
47
+ background-color: var(--pa-input-group-prepend-bg);
48
+ color: var(--pa-input-group-prepend-text);
49
+ border-right: none;
50
+
51
+ &:first-child {
52
+ border-top-left-radius: $border-radius;
53
+ border-bottom-left-radius: $border-radius;
54
+ }
55
+ }
56
+
57
+ &__append {
58
+ background-color: var(--pa-input-group-append-bg);
59
+ color: var(--pa-input-group-append-text);
60
+ border-left: none;
61
+
62
+ &:last-child {
63
+ border-top-right-radius: $border-radius;
64
+ border-bottom-right-radius: $border-radius;
65
+ }
66
+ }
67
+
68
+ // Adjacent prepends/appends need borders between them
69
+ &__prepend + &__prepend {
70
+ border-left: $border-width-base solid var(--pa-border-color);
71
+ }
72
+
73
+ &__append + &__append {
74
+ border-left: $border-width-base solid var(--pa-border-color);
75
+ }
76
+
77
+ // When input is focused, only show focus border on edges adjacent to input
78
+ &:focus-within {
79
+ // Last prepend (one before input) gets focus border
80
+ .pa-input-group__prepend {
81
+ border-right: $border-width-base solid var(--pa-input-focus-border-color);
82
+ }
83
+
84
+ // But prepends followed by another prepend keep normal border
85
+ .pa-input-group__prepend:has(+ .pa-input-group__prepend) {
86
+ border-right: none;
87
+ }
88
+
89
+ // First append (one after input) gets focus border
90
+ .pa-input-group__append {
91
+ border-left: $border-width-base solid var(--pa-input-focus-border-color);
92
+ }
93
+
94
+ // But appends following another append keep normal border
95
+ .pa-input-group__append + .pa-input-group__append {
96
+ border-left: $border-width-base solid var(--pa-border-color);
97
+ }
98
+ }
99
+
100
+ &__button {
101
+ border-radius: 0;
102
+ border-color: var(--pa-border-color);
103
+ border-left: none;
104
+
105
+ &:first-child {
106
+ border-top-left-radius: $border-radius;
107
+ border-bottom-left-radius: $border-radius;
108
+ border-left: $border-width-base solid var(--pa-border-color);
109
+ }
110
+
111
+ &:last-child {
112
+ border-top-right-radius: $border-radius;
113
+ border-bottom-right-radius: $border-radius;
114
+ }
115
+ }
116
+
117
+ // Input group sizes - match prepend/append to input sizes
118
+ &--xs {
119
+ .pa-input-group__prepend,
120
+ .pa-input-group__append {
121
+ padding: $input-padding-xs-v $input-padding-h;
122
+ font-size: $font-size-xs;
123
+ }
124
+ }
125
+
126
+ &--sm {
127
+ .pa-input-group__prepend,
128
+ .pa-input-group__append {
129
+ padding: $input-padding-v $input-padding-h;
130
+ font-size: $font-size-sm;
131
+ }
132
+ }
133
+
134
+ &--lg {
135
+ .pa-input-group__prepend,
136
+ .pa-input-group__append {
137
+ padding: $input-padding-v $input-padding-h;
138
+ font-size: $font-size-base;
139
+ }
140
+ }
141
+
142
+ &--xl {
143
+ .pa-input-group__prepend,
144
+ .pa-input-group__append {
145
+ padding: $input-padding-v $input-padding-h;
146
+ font-size: $font-size-lg;
147
+ }
148
+ }
149
+ }
@@ -0,0 +1,89 @@
1
+ /* ========================================
2
+ Input Wrapper
3
+ Input with clear button, search tokens container
4
+ ======================================== */
5
+ @use '../../variables' as *;
6
+
7
+ // Input with clear button wrapper
8
+ .pa-input-wrapper {
9
+ position: relative;
10
+ display: flex;
11
+ flex-wrap: wrap;
12
+ align-items: center;
13
+ gap: $spacing-xs;
14
+ width: 100%;
15
+
16
+ .pa-input,
17
+ .pa-select,
18
+ .pa-virtual-textbox {
19
+ flex: 1;
20
+ min-width: 0; // Allow inputs to shrink below their content size
21
+ padding-right: 4rem; // Make room for clear button
22
+ }
23
+
24
+ &__clear {
25
+ position: absolute;
26
+ right: $spacing-xs;
27
+ top: 50%;
28
+ transform: translateY(-50%);
29
+ background: transparent;
30
+ border: none;
31
+ color: var(--pa-text-secondary);
32
+ cursor: pointer;
33
+ padding: $spacing-xs;
34
+ font-size: $font-size-base;
35
+ line-height: 1;
36
+ opacity: 0.6;
37
+ transition: opacity $transition-fast $easing-snappy;
38
+
39
+ &:hover {
40
+ opacity: 1;
41
+ color: $danger-bg;
42
+ }
43
+
44
+ &:focus {
45
+ outline: none;
46
+ opacity: 1;
47
+ }
48
+
49
+ // Hide when input is empty
50
+ &--hidden {
51
+ display: none;
52
+ }
53
+ }
54
+ }
55
+
56
+ // Search Tokens Container (for query builder badges)
57
+ .pa-search-tokens {
58
+ display: flex;
59
+ flex-wrap: wrap;
60
+ gap: $spacing-xs;
61
+ align-items: center;
62
+ }
63
+
64
+ .pa-search-token-group {
65
+ display: inline-flex;
66
+ align-items: center;
67
+ gap: 2px;
68
+
69
+ .pa-badge {
70
+ margin: 0;
71
+ }
72
+ }
73
+
74
+ .pa-search-token-remove {
75
+ margin-left: $spacing-xs;
76
+ padding: 0 $spacing-xs;
77
+ border: none;
78
+ background: transparent;
79
+ color: currentColor;
80
+ cursor: pointer;
81
+ font-size: 1.2em;
82
+ line-height: 1;
83
+ opacity: 0.7;
84
+ transition: opacity $transition-fast $easing-smooth;
85
+
86
+ &:hover {
87
+ opacity: 1;
88
+ }
89
+ }