@jjlmoya/utils-nautical 1.18.0 → 1.19.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 (45) hide show
  1. package/package.json +2 -2
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +5 -1
  4. package/src/index.ts +9 -7
  5. package/src/tests/diacritics_density.test.ts +1 -1
  6. package/src/tests/inverted_punctuation.test.ts +1 -1
  7. package/src/tests/locale_completeness.test.ts +2 -2
  8. package/src/tests/script_density.test.ts +1 -1
  9. package/src/tests/title_quality.test.ts +1 -1
  10. package/src/tests/tool_validation.test.ts +2 -2
  11. package/src/tool/anchorScope/anchorScope.css +507 -0
  12. package/src/tool/anchorScope/bibliography.astro +6 -0
  13. package/src/tool/anchorScope/bibliography.ts +14 -0
  14. package/src/tool/anchorScope/component.astro +219 -0
  15. package/src/tool/anchorScope/constants.ts +51 -0
  16. package/src/tool/anchorScope/controller.ts +251 -0
  17. package/src/tool/anchorScope/dom-views.ts +106 -0
  18. package/src/tool/anchorScope/entry.ts +31 -0
  19. package/src/tool/anchorScope/evaluator.ts +61 -0
  20. package/src/tool/anchorScope/i18n/de.ts +201 -0
  21. package/src/tool/anchorScope/i18n/en.ts +223 -0
  22. package/src/tool/anchorScope/i18n/es.ts +223 -0
  23. package/src/tool/anchorScope/i18n/fr.ts +201 -0
  24. package/src/tool/anchorScope/i18n/id.ts +201 -0
  25. package/src/tool/anchorScope/i18n/it.ts +201 -0
  26. package/src/tool/anchorScope/i18n/ja.ts +201 -0
  27. package/src/tool/anchorScope/i18n/ko.ts +201 -0
  28. package/src/tool/anchorScope/i18n/nl.ts +201 -0
  29. package/src/tool/anchorScope/i18n/pl.ts +201 -0
  30. package/src/tool/anchorScope/i18n/pt.ts +201 -0
  31. package/src/tool/anchorScope/i18n/ru.ts +201 -0
  32. package/src/tool/anchorScope/i18n/sv.ts +201 -0
  33. package/src/tool/anchorScope/i18n/tr.ts +201 -0
  34. package/src/tool/anchorScope/i18n/zh.ts +201 -0
  35. package/src/tool/anchorScope/index.ts +10 -0
  36. package/src/tool/anchorScope/logic.test.ts +100 -0
  37. package/src/tool/anchorScope/logic.ts +84 -0
  38. package/src/tool/anchorScope/presets.ts +12 -0
  39. package/src/tool/anchorScope/seo.astro +14 -0
  40. package/src/tool/anchorScope/storage.ts +25 -0
  41. package/src/tool/anchorScope/types.ts +33 -0
  42. package/src/tool/anchorScope/ui.ts +63 -0
  43. package/src/tool/endurance/index.ts +2 -1
  44. package/src/tools.ts +3 -0
  45. package/src/types.ts +3 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-nautical",
3
- "version": "1.18.0",
3
+ "version": "1.19.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -28,7 +28,7 @@
28
28
  "check": "astro check",
29
29
  "type-check": "astro check",
30
30
  "test": "vitest run",
31
- "preversion": "npm run lint && npm run test",
31
+ "preversion": "npm run lint && npm run test && npm run build",
32
32
  "postversion": "git push && git push --tags",
33
33
  "patch": "npm version patch",
34
34
  "minor": "npm version minor",
@@ -5,12 +5,13 @@ import { nauticalConverter } from '../tool/nauticalConverter/entry';
5
5
  import { sailArea } from '../tool/sailArea/entry';
6
6
  import { speedConverter } from '../tool/speedConverter/entry';
7
7
  import { endurance } from '../tool/endurance/entry';
8
+ import { anchorScope } from '../tool/anchorScope/entry';
8
9
 
9
10
  export type { CategoryLocaleContent };
10
11
 
11
12
  export const nauticalCategory: NauticalCategoryEntry = {
12
13
  icon: 'mdi:sail-boat',
13
- tools: [tideCalculator, underKeel, nauticalConverter, sailArea, speedConverter, endurance],
14
+ tools: [tideCalculator, underKeel, nauticalConverter, sailArea, speedConverter, endurance, anchorScope],
14
15
  i18n: {
15
16
  en: () => import('./i18n/en').then((m) => m.content),
16
17
  es: () => import('./i18n/es').then((m) => m.content),
package/src/entries.ts CHANGED
@@ -10,6 +10,9 @@ export { tideCalculator } from './tool/tideCalculator/entry';
10
10
  export type { TideCalculatorUI, TideCalculatorLocaleContent } from './tool/tideCalculator/entry';
11
11
  export { underKeel } from './tool/underKeel/entry';
12
12
  export type { UnderKeelUI, UnderKeelLocaleContent } from './tool/underKeel/entry';
13
+ export { anchorScope } from './tool/anchorScope/entry';
14
+ export type { AnchorScopeLocaleContent } from './tool/anchorScope/entry';
15
+ export type { AnchorScopeUI } from './tool/anchorScope/ui';
13
16
  export { nauticalCategory } from './category';
14
17
  import { endurance } from './tool/endurance/entry';
15
18
  import { nauticalConverter } from './tool/nauticalConverter/entry';
@@ -17,4 +20,5 @@ import { sailArea } from './tool/sailArea/entry';
17
20
  import { speedConverter } from './tool/speedConverter/entry';
18
21
  import { tideCalculator } from './tool/tideCalculator/entry';
19
22
  import { underKeel } from './tool/underKeel/entry';
20
- export const ALL_ENTRIES = [endurance, nauticalConverter, sailArea, speedConverter, tideCalculator, underKeel];
23
+ import { anchorScope } from './tool/anchorScope/entry';
24
+ export const ALL_ENTRIES = [endurance, nauticalConverter, sailArea, speedConverter, tideCalculator, underKeel, anchorScope];
package/src/index.ts CHANGED
@@ -1,10 +1,4 @@
1
- export * from './tool/tideCalculator';
2
- export * from './tool/underKeel';
3
- export * from './tool/nauticalConverter';
4
- export * from './tool/sailArea';
5
- export * from './tool/speedConverter';
6
- export * from './tool/endurance';
7
- export * from './category';
1
+ export { nauticalCategory } from './category';
8
2
  export const NauticalCategorySEO = () => import('./category/seo.astro').then((m) => m.default);
9
3
 
10
4
  export type {
@@ -18,6 +12,14 @@ export type {
18
12
  LocaleMap,
19
13
  NauticalToolEntry,
20
14
  NauticalCategoryEntry,
15
+ ToolDefinition,
21
16
  } from './types';
22
17
 
23
18
  export { ALL_ENTRIES, ALL_TOOLS } from './tools';
19
+ export { tideCalculator, TIDE_CALCULATOR_TOOL } from './tool/tideCalculator';
20
+ export { underKeel, UNDER_KEEL_TOOL } from './tool/underKeel';
21
+ export { nauticalConverter, NAUTICAL_CONVERTER_TOOL } from './tool/nauticalConverter';
22
+ export { sailArea, SAIL_AREA_TOOL } from './tool/sailArea';
23
+ export { speedConverter, SPEED_CONVERTER_TOOL } from './tool/speedConverter';
24
+ export { endurance, ENDURANCE_TOOL } from './tool/endurance';
25
+ export { anchorScope, ANCHOR_SCOPE_TOOL } from './tool/anchorScope';
@@ -96,7 +96,7 @@ describe('Diacritics density validation', () => {
96
96
  if (!loader) return;
97
97
 
98
98
  const content = await loader();
99
- const text = normalizeText(translatableContent(content as Record<string, unknown>));
99
+ const text = normalizeText(translatableContent((content as unknown) as Record<string, unknown>));
100
100
  const rule = DIACRITIC_RULES[typedLocale];
101
101
  const letters = letterCount(text);
102
102
  const matches = diacriticCount(text, typedLocale);
@@ -60,7 +60,7 @@ describe('Inverted punctuation validation', () => {
60
60
 
61
61
  const rule = INVERTED_PUNCTUATION_LOCALES[typedLocale];
62
62
  const content = await loader();
63
- const strings = translatableStrings(content as Record<string, unknown>);
63
+ const strings = translatableStrings((content as unknown) as Record<string, unknown>);
64
64
  const missingQuestions = strings.flatMap((text) =>
65
65
  findMissingInvertedMarks(text, rule.questionStart, rule.questionEnd)
66
66
  );
@@ -5,8 +5,8 @@ import { ALL_TOOLS } from '../tools';
5
5
  describe('Locale Completeness Validation', () => {
6
6
 
7
7
 
8
- it('all 10 tools registered', () => {
9
- expect(ALL_TOOLS.length).toBe(6);
8
+ it('all 7 tools registered', () => {
9
+ expect(ALL_TOOLS.length).toBe(7);
10
10
  });
11
11
  });
12
12
 
@@ -73,7 +73,7 @@ describe('Native script density validation', () => {
73
73
 
74
74
  const content = await loader();
75
75
  const rule = SCRIPT_RULES[typedLocale];
76
- const text = normalizeText(translatableContent(content as Record<string, unknown>));
76
+ const text = normalizeText(translatableContent((content as unknown) as Record<string, unknown>));
77
77
  const letters = letterCount(text);
78
78
  const matches = scriptCount(text, typedLocale);
79
79
  const ratio = scriptRatio(text, typedLocale);
@@ -40,7 +40,7 @@ describe('Project Titles - Separator Validation', () => {
40
40
  for (const pattern of titlePatterns) {
41
41
  let match;
42
42
  while ((match = pattern.exec(content)) !== null) {
43
- const title = match[1];
43
+ const title = match[1] ?? '';
44
44
  if (title.includes('|') || title.includes('-')) {
45
45
  findings.push(title);
46
46
  }
@@ -5,8 +5,8 @@ const TOOL_ID_REGEX = /^[a-z0-9]+-?[a-z0-9]*$/;
5
5
 
6
6
  describe('Tool Validation Suite', () => {
7
7
  describe('Library Registration', () => {
8
- it('should have 6 tools in ALL_TOOLS', () => {
9
- expect(ALL_TOOLS.length).toBe(6);
8
+ it('should have 7 tools in ALL_TOOLS', () => {
9
+ expect(ALL_TOOLS.length).toBe(7);
10
10
  });
11
11
  });
12
12
 
@@ -0,0 +1,507 @@
1
+ .asc-calculator {
2
+ --n-bg: #fff;
3
+ --n-bg-muted: #f8fafc;
4
+ --n-text: #0f172a;
5
+ --n-text-muted: #475569;
6
+ --n-text-dim: #64748b;
7
+ --n-border: #e2e8f0;
8
+ --n-shadow: rgba(0, 0, 0, 0.08);
9
+ --n-primary: #0284c7;
10
+ --n-primary-on: #fff;
11
+ --n-sidebar-bg: linear-gradient(160deg, #0284c7 0%, #0369a1 100%);
12
+ --n-sidebar-text: #fff;
13
+ --n-sidebar-muted: rgba(255, 255, 255, 0.9);
14
+ --n-sidebar-input-bg: rgba(255, 255, 255, 0.16);
15
+ --n-sidebar-input-border: rgba(255, 255, 255, 0.3);
16
+ --n-chip-active-bg: #fff;
17
+ --n-chip-active-text: #0369a1;
18
+ --n-chip-inactive-bg: rgba(255, 255, 255, 0.15);
19
+ --n-chip-inactive-text: #fff;
20
+ --n-chip-inactive-border: rgba(255, 255, 255, 0.25);
21
+ --n-dropdown-bg: #0f172a;
22
+ --n-dropdown-border: #334155;
23
+ --n-dropdown-text: #f8fafc;
24
+ --n-dropdown-hover-bg: #0284c7;
25
+ --n-dropdown-active-bg: #0369a1;
26
+ --n-card-bg: #f8fafc;
27
+ --n-card-border: #e2e8f0;
28
+ --n-highlight-bg: #f0f9ff;
29
+ --n-highlight-border: #0284c7;
30
+ --n-highlight-text: #0284c7;
31
+ --n-stage-bg: #0f172a;
32
+ --n-status-optimal-bg: rgba(34, 197, 94, 0.18);
33
+ --n-status-optimal-border: rgba(34, 197, 94, 0.35);
34
+ --n-status-optimal-text: #16a34a;
35
+ --n-status-caution-bg: rgba(234, 179, 8, 0.18);
36
+ --n-status-caution-border: rgba(234, 179, 8, 0.35);
37
+ --n-status-caution-text: #d97706;
38
+ --n-status-danger-bg: rgba(239, 68, 68, 0.18);
39
+ --n-status-danger-border: rgba(239, 68, 68, 0.35);
40
+ --n-status-danger-text: #dc2626;
41
+
42
+ display: flex;
43
+ flex-direction: column;
44
+ width: 100%;
45
+ max-width: 1080px;
46
+ margin: 0 auto;
47
+ box-sizing: border-box;
48
+ }
49
+
50
+ .theme-dark .asc-calculator {
51
+ --n-bg: #0f172a;
52
+ --n-bg-muted: #1e293b;
53
+ --n-text: #f8fafc;
54
+ --n-text-muted: #94a3b8;
55
+ --n-text-dim: #64748b;
56
+ --n-border: #334155;
57
+ --n-shadow: rgba(0, 0, 0, 0.4);
58
+ --n-primary: #38bdf8;
59
+ --n-primary-on: #fff;
60
+ --n-sidebar-bg: linear-gradient(160deg, #0c4a6e 0%, #082f49 100%);
61
+ --n-sidebar-text: #f8fafc;
62
+ --n-sidebar-muted: #cbd5e1;
63
+ --n-sidebar-input-bg: rgba(15, 23, 42, 0.65);
64
+ --n-sidebar-input-border: rgba(255, 255, 255, 0.18);
65
+ --n-chip-active-bg: #fff;
66
+ --n-chip-active-text: #082f49;
67
+ --n-chip-inactive-bg: rgba(15, 23, 42, 0.5);
68
+ --n-chip-inactive-text: #f8fafc;
69
+ --n-chip-inactive-border: rgba(255, 255, 255, 0.2);
70
+ --n-dropdown-bg: #1e293b;
71
+ --n-dropdown-border: #475569;
72
+ --n-dropdown-text: #f8fafc;
73
+ --n-dropdown-hover-bg: #0284c7;
74
+ --n-dropdown-active-bg: #0369a1;
75
+ --n-card-bg: #1e293b;
76
+ --n-card-border: #334155;
77
+ --n-highlight-bg: rgba(2, 132, 199, 0.16);
78
+ --n-highlight-border: #38bdf8;
79
+ --n-highlight-text: #38bdf8;
80
+ --n-stage-bg: #0b1329;
81
+ --n-status-optimal-text: #4ade80;
82
+ --n-status-caution-text: #facc15;
83
+ --n-status-danger-text: #f87171;
84
+ }
85
+
86
+ .asc-main-card {
87
+ background: var(--n-bg);
88
+ border: 1px solid var(--n-border);
89
+ border-radius: 1.75rem;
90
+ display: grid;
91
+ grid-template-columns: 350px 1fr;
92
+ overflow: hidden;
93
+ box-shadow: 0 20px 40px var(--n-shadow);
94
+ }
95
+
96
+ @media (max-width: 900px) {
97
+ .asc-main-card {
98
+ grid-template-columns: 1fr;
99
+ }
100
+ }
101
+
102
+ .asc-sidebar {
103
+ background: var(--n-sidebar-bg);
104
+ color: var(--n-sidebar-text);
105
+ padding: 1.5rem;
106
+ display: flex;
107
+ flex-direction: column;
108
+ gap: 1rem;
109
+ }
110
+
111
+ .asc-sidebar-top {
112
+ display: flex;
113
+ justify-content: space-between;
114
+ align-items: center;
115
+ gap: 0.5rem;
116
+ }
117
+
118
+ .asc-sidebar-title {
119
+ font-size: 0.95rem;
120
+ font-weight: 700;
121
+ text-transform: uppercase;
122
+ letter-spacing: 0.05em;
123
+ color: var(--n-sidebar-text);
124
+ }
125
+
126
+ .asc-unit-toggle {
127
+ display: inline-flex;
128
+ background: rgba(0, 0, 0, 0.25);
129
+ border-radius: 0.5rem;
130
+ padding: 0.2rem;
131
+ gap: 0.2rem;
132
+ }
133
+
134
+ .asc-unit-btn {
135
+ background: transparent;
136
+ border: none;
137
+ color: var(--n-sidebar-muted);
138
+ padding: 0.25rem 0.65rem;
139
+ border-radius: 0.35rem;
140
+ font-size: 0.75rem;
141
+ font-weight: 800;
142
+ cursor: pointer;
143
+ transition: all 0.2s ease;
144
+ }
145
+
146
+ .asc-unit-btn.asc-unit-active {
147
+ background: var(--n-chip-active-bg);
148
+ color: var(--n-chip-active-text);
149
+ }
150
+
151
+ .asc-presets-bar {
152
+ display: grid;
153
+ grid-template-columns: repeat(3, 1fr);
154
+ gap: 0.35rem;
155
+ }
156
+
157
+ .asc-preset-chip {
158
+ background: var(--n-chip-inactive-bg);
159
+ border: 1px solid var(--n-chip-inactive-border);
160
+ color: var(--n-chip-inactive-text);
161
+ padding: 0.4rem 0.35rem;
162
+ border-radius: 0.45rem;
163
+ font-size: 0.72rem;
164
+ font-weight: 800;
165
+ cursor: pointer;
166
+ transition: all 0.2s ease;
167
+ white-space: nowrap;
168
+ overflow: hidden;
169
+ text-overflow: ellipsis;
170
+ text-align: center;
171
+ }
172
+
173
+ .asc-preset-chip:hover {
174
+ background: rgba(255, 255, 255, 0.25);
175
+ }
176
+
177
+ .asc-preset-chip.asc-preset-active {
178
+ background: var(--n-chip-active-bg);
179
+ color: var(--n-chip-active-text);
180
+ border-color: var(--n-chip-active-bg);
181
+ }
182
+
183
+ .asc-inputs-group {
184
+ display: flex;
185
+ flex-direction: column;
186
+ gap: 0.8rem;
187
+ }
188
+
189
+ .asc-input-row {
190
+ display: grid;
191
+ grid-template-columns: 1fr 1fr;
192
+ gap: 0.65rem;
193
+ }
194
+
195
+ .asc-input-block {
196
+ display: flex;
197
+ flex-direction: column;
198
+ gap: 0.3rem;
199
+ }
200
+
201
+ .asc-input-block label {
202
+ font-size: 0.75rem;
203
+ font-weight: 800;
204
+ text-transform: uppercase;
205
+ letter-spacing: 0.04em;
206
+ color: var(--n-sidebar-muted);
207
+ }
208
+
209
+ .asc-unit-field {
210
+ position: relative;
211
+ display: flex;
212
+ align-items: center;
213
+ }
214
+
215
+ .asc-unit-field input {
216
+ padding-right: 2rem;
217
+ }
218
+
219
+ .asc-field-unit {
220
+ position: absolute;
221
+ right: 0.65rem;
222
+ font-size: 0.75rem;
223
+ font-weight: 800;
224
+ color: var(--n-sidebar-muted);
225
+ pointer-events: none;
226
+ }
227
+
228
+ .sc-num-input {
229
+ background: var(--n-sidebar-input-bg);
230
+ border: 1px solid var(--n-sidebar-input-border);
231
+ color: var(--n-sidebar-text);
232
+ padding: 0.55rem 0.75rem;
233
+ border-radius: 0.5rem;
234
+ font-size: 0.9rem;
235
+ font-weight: 700;
236
+ width: 100%;
237
+ box-sizing: border-box;
238
+ outline: none;
239
+ transition: border-color 0.2s;
240
+ }
241
+
242
+ .sc-num-input:focus {
243
+ border-color: var(--n-primary-on);
244
+ }
245
+
246
+ .asc-custom-select {
247
+ position: relative;
248
+ width: 100%;
249
+ }
250
+
251
+ .asc-select-trigger {
252
+ background: var(--n-sidebar-input-bg);
253
+ border: 1px solid var(--n-sidebar-input-border);
254
+ color: var(--n-sidebar-text);
255
+ padding: 0.55rem 0.75rem;
256
+ border-radius: 0.5rem;
257
+ font-size: 0.85rem;
258
+ font-weight: 700;
259
+ width: 100%;
260
+ display: flex;
261
+ justify-content: space-between;
262
+ align-items: center;
263
+ cursor: pointer;
264
+ outline: none;
265
+ transition: all 0.2s ease;
266
+ box-sizing: border-box;
267
+ }
268
+
269
+ .asc-select-trigger:hover,
270
+ .asc-custom-select.asc-select-open .asc-select-trigger {
271
+ border-color: var(--n-primary-on);
272
+ }
273
+
274
+ .asc-select-label {
275
+ white-space: nowrap;
276
+ overflow: hidden;
277
+ text-overflow: ellipsis;
278
+ }
279
+
280
+ .asc-select-chevron {
281
+ width: 1rem;
282
+ height: 1rem;
283
+ color: var(--n-sidebar-muted);
284
+ transition: transform 0.2s ease;
285
+ flex-shrink: 0;
286
+ }
287
+
288
+ .asc-custom-select.asc-select-open .asc-select-chevron {
289
+ transform: rotate(180deg);
290
+ }
291
+
292
+ .asc-select-dropdown {
293
+ position: absolute;
294
+ top: calc(100% + 0.35rem);
295
+ left: 0;
296
+ right: 0;
297
+ background: var(--n-dropdown-bg);
298
+ border: 1px solid var(--n-dropdown-border);
299
+ border-radius: 0.5rem;
300
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.4);
301
+ z-index: 50;
302
+ display: none;
303
+ flex-direction: column;
304
+ overflow: hidden;
305
+ max-height: 220px;
306
+ overflow-y: auto;
307
+ }
308
+
309
+ .asc-custom-select.asc-select-open .asc-select-dropdown {
310
+ display: flex;
311
+ }
312
+
313
+ .asc-option {
314
+ padding: 0.55rem 0.75rem;
315
+ font-size: 0.82rem;
316
+ font-weight: 700;
317
+ color: var(--n-dropdown-text);
318
+ cursor: pointer;
319
+ transition: all 0.15s ease;
320
+ }
321
+
322
+ .asc-option:hover {
323
+ background: var(--n-dropdown-hover-bg);
324
+ color: var(--n-primary-on);
325
+ }
326
+
327
+ .asc-option.asc-option-active {
328
+ background: var(--n-dropdown-active-bg);
329
+ color: var(--n-primary-on);
330
+ }
331
+
332
+ .asc-reset-btn {
333
+ background: rgba(255, 255, 255, 0.1);
334
+ border: 1px solid rgba(255, 255, 255, 0.2);
335
+ color: var(--n-sidebar-text);
336
+ padding: 0.5rem 0.8rem;
337
+ border-radius: 0.5rem;
338
+ font-size: 0.8rem;
339
+ font-weight: 700;
340
+ cursor: pointer;
341
+ transition: all 0.2s ease;
342
+ margin-top: 0.25rem;
343
+ }
344
+
345
+ .asc-reset-btn:hover {
346
+ background: rgba(239, 68, 68, 0.25);
347
+ border-color: rgba(239, 68, 68, 0.4);
348
+ }
349
+
350
+ .asc-content {
351
+ background: var(--n-bg);
352
+ padding: 1.5rem;
353
+ display: flex;
354
+ flex-direction: column;
355
+ gap: 1rem;
356
+ }
357
+
358
+ .asc-metrics-grid {
359
+ display: grid;
360
+ grid-template-columns: repeat(3, 1fr);
361
+ gap: 0.65rem;
362
+ }
363
+
364
+ @media (max-width: 600px) {
365
+ .asc-metrics-grid {
366
+ grid-template-columns: 1fr 1fr;
367
+ }
368
+ }
369
+
370
+ .asc-metric-card {
371
+ background: var(--n-card-bg);
372
+ border: 1px solid var(--n-card-border);
373
+ border-radius: 0.75rem;
374
+ padding: 0.75rem 0.85rem;
375
+ display: flex;
376
+ flex-direction: column;
377
+ gap: 0.2rem;
378
+ }
379
+
380
+ .asc-metric-highlight {
381
+ background: var(--n-highlight-bg);
382
+ border-color: var(--n-highlight-border);
383
+ }
384
+
385
+ .asc-metric-lbl {
386
+ font-size: 0.72rem;
387
+ font-weight: 800;
388
+ color: var(--n-text-dim);
389
+ text-transform: uppercase;
390
+ letter-spacing: 0.03em;
391
+ }
392
+
393
+ .asc-metric-val {
394
+ font-size: 1.35rem;
395
+ font-weight: 800;
396
+ color: var(--n-text);
397
+ }
398
+
399
+ .asc-metric-highlight .asc-metric-val {
400
+ color: var(--n-highlight-text);
401
+ }
402
+
403
+ .asc-status-banner {
404
+ background: var(--n-card-bg);
405
+ border: 1px solid var(--n-card-border);
406
+ border-radius: 0.75rem;
407
+ padding: 0.75rem 1rem;
408
+ display: flex;
409
+ align-items: center;
410
+ gap: 0.85rem;
411
+ }
412
+
413
+ .asc-status-tag {
414
+ font-size: 0.72rem;
415
+ font-weight: 800;
416
+ padding: 0.25rem 0.55rem;
417
+ border-radius: 0.35rem;
418
+ letter-spacing: 0.05em;
419
+ flex-shrink: 0;
420
+ }
421
+
422
+ .sc-status-optimal {
423
+ background: var(--n-status-optimal-bg);
424
+ color: var(--n-status-optimal-text);
425
+ border: 1px solid var(--n-status-optimal-border);
426
+ }
427
+
428
+ .sc-status-caution {
429
+ background: var(--n-status-caution-bg);
430
+ color: var(--n-status-caution-text);
431
+ border: 1px solid var(--n-status-caution-border);
432
+ }
433
+
434
+ .sc-status-danger {
435
+ background: var(--n-status-danger-bg);
436
+ color: var(--n-status-danger-text);
437
+ border: 1px solid var(--n-status-danger-border);
438
+ }
439
+
440
+ .asc-status-info {
441
+ display: flex;
442
+ flex-direction: column;
443
+ gap: 0.15rem;
444
+ }
445
+
446
+ .asc-status-headline {
447
+ font-weight: 800;
448
+ font-size: 0.88rem;
449
+ color: var(--n-text);
450
+ }
451
+
452
+ .asc-status-subline {
453
+ font-size: 0.78rem;
454
+ color: var(--n-text-muted);
455
+ line-height: 1.35;
456
+ }
457
+
458
+ .asc-visual-stage {
459
+ background: var(--n-stage-bg);
460
+ border: 1px solid var(--n-border);
461
+ border-radius: 0.75rem;
462
+ padding: 0.5rem;
463
+ overflow: hidden;
464
+ }
465
+
466
+ .asc-diagram-svg {
467
+ width: 100%;
468
+ height: 230px;
469
+ display: block;
470
+ }
471
+
472
+ .asc-advice-row {
473
+ display: grid;
474
+ grid-template-columns: 1fr 1fr;
475
+ gap: 0.65rem;
476
+ }
477
+
478
+ @media (max-width: 600px) {
479
+ .asc-advice-row {
480
+ grid-template-columns: 1fr;
481
+ }
482
+ }
483
+
484
+ .asc-advice-card {
485
+ background: var(--n-card-bg);
486
+ border: 1px solid var(--n-card-border);
487
+ border-radius: 0.65rem;
488
+ padding: 0.75rem 0.85rem;
489
+ display: flex;
490
+ flex-direction: column;
491
+ gap: 0.35rem;
492
+ }
493
+
494
+ .asc-advice-tag {
495
+ font-size: 0.68rem;
496
+ font-weight: 800;
497
+ text-transform: uppercase;
498
+ letter-spacing: 0.05em;
499
+ color: var(--n-highlight-text);
500
+ }
501
+
502
+ .asc-advice-text {
503
+ margin: 0;
504
+ font-size: 0.78rem;
505
+ color: var(--n-text-muted);
506
+ line-height: 1.35;
507
+ }
@@ -0,0 +1,6 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import { bibliographyEntries } from './bibliography';
4
+ ---
5
+
6
+ <SharedBibliography links={bibliographyEntries} />
@@ -0,0 +1,14 @@
1
+ import type { BibliographyEntry } from '../../types';
2
+
3
+ export const bibliographyEntries: BibliographyEntry[] = [
4
+ {
5
+ name: 'Anchoring Techniques & Best Practices: Types, Scope, and Holding',
6
+ url: 'https://takemyboattest.com/blog/uncategorized/anchoring-techniques-best-practices-types-scope-and-holding/',
7
+ },
8
+ {
9
+ name: 'Anchoring Physics: The Real Chain Reaction, Explained',
10
+ url: 'https://galvanicworks.com/anchoring-physics-the-real-chain-reaction-explained/',
11
+ }
12
+ ];
13
+
14
+ export const bibliography = bibliographyEntries;