ply-css 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/CLAUDE.md +176 -0
  2. package/LICENSE +22 -0
  3. package/PLY.md +646 -0
  4. package/README.md +170 -0
  5. package/dist/css/ply-core.css +6175 -0
  6. package/dist/css/ply-core.min.css +1 -0
  7. package/dist/css/ply-essentials.min.css +1 -0
  8. package/dist/css/ply-helpers.min.css +1 -0
  9. package/dist/css/ply.css +7429 -0
  10. package/dist/css/ply.min.css +1 -0
  11. package/dist/css/styles.css +7432 -0
  12. package/dist/css/styles.min.css +1 -0
  13. package/llms-full.txt +834 -0
  14. package/llms.txt +34 -0
  15. package/package.json +70 -0
  16. package/ply-classes.json +2625 -0
  17. package/snippets/accessible-drag-and-drop.html +122 -0
  18. package/snippets/card.html +58 -0
  19. package/snippets/contact-form.html +49 -0
  20. package/snippets/custom-theme.html +280 -0
  21. package/snippets/dashboard.html +77 -0
  22. package/snippets/data-table.html +64 -0
  23. package/snippets/login-page.html +45 -0
  24. package/snippets/navbar-page.html +39 -0
  25. package/snippets/notifications.html +63 -0
  26. package/snippets/pricing-cards.html +95 -0
  27. package/snippets/responsive-header.html +98 -0
  28. package/snippets/starter-page.html +782 -0
  29. package/snippets/two-column-layout.html +40 -0
  30. package/src/scss/_ply-core-components.scss +32 -0
  31. package/src/scss/_ply.scss +47 -0
  32. package/src/scss/components/_accordion.scss +73 -0
  33. package/src/scss/components/_alignments.scss +64 -0
  34. package/src/scss/components/_autocomplete.scss +28 -0
  35. package/src/scss/components/_blocks-responsive.scss +30 -0
  36. package/src/scss/components/_blocks.scss +39 -0
  37. package/src/scss/components/_buttons.scss +452 -0
  38. package/src/scss/components/_colors.scss +447 -0
  39. package/src/scss/components/_container-queries.scss +35 -0
  40. package/src/scss/components/_cursors.scss +24 -0
  41. package/src/scss/components/_dialog-patterns.scss +176 -0
  42. package/src/scss/components/_dropdown.scss +68 -0
  43. package/src/scss/components/_filterbox.scss +57 -0
  44. package/src/scss/components/_flexible-embed.scss +19 -0
  45. package/src/scss/components/_forms.scss +450 -0
  46. package/src/scss/components/_grid.scss +210 -0
  47. package/src/scss/components/_helpers-core.scss +357 -0
  48. package/src/scss/components/_helpers.scss +466 -0
  49. package/src/scss/components/_labels.scss +105 -0
  50. package/src/scss/components/_livesearch.scss +233 -0
  51. package/src/scss/components/_loader.scss +24 -0
  52. package/src/scss/components/_media-queries.scss +9 -0
  53. package/src/scss/components/_mixins.scss +387 -0
  54. package/src/scss/components/_modal.scss +73 -0
  55. package/src/scss/components/_multi-step-form.scss +190 -0
  56. package/src/scss/components/_navigation-responsive.scss +63 -0
  57. package/src/scss/components/_navigation.scss +592 -0
  58. package/src/scss/components/_notifications.scss +185 -0
  59. package/src/scss/components/_prettyprint.scss +86 -0
  60. package/src/scss/components/_print.scss +74 -0
  61. package/src/scss/components/_progress.scss +32 -0
  62. package/src/scss/components/_reset.scss +365 -0
  63. package/src/scss/components/_rtl.scss +213 -0
  64. package/src/scss/components/_table-interactive.scss +110 -0
  65. package/src/scss/components/_tables.scss +52 -0
  66. package/src/scss/components/_themes.scss +6 -0
  67. package/src/scss/components/_tooltip.scss +35 -0
  68. package/src/scss/components/_typography.scss +565 -0
  69. package/src/scss/components/_upload.scss +19 -0
  70. package/src/scss/components/_variables.scss +129 -0
  71. package/src/scss/ply-core.scss +1 -0
  72. package/src/scss/ply-essentials.scss +15 -0
  73. package/src/scss/ply-helpers.scss +11 -0
  74. package/src/scss/ply-iso.scss +1 -0
  75. package/src/scss/styles.scss +9 -0
@@ -0,0 +1,447 @@
1
+ // * -- ply color variables
2
+ @use "variables";
3
+
4
+ // Base color
5
+ $background-body: #f7f8f8;
6
+ $color-body: #222;
7
+ $color-headings: #000;
8
+ $border-color: #ccc;
9
+
10
+ // Button base colors and pre-computed hover/active states (Sass build-time)
11
+ $btn-primary-light: #0353e9;
12
+ $btn-primary-light-hover: #0347c6;
13
+ $btn-primary-light-active: #023eaf;
14
+ $btn-secondary-light: #393939;
15
+ $btn-secondary-light-hover: #303030;
16
+ $btn-secondary-light-active: #2b2b2b;
17
+ $btn-primary-dark: #4589ff;
18
+ $btn-primary-dark-hover: #619bff;
19
+ $btn-primary-dark-active: #73a6ff;
20
+ $btn-secondary-dark: #a8a8a8;
21
+ $btn-secondary-dark-hover: #b5b5b5;
22
+ $btn-secondary-dark-active: #bebebe;
23
+
24
+ // CSS Custom Properties for theming (light/dark)
25
+ // Inspired by IBM Carbon Design System color tokens
26
+
27
+ :root {
28
+ // Background
29
+ --ply-bg-body: #ffffff;
30
+ --ply-bg-surface: #ffffff;
31
+ --ply-bg-surface-alt: #f4f4f4;
32
+ --ply-bg-muted: #e0e0e0;
33
+
34
+ // Text
35
+ --ply-color-body: #161616;
36
+ --ply-color-headings: #161616;
37
+ --ply-color-secondary: #525252;
38
+ --ply-color-muted: #767676;
39
+ --ply-color-placeholder: #a8a8a8;
40
+ --ply-color-text-inverse: #ffffff;
41
+
42
+
43
+ // Borders
44
+ --ply-border-color: #e0e0e0;
45
+ --ply-border-strong: #8d8d8d;
46
+
47
+ // Interactive
48
+ --ply-color-link: var(--ply-btn-default-bg);
49
+ --ply-color-link-hover: #{$btn-primary-light-hover};
50
+ --ply-color-link-hover: color-mix(in oklch, var(--ply-btn-default-bg), black 15%);
51
+ --ply-color-focus: #0f62fe;
52
+
53
+ // Fields
54
+ --ply-color-field-bg: #f4f4f4;
55
+ --ply-color-input-border: #8d8d8d;
56
+ --ply-color-input-bg: #f4f4f4;
57
+
58
+ // Code
59
+ --ply-color-code-bg: #f4f4f4;
60
+ --ply-color-code-border: #e0e0e0;
61
+
62
+ // Tables
63
+ --ply-color-table-border: #e0e0e0;
64
+ --ply-color-table-stripped: #f4f4f4;
65
+ --ply-color-table-hovered: #e8e8e8;
66
+
67
+ // Accent (brand-neutral — for icons, badges, focus rings. Independent of button color.)
68
+ --ply-color-accent: #{$btn-primary-light};
69
+
70
+ // Buttons (hex fallback + color-mix for custom theme cascade)
71
+ --ply-btn-default-bg: #{$btn-primary-light};
72
+ --ply-btn-default-bg-hover: #{$btn-primary-light-hover};
73
+ --ply-btn-default-bg-hover: color-mix(in oklch, var(--ply-btn-default-bg), black 15%);
74
+ --ply-btn-default-bg-active: #{$btn-primary-light-active};
75
+ --ply-btn-default-bg-active: color-mix(in oklch, var(--ply-btn-default-bg), black 25%);
76
+ --ply-btn-secondary-bg: #{$btn-secondary-light};
77
+ --ply-btn-secondary-bg-hover: #{$btn-secondary-light-hover};
78
+ --ply-btn-secondary-bg-hover: color-mix(in oklch, var(--ply-btn-secondary-bg), black 15%);
79
+ --ply-btn-secondary-bg-active: #{$btn-secondary-light-active};
80
+ --ply-btn-secondary-bg-active: color-mix(in oklch, var(--ply-btn-secondary-bg), black 25%);
81
+ --ply-btn-border-radius: #{variables.$button-radius};
82
+
83
+ // Navigation
84
+ --ply-nav-bg: #ffffff;
85
+ --ply-nav-color: #161616;
86
+ --ply-nav-border: #161616;
87
+ --ply-nav-hover: #e8e8e8;
88
+ --ply-nav-active-color: #525252;
89
+
90
+ // Layers (elevation)
91
+ --ply-layer-0: #ffffff;
92
+ --ply-layer-1: #f4f4f4;
93
+ --ply-layer-2: #e0e0e0;
94
+ --ply-layer-3: #c6c6c6;
95
+ --ply-shadow-1: 0 1px 3px rgba(0, 0, 0, 0.08);
96
+ --ply-shadow-2: 0 2px 8px rgba(0, 0, 0, 0.1);
97
+ --ply-shadow-3: 0 4px 24px rgba(0, 0, 0, 0.12);
98
+
99
+ // Glass
100
+ --ply-bg-glass: rgba(255, 255, 255, 0.15);
101
+
102
+ // Brand backgrounds (WCAG AA — same in both themes, dark saturated values)
103
+ --ply-bg-blue: #0f62fe;
104
+ --ply-bg-blue-hover: #0043ce;
105
+ --ply-bg-blue-active: #002d9c;
106
+ --ply-bg-red: #da1e28;
107
+ --ply-bg-red-hover: #a2191f;
108
+ --ply-bg-red-active: #750e13;
109
+ --ply-bg-green: #198038;
110
+ --ply-bg-green-hover: #0e6027;
111
+ --ply-bg-green-active: #044317;
112
+ --ply-bg-yellow: #f1c21b;
113
+ --ply-bg-yellow-hover: #d2a106;
114
+ --ply-bg-yellow-active: #b28600;
115
+
116
+ // Brand palette (WCAG AA — 4.5:1 vs text-inverse per mode)
117
+ --ply-blue-1: #0f62fe;
118
+ --ply-blue-2: #0043ce;
119
+ --ply-blue-3: #002d9c;
120
+ --ply-red-1: #da1e28;
121
+ --ply-red-2: #a2191f;
122
+ --ply-red-3: #750e13;
123
+ --ply-green-1: #198038;
124
+ --ply-green-2: #0e6027;
125
+ --ply-green-3: #044317;
126
+ --ply-yellow-1: #f1c21b;
127
+ --ply-yellow-2: #d2a106;
128
+ --ply-yellow-3: #b28600;
129
+ --ply-indigo-1: #4f46e5;
130
+ --ply-indigo-2: #3730a3;
131
+ --ply-indigo-3: #312e81;
132
+ --ply-purple-1: #7c3aed;
133
+ --ply-purple-2: #6d28d9;
134
+ --ply-purple-3: #5b21b6;
135
+ --ply-pink-1: #be185d;
136
+ --ply-pink-2: #9d174d;
137
+ --ply-pink-3: #831843;
138
+ --ply-orange-1: #c2410c;
139
+ --ply-orange-2: #9a3412;
140
+ --ply-orange-3: #7c2d12;
141
+ --ply-teal-1: #0f766e;
142
+ --ply-teal-2: #115e59;
143
+ --ply-teal-3: #134e4a;
144
+ --ply-cyan-1: #0e7490;
145
+ --ply-cyan-2: #155e75;
146
+ --ply-cyan-3: #164e63;
147
+
148
+ // Typography
149
+ --ply-font-body: #{variables.$font-family-base};
150
+ --ply-font-heading: #{variables.$font-family-headings};
151
+ --ply-font-mono: #{variables.$font-family-code};
152
+
153
+ // Spacing
154
+ --ply-space-xs: 0.25rem;
155
+ --ply-space-sm: 0.5rem;
156
+ --ply-space-md: 0.75rem;
157
+ --ply-space-lg: 1.5rem;
158
+ --ply-space-xl: 2rem;
159
+ --ply-space-xxl: 3rem;
160
+ }
161
+
162
+ @mixin dark-theme {
163
+ // Background — Carbon Gray 100
164
+ --ply-bg-body: #161616;
165
+ --ply-bg-surface: #262626;
166
+ --ply-bg-surface-alt: #262626;
167
+ --ply-bg-muted: #393939;
168
+
169
+ // Text
170
+ --ply-color-body: #f4f4f4;
171
+ --ply-color-headings: #f4f4f4;
172
+ --ply-color-secondary: #c6c6c6;
173
+ --ply-color-muted: #8d8d8d;
174
+ --ply-color-placeholder: #6f6f6f;
175
+ --ply-color-text-inverse: #161616;
176
+
177
+ // Borders
178
+ --ply-border-color: #393939;
179
+ --ply-border-strong: #6f6f6f;
180
+
181
+ // Interactive
182
+ --ply-color-link: var(--ply-btn-default-bg);
183
+ --ply-color-link-hover: #{$btn-primary-dark-hover};
184
+ --ply-color-link-hover: color-mix(in oklch, var(--ply-btn-default-bg), white 15%);
185
+ --ply-color-focus: #0f62fe;
186
+
187
+ // Fields
188
+ --ply-color-field-bg: #262626;
189
+ --ply-color-input-border: #6f6f6f;
190
+ --ply-color-input-bg: #262626;
191
+
192
+ // Code
193
+ --ply-color-code-bg: #262626;
194
+ --ply-color-code-border: #393939;
195
+
196
+ // Tables
197
+ --ply-color-table-border: #393939;
198
+ --ply-color-table-stripped: #1c1c1c;
199
+ --ply-color-table-hovered: #353535;
200
+
201
+ // Accent
202
+ --ply-color-accent: #{$btn-primary-dark};
203
+
204
+ // Buttons (hex fallback + color-mix for custom theme cascade)
205
+ --ply-btn-default-bg: #{$btn-primary-dark};
206
+ --ply-btn-default-bg-hover: #{$btn-primary-dark-hover};
207
+ --ply-btn-default-bg-hover: color-mix(in oklch, var(--ply-btn-default-bg), white 15%);
208
+ --ply-btn-default-bg-active: #{$btn-primary-dark-active};
209
+ --ply-btn-default-bg-active: color-mix(in oklch, var(--ply-btn-default-bg), white 25%);
210
+ --ply-btn-secondary-bg: #{$btn-secondary-dark};
211
+ --ply-btn-secondary-bg-hover: #{$btn-secondary-dark-hover};
212
+ --ply-btn-secondary-bg-hover: color-mix(in oklch, var(--ply-btn-secondary-bg), white 15%);
213
+ --ply-btn-secondary-bg-active: #{$btn-secondary-dark-active};
214
+ --ply-btn-secondary-bg-active: color-mix(in oklch, var(--ply-btn-secondary-bg), white 25%);
215
+ --ply-btn-default-color: #161616;
216
+ --ply-btn-secondary-color: #161616;
217
+
218
+ // Navigation
219
+ --ply-nav-bg: #161616;
220
+ --ply-nav-color: #f4f4f4;
221
+ --ply-nav-border: #f4f4f4;
222
+ --ply-nav-hover: #353535;
223
+ --ply-nav-active-color: #a8a8a8;
224
+
225
+ // Layers (elevation)
226
+ --ply-layer-0: #161616;
227
+ --ply-layer-1: #262626;
228
+ --ply-layer-2: #393939;
229
+ --ply-layer-3: #525252;
230
+ --ply-shadow-1: 0 1px 3px rgba(0, 0, 0, 0.2);
231
+ --ply-shadow-2: 0 2px 8px rgba(0, 0, 0, 0.3);
232
+ --ply-shadow-3: 0 4px 24px rgba(0, 0, 0, 0.4);
233
+
234
+ // Glass
235
+ --ply-bg-glass: rgba(38, 38, 38, 0.25);
236
+
237
+ // Brand backgrounds (dark mode — same as light, saturated for contrast with white text)
238
+ --ply-bg-blue: #0f62fe;
239
+ --ply-bg-blue-hover: #0043ce;
240
+ --ply-bg-blue-active: #002d9c;
241
+ --ply-bg-red: #da1e28;
242
+ --ply-bg-red-hover: #a2191f;
243
+ --ply-bg-red-active: #750e13;
244
+ --ply-bg-green: #198038;
245
+ --ply-bg-green-hover: #0e6027;
246
+ --ply-bg-green-active: #044317;
247
+ --ply-bg-yellow: #f1c21b;
248
+ --ply-bg-yellow-hover: #d2a106;
249
+ --ply-bg-yellow-active: #b28600;
250
+
251
+ // Brand palette (dark mode — lighter values, same levels)
252
+ --ply-blue-1: #4589ff;
253
+ --ply-blue-2: #78a9ff;
254
+ --ply-blue-3: #a6c8ff;
255
+ --ply-red-1: #ff8389;
256
+ --ply-red-2: #fa4d56;
257
+ --ply-red-3: #da1e28;
258
+ --ply-green-1: #42be65;
259
+ --ply-green-2: #6fdc8c;
260
+ --ply-green-3: #a7f0ba;
261
+ --ply-yellow-1: #f1c21b;
262
+ --ply-yellow-2: #d2a106;
263
+ --ply-yellow-3: #b28600;
264
+ --ply-indigo-1: #818cf8;
265
+ --ply-indigo-2: #a5b4fc;
266
+ --ply-indigo-3: #c7d2fe;
267
+ --ply-purple-1: #a78bfa;
268
+ --ply-purple-2: #c4b5fd;
269
+ --ply-purple-3: #ddd6fe;
270
+ --ply-pink-1: #f472b6;
271
+ --ply-pink-2: #f9a8d4;
272
+ --ply-pink-3: #fbcfe8;
273
+ --ply-orange-1: #fb923c;
274
+ --ply-orange-2: #fdba74;
275
+ --ply-orange-3: #fed7aa;
276
+ --ply-teal-1: #2dd4bf;
277
+ --ply-teal-2: #5eead4;
278
+ --ply-teal-3: #99f6e4;
279
+ --ply-cyan-1: #22d3ee;
280
+ --ply-cyan-2: #67e8f9;
281
+ --ply-cyan-3: #a5f3fc;
282
+ }
283
+
284
+ @media (prefers-color-scheme: dark) {
285
+ :root:not([data-theme]) {
286
+ @include dark-theme;
287
+ }
288
+ }
289
+
290
+ [data-theme="dark"] {
291
+ @include dark-theme;
292
+ }
293
+
294
+ // High contrast mode
295
+
296
+ @mixin high-contrast-light {
297
+ --ply-color-body: #000000;
298
+ --ply-color-headings: #000000;
299
+ --ply-color-secondary: #1a1a1a;
300
+ --ply-color-muted: #333333;
301
+ --ply-border-color: #000000;
302
+ --ply-border-strong: #000000;
303
+ --ply-color-link: #0000ee;
304
+ --ply-color-link-hover: #0000cc;
305
+ --ply-color-code-bg: #ffffff;
306
+ --ply-color-code-border: #000000;
307
+ --ply-color-focus: #000000;
308
+ --ply-shadow-1: none;
309
+ --ply-shadow-2: none;
310
+ --ply-shadow-3: none;
311
+ --ply-layer-1: #ffffff;
312
+ --ply-layer-2: #ffffff;
313
+ --ply-layer-3: #ffffff;
314
+ }
315
+
316
+ @mixin high-contrast-dark {
317
+ --ply-color-body: #ffffff;
318
+ --ply-color-headings: #ffffff;
319
+ --ply-color-secondary: #e5e5e5;
320
+ --ply-color-muted: #cccccc;
321
+ --ply-border-color: #ffffff;
322
+ --ply-border-strong: #ffffff;
323
+ --ply-color-link: #6eb5ff;
324
+ --ply-color-link-hover: #a6d0ff;
325
+ --ply-color-code-bg: #000000;
326
+ --ply-color-code-border: #ffffff;
327
+ --ply-color-focus: #ffffff;
328
+ --ply-shadow-1: none;
329
+ --ply-shadow-2: none;
330
+ --ply-shadow-3: none;
331
+ --ply-layer-1: #161616;
332
+ --ply-layer-2: #161616;
333
+ --ply-layer-3: #161616;
334
+ }
335
+
336
+ @media (prefers-contrast: more) {
337
+ :root {
338
+ @include high-contrast-light;
339
+ }
340
+ }
341
+
342
+ @media (prefers-contrast: more) and (prefers-color-scheme: dark) {
343
+ :root:not([data-theme]) {
344
+ @include high-contrast-dark;
345
+ }
346
+ }
347
+
348
+ @media (prefers-contrast: more) {
349
+ [data-theme="dark"] {
350
+ @include high-contrast-dark;
351
+ }
352
+ }
353
+
354
+ // Colors
355
+ $color-gray: #e0e3e5;
356
+ $color-black: #0f0f0f;
357
+ $color-blue: #2575ed;
358
+ $color-red: #de2c3b;
359
+ $color-yellow: #ffc800;
360
+ $color-green: #1a7a32;
361
+ $color-white: #fff;
362
+
363
+ // Extended palette
364
+ $color-indigo: #4f46e5;
365
+ $color-purple: #7c3aed;
366
+ $color-pink: #db2777;
367
+ $color-orange: #ea580c;
368
+ $color-teal: #0d9488;
369
+ $color-cyan: #0891b2;
370
+
371
+ // Colors Dark
372
+ $color-gray-dark: #b3b6b7;
373
+ $color-black-dark: #000;
374
+ $color-blue-dark: #1a52a5;
375
+ $color-red-dark: #b2232f;
376
+ $color-yellow-dark: #cca000;
377
+ $color-green-dark: #237f35;
378
+ $color-indigo-dark: #3730a3;
379
+ $color-purple-dark: #5b21b6;
380
+ $color-pink-dark: #9d174d;
381
+ $color-orange-dark: #c2410c;
382
+ $color-teal-dark: #0f766e;
383
+ $color-cyan-dark: #0e7490;
384
+
385
+ // Colors Light
386
+ $color-gray-light: #f0f1f2;
387
+ $color-black-light: #363738;
388
+ $color-blue-light: #92baf6;
389
+ $color-red-light: #ef969d;
390
+ $color-yellow-light: #ffe480;
391
+ $color-green-light: #96cfa1;
392
+ $color-indigo-light: #a5b4fc;
393
+ $color-purple-light: #c4b5fd;
394
+ $color-pink-light: #f9a8d4;
395
+ $color-orange-light: #fdba74;
396
+ $color-teal-light: #5eead4;
397
+ $color-cyan-light: #67e8f9;
398
+
399
+ // Colors Pastel
400
+ $color-gray-pastel: #f7f8f8;
401
+ $color-black-pastel: #dadada;
402
+ $color-blue-pastel: #d3e3fb;
403
+ $color-red-pastel: #f8d5d8;
404
+ $color-yellow-pastel: #fff4cc;
405
+ $color-green-pastel: #d5ecd9;
406
+ $color-indigo-pastel: #e0e7ff;
407
+ $color-purple-pastel: #ede9fe;
408
+ $color-pink-pastel: #fce7f3;
409
+ $color-orange-pastel: #ffedd5;
410
+ $color-teal-pastel: #ccfbf1;
411
+ $color-cyan-pastel: #cffafe;
412
+
413
+ // Neutrals (gray scale)
414
+ $color-neutral-50: #fafafa;
415
+ $color-neutral-100: #f5f5f5;
416
+ $color-neutral-200: #e5e5e5;
417
+ $color-neutral-300: #d4d4d4;
418
+ $color-neutral-400: #a3a3a3;
419
+ $color-neutral-500: #737373;
420
+ $color-neutral-600: #525252;
421
+ $color-neutral-700: #404040;
422
+ $color-neutral-800: #262626;
423
+ $color-neutral-900: #171717;
424
+
425
+ // Table Color
426
+ $color-table-border: $border-color;
427
+ $color-table-stripped: #f8f8f8;
428
+ $color-table-hovered: #f4f4f4;
429
+
430
+ // Fieldset
431
+ $color-fieldset-border: #ccc;
432
+
433
+ // Code
434
+ $color-code-background: #f4f4f4;
435
+ $color-code-border: #d4d4d4;
436
+
437
+ // Blockquote
438
+ $color-blockquote-border: #ddd;
439
+
440
+ // Input
441
+ $color-input-border: #ccc;
442
+ $color-input-append-background: #f4f4f4;
443
+ $color-input-append-border: #d4d4d4;
444
+
445
+ // Links Color
446
+ $color-link: #134da5;
447
+ $color-link-hover: $color-red;
@@ -0,0 +1,35 @@
1
+ @use "media-queries";
2
+ @use "variables";
3
+
4
+ /* =Container Queries
5
+ -----------------------------------------------------------------------------*/
6
+
7
+ // Wrapper — enables container queries on any element
8
+ .container-query {
9
+ container-type: inline-size;
10
+ }
11
+
12
+ // Container-scoped responsive units
13
+ // Mirror the viewport breakpoints but scope to the container's inline size.
14
+
15
+ $container-breakpoints: (
16
+ "phone": media-queries.$breakpoint-phone,
17
+ "large-phone": media-queries.$breakpoint-large-phone,
18
+ "tablet": media-queries.$breakpoint-tablet,
19
+ "small-desktop": media-queries.$breakpoint-small-desktop,
20
+ );
21
+
22
+ @each $bp-name, $bp-value in $container-breakpoints {
23
+ @container (max-width: #{$bp-value}) {
24
+ @each $name, $value in variables.$unit-scale {
25
+ .container-#{$bp-name}-unit-#{$name} {
26
+ max-width: $value;
27
+ flex-basis: $value;
28
+ }
29
+ }
30
+ .container-#{$bp-name}-unit-auto {
31
+ flex-basis: 0;
32
+ flex-grow: 1;
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,24 @@
1
+ /* =Cursor Helpers
2
+ -----------------------------------------------------------------------------*/
3
+
4
+ $cursor-map: (
5
+ "pointer": pointer, "finger": pointer,
6
+ "arrow": default, "default": default,
7
+ "none": none, "progress": progress,
8
+ "help": help, "question-mark": help,
9
+ "text": text, "cell": cell, "plus": cell,
10
+ "crosshair": crosshair, "alias": alias, "shortcut": alias,
11
+ "context-menu": context-menu, "copy": copy,
12
+ "move": move, "no-drop": no-drop, "not-allowed": not-allowed,
13
+ "all-scroll": all-scroll, "ew-resize": ew-resize,
14
+ "col-resize": col-resize, "ns-resize": ns-resize,
15
+ "row-resize": row-resize, "nesw-resize": nesw-resize,
16
+ "n-resize": n-resize, "e-resize": e-resize,
17
+ "s-resize": s-resize, "w-resize": w-resize,
18
+ "ne-resize": ne-resize, "nw-resize": nw-resize,
19
+ "sw-resize": sw-resize, "se-resize": se-resize,
20
+ );
21
+
22
+ @each $name, $value in $cursor-map {
23
+ .cursor-#{$name} { cursor: $value; }
24
+ }
@@ -0,0 +1,176 @@
1
+ @use "colors";
2
+ @use "variables";
3
+
4
+ /* =Dialog Patterns — Nested/stacked dialog styling
5
+ -----------------------------------------------------------------------------*/
6
+
7
+ /* Dialog Sizes */
8
+ dialog.dialog-sm {
9
+ max-width: 24rem;
10
+ }
11
+
12
+ dialog.dialog-lg {
13
+ max-width: 48rem;
14
+ }
15
+
16
+ dialog.dialog-full {
17
+ max-width: calc(100vw - 2rem);
18
+ max-height: calc(100vh - 2rem);
19
+ width: 100%;
20
+ height: 100%;
21
+ }
22
+
23
+ /* Dialog Layout Sections */
24
+ dialog {
25
+ .dialog-header {
26
+ display: flex;
27
+ align-items: center;
28
+ justify-content: space-between;
29
+ padding: variables.$padding * 1.33 variables.$base-line;
30
+ border-bottom: 1px solid var(--ply-border-color);
31
+
32
+ h1, h2, h3, h4, h5, h6 {
33
+ margin: 0;
34
+ font-size: variables.$font-size-lg;
35
+ }
36
+ }
37
+
38
+ .dialog-body {
39
+ padding: variables.$base-line;
40
+ overflow-y: auto;
41
+ }
42
+
43
+ .dialog-footer {
44
+ display: flex;
45
+ align-items: center;
46
+ justify-content: flex-end;
47
+ gap: variables.$grid-gutter-width;
48
+ padding: variables.$padding * 1.33 variables.$base-line;
49
+ border-top: 1px solid var(--ply-border-color);
50
+ }
51
+
52
+ .dialog-close {
53
+ display: inline-flex;
54
+ align-items: center;
55
+ justify-content: center;
56
+ width: 2rem;
57
+ height: 2rem;
58
+ padding: 0;
59
+ border: none;
60
+ background: none;
61
+ color: var(--ply-color-secondary);
62
+ font-size: variables.$font-size-xl;
63
+ cursor: pointer;
64
+ border-radius: variables.$border-radius;
65
+ transition: background-color 0.15s ease;
66
+
67
+ &:hover {
68
+ background-color: var(--ply-bg-surface-alt);
69
+ color: var(--ply-color-body);
70
+ }
71
+
72
+ &:focus-visible {
73
+ outline: 2px solid var(--ply-color-focus, colors.$color-blue);
74
+ outline-offset: 2px;
75
+ }
76
+ }
77
+ }
78
+
79
+ /* Stacked Dialogs — z-index layering */
80
+ dialog[open] {
81
+ &.dialog-layer-1 {
82
+ z-index: 100;
83
+ }
84
+
85
+ &.dialog-layer-2 {
86
+ z-index: 110;
87
+ }
88
+
89
+ &.dialog-layer-3 {
90
+ z-index: 120;
91
+ }
92
+ }
93
+
94
+ dialog::backdrop {
95
+ background: var(--ply-backdrop, rgba(0, 0, 0, 0.5));
96
+ }
97
+
98
+ dialog.dialog-layer-2::backdrop {
99
+ background: var(--ply-backdrop-nested, rgba(0, 0, 0, 0.35));
100
+ }
101
+
102
+ dialog.dialog-layer-3::backdrop {
103
+ background: var(--ply-backdrop-nested, rgba(0, 0, 0, 0.25));
104
+ }
105
+
106
+ /* Confirmation Dialog — compact variant */
107
+ dialog.dialog-confirm {
108
+ max-width: 28rem;
109
+ text-align: center;
110
+
111
+ .dialog-body {
112
+ padding: variables.$base-line * 1.33 variables.$base-line variables.$padding * 1.33;
113
+ }
114
+
115
+ .dialog-footer {
116
+ justify-content: center;
117
+ border-top: none;
118
+ padding-top: 0;
119
+ }
120
+ }
121
+
122
+ /* Dialog with scrollable body */
123
+ dialog.dialog-scroll[open] {
124
+ display: flex;
125
+ flex-direction: column;
126
+ max-height: calc(100vh - 4rem);
127
+
128
+ .dialog-body {
129
+ flex: 1 1 auto;
130
+ overflow-y: auto;
131
+ min-height: 0;
132
+ }
133
+
134
+ .dialog-header,
135
+ .dialog-footer {
136
+ flex-shrink: 0;
137
+ }
138
+ }
139
+
140
+ /* Dialog animation */
141
+ dialog[open] {
142
+ animation: dialog-fade-in 0.15s ease;
143
+ }
144
+
145
+ dialog[open]::backdrop {
146
+ animation: dialog-backdrop-in 0.15s ease;
147
+ }
148
+
149
+ @keyframes dialog-fade-in {
150
+ from {
151
+ opacity: 0;
152
+ transform: translateY(-0.5rem);
153
+ }
154
+
155
+ to {
156
+ opacity: 1;
157
+ transform: translateY(0);
158
+ }
159
+ }
160
+
161
+ @keyframes dialog-backdrop-in {
162
+ from {
163
+ opacity: 0;
164
+ }
165
+
166
+ to {
167
+ opacity: 1;
168
+ }
169
+ }
170
+
171
+ @media (prefers-reduced-motion: reduce) {
172
+ dialog[open],
173
+ dialog[open]::backdrop {
174
+ animation: none;
175
+ }
176
+ }