@f-ewald/components 1.14.0 → 1.15.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.
package/README.md CHANGED
@@ -79,6 +79,8 @@ import "@f-ewald/components/roman-numeral.js";
79
79
  | `<link-card>` | [API reference](https://f-ewald.github.io/components/docs/link-card.html) |
80
80
  | `<live-timer>` | [API reference](https://f-ewald.github.io/components/docs/live-timer.html) |
81
81
  | `<load-more>` | [API reference](https://f-ewald.github.io/components/docs/load-more.html) |
82
+ | `<loading-dots>` | [API reference](https://f-ewald.github.io/components/docs/loading-dots.html) |
83
+ | `<loading-spinner>` | [API reference](https://f-ewald.github.io/components/docs/loading-spinner.html) |
82
84
  | `<map-circle>` | [API reference](https://f-ewald.github.io/components/docs/map-circle.html) |
83
85
  | `<map-pin>` | [API reference](https://f-ewald.github.io/components/docs/map-pin.html) |
84
86
  | `<markdown-view>` | [API reference](https://f-ewald.github.io/components/docs/markdown-view.html) |
@@ -6755,6 +6755,22 @@
6755
6755
  "module": "./load-more.js"
6756
6756
  }
6757
6757
  },
6758
+ {
6759
+ "kind": "js",
6760
+ "name": "LoadingSpinner",
6761
+ "declaration": {
6762
+ "name": "LoadingSpinner",
6763
+ "module": "./loading-spinner.js"
6764
+ }
6765
+ },
6766
+ {
6767
+ "kind": "js",
6768
+ "name": "LoadingDots",
6769
+ "declaration": {
6770
+ "name": "LoadingDots",
6771
+ "module": "./loading-dots.js"
6772
+ }
6773
+ },
6758
6774
  {
6759
6775
  "kind": "js",
6760
6776
  "name": "ChatMessage",
@@ -8575,13 +8591,167 @@
8575
8591
  }
8576
8592
  ]
8577
8593
  },
8594
+ {
8595
+ "kind": "javascript-module",
8596
+ "path": "src/loading-dots.ts",
8597
+ "declarations": [
8598
+ {
8599
+ "kind": "class",
8600
+ "description": "Three dots that bounce one after another as a lightweight, indeterminate\n\"working\" / \"typing\" indicator. Purely presentational and property-driven —\nshow it while a short operation is pending and remove it when done.\n\nExposes an accessible `role=\"status\"` with `label` as its name, so assistive\ntechnology announces the loading state; the dots themselves are decorative.\nUnder `prefers-reduced-motion` the bounce is removed and the dots rest.",
8601
+ "name": "LoadingDots",
8602
+ "members": [
8603
+ {
8604
+ "kind": "field",
8605
+ "name": "size",
8606
+ "type": {
8607
+ "text": "\"sm\" | \"md\" | \"lg\""
8608
+ },
8609
+ "default": "\"md\"",
8610
+ "description": "Dot-size step — `sm`, `md` (default), or `lg`.",
8611
+ "attribute": "size"
8612
+ },
8613
+ {
8614
+ "kind": "field",
8615
+ "name": "label",
8616
+ "type": {
8617
+ "text": "string"
8618
+ },
8619
+ "default": "\"Loading\"",
8620
+ "description": "Accessible name announced by the `role=\"status\"` live region.",
8621
+ "attribute": "label"
8622
+ }
8623
+ ],
8624
+ "attributes": [
8625
+ {
8626
+ "name": "size",
8627
+ "type": {
8628
+ "text": "\"sm\" | \"md\" | \"lg\""
8629
+ },
8630
+ "default": "\"md\"",
8631
+ "description": "Dot-size step — `sm`, `md` (default), or `lg`.",
8632
+ "fieldName": "size"
8633
+ },
8634
+ {
8635
+ "name": "label",
8636
+ "type": {
8637
+ "text": "string"
8638
+ },
8639
+ "default": "\"Loading\"",
8640
+ "description": "Accessible name announced by the `role=\"status\"` live region.",
8641
+ "fieldName": "label"
8642
+ }
8643
+ ],
8644
+ "superclass": {
8645
+ "name": "LitElement",
8646
+ "package": "lit"
8647
+ },
8648
+ "tagName": "loading-dots",
8649
+ "customElement": true
8650
+ }
8651
+ ],
8652
+ "exports": [
8653
+ {
8654
+ "kind": "js",
8655
+ "name": "LoadingDots",
8656
+ "declaration": {
8657
+ "name": "LoadingDots",
8658
+ "module": "src/loading-dots.ts"
8659
+ }
8660
+ },
8661
+ {
8662
+ "kind": "custom-element-definition",
8663
+ "name": "loading-dots",
8664
+ "declaration": {
8665
+ "name": "LoadingDots",
8666
+ "module": "src/loading-dots.ts"
8667
+ }
8668
+ }
8669
+ ]
8670
+ },
8671
+ {
8672
+ "kind": "javascript-module",
8673
+ "path": "src/loading-spinner.ts",
8674
+ "declarations": [
8675
+ {
8676
+ "kind": "class",
8677
+ "description": "Indeterminate circular loading spinner: a rotating arc over a faint track,\nin the style of a browser page-load indicator. Purely presentational and\nproperty-driven — show it while work is in flight and remove it when done.\n\nExposes an accessible `role=\"status\"` with `label` as its name, so assistive\ntechnology announces the loading state; the arc itself is decorative. Under\n`prefers-reduced-motion` it stops rotating and stays a static ring.",
8678
+ "name": "LoadingSpinner",
8679
+ "members": [
8680
+ {
8681
+ "kind": "field",
8682
+ "name": "size",
8683
+ "type": {
8684
+ "text": "\"sm\" | \"md\" | \"lg\""
8685
+ },
8686
+ "default": "\"md\"",
8687
+ "description": "Diameter step — `sm` ≈ 1rem, `md` ≈ 1.5rem (default), `lg` ≈ 2rem.",
8688
+ "attribute": "size"
8689
+ },
8690
+ {
8691
+ "kind": "field",
8692
+ "name": "label",
8693
+ "type": {
8694
+ "text": "string"
8695
+ },
8696
+ "default": "\"Loading\"",
8697
+ "description": "Accessible name announced by the `role=\"status\"` live region.",
8698
+ "attribute": "label"
8699
+ }
8700
+ ],
8701
+ "attributes": [
8702
+ {
8703
+ "name": "size",
8704
+ "type": {
8705
+ "text": "\"sm\" | \"md\" | \"lg\""
8706
+ },
8707
+ "default": "\"md\"",
8708
+ "description": "Diameter step — `sm` ≈ 1rem, `md` ≈ 1.5rem (default), `lg` ≈ 2rem.",
8709
+ "fieldName": "size"
8710
+ },
8711
+ {
8712
+ "name": "label",
8713
+ "type": {
8714
+ "text": "string"
8715
+ },
8716
+ "default": "\"Loading\"",
8717
+ "description": "Accessible name announced by the `role=\"status\"` live region.",
8718
+ "fieldName": "label"
8719
+ }
8720
+ ],
8721
+ "superclass": {
8722
+ "name": "LitElement",
8723
+ "package": "lit"
8724
+ },
8725
+ "tagName": "loading-spinner",
8726
+ "customElement": true
8727
+ }
8728
+ ],
8729
+ "exports": [
8730
+ {
8731
+ "kind": "js",
8732
+ "name": "LoadingSpinner",
8733
+ "declaration": {
8734
+ "name": "LoadingSpinner",
8735
+ "module": "src/loading-spinner.ts"
8736
+ }
8737
+ },
8738
+ {
8739
+ "kind": "custom-element-definition",
8740
+ "name": "loading-spinner",
8741
+ "declaration": {
8742
+ "name": "LoadingSpinner",
8743
+ "module": "src/loading-spinner.ts"
8744
+ }
8745
+ }
8746
+ ]
8747
+ },
8578
8748
  {
8579
8749
  "kind": "javascript-module",
8580
8750
  "path": "src/map-circle.ts",
8581
8751
  "declarations": [
8582
8752
  {
8583
8753
  "kind": "class",
8584
- "description": "A plain circular map marker: a radial-gradient fill with a soft highlight\nand a translucent white outer ring, no point/tail (unlike `<map-pin>`) —\nfor markers that don't need to visually \"point\" at their exact\ncoordinate. Purely a visual primitive — it has no `mapbox-gl` (or any\nmapping library) dependency; the consumer positions it, e.g. via\n`new mapboxgl.Marker({ element: el })`. It can also replace the former\n`<map-point>` dense-layer primitive: use `size=\"14\" ring-width=\"3\"`, leave\nthe slot empty, and rasterize one marker per color for use as a map\n`icon-image`.",
8754
+ "description": "A plain circular map marker: a radial-gradient fill with a soft highlight\nand a solid white outer ring, no point/tail (unlike `<map-pin>`) —\nfor markers that don't need to visually \"point\" at their exact\ncoordinate. Purely a visual primitive — it has no `mapbox-gl` (or any\nmapping library) dependency; the consumer positions it, e.g. via\n`new mapboxgl.Marker({ element: el })`. It can also replace the former\n`<map-point>` dense-layer primitive: use `size=\"14\" ring-width=\"3\"`, leave\nthe slot empty, and rasterize one marker per color for use as a map\n`icon-image`.",
8585
8755
  "name": "MapCircle",
8586
8756
  "slots": [
8587
8757
  {
@@ -8616,7 +8786,7 @@
8616
8786
  "type": {
8617
8787
  "text": "number"
8618
8788
  },
8619
- "default": "4",
8789
+ "default": "2",
8620
8790
  "description": "White outer ring thickness, in the same viewBox units as `size` (scales with it).",
8621
8791
  "attribute": "ring-width"
8622
8792
  },
@@ -8626,8 +8796,8 @@
8626
8796
  "type": {
8627
8797
  "text": "number"
8628
8798
  },
8629
- "default": "0.6",
8630
- "description": "Outer ring opacity, 0-1 (Apple Maps-style rings are translucent, not solid white).",
8799
+ "default": "1",
8800
+ "description": "Outer ring opacity, 0-1 (default 1 = a solid Apple Maps-style white ring; lower for a translucent ring).",
8631
8801
  "attribute": "ring-opacity"
8632
8802
  },
8633
8803
  {
@@ -8673,7 +8843,7 @@
8673
8843
  "type": {
8674
8844
  "text": "number"
8675
8845
  },
8676
- "default": "4",
8846
+ "default": "2",
8677
8847
  "description": "White outer ring thickness, in the same viewBox units as `size` (scales with it).",
8678
8848
  "fieldName": "ringWidth"
8679
8849
  },
@@ -8682,8 +8852,8 @@
8682
8852
  "type": {
8683
8853
  "text": "number"
8684
8854
  },
8685
- "default": "0.6",
8686
- "description": "Outer ring opacity, 0-1 (Apple Maps-style rings are translucent, not solid white).",
8855
+ "default": "1",
8856
+ "description": "Outer ring opacity, 0-1 (default 1 = a solid Apple Maps-style white ring; lower for a translucent ring).",
8687
8857
  "fieldName": "ringOpacity"
8688
8858
  },
8689
8859
  {
@@ -8764,8 +8934,8 @@
8764
8934
  "type": {
8765
8935
  "text": "number"
8766
8936
  },
8767
- "default": "0.6",
8768
- "description": "Outer ring opacity, 0-1 (Apple Maps-style rings are translucent, not solid white).",
8937
+ "default": "1",
8938
+ "description": "Outer ring opacity, 0-1 (default 1 = a solid Apple Maps-style white ring; lower for a translucent ring).",
8769
8939
  "attribute": "ring-opacity"
8770
8940
  },
8771
8941
  {
@@ -8811,8 +8981,8 @@
8811
8981
  "type": {
8812
8982
  "text": "number"
8813
8983
  },
8814
- "default": "0.6",
8815
- "description": "Outer ring opacity, 0-1 (Apple Maps-style rings are translucent, not solid white).",
8984
+ "default": "1",
8985
+ "description": "Outer ring opacity, 0-1 (default 1 = a solid Apple Maps-style white ring; lower for a translucent ring).",
8816
8986
  "fieldName": "ringOpacity"
8817
8987
  },
8818
8988
  {
package/dist/index.d.ts CHANGED
@@ -31,6 +31,8 @@ export { StatusPill, type StatusPillColor } from "./status-pill.js";
31
31
  export { EditableText } from "./editable-text.js";
32
32
  export { LiveTimer } from "./live-timer.js";
33
33
  export { LoadMore } from "./load-more.js";
34
+ export { LoadingSpinner } from "./loading-spinner.js";
35
+ export { LoadingDots } from "./loading-dots.js";
34
36
  export { ChatMessage, type ChatMessageRole, type ChatMessageVariant, } from "./chat-message.js";
35
37
  export { UiCheckbox } from "./ui-checkbox.js";
36
38
  export { FormField } from "./form-field.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -31,6 +31,8 @@ export { StatusPill } from "./status-pill.js";
31
31
  export { EditableText } from "./editable-text.js";
32
32
  export { LiveTimer } from "./live-timer.js";
33
33
  export { LoadMore } from "./load-more.js";
34
+ export { LoadingSpinner } from "./loading-spinner.js";
35
+ export { LoadingDots } from "./loading-dots.js";
34
36
  export { ChatMessage, } from "./chat-message.js";
35
37
  export { UiCheckbox } from "./ui-checkbox.js";
36
38
  export { FormField } from "./form-field.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["export { AnimateConfetti } from \"./animate-confetti.js\";\nexport { GalleryItem } from \"./gallery-item.js\";\nexport { GalleryItemVariant } from \"./gallery-item-variant.js\";\nexport {\n PhotoGallery,\n type PhotoGalleryChangeReason,\n type PhotoGalleryObjectFit,\n type PhotoGallerySlideChangeDetail,\n} from \"./photo-gallery.js\";\nexport { RevealButton } from \"./reveal-button.js\";\nexport { RomanNumeral } from \"./roman-numeral.js\";\nexport { ConfirmDialog } from \"./confirm-dialog.js\";\nexport { ContentDivider } from \"./content-divider.js\";\nexport {\n ToastNotification,\n notifySuccess,\n notifyError,\n notifyInfo,\n type ToastVariant,\n} from \"./toast-notification.js\";\nexport { ScrollToBottom } from \"./scroll-to-bottom.js\";\nexport { ScrollToTop } from \"./scroll-to-top.js\";\nexport { SlidePanel } from \"./slide-panel.js\";\nexport { CopyLinkButton } from \"./copy-link-button.js\";\nexport { RelativeTime } from \"./relative-time.js\";\nexport { DistanceValue } from \"./distance-value.js\";\nexport { PriceHistoryChart, type PricePoint } from \"./price-history-chart.js\";\nexport { DistributionChart, type DistributionValue } from \"./distribution-chart.js\";\nexport { PercentBarChart, type PercentBarGroup } from \"./percent-bar-chart.js\";\nexport { WeightBarChart, type WeightBarItem } from \"./weight-bar-chart.js\";\nexport {\n AddressAutocomplete,\n type AddressSuggestion,\n} from \"./address-autocomplete.js\";\nexport {\n AutocompleteInput,\n type AutocompleteOption,\n} from \"./autocomplete-input.js\";\nexport { UserAvatar } from \"./user-avatar.js\";\nexport { MapPin } from \"./map-pin.js\";\nexport { MapCircle } from \"./map-circle.js\";\nexport { RadioCards, type RadioCardOption } from \"./radio-cards.js\";\nexport { RadioPills, type RadioPillOption } from \"./radio-pills.js\";\nexport { ButtonGroup, type ButtonGroupOption } from \"./button-group.js\";\nexport { UiButton, type ButtonVariant } from \"./ui-button.js\";\nexport { StatMeter } from \"./stat-meter.js\";\nexport { StatusPill, type StatusPillColor } from \"./status-pill.js\";\nexport { EditableText } from \"./editable-text.js\";\nexport { LiveTimer } from \"./live-timer.js\";\nexport { LoadMore } from \"./load-more.js\";\nexport {\n ChatMessage,\n type ChatMessageRole,\n type ChatMessageVariant,\n} from \"./chat-message.js\";\nexport { UiCheckbox } from \"./ui-checkbox.js\";\nexport { FormField } from \"./form-field.js\";\nexport { FormSelect, type SelectOption } from \"./form-select.js\";\nexport {\n MultiSelect,\n type MultiSelectOption,\n type MultiSelectVariant,\n} from \"./multi-select.js\";\nexport { DataTable, type DataTableColumn } from \"./data-table.js\";\nexport { TileGrid } from \"./tile-grid.js\";\nexport { TreeView, type TreeNode } from \"./tree-view.js\";\nexport { PopoverPanel } from \"./popover-panel.js\";\nexport { DropdownButton, type DropdownOption } from \"./dropdown-button.js\";\nexport { IconButton } from \"./icon-button.js\";\nexport { KbdHint, type KbdPlatform } from \"./kbd-hint.js\";\nexport { FrameBox } from \"./frame-box.js\";\nexport { AppShell, type SidebarToggleDetail } from \"./app-shell.js\";\nexport { AppSidebar } from \"./app-sidebar.js\";\nexport { ActionBar } from \"./action-bar.js\";\nexport { PageHeader } from \"./page-header.js\";\nexport { PaginationNav, type PageChangeDetail } from \"./pagination-nav.js\";\nexport { FormActions } from \"./form-actions.js\";\nexport { TimelineContainer } from \"./timeline-container.js\";\nexport { TimelineEntry } from \"./timeline-entry.js\";\nexport { CalendarEntry } from \"./calendar-entry.js\";\nexport { CalendarMonth } from \"./calendar-month.js\";\nexport { CalendarYear } from \"./calendar-year.js\";\nexport {\n KanbanBoard,\n type KanbanCardData,\n type KanbanColumnData,\n type KanbanCardMoveDetail,\n type KanbanCardOpenDetail,\n} from \"./kanban-board.js\";\nexport { KanbanColumn } from \"./kanban-column.js\";\nexport { KanbanCard } from \"./kanban-card.js\";\nexport { TextArea } from \"./text-area.js\";\nexport { LinkCard, type LinkCardStatus } from \"./link-card.js\";\nexport { CardGrid } from \"./card-grid.js\";\nexport { MarkdownView } from \"./markdown-view.js\";\nexport { AutoScroll } from \"./auto-scroll.js\";\nexport { formatDuration, type DurationFormat } from \"./utils/duration.js\";\nexport { tokens, tokenValues, darkTokenValues } from \"./tokens.js\";\nexport * from \"./icons.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["export { AnimateConfetti } from \"./animate-confetti.js\";\nexport { GalleryItem } from \"./gallery-item.js\";\nexport { GalleryItemVariant } from \"./gallery-item-variant.js\";\nexport {\n PhotoGallery,\n type PhotoGalleryChangeReason,\n type PhotoGalleryObjectFit,\n type PhotoGallerySlideChangeDetail,\n} from \"./photo-gallery.js\";\nexport { RevealButton } from \"./reveal-button.js\";\nexport { RomanNumeral } from \"./roman-numeral.js\";\nexport { ConfirmDialog } from \"./confirm-dialog.js\";\nexport { ContentDivider } from \"./content-divider.js\";\nexport {\n ToastNotification,\n notifySuccess,\n notifyError,\n notifyInfo,\n type ToastVariant,\n} from \"./toast-notification.js\";\nexport { ScrollToBottom } from \"./scroll-to-bottom.js\";\nexport { ScrollToTop } from \"./scroll-to-top.js\";\nexport { SlidePanel } from \"./slide-panel.js\";\nexport { CopyLinkButton } from \"./copy-link-button.js\";\nexport { RelativeTime } from \"./relative-time.js\";\nexport { DistanceValue } from \"./distance-value.js\";\nexport { PriceHistoryChart, type PricePoint } from \"./price-history-chart.js\";\nexport { DistributionChart, type DistributionValue } from \"./distribution-chart.js\";\nexport { PercentBarChart, type PercentBarGroup } from \"./percent-bar-chart.js\";\nexport { WeightBarChart, type WeightBarItem } from \"./weight-bar-chart.js\";\nexport {\n AddressAutocomplete,\n type AddressSuggestion,\n} from \"./address-autocomplete.js\";\nexport {\n AutocompleteInput,\n type AutocompleteOption,\n} from \"./autocomplete-input.js\";\nexport { UserAvatar } from \"./user-avatar.js\";\nexport { MapPin } from \"./map-pin.js\";\nexport { MapCircle } from \"./map-circle.js\";\nexport { RadioCards, type RadioCardOption } from \"./radio-cards.js\";\nexport { RadioPills, type RadioPillOption } from \"./radio-pills.js\";\nexport { ButtonGroup, type ButtonGroupOption } from \"./button-group.js\";\nexport { UiButton, type ButtonVariant } from \"./ui-button.js\";\nexport { StatMeter } from \"./stat-meter.js\";\nexport { StatusPill, type StatusPillColor } from \"./status-pill.js\";\nexport { EditableText } from \"./editable-text.js\";\nexport { LiveTimer } from \"./live-timer.js\";\nexport { LoadMore } from \"./load-more.js\";\nexport { LoadingSpinner } from \"./loading-spinner.js\";\nexport { LoadingDots } from \"./loading-dots.js\";\nexport {\n ChatMessage,\n type ChatMessageRole,\n type ChatMessageVariant,\n} from \"./chat-message.js\";\nexport { UiCheckbox } from \"./ui-checkbox.js\";\nexport { FormField } from \"./form-field.js\";\nexport { FormSelect, type SelectOption } from \"./form-select.js\";\nexport {\n MultiSelect,\n type MultiSelectOption,\n type MultiSelectVariant,\n} from \"./multi-select.js\";\nexport { DataTable, type DataTableColumn } from \"./data-table.js\";\nexport { TileGrid } from \"./tile-grid.js\";\nexport { TreeView, type TreeNode } from \"./tree-view.js\";\nexport { PopoverPanel } from \"./popover-panel.js\";\nexport { DropdownButton, type DropdownOption } from \"./dropdown-button.js\";\nexport { IconButton } from \"./icon-button.js\";\nexport { KbdHint, type KbdPlatform } from \"./kbd-hint.js\";\nexport { FrameBox } from \"./frame-box.js\";\nexport { AppShell, type SidebarToggleDetail } from \"./app-shell.js\";\nexport { AppSidebar } from \"./app-sidebar.js\";\nexport { ActionBar } from \"./action-bar.js\";\nexport { PageHeader } from \"./page-header.js\";\nexport { PaginationNav, type PageChangeDetail } from \"./pagination-nav.js\";\nexport { FormActions } from \"./form-actions.js\";\nexport { TimelineContainer } from \"./timeline-container.js\";\nexport { TimelineEntry } from \"./timeline-entry.js\";\nexport { CalendarEntry } from \"./calendar-entry.js\";\nexport { CalendarMonth } from \"./calendar-month.js\";\nexport { CalendarYear } from \"./calendar-year.js\";\nexport {\n KanbanBoard,\n type KanbanCardData,\n type KanbanColumnData,\n type KanbanCardMoveDetail,\n type KanbanCardOpenDetail,\n} from \"./kanban-board.js\";\nexport { KanbanColumn } from \"./kanban-column.js\";\nexport { KanbanCard } from \"./kanban-card.js\";\nexport { TextArea } from \"./text-area.js\";\nexport { LinkCard, type LinkCardStatus } from \"./link-card.js\";\nexport { CardGrid } from \"./card-grid.js\";\nexport { MarkdownView } from \"./markdown-view.js\";\nexport { AutoScroll } from \"./auto-scroll.js\";\nexport { formatDuration, type DurationFormat } from \"./utils/duration.js\";\nexport { tokens, tokenValues, darkTokenValues } from \"./tokens.js\";\nexport * from \"./icons.js\";\n"]}
@@ -0,0 +1,28 @@
1
+ import { LitElement, type PropertyValues } from "lit";
2
+ /**
3
+ * Three dots that bounce one after another as a lightweight, indeterminate
4
+ * "working" / "typing" indicator. Purely presentational and property-driven —
5
+ * show it while a short operation is pending and remove it when done.
6
+ *
7
+ * Exposes an accessible `role="status"` with `label` as its name, so assistive
8
+ * technology announces the loading state; the dots themselves are decorative.
9
+ * Under `prefers-reduced-motion` the bounce is removed and the dots rest.
10
+ *
11
+ * @element loading-dots
12
+ */
13
+ export declare class LoadingDots extends LitElement {
14
+ static styles: import("lit").CSSResult[];
15
+ /** Dot-size step — `sm`, `md` (default), or `lg`. */
16
+ size: "sm" | "md" | "lg";
17
+ /** Accessible name announced by the `role="status"` live region. */
18
+ label: string;
19
+ connectedCallback(): void;
20
+ protected updated(changed: PropertyValues): void;
21
+ render(): import("lit-html").TemplateResult<1>;
22
+ }
23
+ declare global {
24
+ interface HTMLElementTagNameMap {
25
+ "loading-dots": LoadingDots;
26
+ }
27
+ }
28
+ //# sourceMappingURL=loading-dots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading-dots.d.ts","sourceRoot":"","sources":["../src/loading-dots.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAIjE;;;;;;;;;;GAUG;AACH,qBACa,WAAY,SAAQ,UAAU;IACzC,OAAgB,MAAM,4BAyDpB;IAEF,qDAAqD;IACzC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAQ;IAC5C,oEAAoE;IACxD,KAAK,SAAa;IAErB,iBAAiB,IAAI,IAAI,CAGjC;IAED,UAAmB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAExD;IAEQ,MAAM,yCAQd;CACF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,cAAc,EAAE,WAAW,CAAC;KAC7B;CACF"}
@@ -0,0 +1,116 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { LitElement, css, html } from "lit";
8
+ import { customElement, property } from "lit/decorators.js";
9
+ import { tokens } from "./tokens.js";
10
+ /**
11
+ * Three dots that bounce one after another as a lightweight, indeterminate
12
+ * "working" / "typing" indicator. Purely presentational and property-driven —
13
+ * show it while a short operation is pending and remove it when done.
14
+ *
15
+ * Exposes an accessible `role="status"` with `label` as its name, so assistive
16
+ * technology announces the loading state; the dots themselves are decorative.
17
+ * Under `prefers-reduced-motion` the bounce is removed and the dots rest.
18
+ *
19
+ * @element loading-dots
20
+ */
21
+ let LoadingDots = class LoadingDots extends LitElement {
22
+ constructor() {
23
+ super(...arguments);
24
+ /** Dot-size step — `sm`, `md` (default), or `lg`. */
25
+ this.size = "md";
26
+ /** Accessible name announced by the `role="status"` live region. */
27
+ this.label = "Loading";
28
+ }
29
+ static { this.styles = [
30
+ tokens,
31
+ css `
32
+ :host {
33
+ display: inline-flex;
34
+ line-height: var(--ui-line-height-glyph, 1);
35
+ }
36
+ .dots {
37
+ display: inline-flex;
38
+ align-items: flex-end;
39
+ gap: 0.25rem;
40
+ }
41
+ .dot {
42
+ width: 0.5rem;
43
+ height: 0.5rem;
44
+ border-radius: 999px;
45
+ background: var(--ui-primary, #4f46e5);
46
+ animation: loading-dots-bounce 1.4s ease-in-out infinite;
47
+ }
48
+ .dot:nth-child(2) {
49
+ animation-delay: 0.16s;
50
+ }
51
+ .dot:nth-child(3) {
52
+ animation-delay: 0.32s;
53
+ }
54
+ .dots.sm .dot {
55
+ width: 0.375rem;
56
+ height: 0.375rem;
57
+ }
58
+ .dots.lg .dot {
59
+ width: 0.625rem;
60
+ height: 0.625rem;
61
+ }
62
+ @keyframes loading-dots-bounce {
63
+ 0%,
64
+ 80%,
65
+ 100% {
66
+ transform: translateY(0);
67
+ opacity: 0.5;
68
+ }
69
+ 40% {
70
+ transform: translateY(-0.375rem);
71
+ opacity: 1;
72
+ }
73
+ }
74
+ @media (prefers-reduced-motion: reduce) {
75
+ .dot {
76
+ animation: none;
77
+ opacity: 1;
78
+ }
79
+ }
80
+ @media (forced-colors: active) {
81
+ .dot {
82
+ background: CanvasText;
83
+ }
84
+ }
85
+ `,
86
+ ]; }
87
+ connectedCallback() {
88
+ super.connectedCallback();
89
+ if (!this.hasAttribute("role"))
90
+ this.setAttribute("role", "status");
91
+ }
92
+ updated(changed) {
93
+ if (changed.has("label"))
94
+ this.setAttribute("aria-label", this.label);
95
+ }
96
+ render() {
97
+ return html `
98
+ <span class="dots ${this.size}" aria-hidden="true">
99
+ <span class="dot"></span>
100
+ <span class="dot"></span>
101
+ <span class="dot"></span>
102
+ </span>
103
+ `;
104
+ }
105
+ };
106
+ __decorate([
107
+ property()
108
+ ], LoadingDots.prototype, "size", void 0);
109
+ __decorate([
110
+ property()
111
+ ], LoadingDots.prototype, "label", void 0);
112
+ LoadingDots = __decorate([
113
+ customElement("loading-dots")
114
+ ], LoadingDots);
115
+ export { LoadingDots };
116
+ //# sourceMappingURL=loading-dots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading-dots.js","sourceRoot":"","sources":["../src/loading-dots.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAuB,MAAM,KAAK,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;;;;;;;;GAUG;AAEI,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,UAAU;IAApC;;QA4DL,qDAAqD;QACzC,SAAI,GAAuB,IAAI,CAAC;QAC5C,oEAAoE;QACxD,UAAK,GAAG,SAAS,CAAC;IAoBhC,CAAC;aAlFiB,WAAM,GAAG;QACvB,MAAM;QACN,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsDF;KACF,AAzDqB,CAyDpB;IAOO,iBAAiB;QACxB,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtE,CAAC;IAEkB,OAAO,CAAC,OAAuB;QAChD,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACxE,CAAC;IAEQ,MAAM;QACb,OAAO,IAAI,CAAA;0BACW,IAAI,CAAC,IAAI;;;;;KAK9B,CAAC;IACJ,CAAC;CACF,CAAA;AAtBa;IAAX,QAAQ,EAAE;yCAAiC;AAEhC;IAAX,QAAQ,EAAE;0CAAmB;AA/DnB,WAAW;IADvB,aAAa,CAAC,cAAc,CAAC;GACjB,WAAW,CAmFvB","sourcesContent":["import { LitElement, css, html, type PropertyValues } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { tokens } from \"./tokens.js\";\n\n/**\n * Three dots that bounce one after another as a lightweight, indeterminate\n * \"working\" / \"typing\" indicator. Purely presentational and property-driven —\n * show it while a short operation is pending and remove it when done.\n *\n * Exposes an accessible `role=\"status\"` with `label` as its name, so assistive\n * technology announces the loading state; the dots themselves are decorative.\n * Under `prefers-reduced-motion` the bounce is removed and the dots rest.\n *\n * @element loading-dots\n */\n@customElement(\"loading-dots\")\nexport class LoadingDots extends LitElement {\n static override styles = [\n tokens,\n css`\n :host {\n display: inline-flex;\n line-height: var(--ui-line-height-glyph, 1);\n }\n .dots {\n display: inline-flex;\n align-items: flex-end;\n gap: 0.25rem;\n }\n .dot {\n width: 0.5rem;\n height: 0.5rem;\n border-radius: 999px;\n background: var(--ui-primary, #4f46e5);\n animation: loading-dots-bounce 1.4s ease-in-out infinite;\n }\n .dot:nth-child(2) {\n animation-delay: 0.16s;\n }\n .dot:nth-child(3) {\n animation-delay: 0.32s;\n }\n .dots.sm .dot {\n width: 0.375rem;\n height: 0.375rem;\n }\n .dots.lg .dot {\n width: 0.625rem;\n height: 0.625rem;\n }\n @keyframes loading-dots-bounce {\n 0%,\n 80%,\n 100% {\n transform: translateY(0);\n opacity: 0.5;\n }\n 40% {\n transform: translateY(-0.375rem);\n opacity: 1;\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .dot {\n animation: none;\n opacity: 1;\n }\n }\n @media (forced-colors: active) {\n .dot {\n background: CanvasText;\n }\n }\n `,\n ];\n\n /** Dot-size step — `sm`, `md` (default), or `lg`. */\n @property() size: \"sm\" | \"md\" | \"lg\" = \"md\";\n /** Accessible name announced by the `role=\"status\"` live region. */\n @property() label = \"Loading\";\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute(\"role\")) this.setAttribute(\"role\", \"status\");\n }\n\n protected override updated(changed: PropertyValues): void {\n if (changed.has(\"label\")) this.setAttribute(\"aria-label\", this.label);\n }\n\n override render() {\n return html`\n <span class=\"dots ${this.size}\" aria-hidden=\"true\">\n <span class=\"dot\"></span>\n <span class=\"dot\"></span>\n <span class=\"dot\"></span>\n </span>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"loading-dots\": LoadingDots;\n }\n}\n"]}
@@ -0,0 +1,28 @@
1
+ import { LitElement, type PropertyValues } from "lit";
2
+ /**
3
+ * Indeterminate circular loading spinner: a rotating arc over a faint track,
4
+ * in the style of a browser page-load indicator. Purely presentational and
5
+ * property-driven — show it while work is in flight and remove it when done.
6
+ *
7
+ * Exposes an accessible `role="status"` with `label` as its name, so assistive
8
+ * technology announces the loading state; the arc itself is decorative. Under
9
+ * `prefers-reduced-motion` it stops rotating and stays a static ring.
10
+ *
11
+ * @element loading-spinner
12
+ */
13
+ export declare class LoadingSpinner extends LitElement {
14
+ static styles: import("lit").CSSResult[];
15
+ /** Diameter step — `sm` ≈ 1rem, `md` ≈ 1.5rem (default), `lg` ≈ 2rem. */
16
+ size: "sm" | "md" | "lg";
17
+ /** Accessible name announced by the `role="status"` live region. */
18
+ label: string;
19
+ connectedCallback(): void;
20
+ protected updated(changed: PropertyValues): void;
21
+ render(): import("lit-html").TemplateResult<1>;
22
+ }
23
+ declare global {
24
+ interface HTMLElementTagNameMap {
25
+ "loading-spinner": LoadingSpinner;
26
+ }
27
+ }
28
+ //# sourceMappingURL=loading-spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading-spinner.d.ts","sourceRoot":"","sources":["../src/loading-spinner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAIjE;;;;;;;;;;GAUG;AACH,qBACa,cAAe,SAAQ,UAAU;IAC5C,OAAgB,MAAM,4BAmDpB;IAEF,yEAAyE;IAC7D,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAQ;IAC5C,oEAAoE;IACxD,KAAK,SAAa;IAErB,iBAAiB,IAAI,IAAI,CAGjC;IAED,UAAmB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAExD;IAEQ,MAAM,yCAOd;CACF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iBAAiB,EAAE,cAAc,CAAC;KACnC;CACF"}
@@ -0,0 +1,109 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { LitElement, css, html } from "lit";
8
+ import { customElement, property } from "lit/decorators.js";
9
+ import { tokens } from "./tokens.js";
10
+ /**
11
+ * Indeterminate circular loading spinner: a rotating arc over a faint track,
12
+ * in the style of a browser page-load indicator. Purely presentational and
13
+ * property-driven — show it while work is in flight and remove it when done.
14
+ *
15
+ * Exposes an accessible `role="status"` with `label` as its name, so assistive
16
+ * technology announces the loading state; the arc itself is decorative. Under
17
+ * `prefers-reduced-motion` it stops rotating and stays a static ring.
18
+ *
19
+ * @element loading-spinner
20
+ */
21
+ let LoadingSpinner = class LoadingSpinner extends LitElement {
22
+ constructor() {
23
+ super(...arguments);
24
+ /** Diameter step — `sm` ≈ 1rem, `md` ≈ 1.5rem (default), `lg` ≈ 2rem. */
25
+ this.size = "md";
26
+ /** Accessible name announced by the `role="status"` live region. */
27
+ this.label = "Loading";
28
+ }
29
+ static { this.styles = [
30
+ tokens,
31
+ css `
32
+ :host {
33
+ display: inline-flex;
34
+ line-height: var(--ui-line-height-glyph, 1);
35
+ }
36
+ .spinner {
37
+ width: 1.5rem;
38
+ height: 1.5rem;
39
+ animation: spin 0.8s linear infinite;
40
+ }
41
+ .spinner.sm {
42
+ width: 1rem;
43
+ height: 1rem;
44
+ }
45
+ .spinner.lg {
46
+ width: 2rem;
47
+ height: 2rem;
48
+ }
49
+ .track {
50
+ fill: none;
51
+ stroke: var(--ui-border, #e2e8f0);
52
+ stroke-width: 3;
53
+ }
54
+ .arc {
55
+ fill: none;
56
+ stroke: var(--ui-primary, #4f46e5);
57
+ stroke-width: 3;
58
+ stroke-linecap: round;
59
+ stroke-dasharray: 42 100;
60
+ }
61
+ @keyframes spin {
62
+ to {
63
+ transform: rotate(360deg);
64
+ }
65
+ }
66
+ @media (prefers-reduced-motion: reduce) {
67
+ .spinner {
68
+ animation: none;
69
+ }
70
+ }
71
+ @media (forced-colors: active) {
72
+ .track {
73
+ stroke: GrayText;
74
+ }
75
+ .arc {
76
+ stroke: CanvasText;
77
+ }
78
+ }
79
+ `,
80
+ ]; }
81
+ connectedCallback() {
82
+ super.connectedCallback();
83
+ if (!this.hasAttribute("role"))
84
+ this.setAttribute("role", "status");
85
+ }
86
+ updated(changed) {
87
+ if (changed.has("label"))
88
+ this.setAttribute("aria-label", this.label);
89
+ }
90
+ render() {
91
+ return html `
92
+ <svg class="spinner ${this.size}" viewBox="0 0 24 24" aria-hidden="true">
93
+ <circle class="track" cx="12" cy="12" r="9"></circle>
94
+ <circle class="arc" cx="12" cy="12" r="9"></circle>
95
+ </svg>
96
+ `;
97
+ }
98
+ };
99
+ __decorate([
100
+ property()
101
+ ], LoadingSpinner.prototype, "size", void 0);
102
+ __decorate([
103
+ property()
104
+ ], LoadingSpinner.prototype, "label", void 0);
105
+ LoadingSpinner = __decorate([
106
+ customElement("loading-spinner")
107
+ ], LoadingSpinner);
108
+ export { LoadingSpinner };
109
+ //# sourceMappingURL=loading-spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading-spinner.js","sourceRoot":"","sources":["../src/loading-spinner.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAuB,MAAM,KAAK,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;;;;;;;;GAUG;AAEI,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,UAAU;IAAvC;;QAsDL,yEAAyE;QAC7D,SAAI,GAAuB,IAAI,CAAC;QAC5C,oEAAoE;QACxD,UAAK,GAAG,SAAS,CAAC;IAmBhC,CAAC;aA3EiB,WAAM,GAAG;QACvB,MAAM;QACN,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAgDF;KACF,AAnDqB,CAmDpB;IAOO,iBAAiB;QACxB,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtE,CAAC;IAEkB,OAAO,CAAC,OAAuB;QAChD,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACxE,CAAC;IAEQ,MAAM;QACb,OAAO,IAAI,CAAA;4BACa,IAAI,CAAC,IAAI;;;;KAIhC,CAAC;IACJ,CAAC;CACF,CAAA;AArBa;IAAX,QAAQ,EAAE;4CAAiC;AAEhC;IAAX,QAAQ,EAAE;6CAAmB;AAzDnB,cAAc;IAD1B,aAAa,CAAC,iBAAiB,CAAC;GACpB,cAAc,CA4E1B","sourcesContent":["import { LitElement, css, html, type PropertyValues } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { tokens } from \"./tokens.js\";\n\n/**\n * Indeterminate circular loading spinner: a rotating arc over a faint track,\n * in the style of a browser page-load indicator. Purely presentational and\n * property-driven — show it while work is in flight and remove it when done.\n *\n * Exposes an accessible `role=\"status\"` with `label` as its name, so assistive\n * technology announces the loading state; the arc itself is decorative. Under\n * `prefers-reduced-motion` it stops rotating and stays a static ring.\n *\n * @element loading-spinner\n */\n@customElement(\"loading-spinner\")\nexport class LoadingSpinner extends LitElement {\n static override styles = [\n tokens,\n css`\n :host {\n display: inline-flex;\n line-height: var(--ui-line-height-glyph, 1);\n }\n .spinner {\n width: 1.5rem;\n height: 1.5rem;\n animation: spin 0.8s linear infinite;\n }\n .spinner.sm {\n width: 1rem;\n height: 1rem;\n }\n .spinner.lg {\n width: 2rem;\n height: 2rem;\n }\n .track {\n fill: none;\n stroke: var(--ui-border, #e2e8f0);\n stroke-width: 3;\n }\n .arc {\n fill: none;\n stroke: var(--ui-primary, #4f46e5);\n stroke-width: 3;\n stroke-linecap: round;\n stroke-dasharray: 42 100;\n }\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .spinner {\n animation: none;\n }\n }\n @media (forced-colors: active) {\n .track {\n stroke: GrayText;\n }\n .arc {\n stroke: CanvasText;\n }\n }\n `,\n ];\n\n /** Diameter step — `sm` ≈ 1rem, `md` ≈ 1.5rem (default), `lg` ≈ 2rem. */\n @property() size: \"sm\" | \"md\" | \"lg\" = \"md\";\n /** Accessible name announced by the `role=\"status\"` live region. */\n @property() label = \"Loading\";\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute(\"role\")) this.setAttribute(\"role\", \"status\");\n }\n\n protected override updated(changed: PropertyValues): void {\n if (changed.has(\"label\")) this.setAttribute(\"aria-label\", this.label);\n }\n\n override render() {\n return html`\n <svg class=\"spinner ${this.size}\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <circle class=\"track\" cx=\"12\" cy=\"12\" r=\"9\"></circle>\n <circle class=\"arc\" cx=\"12\" cy=\"12\" r=\"9\"></circle>\n </svg>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"loading-spinner\": LoadingSpinner;\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { LitElement } from "lit";
2
2
  /**
3
3
  * A plain circular map marker: a radial-gradient fill with a soft highlight
4
- * and a translucent white outer ring, no point/tail (unlike `<map-pin>`) —
4
+ * and a solid white outer ring, no point/tail (unlike `<map-pin>`) —
5
5
  * for markers that don't need to visually "point" at their exact
6
6
  * coordinate. Purely a visual primitive — it has no `mapbox-gl` (or any
7
7
  * mapping library) dependency; the consumer positions it, e.g. via
@@ -22,7 +22,7 @@ export declare class MapCircle extends LitElement {
22
22
  size: number;
23
23
  /** White outer ring thickness, in the same viewBox units as `size` (scales with it). */
24
24
  ringWidth: number;
25
- /** Outer ring opacity, 0-1 (Apple Maps-style rings are translucent, not solid white). */
25
+ /** Outer ring opacity, 0-1 (default 1 = a solid Apple Maps-style white ring; lower for a translucent ring). */
26
26
  ringOpacity: number;
27
27
  /** Scales and glows the circle — a generic emphasis state (e.g. hover, selection). */
28
28
  highlighted: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"map-circle.d.ts","sourceRoot":"","sources":["../src/map-circle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAO5C;;;;;;;;;;;;;;GAcG;AACH,qBACa,SAAU,SAAQ,UAAU;IACvC,OAAgB,MAAM,4BA6CpB;IAEF,gGAAgG;IACpF,KAAK,SAAa;IAC9B,+BAA+B;IACH,IAAI,SAAM;IACtC,wFAAwF;IACnC,SAAS,SAAK;IACnE,yFAAyF;IAClC,WAAW,SAAO;IACzE,sFAAsF;IAC1C,WAAW,UAAS;IAEhE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4C;IAE3D,MAAM,yCA+Bd;CACF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,YAAY,EAAE,SAAS,CAAC;KACzB;CACF"}
1
+ {"version":3,"file":"map-circle.d.ts","sourceRoot":"","sources":["../src/map-circle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAO5C;;;;;;;;;;;;;;GAcG;AACH,qBACa,SAAU,SAAQ,UAAU;IACvC,OAAgB,MAAM,4BA6CpB;IAEF,gGAAgG;IACpF,KAAK,SAAa;IAC9B,+BAA+B;IACH,IAAI,SAAM;IACtC,wFAAwF;IACnC,SAAS,SAAK;IACnE,+GAA+G;IACxD,WAAW,SAAK;IACvE,sFAAsF;IAC1C,WAAW,UAAS;IAEhE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4C;IAE3D,MAAM,yCA8Cd;CACF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,YAAY,EAAE,SAAS,CAAC;KACzB;CACF"}
@@ -11,7 +11,7 @@ import { mixHex } from "./utils/color.js";
11
11
  let gradientIdCounter = 0;
12
12
  /**
13
13
  * A plain circular map marker: a radial-gradient fill with a soft highlight
14
- * and a translucent white outer ring, no point/tail (unlike `<map-pin>`) —
14
+ * and a solid white outer ring, no point/tail (unlike `<map-pin>`) —
15
15
  * for markers that don't need to visually "point" at their exact
16
16
  * coordinate. Purely a visual primitive — it has no `mapbox-gl` (or any
17
17
  * mapping library) dependency; the consumer positions it, e.g. via
@@ -32,9 +32,9 @@ let MapCircle = class MapCircle extends LitElement {
32
32
  /** Diameter, in CSS pixels. */
33
33
  this.size = 18;
34
34
  /** White outer ring thickness, in the same viewBox units as `size` (scales with it). */
35
- this.ringWidth = 4;
36
- /** Outer ring opacity, 0-1 (Apple Maps-style rings are translucent, not solid white). */
37
- this.ringOpacity = 0.6;
35
+ this.ringWidth = 2;
36
+ /** Outer ring opacity, 0-1 (default 1 = a solid Apple Maps-style white ring; lower for a translucent ring). */
37
+ this.ringOpacity = 1;
38
38
  /** Scales and glows the circle — a generic emphasis state (e.g. hover, selection). */
39
39
  this.highlighted = false;
40
40
  this._gradId = `map-circle-grad-${gradientIdCounter++}`;
@@ -88,6 +88,13 @@ let MapCircle = class MapCircle extends LitElement {
88
88
  render() {
89
89
  const light = mixHex(this.color, "#ffffff", 30);
90
90
  const dark = mixHex(this.color, "#000000", 30);
91
+ // A fixed outer radius keeps the marker footprint constant as `ring-width`
92
+ // varies; the ring sits entirely outside the fill (the fill meets the
93
+ // ring's inner edge) so the stroke never straddles the fill edge — which
94
+ // is what used to read as two rings.
95
+ const outerR = 15;
96
+ const fillR = outerR - this.ringWidth;
97
+ const ringR = outerR - this.ringWidth / 2;
91
98
  return html `
92
99
  <svg
93
100
  aria-hidden="true"
@@ -104,10 +111,18 @@ let MapCircle = class MapCircle extends LitElement {
104
111
  </radialGradient>
105
112
  </defs>
106
113
  <circle
114
+ class="fill"
107
115
  cx="16"
108
116
  cy="16"
109
- r="13"
117
+ r=${fillR}
110
118
  fill="url(#${this._gradId})"
119
+ />
120
+ <circle
121
+ class="ring"
122
+ cx="16"
123
+ cy="16"
124
+ r=${ringR}
125
+ fill="none"
111
126
  stroke="rgb(255 255 255 / ${this.ringOpacity})"
112
127
  stroke-width=${this.ringWidth}
113
128
  />
@@ -1 +1 @@
1
- {"version":3,"file":"map-circle.js","sourceRoot":"","sources":["../src/map-circle.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,IAAI,iBAAiB,GAAG,CAAC,CAAC;AAE1B;;;;;;;;;;;;;;GAcG;AAEI,IAAM,SAAS,GAAf,MAAM,SAAU,SAAQ,UAAU;IAAlC;;QAgDL,gGAAgG;QACpF,UAAK,GAAG,SAAS,CAAC;QAC9B,+BAA+B;QACH,SAAI,GAAG,EAAE,CAAC;QACtC,wFAAwF;QACnC,cAAS,GAAG,CAAC,CAAC;QACnE,yFAAyF;QAClC,gBAAW,GAAG,GAAG,CAAC;QACzE,sFAAsF;QAC1C,gBAAW,GAAG,KAAK,CAAC;QAE/C,YAAO,GAAG,mBAAmB,iBAAiB,EAAE,EAAE,CAAC;IAkCtE,CAAC;aA5FiB,WAAM,GAAG;QACvB,MAAM;QACN,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA0CF;KACF,AA7CqB,CA6CpB;IAeO,MAAM;QACb,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAA;;;gBAGC,IAAI,CAAC,IAAI;iBACR,IAAI,CAAC,IAAI;;;;;;+BAMK,IAAI,CAAC,OAAO;2CACA,KAAK;6CACH,IAAI;;;;;;;uBAO1B,IAAI,CAAC,OAAO;sCACG,IAAI,CAAC,WAAW;yBAC7B,IAAI,CAAC,SAAS;;;8CAGO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;;;KAGpE,CAAC;IACJ,CAAC;CACF,CAAA;AA5Ca;IAAX,QAAQ,EAAE;wCAAmB;AAEF;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uCAAW;AAEe;IAApD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;4CAAe;AAEZ;IAAtD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;8CAAmB;AAE7B;IAA3C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;8CAAqB;AAzDrD,SAAS;IADrB,aAAa,CAAC,YAAY,CAAC;GACf,SAAS,CA6FrB","sourcesContent":["import { LitElement, css, html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { tokens } from \"./tokens.js\";\nimport { mixHex } from \"./utils/color.js\";\n\nlet gradientIdCounter = 0;\n\n/**\n * A plain circular map marker: a radial-gradient fill with a soft highlight\n * and a translucent white outer ring, no point/tail (unlike `<map-pin>`) —\n * for markers that don't need to visually \"point\" at their exact\n * coordinate. Purely a visual primitive — it has no `mapbox-gl` (or any\n * mapping library) dependency; the consumer positions it, e.g. via\n * `new mapboxgl.Marker({ element: el })`. It can also replace the former\n * `<map-point>` dense-layer primitive: use `size=\"14\" ring-width=\"3\"`, leave\n * the slot empty, and rasterize one marker per color for use as a map\n * `icon-image`.\n *\n * @element map-circle\n * @slot - Optional badge content shown centered on the circle — a rank\n * number, an emoji, a small icon.\n */\n@customElement(\"map-circle\")\nexport class MapCircle extends LitElement {\n static override styles = [\n tokens,\n css`\n :host {\n display: inline-block;\n position: relative;\n line-height: 0;\n }\n svg {\n display: block;\n filter: drop-shadow(0 1px 2px rgb(0 0 0 / 0.25));\n transition: transform 120ms ease, filter 120ms ease;\n }\n :host([highlighted]) svg {\n transform: scale(1.12);\n filter: brightness(1.08) drop-shadow(0 0 5px rgb(0 0 0 / 0.35));\n }\n .content {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: #fff;\n font-family: var(\n --ui-font,\n ui-sans-serif,\n system-ui,\n sans-serif,\n \"Apple Color Emoji\",\n \"Segoe UI Emoji\",\n \"Segoe UI Symbol\",\n \"Noto Color Emoji\"\n );\n font-weight: var(--ui-font-weight-bold, 700);\n line-height: var(--ui-line-height-glyph, 1);\n text-shadow: 0 1px 2px rgb(0 0 0 / 0.35);\n pointer-events: none;\n white-space: nowrap;\n }\n @media (prefers-reduced-motion: reduce) {\n svg {\n transition: none;\n }\n }\n `,\n ];\n\n /** Fill color; the gradient's light (highlight) and dark (edge) stops are derived from this. */\n @property() color = \"#4f46e5\";\n /** Diameter, in CSS pixels. */\n @property({ type: Number }) size = 18;\n /** White outer ring thickness, in the same viewBox units as `size` (scales with it). */\n @property({ type: Number, attribute: \"ring-width\" }) ringWidth = 4;\n /** Outer ring opacity, 0-1 (Apple Maps-style rings are translucent, not solid white). */\n @property({ type: Number, attribute: \"ring-opacity\" }) ringOpacity = 0.6;\n /** Scales and glows the circle — a generic emphasis state (e.g. hover, selection). */\n @property({ type: Boolean, reflect: true }) highlighted = false;\n\n private readonly _gradId = `map-circle-grad-${gradientIdCounter++}`;\n\n override render() {\n const light = mixHex(this.color, \"#ffffff\", 30);\n const dark = mixHex(this.color, \"#000000\", 30);\n return html`\n <svg\n aria-hidden=\"true\"\n width=${this.size}\n height=${this.size}\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <defs>\n <radialGradient id=${this._gradId} cx=\"35%\" cy=\"30%\" r=\"75%\">\n <stop offset=\"0%\" stop-color=${light} />\n <stop offset=\"100%\" stop-color=${dark} />\n </radialGradient>\n </defs>\n <circle\n cx=\"16\"\n cy=\"16\"\n r=\"13\"\n fill=\"url(#${this._gradId})\"\n stroke=\"rgb(255 255 255 / ${this.ringOpacity})\"\n stroke-width=${this.ringWidth}\n />\n </svg>\n <div class=\"content\" style=\"font-size:${Math.round(this.size * 0.4)}px\">\n <slot></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"map-circle\": MapCircle;\n }\n}\n"]}
1
+ {"version":3,"file":"map-circle.js","sourceRoot":"","sources":["../src/map-circle.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,IAAI,iBAAiB,GAAG,CAAC,CAAC;AAE1B;;;;;;;;;;;;;;GAcG;AAEI,IAAM,SAAS,GAAf,MAAM,SAAU,SAAQ,UAAU;IAAlC;;QAgDL,gGAAgG;QACpF,UAAK,GAAG,SAAS,CAAC;QAC9B,+BAA+B;QACH,SAAI,GAAG,EAAE,CAAC;QACtC,wFAAwF;QACnC,cAAS,GAAG,CAAC,CAAC;QACnE,+GAA+G;QACxD,gBAAW,GAAG,CAAC,CAAC;QACvE,sFAAsF;QAC1C,gBAAW,GAAG,KAAK,CAAC;QAE/C,YAAO,GAAG,mBAAmB,iBAAiB,EAAE,EAAE,CAAC;IAiDtE,CAAC;aA3GiB,WAAM,GAAG;QACvB,MAAM;QACN,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA0CF;KACF,AA7CqB,CA6CpB;IAeO,MAAM;QACb,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/C,2EAA2E;QAC3E,sEAAsE;QACtE,yEAAyE;QACzE,qCAAqC;QACrC,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAA;;;gBAGC,IAAI,CAAC,IAAI;iBACR,IAAI,CAAC,IAAI;;;;;;+BAMK,IAAI,CAAC,OAAO;2CACA,KAAK;6CACH,IAAI;;;;;;;cAOnC,KAAK;uBACI,IAAI,CAAC,OAAO;;;;;;cAMrB,KAAK;;sCAEmB,IAAI,CAAC,WAAW;yBAC7B,IAAI,CAAC,SAAS;;;8CAGO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;;;KAGpE,CAAC;IACJ,CAAC;CACF,CAAA;AA3Da;IAAX,QAAQ,EAAE;wCAAmB;AAEF;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uCAAW;AAEe;IAApD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;4CAAe;AAEZ;IAAtD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;8CAAiB;AAE3B;IAA3C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;8CAAqB;AAzDrD,SAAS;IADrB,aAAa,CAAC,YAAY,CAAC;GACf,SAAS,CA4GrB","sourcesContent":["import { LitElement, css, html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { tokens } from \"./tokens.js\";\nimport { mixHex } from \"./utils/color.js\";\n\nlet gradientIdCounter = 0;\n\n/**\n * A plain circular map marker: a radial-gradient fill with a soft highlight\n * and a solid white outer ring, no point/tail (unlike `<map-pin>`) —\n * for markers that don't need to visually \"point\" at their exact\n * coordinate. Purely a visual primitive — it has no `mapbox-gl` (or any\n * mapping library) dependency; the consumer positions it, e.g. via\n * `new mapboxgl.Marker({ element: el })`. It can also replace the former\n * `<map-point>` dense-layer primitive: use `size=\"14\" ring-width=\"3\"`, leave\n * the slot empty, and rasterize one marker per color for use as a map\n * `icon-image`.\n *\n * @element map-circle\n * @slot - Optional badge content shown centered on the circle — a rank\n * number, an emoji, a small icon.\n */\n@customElement(\"map-circle\")\nexport class MapCircle extends LitElement {\n static override styles = [\n tokens,\n css`\n :host {\n display: inline-block;\n position: relative;\n line-height: 0;\n }\n svg {\n display: block;\n filter: drop-shadow(0 1px 2px rgb(0 0 0 / 0.25));\n transition: transform 120ms ease, filter 120ms ease;\n }\n :host([highlighted]) svg {\n transform: scale(1.12);\n filter: brightness(1.08) drop-shadow(0 0 5px rgb(0 0 0 / 0.35));\n }\n .content {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: #fff;\n font-family: var(\n --ui-font,\n ui-sans-serif,\n system-ui,\n sans-serif,\n \"Apple Color Emoji\",\n \"Segoe UI Emoji\",\n \"Segoe UI Symbol\",\n \"Noto Color Emoji\"\n );\n font-weight: var(--ui-font-weight-bold, 700);\n line-height: var(--ui-line-height-glyph, 1);\n text-shadow: 0 1px 2px rgb(0 0 0 / 0.35);\n pointer-events: none;\n white-space: nowrap;\n }\n @media (prefers-reduced-motion: reduce) {\n svg {\n transition: none;\n }\n }\n `,\n ];\n\n /** Fill color; the gradient's light (highlight) and dark (edge) stops are derived from this. */\n @property() color = \"#4f46e5\";\n /** Diameter, in CSS pixels. */\n @property({ type: Number }) size = 18;\n /** White outer ring thickness, in the same viewBox units as `size` (scales with it). */\n @property({ type: Number, attribute: \"ring-width\" }) ringWidth = 2;\n /** Outer ring opacity, 0-1 (default 1 = a solid Apple Maps-style white ring; lower for a translucent ring). */\n @property({ type: Number, attribute: \"ring-opacity\" }) ringOpacity = 1;\n /** Scales and glows the circle — a generic emphasis state (e.g. hover, selection). */\n @property({ type: Boolean, reflect: true }) highlighted = false;\n\n private readonly _gradId = `map-circle-grad-${gradientIdCounter++}`;\n\n override render() {\n const light = mixHex(this.color, \"#ffffff\", 30);\n const dark = mixHex(this.color, \"#000000\", 30);\n // A fixed outer radius keeps the marker footprint constant as `ring-width`\n // varies; the ring sits entirely outside the fill (the fill meets the\n // ring's inner edge) so the stroke never straddles the fill edge — which\n // is what used to read as two rings.\n const outerR = 15;\n const fillR = outerR - this.ringWidth;\n const ringR = outerR - this.ringWidth / 2;\n return html`\n <svg\n aria-hidden=\"true\"\n width=${this.size}\n height=${this.size}\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <defs>\n <radialGradient id=${this._gradId} cx=\"35%\" cy=\"30%\" r=\"75%\">\n <stop offset=\"0%\" stop-color=${light} />\n <stop offset=\"100%\" stop-color=${dark} />\n </radialGradient>\n </defs>\n <circle\n class=\"fill\"\n cx=\"16\"\n cy=\"16\"\n r=${fillR}\n fill=\"url(#${this._gradId})\"\n />\n <circle\n class=\"ring\"\n cx=\"16\"\n cy=\"16\"\n r=${ringR}\n fill=\"none\"\n stroke=\"rgb(255 255 255 / ${this.ringOpacity})\"\n stroke-width=${this.ringWidth}\n />\n </svg>\n <div class=\"content\" style=\"font-size:${Math.round(this.size * 0.4)}px\">\n <slot></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"map-circle\": MapCircle;\n }\n}\n"]}
package/dist/map-pin.d.ts CHANGED
@@ -15,7 +15,7 @@ export declare class MapPin extends LitElement {
15
15
  color: string;
16
16
  /** Diameter of the circular head, in CSS pixels. */
17
17
  size: number;
18
- /** Outer ring opacity, 0-1 (Apple Maps-style rings are translucent, not solid white). */
18
+ /** Outer ring opacity, 0-1 (default 1 = a solid Apple Maps-style white ring; lower for a translucent ring). */
19
19
  ringOpacity: number;
20
20
  /** Scales and glows the pin — a generic emphasis state (e.g. hover, selection). */
21
21
  highlighted: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"map-pin.d.ts","sourceRoot":"","sources":["../src/map-pin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAO5C;;;;;;;;;GASG;AACH,qBACa,MAAO,SAAQ,UAAU;IACpC,OAAgB,MAAM,4BAgDpB;IAEF,gGAAgG;IACpF,KAAK,SAAa;IAC9B,oDAAoD;IACxB,IAAI,SAAM;IACtC,yFAAyF;IAClC,WAAW,SAAO;IACzE,mFAAmF;IACvC,WAAW,UAAS;IAEhE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IAExD,MAAM,yCA8Bd;CACF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,SAAS,EAAE,MAAM,CAAC;KACnB;CACF"}
1
+ {"version":3,"file":"map-pin.d.ts","sourceRoot":"","sources":["../src/map-pin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAO5C;;;;;;;;;GASG;AACH,qBACa,MAAO,SAAQ,UAAU;IACpC,OAAgB,MAAM,4BAgDpB;IAEF,gGAAgG;IACpF,KAAK,SAAa;IAC9B,oDAAoD;IACxB,IAAI,SAAM;IACtC,+GAA+G;IACxD,WAAW,SAAK;IACvE,mFAAmF;IACvC,WAAW,UAAS;IAEhE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IAExD,MAAM,yCA4Cd;CACF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,SAAS,EAAE,MAAM,CAAC;KACnB;CACF"}
package/dist/map-pin.js CHANGED
@@ -26,8 +26,8 @@ let MapPin = class MapPin extends LitElement {
26
26
  this.color = "#4f46e5";
27
27
  /** Diameter of the circular head, in CSS pixels. */
28
28
  this.size = 32;
29
- /** Outer ring opacity, 0-1 (Apple Maps-style rings are translucent, not solid white). */
30
- this.ringOpacity = 0.6;
29
+ /** Outer ring opacity, 0-1 (default 1 = a solid Apple Maps-style white ring; lower for a translucent ring). */
30
+ this.ringOpacity = 1;
31
31
  /** Scales and glows the pin — a generic emphasis state (e.g. hover, selection). */
32
32
  this.highlighted = false;
33
33
  this._gradId = `map-pin-grad-${gradientIdCounter++}`;
@@ -85,6 +85,13 @@ let MapPin = class MapPin extends LitElement {
85
85
  const light = mixHex(this.color, "#ffffff", 30);
86
86
  const dark = mixHex(this.color, "#000000", 30);
87
87
  const height = Math.round(this.size * (34 / 32));
88
+ const shape = "M16 30 C10 24 4 19.5 4 13 A12 12 0 1 1 28 13 C28 19.5 22 24 16 30 Z";
89
+ const ringWidth = 2;
90
+ // Inset the fill so its head edge meets the ring's inner edge instead of the
91
+ // ring straddling the fill (which reads as two rings): the head arc has
92
+ // radius 12, so scale the fill to (12 - ringWidth / 2) / 12 about the head
93
+ // center (16, 13). The ring is the same outline drawn behind, stroke only.
94
+ const fillScale = (12 - ringWidth / 2) / 12;
88
95
  return html `
89
96
  <svg
90
97
  aria-hidden="true"
@@ -101,10 +108,17 @@ let MapPin = class MapPin extends LitElement {
101
108
  </radialGradient>
102
109
  </defs>
103
110
  <path
104
- d="M16 30 C10 24 4 19.5 4 13 A12 12 0 1 1 28 13 C28 19.5 22 24 16 30 Z"
105
- fill="url(#${this._gradId})"
111
+ class="ring"
112
+ d=${shape}
113
+ fill="none"
106
114
  stroke="rgb(255 255 255 / ${this.ringOpacity})"
107
- stroke-width="1.5"
115
+ stroke-width=${ringWidth}
116
+ />
117
+ <path
118
+ class="fill"
119
+ d=${shape}
120
+ fill="url(#${this._gradId})"
121
+ transform="translate(16 13) scale(${fillScale}) translate(-16 -13)"
108
122
  />
109
123
  </svg>
110
124
  <div class="content" style="font-size:${Math.round(this.size * 0.4)}px">
@@ -1 +1 @@
1
- {"version":3,"file":"map-pin.js","sourceRoot":"","sources":["../src/map-pin.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,IAAI,iBAAiB,GAAG,CAAC,CAAC;AAE1B;;;;;;;;;GASG;AAEI,IAAM,MAAM,GAAZ,MAAM,MAAO,SAAQ,UAAU;IAA/B;;QAmDL,gGAAgG;QACpF,UAAK,GAAG,SAAS,CAAC;QAC9B,oDAAoD;QACxB,SAAI,GAAG,EAAE,CAAC;QACtC,yFAAyF;QAClC,gBAAW,GAAG,GAAG,CAAC;QACzE,mFAAmF;QACvC,gBAAW,GAAG,KAAK,CAAC;QAE/C,YAAO,GAAG,gBAAgB,iBAAiB,EAAE,EAAE,CAAC;IAiCnE,CAAC;aA5FiB,WAAM,GAAG;QACvB,MAAM;QACN,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA6CF;KACF,AAhDqB,CAgDpB;IAaO,MAAM;QACb,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACjD,OAAO,IAAI,CAAA;;;gBAGC,IAAI,CAAC,IAAI;iBACR,MAAM;;;;;;+BAMQ,IAAI,CAAC,OAAO;2CACA,KAAK;6CACH,IAAI;;;;;uBAK1B,IAAI,CAAC,OAAO;sCACG,IAAI,CAAC,WAAW;;;;8CAIR,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;;;KAGpE,CAAC;IACJ,CAAC;CACF,CAAA;AAzCa;IAAX,QAAQ,EAAE;qCAAmB;AAEF;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oCAAW;AAEiB;IAAtD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;2CAAmB;AAE7B;IAA3C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;2CAAqB;AA1DrD,MAAM;IADlB,aAAa,CAAC,SAAS,CAAC;GACZ,MAAM,CA6FlB","sourcesContent":["import { LitElement, css, html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { tokens } from \"./tokens.js\";\nimport { mixHex } from \"./utils/color.js\";\n\nlet gradientIdCounter = 0;\n\n/**\n * A circular \"Apple Maps\"-style map pin: a radial-gradient fill with a soft\n * highlight and a slight point at the bottom. Purely a visual primitive —\n * it has no `mapbox-gl` (or any mapping library) dependency; the consumer\n * positions it, e.g. via `new mapboxgl.Marker({ element: pinEl })`.\n *\n * @element map-pin\n * @slot - Badge content shown centered on the pin's circular head — a rank\n * number, an emoji, a small icon.\n */\n@customElement(\"map-pin\")\nexport class MapPin extends LitElement {\n static override styles = [\n tokens,\n css`\n :host {\n display: inline-block;\n position: relative;\n line-height: 0;\n }\n svg {\n display: block;\n filter: drop-shadow(0 1px 2px rgb(0 0 0 / 0.25));\n transition: transform 120ms ease, filter 120ms ease;\n }\n :host([highlighted]) svg {\n transform: scale(1.12);\n filter: brightness(1.08) drop-shadow(0 0 5px rgb(0 0 0 / 0.35));\n }\n .content {\n position: absolute;\n /* The path's circular head is centered at viewBox y=13 of 34 total\n (13/34 ≈ 38%) — not the pin's full bounding box, which is pulled\n down by the point below the circle. */\n top: 38%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: #fff;\n font-family: var(\n --ui-font,\n ui-sans-serif,\n system-ui,\n sans-serif,\n \"Apple Color Emoji\",\n \"Segoe UI Emoji\",\n \"Segoe UI Symbol\",\n \"Noto Color Emoji\"\n );\n font-weight: var(--ui-font-weight-bold, 700);\n line-height: var(--ui-line-height-glyph, 1);\n text-shadow: 0 1px 2px rgb(0 0 0 / 0.35);\n pointer-events: none;\n white-space: nowrap;\n }\n @media (prefers-reduced-motion: reduce) {\n svg {\n transition: none;\n }\n }\n `,\n ];\n\n /** Fill color; the gradient's light (highlight) and dark (edge) stops are derived from this. */\n @property() color = \"#4f46e5\";\n /** Diameter of the circular head, in CSS pixels. */\n @property({ type: Number }) size = 32;\n /** Outer ring opacity, 0-1 (Apple Maps-style rings are translucent, not solid white). */\n @property({ type: Number, attribute: \"ring-opacity\" }) ringOpacity = 0.6;\n /** Scales and glows the pin — a generic emphasis state (e.g. hover, selection). */\n @property({ type: Boolean, reflect: true }) highlighted = false;\n\n private readonly _gradId = `map-pin-grad-${gradientIdCounter++}`;\n\n override render() {\n const light = mixHex(this.color, \"#ffffff\", 30);\n const dark = mixHex(this.color, \"#000000\", 30);\n const height = Math.round(this.size * (34 / 32));\n return html`\n <svg\n aria-hidden=\"true\"\n width=${this.size}\n height=${height}\n viewBox=\"0 0 32 34\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <defs>\n <radialGradient id=${this._gradId} gradientUnits=\"userSpaceOnUse\" cx=\"12\" cy=\"9\" r=\"18\">\n <stop offset=\"0%\" stop-color=${light} />\n <stop offset=\"100%\" stop-color=${dark} />\n </radialGradient>\n </defs>\n <path\n d=\"M16 30 C10 24 4 19.5 4 13 A12 12 0 1 1 28 13 C28 19.5 22 24 16 30 Z\"\n fill=\"url(#${this._gradId})\"\n stroke=\"rgb(255 255 255 / ${this.ringOpacity})\"\n stroke-width=\"1.5\"\n />\n </svg>\n <div class=\"content\" style=\"font-size:${Math.round(this.size * 0.4)}px\">\n <slot></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"map-pin\": MapPin;\n }\n}\n"]}
1
+ {"version":3,"file":"map-pin.js","sourceRoot":"","sources":["../src/map-pin.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,IAAI,iBAAiB,GAAG,CAAC,CAAC;AAE1B;;;;;;;;;GASG;AAEI,IAAM,MAAM,GAAZ,MAAM,MAAO,SAAQ,UAAU;IAA/B;;QAmDL,gGAAgG;QACpF,UAAK,GAAG,SAAS,CAAC;QAC9B,oDAAoD;QACxB,SAAI,GAAG,EAAE,CAAC;QACtC,+GAA+G;QACxD,gBAAW,GAAG,CAAC,CAAC;QACvE,mFAAmF;QACvC,gBAAW,GAAG,KAAK,CAAC;QAE/C,YAAO,GAAG,gBAAgB,iBAAiB,EAAE,EAAE,CAAC;IA+CnE,CAAC;aA1GiB,WAAM,GAAG;QACvB,MAAM;QACN,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA6CF;KACF,AAhDqB,CAgDpB;IAaO,MAAM;QACb,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,qEAAqE,CAAC;QACpF,MAAM,SAAS,GAAG,CAAC,CAAC;QACpB,6EAA6E;QAC7E,wEAAwE;QACxE,2EAA2E;QAC3E,2EAA2E;QAC3E,MAAM,SAAS,GAAG,CAAC,EAAE,GAAG,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAA;;;gBAGC,IAAI,CAAC,IAAI;iBACR,MAAM;;;;;;+BAMQ,IAAI,CAAC,OAAO;2CACA,KAAK;6CACH,IAAI;;;;;cAKnC,KAAK;;sCAEmB,IAAI,CAAC,WAAW;yBAC7B,SAAS;;;;cAIpB,KAAK;uBACI,IAAI,CAAC,OAAO;8CACW,SAAS;;;8CAGT,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;;;KAGpE,CAAC;IACJ,CAAC;CACF,CAAA;AAvDa;IAAX,QAAQ,EAAE;qCAAmB;AAEF;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oCAAW;AAEiB;IAAtD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;2CAAiB;AAE3B;IAA3C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;2CAAqB;AA1DrD,MAAM;IADlB,aAAa,CAAC,SAAS,CAAC;GACZ,MAAM,CA2GlB","sourcesContent":["import { LitElement, css, html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { tokens } from \"./tokens.js\";\nimport { mixHex } from \"./utils/color.js\";\n\nlet gradientIdCounter = 0;\n\n/**\n * A circular \"Apple Maps\"-style map pin: a radial-gradient fill with a soft\n * highlight and a slight point at the bottom. Purely a visual primitive —\n * it has no `mapbox-gl` (or any mapping library) dependency; the consumer\n * positions it, e.g. via `new mapboxgl.Marker({ element: pinEl })`.\n *\n * @element map-pin\n * @slot - Badge content shown centered on the pin's circular head — a rank\n * number, an emoji, a small icon.\n */\n@customElement(\"map-pin\")\nexport class MapPin extends LitElement {\n static override styles = [\n tokens,\n css`\n :host {\n display: inline-block;\n position: relative;\n line-height: 0;\n }\n svg {\n display: block;\n filter: drop-shadow(0 1px 2px rgb(0 0 0 / 0.25));\n transition: transform 120ms ease, filter 120ms ease;\n }\n :host([highlighted]) svg {\n transform: scale(1.12);\n filter: brightness(1.08) drop-shadow(0 0 5px rgb(0 0 0 / 0.35));\n }\n .content {\n position: absolute;\n /* The path's circular head is centered at viewBox y=13 of 34 total\n (13/34 ≈ 38%) — not the pin's full bounding box, which is pulled\n down by the point below the circle. */\n top: 38%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: #fff;\n font-family: var(\n --ui-font,\n ui-sans-serif,\n system-ui,\n sans-serif,\n \"Apple Color Emoji\",\n \"Segoe UI Emoji\",\n \"Segoe UI Symbol\",\n \"Noto Color Emoji\"\n );\n font-weight: var(--ui-font-weight-bold, 700);\n line-height: var(--ui-line-height-glyph, 1);\n text-shadow: 0 1px 2px rgb(0 0 0 / 0.35);\n pointer-events: none;\n white-space: nowrap;\n }\n @media (prefers-reduced-motion: reduce) {\n svg {\n transition: none;\n }\n }\n `,\n ];\n\n /** Fill color; the gradient's light (highlight) and dark (edge) stops are derived from this. */\n @property() color = \"#4f46e5\";\n /** Diameter of the circular head, in CSS pixels. */\n @property({ type: Number }) size = 32;\n /** Outer ring opacity, 0-1 (default 1 = a solid Apple Maps-style white ring; lower for a translucent ring). */\n @property({ type: Number, attribute: \"ring-opacity\" }) ringOpacity = 1;\n /** Scales and glows the pin — a generic emphasis state (e.g. hover, selection). */\n @property({ type: Boolean, reflect: true }) highlighted = false;\n\n private readonly _gradId = `map-pin-grad-${gradientIdCounter++}`;\n\n override render() {\n const light = mixHex(this.color, \"#ffffff\", 30);\n const dark = mixHex(this.color, \"#000000\", 30);\n const height = Math.round(this.size * (34 / 32));\n const shape = \"M16 30 C10 24 4 19.5 4 13 A12 12 0 1 1 28 13 C28 19.5 22 24 16 30 Z\";\n const ringWidth = 2;\n // Inset the fill so its head edge meets the ring's inner edge instead of the\n // ring straddling the fill (which reads as two rings): the head arc has\n // radius 12, so scale the fill to (12 - ringWidth / 2) / 12 about the head\n // center (16, 13). The ring is the same outline drawn behind, stroke only.\n const fillScale = (12 - ringWidth / 2) / 12;\n return html`\n <svg\n aria-hidden=\"true\"\n width=${this.size}\n height=${height}\n viewBox=\"0 0 32 34\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <defs>\n <radialGradient id=${this._gradId} gradientUnits=\"userSpaceOnUse\" cx=\"12\" cy=\"9\" r=\"18\">\n <stop offset=\"0%\" stop-color=${light} />\n <stop offset=\"100%\" stop-color=${dark} />\n </radialGradient>\n </defs>\n <path\n class=\"ring\"\n d=${shape}\n fill=\"none\"\n stroke=\"rgb(255 255 255 / ${this.ringOpacity})\"\n stroke-width=${ringWidth}\n />\n <path\n class=\"fill\"\n d=${shape}\n fill=\"url(#${this._gradId})\"\n transform=\"translate(16 13) scale(${fillScale}) translate(-16 -13)\"\n />\n </svg>\n <div class=\"content\" style=\"font-size:${Math.round(this.size * 0.4)}px\">\n <slot></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"map-pin\": MapPin;\n }\n}\n"]}
@@ -0,0 +1,45 @@
1
+ # `<loading-dots>`
2
+
3
+ Three dots that bounce one after another as a lightweight, indeterminate
4
+ "working" / "typing" indicator. Purely presentational and property-driven —
5
+ show it while a short operation is pending and remove it when done.
6
+
7
+ Exposes an accessible `role="status"` with `label` as its name, so assistive
8
+ technology announces the loading state; the dots themselves are decorative.
9
+ Under `prefers-reduced-motion` the bounce is removed and the dots rest.
10
+
11
+ ## Install
12
+
13
+ ```js
14
+ import "@f-ewald/components/loading-dots.js";
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ ```html
20
+ <loading-dots></loading-dots>
21
+ <loading-dots size="sm"></loading-dots>
22
+ <loading-dots size="lg" label="Sending message"></loading-dots>
23
+ ```
24
+
25
+ ## Attributes / properties
26
+
27
+ | Property | Attribute | Type | Default | Description |
28
+ | --- | --- | --- | --- | --- |
29
+ | `size` | `size` | `"sm" | "md" | "lg"` | `"md"` | Dot-size step — `sm`, `md` (default), or `lg`. |
30
+ | `label` | `label` | `string` | `"Loading"` | Accessible name announced by the `role="status"` live region. |
31
+
32
+ ## Events
33
+
34
+ _None._
35
+
36
+ ## Slots
37
+
38
+ _None._
39
+
40
+ ## CSS custom properties
41
+
42
+ | Custom property |
43
+ | --- |
44
+ | `--ui-line-height-glyph` |
45
+ | `--ui-primary` |
@@ -0,0 +1,46 @@
1
+ # `<loading-spinner>`
2
+
3
+ Indeterminate circular loading spinner: a rotating arc over a faint track,
4
+ in the style of a browser page-load indicator. Purely presentational and
5
+ property-driven — show it while work is in flight and remove it when done.
6
+
7
+ Exposes an accessible `role="status"` with `label` as its name, so assistive
8
+ technology announces the loading state; the arc itself is decorative. Under
9
+ `prefers-reduced-motion` it stops rotating and stays a static ring.
10
+
11
+ ## Install
12
+
13
+ ```js
14
+ import "@f-ewald/components/loading-spinner.js";
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ ```html
20
+ <loading-spinner></loading-spinner>
21
+ <loading-spinner size="sm"></loading-spinner>
22
+ <loading-spinner size="lg" label="Loading results"></loading-spinner>
23
+ ```
24
+
25
+ ## Attributes / properties
26
+
27
+ | Property | Attribute | Type | Default | Description |
28
+ | --- | --- | --- | --- | --- |
29
+ | `size` | `size` | `"sm" | "md" | "lg"` | `"md"` | Diameter step — `sm` ≈ 1rem, `md` ≈ 1.5rem (default), `lg` ≈ 2rem. |
30
+ | `label` | `label` | `string` | `"Loading"` | Accessible name announced by the `role="status"` live region. |
31
+
32
+ ## Events
33
+
34
+ _None._
35
+
36
+ ## Slots
37
+
38
+ _None._
39
+
40
+ ## CSS custom properties
41
+
42
+ | Custom property |
43
+ | --- |
44
+ | `--ui-border` |
45
+ | `--ui-line-height-glyph` |
46
+ | `--ui-primary` |
@@ -1,7 +1,7 @@
1
1
  # `<map-circle>`
2
2
 
3
3
  A plain circular map marker: a radial-gradient fill with a soft highlight
4
- and a translucent white outer ring, no point/tail (unlike `<map-pin>`) —
4
+ and a solid white outer ring, no point/tail (unlike `<map-pin>`) —
5
5
  for markers that don't need to visually "point" at their exact
6
6
  coordinate. Purely a visual primitive — it has no `mapbox-gl` (or any
7
7
  mapping library) dependency; the consumer positions it, e.g. via
@@ -30,8 +30,8 @@ import "@f-ewald/components/map-circle.js";
30
30
  | --- | --- | --- | --- | --- |
31
31
  | `color` | `color` | `string` | `"#4f46e5"` | Fill color; the gradient's light (highlight) and dark (edge) stops are derived from this. |
32
32
  | `size` | `size` | `number` | `18` | Diameter, in CSS pixels. |
33
- | `ringWidth` | `ring-width` | `number` | `4` | White outer ring thickness, in the same viewBox units as `size` (scales with it). |
34
- | `ringOpacity` | `ring-opacity` | `number` | `0.6` | Outer ring opacity, 0-1 (Apple Maps-style rings are translucent, not solid white). |
33
+ | `ringWidth` | `ring-width` | `number` | `2` | White outer ring thickness, in the same viewBox units as `size` (scales with it). |
34
+ | `ringOpacity` | `ring-opacity` | `number` | `1` | Outer ring opacity, 0-1 (default 1 = a solid Apple Maps-style white ring; lower for a translucent ring). |
35
35
  | `highlighted` | `highlighted` | `boolean` | `false` | Scales and glows the circle — a generic emphasis state (e.g. hover, selection). |
36
36
 
37
37
  ## Events
package/docs/map-pin.md CHANGED
@@ -24,7 +24,7 @@ import "@f-ewald/components/map-pin.js";
24
24
  | --- | --- | --- | --- | --- |
25
25
  | `color` | `color` | `string` | `"#4f46e5"` | Fill color; the gradient's light (highlight) and dark (edge) stops are derived from this. |
26
26
  | `size` | `size` | `number` | `32` | Diameter of the circular head, in CSS pixels. |
27
- | `ringOpacity` | `ring-opacity` | `number` | `0.6` | Outer ring opacity, 0-1 (Apple Maps-style rings are translucent, not solid white). |
27
+ | `ringOpacity` | `ring-opacity` | `number` | `1` | Outer ring opacity, 0-1 (default 1 = a solid Apple Maps-style white ring; lower for a translucent ring). |
28
28
  | `highlighted` | `highlighted` | `boolean` | `false` | Scales and glows the pin — a generic emphasis state (e.g. hover, selection). |
29
29
 
30
30
  ## Events
package/llms.txt CHANGED
@@ -992,10 +992,56 @@ Example:
992
992
  <load-more></load-more>
993
993
  ```
994
994
 
995
+ ## <loading-dots>
996
+
997
+ Three dots that bounce one after another as a lightweight, indeterminate
998
+ "working" / "typing" indicator. Purely presentational and property-driven —
999
+ show it while a short operation is pending and remove it when done.
1000
+
1001
+ Exposes an accessible `role="status"` with `label` as its name, so assistive
1002
+ technology announces the loading state; the dots themselves are decorative.
1003
+ Under `prefers-reduced-motion` the bounce is removed and the dots rest.
1004
+
1005
+ Import: `import "@f-ewald/components/loading-dots.js";`
1006
+
1007
+ Properties: `size` (attribute `size`) : "sm" | "md" | "lg", default "md"; `label` (attribute `label`) : string, default "Loading"
1008
+ Events: none
1009
+ CSS custom properties: `--ui-line-height-glyph`, `--ui-primary`
1010
+
1011
+ Example:
1012
+ ```html
1013
+ <loading-dots></loading-dots>
1014
+ <loading-dots size="sm"></loading-dots>
1015
+ <loading-dots size="lg" label="Sending message"></loading-dots>
1016
+ ```
1017
+
1018
+ ## <loading-spinner>
1019
+
1020
+ Indeterminate circular loading spinner: a rotating arc over a faint track,
1021
+ in the style of a browser page-load indicator. Purely presentational and
1022
+ property-driven — show it while work is in flight and remove it when done.
1023
+
1024
+ Exposes an accessible `role="status"` with `label` as its name, so assistive
1025
+ technology announces the loading state; the arc itself is decorative. Under
1026
+ `prefers-reduced-motion` it stops rotating and stays a static ring.
1027
+
1028
+ Import: `import "@f-ewald/components/loading-spinner.js";`
1029
+
1030
+ Properties: `size` (attribute `size`) : "sm" | "md" | "lg", default "md"; `label` (attribute `label`) : string, default "Loading"
1031
+ Events: none
1032
+ CSS custom properties: `--ui-border`, `--ui-line-height-glyph`, `--ui-primary`
1033
+
1034
+ Example:
1035
+ ```html
1036
+ <loading-spinner></loading-spinner>
1037
+ <loading-spinner size="sm"></loading-spinner>
1038
+ <loading-spinner size="lg" label="Loading results"></loading-spinner>
1039
+ ```
1040
+
995
1041
  ## <map-circle>
996
1042
 
997
1043
  A plain circular map marker: a radial-gradient fill with a soft highlight
998
- and a translucent white outer ring, no point/tail (unlike `<map-pin>`) —
1044
+ and a solid white outer ring, no point/tail (unlike `<map-pin>`) —
999
1045
  for markers that don't need to visually "point" at their exact
1000
1046
  coordinate. Purely a visual primitive — it has no `mapbox-gl` (or any
1001
1047
  mapping library) dependency; the consumer positions it, e.g. via
@@ -1006,7 +1052,7 @@ the slot empty, and rasterize one marker per color for use as a map
1006
1052
 
1007
1053
  Import: `import "@f-ewald/components/map-circle.js";`
1008
1054
 
1009
- Properties: `color` (attribute `color`) : string, default "#4f46e5"; `size` (attribute `size`) : number, default 18; `ringWidth` (attribute `ring-width`) : number, default 4; `ringOpacity` (attribute `ring-opacity`) : number, default 0.6; `highlighted` (attribute `highlighted`) : boolean, default false
1055
+ Properties: `color` (attribute `color`) : string, default "#4f46e5"; `size` (attribute `size`) : number, default 18; `ringWidth` (attribute `ring-width`) : number, default 2; `ringOpacity` (attribute `ring-opacity`) : number, default 1; `highlighted` (attribute `highlighted`) : boolean, default false
1010
1056
  Events: none
1011
1057
  CSS custom properties: `--ui-font`, `--ui-font-weight-bold`, `--ui-line-height-glyph`
1012
1058
 
@@ -1026,7 +1072,7 @@ positions it, e.g. via `new mapboxgl.Marker({ element: pinEl })`.
1026
1072
 
1027
1073
  Import: `import "@f-ewald/components/map-pin.js";`
1028
1074
 
1029
- Properties: `color` (attribute `color`) : string, default "#4f46e5"; `size` (attribute `size`) : number, default 32; `ringOpacity` (attribute `ring-opacity`) : number, default 0.6; `highlighted` (attribute `highlighted`) : boolean, default false
1075
+ Properties: `color` (attribute `color`) : string, default "#4f46e5"; `size` (attribute `size`) : number, default 32; `ringOpacity` (attribute `ring-opacity`) : number, default 1; `highlighted` (attribute `highlighted`) : boolean, default false
1030
1076
  Events: none
1031
1077
  CSS custom properties: `--ui-font`, `--ui-font-weight-bold`, `--ui-line-height-glyph`
1032
1078
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@f-ewald/components",
3
3
  "private": false,
4
- "version": "1.14.0",
4
+ "version": "1.15.0",
5
5
  "description": "A collection of universally usable web components for various tasks.",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",