tiny-essentials 1.29.0 → 1.29.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 (131) hide show
  1. package/changelog/1/29/1.md +11 -0
  2. package/changelog/1/29/2.md +82 -0
  3. package/dist/v1/TinyBasicsEs.min.js +1 -1
  4. package/dist/v1/TinyEssentials.min.js +1 -1
  5. package/dist/v1/TinyFetchLoader.min.js +1 -0
  6. package/dist/v1/TinyImageLoader.min.js +1 -0
  7. package/dist/v1/TinyMediaCache.min.js +1 -0
  8. package/dist/v1/TinyMediaLoader.min.js +1 -0
  9. package/dist/v1/basics/index.cjs +5 -0
  10. package/dist/v1/basics/index.d.mts +2 -1
  11. package/dist/v1/basics/index.d.mts.map +1 -1
  12. package/dist/v1/basics/index.mjs +2 -1
  13. package/dist/v1/basics/media/youtube.cjs +275 -0
  14. package/dist/v1/basics/media/youtube.d.mts +107 -0
  15. package/dist/v1/basics/media/youtube.d.mts.map +1 -0
  16. package/dist/v1/basics/media/youtube.mjs +214 -0
  17. package/dist/v1/index.cjs +13 -0
  18. package/dist/v1/index.d.mts +6 -1
  19. package/dist/v1/index.d.mts.map +1 -1
  20. package/dist/v1/index.mjs +7 -2
  21. package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.cjs +0 -1
  22. package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.d.mts +0 -1
  23. package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.d.mts.map +1 -1
  24. package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.mjs +0 -1
  25. package/dist/v1/libs/fs/plugins/OPFS/index.cjs +0 -8
  26. package/dist/v1/libs/fs/plugins/OPFS/index.d.mts +0 -8
  27. package/dist/v1/libs/fs/plugins/OPFS/index.d.mts.map +1 -1
  28. package/dist/v1/libs/fs/plugins/OPFS/index.mjs +0 -8
  29. package/dist/v1/libs/html/TinyHtml.cjs +1 -1
  30. package/dist/v1/libs/html/TinyHtml.d.mts +2 -2
  31. package/dist/v1/libs/html/TinyHtml.d.mts.map +1 -1
  32. package/dist/v1/libs/html/TinyHtml.mjs +1 -1
  33. package/dist/v1/libs/html/loader/TinyMediaLoader.cjs +1999 -0
  34. package/dist/v1/libs/html/loader/TinyMediaLoader.d.mts +999 -0
  35. package/dist/v1/libs/html/loader/TinyMediaLoader.d.mts.map +1 -0
  36. package/dist/v1/libs/html/loader/TinyMediaLoader.mjs +1852 -0
  37. package/dist/v1/libs/html/loader/beta/formats/TinyAudioLoader.cjs +77 -0
  38. package/dist/v1/libs/html/loader/beta/formats/TinyAudioLoader.d.mts +103 -0
  39. package/dist/v1/libs/html/loader/beta/formats/TinyAudioLoader.d.mts.map +1 -0
  40. package/dist/v1/libs/html/loader/beta/formats/TinyAudioLoader.mjs +67 -0
  41. package/dist/v1/libs/html/loader/beta/formats/TinyContentLoader.cjs +630 -0
  42. package/dist/v1/libs/html/loader/beta/formats/TinyContentLoader.d.mts +138 -0
  43. package/dist/v1/libs/html/loader/beta/formats/TinyContentLoader.d.mts.map +1 -0
  44. package/dist/v1/libs/html/loader/beta/formats/TinyContentLoader.mjs +576 -0
  45. package/dist/v1/libs/html/loader/beta/formats/TinyVideoLoader.cjs +70 -0
  46. package/dist/v1/libs/html/loader/beta/formats/TinyVideoLoader.d.mts +100 -0
  47. package/dist/v1/libs/html/loader/beta/formats/TinyVideoLoader.d.mts.map +1 -0
  48. package/dist/v1/libs/html/loader/beta/formats/TinyVideoLoader.mjs +60 -0
  49. package/dist/v1/libs/html/loader/beta/probe/TinyMediaProbe.cjs +946 -0
  50. package/dist/v1/libs/html/loader/beta/probe/TinyMediaProbe.d.mts +67 -0
  51. package/dist/v1/libs/html/loader/beta/probe/TinyMediaProbe.d.mts.map +1 -0
  52. package/dist/v1/libs/html/loader/beta/probe/TinyMediaProbe.mjs +896 -0
  53. package/dist/v1/libs/html/loader/formats/TinyFetchLoader.cjs +225 -0
  54. package/dist/v1/libs/html/loader/formats/TinyFetchLoader.d.mts +149 -0
  55. package/dist/v1/libs/html/loader/formats/TinyFetchLoader.d.mts.map +1 -0
  56. package/dist/v1/libs/html/loader/formats/TinyFetchLoader.mjs +197 -0
  57. package/dist/v1/libs/html/loader/formats/TinyImageLoader.cjs +1454 -0
  58. package/dist/v1/libs/html/loader/formats/TinyImageLoader.d.mts +200 -0
  59. package/dist/v1/libs/html/loader/formats/TinyImageLoader.d.mts.map +1 -0
  60. package/dist/v1/libs/html/loader/formats/TinyImageLoader.mjs +1317 -0
  61. package/dist/v1/libs/html/loader/probe/TinyImageProbe.cjs +668 -0
  62. package/dist/v1/libs/html/loader/probe/TinyImageProbe.d.mts +83 -0
  63. package/dist/v1/libs/html/loader/probe/TinyImageProbe.d.mts.map +1 -0
  64. package/dist/v1/libs/html/loader/probe/TinyImageProbe.mjs +626 -0
  65. package/dist/v1/libs/html/loader/utils/TinyBufferReader.cjs +277 -0
  66. package/dist/v1/libs/html/loader/utils/TinyBufferReader.d.mts +118 -0
  67. package/dist/v1/libs/html/loader/utils/TinyBufferReader.d.mts.map +1 -0
  68. package/dist/v1/libs/html/loader/utils/TinyBufferReader.mjs +247 -0
  69. package/dist/v1/libs/html/loader/utils/TinyIsoBox.cjs +128 -0
  70. package/dist/v1/libs/html/loader/utils/TinyIsoBox.d.mts +49 -0
  71. package/dist/v1/libs/html/loader/utils/TinyIsoBox.d.mts.map +1 -0
  72. package/dist/v1/libs/html/loader/utils/TinyIsoBox.mjs +116 -0
  73. package/dist/v1/libs/html/loader/utils/TinyMediaCache.cjs +796 -0
  74. package/dist/v1/libs/html/loader/utils/TinyMediaCache.d.mts +354 -0
  75. package/dist/v1/libs/html/loader/utils/TinyMediaCache.d.mts.map +1 -0
  76. package/dist/v1/libs/html/loader/utils/TinyMediaCache.mjs +734 -0
  77. package/dist/v1/libs/html/loader/utils/TinyMediaMirror.cjs +302 -0
  78. package/dist/v1/libs/html/loader/utils/TinyMediaMirror.d.mts +256 -0
  79. package/dist/v1/libs/html/loader/utils/TinyMediaMirror.d.mts.map +1 -0
  80. package/dist/v1/libs/html/loader/utils/TinyMediaMirror.mjs +280 -0
  81. package/dist/v1/libs/html/loader/utils/TinyMediaProgress.cjs +194 -0
  82. package/dist/v1/libs/html/loader/utils/TinyMediaProgress.d.mts +138 -0
  83. package/dist/v1/libs/html/loader/utils/TinyMediaProgress.d.mts.map +1 -0
  84. package/dist/v1/libs/html/loader/utils/TinyMediaProgress.mjs +175 -0
  85. package/dist/v1/libs/tools/TinyPkgExportValidator.cjs +359 -55
  86. package/dist/v1/libs/tools/TinyPkgExportValidator.d.mts +64 -6
  87. package/dist/v1/libs/tools/TinyPkgExportValidator.d.mts.map +1 -1
  88. package/dist/v1/libs/tools/TinyPkgExportValidator.mjs +320 -57
  89. package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.cjs +0 -1
  90. package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.d.mts +0 -1
  91. package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.d.mts.map +1 -1
  92. package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.mjs +0 -1
  93. package/dist/v1/webTemplates/bootstrap/5.3/scss/background/_background-grid.scss +15 -0
  94. package/dist/v1/webTemplates/bootstrap/5.3/scss/components/buttons/_buttons-contrast.scss +208 -0
  95. package/dist/v1/webTemplates/bootstrap/5.3/scss/components/buttons/_buttons-ghost.scss +89 -0
  96. package/dist/v1/webTemplates/bootstrap/5.3/scss/components/icon/_cube-icon.scss +65 -0
  97. package/dist/v1/webTemplates/bootstrap/5.3/scss/components/icon/_sphere-pulse.scss +39 -0
  98. package/dist/v1/webTemplates/bootstrap/5.3/scss/themes/deepstrap/_badges.scss +90 -0
  99. package/dist/v1/webTemplates/bootstrap/5.3/scss/themes/deepstrap/_bootstrap-overrides.scss +495 -0
  100. package/dist/v1/webTemplates/bootstrap/5.3/scss/themes/deepstrap/_buttons.scss +390 -0
  101. package/dist/v1/webTemplates/bootstrap/5.3/scss/themes/deepstrap/_colors.scss +213 -0
  102. package/dist/v1/webTemplates/bootstrap/5.3/scss/themes/deepstrap/_effects.scss +153 -0
  103. package/dist/v1/webTemplates/bootstrap/5.3/scss/themes/deepstrap/_forms-tones.scss +69 -0
  104. package/dist/v1/webTemplates/bootstrap/5.3/scss/themes/deepstrap/_forms.scss +323 -0
  105. package/dist/v1/webTemplates/bootstrap/5.3/scss/themes/deepstrap/_global.scss +31 -0
  106. package/dist/v1/webTemplates/bootstrap/5.3/scss/themes/deepstrap/_links.scss +47 -0
  107. package/dist/v1/webTemplates/bootstrap/5.3/scss/themes/deepstrap/_tables.scss +25 -0
  108. package/dist/v1/webTemplates/bootstrap/5.3/scss/themes/deepstrap/_theme.scss +21 -0
  109. package/dist/v1/webTemplates/bootstrap/5.3/scss/themes/deepstrap/_tokens.scss +161 -0
  110. package/dist/v1/webTemplates/bootstrap/5.3/scss/themes/deepstrap/_utilities.scss +81 -0
  111. package/dist/v1/webTemplates/bootstrap/5.3/scss/themes/deepstrap/_variables.scss +63 -0
  112. package/dist/v1/webTemplates/bootstrap/5.3/scss/themes/deepstrap/plugins/_form-tone-mixins.scss +236 -0
  113. package/dist/v1/webTemplates/bootstrap/5.3/scss/themes/deepstrap/plugins/_sizing.scss +68 -0
  114. package/dist/v1/webTemplates/bootstrap/5.3/scss/themes/deepstrap/plugins/_tone-mixins.scss +392 -0
  115. package/dist/v1/webTemplates/bootstrap/5.3/scss/themes/deepstrap/plugins/_typography.scss +112 -0
  116. package/dist/v1/webTemplates/bootstrap/5.3/scss/themes/deepstrap/plugins/background/_tiny_gradient_1.scss +131 -0
  117. package/dist/v1/webTemplates/bootstrap/5.3/scss/themes/deepstrap/plugins/colors/_pink.scss +47 -0
  118. package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.cjs +2 -2
  119. package/docs/v1/Exports.md +33 -2
  120. package/docs/v1/README.md +9 -0
  121. package/docs/v1/basics/youtube.md +204 -0
  122. package/docs/v1/libs/html/loader/TinyFetchLoader.md +114 -0
  123. package/docs/v1/libs/html/loader/TinyImageLoader.md +141 -0
  124. package/docs/v1/libs/html/loader/TinyMediaCache.md +166 -0
  125. package/docs/v1/libs/html/loader/TinyMediaLoader.md +300 -0
  126. package/docs/v1/libs/tools/TinyPkgExportValidator.md +55 -0
  127. package/docs/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters.md +0 -4
  128. package/docs/v1/webTemplates/bootstrap/5.3/DeepStrap.md +177 -0
  129. package/package.json +281 -17
  130. /package/dist/v1/webTemplates/bootstrap/5.3/scss/input/{Placeholder-Colors-Fix.scss → _placeholder-colors-fix.scss} +0 -0
  131. /package/dist/v1/webTemplates/bootstrap/5.3/scss/spacing/{Spacing-Plus.scss → _spacing-plus.scss} +0 -0
@@ -0,0 +1,161 @@
1
+ @use 'sass:color';
2
+ @use 'sass:map';
3
+ @use 'colors' as *;
4
+
5
+ // ------------------------------------------------------------------ helpers --
6
+ /// @param {Color} $color - Source colour.
7
+ /// @returns {String} Comma separated channels, for legacy `rgba()`.
8
+ @function channels($color) {
9
+ @return #{color.channel($color, 'red', $space: rgb)},
10
+ #{color.channel($color, 'green', $space: rgb)}, #{color.channel($color, 'blue', $space: rgb)};
11
+ }
12
+
13
+ /// @param {Color} $color - Source colour.
14
+ /// @returns {String} Space separated channels, for `rgb(var(--x) / a)`.
15
+ @function triplet($color) {
16
+ @return #{color.channel($color, 'red', $space: rgb)}
17
+ #{color.channel($color, 'green', $space: rgb)} #{color.channel($color, 'blue', $space: rgb)};
18
+ }
19
+
20
+ @mixin theme-properties($theme) {
21
+ @each $name, $value in $theme {
22
+ --ui-#{$name}: #{$value};
23
+ --ui-#{$name}-rgb: #{triplet($value)};
24
+ }
25
+ }
26
+
27
+ $alphas: (
28
+ 'hairline': 0.07,
29
+ 'hairline-strong': 0.12,
30
+ 'grid-line': 0.022,
31
+ 'overlay-1': 0.02,
32
+ 'overlay-2': 0.05,
33
+ ) !default;
34
+
35
+ /// @param {Map} $alphas - Name to alpha map.
36
+ @mixin alpha-properties($alphas) {
37
+ @each $name, $alpha in $alphas {
38
+ --ui-#{$name}: rgb(var(--ui-heading-rgb) / #{$alpha});
39
+ }
40
+ }
41
+
42
+ /// @param {String} $theme - `dark` or `light`.
43
+ @mixin scrim-properties($theme) {
44
+ --ui-scrim-base: #{triplet(scrim($theme, 'base'))};
45
+ --ui-scrim-caption: #{scrim($theme, 'caption')};
46
+ --ui-scrim-indicator: #{triplet(scrim($theme, 'indicator'))};
47
+ --ui-scrim-ink: #{scrim($theme, 'ink')};
48
+ }
49
+
50
+ /// Bridges the active theme into Bootstrap's own custom properties.
51
+ ///
52
+ /// @param {Map} $theme - Resolved theme map.
53
+ @mixin bootstrap-bridge($theme) {
54
+ --bs-body-bg: var(--ui-canvas);
55
+ --bs-body-bg-rgb: #{channels(map.get($theme, 'canvas'))};
56
+ --bs-body-color: var(--ui-text);
57
+ --bs-body-color-rgb: var(--ui-text-rgb);
58
+ --bs-emphasis-color: var(--ui-heading);
59
+ --bs-emphasis-color-rgb: var(--ui-heading-rgb);
60
+ --bs-secondary-color: var(--ui-text-muted);
61
+ --bs-secondary-bg: var(--ui-surface);
62
+ --bs-secondary-bg-rgb: #{channels(map.get($theme, 'surface'))};
63
+ --bs-tertiary-bg: var(--ui-surface-raised);
64
+ --bs-tertiary-bg-rgb: #{channels(map.get($theme, 'surface-raised'))};
65
+ --bs-border-color: var(--ui-border);
66
+ --bs-border-color-translucent: var(--ui-hairline);
67
+ --bs-heading-color: var(--ui-heading);
68
+ --bs-link-color: var(--ui-accent);
69
+ --bs-link-color-rgb: var(--ui-accent-rgb);
70
+ --bs-link-hover-color: var(--ui-accent-soft);
71
+ --bs-link-hover-color-rgb: var(--ui-accent-soft-rgb);
72
+ --bs-link-opacity: 1;
73
+ --bs-link-hover-opacity: 1;
74
+ --bs-code-color: var(--ui-info);
75
+ --bs-highlight-bg: rgb(var(--ui-warn-rgb) / 0.24);
76
+
77
+ @each $name, $token in $subtle-tokens {
78
+ --bs-#{$name}: var(--ui-#{$token});
79
+ --bs-#{$name}-rgb: #{channels(map.get($theme, $token))};
80
+ }
81
+
82
+ --bs-light: #{palette('slate-050')};
83
+ --bs-light-rgb: #{channels(palette('slate-050'))};
84
+ --bs-dark: #{palette('slate-900')};
85
+ --bs-dark-rgb: #{channels(palette('slate-900'))};
86
+
87
+ @include bootstrap-subtle-bridge();
88
+ }
89
+
90
+ @mixin bootstrap-subtle-bridge() {
91
+ @each $name, $token in $subtle-tokens {
92
+ --bs-#{$name}-bg-subtle: rgb(var(--ui-#{$token}-rgb) / 0.12);
93
+ --bs-#{$name}-text-emphasis: var(--ui-#{$token});
94
+ --bs-#{$name}-border-subtle: rgb(var(--ui-#{$token}-rgb) / 0.32);
95
+ }
96
+
97
+ --bs-light-bg-subtle: var(--ui-surface-raised);
98
+ --bs-light-text-emphasis: var(--ui-heading);
99
+ --bs-light-border-subtle: var(--ui-border);
100
+
101
+ --bs-dark-bg-subtle: var(--ui-canvas);
102
+ --bs-dark-text-emphasis: var(--ui-text);
103
+ --bs-dark-border-subtle: var(--ui-border-strong);
104
+ }
105
+
106
+ @each $name, $token in $subtle-tokens {
107
+ @include tone-list-group-class($name, $token);
108
+ }
109
+
110
+ // ------------------------------------------------------------------ shared --
111
+ :root {
112
+ --ui-glass-saturate: 180%;
113
+ --ui-ease: cubic-bezier(0.22, 1, 0.36, 1);
114
+ --ui-duration: 160ms;
115
+
116
+ --ui-table-header-ink: var(--bs-table-color);
117
+ --ui-neutral-light: #{palette('slate-050')};
118
+ --ui-neutral-light-rgb: #{triplet(palette('slate-050'))};
119
+ --ui-warn-bright: #{palette('amber-500')};
120
+ --ui-btn-mix: #{palette('ink-900')};
121
+ --ui-on-neutral-light: #{palette('slate-950')};
122
+ --ui-neutral-dark: #{palette('slate-900')};
123
+ --ui-neutral-dark-rgb: #{triplet(palette('slate-900'))};
124
+ --ui-on-neutral-dark: #{palette('slate-050')};
125
+ --ui-shade-rgb: #{triplet(palette('ink-000'))};
126
+ }
127
+
128
+ // -------------------------------------------------------------------- dark --
129
+ :root,
130
+ [data-bs-theme='dark'] {
131
+ color-scheme: dark;
132
+
133
+ @include theme-properties($theme-dark);
134
+ @include alpha-properties($alphas);
135
+ @include scrim-properties('dark');
136
+
137
+ @each $name, $value in $on-dark {
138
+ --ui-on-#{$name}: #{$value};
139
+ }
140
+
141
+ --ui-shadow-rgb: #{triplet(map.get($shadow, 'dark'))};
142
+
143
+ @include bootstrap-bridge($theme-dark);
144
+ }
145
+
146
+ // ------------------------------------------------------------------- light --
147
+ [data-bs-theme='light'] {
148
+ color-scheme: light;
149
+
150
+ @include theme-properties($theme-light);
151
+ @include alpha-properties($alphas);
152
+ @include scrim-properties('light');
153
+
154
+ @each $name, $value in $on-light {
155
+ --ui-on-#{$name}: #{$value};
156
+ }
157
+
158
+ --ui-shadow-rgb: #{triplet(map.get($shadow, 'light'))};
159
+
160
+ @include bootstrap-bridge($theme-light);
161
+ }
@@ -0,0 +1,81 @@
1
+ // ------------------------------------------------------------------- glass --
2
+ .glass,
3
+ .glass-subtle,
4
+ .glass-strong {
5
+ position: relative;
6
+ }
7
+
8
+ .glass {
9
+ @include glass('default', 'surface');
10
+ }
11
+
12
+ .glass-subtle {
13
+ @include glass('subtle', 'surface');
14
+ }
15
+
16
+ .glass-strong {
17
+ @include glass('strong', 'surface');
18
+ }
19
+
20
+ // --------------------------------------------------------------- elevation --
21
+ @each $level, $shadow in $elevation {
22
+ .elevate-#{$level} {
23
+ box-shadow: $shadow;
24
+ }
25
+ }
26
+
27
+ // ---------------------------------------------------------------- hairline --
28
+ .hairline {
29
+ border: 1px solid var(--ui-hairline);
30
+ }
31
+
32
+ .hairline-top {
33
+ box-shadow: inset 0 1px 0 var(--ui-hairline);
34
+ }
35
+
36
+ .hairline-bottom {
37
+ box-shadow: inset 0 -1px 0 var(--ui-hairline);
38
+ }
39
+
40
+ // ----------------------------------------------------------------- surface --
41
+ .surface {
42
+ background: rgb(var(--ui-surface-rgb) / 0.72);
43
+ border: 1px solid var(--ui-border);
44
+ border-radius: var(--bs-border-radius);
45
+ }
46
+
47
+ .surface-raised {
48
+ background: rgb(var(--ui-surface-raised-rgb) / 0.72);
49
+ border: 1px solid var(--ui-border);
50
+ border-radius: var(--bs-border-radius);
51
+ }
52
+
53
+ // -------------------------------------------------------------------- text --
54
+ .text-gradient {
55
+ color: transparent;
56
+ background: linear-gradient(135deg, var(--ui-accent-soft), var(--ui-info));
57
+ background-clip: text;
58
+ -webkit-background-clip: text;
59
+ }
60
+
61
+ .text-balance {
62
+ text-wrap: balance;
63
+ }
64
+
65
+ // ------------------------------------------------------------------- focus --
66
+ .ring-accent {
67
+ box-shadow: 0 0 0 3px rgb(var(--ui-accent-rgb) / 0.22);
68
+ }
69
+
70
+ .glow-accent {
71
+ box-shadow: 0 8px 32px -12px rgb(var(--ui-accent-rgb) / 0.9);
72
+ }
73
+
74
+ // ------------------------------------------------------------------ motion --
75
+ @media (prefers-reduced-motion: reduce) {
76
+ .glass,
77
+ .glass-subtle,
78
+ .glass-strong {
79
+ transition: none;
80
+ }
81
+ }
@@ -0,0 +1,63 @@
1
+ @use 'colors' as *;
2
+
3
+ // ---------------------------------------------------------------- typography --
4
+ $line-height-base: 1.5;
5
+
6
+ // -------------------------------------------------------------- brand colors --
7
+ $primary: theme-color('accent');
8
+ $secondary: theme-color('text-muted');
9
+ $success: theme-color('success');
10
+ $danger: theme-color('error');
11
+ $warning: theme-color('warn');
12
+ $info: theme-color('info');
13
+ $dark: palette('slate-900');
14
+ $light: palette('slate-050');
15
+
16
+ // --------------------------------------------------------------------- body --
17
+ $enable-dark-mode: false;
18
+ $body-bg: theme-color('canvas');
19
+ $body-color: theme-color('text');
20
+ $body-secondary-color: theme-color('text-muted');
21
+ $body-emphasis-color: theme-color('heading');
22
+ $body-tertiary-color: theme-color('text-muted');
23
+ $border-color: theme-color('border');
24
+ $border-color-translucent: rgba(theme-color('border'), 0.55);
25
+ $code-color: theme-color('info');
26
+
27
+ // ------------------------------------------------------------------ shapes ---
28
+ $border-radius: 10px;
29
+ $border-radius-sm: 6px;
30
+ $border-radius-lg: 14px;
31
+
32
+ // ------------------------------------------------------------------ inputs ---
33
+ $input-bg: theme-color('input');
34
+ $input-color: theme-color('text');
35
+ $input-border-color: theme-color('border');
36
+ $input-focus-bg: theme-color('input');
37
+ $input-focus-color: theme-color('text');
38
+ $input-focus-border-color: theme-color('accent');
39
+ $input-placeholder-color: theme-color('text-muted');
40
+
41
+ // ----------------------------------------------------------------- buttons ---
42
+ $btn-focus-width: 2px;
43
+
44
+ // --------------------------------------------------------------- focus ring --
45
+ $focus-ring-color: rgba(theme-color('accent'), 0.5);
46
+ $focus-ring-width: 2px;
47
+
48
+ $colors: (
49
+ 'blue': palette('indigo-500'),
50
+ 'indigo': palette('indigo-500'),
51
+ 'purple': palette('indigo-700'),
52
+ 'pink': palette('red-500'),
53
+ 'red': palette('red-500'),
54
+ 'orange': palette('amber-500'),
55
+ 'yellow': palette('amber-500'),
56
+ 'green': palette('green-500'),
57
+ 'teal': palette('cyan-500'),
58
+ 'cyan': palette('cyan-500'),
59
+ 'black': palette('ink-000'),
60
+ 'white': palette('paper-000'),
61
+ 'gray': palette('slate-400'),
62
+ 'gray-dark': palette('slate-600'),
63
+ );
@@ -0,0 +1,236 @@
1
+ // =============================================================================
2
+ // Form tone mixins
3
+ // =============================================================================
4
+
5
+ @use 'sass:string';
6
+ @use 'sass:map';
7
+ @use 'sass:color';
8
+ @use 'sass:meta';
9
+
10
+ /// Picks black or white for a mark drawn on top of `$background`.
11
+ ///
12
+ /// Uses the WCAG relative luminance coefficients, so the result matches the
13
+ /// perceived brightness instead of the naive channel average.
14
+ ///
15
+ /// @param {Color} $background - Colour the mark is painted on.
16
+ /// @return {Color} `#000000` or `#ffffff`.
17
+ @function form-mark-contrast($background) {
18
+ @if meta.type-of($background) != 'color' {
19
+ @error 'Expected a colour, got `#{meta.type-of($background)}`.';
20
+ }
21
+
22
+ $luminance: color.channel($background, 'red', $space: rgb) * 0.2126 +
23
+ color.channel($background, 'green', $space: rgb) * 0.7152 +
24
+ color.channel($background, 'blue', $space: rgb) * 0.0722;
25
+
26
+ @return if($luminance > 140, #000000, #ffffff);
27
+ }
28
+
29
+ /// Builds the `background-image` used by a checked checkbox.
30
+ ///
31
+ /// Accepts a colour or a hex string, so it can be fed either by a palette
32
+ /// entry or by `form-mark-contrast()`.
33
+ ///
34
+ /// @param {Color|String} $color - Hex colour, with or without the leading `#`.
35
+ /// @return {String} A `url()` with the URL-encoded SVG.
36
+ @function form-mark-url($color) {
37
+ $value: #{$color};
38
+
39
+ @if string.slice($value, 1, 1) != '#' {
40
+ @error 'Expected a hex colour, got `#{$color}`.';
41
+ }
42
+
43
+ $hex: string.slice($value, 2);
44
+
45
+ @if string.length($hex) != 6 {
46
+ @error 'Expected a 6-digit hex colour, got `#{$color}`.';
47
+ }
48
+
49
+ @return url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23#{$hex}' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e");
50
+ }
51
+
52
+ /// Re-points the three `--form-*` properties to a tone.
53
+ ///
54
+ /// @param {String} $tone - Token suffix, without the `--ui-` prefix.
55
+ /// @param {String} $on - Token suffix for `--ui-on-*`.
56
+ @mixin form-tone-properties($tone, $on: $tone) {
57
+ --form-tone: var(--ui-#{$tone});
58
+ --form-tone-rgb: var(--ui-#{$tone}-rgb);
59
+ --form-tone-on: var(--ui-on-#{$on});
60
+ }
61
+
62
+ /// @param {String} $name - Class suffix, e.g. `pink`.
63
+ /// @param {String} $tone - Token suffix for `--ui-*`.
64
+ /// @param {String} $on - Token suffix for `--ui-on-*`.
65
+ @mixin form-select-tone($name, $tone: $name, $on: $tone) {
66
+ .form-select-#{$name} {
67
+ @include form-tone-properties($tone, $on);
68
+ }
69
+ }
70
+
71
+ /// @param {String} $name - Class suffix, e.g. `pink`.
72
+ /// @param {String} $tone - Token suffix for `--ui-*`.
73
+ /// @param {String} $on - Token suffix for `--ui-on-*`.
74
+ /// @param {String|null} $mark - Hex colour of the checkmark. `null` keeps the
75
+ /// Bootstrap default (white).
76
+ @mixin form-check-tone($name, $tone: $name, $on: $tone, $mark: null) {
77
+ .form-check-#{$name},
78
+ .form-check-input-#{$name} {
79
+ @include form-tone-properties($tone, $on);
80
+ }
81
+
82
+ @if $mark != null {
83
+ $mark-url: form-mark-url($mark);
84
+
85
+ .form-check-#{$name}:not(.form-switch) .form-check-input:checked[type='checkbox'],
86
+ .form-check-input-#{$name}:checked[type='checkbox']:not(.form-switch .form-check-input) {
87
+ background-image: $mark-url;
88
+ }
89
+ }
90
+ }
91
+
92
+ /// @param {String} $name - Class suffix, e.g. `pink`.
93
+ /// @param {String} $tone - Token suffix for `--ui-*`.
94
+ /// @param {String} $on - Token suffix for `--ui-on-*`.
95
+ @mixin form-range-tone($name, $tone: $name, $on: $tone) {
96
+ .form-range-#{$name} {
97
+ @include form-tone-properties($tone, $on);
98
+ }
99
+ }
100
+
101
+ /// @param {String} $name - Class suffix, e.g. `pink`.
102
+ /// @param {String} $tone - Token suffix for `--ui-*`.
103
+ /// @param {String} $on - Token suffix for `--ui-on-*`.
104
+ @mixin form-control-tone($name, $tone: $name, $on: $tone) {
105
+ .form-control-#{$name} {
106
+ @include form-tone-properties($tone, $on);
107
+
108
+ border-color: color-mix(in srgb, var(--form-tone) 45%, transparent);
109
+
110
+ &:hover:not(:disabled):not(:focus) {
111
+ border-color: color-mix(in srgb, var(--form-tone) 65%, transparent);
112
+ }
113
+ }
114
+ }
115
+
116
+ /// @param {String} $name - Class suffix, e.g. `pink`.
117
+ /// @param {String} $tone - Token suffix for `--ui-*`.
118
+ /// @param {String} $on - Token suffix for `--ui-on-*`.
119
+ @mixin form-control-color-tone($name, $tone: $name, $on: $tone) {
120
+ .form-control-color-#{$name} {
121
+ @include form-tone-properties($tone, $on);
122
+
123
+ border-color: color-mix(in srgb, var(--form-tone) 45%, transparent);
124
+
125
+ &::-webkit-color-swatch-wrapper {
126
+ border-radius: inherit;
127
+ }
128
+
129
+ &::-webkit-color-swatch {
130
+ border: 0;
131
+ border-radius: calc(var(--bs-border-radius-sm) - 2px);
132
+ }
133
+
134
+ &:hover:not(:disabled):not(:focus) {
135
+ border-color: color-mix(in srgb, var(--form-tone) 65%, transparent);
136
+ }
137
+ }
138
+ }
139
+
140
+ /// @param {String} $name - Class suffix, e.g. `pink`.
141
+ /// @param {String} $tone - Token suffix for `--ui-*`.
142
+ /// @param {String} $on - Token suffix for `--ui-on-*`.
143
+ @mixin form-file-tone($name, $tone: $name, $on: $tone) {
144
+ .form-file-#{$name} {
145
+ @include form-tone-properties($tone, $on);
146
+
147
+ border-color: color-mix(in srgb, var(--form-tone) 45%, transparent);
148
+
149
+ &::file-selector-button {
150
+ color: var(--form-tone);
151
+ background-color: rgb(var(--form-tone-rgb) / 0.12);
152
+ border-inline-end: 1px solid color-mix(in srgb, var(--form-tone) 45%, transparent);
153
+ transition: background-color var(--ui-duration) var(--ui-ease);
154
+ }
155
+
156
+ &:hover:not(:disabled)::file-selector-button {
157
+ background-color: rgb(var(--form-tone-rgb) / 0.2);
158
+ }
159
+
160
+ &:focus {
161
+ border-color: var(--form-tone);
162
+ box-shadow: 0 0 0 3px rgb(var(--form-tone-rgb) / 0.2);
163
+ }
164
+ }
165
+ }
166
+
167
+ /// @param {String} $name - Class suffix, e.g. `pink`.
168
+ /// @param {String} $tone - Token suffix for `--ui-*`.
169
+ /// @param {String} $on - Token suffix for `--ui-on-*`.
170
+ @mixin form-input-group-tone($name, $tone: $name, $on: $tone) {
171
+ .input-group-#{$name} {
172
+ @include form-tone-properties($tone, $on);
173
+
174
+ > .input-group-text {
175
+ color: var(--form-tone);
176
+ background-color: rgb(var(--form-tone-rgb) / 0.12);
177
+ border-color: color-mix(in srgb, var(--form-tone) 45%, transparent);
178
+ }
179
+
180
+ > .form-control,
181
+ > .form-select {
182
+ border-color: color-mix(in srgb, var(--form-tone) 45%, transparent);
183
+
184
+ &:focus {
185
+ border-color: var(--form-tone);
186
+ box-shadow: 0 0 0 3px rgb(var(--form-tone-rgb) / 0.2);
187
+ }
188
+ }
189
+ }
190
+ }
191
+
192
+ /// @param {String} $name - Class suffix, e.g. `pink`.
193
+ /// @param {String} $tone - Token suffix for `--ui-*`.
194
+ /// @param {String} $on - Token suffix for `--ui-on-*`.
195
+ @mixin form-floating-tone($name, $tone: $name, $on: $tone) {
196
+ .form-floating-#{$name} {
197
+ @include form-tone-properties($tone, $on);
198
+
199
+ > .form-control,
200
+ > .form-select {
201
+ border-color: color-mix(in srgb, var(--form-tone) 45%, transparent);
202
+
203
+ &:focus {
204
+ border-color: var(--form-tone);
205
+ box-shadow: 0 0 0 3px rgb(var(--form-tone-rgb) / 0.2);
206
+ }
207
+ }
208
+
209
+ > label {
210
+ color: color-mix(in srgb, var(--form-tone) 70%, var(--ui-text-muted));
211
+ }
212
+
213
+ > .form-control:focus ~ label,
214
+ > .form-select:focus ~ label {
215
+ color: var(--form-tone);
216
+ }
217
+ }
218
+ }
219
+
220
+ /// Emits every form control variant for a single tone.
221
+ ///
222
+ /// @param {String} $name - Class suffix, e.g. `pink`.
223
+ /// @param {String} $tone - Token suffix for `--ui-*`.
224
+ /// @param {String} $on - Token suffix for `--ui-on-*`.
225
+ /// @param {String|null} $mark - Hex colour of the checkmark. `null` keeps the
226
+ /// Bootstrap default (white).
227
+ @mixin form-tone-plugin($name, $tone: $name, $on: $tone, $mark: null) {
228
+ @include form-control-tone($name, $tone, $on);
229
+ @include form-control-color-tone($name, $tone, $on);
230
+ @include form-file-tone($name, $tone, $on);
231
+ @include form-select-tone($name, $tone, $on);
232
+ @include form-check-tone($name, $tone, $on, $mark);
233
+ @include form-range-tone($name, $tone, $on);
234
+ @include form-input-group-tone($name, $tone, $on);
235
+ @include form-floating-tone($name, $tone, $on);
236
+ }
@@ -0,0 +1,68 @@
1
+ // =============================================================================
2
+ // Compact sizing (opt-in)
3
+ //
4
+ // Spacing, dimensions and radii only. Colours, backgrounds, animations and
5
+ // transitions stay in the base theme: they are identity, not density.
6
+ //
7
+ // Enable: add `@import 'plugins/sizing-compact';` to _theme.scss.
8
+ // =============================================================================
9
+
10
+ // ------------------------------------------------------------------ navbar --
11
+ .navbar {
12
+ --bs-navbar-padding-y: 0.75rem;
13
+ }
14
+
15
+ // ------------------------------------------------------------------ button --
16
+ .btn {
17
+ --bs-btn-padding-y: 0.5rem;
18
+ --bs-btn-padding-x: 0.875rem;
19
+ }
20
+
21
+ // ---------------------------------------------------------------- dropdown --
22
+ .dropdown-menu {
23
+ padding: 0.3125rem;
24
+ }
25
+
26
+ // ------------------------------------------------------------------- badge --
27
+ .badge {
28
+ --bs-badge-padding-y: 0.3125rem;
29
+ --bs-badge-padding-x: 0.5rem;
30
+ }
31
+
32
+ // ------------------------------------------------------------------- forms --
33
+ .form-label,
34
+ .col-form-label {
35
+ margin-bottom: 0.25rem;
36
+ }
37
+
38
+ .form-control-color {
39
+ width: 2.75rem;
40
+ padding: 0.25rem;
41
+ }
42
+
43
+ .form-floating > .form-control,
44
+ .form-floating > .form-select {
45
+ height: calc(3rem + 2px);
46
+ }
47
+
48
+ // ---------------------------------------------------------------- carousel --
49
+ .carousel-caption {
50
+ padding: 2.5rem 1.25rem 1rem;
51
+ }
52
+
53
+ .carousel-indicators [data-bs-target] {
54
+ width: 24px;
55
+ height: 3px;
56
+ }
57
+
58
+ .carousel-control-prev,
59
+ .carousel-control-next {
60
+ width: 3rem;
61
+ }
62
+
63
+ // ----------------------------------------------------------------- spinner --
64
+ .spinner-border-sm,
65
+ .spinner-grow-sm {
66
+ --bs-spinner-width: 0.875rem;
67
+ --bs-spinner-height: 0.875rem;
68
+ }