@livenetworks/ashlar 2.0.6 → 2.0.8

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 (221) hide show
  1. package/LICENSE +641 -641
  2. package/components/COMPONENTS.md +1116 -1116
  3. package/components/index.js +81 -81
  4. package/components/ln-accordion/ln-accordion-dev.scss +8 -8
  5. package/components/ln-accordion/ln-accordion.js +1 -1
  6. package/components/ln-accordion/ln-accordion.schema.json +30 -30
  7. package/components/ln-accordion/src/ln-accordion.js +1 -0
  8. package/components/ln-ajax/ln-ajax-dev.scss +8 -8
  9. package/components/ln-ajax/ln-ajax.js +1 -1
  10. package/components/ln-ajax/ln-ajax.schema.json +30 -30
  11. package/components/ln-api-connector/ln-api-connector.js +1 -1
  12. package/components/ln-api-connector/ln-api-connector.schema.json +96 -96
  13. package/components/ln-api-connector/src/ln-api-connector.js +1 -0
  14. package/components/ln-api-queue/ln-api-queue.js +1 -1
  15. package/components/ln-api-queue/ln-api-queue.schema.json +34 -34
  16. package/components/ln-api-queue/src/ln-api-queue.js +3 -13
  17. package/components/ln-autoresize/ln-autoresize-dev.scss +8 -8
  18. package/components/ln-autoresize/ln-autoresize.js +1 -1
  19. package/components/ln-autoresize/ln-autoresize.schema.json +22 -22
  20. package/components/ln-autosave/ln-autosave-dev.scss +13 -13
  21. package/components/ln-autosave/ln-autosave.js +1 -1
  22. package/components/ln-autosave/ln-autosave.schema.json +48 -48
  23. package/components/ln-autosave/src/autosave-model.js +34 -34
  24. package/components/ln-chart/ln-chart.js +1 -1
  25. package/components/ln-chart/ln-chart.schema.json +146 -146
  26. package/components/ln-chart/src/chart-model.js +154 -154
  27. package/components/ln-circular-progress/ln-circular-progress.js +1 -1
  28. package/components/ln-circular-progress/ln-circular-progress.schema.json +42 -42
  29. package/components/ln-confirm/ln-confirm-dev.scss +24 -24
  30. package/components/ln-confirm/ln-confirm.js +1 -1
  31. package/components/ln-confirm/ln-confirm.schema.json +66 -66
  32. package/components/ln-confirm/src/ln-confirm.js +178 -178
  33. package/components/ln-core/crypto.js +286 -265
  34. package/components/ln-core/dom.js +115 -115
  35. package/components/ln-core/form.js +136 -136
  36. package/components/ln-core/helpers.js +33 -33
  37. package/components/ln-core/http.js +48 -48
  38. package/components/ln-core/index.js +1 -1
  39. package/components/ln-core/ln-core.schema.json +109 -109
  40. package/components/ln-core/locale.js +55 -55
  41. package/components/ln-core/matching.js +78 -78
  42. package/components/ln-core/number.js +125 -125
  43. package/components/ln-core/template.js +206 -206
  44. package/components/ln-couchdb-connector/README.md +4 -0
  45. package/components/ln-couchdb-connector/ln-couchdb-connector.js +1 -1
  46. package/components/ln-couchdb-connector/ln-couchdb-connector.schema.json +50 -50
  47. package/components/ln-couchdb-connector/src/ln-couchdb-connector.js +19 -1
  48. package/components/ln-data-coordinator/README.md +9 -38
  49. package/components/ln-data-coordinator/ln-data-coordinator-dev.scss +8 -8
  50. package/components/ln-data-coordinator/ln-data-coordinator.js +1 -1
  51. package/components/ln-data-coordinator/ln-data-coordinator.schema.json +16 -16
  52. package/components/ln-data-coordinator/src/data-read-policy.js +0 -7
  53. package/components/ln-data-coordinator/src/ln-data-coordinator.js +428 -1299
  54. package/components/ln-data-store/README.md +3 -2
  55. package/components/ln-data-store/ln-data-store-dev.scss +13 -13
  56. package/components/ln-data-store/ln-data-store.js +1 -1
  57. package/components/ln-data-store/ln-data-store.schema.json +84 -84
  58. package/components/ln-data-store/src/data-store-model.js +184 -155
  59. package/components/ln-data-store/src/ln-data-store.js +58 -11
  60. package/components/ln-date/README.md +4 -0
  61. package/components/ln-date/ln-date.js +1 -1
  62. package/components/ln-date/ln-date.schema.json +92 -92
  63. package/components/ln-date/src/date-model.js +186 -186
  64. package/components/ln-date/src/ln-date.js +3 -3
  65. package/components/ln-debug/ln-debug.js +1 -1
  66. package/components/ln-debug/ln-debug.schema.json +28 -28
  67. package/components/ln-debug/src/console-sink.js +19 -19
  68. package/components/ln-debug/src/gate.js +95 -95
  69. package/components/ln-debug/src/generated-attributes.js +2 -2
  70. package/components/ln-dropdown/ln-dropdown-dev.scss +13 -13
  71. package/components/ln-dropdown/ln-dropdown.js +1 -1
  72. package/components/ln-dropdown/ln-dropdown.schema.json +90 -90
  73. package/components/ln-editor/ln-editor.js +1 -1
  74. package/components/ln-editor/ln-editor.schema.json +58 -58
  75. package/components/ln-external-links/ln-external-links.js +1 -1
  76. package/components/ln-external-links/ln-external-links.schema.json +18 -18
  77. package/components/ln-fill/ln-fill.js +1 -1
  78. package/components/ln-fill/ln-fill.schema.json +23 -23
  79. package/components/ln-filter/ln-filter.js +1 -1
  80. package/components/ln-filter/ln-filter.schema.json +153 -153
  81. package/components/ln-filter/src/filter-model.js +185 -185
  82. package/components/ln-form/ln-form-dev.scss +8 -8
  83. package/components/ln-form/ln-form.js +1 -1
  84. package/components/ln-form/ln-form.schema.json +45 -45
  85. package/components/ln-http/ln-http.js +1 -1
  86. package/components/ln-http/ln-http.schema.json +6 -6
  87. package/components/ln-icon/ln-icon.schema.json +6 -6
  88. package/components/ln-include/ln-include.js +1 -1
  89. package/components/ln-include/ln-include.schema.json +23 -23
  90. package/components/ln-key/ln-key-dev.scss +18 -18
  91. package/components/ln-key/ln-key.js +1 -1
  92. package/components/ln-key/ln-key.schema.json +56 -56
  93. package/components/ln-key/src/ln-key.js +10 -10
  94. package/components/ln-link/ln-link-dev.scss +8 -8
  95. package/components/ln-link/ln-link.js +1 -1
  96. package/components/ln-link/ln-link.schema.json +22 -22
  97. package/components/ln-list/README.md +152 -152
  98. package/components/ln-list/ln-list-dev.scss +8 -8
  99. package/components/ln-list/ln-list.js +1 -1
  100. package/components/ln-list/ln-list.schema.json +166 -166
  101. package/components/ln-list/src/ln-list.js +4 -4
  102. package/components/ln-modal/README.md +4 -6
  103. package/components/ln-modal/ln-modal.js +1 -1
  104. package/components/ln-modal/ln-modal.schema.json +65 -65
  105. package/components/ln-modal/src/ln-modal.js +28 -8
  106. package/components/ln-nav/ln-nav.js +1 -1
  107. package/components/ln-nav/ln-nav.schema.json +25 -25
  108. package/components/ln-number/ln-number.js +1 -1
  109. package/components/ln-number/ln-number.schema.json +63 -63
  110. package/components/ln-number/src/number-model.js +31 -31
  111. package/components/ln-obfuscator/README.md +60 -60
  112. package/components/ln-obfuscator/ln-obfuscator.js +1 -1
  113. package/components/ln-obfuscator/ln-obfuscator.schema.json +49 -49
  114. package/components/ln-obfuscator/src/ln-obfuscator.js +159 -159
  115. package/components/ln-obfuscator/src/obfuscator-model.js +250 -250
  116. package/components/ln-options/ln-options.js +1 -1
  117. package/components/ln-options/ln-options.schema.json +41 -41
  118. package/components/ln-options/src/ln-options.js +1 -0
  119. package/components/ln-persist/README.md +151 -151
  120. package/components/ln-persist/ln-persist.js +1 -1
  121. package/components/ln-persist/ln-persist.schema.json +28 -28
  122. package/components/ln-persist/src/ln-persist.js +83 -83
  123. package/components/ln-picklist/README.md +230 -230
  124. package/components/ln-picklist/ln-picklist-dev.scss +22 -22
  125. package/components/ln-picklist/ln-picklist.js +1 -1
  126. package/components/ln-picklist/ln-picklist.schema.json +49 -49
  127. package/components/ln-picklist/src/ln-picklist.js +228 -228
  128. package/components/ln-popover/README.md +4 -0
  129. package/components/ln-popover/ln-popover-dev.scss +13 -13
  130. package/components/ln-popover/ln-popover.js +1 -1
  131. package/components/ln-popover/ln-popover.schema.json +82 -82
  132. package/components/ln-popover/src/ln-popover.js +9 -0
  133. package/components/ln-progress/ln-progress-dev.scss +8 -8
  134. package/components/ln-progress/ln-progress.js +1 -1
  135. package/components/ln-progress/ln-progress.schema.json +40 -40
  136. package/components/ln-router/ln-router.js +1 -1
  137. package/components/ln-router/ln-router.schema.json +76 -76
  138. package/components/ln-scroll/README.md +45 -45
  139. package/components/ln-scroll/ln-scroll.js +1 -1
  140. package/components/ln-scroll/ln-scroll.schema.json +85 -85
  141. package/components/ln-scroll/src/ln-scroll.js +150 -150
  142. package/components/ln-search/README.md +188 -188
  143. package/components/ln-search/ln-search.js +1 -1
  144. package/components/ln-search/ln-search.schema.json +103 -103
  145. package/components/ln-slug/ln-slug.js +1 -1
  146. package/components/ln-slug/ln-slug.schema.json +23 -23
  147. package/components/ln-sort/ln-sort.js +1 -1
  148. package/components/ln-sort/ln-sort.schema.json +104 -104
  149. package/components/ln-sort/src/ln-sort.js +321 -321
  150. package/components/ln-sort/src/sort-model.js +117 -117
  151. package/components/ln-sortable/ln-sortable-dev.scss +13 -13
  152. package/components/ln-sortable/ln-sortable.js +1 -1
  153. package/components/ln-sortable/ln-sortable.schema.json +36 -36
  154. package/components/ln-stat/ln-stat-dev.scss +8 -8
  155. package/components/ln-stat/ln-stat.js +1 -1
  156. package/components/ln-stat/ln-stat.schema.json +32 -32
  157. package/components/ln-stat/src/stat-model.js +28 -28
  158. package/components/ln-table/ln-table.js +1 -1
  159. package/components/ln-table/ln-table.schema.json +211 -211
  160. package/components/ln-table/src/ln-table.js +2 -0
  161. package/components/ln-table/src/table-model.js +98 -98
  162. package/components/ln-table-coordinator/ln-table-coordinator.js +1 -1
  163. package/components/ln-table-coordinator/ln-table-coordinator.schema.json +93 -93
  164. package/components/ln-table-coordinator/src/ln-table-coordinator.js +3 -3
  165. package/components/ln-tabs/README.md +2 -2
  166. package/components/ln-tabs/ln-tabs.js +1 -1
  167. package/components/ln-tabs/ln-tabs.schema.json +75 -75
  168. package/components/ln-tabs/src/ln-tabs.js +208 -207
  169. package/components/ln-tabs/src/tabs-model.js +82 -82
  170. package/components/ln-time/ln-time-dev.scss +13 -13
  171. package/components/ln-time/ln-time.js +1 -1
  172. package/components/ln-time/ln-time.schema.json +38 -38
  173. package/components/ln-toast/ln-toast.js +1 -1
  174. package/components/ln-toast/ln-toast.schema.json +65 -65
  175. package/components/ln-toggle/ln-toggle.js +1 -1
  176. package/components/ln-toggle/ln-toggle.schema.json +52 -52
  177. package/components/ln-tooltip/ln-tooltip.js +1 -1
  178. package/components/ln-tooltip/ln-tooltip.schema.json +86 -86
  179. package/components/ln-translations/ln-translations.js +1 -1
  180. package/components/ln-translations/ln-translations.schema.json +120 -120
  181. package/components/ln-ui-coordinator/README.md +62 -62
  182. package/components/ln-ui-coordinator/ln-ui-coordinator.js +1 -1
  183. package/components/ln-ui-coordinator/ln-ui-coordinator.schema.json +28 -28
  184. package/components/ln-ui-coordinator/src/ln-ui-coordinator.js +140 -140
  185. package/components/ln-upload/ln-upload.js +1 -1
  186. package/components/ln-upload/ln-upload.schema.json +193 -193
  187. package/components/ln-upload/src/upload-model.js +78 -78
  188. package/components/ln-validate/ln-validate.js +1 -1
  189. package/components/ln-validate/ln-validate.schema.json +50 -50
  190. package/components/ln-validate/src/validate-model.js +64 -64
  191. package/components/ln-websocket-connector/README.md +166 -166
  192. package/components/ln-websocket-connector/ln-websocket-connector.js +1 -1
  193. package/components/ln-websocket-connector/ln-websocket-connector.schema.json +29 -29
  194. package/components/ln-websocket-connector/src/ln-websocket-connector.js +283 -279
  195. package/ln-ashlar.html-data.json +7 -8
  196. package/package.json +84 -84
  197. package/theme/brand.css +73 -73
  198. package/theme/components/_confirm.scss +6 -6
  199. package/theme/components/_picklist.scss +3 -3
  200. package/theme/config/_palette.scss +274 -274
  201. package/theme/config/_theme.scss +292 -292
  202. package/theme/config/_tokens.scss +285 -285
  203. package/theme/config/mixins/_index.scss +62 -62
  204. package/theme/config/mixins/_picklist.scss +66 -66
  205. package/theme/ln-ashlar-dev.scss +66 -66
  206. package/theme/ln-ashlar-landing.scss +56 -56
  207. package/theme/ln-ashlar-theme.scss +63 -63
  208. package/theme/presentation/_bento.scss +151 -151
  209. package/theme/presentation/_cta.scss +111 -111
  210. package/theme/presentation/_effects.scss +216 -216
  211. package/theme/presentation/_features.scss +108 -108
  212. package/theme/presentation/_footer.scss +129 -129
  213. package/theme/presentation/_hero.scss +158 -158
  214. package/theme/presentation/_layout.scss +170 -170
  215. package/theme/presentation/_navbar.scss +140 -140
  216. package/theme/presentation/_pricing.scss +262 -262
  217. package/theme/presentation/_stats.scss +87 -87
  218. package/theme/presentation/_testimonials.scss +124 -124
  219. package/theme/presentation/_tokens.scss +39 -39
  220. package/theme/presentation/_typography.scss +163 -163
  221. package/web-types.json +12 -12
@@ -1,216 +1,216 @@
1
- // ==========================================================================
2
- // Presentation Effects & Atmosphere — ln-ashlar
3
- // ==========================================================================
4
- // Ambient spotlight gradients, glassmorphism, glowing hover surfaces,
5
- // and presentation container patterns.
6
- // ==========================================================================
7
-
8
- // ---------------------------------------------------------------------------
9
- // Ambient Spotlights (CSS-only glowing background layers)
10
- // ---------------------------------------------------------------------------
11
- .ambient-glow-top {
12
- position: relative;
13
-
14
- &::before {
15
- content: '';
16
- position: absolute;
17
- inset-inline-start: 50%;
18
- top: -10rem;
19
- transform: translateX(-50%);
20
- width: clamp(20rem, 80vw, 65rem);
21
- height: clamp(15rem, 40vw, 35rem);
22
- background: radial-gradient(
23
- ellipse at center,
24
- hsl(var(--color-primary) / var(--spotlight-opacity, 0.18)) 0%,
25
- hsl(var(--color-primary) / calc(var(--spotlight-opacity, 0.18) * 0.4)) 45%,
26
- transparent 70%
27
- );
28
- filter: blur(60px);
29
- pointer-events: none;
30
- z-index: 0;
31
- }
32
-
33
- > * {
34
- position: relative;
35
- z-index: 1;
36
- }
37
- }
38
-
39
- .ambient-glow-bottom {
40
- position: relative;
41
-
42
- &::after {
43
- content: '';
44
- position: absolute;
45
- inset-inline-start: 50%;
46
- bottom: -10rem;
47
- transform: translateX(-50%);
48
- width: clamp(20rem, 80vw, 65rem);
49
- height: clamp(15rem, 40vw, 30rem);
50
- background: radial-gradient(
51
- ellipse at center,
52
- hsl(var(--color-primary) / var(--spotlight-opacity, 0.15)) 0%,
53
- transparent 70%
54
- );
55
- filter: blur(60px);
56
- pointer-events: none;
57
- z-index: 0;
58
- }
59
-
60
- > * {
61
- position: relative;
62
- z-index: 1;
63
- }
64
- }
65
-
66
- // ---------------------------------------------------------------------------
67
- // Background Patterns (Clean, modern dot & grid textures)
68
- // ---------------------------------------------------------------------------
69
- .pattern-dots {
70
- background-image: radial-gradient(
71
- color-mix(in srgb, var(--color-border) 60%, transparent) 1px,
72
- transparent 1px
73
- );
74
- background-size: 24px 24px;
75
- }
76
-
77
- .pattern-grid {
78
- background-image:
79
- linear-gradient(to right, color-mix(in srgb, var(--color-border) 25%, transparent) 1px, transparent 1px),
80
- linear-gradient(to bottom, color-mix(in srgb, var(--color-border) 25%, transparent) 1px, transparent 1px);
81
- background-size: 40px 40px;
82
- }
83
-
84
- // ---------------------------------------------------------------------------
85
- // Glassmorphism Surfaces
86
- // ---------------------------------------------------------------------------
87
- @mixin glass-panel {
88
- background-color: color-mix(in srgb, var(--bg-elevated) 72%, transparent);
89
- -webkit-backdrop-filter: blur(16px);
90
- backdrop-filter: blur(16px);
91
- border: var(--border-width) solid color-mix(in srgb, var(--color-border) 65%, transparent);
92
- border-radius: var(--radius-lg);
93
- box-shadow: var(--shadow-sm);
94
- }
95
-
96
- .glass-panel {
97
- @include glass-panel;
98
- }
99
-
100
- // ---------------------------------------------------------------------------
101
- // Hover Glow & Elevation
102
- // ---------------------------------------------------------------------------
103
- @mixin glow-hover {
104
- transition: transform var(--transition-base), box-shadow var(--transition-base), border-color var(--transition-base);
105
-
106
- &:hover {
107
- transform: translateY(-2px);
108
- box-shadow:
109
- 0 12px 30px -10px hsl(var(--color-primary) / 0.18),
110
- 0 0 1px 1px color-mix(in srgb, hsl(var(--color-primary)) 35%, transparent),
111
- var(--shadow-md);
112
- border-color: color-mix(in srgb, hsl(var(--color-primary)) 45%, transparent);
113
- }
114
- }
115
-
116
- .glow-hover {
117
- @include glow-hover;
118
- }
119
-
120
- // ---------------------------------------------------------------------------
121
- // App Mockup Frame (Browser / Device Window Chrome)
122
- // ---------------------------------------------------------------------------
123
- .mockup-frame {
124
- position: relative;
125
- background-color: var(--bg-elevated);
126
- border: var(--border-width) solid var(--color-border);
127
- border-radius: var(--radius-xl);
128
- box-shadow: 0 25px 60px -15px rgba(0, 0, 0, 0.3), var(--shadow-xl);
129
- overflow: hidden;
130
-
131
- .mockup-bar {
132
- display: flex;
133
- align-items: center;
134
- gap: 0.375rem;
135
- padding: var(--size-xs-up) var(--size-md);
136
- background-color: color-mix(in srgb, var(--bg-recessed) 80%, var(--bg-elevated));
137
- border-bottom: var(--border-width) solid var(--color-border);
138
-
139
- .mockup-dot {
140
- width: 0.625rem;
141
- height: 0.625rem;
142
- border-radius: var(--radius-full);
143
- background-color: var(--color-border);
144
-
145
- &:nth-child(1) { background-color: #ff5f56; }
146
- &:nth-child(2) { background-color: #ffbd2e; }
147
- &:nth-child(3) { background-color: #27c93f; }
148
- }
149
-
150
- .mockup-url {
151
- margin-inline-start: auto;
152
- margin-inline-end: auto;
153
- font-family: var(--font-mono);
154
- font-size: var(--text-xs);
155
- color: var(--fg-muted);
156
- background-color: var(--bg-base);
157
- padding: 0.125rem 1rem;
158
- border-radius: var(--radius-sm);
159
- border: var(--border-width) solid var(--color-border);
160
- }
161
- }
162
-
163
- .mockup-body {
164
- padding: var(--size-lg);
165
- background-color: var(--bg-base);
166
- }
167
- }
168
-
169
- .mockup-stage {
170
- min-height: 17.5rem;
171
- display: flex;
172
- flex-direction: column;
173
- justify-content: center;
174
- align-items: center;
175
- text-align: center;
176
- padding: clamp(2rem, 5vw, 3rem) var(--size-lg);
177
- }
178
-
179
- .mockup-stage-card {
180
- padding: var(--size-xl);
181
- max-width: 32rem;
182
- width: 100%;
183
-
184
- .stage-badge {
185
- margin-block-end: var(--size-sm);
186
- }
187
-
188
- .stage-title {
189
- margin-block-start: 0;
190
- margin-block-end: var(--size-xs);
191
- font-size: var(--text-heading-sm);
192
- }
193
-
194
- .stage-desc {
195
- margin-block-start: 0;
196
- margin-block-end: var(--size-md);
197
- font-size: var(--text-sm);
198
- color: var(--fg-muted);
199
- }
200
- }
201
-
202
- // ---------------------------------------------------------------------------
203
- // Subtle Keyframe Animations
204
- // ---------------------------------------------------------------------------
205
- @keyframes subtle-float {
206
- 0%, 100% {
207
- transform: translateY(0);
208
- }
209
- 50% {
210
- transform: translateY(-6px);
211
- }
212
- }
213
-
214
- .animate-float {
215
- animation: subtle-float 6s ease-in-out infinite;
216
- }
1
+ // ==========================================================================
2
+ // Presentation Effects & Atmosphere — ln-ashlar
3
+ // ==========================================================================
4
+ // Ambient spotlight gradients, glassmorphism, glowing hover surfaces,
5
+ // and presentation container patterns.
6
+ // ==========================================================================
7
+
8
+ // ---------------------------------------------------------------------------
9
+ // Ambient Spotlights (CSS-only glowing background layers)
10
+ // ---------------------------------------------------------------------------
11
+ .ambient-glow-top {
12
+ position: relative;
13
+
14
+ &::before {
15
+ content: '';
16
+ position: absolute;
17
+ inset-inline-start: 50%;
18
+ top: -10rem;
19
+ transform: translateX(-50%);
20
+ width: clamp(20rem, 80vw, 65rem);
21
+ height: clamp(15rem, 40vw, 35rem);
22
+ background: radial-gradient(
23
+ ellipse at center,
24
+ hsl(var(--color-primary) / var(--spotlight-opacity, 0.18)) 0%,
25
+ hsl(var(--color-primary) / calc(var(--spotlight-opacity, 0.18) * 0.4)) 45%,
26
+ transparent 70%
27
+ );
28
+ filter: blur(60px);
29
+ pointer-events: none;
30
+ z-index: 0;
31
+ }
32
+
33
+ > * {
34
+ position: relative;
35
+ z-index: 1;
36
+ }
37
+ }
38
+
39
+ .ambient-glow-bottom {
40
+ position: relative;
41
+
42
+ &::after {
43
+ content: '';
44
+ position: absolute;
45
+ inset-inline-start: 50%;
46
+ bottom: -10rem;
47
+ transform: translateX(-50%);
48
+ width: clamp(20rem, 80vw, 65rem);
49
+ height: clamp(15rem, 40vw, 30rem);
50
+ background: radial-gradient(
51
+ ellipse at center,
52
+ hsl(var(--color-primary) / var(--spotlight-opacity, 0.15)) 0%,
53
+ transparent 70%
54
+ );
55
+ filter: blur(60px);
56
+ pointer-events: none;
57
+ z-index: 0;
58
+ }
59
+
60
+ > * {
61
+ position: relative;
62
+ z-index: 1;
63
+ }
64
+ }
65
+
66
+ // ---------------------------------------------------------------------------
67
+ // Background Patterns (Clean, modern dot & grid textures)
68
+ // ---------------------------------------------------------------------------
69
+ .pattern-dots {
70
+ background-image: radial-gradient(
71
+ color-mix(in srgb, var(--color-border) 60%, transparent) 1px,
72
+ transparent 1px
73
+ );
74
+ background-size: 24px 24px;
75
+ }
76
+
77
+ .pattern-grid {
78
+ background-image:
79
+ linear-gradient(to right, color-mix(in srgb, var(--color-border) 25%, transparent) 1px, transparent 1px),
80
+ linear-gradient(to bottom, color-mix(in srgb, var(--color-border) 25%, transparent) 1px, transparent 1px);
81
+ background-size: 40px 40px;
82
+ }
83
+
84
+ // ---------------------------------------------------------------------------
85
+ // Glassmorphism Surfaces
86
+ // ---------------------------------------------------------------------------
87
+ @mixin glass-panel {
88
+ background-color: color-mix(in srgb, var(--bg-elevated) 72%, transparent);
89
+ -webkit-backdrop-filter: blur(16px);
90
+ backdrop-filter: blur(16px);
91
+ border: var(--border-width) solid color-mix(in srgb, var(--color-border) 65%, transparent);
92
+ border-radius: var(--radius-lg);
93
+ box-shadow: var(--shadow-sm);
94
+ }
95
+
96
+ .glass-panel {
97
+ @include glass-panel;
98
+ }
99
+
100
+ // ---------------------------------------------------------------------------
101
+ // Hover Glow & Elevation
102
+ // ---------------------------------------------------------------------------
103
+ @mixin glow-hover {
104
+ transition: transform var(--transition-base), box-shadow var(--transition-base), border-color var(--transition-base);
105
+
106
+ &:hover {
107
+ transform: translateY(-2px);
108
+ box-shadow:
109
+ 0 12px 30px -10px hsl(var(--color-primary) / 0.18),
110
+ 0 0 1px 1px color-mix(in srgb, hsl(var(--color-primary)) 35%, transparent),
111
+ var(--shadow-md);
112
+ border-color: color-mix(in srgb, hsl(var(--color-primary)) 45%, transparent);
113
+ }
114
+ }
115
+
116
+ .glow-hover {
117
+ @include glow-hover;
118
+ }
119
+
120
+ // ---------------------------------------------------------------------------
121
+ // App Mockup Frame (Browser / Device Window Chrome)
122
+ // ---------------------------------------------------------------------------
123
+ .mockup-frame {
124
+ position: relative;
125
+ background-color: var(--bg-elevated);
126
+ border: var(--border-width) solid var(--color-border);
127
+ border-radius: var(--radius-xl);
128
+ box-shadow: 0 25px 60px -15px rgba(0, 0, 0, 0.3), var(--shadow-xl);
129
+ overflow: hidden;
130
+
131
+ .mockup-bar {
132
+ display: flex;
133
+ align-items: center;
134
+ gap: 0.375rem;
135
+ padding: var(--size-xs-up) var(--size-md);
136
+ background-color: color-mix(in srgb, var(--bg-recessed) 80%, var(--bg-elevated));
137
+ border-bottom: var(--border-width) solid var(--color-border);
138
+
139
+ .mockup-dot {
140
+ width: 0.625rem;
141
+ height: 0.625rem;
142
+ border-radius: var(--radius-full);
143
+ background-color: var(--color-border);
144
+
145
+ &:nth-child(1) { background-color: #ff5f56; }
146
+ &:nth-child(2) { background-color: #ffbd2e; }
147
+ &:nth-child(3) { background-color: #27c93f; }
148
+ }
149
+
150
+ .mockup-url {
151
+ margin-inline-start: auto;
152
+ margin-inline-end: auto;
153
+ font-family: var(--font-mono);
154
+ font-size: var(--text-xs);
155
+ color: var(--fg-muted);
156
+ background-color: var(--bg-base);
157
+ padding: 0.125rem 1rem;
158
+ border-radius: var(--radius-sm);
159
+ border: var(--border-width) solid var(--color-border);
160
+ }
161
+ }
162
+
163
+ .mockup-body {
164
+ padding: var(--size-lg);
165
+ background-color: var(--bg-base);
166
+ }
167
+ }
168
+
169
+ .mockup-stage {
170
+ min-height: 17.5rem;
171
+ display: flex;
172
+ flex-direction: column;
173
+ justify-content: center;
174
+ align-items: center;
175
+ text-align: center;
176
+ padding: clamp(2rem, 5vw, 3rem) var(--size-lg);
177
+ }
178
+
179
+ .mockup-stage-card {
180
+ padding: var(--size-xl);
181
+ max-width: 32rem;
182
+ width: 100%;
183
+
184
+ .stage-badge {
185
+ margin-block-end: var(--size-sm);
186
+ }
187
+
188
+ .stage-title {
189
+ margin-block-start: 0;
190
+ margin-block-end: var(--size-xs);
191
+ font-size: var(--text-heading-sm);
192
+ }
193
+
194
+ .stage-desc {
195
+ margin-block-start: 0;
196
+ margin-block-end: var(--size-md);
197
+ font-size: var(--text-sm);
198
+ color: var(--fg-muted);
199
+ }
200
+ }
201
+
202
+ // ---------------------------------------------------------------------------
203
+ // Subtle Keyframe Animations
204
+ // ---------------------------------------------------------------------------
205
+ @keyframes subtle-float {
206
+ 0%, 100% {
207
+ transform: translateY(0);
208
+ }
209
+ 50% {
210
+ transform: translateY(-6px);
211
+ }
212
+ }
213
+
214
+ .animate-float {
215
+ animation: subtle-float 6s ease-in-out infinite;
216
+ }
@@ -1,108 +1,108 @@
1
- // ==========================================================================
2
- // Presentation Feature Grid & Cards — ln-ashlar
3
- // ==========================================================================
4
- // Multi-column responsive feature cards with icons and hover highlights.
5
- // Provided as mixins, semantic selectors (#features-list li), and classes.
6
- // ==========================================================================
7
-
8
- @mixin feature-grid {
9
- list-style: none;
10
- margin: 0;
11
- padding: 0;
12
- display: grid;
13
- grid-template-columns: 1fr;
14
- gap: var(--size-lg);
15
-
16
- @media (min-width: 640px) {
17
- grid-template-columns: repeat(2, 1fr);
18
- }
19
-
20
- @media (min-width: 1024px) {
21
- grid-template-columns: repeat(3, 1fr);
22
- }
23
-
24
- &.feature-grid-4 {
25
- @media (min-width: 1024px) {
26
- grid-template-columns: repeat(4, 1fr);
27
- }
28
- }
29
- }
30
-
31
- @mixin feature-card {
32
- list-style: none;
33
- margin: 0;
34
- background-color: var(--bg-elevated);
35
- border: var(--border-width) solid var(--color-border);
36
- border-radius: var(--radius-xl);
37
- padding: clamp(1.5rem, 2.5vw, 2rem);
38
- transition: transform var(--transition-base), box-shadow var(--transition-base), border-color var(--transition-base);
39
-
40
- &:hover {
41
- transform: translateY(-2px);
42
- box-shadow:
43
- 0 10px 25px -8px hsl(var(--color-primary) / 0.14),
44
- var(--shadow-md);
45
- border-color: color-mix(in srgb, hsl(var(--color-primary)) 35%, var(--color-border));
46
-
47
- > div:first-child,
48
- > figure:first-child,
49
- .feature-icon-wrap {
50
- transform: scale(1.05);
51
- background-color: color-mix(in srgb, hsl(var(--color-primary)) 18%, var(--bg-base));
52
- }
53
- }
54
-
55
- > div:first-child,
56
- > figure:first-child,
57
- .feature-icon-wrap {
58
- display: inline-flex;
59
- align-items: center;
60
- justify-content: center;
61
- width: 3.25rem;
62
- height: 3.25rem;
63
- border-radius: var(--radius-lg);
64
- background-color: color-mix(in srgb, hsl(var(--color-primary)) 12%, var(--bg-base));
65
- color: hsl(var(--color-primary));
66
- border: var(--border-width) solid color-mix(in srgb, hsl(var(--color-primary)) 25%, transparent);
67
- margin-block-end: var(--size-md);
68
- transition: transform var(--transition-fast), background-color var(--transition-fast);
69
-
70
- svg,
71
- .ln-icon {
72
- width: 1.5rem;
73
- height: 1.5rem;
74
- }
75
- }
76
-
77
- h3,
78
- .feature-title {
79
- font-size: var(--text-heading-sm);
80
- font-weight: 700;
81
- letter-spacing: -0.015em;
82
- color: var(--color-fg);
83
- margin-block-start: 0;
84
- margin-block-end: var(--size-xs-up);
85
- }
86
-
87
- p,
88
- .feature-desc {
89
- font-size: var(--text-body-md);
90
- color: var(--fg-muted);
91
- line-height: 1.55;
92
- margin: 0;
93
- }
94
- }
95
-
96
- // ─── Declarative Selectors ───────────────────────────────────────────────────
97
-
98
- #features-list,
99
- #features ul,
100
- .feature-grid {
101
- @include feature-grid;
102
- }
103
-
104
- #features-list > li,
105
- #features ul > li,
106
- .feature-card {
107
- @include feature-card;
108
- }
1
+ // ==========================================================================
2
+ // Presentation Feature Grid & Cards — ln-ashlar
3
+ // ==========================================================================
4
+ // Multi-column responsive feature cards with icons and hover highlights.
5
+ // Provided as mixins, semantic selectors (#features-list li), and classes.
6
+ // ==========================================================================
7
+
8
+ @mixin feature-grid {
9
+ list-style: none;
10
+ margin: 0;
11
+ padding: 0;
12
+ display: grid;
13
+ grid-template-columns: 1fr;
14
+ gap: var(--size-lg);
15
+
16
+ @media (min-width: 640px) {
17
+ grid-template-columns: repeat(2, 1fr);
18
+ }
19
+
20
+ @media (min-width: 1024px) {
21
+ grid-template-columns: repeat(3, 1fr);
22
+ }
23
+
24
+ &.feature-grid-4 {
25
+ @media (min-width: 1024px) {
26
+ grid-template-columns: repeat(4, 1fr);
27
+ }
28
+ }
29
+ }
30
+
31
+ @mixin feature-card {
32
+ list-style: none;
33
+ margin: 0;
34
+ background-color: var(--bg-elevated);
35
+ border: var(--border-width) solid var(--color-border);
36
+ border-radius: var(--radius-xl);
37
+ padding: clamp(1.5rem, 2.5vw, 2rem);
38
+ transition: transform var(--transition-base), box-shadow var(--transition-base), border-color var(--transition-base);
39
+
40
+ &:hover {
41
+ transform: translateY(-2px);
42
+ box-shadow:
43
+ 0 10px 25px -8px hsl(var(--color-primary) / 0.14),
44
+ var(--shadow-md);
45
+ border-color: color-mix(in srgb, hsl(var(--color-primary)) 35%, var(--color-border));
46
+
47
+ > div:first-child,
48
+ > figure:first-child,
49
+ .feature-icon-wrap {
50
+ transform: scale(1.05);
51
+ background-color: color-mix(in srgb, hsl(var(--color-primary)) 18%, var(--bg-base));
52
+ }
53
+ }
54
+
55
+ > div:first-child,
56
+ > figure:first-child,
57
+ .feature-icon-wrap {
58
+ display: inline-flex;
59
+ align-items: center;
60
+ justify-content: center;
61
+ width: 3.25rem;
62
+ height: 3.25rem;
63
+ border-radius: var(--radius-lg);
64
+ background-color: color-mix(in srgb, hsl(var(--color-primary)) 12%, var(--bg-base));
65
+ color: hsl(var(--color-primary));
66
+ border: var(--border-width) solid color-mix(in srgb, hsl(var(--color-primary)) 25%, transparent);
67
+ margin-block-end: var(--size-md);
68
+ transition: transform var(--transition-fast), background-color var(--transition-fast);
69
+
70
+ svg,
71
+ .ln-icon {
72
+ width: 1.5rem;
73
+ height: 1.5rem;
74
+ }
75
+ }
76
+
77
+ h3,
78
+ .feature-title {
79
+ font-size: var(--text-heading-sm);
80
+ font-weight: 700;
81
+ letter-spacing: -0.015em;
82
+ color: var(--color-fg);
83
+ margin-block-start: 0;
84
+ margin-block-end: var(--size-xs-up);
85
+ }
86
+
87
+ p,
88
+ .feature-desc {
89
+ font-size: var(--text-body-md);
90
+ color: var(--fg-muted);
91
+ line-height: 1.55;
92
+ margin: 0;
93
+ }
94
+ }
95
+
96
+ // ─── Declarative Selectors ───────────────────────────────────────────────────
97
+
98
+ #features-list,
99
+ #features ul,
100
+ .feature-grid {
101
+ @include feature-grid;
102
+ }
103
+
104
+ #features-list > li,
105
+ #features ul > li,
106
+ .feature-card {
107
+ @include feature-card;
108
+ }